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.
- checksums.yaml +7 -0
- data/.rspec +3 -0
- data/.rubocop/layout.yml +39 -0
- data/.rubocop/lint.yml +14 -0
- data/.rubocop/metrics.yml +31 -0
- data/.rubocop/rails.yml +4 -0
- data/.rubocop/rspec.yml +27 -0
- data/.rubocop/style.yml +74 -0
- data/.rubocop.yml +30 -0
- data/CODE_OF_CONDUCT.md +128 -0
- data/Gemfile +23 -0
- data/Gemfile.lock +168 -0
- data/Guardfile +44 -0
- data/LICENSE.txt +21 -0
- data/README.md +212 -0
- data/Rakefile +11 -0
- data/SECURITY.md +14 -0
- data/assets/schemas/proforma-2.0.xsd +1038 -0
- data/assets/schemas/proforma-2.1.xsd +1084 -0
- data/assets/schemas/proforma-java-checkstyle.xsd +11 -0
- data/assets/schemas/proforma-regexptest.xsd +50 -0
- data/assets/schemas/proforma-unittest.xsd +12 -0
- data/lib/proformaxml/errors.rb +9 -0
- data/lib/proformaxml/helpers/export_helpers.rb +79 -0
- data/lib/proformaxml/helpers/import_helpers.rb +114 -0
- data/lib/proformaxml/models/base.rb +11 -0
- data/lib/proformaxml/models/model_solution.rb +12 -0
- data/lib/proformaxml/models/task.rb +29 -0
- data/lib/proformaxml/models/task_file.rb +11 -0
- data/lib/proformaxml/models/test.rb +12 -0
- data/lib/proformaxml/services/exporter.rb +140 -0
- data/lib/proformaxml/services/importer.rb +135 -0
- data/lib/proformaxml/services/validator.rb +52 -0
- data/lib/proformaxml/version.rb +5 -0
- data/lib/proformaxml.rb +24 -0
- data/proformaxml.gemspec +37 -0
- metadata +179 -0
@@ -0,0 +1,1038 @@
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
2
|
+
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="urn:proforma:v2.0" xmlns:tns="urn:proforma:v2.0"
|
3
|
+
elementFormDefault="qualified">
|
4
|
+
|
5
|
+
<xs:element name="task" type="tns:task-type">
|
6
|
+
<xs:key name="task-fileids">
|
7
|
+
<xs:selector xpath=".//tns:file"/>
|
8
|
+
<xs:field xpath="@id"/>
|
9
|
+
</xs:key>
|
10
|
+
<xs:key name="testids">
|
11
|
+
<xs:selector xpath=".//tns:test"/>
|
12
|
+
<xs:field xpath="@id"/>
|
13
|
+
</xs:key>
|
14
|
+
<xs:key name="model-solutionids">
|
15
|
+
<xs:selector xpath=".//tns:model-solution"/>
|
16
|
+
<xs:field xpath="@id"/>
|
17
|
+
</xs:key>
|
18
|
+
<xs:key name="external-resourceids">
|
19
|
+
<xs:selector xpath=".//tns:external-resource"/>
|
20
|
+
<xs:field xpath="@id"/>
|
21
|
+
</xs:key>
|
22
|
+
<xs:keyref name="task-filerefs" refer="tns:task-fileids">
|
23
|
+
<xs:selector xpath=".//tns:fileref"/>
|
24
|
+
<xs:field xpath="@refid"/>
|
25
|
+
</xs:keyref>
|
26
|
+
<xs:keyref name="tests-extresrefs-extresref" refer="tns:external-resourceids">
|
27
|
+
<xs:selector xpath=".//tns:externalresourceref"/>
|
28
|
+
<xs:field xpath="@refid"/>
|
29
|
+
</xs:keyref>
|
30
|
+
</xs:element>
|
31
|
+
|
32
|
+
<xs:element name="submission" type="tns:submission-type">
|
33
|
+
<xs:unique name="subm-fileids">
|
34
|
+
<xs:selector xpath="./tns:files/tns:file"/>
|
35
|
+
<xs:field xpath="@id"/>
|
36
|
+
</xs:unique>
|
37
|
+
<xs:key name="submtask-fileids">
|
38
|
+
<xs:selector xpath="./tns:task/tns:files/tns:file"/>
|
39
|
+
<xs:field xpath="@id"/>
|
40
|
+
</xs:key>
|
41
|
+
<xs:key name="submtask-testids">
|
42
|
+
<xs:selector xpath=".//tns:test"/>
|
43
|
+
<xs:field xpath="@id"/>
|
44
|
+
</xs:key>
|
45
|
+
<xs:key name="submtask-model-solutionids">
|
46
|
+
<xs:selector xpath=".//tns:model-solution"/>
|
47
|
+
<xs:field xpath="@id"/>
|
48
|
+
</xs:key>
|
49
|
+
<xs:key name="submtask-external-resourceids">
|
50
|
+
<xs:selector xpath=".//tns:external-resource"/>
|
51
|
+
<xs:field xpath="@id"/>
|
52
|
+
</xs:key>
|
53
|
+
<xs:keyref name="submtask-filerefs" refer="tns:submtask-fileids">
|
54
|
+
<xs:selector xpath=".//tns:fileref"/>
|
55
|
+
<xs:field xpath="@refid"/>
|
56
|
+
</xs:keyref>
|
57
|
+
<xs:keyref name="submtask-tests-extresrefs-extresref" refer="tns:submtask-external-resourceids">
|
58
|
+
<xs:selector xpath=".//tns:externalresourceref"/>
|
59
|
+
<xs:field xpath="@refid"/>
|
60
|
+
</xs:keyref>
|
61
|
+
</xs:element>
|
62
|
+
|
63
|
+
<xs:element name="response" type="tns:response-type">
|
64
|
+
<xs:key name="resp-fileids">
|
65
|
+
<xs:selector xpath=".//tns:file"/>
|
66
|
+
<xs:field xpath="@id"/>
|
67
|
+
</xs:key>
|
68
|
+
<xs:key name="resp-testrespids">
|
69
|
+
<xs:selector xpath=".//tns:test-response"/>
|
70
|
+
<xs:field xpath="@id"/>
|
71
|
+
</xs:key>
|
72
|
+
<xs:keyref name="resp-filerefs" refer="tns:resp-fileids">
|
73
|
+
<xs:selector xpath=".//tns:fileref"/>
|
74
|
+
<xs:field xpath="@refid"/>
|
75
|
+
</xs:keyref>
|
76
|
+
</xs:element>
|
77
|
+
|
78
|
+
<xs:complexType name="embedded-txt-file-type">
|
79
|
+
<xs:simpleContent>
|
80
|
+
<xs:extension base="xs:string">
|
81
|
+
<xs:attribute name="filename" type="xs:string" use="required"/>
|
82
|
+
</xs:extension>
|
83
|
+
</xs:simpleContent>
|
84
|
+
</xs:complexType>
|
85
|
+
|
86
|
+
<xs:complexType name="embedded-bin-file-type">
|
87
|
+
<xs:simpleContent>
|
88
|
+
<xs:extension base="xs:base64Binary">
|
89
|
+
<xs:attribute name="filename" type="xs:string" use="required"/>
|
90
|
+
</xs:extension>
|
91
|
+
</xs:simpleContent>
|
92
|
+
</xs:complexType>
|
93
|
+
|
94
|
+
<xs:simpleType name="attached-bin-file-type">
|
95
|
+
<xs:restriction base="xs:string"/>
|
96
|
+
</xs:simpleType>
|
97
|
+
|
98
|
+
<xs:complexType name="attached-txt-file-type">
|
99
|
+
<xs:simpleContent>
|
100
|
+
<xs:extension base="xs:string">
|
101
|
+
<xs:attribute name="encoding" type="xs:string"/>
|
102
|
+
<xs:attribute name="natural-lang" type="xs:language"/>
|
103
|
+
</xs:extension>
|
104
|
+
</xs:simpleContent>
|
105
|
+
</xs:complexType>
|
106
|
+
|
107
|
+
<xs:group name="file-choice-group">
|
108
|
+
<xs:choice>
|
109
|
+
<xs:element name="embedded-bin-file" type="tns:embedded-bin-file-type"/>
|
110
|
+
<xs:element name="embedded-txt-file" type="tns:embedded-txt-file-type"/>
|
111
|
+
<xs:element name="attached-bin-file" type="tns:attached-bin-file-type"/>
|
112
|
+
<xs:element name="attached-txt-file" type="tns:attached-txt-file-type"/>
|
113
|
+
</xs:choice>
|
114
|
+
</xs:group>
|
115
|
+
|
116
|
+
<xs:complexType name="filerefs-type">
|
117
|
+
<xs:sequence maxOccurs="unbounded">
|
118
|
+
<xs:element name="fileref" type="tns:fileref-type"/>
|
119
|
+
</xs:sequence>
|
120
|
+
</xs:complexType>
|
121
|
+
|
122
|
+
<xs:complexType name="fileref-type">
|
123
|
+
<xs:attribute name="refid" type="xs:string" use="required"/>
|
124
|
+
</xs:complexType>
|
125
|
+
|
126
|
+
<xs:simpleType name="description-type">
|
127
|
+
<xs:restriction base="xs:string"/>
|
128
|
+
</xs:simpleType>
|
129
|
+
|
130
|
+
<xs:complexType name="grading-hints-type">
|
131
|
+
<xs:annotation>
|
132
|
+
<xs:documentation xml:lang="en">Root element type of a ProFormA grading-hints element. This includes the complete
|
133
|
+
hierarchical grading scheme with all tests references, weights, accumulating functions and nullify conditions.
|
134
|
+
Hierarchy nodes and conditions can get a title and descriptions. All information below this element except the
|
135
|
+
root node is optional. Grader-specific hints from other XML namespaces can be included in xs:any elements.
|
136
|
+
</xs:documentation>
|
137
|
+
</xs:annotation>
|
138
|
+
<xs:sequence>
|
139
|
+
<xs:element name="root" type="tns:grades-node-type">
|
140
|
+
<xs:annotation>
|
141
|
+
<xs:documentation xml:lang="en">Root node of the grading scheme hierarchy. If no children are specified, the
|
142
|
+
total grading score will be obtained by including all test results scores. The "function" attribute
|
143
|
+
specifies the accumulator function.
|
144
|
+
</xs:documentation>
|
145
|
+
</xs:annotation>
|
146
|
+
</xs:element>
|
147
|
+
<xs:element name="combine" type="tns:grades-node-type" minOccurs="0" maxOccurs="unbounded">
|
148
|
+
<xs:annotation>
|
149
|
+
<xs:documentation xml:lang="en">Inner node of the grading scheme hierarchy. This can be a child of the root
|
150
|
+
node or any descendant node. A "combine" node specifies how to condense several sub results. Sub results can
|
151
|
+
be test results or again "combined" results.
|
152
|
+
</xs:documentation>
|
153
|
+
</xs:annotation>
|
154
|
+
</xs:element>
|
155
|
+
<xs:any namespace="##other" minOccurs="0" maxOccurs="unbounded" processContents="lax">
|
156
|
+
<xs:annotation>
|
157
|
+
<xs:documentation xml:lang="en">Any non-standard information that can be used by a grader or humans to
|
158
|
+
calculate a total result from tests results.
|
159
|
+
</xs:documentation>
|
160
|
+
</xs:annotation>
|
161
|
+
</xs:any>
|
162
|
+
</xs:sequence>
|
163
|
+
</xs:complexType>
|
164
|
+
|
165
|
+
<xs:complexType name="grades-node-type">
|
166
|
+
<xs:annotation>
|
167
|
+
<xs:documentation xml:lang="en">Inner node of the grading scheme hierarchy. There are only two types of inner
|
168
|
+
nodes: the "root" node and "combine" nodes.
|
169
|
+
</xs:documentation>
|
170
|
+
</xs:annotation>
|
171
|
+
<xs:sequence>
|
172
|
+
<xs:element name="title" type="xs:string" minOccurs="0">
|
173
|
+
<xs:annotation>
|
174
|
+
<xs:documentation xml:lang="en">A not too long title to be shown above the grading result represented by this
|
175
|
+
node.
|
176
|
+
</xs:documentation>
|
177
|
+
</xs:annotation>
|
178
|
+
</xs:element>
|
179
|
+
<xs:element name="description" type="tns:description-type" minOccurs="0">
|
180
|
+
<xs:annotation>
|
181
|
+
<xs:documentation xml:lang="en">A more or less comprehensive description of the problem aspect represented by
|
182
|
+
this node.
|
183
|
+
</xs:documentation>
|
184
|
+
</xs:annotation>
|
185
|
+
</xs:element>
|
186
|
+
<xs:element name="internal-description" type="tns:description-type" minOccurs="0">
|
187
|
+
<xs:annotation>
|
188
|
+
<xs:documentation xml:lang="en">A more or less comprehensive internal description of the problem aspect
|
189
|
+
represented by this node. Internal descriptions are meant for teachers and maybe grading assistants.
|
190
|
+
Internal descriptions are not shown to students. The internal description could include didactic background
|
191
|
+
information and possibly technical or organizational details about this grading aspect.
|
192
|
+
</xs:documentation>
|
193
|
+
</xs:annotation>
|
194
|
+
</xs:element>
|
195
|
+
<xs:choice minOccurs="0" maxOccurs="unbounded">
|
196
|
+
<xs:element name="test-ref" type="tns:grades-test-ref-child-type"/>
|
197
|
+
<xs:element name="combine-ref" type="tns:grades-combine-ref-child-type"/>
|
198
|
+
</xs:choice>
|
199
|
+
</xs:sequence>
|
200
|
+
<xs:attribute name="id" type="xs:string" use="optional">
|
201
|
+
<xs:annotation>
|
202
|
+
<xs:documentation xml:lang="en">Node identifier. It is optional for the "root" node and required for "combine"
|
203
|
+
nodes.
|
204
|
+
</xs:documentation>
|
205
|
+
</xs:annotation>
|
206
|
+
</xs:attribute>
|
207
|
+
<xs:attribute name="function" use="optional" default="min">
|
208
|
+
<xs:annotation>
|
209
|
+
<xs:documentation xml:lang="en">Accumulator function that is used to condense several sub results to a single
|
210
|
+
result.
|
211
|
+
</xs:documentation>
|
212
|
+
</xs:annotation>
|
213
|
+
<xs:simpleType>
|
214
|
+
<xs:restriction base="xs:string">
|
215
|
+
<xs:enumeration value="min">
|
216
|
+
<xs:annotation>
|
217
|
+
<xs:documentation xml:lang="en">Specifies the minimum of several sub scores. This can be used in an "all
|
218
|
+
or nothing" situation, where a parent score should reflect the worst of the child results. Weights can
|
219
|
+
be attached to children to express the valency of a child's result. The child node representing the
|
220
|
+
easiest aspect among its siblings could get the weight 1. Child nodes for grading aspects connected with
|
221
|
+
a higher effort represent scores that are more difficult to achieve. These child nodes could get weights
|
222
|
+
larger than 1. This would guarantee, that when all child nodes results are in [0,1] also the parent node
|
223
|
+
result is in [0,1].
|
224
|
+
</xs:documentation>
|
225
|
+
</xs:annotation>
|
226
|
+
</xs:enumeration>
|
227
|
+
<xs:enumeration value="max">
|
228
|
+
<xs:annotation>
|
229
|
+
<xs:documentation xml:lang="en">Specifies the maximum of several sub scores. This is used in an "one
|
230
|
+
success is enough" situation, where a parent score should reflect the best of the child results. An
|
231
|
+
example is a task or a graded problem aspect that could be solved in different ways and for each way
|
232
|
+
there is a separate test element in the task. A solution that succeeds any one of these tests is
|
233
|
+
regarded successful. If one of the different ways of solving the task is more sophisticated than the
|
234
|
+
others, the respective child test could get the highest weight 1. Easier, less valent solution paths get
|
235
|
+
lower weights between 0 and 1. This would guarantee, that when all child nodes results are in [0,1] also
|
236
|
+
the parent node result is in [0,1].
|
237
|
+
</xs:documentation>
|
238
|
+
</xs:annotation>
|
239
|
+
</xs:enumeration>
|
240
|
+
<xs:enumeration value="sum">
|
241
|
+
<xs:annotation>
|
242
|
+
<xs:documentation xml:lang="en">Specifies the sum of several sub scores. This is used in a situation,
|
243
|
+
where every child represents a problem aspect that could be solved more or less independently of the
|
244
|
+
other aspects. Weights can be attached to child nodes. Those child nodes representing easy problem
|
245
|
+
aspects could get lower weights than other aspects. If all weights of all direct children of a node add
|
246
|
+
up to 1, this would guarantee, that the parent node result is in [0,1] when all child nodes results are
|
247
|
+
in [0,1].
|
248
|
+
</xs:documentation>
|
249
|
+
</xs:annotation>
|
250
|
+
</xs:enumeration>
|
251
|
+
</xs:restriction>
|
252
|
+
</xs:simpleType>
|
253
|
+
</xs:attribute>
|
254
|
+
</xs:complexType>
|
255
|
+
|
256
|
+
<xs:complexType name="grades-base-ref-child-type">
|
257
|
+
<xs:annotation>
|
258
|
+
<xs:documentation xml:lang="en">Inner nodes of the grading scheme hierarchy carry pointers to children. This
|
259
|
+
element represents such a pointer. There are two kinds of pointers: "test-ref" pointers and "combine-ref"
|
260
|
+
pointers.
|
261
|
+
</xs:documentation>
|
262
|
+
</xs:annotation>
|
263
|
+
<xs:sequence>
|
264
|
+
<xs:choice minOccurs="0">
|
265
|
+
<xs:element name="nullify-conditions" type="tns:grades-nullify-conditions-type">
|
266
|
+
<xs:annotation>
|
267
|
+
<xs:documentation xml:lang="en">Specifies a composite condition when the sub result of the pointed-at node
|
268
|
+
should get nullified. The pointed-at node is a test or a combine node. If the composite condition
|
269
|
+
evaluates to False, it has no effect. Otherwise, the score of the pointed-at node is not accumulated into
|
270
|
+
the condensed result of the pointing-from-node. State differently, the score that flows into the
|
271
|
+
accumulator function of the pointing-from-node, is assumed to be emitted as 0 from the pointed-at node.
|
272
|
+
</xs:documentation>
|
273
|
+
</xs:annotation>
|
274
|
+
</xs:element>
|
275
|
+
<xs:element name="nullify-condition" type="tns:grades-nullify-condition-type">
|
276
|
+
<xs:annotation>
|
277
|
+
<xs:documentation xml:lang="en">Specifies a _comparison_ condition when the sub result of the pointed-at
|
278
|
+
node should get nullified. The only difference to <nullify-conditions> is the trailing "s" and the
|
279
|
+
fact, that <nullify-conditions> represents a composite condition while <nullify-condition>
|
280
|
+
represents a simple comparison condition.
|
281
|
+
</xs:documentation>
|
282
|
+
</xs:annotation>
|
283
|
+
</xs:element>
|
284
|
+
</xs:choice>
|
285
|
+
</xs:sequence>
|
286
|
+
<xs:attribute name="weight" type="xs:double" use="optional">
|
287
|
+
<xs:annotation>
|
288
|
+
<xs:documentation xml:lang="en">Specifies a weight that is multiplied to the sub result of the pointed-at node
|
289
|
+
when flowing into the accumulator function. The pointed-at node is a test or a combine node. When calculating
|
290
|
+
the condensed result for the pointing-from node, the score of the pointed-at node is multiplied by the weight,
|
291
|
+
if present. Otherwise nothing is multiplied.
|
292
|
+
</xs:documentation>
|
293
|
+
</xs:annotation>
|
294
|
+
</xs:attribute>
|
295
|
+
</xs:complexType>
|
296
|
+
|
297
|
+
<xs:complexType name="grades-test-ref-child-type">
|
298
|
+
<xs:annotation>
|
299
|
+
<xs:documentation xml:lang="en">A "test-ref" node points to a test in a ProFormA task. As such the result of the
|
300
|
+
pointed at test is obtained and included in a bottom-up fashion in the calculation of the total result.
|
301
|
+
</xs:documentation>
|
302
|
+
</xs:annotation>
|
303
|
+
<xs:complexContent>
|
304
|
+
<xs:extension base="tns:grades-base-ref-child-type">
|
305
|
+
<xs:sequence>
|
306
|
+
<xs:element name="title" type="xs:string" minOccurs="0">
|
307
|
+
<xs:annotation>
|
308
|
+
<xs:documentation xml:lang="en">A not too long title to be shown above the pointed-at test's result.
|
309
|
+
Overrides the title of the pointed-at test element. This can be used especially when pointing to sub
|
310
|
+
test results.
|
311
|
+
</xs:documentation>
|
312
|
+
</xs:annotation>
|
313
|
+
</xs:element>
|
314
|
+
<xs:element name="description" type="tns:description-type" minOccurs="0">
|
315
|
+
<xs:annotation>
|
316
|
+
<xs:documentation xml:lang="en">A more or less comprehensive description of the problem aspect represented
|
317
|
+
by the pointed-at test. This can be used especially when pointing to sub test results.
|
318
|
+
</xs:documentation>
|
319
|
+
</xs:annotation>
|
320
|
+
</xs:element>
|
321
|
+
<xs:element name="internal-description" type="tns:description-type" minOccurs="0">
|
322
|
+
<xs:annotation>
|
323
|
+
<xs:documentation xml:lang="en">A more or less comprehensive internal description of the problem aspect
|
324
|
+
represented by the pointed-at test. This can be used especially when pointing to sub test results.
|
325
|
+
Internal descriptions are meant for teachers and maybe grading assistants. Internal descriptions are not
|
326
|
+
shown to students. The internal description could include didactic background information and possibly
|
327
|
+
technical or organizational details about this grading aspect.
|
328
|
+
</xs:documentation>
|
329
|
+
</xs:annotation>
|
330
|
+
</xs:element>
|
331
|
+
</xs:sequence>
|
332
|
+
<xs:attribute name="ref" type="xs:string" use="required">
|
333
|
+
<xs:annotation>
|
334
|
+
<xs:documentation xml:lang="en">The id of the pointed-at test.</xs:documentation>
|
335
|
+
</xs:annotation>
|
336
|
+
</xs:attribute>
|
337
|
+
<xs:attribute name="sub-ref" type="xs:string" use="optional">
|
338
|
+
<xs:annotation>
|
339
|
+
<xs:documentation xml:lang="en">If the pointed at test exhibits sub test results, this points to one of the
|
340
|
+
sub results. Examples are individual test cases in a unit test specification, individual violation rules
|
341
|
+
in a static code analyzer, individual error classes in a compilation step, etc. Since the sub-ref format
|
342
|
+
or content is test-tool-specific, it is not normed in the ProFormA format.
|
343
|
+
</xs:documentation>
|
344
|
+
</xs:annotation>
|
345
|
+
</xs:attribute>
|
346
|
+
</xs:extension>
|
347
|
+
</xs:complexContent>
|
348
|
+
</xs:complexType>
|
349
|
+
|
350
|
+
<xs:complexType name="grades-combine-ref-child-type">
|
351
|
+
<xs:annotation>
|
352
|
+
<xs:documentation xml:lang="en">A "combine-ref" node points to a "combine" node in the grading scheme hierarchy.
|
353
|
+
As such the result of the pointed at node is obtained and included in a bottom-up fashion in the calculation of
|
354
|
+
the total result.
|
355
|
+
</xs:documentation>
|
356
|
+
</xs:annotation>
|
357
|
+
<xs:complexContent>
|
358
|
+
<xs:extension base="tns:grades-base-ref-child-type">
|
359
|
+
<xs:attribute name="ref" type="xs:string" use="required">
|
360
|
+
<xs:annotation>
|
361
|
+
<xs:documentation xml:lang="en">The id of the pointed-at combine node.</xs:documentation>
|
362
|
+
</xs:annotation>
|
363
|
+
</xs:attribute>
|
364
|
+
</xs:extension>
|
365
|
+
</xs:complexContent>
|
366
|
+
</xs:complexType>
|
367
|
+
|
368
|
+
<xs:complexType name="grades-nullify-base-type">
|
369
|
+
<xs:annotation>
|
370
|
+
<xs:documentation xml:lang="en">Specifies an operand of a composite nullify condition.</xs:documentation>
|
371
|
+
</xs:annotation>
|
372
|
+
<xs:sequence>
|
373
|
+
<xs:element name="title" type="xs:string" minOccurs="0">
|
374
|
+
<xs:annotation>
|
375
|
+
<xs:documentation xml:lang="en">A title to be displayed when explaining a score nullification to students or
|
376
|
+
teachers. Front ends might decide to explain nullification conditions in a grading scheme even if for a
|
377
|
+
certain submission no nullification took place.
|
378
|
+
</xs:documentation>
|
379
|
+
</xs:annotation>
|
380
|
+
</xs:element>
|
381
|
+
<xs:element name="description" type="tns:description-type" minOccurs="0">
|
382
|
+
<xs:annotation>
|
383
|
+
<xs:documentation xml:lang="en">A detailed description to be displayed when explaining a score nullification.
|
384
|
+
Front ends might decide to extend this description by an automatically generated, human readable version of
|
385
|
+
the involved boolean or comparison expression.
|
386
|
+
</xs:documentation>
|
387
|
+
</xs:annotation>
|
388
|
+
</xs:element>
|
389
|
+
<xs:element name="internal-description" type="tns:description-type" minOccurs="0">
|
390
|
+
<xs:annotation>
|
391
|
+
<xs:documentation xml:lang="en">A detailed description to be displayed to teachers and grading assistants
|
392
|
+
only.
|
393
|
+
</xs:documentation>
|
394
|
+
</xs:annotation>
|
395
|
+
</xs:element>
|
396
|
+
</xs:sequence>
|
397
|
+
</xs:complexType>
|
398
|
+
|
399
|
+
<xs:complexType name="grades-nullify-conditions-type">
|
400
|
+
<xs:annotation>
|
401
|
+
<xs:documentation xml:lang="en">Specifies a composite condition when the sub result of a pointed-at node should
|
402
|
+
get nullified. The composite condition is attributed with one of the boolean operators { and, or }. Further it
|
403
|
+
contains operands that usually are of the nullify-condition type, which represents a simple comparison.
|
404
|
+
Nevertheless a composite condition can have nested composite conditions as operands as well.
|
405
|
+
</xs:documentation>
|
406
|
+
</xs:annotation>
|
407
|
+
<xs:complexContent>
|
408
|
+
<xs:extension base="tns:grades-nullify-base-type">
|
409
|
+
<xs:sequence>
|
410
|
+
<xs:choice minOccurs="2" maxOccurs="unbounded">
|
411
|
+
<xs:element name="nullify-conditions" type="tns:grades-nullify-conditions-type">
|
412
|
+
<xs:annotation>
|
413
|
+
<xs:documentation xml:lang="en">An operand of the boolean expression, itself being a composite
|
414
|
+
condition.
|
415
|
+
</xs:documentation>
|
416
|
+
</xs:annotation>
|
417
|
+
</xs:element>
|
418
|
+
<xs:element name="nullify-condition" type="tns:grades-nullify-condition-type">
|
419
|
+
<xs:annotation>
|
420
|
+
<xs:documentation xml:lang="en">A simple comparison condition as an operand of the boolean expression.
|
421
|
+
</xs:documentation>
|
422
|
+
</xs:annotation>
|
423
|
+
</xs:element>
|
424
|
+
</xs:choice>
|
425
|
+
</xs:sequence>
|
426
|
+
<xs:attribute name="compose-op" use="required">
|
427
|
+
<xs:annotation>
|
428
|
+
<xs:documentation xml:lang="en">The boolean operator of the boolean expression.</xs:documentation>
|
429
|
+
</xs:annotation>
|
430
|
+
<xs:simpleType>
|
431
|
+
<xs:restriction base="xs:string">
|
432
|
+
<xs:enumeration value="and"/>
|
433
|
+
<xs:enumeration value="or"/>
|
434
|
+
</xs:restriction>
|
435
|
+
</xs:simpleType>
|
436
|
+
</xs:attribute>
|
437
|
+
</xs:extension>
|
438
|
+
</xs:complexContent>
|
439
|
+
</xs:complexType>
|
440
|
+
|
441
|
+
<xs:complexType name="grades-nullify-condition-type">
|
442
|
+
<xs:annotation>
|
443
|
+
<xs:documentation xml:lang="en">Specifies a simple comparison condition when the sub result of a pointed-at node
|
444
|
+
should get nullified. This simple comparison condition is attributed with one of the six common comparison
|
445
|
+
operators. Further it contains operands that refer to tests or combine nodes or that specify a numerical
|
446
|
+
constant, which a result should be compared to.
|
447
|
+
</xs:documentation>
|
448
|
+
</xs:annotation>
|
449
|
+
<xs:complexContent>
|
450
|
+
<xs:extension base="tns:grades-nullify-base-type">
|
451
|
+
<xs:sequence>
|
452
|
+
<xs:choice minOccurs="2" maxOccurs="2">
|
453
|
+
<xs:element name="nullify-combine-ref" type="tns:grades-nullify-combine-ref-type">
|
454
|
+
<xs:annotation>
|
455
|
+
<xs:documentation xml:lang="en">An operand of the comparison expression pointing to a "combine" node.
|
456
|
+
When evaluating the condition, the numerical score calculated for the referenced combine node will be
|
457
|
+
used as an operand in comparison.
|
458
|
+
</xs:documentation>
|
459
|
+
</xs:annotation>
|
460
|
+
</xs:element>
|
461
|
+
<xs:element name="nullify-test-ref" type="tns:grades-nullify-test-ref-type">
|
462
|
+
<xs:annotation>
|
463
|
+
<xs:documentation xml:lang="en">An operand of the comparison expression pointing to a "test". When
|
464
|
+
evaluating the condition, the numerical score delivered by the referenced test will be used as an
|
465
|
+
operand in comparison.
|
466
|
+
</xs:documentation>
|
467
|
+
</xs:annotation>
|
468
|
+
</xs:element>
|
469
|
+
<xs:element name="nullify-literal" type="tns:grades-nullify-literal-type">
|
470
|
+
<xs:annotation>
|
471
|
+
<xs:documentation xml:lang="en">A numerical constant serving as an operand of the comparison expression.
|
472
|
+
The constant is specified as a "value" attribute in the nullify-literal element.
|
473
|
+
</xs:documentation>
|
474
|
+
</xs:annotation>
|
475
|
+
</xs:element>
|
476
|
+
</xs:choice>
|
477
|
+
</xs:sequence>
|
478
|
+
<xs:attribute name="compare-op" use="required">
|
479
|
+
<xs:annotation>
|
480
|
+
<xs:documentation xml:lang="en">The comparison operator of the comparison expression.</xs:documentation>
|
481
|
+
</xs:annotation>
|
482
|
+
<xs:simpleType>
|
483
|
+
<xs:restriction base="xs:string">
|
484
|
+
<xs:enumeration value="eq">
|
485
|
+
<xs:annotation>
|
486
|
+
<xs:documentation xml:lang="en">equals</xs:documentation>
|
487
|
+
</xs:annotation>
|
488
|
+
</xs:enumeration>
|
489
|
+
<xs:enumeration value="ne">
|
490
|
+
<xs:annotation>
|
491
|
+
<xs:documentation xml:lang="en">not equals</xs:documentation>
|
492
|
+
</xs:annotation>
|
493
|
+
</xs:enumeration>
|
494
|
+
<xs:enumeration value="gt">
|
495
|
+
<xs:annotation>
|
496
|
+
<xs:documentation xml:lang="en">greater than</xs:documentation>
|
497
|
+
</xs:annotation>
|
498
|
+
</xs:enumeration>
|
499
|
+
<xs:enumeration value="ge">
|
500
|
+
<xs:annotation>
|
501
|
+
<xs:documentation xml:lang="en">greater than or equals</xs:documentation>
|
502
|
+
</xs:annotation>
|
503
|
+
</xs:enumeration>
|
504
|
+
<xs:enumeration value="lt">
|
505
|
+
<xs:annotation>
|
506
|
+
<xs:documentation xml:lang="en">less than</xs:documentation>
|
507
|
+
</xs:annotation>
|
508
|
+
</xs:enumeration>
|
509
|
+
<xs:enumeration value="le">
|
510
|
+
<xs:annotation>
|
511
|
+
<xs:documentation xml:lang="en">less than or equals</xs:documentation>
|
512
|
+
</xs:annotation>
|
513
|
+
</xs:enumeration>
|
514
|
+
</xs:restriction>
|
515
|
+
</xs:simpleType>
|
516
|
+
</xs:attribute>
|
517
|
+
</xs:extension>
|
518
|
+
</xs:complexContent>
|
519
|
+
</xs:complexType>
|
520
|
+
|
521
|
+
<xs:complexType name="grades-nullify-comparison-operand-type">
|
522
|
+
<xs:annotation>
|
523
|
+
<xs:documentation xml:lang="en">Specifies an operand of a comparison nullify condition.</xs:documentation>
|
524
|
+
</xs:annotation>
|
525
|
+
</xs:complexType>
|
526
|
+
|
527
|
+
<xs:complexType name="grades-nullify-combine-ref-type">
|
528
|
+
<xs:annotation>
|
529
|
+
<xs:documentation xml:lang="en">An operand of a comparison expression pointing to a "combine" node.
|
530
|
+
</xs:documentation>
|
531
|
+
</xs:annotation>
|
532
|
+
<xs:complexContent>
|
533
|
+
<xs:extension base="tns:grades-nullify-comparison-operand-type">
|
534
|
+
<xs:attribute name="ref" type="xs:string" use="required">
|
535
|
+
<xs:annotation>
|
536
|
+
<xs:documentation xml:lang="en">The id of the pointed-at combine node.</xs:documentation>
|
537
|
+
</xs:annotation>
|
538
|
+
</xs:attribute>
|
539
|
+
</xs:extension>
|
540
|
+
</xs:complexContent>
|
541
|
+
</xs:complexType>
|
542
|
+
|
543
|
+
<xs:complexType name="grades-nullify-test-ref-type">
|
544
|
+
<xs:annotation>
|
545
|
+
<xs:documentation xml:lang="en">An operand of a comparison expression pointing to a "test".</xs:documentation>
|
546
|
+
</xs:annotation>
|
547
|
+
<xs:complexContent>
|
548
|
+
<xs:extension base="tns:grades-nullify-comparison-operand-type">
|
549
|
+
<xs:attribute name="ref" type="xs:string" use="required">
|
550
|
+
<xs:annotation>
|
551
|
+
<xs:documentation xml:lang="en">The id of the pointed-at test.</xs:documentation>
|
552
|
+
</xs:annotation>
|
553
|
+
</xs:attribute>
|
554
|
+
<xs:attribute name="sub-ref" type="xs:string" use="optional">
|
555
|
+
<xs:annotation>
|
556
|
+
<xs:documentation xml:lang="en">If the pointed at test exhibits sub test results, this points to one of the
|
557
|
+
sub results. Examples are individual test cases in a unit test specification, individual violation rules
|
558
|
+
in a static code analyzer, individual error classes in a compilation step, etc. Since the sub-ref format
|
559
|
+
or content is test-tool-specific, it is not normed in the ProFormA format.
|
560
|
+
</xs:documentation>
|
561
|
+
</xs:annotation>
|
562
|
+
</xs:attribute>
|
563
|
+
</xs:extension>
|
564
|
+
</xs:complexContent>
|
565
|
+
</xs:complexType>
|
566
|
+
|
567
|
+
<xs:complexType name="grades-nullify-literal-type">
|
568
|
+
<xs:annotation>
|
569
|
+
<xs:documentation xml:lang="en">A numerical constant serving as an operand of the comparison expression.
|
570
|
+
</xs:documentation>
|
571
|
+
</xs:annotation>
|
572
|
+
<xs:complexContent>
|
573
|
+
<xs:extension base="tns:grades-nullify-comparison-operand-type">
|
574
|
+
<xs:attribute name="value" type="xs:decimal" use="required">
|
575
|
+
<xs:annotation>
|
576
|
+
<xs:documentation xml:lang="en">A numerical constant value to be compared with.</xs:documentation>
|
577
|
+
</xs:annotation>
|
578
|
+
</xs:attribute>
|
579
|
+
</xs:extension>
|
580
|
+
</xs:complexContent>
|
581
|
+
</xs:complexType>
|
582
|
+
|
583
|
+
<xs:complexType name="task-type">
|
584
|
+
<xs:sequence>
|
585
|
+
<xs:element name="title" type="tns:title-type"/>
|
586
|
+
<xs:element name="description" type="tns:description-type"/>
|
587
|
+
<xs:element name="internal-description" type="tns:description-type" minOccurs="0"/>
|
588
|
+
<xs:element name="proglang" type="tns:proglang-type"/>
|
589
|
+
<xs:element name="submission-restrictions" type="tns:submission-restrictions-type" minOccurs="0"/>
|
590
|
+
<xs:element name="files" type="tns:task-files-type"/>
|
591
|
+
<xs:element name="external-resources" type="tns:external-resources-type" minOccurs="0"/>
|
592
|
+
<xs:element name="model-solutions" type="tns:model-solutions-type"/>
|
593
|
+
<xs:element name="tests" type="tns:tests-type"/>
|
594
|
+
<xs:element name="grading-hints" type="tns:grading-hints-type" minOccurs="0">
|
595
|
+
<xs:key name="task-gh-combineids">
|
596
|
+
<xs:selector xpath=".//tns:combine"/>
|
597
|
+
<xs:field xpath="@id"/>
|
598
|
+
</xs:key>
|
599
|
+
<xs:keyref name="task-gh-combinerefs" refer="tns:task-gh-combineids">
|
600
|
+
<xs:selector xpath=".//tns:combine-ref|.//tns:nullify-combine-ref"/>
|
601
|
+
<xs:field xpath="@ref"/>
|
602
|
+
</xs:keyref>
|
603
|
+
</xs:element>
|
604
|
+
<xs:element name="meta-data" type="tns:task-meta-data-type"/>
|
605
|
+
</xs:sequence>
|
606
|
+
<xs:attribute name="uuid" type="xs:string" use="required"/>
|
607
|
+
<xs:attribute name="parent-uuid" type="xs:string" use="optional"/>
|
608
|
+
<xs:attribute name="lang" type="xs:language"/>
|
609
|
+
</xs:complexType>
|
610
|
+
|
611
|
+
<xs:complexType name="submission-restrictions-type">
|
612
|
+
<xs:sequence minOccurs="0" maxOccurs="unbounded">
|
613
|
+
<xs:element name="file-restriction" type="tns:file-restr-type"/>
|
614
|
+
</xs:sequence>
|
615
|
+
<xs:attribute name="max-size" type="xs:positiveInteger" use="optional"/>
|
616
|
+
</xs:complexType>
|
617
|
+
|
618
|
+
<xs:complexType name="file-restr-type">
|
619
|
+
<xs:simpleContent>
|
620
|
+
<xs:extension base="xs:string">
|
621
|
+
<xs:attribute name="required" type="xs:boolean" use="optional" default="true"/>
|
622
|
+
<xs:attribute name="pattern-format" use="optional" default="none">
|
623
|
+
<xs:simpleType>
|
624
|
+
<xs:restriction base="xs:string">
|
625
|
+
<xs:enumeration value="none"/>
|
626
|
+
<xs:enumeration value="posix-ere"/>
|
627
|
+
</xs:restriction>
|
628
|
+
</xs:simpleType>
|
629
|
+
</xs:attribute>
|
630
|
+
</xs:extension>
|
631
|
+
</xs:simpleContent>
|
632
|
+
</xs:complexType>
|
633
|
+
|
634
|
+
<xs:complexType name="model-solutions-type">
|
635
|
+
<xs:sequence maxOccurs="unbounded">
|
636
|
+
<xs:element name="model-solution" type="tns:model-solution-type"/>
|
637
|
+
</xs:sequence>
|
638
|
+
</xs:complexType>
|
639
|
+
|
640
|
+
<xs:complexType name="model-solution-type">
|
641
|
+
<xs:sequence>
|
642
|
+
<xs:element name="filerefs" type="tns:filerefs-type"/>
|
643
|
+
<xs:element name="description" type="tns:description-type" minOccurs="0"/>
|
644
|
+
<xs:element name="internal-description" type="tns:description-type" minOccurs="0"/>
|
645
|
+
</xs:sequence>
|
646
|
+
<xs:attribute name="id" type="xs:string" use="required"/>
|
647
|
+
</xs:complexType>
|
648
|
+
|
649
|
+
<xs:complexType name="task-meta-data-type">
|
650
|
+
<xs:sequence>
|
651
|
+
<xs:any namespace="##other" minOccurs="0" maxOccurs="unbounded" processContents="lax"/>
|
652
|
+
</xs:sequence>
|
653
|
+
</xs:complexType>
|
654
|
+
|
655
|
+
<xs:complexType name="proglang-type">
|
656
|
+
<xs:simpleContent>
|
657
|
+
<xs:extension base="xs:string">
|
658
|
+
<xs:attribute name="version" type="xs:string" use="required"/>
|
659
|
+
</xs:extension>
|
660
|
+
</xs:simpleContent>
|
661
|
+
</xs:complexType>
|
662
|
+
|
663
|
+
<xs:complexType name="task-file-type">
|
664
|
+
<xs:sequence>
|
665
|
+
<xs:group ref="tns:file-choice-group"/>
|
666
|
+
<xs:element name="internal-description" type="tns:description-type" minOccurs="0"/>
|
667
|
+
</xs:sequence>
|
668
|
+
<xs:attribute name="id" type="xs:string" use="required"/>
|
669
|
+
<xs:attribute name="mimetype" type="xs:string" use="optional"/>
|
670
|
+
<xs:attribute name="used-by-grader" type="xs:boolean" use="required"/>
|
671
|
+
<xs:attribute name="visible" use="required">
|
672
|
+
<xs:simpleType>
|
673
|
+
<xs:restriction base="xs:string">
|
674
|
+
<xs:enumeration value="yes"/>
|
675
|
+
<xs:enumeration value="no"/>
|
676
|
+
<xs:enumeration value="delayed"/>
|
677
|
+
</xs:restriction>
|
678
|
+
</xs:simpleType>
|
679
|
+
</xs:attribute>
|
680
|
+
<xs:attribute name="usage-by-lms" use="optional" default="download">
|
681
|
+
<xs:simpleType>
|
682
|
+
<xs:restriction base="xs:string">
|
683
|
+
<xs:enumeration value="edit"/>
|
684
|
+
<xs:enumeration value="display"/>
|
685
|
+
<xs:enumeration value="download"/>
|
686
|
+
</xs:restriction>
|
687
|
+
</xs:simpleType>
|
688
|
+
</xs:attribute>
|
689
|
+
</xs:complexType>
|
690
|
+
|
691
|
+
<xs:complexType name="task-files-type">
|
692
|
+
<xs:sequence minOccurs="0" maxOccurs="unbounded">
|
693
|
+
<xs:element name="file" type="tns:task-file-type"/>
|
694
|
+
</xs:sequence>
|
695
|
+
</xs:complexType>
|
696
|
+
|
697
|
+
<xs:complexType name="external-resources-type">
|
698
|
+
<xs:sequence minOccurs="0" maxOccurs="unbounded">
|
699
|
+
<xs:element name="external-resource" type="tns:external-resource-type"/>
|
700
|
+
</xs:sequence>
|
701
|
+
</xs:complexType>
|
702
|
+
|
703
|
+
<xs:complexType name="external-resource-type">
|
704
|
+
<xs:sequence>
|
705
|
+
<xs:element name="internal-description" type="tns:description-type" minOccurs="0"/>
|
706
|
+
<xs:any namespace="##other" minOccurs="0" maxOccurs="unbounded" processContents="lax"/>
|
707
|
+
</xs:sequence>
|
708
|
+
<xs:attribute name="id" type="xs:string" use="required"/>
|
709
|
+
<xs:attribute name="reference" type="xs:string" use="optional"/>
|
710
|
+
</xs:complexType>
|
711
|
+
|
712
|
+
<xs:simpleType name="title-type">
|
713
|
+
<xs:restriction base="xs:string"/>
|
714
|
+
</xs:simpleType>
|
715
|
+
|
716
|
+
<xs:complexType name="tests-type">
|
717
|
+
<xs:sequence minOccurs="0" maxOccurs="unbounded">
|
718
|
+
<xs:element name="test" type="tns:test-type"/>
|
719
|
+
</xs:sequence>
|
720
|
+
</xs:complexType>
|
721
|
+
|
722
|
+
<xs:simpleType name="test-type-type">
|
723
|
+
<xs:restriction base="xs:string">
|
724
|
+
<xs:annotation>
|
725
|
+
<xs:documentation xml:lang="en">
|
726
|
+
For common test types one of the following strings should be used:
|
727
|
+
"java-compilation", "java-checkstyle", "java-code-coverage-emma", "java-findbugs",
|
728
|
+
"java-pmd", "unittest", "dejagnu", "setlx", "regexptest". For some of these
|
729
|
+
an xsd is provided by the format.
|
730
|
+
</xs:documentation>
|
731
|
+
</xs:annotation>
|
732
|
+
</xs:restriction>
|
733
|
+
</xs:simpleType>
|
734
|
+
|
735
|
+
<xs:complexType name="test-configuration-type">
|
736
|
+
<xs:sequence>
|
737
|
+
<xs:element name="filerefs" type="tns:filerefs-type" minOccurs="0"/>
|
738
|
+
<xs:element name="timeout" minOccurs="0">
|
739
|
+
<xs:simpleType>
|
740
|
+
<xs:restriction base="xs:positiveInteger"/>
|
741
|
+
</xs:simpleType>
|
742
|
+
</xs:element>
|
743
|
+
<xs:element name="externalresourcerefs" type="tns:externalresourcerefs-type" minOccurs="0"/>
|
744
|
+
<xs:any namespace="##other" minOccurs="0" maxOccurs="unbounded" processContents="lax"/>
|
745
|
+
<xs:element name="test-meta-data" type="tns:test-meta-data-type" minOccurs="0"/>
|
746
|
+
</xs:sequence>
|
747
|
+
</xs:complexType>
|
748
|
+
|
749
|
+
<xs:complexType name="test-type">
|
750
|
+
<xs:sequence>
|
751
|
+
<xs:element name="title" type="tns:title-type"/>
|
752
|
+
<xs:element name="description" type="tns:description-type" minOccurs="0"/>
|
753
|
+
<xs:element name="internal-description" type="tns:description-type" minOccurs="0"/>
|
754
|
+
<xs:element name="test-type" type="tns:test-type-type"/>
|
755
|
+
<xs:element name="test-configuration" type="tns:test-configuration-type"/>
|
756
|
+
</xs:sequence>
|
757
|
+
<xs:attribute name="id" type="xs:string" use="required"/>
|
758
|
+
<xs:attribute name="validity" use="optional" default="1.00">
|
759
|
+
<xs:simpleType>
|
760
|
+
<xs:restriction base="xs:decimal">
|
761
|
+
<xs:totalDigits value="3"/>
|
762
|
+
<xs:fractionDigits value="2"/>
|
763
|
+
<xs:minInclusive value="0"/>
|
764
|
+
<xs:maxInclusive value="1.00"/>
|
765
|
+
</xs:restriction>
|
766
|
+
</xs:simpleType>
|
767
|
+
</xs:attribute>
|
768
|
+
</xs:complexType>
|
769
|
+
|
770
|
+
<xs:complexType name="externalresourcerefs-type">
|
771
|
+
<xs:sequence minOccurs="0" maxOccurs="unbounded">
|
772
|
+
<xs:element name="externalresourceref" type="tns:externalresourceref-type"/>
|
773
|
+
</xs:sequence>
|
774
|
+
</xs:complexType>
|
775
|
+
|
776
|
+
<xs:complexType name="externalresourceref-type">
|
777
|
+
<xs:attribute name="refid" type="xs:string" use="required"/>
|
778
|
+
</xs:complexType>
|
779
|
+
|
780
|
+
<xs:complexType name="test-meta-data-type">
|
781
|
+
<xs:sequence>
|
782
|
+
<xs:any namespace="##other" minOccurs="0" maxOccurs="unbounded" processContents="lax"/>
|
783
|
+
</xs:sequence>
|
784
|
+
</xs:complexType>
|
785
|
+
|
786
|
+
<xs:complexType name="submission-type">
|
787
|
+
<xs:sequence>
|
788
|
+
<xs:choice>
|
789
|
+
<xs:element name="external-task" type="tns:external-task-type"/>
|
790
|
+
<xs:element name="included-task-file" type="tns:included-task-file-type"/>
|
791
|
+
<xs:element name="task" type="tns:task-type"/>
|
792
|
+
</xs:choice>
|
793
|
+
<xs:element name="grading-hints" type="tns:grading-hints-type" minOccurs="0">
|
794
|
+
<xs:key name="subm-gh-combineids">
|
795
|
+
<xs:selector xpath=".//tns:combine"/>
|
796
|
+
<xs:field xpath="@id"/>
|
797
|
+
</xs:key>
|
798
|
+
<xs:keyref name="subm-gh-combinerefs" refer="tns:subm-gh-combineids">
|
799
|
+
<xs:selector xpath=".//tns:combine-ref|.//tns:nullify-combine-ref"/>
|
800
|
+
<xs:field xpath="@ref"/>
|
801
|
+
</xs:keyref>
|
802
|
+
</xs:element>
|
803
|
+
<xs:choice>
|
804
|
+
<xs:element name="external-submission" type="tns:external-submission-type"/>
|
805
|
+
<xs:element name="files" type="tns:submission-files-type"/>
|
806
|
+
</xs:choice>
|
807
|
+
<xs:element name="lms" type="tns:lms-type" minOccurs="0"/>
|
808
|
+
<xs:element name="result-spec" type="tns:result-spec-type"/>
|
809
|
+
</xs:sequence>
|
810
|
+
</xs:complexType>
|
811
|
+
|
812
|
+
<xs:complexType name="submission-file-type">
|
813
|
+
<xs:group ref="tns:file-choice-group"/>
|
814
|
+
<xs:attribute name="id" type="xs:string" use="optional"/>
|
815
|
+
<xs:attribute name="mimetype" type="xs:string" use="optional"/>
|
816
|
+
</xs:complexType>
|
817
|
+
|
818
|
+
<xs:complexType name="submission-files-type">
|
819
|
+
<xs:sequence minOccurs="0" maxOccurs="unbounded">
|
820
|
+
<xs:element name="file" type="tns:submission-file-type"/>
|
821
|
+
</xs:sequence>
|
822
|
+
</xs:complexType>
|
823
|
+
|
824
|
+
<xs:complexType name="external-task-type">
|
825
|
+
<xs:simpleContent>
|
826
|
+
<xs:extension base="xs:string">
|
827
|
+
<xs:attribute name="uuid" type="xs:string" use="optional"/>
|
828
|
+
</xs:extension>
|
829
|
+
</xs:simpleContent>
|
830
|
+
</xs:complexType>
|
831
|
+
|
832
|
+
<xs:simpleType name="external-submission-type">
|
833
|
+
<xs:restriction base="xs:string"/>
|
834
|
+
</xs:simpleType>
|
835
|
+
|
836
|
+
<xs:complexType name="included-task-file-type">
|
837
|
+
<xs:choice>
|
838
|
+
<xs:element name="embedded-zip-file" type="tns:embedded-bin-file-type"/>
|
839
|
+
<xs:element name="attached-zip-file" type="tns:attached-bin-file-type"/>
|
840
|
+
<xs:element name="attached-xml-file" type="tns:attached-txt-file-type"/>
|
841
|
+
</xs:choice>
|
842
|
+
<xs:attribute name="uuid" type="xs:string" use="optional"/>
|
843
|
+
</xs:complexType>
|
844
|
+
|
845
|
+
<xs:complexType name="lms-type">
|
846
|
+
<xs:sequence>
|
847
|
+
<xs:element name="submission-datetime" type="xs:dateTime"/>
|
848
|
+
<xs:element name="user-id" type="xs:string" minOccurs="0" maxOccurs="unbounded"/>
|
849
|
+
<xs:element name="course-id" type="xs:string" minOccurs="0"/>
|
850
|
+
<xs:any namespace="##other" minOccurs="0" maxOccurs="unbounded"
|
851
|
+
processContents="lax"/>
|
852
|
+
</xs:sequence>
|
853
|
+
<xs:attribute name="url" type="xs:string" use="optional"/>
|
854
|
+
</xs:complexType>
|
855
|
+
|
856
|
+
<xs:complexType name="result-spec-type">
|
857
|
+
<xs:sequence>
|
858
|
+
<xs:element name="student-feedback-level" type="tns:feedback-level-type" minOccurs="0"/>
|
859
|
+
<xs:element name="teacher-feedback-level" type="tns:feedback-level-type" minOccurs="0"/>
|
860
|
+
</xs:sequence>
|
861
|
+
<xs:attribute name="format" use="required">
|
862
|
+
<xs:simpleType>
|
863
|
+
<xs:restriction base="xs:string">
|
864
|
+
<xs:enumeration value="xml"/>
|
865
|
+
<xs:enumeration value="zip"/>
|
866
|
+
</xs:restriction>
|
867
|
+
</xs:simpleType>
|
868
|
+
</xs:attribute>
|
869
|
+
<xs:attribute name="structure" use="required">
|
870
|
+
<xs:simpleType>
|
871
|
+
<xs:restriction base="xs:string">
|
872
|
+
<xs:enumeration value="merged-test-feedback"/>
|
873
|
+
<xs:enumeration value="separate-test-feedback"/>
|
874
|
+
</xs:restriction>
|
875
|
+
</xs:simpleType>
|
876
|
+
</xs:attribute>
|
877
|
+
<xs:attribute name="lang" type="xs:language"/>
|
878
|
+
</xs:complexType>
|
879
|
+
|
880
|
+
<xs:simpleType name="feedback-level-type">
|
881
|
+
<xs:restriction base="xs:string">
|
882
|
+
<xs:enumeration value="debug"/>
|
883
|
+
<xs:enumeration value="info"/>
|
884
|
+
<xs:enumeration value="warn"/>
|
885
|
+
<xs:enumeration value="error"/>
|
886
|
+
</xs:restriction>
|
887
|
+
</xs:simpleType>
|
888
|
+
|
889
|
+
<xs:complexType name="response-type">
|
890
|
+
<xs:sequence>
|
891
|
+
<xs:choice>
|
892
|
+
<xs:element name="merged-test-feedback" type="tns:merged-test-feedback-type"/>
|
893
|
+
<xs:element name="separate-test-feedback" type="tns:separate-test-feedback-type"/>
|
894
|
+
</xs:choice>
|
895
|
+
<xs:element name="files" type="tns:response-files-type"/>
|
896
|
+
<xs:element name="response-meta-data" type="tns:response-meta-data-type"/>
|
897
|
+
</xs:sequence>
|
898
|
+
<xs:attribute name="lang" type="xs:language"/>
|
899
|
+
</xs:complexType>
|
900
|
+
|
901
|
+
<xs:complexType name="response-meta-data-type">
|
902
|
+
<xs:sequence>
|
903
|
+
<xs:element name="grader-engine" type="tns:grader-engine-type"/>
|
904
|
+
<xs:any namespace="##other" minOccurs="0" maxOccurs="unbounded" processContents="lax"/>
|
905
|
+
</xs:sequence>
|
906
|
+
</xs:complexType>
|
907
|
+
|
908
|
+
<xs:complexType name="grader-engine-type">
|
909
|
+
<xs:attribute name="name" type="xs:string" use="required"/>
|
910
|
+
<xs:attribute name="version" type="xs:string" use="required"/>
|
911
|
+
</xs:complexType>
|
912
|
+
|
913
|
+
<xs:complexType name="result-type">
|
914
|
+
<xs:sequence>
|
915
|
+
<xs:element name="score" type="tns:score-type"/>
|
916
|
+
<xs:element name="validity" minOccurs="0" type="tns:validity-type"/>
|
917
|
+
</xs:sequence>
|
918
|
+
<xs:attribute name="is-internal-error" type="xs:boolean" default="false"/>
|
919
|
+
</xs:complexType>
|
920
|
+
|
921
|
+
<xs:simpleType name="score-type">
|
922
|
+
<xs:restriction base="xs:decimal">
|
923
|
+
<xs:minInclusive value="0.0"/>
|
924
|
+
<xs:maxInclusive value="1.0"/>
|
925
|
+
</xs:restriction>
|
926
|
+
</xs:simpleType>
|
927
|
+
|
928
|
+
<xs:simpleType name="validity-type">
|
929
|
+
<xs:restriction base="xs:decimal">
|
930
|
+
<xs:minInclusive value="0.0"/>
|
931
|
+
<xs:maxInclusive value="1.0"/>
|
932
|
+
</xs:restriction>
|
933
|
+
</xs:simpleType>
|
934
|
+
|
935
|
+
<xs:simpleType name="merged-feedback-type">
|
936
|
+
<xs:restriction base="xs:string"/>
|
937
|
+
</xs:simpleType>
|
938
|
+
|
939
|
+
<xs:complexType name="merged-test-feedback-type">
|
940
|
+
<xs:sequence>
|
941
|
+
<xs:element name="overall-result" type="tns:result-type"/>
|
942
|
+
<xs:element name="student-feedback" type="tns:merged-feedback-type" minOccurs="0"/>
|
943
|
+
<xs:element name="teacher-feedback" type="tns:merged-feedback-type" minOccurs="0"/>
|
944
|
+
</xs:sequence>
|
945
|
+
</xs:complexType>
|
946
|
+
|
947
|
+
<xs:complexType name="separate-test-feedback-type">
|
948
|
+
<xs:sequence>
|
949
|
+
<xs:element name="submission-feedback-list" type="tns:feedback-list-type"/>
|
950
|
+
<xs:element name="tests-response" type="tns:tests-response-type"/>
|
951
|
+
</xs:sequence>
|
952
|
+
</xs:complexType>
|
953
|
+
|
954
|
+
<xs:complexType name="tests-response-type">
|
955
|
+
<xs:sequence>
|
956
|
+
<xs:element name="test-response" type="tns:test-response-type" minOccurs="0" maxOccurs="unbounded"/>
|
957
|
+
</xs:sequence>
|
958
|
+
</xs:complexType>
|
959
|
+
|
960
|
+
<xs:complexType name="test-response-type">
|
961
|
+
<xs:choice>
|
962
|
+
<xs:element name="test-result" type="tns:test-result-type"/>
|
963
|
+
<xs:element name="subtests-response" type="tns:subtests-response-type">
|
964
|
+
<xs:key name="subtestrespids">
|
965
|
+
<xs:selector xpath=".//tns:subtest-response"/>
|
966
|
+
<xs:field xpath="@id"/>
|
967
|
+
</xs:key>
|
968
|
+
</xs:element>
|
969
|
+
</xs:choice>
|
970
|
+
<xs:attribute name="id" use="required" type="xs:string"/>
|
971
|
+
</xs:complexType>
|
972
|
+
|
973
|
+
<xs:complexType name="subtests-response-type">
|
974
|
+
<xs:sequence>
|
975
|
+
<xs:element name="subtest-response" maxOccurs="unbounded" type="tns:subtest-response-type"/>
|
976
|
+
</xs:sequence>
|
977
|
+
</xs:complexType>
|
978
|
+
|
979
|
+
<xs:complexType name="subtest-response-type">
|
980
|
+
<xs:sequence>
|
981
|
+
<xs:element name="test-result" type="tns:test-result-type"/>
|
982
|
+
</xs:sequence>
|
983
|
+
<xs:attribute name="id" use="required" type="xs:string"/>
|
984
|
+
</xs:complexType>
|
985
|
+
|
986
|
+
<xs:complexType name="test-result-type">
|
987
|
+
<xs:sequence>
|
988
|
+
<xs:element name="result" type="tns:result-type"/>
|
989
|
+
<xs:element name="feedback-list" type="tns:feedback-list-type"/>
|
990
|
+
</xs:sequence>
|
991
|
+
</xs:complexType>
|
992
|
+
|
993
|
+
<xs:complexType name="feedback-list-type">
|
994
|
+
<xs:sequence>
|
995
|
+
<xs:element name="student-feedback" minOccurs="0" maxOccurs="unbounded"
|
996
|
+
type="tns:feedback-type"/>
|
997
|
+
<xs:element name="teacher-feedback" minOccurs="0" maxOccurs="unbounded"
|
998
|
+
type="tns:feedback-type"/>
|
999
|
+
</xs:sequence>
|
1000
|
+
</xs:complexType>
|
1001
|
+
|
1002
|
+
<xs:complexType name="feedback-type">
|
1003
|
+
<xs:sequence>
|
1004
|
+
<xs:element name="title" minOccurs="0" type="xs:string"/>
|
1005
|
+
<xs:element name="content" minOccurs="0">
|
1006
|
+
<xs:complexType>
|
1007
|
+
<xs:simpleContent>
|
1008
|
+
<xs:extension base="xs:string">
|
1009
|
+
<xs:attribute name="format" use="required">
|
1010
|
+
<xs:simpleType>
|
1011
|
+
<xs:restriction base="xs:string">
|
1012
|
+
<xs:enumeration value="html"/>
|
1013
|
+
<xs:enumeration value="plaintext"/>
|
1014
|
+
</xs:restriction>
|
1015
|
+
</xs:simpleType>
|
1016
|
+
</xs:attribute>
|
1017
|
+
</xs:extension>
|
1018
|
+
</xs:simpleContent>
|
1019
|
+
</xs:complexType>
|
1020
|
+
</xs:element>
|
1021
|
+
<xs:element name="filerefs" type="tns:filerefs-type" minOccurs="0"/>
|
1022
|
+
</xs:sequence>
|
1023
|
+
<xs:attribute name="level" type="tns:feedback-level-type"/>
|
1024
|
+
</xs:complexType>
|
1025
|
+
|
1026
|
+
<xs:complexType name="response-file-type">
|
1027
|
+
<xs:group ref="tns:file-choice-group"/>
|
1028
|
+
<xs:attribute name="id" type="xs:string" use="required"/>
|
1029
|
+
<xs:attribute name="mimetype" type="xs:string" use="optional"/>
|
1030
|
+
<xs:attribute name="title" type="xs:string" use="required"/>
|
1031
|
+
</xs:complexType>
|
1032
|
+
|
1033
|
+
<xs:complexType name="response-files-type">
|
1034
|
+
<xs:sequence minOccurs="0" maxOccurs="unbounded">
|
1035
|
+
<xs:element name="file" type="tns:response-file-type"/>
|
1036
|
+
</xs:sequence>
|
1037
|
+
</xs:complexType>
|
1038
|
+
</xs:schema>
|