libis-tools 0.9.9 → 0.9.10

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.
Files changed (40) hide show
  1. checksums.yaml +4 -4
  2. data/.travis.yml +4 -2
  3. data/README.md +19 -0
  4. data/lib/libis/tools.rb +1 -0
  5. data/lib/libis/tools/config_file.rb +1 -1
  6. data/lib/libis/tools/extend/kernel.rb +16 -0
  7. data/lib/libis/tools/metadata.rb +20 -0
  8. data/lib/libis/tools/metadata/dublin_core_record.rb +1 -1
  9. data/lib/libis/tools/metadata/{field_spec.rb → field_format.rb} +7 -7
  10. data/lib/libis/tools/metadata/fix_field.rb +6 -1
  11. data/lib/libis/tools/metadata/mapper.rb +80 -0
  12. data/lib/libis/tools/metadata/mappers/flandrica.rb +69 -0
  13. data/lib/libis/tools/metadata/mappers/kuleuven.rb +1702 -0
  14. data/lib/libis/tools/metadata/marc21_record.rb +5 -4
  15. data/lib/libis/tools/metadata/marc_record.rb +96 -37
  16. data/lib/libis/tools/metadata/parser/basic_parser.rb +118 -0
  17. data/lib/libis/tools/metadata/parser/dublin_core_parser.rb +36 -0
  18. data/lib/libis/tools/metadata/parser/marc21_parser.rb +206 -0
  19. data/lib/libis/tools/metadata/parser/marc_format_parser.rb +52 -0
  20. data/lib/libis/tools/metadata/parser/marc_rules.rb +35 -0
  21. data/lib/libis/tools/metadata/parser/marc_select_parser.rb +25 -0
  22. data/lib/libis/tools/metadata/parser/patch.rb +21 -0
  23. data/lib/libis/tools/metadata/parser/subfield_criteria_parser.rb +71 -0
  24. data/lib/libis/tools/metadata/parsers.rb +12 -0
  25. data/lib/libis/tools/metadata/var_field.rb +57 -47
  26. data/lib/libis/tools/parameter.rb +12 -2
  27. data/lib/libis/tools/version.rb +1 -1
  28. data/libis-tools.gemspec +4 -3
  29. data/spec/config_spec.rb +3 -1
  30. data/spec/data/MetadataMapping.xlsx +0 -0
  31. data/spec/metadata/8389207.marc +96 -0
  32. data/spec/metadata/dublin_core_parser_spec.rb +48 -0
  33. data/spec/metadata/marc21_parser_data.rb +382 -0
  34. data/spec/metadata/marc21_parser_spec.rb +67 -0
  35. data/spec/metadata/marc21_spec.rb +116 -0
  36. data/spec/metadata/metadata_mapper_spec.rb +23 -0
  37. data/spec/spec_helper.rb +13 -0
  38. data/test.rb +61 -0
  39. metadata +77 -7
  40. data/lib/libis/tools/dc_record.rb +0 -47
