archimate 1.2.1 → 2.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (182) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +47 -0
  3. data/TODOs.org +219 -0
  4. data/archimate.gemspec +2 -1
  5. data/exe/archidiff +7 -0
  6. data/exe/archidiff-summary +7 -0
  7. data/exe/archimerge +7 -0
  8. data/exe/fmtxml +7 -0
  9. data/lib/archimate.rb +10 -21
  10. data/lib/archimate/cli/archi.rb +2 -1
  11. data/lib/archimate/cli/cleanup.rb +8 -9
  12. data/lib/archimate/cli/convert.rb +3 -1
  13. data/lib/archimate/cli/mapper.rb +1 -1
  14. data/lib/archimate/cli/stats.rb +1 -1
  15. data/lib/archimate/config.rb +4 -1
  16. data/lib/archimate/data_model.rb +11 -24
  17. data/lib/archimate/data_model/any_attribute.rb +18 -5
  18. data/lib/archimate/data_model/any_element.rb +30 -7
  19. data/lib/archimate/data_model/bounds.rb +34 -7
  20. data/lib/archimate/data_model/color.rb +32 -7
  21. data/lib/archimate/data_model/comparison.rb +87 -0
  22. data/lib/archimate/data_model/concern.rb +20 -7
  23. data/lib/archimate/data_model/connection.rb +71 -51
  24. data/lib/archimate/data_model/connector_type.rb +23 -0
  25. data/lib/archimate/data_model/diagram.rb +72 -10
  26. data/lib/archimate/data_model/diagram_type.rb +17 -0
  27. data/lib/archimate/data_model/differentiable.rb +142 -0
  28. data/lib/archimate/data_model/element.rb +39 -45
  29. data/lib/archimate/data_model/element_type.rb +89 -0
  30. data/lib/archimate/data_model/font.rb +30 -12
  31. data/lib/archimate/data_model/lang_string.rb +89 -16
  32. data/lib/archimate/data_model/layer.rb +55 -0
  33. data/lib/archimate/data_model/layers.rb +62 -0
  34. data/lib/archimate/data_model/location.rb +27 -11
  35. data/lib/archimate/data_model/metadata.rb +10 -3
  36. data/lib/archimate/data_model/model.rb +188 -121
  37. data/lib/archimate/data_model/modeling_note.rb +14 -3
  38. data/lib/archimate/data_model/organization.rb +44 -13
  39. data/lib/archimate/data_model/{documentation.rb → preserved_lang_string.rb} +1 -5
  40. data/lib/archimate/data_model/property.rb +17 -11
  41. data/lib/archimate/data_model/property_definition.rb +34 -4
  42. data/lib/archimate/data_model/referenceable.rb +0 -9
  43. data/lib/archimate/data_model/referenceable_collection.rb +201 -0
  44. data/lib/archimate/data_model/relationship.rb +52 -33
  45. data/lib/archimate/data_model/relationship_type.rb +43 -0
  46. data/lib/archimate/data_model/schema_info.rb +17 -6
  47. data/lib/archimate/data_model/style.rb +41 -11
  48. data/lib/archimate/data_model/view_node.rb +153 -59
  49. data/lib/archimate/data_model/viewpoint.rb +56 -80
  50. data/lib/archimate/data_model/viewpoint_type.rb +429 -0
  51. data/lib/archimate/export/csv_export.rb +2 -2
  52. data/lib/archimate/export/cypher.rb +2 -2
  53. data/lib/archimate/export/graph_ml.rb +7 -5
  54. data/lib/archimate/export/jsonl.rb +166 -0
  55. data/lib/archimate/export/n_quads.rb +8 -5
  56. data/lib/archimate/file_format.rb +4 -5
  57. data/lib/archimate/file_formats/archi_file_reader.rb +7 -240
  58. data/lib/archimate/file_formats/archi_file_writer.rb +16 -188
  59. data/lib/archimate/file_formats/model_exchange_file_reader.rb +7 -225
  60. data/lib/archimate/file_formats/model_exchange_file_writer_21.rb +22 -114
  61. data/lib/archimate/file_formats/model_exchange_file_writer_30.rb +22 -122
  62. data/lib/archimate/file_formats/sax.rb +55 -0
  63. data/lib/archimate/file_formats/sax/any_element.rb +64 -0
  64. data/lib/archimate/file_formats/sax/archi/archi_handler_factory.rb +48 -0
  65. data/lib/archimate/file_formats/sax/archi/bounds.rb +25 -0
  66. data/lib/archimate/file_formats/sax/archi/connection.rb +47 -0
  67. data/lib/archimate/file_formats/sax/archi/content.rb +28 -0
  68. data/lib/archimate/file_formats/sax/archi/diagram.rb +66 -0
  69. data/lib/archimate/file_formats/sax/archi/element.rb +36 -0
  70. data/lib/archimate/file_formats/sax/archi/location.rb +25 -0
  71. data/lib/archimate/file_formats/sax/archi/model.rb +109 -0
  72. data/lib/archimate/file_formats/sax/archi/organization.rb +60 -0
  73. data/lib/archimate/file_formats/sax/archi/property.rb +54 -0
  74. data/lib/archimate/file_formats/sax/archi/relationship.rb +50 -0
  75. data/lib/archimate/file_formats/sax/archi/style.rb +35 -0
  76. data/lib/archimate/file_formats/sax/archi/view_node.rb +76 -0
  77. data/lib/archimate/file_formats/sax/capture_content.rb +20 -0
  78. data/lib/archimate/file_formats/sax/capture_documentation.rb +19 -0
  79. data/lib/archimate/file_formats/sax/capture_properties.rb +20 -0
  80. data/lib/archimate/file_formats/sax/content_element.rb +19 -0
  81. data/lib/archimate/file_formats/sax/document.rb +80 -0
  82. data/lib/archimate/file_formats/sax/handler.rb +54 -0
  83. data/lib/archimate/file_formats/sax/lang_string.rb +28 -0
  84. data/lib/archimate/file_formats/sax/model_exchange_file/color.rb +36 -0
  85. data/lib/archimate/file_formats/sax/model_exchange_file/connection.rb +67 -0
  86. data/lib/archimate/file_formats/sax/model_exchange_file/diagram.rb +60 -0
  87. data/lib/archimate/file_formats/sax/model_exchange_file/element.rb +43 -0
  88. data/lib/archimate/file_formats/sax/model_exchange_file/font.rb +44 -0
  89. data/lib/archimate/file_formats/sax/model_exchange_file/item.rb +64 -0
  90. data/lib/archimate/file_formats/sax/model_exchange_file/location.rb +23 -0
  91. data/lib/archimate/file_formats/sax/model_exchange_file/metadata.rb +66 -0
  92. data/lib/archimate/file_formats/sax/model_exchange_file/model.rb +124 -0
  93. data/lib/archimate/file_formats/sax/model_exchange_file/model_exchange_handler_factory.rb +53 -0
  94. data/lib/archimate/file_formats/sax/model_exchange_file/property.rb +32 -0
  95. data/lib/archimate/file_formats/sax/model_exchange_file/property_definition.rb +36 -0
  96. data/lib/archimate/file_formats/sax/model_exchange_file/relationship.rb +49 -0
  97. data/lib/archimate/file_formats/sax/model_exchange_file/schema_info.rb +47 -0
  98. data/lib/archimate/file_formats/sax/model_exchange_file/style.rb +66 -0
  99. data/lib/archimate/file_formats/sax/model_exchange_file/view_node.rb +86 -0
  100. data/lib/archimate/file_formats/sax/no_op.rb +17 -0
  101. data/lib/archimate/file_formats/sax/preserved_lang_string.rb +28 -0
  102. data/lib/archimate/file_formats/serializer.rb +57 -0
  103. data/lib/archimate/file_formats/serializer/archi/bounds.rb +23 -0
  104. data/lib/archimate/file_formats/serializer/archi/connection.rb +33 -0
  105. data/lib/archimate/file_formats/serializer/archi/diagram.rb +28 -0
  106. data/lib/archimate/file_formats/serializer/archi/documentation.rb +16 -0
  107. data/lib/archimate/file_formats/serializer/archi/element.rb +24 -0
  108. data/lib/archimate/file_formats/serializer/archi/location.rb +26 -0
  109. data/lib/archimate/file_formats/serializer/archi/model.rb +25 -0
  110. data/lib/archimate/file_formats/serializer/archi/organization.rb +21 -0
  111. data/lib/archimate/file_formats/serializer/archi/property.rb +15 -0
  112. data/lib/archimate/file_formats/serializer/archi/relationship.rb +36 -0
  113. data/lib/archimate/file_formats/serializer/archi/view_node.rb +52 -0
  114. data/lib/archimate/file_formats/serializer/archi/viewpoint_type.rb +45 -0
  115. data/lib/archimate/file_formats/serializer/model_exchange_file/element.rb +25 -0
  116. data/lib/archimate/file_formats/serializer/model_exchange_file/location.rb +15 -0
  117. data/lib/archimate/file_formats/serializer/model_exchange_file/model_exchange_file_writer.rb +32 -0
  118. data/lib/archimate/file_formats/serializer/model_exchange_file/organization.rb +23 -0
  119. data/lib/archimate/file_formats/serializer/model_exchange_file/properties.rb +15 -0
  120. data/lib/archimate/file_formats/serializer/model_exchange_file/relationship.rb +19 -0
  121. data/lib/archimate/file_formats/serializer/model_exchange_file/style.rb +48 -0
  122. data/lib/archimate/file_formats/serializer/model_exchange_file/v21/connection.rb +25 -0
  123. data/lib/archimate/file_formats/serializer/model_exchange_file/v21/diagram.rb +27 -0
  124. data/lib/archimate/file_formats/serializer/model_exchange_file/v21/item.rb +17 -0
  125. data/lib/archimate/file_formats/serializer/model_exchange_file/v21/label.rb +17 -0
  126. data/lib/archimate/file_formats/serializer/model_exchange_file/v21/model.rb +36 -0
  127. data/lib/archimate/file_formats/serializer/model_exchange_file/v21/organization_body.rb +25 -0
  128. data/lib/archimate/file_formats/serializer/model_exchange_file/v21/property.rb +19 -0
  129. data/lib/archimate/file_formats/serializer/model_exchange_file/v21/view_node.rb +44 -0
  130. data/lib/archimate/file_formats/serializer/model_exchange_file/v30/connection.rb +26 -0
  131. data/lib/archimate/file_formats/serializer/model_exchange_file/v30/diagram.rb +27 -0
  132. data/lib/archimate/file_formats/serializer/model_exchange_file/v30/item.rb +17 -0
  133. data/lib/archimate/file_formats/serializer/model_exchange_file/v30/label.rb +17 -0
  134. data/lib/archimate/file_formats/serializer/model_exchange_file/v30/model.rb +41 -0
  135. data/lib/archimate/file_formats/serializer/model_exchange_file/v30/organization_body.rb +25 -0
  136. data/lib/archimate/file_formats/serializer/model_exchange_file/v30/property.rb +19 -0
  137. data/lib/archimate/file_formats/serializer/model_exchange_file/v30/property_definitions.rb +34 -0
  138. data/lib/archimate/file_formats/serializer/model_exchange_file/v30/view_node.rb +45 -0
  139. data/lib/archimate/file_formats/serializer/named_collection.rb +21 -0
  140. data/lib/archimate/file_formats/serializer/writer.rb +56 -0
  141. data/lib/archimate/file_formats/serializer/xml_lang_string.rb +30 -0
  142. data/lib/archimate/file_formats/serializer/xml_metadata.rb +64 -0
  143. data/lib/archimate/file_formats/{model_exchange_file → serializer}/xml_property_defs.rb +2 -2
  144. data/lib/archimate/lint/duplicate_entities.rb +3 -3
  145. data/lib/archimate/lint/linter.rb +24 -29
  146. data/lib/archimate/svg/connection.rb +13 -103
  147. data/lib/archimate/svg/diagram.rb +1 -1
  148. data/lib/archimate/svg/entity/base_entity.rb +12 -8
  149. data/lib/archimate/svg/entity/data_entity.rb +2 -2
  150. data/lib/archimate/svg/entity/diagram_model_reference.rb +1 -1
  151. data/lib/archimate/svg/entity/event_entity.rb +2 -2
  152. data/lib/archimate/svg/entity/gap.rb +1 -1
  153. data/lib/archimate/svg/entity/group.rb +1 -1
  154. data/lib/archimate/svg/entity/motivation_entity.rb +1 -1
  155. data/lib/archimate/svg/entity/node.rb +1 -1
  156. data/lib/archimate/svg/entity/rect_entity.rb +1 -1
  157. data/lib/archimate/svg/entity/rounded_rect_entity.rb +1 -1
  158. data/lib/archimate/svg/entity/service_entity.rb +2 -2
  159. data/lib/archimate/svg/entity/value.rb +2 -2
  160. data/lib/archimate/svg/path.rb +153 -0
  161. data/lib/archimate/svg/point.rb +8 -1
  162. data/lib/archimate/version.rb +1 -1
  163. metadata +118 -36
  164. data/lib/archimate/data_model/archimate_node.rb +0 -181
  165. data/lib/archimate/data_model/concept.rb +0 -14
  166. data/lib/archimate/data_model/constants.rb +0 -82
  167. data/lib/archimate/data_model/container.rb +0 -17
  168. data/lib/archimate/data_model/diffable_array.rb +0 -213
  169. data/lib/archimate/data_model/diffable_primitive.rb +0 -83
  170. data/lib/archimate/data_model/label.rb +0 -19
  171. data/lib/archimate/data_model/named_referenceable.rb +0 -14
  172. data/lib/archimate/data_model/view.rb +0 -12
  173. data/lib/archimate/data_model/view_concept.rb +0 -18
  174. data/lib/archimate/file_formats/archi_file_format.rb +0 -151
  175. data/lib/archimate/file_formats/archimate_v2.rb +0 -461
  176. data/lib/archimate/file_formats/model_exchange_file/xml_lang_string.rb +0 -35
  177. data/lib/archimate/file_formats/model_exchange_file/xml_metadata.rb +0 -115
  178. data/lib/archimate/file_formats/model_exchange_file/xml_property_definitions.rb +0 -28
  179. data/lib/archimate/file_formats/model_exchange_file_reader_21.rb +0 -73
  180. data/lib/archimate/file_formats/model_exchange_file_reader_30.rb +0 -134
  181. data/lib/archimate/file_formats/model_exchange_file_writer.rb +0 -157
  182. data/lib/archimate/file_formats/writer.rb +0 -56
