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
@@ -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