@@ -0,0 +1,67 @@
1
+ # encoding: utf-8
2
+ require_relative '../spec_helper'
3
+ require 'libis/tools/metadata/parser/marc21_parser'
4
+ require 'parslet/convenience'
5
+ require 'pp'
6
+
7
+ require_relative 'marc21_parser_data'
8
+
9
+ describe 'MARC 21 parser' do
10
+ subject(:parser) { Libis::Tools::Metadata::Marc21Parser.new }
11
+
12
+ context 'Syntax parser' do
13
+
14
+ marc21_parser_testdata.each do |expectation|
15
+
16
+ next unless expectation.has_key?(:tree)
17
+
18
+ if expectation[:tree] != :failure
19
+ it "parses #{expectation[:title]}" do
20
+ expect {
21
+ # noinspection RubyArgCount,RubyUnusedLocalVariable
22
+ tree = parser.select.parse(expectation[:input]) if expectation[:title] =~ /^select /
23
+ # noinspection RubyArgCount,RubyUnusedLocalVariable
24
+ tree = parser.format.parse(expectation[:input]) if expectation[:title] =~ /^format /
25
+ # pp tree
26
+ expect(tree).to be_a Hash
27
+ expect(tree).to match expectation[:tree]
28
+ }.to_not raise_error
29
+ end
30
+ else
31
+ it "does not parse #{expectation[:title]}" do
32
+ expect {
33
+ # noinspection RubyArgCount,RubyUnusedLocalVariable
34
+ tree = parser.select.parse(expectation[:input]) if expectation[:title] =~ /^select /
35
+ # noinspection RubyArgCount,RubyUnusedLocalVariable
36
+ tree = parser.format.parse(expectation[:input]) if expectation[:title] =~ /^format /
37
+ # pp tree
38
+ }.to raise_error(Parslet::ParseFailed)
39
+ end
40
+ end
41
+
42
+ end
43
+ end
44
+
45
+ context 'Transformer' do
46
+
47
+ let(:transformer) { parser.transformer }
48
+
49
+ it 'can be created' do
50
+ expect(transformer).to be_a Libis::Tools::Metadata::Marc21Parser::Transformer
51
+ end
52
+
53
+ marc21_parser_testdata.each do |expectation|
54
+
55
+ next unless expectation.has_key?(:transform)
56
+
57
+ it "transforms #{expectation[:title]}" do
58
+ tree = parser.parse(expectation[:input])
59
+ # pp tree
60
+ expect(transformer.apply(tree)).to eq expectation[:transform]
61
+ end
62
+
63
+ end
64
+
65
+ end
66
+
67
+ end
@@ -0,0 +1,116 @@
1
+ # encoding: utf-8
2
+ require_relative '../spec_helper'
3
+ require 'libis/tools/metadata/marc21_record'
4
+ require 'libis/tools/xml_document'
5
+
6
+ require 'rspec/matchers'
7
+ require 'equivalent-xml'
8
+ require 'libis/tools/extend/string'
9
+
10
+ describe 'Marc21Record' do
11
+
12
+ subject(:record) { Libis::Tools::Metadata::Marc21Record.new(data) {} }
13
+ let(:data) { xml.root }
14
+
15
+ context '8389207' do
16
+ let(:xml) { Libis::Tools::XmlDocument.open(File.join(File.dirname(__FILE__), '8389207.marc')) }
17
+
18
+ it 'load from xml' do
19
+ expect(record.marc_dump).to eq <<-STR.align_left
20
+ LDR:'01068nam 2200241u 4500'
21
+ 005:'20150701153710.0'
22
+ 008:'000608m17221724xx |||| | 000|0 lat c'
23
+ 001:'9921543960101471'
24
+ 035: : :
25
+ \ta:["(BeLVLBS)002154396LBS01-Aleph"]
26
+ 035: : :
27
+ \ta:["8389207"]
28
+ 245:0:0:
29
+ \ta:["Anecdota Graeca, sacra et profana /"]
30
+ \tc:["ex codicibus manu exaratis nunc primum in lucem edita, versione Latina donata, et notis\\n illustrata a Io. Christophoro Wolfio ... Tom. I [-IIII]\\n "]
31
+ 264: :1:
32
+ \ta:["Hamburgi"]
33
+ \tb:["apud Theodorum Christophorum Felginer,"]
34
+ \tc:["1722-1724"]
35
+ 300: : :
36
+ \ta:["8o: 4 v.; [22], 298, [8]; [16], 354, [1]; [16], 299, [7]; [16], 271, [5] p."]
37
+ 336: : :
38
+ \ta:["text"]
39
+ \t2:["rdacontent"]
40
+ 337: : :
41
+ \ta:["unmediated"]
42
+ \t2:["rdamedia"]
43
+ 338: : :
44
+ \ta:["volume"]
45
+ \t2:["rdacarrier"]
46
+ 500: : :
47
+ \ta:["Ded. Petrus Theodorus Seelmann; Erdmannus Neumeister; Thomas Claussen; Joannes Grammius\\n "]
48
+ 500: : :
49
+ \ta:["Elk deel heeft eigen titelp. in roodzwartdruk, met drukkersmerk"]
50
+ 650: :7:
51
+ \t2:["UDC"]
52
+ \ta:["276 =75"]
53
+ \tx:["Griekse patrologie"]
54
+ 653: :6:
55
+ \ta:["Books before 1840"]
56
+ 700:1: :
57
+ \ta:["Wolf, Johann Christoph"]
58
+ \td:["1683-1739"]
59
+ \t4:["aut"]
60
+ 953: : :
61
+ \ta:["1701-1750"]
62
+ 998: : :
63
+ \ta:["LBS01"]
64
+ \tb:["bib_200501.mrc.2.av"]
65
+ INST: : :
66
+ \ta:["32KUL_LIBIS_NETWORK"]
67
+ \tb:["P"]
68
+ \tc:["71134440820001471"]
69
+ INST: : :
70
+ \ta:["32KUL_KUL"]
71
+ \tb:["P"]
72
+ \tc:["21304345390001488"]
73
+ AVA: : :
74
+ \ta:["32KUL_KUL"]
75
+ \tb:["GBIB"]
76
+ \tc:["GBIB: Godgeleerdheid"]
77
+ \td:["276.030.4 WOLF Anec"]
78
+ \te:["available"]
79
+ \tf:["1"]
80
+ \tg:["0"]
81
+ \tj:["GBIB"]
82
+ \tp:["1"]
83
+ MMS: : :
84
+ \tb:["9921543960101471"]
85
+ \ta:["32KUL_LIBIS_NETWORK"]
86
+ MMS: : :
87
+ \tb:["9921543960101488"]
88
+ \ta:["32KUL_KUL"]
89
+ STR
90
+ end
91
+
92
+ it 'convert to dublin core' do
93
+ record.extend Libis::Tools::Metadata::Mappers::Kuleuven
94
+ xml_doc = Libis::Tools::XmlDocument.parse <<STR
95
+ <?xml version="1.0" encoding="utf-8"?>
96
+ <record xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:dcterms="http://purl.org/dc/terms/">
97
+ <dc:identifier>urn:ControlNumber:9921543960101471</dc:identifier>
98
+ <dc:identifier>(BeLVLBS)002154396LBS01-Aleph</dc:identifier>
99
+ <dc:identifier>8389207</dc:identifier>
100
+ <dc:title>Anecdota Graeca, sacra et profana /</dc:title>
101
+ <dc:creator>Wolf, Johann Christoph, 1683-1739, (author)</dc:creator>
102
+ <dc:description>Ded. Petrus Theodorus Seelmann; Erdmannus Neumeister; Thomas Claussen; Joannes Grammius\n \nElk deel heeft eigen titelp. in roodzwartdruk, met drukkersmerk</dc:description>
103
+ <dc:date>1722 - 1724</dc:date>
104
+ <dcterms:extent>8o: 4 v.; [22], 298, [8]; [16], 354, [1]; [16], 299, [7]; [16], 271, [5] p.</dcterms:extent>
105
+ <dc:language/>
106
+ </record>
107
+ STR
108
+ expect(record.to_dc.root).to be_equivalent_to(xml_doc.root).respecting_element_order
109
+ record.to_dc.elements.each_with_index do |element, i|
110
+ expect(element).to be_equivalent_to(xml_doc.root.elements[i])
111
+ end
112
+ end
113
+ end
114
+
115
+ end
116
+
@@ -0,0 +1,23 @@
1
+ # encoding: utf-8
2
+ require_relative '../spec_helper'
3
+ require 'libis/tools/metadata/mapper'
4
+ require 'libis/tools/metadata/parsers'
5
+ require 'parslet'
6
+ require 'parslet/convenience'
7
+ require 'pp'
8
+
9
+ $DEBUG = false
10
+
11
+ describe 'Metadata Mapper' do
12
+
13
+ subject(:mapper) { Libis::Tools::Metadata::Mapper.new(
14
+ Libis::Tools::Metadata::Marc21Parser.new,
15
+ Libis::Tools::Metadata::DublinCoreParser.new,
16
+ Libis::Tools::Metadata::Marc21Parser.new,
17
+ File.join(File.dirname(__FILE__), '..', 'data', 'MetadataMapping.xlsx')) }
18
+
19
+ it 'Initialization' do
20
+ expect(mapper).to_not be_nil
21
+ end
22
+
23
+ end
data/spec/spec_helper.rb CHANGED
@@ -10,3 +10,16 @@ Bundler.setup
10
10
  require 'rspec'