@@ -0,0 +1,89 @@
1
+ # frozen_string_literal: true
2
+ require "ruby-enum"
3
+
4
+ module Archimate
5
+ module DataModel
6
+ # Enumeration class that defines the strings used for all Archimate element
7
+ # types.
8
+ class ElementType
9
+ include Ruby::Enum
10
+
11
+ define :BusinessActor, "BusinessActor"
12
+ define :BusinessCollaboration, "BusinessCollaboration"
13
+ define :BusinessEvent, "BusinessEvent"
14
+ define :BusinessFunction, "BusinessFunction"
15
+ define :BusinessInteraction, "BusinessInteraction"
16
+ define :BusinessInterface, "BusinessInterface"
17
+ define :BusinessObject, "BusinessObject"
18
+ define :BusinessProcess, "BusinessProcess"
19
+ define :BusinessRole, "BusinessRole"
20
+ define :BusinessService, "BusinessService"
21
+ define :Contract, "Contract"
22
+ define :Location, "Location"
23
+ define :Meaning, "Meaning"
24
+ define :Value, "Value"
25
+ define :Product, "Product"
26
+ define :Representation, "Representation"
27
+ define :ApplicationCollaboration, "ApplicationCollaboration"
28
+ define :ApplicationComponent, "ApplicationComponent"
29
+ define :ApplicationFunction, "ApplicationFunction"
30
+ define :ApplicationInteraction, "ApplicationInteraction"
31
+ define :ApplicationInterface, "ApplicationInterface"
32
+ define :ApplicationService, "ApplicationService"
33
+ define :DataObject, "DataObject"
34
+ define :Artifact, "Artifact"
35
+ define :CommunicationPath, "CommunicationPath"
36
+ define :Device, "Device"
37
+ define :InfrastructureFunction, "InfrastructureFunction"
38
+ define :InfrastructureInterface, "InfrastructureInterface"
39
+ define :InfrastructureService, "InfrastructureService"
40
+ define :Network, "Network"
41
+ define :Node, "Node"
42
+ define :SystemSoftware, "SystemSoftware"
43
+ define :Assessment, "Assessment"
44
+ define :Constraint, "Constraint"
45
+ define :Driver, "Driver"
46
+ define :Goal, "Goal"
47
+ define :Principle, "Principle"
48
+ define :Requirement, "Requirement"
49
+ define :Stakeholder, "Stakeholder"
50
+ define :Deliverable, "Deliverable"
51
+ define :Gap, "Gap"
52
+ define :Plateau, "Plateau"
53
+ define :WorkPackage, "WorkPackage"
54
+ define :AndJunction, "AndJunction"
55
+ define :Junction, "Junction"
56
+ define :OrJunction, "OrJunction"
57
+ define :Capability, "Capability"
58
+ define :CourseOfAction, "CourseOfAction"
59
+ define :Resource, "Resource"
60
+ define :ApplicationProcess, "ApplicationProcess"
61
+ define :ApplicationEvent, "ApplicationEvent"
62
+ define :TechnologyCollaboration, "TechnologyCollaboration"
63
+ define :TechnologyInterface, "TechnologyInterface"
64
+ define :Path, "Path"
65
+ define :CommunicationNetwork, "CommunicationNetwork"
66
+ define :TechnologyFunction, "TechnologyFunction"
67
+ define :TechnologyProcess, "TechnologyProcess"
68
+ define :TechnologyInteraction, "TechnologyInteraction"
69
+ define :TechnologyEvent, "TechnologyEvent"
70
+ define :TechnologyService, "TechnologyService"
71
+ define :TechnologyObject, "TechnologyObject"
72
+ define :Equipment, "Equipment"
73
+ define :Facility, "Facility"
74
+ define :DistributionNetwork, "DistributionNetwork"
75
+ define :Material, "Material"
76
+ define :Outcome, "Outcome"
77
+ define :ImplementationEvent, "ImplementationEvent"
78
+ # @todo Is grouping a valid element type?
79
+ # define :Grouping, "Grouping"
80
+
81
+ # Case equality operator. Used to determine if a value is a member of this enum
82
+ #
83
+ # @param other [String] string to test for enum membership.
84
+ def self.===(other)
85
+ values.include?(other)
86
+ end
87
+ end
88
+ end
89
+ end
@@ -1,28 +1,48 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  module Archimate
3
4
  module DataModel
