pennmarc 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 +6 -0
- data/.rspec +2 -0
- data/.ruby-version +1 -0
- data/Gemfile +23 -0
- data/Gemfile.lock +119 -0
- data/README.md +82 -0
- data/legacy/indexer.rb +568 -0
- data/legacy/marc.rb +2964 -0
- data/legacy/test_file_output.json +49 -0
- data/lib/pennmarc/encoding_level.rb +43 -0
- data/lib/pennmarc/enriched_marc.rb +36 -0
- data/lib/pennmarc/heading_control.rb +11 -0
- data/lib/pennmarc/helpers/citation.rb +31 -0
- data/lib/pennmarc/helpers/creator.rb +237 -0
- data/lib/pennmarc/helpers/database.rb +89 -0
- data/lib/pennmarc/helpers/date.rb +85 -0
- data/lib/pennmarc/helpers/edition.rb +90 -0
- data/lib/pennmarc/helpers/format.rb +312 -0
- data/lib/pennmarc/helpers/genre.rb +71 -0
- data/lib/pennmarc/helpers/helper.rb +11 -0
- data/lib/pennmarc/helpers/identifier.rb +134 -0
- data/lib/pennmarc/helpers/language.rb +37 -0
- data/lib/pennmarc/helpers/link.rb +12 -0
- data/lib/pennmarc/helpers/location.rb +97 -0
- data/lib/pennmarc/helpers/note.rb +132 -0
- data/lib/pennmarc/helpers/production.rb +131 -0
- data/lib/pennmarc/helpers/relation.rb +135 -0
- data/lib/pennmarc/helpers/series.rb +118 -0
- data/lib/pennmarc/helpers/subject.rb +304 -0
- data/lib/pennmarc/helpers/title.rb +197 -0
- data/lib/pennmarc/mappings/language.yml +516 -0
- data/lib/pennmarc/mappings/locations.yml +1801 -0
- data/lib/pennmarc/mappings/relator.yml +263 -0
- data/lib/pennmarc/parser.rb +177 -0
- data/lib/pennmarc/util.rb +240 -0
- data/lib/pennmarc.rb +6 -0
- data/pennmarc.gemspec +22 -0
- data/spec/fixtures/marcxml/test.xml +167 -0
- data/spec/lib/pennmarc/helpers/citation_spec.rb +27 -0
- data/spec/lib/pennmarc/helpers/creator_spec.rb +183 -0
- data/spec/lib/pennmarc/helpers/database_spec.rb +60 -0
- data/spec/lib/pennmarc/helpers/date_spec.rb +105 -0
- data/spec/lib/pennmarc/helpers/edition_spec.rb +38 -0
- data/spec/lib/pennmarc/helpers/format_spec.rb +200 -0
- data/spec/lib/pennmarc/helpers/genre_spec.rb +89 -0
- data/spec/lib/pennmarc/helpers/identifer_spec.rb +105 -0
- data/spec/lib/pennmarc/helpers/language_spec.rb +30 -0
- data/spec/lib/pennmarc/helpers/location_spec.rb +70 -0
- data/spec/lib/pennmarc/helpers/note_spec.rb +233 -0
- data/spec/lib/pennmarc/helpers/production_spec.rb +193 -0
- data/spec/lib/pennmarc/helpers/relation_spec.rb +120 -0
- data/spec/lib/pennmarc/helpers/subject_spec.rb +262 -0
- data/spec/lib/pennmarc/helpers/title_spec.rb +169 -0
- data/spec/lib/pennmarc/marc_util_spec.rb +206 -0
- data/spec/lib/pennmarc/parser_spec.rb +13 -0
- data/spec/spec_helper.rb +104 -0
- data/spec/support/marc_spec_helpers.rb +84 -0
- metadata +171 -0
@@ -0,0 +1,167 @@
|
|
1
|
+
<record>
|
2
|
+
<leader>01908cam a2200469 a 4500</leader>
|
3
|
+
<controlfield tag="005">20220609191957.0</controlfield>
|
4
|
+
<controlfield tag="008">890224t19891989nyua 001 0 eng </controlfield>
|
5
|
+
<controlfield tag="001">9910148543503681</controlfield>
|
6
|
+
<datafield tag="010" ind1=" " ind2=" ">
|
7
|
+
<subfield code="a"> 88029825 </subfield>
|
8
|
+
</datafield>
|
9
|
+
<datafield tag="035" ind1=" " ind2=" ">
|
10
|
+
<subfield code="a">(OCoLC)ocm18521155</subfield>
|
11
|
+
</datafield>
|
12
|
+
<datafield tag="035" ind1=" " ind2=" ">
|
13
|
+
<subfield code="a">(OCoLC)18521155</subfield>
|
14
|
+
</datafield>
|
15
|
+
<datafield tag="035" ind1=" " ind2=" ">
|
16
|
+
<subfield code="a">(CStRLIN)PAUG89-B7246</subfield>
|
17
|
+
</datafield>
|
18
|
+
<datafield tag="035" ind1=" " ind2=" ">
|
19
|
+
<subfield code="a">(CaOTULAS)185188489</subfield>
|
20
|
+
</datafield>
|
21
|
+
<datafield tag="035" ind1=" " ind2=" ">
|
22
|
+
<subfield code="9">AHA6856</subfield>
|
23
|
+
</datafield>
|
24
|
+
<datafield tag="035" ind1=" " ind2=" ">
|
25
|
+
<subfield code="a">1014854</subfield>
|
26
|
+
</datafield>
|
27
|
+
<datafield tag="035" ind1=" " ind2=" ">
|
28
|
+
<subfield code="a">(PU)1014854-penndb-Voyager</subfield>
|
29
|
+
</datafield>
|
30
|
+
<datafield tag="040" ind1=" " ind2=" ">
|
31
|
+
<subfield code="b">eng</subfield>
|
32
|
+
<subfield code="d">CSt-B</subfield>
|
33
|
+
</datafield>
|
34
|
+
<datafield tag="043" ind1=" " ind2=" ">
|
35
|
+
<subfield code="a">n-us---</subfield>
|
36
|
+
</datafield>
|
37
|
+
<datafield tag="050" ind1="0" ind2=" ">
|
38
|
+
<subfield code="a">KF6450</subfield>
|
39
|
+
<subfield code="b">.C59 1989</subfield>
|
40
|
+
</datafield>
|
41
|
+
<datafield tag="082" ind1="0" ind2=" ">
|
42
|
+
<subfield code="a">343.7306/8</subfield>
|
43
|
+
<subfield code="a">347.30368</subfield>
|
44
|
+
<subfield code="2">19</subfield>
|
45
|
+
</datafield>
|
46
|
+
<datafield tag="090" ind1=" " ind2=" ">
|
47
|
+
<subfield code="a">KF6450</subfield>
|
48
|
+
<subfield code="b">.C59 1989</subfield>
|
49
|
+
<subfield code="i">11/30/89 CTZ</subfield>
|
50
|
+
</datafield>
|
51
|
+
<datafield tag="245" ind1="0" ind2="4">
|
52
|
+
<subfield code="a">The Coopers & Lybrand guide to business tax strategies and planning /</subfield>
|
53
|
+
<subfield code="c">by the partners of Coopers & Lybrand.</subfield>
|
54
|
+
</datafield>
|
55
|
+
<datafield tag="264" ind1=" " ind2="1">
|
56
|
+
<subfield code="a">New York :</subfield>
|
57
|
+
<subfield code="b">Simon and Schuster,</subfield>
|
58
|
+
<subfield code="c">[1989]</subfield>
|
59
|
+
</datafield>
|
60
|
+
<datafield tag="264" ind1=" " ind2="4">
|
61
|
+
<subfield code="c">©1989</subfield>
|
62
|
+
</datafield>
|
63
|
+
<datafield tag="300" ind1=" " ind2=" ">
|
64
|
+
<subfield code="a">x, 198 pages :</subfield>
|
65
|
+
<subfield code="b">illustrations ;</subfield>
|
66
|
+
<subfield code="c">24 cm</subfield>
|
67
|
+
</datafield>
|
68
|
+
<datafield tag="336" ind1=" " ind2=" ">
|
69
|
+
<subfield code="a">text</subfield>
|
70
|
+
<subfield code="b">txt</subfield>
|
71
|
+
<subfield code="2">rdacontent</subfield>
|
72
|
+
</datafield>
|
73
|
+
<datafield tag="337" ind1=" " ind2=" ">
|
74
|
+
<subfield code="a">unmediated</subfield>
|
75
|
+
<subfield code="b">n</subfield>
|
76
|
+
<subfield code="2">rdamedia</subfield>
|
77
|
+
</datafield>
|
78
|
+
<datafield tag="338" ind1=" " ind2=" ">
|
79
|
+
<subfield code="a">volume</subfield>
|
80
|
+
<subfield code="b">nc</subfield>
|
81
|
+
<subfield code="2">rdacarrier</subfield>
|
82
|
+
</datafield>
|
83
|
+
<datafield tag="500" ind1=" " ind2=" ">
|
84
|
+
<subfield code="a">Edited by Jonathan J. Davies and others.</subfield>
|
85
|
+
</datafield>
|
86
|
+
<datafield tag="650" ind1=" " ind2="0">
|
87
|
+
<subfield code="a">Business enterprises</subfield>
|
88
|
+
<subfield code="x">Taxation</subfield>
|
89
|
+
<subfield code="z">United States.</subfield>
|
90
|
+
<subfield code="0">http://id.loc.gov/authorities/subjects/sh2009118044</subfield>
|
91
|
+
</datafield>
|
92
|
+
<datafield tag="650" ind1=" " ind2="7">
|
93
|
+
<subfield code="a">Business enterprises</subfield>
|
94
|
+
<subfield code="x">Taxation.</subfield>
|
95
|
+
<subfield code="2">fast</subfield>
|
96
|
+
<subfield code="0">http://id.worldcat.org/fast/842634</subfield>
|
97
|
+
</datafield>
|
98
|
+
<datafield tag="651" ind1=" " ind2="7">
|
99
|
+
<subfield code="a">United States.</subfield>
|
100
|
+
<subfield code="2">fast</subfield>
|
101
|
+
<subfield code="0">http://id.worldcat.org/fast/1204155</subfield>
|
102
|
+
</datafield>
|
103
|
+
<datafield tag="650" ind1=" " ind2="0">
|
104
|
+
<subfield code="a">Tax planning</subfield>
|
105
|
+
<subfield code="z">United States.</subfield>
|
106
|
+
<subfield code="0">http://id.loc.gov/authorities/subjects/sh2008112546</subfield>
|
107
|
+
</datafield>
|
108
|
+
<datafield tag="650" ind1=" " ind2="7">
|
109
|
+
<subfield code="a">Tax planning.</subfield>
|
110
|
+
<subfield code="2">fast</subfield>
|
111
|
+
<subfield code="0">http://id.worldcat.org/fast/1143815</subfield>
|
112
|
+
</datafield>
|
113
|
+
<datafield tag="700" ind1="1" ind2=" ">
|
114
|
+
<subfield code="a">Davies, Jonathan J.</subfield>
|
115
|
+
<subfield code="0">http://id.loc.gov/authorities/names/n82126416</subfield>
|
116
|
+
</datafield>
|
117
|
+
<datafield tag="710" ind1="2" ind2=" ">
|
118
|
+
<subfield code="a">Coopers & Lybrand.</subfield>
|
119
|
+
<subfield code="0">http://id.loc.gov/authorities/names/n79063025</subfield>
|
120
|
+
</datafield>
|
121
|
+
<datafield tag="740" ind1="0" ind2=" ">
|
122
|
+
<subfield code="a">Guide to business tax strategies and planning.</subfield>
|
123
|
+
</datafield>
|
124
|
+
<datafield tag="740" ind1="0" ind2=" ">
|
125
|
+
<subfield code="a">Business tax strategies and planning</subfield>
|
126
|
+
</datafield>
|
127
|
+
<datafield tag="740" ind1="0" ind2=" ">
|
128
|
+
<subfield code="a">Tax strategies and planning.</subfield>
|
129
|
+
</datafield>
|
130
|
+
<datafield tag="902" ind1=" " ind2=" ">
|
131
|
+
<subfield code="a">MARCIVE 2022</subfield>
|
132
|
+
</datafield>
|
133
|
+
<datafield tag="950" ind1=" " ind2=" ">
|
134
|
+
<subfield code="l">LIPP</subfield>
|
135
|
+
<subfield code="i">11/30/89 C</subfield>
|
136
|
+
</datafield>
|
137
|
+
<datafield tag="955" ind1=" " ind2=" ">
|
138
|
+
<subfield code="l">LIPP</subfield>
|
139
|
+
<subfield code="c">1</subfield>
|
140
|
+
<subfield code="q">89-B7246-1</subfield>
|
141
|
+
<subfield code="r">[01043 6272]</subfield>
|
142
|
+
<subfield code="i">11/30/89 C</subfield>
|
143
|
+
</datafield>
|
144
|
+
<datafield tag="hld" ind1="0" ind2="0">
|
145
|
+
<subfield code="b">Libra</subfield>
|
146
|
+
<subfield code="c">stor</subfield>
|
147
|
+
<subfield code="h">KF6450</subfield>
|
148
|
+
<subfield code="i">.C59 1989</subfield>
|
149
|
+
<subfield code="x">transferred from lipp</subfield>
|
150
|
+
<subfield code="8">22418068440003681</subfield>
|
151
|
+
</datafield>
|
152
|
+
<datafield tag="itm" ind1=" " ind2=" ">
|
153
|
+
<subfield code="r">22418068440003681</subfield>
|
154
|
+
<subfield code="b">1</subfield>
|
155
|
+
<subfield code="h">0</subfield>
|
156
|
+
<subfield code="g">stor</subfield>
|
157
|
+
<subfield code="9">31198058025532</subfield>
|
158
|
+
<subfield code="s">R27M22S09T04</subfield>
|
159
|
+
<subfield code="e">stor</subfield>
|
160
|
+
<subfield code="8">23418068430003681</subfield>
|
161
|
+
<subfield code="a">book/seria</subfield>
|
162
|
+
<subfield code="q">2017-06-06 09:53:20 US/Eastern</subfield>
|
163
|
+
<subfield code="i">KF6450 .C59 1989</subfield>
|
164
|
+
<subfield code="d">Libra</subfield>
|
165
|
+
<subfield code="f">Libra</subfield>
|
166
|
+
</datafield>
|
167
|
+
</record>
|
@@ -0,0 +1,27 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
describe 'PennMARC::Citation' do
|
4
|
+
include MarcSpecHelpers
|
5
|
+
|
6
|
+
let(:helper) { PennMARC::Citation }
|
7
|
+
|
8
|
+
describe '.cited_in_show' do
|
9
|
+
let(:record) do
|
10
|
+
marc_record fields: [marc_field(tag: '510', subfields: { a: 'Perkins Archive' }),
|
11
|
+
marc_field(tag: '880', subfields: { '6': '510', a: 'パーキンスのアーカイブ' })]
|
12
|
+
end
|
13
|
+
|
14
|
+
it 'returns expected citation values' do
|
15
|
+
expect(helper.cited_in_show(record)).to contain_exactly('Perkins Archive', 'パーキンスのアーカイブ')
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
describe '.cite_as_show' do
|
20
|
+
let(:record) { marc_record fields: [marc_field(tag: '524', subfields: {a: 'Perkins Historical Archive, Box 2'})] }
|
21
|
+
|
22
|
+
it 'returns expected citation values' do
|
23
|
+
expect(helper.cite_as_show(record)).to contain_exactly('Perkins Historical Archive, Box 2')
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
@@ -0,0 +1,183 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
describe 'PennMARC::Creator' do
|
4
|
+
include MarcSpecHelpers
|
5
|
+
|
6
|
+
let(:helper) { PennMARC::Creator }
|
7
|
+
let(:mapping) { { aut: 'Author' } }
|
8
|
+
|
9
|
+
describe '.search' do
|
10
|
+
let(:record) { marc_record fields: fields }
|
11
|
+
|
12
|
+
context 'for a single author record' do
|
13
|
+
let(:fields) do
|
14
|
+
[marc_field(tag: '100', subfields: { a: 'Surname, Name', '0': 'http://cool.uri/12345',
|
15
|
+
e: 'author', d: '1900-2000' }),
|
16
|
+
marc_field(tag: '880', subfields: { a: 'Surname, Alternative', '6': '100' })]
|
17
|
+
end
|
18
|
+
|
19
|
+
it 'contains the expected search field values for a single author work' do
|
20
|
+
expect(helper.search(record, mapping)).to eq ['Name Surname http://cool.uri/12345 author 1900-2000.',
|
21
|
+
'Surname, Name http://cool.uri/12345 author 1900-2000.',
|
22
|
+
'Alternative Surname']
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
context 'for a corporate author record' do
|
27
|
+
let(:fields) do
|
28
|
+
[marc_field(tag: '110', subfields: { a: 'Group of People', b: 'Annual Meeting', '4': 'aut' }),
|
29
|
+
marc_field(tag: '880', subfields: { '6': '110', a: 'Alt. Group Name', b: 'Alt. Annual Meeting' })]
|
30
|
+
end
|
31
|
+
|
32
|
+
it 'contains the expected search field values for a corporate author work' do
|
33
|
+
expect(helper.search(record, mapping)).to eq ['Group of People Annual Meeting Author.',
|
34
|
+
'Alt. Group Name Alt. Annual Meeting']
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
describe '.values' do
|
40
|
+
let(:record) { marc_record fields: fields }
|
41
|
+
|
42
|
+
context 'for a single author record' do
|
43
|
+
let(:fields) do
|
44
|
+
[marc_field(tag: '100', subfields: { a: 'Author', c: 'Fancy', d: 'active 24th century AD', '4': 'aut' }),
|
45
|
+
marc_field(tag: '880', subfields: { '6': '100', a: 'Alt Author', c: 'Alt Fanciness' })]
|
46
|
+
end
|
47
|
+
|
48
|
+
it 'returns values for the author, including mapped relator code from ǂ4' do
|
49
|
+
values = helper.values(record, mapping)
|
50
|
+
expect(values).to contain_exactly 'Author Fancy active 24th century AD, Author.'
|
51
|
+
expect(values.join.downcase).not_to include 'alt'
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
context 'for a corporate author record' do
|
56
|
+
let(:fields) do
|
57
|
+
[marc_field(tag: '110', subfields: { a: 'Annual Report', b: 'Leader', e: 'author', '4': 'aut' })]
|
58
|
+
end
|
59
|
+
|
60
|
+
it 'returns values for the corporate author, including mapped relator code from ǂ4' do
|
61
|
+
expect(helper.values(record, mapping)).to contain_exactly 'Annual Report Leader author, Author.'
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
describe '.show' do
|
67
|
+
let(:record) { marc_record fields: fields }
|
68
|
+
|
69
|
+
context 'for a single author record' do
|
70
|
+
let(:fields) do
|
71
|
+
[marc_field(tag: '100', subfields: { a: 'Surname, Name', '0': 'http://cool.uri/12345', d: '1900-2000',
|
72
|
+
e: 'author', '4': 'http://cool.uri/vocabulary/relators/aut' }),
|
73
|
+
marc_field(tag: '880', subfields: { a: 'Surname, Alternative', '6': '100' })]
|
74
|
+
end
|
75
|
+
it 'returns single author values with no URIs anywhere' do
|
76
|
+
values = helper.show(record)
|
77
|
+
expect(values).to contain_exactly 'Surname, Name 1900-2000', 'Surname, Alternative'
|
78
|
+
expect(values.join.downcase).not_to include 'http'
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
82
|
+
context 'for a corporate author record' do
|
83
|
+
let(:fields) do
|
84
|
+
[marc_field(tag: '110', subfields: { a: 'Group of People', b: 'Annual Meeting', '4': 'aut' }),
|
85
|
+
marc_field(tag: '880', subfields: { '6': '110', a: 'Alt. Group Name', b: 'Alt. Annual Meeting' })]
|
86
|
+
end
|
87
|
+
it 'returns corporate author values with no URIs anywhere' do
|
88
|
+
values = helper.show(record)
|
89
|
+
expect(values).to contain_exactly 'Alt. Group Name Alt. Annual Meeting', 'Group of People Annual Meeting'
|
90
|
+
expect(values.join.downcase).not_to include 'http'
|
91
|
+
end
|
92
|
+
end
|
93
|
+
end
|
94
|
+
|
95
|
+
describe '.sort' do
|
96
|
+
let(:record) do
|
97
|
+
marc_record fields: [
|
98
|
+
marc_field(tag: '100', subfields: { a: 'Sort, Value,', d: '1900-2000', e: 'Composer',
|
99
|
+
'0': 'http://cool.uri/12345', '4': 'aut' })
|
100
|
+
]
|
101
|
+
end
|
102
|
+
|
103
|
+
it 'returns single value with no content from ǂ1, ǂ4, ǂ6, ǂ8 or ǂe' do
|
104
|
+
expect(helper.sort(record)).to eq 'Sort, Value, 1900-2000 http://cool.uri/12345'
|
105
|
+
expect(helper.sort(record)).not_to include 'aut'
|
106
|
+
end
|
107
|
+
end
|
108
|
+
|
109
|
+
describe '.facet' do
|
110
|
+
let(:record) { marc_record fields: fields }
|
111
|
+
let(:values) { helper.facet(record) }
|
112
|
+
|
113
|
+
context 'for a single author record' do
|
114
|
+
let(:fields) do
|
115
|
+
[marc_field(tag: '100', subfields: { a: 'Author, Great', d: '1900-2000' }),
|
116
|
+
marc_field(tag: '700', subfields: { a: 'Co-Author, Great', d: '1900-2000' }),
|
117
|
+
marc_field(tag: '800', subfields: { a: 'Author, Added' })]
|
118
|
+
end
|
119
|
+
|
120
|
+
it 'includes corporate author and creator values from allowed subfields' do
|
121
|
+
expect(values).to contain_exactly 'Author, Added', 'Author, Great 1900-2000', 'Co-Author, Great 1900-2000'
|
122
|
+
end
|
123
|
+
end
|
124
|
+
context 'for a corporate author record' do
|
125
|
+
let(:fields) do
|
126
|
+
[marc_field(tag: '110', subfields: { a: 'Group of People', b: 'Annual Meeting' }),
|
127
|
+
marc_field(tag: '710', subfields: { a: 'A Publisher', e: 'publisher' }),
|
128
|
+
marc_field(tag: '710', subfields: { a: 'A Sponsor', e: 'sponsoring body' }),
|
129
|
+
marc_field(tag: '810', subfields: { a: 'A Series Entity', t: 'Some Series' })]
|
130
|
+
end
|
131
|
+
|
132
|
+
it 'includes corporate author and creator values from allowed subfields' do
|
133
|
+
expect(values).to contain_exactly 'A Publisher', 'A Series Entity', 'A Sponsor',
|
134
|
+
'Group of People Annual Meeting'
|
135
|
+
end
|
136
|
+
end
|
137
|
+
context 'for a meeting author record' do
|
138
|
+
let(:fields) do
|
139
|
+
[marc_field(tag: '111', subfields: { a: 'Conference on Things', c: 'Earth' }),
|
140
|
+
marc_field(tag: '711', subfields: { a: 'Thing Institute', j: 'sponsoring body' }),
|
141
|
+
marc_field(tag: '811', subfields: { a: 'Series of Things', c: 'Earth' })]
|
142
|
+
end
|
143
|
+
|
144
|
+
it 'includes corporate author and creator values from allowed subfields' do
|
145
|
+
expect(values).to contain_exactly 'Conference on Things Earth', 'Series of Things Earth', 'Thing Institute'
|
146
|
+
end
|
147
|
+
end
|
148
|
+
end
|
149
|
+
|
150
|
+
describe '.conference_show' do
|
151
|
+
let(:record) do
|
152
|
+
marc_record fields: [
|
153
|
+
marc_field(tag: '111', subfields: { a: 'MARC History Symposium', '4': 'aut' }),
|
154
|
+
marc_field(tag: '880', subfields: { a: 'Alt. MARC History Symposium', '6': '111' })
|
155
|
+
]
|
156
|
+
end
|
157
|
+
|
158
|
+
it 'returns conference name information for display, ignoring any linked 880 fields' do
|
159
|
+
expect(helper.conference_show(record, mapping)).to eq ['MARC History Symposium, Author.']
|
160
|
+
end
|
161
|
+
end
|
162
|
+
|
163
|
+
describe '.conference_detail_show' do
|
164
|
+
let(:record) do
|
165
|
+
marc_record fields: [
|
166
|
+
marc_field(tag: '111', subfields: { a: 'MARC History Symposium', c: 'Moscow' }),
|
167
|
+
marc_field(tag: '711', subfields: { a: 'Russian Library Conference', j: 'author' }),
|
168
|
+
marc_field(tag: '711', indicator2: '1', subfields: { a: 'Ignored Entry', j: 'author' }),
|
169
|
+
marc_field(tag: '880', subfields: { a: 'Proceedings', '6': '111' }),
|
170
|
+
marc_field(tag: '880', subfields: { a: 'Not Included', i: 'something', '6': '111' })
|
171
|
+
]
|
172
|
+
end
|
173
|
+
|
174
|
+
it 'returns detailed conference name information for display, including linked 880 fields without ǂi, and ignoring
|
175
|
+
any 111 or 711 with a defined indicator 2 value' do
|
176
|
+
expect(helper.conference_detail_show(record)).to eq ['MARC History Symposium Moscow',
|
177
|
+
'Russian Library Conference author', 'Proceedings']
|
178
|
+
end
|
179
|
+
end
|
180
|
+
|
181
|
+
xdescribe '.conference_search'
|
182
|
+
xdescribe '.search_aux'
|
183
|
+
end
|
@@ -0,0 +1,60 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
describe 'PennMARC::Database' do
|
4
|
+
include MarcSpecHelpers
|
5
|
+
|
6
|
+
let(:helper) { PennMARC::Database }
|
7
|
+
let(:record) do
|
8
|
+
marc_record(fields: [
|
9
|
+
marc_field(tag: '943', subfields: { a: 'Humanities', '2': 'penncoi' }),
|
10
|
+
marc_field(tag: '943', subfields: { a: 'Social Sciences', b: 'Linguistics', '2': 'penncoi' }),
|
11
|
+
marc_field(tag: '944',
|
12
|
+
subfields: { a: 'Database & Article Index',
|
13
|
+
b: 'Dictionaries and Thesauri (language based)' }),
|
14
|
+
marc_field(tag: '944', subfields: { a: 'Database & Article Index', b: ['Reference and Handbooks'] })
|
15
|
+
])
|
16
|
+
end
|
17
|
+
let(:record_uncurated_db) do
|
18
|
+
marc_record(fields: [
|
19
|
+
marc_field(tag: '943', subfields: { a: 'Social Sciences', b: 'Linguistics', '2': 'penncoi' }),
|
20
|
+
marc_field(tag: '944', subfields: { a: 'Uncurated Database', b: 'Reference and Handbooks' })
|
21
|
+
])
|
22
|
+
end
|
23
|
+
|
24
|
+
describe '.type' do
|
25
|
+
it 'returns database types' do
|
26
|
+
expect(helper.type(record)).to contain_exactly('Dictionaries and Thesauri (language based)',
|
27
|
+
'Reference and Handbooks')
|
28
|
+
end
|
29
|
+
|
30
|
+
context 'with uncurated database' do
|
31
|
+
it 'returns empty array' do
|
32
|
+
expect(helper.type(record_uncurated_db)).to be_empty
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
describe '.db_category' do
|
38
|
+
it 'returns database categories' do
|
39
|
+
expect(helper.db_category(record)).to contain_exactly('Humanities', 'Social Sciences')
|
40
|
+
end
|
41
|
+
|
42
|
+
context 'with uncurated database' do
|
43
|
+
it 'returns empty array' do
|
44
|
+
expect(helper.db_category(record_uncurated_db)).to be_empty
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
describe '.db_subcategory' do
|
50
|
+
it 'returns database subcategories' do
|
51
|
+
expect(helper.db_subcategory(record)).to contain_exactly('Social Sciences--Linguistics')
|
52
|
+
end
|
53
|
+
|
54
|
+
context 'with uncurated database' do
|
55
|
+
it 'returns empty array' do
|
56
|
+
expect(helper.db_subcategory(record_uncurated_db)).to be_empty
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
@@ -0,0 +1,105 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
describe 'PennMARC::Date' do
|
4
|
+
include MarcSpecHelpers
|
5
|
+
|
6
|
+
let(:helper) { PennMARC::Date }
|
7
|
+
let(:record) { marc_record fields: fields }
|
8
|
+
|
9
|
+
describe '.publication' do
|
10
|
+
let(:fields) { [marc_control_field(tag: '008', value: '130827s2010 nyu o 000 1 eng d')] }
|
11
|
+
|
12
|
+
it 'returns publication date' do
|
13
|
+
expect(helper.publication(record)).to eq(DateTime.new(2010))
|
14
|
+
end
|
15
|
+
|
16
|
+
it 'returns a year value' do
|
17
|
+
expect(helper.publication(record).year).to eq(2010)
|
18
|
+
end
|
19
|
+
|
20
|
+
context 'with invalid date' do
|
21
|
+
let(:fields) { [marc_control_field(tag: '008', value: 'invalid date')] }
|
22
|
+
|
23
|
+
it 'returns nil' do
|
24
|
+
expect(helper.publication(record)).to be_nil
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
describe '.added' do
|
30
|
+
context "with date formatted '%Y-%m-%d' " do
|
31
|
+
let(:fields) { [marc_field(tag: 'itm', subfields: { q: '2023-06-28' })] }
|
32
|
+
|
33
|
+
it 'returns expected value' do
|
34
|
+
expect(helper.added(record)).to eq(DateTime.strptime('2023-06-28', '%Y-%m-%d'))
|
35
|
+
end
|
36
|
+
|
37
|
+
it 'returns a year value' do
|
38
|
+
expect(helper.added(record).year).to eq(2023)
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
context "with date formatted '%Y-%m-%d %H:%M:%S'" do
|
43
|
+
let(:fields) { [marc_field(tag: 'itm', subfields: { q: '2023-06-29 11:04:30:10' })] }
|
44
|
+
|
45
|
+
it 'returns expected value' do
|
46
|
+
expect(helper.added(record)).to eq(DateTime.strptime('2023-06-29 11:04:30:10', '%Y-%m-%d %H:%M:%S'))
|
47
|
+
end
|
48
|
+
|
49
|
+
it 'returns a year value' do
|
50
|
+
expect(helper.added(record).year).to eq(2023)
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
context 'with multiple date added values' do
|
55
|
+
let(:fields) do
|
56
|
+
[marc_field(tag: 'itm', subfields: { q: '2023-06-28' }),
|
57
|
+
marc_field(tag: 'itm', subfields: { q: '2023-06-29' })]
|
58
|
+
end
|
59
|
+
|
60
|
+
it 'returns most recent date' do
|
61
|
+
expect(helper.added(record)).to eq(DateTime.strptime('2023-06-29', '%Y-%m-%d'))
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
context 'with invalid date' do
|
66
|
+
let(:fields) { [marc_field(tag: 'itm', subfields: { q: 'invalid date' })] }
|
67
|
+
|
68
|
+
it 'returns nil' do
|
69
|
+
expect(helper.added(record)).to be_nil
|
70
|
+
end
|
71
|
+
|
72
|
+
it 'outputs error message' do
|
73
|
+
expect do
|
74
|
+
helper.added(record)
|
75
|
+
end.to output("Error parsing date in date added subfield: invalid date - invalid date\n").to_stdout
|
76
|
+
end
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
80
|
+
describe '.last_updated' do
|
81
|
+
let(:fields) { [marc_field(tag: '005', subfields: { q: '20230213163851.1' })] }
|
82
|
+
|
83
|
+
it 'returns date last updated' do
|
84
|
+
expect(helper.last_updated(record)).to eq(DateTime.iso8601('20230213163851.1').to_datetime)
|
85
|
+
end
|
86
|
+
|
87
|
+
it 'returns year value' do
|
88
|
+
expect(helper.last_updated(record).year).to eq(2023)
|
89
|
+
end
|
90
|
+
|
91
|
+
context 'with invalid date' do
|
92
|
+
let(:fields) { [marc_field(tag: '005', subfields: { q: 'invalid date' })] }
|
93
|
+
|
94
|
+
it 'returns nil' do
|
95
|
+
expect(helper.last_updated(record)).to be_nil
|
96
|
+
end
|
97
|
+
|
98
|
+
it 'outputs error message' do
|
99
|
+
expect do
|
100
|
+
helper.last_updated(record)
|
101
|
+
end.to output("Error parsing last updated date: invalid date - invalid date\n").to_stdout
|
102
|
+
end
|
103
|
+
end
|
104
|
+
end
|
105
|
+
end
|
@@ -0,0 +1,38 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
describe 'PennMARC::Edition' do
|
4
|
+
include MarcSpecHelpers
|
5
|
+
|
6
|
+
let(:helper) { PennMARC::Edition }
|
7
|
+
let(:mapping) { { aut: 'Author' } }
|
8
|
+
let(:record) do
|
9
|
+
marc_record fields: [marc_field(tag: '250', subfields: { a: '5th Edition', b: 'Remastered' }),
|
10
|
+
marc_field(tag: '880', subfields: { '6': '250', b: 'رمستر' }),
|
11
|
+
marc_field(tag: '775', subfields: { i: 'Other Edition (Remove)',
|
12
|
+
h: 'Cool Book',
|
13
|
+
t: 'aut'}),
|
14
|
+
marc_field(tag: '880', subfields: { '6': '775', i: 'Autre Editione' })]
|
15
|
+
end
|
16
|
+
|
17
|
+
describe '.show' do
|
18
|
+
it 'returns the editions' do
|
19
|
+
expect(helper.show(record)).to contain_exactly('5th Edition Remastered', 'رمستر')
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
describe '.values' do
|
24
|
+
it 'returns the values' do
|
25
|
+
expect(helper.values(record)).to eq('5th Edition Remastered')
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
describe '.other_show' do
|
30
|
+
it 'returns other edition values' do
|
31
|
+
expect(helper.other_show(record, mapping)).to contain_exactly('Autre Editione',
|
32
|
+
'Other Edition: Author. (Cool Book)')
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
|
38
|
+
|