archimate 2.0.2 → 2.0.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (108) hide show
  1. checksums.yaml +5 -5
  2. data/.travis.yml +1 -1
  3. data/Gemfile +1 -0
  4. data/README.md +10 -55
  5. data/Rakefile +19 -1
  6. data/archimate.gemspec +16 -14
  7. data/bin/archimate +12 -0
  8. data/lib/archimate/cli/archi.rb +38 -19
  9. data/lib/archimate/cli/cleanup.rb +41 -25
  10. data/lib/archimate/cli/duper.rb +0 -1
  11. data/lib/archimate/cli/mapper.rb +53 -40
  12. data/lib/archimate/cli/svger.rb +33 -4
  13. data/lib/archimate/core_refinements.rb +41 -0
  14. data/lib/archimate/data_model/bounds.rb +14 -4
  15. data/lib/archimate/data_model/comparison.rb +3 -27
  16. data/lib/archimate/data_model/connection.rb +26 -11
  17. data/lib/archimate/data_model/diagram.rb +17 -10
  18. data/lib/archimate/data_model/element.rb +21 -9
  19. data/lib/archimate/data_model/elements.rb +24 -18
  20. data/lib/archimate/data_model/lang_string.rb +34 -10
  21. data/lib/archimate/data_model/layer.rb +6 -0
  22. data/lib/archimate/data_model/location.rb +10 -13
  23. data/lib/archimate/data_model/model.rb +55 -43
  24. data/lib/archimate/data_model/organization.rb +21 -5
  25. data/lib/archimate/data_model/property.rb +0 -6
  26. data/lib/archimate/data_model/referenceable.rb +29 -3
  27. data/lib/archimate/data_model/referenceable_list.rb +34 -14
  28. data/lib/archimate/data_model/relationship.rb +29 -8
  29. data/lib/archimate/data_model/relationship_references.rb +115 -6
  30. data/lib/archimate/data_model/relationships.rb +15 -0
  31. data/lib/archimate/data_model/view_node.rb +20 -13
  32. data/lib/archimate/data_model/viewpoint.rb +13 -1
  33. data/lib/archimate/data_model/viewpoints.rb +416 -0
  34. data/lib/archimate/data_model.rb +7 -1
  35. data/lib/archimate/derived_relations.rb +2 -11
  36. data/lib/archimate/export/cypher.rb +6 -5
  37. data/lib/archimate/file_format.rb +1 -0
  38. data/lib/archimate/file_formats/archi_file_reader.rb +11 -1
  39. data/lib/archimate/file_formats/archi_file_writer.rb +15 -46
  40. data/lib/archimate/file_formats/archi_file_writer_4.rb +14 -0
  41. data/lib/archimate/file_formats/model_exchange_file_reader.rb +2 -1
  42. data/lib/archimate/file_formats/model_exchange_file_writer_21.rb +1 -0
  43. data/lib/archimate/file_formats/sax/archi/diagram.rb +53 -13
  44. data/lib/archimate/file_formats/sax/archi/location.rb +1 -3
  45. data/lib/archimate/file_formats/sax/model_exchange_file/diagram.rb +13 -2
  46. data/lib/archimate/file_formats/sax.rb +1 -0
  47. data/lib/archimate/file_formats/serializer/archi/archi_file_writer.rb +63 -0
  48. data/lib/archimate/file_formats/serializer/archi/archi_file_writer_3.rb +18 -0
  49. data/lib/archimate/file_formats/serializer/archi/archi_file_writer_4.rb +18 -0
  50. data/lib/archimate/file_formats/serializer/archi/bounds.rb +2 -2
  51. data/lib/archimate/file_formats/serializer/archi/connection.rb +24 -13
  52. data/lib/archimate/file_formats/serializer/archi/diagram.rb +3 -3
  53. data/lib/archimate/file_formats/serializer/archi/element.rb +2 -2
  54. data/lib/archimate/file_formats/serializer/archi/organization.rb +1 -1
  55. data/lib/archimate/file_formats/serializer/archi/property.rb +1 -1
  56. data/lib/archimate/file_formats/serializer/archi/relationship.rb +2 -2
  57. data/lib/archimate/file_formats/serializer/archi/view_node.rb +20 -22
  58. data/lib/archimate/file_formats/serializer/archi/viewpoint3.rb +43 -0
  59. data/lib/archimate/file_formats/serializer/archi/viewpoint4.rb +41 -0
  60. data/lib/archimate/file_formats/serializer/model_exchange_file/style.rb +3 -7
  61. data/lib/archimate/file_formats/serializer/model_exchange_file/v21/diagram.rb +3 -3
  62. data/lib/archimate/file_formats/serializer/model_exchange_file/v21/model.rb +9 -2
  63. data/lib/archimate/file_formats/serializer/model_exchange_file/v21/view_node.rb +1 -1
  64. data/lib/archimate/file_formats/serializer/model_exchange_file/v21/viewpoint.rb +23 -0
  65. data/lib/archimate/file_formats/serializer/model_exchange_file/v30/diagram.rb +3 -3
  66. data/lib/archimate/file_formats/serializer/model_exchange_file/v30/model.rb +5 -7
  67. data/lib/archimate/file_formats/serializer/model_exchange_file/v30/view_node.rb +3 -3
  68. data/lib/archimate/file_formats/serializer/writer.rb +0 -5
  69. data/lib/archimate/file_formats/serializer.rb +6 -2
  70. data/lib/archimate/lint/duplicate_entities.rb +5 -5
  71. data/lib/archimate/lint/linter.rb +4 -4
  72. data/lib/archimate/maybe_io.rb +3 -2
  73. data/lib/archimate/svg/archimate.css +19 -21
  74. data/lib/archimate/svg/connection.rb +1 -1
  75. data/lib/archimate/svg/diagram.rb +1 -6
  76. data/lib/archimate/svg/entity/application_component.rb +9 -3
  77. data/lib/archimate/svg/entity/constraint.rb +0 -1
  78. data/lib/archimate/svg/entity/contract.rb +9 -0
  79. data/lib/archimate/svg/entity/data_entity.rb +1 -1
  80. data/lib/archimate/svg/entity/device.rb +1 -1
  81. data/lib/archimate/svg/entity/event_entity.rb +24 -7
  82. data/lib/archimate/svg/entity/group.rb +23 -4
  83. data/lib/archimate/svg/entity/grouping.rb +37 -0
  84. data/lib/archimate/svg/entity/interface_entity.rb +1 -1
  85. data/lib/archimate/svg/entity/node.rb +1 -1
  86. data/lib/archimate/svg/entity/outcome.rb +0 -1
  87. data/lib/archimate/svg/entity/principle.rb +0 -1
  88. data/lib/archimate/svg/entity/process_entity.rb +1 -1
  89. data/lib/archimate/svg/entity/requirement.rb +0 -1
  90. data/lib/archimate/svg/entity/service_entity.rb +6 -13
  91. data/lib/archimate/svg/entity.rb +1 -0
  92. data/lib/archimate/svg/entity_factory.rb +9 -5
  93. data/lib/archimate/svg/path.rb +57 -46
  94. data/lib/archimate/svg/point.rb +4 -0
  95. data/lib/archimate/svg/segment.rb +30 -0
  96. data/lib/archimate/svg/svg_template.svg.erb +11 -3
  97. data/lib/archimate/svg/view_node.rb +22 -0
  98. data/lib/archimate/version.rb +1 -1
  99. data/lib/archimate.rb +3 -2
  100. metadata +54 -54
  101. data/exe/archidiff +0 -7
  102. data/exe/archidiff-summary +0 -7
  103. data/exe/archimerge +0 -7
  104. data/exe/fmtxml +0 -7
  105. data/lib/archimate/data_model/viewpoint_type.rb +0 -389
  106. data/lib/archimate/file_formats/serializer/archi/location.rb +0 -26
  107. data/lib/archimate/file_formats/serializer/archi/viewpoint_type.rb +0 -45
  108. data/lib/archimate/svg/child.rb +0 -29
