mods 2.3.0 → 3.0.0.alpha1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (45) hide show
  1. checksums.yaml +5 -5
  2. data/.github/workflows/ruby.yml +24 -0
  3. data/.gitignore +1 -0
  4. data/Gemfile +1 -5
  5. data/README.md +1 -3
  6. data/lib/mods/marc_country_codes.rb +12 -10
  7. data/lib/mods/nom_terminology.rb +109 -848
  8. data/lib/mods/origin_info.rb +3 -1
  9. data/lib/mods/reader.rb +9 -39
  10. data/lib/mods/record.rb +13 -28
  11. data/lib/mods/version.rb +1 -1
  12. data/mods.gemspec +4 -4
  13. data/spec/fixture_data/hp566jq8781.xml +334 -0
  14. data/spec/integration/parker_spec.rb +217 -0
  15. data/spec/{date_spec.rb → lib/date_spec.rb} +0 -0
  16. data/spec/lib/language_spec.rb +123 -0
  17. data/spec/lib/location_spec.rb +175 -0
  18. data/spec/lib/name_spec.rb +366 -0
  19. data/spec/lib/origin_info_spec.rb +134 -0
  20. data/spec/lib/part_spec.rb +162 -0
  21. data/spec/lib/physical_description_spec.rb +72 -0
  22. data/spec/{reader_spec.rb → lib/reader_spec.rb} +1 -41
  23. data/spec/lib/record_info_spec.rb +114 -0
  24. data/spec/lib/record_spec.rb +287 -0
  25. data/spec/lib/related_item_spec.rb +124 -0
  26. data/spec/lib/subject_spec.rb +427 -0
  27. data/spec/lib/title_spec.rb +108 -0
  28. data/spec/lib/top_level_elmnts_simple_spec.rb +169 -0
  29. data/spec/spec_helper.rb +87 -6
  30. data/spec/support/fixtures.rb +9 -0
  31. metadata +65 -47
  32. data/.coveralls.yml +0 -1
  33. data/.travis.yml +0 -12
  34. data/spec/language_spec.rb +0 -118
  35. data/spec/location_spec.rb +0 -295
  36. data/spec/name_spec.rb +0 -759
  37. data/spec/origin_info_spec.rb +0 -442
  38. data/spec/part_spec.rb +0 -471
  39. data/spec/physical_description_spec.rb +0 -144
  40. data/spec/record_info_spec.rb +0 -493
  41. data/spec/record_spec.rb +0 -356
  42. data/spec/related_item_spec.rb +0 -305
  43. data/spec/subject_spec.rb +0 -809
  44. data/spec/title_spec.rb +0 -226
  45. data/spec/top_level_elmnts_simple_spec.rb +0 -369
