proformaxml 1.1.0 → 1.3.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 81e1724c3c9498d52025b18b5f3e2830fa10c499bcc9a064470f265d6ed9ba34
4
- data.tar.gz: 4b7499f6e605ba8dae8ad23e149a06e7e78fa08f91a14f3e8803e70140b02cdc
3
+ metadata.gz: 4662b9372d02e7ffaf3c7ff7c444732c723d4f84109be5c82fc06a3cabf0cc0b
4
+ data.tar.gz: bc74cbb0142da68f39aa70a9e5c06ef7a2d1313540f120f1e393094c2cf84a81
5
5
  SHA512:
6
- metadata.gz: c47047c96d5fb1c23233c67bd165a6b088e643bc9b6032c8107afd1e32d8d3cb9c4d2342661bd0b5b2b9da38fee368a058dc2fdfa2aabd34889f49c3e9817c21
7
- data.tar.gz: 18e38170e845ad6e148ce0de1f621e57c3b360a19c7e3a875d8be90e1dfaf94fc085aacdd18ab16d6a587116261426e1f6de6939a351d5fdb0a683e218c7ed1d
6
+ metadata.gz: 4ca4104cb636e4ea93c5c6456d5637919895f9ce616b05dc2f4564b17a5a70b9f441f62729025279b15a8b7ac1385d13a7165508bf7bec841bc4d788fc19e0a0
7
+ data.tar.gz: e24fe2ab9db3a08407e35f9ae01da9521e05e6a71c71c4f341de032428582e3cc0d7b4dca9db7f723f27a9789e28a6a7b2b552ad0f30b06835ba04901fa88b0c
data/.rubocop.yml CHANGED
@@ -13,7 +13,7 @@ inherit_from:
13
13
  - .rubocop/style.yml
14
14
 
15
15
  AllCops:
16
- TargetRubyVersion: 3.2
16
+ TargetRubyVersion: 3.3
17
17
  TargetRailsVersion: 7.0 # for ActiveSupport
18
18
  UseCache: True
19
19
  NewCops: enable
data/Gemfile.lock CHANGED
@@ -1,35 +1,44 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- proformaxml (1.1.0)
4
+ proformaxml (1.3.0)
5
5
  activemodel (>= 5.2.3, < 8.0.0)
6
6
  activesupport (>= 5.2.3, < 8.0.0)
7
- dachsfisch (>= 0.2.0, < 1.0.0)
7
+ dachsfisch (~> 1.0.0)
8
8
  nokogiri (>= 1.10.2, < 2.0.0)
9
9
  rubyzip (>= 1.2.2, < 3.0.0)
10
10
 
11
11
  GEM
12
12
  remote: https://rubygems.org/
13
13
  specs:
14
- activemodel (7.0.8)
15
- activesupport (= 7.0.8)
16
- activesupport (7.0.8)
14
+ activemodel (7.1.3.2)
15
+ activesupport (= 7.1.3.2)
16
+ activesupport (7.1.3.2)
17
+ base64
18
+ bigdecimal
17
19
  concurrent-ruby (~> 1.0, >= 1.0.2)
20
+ connection_pool (>= 2.2.5)
21
+ drb
18
22
  i18n (>= 1.6, < 2)
19
23
  minitest (>= 5.1)
24
+ mutex_m
20
25
  tzinfo (~> 2.0)
21
26
  ast (2.4.2)
22
- base64 (0.1.1)
27
+ base64 (0.2.0)
28
+ bigdecimal (3.1.6)
23
29
  byebug (11.1.3)
24
30
  coderay (1.1.3)
25
- concurrent-ruby (1.2.2)
26
- dachsfisch (0.2.0)
31
+ concurrent-ruby (1.2.3)
32
+ connection_pool (2.4.1)
33
+ dachsfisch (1.0.0)
27
34
  nokogiri (>= 1.14.1, < 2.0.0)
28
- diff-lcs (1.5.0)
35
+ diff-lcs (1.5.1)
29
36
  docile (1.4.0)
30
- factory_bot (6.3.0)
37
+ drb (2.2.0)
38
+ ruby2_keywords
39
+ factory_bot (6.4.6)
31
40
  activesupport (>= 5.0.0)
32
- ffi (1.16.1)
41
+ ffi (1.16.3)
33
42
  formatador (1.1.0)