11
11
  require 'libis-tools'
12
12
 
13
+ # RSpec.configure do |config|
14
+ # original_stderr = $stderr
15
+ # original_stdout = $stdout
16
+ # config.before(:all) do
17
+ # # Redirect stderr and stdout
18
+ # $stderr = File.open(File::NULL, 'w')
19
+ # $stdout = File.open(File::NULL, 'w')
20
+ # end
21
+ # config.after(:all) do
22
+ # $stderr = original_stderr
23
+ # $stdout = original_stdout
24
+ # end
25
+ # end
data/test.rb ADDED
@@ -0,0 +1,61 @@
1
+ require 'libis-tools'
2
+ require 'parslet'
3
+ require 'parslet/convenience'
4
+
5
+ # noinspection RubyResolve
6
+ class FieldSpecParser < Libis::Tools::Metadata::BasicParser
7
+
8
+ root(:criteria)
9
+
10
+ rule(:criteria) { selection >> ( spaces >> selection ).repeat }
11
+
12
+ rule(:selection) { must >> must_not.maybe }
13
+
14
+ rule(:must) { names.as(:must).maybe >> (one_of | only_one_of).maybe }
15
+ rule(:must_not) { minus >> must.as(:not) }
16
+
17
+ rule(:one_of) { lrparen >> names.as(:one_of) >> rrparen }
18
+ rule(:only_one_of) { lcparen >> names.as(:only_one_of) >> rcparen }
19
+
20
+ rule(:names) { (character | number).repeat(1) }
21
+
22
+ def self.criteria_to_s(criteria)
23
+ case criteria
24
+ when Array
25
+ # leave as is
26
+ when Hash
27
+ criteria = [criteria]
28
+ else
29
+ return criteria
30
+ end
31
+ criteria.map { |selection| selection_to_s(selection) }.join(' ')
32
+ end
33
+
34
+ def self.selection_to_s(selection)
35
+ return selection unless selection.is_a? Hash
36
+ result = "#{selection[:must]}"
37
+ result += "(#{selection[:one_of]})" if selection[:one_of]
38
+ result += "{#{selection[:only_one_of]}}" if selection[:only_one_of]
39
+ result += "-#{selection_to_s(selection[:not])}" if selection[:not]
40
+ result
41
+ end
42
+
43
+ end
44
+
45
+ require 'awesome_print'
46
+
47
+ def parse(string)
48
+ tree = FieldSpecParser.new.parse_with_debug(string)
49
+ puts "parse '#{FieldSpecParser.criteria_to_s(tree)}'"
50
+ ap tree
51
+ end
52
+
53
+ parse ''
54
+ parse 'abc'
55
+ parse 'abc-de'
56
+ parse 'abc(de)'
57
+ parse 'abc{de}'
58
+ parse 'a(bc)-de'
59
+ parse 'a-b c-d'
60
+ parse 'a-(bc)'
61
+ parse 'a-{bc}'
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: libis-tools
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.9.9
4
+ version: 0.9.10
5
5
  platform: ruby
