archimate 1.2.1 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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