4
- class Font < ArchimateNode
5
- attribute :name, Strict::String.optional
6
- attribute :size, Coercible::Float.constrained(gt: 0.0).optional
7
- attribute :style, Coercible::Int.optional # TODO: make this an enum
8
- attribute :font_data, Strict::String.optional
5
+ class Font
6
+ include Comparison
7
+
8
+ # @!attribute [r] name
9
+ # @return [String, NilClass]
10
+ model_attr :name
11
+ # @!attribute [r] size
12
+ # @return [Float, NilClass]
13
+ model_attr :size
14
+ # @todo make this an enum
15
+ # @!attribute [r] style
16
+ # @return [Int, NilClass]
17
+ model_attr :style
18
+ # @!attribute [r] font_data
19
+ # @return [String, NilClass]
20
+ model_attr :font_data
9
21
 
10
22
  # Archi font strings look like this:
11
23
  # "1|Arial |14.0|0|WINDOWS|1|0 |0|0|0|0 |0 |0|0|1|0|0|0|0 |Arial"
12
24
  # "1|Arial |8.0 |0|WINDOWS|1|0 |0|0|0|0 |0 |0|0|1|0|0|0|0 |Arial"
13
25
  # "1|Segoe UI Semibold|12.0|2|WINDOWS|1|-16|0|0|0|600|-1|0|0|0|3|2|1|34|Segoe UI Semibold"
