xmi 0.3.4 → 0.3.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: fa0a37c2b3b4d95e09706d9c2a3dee947622edd45342ed735c1fe346ef325929
4
- data.tar.gz: f3ce4cdb7dd6dd3fdda0478013f3ce87d4de70f400ec45f0c3b3a5388aaa1e15
3
+ metadata.gz: cf6faff1b8093081d01e1a58aa0f226c3803855f8ff172759708e87afd046454
4
+ data.tar.gz: 14a1169f7ea7294d7b6e995bc631432ed222dd98785e5ecd928788135c095a0f
5
5
  SHA512:
6
- metadata.gz: 243e5f497c1093cc90018d20b8a436239c8d535e4073aafc41d9af11a22c1f3eb06306854bbe0f59a74d4fbc0e036943bfa4a34c59a4ba8c046d5a595ee4301c
7
- data.tar.gz: 27167737fd6433c5e3e927b1454754c4b85e5ffe7bc31fc719ae53e3cb0e0e7ca7899c1745e6e51f867803f35c28c254c909a509f398ea4379b1454d057dc322
6
+ metadata.gz: 89bef5249d1599e1b15a9b30b8a81a51b8a804aad1747705370ec17b21d70205b2680630ecda4308b85252fed01cbca548de2764c9bbef296fc951f29ebcfd6d
7
+ data.tar.gz: 72245cd81433e6d6942b7b7a3448d8008b5523524bc1dad0b8537fdceb57e8981a747e3e7f4e44d70c12514cf9869d9876425eafce0692d5a00f28d3de0ecb10
data/.gitignore CHANGED
@@ -9,3 +9,6 @@
9
9
 
10
10
  # rspec failure tracking
11
11
  .rspec_status
12
+ .ruby-version
13
+ .vscode
14
+ Gemfile.lock
data/README.adoc CHANGED
@@ -42,20 +42,20 @@ xmi_root_model = Xmi::Sparx::SparxRoot2013.from_xml(xml_content)
42
42
 
43
43
  This method takes the path to an XMI file and generate the Ruby objects.
44
44
 
45
- === Loading MDG Extensions and Generate Ruby Classes and Modules Dynamically
45
+ === Loading Extensions and Generate Ruby Classes and Modules Dynamically
46
46
 
47
- To load an MDG extension from an XML file, use the `load_mdg_extension` method:
47
+ To load an extension from an XML file, use the `load_extension` method:
48
48
 
49
49
  [source,ruby]
50
50
  ----
51
- Xmi::EaRoot.load_mdg_extension("path/to/your/mdg_extension.xml")
51
+ Xmi::EaRoot.load_extension("path/to/your/extension.xml")
52
52
 
53
53
  xml = "path/to/your/file.xmi"
54
54
  xml_content = File.read(xml)
55
55
  xmi_root_model = Xmi::Sparx::SparxRoot2013.from_xml(xml_content)
56
56
  ----
57
57
 
58
- `Xmi::EaRoot.load_mdg_extension` takes the path to an XML file and generate the
58
+ `Xmi::EaRoot.load_extension` takes the path to an XML file and generate the
59
59
  Ruby classes and modules defined in XML file dynamically.
60
60
  Then, you can generate Ruby objects by `Xmi::Sparx::SparxRoot2013.from_xml`.
61
61
 
data/lib/xmi/ea_root.rb CHANGED
@@ -45,17 +45,10 @@ module Xmi
45
45
  TEXT
46
46
 
47
47
  class << self
48
- def load_mdg_extension(xml_path)
49
- options = {}
50
- options[:input_xml_path] = xml_path
51
- options[:module_name] = "Mdg"
52
- load_extension(options)
53
- update_mdg_mappings
54
- end
55
-
56
- def load_extension(options)
57
- @content = gen_content(options)
48
+ def load_extension(xml_path)
49
+ @content = gen_content(xml_path)
58
50
  Object.class_eval @content
51
+ update_mappings(@module_name)
59
52
  end
60
53
 
