xmi 0.5.3 → 0.5.5

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 (101) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop_todo.yml +31 -45
  3. data/README.adoc +0 -15
  4. data/lib/xmi/custom_profile/abstract.rb +16 -0
  5. data/lib/xmi/custom_profile/basic_doc.rb +16 -0
  6. data/lib/xmi/custom_profile/bibliography.rb +16 -0
  7. data/lib/xmi/custom_profile/edition.rb +18 -0
  8. data/lib/xmi/custom_profile/enumeration.rb +16 -0
  9. data/lib/xmi/custom_profile/informative.rb +16 -0
  10. data/lib/xmi/custom_profile/invariant.rb +16 -0
  11. data/lib/xmi/custom_profile/number.rb +18 -0
  12. data/lib/xmi/custom_profile/ocl.rb +16 -0
  13. data/lib/xmi/custom_profile/persistence.rb +20 -0
  14. data/lib/xmi/custom_profile/publication_date.rb +18 -0
  15. data/lib/xmi/custom_profile/year_version.rb +18 -0
  16. data/lib/xmi/custom_profile.rb +12 -143
  17. data/lib/xmi/ea_root/code_generation.rb +141 -0
  18. data/lib/xmi/ea_root/extension_lifecycle.rb +52 -0
  19. data/lib/xmi/ea_root/namespace_handling.rb +39 -0
  20. data/lib/xmi/ea_root/xml_parsing.rb +51 -0
  21. data/lib/xmi/ea_root.rb +16 -403
  22. data/lib/xmi/extension.rb +4 -12
  23. data/lib/xmi/parser_pipeline.rb +70 -0
  24. data/lib/xmi/root.rb +3 -12
  25. data/lib/xmi/sparx/connector/appearance.rb +27 -0
  26. data/lib/xmi/sparx/connector/connector.rb +52 -0
  27. data/lib/xmi/sparx/connector/end_base.rb +56 -0
  28. data/lib/xmi/sparx/connector/end_constraint.rb +33 -0
  29. data/lib/xmi/sparx/connector/end_modifiers.rb +19 -0
  30. data/lib/xmi/sparx/connector/end_role.rb +21 -0
  31. data/lib/xmi/sparx/connector/end_style.rb +17 -0
  32. data/lib/xmi/sparx/connector/end_type.rb +21 -0
  33. data/lib/xmi/sparx/connector/labels.rb +27 -0
  34. data/lib/xmi/sparx/connector/model.rb +19 -0
  35. data/lib/xmi/sparx/connector/properties.rb +19 -0
  36. data/lib/xmi/sparx/connector.rb +15 -233
  37. data/lib/xmi/sparx/element/association.rb +58 -0
  38. data/lib/xmi/sparx/element/attribute.rb +58 -0
  39. data/lib/xmi/sparx/element/bounds.rb +19 -0
  40. data/lib/xmi/sparx/element/code.rb +19 -0
  41. data/lib/xmi/sparx/element/containment.rb +19 -0
  42. data/lib/xmi/sparx/element/coords.rb +19 -0
  43. data/lib/xmi/sparx/element/documentation.rb +17 -0
  44. data/lib/xmi/sparx/element/element.rb +62 -0
  45. data/lib/xmi/sparx/element/extended_properties.rb +21 -0
  46. data/lib/xmi/sparx/element/flags.rb +29 -0
  47. data/lib/xmi/sparx/element/links.rb +22 -0
  48. data/lib/xmi/sparx/element/model.rb +26 -0
  49. data/lib/xmi/sparx/element/package_properties.rb +21 -0
  50. data/lib/xmi/sparx/element/paths.rb +17 -0
  51. data/lib/xmi/sparx/element/project.rb +29 -0
  52. data/lib/xmi/sparx/element/properties.rb +41 -0
  53. data/lib/xmi/sparx/element/stereotype.rb +17 -0
  54. data/lib/xmi/sparx/element/style.rb +17 -0
  55. data/lib/xmi/sparx/element/styleex.rb +17 -0
  56. data/lib/xmi/sparx/element/tag.rb +32 -0
  57. data/lib/xmi/sparx/element/times.rb +23 -0
  58. data/lib/xmi/sparx/element/xrefs.rb +17 -0
  59. data/lib/xmi/sparx/element.rb +28 -445
  60. data/lib/xmi/sparx/extension.rb +4 -12
  61. data/lib/xmi/sparx/gml/application_schema.rb +26 -0
  62. data/lib/xmi/sparx/gml/code_list.rb +23 -0
  63. data/lib/xmi/sparx/gml/data_type.rb +18 -0
  64. data/lib/xmi/sparx/gml/enumeration.rb +18 -0
  65. data/lib/xmi/sparx/gml/feature_type.rb +21 -0
  66. data/lib/xmi/sparx/gml/property.rb +24 -0
  67. data/lib/xmi/sparx/gml/shared_attributes.rb +39 -0
  68. data/lib/xmi/sparx/gml/type.rb +18 -0
  69. data/lib/xmi/sparx/gml/union.rb +18 -0
  70. data/lib/xmi/sparx/gml.rb +10 -125
  71. data/lib/xmi/sparx/index.rb +248 -0
  72. data/lib/xmi/sparx/mappings/base_mapping.rb +13 -137
  73. data/lib/xmi/sparx/root.rb +10 -11
  74. data/lib/xmi/sparx.rb +1 -0
  75. data/lib/xmi/uml/annotated_element.rb +16 -0
  76. data/lib/xmi/uml/association_generalization.rb +20 -0
  77. data/lib/xmi/uml/bounds.rb +43 -0
  78. data/lib/xmi/uml/default_value.rb +42 -0
  79. data/lib/xmi/uml/diagram.rb +25 -0
  80. data/lib/xmi/uml/member_end.rb +16 -0
  81. data/lib/xmi/uml/owned_attribute.rb +31 -0
  82. data/lib/xmi/uml/owned_comment.rb +29 -0
  83. data/lib/xmi/uml/owned_element.rb +33 -0
  84. data/lib/xmi/uml/owned_end.rb +34 -0
  85. data/lib/xmi/uml/owned_literal.rb +23 -0
  86. data/lib/xmi/uml/owned_operation.rb +22 -0
  87. data/lib/xmi/uml/owned_parameter.rb +29 -0
  88. data/lib/xmi/uml/package_import.rb +30 -0
  89. data/lib/xmi/uml/packaged_element.rb +49 -0
  90. data/lib/xmi/uml/precondition.rb +22 -0
  91. data/lib/xmi/uml/profile.rb +43 -0
  92. data/lib/xmi/uml/profile_application.rb +34 -0
  93. data/lib/xmi/uml/specification.rb +20 -0
  94. data/lib/xmi/uml/type.rb +18 -0
  95. data/lib/xmi/uml/uml_model.rb +29 -0
  96. data/lib/xmi/uml.rb +27 -502
  97. data/lib/xmi/version.rb +1 -1
  98. data/lib/xmi/xmi_identity.rb +46 -0
  99. data/lib/xmi.rb +11 -7
  100. metadata +84 -3
  101. data/lib/xmi/index.rb +0 -243
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: xmi
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.5.3
4
+ version: 0.5.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ribose Inc.
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2026-04-20 00:00:00.000000000 Z
11
+ date: 2026-04-21 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: lutaml-model
@@ -67,30 +67,89 @@ files:
67
67
  - lib/xmi.rb