14
26
  # "1|Times New Roman |12.0|3|WINDOWS|1|-16|0|0|0|700|-1|0|0|0|3|2|1|18|Times New Roman"
27
+ # @todo move this to the archi file reader
15
28
  def self.archi_font_string(str)
16
29
  return nil if str.nil?
17
30
  font_parts = str.split("|")
18
31
  DataModel::Font.new(
19
32
  name: font_parts[1],
20
- size: font_parts[2],
21
- style: font_parts[3],
33
+ size: font_parts[2].to_f,
34
+ style: font_parts[3].to_i,
22
35
  font_data: str
23
36
  )
24
37
  end
25
38
 
39
+ def initialize(name: nil, size: nil, style: nil, font_data: nil)
40
+ @name = name
41
+ @size = size.nil? ? nil : size.to_f
42
+ @style = style.nil? ? nil : style.to_i
43
+ @font_data = font_data
44
+ end
45
+
26
46
  def to_s
27
47
  "Font(name: #{name}, size: #{size}, style: #{style})"
28
48
  end
@@ -30,12 +50,12 @@ module Archimate
30
50
  def to_archi_font
31
51
  font_data ||
32
52
  [
33
- 1, font.name, font.size, font.style, "WINDOWS", 1, 0, 0, 0, 0, 0, 0,
34
- 0, 0, 1, 0, 0, 0, 0, font.name
53
+ 1, name, size, style, "WINDOWS", 1, 0, 0, 0, 0, 0, 0,
54
+ 0, 0, 1, 0, 0, 0, 0, name
35
55
  ].map(&:to_s).join("|")
