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