@@ -16,9 +16,35 @@ module Archimate
16
16
  @referenceable_set ||= []
17
17
  end
18
18
 
19
- # Diagrams that this entity is referenced in.
20
- def diagrams
21
- references.select { |ref| ref.is_a?(Diagram) }
19
+ def model
20
+ references.find { |ref| ref.is_a?(Model) }
21
+ end
22
+
23
+ def destroy
24
+ references.each { |ref| ref.remove_reference(self) }
25
+ to_h.values.select { |v| v.is_a?(Referenceable) }.each { |ref| ref.remove_reference(self) }
26
+ end
27
+
28
+ def replace_with(other)
29
+ references.dup.each do |ref|
30
+ ref.replace_item_with(self, other)
31
+ remove_reference(ref)
32
+ end
33
+ end
34
+
35
+ def replace_item_with(item, replacement)
36
+ # default not doing anything
37
+ # puts Archimate::Color.uncolor(" Referenceable(#{cls_name(self)}).replace_item_with item: #{item} replacement: #{replacement}")
38
+ end
39
+
40
+ private
41
+
42
+ def cls_name(o)
43
+ o.class.name.split("::").last
44
+ end
45
+
46
+ def to_cls_name
47
+ ->(o) { o.class.name.split("::").last }
22
48
  end