61
54
  def output_rb_file(output_rb_path)
@@ -64,35 +57,35 @@ module Xmi
64
57
 
65
58
  private
66
59
 
67
- def update_mdg_mappings
68
- mdg_klasses = all_mdg_klasses
69
- map_elements = construct_shale_xml_mappings(mdg_klasses)
60
+ def update_mappings(module_name)
61
+ new_klasses = all_new_klasses(module_name)
62
+ map_elements = construct_shale_xml_mappings(new_klasses, module_name)
70
63
  sparx_roots.each do |sparx_root|
71
- update_shale_attributes(mdg_klasses, sparx_root)
64
+ update_shale_attributes(new_klasses, sparx_root, module_name)
72
65
  update_shale_xml_mappings(map_elements, sparx_root)
73
66
  end
74
67
  end
75
68
 
76
- def construct_shale_xml_mappings(mdg_klasses)
69
+ def construct_shale_xml_mappings(new_klasses, module_name) # rubocop:disable Metrics/MethodLength
77
70
  map_elements = []
78
- mdg_klasses.each do |klass|
79
- next unless Xmi::EaRoot::Mdg.const_get(klass).respond_to? :root_tag
71
+ new_klasses.each do |klass|
72
+ next unless Xmi::EaRoot.const_get(module_name).const_get(klass)
73
+ .respond_to? :root_tag
80
74
 
81
75
  map_elements << MAP_ELEMENT
82
- .gsub("#ELEMENT_NAME#", Xmi::EaRoot::Mdg.const_get(klass).root_tag)
76
+ .gsub("#ELEMENT_NAME#", Xmi::EaRoot.const_get(module_name).const_get(klass).root_tag)
83
77
  .gsub("#ELEMENT_METHOD#", Shale::Utils.snake_case(klass.to_s))
84
- .gsub("#NAMESPACE#", @mdg_namespace[:uri])
85
- .gsub("#PREFIX#", @mdg_namespace[:name])
78
+ .gsub("#NAMESPACE#", @def_namespace[:uri])
79
+ .gsub("#PREFIX#", @def_namespace[:name])
86
80
  end
87
81
 
88
82
  map_elements
89
83
  end
90
84
 
91
- def update_shale_attributes(mdg_klasses, sparx_root)
92
- mdg_klasses.each do |klass|
85
+ def update_shale_attributes(new_klasses, sparx_root, module_name)
86
+ new_klasses.each do |klass|
93
87
  method_name = Shale::Utils.snake_case(klass)
94
- full_klass_name = "Xmi::EaRoot::Mdg::#{klass}"
95
-
88
+ full_klass_name = "Xmi::EaRoot::#{module_name}::#{klass}"
96
89
  attr_line = "#{ATTRIBUTE_LINE.rstrip}, collection: true"
97
90
  attr_line = attr_line
98
91
  .gsub("#TAG_NAME#", method_name)
@@ -118,9 +111,9 @@ module Xmi
118
111
  [Xmi::Sparx::SparxRoot, Xmi::Sparx::SparxRoot2013]
119
112
  end
120
113
 
121
- def all_mdg_klasses
122
- Xmi::EaRoot::Mdg.constants.select do |c|
123
- Xmi::EaRoot::Mdg.const_get(c).is_a? Class
114
+ def all_new_klasses(module_name)
115
+ Xmi::EaRoot.const_get(module_name).constants.select do |c|
116
+ Xmi::EaRoot.const_get(module_name).const_get(c).is_a? Class
124
117
  end
125
118
  end
126
119
 
@@ -131,6 +124,8 @@ module Xmi
131
124
  end
132
125
 
133
126
  def get_klass_name_from_node(node)
127
+ return Shale::Mapper.to_s unless node
128
+
134
129
  node.attribute_nodes.find { |attr| attr.name == "name" }.value
135
130
  end
136
131
 
@@ -172,7 +167,12 @@ module Xmi
172
167
  [attributes_lines, tags]
173
168
  end
174
169
 
