archimate 2.0.1 → 2.0.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (65) hide show
  1. checksums.yaml +4 -4
  2. data/archimate.gemspec +2 -1
  3. data/lib/archimate/color.rb +2 -2
  4. data/lib/archimate/data_model/any_attribute.rb +4 -10
  5. data/lib/archimate/data_model/any_element.rb +9 -17
  6. data/lib/archimate/data_model/bounds.rb +6 -6
  7. data/lib/archimate/data_model/color.rb +6 -6
  8. data/lib/archimate/data_model/comparison.rb +101 -5
  9. data/lib/archimate/data_model/concern.rb +5 -13
  10. data/lib/archimate/data_model/connection.rb +39 -48
  11. data/lib/archimate/data_model/connector_type.rb +1 -0
  12. data/lib/archimate/data_model/diagram.rb +27 -42
  13. data/lib/archimate/data_model/diagram_type.rb +1 -0
  14. data/lib/archimate/data_model/element.rb +14 -35
  15. data/lib/archimate/data_model/elements.rb +681 -0
  16. data/lib/archimate/data_model/font.rb +8 -8
  17. data/lib/archimate/data_model/lang_string.rb +10 -36
  18. data/lib/archimate/data_model/layer.rb +4 -5
  19. data/lib/archimate/data_model/layers.rb +45 -49
  20. data/lib/archimate/data_model/location.rb +6 -6
  21. data/lib/archimate/data_model/metadata.rb +2 -6
  22. data/lib/archimate/data_model/model.rb +50 -62
  23. data/lib/archimate/data_model/modeling_note.rb +3 -8
  24. data/lib/archimate/data_model/organization.rb +18 -27
  25. data/lib/archimate/data_model/property.rb +9 -8
  26. data/lib/archimate/data_model/property_definition.rb +15 -21
  27. data/lib/archimate/data_model/referenceable.rb +14 -9
  28. data/lib/archimate/data_model/referenceable_list.rb +82 -0
  29. data/lib/archimate/data_model/relationship.rb +41 -152
  30. data/lib/archimate/data_model/relationship_references.rb +29 -0
  31. data/lib/archimate/data_model/relationships.rb +214 -0
  32. data/lib/archimate/data_model/schema_info.rb +6 -12
  33. data/lib/archimate/data_model/style.rb +14 -25
  34. data/lib/archimate/data_model/view_node.rb +38 -66
  35. data/lib/archimate/data_model/viewpoint.rb +23 -38
  36. data/lib/archimate/data_model/viewpoint_type.rb +347 -387
  37. data/lib/archimate/data_model.rb +7 -6
  38. data/lib/archimate/derived_relations.rb +106 -31
  39. data/lib/archimate/export/cypher.rb +0 -18
  40. data/lib/archimate/export/jsonl.rb +16 -45
  41. data/lib/archimate/export/n_quads.rb +1 -24
  42. data/lib/archimate/file_formats/archi_file_reader.rb +2 -1
  43. data/lib/archimate/file_formats/model_exchange_file_writer_21.rb +9 -1
  44. data/lib/archimate/file_formats/sax/archi/archi_handler_factory.rb +2 -2
  45. data/lib/archimate/file_formats/sax/archi/connection.rb +2 -1
  46. data/lib/archimate/file_formats/sax/archi/element.rb +7 -5
  47. data/lib/archimate/file_formats/sax/archi/relationship.rb +1 -1
  48. data/lib/archimate/file_formats/sax/model_exchange_file/connection.rb +2 -1
  49. data/lib/archimate/file_formats/sax/model_exchange_file/element.rb +1 -1
  50. data/lib/archimate/file_formats/sax/model_exchange_file/relationship.rb +1 -1
  51. data/lib/archimate/file_formats/sax/model_exchange_file/view_node.rb +0 -1
  52. data/lib/archimate/file_formats/serializer/archi/relationship.rb +1 -1
  53. data/lib/archimate/lint/duplicate_entities.rb +46 -42
  54. data/lib/archimate/svg/archimate.css +12 -2
  55. data/lib/archimate/svg/entity/base_entity.rb +6 -29
  56. data/lib/archimate/svg/entity/location.rb +1 -0
  57. data/lib/archimate/svg/entity_factory.rb +3 -3
  58. data/lib/archimate/svg/point.rb +3 -3
  59. data/lib/archimate/svg/svg_template.svg.erb +5 -5
  60. data/lib/archimate/version.rb +2 -1
  61. metadata +20 -6
  62. data/TODOs.org +0 -505
  63. data/lib/archimate/data_model/differentiable.rb +0 -142
  64. data/lib/archimate/data_model/element_type.rb +0 -89
  65. data/lib/archimate/data_model/relationship_type.rb +0 -45
