proformaxml 1.0.0 → 1.1.0
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 +4 -4
- data/.rubocop/factory-bot.yml +5 -0
- data/.rubocop/rspec.yml +8 -0
- data/.rubocop.yml +1 -4
- data/Gemfile +0 -1
- data/Gemfile.lock +13 -14
- data/lib/proformaxml/helpers/export_helpers.rb +12 -36
- data/lib/proformaxml/helpers/import_helpers.rb +9 -19
- data/lib/proformaxml/services/exporter.rb +3 -9
- data/lib/proformaxml/services/importer.rb +3 -8
- data/lib/proformaxml/version.rb +1 -1
- data/proformaxml.gemspec +1 -1
- metadata +5 -4
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 81e1724c3c9498d52025b18b5f3e2830fa10c499bcc9a064470f265d6ed9ba34
|
|
4
|
+
data.tar.gz: 4b7499f6e605ba8dae8ad23e149a06e7e78fa08f91a14f3e8803e70140b02cdc
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: c47047c96d5fb1c23233c67bd165a6b088e643bc9b6032c8107afd1e32d8d3cb9c4d2342661bd0b5b2b9da38fee368a058dc2fdfa2aabd34889f49c3e9817c21
|
|
7
|
+
data.tar.gz: 18e38170e845ad6e148ce0de1f621e57c3b360a19c7e3a875d8be90e1dfaf94fc085aacdd18ab16d6a587116261426e1f6de6939a351d5fdb0a683e218c7ed1d
|
data/.rubocop/rspec.yml
CHANGED
data/.rubocop.yml
CHANGED
|
@@ -5,6 +5,7 @@ require:
|
|
|
5
5
|
- rubocop-rspec
|
|
6
6
|
|
|
7
7
|
inherit_from:
|
|
8
|
+
- .rubocop/factory-bot.yml
|
|
8
9
|
- .rubocop/layout.yml
|
|
9
10
|
- .rubocop/lint.yml
|
|
10
11
|
- .rubocop/metrics.yml
|
|
@@ -24,7 +25,3 @@ AllCops:
|
|
|
24
25
|
- 'tmp/**/*'
|
|
25
26
|
- 'out/**/*'
|
|
26
27
|
- 'coverage/**/*'
|
|
27
|
-
|
|
28
|
-
RSpec/FilePath:
|
|
29
|
-
CustomTransform:
|
|
30
|
-
ProformaXML: proformaxml
|
data/Gemfile
CHANGED
data/Gemfile.lock
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
PATH
|
|
2
2
|
remote: .
|
|
3
3
|
specs:
|
|
4
|
-
proformaxml (1.
|
|
4
|
+
proformaxml (1.1.0)
|
|
5
5
|
activemodel (>= 5.2.3, < 8.0.0)
|
|
6
6
|
activesupport (>= 5.2.3, < 8.0.0)
|
|
7
|
-
dachsfisch (>= 0.
|
|
7
|
+
dachsfisch (>= 0.2.0, < 1.0.0)
|
|
8
8
|
nokogiri (>= 1.10.2, < 2.0.0)
|
|
9
9
|
rubyzip (>= 1.2.2, < 3.0.0)
|
|
10
10
|
|
|
@@ -23,15 +23,15 @@ GEM
|
|
|
23
23
|
byebug (11.1.3)
|
|
24
24
|
coderay (1.1.3)
|
|
25
25
|
concurrent-ruby (1.2.2)
|
|
26
|
-
dachsfisch (0.
|
|
26
|
+
dachsfisch (0.2.0)
|
|
27
27
|
nokogiri (>= 1.14.1, < 2.0.0)
|
|
28
28
|
diff-lcs (1.5.0)
|
|
29
29
|
docile (1.4.0)
|
|
30
30
|
factory_bot (6.3.0)
|
|
31
31
|
activesupport (>= 5.0.0)
|
|
32
|
-
ffi (1.
|
|
32
|
+
ffi (1.16.1)
|
|
33
33
|
formatador (1.1.0)
|
|
34
|
-
guard (2.18.
|
|
34
|
+
guard (2.18.1)
|
|
35
35
|
formatador (>= 0.2.4)
|
|
36
36
|
listen (>= 2.7, < 4.0)
|
|
37
37
|
lumberjack (>= 1.0.12, < 2.0)
|
|
@@ -86,7 +86,7 @@ GEM
|
|
|
86
86
|
rspec-core (~> 3.12.0)
|
|
87
87
|
rspec-expectations (~> 3.12.0)
|
|
88
88
|
rspec-mocks (~> 3.12.0)
|
|
89
|
-
rspec-collection_matchers (1.2.
|
|
89
|
+
rspec-collection_matchers (1.2.1)
|
|
90
90
|
rspec-expectations (>= 2.99.0.beta1)
|
|
91
91
|
rspec-core (3.12.2)
|
|
92
92
|
rspec-support (~> 3.12.0)
|
|
@@ -99,7 +99,7 @@ GEM
|
|
|
99
99
|
diff-lcs (>= 1.2.0, < 2.0)
|
|
100
100
|
rspec-support (~> 3.12.0)
|
|
101
101
|
rspec-support (3.12.1)
|
|
102
|
-
rubocop (1.56.
|
|
102
|
+
rubocop (1.56.4)
|
|
103
103
|
base64 (~> 0.1.1)
|
|
104
104
|
json (~> 2.3)
|
|
105
105
|
language_server-protocol (>= 3.17.0)
|
|
@@ -113,18 +113,18 @@ GEM
|
|
|
113
113
|
unicode-display_width (>= 2.4.0, < 3.0)
|
|
114
114
|
rubocop-ast (1.29.0)
|
|
115
115
|
parser (>= 3.2.1.0)
|
|
116
|
-
rubocop-capybara (2.
|
|
116
|
+
rubocop-capybara (2.19.0)
|
|
117
117
|
rubocop (~> 1.41)
|
|
118
|
-
rubocop-factory_bot (2.
|
|
118
|
+
rubocop-factory_bot (2.24.0)
|
|
119
119
|
rubocop (~> 1.33)
|
|
120
|
-
rubocop-performance (1.19.
|
|
120
|
+
rubocop-performance (1.19.1)
|
|
121
121
|
rubocop (>= 1.7.0, < 2.0)
|
|
122
122
|
rubocop-ast (>= 0.4.0)
|
|
123
|
-
rubocop-rails (2.
|
|
123
|
+
rubocop-rails (2.21.2)
|
|
124
124
|
activesupport (>= 4.2.0)
|
|
125
125
|
rack (>= 1.1)
|
|
126
126
|
rubocop (>= 1.33.0, < 2.0)
|
|
127
|
-
rubocop-rspec (2.
|
|
127
|
+
rubocop-rspec (2.24.1)
|
|
128
128
|
rubocop (~> 1.33)
|
|
129
129
|
rubocop-capybara (~> 2.17)
|
|
130
130
|
rubocop-factory_bot (~> 2.22)
|
|
@@ -140,7 +140,7 @@ GEM
|
|
|
140
140
|
thor (1.2.2)
|
|
141
141
|
tzinfo (2.0.6)
|
|
142
142
|
concurrent-ruby (~> 1.0)
|
|
143
|
-
unicode-display_width (2.
|
|
143
|
+
unicode-display_width (2.5.0)
|
|
144
144
|
|
|
145
145
|
PLATFORMS
|
|
146
146
|
ruby
|
|
@@ -158,7 +158,6 @@ DEPENDENCIES
|
|
|
158
158
|
rspec-collection_matchers
|
|
159
159
|
rspec-github
|
|
160
160
|
rubocop
|
|
161
|
-
rubocop-factory_bot
|
|
162
161
|
rubocop-performance
|
|
163
162
|
rubocop-rails
|
|
164
163
|
rubocop-rspec
|
|
@@ -27,55 +27,31 @@ module ProformaXML
|
|
|
27
27
|
xml.send(:'test-configuration') do
|
|
28
28
|
add_filerefs(xml, test) if test.files
|
|
29
29
|
add_dachsfisch_node(xml, test.configuration)
|
|
30
|
-
|
|
31
|
-
xml.send(:'test-meta-data') do
|
|
32
|
-
meta_data(xml, test.meta_data)
|
|
33
|
-
end
|
|
34
|
-
end
|
|
30
|
+
add_dachsfisch_node(xml, test.meta_data)
|
|
35
31
|
end
|
|
36
32
|
end
|
|
37
33
|
|
|
38
|
-
def
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
# underscore is used to disambiguate tag names from ruby methods
|
|
43
|
-
xml[namespace].send("#{key}_") do |meta_data_xml|
|
|
44
|
-
inner_meta_data(meta_data_xml, namespace, value)
|
|
45
|
-
end
|
|
46
|
-
else
|
|
47
|
-
xml[namespace].send("#{key}_", value)
|
|
48
|
-
end
|
|
34
|
+
def add_dachsfisch_node(xml, dachsfisch_node, node_name_fallback = nil)
|
|
35
|
+
if dachsfisch_node.blank?
|
|
36
|
+
xml.send(node_name_fallback, '') if node_name_fallback.present?
|
|
37
|
+
return
|
|
49
38
|
end
|
|
50
|
-
end
|
|
51
|
-
|
|
52
|
-
def meta_data(xml, meta_data)
|
|
53
|
-
meta_data.each do |namespace, data|
|
|
54
|
-
inner_meta_data(xml, namespace, data)
|
|
55
|
-
end
|
|
56
|
-
end
|
|
57
|
-
|
|
58
|
-
def add_dachsfisch_node(xml, dachsfisch_node)
|
|
59
|
-
return if dachsfisch_node.nil?
|
|
60
|
-
|
|
61
39
|
xml_snippet = Dachsfisch::JSON2XMLConverter.perform(json: dachsfisch_node.to_json)
|
|
62
|
-
dachsfisch_node
|
|
63
|
-
xml.doc.root.add_namespace(namespace[0], namespace[1]) unless namespace[0] == '$'
|
|
64
|
-
end
|
|
40
|
+
add_namespaces_for_dachsfisch_node(dachsfisch_node, xml)
|
|
65
41
|
|
|
66
42
|
xml << xml_snippet
|
|
67
43
|
end
|
|
68
44
|
|
|
69
|
-
def add_namespaces_to_header(header, custom_namespaces)
|
|
70
|
-
custom_namespaces.each do |namespace|
|
|
71
|
-
header["xmlns:#{namespace[:prefix]}"] = namespace[:uri]
|
|
72
|
-
end
|
|
73
|
-
end
|
|
74
|
-
|
|
75
45
|
def add_parent_uuid_and_lang_to_header(header)
|
|
76
46
|
header['lang'] = @task.language if @task.language.present?
|
|
77
47
|
header['parent-uuid'] = @task.parent_uuid if @task.parent_uuid.present?
|
|
78
48
|
end
|
|
49
|
+
|
|
50
|
+
def add_namespaces_for_dachsfisch_node(dachsfisch_node, xml)
|
|
51
|
+
dachsfisch_node.flat_map {|_, val| val['@xmlns'].to_a }.uniq.each do |namespace|
|
|
52
|
+
xml.doc.root.add_namespace(namespace[0], namespace[1]) unless namespace[0] == '$'
|
|
53
|
+
end
|
|
54
|
+
end
|
|
79
55
|
end
|
|
80
56
|
end
|
|
81
57
|
end
|
|
@@ -60,7 +60,7 @@ module ProformaXML
|
|
|
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
62
|
meta_data_node = test_node.xpath('xmlns:test-configuration').xpath('xmlns:test-meta-data')
|
|
63
|
-
test.meta_data =
|
|
63
|
+
test.meta_data = convert_xml_node_to_json(meta_data_node) if meta_data_node.present?
|
|
64
64
|
end
|
|
65
65
|
|
|
66
66
|
def extra_configuration_from_test_configuration(test_configuration_node)
|
|
@@ -78,32 +78,22 @@ module ProformaXML
|
|
|
78
78
|
files_from_filerefs(test_configuration_node.search('filerefs'))
|
|
79
79
|
end
|
|
80
80
|
|
|
81
|
-
def meta_data(any_data_node, use_namespace: false)
|
|
82
|
-
# use_namespace forces the use of the namespace as hash key - it should only be used at the entry of the recursion
|
|
83
|
-
{}.tap do |any_data|
|
|
84
|
-
any_data_node.children.each do |node|
|
|
85
|
-
key = (use_namespace ? node.namespace.prefix : any_data_node.name).to_sym
|
|
86
|
-
any_data[key] = if node.node_type == Nokogiri::XML::Node::TEXT_NODE
|
|
87
|
-
node.text
|
|
88
|
-
else
|
|
89
|
-
# preserve any existing data in the nested hash
|
|
90
|
-
(any_data[key] || {}).merge meta_data(node)
|
|
91
|
-
end
|
|
92
|
-
end
|
|
93
|
-
end
|
|
94
|
-
end
|
|
95
|
-
|
|
96
81
|
private
|
|
97
82
|
|
|
98
83
|
def convert_xml_node_to_json(any_node)
|
|
99
84
|
xml_snippet = Nokogiri::XML::DocumentFragment.new(Nokogiri::XML::Document.new, any_node)
|
|
100
|
-
|
|
101
|
-
xml_snippet.children.first.add_namespace_definition(
|
|
102
|
-
any_node.namespace.href)
|
|
85
|
+
all_namespaces(any_node).each do |namespace|
|
|
86
|
+
xml_snippet.children.first.add_namespace_definition(namespace[:prefix], namespace[:href])
|
|
103
87
|
end
|
|
104
88
|
JSON.parse(Dachsfisch::XML2JSONConverter.perform(xml: xml_snippet.to_xml))
|
|
105
89
|
end
|
|
106
90
|
|
|
91
|
+
def all_namespaces(node)
|
|
92
|
+
node.xpath('.|.//*').map(&:namespace).reject do |ns|
|
|
93
|
+
ns.prefix.nil?
|
|
94
|
+
end.map {|ns| {prefix: ns.prefix, href: ns.href} }.uniq
|
|
95
|
+
end
|
|
96
|
+
|
|
107
97
|
def value_from_node(name, node, attribute)
|
|
108
98
|
xml_name = name.is_a?(Array) ? name[0] : name
|
|
109
99
|
attribute ? node.attribute(xml_name)&.value : node.xpath("xmlns:#{xml_name}").text
|
|
@@ -6,10 +6,9 @@ module ProformaXML
|
|
|
6
6
|
class Exporter
|
|
7
7
|
include ProformaXML::Helpers::ExportHelpers
|
|
8
8
|
|
|
9
|
-
def initialize(task:,
|
|
9
|
+
def initialize(task:, version: nil)
|
|
10
10
|
@files = {}
|
|
11
11
|
@task = task
|
|
12
|
-
@custom_namespaces = custom_namespaces
|
|
13
12
|
@version = version || SCHEMA_VERSIONS.first
|
|
14
13
|
add_placeholders if @version == '2.0'
|
|
15
14
|
end
|
|
@@ -22,9 +21,9 @@ module ProformaXML
|
|
|
22
21
|
doc = Nokogiri::XML(xmldoc)
|
|
23
22
|
errors = validate(doc)
|
|
24
23
|
|
|
24
|
+
# File.binwrite('../testfile.zip', write_to_zip(xmldoc).string)
|
|
25
25
|
raise PostGenerateValidationError.new(errors) if errors.any?
|
|
26
26
|
|
|
27
|
-
# File.binwrite('../testfile.zip', write_to_zip(xmldoc).string)
|
|
28
27
|
write_to_zip(xmldoc)
|
|
29
28
|
end
|
|
30
29
|
|
|
@@ -38,7 +37,7 @@ module ProformaXML
|
|
|
38
37
|
xml.proglang({version: @task.proglang&.dig(:version)}, @task.proglang&.dig(:name))
|
|
39
38
|
|
|
40
39
|
add_objects_to_xml(xml)
|
|
41
|
-
|
|
40
|
+
add_dachsfisch_node(xml, @task.meta_data, 'meta-data')
|
|
42
41
|
end
|
|
43
42
|
end
|
|
44
43
|
|
|
@@ -46,10 +45,6 @@ module ProformaXML
|
|
|
46
45
|
xml.send(:'internal-description', internal_description) if internal_description.present?
|
|
47
46
|
end
|
|
48
47
|
|
|
49
|
-
def add_meta_data(xml)
|
|
50
|
-
xml.send(:'meta-data') { meta_data(xml, @task.meta_data) }
|
|
51
|
-
end
|
|
52
|
-
|
|
53
48
|
def add_objects_to_xml(xml)
|
|
54
49
|
add_dachsfisch_node(xml, @task.submission_restrictions)
|
|
55
50
|
xml.files { files(xml) }
|
|
@@ -117,7 +112,6 @@ module ProformaXML
|
|
|
117
112
|
'xmlns' => "urn:proforma:v#{@version}",
|
|
118
113
|
'uuid' => @task.uuid,
|
|
119
114
|
}.tap do |header|
|
|
120
|
-
add_namespaces_to_header(header, @custom_namespaces)
|
|
121
115
|
add_parent_uuid_and_lang_to_header(header)
|
|
122
116
|
end
|
|
123
117
|
end
|
|
@@ -26,7 +26,7 @@ module ProformaXML
|
|
|
26
26
|
@task_node = @doc.xpath('/xmlns:task')
|
|
27
27
|
|
|
28
28
|
set_data
|
|
29
|
-
|
|
29
|
+
@task
|
|
30
30
|
end
|
|
31
31
|
|
|
32
32
|
private
|
|
@@ -38,7 +38,6 @@ module ProformaXML
|
|
|
38
38
|
end
|
|
39
39
|
|
|
40
40
|
def set_data
|
|
41
|
-
set_namespaces
|
|
42
41
|
set_base_data
|
|
43
42
|
set_files
|
|
44
43
|
set_model_solutions
|
|
@@ -47,10 +46,6 @@ module ProformaXML
|
|
|
47
46
|
set_extra_data
|
|
48
47
|
end
|
|
49
48
|
|
|
50
|
-
def set_namespaces
|
|
51
|
-
@custom_namespaces = @doc.namespaces.except('xmlns').map {|k, v| {prefix: k[6..], uri: v} }
|
|
52
|
-
end
|
|
53
|
-
|
|
54
49
|
def set_base_data
|
|
55
50
|
set_value_from_xml(object: @task, node: @task_node, name: 'title')
|
|
56
51
|
set_value_from_xml(object: @task, node: @task_node, name: 'description')
|
|
@@ -83,8 +78,8 @@ module ProformaXML
|
|
|
83
78
|
end
|
|
84
79
|
|
|
85
80
|
def set_meta_data
|
|
86
|
-
meta_data_node = @task_node.xpath('xmlns:meta-data')
|
|
87
|
-
@task.meta_data =
|
|
81
|
+
meta_data_node = @task_node.xpath('xmlns:meta-data').first
|
|
82
|
+
@task.meta_data = convert_xml_node_to_json(meta_data_node) if meta_data_node.text.present?
|
|
88
83
|
end
|
|
89
84
|
|
|
90
85
|
def set_extra_data
|
data/lib/proformaxml/version.rb
CHANGED
data/proformaxml.gemspec
CHANGED
|
@@ -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.
|
|
32
|
+
spec.add_dependency 'dachsfisch', '>= 0.2.0', '< 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.
|
|
4
|
+
version: 1.1.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-
|
|
11
|
+
date: 2023-10-03 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: activemodel
|
|
@@ -56,7 +56,7 @@ dependencies:
|
|
|
56
56
|
requirements:
|
|
57
57
|
- - ">="
|
|
58
58
|
- !ruby/object:Gem::Version
|
|
59
|
-
version: 0.
|
|
59
|
+
version: 0.2.0
|
|
60
60
|
- - "<"
|
|
61
61
|
- !ruby/object:Gem::Version
|
|
62
62
|
version: 1.0.0
|
|
@@ -66,7 +66,7 @@ dependencies:
|
|
|
66
66
|
requirements:
|
|
67
67
|
- - ">="
|
|
68
68
|
- !ruby/object:Gem::Version
|
|
69
|
-
version: 0.
|
|
69
|
+
version: 0.2.0
|
|
70
70
|
- - "<"
|
|
71
71
|
- !ruby/object:Gem::Version
|
|
72
72
|
version: 1.0.0
|
|
@@ -119,6 +119,7 @@ extra_rdoc_files: []
|
|
|
119
119
|
files:
|
|
120
120
|
- ".rspec"
|
|
121
121
|
- ".rubocop.yml"
|
|
122
|
+
- ".rubocop/factory-bot.yml"
|
|
122
123
|
- ".rubocop/layout.yml"
|
|
123
124
|
- ".rubocop/lint.yml"
|
|
124
125
|
- ".rubocop/metrics.yml"
|