34
43
  guard (2.18.1)
35
44
  formatador (>= 0.2.4)
@@ -47,24 +56,25 @@ GEM
47
56
  rspec (>= 2.99.0, < 4.0)
48
57
  i18n (1.14.1)
49
58
  concurrent-ruby (~> 1.0)
50
- json (2.6.3)
59
+ json (2.7.1)
51
60
  language_server-protocol (3.17.0.3)
52
61
  listen (3.8.0)
53
62
  rb-fsevent (~> 0.10, >= 0.10.3)
54
63
  rb-inotify (~> 0.9, >= 0.9.10)
55
- lumberjack (1.2.9)
64
+ lumberjack (1.2.10)
56
65
  method_source (1.0.0)
57
- mini_portile2 (2.8.4)
58
- minitest (5.20.0)
66
+ mini_portile2 (2.8.5)
67
+ minitest (5.22.2)
68
+ mutex_m (0.2.0)
59
69
  nenv (0.3.0)
60
- nokogiri (1.15.4)
70
+ nokogiri (1.16.4)
61
71
  mini_portile2 (~> 2.8.2)
62
72
  racc (~> 1.4)
63
73
  notiffany (0.1.3)
64
74
  nenv (~> 0.1)
65
75
  shellany (~> 0.0)
66
- parallel (1.23.0)
67
- parser (3.2.2.3)
76
+ parallel (1.24.0)
77
+ parser (3.2.2.4)
68
78
  ast (~> 2.4.1)
69
79
  racc
70
80
  pry (0.14.2)
@@ -73,62 +83,63 @@ GEM
73
83
  pry-byebug (3.10.1)
74
84
  byebug (~> 11.0)
75
85
  pry (>= 0.13, < 0.15)
76
- racc (1.7.1)
77
- rack (3.0.8)
86
+ racc (1.7.3)
87
+ rack (3.0.9.1)
78
88
  rainbow (3.1.1)
79
- rake (13.0.6)
89
+ rake (13.2.1)
80
90
  rb-fsevent (0.11.2)
81
91
  rb-inotify (0.10.1)
82
92
  ffi (~> 1.0)
83
- regexp_parser (2.8.1)
93
+ regexp_parser (2.8.3)
84
94
  rexml (3.2.6)
85
- rspec (3.12.0)
86
- rspec-core (~> 3.12.0)
87
- rspec-expectations (~> 3.12.0)
88
- rspec-mocks (~> 3.12.0)
95
+ rspec (3.13.0)
96
+ rspec-core (~> 3.13.0)
97
+ rspec-expectations (~> 3.13.0)
98
+ rspec-mocks (~> 3.13.0)
89
99
  rspec-collection_matchers (1.2.1)
90
100
  rspec-expectations (>= 2.99.0.beta1)
91
- rspec-core (3.12.2)
92
- rspec-support (~> 3.12.0)
93
- rspec-expectations (3.12.3)
101
+ rspec-core (3.13.0)
102
+ rspec-support (~> 3.13.0)
103
+ rspec-expectations (3.13.0)
94
104
  diff-lcs (>= 1.2.0, < 2.0)
95
- rspec-support (~> 3.12.0)
105
+ rspec-support (~> 3.13.0)
96
106
  rspec-github (2.4.0)
97
107
  rspec-core (~> 3.0)
98
- rspec-mocks (3.12.6)
108
+ rspec-mocks (3.13.0)
99
109
  diff-lcs (>= 1.2.0, < 2.0)
100
- rspec-support (~> 3.12.0)
101
- rspec-support (3.12.1)
102
- rubocop (1.56.4)
103
- base64 (~> 0.1.1)
110
+ rspec-support (~> 3.13.0)
111
+ rspec-support (3.13.0)
112
+ rubocop (1.59.0)
104
113
  json (~> 2.3)
105
114
  language_server-protocol (>= 3.17.0)
106
115
  parallel (~> 1.10)
107
- parser (>= 3.2.2.3)
116
+ parser (>= 3.2.2.4)
108
117
  rainbow (>= 2.2.2, < 4.0)
109
118
  regexp_parser (>= 1.8, < 3.0)
110
119
  rexml (>= 3.2.5, < 4.0)