6
6
  authors:
7
7
  - Kris Dekeyser
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-06-22 00:00:00.000000000 Z
11
+ date: 2015-10-05 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -80,6 +80,20 @@ dependencies:
80
80
  - - "~>"
81
81
  - !ruby/object:Gem::Version
82
82
  version: '0.5'
83
+ - !ruby/object:Gem::Dependency
84
+ name: awesome_print
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ">="
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ">="
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
83
97
  - !ruby/object:Gem::Dependency
84
98
  name: backports
85
99
  requirement: !ruby/object:Gem::Requirement
@@ -156,14 +170,42 @@ dependencies:
156
170
  requirements:
157
171
  - - "~>"
158
172
  - !ruby/object:Gem::Version
159
- version: 0.6.4
173
+ version: '0.6'
174
+ type: :runtime
175
+ prerelease: false
176
+ version_requirements: !ruby/object:Gem::Requirement
177
+ requirements:
178
+ - - "~>"
179
+ - !ruby/object:Gem::Version
180
+ version: '0.6'
181
+ - !ruby/object:Gem::Dependency
182
+ name: parslet
183
+ requirement: !ruby/object:Gem::Requirement
184
+ requirements:
185
+ - - "~>"
186
+ - !ruby/object:Gem::Version
187
+ version: '1.7'
188
+ type: :runtime
189
+ prerelease: false
190
+ version_requirements: !ruby/object:Gem::Requirement
191
+ requirements:
192
+ - - "~>"
193
+ - !ruby/object:Gem::Version
194
+ version: '1.7'
195
+ - !ruby/object:Gem::Dependency
196
+ name: simple_xlsx_reader
197
+ requirement: !ruby/object:Gem::Requirement
198
+ requirements:
199
+ - - "~>"
200
+ - !ruby/object:Gem::Version
201
+ version: '1.0'
160
202
  type: :runtime
161
203
  prerelease: false
162
204
  version_requirements: !ruby/object:Gem::Requirement
163
205
  requirements:
164
206
  - - "~>"
165
207
  - !ruby/object:Gem::Version
166
- version: 0.6.4
208
+ version: '1.0'
167
209
  description: Some tool classes for other LIBIS gems.
168
210
  email:
169
211
  - kris.dekeyser@libis.be
@@ -186,19 +228,32 @@ files:
186
228
  - lib/libis/tools/command.rb
187
229
  - lib/libis/tools/config.rb
188
230
  - lib/libis/tools/config_file.rb
189
- - lib/libis/tools/dc_record.rb
190
231
  - lib/libis/tools/deep_struct.rb
191
232
  - lib/libis/tools/extend/empty.rb
192
233
  - lib/libis/tools/extend/hash.rb
