pennmarc 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (59) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +6 -0
  3. data/.rspec +2 -0
  4. data/.ruby-version +1 -0
  5. data/Gemfile +23 -0
  6. data/Gemfile.lock +119 -0
  7. data/README.md +82 -0
  8. data/legacy/indexer.rb +568 -0
  9. data/legacy/marc.rb +2964 -0
  10. data/legacy/test_file_output.json +49 -0
  11. data/lib/pennmarc/encoding_level.rb +43 -0
  12. data/lib/pennmarc/enriched_marc.rb +36 -0
  13. data/lib/pennmarc/heading_control.rb +11 -0
  14. data/lib/pennmarc/helpers/citation.rb +31 -0
  15. data/lib/pennmarc/helpers/creator.rb +237 -0
  16. data/lib/pennmarc/helpers/database.rb +89 -0
  17. data/lib/pennmarc/helpers/date.rb +85 -0
  18. data/lib/pennmarc/helpers/edition.rb +90 -0
  19. data/lib/pennmarc/helpers/format.rb +312 -0
  20. data/lib/pennmarc/helpers/genre.rb +71 -0
  21. data/lib/pennmarc/helpers/helper.rb +11 -0
  22. data/lib/pennmarc/helpers/identifier.rb +134 -0
  23. data/lib/pennmarc/helpers/language.rb +37 -0
  24. data/lib/pennmarc/helpers/link.rb +12 -0
  25. data/lib/pennmarc/helpers/location.rb +97 -0
  26. data/lib/pennmarc/helpers/note.rb +132 -0
  27. data/lib/pennmarc/helpers/production.rb +131 -0
  28. data/lib/pennmarc/helpers/relation.rb +135 -0
  29. data/lib/pennmarc/helpers/series.rb +118 -0
  30. data/lib/pennmarc/helpers/subject.rb +304 -0
  31. data/lib/pennmarc/helpers/title.rb +197 -0
  32. data/lib/pennmarc/mappings/language.yml +516 -0
  33. data/lib/pennmarc/mappings/locations.yml +1801 -0
  34. data/lib/pennmarc/mappings/relator.yml +263 -0
  35. data/lib/pennmarc/parser.rb +177 -0
  36. data/lib/pennmarc/util.rb +240 -0
  37. data/lib/pennmarc.rb +6 -0
  38. data/pennmarc.gemspec +22 -0
  39. data/spec/fixtures/marcxml/test.xml +167 -0
  40. data/spec/lib/pennmarc/helpers/citation_spec.rb +27 -0
  41. data/spec/lib/pennmarc/helpers/creator_spec.rb +183 -0
  42. data/spec/lib/pennmarc/helpers/database_spec.rb +60 -0
  43. data/spec/lib/pennmarc/helpers/date_spec.rb +105 -0
  44. data/spec/lib/pennmarc/helpers/edition_spec.rb +38 -0
  45. data/spec/lib/pennmarc/helpers/format_spec.rb +200 -0
  46. data/spec/lib/pennmarc/helpers/genre_spec.rb +89 -0
  47. data/spec/lib/pennmarc/helpers/identifer_spec.rb +105 -0
  48. data/spec/lib/pennmarc/helpers/language_spec.rb +30 -0
  49. data/spec/lib/pennmarc/helpers/location_spec.rb +70 -0
  50. data/spec/lib/pennmarc/helpers/note_spec.rb +233 -0
  51. data/spec/lib/pennmarc/helpers/production_spec.rb +193 -0
  52. data/spec/lib/pennmarc/helpers/relation_spec.rb +120 -0
  53. data/spec/lib/pennmarc/helpers/subject_spec.rb +262 -0
  54. data/spec/lib/pennmarc/helpers/title_spec.rb +169 -0
  55. data/spec/lib/pennmarc/marc_util_spec.rb +206 -0
  56. data/spec/lib/pennmarc/parser_spec.rb +13 -0
  57. data/spec/spec_helper.rb +104 -0
  58. data/spec/support/marc_spec_helpers.rb +84 -0
  59. 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 &amp; Lybrand guide to business tax strategies and planning /</subfield>
53
+ <subfield code="c">by the partners of Coopers &amp; 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 &amp; 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
+