@@ -1,442 +0,0 @@
1
- # encoding: utf-8
2
- require 'spec_helper'
3
-
4
- describe "Mods <originInfo> Element" do
5
- before(:all) do
6
- @mods_rec = Mods::Record.new
7
- @ns_decl = "xmlns='#{Mods::MODS_NS}'"
8
- @kolb = "<mods>
9
- <originInfo>
10
- <dateCreated>1537-1553.</dateCreated>
11
- <dateCreated point='start'>1537</dateCreated>
12
- <dateCreated point='end'>1553</dateCreated>
13
- </originInfo></mods>"
14
- @reid_dennis = "<mods><originInfo><dateIssued>1852</dateIssued></originInfo></mods>"
15
- @walters = "<mods><originInfo>
16
- <place>
17
- <placeTerm type='text'>Iran</placeTerm>
18
- </place>
19
- <dateIssued>22 Rabīʿ II 889 AH / 1484 CE</dateIssued>
20
- <issuance>monographic</issuance>
21
- </originInfo>
22
- </mods>"
23
- @simple = "<mods><originInfo><dateIssued>circa 1900</dateIssued></originInfo></mods>"
24
- @ew = "<mods><originInfo>
25
- <place>
26
- <placeTerm type='text'>Reichenau Abbey, Lake Constance, Germany</placeTerm>
27
- </place>
28
- <dateIssued>Middle of the 11th century CE</dateIssued>
29
- <issuance>monographic</issuance>
30
- </originInfo>
31
- </mods>"
32
- @e = "<mods><originInfo>
33
- <place>
34
- <placeTerm type='code' authority='marccountry'>au</placeTerm>
35
- </place>
36
- <place>
37
- <placeTerm type='text'>[Austria?</placeTerm>
38
- </place>
39
- <dateIssued>circa 1180-1199]</dateIssued>
40
- <issuance>monographic</issuance>
41
- </originInfo></mods>"
42
- @f = "<mods> <originInfo>
43
- <place>
44
- <placeTerm authority='marccountry' type='code'>cau</placeTerm>
45
- </place>
46
- <dateIssued encoding='marc' keyDate='yes' point='start'>1850</dateIssued>
47
- <dateIssued encoding='marc' point='end'>1906</dateIssued>
48
- <issuance>monographic</issuance>
49
- </originInfo>
50
- </mods>"
51
- @ex = "<mods><originInfo>
52
- <place>
53
- <placeTerm>France and Italy</placeTerm>
54
- </place>
55
- <dateCreated keyDate='yes' qualifier='inferred'>173-?</dateCreated>
56
- </originInfo>
57
- </mods>"
58
- @ex1 = "<mods><originInfo>
59
- <publisher>Robot Publishing</publisher>
60
- <place>
61
- <placeTerm>France</placeTerm>
62
- </place>
63
- <place>
64
- <placeTerm>Italy</placeTerm>
65
- </place>
66
- <dateCreated keyDate='yes' qualifier='inferred'>173-?</dateCreated>
67
- <dateIssued>1850</dateIssued>
68
- </originInfo>
69
- </mods>"
70
- @ex2 = "<mods><originInfo>
71
- <place>
72
- <placeTerm type='code' authority='marccountry'>enk</placeTerm>
73
- </place>
74
- <place>
75
- <placeTerm type='text'>[London]</placeTerm>
76
- </place>
77
- <publisher>Bunney &amp; Gold</publisher>
78
- <dateIssued>1799</dateIssued>
79
- <dateIssued encoding='marc' keyDate='yes'>1799</dateIssued>
80
- <issuance>monographic</issuance>
81
- </originInfo>
82
- </mods>"
83
- @ex3 = "<mods><originInfo>
84
- <place>
85
- <placeTerm type='code' authority='marccountry'>xx</placeTerm>
86
- </place>
87
- <place>
88
- <placeTerm type='text'>[s.l. : s.n.]</placeTerm>
89
- </place>
90
- <dateIssued>1780?]</dateIssued>
91
- <dateIssued encoding='marc' keyDate='yes'>178u</dateIssued>
92
- <issuance>monographic</issuance>
93
- </originInfo>
94
- </mods>"
95
- @ex4 = "<mods><originInfo>
96
- <place>
97
- <placeTerm type='code' authority='marccountry'>fr</placeTerm>
98
- </place>
99
- <place>
100
- <placeTerm type='text'>[S.l.]</placeTerm>
101
- </place>
102
- <publisher>[s.n.]</publisher>
103
- <dateIssued>[1740.]</dateIssued>
104
- <dateIssued encoding='marc' point='start' qualifier='questionable' keyDate='yes'>1740</dateIssued>
105
- <dateIssued encoding='marc' point='end' qualifier='questionable'>1749</dateIssued>
106
- <issuance>monographic</issuance>
107
- </originInfo>
108
- </mods>"
109
- @ex5 = "<mods><originInfo>
110
- <place>
111
- <placeTerm type='code' authority='marccountry'>xx</placeTerm>
112
- </place>
113
- <place>
114
- <placeTerm type='text'>[S.l.]</placeTerm>
115
- </place>
116
- <publisher>Olney</publisher>
117
- <dateIssued>1844</dateIssued>
118
- <dateIssued encoding='marc' keyDate='yes'>1844</dateIssued>
119
- <issuance>monographic</issuance>
120
- </originInfo>
121
- </mods>"
122
- @ex6 = "<mods><originInfo>
123
- <place>
124
- <placeTerm type='code' authority='marccountry'>enk</placeTerm>
125
- </place>
126
- <place>
127
- <placeTerm type='text'>[London</placeTerm>
128
- </place>
129
- <publisher>Printed for William Innys and Joseph Richardson ... [et al.]</publisher>
130
- <dateIssued>1752]</dateIssued>
131
- <dateIssued encoding='marc' keyDate='yes'>1752</dateIssued>
132
- <issuance>monographic</issuance>
133
- </originInfo>
134
- </mods>"
135
- @ex7 = "<mods><originInfo>
136
- <place>
137
- <placeTerm authority='marccountry' type='code'>fr</placeTerm>
138
- </place>
139
- <place>
140
- <placeTerm type='text'>[S.l.]</placeTerm>
141
- </place>
142
- <publisher>[s.n.]</publisher>
143
- <dateIssued>[1740.]</dateIssued>
144
- <dateIssued encoding='marc' keyDate='yes' point='start' qualifier='questionable'>1740</dateIssued>
145
- <dateIssued encoding='marc' point='end' qualifier='questionable'>1749</dateIssued>
146
- <issuance>monographic</issuance>
147
- </originInfo>
148
- </mods>"
149
-
150
- xml = "<originInfo>
151
- <dateCreated encoding='w3cdtf' keyDate='yes' point='start' qualifier='approximate'>250 B.C.</dateCreated>
152
- <dateCreated encoding='w3cdtf' keyDate='yes' point='end' qualifier='approximate'>150 B.C.</dateCreated>
153
- </originInfo>"
154
-
155
- end
156
-
157
- context "parsing date values" do
158
- it "should cope with slop" do
159
- skip "to be implemented"
160
- end
161
- it "should know something about various date encodings: w3cdtf, iso8601, marc, edtf, temper" do
162
- skip "to be implemented"
163
- end
164
- it "should know the only valid values for point attribute are 'start' and 'end'" do
165
- skip "to be implemented"
166
- end
167
- it "should know the only valid value for keyDate attribute is 'yes" do
168
- skip "to be implemented"
169
- end
170
- it "should know the only valid values for qualifier attribute: approximate, inferred, questionable" do
171
- skip "to be implemented"
172
- end
173
- end
174
-
175
- context "parsing issuance" do
176
- it "should know the only valid values are: continuing, monographic, single unit, multipart monograph, serial, integrating resource" do
177
- skip "to be implemented"
178
- end
179
- end
180
-
181
- context "parsing publisher" do
182
- it "should ignore s.n. value (from MARC)" do
183
- skip "to be implemented"
184
- end
185
- it "should leave square brackets alone, except for s.n." do
186
- skip "to be implemented"
187
- end
188
- end
189
-
190
- context "parsing placeTerm" do
191
- it "should be able to translate marccountry codes" do
192
- skip "to be implemented"
193
- end
194
- it "should ignore s.l. value (from MARC)" do
195
- skip "to be implemented"
196
- end
197
- it "should be forgiving of square brackets (from MARC), matched or unmatched" do
198
- skip "to be implemented"
199
- end
200
- end
201
-
202
-
203
- context "basic <originInfo> terminology pieces" do
204
-
205
- context "WITH namespaces" do
206
- context "<place> child element" do
207
- before(:all) do
208
- @place_term_text = "<mods #{@ns_decl}><originInfo><place><placeTerm type='text'>Iran</placeTerm></place></originInfo></mods>"
209
- @place_term_plain_mult = "<mods #{@ns_decl}><originInfo>
210
- <place><placeTerm>France</placeTerm></place>
211
- <place><placeTerm>Italy</placeTerm></place></originInfo></mods>"
212
- @place_term_code = "<mods #{@ns_decl}><originInfo><place><placeTerm authority='marccountry' type='code'>fr</placeTerm></place></originInfo></mods>"
213
- @yuck1 = "<mods #{@ns_decl}><originInfo><place><placeTerm type='text'>[S.l.]</placeTerm></place></originInfo></mods>"
214
- @yuck2 = "<mods #{@ns_decl}><originInfo><place><placeTerm type='text'>[London</placeTerm></place></originInfo></mods>"
215
- @yuck3 = "<mods #{@ns_decl}><originInfo><place><placeTerm type='text'>[s.l. : s.n.]</placeTerm></place></originInfo></mods>"
216
- @yuck4 = "<mods #{@ns_decl}><originInfo><place><placeTerm type='text'>[London]</placeTerm></place></originInfo></mods>"
217
- end
218
- context "<placeTerm> child element" do
219
- it "should get element values" do
220
- vals = @mods_rec.from_str(@place_term_plain_mult).origin_info.place.placeTerm.map { |e| e.text}
221
- expect(vals.size).to eq(2)
222
- expect(vals).to include("France")
223
- expect(vals).to include("Italy")
224
- end
225
- it "should get authority attribute" do
226
- expect(@mods_rec.from_str(@place_term_code).origin_info.place.placeTerm.authority).to eq(["marccountry"])
227
- end
228
- it "should get type(_at) attribute" do
229
- expect(@mods_rec.from_str(@place_term_code).origin_info.place.placeTerm.type_at).to eq(["code"])
230
- end
231
- end # placeTerm
232
- end # place
233
-
234
- context "<publisher> child element" do
235
- before(:all) do
236
- @ex = "<mods #{@ns_decl}><originInfo><publisher>Olney</publisher></origin_info></mods>"
237
- @yuck1 = "<mods #{@ns_decl}><originInfo><publisher>[s.n.]</publisher></originInfo></mods>"
238
- @yuck2 = "<mods #{@ns_decl}><originInfo><publisher>Printed for William Innys and Joseph Richardson ... [et al.]</publisher></originInfo></mods>"
239
- end
240
- it "should get element values" do
241
- vals = @mods_rec.from_str("<mods #{@ns_decl}><originInfo><publisher>Olney</publisher></origin_info></mods>").origin_info.publisher
242
- expect(vals.map { |n| n.text }).to eq(["Olney"])
243
- end
244
- end
245
-
246
- describe '#as_object' do
247
- describe '#key_dates' do
248
- it 'should extract the date with the keyDate attribute' do
249
- @mods_rec.from_str("<mods #{@ns_decl}><originInfo><dateCreated>other date</dateCreated><dateCreated keyDate='yes'>key date</dateCreated></originInfo></mods>")
250
- expect(@mods_rec.origin_info.as_object.first.key_dates.first.text).to eq 'key date'
251
- end
252
- end
253
- end
254
-
255
- context "<xxxDate> child elements" do
256
- it "should recognize each element" do
257
- Mods::ORIGIN_INFO_DATE_ELEMENTS.each { |elname|
258
- @mods_rec.from_str("<mods #{@ns_decl}><originInfo><#{elname}>date</#{elname}></originInfo></mods>")
259
- expect(@mods_rec.origin_info.send(elname.to_sym).map { |n| n.text }).to eq(["date"])
260
- }
261
- end
262
- it "should recognize encoding attribute on each element" do
263
- Mods::ORIGIN_INFO_DATE_ELEMENTS.each { |elname|
264
- @mods_rec.from_str("<mods #{@ns_decl}><originInfo><#{elname} encoding='foo'>date</#{elname}></originInfo></mods>")
265
- expect(@mods_rec.origin_info.send(elname.to_sym).encoding).to eq(["foo"])
266
- }
267
- end
268
- it "should recognize keyDate attribute" do
269
- Mods::ORIGIN_INFO_DATE_ELEMENTS.each { |elname|
270
- @mods_rec.from_str("<mods #{@ns_decl}><originInfo><#{elname} keyDate='foo'>date</#{elname}></originInfo></mods>")
271
- expect(@mods_rec.origin_info.send(elname.to_sym).keyDate).to eq(["foo"])
272
- }
273
- end
274
- it "should recognize point attribute" do
275
- # NOTE: values allowed are 'start' and 'end'
276
- Mods::ORIGIN_INFO_DATE_ELEMENTS.each { |elname|
277
- @mods_rec.from_str("<mods #{@ns_decl}><originInfo><#{elname} point='foo'>date</#{elname}></originInfo></mods>")
278
- expect(@mods_rec.origin_info.send(elname.to_sym).point).to eq(["foo"])
279
- }
280
- end
281
- it "should recognize qualifier attribute" do
282
- Mods::ORIGIN_INFO_DATE_ELEMENTS.each { |elname|
283
- @mods_rec.from_str("<mods #{@ns_decl}><originInfo><#{elname} qualifier='foo'>date</#{elname}></originInfo></mods>")
284
- expect(@mods_rec.origin_info.send(elname.to_sym).qualifier).to eq(["foo"])
285
- }
286
- end
287
- it "should recognize type attribute only on dateOther" do
288
- Mods::ORIGIN_INFO_DATE_ELEMENTS.each { |elname|
289
- @mods_rec.from_str("<mods #{@ns_decl}><originInfo><#{elname} type='foo'>date</#{elname}></originInfo></mods>")
290
- if elname == 'dateOther'
291
- expect(@mods_rec.origin_info.send(elname.to_sym).type_at).to eq(["foo"])
292
- else
293
- expect { @mods_rec.origin_info.send(elname.to_sym).type_at}.to raise_exception(NoMethodError, /type_at/)
294
- end
295
- }
296
- end
297
- end # <xxxDate> child elements
298
-
299
- it "<edition> child element" do
300
- xml = "<mods #{@ns_decl}><originInfo><edition>7th ed.</edition></originInfo></mods>"
301
- expect(@mods_rec.from_str(xml).origin_info.edition.map { |n| n.text }).to eq(['7th ed.'])
302
- end
303
-
304
- context "<issuance> child element" do
305
- before(:all) do
306
- @ex = "<mods #{@ns_decl}><originInfo><issuance>monographic</issuance></originInfo></mods>"
307
- end
308
- it "should get element value" do
309
- expect(@mods_rec.from_str(@ex).origin_info.issuance.map { |n| n.text }).to eq(['monographic'])
310
- end
311
- end
312
-
313
- context "<frequency> child element" do
314
- before(:all) do
315
- xml = "<mods #{@ns_decl}><originInfo><frequency authority='marcfrequency'>Annual</frequency></originInfo></mods>"
316
- @origin_info = @mods_rec.from_str(xml).origin_info
317
- end
318
- it "should get element value" do
319
- expect(@origin_info.frequency.map { |n| n.text }).to eq(["Annual"])
320
- end
321
- it "should recognize the authority attribute" do
322
- expect(@origin_info.frequency.authority).to eq(["marcfrequency"])
323
- end
324
- end
325
- end # WITH namspaces
326
-
327
- context "WITHOUT namespaces" do
328
- context "<place> child element" do
329
- before(:all) do
330
- @place_term_text = "<mods><originInfo><place><placeTerm type='text'>Iran</placeTerm></place></originInfo></mods>"
331
- @place_term_plain_mult = "<mods><originInfo>
332
- <place><placeTerm>France</placeTerm></place>
333
- <place><placeTerm>Italy</placeTerm></place></originInfo></mods>"
334
- @place_term_code = "<mods><originInfo><place><placeTerm authority='marccountry' type='code'>fr</placeTerm></place></originInfo></mods>"
335
- @yuck1 = "<mods><originInfo><place><placeTerm type='text'>[S.l.]</placeTerm></place></originInfo></mods>"
336
- @yuck2 = "<mods><originInfo><place><placeTerm type='text'>[London</placeTerm></place></originInfo></mods>"
337
- @yuck3 = "<mods><originInfo><place><placeTerm type='text'>[s.l. : s.n.]</placeTerm></place></originInfo></mods>"
338
- @yuck4 = "<mods><originInfo><place><placeTerm type='text'>[London]</placeTerm></place></originInfo></mods>"
339
- end
340
- context "<placeTerm> child element" do
341
- it "should get element values" do
342
- vals = @mods_rec.from_str(@place_term_plain_mult, false).origin_info.place.placeTerm.map { |e| e.text}
343
- expect(vals.size).to eq(2)
344
- expect(vals).to include("France")
345
- expect(vals).to include("Italy")
346
- end
347
- it "should get authority attribute" do
348
- expect(@mods_rec.from_str(@place_term_code, false).origin_info.place.placeTerm.authority).to eq(["marccountry"])
349
- end
350
- it "should get type(_at) attribute" do
351
- expect(@mods_rec.from_str(@place_term_code, false).origin_info.place.placeTerm.type_at).to eq(["code"])
352
- end
353
- end # placeTerm
354
- end # place
355
-
356
- context "<publisher> child element" do
357
- before(:all) do
358
- @ex = "<mods><originInfo><publisher>Olney</publisher></origin_info></mods>"
359
- @yuck1 = "<mods><originInfo><publisher>[s.n.]</publisher></originInfo></mods>"
360
- @yuck2 = "<mods><originInfo><publisher>Printed for William Innys and Joseph Richardson ... [et al.]</publisher></originInfo></mods>"
361
- end
362
- it "should get element values" do
363
- vals = @mods_rec.from_str("<mods><originInfo><publisher>Olney</publisher></origin_info></mods>", false).origin_info.publisher
364
- expect(vals.map { |n| n.text }).to eq(["Olney"])
365
- end
366
- end
367
-
368
- context "<xxxDate> child elements" do
369
- it "should recognize each element" do
370
- Mods::ORIGIN_INFO_DATE_ELEMENTS.each { |elname|
371
- @mods_rec.from_str("<mods><originInfo><#{elname}>date</#{elname}></originInfo></mods>", false)
372
- expect(@mods_rec.origin_info.send(elname.to_sym).map { |n| n.text }).to eq(["date"])
373
- }
374
- end
375
- it "should recognize encoding attribute on each element" do
376
- Mods::ORIGIN_INFO_DATE_ELEMENTS.each { |elname|
377
- @mods_rec.from_str("<mods><originInfo><#{elname} encoding='foo'>date</#{elname}></originInfo></mods>", false)
378
- expect(@mods_rec.origin_info.send(elname.to_sym).encoding).to eq(["foo"])
379
- }
380
- end
381
- it "should recognize keyDate attribute" do
382
- Mods::ORIGIN_INFO_DATE_ELEMENTS.each { |elname|
383
- @mods_rec.from_str("<mods><originInfo><#{elname} keyDate='foo'>date</#{elname}></originInfo></mods>", false)
384
- expect(@mods_rec.origin_info.send(elname.to_sym).keyDate).to eq(["foo"])
385
- }
386
- end
387
- it "should recognize point attribute" do
388
- # NOTE: values allowed are 'start' and 'end'
389
- Mods::ORIGIN_INFO_DATE_ELEMENTS.each { |elname|
390
- @mods_rec.from_str("<mods><originInfo><#{elname} point='foo'>date</#{elname}></originInfo></mods>", false)
391
- expect(@mods_rec.origin_info.send(elname.to_sym).point).to eq(["foo"])
392
- }
393
- end
394
- it "should recognize qualifier attribute" do
395
- Mods::ORIGIN_INFO_DATE_ELEMENTS.each { |elname|
396
- @mods_rec.from_str("<mods><originInfo><#{elname} qualifier='foo'>date</#{elname}></originInfo></mods>", false)
397
- expect(@mods_rec.origin_info.send(elname.to_sym).qualifier).to eq(["foo"])
398
- }
399
- end
400
- it "should recognize type attribute only on dateOther" do
401
- Mods::ORIGIN_INFO_DATE_ELEMENTS.each { |elname|
402
- @mods_rec.from_str("<mods><originInfo><#{elname} type='foo'>date</#{elname}></originInfo></mods>", false)
403
- if elname == 'dateOther'
404
- expect(@mods_rec.origin_info.send(elname.to_sym).type_at).to eq(["foo"])
405
- else
406
- expect { @mods_rec.origin_info.send(elname.to_sym).type_at}.to raise_exception(NoMethodError, /type_at/)
407
- end
408
- }
409
- end
410
- end # <xxxDate> child elements
411
-
412
- it "<edition> child element" do
413
- xml = "<mods><originInfo><edition>7th ed.</edition></originInfo></mods>"
414
- expect(@mods_rec.from_str(xml, false).origin_info.edition.map { |n| n.text }).to eq(['7th ed.'])
415
- end
416
-
417
- context "<issuance> child element" do
418
- before(:all) do
419
- @ex = "<mods><originInfo><issuance>monographic</issuance></originInfo></mods>"
420
- end
421
- it "should get element value" do
422
- expect(@mods_rec.from_str(@ex, false).origin_info.issuance.map { |n| n.text }).to eq(['monographic'])
423
- end
424
- end
425
-
426
- context "<frequency> child element" do
427
- before(:all) do
428
- xml = "<mods><originInfo><frequency authority='marcfrequency'>Annual</frequency></originInfo></mods>"
429
- @origin_info = @mods_rec.from_str(xml, false).origin_info
430
- end
431
- it "should get element value" do
432
- expect(@origin_info.frequency.map { |n| n.text }).to eq(["Annual"])
433
- end
434
- it "should recognize the authority attribute" do
435
- expect(@origin_info.frequency.authority).to eq(["marcfrequency"])
436
- end
437
- end
438
- end # WITHOUT namspaces
439
-
440
- end # basic terminology
441
-
442
- end