marc4r 0.0.1
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.
- 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
|