68
68
  - lib/xmi/add.rb
69
69
  - lib/xmi/custom_profile.rb
70
+ - lib/xmi/custom_profile/abstract.rb
71
+ - lib/xmi/custom_profile/basic_doc.rb
72
+ - lib/xmi/custom_profile/bibliography.rb
73
+ - lib/xmi/custom_profile/edition.rb
74
+ - lib/xmi/custom_profile/enumeration.rb
75
+ - lib/xmi/custom_profile/informative.rb
76
+ - lib/xmi/custom_profile/invariant.rb
77
+ - lib/xmi/custom_profile/number.rb
78
+ - lib/xmi/custom_profile/ocl.rb
79
+ - lib/xmi/custom_profile/persistence.rb
80
+ - lib/xmi/custom_profile/publication_date.rb
81
+ - lib/xmi/custom_profile/year_version.rb
70
82
  - lib/xmi/delete.rb
71
83
  - lib/xmi/difference.rb
72
84
  - lib/xmi/documentation.rb
73
85
  - lib/xmi/ea_root.rb
86
+ - lib/xmi/ea_root/code_generation.rb
87
+ - lib/xmi/ea_root/extension_lifecycle.rb
88
+ - lib/xmi/ea_root/namespace_handling.rb
89
+ - lib/xmi/ea_root/xml_parsing.rb
74
90
  - lib/xmi/extension.rb