23
49
  end
24
50
  end
@@ -7,24 +7,36 @@ module Archimate
7
7
  # A list of things that can be referenced by another entity.
8
8
  class ReferenceableList
9
9
  extend Forwardable
10
+ include Referenceable
10
11
 
11
12
  def_delegators :@list,
13
+ :+,
14
+ :==,
12
15
  :[],
13
16
  :all?,
17
+ :any?,
18
+ :chunk,
14
19
  :dig,
20
+ :each,
15
21
  :each_with_object,
22
+ :empty?,
16
23
  :find,
24
+ :first,
25
+ :flat_map,
26
+ :group_by,
17
27
  :hash,
18
28
  :include?,
29
+ :inject,
30
+ :inspect,
31
+ :last,
19
32
  :map,
20
33
  :none?,
21
- :select,
22
- :==,
23
- :each,
24
- :empty?,
25
- :first,
26
34
  :reduce,
27
- :size
35
+ :reject,
36
+ :select,
37
+ :sort,
38
+ :size,
39
+ :to_a
28
40
 
29
41
  attr_reader :parent
30
42
 
@@ -46,14 +58,20 @@ module Archimate
46
58
  end
47
59
 
48
60
  def push(item)
61
+ return if @list.include?(item)
62
+ add_item_references(item)
63
+ @list.push(item)
64
+ end
65
+
66
+ def <<(item)
49
67
  return if @list.include?(item)
50
68
  add_item_references(item)
51
69
  @list << item
52
70
  end
53
71
 
54
- def inspect
55
- vals = @list.first(3).map(&:brief_inspect)
56
- "[#{vals.join(', ')}#{"...#{@list.size}" if @list.size > 3}]"
72
+ def delete(item)
73
+ @list.delete(item)
74
+ remove_item_references(item)
57
75
  end
58
76
 
59
77
  private
@@ -70,11 +88,13 @@ module Archimate
70
88
  end
71
89
 
72
90
  def remove_references
73
- @list.each do |item|
74
- item.remove_reference(parent)
75
- @parent_attr_references.each do |attr|
76
- item.remove_reference(parent.send(attr)) if parent.send(attr)
77
- end
91
+ @list.each { |item| remove_item_references(item) }
92
+ end
93
+
94
+ def remove_item_references(item)
95
+ item.remove_reference(parent)
96
+ @parent_attr_references.each do |attr|
97
+ item.remove_reference(parent.send(attr)) if parent.send(attr)
78
98
  end
79
99
  end
80
100
  end
@@ -23,7 +23,7 @@ module Archimate
23
23
  model_attr :name, default: nil
24
24
  # @!attribute [r] documentation
25
25
  # @return [PreservedLangString, NilClass]