@@ -10,58 +10,28 @@ module Archimate
10
10
  extend Forwardable
11
11
 
12
12
  def_delegators :@default_text, :strip, :tr, :+, :gsub, :sub, :downcase, :empty?, :split, :size, :include?
13
- # def_delegators :@lang_hash, :size
14
13
 
15
14
  # @!attribute [r] lang_hash
16
- # @return [Hash]
15
+ # @return [Hash]
17
16
  model_attr :lang_hash
18
17
  # @!attribute [r] default_lang
19
- # @return [String, NilClass]
18
+ # @return [String, NilClass]
20
19
  model_attr :default_lang
21
20
  # @!attribute [r] default_text
22
- # @return [String]
21
+ # @return [String]
23
22
  model_attr :default_text
24
23
 
25
- # def self.default_lang
26
- # Archimate::Config.instance.default_lang
27
- # end
28
-
29
24
  def self.string(str, lang = nil)
30
25
  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
26
+ new(str, lang)
57
27
  end
58
28
 
59
29
  # @param [Hash{Symbol => Object},LangString, String] attributes
60
30
  # @raise [Struct::Error] if the given attributes don't conform {#schema}
61
31
  # with given {# # constructor_type}
62
- def initialize(str = nil, lang_hash: {}, default_lang: nil, default_text: nil)
32
+ def initialize(str = nil, lang = nil, lang_hash: {}, default_lang: nil, default_text: nil)
63
33
  @lang_hash = lang_hash
64
- @default_lang = default_lang
34
+ @default_lang = default_lang || lang
65
35
  @default_text = default_text
66
36
  case str
67
37
  when String
@@ -89,6 +59,10 @@ module Archimate
89
59
  end
90
60
  end
91
61
 
62
+ def brief_inspect
63
+ "#{to_s.slice(0, 40).inspect}#{'...' if to_s.size > 40}"
64
+ end
65
+
92
66
  def by_lang(lang)
93
67
  lang_hash.fetch(lang, nil)
94
68
  end
@@ -1,17 +1,18 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  require "ruby-enum"
3
4
 
4
5
  module Archimate
5
6
  module DataModel
6
7
  class Layer
7
- attr_reader :elements
8
8
  attr_reader :name
9
+ attr_reader :background_class
9
10
 
10
11
  # No user serviceable parts here. don't use me.
11
- def initialize(layer = "None", element_names = [])
12
+ def initialize(layer = "None", background_class = "")
12
13
  @symbol = Layer.symbolize(layer)
13
14
  @name = layer
14
- @elements = element_names
15
+ @background_class = background_class
15
16
  end
16
17
 
17
18
  def hash
@@ -44,8 +45,6 @@ module Archimate
44
45
  @name
45
46
  end
46
47
 
47
- private
48
-
49
48
  def self.symbolize(str)
50
49
  return str if str.is_a?(Symbol)
51
50
  str.downcase.tr(" ", "_").to_sym
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  require "ruby-enum"
3
4
 
4
5
  module Archimate
@@ -6,57 +7,52 @@ module Archimate
6
7
  class Layers
7
8
  include Ruby::Enum
8
9
 
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])
10
+ define :Strategy, Layer.new(
11
+ "Strategy",
12
+ "archimate-strategy-background"
13
+ )
14
+
15
+ define :Business, Layer.new(
16
+ "Business",
17
+ "archimate-business-background"
18
+ )
19
+
20
+ define :Application, Layer.new(
21
+ "Application",
22
+ "archimate-application-background"
23
+ )
24
+
25
+ define :Technology, Layer.new(
26
+ "Technology",
27
+ "archimate-infrastructure-background"
28
+ )
29
+
30
+ define :Physical, Layer.new(
31
+ "Physical",
32
+ "archimate-physical-background"
33
+ )
34
+
35
+ define :Motivation, Layer.new(
36
+ "Motivation",
37
+ "archimate-motivation-background"
38
+ )
39
+
40
+ define :Implementation_and_migration, Layer.new(
41
+ "Implementation and Migration",
42
+ "archimate-implementation-background"
43
+ )
44
+
45
+ define :Connectors, Layer.new(
46
+ "Connectors",
47
+ "archimate-connectors-background"
48
+ )
49
+
50
+ define :Other, Layer.new(
51
+ "Other",
52
+ "archimate-other-background"
53
+ )
45
54
 
