pennmarc 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 +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
|
+
|