36
56
  end
37
57
 
38
- # TODO: this isn't standard
58
+ # @todo this isn't standard
39
59
  # Move to file format
40
60
  def style_string
41
61
  case style
@@ -48,7 +68,5 @@ module Archimate
48
68
  end
49
69
  end
50
70
  end
51
-
52
- Dry::Types.register_class(Font)
53
71
  end
54
72
  end
@@ -1,41 +1,114 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  require "forwardable"
3
4
 
4
5
  module Archimate
5
6
  module DataModel
6
7
  # A base string type for multi-language strings.
7
- class LangString < ArchimateNode
8
- # include Comparable
8
+ class LangString
9
+ include Comparison
9
10
  extend Forwardable
10
- def_delegators :@text, :to_s, :strip, :strip!, :tr, :+, :gsub, :gsub!, :sub!, :downcase!, :empty?, :split
11
11
 
12
- attribute :text, Strict::String
13
- attribute :lang, Strict::String.optional
12
+ def_delegators :@default_text, :strip, :tr, :+, :gsub, :sub, :downcase, :empty?, :split, :size, :include?
13
+ # def_delegators :@lang_hash, :size
14
+
15
+ # @!attribute [r] lang_hash
16
+ # @return [Hash]
17
+ model_attr :lang_hash
18
+ # @!attribute [r] default_lang
19
+ # @return [String, NilClass]
20
+ model_attr :default_lang
21
+ # @!attribute [r] default_text
22
+ # @return [String]
23
+ model_attr :default_text
24
+
25
+ # def self.default_lang
26
+ # Archimate::Config.instance.default_lang
27
+ # end
28
+
29
+ def self.string(str, lang = nil)
30
+ return nil if !str || str.strip.empty?
31
+ str = str.strip
32
+ lang = nil if !lang || lang.empty?
33
+ new(
34
+ lang_hash: { lang => str },
35
+ default_lang: lang,
36
+ default_text: str
37
+ )
38
+ end
39
+
40
+ def self.create(copy)
41
+ case copy
42
+ when String
43
+ string(copy)
44
+ when LangString
45
+ copy
46
+ when Hash
47
+ lang_hash = copy.fetch(:lang_hash, {})
48
+ default_lang = copy.fetch(:default_lang, "")
49
+ default_text = copy.fetch(:default_text, "")
50
+ return nil if [lang_hash, default_lang, default_text].any? { |i| i && i.empty? }
51
+ new(
52
+ lang_hash: lang_hash,
53
+ default_lang: default_lang,
54
+ default_text: default_text
55
+ )
56
+ end
57
+ end
14
58
 
