marc 1.0.4 → 1.2.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.github/ISSUE_TEMPLATE/bug_report.md +30 -0
- data/.github/workflows/ruby.yml +24 -0
- data/.gitignore +17 -0
- data/.standard.yml +1 -0
- data/{Changes → CHANGELOG.md} +106 -29
- data/Gemfile +15 -0
- data/README.md +240 -47
- data/Rakefile +14 -14
- data/bin/marc +14 -0
- data/bin/marc2xml +17 -0
- data/examples/xml2marc.rb +10 -0
- data/lib/marc/constants.rb +3 -3
- data/lib/marc/controlfield.rb +35 -23
- data/lib/marc/datafield.rb +70 -63
- data/lib/marc/dublincore.rb +59 -41
- data/lib/marc/exception.rb +9 -1
- data/lib/marc/jsonl_reader.rb +33 -0
- data/lib/marc/jsonl_writer.rb +44 -0
- data/lib/marc/marc8/map_to_unicode.rb +16417 -16420
- data/lib/marc/marc8/to_unicode.rb +80 -86
- data/lib/marc/reader.rb +119 -121
- data/lib/marc/record.rb +72 -62
- data/lib/marc/subfield.rb +12 -10
- data/lib/marc/unsafe_xmlwriter.rb +93 -0
- data/lib/marc/version.rb +1 -1
- data/lib/marc/writer.rb +27 -30
- data/lib/marc/xml_parsers.rb +222 -197
- data/lib/marc/xmlreader.rb +131 -114
- data/lib/marc/xmlwriter.rb +93 -81
- data/lib/marc.rb +20 -18
- data/marc.gemspec +23 -0
- data/test/marc8/tc_marc8_mapping.rb +3 -3
- data/test/marc8/tc_to_unicode.rb +28 -32
- data/test/messed_up_leader.xml +9 -0
- data/test/tc_controlfield.rb +37 -34
- data/test/tc_datafield.rb +65 -60
- data/test/tc_dublincore.rb +9 -11
- data/test/tc_hash.rb +10 -13
- data/test/tc_jsonl.rb +19 -0
- data/test/tc_marchash.rb +17 -21
- data/test/tc_parsers.rb +108 -144
- data/test/tc_reader.rb +35 -36
- data/test/tc_reader_char_encodings.rb +149 -169
- data/test/tc_record.rb +143 -148
- data/test/tc_subfield.rb +14 -13
- data/test/tc_unsafe_xml.rb +95 -0
- data/test/tc_writer.rb +101 -108
- data/test/tc_xml.rb +99 -87
- data/test/tc_xml_error_handling.rb +7 -8
- data/test/ts_marc.rb +8 -8
- metadata +94 -9
data/test/marc8/tc_to_unicode.rb
CHANGED
@@ -1,15 +1,12 @@
|
|
1
|
-
|
1
|
+
require "test/unit"
|
2
|
+
require "marc"
|
2
3
|
|
3
|
-
require
|
4
|
-
require 'marc'
|
4
|
+
require "marc/marc8/to_unicode"
|
5
5
|
|
6
|
-
require
|
7
|
-
|
8
|
-
require 'unf'
|
6
|
+
require "unf"
|
9
7
|
|
10
8
|
if "".respond_to?(:encoding)
|
11
9
|
|
12
|
-
|
13
10
|
class TestMarc8ToUnicode < Test::Unit::TestCase
|
14
11
|
def test_empty_string
|
15
12
|
value = MARC::Marc8::ToUnicode.new.transcode("")
|
@@ -35,18 +32,18 @@ if "".respond_to?(:encoding)
|
|
35
32
|
# two data files, marc8 and utf8, with line-by-line correspondences.
|
36
33
|
#
|
37
34
|
# For now, we have NOT included proprietary III encodings in our test data!
|
38
|
-
utf8_file
|
39
|
-
marc8_file
|
35
|
+
utf8_file = File.open(File.expand_path("../data/test_utf8.txt", __FILE__), "r:UTF-8")
|
36
|
+
marc8_file = File.open(File.expand_path("../data/test_marc8.txt", __FILE__), "r:binary")
|
40
37
|
|
41
38
|
i = 0
|
42
39
|
converter = MARC::Marc8::ToUnicode.new
|
43
40
|
|
44
41
|
begin
|
45
|
-
|
42
|
+
loop do
|
46
43
|
i += 1
|
47
44
|
|
48
|
-
utf8
|
49
|
-
marc8
|
45
|
+
utf8 = utf8_file.readline.chomp
|
46
|
+
marc8 = marc8_file.readline.chomp
|
50
47
|
|
51
48
|
converted = converter.transcode(marc8)
|
52
49
|
|
@@ -55,11 +52,11 @@ if "".respond_to?(:encoding)
|
|
55
52
|
|
56
53
|
assert_equal utf8, converted, "Test data line #{i}, expected converted to match provided utf8"
|
57
54
|
end
|
58
|
-
rescue EOFError
|
55
|
+
rescue EOFError
|
59
56
|
# just means the file was over, no biggie
|
60
57
|
assert i > 1500, "Read as many lines as we expected to, at least 1500"
|
61
|
-
rescue
|
62
|
-
|
58
|
+
rescue => e
|
59
|
+
warn "Error at test data line #{i}"
|
63
60
|
raise e
|
64
61
|
end
|
65
62
|
end
|
@@ -67,23 +64,23 @@ if "".respond_to?(:encoding)
|
|
67
64
|
def test_explicit_normalization
|
68
65
|
# \xC1 is Marc8 "script small letter l", which under unicode
|
69
66
|
# COMPAT normalization will turn into ordinary 'l'
|
70
|
-
marc8
|
71
|
-
unicode
|
67
|
+
marc8 = "Conversa\xF0c\xE4ao \xC1"
|
68
|
+
unicode = "Conversação \u2113"
|
72
69
|
|
73
|
-
unicode_c
|
74
|
-
unicode_kc
|
75
|
-
unicode_d
|
76
|
-
unicode_kd
|
70
|
+
unicode_c = UNF::Normalizer.normalize(unicode, :nfc)
|
71
|
+
unicode_kc = UNF::Normalizer.normalize(unicode, :nfkc)
|
72
|
+
unicode_d = UNF::Normalizer.normalize(unicode, :nfd)
|
73
|
+
unicode_kd = UNF::Normalizer.normalize(unicode, :nfkd)
|
77
74
|
|
78
75
|
converter = MARC::Marc8::ToUnicode.new
|
79
76
|
|
80
|
-
assert_equal unicode_c,
|
81
|
-
assert_equal unicode_kc, converter.transcode(marc8, :
|
82
|
-
assert_equal unicode_d,
|
83
|
-
assert_equal unicode_kd, converter.transcode(marc8, :
|
77
|
+
assert_equal unicode_c, converter.transcode(marc8, normalization: :nfc)
|
78
|
+
assert_equal unicode_kc, converter.transcode(marc8, normalization: :nfkc)
|
79
|
+
assert_equal unicode_d, converter.transcode(marc8, normalization: :nfd)
|
80
|
+
assert_equal unicode_kd, converter.transcode(marc8, normalization: :nfkd)
|
84
81
|
|
85
82
|
# disable normalization for performance or something, we won't end up with NFC.
|
86
|
-
refute_equal unicode_c, converter.transcode(marc8, :
|
83
|
+
refute_equal unicode_c, converter.transcode(marc8, normalization: nil)
|
87
84
|
end
|
88
85
|
|
89
86
|
def test_expand_ncr
|
@@ -91,7 +88,7 @@ if "".respond_to?(:encoding)
|
|
91
88
|
|
92
89
|
marc8_ncr = "Weird ‏ � but these aren't changed #x2000; ÈF etc."
|
93
90
|
assert_equal "Weird \u200F \uFFFD but these aren't changed #x2000; ÈF etc.", converter.transcode(marc8_ncr)
|
94
|
-
assert_equal marc8_ncr, converter.transcode(marc8_ncr, :
|
91
|
+
assert_equal marc8_ncr, converter.transcode(marc8_ncr, expand_ncr: false), "should not expand NCR if disabled"
|
95
92
|
end
|
96
93
|
|
97
94
|
def test_bad_byte
|
@@ -130,7 +127,7 @@ if "".respond_to?(:encoding)
|
|
130
127
|
converter = MARC::Marc8::ToUnicode.new
|
131
128
|
|
132
129
|
bad_marc8 = "\e$1!PVK7oi$N!Q1!G4i$N!0p!Q+{6924f6}\e(B"
|
133
|
-
value = converter.transcode(bad_marc8, :
|
130
|
+
value = converter.transcode(bad_marc8, invalid: :replace)
|
134
131
|
|
135
132
|
assert_equal "UTF-8", value.encoding.name
|
136
133
|
assert value.valid_encoding?
|
@@ -145,7 +142,7 @@ if "".respond_to?(:encoding)
|
|
145
142
|
converter = MARC::Marc8::ToUnicode.new
|
146
143
|
|
147
144
|
bad_marc8 = "\e$1!PVK7oi$N!Q1!G4i$N!0p!Q+{6924f6}\e(B"
|
148
|
-
value = converter.transcode(bad_marc8, :
|
145
|
+
value = converter.transcode(bad_marc8, invalid: :replace, replace: "")
|
149
146
|
|
150
147
|
assert_equal "UTF-8", value.encoding.name
|
151
148
|
assert value.valid_encoding?
|
@@ -169,9 +166,8 @@ if "".respond_to?(:encoding)
|
|
169
166
|
|
170
167
|
assert_equal "La Soci\u00E9t\x1B,", value
|
171
168
|
end
|
172
|
-
|
173
169
|
end
|
174
170
|
else
|
175
|
-
require
|
176
|
-
|
171
|
+
require "pathname"
|
172
|
+
warn "\nTests not being run in ruby 1.9.x, skipping #{Pathname.new(__FILE__).basename}\n\n"
|
177
173
|
end
|
@@ -0,0 +1,9 @@
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
2
|
+
<collection xmlns="http://www.loc.gov/MARC21/slim">
|
3
|
+
<record>
|
4
|
+
<leader>01301nam a22003618< 4500</leader>
|
5
|
+
<controlfield tag="005">02-26-96</controlfield>
|
6
|
+
<controlfield tag="008">960213s1996 flu 000 0 eng </controlfield>
|
7
|
+
<controlfield tag="001">991010422259705706</controlfield>
|
8
|
+
<datafield tag="010" ind1=" " ind2=" "><subfield code="a">95041713</subfield></datafield><datafield tag="020" ind1=" " ind2=" "><subfield code="a">1566700701</subfield><subfield code="q">(alk. paper)</subfield></datafield><datafield tag="020" ind1=" " ind2=" "><subfield code="a">9781566700702</subfield><subfield code="q">(alk. paper)</subfield></datafield><datafield tag="035" ind1=" " ind2=" "><subfield code="a">(NhD)b23774344-01dcl_inst</subfield></datafield><datafield tag="035" ind1=" " ind2=" "><subfield code="a">(CStRLIN)ocm33245123</subfield><subfield code="9">ExL</subfield></datafield><datafield tag="035" ind1=" " ind2=" "><subfield code="b">b23774344</subfield></datafield><datafield tag="040" ind1=" " ind2=" "><subfield code="a">DLC</subfield><subfield code="c">DLC</subfield><subfield code="d">NhD</subfield></datafield><datafield tag="050" ind1=" " ind2="4"><subfield code="a">QH545.A1</subfield><subfield code="b">R65 1996</subfield></datafield><datafield tag="100" ind1="1" ind2=" "><subfield code="a">Römbke, Jörg.</subfield><subfield code="0">http://id.loc.gov/authorities/names/n95093926.</subfield></datafield><datafield tag="245" ind1="1" ind2="0"><subfield code="a">Applied ecotoxicology /</subfield><subfield code="c">Jörg Römbke, Johann F. Moltmann.</subfield></datafield><datafield tag="260" ind1=" " ind2=" "><subfield code="a">Boca Raton, FL :</subfield><subfield code="b">CRC/Lewis Publishers,</subfield><subfield code="c">1995.</subfield></datafield><datafield tag="300" ind1=" " ind2=" "><subfield code="a">282 pages :</subfield><subfield code="b">illustrations ;</subfield><subfield code="c">24 cm.</subfield></datafield><datafield tag="336" ind1=" " ind2=" "><subfield code="a">text</subfield><subfield code="b">txt</subfield><subfield code="2">rdacontent.</subfield></datafield><datafield tag="337" ind1=" " ind2=" "><subfield code="a">unmediated</subfield><subfield code="b">n</subfield><subfield code="2">rdamedia.</subfield></datafield><datafield tag="338" ind1=" " ind2=" "><subfield code="a">volume</subfield><subfield code="b">nc</subfield><subfield code="2">rdacarrier.</subfield></datafield><datafield tag="504" ind1=" " ind2=" "><subfield code="a">Includes bibliographical references and index.</subfield></datafield><datafield tag="650" ind1=" " ind2="0"><subfield code="a">Pollution.</subfield><subfield code="0">http://id.loc.gov/authorities/subjects/sh85104530.</subfield></datafield><datafield tag="700" ind1="1" ind2=" "><subfield code="a">Moltmann, Johann Felix,</subfield><subfield code="d">1954-</subfield><subfield code="0">http://id.loc.gov/authorities/names/n91002202.</subfield></datafield><datafield tag="991" ind1=" " ind2=" "><subfield code="a">b23774344</subfield></datafield><datafield tag="906" ind1=" " ind2=" "><subfield code="a">0</subfield><subfield code="b">flu</subfield><subfield code="c">multi</subfield><subfield code="d">a</subfield><subfield code="e">r</subfield><subfield code="f">1</subfield><subfield code="g">02-09-96</subfield><subfield code="h">01-10-19</subfield><subfield code="i">20</subfield></datafield><datafield tag="955" ind1=" " ind2=" "><subfield code="u">+l</subfield></datafield><datafield tag="948" ind1=" " ind2=" "><subfield code="a">BSLW 06/11/2018</subfield></datafield><datafield tag="998" ind1=" " ind2=" "><subfield code="a">02/13/96</subfield><subfield code="t">c</subfield><subfield code="s">9110</subfield><subfield code="l">NHDG</subfield><subfield code="n">NhD</subfield><subfield code="w">DCLC9541713B</subfield><subfield code="d">02/13/96</subfield><subfield code="c">JS</subfield><subfield code="b">ACQ</subfield><subfield code="i">960213</subfield></datafield><datafield tag="995" ind1=" " ind2=" "><subfield code="a">OCLC Recl. 2008</subfield></datafield><datafield tag="903" ind1=" " ind2=" "><subfield code="f">corr./JS/2-26-96</subfield></datafield><datafield tag="903" ind1=" " ind2=" "><subfield code="a">QH545.A1</subfield><subfield code="b">R65 1995</subfield></datafield><datafield tag="852" ind1="0" ind2=" "><subfield code="b">DEPOSITORY</subfield><subfield code="c">DEPOSITORY</subfield><subfield code="h">QH545.A1 R65 1996</subfield><subfield code="8">22127176380005706</subfield></datafield><datafield tag="950" ind1=" " ind2=" "><subfield code="z">33311011074376</subfield><subfield code="e">1</subfield></datafield></record>
|
9
|
+
</collection>
|
data/test/tc_controlfield.rb
CHANGED
@@ -1,50 +1,53 @@
|
|
1
|
-
require
|
2
|
-
require
|
1
|
+
require "test/unit"
|
2
|
+
require "marc"
|
3
3
|
|
4
4
|
class TestField < Test::Unit::TestCase
|
5
|
-
|
6
5
|
def test_control
|
7
|
-
control = MARC::ControlField.new(
|
8
|
-
assert_equal(control.to_s,
|
6
|
+
control = MARC::ControlField.new("005", "foobarbaz")
|
7
|
+
assert_equal(control.to_s, "005 foobarbaz")
|
9
8
|
end
|
10
9
|
|
11
10
|
def test_field_as_control
|
12
|
-
|
13
|
-
|
14
|
-
field = MARC::DataField.new('007')
|
15
|
-
end
|
11
|
+
field = MARC::DataField.new("007")
|
12
|
+
assert_equal(field.valid?, false)
|
16
13
|
end
|
17
14
|
|
18
15
|
def test_alpha_control_field
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
end
|
16
|
+
# can't have a field with a tag < 010
|
17
|
+
field = MARC::ControlField.new("DDD")
|
18
|
+
assert_equal(field.valid?, false)
|
23
19
|
end
|
24
|
-
|
20
|
+
|
25
21
|
def test_extra_control_field
|
26
|
-
MARC::ControlField.control_tags <<
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
end
|
37
|
-
assert_raise(MARC::Exception) do
|
38
|
-
field = MARC::ControlField.new('FMT')
|
39
|
-
end
|
40
|
-
|
22
|
+
MARC::ControlField.control_tags << "FMT"
|
23
|
+
field = MARC::ControlField.new("FMT")
|
24
|
+
assert_equal(field.valid?, true)
|
25
|
+
field = MARC::DataField.new("FMT")
|
26
|
+
assert_equal(field.valid?, false)
|
27
|
+
MARC::ControlField.control_tags.delete("FMT")
|
28
|
+
field = MARC::DataField.new("FMT")
|
29
|
+
assert_equal(field.valid?, true)
|
30
|
+
field = MARC::ControlField.new("FMT")
|
31
|
+
assert_equal(field.valid?, false)
|
41
32
|
end
|
42
33
|
|
43
34
|
def test_control_as_field
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
end
|
35
|
+
# can't have a control with a tag > 009
|
36
|
+
f = MARC::ControlField.new("245")
|
37
|
+
assert_equal(f.valid?, false)
|
48
38
|
end
|
49
|
-
end
|
50
39
|
|
40
|
+
def test_equal
|
41
|
+
f1 = MARC::ControlField.new("001", "foobarbaz")
|
42
|
+
f2 = MARC::ControlField.new("001", "foobarbaz")
|
43
|
+
assert_equal(f1, f2)
|
44
|
+
|
45
|
+
f3 = MARC::ControlField.new("001", "foobarbazqux")
|
46
|
+
assert_not_equal(f1, f3)
|
47
|
+
f4 = MARC::ControlField.new("002", "foobarbaz")
|
48
|
+
assert_not_equal(f1, f4)
|
49
|
+
|
50
|
+
assert_not_equal(f1, "001")
|
51
|
+
assert_not_equal(f2, "foobarbaz")
|
52
|
+
end
|
53
|
+
end
|
data/test/tc_datafield.rb
CHANGED
@@ -1,71 +1,76 @@
|
|
1
|
-
require
|
2
|
-
require
|
1
|
+
require "test/unit"
|
2
|
+
require "marc"
|
3
3
|
|
4
4
|
class TestField < Test::Unit::TestCase
|
5
|
+
def test_tag
|
6
|
+
f1 = MARC::DataField.new("100")
|
7
|
+
assert_equal("100", f1.tag)
|
8
|
+
f2 = MARC::DataField.new("100")
|
9
|
+
assert_equal("100", f2.tag)
|
10
|
+
assert_equal(f1, f2)
|
11
|
+
f3 = MARC::DataField.new("245")
|
12
|
+
assert_not_equal(f1, f3)
|
13
|
+
end
|
5
14
|
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
f2 = MARC::DataField.new(tag='100')
|
10
|
-
assert_equal('100', f2.tag)
|
11
|
-
assert_equal(f1, f2)
|
12
|
-
f3 = MARC::DataField.new('245')
|
13
|
-
assert_not_equal(f1, f3)
|
14
|
-
end
|
15
|
+
def test_alphabetic_tag
|
16
|
+
alph = MARC::DataField.new("ALF")
|
17
|
+
assert_equal "ALF", alph.tag
|
15
18
|
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
+
alphnum = MARC::DataField.new("0D9")
|
20
|
+
assert_equal "0D9", alphnum.tag
|
21
|
+
end
|
19
22
|
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
+
def test_indicators
|
24
|
+
f1 = MARC::DataField.new("100", "0", "1")
|
25
|
+
assert_equal("0", f1.indicator1)
|
26
|
+
assert_equal("1", f1.indicator2)
|
27
|
+
f2 = MARC::DataField.new("100", "0", "1")
|
28
|
+
assert_equal("0", f2.indicator1)
|
29
|
+
assert_equal("1", f2.indicator2)
|
30
|
+
assert_equal(f1, f2)
|
31
|
+
f3 = MARC::DataField.new("100", "1", "1")
|
32
|
+
assert_not_equal(f1, f3)
|
33
|
+
end
|
23
34
|
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
+
def test_subfields
|
36
|
+
f1 = MARC::DataField.new("100", "0", "1",
|
37
|
+
MARC::Subfield.new("a", "Foo"),
|
38
|
+
MARC::Subfield.new("b", "Bar"))
|
39
|
+
assert_equal("100 01 $a Foo $b Bar ", f1.to_s)
|
40
|
+
assert_equal("FooBar", f1.value)
|
41
|
+
f2 = MARC::DataField.new("100", "0", "1",
|
42
|
+
MARC::Subfield.new("a", "Foo"),
|
43
|
+
MARC::Subfield.new("b", "Bar"))
|
44
|
+
assert_equal(f1, f2)
|
45
|
+
f3 = MARC::DataField.new("100", "0", "1",
|
46
|
+
MARC::Subfield.new("a", "Foo"),
|
47
|
+
MARC::Subfield.new("b", "Bez"))
|
48
|
+
assert_not_equal(f1, f3)
|
49
|
+
end
|
35
50
|
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
assert_equal("100 01 $a Foo $b Bar ", f1.to_s)
|
41
|
-
assert_equal("FooBar", f1.value)
|
42
|
-
f2 = MARC::DataField.new('100', '0', '1',
|
43
|
-
MARC::Subfield.new('a', 'Foo'),
|
44
|
-
MARC::Subfield.new('b', 'Bar') )
|
45
|
-
assert_equal(f1,f2)
|
46
|
-
f3 = MARC::DataField.new('100', '0', '1',
|
47
|
-
MARC::Subfield.new('a', 'Foo'),
|
48
|
-
MARC::Subfield.new('b', 'Bez') )
|
49
|
-
assert_not_equal(f1,f3)
|
50
|
-
end
|
51
|
+
def test_subfield_shorthand
|
52
|
+
f = MARC::DataField.new("100", "0", "1", ["a", "Foo"], ["b", "Bar"])
|
53
|
+
assert_equal("100 01 $a Foo $b Bar ", f.to_s)
|
54
|
+
end
|
51
55
|
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
56
|
+
def test_iterator
|
57
|
+
field = MARC::DataField.new("100", "0", "1", ["a", "Foo"], ["b", "Bar"],
|
58
|
+
["a", "Bez"])
|
59
|
+
count = 0
|
60
|
+
field.each { |x| count += 1 }
|
61
|
+
assert_equal(count, 3)
|
62
|
+
end
|
57
63
|
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
field.each {|x| count += 1}
|
63
|
-
assert_equal(count,3)
|
64
|
-
end
|
65
|
-
|
66
|
-
def test_lookup_shorthand
|
67
|
-
f = MARC::DataField.new('100', '0', '1', ['a', 'Foo'], ['b', 'Bar'])
|
68
|
-
assert_equal(f['b'], 'Bar')
|
69
|
-
end
|
64
|
+
def test_lookup_shorthand
|
65
|
+
f = MARC::DataField.new("100", "0", "1", ["a", "Foo"], ["b", "Bar"])
|
66
|
+
assert_equal(f["b"], "Bar")
|
67
|
+
end
|
70
68
|
|
69
|
+
def test_equal_other_types
|
70
|
+
f = MARC::DataField.new("100", "0", "1",
|
71
|
+
MARC::Subfield.new("a", "Foo"),
|
72
|
+
MARC::Subfield.new("b", "Bar"))
|
73
|
+
assert_not_equal(f, "100 01 $a Foo $b Bar ")
|
74
|
+
assert_not_equal(f, f["a"])
|
75
|
+
end
|
71
76
|
end
|
data/test/tc_dublincore.rb
CHANGED
@@ -1,14 +1,12 @@
|
|
1
|
-
require
|
2
|
-
require
|
1
|
+
require "test/unit"
|
2
|
+
require "marc"
|
3
3
|
|
4
4
|
class DublinCoreTest < Test::Unit::TestCase
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
assert dc['title'] == record['245']['a']
|
11
|
-
end
|
5
|
+
def test_mapping
|
6
|
+
reader = MARC::Reader.new("test/batch.dat")
|
7
|
+
reader.each do |record|
|
8
|
+
dc = record.to_dublin_core
|
9
|
+
assert dc["title"] == record["245"]["a"]
|
12
10
|
end
|
13
|
-
|
14
|
-
end
|
11
|
+
end
|
12
|
+
end
|
data/test/tc_hash.rb
CHANGED
@@ -1,26 +1,23 @@
|
|
1
|
-
require
|
2
|
-
require
|
3
|
-
require
|
1
|
+
require "test/unit"
|
2
|
+
require "marc"
|
3
|
+
require "rubygems"
|
4
4
|
|
5
5
|
class TestHash < Test::Unit::TestCase
|
6
|
-
|
7
6
|
def test_to_hash
|
8
|
-
raw = IO.read(
|
7
|
+
raw = IO.read("test/one.dat")
|
9
8
|
r = MARC::Record.new_from_marc(raw)
|
10
9
|
h = r.to_hash
|
11
10
|
assert_kind_of(Hash, h)
|
12
|
-
assert_equal(r.leader, h[
|
13
|
-
assert_equal(r.fields.length, h[
|
14
|
-
assert_equal(r.fields.first.tag, h[
|
11
|
+
assert_equal(r.leader, h["leader"])
|
12
|
+
assert_equal(r.fields.length, h["fields"].length)
|
13
|
+
assert_equal(r.fields.first.tag, h["fields"].first.keys.first)
|
15
14
|
end
|
16
15
|
|
17
16
|
def test_roundtrip
|
18
|
-
reader = MARC::Reader.new(
|
17
|
+
reader = MARC::Reader.new("test/batch.dat")
|
19
18
|
reader.each do |r|
|
20
19
|
x = MARC::Record.new_from_hash(r.to_hash)
|
21
|
-
assert_equal(r,x)
|
20
|
+
assert_equal(r, x)
|
22
21
|
end
|
23
22
|
end
|
24
|
-
|
25
|
-
|
26
|
-
end
|
23
|
+
end
|
data/test/tc_jsonl.rb
ADDED
@@ -0,0 +1,19 @@
|
|
1
|
+
require "test/unit"
|
2
|
+
require "marc"
|
3
|
+
|
4
|
+
class JSONLTestCase < Test::Unit::TestCase
|
5
|
+
def test_round_trip
|
6
|
+
tempfile = "test/batch.jsonl"
|
7
|
+
records = MARC::Reader.new("test/batch.dat").to_a
|
8
|
+
jsonl_writer = MARC::JSONLWriter.new(tempfile)
|
9
|
+
records.each { |r| jsonl_writer.write(r) }
|
10
|
+
jsonl_writer.close
|
11
|
+
|
12
|
+
jsonl_reader = MARC::JSONLReader.new(tempfile)
|
13
|
+
jsonl_reader.each_with_index do |r, i|
|
14
|
+
assert_equal(records[i], r)
|
15
|
+
end
|
16
|
+
ensure
|
17
|
+
File.unlink(tempfile)
|
18
|
+
end
|
19
|
+
end
|
data/test/tc_marchash.rb
CHANGED
@@ -1,37 +1,33 @@
|
|
1
|
-
require
|
2
|
-
require
|
3
|
-
require
|
1
|
+
require "test/unit"
|
2
|
+
require "marc"
|
3
|
+
require "rubygems"
|
4
4
|
|
5
5
|
class TestMARCHASH < Test::Unit::TestCase
|
6
|
-
|
7
6
|
def test_simple
|
8
7
|
simple = {
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
[
|
8
|
+
"type" => "marc-hash",
|
9
|
+
"version" => [1, 0],
|
10
|
+
"leader" => "LEADER",
|
11
|
+
"fields" => [
|
12
|
+
["245", "1", "0",
|
14
13
|
[
|
15
|
-
[
|
16
|
-
[
|
17
|
-
]
|
18
|
-
]
|
14
|
+
["a", "TITLE"],
|
15
|
+
["b", "SUBTITLE"]
|
16
|
+
]]
|
19
17
|
]
|
20
18
|
}
|
21
|
-
r = MARC::Record.new
|
22
|
-
r.leader =
|
23
|
-
f = MARC::DataField.new(
|
19
|
+
r = MARC::Record.new
|
20
|
+
r.leader = "LEADER"
|
21
|
+
f = MARC::DataField.new("245", "1", "0", ["a", "TITLE"], ["b", "SUBTITLE"])
|
24
22
|
r << f
|
25
23
|
assert_equal(r.to_marchash, simple)
|
26
24
|
end
|
27
25
|
|
28
26
|
def test_real
|
29
|
-
reader = MARC::Reader.new(
|
27
|
+
reader = MARC::Reader.new("test/batch.dat")
|
30
28
|
reader.each do |r|
|
31
29
|
x = MARC::Record.new_from_marchash(r.to_marchash)
|
32
|
-
assert_equal(r,x)
|
30
|
+
assert_equal(r, x)
|
33
31
|
end
|
34
32
|
end
|
35
|
-
|
36
|
-
|
37
|
-
end
|
33
|
+
end
|