proformaxml 0.10.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -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: []