175
- def gen_abstract_klass
170
+ def gen_abstract_klass # rubocop:disable Metrics/MethodLength
171
+ unless @abstract_klass_node
172
+ @abstract_tags = []
173
+ return ""
174
+ end
175
+
176
176
  attributes_lines = ""
177
177
  tags_lines, @abstract_tags = gen_tags(@abstract_klass_node)
178
178
  attributes_lines += tags_lines
@@ -266,12 +266,6 @@ module Xmi
266
266
  klasses_lines = ""
267
267
 
268
268
  nodes.each do |node|
269
- # check baseStereotypes is abstract class
270
- base_stereotypes = node.attribute_nodes.find do |attr|
271
- attr.name == "baseStereotypes" && attr.value == get_klass_name_from_node(@abstract_klass_node)
272
- end
273
- next if base_stereotypes.nil?
274
-
275
269
  klasses_lines += "#{gen_generic_klass(node)}\n"
276
270
  end
277
271
 
@@ -292,7 +286,7 @@ module Xmi
292
286
  .gsub("#KLASSES#", gen_klasses(xmi_doc))
293
287
  end
294
288
 
295
- def get_mdg_namespace(xmi_doc)
289
+ def get_namespace_from_definition(xmi_doc)
296
290
  node = xmi_doc.at_xpath("//UMLProfile/Documentation")
297
291
  namespace_key = node.attribute_nodes.find do |attr|
298
292
  attr.name == "name"
@@ -304,12 +298,15 @@ module Xmi
304
298
  { name: namespace_key, uri: namespace_uri }
305
299
  end
306
300
 
307
- def gen_content(options)
308
- xml = options[:input_xml_path]
309
- module_name = options[:module_name].capitalize
310
- xmi_doc = Nokogiri::XML(File.open(xml).read)
311
- @mdg_namespace = get_mdg_namespace(xmi_doc)
312
- gen_module(xmi_doc, module_name)
301
+ def gen_content(xml)
302
+ xmi_doc = Nokogiri::XML(File.read(xml))
303
+ @module_name = get_module_name(xmi_doc)
304
+ @def_namespace = get_namespace_from_definition(xmi_doc)
305
+ gen_module(xmi_doc, @module_name)
306
+ end
307
+
308
+ def get_module_name(xmi_doc)
309
+ xmi_doc.root.name.split(".").first.capitalize
313
310
  end
314
311
  end
315
312
  end
data/lib/xmi/sparx.rb CHANGED
@@ -674,6 +674,16 @@ module Xmi
674
674
  end
675
675
  end
676
676
 
677
+ class SparxPrimitiveTypes2013 < Shale::Mapper
678
+ attribute :packaged_element, Uml::PackagedElement2013, collection: true
679
+
680
+ xml do
681
+ root "primitivetypes"
682
+
683
+ map_element "packagedElement", to: :packaged_element
684
+ end
685
+ end
686
+
677
687
  class SparxProfiles < Shale::Mapper
678
688
  attribute :profile, Uml::Profile, collection: true
679
689
 
@@ -786,6 +796,20 @@ module Xmi
786
796
  end
787
797
  end
788
798
 
799
+ class SparxEAStub < Shale::Mapper
800
+ attribute :id, Shale::Type::String
801
+ attribute :name, Shale::Type::String
802
+ attribute :uml_type, Shale::Type::String
803
+
804
+ xml do
805
+ root "diagrams"
806
+
807
+ map_attribute "id", to: :id, prefix: "xmi", namespace: "http://www.omg.org/spec/XMI/20131001"
808
+ map_attribute "name", to: :name
809
+ map_attribute "UMLType", to: :uml_type
810
+ end
811
+ end
812
+
789
813
  module SparxExtensionAttributes
790
814
  def self.included(klass) # rubocop:disable Metrics/MethodLength
791
815
  klass.class_eval do
@@ -799,8 +823,9 @@ module Xmi
799
823
  attribute :extender_id, Shale::Type::String
800
824
  attribute :elements, SparxElements
801
825
  attribute :connectors, SparxConnectors