46
55
  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
56
  end
61
57
  end
62
58
  end
@@ -15,22 +15,22 @@ module Archimate
15
15
  # corner of the diagram to the Top, Left corner of the bounding box of the concept.
16
16
  # @note the XSD has this as a NonNegativeInteger
17
17
  # @!attribute [r] x
18
- # @return [Float]
18
+ # @return [Float]
19
19
  model_attr :x
20
20
  # The y (towards the bottom, associated with height) attribute from the Top,Left (i.e. 0,0)
21
21
  # corner of the diagram to the Top, Left corner of the bounding box of the concept.
22
22
  # @note the XSD has this as a NonNegativeInteger
23
23
  # @!attribute [r] y
24
- # @return [Float]
24
+ # @return [Float]
25
25
  model_attr :y
26
26
 
27
27
  # These are holdovers from the archi file format and are only maintained for compatability
28
28
  # @!attribute [r] end_x
29
- # @return [Int, NilClass]
30
- model_attr :end_x
29
+ # @return [Int, NilClass]
30
+ model_attr :end_x, default: nil
31
31
  # @!attribute [r] end_y
32
- # @return [Int, NilClass]
33
- model_attr :end_y
32
+ # @return [Int, NilClass]
33
+ model_attr :end_y, default: nil
34
34
 
35
35
  def initialize(x:, y:, end_x: nil, end_y: nil)
36
36
  @x = x.to_i
@@ -10,12 +10,8 @@ module Archimate
10
10
  include Comparison
11
11
 
12
12
  # @!attribute [r] schema_infos
13
- # @return [Array<SchemaInfo>]
14
- model_attr :schema_infos
15
-
16
- def initialize(schema_infos: [])
17
- @schema_infos = schema_infos
18
- end
13
+ # @return [Array<SchemaInfo>]
14
+ model_attr :schema_infos, default: []
19
15
  end
20
16
  end
21
17
  end
@@ -10,91 +10,70 @@ module Archimate
10
10
  include Comparison
11
11
 
12
12
  # @!attribute [r] id
13
- # @return [String] unique identifier of this model
13
+ # @return [String] unique identifier of this model
14
14
  model_attr :id
15
15
  # @!attribute [r] name
16
- # @return [LangString] name of the model
16
+ # @return [LangString] name of the model
17
17
  model_attr :name
18
18
 
19
19
  # @!attribute [r] documentation
20
- # @return [PreservedLangString, NilClass] model documentation
21
- model_attr :documentation
20
+ # @return [PreservedLangString, NilClass] model documentation
21
+ model_attr :documentation, default: nil
22
22
  # @!attribute [r] properties
23
- # @return [Array<Property>] model properties
24
- model_attr :properties
23
+ # @return [Array<Property>] model properties
24
+ model_attr :properties, default: []
25
25
  # @!attribute [r] metadata
26
- # @return [Metadata, NilClass] model metadata
27
- model_attr :metadata
26
+ # @return [Metadata, NilClass] model metadata
27
+ model_attr :metadata, default: nil
28
28
  # @!attribute [r] elements
29
- # @return [Array<Element>]
30
- model_attr :elements
29
+ # @return [Array<Element>]
30
+ model_attr :elements, default: [], referenceable_list: true
31
31
  # @!attribute [r] relationships
32
- # @return [Array<Relationship>]
33
- model_attr :relationships
32
+ # @return [Array<Relationship>]
33
+ model_attr :relationships, default: [], referenceable_list: true
34
34
  # @!attribute [r] organizations
35
- # @return [Array<Organization>]
36
- model_attr :organizations
35
+ # @return [Array<Organization>]
36
+ model_attr :organizations, default: [], referenceable_list: true
37
37
  # @!attribute [r] property_definitions
38
- # @return [Array<PropertyDefinition>]
39
- model_attr :property_definitions
38
+ # @return [Array<PropertyDefinition>]
39
+ model_attr :property_definitions, default: [], referenceable_list: true
40
40
  # @!attribute [r] version
41
- # @return [String, NilClass]
42
- model_attr :version
41
+ # @return [String, NilClass]
42
+ model_attr :version, default: nil
43
43
  # @!attribute [r] diagrams