15
- # @param [Hash{Symbol => Object},Dry::Struct, String] attributes
59
+ # @param [Hash{Symbol => Object},LangString, String] attributes
16
60
  # @raise [Struct::Error] if the given attributes don't conform {#schema}
17
- # with given {#constructor_type}
18
- def self.new(attributes)
19
- if attributes.instance_of?(String)
20
- super(text: attributes.strip)
61
+ # with given {# # constructor_type}
62
+ def initialize(str = nil, lang_hash: {}, default_lang: nil, default_text: nil)
63
+ @lang_hash = lang_hash
64
+ @default_lang = default_lang
65
+ @default_text = default_text
66
+ case str
67
+ when String
68
+ @lang_hash[@default_lang] = @default_text = str.strip
69
+ when LangString
70
+ @lang_hash = str.lang_hash
71
+ @default_lang = str.default_lang
72
+ @default_text = str.default_text
21
73
  else
22
- super
74
+ @lang_hash[default_lang] = default_text if default_text
23
75
  end
24
76
  end
25
77
 
78
+ def langs
79
+ @lang_hash.keys
80
+ end
81
+
26
82
  def to_str
27
- @text
83
+ to_s
84
+ end
85
+
86
+ def to_s
87
+ @default_text ||= @lang_hash.fetch(default_lang) do |key|
88
+ @lang_hash.fetch(nil, nil) if key
89
+ end
90
+ end
91
+
92
+ def by_lang(lang)
93
+ lang_hash.fetch(lang, nil)
94
+ end
95
+
96
+ def text
97
+ to_s
98
+ end
99
+
100
+ def lang
101
+ default_lang
28
102
  end