75
- - lib/xmi/index.rb
76
91
  - lib/xmi/namespace.rb
77
92
  - lib/xmi/namespace/dynamic.rb
78
93
  - lib/xmi/namespace/omg.rb
79
94
  - lib/xmi/namespace/sparx.rb
80
95
  - lib/xmi/namespace_detector.rb
81
96
  - lib/xmi/namespace_registry.rb
97
+ - lib/xmi/parser_pipeline.rb
82
98
  - lib/xmi/parsing.rb
83
99
  - lib/xmi/replace.rb
84
100
  - lib/xmi/root.rb
85
101
  - lib/xmi/sparx.rb
86
102
  - lib/xmi/sparx/connector.rb
103
+ - lib/xmi/sparx/connector/appearance.rb
104
+ - lib/xmi/sparx/connector/connector.rb
105
+ - lib/xmi/sparx/connector/end_base.rb
106
+ - lib/xmi/sparx/connector/end_constraint.rb
107
+ - lib/xmi/sparx/connector/end_modifiers.rb
108
+ - lib/xmi/sparx/connector/end_role.rb
109
+ - lib/xmi/sparx/connector/end_style.rb
110
+ - lib/xmi/sparx/connector/end_type.rb
111
+ - lib/xmi/sparx/connector/labels.rb
112
+ - lib/xmi/sparx/connector/model.rb
113
+ - lib/xmi/sparx/connector/properties.rb
87
114
  - lib/xmi/sparx/custom_profile.rb
88
115
  - lib/xmi/sparx/diagram.rb
89
116
  - lib/xmi/sparx/ea_stub.rb
90
117
  - lib/xmi/sparx/ea_uml.rb
91
118
  - lib/xmi/sparx/element.rb
119
+ - lib/xmi/sparx/element/association.rb
120
+ - lib/xmi/sparx/element/attribute.rb
121
+ - lib/xmi/sparx/element/bounds.rb
122
+ - lib/xmi/sparx/element/code.rb
123
+ - lib/xmi/sparx/element/containment.rb
124
+ - lib/xmi/sparx/element/coords.rb
125
+ - lib/xmi/sparx/element/documentation.rb
126
+ - lib/xmi/sparx/element/element.rb
127
+ - lib/xmi/sparx/element/extended_properties.rb
128
+ - lib/xmi/sparx/element/flags.rb
129
+ - lib/xmi/sparx/element/links.rb
130
+ - lib/xmi/sparx/element/model.rb
131
+ - lib/xmi/sparx/element/package_properties.rb
132
+ - lib/xmi/sparx/element/paths.rb
133
+ - lib/xmi/sparx/element/project.rb
134
+ - lib/xmi/sparx/element/properties.rb
135
+ - lib/xmi/sparx/element/stereotype.rb
136
+ - lib/xmi/sparx/element/style.rb
137
+ - lib/xmi/sparx/element/styleex.rb
138
+ - lib/xmi/sparx/element/tag.rb
139
+ - lib/xmi/sparx/element/times.rb
140
+ - lib/xmi/sparx/element/xrefs.rb
92
141
  - lib/xmi/sparx/extension.rb