44
- # @return [Array<Diagram>]
45
- model_attr :diagrams
44
+ # @return [Array<Diagram>]
45
+ model_attr :diagrams, default: [], referenceable_list: true
46
46
  # @!attribute [r] viewpoints
47
- # @return [Array<Viewpoint>]
48
- model_attr :viewpoints
47
+ # @return [Array<Viewpoint>]
48
+ model_attr :viewpoints, default: [], referenceable_list: true
49
49
 
50
50
  # Following attributes are to hold info on where the model came from
51
51
  # @!attribute [r] filename
52
- # @return [String]
53
- model_attr :filename
52
+ # @return [String]
53
+ model_attr :filename, default: nil
54
54
  # @see Archimate::SUPPORTED_FORMATS
55
55
  # @!attribute [r] file_format
56
- # @return [Symbol, NilClass] supported Archimate format [Archimate::SUPPORTED_FORMATS] or +nil+
57
- model_attr :file_format
56
+ # @return [Symbol, NilClass] supported Archimate format [Archimate::SUPPORTED_FORMATS] or +nil+
57
+ model_attr :file_format, default: nil
58
58
  # @!attribute [r] archimate_version
59
- # @return [Symbol] one of [Archimate::ARCHIMATE_VERSIONS], default +:archimate_3_0+
60
- model_attr :archimate_version
59
+ # @return [Symbol] one of [Archimate::ARCHIMATE_VERSIONS], default +:archimate_3_0+
60
+ model_attr :archimate_version, default: :archimate_3_0
61
61
 
62
62
  # @!attribute [r] namespaces
63
- # @return [Hash]
64
- model_attr :namespaces
63
+ # @return [Hash]
64
+ model_attr :namespaces, default: {}
65
65
  # @!attribute [r] schema_locations
66
- # @return [Array<String>]
67
- model_attr :schema_locations
66
+ # @return [Array<String>]
67
+ model_attr :schema_locations, default: []
68
68
 
69
- # # @return [Array<AnyElement>]
70
- # model_attr :other_elements
71
- # # @return [Array<AnyAttribute>]
72
- # model_attr :other_attributes
69
+ # @return [Array<AnyElement>]
70
+ model_attr :other_elements, default: []
71
+ # @return [Array<AnyAttribute>]
72
+ model_attr :other_attributes, default: []
73
73
 
74
74
  # Constructor
75
- def initialize(id:, name:, documentation: nil, properties: [],
76
- metadata: nil, elements: [], relationships: [],
77
- organizations: [], property_definitions: [],
78
- version: nil, diagrams: [], viewpoints: [],
79
- filename: nil, file_format: nil, archimate_version: :archimate_3_0,
80
- namespaces: {}, schema_locations: [])
81
- @id = id
82
- @name = name
83
- @documentation = documentation
84
- @properties = properties
85
- @metadata = metadata
86
- @elements = elements
87
- @relationships = relationships
88
- @organizations = organizations
89
- @property_definitions = property_definitions
90
- @version = version
91
- @diagrams = diagrams
92
- @viewpoints = viewpoints
93
- @filename = filename
94
- @file_format = file_format
95
- @archimate_version = archimate_version
96
- @namespaces = namespaces
97
- @schema_locations = schema_locations
75
+ def initialize(opts = {})
76
+ super
98
77
  rebuild_index
99
78
  end
100
79
 
@@ -131,7 +110,7 @@ module Archimate
131
110
  .concat(diagrams).each do |item|
132
111
  if find_in_organizations(item).nil?
133
112
  default_organization = default_organization_for(item)
134
- default_organization.items.push(item.id) unless default_organization.items.include?(item.id)
113
+ default_organization.items.push(item) unless default_organization.items.include?(item)
135
114
  end
136
115
  end
137
116
  self
@@ -181,7 +160,14 @@ module Archimate
181
160
  # Only used by [#find_default_organization]
182
161
  def add_organization(type, name)
183
162
  raise "Program Error: #{organizations.inspect}" unless organizations.none? { |f| f.type == type || f.name == name }
184
- organization = Organization.new(id: make_unique_id, name: LangString.create(name), type: type, items: [], organizations: [], documentation: nil)
163
+ organization = Organization.new(
164
+ id: make_unique_id,
165
+ name: LangString.new(name),
166
+ type: type,
167
+ items: [],
168
+ organizations: [],
169
+ documentation: nil
170
+ )
185
171
  register(organization, organizations)
186
172
  organizations.push(organization)
187
173
  organization
