marc4r 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +1 -0
- data/Gemfile +4 -0
- data/README.md +4 -0
- data/Rakefile +13 -0
- data/VERSION +1 -0
- data/lib/marc4r.rb +24 -0
- data/lib/marc4r/fields.rb +28 -0
- data/lib/marc4r/fields/control_field.rb +19 -0
- data/lib/marc4r/fields/data_field.rb +46 -0
- data/lib/marc4r/fields/subfield.rb +12 -0
- data/lib/marc4r/marc_stream_reader.rb +82 -0
- data/lib/marc4r/record.rb +92 -0
- data/marc4r.gemspec +21 -0
- data/spec/fixtures/OCLC_814388508.xml +123 -0
- data/spec/fixtures/bad_leaders_10_11.mrc +1 -0
- data/spec/fixtures/bad_too_long_plus_2.mrc +1 -0
- data/spec/fixtures/brkrtest.mrc +1 -0
- data/spec/fixtures/chabon.mrc +1 -0
- data/spec/fixtures/chabon.xml +116 -0
- data/spec/fixtures/chinese_mangled_multibyte.mrc +1 -0
- data/spec/fixtures/cruel-cruel-indicatorless-summerland.xml +55 -0
- data/spec/fixtures/cyrillic_capital_e.mrc +1 -0
- data/spec/fixtures/greekmissingcharsetchange.mrc +1 -0
- data/spec/fixtures/illegal-marc-in-json.json +401 -0
- data/spec/fixtures/legal-json-marc-in-json.json +380 -0
- data/spec/fixtures/loongboonmee.mrc +1 -0
- data/spec/fixtures/marc-in-json.json +380 -0
- data/spec/fixtures/marc-json.json +195 -0
- data/spec/fixtures/summerland-indented-marc-json.json +104 -0
- data/spec/fixtures/summerland-marc-in-json-indented.json +183 -0
- data/spec/fixtures/summerland-marc-in-json.json +1 -0
- data/spec/fixtures/summerland-marc-json.json +1 -0
- data/spec/fixtures/summerland.mrc +1 -0
- data/spec/fixtures/summerland.xml +52 -0
- data/spec/fixtures/u335.mrc +1 -0
- data/spec/lib/marc4r/fields/control_field_spec.rb +46 -0
- data/spec/lib/marc4r/fields/data_field_spec.rb +39 -0
- data/spec/lib/marc4r/marc_stream_reader.rb +19 -0
- data/spec/lib/marc4r/record_spec.rb +111 -0
- data/spec/spec_helper.rb +120 -0
- data/spec/test_constants.rb +22 -0
- data/tasks/marc4r-dev.rake +3 -0
- 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
|
data/spec/spec_helper.rb
ADDED
@@ -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
|
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
|