234
+ - lib/libis/tools/extend/kernel.rb
193
235
  - lib/libis/tools/extend/ostruct.rb
194
236
  - lib/libis/tools/extend/string.rb
195
237
  - lib/libis/tools/extend/struct.rb
196
238
  - lib/libis/tools/logger.rb
239
+ - lib/libis/tools/metadata.rb
197
240
  - lib/libis/tools/metadata/dublin_core_record.rb
198
- - lib/libis/tools/metadata/field_spec.rb
241
+ - lib/libis/tools/metadata/field_format.rb
199
242
  - lib/libis/tools/metadata/fix_field.rb
243
+ - lib/libis/tools/metadata/mapper.rb
244
+ - lib/libis/tools/metadata/mappers/flandrica.rb
245
+ - lib/libis/tools/metadata/mappers/kuleuven.rb
200
246
  - lib/libis/tools/metadata/marc21_record.rb
201
247
  - lib/libis/tools/metadata/marc_record.rb
248
+ - lib/libis/tools/metadata/parser/basic_parser.rb
249
+ - lib/libis/tools/metadata/parser/dublin_core_parser.rb
250
+ - lib/libis/tools/metadata/parser/marc21_parser.rb
251
+ - lib/libis/tools/metadata/parser/marc_format_parser.rb
252
+ - lib/libis/tools/metadata/parser/marc_rules.rb
253
+ - lib/libis/tools/metadata/parser/marc_select_parser.rb
254
+ - lib/libis/tools/metadata/parser/patch.rb
255
+ - lib/libis/tools/metadata/parser/subfield_criteria_parser.rb
256
+ - lib/libis/tools/metadata/parsers.rb
202
257
  - lib/libis/tools/metadata/sharepoint_mapping.rb
203
258
  - lib/libis/tools/metadata/sharepoint_record.rb
204
259
  - lib/libis/tools/metadata/var_field.rb
@@ -212,18 +267,26 @@ files:
212
267
  - spec/command_spec.rb
213
268
  - spec/config_file_spec.rb
214
269
  - spec/config_spec.rb
270
+ - spec/data/MetadataMapping.xlsx
215
271
  - spec/data/test.data
216
272
  - spec/data/test.xml
217
273
  - spec/data/test.yml
218
274
  - spec/data/test_config.yml
219
275
  - spec/deep_struct_spec.rb
220
276
  - spec/logger_spec.rb
277
+ - spec/metadata/8389207.marc
278
+ - spec/metadata/dublin_core_parser_spec.rb
221
279
  - spec/metadata/dublin_core_spec.rb
280
+ - spec/metadata/marc21_parser_data.rb
281
+ - spec/metadata/marc21_parser_spec.rb
282
+ - spec/metadata/marc21_spec.rb
283
+ - spec/metadata/metadata_mapper_spec.rb
222
284
  - spec/parameter_container_spec.rb
223
285
  - spec/parameter_spec.rb
224
286
  - spec/spec_helper.rb
225
287
  - spec/test.xsd
226
288
  - spec/xmldocument_spec.rb
289
+ - test.rb
227
290
  - test/test_helper.rb
228
291
  - test/webservices/test_ca_item_info.rb
229
292
  - test/webservices/test_ca_search.rb
@@ -247,7 +310,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
247
310
  version: '0'
248
311
  requirements: []
249
312
  rubyforge_project:
250
- rubygems_version: 2.4.8
313
+ rubygems_version: 2.2.2
251
314
  signing_key:
252
315
  specification_version: 4
253
316
  summary: LIBIS toolbox.
@@ -257,13 +320,20 @@ test_files:
257
320
  - spec/command_spec.rb
258
321
  - spec/config_file_spec.rb
259
322
  - spec/config_spec.rb
323
+ - spec/data/MetadataMapping.xlsx
260
324
  - spec/data/test.data
261
325
  - spec/data/test.xml
262
326
  - spec/data/test.yml
263
327
  - spec/data/test_config.yml
264
328
  - spec/deep_struct_spec.rb
265
329
  - spec/logger_spec.rb
330
+ - spec/metadata/8389207.marc
331
+ - spec/metadata/dublin_core_parser_spec.rb
266
332
  - spec/metadata/dublin_core_spec.rb
333
+ - spec/metadata/marc21_parser_data.rb
334
+ - spec/metadata/marc21_parser_spec.rb
335
+ - spec/metadata/marc21_spec.rb
336
+ - spec/metadata/metadata_mapper_spec.rb
267
337
  - spec/parameter_container_spec.rb
268
338
  - spec/parameter_spec.rb
269
339
  - spec/spec_helper.rb