93
142
  - lib/xmi/sparx/gml.rb
143
+ - lib/xmi/sparx/gml/application_schema.rb
144
+ - lib/xmi/sparx/gml/code_list.rb
145
+ - lib/xmi/sparx/gml/data_type.rb
146
+ - lib/xmi/sparx/gml/enumeration.rb
147
+ - lib/xmi/sparx/gml/feature_type.rb
148
+ - lib/xmi/sparx/gml/property.rb
149
+ - lib/xmi/sparx/gml/shared_attributes.rb
150
+ - lib/xmi/sparx/gml/type.rb
151
+ - lib/xmi/sparx/gml/union.rb
152
+ - lib/xmi/sparx/index.rb
94
153
  - lib/xmi/sparx/mappings.rb
95
154
  - lib/xmi/sparx/mappings/base_mapping.rb
96
155
  - lib/xmi/sparx/primitive_type.rb
@@ -98,12 +157,34 @@ files:
98
157
  - lib/xmi/sparx/sys_ph_s.rb
99
158
  - lib/xmi/type.rb
100
159
  - lib/xmi/uml.rb
160
+ - lib/xmi/uml/annotated_element.rb
161
+ - lib/xmi/uml/association_generalization.rb
162
+ - lib/xmi/uml/bounds.rb
163
+ - lib/xmi/uml/default_value.rb
164
+ - lib/xmi/uml/diagram.rb
165
+ - lib/xmi/uml/member_end.rb
166
+ - lib/xmi/uml/owned_attribute.rb
167
+ - lib/xmi/uml/owned_comment.rb
168
+ - lib/xmi/uml/owned_element.rb
169
+ - lib/xmi/uml/owned_end.rb
170
+ - lib/xmi/uml/owned_literal.rb
171
+ - lib/xmi/uml/owned_operation.rb
172
+ - lib/xmi/uml/owned_parameter.rb
173
+ - lib/xmi/uml/package_import.rb
174
+ - lib/xmi/uml/packaged_element.rb
175
+ - lib/xmi/uml/precondition.rb
176
+ - lib/xmi/uml/profile.rb
177
+ - lib/xmi/uml/profile_application.rb
178
+ - lib/xmi/uml/specification.rb
179
+ - lib/xmi/uml/type.rb
180
+ - lib/xmi/uml/uml_model.rb
101
181
  - lib/xmi/v20110701.rb
102
182
  - lib/xmi/v20131001.rb
103
183
  - lib/xmi/v20161101.rb
104
184
  - lib/xmi/version.rb
105
185
  - lib/xmi/version_registry.rb
106
186
  - lib/xmi/versioned.rb
187
+ - lib/xmi/xmi_identity.rb
107
188
  - sig/xmi.rbs
108
189
  - xmi.gemspec
109
190
  homepage: https://github.com/lutaml/xmi