@@ -217,6 +203,8 @@ module Archimate
217
203
  find_default_organization("implementation_migration", "Implementation & Migration")
218
204
  when Layers::Connectors
219
205
  find_default_organization("connectors", "Connectors")
206
+ when Layers::Other
207
+ find_default_organization("other", "Other")
220
208
  else
221
209
  raise StandardError, "Unexpected Element Layer: #{item.layer} for item type #{item.type}"
222
210
  end
@@ -242,7 +230,7 @@ module Archimate
242
230
  end
243
231
 
244
232
  def find_in_organizations(item, _fs = nil)
245
- find_by_class(DataModel::Organization).select { |f| f.items.include?(item.id) }.first
233
+ find_by_class(DataModel::Organization).select { |f| f.items.include?(item) }.first
246
234
  end
247
235
 
248
236
  # Only used by [#unreferenced_nodes]
@@ -8,17 +8,12 @@ module Archimate
8
8
  include Comparison
9
9
 
10
10
  # @!attribute [r] documentation
11
- # @return [PreservedLangString]
11
+ # @return [PreservedLangString]
12
12
  model_attr :documentation
13
13
  # `type` attribute expresses a type for the notes, e.g. OCL for OCL rules.
14
14
  # @!attribute [r] type
15
- # @return [String, NilClass]
16
- model_attr :type
17
-
18
- def initialize(documentation:, type: nil)
19
- @documentation = documentation
20
- @type = type
21
- end
15
+ # @return [String, NilClass]
16
+ model_attr :type, default: nil
22
17
  end
23
18
  end
24
19
  end
@@ -14,44 +14,35 @@ module Archimate
14
14
  # @note that Organization must fit into a tree structure (so strictly nested).
15
15
  class Organization
16
16
  include Comparison
17
+ include Referenceable
17
18
 
18
19
  # Format should match +/[[[:alpha:]]_][w-.]*/+ to be valid for Archimate
19
20
  # Model exchange format
20
21
  # @!attribute [r] id
21
- # @return [String, NilClass]
22
- model_attr :id
22
+ # @return [String, NilClass]
23
+ model_attr :id, default: nil
23
24
  # LabelGroup in the XSD
24
25
  # @!attribute [r] name
25
- # @return [LangString, NilClass]
26
- model_attr :name
26
+ # @return [LangString, NilClass]
27
+ model_attr :name, default: nil
27
28
  # I believe this is used only for Archi formats
28
29
  # @!attribute [r] type
29
- # @return [String, NilClass]
30
- model_attr :type
30
+ # @return [String, NilClass]
31
+ model_attr :type, default: nil
31
32
  # @!attribute [r] documentation
32
- # @return [PreservedLangString, NilClass]
33
- model_attr :documentation
33
+ # @return [PreservedLangString, NilClass]
34
+ model_attr :documentation, default: nil
34
35
  # @!attribute [rw] items
35
- # @return [Array<Object>]
36
- model_attr :items, writable: true
36
+ # @return [Array<Object>]
37
+ model_attr :items, writable: true, default: [], referenceable_list: true
37
38
  # item in the XSD
38
39
  # @!attribute [rw] organizations
39
- # @return [Array<Organization>]
40
- model_attr :organizations, writable: true
41
- # # @return [Array<AnyElement>]
42
- # model_attr :other_elements
43
- # # @return [Array<AnyAttribute>]
44
- # model_attr :other_attributes
45
-
46
- def initialize(id: nil, name: nil, type: nil, documentation: nil,
47
- items: [], organizations: [])
48
- @id = id
49
- @name = name
50
- @type = type
51
- @documentation = documentation
52
- @items = items
53
- @organizations = organizations
54
- end
40
+ # @return [Array<Organization>]
41
+ model_attr :organizations, writable: true, default: [], referenceable_list: true
42
+ # @return [Array<AnyElement>]
43
+ model_attr :other_elements, default: []
44
+ # @return [Array<AnyAttribute>]
45
+ model_attr :other_attributes, default: []
55
46
 
56
47
  def to_s
57
48
  "#{Archimate::Color.data_model('Organization')}<#{id}>[#{Archimate::Color.color(name, %i[white underline])}]"
@@ -59,7 +50,7 @@ module Archimate
59
50
 
60
51
  def referenced_identified_nodes
61
52
  organizations.reduce(items) do |a, e|
62
- a.concat(e.referenced_identified_nodes)
53
+ a.to_ary + e.referenced_identified_nodes
63
54
  end
