proformaxml 0.10.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.
@@ -0,0 +1,52 @@
1
+ # frozen_string_literal: true
2
+
3
+ module ProformaXML
4
+ class Validator
5
+ def initialize(doc, expected_version = nil)
6
+ @doc = doc
7
+ @expected_version = expected_version
8
+ end
9
+
10
+ def perform
11
+ validate
12
+ end
13
+
14
+ private
15
+
16
+ def doc_schema_version
17
+ @doc_schema_version ||= /^urn:proforma:v(.*)$/.match(@doc.namespaces['xmlns'])&.captures&.dig(0)
18
+ end
19
+
20
+ def node_as_doc_with_namespace(config_node)
21
+ doc = Nokogiri::XML::Document.new
22
+ doc.add_child(config_node.dup)
23
+ doc
24
+ end
25
+
26
+ def validate
27
+ return ['no proformaxml version found'] if doc_schema_version.nil?
28
+
29
+ version = @expected_version || doc_schema_version
30
+ return ['version not supported'] unless SCHEMA_VERSIONS.include? version
31
+
32
+ # Both validations return an array of errors, which are empty if the validation was successful.
33
+ validate_task(version) + validate_test_configuration
34
+ end
35
+
36
+ def validate_task(version)
37
+ Nokogiri::XML::Schema(File.open(SCHEMA_FORMAT_PATH % version)).validate(@doc)
38
+ end
39
+
40
+ def validate_test_configuration
41
+ @doc.xpath('/xmlns:task/xmlns:tests/xmlns:test/xmlns:test-configuration').flat_map do |test_config|
42
+ test_config.children.flat_map do |config_node|
43
+ next [] unless config_node.namespace&.href&.start_with?('urn:proforma:tests:')
44
+ next [] unless TEST_TYPE_SCHEMA_NAMES.include? config_node.name
45
+
46
+ schema = Nokogiri::XML::Schema(File.read(SCHEMA_FORMAT_PATH % config_node.name))
47
+ schema.validate(node_as_doc_with_namespace(config_node))
48
+ end
49
+ end
50
+ end
51
+ end
52
+ end
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ module ProformaXML
4
+ VERSION = '0.10.0'
5
+ end
@@ -0,0 +1,24 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'active_model'
4
+ require 'nokogiri'
5
+ require 'zip'
6
+ require 'base64'
7
+ require 'securerandom'
8
+ require 'dachsfisch'
9
+
10
+ require 'proformaxml/version'
11
+
12
+ require 'proformaxml/services/importer'
13
+ require 'proformaxml/services/exporter'
14
+ require 'proformaxml/services/validator'
15
+ require 'proformaxml/models/task'
16
+
17
+ module ProformaXML
18
+ SCHEMA_PATH = File.join(File.dirname(File.expand_path(__FILE__)), '../assets/schemas')
19
+ SCHEMA_FORMAT_PATH = "#{SCHEMA_PATH}/proforma-%s.xsd".freeze
20
+ SCHEMA_VERSIONS = %w[2.1 2.0].freeze
21
+
22
+ TEST_TYPE_SCHEMA_NAMES = %w[java-checkstyle regexptest unittest].freeze
23
+ MAX_EMBEDDED_FILE_SIZE_KB = 50
24
+ end
@@ -0,0 +1,37 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'lib/proformaxml/version'
4
+
5
+ Gem::Specification.new do |spec|
6
+ spec.name = 'proformaxml'
7
+ spec.version = ProformaXML::VERSION
8
+ spec.authors = ['Karol']
9
+ spec.email = ['git@koehn.pro']
10
+
11
+ spec.summary = 'Implements parts of ProFormA-XML specification'
12
+ spec.description = 'Offers datastructure and (de)serializer according to ProFormA-XML specification.'
13
+ spec.homepage = 'https://github.com/openHPI/proformaxml'
14
+ spec.license = 'MIT'
15
+
16
+ spec.required_ruby_version = '>= 3.2'
17
+
18
+ # Specify which files should be added to the gem when it is released.
19
+ # The `git ls-files -z` loads the files in the RubyGem that have been added into git.
20
+ spec.files = Dir.chdir(__dir__) do
21
+ `git ls-files -z`.split("\x0").reject do |f|
22
+ (f == __FILE__) || f.match(%r{\A(?:(?:bin|test|spec|features)/|\.(?:git|circleci)|appveyor)})
23
+ end
24
+ end
25
+
26
+ spec.bindir = 'exe'
27
+ spec.executables = spec.files.grep(%r{\Aexe/}) {|f| File.basename(f) }
28
+ spec.require_paths = ['lib']
29
+
30
+ spec.add_dependency 'activemodel', '>= 5.2.3', '< 8.0.0'
31
+ spec.add_dependency 'activesupport', '>= 5.2.3', '< 8.0.0'
32
+ spec.add_dependency 'dachsfisch', '>= 0.1.0', '< 1.0.0'
33
+ spec.add_dependency 'nokogiri', '>= 1.10.2', '< 2.0.0'
34
+ spec.add_dependency 'rubyzip', '>= 1.2.2', '< 3.0.0'
35
+
36
+ spec.metadata['rubygems_mfa_required'] = 'true'
37
+ end
metadata ADDED
@@ -0,0 +1,179 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: proformaxml
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.10.0
5
+ platform: ruby
6
+ authors:
7
+ - Karol
8
+ autorequire:
9
+ bindir: exe
10
+ cert_chain: []
11
+ date: 2023-08-22 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: activemodel
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: 5.2.3
20
+ - - "<"
21
+ - !ruby/object:Gem::Version
22
+ version: 8.0.0
23
+ type: :runtime
24
+ prerelease: false
25
+ version_requirements: !ruby/object:Gem::Requirement
26
+ requirements:
27
+ - - ">="
28
+ - !ruby/object:Gem::Version
29
+ version: 5.2.3
30
+ - - "<"
31
+ - !ruby/object:Gem::Version
32
+ version: 8.0.0
33
+ - !ruby/object:Gem::Dependency
34
+ name: activesupport
35
+ requirement: !ruby/object:Gem::Requirement
36
+ requirements:
37
+ - - ">="
38
+ - !ruby/object:Gem::Version
39
+ version: 5.2.3
40
+ - - "<"
41
+ - !ruby/object:Gem::Version
42
+ version: 8.0.0
43
+ type: :runtime
44
+ prerelease: false
45
+ version_requirements: !ruby/object:Gem::Requirement
46
+ requirements:
47
+ - - ">="
48
+ - !ruby/object:Gem::Version
49
+ version: 5.2.3
50
+ - - "<"
51
+ - !ruby/object:Gem::Version
52
+ version: 8.0.0
53
+ - !ruby/object:Gem::Dependency
54
+ name: dachsfisch
55
+ requirement: !ruby/object:Gem::Requirement
56
+ requirements:
57
+ - - ">="
58
+ - !ruby/object:Gem::Version
59
+ version: 0.1.0
60
+ - - "<"
61
+ - !ruby/object:Gem::Version
62
+ version: 1.0.0
63
+ type: :runtime
64
+ prerelease: false
65
+ version_requirements: !ruby/object:Gem::Requirement
66
+ requirements:
67
+ - - ">="
68
+ - !ruby/object:Gem::Version
69
+ version: 0.1.0
70
+ - - "<"
71
+ - !ruby/object:Gem::Version
72
+ version: 1.0.0
73
+ - !ruby/object:Gem::Dependency
74
+ name: nokogiri
75
+ requirement: !ruby/object:Gem::Requirement
76
+ requirements:
77
+ - - ">="
78
+ - !ruby/object:Gem::Version
79
+ version: 1.10.2
80
+ - - "<"
81
+ - !ruby/object:Gem::Version
82
+ version: 2.0.0
83
+ type: :runtime
84
+ prerelease: false
85
+ version_requirements: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ">="
88
+ - !ruby/object:Gem::Version
89
+ version: 1.10.2
90
+ - - "<"
91
+ - !ruby/object:Gem::Version
92
+ version: 2.0.0
93
+ - !ruby/object:Gem::Dependency
94
+ name: rubyzip
95
+ requirement: !ruby/object:Gem::Requirement
96
+ requirements:
97
+ - - ">="
98
+ - !ruby/object:Gem::Version
99
+ version: 1.2.2
100
+ - - "<"
101
+ - !ruby/object:Gem::Version
102
+ version: 3.0.0
103
+ type: :runtime
104
+ prerelease: false
105
+ version_requirements: !ruby/object:Gem::Requirement
106
+ requirements:
107
+ - - ">="
108
+ - !ruby/object:Gem::Version
109
+ version: 1.2.2
110
+ - - "<"
111
+ - !ruby/object:Gem::Version
112
+ version: 3.0.0
113
+ description: Offers datastructure and (de)serializer according to ProFormA-XML specification.
114
+ email:
115
+ - git@koehn.pro
116
+ executables: []
117
+ extensions: []
118
+ extra_rdoc_files: []
119
+ files:
120
+ - ".rspec"
121
+ - ".rubocop.yml"
122
+ - ".rubocop/layout.yml"
123
+ - ".rubocop/lint.yml"
124
+ - ".rubocop/metrics.yml"
125
+ - ".rubocop/rails.yml"
126
+ - ".rubocop/rspec.yml"
127
+ - ".rubocop/style.yml"
128
+ - CODE_OF_CONDUCT.md
129
+ - Gemfile
130
+ - Gemfile.lock
131
+ - Guardfile
132
+ - LICENSE.txt
133
+ - README.md
134
+ - Rakefile
135
+ - SECURITY.md
136
+ - assets/schemas/proforma-2.0.xsd
137
+ - assets/schemas/proforma-2.1.xsd
138
+ - assets/schemas/proforma-java-checkstyle.xsd
139
+ - assets/schemas/proforma-regexptest.xsd
140
+ - assets/schemas/proforma-unittest.xsd
141
+ - lib/proformaxml.rb
142
+ - lib/proformaxml/errors.rb
143
+ - lib/proformaxml/helpers/export_helpers.rb
144
+ - lib/proformaxml/helpers/import_helpers.rb
145
+ - lib/proformaxml/models/base.rb
146
+ - lib/proformaxml/models/model_solution.rb
147
+ - lib/proformaxml/models/task.rb
148
+ - lib/proformaxml/models/task_file.rb
149
+ - lib/proformaxml/models/test.rb
150
+ - lib/proformaxml/services/exporter.rb
151
+ - lib/proformaxml/services/importer.rb
152
+ - lib/proformaxml/services/validator.rb
153
+ - lib/proformaxml/version.rb
154
+ - proformaxml.gemspec
155
+ homepage: https://github.com/openHPI/proformaxml
156
+ licenses:
157
+ - MIT
158
+ metadata:
159
+ rubygems_mfa_required: 'true'
160
+ post_install_message:
161
+ rdoc_options: []
162
+ require_paths:
163
+ - lib
164
+ required_ruby_version: !ruby/object:Gem::Requirement
165
+ requirements:
166
+ - - ">="
167
+ - !ruby/object:Gem::Version
168
+ version: '3.2'
169
+ required_rubygems_version: !ruby/object:Gem::Requirement
170
+ requirements:
171
+ - - ">="
172
+ - !ruby/object:Gem::Version
173
+ version: '0'
174
+ requirements: []
175
+ rubygems_version: 3.4.19
176
+ signing_key:
177
+ specification_version: 4
178
+ summary: Implements parts of ProFormA-XML specification
179
+ test_files: []