data/lib/xmi/index.rb DELETED
@@ -1,243 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Xmi
4
- # Builds all commonly needed indexes from a parsed SparxRoot in a single
5
- # targeted walk, avoiding the generic map_id_name approach that visits every
6
- # attribute of every node.
7
- #
8
- # Indexes built:
9
- # - id_name_map: { xmi_id => name } for all nodes with both id and name
10
- # - packaged_elements: flat array of all PackagedElement instances
11
- # - packaged_by_id: { xmi_id => PackagedElement }
12
- # - packaged_by_type: { "uml:Class" => [...], "uml:Package" => [...], ... }
13
- # - upper_level_map: { xmi_id => parent PackagedElement }
14
- # - elements_by_idref: { idref => Extension::Element::Element }
15
- # - connectors_by_idref: { idref => Connector::Connector }
16
- # - attributes_by_idref: { idref => Extension::Element::Attribute }
17
- # - owned_attrs_by_type_idref: { type_idref => [OwnedAttribute, ...] }
18
- class Index
19
- attr_reader :id_name_map, :packaged_elements, :packaged_by_id,
20
- :packaged_by_type, :upper_level_map, :elements_by_idref,
21
- :connectors_by_idref, :attributes_by_idref,
22
- :owned_attrs_by_type_idref
23
-
24
- PackagedElement = ::Xmi::Uml::PackagedElement
25
-
26
- # @param root [Xmi::Sparx::SparxRoot] parsed XMI model
27
- def initialize(root)
28
- @id_name_map = {}
29
- @packaged_elements = []
30
- @packaged_by_id = {}
31
- @packaged_by_type = {}
32
- @upper_level_map = {}
33
- @elements_by_idref = {}
34
- @connectors_by_idref = {}
35
- @attributes_by_idref = {}
36
- @owned_attrs_by_type_idref = {}
37
-
38
- build(root)
39
- freeze
40
- end
41
-
42
- # Lookup name by XMI ID
43
- # @param xmi_id [String] XMI identifier
44
- # @return [String, nil]
45
- def lookup_name(xmi_id)
46
- @id_name_map[xmi_id]
47
- end
48
-
49
- # Find packaged element by XMI ID
50
- # @param id [String]
51
- # @return [Xmi::Uml::PackagedElement, nil]
52
- def find_packaged_element(id)
53
- @packaged_by_id[id]
54
- end
55
-
56
- # Find parent of a packaged element
57
- # @param id [String] child XMI ID
58
- # @return [Xmi::Uml::PackagedElement, nil]
59
- def find_parent(id)
60
- @upper_level_map[id]
61
- end
62
-
63
- # Find extension element by idref
64
- # @param idref [String]
65
- # @return [Xmi::Sparx::Element::Element, nil]
66
- def find_element(idref)
67
- @elements_by_idref[idref]
68
- end
69
-
70
- # Find connector by idref
71
- # @param idref [String]
72
- # @return [Xmi::Sparx::Connector::Connector, nil]
73
- def find_connector(idref)
74
- @connectors_by_idref[idref]
75
- end
76
-
77
- # Find extension attribute by idref
78
- # @param idref [String]
79
- # @return [Xmi::Sparx::Element::Attribute, nil]
80
- def find_attribute(idref)
81
- @attributes_by_idref[idref]
82
- end
83
-
84
- # Find owned attributes whose uml_type.idref matches
85
- # @param type_idref [String]
86
- # @return [Array<Xmi::Uml::OwnedAttribute>]
87
- def find_owned_attrs_by_type(type_idref)
88
- @owned_attrs_by_type_idref[type_idref] || []
89
- end
90
-
91
- # Find packaged elements by UML type
92
- # @param type [String] e.g. "uml:Class", "uml:Package"
93
- # @return [Array<Xmi::Uml::PackagedElement>]
94
- def packaged_elements_of_type(type)
95
- @packaged_by_type[type] || []
96
- end
97
-
98
- # Find first packaged element by name and allowed types
99
- # @param name [String]
100
- # @param types [Array<String>] e.g. ["uml:Class", "uml:AssociationClass"]
101
- # @return [Xmi::Uml::PackagedElement, nil]
102
- def find_packaged_by_name_and_types(name, types)
103
- types.each do |type|
104
- elements = @packaged_by_type[type]
105
- next unless elements
106
-
107
- found = elements.find { |e| e.name == name }
108
- return found if found
109
- end
110
- nil
111
- end
112
-
113
- private
114
-
115
- def build(root)
116
- model = root.model
117
- if model
118
- id = model.id if model.respond_to?(:id)
119
- @id_name_map[id] = model.name if id && model.name
120
- walk_packaged_elements(model.packaged_element, nil)
121
- end
122
-
123
- ext = root.extension
124
- return unless ext
125
-
126
- index_extension_elements(ext.elements)
127
- index_extension_connectors(ext.connectors)
128
-
129
- primitives = ext.primitive_types
130
- walk_packaged_elements(primitives.packaged_element, nil) if primitives
131
-
132
- index_extension_profiles(ext.profiles)
133
- end
134
-
135
- def walk_packaged_elements(elements, parent) # rubocop:disable Metrics/MethodLength
136
- return unless elements
137
-
138
- id_name_map = @id_name_map
139
- packaged_by_id = @packaged_by_id
140
- packaged_by_type = @packaged_by_type
141
- upper_level_map = @upper_level_map
142
- packaged_elements = @packaged_elements
143
- owned_attrs_by_type = @owned_attrs_by_type_idref
144
-
145
- elements.each do |pe|
146
- next unless pe.is_a?(PackagedElement)
147
-
148
- pe_id = pe.id
149
- pe_type = pe.type
150
- pe_name = pe.name
151
-
152
- packaged_elements << pe
153
- packaged_by_id[pe_id] = pe if pe_id
154
- (packaged_by_type[pe_type] ||= []) << pe if pe_type
155
- upper_level_map[pe_id] = parent if parent && pe_id
156
- id_name_map[pe_id] = pe_name if pe_id && pe_name
157
-
158
- # Inline owned attribute indexing
159
- attrs = pe.owned_attribute
160
- if attrs && !attrs.empty?
161
- attrs.each do |oa|
162
- oa_id = oa.id
163
- id_name_map[oa_id] = oa.name if oa_id && oa.name
164
- oa_type = oa.uml_type
165
- if oa.association && oa_type && oa_type.idref
166
- (owned_attrs_by_type[oa_type.idref] ||= []) << oa
167
- end
168
- end
169
- end
170
-
171
- # Inline owned operation indexing
172
- ops = pe.owned_operation
173
- if ops && !ops.empty?
174
- ops.each do |oo|
175
- oo_id = oo.id
176
- id_name_map[oo_id] = oo.name if oo_id && oo.name
177
- end
178
- end
179
-
180
- # Inline owned literal indexing
181
- lits = pe.owned_literal
182
- if lits && !lits.empty?
183
- lits.each do |ol|
184
- ol_id = ol.id
185
- id_name_map[ol_id] = ol.name if ol_id && ol.name
186
- end
187
- end
188
-
189
- # Recurse into children
190
- walk_packaged_elements(pe.packaged_element, pe)
191
- end
192
- end
193
-
194
- def index_extension_elements(elements)
195
- return unless elements
196
-
197
- element_list = elements.element
198
- return unless element_list
199
-
200
- element_list.each do |e|
201
- idref = e.idref
202
- next unless idref
203
-
204
- @elements_by_idref[idref] = e
205
-
206
- props = e.properties
207
- @id_name_map[idref] = props.name if props&.name
208
-
209
- attrs_obj = e.attributes
210
- next unless attrs_obj
211
-
212
- attr_list = attrs_obj.attribute
213
- next unless attr_list
214
-
215
- attr_list.each do |a|
216
- @attributes_by_idref[a.idref] = a if a.idref
217
- end
218
- end
219
- end
220
-
221
- def index_extension_connectors(connectors)
222
- return unless connectors
223
-
224
- conn_list = connectors.connector
225
- return unless conn_list
226
-
227
- conn_list.each do |c|
228
- @connectors_by_idref[c.idref] = c if c.idref
229
- end
230
- end
231
-
232
- def index_extension_profiles(profiles)
233
- return unless profiles
234
-
235
- profile_list = profiles.profile
236
- return unless profile_list
237
-
238
- profile_list.each do |profile|
239
- walk_packaged_elements(profile.packaged_element, nil) if profile.respond_to?(:packaged_element)
240
- end
241
- end
242
- end
243
- end