stanford-mods 1.3.3 → 1.3.4

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,316 @@
1
+ mods_origin_info_start_str = "<mods xmlns=\"#{Mods::MODS_NS}\"><originInfo>"
2
+ mods_origin_info_end_str = '</originInfo></mods>'
3
+
4
+ SPOTLIGHT_PUB_DATE_DATA = {
5
+ 'batchelor' =>
6
+ { # key is mods_xml; values = [pub date sortable facet value, pub date single string facet value]
7
+ # ct961sj2730 coll rec: no originInfo dates)
8
+ # dr330jt7122
9
+ mods_origin_info_start_str +
10
+ '<dateIssued>1843</dateIssued>' +
11
+ mods_origin_info_end_str => ['1843', '1843'],
12
+ # ds825sq5748
13
+ mods_origin_info_start_str +
14
+ '<dateIssued>s.a. [1712]</dateIssued>' +
15
+ '<dateIssued encoding="marc">1712</dateIssued>' +
16
+ mods_origin_info_end_str => ['1712', '1712'],
17
+ # fk998cd4214
18
+ mods_origin_info_start_str +
19
+ '<dateIssued>1806]</dateIssued>' +
20
+ '<dateIssued encoding="marc">1806</dateIssued>' +
21
+ mods_origin_info_end_str => ['1806', '1806'],
22
+ # gy889yj2171
23
+ mods_origin_info_start_str +
24
+ '<dateIssued>1758]</dateIssued>' +
25
+ '<dateIssued encoding="marc" point="start" qualifier="questionable">1758</dateIssued>' +
26
+ '<dateIssued encoding="marc" point="end" qualifier="questionable">uuuu</dateIssued>' +
27
+ mods_origin_info_end_str => ['1758', '1758'],
28
+ # gw369sx8109
29
+ mods_origin_info_start_str +
30
+ '<dateIssued>179-?]</dateIssued>' +
31
+ '<dateIssued encoding="marc" point="start" qualifier="questionable">1790</dateIssued>' +
32
+ '<dateIssued encoding="marc" point="end" qualifier="questionable">1799</dateIssued>' +
33
+ mods_origin_info_end_str => ['1790', '1790'],
34
+ # ty320hx2831
35
+ mods_origin_info_start_str +
36
+ '<dateIssued>[1860-1869?]</dateIssued>' +
37
+ '<dateIssued encoding="marc" point="start" qualifier="questionable">1860</dateIssued>' +
38
+ '<dateIssued encoding="marc" point="end" qualifier="questionable">1890</dateIssued>' +
39
+ mods_origin_info_end_str => ['1860', '1860']
40
+ },
41
+ 'feigenbaum' =>
42
+ { # key is mods_xml; values = [pub date sortable facet value, pub date single string facet value]
43
+ # coll rec
44
+ mods_origin_info_start_str +
45
+ '<dateIssued encoding="marc" point="start">1950</dateIssued>' +
46
+ '<dateIssued encoding="marc" point="end">2007</dateIssued>' +
47
+ mods_origin_info_end_str => ['1950', '1950'],
48
+ # py696hw1646, jc364jw8333
49
+ mods_origin_info_start_str +
50
+ '<dateCreated encoding="w3cdtf" keyDate="yes">2001-11-19</dateCreated>' +
51
+ mods_origin_info_end_str => ['2001', '2001'],
52
+ # yt809jk3834, qb375hy6817
53
+ mods_origin_info_start_str +
54
+ '<dateCreated encoding="w3cdtf" keyDate="yes">3/25/1998</dateCreated>' +
55
+ mods_origin_info_end_str => ['1998', '1998'],
56
+ # mg505sz9327, mx006md9511, sy619vt7106
57
+ mods_origin_info_start_str +
58
+ '<dateCreated encoding="w3cdtf" keyDate="yes" point="start" qualifier="approximate">1950</dateCreated>' +
59
+ '<dateCreated encoding="w3cdtf" point="end" qualifier="approximate">2007</dateCreated>' +
60
+ mods_origin_info_end_str => ['1950', '1950'],
61
+ # wb033rz4421, rg190zp1039
62
+ mods_origin_info_start_str +
63
+ '<dateCreated encoding="w3cdtf" keyDate="yes">1960</dateCreated>' +
64
+ mods_origin_info_end_str => ['1960', '1960']
65
+ },
66
+ 'fitch' =>
67
+ { # key is mods_xml; values = [pub date sortable facet value, pub date single string facet value]
68
+ # tv206kh7995
69
+ mods_origin_info_start_str +
70
+ '<dateIssued encoding="w3cdtf" keyDate="yes">2003</dateIssued>' +
71
+ '</originInfo>' +
72
+ '<originInfo displayLabel="Date Created">
73
+ <dateCreated encoding="w3cdtf" keyDate="yes">2002</dateCreated>' +
74
+ mods_origin_info_end_str => ['2003', '2003'],
75
+ # jg756mq6272
76
+ mods_origin_info_start_str +
77
+ '<dateCreated keyDate="yes" encoding="w3cdtf" point="start" qualifier="approximate">1968</dateCreated>' +
78
+ '<dateCreated encoding="w3cdtf" point="end" qualifier="approximate">1975</dateCreated>' +
79
+ mods_origin_info_end_str => ['1968', '1968'],
80
+ # jc865hw9993
81
+ mods_origin_info_start_str +
82
+ '<dateCreated keyDate="yes" encoding="w3cdtf">1970</dateCreated>' +
83
+ mods_origin_info_end_str => ['1970', '1970']
84
+ },
85
+ 'hanna_house' =>
86
+ { # key is mods_xml; values = [pub date sortable facet value, pub date single string facet value]
87
+ # gb597yd7556 coll rec
88
+ mods_origin_info_start_str +
89
+ '<dateIssued encoding="marc" point="start">1935</dateIssued>' +
90
+ '<dateIssued encoding="marc" point="end">1995</dateIssued>' +
91
+ mods_origin_info_end_str => ['1935', '1935'],
92
+ # gb597yd7556
93
+ mods_origin_info_start_str +
94
+ '<dateIssued encoding="marc" point="start">1935</dateIssued>' +
95
+ '<dateIssued encoding="marc" point="end">1995</dateIssued>' +
96
+ mods_origin_info_end_str => ['1935', '1935'],
97
+ # zr891kq4418
98
+ mods_origin_info_start_str +
99
+ '<dateCreated point="start" keyDate="yes" encoding="w3cdtf">1914</dateCreated>' +
100
+ '<dateCreated point="end" encoding="w3cdtf">1985</dateCreated>' +
101
+ mods_origin_info_end_str => ['1914', '1914'],
102
+ # dx393nr2700
103
+ mods_origin_info_start_str +
104
+ '<dateCreated point="start" keyDate="yes" encoding="w3cdtf">1937</dateCreated>' +
105
+ '<dateCreated point="end" qualifier="approximate" encoding="w3cdtf">1986</dateCreated>' +
106
+ mods_origin_info_end_str => ['1937', '1937']
107
+ },
108
+ 'harrison' =>
109
+ { # key is mods_xml; values = [pub date sortable facet value, pub date single string facet value]
110
+ # yb643gf8754
111
+ mods_origin_info_start_str +
112
+ '<dateCreated keyDate="yes" encoding="w3cdtf" point="start">2004</dateCreated>' +
113
+ '<dateCreated encoding="w3cdtf" point="end">2005</dateCreated>' +
114
+ mods_origin_info_end_str => ['2004', '2004'],
115
+ # qj294cd5539
116
+ mods_origin_info_start_str +
117
+ '<dateCreated keyDate="yes" encoding="w3cdtf" point="start" qualifier="approximate">1982</dateCreated>' +
118
+ '<dateCreated encoding="w3cdtf" point="end" qualifier="approximate">1983</dateCreated>' +
119
+ mods_origin_info_end_str => ['1982', '1982']
120
+ },
121
+ 'heckrotte' =>
122
+ { # key is mods_xml; values = [pub date sortable facet value, pub date single string facet value]
123
+ # rx637sx4870
124
+ mods_origin_info_start_str +
125
+ '<dateIssued encoding="marc">1914</dateIssued>' +
126
+ mods_origin_info_end_str => ['1914', '1914'],
127
+ # ds207gt5399
128
+ mods_origin_info_start_str +
129
+ '<dateIssued encoding="marc">9999</dateIssued>' +
130
+ mods_origin_info_end_str => [nil, nil]
131
+ },
132
+ 'matter' =>
133
+ { # key is mods_xml; values = [pub date sortable facet value, pub date single string facet value]
134
+ # pj169kw1971 coll rec
135
+ mods_origin_info_start_str +
136
+ '<dateIssued encoding="marc" point="start">1937</dateIssued>' +
137
+ '<dateIssued encoding="marc" point="end">1984</dateIssued>' +
138
+ mods_origin_info_end_str => ['1937', '1937'],
139
+ # vx584zf3939
140
+ mods_origin_info_start_str +
141
+ '<dateCreated encoding="w3cdtf" keyDate="yes" qualifier="questionable">1954</dateCreated>' +
142
+ mods_origin_info_end_str => ['1954', '1954'],
143
+ # cp851bp7190
144
+ mods_origin_info_start_str +
145
+ '<dateCreated encoding="w3cdtf" keyDate="yes" qualifier="approximate" point="start">1937</dateCreated>' +
146
+ '<dateCreated encoding="w3cdtf" qualifier="approximate" point="end">1984</dateCreated>' +
147
+ mods_origin_info_end_str => ['1937', '1937'],
148
+ # hr768nf5908
149
+ mods_origin_info_start_str +
150
+ '<dateCreated encoding="w3cdtf" keyDate="yes">1948-02-05</dateCreated>' +
151
+ mods_origin_info_end_str => ['1948', '1948']
152
+ },
153
+ 'mss' =>
154
+ { # key is mods_xml; values = [pub date sortable facet value, pub date single string facet value]
155
+ # dt056jp2574 coll rec
156
+ mods_origin_info_start_str +
157
+ '<dateIssued encoding="marc" point="start" keyDate="yes">0850</dateIssued>' +
158
+ '<dateIssued encoding="marc" point="end">1499</dateIssued>' +
159
+ mods_origin_info_end_str => ['0850', '850'],
160
+ # nc881qb8504
161
+ mods_origin_info_start_str +
162
+ '<dateCreated point="start" qualifier="approximate" keyDate="yes">1000</dateCreated>' +
163
+ '<dateCreated point="end" qualifier="approximate">1599</dateCreated>' +
164
+ mods_origin_info_end_str => ['1000', '1000'],
165
+ # gq464qc3817
166
+ mods_origin_info_start_str +
167
+ '<dateCreated keydate="yes">1371</dateCreated>' +
168
+ mods_origin_info_end_str => ['1371', '1371'],
169
+ # pn981gz2244 (a coll rec)
170
+ mods_origin_info_start_str +
171
+ '<dateIssued encoding="marc" point="start">1310</dateIssued>' +
172
+ '<dateIssued encoding="marc" point="end">1500</dateIssued>' +
173
+ mods_origin_info_end_str => ['1310', '1310'],
174
+ # zv022sd1415 (a coll rec)
175
+ mods_origin_info_start_str +
176
+ '<dateIssued encoding="marc" keyDate="yes" point="start" qualifier="questionable">1100</dateIssued>' +
177
+ '<dateIssued encoding="marc" point="end" qualifier="questionable">1499</dateIssued>' +
178
+ mods_origin_info_end_str => ['1100', '1100']
179
+ },
180
+ 'muybridge_date_issued' =>
181
+ { # key is mods_xml; values = [pub date sortable facet value, pub date single string facet value]
182
+ # rs028yq2265
183
+ mods_origin_info_start_str +
184
+ '<dateIssued>1876</dateIssued>' +
185
+ '<dateIssued encoding="marc" keyDate="yes">1876</dateIssued>' +
186
+ mods_origin_info_end_str => ['1876', '1876'],
187
+ # mb109mb4776
188
+ mods_origin_info_start_str +
189
+ '<dateIssued>1878]</dateIssued>' +
190
+ '<dateIssued encoding="marc" keyDate="yes">1878</dateIssued>' +
191
+ mods_origin_info_end_str => ['1878', '1878'],
192
+ # ff991hz8300
193
+ mods_origin_info_start_str +
194
+ '<dateIssued encoding="marc" point="start" keyDate="yes">1868</dateIssued>' +
195
+ '<dateIssued encoding="marc" point="end">1929</dateIssued>' +
196
+ mods_origin_info_end_str => ['1868', '1868']
197
+ },
198
+ 'norwich' =>
199
+ { # key is mods_xml; values = [pub date sortable facet value, pub date single string facet value]
200
+ # qb438pg7646 - coll record
201
+ mods_origin_info_start_str +
202
+ '<dateIssued encoding="marc" point="start" qualifier="questionable">1486</dateIssued>' +
203
+ '<dateIssued encoding="marc" point="end" qualifier="questionable">1865</dateIssued>' +
204
+ mods_origin_info_end_str => ['1486', '1486'],
205
+ # zv656kg5843 - dateIssued item record
206
+ mods_origin_info_start_str +
207
+ '<dateIssued qualifier="questionable" point="start" keyDate="yes">1486</dateIssued>' +
208
+ '<dateIssued qualifier="questionable" point="end">1865</dateIssued>' +
209
+ mods_origin_info_end_str => ['1486', '1486'],
210
+ # vv001qm0627
211
+ mods_origin_info_start_str +
212
+ '<dateCreated encoding="w3cdtf" keyDate="yes" qualifier="">1792</dateCreated>' +
213
+ mods_origin_info_end_str => ['1792', '1792'],
214
+ # fw686gh2768
215
+ mods_origin_info_start_str +
216
+ '<dateCreated encoding="w3cdtf" keyDate="yes" qualifier="inferred">1700</dateCreated>' +
217
+ mods_origin_info_end_str => ['1700', '1700'],
218
+ # xp797gj2926, bd251fw4676
219
+ mods_origin_info_start_str +
220
+ '<dateCreated encoding="w3cdtf" keyDate="yes" qualifier="approximate" point="start">1646</dateCreated>' +
221
+ '<dateCreated encoding="w3cdtf" keyDate="no" qualifier="approximate" point="end">1647</dateCreated>' +
222
+ mods_origin_info_end_str => ['1646', '1646'],
223
+ # rw174jv7999
224
+ mods_origin_info_start_str +
225
+ '<dateCreated encoding="w3cdtf" keyDate="yes" qualifier="approximate" point="start">1836</dateCreated>' +
226
+ '<dateCreated encoding="w3cdtf" keyDate="no" qualifier="approximate" point="end">1839</dateCreated>' +
227
+ mods_origin_info_end_str => ['1836', '1836'],
228
+ # kw395pq8862
229
+ mods_origin_info_start_str +
230
+ '<dateCreated encoding="w3cdtf" keyDate="yes" qualifier="questionable">1737</dateCreated>' +
231
+ mods_origin_info_end_str => ['1737', '1737']
232
+ },
233
+ 'papyri' =>
234
+ { # key is mods_xml; values = [pub date sortable facet value, pub date single string facet value]
235
+ # hd778hw9236
236
+ mods_origin_info_start_str +
237
+ '<dateCreated encoding="w3cdtf" keyDate="yes" point="start" qualifier="approximate">200 B.C.</dateCreated>' +
238
+ '<dateCreated encoding="w3cdtf" keyDate="yes" point="end" qualifier="approximate">180 B.C.</dateCreated>' +
239
+ mods_origin_info_end_str => ['-800', '200 B.C.'],
240
+ # ww728rz0477
241
+ mods_origin_info_start_str +
242
+ '<dateCreated encoding="w3cdtf" keyDate="yes" point="start" qualifier="approximate">211 B.C.</dateCreated>' +
243
+ '<dateCreated encoding="w3cdtf" keyDate="yes" point="end" qualifier="approximate">150 B.C.</dateCreated>' +
244
+ mods_origin_info_end_str => ['-789', '211 B.C.']
245
+ },
246
+ 'renaissance' =>
247
+ { # key is mods_xml; values = [pub date sortable facet value, pub date single string facet value]
248
+ # qm115qm4767
249
+ mods_origin_info_start_str +
250
+ '<dateIssued>1621</dateIssued>' +
251
+ mods_origin_info_end_str => ['1621', '1621'],
252
+ # ph263cq3186
253
+ mods_origin_info_start_str +
254
+ '<dateIssued encoding="marc">16uu</dateIssued>' +
255
+ '</originInfo>
256
+ <originInfo>
257
+ <dateIssued>approximately 1600-1700.</dateIssued>' +
258
+ mods_origin_info_end_str => ['1600', '1600'],
259
+ # vm330vk8699
260
+ mods_origin_info_start_str +
261
+ '<dateIssued encoding="marc" point="start">1552</dateIssued>' +
262
+ '<dateIssued encoding="marc" point="end">1575</dateIssued>' +
263
+ '</originInfo>
264
+ <originInfo>
265
+ <dateIssued>1544-1628]</dateIssued>' +
266
+ mods_origin_info_end_str => ['1544', '1544'],
267
+ # fs844yc9264
268
+ mods_origin_info_start_str +
269
+ '<dateIssued>1486]</dateIssued>' +
270
+ '<dateIssued encoding="marc">1486</dateIssued>' +
271
+ mods_origin_info_end_str => ['1486', '1486'],
272
+ # yx539ps2472
273
+ mods_origin_info_start_str +
274
+ '<dateIssued>January 6th, 1801</dateIssued>' +
275
+ '<dateIssued encoding="marc">1801</dateIssued>' +
276
+ mods_origin_info_end_str => ['1801', '1801'],
277
+ # tf692ty4668
278
+ mods_origin_info_start_str +
279
+ '<dateIssued>anno j65i [1651]</dateIssued>' +
280
+ '<dateIssued encoding="marc">1651</dateIssued>' +
281
+ mods_origin_info_end_str => ['1651', '1651'],
282
+ # wd342hc6856
283
+ mods_origin_info_start_str +
284
+ '<dateIssued>[1657?]</dateIssued>' +
285
+ '<dateIssued encoding="marc">1657</dateIssued>' +
286
+ mods_origin_info_end_str => ['1657', '1657'],
287
+ # tg585cq2576
288
+ mods_origin_info_start_str +
289
+ '<dateIssued encoding="marc">1681</dateIssued>' +
290
+ '</originInfo>
291
+ <originInfo>
292
+ <dateIssued>im jahr 1681</dateIssued>' +
293
+ mods_origin_info_end_str => ['1681', '1681'],
294
+ # bf004gy8502
295
+ mods_origin_info_start_str +
296
+ '<dateIssued encoding="marc">1683</dateIssued>' +
297
+ '</originInfo>
298
+ <originInfo displayLabel="publisher">
299
+ <dateIssued>anno Christi MDCLXXXIII [1683]</dateIssued>' +
300
+ mods_origin_info_end_str => ['1683', '1683'],
301
+ # vq586cs8631
302
+ mods_origin_info_start_str +
303
+ '<dateIssued encoding="marc">1686</dateIssued>' +
304
+ mods_origin_info_end_str => ['1686', '1686'],
305
+ # gx634bc5110
306
+ mods_origin_info_start_str +
307
+ '<dateIssued>[1692-1694]</dateIssued>' +
308
+ '<dateIssued encoding="marc">1692</dateIssued>' +
309
+ mods_origin_info_end_str => ['1692', '1692'],
310
+ # mc166br4447
311
+ mods_origin_info_start_str +
312
+ '<dateIssued>approximately 1786]</dateIssued>' +
313
+ '<dateIssued encoding="marc">1786</dateIssued>' +
314
+ mods_origin_info_end_str => ['1786', '1786']
315
+ }
316
+ }
@@ -0,0 +1,449 @@
1
+ describe "computations from /originInfo field" do
2
+
3
+ let(:smods_rec) { Stanford::Mods::Record.new }
4
+
5
+ # used for single examples
6
+ let(:mods_origin_info_start_str) { "<mods xmlns=\"#{Mods::MODS_NS}\"><originInfo>" }
7
+ let(:mods_origin_info_end_str) { '</originInfo></mods>' }
8
+
9
+ # used for hashes/arrays of examples
10
+ let(:mods_origin_info) do
11
+ <<-EOF
12
+ #{mods_origin_info_start_str}
13
+ #{example}
14
+ #{mods_origin_info_end_str}
15
+ EOF
16
+ end
17
+
18
+ RSpec.shared_examples "single pub date value" do |method_sym, exp_val_position|
19
+ it 'prefers dateIssued to dateCreated' do
20
+ mods_str = mods_origin_info_start_str +
21
+ '<dateIssued>2005</dateIssued>' +
22
+ '</originInfo>' +
23
+ '<originInfo>
24
+ <dateCreated>1999</dateCreated>' +
25
+ mods_origin_info_end_str
26
+ smods_rec.from_str(mods_str)
27
+ expect(smods_rec.send(method_sym)).to eq '2005'
28
+ end
29
+ it 'respects ignore_approximate param' do
30
+ mods_str = mods_origin_info_start_str +
31
+ '<dateCreated point="start" qualifier="approximate">1000</dateCreated>' +
32
+ '<dateCreated point="end">1599</dateCreated>' +
33
+ mods_origin_info_end_str
34
+ smods_rec.from_str(mods_str)
35
+ expect(smods_rec.send(method_sym, true)).to eq '1599'
36
+ expect(smods_rec.send(method_sym, false)).to eq '1000'
37
+ end
38
+ it 'nil if ignore_approximate and all dates are approximate' do
39
+ mods_str = mods_origin_info_start_str +
40
+ '<dateCreated point="start" qualifier="approximate">1000</dateCreated>' +
41
+ '<dateCreated point="end" qualifier="questionable">1599</dateCreated>' +
42
+ mods_origin_info_end_str
43
+ smods_rec.from_str(mods_str)
44
+ expect(smods_rec.send(method_sym, true)).to eq nil
45
+ expect(smods_rec.send(method_sym, false)).to eq '1000'
46
+ end
47
+ it 'respects ignore_approximate even for keyDate' do
48
+ mods_str = mods_origin_info_start_str +
49
+ '<dateCreated point="start" qualifier="approximate" keyDate="yes">1000</dateCreated>' +
50
+ '<dateCreated point="end">1599</dateCreated>' +
51
+ mods_origin_info_end_str
52
+ smods_rec.from_str(mods_str)
53
+ expect(smods_rec.send(method_sym, true)).to eq '1599'
54
+ expect(smods_rec.send(method_sym, false)).to eq '1000'
55
+ end
56
+ it 'uses dateCaptured if no dateIssued or dateCreated' do
57
+ # for web archive seed files
58
+ mods_str = mods_origin_info_start_str +
59
+ '<dateCaptured encoding="w3cdtf" point="start" keyDate="yes">20151215121212</dateCaptured>' +
60
+ '<dateCaptured encoding="w3cdtf" point="end">20151218111111</dateCaptured>' +
61
+ mods_origin_info_end_str
62
+ smods_rec.from_str(mods_str)
63
+ expect(smods_rec.send(method_sym)).to eq '2015'
64
+ end
65
+ context 'spotlight actual data' do
66
+ require 'fixtures/spotlight_pub_date_data'
67
+ SPOTLIGHT_PUB_DATE_DATA.each_pair.each do |coll_name, coll_data|
68
+ coll_data.each_pair do |mods_str, exp_vals|
69
+ expected = exp_vals[exp_val_position]
70
+ it "#{expected} for rec in #{coll_name}" do
71
+ smods_rec.from_str(mods_str)
72
+ expect(smods_rec.send(method_sym)).to eq expected
73
+ end
74
+ end
75
+ end
76
+ end
77
+ end
78
+
79
+ context '#pub_date_facet_single_value' do
80
+ it_behaves_like "single pub date value", :pub_date_facet_single_value, 1
81
+ end
82
+
83
+ context '#pub_date_sortable_string' do
84
+ it_behaves_like "single pub date value", :pub_date_sortable_string, 0
85
+ end
86
+
87
+ context '*earliest_date' do
88
+ it 'selects earliest (valid) parseable date from multiple options' do
89
+ mods_str = mods_origin_info_start_str +
90
+ '<dateIssued point="start" qualifier="questionable">1758</dateIssued>' +
91
+ '<dateIssued point="end" qualifier="questionable">uuuu</dateIssued>' +
92
+ '<dateIssued>1753]</dateIssued>' +
93
+ mods_origin_info_end_str
94
+ smods_rec.from_str(mods_str)
95
+ expect(Stanford::Mods::Record.earliest_date(smods_rec.date_issued_elements)).to eq ['1753', '1753]']
96
+ end
97
+ it 'ignores encoding' do
98
+ # encoding matters for choosing display, not for parsing year
99
+ mods_str = mods_origin_info_start_str +
100
+ '<dateIssued>1100</dateIssued>' +
101
+ '<dateIssued encoding="marc">1200</dateIssued>' +
102
+ '<dateIssued encoding="w3cdtf">1300</dateIssued>' +
103
+ mods_origin_info_end_str
104
+ smods_rec.from_str(mods_str)
105
+ expect(Stanford::Mods::Record.earliest_date(smods_rec.date_issued_elements)).to eq ['1100', '1100']
106
+ mods_str = mods_origin_info_start_str +
107
+ '<dateIssued>1200</dateIssued>' +
108
+ '<dateIssued encoding="marc">1300</dateIssued>' +
109
+ '<dateIssued encoding="w3cdtf">1100</dateIssued>' +
110
+ mods_origin_info_end_str
111
+ smods_rec.from_str(mods_str)
112
+ expect(Stanford::Mods::Record.earliest_date(smods_rec.date_issued_elements)).to eq ['1100', '1100']
113
+ mods_str = mods_origin_info_start_str +
114
+ '<dateIssued>1300</dateIssued>' +
115
+ '<dateIssued encoding="marc">1100</dateIssued>' +
116
+ '<dateIssued encoding="w3cdtf">1200</dateIssued>' +
117
+ mods_origin_info_end_str
118
+ smods_rec.from_str(mods_str)
119
+ expect(Stanford::Mods::Record.earliest_date(smods_rec.date_issued_elements)).to eq ['1100', '1100']
120
+ end
121
+ it 'calls DateParsing.sortable_year_string_from_date_str for each element value' do
122
+ mods_str = mods_origin_info_start_str +
123
+ '<dateIssued>1100</dateIssued>' +
124
+ '<dateIssued encoding="marc">1200</dateIssued>' +
125
+ '<dateIssued encoding="w3cdtf">1300</dateIssued>' +
126
+ mods_origin_info_end_str
127
+ smods_rec.from_str(mods_str)
128
+ expect(Stanford::Mods::DateParsing).to receive(:sortable_year_string_from_date_str).exactly(3).times
129
+ Stanford::Mods::Record.earliest_date(smods_rec.date_issued_elements)
130
+ end
131
+ end
132
+
133
+ RSpec.shared_examples "pub date best single value" do |method_sym|
134
+ it 'uses keyDate value if specified' do
135
+ mods_str = mods_origin_info_start_str +
136
+ '<dateIssued>1666</dateIssued>' +
137
+ '<dateIssued keyDate="yes">2014</dateIssued>' +
138
+ mods_origin_info_end_str
139
+ smods_rec.from_str(mods_str)
140
+ expect(smods_rec.send(method_sym, smods_rec.date_issued_elements)).to eq '2014'
141
+ end
142
+ it 'ignores invalid keyDate value' do
143
+ mods_str = mods_origin_info_start_str +
144
+ '<dateIssued keyDate="6th">1500</dateIssued>' +
145
+ '<dateIssued>1499</dateIssued>' +
146
+ mods_origin_info_end_str
147
+ smods_rec.from_str(mods_str)
148
+ expect(smods_rec.send(method_sym, smods_rec.date_issued_elements)).to eq '1499'
149
+ end
150
+ it 'calls earliest_date if multiple keyDates present' do
151
+ mods_str = mods_origin_info_start_str +
152
+ '<dateCreated keyDate="yes">2003</dateCreated>' +
153
+ '<dateCreated keyDate="yes">2001</dateCreated>' +
154
+ mods_origin_info_end_str
155
+ smods_rec.from_str(mods_str)
156
+ expect(Stanford::Mods::Record).to receive(:earliest_date).with(smods_rec.date_created_elements)
157
+ expect(smods_rec.send(method_sym, smods_rec.date_created_elements))
158
+ end
159
+ it 'calls earliest_date if no keyDate' do
160
+ mods_str = mods_origin_info_start_str +
161
+ '<dateIssued>1753]</dateIssued>' +
162
+ '<dateIssued point="start" qualifier="questionable">1758</dateIssued>' +
163
+ '<dateIssued point="end" qualifier="questionable">uuuu</dateIssued>' +
164
+ mods_origin_info_end_str
165
+ smods_rec.from_str(mods_str)
166
+ expect(Stanford::Mods::Record).to receive(:earliest_date).with(smods_rec.date_issued_elements)
167
+ smods_rec.send(method_sym, smods_rec.date_issued_elements)
168
+ end
169
+ it 'ignores encoding' do
170
+ # encoding matters for choosing display, not for parsing year
171
+ mods_str = mods_origin_info_start_str +
172
+ '<dateIssued keyDate="yes">1100</dateIssued>' +
173
+ '<dateIssued encoding="marc">1200</dateIssued>' +
174
+ '<dateIssued encoding="w3cdtf">1300</dateIssued>' +
175
+ mods_origin_info_end_str
176
+ smods_rec.from_str(mods_str)
177
+ expect(smods_rec.send(method_sym, smods_rec.date_issued_elements)).to eq '1100'
178
+ mods_str = mods_origin_info_start_str +
179
+ '<dateIssued>1200</dateIssued>' +
180
+ '<dateIssued encoding="marc">1300</dateIssued>' +
181
+ '<dateIssued encoding="w3cdtf" keyDate="yes">1100</dateIssued>' +
182
+ mods_origin_info_end_str
183
+ smods_rec.from_str(mods_str)
184
+ expect(smods_rec.send(method_sym, smods_rec.date_issued_elements)).to eq '1100'
185
+ mods_str = mods_origin_info_start_str +
186
+ '<dateIssued>1300</dateIssued>' +
187
+ '<dateIssued encoding="marc" keyDate="yes">1100</dateIssued>' +
188
+ '<dateIssued encoding="w3cdtf">1200</dateIssued>' +
189
+ mods_origin_info_end_str
190
+ smods_rec.from_str(mods_str)
191
+ expect(smods_rec.send(method_sym, smods_rec.date_issued_elements)).to eq '1100'
192
+ end
193
+ end
194
+
195
+ context '#pub_date_best_single_facet_value' do
196
+ it_behaves_like "pub date best single value", :pub_date_best_single_facet_value
197
+ it 'uses facet value, not sorting value' do
198
+ mods_str = mods_origin_info_start_str +
199
+ '<dateCreated keyDate="yes">180 B.C.</dateCreated>' +
200
+ mods_origin_info_end_str
201
+ smods_rec.from_str(mods_str)
202
+ expect(smods_rec.send(:pub_date_best_single_facet_value, smods_rec.date_created_elements)).to eq '180 B.C.'
203
+ end
204
+ end
205
+
206
+ context '#pub_date_best_sort_str_value' do
207
+ it_behaves_like "pub date best single value", :pub_date_best_sort_str_value
208
+ it 'uses string sorting value, not facet value' do
209
+ mods_str = mods_origin_info_start_str +
210
+ '<dateCreated keyDate="yes">180 B.C.</dateCreated>' +
211
+ mods_origin_info_end_str
212
+ smods_rec.from_str(mods_str)
213
+ expect(smods_rec.send(:pub_date_best_sort_str_value, smods_rec.date_created_elements)).to eq '-820'
214
+ end
215
+ end
216
+
217
+ context '#date_issued_elements' do
218
+ # example string as key, expected num of Elements as value
219
+ {
220
+ '<dateIssued>[1717]</dateIssued><dateIssued encoding="marc">1717</dateIssued>' => 2,
221
+ '<dateIssued encoding="marc" point="start">1552</dateIssued>
222
+ <dateIssued encoding="marc" point="end">1575</dateIssued>
223
+ </originInfo>
224
+ <originInfo>
225
+ <dateIssued>1544-1628]</dateIssued>' => 3,
226
+ '' => 0
227
+ }.each do |example, expected|
228
+ describe "for example: #{example}" do
229
+ let(:example) { example }
230
+ it 'returns Array of Nokogiri Elements matching /originInfo/dateIssued' do
231
+ smods_rec.from_str(mods_origin_info)
232
+ result = smods_rec.date_issued_elements
233
+ expect(result).to be_instance_of(Array)
234
+ expect(result.size).to eq expected
235
+ expect(result).to all(be_an(Nokogiri::XML::Element))
236
+ end
237
+ end
238
+ end
239
+
240
+ context 'ignore_approximate=true' do
241
+ let(:qual_date_val) { '1666' }
242
+ let(:mods_rec) do
243
+ <<-EOF
244
+ #{mods_origin_info_start_str}
245
+ <dateIssued>2015</dateIssued>
246
+ <dateIssued qualifier="#{qual_attr_val}">#{qual_date_val}</dateIssued>
247
+ #{mods_origin_info_end_str}
248
+ EOF
249
+ end
250
+
251
+ context "removes element when attribute qualifer=" do
252
+ ['approximate', 'questionable'].each do |attr_val|
253
+ let(:qual_attr_val) { attr_val }
254
+ it attr_val do
255
+ smods_rec.from_str mods_rec
256
+ result = smods_rec.date_issued_elements(true)
257
+ expect(result).to be_instance_of(Array)
258
+ expect(result.size).to eq 1
259
+ expect(result[0].content).to eq '2015'
260
+ end
261
+ end
262
+ end
263
+ context "retains element when attribute qualifer=" do
264
+ ['inferred', 'invalid_attr_val'].each do |attr_val|
265
+ let(:qual_attr_val) { attr_val }
266
+ it attr_val do
267
+ smods_rec.from_str mods_rec
268
+ result = smods_rec.date_issued_elements(true)
269
+ expect(result).to be_instance_of(Array)
270
+ expect(result.size).to eq 2
271
+ expect(result[0].content).to eq '2015'
272
+ expect(result[1].content).to eq '1666'
273
+ end
274
+ end
275
+ end
276
+
277
+ let(:start_str) {"#{mods_origin_info_start_str}<dateIssued>2015</dateIssued>"}
278
+ it 'retains element without qualifier attribute"' do
279
+ m = start_str + '<dateIssued>1666</dateIssued>' + mods_origin_info_end_str
280
+ smods_rec.from_str m
281
+ result = smods_rec.date_issued_elements(true)
282
+ expect(result).to be_instance_of(Array)
283
+ expect(result.size).to eq 2
284
+ expect(result[0].content).to eq '2015'
285
+ expect(result[1].content).to eq '1666'
286
+ end
287
+ end
288
+ end
289
+
290
+ context '#date_created_elements' do
291
+ # example string as key, expected num of Elements as value
292
+ {
293
+ '<dateCreated encoding="edtf" keydate="yes" point="start">-0012</dateCreated>
294
+ <dateCreated encoding="edtf" point="end">-0044</dateCreated>' => 2,
295
+ '' => 0
296
+ }.each do |example, expected|
297
+ describe "for example: '#{example}'" do
298
+ let(:example) { example }
299
+ it 'returns Array of Nokogiri Elements matching /originInfo/dateCreated' do
300
+ smods_rec.from_str(mods_origin_info)
301
+ result = smods_rec.date_created_elements
302
+ expect(result).to be_instance_of(Array)
303
+ expect(result.size).to eq expected
304
+ expect(result).to all(be_an(Nokogiri::XML::Element))
305
+ end
306
+ end
307
+ end
308
+
309
+ context 'ignore_approximate=true' do
310
+ let(:qual_date_val) { '1666' }
311
+ let(:mods_rec) do
312
+ <<-EOF
313
+ #{mods_origin_info_start_str}
314
+ <dateCreated>2015</dateCreated>
315
+ <dateCreated qualifier="#{qual_attr_val}">#{qual_date_val}</dateCreated>
316
+ #{mods_origin_info_end_str}
317
+ EOF
318
+ end
319
+
320
+ context "removes element when attribute qualifer=" do
321
+ ['approximate', 'questionable'].each do |attr_val|
322
+ let(:qual_attr_val) { attr_val }
323
+ it attr_val do
324
+ smods_rec.from_str mods_rec
325
+ result = smods_rec.date_created_elements(true)
326
+ expect(result).to be_instance_of(Array)
327
+ expect(result.size).to eq 1
328
+ expect(result[0].content).to eq '2015'
329
+ end
330
+ end
331
+ end
332
+ context "retains element when attribute qualifer=" do
333
+ ['inferred', 'invalid_attr_val'].each do |attr_val|
334
+ let(:qual_attr_val) { attr_val }
335
+ it attr_val do
336
+ smods_rec.from_str mods_rec
337
+ result = smods_rec.date_created_elements(true)
338
+ expect(result).to be_instance_of(Array)
339
+ expect(result.size).to eq 2
340
+ expect(result[0].content).to eq '2015'
341
+ expect(result[1].content).to eq '1666'
342
+ end
343
+ end
344
+ end
345
+
346
+ let(:start_str) {"#{mods_origin_info_start_str}<dateCreated>2015</dateCreated>"}
347
+ it 'retains element without qualifier attribute"' do
348
+ m = start_str + '<dateCreated>1666</dateCreated>' + mods_origin_info_end_str
349
+ smods_rec.from_str m
350
+ result = smods_rec.date_created_elements(true)
351
+ expect(result).to be_instance_of(Array)
352
+ expect(result.size).to eq 2
353
+ expect(result[0].content).to eq '2015'
354
+ expect(result[1].content).to eq '1666'
355
+ end
356
+ end
357
+ end
358
+
359
+ context '*keyDate' do
360
+ it 'returns nil if passed Array is empty' do
361
+ mods_str = "#{mods_origin_info_start_str}#{mods_origin_info_end_str}"
362
+ smods_rec.from_str(mods_str)
363
+ expect(Stanford::Mods::Record.keyDate(smods_rec.date_issued_elements)).to be_nil
364
+ end
365
+ it 'returns nil if passed Array has no element with keyDate attribute' do
366
+ mods_str = "#{mods_origin_info_start_str}<dateIssued>[1738]</dateIssued>#{mods_origin_info_end_str}"
367
+ smods_rec.from_str(mods_str)
368
+ expect(Stanford::Mods::Record.keyDate(smods_rec.date_issued_elements)).to be_nil
369
+ end
370
+ it 'returns nil if passed Array has multiple elements with keyDate attribute' do
371
+ mods_str = "#{mods_origin_info_start_str}
372
+ <dateIssued>[1968?-</dateIssued>
373
+ <dateIssued encoding='marc' point='start' keyDate='yes'>1968</dateIssued>
374
+ <dateIssued encoding='marc' point='end' keyDate='yes'>9999</dateIssued>
375
+ #{mods_origin_info_end_str}"
376
+ smods_rec.from_str(mods_str)
377
+ expect(Stanford::Mods::Record.keyDate(smods_rec.date_issued_elements)).to be_nil
378
+ end
379
+ it 'returns single Nokogiri::XML::Element if Arrays has single element with keyDate attribute' do
380
+ mods_str = "#{mods_origin_info_start_str}<dateIssued encoding='w3cdtf' keyDate='yes'>2011</dateIssued>#{mods_origin_info_end_str}"
381
+ smods_rec.from_str(mods_str)
382
+ expect(Stanford::Mods::Record.keyDate(smods_rec.date_issued_elements)).to be_instance_of(Nokogiri::XML::Element)
383
+ end
384
+ end
385
+
386
+ context '*remove_approximate' do
387
+ it 'removes elements when date_is_approximate? returns true' do
388
+ mods_str = "#{mods_origin_info_start_str}
389
+ <dateIssued>1900</dateIssued>
390
+ <dateIssued qualifier='inferred'>1910</dateIssued>
391
+ <dateIssued qualifier='questionable'>1930</dateIssued>
392
+ #{mods_origin_info_end_str}"
393
+ smods_rec.from_str(mods_str)
394
+ elements = smods_rec.date_issued_elements
395
+ expect(elements.size).to eq 3
396
+ result = Stanford::Mods::Record.remove_approximate(elements)
397
+ expect(result).to be_instance_of(Array)
398
+ expect(result.size).to eq 2
399
+ expect(result.select { |date_el| Stanford::Mods::Record.date_is_approximate?(date_el) }).to eq []
400
+ end
401
+ end
402
+
403
+ context '#date_is_approximate?' do
404
+ it 'false if bad param passed' do
405
+ expect(Stanford::Mods::Record.date_is_approximate?(true)).to eq false
406
+ end
407
+ it 'false if there is no qualifier attrib' do
408
+ mods_str = "#{mods_origin_info_start_str}<dateIssued>1968</dateIssued>#{mods_origin_info_end_str}"
409
+ smods_rec.from_str(mods_str)
410
+ date_el = smods_rec.date_issued_elements.first
411
+ expect(Stanford::Mods::Record.date_is_approximate?(date_el)).to eq false
412
+ end
413
+ # value of qualifier attribute as key, expected result as value
414
+ {
415
+ 'approximate' => true,
416
+ 'questionable' => true,
417
+ 'inferred' => false,
418
+ 'typo' => false
419
+ }.each do |attr_value, expected|
420
+ describe "for qualifier value: '#{attr_value}'" do
421
+ let(:mods_str) do
422
+ "#{mods_origin_info_start_str}
423
+ <dateIssued qualifier='#{attr_value}'>1968</dateIssued>
424
+ #{mods_origin_info_end_str}"
425
+ end
426
+ it "#{expected}" do
427
+ smods_rec.from_str(mods_str)
428
+ date_el = smods_rec.date_issued_elements.first
429
+ expect(Stanford::Mods::Record.date_is_approximate?(date_el)).to eq expected
430
+ end
431
+ end
432
+ end
433
+ end
434
+
435
+ context '#get_u_year' do
436
+ it "turns ending u to 0" do
437
+ expect(smods_rec.send(:get_u_year, ["201u"])).to eql "2010"
438
+ expect(smods_rec.send(:get_u_year, ["198u"])).to eql "1980"
439
+ expect(smods_rec.send(:get_u_year, ["185u"])).to eql "1850"
440
+ end
441
+ it "turns ending uu to --" do
442
+ expect(smods_rec.send(:get_u_year, ["19uu"])).to eql "19--"
443
+ expect(smods_rec.send(:get_u_year, ["17uu"])).to eql "17--"
444
+ end
445
+ it 'ignores 9999' do
446
+ expect(smods_rec.send(:get_u_year, ["9999"])).to be_nil
447
+ end
448
+ end
449
+ end