29
103
 
30
104
  def =~(other)
105
+ str = to_s
31
106
  if other.is_a?(Regexp)
32
- other =~ @text
107
+ other =~ str
33
108
  else
34
- Regexp.new(Regexp.escape(@text)) =~ other
109
+ Regexp.new(Regexp.escape(str)) =~ other
35
110
  end
36
111
  end
37
112
  end
38
-
39
- Dry::Types.register_class(LangString)
40
113
  end
41
114
  end
@@ -0,0 +1,55 @@
1
+ # frozen_string_literal: true
2
+ require "ruby-enum"
3
+
4
+ module Archimate
5
+ module DataModel
6
+ class Layer
7
+ attr_reader :elements
8
+ attr_reader :name
9
+
10
+ # No user serviceable parts here. don't use me.
11
+ def initialize(layer = "None", element_names = [])
12
+ @symbol = Layer.symbolize(layer)
13
+ @name = layer
14
+ @elements = element_names
15
+ end
16
+
17
+ def hash
18
+ self.class.hash ^ @symbol.hash
19
+ end
20
+
21
+ def ===(other)
22
+ return true if equal?(other)
23
+ case other
24
+ when String
25
+ @symbol == Layer.symbolize(other)
26
+ when Symbol
27
+ @symbol == other
28
+ when Layer
29
+ self == other
30
+ else
31
+ false
32
+ end
33
+ end
34
+
35
+ def ==(other)
36
+ @symbol == other&.to_sym
37
+ end
38
+
39
+ def to_sym
40
+ @symbol
41
+ end
42
+
43
+ def to_s
44
+ @name
45
+ end
46
+
47
+ private
48
+
49
+ def self.symbolize(str)
50
+ return str if str.is_a?(Symbol)
51
+ str.downcase.tr(" ", "_").to_sym
52
+ end
53
+ end
54
+ end
55
+ end
@@ -0,0 +1,62 @@
1
+ # frozen_string_literal: true
2
+ require "ruby-enum"
3
+
4
+ module Archimate
5
+ module DataModel
6
+ class Layers
7
+ include Ruby::Enum
8
+
9
+ define :Strategy, Layer.new("Strategy", %w[Capability CourseOfAction Resource])
10
+
11
+ define :Business, Layer.new("Business", %w[BusinessActor BusinessCollaboration
12
+ BusinessEvent BusinessFunction
13
+ BusinessInteraction BusinessInterface
14
+ BusinessObject BusinessProcess
15
+ BusinessRole BusinessService
16
+ Contract Location
17
+ Meaning Value
18
+ Product Representation])
19
+
20
+ define :Application, Layer.new("Application", %w[ApplicationCollaboration ApplicationComponent
21
+ ApplicationFunction ApplicationInteraction
22
+ ApplicationInterface ApplicationService
23
+ DataObject ApplicationProcess ApplicationEvent])
24
+
25
+ define :Technology, Layer.new("Technology", %w[Artifact CommunicationPath
26
+ Device InfrastructureFunction
27
+ InfrastructureInterface InfrastructureService
28
+ Network Node SystemSoftware TechnologyCollaboration
29
+ TechnologyInterface Path CommunicationNetwork
30
+ TechnologyFunction TechnologyProcess TechnologyInteraction
31
+ TechnologyEvent TechnologyService
32
+ TechnologyObject])
33
+
34
+ define :Physical, Layer.new("Physical", %w[Equipment Facility DistributionNetwork Material])
35
+
36
+ define :Motivation, Layer.new("Motivation", %w[Assessment Constraint Driver
37
+ Goal Principle Requirement
38
+ Stakeholder Outcome])
39
+
40
+ define :Implementation_and_migration, Layer.new("Implementation and Migration", %w[Deliverable Gap Plateau
41
+ WorkPackage ImplementationEvent])
42
+
43
+ # @todo Is Connectors used? Should this be none?
44
+ define :Connectors, Layer.new("Connectors", %w[AndJunction Junction OrJunction])
45
+
46
+ define :None, Layer.new("None")
47
+
48
+ # def [](name_or_sym)
49
+ # case name_or_sym
50
+ # when Integer
51
+ # @layers[name_or_sym]
52
+ # else
53
+ # @layers.find { |layer| layer === name_or_sym }
54
+ # end
55
+ # end
56
+
57
+ def self.for_element(type)
58
+ values.find { |layer| layer.elements.include?(type) } || Layers::None
59
+ end
60
+ end
61
+ end
62
+ end
@@ -2,30 +2,46 @@
2
2
 