26
- model_attr :documentation, default: nil
26
+ model_attr :documentation, writable: true, default: nil
27
27
  # @return [Array<AnyElement>]
28
28
  # model_attr :other_elements
29
29
  # @return [Array<AnyAttribute>]
@@ -81,12 +81,6 @@ module Archimate
81
81
  ].compact.join(" ")
82
82
  end
83
83
 
84
- # @todo remove when it doesn't break diff merge conflicts
85
- # @deprecated
86
- def referenced_identified_nodes
87
- [@source, @target].compact
88
- end
89
-
90
84
  # Copy any attributes/docs, etc. from each of the others into the original.
91
85
  # 1. Child `label`s with different `xml:lang` attribute values
92
86
  # 2. Child `documentation` (and different `xml:lang` attribute values)
@@ -94,9 +88,36 @@ module Archimate
94
88
  # 4. Any other elements
95
89
  # source and target don't change on a merge
96
90
  def merge(relationship)
97
- super
91
+ if !documentation
92
+ self.documentation = relationship.documentation
93
+ elsif documentation != relationship.documentation
94
+ documentation.merge(relationship.documentation)
95
+ end
96
+ relationship.properties.each do |property|
97
+ unless properties.find { |my_prop| my_prop.property_definition.name == property.property_definition.name && my_prop.value == property.value}
98
+ properties << property
99
+ end
100
+ end
98
101
  @access_type ||= relationship.access_type
99
102
  end
103
+
104
+ # Diagrams that this entity is referenced in.
105
+ def diagrams
106
+ references.select { |ref| ref.is_a?(Diagram) }
107
+ end
108
+
109
+ def replace_item_with(item, replacement)
110
+ super
111
+ item.remove_reference(self)
112
+ case item
113
+ when source
114
+ @source = replacement
115
+ when target
116
+ @target = replacement
117
+ else
118
+ raise "Trying to replace #{item} that I don't reference"
119
+ end
120
+ end
100
121
  end
101
122
  end
102
123
  end
@@ -1,5 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ using Archimate::CoreRefinements
4
+
3
5
  module Archimate
4
6
  module DataModel
5
7
  # RelationshipReferences provides a means to allow a class that is referenced
@@ -13,15 +15,122 @@ module Archimate
13
15
  references.select { |ref| ref.is_a?(DataModel::Relationship) }
14
16
  end
15
17
 
