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
@@ -1,181 +0,0 @@
1
- # frozen_string_literal: true
2
- module Archimate
3
- module DataModel
4
- class ArchimateNode < Dry::Struct
5
- using DiffablePrimitive
6
- using DiffableArray
7
-
8
- constructor_type :schema # specifies constructor style for Dry::Struct
9
-
10
- attr_writer :parent_attribute_name
11
- attr_reader :struct_instance_variables
12
-
13
- def initialize(attributes)
14
- super
15
- @struct_instance_variables = self.class.schema.keys
16
- end
17
-
18
- # TODO: Schedule this for eliminations
19
- # Outside of test code, this is only used for the Bounds class
20
- def with(options = {})
21
- self.class.new(
22
- struct_instance_variables
23
- .each_with_object({}) { |i, a| a[i] = self[i] }
24
- .merge(options)
25
- .each_with_object({}) { |(k, v), a| a[k] = v.dup }
26
- )
27
- end
28
-
29
- # Note: my clone method does one non-idiomatic thing - it does not clone the
30
- # frozen state. TODO: respect the frozen state of the clone'd object.
31
- def clone
32
- self.class.new(
33
- struct_instance_variables
34
- .each_with_object({}) do |i, a|
35
- a[i] = self[i].primitive? ? self[i] : self[i].clone
36
- end
37
- )
38
- end
39
-
40
- # Makes a copy of the archimate node which is not frozen
41
- def dup
42
- self.class.new(
43
- struct_instance_variables
44
- .each_with_object({}) do |i, a|
45
- a[i] = self[i].primitive? ? self[i] : self[i].dup
46
- end
47
- )
48
- end
49
-
50
- def in_model
51
- @in_model if defined?(@in_model)
52
- end
53
-
54
- def parent
55
- @parent if defined?(@parent)
56
- end
57
-
58
- # TODO: this is used only such that every item has an id for sticking in the index.
59
- # Is this really needed still?
60
- def id
61
- object_id
62
- end
63
-
64
- def ancestors
65
- result = [self]
66
- p = self
67
- result << p until (p = p.parent).nil?
68
- result
69
- end
70
-
71
- def primitive?
72
- false
73
- end
74
-
75
- def parent=(par)
76
- @parent = par
77
- struct_instance_variables.each do |attrname|
78
- self[attrname].parent = self
79
- end
80
- end
81
-
82
- def parent_attribute_name
83
- return @parent_attribute_name if defined?(@parent_attribute_name)
84
- parent.find_index(self) if parent&.is_a?(Array)
85
- end
86
-
87
- def in_model=(model)
88
- @in_model = model unless is_a?(Model)
89
- struct_instance_variables.each { |attrname|
90
- puts "#{attrname} is frozen in #{self.class}" if self[attrname].frozen? && self[attrname].is_a?(Array)
91
- self[attrname].in_model = model }
92
- end
93
-
94
- def build_index(hash_index = {})
95
- hash_index[id] = self unless id.nil?
96
- struct_instance_variables.reduce(hash_index) do |a, e|
97
- self[e].parent_attribute_name = e
98
- self[e].build_index(a)
99
- end
100
- end
101
-
102
- def diff(other)
103
- raise ArgumentError, "other expected to be not nil" if other.nil?
104
- raise TypeError, "Expected other <#{other.class} to be of type #{self.class}" unless other.is_a?(self.class)
105
- struct_instance_variables.each_with_object([]) do |k, a|
106
- val = self[k]
107
- if val.nil?
108
- a.concat([Diff::Insert.new(Diff::ArchimateNodeAttributeReference.new(other, k))]) unless other[k].nil?
109
- elsif val.primitive?
110
- a.concat(val.diff(other[k], self, other, k))
111
- else
112
- a.concat(val.diff(other[k]))
113
- end
114
- end
115
- end
116
-
117
- def path(options = {})
118
- [
119
- parent&.path(options),
120
- path_identifier
121
- ].compact.map(&:to_s).reject(&:empty?).join("/")
122
- end
123
-
124
- def compact!
125
- struct_instance_variables.each { |attrname| self[attrname].compact! }
126
- self
127
- end
128
-
129
- def delete(attrname)
130
- if !attrname || attrname.empty?
131
- raise(
132
- ArgumentError,
133
- "attrname was blank must be one of: #{struct_instance_variables.map(&:to_s).join(',')}"
134
- )
135
- end
136
- in_model&.deregister(self[attrname])
137
- instance_variable_set("@#{attrname}".to_sym, nil)
138
- self
139
- end
140
-
141
- def set(attrname, value)
142
- if !attrname
143
- raise(
144
- ArgumentError,
145
- "attrname was blank must be one of: #{struct_instance_variables.map(&:to_s).join(',')}"
146
- )
147
- end # || attrname.empty?
148
- # value = value.clone
149
- in_model&.register(value, self)
150
- instance_variable_set("@#{attrname}".to_sym, value)
151
- self
152
- end
153
-
154
- def referenced_identified_nodes
155
- struct_instance_variables.reduce([]) do |a, e|
156
- a.concat(self[e].referenced_identified_nodes)
157
- end
158
- end
159
-
160
- def element_by_id(element_id)
161
- return nil unless element_id
162
- in_model&.lookup(element_id)
163
- end
164
-
165
- private
166
-
167
- def path_identifier
168
- case parent
169
- when Array
170
- find_my_index
171
- else
172
- parent_attribute_name
173
- end
174
- end
175
-
176
- def find_my_index
177
- parent.find_index(self)
178
- end
179
- end
180
- end
181
- end
@@ -1,14 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Archimate
4
- module DataModel
5
- # This is an abstract class for Concepts (Elements, Relationships, Composites, and RelationConnectors).
6
- class Concept < Referenceable
7
- attribute :properties, PropertiesList
8
- # group -> ConceptGroup # Empty. Available for Extension purposes.
9
- # attributeGroup -> ConceptAttributeGroup # Empty. Available for Extension purposes.
10
- end
11
-
12
- Dry::Types.register_class(Concept)
13
- end
14
- end
@@ -1,82 +0,0 @@
1
- # frozen_string_literal: true
2
- module Archimate
3
- module DataModel
4
- # The Constants module contains constants for ArchiMate standards
5
- # TODO: This should be namespaced for the ArchiMate version in effect
6
- module Constants
7
- ELEMENTS = %w(BusinessActor BusinessCollaboration BusinessEvent BusinessFunction
8
- BusinessInteraction BusinessInterface BusinessObject BusinessProcess
9
- BusinessRole BusinessService Contract Location Meaning Value Product
10
- Representation ApplicationCollaboration ApplicationComponent
11
- ApplicationFunction ApplicationInteraction ApplicationInterface
12
- ApplicationService DataObject Artifact CommunicationPath Device
13
- InfrastructureFunction InfrastructureInterface InfrastructureService
14
- Network Node SystemSoftware Assessment Constraint Driver Goal Principle
15
- Requirement Stakeholder Deliverable Gap Plateau WorkPackage AndJunction
16
- Junction OrJunction Capability CourseOfAction Resource
17
- ApplicationProcess ApplicationEvent TechnologyCollaboration
18
- TechnologyInterface Path CommunicationNetwork
19
- TechnologyFunction TechnologyProcess TechnologyInteraction
20
- TechnologyEvent TechnologyService
21
- TechnologyObject Equipment Facility DistributionNetwork Material
22
- Outcome ImplementationEvent).freeze
23
-
24
- RELATIONSHIPS = %w(AssociationRelationship AccessRelationship UsedByRelationship
25
- RealisationRelationship AssignmentRelationship AggregationRelationship
26
- CompositionRelationship FlowRelationship TriggeringRelationship
27
- GroupingRelationship SpecialisationRelationship InfluenceRelationship).freeze
28
-
29
- LAYER_ELEMENTS = {
30
- "Strategy" =>
31
- %w(Capability CourseOfAction Resource),
32
- "Business" =>
33
- %w(BusinessActor BusinessCollaboration
34
- BusinessEvent BusinessFunction
35
- BusinessInteraction BusinessInterface
36
- BusinessObject BusinessProcess
37
- BusinessRole BusinessService
38
- Contract Location
39
- Meaning Value
40
- Product Representation),
41
- "Application" =>
42
- %w(ApplicationCollaboration ApplicationComponent
43
- ApplicationFunction ApplicationInteraction
44
- ApplicationInterface ApplicationService
45
- DataObject ApplicationProcess ApplicationEvent),
46
- "Technology" =>
47
- %w(Artifact CommunicationPath
48
- Device InfrastructureFunction
49
- InfrastructureInterface InfrastructureService
50
- Network Node SystemSoftware TechnologyCollaboration
51
- TechnologyInterface Path CommunicationNetwork
52
- TechnologyFunction TechnologyProcess TechnologyInteraction
53
- TechnologyEvent TechnologyService
54
- TechnologyObject),
55
- "Physical" =>
56
- %w(Equipment Facility DistributionNetwork Material),
57
- "Motivation" =>
58
- %w(Assessment Constraint Driver
59
- Goal Principle Requirement
60
- Stakeholder Outcome),
61
- "Implementation and Migration" =>
62
- %w(Deliverable Gap Plateau
63
- WorkPackage ImplementationEvent),
64
- "Connectors" =>
65
- %w(AndJunction Junction OrJunction)
66
- }.freeze
67
-
68
- ELEMENT_LAYER = LAYER_ELEMENTS.each_with_object({}) do |(layer, elements), el_layer_hash|
69
- elements.each_with_object(el_layer_hash) { |element, a| a[element] = layer }
70
- end
71
-
72
- VIEWPOINTS = ["Total", "Actor Co-operation", "Application Behaviour",
73
- "Application Co-operation", "Application Structure", "Application Usage",
74
- "Business Function", "Business Process Co-operation", "Business Process",
75
- "Business Product", "Implementation and Deployment", "Information Structure",
76
- "Infrastructure Usage", "Infrastructure", "Layered", "Organisation",
77
- "Service Realization", "Stakeholder", "Goal Realization", "Goal Contribution",
78
- "Principles", "Requirements Realisation", "Motivation", "Project",
79
- "Migration", "Implementation and Migration"].freeze
80
- end
81
- end
82
- end
@@ -1,17 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Archimate
4
- module DataModel
5
- # Node type to allow a Container in a Artifact. This is a visual grouping container.
6
- class Container < ViewNode
7
- # This is to support Nested Nodes on the Diagram
8
- # The order of sibling nodes in their parent View or Node container as declared in the model
9
- # instance dictates the z-order of the nodes. Given nodes A, B, and C as declared in that order,
10
- # node B is considered to be in front of node A, node C is considered to be in front of node B, and
11
- # node C is considered to be in front of nodes A and B.
12
- attribute :nodes, Strict::Array.member(ViewNode)
13
- end
14
-
15
- Dry::Types.register_class(Container)
16
- end
17
- end
@@ -1,213 +0,0 @@
1
- # frozen_string_literal: true
2
- module Archimate
3
- module DataModel
4
- module DiffableArray
5
- using DiffablePrimitive
6
-
7
- refine Array do
8
- using DiffablePrimitive
9
-
10
- attr_writer :parent_attribute_name
11
-
12
- def in_model
13
- @in_model if defined?(@in_model)
14
- end
15
-
16
- def parent
17
- @parent if defined?(@parent)
18
- end
19
-
20
- def id
21
- object_id.to_s
22
- end
23
-
24
- def ancestors
25
- result = [self]
26
- p = self
27
- result << p until (p = p.parent).nil?
28
- result
29
- end
30
-
31
- def primitive?
32
- false
33
- end
34
-
35
- # def diff(other)
36
- # raise TypeError, "Expected other #{other.class} to be of type #{self.class}" unless other.is_a?(self.class)
37
- # raise "Well Hell other #{other.path} in_model is nil" if other.in_model.nil?
38
- # raise "Well Hell my path `#{path}` in_model is nil" if in_model.nil?
39
-
40
- # result = []
41
- # remaining_content = Array.new(self) # TODO: I want a copy of the array, not a deep clone
42
- # other_enum = other.each_with_index
43
-
44
- # loop do
45
- # if other_enum.peek[0] == remaining_content[0]
46
- # other_enum.next
47
- # remaining_content.shift
48
- # elsif items_are_changed?(other, other_enum, remaining_content)
49
- # result.concat(compute_item_changes(other, other_enum, self, remaining_content[0]))
50
- # remaining_content.shift
51
- # other_enum.next
52
- # elsif !remaining_content.empty? && !other.smart_include?(remaining_content[0])
53
- # result << Diff::Delete.new(Diff::ArchimateArrayReference.new(self, smart_find(remaining_content[0])))
54
- # remaining_content.shift
55
- # elsif !smart_include?(other_enum.peek[0])
56
- # result << Diff::Insert.new(Diff::ArchimateArrayReference.new(other, other_enum.next[1]))
57
- # elsif smart_include?(other_enum.peek[0])
58
- # result << Diff::Move.new(
59
- # Diff::ArchimateArrayReference.new(other, other_enum.peek[1]),
60
- # Diff::ArchimateArrayReference.new(self, smart_find(other_enum.peek[0]))
61
- # )
62
- # remaining_item_idx = remaining_content.smart_find(other_enum.peek[0])
63
- # if remaining_item_idx
64
- # result.concat(compute_item_changes(other, other_enum, self, remaining_content[remaining_item_idx]))
65
- # remaining_content.delete_at(remaining_item_idx) if remaining_content.smart_include?(other_enum.peek[0])
66
- # end
67
- # other_enum.next
68
- # else
69
- # raise "Unhandled diff case for remaining_content: #{remaining_content[0]} and #{other_enum.peek[0]}"
70
- # end
71
- # end
72
-
73
- # result.concat(
74
- # remaining_content
75
- # .reject { |item| other.include?(item) }
76
- # .map do |item|
77
- # Diff::Delete.new(Diff::ArchimateArrayReference.new(self, find_index(item)))
78
- # end
79
- # )
80
- # end
81
-
82
- # TODO: This may not continue to live here. Only used by testing.
83
- # def patch(diffs)
84
- # # TODO: Beware, order of diffs could break patching at the moment.
85
- # Array(diffs).each do |diff|
86
- # case diff
87
- # when Diff::Delete
88
- # delete_at(smart_find(diff.target.value))
89
- # when Diff::Insert
90
- # insert(diff.target.array_index, diff.target.value)
91
- # when Diff::Change
92
- # self[smart_find(diff.changed_from.value)] = diff.target.value
93
- # when Diff::Move
94
- # insert(diff.target.array_index, delete_at(smart_find(diff.target.value)))
95
- # else
96
- # raise "Unexpected diff type: #{diff.class}"
97
- # end
98
- # end
99
- # self
100
- # end
101
-
102
- def items_are_changed?(other, other_enum, remaining)
103
- !remaining.empty? &&
104
- case remaining[0]
105
- when DataModel::Referenceable
106
- remaining[0].id == other_enum.peek[0].id
107
- when String, DataModel::ArchimateNode
108
- !other.include?(remaining[0]) && !include?(other_enum.peek[0])
109
- else
110
- raise "Unhandled type for #{remaining[0].class}"
111
- end
112
- end
113
-
114
- def compute_item_changes(other, other_enum, _myself, my_item)
115
- case my_item
116
- when DataModel::ArchimateNode
117
- my_item.diff(other_enum.peek[0])
118
- else
119
- my_item.diff(other_enum.peek[0], self, other, other_enum.peek[1], find_index(my_item))
120
- end
121
- end
122
-
123
- def in_model=(model)
124
- puts "#{self.inspect} is frozen" if self.frozen?
125
- @in_model = model
126
- each { |item| item.in_model = model }
127
- end
128
-
129
- def parent=(par)
130
- @parent = par
131
- each { |i| i.parent = self }
132
- end
133
-
134
- def parent_attribute_name
135
- @parent_attribute_name if defined?(@parent_attribute_name)
136
- end
137
-
138
- def build_index(hash_index = {})
139
- reduce(hash_index) { |hi, array_item| array_item.build_index(hi) }
140
- end
141
-
142
- def path(options = {})
143
- [
144
- parent&.path(options),
145
- parent_attribute_name
146
- ].compact.reject(&:empty?).join("/")
147
- end
148
-
149
- def clone
150
- map(&:clone)
151
- end
152
-
153
- def dup
154
- map(&:dup)
155
- end
156
-
157
- def to_s
158
- "#{parent}/#{parent_attribute_name}"
159
- end
160
-
161
- def referenced_identified_nodes
162
- reduce([]) do |a, e|
163
- a.concat(e.referenced_identified_nodes)
164
- end
165
- end
166
-
167
- def find_by_id(an_id)
168
- find { |el| el.id == an_id }
169
- end
170
-
171
- def smart_find(val = nil)
172
- case val
173
- when Referenceable
174
- lazy.map(&:id).find_index(val.id)
175
- else
176
- find_index(val)
177
- end
178
- end
179
-
180
- def smart_include?(val)
181
- case val
182
- when Referenceable
183
- lazy.map(&:id).include?(val.id)
184
- else
185
- include?(val)
186
- end
187
- end
188
-
189
- def smart_intersection(ary)
190
- select { |item| ary.smart_include?(item) }
191
- end
192
-
193
- def after(idx)
194
- return [] if idx >= size - 1
195
- self[idx + 1..-1]
196
- end
197
-
198
- # Given a node in self and ary,
199
- # return the idx of first node p in self that exists in both self and ary
200
- # and is previous to node in self
201
- def previous_item_index(ary, node)
202
- return -1 unless ary.smart_include?(node)
203
- initial_idx = smart_find(node)
204
- return -1 if initial_idx.nil?
205
-
206
- (initial_idx - 1).downto(0).find(-> { -1 }) do |idx|
207
- ary.smart_include?(at(idx))
208
- end
209
- end
210
- end
211
- end
212
- end
213
- end