802
- attribute :primitive_types, SparxPrimitiveTypes
826
+ attribute :primitive_types, SparxPrimitiveTypes2013
803
827
  attribute :diagrams, SparxDiagrams
828
+ attribute :ea_stub, SparxEAStub, collection: true
804
829
  end
805
830
  end
806
831
  end
@@ -826,6 +851,7 @@ module Xmi
826
851
  map_element "primitivetypes", to: :primitive_types
827
852
  map_element "profiles", to: :profiles
828
853
  map_element "diagrams", to: :diagrams
854
+ map_element "EAStub", to: :ea_stub
829
855
  end
830
856
  end
831
857
 
@@ -850,6 +876,7 @@ module Xmi
850
876
  map_element "primitivetypes", to: :primitive_types
851
877
  map_element "profiles", to: :profiles
852
878
  map_element "diagrams", to: :diagrams
879
+ map_element "EAStub", to: :ea_stub
853
880
  end
854
881
  end
855
882
 
data/lib/xmi/uml.rb CHANGED
@@ -649,6 +649,7 @@ module Xmi
649
649
  end
650
650
  end
651
651
 
652
+ # TODO: add attributes xmlns:uml and xmlns:xmi
652
653
  module ProfileAttributes
653
654
  def self.included(klass)
654
655
  klass.class_eval do
@@ -656,6 +657,8 @@ module Xmi
656
657
  attribute :package_import, PackageImport, collection: true
657
658
  attribute :id, Shale::Type::String
658
659
  attribute :name, Shale::Type::String
660
+ # attribute :xmi, Shale::Type::String
661
+ # attribute :uml, Shale::Type::String
659
662
  attribute :ns_prefix, Shale::Type::String
660
663
 
661
664
  # Is this an EA thing?
data/lib/xmi/version.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Xmi
4
- VERSION = "0.3.4"
4
+ VERSION = "0.3.5"
5
5
  end
data/xmi.gemspec CHANGED
@@ -34,10 +34,10 @@ Gem::Specification.new do |spec|
34
34
  spec.add_runtime_dependency "nokogiri"
35
35
  spec.add_runtime_dependency "shale"
36
36
 
37
- spec.add_development_dependency "equivalent-xml"
38
37
  spec.add_development_dependency "pry", "~> 0.12.2"
39
38
  spec.add_development_dependency "rake", "~> 13.0"
40
39
  spec.add_development_dependency "rspec", "~> 3.11"
40
+ spec.add_development_dependency "rspec-xml"
41
41
  spec.add_development_dependency "rubocop", "~> 1.58"
42
42
  # spec.add_development_dependency "xml-c14n"
43
43
  end
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.3.4
4
+ version: 0.3.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: 2024-07-02 00:00:00.000000000 Z
11
+ date: 2024-07-10 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: nokogiri
@@ -38,20 +38,6 @@ dependencies:
38
38
  - - ">="
39
39
  - !ruby/object:Gem::Version
40
40
  version: '0'
41
- - !ruby/object:Gem::Dependency
42
- name: equivalent-xml
43
- requirement: !ruby/object:Gem::Requirement
44
- requirements:
45
- - - ">="
46
- - !ruby/object:Gem::Version
47
- version: '0'
48
- type: :development
49
- prerelease: false
50
- version_requirements: !ruby/object:Gem::Requirement
51
- requirements:
52
- - - ">="
53
- - !ruby/object:Gem::Version
54
- version: '0'
55
41
  - !ruby/object:Gem::Dependency
56
42
  name: pry
57
43
  requirement: !ruby/object:Gem::Requirement
@@ -94,6 +80,20 @@ dependencies:
94
80
  - - "~>"
95
81
  - !ruby/object:Gem::Version
96
82
  version: '3.11'
83
+ - !ruby/object:Gem::Dependency
84
+ name: rspec-xml
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ">="
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ">="
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
97
97
  - !ruby/object:Gem::Dependency
98
98
  name: rubocop
99
99
  requirement: !ruby/object:Gem::Requirement