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