16
- def self.included(_base)
17
- Relationships.classes.each do |rel_cls|
18
- define_method(rel_cls::VERB.tr(' ', '_').to_sym) do
19
- references.select { |ref| ref.is_a?(rel_cls) && ref.source == self }
18
+ # List of relationships where this object is the source
19
+ def source_relationships
20
+ relationships.select { |rel| rel.source.id == id }
21
+ end
22
+
23
+ # List of relationships where this object is the target
24
+ def target_relationships
25
+ relationships.select { |rel| rel.target.id == id }
26
+ end
27
+
28
+ # Creates a method on this instance that returns the relationships of the
29
+ # relationship type `rel_cls` where this object is the source.
30
+ #
31
+ # @param rel_cls [Archimate::DataModel::Relationship] Relationships class to define references method
32
+ def self.define_typed_relationships_method(rel_cls)
33
+ define_method(rel_cls::VERB.to_method_name("relationships")) do
34
+ references.select { |ref| ref.is_a?(rel_cls) && ref.source == self }
35
+ end
36
+ end
37
+
38
+ # Creates a method on this instance that returns the elements related by the
39
+ # relationship type `rel_cls` where this object is the source.
40
+ #
41
+ # @param rel_cls [Archimate::DataModel::Relationship] Relationships class to define references method
42
+ def self.define_typed_elements_method(rel_cls)
43
+ define_method(rel_cls::VERB.to_method_name("elements")) do
44
+ references
45
+ .select { |ref| ref.is_a?(rel_cls) && ref.source == self }
46
+ .map(&:target)
47
+ end
48
+ end
49
+
50
+ # Creates a method on this instance that returns the relationships of the
51
+ # relationship type `rel_cls` where this object is the target.
52
+ #
53
+ # @param rel_cls [Archimate::DataModel::Relationship] Relationships class to define references method
54
+ def self.define_typed_targeted_relationships_method(rel_cls)
55
+ define_method(rel_cls::OBJECT_VERB.to_method_name("relationships")) do
56
+ references.select { |ref| ref.is_a?(rel_cls) && ref.target == self }
57
+ end
58
+ end
59
+
60
+ # Creates a method on this instance that returns the elements related by the
61
+ # relationship type `rel_cls` where this object is the source.
62
+ #
63
+ # @param rel_cls [Archimate::DataModel::Relationship] Relationships class to define references method
64
+ def self.define_typed_targeted_elements_method(rel_cls)
65
+ define_method(rel_cls::OBJECT_VERB.to_method_name("elements")) do
66
+ references
67
+ .select { |ref| ref.is_a?(rel_cls) && ref.target == self }
68
+ .map(&:source)
69
+ end
70
+ end
71
+
72
+ # Creates a method on this instance to create relationships to one or more
73
+ # elements of a the rel_cls relationship type where this object is source.
74
+ #
75
+ # @param rel_cls [Archimate::DataModel::Relationship] Relationships class to define references method
76
+ def self.define_source_relationship_creation_method(rel_cls)
77
+ define_method(rel_cls::VERB.to_method_name) do |targets = nil, args = {}|
78
+ rels = Array(args.fetch(:target, targets)).compact.map do |target|
79
+ relationship = model&.relationships&.find do |r|
80
+ r.is_a?(rel_cls) &&
81
+ r.name == args.fetch(:name, nil) &&
82
+ r.source == self &&
83
+ r.target == target
84
+ end
85
+ unless relationship
86
+ rargs = args.dup
87
+ rargs[:target] = target
88
+ rargs[:source] = self
89
+ rargs[:id] = model.make_unique_id if !rargs.key?(:id) && model
90
+ relationship = rel_cls.new(rargs)
91
+ (model.relationships << relationship) if model
92
+ end
93
+ relationship
20
94
  end
95
+ rels.size < 2 ? rels.first : rels
96
+ end
97
+ end
21
98
 
22
- define_method(rel_cls::OBJECT_VERB.tr(' ', '_').to_sym) do
23
- references.select { |ref| ref.is_a?(rel_cls) && ref.target == self }
99
+ # Creates a method on this instance to create relationships to one or more
100
+ # elements of a the rel_cls relationship type where this object is target.
101
+ #
102
+ # @param rel_cls [Archimate::DataModel::Relationship] Relationships class to define references method
103
+ def self.define_target_relationship_creation_method(rel_cls)
104
+ define_method(rel_cls::OBJECT_VERB.to_method_name) do |sources = nil, args = {}|
105
+ rels = Array(args.fetch(:source, sources)).compact.map do |source|
106
+ relationship = model&.relationships&.find do |r|
107
+ r.is_a?(rel_cls) &&
108
+ r.name == args.fetch(:name, nil) &&
109
+ r.source == source &&
110
+ r.target == self
111
+ end
112
+ unless relationship
113
+ rargs = args.dup
114
+ rargs[:source] = source
115
+ rargs[:target] = self
116
+ rargs[:id] = model.make_unique_id if !rargs.key?(:id) && model
117
+ relationship = rel_cls.new(rargs)
118
+ (model.relationships << relationship) if model
119
+ end
120
+ relationship
24
121
  end
122
+ rels.size < 2 ? rels.first : rels
123
+ end
124
+ end
125
+
126
+ def self.included(_base)
127
+ Relationships.classes.each do |rel_cls|
128
+ define_typed_relationships_method(rel_cls)
129
+ define_typed_elements_method(rel_cls)
130
+ define_typed_targeted_relationships_method(rel_cls)
131
+ define_typed_targeted_elements_method(rel_cls)
132
+ define_source_relationship_creation_method(rel_cls)
133
+ define_target_relationship_creation_method(rel_cls)
25
134
  end
26
135
  end
27
136
  end
