stanford-mods 1.3.3 → 1.3.4

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