pkm_level2_converter 0.2.0 → 0.3.1

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.
@@ -0,0 +1,97 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'types'
4
+
5
+ # Generische Pool-Klasse
6
+ class Pool
7
+ # MOVED TO PKM-Class
8
+ def self.parse_pool(xml_node, path_of_pool, type_of_pool)
9
+ # pool = @@pools[poolSymbol]
10
+ node = xml_node.at_xpath(path_of_pool)
11
+ type_of_pool.new(node)
12
+ end
13
+
14
+ def initialize(xml_node, type)
15
+ @type = type
16
+ @key = xml_node['key'].to_i
17
+ children = xml_node.children
18
+ @items = children.map.with_index { |parameter, index| type.new(parameter, @key, index) }
19
+ end
20
+
21
+ attr_reader :items, :key
22
+
23
+ def get_by_reference(key)
24
+ @items.find { |item| item.key == key }
25
+ end
26
+
27
+ def empty?
28
+ (@items.nil? || @items.empty?)
29
+ end
30
+
31
+ def length
32
+ @items.length
33
+ end
34
+ end
35
+
36
+ # Spezifische Pool-Klassen
37
+
38
+ # Ein XML-Ausgangskontext-Pool kodiert die Auflistung aller Ausgangskontext einesTarifmoduls.
39
+ class AusgangskontextPool < Pool
40
+ def self.type
41
+ Ausgangskontext
42
+ end
43
+
44
+ def initialize(xml_node)
45
+ super(xml_node, AusgangskontextPool.type)
46
+ end
47
+
48
+ def get_by_parameter(parameter)
49
+ @items.select { |ausgangskontext| ausgangskontext.contains_parameter?(parameter) }
50
+ end
51
+ end
52
+
53
+ # Ein XML-Ausgangsparameter-Poolkodiert die Auflistung allerAusgangsparametereinerAusgangsschnittstelle.
54
+ class AusgangsparameterPool < Pool
55
+ # TODO... Das passt noch nicht zur Pool-Implementierung
56
+ def self.type
57
+ Ausgangsparameter
58
+ end
59
+
60
+ def initialize(xml_node)
61
+ super(xml_node, AusgangsparameterPool.type)
62
+ end
63
+ end
64
+
65
+ # Ein XML-Ausgangsschnittstelle-Poolkodiert die Auflistung allerAusgangsschnittstellen einesTarifmoduls.
66
+ class AusgangsschnittstellenPool < Pool
67
+ def self.type
68
+ Ausgangsschnittstelle
69
+ end
70
+
71
+ def initialize(xml_node)
72
+ super(xml_node, AusgangsschnittstellenPool.type)
73
+ end
74
+
75
+ def cr374
76
+ @items.select(&:cr374?)
77
+ end
78
+
79
+ # def cr374_asst_pool_set
80
+ # cr374.to_set
81
+ # end
82
+
83
+ def cr374?
84
+ !cr374.empty?
85
+ end
86
+ end
87
+
88
+ # Ein XML-Sprache-Pool kodiert die Auflistung aller unterstützten Sprachen eines Tarifmoduls.
89
+ class SprachePool < Pool
90
+ def self.type
91
+ Sprache
92
+ end
93
+
94
+ def initialize(xml_node)
95
+ super(xml_node, SprachePool.type)
96
+ end
97
+ end
@@ -0,0 +1,114 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'pry'
4
+
5
+ # Generische Klasse Poolelement
6
+ class Poolelement
7
+ class << self
8
+ def add(instance)
9
+ @all_instances ||= []
10
+ @all_instances.push(instance)
11
+ end
12
+
13
+ def get_by_ref(ref)
14
+ @all_instances.find { |element| element.key == ref }
15
+ end
16
+ attr_reader :all_instances
17
+ end
18
+
19
+ def initialize(key, index)
20
+ @key = key + index
21
+ Poolelement.add(self)
22
+ end
23
+
24
+ attr_reader :key
25
+ end
26
+
27
+ # Pool-Elemente
28
+
29
+ # Ein Ausgangsparameter identifiziert die Rolle einer Information, die von der Geräte-Software zur Anzeige,
30
+ # allgemeinen Ausgabe oder Steuerung verwendet wird.
31
+ class Ausgangsparameter < Poolelement
32
+ def initialize(node, index, key)
33
+ super(key, index)
34
+ @nr = node.at('./xmlns:nr').text.to_i
35
+ @name = node.at('./xmlns:name').text
36
+ end
37
+
38
+ attr_reader :nr, :name
39
+
40
+ def cr374?
41
+ (nr >= 9000 && nr <= 9999)
42
+ end
43
+ end
44
+
45
+ # Eine Ausgangsschnittstelle identifiziert eine Schnittstelle der Geräte-Software, über welche
46
+ # Informationen von einer Strategie an die Geräte-Software übergegeben werden können.
47
+ class Ausgangsschnittstelle < Poolelement
48
+ def initialize(asst, key, index)
49
+ super(key, index)
50
+ @nr = asst.at('nr').text.to_i
51
+ @name = asst.at('name').text
52
+ parameter_pool_raw = asst.at_xpath('//xmlns:parameter-pool')
53
+ @parameter_pool = AusgangsparameterPool.new(parameter_pool_raw)
54
+ end
55
+
56
+ attr_reader :parameter_pool, :nr, :name
57
+
58
+ def cr374?
59
+ (@nr == 3 || @nr == 4)
60
+ end
61
+
62
+ def ermittle_alle_cr374_ausgangskontexte_zu_ausgangsparametern(ausgangskontext_pool)
63
+ filtered_parameters = @parameter_pool.items.select(&:cr374?).map do |parameter|
64
+ puts "Parameter Nr. #{parameter.nr} (\"#{parameter.name}\")"
65
+ ausgangskontext_pool.get_by_parameter(parameter)
66
+ end
67
+ filtered_parameters.flatten.to_set
68
+ end
69
+ end
70
+
71
+ # Eine Sprache beschreibt das natürliche Format, in dem eine Ausgabe an den Nutzer erfolgt.
72
+ class Sprache < Poolelement
73
+ def initialize(asst, key, index)
74
+ super(key, index)
75
+ @nr = asst.at('nr').text.to_i
76
+ @name = asst.at('name').text
77
+ end
78
+ end
79
+ # <ausgangskontext-pool key="10">
80
+ # <item>
81
+ # <name>AK-Deutschlandticket-PV</name>
82
+ # <sprache>
83
+ # <ref>3</ref>
84
+ # </sprache>
85
+ # <parameter>
86
+ # <ref>5</ref>
87
+ # <ref>6</ref>
88
+ # <ref>7</ref>
89
+ # <ref>8</ref>
90
+ # <ref>9</ref>
91
+ # </parameter>
92
+ # </item>
93
+ # </ausgangskontext-pool>
94
+
95
+ # Ein Ausgangstext steht für eine statische Information, die von einem als-Text-ausgebbaren Datenelement im Rahmen eines
96
+ # Ausgangskontexts bereitgestellt wird.
97
+ class Ausgangskontext
98
+ def initialize(node, index, key)
99
+ @key = key + index
100
+ @name = node.at('./xmlns:name').text
101
+ @sprache = node.xpath('./xmlns:sprache/xmlns:ref').map do |sprache_ref|
102
+ Poolelement.get_by_ref(sprache_ref.text.to_i)
103
+ end
104
+ @parameter = node.xpath('./xmlns:parameter/xmlns:ref').map do |parameter_ref|
105
+ Poolelement.get_by_ref(parameter_ref.text.to_i)
106
+ end
107
+ # ausgangsparameter # 1..N
108
+ end
109
+ attr_reader :key, :name, :sprache, :parameter
110
+
111
+ def contains_parameter?(parameter)
112
+ @parameter.find { |p| p == parameter }
113
+ end
114
+ end
@@ -1,5 +1,5 @@
1
- # frozen_string_literal: true
2
-
3
- module PkmLevel2Converter
4
- VERSION = "0.2.0"
5
- end
1
+ # frozen_string_literal: true
2
+
3
+ module PkmLevel2Converter
4
+ VERSION = '0.3.1'
5
+ end
@@ -1,175 +1,11 @@
1
- # frozen_string_literal: true
2
- require 'nokogiri'
3
- require 'pathname'
4
- require_relative "pkm_level2_converter/version"
5
-
6
- module PkmLevel2Converter
7
- class Error < StandardError; end
8
- class Converter
9
- def initialize(file_name)
10
- @filename = file_name
11
- end
12
-
13
- def filename
14
- @filename
15
- end
16
-
17
- def convertFileName()
18
- pn = Pathname.new(@filename)
19
- dir, base = File.split(pn)
20
- f = base.split('_')
21
- org_id_l3 = f[1].to_i
22
- org_id_l2 = org_id_l3 + 0x8000
23
- f[1] = org_id_l2.to_s
24
- return Pathname.new(dir).join(f.join("_"))
25
- end
26
-
27
- def save_file(file)
28
- #SAVE FILE with NEW name
29
- new_file_name = self.convertFileName()
30
- output = File.open( new_file_name, "w" )
31
- output << file.to_xml(:indent_text => "", :indent => 0).gsub(/>\n/,">")
32
- output.close
33
- puts "File saved as: #{new_file_name}"
34
- end
35
-
36
- def check_xsd(xsd, xml)
37
- puts "Check XML-Schema..."
38
- xsd = Nokogiri::XML::Schema(xsd)
39
- error = xsd.validate(xml)
40
- if error.empty?
41
- puts "XML-Schema is valid."
42
- return true
43
- else
44
- puts "XML-Schema is invalid."
45
- error.each do |e|
46
- puts e.message
47
- end
48
- return false
49
- end
50
- end
51
-
52
- def convert_pkm()
53
- orig_file_name = @filename
54
- if File.file?(orig_file_name)
55
- @xml_doc = File.open(orig_file_name) { |f| Nokogiri::XML(f) }
56
- case @xml_doc.root.name
57
- when "pv-km"
58
- convert_ids_pvkm
59
- when "dl-km"
60
- convert_ids_dlkm
61
- when "rntm"
62
- convert_ids_rntm
63
- else
64
- puts(@xml_doc.root.name + " wird nicht unterstützt.")
65
- end
66
-
67
- if xml_is_valid_pkm(@xml_doc)
68
- save_file(@xml_doc)
69
- end
70
- else
71
- puts "File ('#{orig_file_name}') not found."
72
- end
73
- end
74
-
75
- def xml_is_valid_pkm(xml)
76
- #xsd = File.read("./ka/pkm/1/XML-Schema_PKM.xsd")
77
- path=''
78
- case @xml_doc.root.name
79
- when "pv-km"
80
- path = './pkm_level2_converter/ka/pkm/1/XML-Schema_PKM.xsd'
81
- when "dl-km"
82
- path = './pkm_level2_converter/ka/pkm/1/XML-Schema_PKM.xsd'
83
- when "rntm"
84
- path = './pkm_level2_converter/ka/pkm/2/XML-Schema_PKM.xsd'
85
- end
86
-
87
- file_path = File.join(File.dirname(__FILE__), path)
88
-
89
- xsd = File.read(file_path)
90
- return self.check_xsd(xsd,xml)
91
- end
92
-
93
- def convert_xpath_l3_id(node, x_path)
94
- map = node.at_xpath x_path
95
- id = map.content.to_i
96
- map.content = (id + 0x8000).to_s
97
- end
98
-
99
- def convert_ids_dlkm
100
- #Organisations-ID des DL:
101
- #dl-km/organisation/id
102
- convert_xpath_l3_id(@xml_doc, 'xmlns:dl-km/xmlns:organisation/xmlns:id')
103
- puts "Converted following IDs:"
104
- puts "/dl-km/organisation/id = " + @xml_doc.xpath('/xmlns:dl-km/xmlns:organisation/xmlns:id').text
105
-
106
- @xml_doc.xpath('/xmlns:dl-km/xmlns:kontrollmodul-pool/xmlns:item').each do |node|
107
-
108
- #Organisations-ID des PV:
109
- #dl-km/kontrollmodul-pool/item/moduldaten/organisation/id
110
- convert_xpath_l3_id(node, 'xmlns:moduldaten/xmlns:organisation/xmlns:id')
111
- puts "# dl-km/kontrollmodul-pool/item/moduldaten/organisation/id = " + node.xpath('xmlns:moduldaten/xmlns:organisation/xmlns:id').text
112
- #Für PVKM zulässige Organisations-IDs der DL:
113
- #dl-km/kontrollmodul-pool/item/moduldaten/organisation-pool/item/id
114
- node.xpath('xmlns:moduldaten/xmlns:organisation-pool/xmlns:item').each do |child|
115
- convert_xpath_l3_id(child, 'xmlns:id')
116
- puts "## dl-km/kontrollmodul-pool/item/moduldaten/organisation-pool/item/id = " + child.xpath('xmlns:id').text
117
- end
118
- end
119
- #Für Anzeige von KVP als Klartext:
120
- #dl-km/kontrollmodul-pool/item/moduldaten/nummerninterpretation-pool/item[nr=2]/nummerntext-pool/item/nr
121
- end
122
-
123
- def convert_ids_pvkm
124
- #Organisations-ID des DL:
125
- #dl-km/organisation/id
126
- # convert_xpath_l3_id(@xml_doc, 'xmlns:dl-km/xmlns:organisation/xmlns:id')
127
- # puts "Converted following IDs:"
128
- # puts "/dl-km/organisation/id = " + @xml_doc.xpath('/xmlns:dl-km/xmlns:organisation/xmlns:id').text
129
-
130
- # @xml_doc.xpath('/xmlns:dl-km/xmlns:kontrollmodul-pool/xmlns:item').each do |node|
131
- node = @xml_doc.xpath('/xmlns:pv-km')
132
- #Organisations-ID des PV:
133
- #dl-km/kontrollmodul-pool/item/moduldaten/organisation/id
134
- # convert_xpath_l3_id(node, '/xmlns:pv-km/xmlns:organisation/xmlns:id')
135
- convert_xpath_l3_id(node, 'xmlns:organisation/xmlns:id')
136
- puts "# pv-km/organisation/id = " + node.xpath('xmlns:organisation/xmlns:id').text
137
- #Für PVKM zulässige Organisations-IDs der DL:
138
- #dl-km/kontrollmodul-pool/item/moduldaten/organisation-pool/item/id
139
- node.xpath('xmlns:organisation-pool/xmlns:item').each do |child|
140
- convert_xpath_l3_id(child, 'xmlns:id')
141
- puts "## pv-km/organisation-pool/item/id = " + child.xpath('xmlns:id').text
142
- end
143
- # end
144
- #Für Anzeige von KVP als Klartext:
145
- #dl-km/kontrollmodul-pool/item/moduldaten/nummerninterpretation-pool/item[nr=2]/nummerntext-pool/item/nr
146
- end
147
-
148
- def convert_ids_rntm
149
- #Organisations-ID des RN:
150
- #rntm/herausgeber/nr
151
- convert_xpath_l3_id(@xml_doc, 'xmlns:rntm/xmlns:herausgeber/xmlns:nr')
152
- puts "Converted following IDs:"
153
- puts "rntm/herausgeber/nr = " + @xml_doc.xpath('xmlns:rntm/xmlns:herausgeber/xmlns:nr').text
154
-
155
- @xml_doc.xpath('/xmlns:rntm/xmlns:tarifmodul-pool/xmlns:item').each do |node|
156
-
157
- #Organisations-ID des PV:
158
- #dl-km/kontrollmodul-pool/item/moduldaten/organisation/id
159
-
160
- convert_xpath_l3_id(node, 'xmlns:tarifmodul/xmlns:herausgeber/xmlns:nr')
161
- puts "# /rntm/tarifmodul-pool/item/tarifmodul/herausgeber/nr/ = " + node.xpath('xmlns:tarifmodul/xmlns:herausgeber/xmlns:nr').text
162
- #Für PVKM zulässige Organisations-IDs der DL:
163
- #dl-km/kontrollmodul-pool/item/moduldaten/organisation-pool/item/id
164
- node.xpath('xmlns:tarifmodul/xmlns:organisation-pool/xmlns:item').each do |child|
165
- convert_xpath_l3_id(child, 'xmlns:nr')
166
- puts "## /rntm/tarifmodul-pool/item/tarifmodul/organisation-pool/item/nr = " + child.xpath('xmlns:nr').text
167
- end
168
- end
169
- #Für Anzeige von KVP als Klartext:
170
- #dl-km/kontrollmodul-pool/item/moduldaten/nummerninterpretation-pool/item[nr=2]/nummerntext-pool/item/nr
171
- end
172
-
173
- end
174
-
175
- end
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'pkm_level2_converter/version'
4
+ require_relative 'pkm_level2_converter/pkm'
5
+ require_relative 'pkm_level2_converter/pkm_xml'
6
+
7
+ module PkmLevel2Converter
8
+ class Error < StandardError; end
9
+ PKM = ::PKM
10
+ PKMXml = ::PKMXml
11
+ end
@@ -1,39 +1,38 @@
1
- # frozen_string_literal: true
2
-
3
- require_relative "lib/pkm_level2_converter/version"
4
-
5
- Gem::Specification.new do |spec|
6
- spec.name = "pkm_level2_converter"
7
- spec.version = PkmLevel2Converter::VERSION
8
- spec.authors = ["Francis Doege"]
9
- spec.email = ["hello@francisdoege.com"]
10
-
11
- spec.summary = "Converts PKM modules for testing"
12
- # spec.description = "TODO: Write a longer description or delete this line."
13
- spec.homepage = "https://rubygems.org/gems/pkm_level2_converter"
14
- spec.license = "MIT"
15
- spec.required_ruby_version = ">= 2.4.0"
16
-
17
- #spec.metadata["allowed_push_host"] = "TODO: Set to 'http://mygemserver.com'"
18
-
19
- spec.metadata["homepage_uri"] = spec.homepage
20
- spec.metadata["source_code_uri"] = "https://github.com/justusjonas74/pkm_level2_converter"
21
- #spec.metadata["changelog_uri"] = "TODO: Put your gem's CHANGELOG.md URL here."
22
-
23
- # Specify which files should be added to the gem when it is released.
24
- # The `git ls-files -z` loads the files in the RubyGem that have been added into git.
25
- spec.files = Dir.chdir(File.expand_path(__dir__)) do
26
- `git ls-files -z`.split("\x0").reject { |f| f.match(%r{\A(?:test|spec|features)/}) }
27
- end
28
- spec.bindir = "exe"
29
- spec.executables = spec.files.grep(%r{\Aexe/}) { |f| File.basename(f) }
30
- spec.require_paths = ["lib"]
31
-
32
- # Uncomment to register a new dependency of your gem
33
- # spec.add_dependency "example-gem", "~> 1.0"
34
- spec.add_dependency "nokogiri", "~> 1.10.4"
35
- spec.add_development_dependency "rspec", "~> 3.2"
36
-
37
- # For more information and examples about making a new gem, checkout our
38
- # guide at: https://bundler.io/guides/creating_gem.html
39
- end
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'lib/pkm_level2_converter/version'
4
+
5
+ Gem::Specification.new do |spec|
6
+ spec.name = 'pkm_level2_converter'
7
+ spec.version = PkmLevel2Converter::VERSION
8
+ spec.authors = ['Francis Doege']
9
+ spec.email = ['hello@francisdoege.com']
10
+
11
+ spec.summary = 'Converts PKM modules for testing'
12
+ # spec.description = "TODO: Write a longer description or delete this line."
13
+ spec.homepage = 'https://rubygems.org/gems/pkm_level2_converter'
14
+ spec.license = 'MIT'
15
+ spec.required_ruby_version = '>= 3.2.2'
16
+
17
+ # spec.metadata["allowed_push_host"] = "TODO: Set to 'http://mygemserver.com'"
18
+
19
+ spec.metadata['homepage_uri'] = spec.homepage
20
+ spec.metadata['source_code_uri'] = 'https://github.com/justusjonas74/pkm_level2_converter'
21
+ # spec.metadata["changelog_uri"] = "TODO: Put your gem's CHANGELOG.md URL here."
22
+
23
+ # Specify which files should be added to the gem when it is released.
24
+ # The `git ls-files -z` loads the files in the RubyGem that have been added into git.
25
+ spec.files = Dir.chdir(File.expand_path(__dir__)) do
26
+ `git ls-files -z`.split("\x0").reject { |f| f.match(%r{\A(?:test|spec|features)/}) }
27
+ end
28
+ spec.bindir = 'exe'
29
+ spec.executables = spec.files.grep(%r{\Aexe/}) { |f| File.basename(f) }
30
+ spec.require_paths = ['lib']
31
+
32
+ # Uncomment to register a new dependency of your gem
33
+ # spec.add_dependency "example-gem", "~> 1.0"
34
+
35
+ # For more information and examples about making a new gem, checkout our
36
+ # guide at: https://bundler.io/guides/creating_gem.html
37
+ spec.metadata['rubygems_mfa_required'] = 'true'
38
+ end
metadata CHANGED
@@ -1,44 +1,16 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: pkm_level2_converter
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.0
4
+ version: 0.3.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Francis Doege
8
- autorequire:
8
+ autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2023-01-26 00:00:00.000000000 Z
12
- dependencies:
13
- - !ruby/object:Gem::Dependency
14
- name: nokogiri
15
- requirement: !ruby/object:Gem::Requirement
16
- requirements:
17
- - - "~>"
18
- - !ruby/object:Gem::Version
19
- version: 1.10.4
20
- type: :runtime
21
- prerelease: false
22
- version_requirements: !ruby/object:Gem::Requirement
23
- requirements:
24
- - - "~>"
25
- - !ruby/object:Gem::Version
26
- version: 1.10.4
27
- - !ruby/object:Gem::Dependency
28
- name: rspec
29
- requirement: !ruby/object:Gem::Requirement
30
- requirements:
31
- - - "~>"
32
- - !ruby/object:Gem::Version
33
- version: '3.2'
34
- type: :development
35
- prerelease: false
36
- version_requirements: !ruby/object:Gem::Requirement
37
- requirements:
38
- - - "~>"
39
- - !ruby/object:Gem::Version
40
- version: '3.2'
41
- description:
11
+ date: 2023-07-21 00:00:00.000000000 Z
12
+ dependencies: []
13
+ description:
42
14
  email:
43
15
  - hello@francisdoege.com
44
16
  executables:
@@ -49,6 +21,8 @@ files:
49
21
  - ".gitignore"
50
22
  - ".rspec"
51
23
  - ".rspec_status"
24
+ - ".rubocop.yml"
25
+ - ".ruby-version"
52
26
  - Gemfile
53
27
  - Gemfile.lock
54
28
  - LICENSE.txt
@@ -64,6 +38,10 @@ files:
64
38
  - lib/pkm_level2_converter/ka/pkm/2/XML-Schema_PKM.xsd.MD5
65
39
  - lib/pkm_level2_converter/ka/pkm/2/XML-Schema_PKM_TX.xsd
66
40
  - lib/pkm_level2_converter/ka/pkm/2/XML-Schema_PKM_TX.xsd.MD5
41
+ - lib/pkm_level2_converter/pkm.rb
42
+ - lib/pkm_level2_converter/pkm_xml.rb
43
+ - lib/pkm_level2_converter/pools.rb
44
+ - lib/pkm_level2_converter/types.rb
67
45
  - lib/pkm_level2_converter/version.rb
68
46
  - pkm_level2_converter.gemspec
69
47
  homepage: https://rubygems.org/gems/pkm_level2_converter
@@ -72,7 +50,8 @@ licenses:
72
50
  metadata:
73
51
  homepage_uri: https://rubygems.org/gems/pkm_level2_converter
74
52
  source_code_uri: https://github.com/justusjonas74/pkm_level2_converter
75
- post_install_message:
53
+ rubygems_mfa_required: 'true'
54
+ post_install_message:
76
55
  rdoc_options: []
77
56
  require_paths:
78
57
  - lib
@@ -80,15 +59,15 @@ required_ruby_version: !ruby/object:Gem::Requirement
80
59
  requirements:
81
60
  - - ">="
82
61
  - !ruby/object:Gem::Version
83
- version: 2.4.0
62
+ version: 3.2.2
84
63
  required_rubygems_version: !ruby/object:Gem::Requirement
85
64
  requirements:
86
65
  - - ">="
87
66
  - !ruby/object:Gem::Version
88
67
  version: '0'
89
68
  requirements: []
90
- rubygems_version: 3.3.7
91
- signing_key:
69
+ rubygems_version: 3.4.16
70
+ signing_key:
92
71
  specification_version: 4
93
72
  summary: Converts PKM modules for testing
94
73
  test_files: []