111
- rubocop-ast (>= 1.28.1, < 2.0)
120
+ rubocop-ast (>= 1.30.0, < 2.0)
112
121
  ruby-progressbar (~> 1.7)
113
122
  unicode-display_width (>= 2.4.0, < 3.0)
114
- rubocop-ast (1.29.0)
123
+ rubocop-ast (1.30.0)
115
124
  parser (>= 3.2.1.0)
116
125
  rubocop-capybara (2.19.0)
117
126
  rubocop (~> 1.41)
118
127
  rubocop-factory_bot (2.24.0)
119
128
  rubocop (~> 1.33)
120
- rubocop-performance (1.19.1)
121
- rubocop (>= 1.7.0, < 2.0)
122
- rubocop-ast (>= 0.4.0)
123
- rubocop-rails (2.21.2)
129
+ rubocop-performance (1.20.1)
130
+ rubocop (>= 1.48.1, < 2.0)
131
+ rubocop-ast (>= 1.30.0, < 2.0)
132
+ rubocop-rails (2.23.1)
124
133
  activesupport (>= 4.2.0)
125
134
  rack (>= 1.1)
126
135
  rubocop (>= 1.33.0, < 2.0)
127
- rubocop-rspec (2.24.1)
128
- rubocop (~> 1.33)
136
+ rubocop-ast (>= 1.30.0, < 2.0)
137
+ rubocop-rspec (2.25.0)
138
+ rubocop (~> 1.40)
129
139
  rubocop-capybara (~> 2.17)
130
140
  rubocop-factory_bot (~> 2.22)
131
141
  ruby-progressbar (1.13.0)
142
+ ruby2_keywords (0.0.5)
132
143
  rubyzip (2.3.2)
133
144
  shellany (0.0.1)
134
145
  simplecov (0.22.0)
@@ -137,7 +148,7 @@ GEM
137
148
  simplecov_json_formatter (~> 0.1)
138
149
  simplecov-html (0.12.3)
139
150
  simplecov_json_formatter (0.1.4)
140
- thor (1.2.2)
151
+ thor (1.3.0)
141
152
  tzinfo (2.0.6)
142
153
  concurrent-ruby (~> 1.0)
143
154
  unicode-display_width (2.5.0)
@@ -164,4 +175,4 @@ DEPENDENCIES
164
175
  simplecov
165
176
 
166
177
  BUNDLED WITH
167
- 2.4.18
178
+ 2.5.3
@@ -48,7 +48,7 @@ module ProformaXML
48
48
  end
49
49
 
50
50
  def add_namespaces_for_dachsfisch_node(dachsfisch_node, xml)
51
- dachsfisch_node.flat_map {|_, val| val['@xmlns'].to_a }.uniq.each do |namespace|
51
+ dachsfisch_node.reject {|k| k == '@@order' }.flat_map {|_, val| val['@xmlns'].to_a }.uniq.each do |namespace|
52
52
  xml.doc.root.add_namespace(namespace[0], namespace[1]) unless namespace[0] == '$'
53
53
  end
54
54
  end
@@ -23,7 +23,7 @@ module ProformaXML
23
23
  if object.is_a? Hash
24
24
  object[name] = value
25
25
  else
26
- object.send("#{name}=", value)
26
+ object.send(:"#{name}=", value)
27
27
  end
28
28
  end
29
29
 
@@ -56,10 +56,10 @@ module ProformaXML
56
56
  end
57
57
 
58
58
  def add_test_configuration(test, test_node)
59
- test_configuration_node = test_node.xpath('xmlns:test-configuration')
59
+ test_configuration_node = test_node.xpath("#{@pro_ns}:test-configuration")
60
60
  test.files = test_files_from_test_configuration(test_configuration_node)
61
61
  test.configuration = extra_configuration_from_test_configuration(test_configuration_node)
62
- meta_data_node = test_node.xpath('xmlns:test-configuration').xpath('xmlns:test-meta-data')
62
+ meta_data_node = test_node.xpath("#{@pro_ns}:test-configuration").xpath("#{@pro_ns}:test-meta-data")
63
63
  test.meta_data = convert_xml_node_to_json(meta_data_node) if meta_data_node.present?
64
64
  end
65
65
 
@@ -69,34 +69,41 @@ module ProformaXML
69
69
 
70
70
  {}.tap do |config_hash|
71
71
  configuration_any_nodes.each do |config_node|
