marc4r 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (44) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +1 -0
  3. data/Gemfile +4 -0
  4. data/README.md +4 -0
  5. data/Rakefile +13 -0
  6. data/VERSION +1 -0
  7. data/lib/marc4r.rb +24 -0
  8. data/lib/marc4r/fields.rb +28 -0
  9. data/lib/marc4r/fields/control_field.rb +19 -0
  10. data/lib/marc4r/fields/data_field.rb +46 -0
  11. data/lib/marc4r/fields/subfield.rb +12 -0
  12. data/lib/marc4r/marc_stream_reader.rb +82 -0
  13. data/lib/marc4r/record.rb +92 -0
  14. data/marc4r.gemspec +21 -0
  15. data/spec/fixtures/OCLC_814388508.xml +123 -0
  16. data/spec/fixtures/bad_leaders_10_11.mrc +1 -0
  17. data/spec/fixtures/bad_too_long_plus_2.mrc +1 -0
  18. data/spec/fixtures/brkrtest.mrc +1 -0
  19. data/spec/fixtures/chabon.mrc +1 -0
  20. data/spec/fixtures/chabon.xml +116 -0
  21. data/spec/fixtures/chinese_mangled_multibyte.mrc +1 -0
  22. data/spec/fixtures/cruel-cruel-indicatorless-summerland.xml +55 -0
  23. data/spec/fixtures/cyrillic_capital_e.mrc +1 -0
  24. data/spec/fixtures/greekmissingcharsetchange.mrc +1 -0
  25. data/spec/fixtures/illegal-marc-in-json.json +401 -0
  26. data/spec/fixtures/legal-json-marc-in-json.json +380 -0
  27. data/spec/fixtures/loongboonmee.mrc +1 -0
  28. data/spec/fixtures/marc-in-json.json +380 -0
  29. data/spec/fixtures/marc-json.json +195 -0
  30. data/spec/fixtures/summerland-indented-marc-json.json +104 -0
  31. data/spec/fixtures/summerland-marc-in-json-indented.json +183 -0
  32. data/spec/fixtures/summerland-marc-in-json.json +1 -0
  33. data/spec/fixtures/summerland-marc-json.json +1 -0
  34. data/spec/fixtures/summerland.mrc +1 -0
  35. data/spec/fixtures/summerland.xml +52 -0
  36. data/spec/fixtures/u335.mrc +1 -0
  37. data/spec/lib/marc4r/fields/control_field_spec.rb +46 -0
  38. data/spec/lib/marc4r/fields/data_field_spec.rb +39 -0
  39. data/spec/lib/marc4r/marc_stream_reader.rb +19 -0
  40. data/spec/lib/marc4r/record_spec.rb +111 -0
  41. data/spec/spec_helper.rb +120 -0
  42. data/spec/test_constants.rb +22 -0
  43. data/tasks/marc4r-dev.rake +3 -0
  44. metadata +142 -0
