libis-tools 0.9.9 → 0.9.10

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