@@ -209,6 +209,21 @@ module Archimate
209
209
  def self.classes
210
210
  constants.map { |cls_name| const_get(cls_name) }
211
211
  end
212
+
213
+ def self.default
214
+ [
215
+ Relationships::Access,
216
+ Relationships::Aggregation,
217
+ Relationships::Assignment,
218
+ Relationships::Association,
219
+ Relationships::Composition,
220
+ Relationships::Flow,
221
+ Relationships::Realization,
222
+ Relationships::Specialization,
223
+ Relationships::Triggering,
224
+ Relationships::Serving
225
+ ].freeze
226
+ end
212
227
  end
213
228
  end
214
229
  end
@@ -92,8 +92,9 @@ module Archimate
92
92
  # @return [Element, NilClass]
93
93
  model_attr :element, writable: true, comparison_attr: :id, default: nil, also_reference: [:diagram]
94
94
  # Archi format, selects the shape of element (for elements that can have two or more shapes)
95
+ # A nil value indicates the standard representation, a value of "1" indicates the alternate
95
96
  # @!attribute [r] child_type
96
- # @return [Int, NilClass]
97
+ # @return [String, NilClass]
97
98
  model_attr :child_type, default: nil
98
99
 
99
100
  # @!attribute [r] diagram
@@ -122,9 +123,9 @@ module Archimate
122
123
 
123
124
  def description
124
125
  [
125
- name.nil? ? nil : name.to_s,
126
- element.nil? ? nil : element.name,
127
- element&.type.nil? ? nil : "(#{element.type})"
126
+ name&.to_s,
127
+ element&.name,
128
+ element ? "(#{element.type})" : nil
128
129
  ].compact.join(" ")
129
130
  end
130
131
 
@@ -136,15 +137,6 @@ module Archimate
136
137
  nodes.each_with_object(id => self) { |i, a| a.merge!(i.child_id_hash) }
137
138
  end
138
139
 
139
- def referenced_identified_nodes
140
- (nodes.to_ary + connections).reduce(
141
- [element]
142
- .compact
143
- ) do |a, e|
144
- a.concat(e.referenced_identified_nodes)
145
- end
146
- end
147
-
148
140
  def in_diagram
149
141
  diagram # ||= ->(node) { node = node.parent until node.nil? || node.is_a?(Diagram) }.call(self)
150
142
  end
@@ -167,6 +159,21 @@ module Archimate
167
159
  .select { |conn| conn.target&.id == id }
168
160
  .map(&:id)
169
161
  end
162
+
163
+ def center
164
+ @bounds&.center
165
+ end
166
+
167
+ def replace_item_with(item, replacement)
168
+ super
169
+ item.remove_reference(self)
170
+ case item
171
+ when element
172
+ @element = replacement
173
+ else
174
+ raise "Trying to replace #{item} that I don't reference"
175
+ end
176
+ end
170
177
  end
171
178
  end
172
179
  end
@@ -35,7 +35,7 @@ module Archimate
35
35
  # @return [Array<ViewpointContentEnum>]
36
36
  model_attr :viewpoint_contents, default: []
37
37
  # @!attribute [r] allowed_element_types
38
- # @return [Array<ElementType>]
38
+ # @return [Array<Elements::*>]
39
39
  model_attr :allowed_element_types, default: []
40
40
  # @!attribute [r] allowed_relationship_types
41
41
  # @return [Array<Relationships::*>]
@@ -43,6 +43,18 @@ module Archimate
43
43
  # @!attribute [r] modeling_notes
44
44
  # @return [Array<ModelingNote>]
45
45
  model_attr :modeling_notes, default: []
46
+
47
+ def to_s
48
+ name.to_s
49
+ end
50
+
51
+ def select_elements(from_elements)
52
+ from_elements.select { |el| allowed_element_types.include?(el.class) }
53
+ end
54
+
55
+ def select_relationships(from_relationships)
56
+ from_relationships.select { |rel| allowed_relationship_types.include?(rel.class) }
57
+ end
46
58
  end
47
59
  end
48
60
  end