@@ -0,0 +1 @@
1
+ {"leader":"00714cam a2200205 a 4500","fields":[{"001":"12883376"},{"005":"20030616111422.0"},{"008":"020805s2002 nyu j 000 1 eng "},{"020":{"subfields":[{"a":"0786808772"}],"ind1":" ","ind2":" "}},{"020":{"subfields":[{"a":"0786816155 (pbk.)"}],"ind1":" ","ind2":" "}},{"040":{"subfields":[{"a":"DLC"},{"c":"DLC"},{"d":"DLC"}],"ind1":" ","ind2":" "}},{"100":{"subfields":[{"a":"Chabon, Michael."}],"ind1":"1","ind2":" "}},{"245":{"subfields":[{"a":"Summerland /"},{"c":"Michael Chabon."}],"ind1":"1","ind2":"0"}},{"250":{"subfields":[{"a":"1st ed."}],"ind1":" ","ind2":" "}},{"260":{"subfields":[{"a":"New York :"},{"b":"Miramax Books/Hyperion Books for Children,"},{"c":"c2002."}],"ind1":" ","ind2":" "}},{"300":{"subfields":[{"a":"500 p. ;"},{"c":"22 cm."}],"ind1":" ","ind2":" "}},{"520":{"subfields":[{"a":"Ethan Feld, the worst baseball player in the history of the game, finds himself recruited by a 100-year-old scout to help a band of fairies triumph over an ancient enemy."}],"ind1":" ","ind2":" "}},{"650":{"subfields":[{"a":"Fantasy."}],"ind1":" ","ind2":"1"}},{"650":{"subfields":[{"a":"Baseball"},{"v":"Fiction."}],"ind1":" ","ind2":"1"}},{"650":{"subfields":[{"a":"Magic"},{"v":"Fiction."}],"ind1":" ","ind2":"1"}}]}
@@ -0,0 +1 @@
1
+ {leader:"00714cam a2200205 a 4500",controlfield:[{ tag : "001", data : "12883376" },{ tag : "005", data : "20030616111422.0" },{ tag : "008", data : "020805s2002 nyu j 000 1 eng " }]datafield :[{tag : "020", ind : " ",subfield :[{ code : "a", data : "0786808772" }]},{tag : "020", ind : " ",subfield :[{ code : "a", data : "0786816155 (pbk.)" }]},{tag : "040", ind : " ",subfield :[{ code : "a", data : "DLC" },{ code : "c", data : "DLC" },{ code : "d", data : "DLC" }]},{tag : "100", ind : "1 ",subfield :[{ code : "a", data : "Chabon, Michael." }]},{tag : "245", ind : "10",subfield :[{ code : "a", data : "Summerland /" },{ code : "c", data : "Michael Chabon." }]},{tag : "250", ind : " ",subfield :[{ code : "a", data : "1st ed." }]},{tag : "260", ind : " ",subfield :[{ code : "a", data : "New York :" },{ code : "b", data : "Miramax Books/Hyperion Books for Children," },{ code : "c", data : "c2002." }]},{tag : "300", ind : " ",subfield :[{ code : "a", data : "500 p. ;" },{ code : "c", data : "22 cm." }]},{tag : "520", ind : " ",subfield :[{ code : "a", data : "Ethan Feld, the worst baseball player in the history of the game, finds himself recruited by a 100-year-old scout to help a band of fairies triumph over an ancient enemy." }]},{tag : "650", ind : " 1",subfield :[{ code : "a", data : "Fantasy." }]},{tag : "650", ind : " 1",subfield :[{ code : "a", data : "Baseball" },{ code : "v", data : "Fiction." }]},{tag : "650", ind : " 1",subfield :[{ code : "a", data : "Magic" },{ code : "v", data : "Fiction." }]}]}
@@ -0,0 +1 @@
1
+ 00714cam a2200205 a 45000010009000000050017000090080041000260200015000670200022000820400018001041000021001222450034001432500012001772600067001893000021002565200175002776500013004526500023004656500020004881288337620030616111422.0020805s2002 nyu j 000 1 eng  a0786808772 a0786816155 (pbk.) aDLCcDLCdDLC1 aChabon, Michael.10aSummerland /cMichael Chabon. a1st ed. aNew York :bMiramax Books/Hyperion Books for Children,cc2002. a500 p. ;c22 cm. aEthan Feld, the worst baseball player in the history of the game, finds himself recruited by a 100-year-old scout to help a band of fairies triumph over an ancient enemy. 1aFantasy. 1aBaseballvFiction. 1aMagicvFiction.
@@ -0,0 +1,52 @@
1
+ <?xml version="1.0" encoding="UTF-8"?><collection xmlns="http://www.loc.gov/MARC21/slim">
2
+ <record>
3
+ <leader>00714cam a2200205 a 4500</leader>
4
+ <controlfield tag="001">12883376</controlfield>
5
+ <controlfield tag="005">20030616111422.0</controlfield>
6
+ <controlfield tag="008">020805s2002 nyu j 000 1 eng </controlfield>
7
+ <datafield tag="020" ind1=" " ind2=" ">
8
+ <subfield code="a">0786808772</subfield>
9
+ </datafield>
10
+ <datafield tag="020" ind1=" " ind2=" ">
11
+ <subfield code="a">0786816155 (pbk.)</subfield>
12
+ </datafield>
13
+ <datafield tag="040" ind1=" " ind2=" ">
14
+ <subfield code="a">DLC</subfield>
15
+ <subfield code="c">DLC</subfield>
16
+ <subfield code="d">DLC</subfield>
17
+ </datafield>
18
+ <datafield tag="100" ind1="1" ind2=" ">
19
+ <subfield code="a">Chabon, Michael.</subfield>
20
+ </datafield>
21
+ <datafield tag="245" ind1="1" ind2="0">
22
+ <subfield code="a">Summerland /</subfield>
23
+ <subfield code="c">Michael Chabon.</subfield>
24
+ </datafield>
25
+ <datafield tag="250" ind1=" " ind2=" ">
26
+ <subfield code="a">1st ed.</subfield>
27
+ </datafield>
28
+ <datafield tag="260" ind1=" " ind2=" ">
29
+ <subfield code="a">New York :</subfield>
30
+ <subfield code="b">Miramax Books/Hyperion Books for Children,</subfield>
31
+ <subfield code="c">c2002.</subfield>
32
+ </datafield>
33
+ <datafield tag="300" ind1=" " ind2=" ">
34
+ <subfield code="a">500 p. ;</subfield>
35
+ <subfield code="c">22 cm.</subfield>
36
+ </datafield>
37
+ <datafield tag="520" ind1=" " ind2=" ">
38
+ <subfield code="a">Ethan Feld, the worst baseball player in the history of the game, finds himself recruited by a 100-year-old scout to help a band of fairies triumph over an ancient enemy.</subfield>
39
+ </datafield>
40
+ <datafield tag="650" ind1=" " ind2="1">
41
+ <subfield code="a">Fantasy.</subfield>
42
+ </datafield>
43
+ <datafield tag="650" ind1=" " ind2="1">
44
+ <subfield code="a">Baseball</subfield>
45
+ <subfield code="v">Fiction.</subfield>
46
+ </datafield>
47
+ <datafield tag="650" ind1=" " ind2="1">
48
+ <subfield code="a">Magic</subfield>
49
+ <subfield code="v">Fiction.</subfield>
50
+ </datafield>
51
+ </record>
52
+ </collection>
@@ -0,0 +1 @@
1
+ 01904nas 2200349 a 4500001000500000003000600005008004100011035002200052035002000074040001300094049000900107090003100116245001200147246004200159260003500201300002500236310001500261362000700276500003800283599006000321596000600381515003000387999012600417999012200543999012300665999012800788999012600916999011601042999013201158999013401290999013001424u335SIRSI840508c19799999gw fu p 0uuub0ger d a(Sirsi) o10701458 a(OCoLC)10701458 aVA@cVA@ aVAS@ aAP30b.T75mVAS@qALDERMAN00aTumult.13aZeitschrift f�ur Verkehrswissenschaft aBerlin :bMerve Verlag,c1979- av. :bill. ;c24 cm. aSemiannual0 a1- aTitle from cover; imprint varies. a2b(YR.) 2008 NO. 34;b(YR.) 2008 NO. 33;bNR. 32 2007; a2 aNone published 1980-1981. aAP30 .T75 Nr.7-10 1983-87wLCPERc1iX001614137d5/9/2008lALD-STKSmALDERMANn2q3rYsYtBOUND-JRNLu6/28/1996xH-NOTIS aAP30 .T75 Nr.1-3 1979-82wLCPERc1iX000769605d4/8/2009lALD-STKSmALDERMANq2rYsYtBOUND-JRNLu6/28/1996xH-NOTIS aAP30 .T75 Nr.4-6 1982-83wLCPERc1iX000764174d5/21/2002lALD-STKSmALDERMANq5rYsYtBOUND-JRNLu6/28/1996xH-NOTIS aAP30 .T75 Nr.11-14 1988-90wLCPERc1iX002128357d1/27/2010lALD-STKSmALDERMANn1q1rYsYtBOUND-JRNLu6/28/1996xH-NOTIS aAP30 .T75 Nr.15-18 1991-93wLCPERc1iX002509913d11/11/1994lALD-STKSmALDERMANn1rYsYtBOUND-JRNLu6/28/1996xH-NOTIS aAP30 .T75 Periodical order-001wLCPERc1i335-6001d1/11/1999lALD-STKSmALDERMANrYsYtBOUND-JRNLu12/18/1996 aAP30 .T75 Nr.19-22 1994-96wLCPERc1iX006060933d7/23/1998e5/26/1998lALD-STKSmALDERMANn1rYsYtBOUND-JRNLu5/26/1998xADD aAP30 .T75 Nr.25-28 2001-2004wLCPERc1iX030047292d2/12/2007e1/23/2007lALD-STKSmALDERMANq1rYsYtBOUND-JRNLu1/22/2007xADD aAP30 .T75 Nr.23-24 1998-1999wLCPERc1iX006166304d4/5/2007e3/13/2007lALD-STKSmALDERMANrYsYtBOUND-JRNLu3/12/2007xADD
@@ -0,0 +1,46 @@
1
+ require 'spec_helper'
2
+
3
+ describe Marc4R::Fields::ControlField do
4
+ subject {Marc4R::Fields::ControlField.new('008','foo')}
5
+ describe '#initialize' do
6
+ it 'should set the tag' do
7
+ expect(subject.tag).to eql("008")
8
+ end
9
+ it 'should set the data' do
10
+ expect(subject.data).to eql("foo")
11
+ end
12
+ end
13
+ context 'accessors' do
14
+ subject {Marc4R::Fields::ControlField.new()}
15
+ describe '#data=' do
16
+ it 'should set the data' do
17
+ expect(subject.data).to be_nil
18
+ subject.data = 'foo'
19
+ expect(subject.data).to eql("foo")
20
+ end
21
+ end
22
+ describe '#tag=' do
23
+ it 'should set the tag' do
24
+ expect(subject.tag).to be_nil
25
+ subject.tag = 'foo'
26
+ expect(subject.tag).to eql("foo")
27
+ end
28
+ end
29
+ end
30
+ describe '#=~' do
31
+ it "should match on data" do
32
+ subject.data = 'foo'
33
+ expect(subject =~ /^foo/).to be_truthy
34
+ expect(subject =~ /^oo/).to be_falsy
35
+ end
36
+ end
37
+ describe '<=>' do
38
+ let(:before) {Marc4R::Fields::ControlField.new('007')}
39
+ let(:after) {Marc4R::Fields::ControlField.new('009')}
40
+ it "should sort appropriately" do
41
+ expect(subject <=> before).to eql(1)
42
+ expect(subject <=> after).to eql(-1)
43
+ expect(subject <=> subject).to eql(0)
44
+ end
45
+ end
46
+ end
@@ -0,0 +1,39 @@
1
+ require 'spec_helper'
2
+
3
+ describe Marc4R::Fields::DataField do
4
+ subject {Marc4R::Fields::DataField.new("245", '1', '0')}
5
+ describe '#initialize' do
6
+ it 'should set the tag and indicators' do
7
+ expect(subject.tag).to eql("245")
8
+ expect(subject.indicator1).to eql("1")
9
+ expect(subject.indicator2).to eql("0")
10
+ end
11
+ end
12
+ describe '#subfields' do
13
+ let(:subfield_a) { Marc4R::Fields::Subfield.new('a', "Summerland")}
14
+ let(:subfield_c) { Marc4R::Fields::Subfield.new('c', "Michael Chabon")}
15
+ it "should initially be empty" do
16
+ expect(subject.subfields).to be_empty
17
+ end
18
+ context 'with a subfield' do
19
+ it "should append a subfield" do
20
+ subject.subfields << subfield_a
21
+ expect(subject.subfields.size).to eql(1)
22
+ subject.subfields.insert(0, subfield_c)
23
+ expect(subject.subfields.size).to eql(2)
24
+ expect(subject.subfields.last.code).to eql('a')
25
+ expect(subject =~ /^Summer/).to be
26
+ expect(subject =~ /^ummer/).not_to be
27
+ end
28
+ end
29
+ end
30
+ describe '<=>' do
31
+ let(:before) {Marc4R::Fields::ControlField.new('240')}
32
+ let(:after) {Marc4R::Fields::ControlField.new('300')}
33
+ it "should sort appropriately" do
34
+ expect(subject <=> before).to eql(1)
35
+ expect(subject <=> after).to eql(-1)
36
+ expect(subject <=> subject).to eql(0)
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,19 @@
1
+ require 'spec_helper'
2
+
3
+ describe Marc4R::MarcStreamReader do
4
+ let(:input) {fixture(TestConstants::RESOURCES_CHABON_MRC)}
5
+ describe "#each" do
6
+ subject {Marc4R::MarcStreamReader.new(input).lazy}
7
+ it "should enumerate over expected MARC records" do
8
+ first = subject.take(1).first
9
+ expect(first).not_to be_nil
10
+ validateKavalieAndClayRecord(first)
11
+ second = subject.take(1).first
12
+ expect(second).not_to be_nil
13
+ validateSummerlandRecord(second)
14
+ # there's only two records in this stream
15
+ expect(subject.take(1).first).to be_nil
16
+ input.close
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,111 @@
1
+ require 'spec_helper'
2
+
3
+ describe Marc4R::Record do
4
+ subject do
5
+ sumland = Marc4R::Record.new("00714cam a2200205 a 4500");
6
+ sumland.control_fields << Marc4R::Fields::ControlField.new("001", "12883376")
7
+ sumland.control_fields << Marc4R::Fields::ControlField.new("005", "20030616111422.0")
8
+ sumland.control_fields << Marc4R::Fields::ControlField.new("008", "020805s2002 nyu j 000 1 eng ")
9
+ sumland.data_fields << Marc4R::Fields::DataField.new("020", ' ', ' ', "a", "0786808772")
10
+ sumland.data_fields << Marc4R::Fields::DataField.new("020", ' ', ' ', "a", "0786816155 (pbk.)")
11
+ sumland.data_fields << Marc4R::Fields::DataField.new("040", ' ', ' ', "a", "DLC", "c", "DLC", "d", "DLC")
12
+ sumland.data_fields << Marc4R::Fields::DataField.new("100", '1', ' ', "a", "Chabon, Michael.")
13
+ sumland.data_fields << Marc4R::Fields::DataField.new("245", '1', '0', "a", "Summerland /", "c", "Michael Chabon.")
14
+ sumland.data_fields << Marc4R::Fields::DataField.new("250", ' ', ' ', "a", "1st ed.")
15
+ sumland.data_fields << Marc4R::Fields::DataField.new("260", ' ', ' ', "a", "New York :", "b", "Miramax Books/Hyperion Books for Children,", "c", "c2002.")
16
+ sumland.data_fields << Marc4R::Fields::DataField.new("300", ' ', ' ', "a", "500 p. ;", "c", "22 cm.")
17
+ sumland.data_fields << Marc4R::Fields::DataField.new("520", ' ', ' ', "a", "Ethan Feld, the worst baseball player in the history of the game, finds himself recruited by a 100-year-old scout to help a band of fairies triumph over an ancient enemy.")
18
+ sumland.data_fields << Marc4R::Fields::DataField.new("650", ' ', '1', "a", "Fantasy.")
19
+ sumland.data_fields << Marc4R::Fields::DataField.new("650", ' ', '1', "a", "Baseball", "v", "Fiction.")
20
+ sumland.data_fields << Marc4R::Fields::DataField.new("650", ' ', '1', "a", "Magic", "v", "Fiction.")
21
+ sumland
22
+ end
23
+ describe '#initialize' do
24
+ it "should assign the leader from a String argument" do
25
+ expect(subject.leader.to_s).to eql('00714cam a2200205 a 4500')
26
+ expect(subject.leader.record_length).to eql(714)
27
+ end
28
+ end
29
+ describe '#control_fields' do
30
+ it do
31
+ expect(subject.control_number).to eql("12883376")
32
+ cf = subject.control_number_field
33
+ expect(cf.tag).to eql("001")
34
+ expect(cf.data).to eql("12883376")
35
+ expect(subject.control_fields.size).to eql(3)
36
+ end
37
+ end
38
+ describe '#data_fields' do
39
+ it do
40
+ expect(subject.data_fields.size).to eql(12)
41
+ expect(subject.data_fields('650').size).to eql(3)
42
+ expect(subject.data_fields("245", "260", "300").size).to eql(3)
43
+ end
44
+ end
45
+ describe '#variable_fields' do
46
+ pending 'decision about preserving variable_fields syntax' do
47
+ expect(subject.variable_fields.size).to eql(15)
48
+ end
49
+ end
50
+ describe '#find' do
51
+ it do
52
+ result = subject.find(/Summerland/);
53
+ expect(result.size).to eql(1)
54
+ field = result.first;
55
+ expect(field.tag).to eql("245")
56
+
57
+ result = subject.find(/Chabon/);
58
+ expect(result.size).to eql(2)
59
+
60
+ result = subject.find("100", /Chabon/);
61
+ expect(result.size).to eql(1)
62
+
63
+ result = subject.find("100", "260", "300", /Chabon/);
64
+ expect(result.size).to eql(1)
65
+
66
+ result = subject.find("040", /DLC/);
67
+ expect(result.size).to be > 0
68
+ end
69
+ end
70
+
71
+ describe Marc4R::Record::Leader do
72
+ let(:empty) {Marc4R::Record::Leader.new}
73
+ let(:assigned) {Marc4R::Record::Leader.new('00714cam a2200205 a 4500')}
74
+ describe '#initialize' do
75
+ it "should set a string value appropriately" do
76
+ expect(empty.to_s).to eql('')
77
+ expect(assigned.to_s).to eql('00714cam a2200205 a 4500')
78
+ test = Marc4R::Record::Leader.new('00759cam a2200229 a 4500')
79
+ expect(test.to_s).to eql("00759cam a2200229 a 4500")
80
+ end
81
+ it "should parse the leader correctly" do
82
+ expect(assigned.record_length).to eql(714)
83
+ expect(assigned.record_status).to eql('c')
84
+ expect(assigned.record_type).to eql('a')
85
+ expect(assigned.impl_defined1).to eql(['m',' '])
86
+ expect(assigned.char_coding_scheme).to eql('a')
87
+ expect(assigned.indicator_count).to eql(2)
88
+ expect(assigned.subfield_code_count).to eql(2)
89
+ expect(assigned.data_base_address).to eql(205)
90
+ expect(assigned.impl_defined2).to eql([' ','a'])
91
+ expect(assigned.entry_map).to eql([' ','4','5','0','0'])
92
+ end
93
+ end
94
+ describe 'fields accessors' do
95
+ it do
96
+ test = Marc4R::Record::Leader.new(assigned.to_s)
97
+ test.subfield_code_count= 1
98
+ test.record_length = 9417
99
+ test.data_base_address = 37
100
+ expect(test.to_s).to eql('09417cam a2100037 a 4500')
101
+ end
102
+ end
103
+ describe '#eql?' do
104
+ it "should compare appropriately" do
105
+ expect(empty.eql? Marc4R::Record::Leader.new).to be
106
+ expect(assigned.eql? Marc4R::Record::Leader.new('00714cam a2200205 a 4500')).to be
107
+ expect(assigned.eql? empty).not_to be
108
+ end
109
+ end
110
+ end
111
+ end
@@ -0,0 +1,120 @@
1
+ require "bundler/setup"
2
+
3
+ require 'rspec/its'
4
+ require 'rspec/matchers'
5
+
6
+ if ENV['COVERAGE']
7
+ require 'simplecov'
8
+ SimpleCov.command_name "spec"
9
+ end
10
+ require 'marc4r'
11
+ require 'test_constants'
12
+ #$in_travis = !ENV['TRAVIS'].nil? && ENV['TRAVIS'] == 'true'
13
+ RSpec.configure do |config|
14
+ config.expect_with :rspec do |c|
15
+ c.syntax = :expect
16
+ end
17
+
18
+ end
19
+
20
+ def fixture(name, &block)
21
+ filename = File.expand_path("../fixtures/#{name}", __FILE__)
22
+ if block_given?
23
+ open(filename) &block
24
+ else
25
+ open(filename)
26
+ end
27
+ end
28
+
29
+ def fixture_data(name)
30
+ fixture(name) {|io| io.read}
31
+ end
32
+
33
+ RSpec::Matchers.define :be_control_field do |expected|
34
+ match do |actual|
35
+ tag = expected[0]
36
+ data = expected[1]
37
+ r = actual.is_a? Marc4R::Fields::ControlField
38
+ r &= actual.tag == tag
39
+ r &= actual.data = data
40
+ end
41
+ end
42
+
43
+ def validateKavalieAndClayRecord(record)
44
+ expect(record.leader.to_s).to eql("00759cam a2200229 a 4500")
45
+ expect(record.control_fields.size).to eql(3)
46
+ expect(record.data_fields.size).to eql(14)
47
+ expect(record.control_fields[0]).to eql(Marc4R::Fields::ControlField.new("001","11939876"))
48
+ expect(record.control_fields[1]).to eql(Marc4R::Fields::ControlField.new("005", "20041229190604.0"))
49
+ expect(record.control_fields[2]).to eql(Marc4R::Fields::ControlField.new("008", "000313s2000 nyu 000 1 eng "))
50
+ expect(record.data_fields[0]).to eql(Marc4R::Fields::DataField.new("020", ' ', ' ', "a", "0679450041 (acid-free paper)"))
51
+ expect(record.data_fields[1]).to eql(Marc4R::Fields::DataField.new("040", ' ', ' ', "a", "DLC", "c", "DLC", "d", "DLC"))
52
+ expect(record.data_fields[2]).to eql(Marc4R::Fields::DataField.new("100", '1', ' ', "a", "Chabon, Michael."))
53
+ expect(record.data_fields[3]).to eql(Marc4R::Fields::DataField.new("245", '1', '4', "a", "The amazing adventures of Kavalier and Clay :", "b", "a novel /", "c", "Michael Chabon."))
54
+ expect(record.data_fields[4]).to eql(Marc4R::Fields::DataField.new("260", ' ', ' ', "a", "New York :", "b", "Random House,", "c", "c2000."))
55
+ expect(record.data_fields[5]).to eql(Marc4R::Fields::DataField.new("300", ' ', ' ', "a", "639 p. ;", "c", "25 cm."))
56
+ expect(record.data_fields[6]).to eql(Marc4R::Fields::DataField.new("650", ' ', '0', "a", "Comic books, strips, etc.", "x", "Authorship", "v", "Fiction."))
57
+ expect(record.data_fields[7]).to eql(Marc4R::Fields::DataField.new("650", ' ', '0', "a", "Heroes in mass media", "v", "Fiction."))
58
+ expect(record.data_fields[8]).to eql(Marc4R::Fields::DataField.new("650", ' ', '0', "a", "Czech Americans", "v", "Fiction."))
59
+ expect(record.data_fields[9]).to eql(Marc4R::Fields::DataField.new("651", ' ', '0', "a", "New York (N.Y.)", "v", "Fiction."))
60
+ expect(record.data_fields[10]).to eql(Marc4R::Fields::DataField.new("650", ' ', '0', "a", "Young men", "v", "Fiction."))
61
+ expect(record.data_fields[11]).to eql(Marc4R::Fields::DataField.new("650", ' ', '0', "a", "Cartoonists", "v", "Fiction."))
62
+ expect(record.data_fields[12]).to eql(Marc4R::Fields::DataField.new("655", ' ', '7', "a", "Humorous stories.", "2", "gsafd"))
63
+ expect(record.data_fields[13]).to eql(Marc4R::Fields::DataField.new("655", ' ', '7', "a", "Bildungsromane.", "2", "gsafd"))
64
+ end
65
+
66
+
67
+ def validateSummerlandRecord(record)
68
+ expect(record.leader.to_s).to eql "00714cam a2200205 a 4500"
69
+ expect(record.control_fields.size).to eql(3)
70
+ expect(record.data_fields.size).to eql(12)
71
+ expect(record.control_fields[0]).to eql(Marc4R::Fields::ControlField.new("001","12883376"))
72
+ expect(record.control_fields[1]).to eql(Marc4R::Fields::ControlField.new("005", "20030616111422.0"))
73
+ expect(record.control_fields[2]).to eql(Marc4R::Fields::ControlField.new("008", "020805s2002 nyu j 000 1 eng "))
74
+ expect(record.data_fields[0]).to eql Marc4R::Fields::DataField.new("020", ' ', ' ', "a", "0786808772")
75
+ expect(record.data_fields[1]).to eql Marc4R::Fields::DataField.new("020", ' ', ' ', "a", "0786816155 (pbk.)")
76
+ expect(record.data_fields[2]).to eql Marc4R::Fields::DataField.new("040", ' ', ' ', "a", "DLC", "c", "DLC", "d", "DLC")
77
+ expect(record.data_fields[3]).to eql Marc4R::Fields::DataField.new("100", '1', ' ', "a", "Chabon, Michael.")
78
+ expect(record.data_fields[4]).to eql Marc4R::Fields::DataField.new("245", '1', '0', "a", "Summerland /", "c", "Michael Chabon.")
79
+ expect(record.data_fields[5]).to eql Marc4R::Fields::DataField.new("250", ' ', ' ', "a", "1st ed.")
80
+ expect(record.data_fields[6]).to eql Marc4R::Fields::DataField.new("260", ' ', ' ', "a", "New York :", "b", "Miramax Books/Hyperion Books for Children,", "c", "c2002.")
81
+ expect(record.data_fields[7]).to eql Marc4R::Fields::DataField.new("300", ' ', ' ', "a", "500 p. ;", "c", "22 cm.")
82
+ expect(record.data_fields[8]).to eql Marc4R::Fields::DataField.new("520", ' ', ' ', "a", "Ethan Feld, the worst baseball player in the history of the game, finds himself recruited by a 100-year-old scout to help a band of fairies triumph over an ancient enemy.")
83
+ expect(record.data_fields[9]).to eql Marc4R::Fields::DataField.new("650", ' ', '1', "a", "Fantasy.")
84
+ expect(record.data_fields[10]).to eql Marc4R::Fields::DataField.new("650", ' ', '1', "a", "Baseball", "v", "Fiction.")
85
+ expect(record.data_fields[11]).to eql Marc4R::Fields::DataField.new("650", ' ', '1', "a", "Magic", "v", "Fiction.")
86
+ end
87
+
88
+ def validateFreewheelingBobDylanRecord(record)
89
+ assertEquals("leader", "01471cjm a2200349 a 4500", record.getLeader().marshal())
90
+ expect(record.leader.to_s).to eql "00714cam a2200205 a 4500"
91
+ expect(record.control_fields.size).to eql(4)
92
+ expect(record.control_fields[0]).to eql(Marc4R::Fields::ControlField.new("001","5674874"))
93
+ expect(record.control_fields[1]).to eql(Marc4R::Fields::ControlField.new("005", "20030305110405.0"))
94
+ expect(record.control_fields[2]).to eql(Marc4R::Fields::ControlField.new("007", "sdubsmennmplu"))
95
+ expect(record.control_fields[3]).to eql(Marc4R::Fields::ControlField.new("008", "930331s1963 nyuppn eng d"))
96
+ expect(record.data_fields.size).to eql(24)
97
+ expect(record.data_fields[0]).to eql Marc4R::Fields::DataField.new("035", ' ', ' ', "9", "(DLC) 93707283")
98
+ expect(record.data_fields[1]).to eql Marc4R::Fields::DataField.new("906", ' ', ' ', "a", "7", "b", "cbc", "c", "copycat", "d", "4", "e", "ncip", "f", "19", "g", "y-soundrec")
99
+ expect(record.data_fields[2]).to eql Marc4R::Fields::DataField.new("010", ' ', ' ', "a", " 93707283 ")
100
+ expect(record.data_fields[3]).to eql Marc4R::Fields::DataField.new("028", '0', '2', "a", "CS 8786", "b", "Columbia")
101
+ expect(record.data_fields[4]).to eql Marc4R::Fields::DataField.new("035", ' ', ' ', "a", "(OCoLC)13083787")
102
+ expect(record.data_fields[5]).to eql Marc4R::Fields::DataField.new("040", ' ', ' ', "a", "OClU", "c", "DLC", "d", "DLC")
103
+ expect(record.data_fields[6]).to eql Marc4R::Fields::DataField.new("041", '0', ' ', "d", "eng", "g", "eng")
104
+ expect(record.data_fields[7]).to eql Marc4R::Fields::DataField.new("042", ' ', ' ', "a", "lccopycat")
105
+ expect(record.data_fields[8]).to eql Marc4R::Fields::DataField.new("050", '0', '0', "a", "Columbia CS 8786")
106
+ expect(record.data_fields[9]).to eql Marc4R::Fields::DataField.new("100", '1', ' ', "a", "Dylan, Bob,", "d", "1941-")
107
+ expect(record.data_fields[10]).to eql Marc4R::Fields::DataField.new("245", '1', '4', "a", "The freewheelin' Bob Dylan", "h", "[sound recording].")
108
+ expect(record.data_fields[12]).to eql Marc4R::Fields::DataField.new("260", ' ', ' ', "a", "[New York, N.Y.] :", "b", "Columbia,", "c", "[1963]")
109
+ expect(record.data_fields[13]).to eql Marc4R::Fields::DataField.new("300", ' ', ' ', "a", "1 sound disc :", "b", "analog, 33 1/3 rpm, stereo. ;", "c", "12 in.")
110
+ expect(record.data_fields[14]).to eql Marc4R::Fields::DataField.new("500", ' ', ' ', "a", "Songs.")
111
+ expect(record.data_fields[15]).to eql Marc4R::Fields::DataField.new("511", '0', ' ', "a", "The composer accompanying himself on the guitar ; in part with instrumental ensemble.")
112
+ expect(record.data_fields[16]).to eql Marc4R::Fields::DataField.new("500", ' ', ' ', "a", "Program notes by Nat Hentoff on container.")
113
+ expect(record.data_fields[17]).to eql Marc4R::Fields::DataField.new("505", '0', ' ', "a", "Blowin' in the wind -- Girl from the north country -- Masters of war -- Down the highway -- Bob Dylan's blues -- A hard rain's a-gonna fall -- Don't think twice, it's all right -- Bob Dylan's dream -- Oxford town -- Talking World War III blues -- Corrina, Corrina -- Honey, just allow me one more chance -- I shall be free.")
114
+ expect(record.data_fields[18]).to eql Marc4R::Fields::DataField.new("650", ' ', '0', "a", "Popular music", "y", "1961-1970.")
115
+ expect(record.data_fields[19]).to eql Marc4R::Fields::DataField.new("650", ' ', '0', "a", "Blues (Music)", "y", "1961-1970.")
116
+ expect(record.data_fields[20]).to eql Marc4R::Fields::DataField.new("856", '4', '1', "3", "Preservation copy (limited access)", "u", "http://hdl.loc.gov/loc.mbrsrs/lp0001.dyln")
117
+ expect(record.data_fields[21]).to eql Marc4R::Fields::DataField.new("952", ' ', ' ', "a", "New")
118
+ expect(record.data_fields[22]).to eql Marc4R::Fields::DataField.new("953", ' ', ' ', "a", "TA28")
119
+ expect(record.data_fields[23]).to eql Marc4R::Fields::DataField.new("991", ' ', ' ', "b", "c-RecSound", "h", "Columbia CS 8786", "w", "MUSIC")
120
+ end
@@ -0,0 +1,22 @@
1
+ module TestConstants
2
+ RESOURCES_ILLEGAL_MARC_IN_JSON_JSON = "illegal-marc-in-json.json"
3
+ RESOURCES_MARC_IN_JSON_JSON = "marc-in-json.json"
4
+ RESOURCES_MARC_JSON_JSON = "marc-json.json"
5
+ RESOURCES_LEGAL_JSON_MARC_IN_JSON_JSON = "legal-json-marc-in-json.json"
6
+ RESOURCES_BAD_LEADERS_10_11_MRC = "bad_leaders_10_11.mrc"
7
+ RESOURCES_BAD_TOO_LONG_PLUS_2_MRC = "bad_too_long_plus_2.mrc"
8
+ RESOURCES_SUMMERLAND_MRC = "summerland.mrc"
9
+ RESOURCES_SUMMERLAND_XML = "summerland.xml"
10
+ RESOURCES_SUMMERLAND_MARC_IN_JSON_JSON = "summerland-marc-in-json.json"
11
+ RESOURCES_SUMMERLAND_MARC_IN_JSON_INDENTED_JSON = "summerland-marc-in-json-indented.json"
12
+ RESOURCES_SUMMERLAND_MARC_JSON_JSON = "summerland-marc-json.json"
13
+ RESOURCES_SUMMERLAND_INDENTED_MARC_JSON_JSON = "summerland-indented-marc-json.json"
14
+ RESOURCES_BRKRTEST_MRC = "brkrtest.mrc"
15
+ RESOURCES_CHABON_MRC = "chabon.mrc"
16
+ RESOURCES_CHABON_XML = "chabon.xml"
17
+ RESOURCES_OCLC814388508_XML = "OCLC_814388508.xml"
18
+ RESOURCES_CYRILLIC_CAPITAL_E_MRC = "cyrillic_capital_e.mrc"
19
+ RESOURCES_GREEK_MISSING_CHARSET_MRC = "greekmissingcharsetchange.mrc"
20
+ RESOURCES_CHINESE_MANGLED_MULTIBYTE_MRC = "chinese_mangled_multibyte.mrc"
21
+ RESOURCES_BAD_NUMERIC_CHARACTER_REFERENCE_MRC = "loongboonmee.mrc"
22
+ end
@@ -0,0 +1,3 @@
1
+ require 'rspec/core'
2
+ require 'rspec/core/rake_task'
3
+ RSpec::Core::RakeTask.new(:spec)
metadata ADDED
@@ -0,0 +1,142 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: marc4r
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - barmintor
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2015-02-01 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: rake
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rspec-its
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ description: MARC4R is a Ruby MARC parser based on MARC4J
42
+ email:
43
+ - armintor@gmail.com
44
+ executables: []
45
+ extensions: []
46
+ extra_rdoc_files: []
47
+ files:
48
+ - ".gitignore"
49
+ - Gemfile
50
+ - README.md
51
+ - Rakefile
52
+ - VERSION
53
+ - lib/marc4r.rb
54
+ - lib/marc4r/fields.rb
55
+ - lib/marc4r/fields/control_field.rb
56
+ - lib/marc4r/fields/data_field.rb
57
+ - lib/marc4r/fields/subfield.rb
58
+ - lib/marc4r/marc_stream_reader.rb
59
+ - lib/marc4r/record.rb
60
+ - marc4r.gemspec
61
+ - spec/fixtures/OCLC_814388508.xml
62
+ - spec/fixtures/bad_leaders_10_11.mrc
63
+ - spec/fixtures/bad_too_long_plus_2.mrc
64
+ - spec/fixtures/brkrtest.mrc
65
+ - spec/fixtures/chabon.mrc
66
+ - spec/fixtures/chabon.xml
67
+ - spec/fixtures/chinese_mangled_multibyte.mrc
68
+ - spec/fixtures/cruel-cruel-indicatorless-summerland.xml
69
+ - spec/fixtures/cyrillic_capital_e.mrc
70
+ - spec/fixtures/greekmissingcharsetchange.mrc
71
+ - spec/fixtures/illegal-marc-in-json.json
72
+ - spec/fixtures/legal-json-marc-in-json.json
73
+ - spec/fixtures/loongboonmee.mrc
74
+ - spec/fixtures/marc-in-json.json
75
+ - spec/fixtures/marc-json.json
76
+ - spec/fixtures/summerland-indented-marc-json.json
77
+ - spec/fixtures/summerland-marc-in-json-indented.json
78
+ - spec/fixtures/summerland-marc-in-json.json
79
+ - spec/fixtures/summerland-marc-json.json
80
+ - spec/fixtures/summerland.mrc
81
+ - spec/fixtures/summerland.xml
82
+ - spec/fixtures/u335.mrc
83
+ - spec/lib/marc4r/fields/control_field_spec.rb
84
+ - spec/lib/marc4r/fields/data_field_spec.rb
85
+ - spec/lib/marc4r/marc_stream_reader.rb
86
+ - spec/lib/marc4r/record_spec.rb
87
+ - spec/spec_helper.rb
88
+ - spec/test_constants.rb
89
+ - tasks/marc4r-dev.rake
90
+ homepage: http://github.com/barmintor/marc4r
91
+ licenses:
92
+ - MIT
93
+ metadata: {}
94
+ post_install_message:
95
+ rdoc_options: []
96
+ require_paths:
97
+ - lib
98
+ required_ruby_version: !ruby/object:Gem::Requirement
99
+ requirements:
100
+ - - ">="
101
+ - !ruby/object:Gem::Version
102
+ version: '0'
103
+ required_rubygems_version: !ruby/object:Gem::Requirement
104
+ requirements:
105
+ - - ">="
106
+ - !ruby/object:Gem::Version
107
+ version: '0'
108
+ requirements: []
109
+ rubyforge_project:
110
+ rubygems_version: 2.2.2
111
+ signing_key:
112
+ specification_version: 4
113
+ summary: MARC4R is a Ruby MARC parser based on MARC4J
114
+ test_files:
115
+ - spec/fixtures/OCLC_814388508.xml
116
+ - spec/fixtures/bad_leaders_10_11.mrc
117
+ - spec/fixtures/bad_too_long_plus_2.mrc
118
+ - spec/fixtures/brkrtest.mrc
119
+ - spec/fixtures/chabon.mrc
120
+ - spec/fixtures/chabon.xml
121
+ - spec/fixtures/chinese_mangled_multibyte.mrc
122
+ - spec/fixtures/cruel-cruel-indicatorless-summerland.xml
123
+ - spec/fixtures/cyrillic_capital_e.mrc
124
+ - spec/fixtures/greekmissingcharsetchange.mrc
125
+ - spec/fixtures/illegal-marc-in-json.json
126
+ - spec/fixtures/legal-json-marc-in-json.json
127
+ - spec/fixtures/loongboonmee.mrc
128
+ - spec/fixtures/marc-in-json.json
129
+ - spec/fixtures/marc-json.json
130
+ - spec/fixtures/summerland-indented-marc-json.json
131
+ - spec/fixtures/summerland-marc-in-json-indented.json
132
+ - spec/fixtures/summerland-marc-in-json.json
133
+ - spec/fixtures/summerland-marc-json.json
134
+ - spec/fixtures/summerland.mrc
135
+ - spec/fixtures/summerland.xml
136
+ - spec/fixtures/u335.mrc
137
+ - spec/lib/marc4r/fields/control_field_spec.rb
138
+ - spec/lib/marc4r/fields/data_field_spec.rb
139
+ - spec/lib/marc4r/marc_stream_reader.rb
140
+ - spec/lib/marc4r/record_spec.rb
141
+ - spec/spec_helper.rb
142
+ - spec/test_constants.rb