archimate 2.0.1 → 2.0.2

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 (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
@@ -0,0 +1,82 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "forwardable"
4
+
5
+ module Archimate
6
+ module DataModel
7
+ # A list of things that can be referenced by another entity.
8
+ class ReferenceableList
9
+ extend Forwardable
10
+
11
+ def_delegators :@list,
12
+ :[],
13
+ :all?,
14
+ :dig,
15
+ :each_with_object,
16
+ :find,
17
+ :hash,
18
+ :include?,
19
+ :map,
20
+ :none?,
21
+ :select,
22
+ :==,
23
+ :each,
24
+ :empty?,
25
+ :first,
26
+ :reduce,
27
+ :size
28
+
29
+ attr_reader :parent
30
+
31
+ def initialize(parent, contents = [], parent_attr_references = [])
32
+ @parent = parent
33
+ @parent_attr_references = parent_attr_references
34
+ @list = contents || []
35
+ add_references
36
+ end
37
+
38
+ def replace_with(contents)
39
+ remove_references
40
+ @list = contents
41
+ add_references
42
+ end
43
+
44
+ def to_ary
45
+ Array.new(@list).freeze
46
+ end
47
+
48
+ def push(item)
49
+ return if @list.include?(item)
50
+ add_item_references(item)
51
+ @list << item
52
+ end
53
+
54
+ def inspect
55
+ vals = @list.first(3).map(&:brief_inspect)
56
+ "[#{vals.join(', ')}#{"...#{@list.size}" if @list.size > 3}]"
57
+ end
58
+
59
+ private
60
+
61
+ def add_references
62
+ @list.each { |item| add_item_references(item) }
63
+ end
64
+
65
+ def add_item_references(item)
66
+ item.add_reference(parent)
67
+ @parent_attr_references.each do |attr|
68
+ item.add_reference(parent.send(attr)) if parent.send(attr)
69
+ end
70
+ end
71
+
72
+ 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
78
+ end
79
+ end
80
+ end
81
+ end
82
+ end
@@ -3,90 +3,70 @@
3
3
  module Archimate
4
4
  module DataModel
5
5
  ACCESS_TYPE = %w[Access Read Write ReadWrite].freeze
6
- AccessTypeEnum = String #String.enum(*ACCESS_TYPE)
6
+ AccessTypeEnum = String # String.enum(*ACCESS_TYPE)
7
7
 
8
8
  # A base relationship type that can be extended by concrete ArchiMate types.
9
9
  #
10
- # Note that RelationshipType is abstract, so one must have derived types of this type. this is indicated in xml
11
- # by having a tag name of "relationship" and an attribute of xsi:type="AccessRelationship" where AccessRelationship is
12
- # a derived type from RelationshipType.
10
+ # Note that RelationshipType is abstract, so one must have derived types of
11
+ # this type. this is indicated in xml by having a tag name of "relationship"
12
+ # and an attribute of xsi:type="AccessRelationship" where AccessRelationship
13
+ # is a derived type from RelationshipType.
13
14
  class Relationship
14
- # @todo: this should be removed once concrete Relationships are used.
15
- # @deprecated
16
- WEIGHTS = {
17
- 'GroupingRelationship' => 0,
18
- 'JunctionRelationship' => 0,
19
- 'AssociationRelationship' => 0,
20
- 'SpecialisationRelationship' => 1,
21
- 'FlowRelationship' => 2,
22
- 'TriggeringRelationship' => 3,
23
- 'InfluenceRelationship' => 4,
24
- 'AccessRelationship' => 5,
25
- 'ServingRelationship' => 6,
26
- 'UsedByRelationship' => 6,
27
- 'RealizationRelationship' => 7,
28
- 'RealisationRelationship' => 7,
29
- 'AssignmentRelationship' => 8,
30
- 'AggregationRelationship' => 9,
31
- 'CompositionRelationship' => 10
32
- }
33
-
34
15
  include Comparison
16
+ include Referenceable
35
17
 
36
18
  # @!attribute [r] id
37
- # @return [String]
19
+ # @return [String]
38
20
  model_attr :id
39
21
  # @!attribute [r] name
40
- # @return [LangString, NilClass]
41
- model_attr :name
22
+ # @return [LangString, NilClass]
23
+ model_attr :name, default: nil
42
24
  # @!attribute [r] documentation
43
- # @return [PreservedLangString, NilClass]
44
- model_attr :documentation
45
- # # @return [Array<AnyElement>]
25
+ # @return [PreservedLangString, NilClass]
26
+ model_attr :documentation, default: nil
27
+ # @return [Array<AnyElement>]
46
28
  # model_attr :other_elements
47
- # # @return [Array<AnyAttribute>]
29
+ # @return [Array<AnyAttribute>]
48
30
  # model_attr :other_attributes
49
- # @note type here was used for the Element/Relationship/Diagram type
50
- # @!attribute [r] type
51
- # @return [String, NilClass]
52
- model_attr :type
53
31
  # @!attribute [r] properties
54
- # @return [Array<Property>]
55
- model_attr :properties
32
+ # @return [Array<Property>]
33
+ model_attr :properties, default: []
56
34
  # @todo is this optional?
57
35
  # @!attribute [rw] source
58
- # @return [Element, Relationship]
59
- model_attr :source, comparison_attr: :id, writable: true
36
+ # @return [Element, Relationship]
37
+ model_attr :source, comparison_attr: :id, writable: true, default: nil
60
38
  # @todo is this optional?
61
39
  # @!attribute [rw] target
62
- # @return [Element, Relationship]
63
- model_attr :target, comparison_attr: :id, writable: true
40
+ # @return [Element, Relationship]
41
+ model_attr :target, comparison_attr: :id, writable: true, default: nil
64
42
  # @!attribute [r] access_type
65
- # @return [AccessTypeEnum, NilClass]
66
- model_attr :access_type
43
+ # @return [AccessTypeEnum, NilClass]
44
+ model_attr :access_type, default: nil
67
45
  # @!attribute [r] derived
68
- # @return [Boolean] this is a derived relation if true
69
- model_attr :derived
70
-
71
- def initialize(id:, name: nil, documentation: nil, type: nil,
72
- properties: [], source:, target:, access_type: nil,
73
- derived: false)
74
- @id = id
75
- @name = name
76
- @documentation = documentation
77
- @type = type
78
- @properties = properties
79
- @source = source
80
- @target = target
81
- @access_type = access_type
82
- @derived = derived
83
- end
46
+ # @return [Boolean] this is a derived relation if true
47
+ model_attr :derived, default: false
84
48
 
85
49
  def replace(entity, with_entity)
86
50
  @source = with_entity.id if source == entity.id
87
51
  @target = with_entity.id if target == entity.id
88
52
  end
89
53
 
54
+ def type
55
+ self.class.name.split("::").last
56
+ end
57
+
58
+ def weight
59
+ self.class::WEIGHT
60
+ end
61
+
62
+ def classification
63
+ self.class::CLASSIFICATION
64
+ end
65
+
66
+ def verb
67
+ self.class::VERB
68
+ end
69
+
90
70
  def to_s
91
71
  Archimate::Color.color(
92
72
  "#{Archimate::Color.data_model(type)}<#{id}>[#{Archimate::Color.color(name&.strip || '', %i[black underline])}]",
@@ -97,7 +77,7 @@ module Archimate
97
77
  def description
98
78
  [
99
79
  name.nil? ? nil : "#{name}:",
100
- RELATION_VERBS.fetch(type, nil)
80
+ verb
101
81
  ].compact.join(" ")
102
82
  end
103
83
 
@@ -107,13 +87,6 @@ module Archimate
107
87
  [@source, @target].compact
108
88
  end
109
89
 
110
- # Diagrams that this element is referenced in.
111
- def diagrams
112
- @diagrams ||= in_model.diagrams.select do |diagram|
113
- diagram.relationship_ids.include?(id)
114
- end
115
- end
116
-
117
90
  # Copy any attributes/docs, etc. from each of the others into the original.
118
91
  # 1. Child `label`s with different `xml:lang` attribute values
119
92
  # 2. Child `documentation` (and different `xml:lang` attribute values)
@@ -122,92 +95,8 @@ module Archimate
122
95
  # source and target don't change on a merge
123
96
  def merge(relationship)
124
97
  super
125
- access_type ||= relationship.access_type
98
+ @access_type ||= relationship.access_type
126
99
  end
127
-
128
- def weight
129
- WEIGHTS.fetch(type, 0)
130
- end
131
- end
132
-
133
- # Relationship Classifications: Structural, Dynamic, Dependency, Other
134
- # • No relationships are allowed between two relationships
135
- # • All relationships connected with relationship connectors must be of
136
- # the same type
137
- # • A chain of relationships of the same type that connects two elements,
138
- # and is in turn connected via relationship connectors, is valid only if
139
- # a direct relationship of that same type between those two elements is
140
- # valid
141
- # • A relationship connecting an element with a second relationship can
142
- # only be an aggregation, composition, or association; aggregation or
143
- # composition are valid only from a composite element to that second
144
- # relationship
145
- #
146
- # Aggregation, composition, and specialization relationships are always
147
- # permitted between two elements of the same type, and association is
148
- # always allowed between any two elements, and between any element and
149
- # relationship.
150
-
151
- class Composition < Relationship
152
- CLASSIFICATION = :structural
153
- WEIGHT = 10
154
- end
155
-
156
- class Aggregation < Relationship
157
- CLASSIFICATION = :structural
158
- WEIGHT = 9
159
- end
160
-
161
- class Assignment < Relationship
162
- CLASSIFICATION = :structural
163
- WEIGHT = 8
164
- end
165
-
166
- class Realization < Relationship
167
- CLASSIFICATION = :structural
168
- WEIGHT = 7
169
- end
170
-
171
- class Serving < Relationship
172
- CLASSIFICATION = :dependency
173
- WEIGHT = 6
174
- end
175
-
176
- class Access < Relationship
177
- CLASSIFICATION = :dependency
178
- WEIGHT = 5
179
- end
180
-
181
- class Influence < Relationship
182
- CLASSIFICATION = :dependency
183
- WEIGHT = 4
184
- end
185
-
186
- class Triggering < Relationship
187
- CLASSIFICATION = :dynamic
188
- WEIGHT = 3
189
- end
190
-
191
- class Flow < Relationship
192
- CLASSIFICATION = :dynamic
193
- WEIGHT = 2
194
- end
195
-
196
- class Specialization < Relationship
197
- CLASSIFICATION = :other
198
- WEIGHT = 1
199
- end
200
-
201
- class Association < Relationship
202
- CLASSIFICATION = :other
203
- WEIGHT = 0
204
- end
205
-
206
- # Junction is a relationship connector
207
- # • All relationships connected with relationship connectors must be of the same type
208
- class Junction < Relationship
209
- CLASSIFICATION = :other
210
- WEIGHT = 0
211
100
  end
212
101
  end
213
102
  end
@@ -0,0 +1,29 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Archimate
4
+ module DataModel
5
+ # RelationshipReferences provides a means to allow a class that is referenced
6
+ # by Relationship objects to get the set of:
7
+ # * All relationships
8
+ # * All relationships by:
9
+ # - a particular type
10
+ # - if this object is the source of target of the relationship
11
+ module RelationshipReferences
12
+ def relationships
13
+ references.select { |ref| ref.is_a?(DataModel::Relationship) }
14
+ end
15
+
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 }
20
+ end
21
+
22
+ define_method(rel_cls::OBJECT_VERB.tr(' ', '_').to_sym) do
23
+ references.select { |ref| ref.is_a?(rel_cls) && ref.target == self }
24
+ end
25
+ end
26
+ end
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,214 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Archimate
4
+ module DataModel
5
+ # Relationship Classifications: Structural, Dynamic, Dependency, Other
6
+ # * No relationships are allowed between two relationships
7
+ # * All relationships connected with relationship connectors must be of
8
+ # the same type
9
+ # * A chain of relationships of the same type that connects two elements,
10
+ # and is in turn connected via relationship connectors, is valid only if
11
+ # a direct relationship of that same type between those two elements is
12
+ # valid
13
+ # * A relationship connecting an element with a second relationship can
14
+ # only be an aggregation, composition, or association; aggregation or
15
+ # composition are valid only from a composite element to that second
16
+ # relationship
17
+ #
18
+ # Aggregation, composition, and specialization relationships are always
19
+ # permitted between two elements of the same type, and association is
20
+ # always allowed between any two elements, and between any element and
21
+ # relationship.
22
+ module Relationships
23
+ class Composition < Relationship
24
+ WEIGHT = 10
25
+ CLASSIFICATION = :structural
26
+ VERB = "composes"
27
+ OBJECT_VERB = "composed by"
28
+
29
+ def initialize(args)
30
+ super
31
+ end
32
+ end
33
+
34
+ class Aggregation < Relationship
35
+ WEIGHT = 9
36
+ CLASSIFICATION = :structural
37
+ VERB = "aggregates"
38
+ OBJECT_VERB = "aggregated by"
39
+
40
+ def initialize(args)
41
+ super
42
+ end
43
+ end
44
+
45
+ class Assignment < Relationship
46
+ WEIGHT = 8
47
+ CLASSIFICATION = :structural
48
+ VERB = "assigned to"
49
+ OBJECT_VERB = "assigned from"
50
+
51
+ def initialize(args)
52
+ super
53
+ end
54
+ end
55
+
56
+ class Realization < Relationship
57
+ WEIGHT = 7
58
+ CLASSIFICATION = :structural
59
+ VERB = "realizes"
60
+ OBJECT_VERB = "realized by"
61
+
62
+ def initialize(args)
63
+ super
64
+ end
65
+ end
66
+
67
+ class Serving < Relationship
68
+ WEIGHT = 6
69
+ CLASSIFICATION = :dependency
70
+ VERB = "serves"
71
+ OBJECT_VERB = "served by"
72
+
73
+ def initialize(args)
74
+ super
75
+ end
76
+ end
77
+
78
+ class Access < Relationship
79
+ WEIGHT = 5
80
+ CLASSIFICATION = :dependency
81
+ VERB = "accesses"
82
+ OBJECT_VERB = "accessed by"
83
+
84
+ def initialize(args)
85
+ super
86
+ end
87
+ end
88
+
89
+ class Influence < Relationship
90
+ WEIGHT = 4
91
+ CLASSIFICATION = :dependency
92
+ VERB = "influences"
93
+ OBJECT_VERB = "influenced by"
94
+
95
+ def initialize(args)
96
+ super
97
+ end
98
+ end
99
+
100
+ class Triggering < Relationship
101
+ WEIGHT = 3
102
+ CLASSIFICATION = :dynamic
103
+ VERB = "triggers"
104
+ OBJECT_VERB = "triggered by"
105
+
106
+ def initialize(args)
107
+ super
108
+ end
109
+ end
110
+
111
+ class Flow < Relationship
112
+ WEIGHT = 2
113
+ CLASSIFICATION = :dynamic
114
+ VERB = "flows to"
115
+ OBJECT_VERB = "flows from"
116
+
117
+ def initialize(args)
118
+ super
119
+ end
120
+ end
121
+
122
+ class Specialization < Relationship
123
+ WEIGHT = 1
124
+ CLASSIFICATION = :other
125
+ VERB = "specializes"
126
+ OBJECT_VERB = "specialized by"
127
+
128
+ def initialize(args)
129
+ super
130
+ end
131
+ end
132
+
133
+ class Association < Relationship
134
+ WEIGHT = 0
135
+ CLASSIFICATION = :other
136
+ VERB = "associated with"
137
+ OBJECT_VERB = "associated from"
138
+
139
+ def initialize(args)
140
+ super
141
+ end
142
+ end
143
+
144
+ # Junction is a relationship connector
145
+ # * All relationships connected with relationship connectors must be of the same type
146
+ class Junction < Relationship
147
+ WEIGHT = 0
148
+ CLASSIFICATION = :other
149
+ VERB = "junction to"
150
+ OBJECT_VERB = "junction from"
151
+
152
+ def initialize(args)
153
+ super
154
+ end
155
+ end
156
+
157
+ # Junction is a relationship connector
158
+ # * All relationships connected with relationship connectors must be of the same type
159
+ class AndJunction < Relationship
160
+ WEIGHT = 0
161
+ CLASSIFICATION = :other
162
+ VERB = "and junction to"
163
+ OBJECT_VERB = "and junction from"
164
+
165
+ def initialize(args)
166
+ super
167
+ end
168
+ end
169
+
170
+ # Junction is a relationship connector
171
+ # * All relationships connected with relationship connectors must be of the same type
172
+ class OrJunction < Relationship
173
+ WEIGHT = 0
174
+ CLASSIFICATION = :other
175
+ VERB = "or junction to"
176
+ OBJECT_VERB = "or junction from"
177
+
178
+ def initialize(args)
179
+ super
180
+ end
181
+ end
182
+
183
+ def self.create(*args)
184
+ # type = args[0].delete(:type)
185
+ # cls_name = type.strip.sub(/Relationship$/, '')
186
+ # cls_name = RELATIONSHIP_SUBSTITUTIONS.fetch(cls_name, cls_name)
187
+ cls_name = str_filter(args[0].delete(:type))
188
+ Relationships.const_get(cls_name).new(*args)
189
+ rescue NameError => err
190
+ Archimate::Logging.error "An invalid relationship type '#{cls_name}' was used to create a Relationship"
191
+ raise err
192
+ end
193
+
194
+ def self.===(other)
195
+ constants.map(&:to_s).include?(str_filter(other))
196
+ end
197
+
198
+ def self.str_filter(str)
199
+ relationship_substitutions = {
200
+ "Realisation" => "Realization",
201
+ "Specialisation" => "Specialization",
202
+ "UsedBy" => "Serving"
203
+ }.freeze
204
+
205
+ cls_name = str.strip.sub(/Relationship$/, '')
206
+ relationship_substitutions.fetch(cls_name, cls_name)
207
+ end
208
+
209
+ def self.classes
210
+ constants.map { |cls_name| const_get(cls_name) }
211
+ end
212
+ end
213
+ end
214
+ end
@@ -6,20 +6,14 @@ module Archimate
6
6
  include Comparison
7
7
 
8
8
  # @!attribute [r] schema
9
- # @return [String, NilClass]
10
- model_attr :schema
9
+ # @return [String, NilClass]
10
+ model_attr :schema, default: nil
11
11
  # @!attribute [r] schemaversion
12
- # @return [String, NilClass]
13
- model_attr :schemaversion
12
+ # @return [String, NilClass]
13
+ model_attr :schemaversion, default: nil
14
14
  # @!attribute [r] elements
15
- # @return [Array<AnyElement>]
16
- model_attr :elements
17
-
18
- def initialize(schema: nil, schemaversion: nil, elements: [])
19
- @schema = schema
20
- @schemaversion = schemaversion
21
- @elements = elements
22
- end
15
+ # @return [Array<AnyElement>]
16
+ model_attr :elements, default: []
23
17
 
24
18
  def to_s
25
19
  "#{type.light_black}[#{schema} #{schemaversion}]"
@@ -7,39 +7,28 @@ module Archimate
7
7
 
8
8
  # @todo make this an enum
9
9
  # @!attribute [r] text_alignment
10
- # @return [Int, NilClass]
11
- model_attr :text_alignment
10
+ # @return [Int, NilClass]
11
+ model_attr :text_alignment, default: nil
12
12
  # @!attribute [r] fill_color
13
- # @return [Color, NilClass]
14
- model_attr :fill_color
13
+ # @return [Color, NilClass]
14
+ model_attr :fill_color, default: nil
15
15
  # @!attribute [r] line_color
16
- # @return [Color, NilClass]
17
- model_attr :line_color
16
+ # @return [Color, NilClass]
17
+ model_attr :line_color, default: nil
18
18
  # @todo move this to font
19
19
  # @!attribute [r] font_color
20
- # @return [Color, NilClass]
21
- model_attr :font_color
20
+ # @return [Color, NilClass]
21
+ model_attr :font_color, default: nil
22
22
  # @!attribute [r] line_width
23
- # @return [Int, NilClass]
24
- model_attr :line_width
23
+ # @return [Int, NilClass]
24
+ model_attr :line_width, default: nil
25
25
  # @!attribute [r] font
26
- # @return [Font, NilClass]
27
- model_attr :font
26
+ # @return [Font, NilClass]
27
+ model_attr :font, default: nil
28
28
  # @todo make this an enum
29
29
  # @!attribute [r] text_position
30
- # @return [Int, NilClass]
31
- model_attr :text_position
32
-
33
- def initialize(text_alignment: nil, fill_color: nil, line_color: nil,
34
- font_color: nil, line_width: nil, font: nil, text_position: nil)
35
- @text_alignment = text_alignment
36
- @fill_color = fill_color
37
- @line_color = line_color
38
- @font_color = font_color
39
- @line_width = line_width
40
- @font = font
41
- @text_position = text_position
42
- end
30
+ # @return [Int, NilClass]
31
+ model_attr :text_position, default: nil
43
32
 
44
33
  def to_s
45
34
  attr_name_vals = %i[text_alignment fill_color line_color font_color line_width