64
55
  end
65
56
 
@@ -8,17 +8,12 @@ module Archimate
8
8
  include Comparison
9
9
 
10
10
  # @!attribute [r] value
11
- # @return [LangString, NilClass] value of the property, default +nil+
12
- model_attr :value
11
+ # @return [LangString, NilClass] value of the property, default +nil+
12
+ model_attr :value, default: nil
13
13
  # @!attribute [rw] property_definition
14
- # @return [PropertyDefinition] property definition of the property
14
+ # @return [PropertyDefinition] property definition of the property
15
15
  model_attr :property_definition, writable: true
16
16
 
17
- def initialize(property_definition:, value: nil)
18
- @property_definition = property_definition
19
- @value = value
20
- end
21
-
22
17
  def to_s
23
18
  "Property(key: #{property_definition.name}, value: #{value || 'no value'})"
24
19
  end
@@ -26,6 +21,12 @@ module Archimate
26
21
  def key
27
22
  property_definition.name
28
23
  end
24
+
25
+ def brief_inspect
26
+ cls_name = self.class.name.split('::').last
27
+ val = "#{value.to_s.slice(0, 40).inspect}#{'...' if value.to_s.size > 40}"
28
+ "#<#{cls_name} #{key} = #{val}>"
29
+ end
29
30
  end
30
31
  end
31
32
  end
@@ -9,38 +9,32 @@ module Archimate
9
9
  # A Property definition type containing its unique identifier, name, and data type.
10
10
  class PropertyDefinition
11
11
  include Comparison
12
+ include Referenceable
12
13
 
13
14
  # @!attribute [r] id
14
- # @return [String]
15
+ # @return [String]
15
16
  model_attr :id
16
17
  # @!attribute [r] name
17
- # @return [LangString]
18
+ # @return [LangString]
18
19
  model_attr :name
19
20
  # @!attribute [r] documentation
20
- # @return [PreservedLangString, NilClass]
21
- model_attr :documentation
22
- # # @!attribute [r] other_elements
23
- # @return [Array<AnyElement>]
24
- model_attr :other_elements
25
- # # @!attribute [r] other_attributes
26
- # @return [Array<AnyAttribute>]
27
- model_attr :other_attributes
21
+ # @return [PreservedLangString, NilClass]
22
+ model_attr :documentation, default: nil
23
+ # @!attribute [r] other_elements
24
+ # @return [Array<AnyElement>]
25
+ model_attr :other_elements, default: []
26
+ # @!attribute [r] other_attributes
27
+ # @return [Array<AnyAttribute>]
28
+ model_attr :other_attributes, default: []
28
29
  # @!attribute [r] type
29
- # @note if +type+ is nil, then type "string" is assumed
30
- # @see Archimate::DataModel::PROPERTY_DEFINITION_TYPES
31
- # @return [String, NilClass]
32
- model_attr :type
30
+ # @note if +type+ is nil, then type "string" is assumed
31
+ # @see Archimate::DataModel::PROPERTY_DEFINITION_TYPES
32
+ # @return [String, NilClass]
33
+ model_attr :type, default: nil
33
34
 
34
35
  def self.identifier_for_key(key)
35
36
  (self.class.hash ^ key.hash).to_s(16)
36
37
  end
37
-
38
- def initialize(id:, name:, documentation: nil, type: nil)
39
- @id = id
40
- @name = name
41
- @documentation = documentation
42
- @type = type
43
- end
44
38
  end
45
39
  end
46
40
  end
@@ -2,18 +2,23 @@
2
2
 
3
3
  module Archimate
4
4
  module DataModel
5
- # Something that can be referenced in the model.
6
- class Referenceable < ArchimateNode
7
- private
5
+ # Something that can be referenced by another entity.
6
+ module Referenceable
7
+ def add_reference(referencer)
8
+ references << referencer unless references.include?(referencer)
9
+ end
10
+
11
+ def remove_reference(referencer)
12
+ references.delete(referencer)
13
+ end
8
14
 
9
- def find_my_index
10
- id
15
+ def references
16
+ @referenceable_set ||= []
11
17
  end
12
18
 
13
- # name isn't merged
14
- def merge(node)
15
- documentation.concat(node.documentation)
16
- properties.concat(node.properties)
19
+ # Diagrams that this entity is referenced in.
20
+ def diagrams
21
+ references.select { |ref| ref.is_a?(Diagram) }
17
22
  end
18
23
  end
19
24
  end