proformaxml 0.10.0

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