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.
data/README.md ADDED
@@ -0,0 +1,212 @@
1
+ # ProformaXML
2
+
3
+ [![Build Status](https://github.com/openHPI/proformaxml/workflows/CI/badge.svg)](https://github.com/openHPI/proformaxml/actions?query=workflow%3ACI)
4
+ [![codecov](https://codecov.io/gh/openHPI/proformaxml/branch/main/graph/badge.svg?token=n1rDXnCezH)](https://codecov.io/gh/openHPI/proformaxml)
5
+
6
+ This gem offers a Ruby implementation of the [ProFormA XML standard](https://github.com/ProFormA/proformaxml), an XML exchange format for programming exercises. This gem includes a datastructure and XML-(de)serializer.
7
+
8
+ ## Installation
9
+
10
+ Add these lines to your application's Gemfile:
11
+
12
+ ```ruby
13
+ gem 'proformaxml'
14
+ ```
15
+
16
+ And then execute:
17
+
18
+ ```
19
+ $ bundle
20
+ ```
21
+
22
+ Note: Removing support for ancient Ruby or Rails versions will not result in a new major. Please be extra careful when using ancient Ruby or Rails versions and updating gems.
23
+
24
+ ## Usage
25
+
26
+ Create Task
27
+
28
+ ```ruby
29
+ task = ProformaXML::Task.new(title: 'title')
30
+ ```
31
+ Call Exporter to serialize to XML.
32
+
33
+ ```ruby
34
+ ProformaXML::Exporter.new(task: task).perform
35
+ ```
36
+ It returns a StringIO of a zip-file which includes the XML and any external files (TaskFiles will be saved in the XML up to a size of 50kb, anything larger will be its own file in the zip)
37
+ `ProformaXML::Exporter` has the following optional parameters:
38
+ - `custom_namespaces`: expects an array with hashes with the following attributes:
39
+ - `prefix`
40
+ - `uri`
41
+ - `version`: sets the ProFormA version of the generated XML
42
+
43
+ Call Importer to deserialize from XML
44
+
45
+ ```ruby
46
+ result = ProformaXML::Importer.new(zip: zip_file).perform
47
+ task = result[:task]
48
+ custom_namespaces = result[:custom_namespaces]
49
+ ```
50
+ the `zip_file` has to be openable by `Zip::File.open(zip: zip.path)`, otherwise `ProformaXML::InvalidZip` will be raised
51
+ `ProformaXML::Importer` has the following optional parameter:
52
+ - `expected_version`: if the version of the XML doesn't match this value `ProformaXML::InvalidZip` will be raised
53
+
54
+ ## Example
55
+
56
+ ```ruby
57
+ ProformaXML::Task.new(
58
+ title: 'title',
59
+ description: 'description',
60
+ internal_description: 'internal_description',
61
+ proglang: {name: 'proglang_name', version: '123'},
62
+ meta_data: {
63
+ CodeOcean: {
64
+ meta_data_key: 'meta_data_content',
65
+ secrets: {
66
+ server_key: 'the key',
67
+ other_key: 'another key'
68
+ }
69
+ }
70
+ },
71
+ files: [
72
+ ProformaXML::TaskFile.new(
73
+ id: 'file_id_1',
74
+ content: 'public static fileContent(){}',
75
+ filename: 'file_content.java',
76
+ used_by_grader: false,
77
+ visible: 'delayed',
78
+ usage_by_lms: 'edit',
79
+ binary: false,
80
+ internal_description: 'internal_description',
81
+ mimetype: 'text/plain'
82
+ ),
83
+ ProformaXML::TaskFile.new(
84
+ id: 'file_id_2',
85
+ content: 'BINARY IMAGE CONTENT',
86
+ filename: 'image.jpg',
87
+ used_by_grader: false,
88
+ visible: 'yes',
89
+ usage_by_lms: 'display',
90
+ binary: true,
91
+ internal_description: 'internal_description',
92
+ mimetype: 'image/jpeg'
93
+ )
94
+ ],
95
+ tests: [
96
+ ProformaXML::Test.new(
97
+ id: 'test_id_1',
98
+ title: 'test title',
99
+ files: [
100
+ ProformaXML::TaskFile.new(
101
+ id: 'test_file_1',
102
+ content: 'public static assert123(){}',
103
+ filename: 'junit/assert123.java',
104
+ used_by_grader: true,
105
+ visible: 'no',
106
+ binary: false,
107
+ internal_description: 'internal_description',
108
+ )
109
+ ],
110
+ meta_data: {
111
+ CodeOcean: {
112
+ entry_point: 'junit/assert123.java'
113
+ }
114
+ }
115
+ )
116
+ ],
117
+ uuid: '2c8ee23e-fa98-4ea9-b6a5-9a0066ebac1f',
118
+ parent_uuid: 'abf097f5-0df0-468d-8ce4-13460c34cd3b',
119
+ language: 'de',
120
+ model_solutions: [
121
+ ProformaXML::ModelSolution.new(
122
+ id: 'model_solution_id_1',
123
+ files: [
124
+ ProformaXML::TaskFile.new(
125
+ id: 'model_solution_test_id_1',
126
+ content: 'public static fileContent(){ syso("A"); }',
127
+ filename: 'this_is_how_its_done.java',
128
+ used_by_grader: false,
129
+ usage_by_lms: 'display',
130
+ visible: 'delayed',
131
+ binary: false,
132
+ internal_description: 'internal_description'
133
+ )
134
+ ]
135
+ )
136
+ ],
137
+ )
138
+ ```
139
+ Generated XML from task above with `custom_namespaces: [{prefix: 'CodeOcean', uri: 'codeocean.openhpi.de'}]`
140
+ ```xml
141
+ <?xml version="1.0" encoding="UTF-8"?>
142
+ <task xmlns="urn:proforma:v2.0.1" xmlns:CodeOcean="codeocean.openhpi.de" uuid="2c8ee23e-fa98-4ea9-b6a5-9a0066ebac1f" lang="de" parent-uuid="abf097f5-0df0-468d-8ce4-13460c34cd3b">
143
+ <title>title</title>
144
+ <description>description</description>
145
+ <internal-description>internal_description</internal-description>
146
+ <proglang version="123">proglang_name</proglang>
147
+ <files>
148
+ <file id="file_id_1" used-by-grader="false" visible="delayed" usage-by-lms="edit" mimetype="text/plain">
149
+ <embedded-txt-file filename="file_content.java">public static fileContent(){}</embedded-txt-file>
150
+ <internal-description>internal_description</internal-description>
151
+ </file>
152
+ <file id="file_id_2" used-by-grader="false" visible="yes" usage-by-lms="display" mimetype="image/jpeg">
153
+ <embedded-bin-file filename="image.jpg">QklOQVJZIElNQUdFIENPTlRFTlQ=
154
+ </embedded-bin-file>
155
+ <internal-description>internal_description</internal-description>
156
+ </file>
157
+ <file id="model_solution_test_id_1" used-by-grader="false" visible="delayed" usage-by-lms="display">
158
+ <embedded-txt-file filename="this_is_how_its_done.java">public static fileContent(){ syso("A"); }</embedded-txt-file>
159
+ <internal-description>internal_description</internal-description>
160
+ </file>
161
+ <file id="test_file_1" used-by-grader="true" visible="no">
162
+ <embedded-txt-file filename="junit/assert123.java">public static assert123(){}</embedded-txt-file>
163
+ <internal-description>internal_description</internal-description>
164
+ </file>
165
+ </files>
166
+ <model-solutions>
167
+ <model-solution id="model_solution_id_1">
168
+ <filerefs>
169
+ <fileref refid="model_solution_test_id_1"/>
170
+ </filerefs>
171
+ </model-solution>
172
+ </model-solutions>
173
+ <tests>
174
+ <test id="test_id_1">
175
+ <title>test title</title>
176
+ <test-type/>
177
+ <test-configuration>
178
+ <filerefs>
179
+ <fileref refid="test_file_1"/>
180
+ </filerefs>
181
+ <test-meta-data>
182
+ <CodeOcean:entry_point>junit/assert123.java</CodeOcean:entry_point>
183
+ </test-meta-data>
184
+ </test-configuration>
185
+ </test>
186
+ </tests>
187
+ <meta-data>
188
+ <CodeOcean:meta_data_key>meta_data_content</CodeOcean:meta_data_key>
189
+ <CodeOcean:secrets>
190
+ <CodeOcean:server_key>the key</CodeOcean:server_key>
191
+ <CodeOcean:other_key>another key</CodeOcean:other_key>
192
+ </CodeOcean:secrets>
193
+ </meta-data>
194
+ </task>
195
+ ```
196
+ ## Development
197
+
198
+ After checking out the repo, run `bin/setup` to install dependencies. Then, run `bundle exec rspec` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
199
+
200
+ To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org).
201
+
202
+ ## Contributing
203
+
204
+ Bug reports and pull requests are welcome on GitHub at https://github.com/openHPI/proformaxml. This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the [code of conduct](https://github.com/openHPI/proformaxml/blob/main/CODE_OF_CONDUCT.md).
205
+
206
+ ## License
207
+
208
+ The gem is available as open source under the terms of the [MIT License](https://opensource.org/licenses/MIT).
209
+
210
+ ## Code of Conduct
211
+
212
+ Everyone interacting in this project's codebases, issue trackers, chat rooms and mailing lists is expected to follow the [code of conduct](https://github.com/openHPI/proformaxml/blob/main/CODE_OF_CONDUCT.md).
data/Rakefile ADDED
@@ -0,0 +1,11 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'bundler/gem_tasks'
4
+ require 'rspec/core/rake_task'
5
+ require 'rubocop/rake_task'
6
+
7
+ RSpec::Core::RakeTask.new(:spec)
8
+
9
+ RuboCop::RakeTask.new
10
+
11
+ task default: :spec
data/SECURITY.md ADDED
@@ -0,0 +1,14 @@
1
+ # Security Policy
2
+
3
+ ## Supported Versions
4
+
5
+ To receive fixes for security vulnerabilities it is required to always upgrade to the latest version of proformaxml.
6
+ See https://github.com/openHPI/proformaxml/releases for the latest version.
7
+
8
+ ## Reporting a Vulnerability
9
+
10
+ If you have found a vulnerability or you are uncertain whether what you have discovered is a vulnerability,
11
+ please send an email to sebastian.serth@hpi.de ([GPG Key](https://github.com/mrserth.gpg)).
12
+
13
+ If you have a patch for the issue please use `git format-patch` and attach it to the email. Please do not open an issue or
14
+ pull request on GitHub as that may disclose sensitive details around the vulnerability.