3
3
  module Archimate
4
4
  module DataModel
5
- # TODO: x & y Defined like this in the XSD
6
- NonNegativeInteger = Coercible::Int.constrained(gteq: 0)
7
- NonNegativeFloat = Coercible::Float # .constrained(gteq: 0)
5
+ # @todo x & y Defined like this in the XSD
6
+ # NonNegativeInteger = Int.constrained(gteq: 0)
7
+ # NonNegativeFloat = Float # .constrained(gteq: 0)
8
8
 
9
9
  # Graphical node type. It can contain child node types.
10
10
  # This is LocationType/LocationGroup in the XSD.
11
- class Location < ArchimateNode
11
+ class Location
12
+ include Comparison
13
+
12
14
  # The x (towards the right, associated with width) attribute from the Top,Left (i.e. 0,0)
13
15
  # corner of the diagram to the Top, Left corner of the bounding box of the concept.
14
- attribute :x, NonNegativeFloat # Note the XSD has this as an Int, NonNegativeInteger
16
+ # @note the XSD has this as a NonNegativeInteger
17
+ # @!attribute [r] x
18
+ # @return [Float]
19
+ model_attr :x
15
20
  # The y (towards the bottom, associated with height) attribute from the Top,Left (i.e. 0,0)
16
21
  # corner of the diagram to the Top, Left corner of the bounding box of the concept.
17
- attribute :y, NonNegativeFloat # Note the XSD has this as an Int, NonNegativeInteger
22
+ # @note the XSD has this as a NonNegativeInteger
23
+ # @!attribute [r] y
24
+ # @return [Float]
25
+ model_attr :y
18
26
 
19
27
  # These are holdovers from the archi file format and are only maintained for compatability
20
- attribute :end_x, Coercible::Int.optional
21
- attribute :end_y, Coercible::Int.optional
28
+ # @!attribute [r] end_x
29
+ # @return [Int, NilClass]
30
+ model_attr :end_x
31
+ # @!attribute [r] end_y
32
+ # @return [Int, NilClass]
33
+ model_attr :end_y
34
+
35
+ def initialize(x:, y:, end_x: nil, end_y: nil)
36
+ @x = x.to_i
37
+ @y = y.to_i
38
+ @end_x = end_x.nil? ? nil : end_x.to_i
39
+ @end_y = end_y.nil? ? nil : end_y.to_i
40
+ end
22
41
 
23
42
  def to_s
24
43
  "Location(x: #{x}, y: #{y})"
25
44
  end
26
45
  end
27
-
28
- Dry::Types.register_class(Location)
29
- LocationList = Strict::Array.member(Location).default([])
30
46
  end
31
47
  end