72
- config_hash.merge! convert_xml_node_to_json(config_node)
72
+ config_hash.merge!(convert_xml_node_to_json(config_node)) {|key, oldval, newval| key == '@@order' ? oldval + newval : newval }
73
73
  end
74
74
  end
75
75
  end
76
76
 
77
77
  def test_files_from_test_configuration(test_configuration_node)
78
- files_from_filerefs(test_configuration_node.search('filerefs'))
78
+ files_from_filerefs(test_configuration_node.xpath("#{@pro_ns}:filerefs"))
79
79
  end
80
80
 
81
81
  private
82
82
 
83
83
  def convert_xml_node_to_json(any_node)
84
84
  xml_snippet = Nokogiri::XML::DocumentFragment.new(Nokogiri::XML::Document.new, any_node)
85
- all_namespaces(any_node).each do |namespace|
85
+ all_namespaces_without_default(any_node).each do |namespace|
86
86
  xml_snippet.children.first.add_namespace_definition(namespace[:prefix], namespace[:href])
87
87
  end
88
- JSON.parse(Dachsfisch::XML2JSONConverter.perform(xml: xml_snippet.to_xml))
88
+ xml_without_custom_default_ns = xml_snippet.to_xml.gsub(%r{(</?)#{custom_default_namespace_prefix(any_node)}:}, '\1')
89
+ JSON.parse(Dachsfisch::XML2JSONConverter.perform(xml: xml_without_custom_default_ns))
89
90
  end
90
91
 
91
- def all_namespaces(node)
92
+ def all_namespaces_without_default(node)
92
93
  node.xpath('.|.//*').map(&:namespace).reject do |ns|
93
- ns.prefix.nil?
94
+ ns.prefix.nil? || ns.href.match?(/^urn:proforma:v\d.*$/)
94
95
  end.map {|ns| {prefix: ns.prefix, href: ns.href} }.uniq
95
96
  end
96
97
 
98
+ def custom_default_namespace_prefix(node)
99
+ node.xpath('.|.//*').map(&:namespace).filter do |ns|
100
+ ns.href.match?(/^urn:proforma:v\d.*$/)
101
+ end.map(&:prefix).first
102
+ end
103
+
97
104
  def value_from_node(name, node, attribute)
98
105
  xml_name = name.is_a?(Array) ? name[0] : name
99
- attribute ? node.attribute(xml_name)&.value : node.xpath("xmlns:#{xml_name}").text
106
+ attribute ? node.attribute(xml_name)&.value : node.xpath("#{@pro_ns}:#{xml_name}").text
100
107
  end
101
108
 
102
109
  def content_from_file_tag(file_tag, binary)
@@ -18,12 +18,21 @@ module ProformaXML
18
18
  @task = Task.new
19
19
  end
20
20
 
21
+ def proforma_namespace
22
+ namespace_regex = /^urn:proforma:v\d.*$/
23
+ namespaces = @doc.namespaces.filter do |_, href|
24
+ href.match? namespace_regex
25
+ end
26
+ namespaces.first.first.gsub('xmlns:', '')
27
+ end
28
+
21
29
  def perform
22
30
  errors = validate
23
31
 
24
32
  raise PreImportValidationError.new(errors) if errors.any?
25
33
 
26
- @task_node = @doc.xpath('/xmlns:task')
34
+ @pro_ns = proforma_namespace
35
+ @task_node = @doc.xpath("/#{@pro_ns}:task")
27
36
 
28
37
  set_data
29
38
  @task
@@ -37,11 +46,17 @@ module ProformaXML
37
46
  end
38
47
  end
39
48
 
49
+ def remove_referenced_files
50
+ referenced_files = (@task.tests.map(&:files) + @task.model_solutions.map(&:files)).flatten
51
+ @task.files.reject! {|f| referenced_files.include? f }
52
+ end
53
+
40
54
  def set_data
41
55
  set_base_data
42
56
  set_files
43
57
  set_model_solutions
44
58
  set_tests
59
+ remove_referenced_files
45
60
  set_meta_data
46
61
  set_extra_data
47
62
  end
@@ -57,44 +72,44 @@ module ProformaXML
57
72
  end
58
73
 
59
74
  def set_proglang
60
- return if @task_node.xpath('xmlns:proglang').text.blank?
75
+ return if @task_node.xpath("#{@pro_ns}:proglang").text.blank?
61
76
 
62
- @task.proglang = {name: @task_node.xpath('xmlns:proglang').text,
63
- version: @task_node.xpath('xmlns:proglang').attribute('version').value.presence}.compact
77
+ @task.proglang = {name: @task_node.xpath("#{@pro_ns}:proglang").text,
78
+ version: @task_node.xpath("#{@pro_ns}:proglang").attribute('version').value.presence}.compact
64
79
  end
65
80
 
66
81
  def set_files
67
- @task_node.search('files//file').each {|file_node| add_file file_node }
82
+ @task_node.xpath("#{@pro_ns}:files//#{@pro_ns}:file").each {|file_node| add_file file_node }
68
83
  end
69
84
 
70
85
  def set_tests
71
- @task_node.search('tests//test').each {|test_node| add_test test_node }
86
+ @task_node.xpath("#{@pro_ns}:tests//#{@pro_ns}:test").each {|test_node| add_test test_node }
72
87
  end
73
88
 
74
89
  def set_model_solutions
75
- @task_node.search('model-solutions//model-solution').each do |model_solution_node|
90
+ @task_node.xpath("#{@pro_ns}:model-solutions//#{@pro_ns}:model-solution").each do |model_solution_node|
76
91
  add_model_solution model_solution_node
77
92
  end
78
93
  end
79
94
 
80
95
  def set_meta_data
81
- meta_data_node = @task_node.xpath('xmlns:meta-data').first
96
+ meta_data_node = @task_node.xpath("#{@pro_ns}:meta-data").first
82
97
  @task.meta_data = convert_xml_node_to_json(meta_data_node) if meta_data_node.text.present?
83
98
  end
84
99
 
85
100
  def set_extra_data
86
- submission_restrictions_node = @task_node.xpath('xmlns:submission-restrictions').first
101
+ submission_restrictions_node = @task_node.xpath("#{@pro_ns}:submission-restrictions").first
87
102
  @task.submission_restrictions = convert_xml_node_to_json(submission_restrictions_node) unless submission_restrictions_node.nil?
88
- external_resources_node = @task_node.xpath('xmlns:external-resources').first
103
+ external_resources_node = @task_node.xpath("#{@pro_ns}:external-resources").first
89
104
  @task.external_resources = convert_xml_node_to_json(external_resources_node) unless external_resources_node.nil?
90
- grading_hints_node = @task_node.xpath('xmlns:grading-hints').first
105
+ grading_hints_node = @task_node.xpath("#{@pro_ns}:grading-hints").first
91
106
  @task.grading_hints = convert_xml_node_to_json(grading_hints_node) unless grading_hints_node.nil?
92
107
  end
93
108
 
94
109
  def add_model_solution(model_solution_node)
95
110
  model_solution = ModelSolution.new
96
111
  model_solution.id = model_solution_node.attributes['id'].value
97
- model_solution.files = files_from_filerefs(model_solution_node.search('filerefs'))
112
+ model_solution.files = files_from_filerefs(model_solution_node.xpath("#{@pro_ns}:filerefs"))
98
113
  set_value_from_xml(object: model_solution, node: model_solution_node, name: 'description')
99
114
  set_value_from_xml(object: model_solution, node: model_solution_node, name: 'internal-description')
100
115
  @task.model_solutions << model_solution unless model_solution.files.first&.id == 'ms-placeholder-file'
@@ -125,9 +140,9 @@ module ProformaXML
125
140
 
126
141
  def files_from_filerefs(filerefs_node)
127
142
  [].tap do |files|
128
- filerefs_node.search('fileref').each do |fileref_node|
143
+ filerefs_node.xpath("#{@pro_ns}:fileref").each do |fileref_node|
129
144
  fileref = fileref_node.attributes['refid'].value
130
- files << @task.files.delete(@task.files.detect {|file| file.id == fileref })
145
+ files << @task.files.detect {|file| file.id == fileref }
131
146
  end
132
147
  end
133
148
  end
@@ -14,7 +14,14 @@ module ProformaXML
14
14
  private
15
15
 
16
16
  def doc_schema_version
17
- @doc_schema_version ||= /^urn:proforma:v(.*)$/.match(@doc.namespaces['xmlns'])&.captures&.dig(0)
17
+ namespace_regex = /^urn:proforma:v(\d.*)$/
18
+ potential_namespaces = @doc.namespaces.filter do |_, href|
19
+ href.match? namespace_regex
20
+ end
21
+ return nil unless potential_namespaces.length == 1
22
+
23
+ @pro_ns = potential_namespaces.first[0].gsub('xmlns:', '')
24
+ @doc_schema_version ||= namespace_regex.match(potential_namespaces.first[1])&.captures&.dig(0)
18
25
  end
19
26
 
20
27
  def node_as_doc_with_namespace(config_node)
@@ -38,7 +45,7 @@ module ProformaXML
38
45
  end
39
46
 
40
47
  def validate_test_configuration
41
- @doc.xpath('/xmlns:task/xmlns:tests/xmlns:test/xmlns:test-configuration').flat_map do |test_config|
48
+ @doc.xpath("/#{@pro_ns}:task/#{@pro_ns}:tests/#{@pro_ns}:test/#{@pro_ns}:test-configuration").flat_map do |test_config|
42
49
  test_config.children.flat_map do |config_node|
43
50
  next [] unless config_node.namespace&.href&.start_with?('urn:proforma:tests:')
44
51
  next [] unless TEST_TYPE_SCHEMA_NAMES.include? config_node.name
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module ProformaXML
4
- VERSION = '1.1.0'
4
+ VERSION = '1.3.0'
5
5
  end
data/proformaxml.gemspec CHANGED
@@ -13,7 +13,7 @@ Gem::Specification.new do |spec|
13
13
  spec.homepage = 'https://github.com/openHPI/proformaxml'
14
14
  spec.license = 'MIT'
15
15
 
16
- spec.required_ruby_version = '>= 3.2'
16
+ spec.required_ruby_version = '>= 3.3'
17
17
 
18
18
  # Specify which files should be added to the gem when it is released.
19
19
  # The `git ls-files -z` loads the files in the RubyGem that have been added into git.
@@ -29,7 +29,7 @@ Gem::Specification.new do |spec|
29
29
 
30
30
  spec.add_dependency 'activemodel', '>= 5.2.3', '< 8.0.0'
31
31
  spec.add_dependency 'activesupport', '>= 5.2.3', '< 8.0.0'
32
- spec.add_dependency 'dachsfisch', '>= 0.2.0', '< 1.0.0'
32
+ spec.add_dependency 'dachsfisch', '~> 1.0.0'
33
33
  spec.add_dependency 'nokogiri', '>= 1.10.2', '< 2.0.0'
34
34
  spec.add_dependency 'rubyzip', '>= 1.2.2', '< 3.0.0'
35
35
 
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: proformaxml
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.0
4
+ version: 1.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Karol
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2023-10-03 00:00:00.000000000 Z
11
+ date: 2024-04-18 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activemodel
@@ -54,20 +54,14 @@ dependencies:
54
54
  name: dachsfisch
55
55
  requirement: !ruby/object:Gem::Requirement
56
56
  requirements:
57
- - - ">="
58
- - !ruby/object:Gem::Version
59
- version: 0.2.0
60
- - - "<"
57
+ - - "~>"
61
58
  - !ruby/object:Gem::Version
62
59
  version: 1.0.0
63
60
  type: :runtime
64
61
  prerelease: false
65
62
  version_requirements: !ruby/object:Gem::Requirement
66
63
  requirements:
67
- - - ">="
68
- - !ruby/object:Gem::Version
69
- version: 0.2.0
70
- - - "<"
64
+ - - "~>"
71
65
  - !ruby/object:Gem::Version
72
66
  version: 1.0.0
73
67
  - !ruby/object:Gem::Dependency
@@ -166,14 +160,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
166
160
  requirements:
167
161
  - - ">="
168
162
  - !ruby/object:Gem::Version
169
- version: '3.2'
163
+ version: '3.3'
170
164
  required_rubygems_version: !ruby/object:Gem::Requirement
171
165
  requirements:
172
166
  - - ">="
173
167
  - !ruby/object:Gem::Version
174
168
  version: '0'
175
169
  requirements: []
176
- rubygems_version: 3.4.6
170
+ rubygems_version: 3.5.3
177
171
  signing_key:
178
172
  specification_version: 4
179
173
  summary: Implements parts of ProFormA-XML specification