stanford-mods 2.2.0 → 2.2.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 (41) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +1 -0
  3. data/.rubocop_todo.yml +358 -3
  4. data/.travis.yml +1 -4
  5. data/Gemfile +3 -4
  6. data/Rakefile +3 -3
  7. data/lib/marc_countries.rb +381 -381
  8. data/lib/stanford-mods.rb +1 -0
  9. data/lib/stanford-mods/coordinate.rb +14 -36
  10. data/lib/stanford-mods/date_parsing.rb +7 -8
  11. data/lib/stanford-mods/geo_spatial.rb +32 -12
  12. data/lib/stanford-mods/geo_utils.rb +28 -0
  13. data/lib/stanford-mods/imprint.rb +1 -1
  14. data/lib/stanford-mods/name.rb +7 -15
  15. data/lib/stanford-mods/origin_info.rb +35 -37
  16. data/lib/stanford-mods/physical_location.rb +6 -4
  17. data/lib/stanford-mods/searchworks.rb +149 -182
  18. data/lib/stanford-mods/searchworks_languages.rb +3 -3
  19. data/lib/stanford-mods/searchworks_subjects.rb +16 -18
  20. data/lib/stanford-mods/version.rb +1 -1
  21. data/spec/date_parsing_spec.rb +17 -19
  22. data/spec/fixtures/searchworks_imprint_data.rb +1 -1
  23. data/spec/fixtures/searchworks_pub_date_data.rb +1 -1
  24. data/spec/fixtures/spotlight_pub_date_data.rb +1 -1
  25. data/spec/geo_spatial_spec.rb +51 -5
  26. data/spec/imprint_spec.rb +4 -6
  27. data/spec/lib/stanford-mods/coordinate_spec.rb +0 -2
  28. data/spec/name_spec.rb +0 -2
  29. data/spec/origin_info_spec.rb +26 -28
  30. data/spec/physical_location_spec.rb +0 -3
  31. data/spec/searchworks_basic_spec.rb +1 -2
  32. data/spec/searchworks_format_spec.rb +35 -39
  33. data/spec/searchworks_pub_dates_spec.rb +0 -5
  34. data/spec/searchworks_spec.rb +1 -7
  35. data/spec/searchworks_subject_raw_spec.rb +0 -5
  36. data/spec/searchworks_subject_spec.rb +2 -9
  37. data/spec/searchworks_title_spec.rb +0 -2
  38. data/spec/spec_helper.rb +2 -5
  39. data/spec/sw_publication_spec.rb +1 -2
  40. data/stanford-mods.gemspec +1 -2
  41. metadata +4 -4
@@ -1,10 +1,12 @@
1
- require 'logger'
2
1
  require 'mods'
3
2
 
4
- # Parsing MODS //location/physicalLocation for series, box, and folder for Special Collections
5
- # This is not used by Searchworks, otherwise it would have been in the searchworks.rb file
6
3
  module Stanford
7
4
  module Mods
5
+ # Parsing MODS //location/physicalLocation for series, box, and folder for Special Collections.
6
+ # This is not used by Searchworks, otherwise it would have been in the searchworks.rb file.
7
+ # Note: mods_ng_xml_location.physicalLocation should find top level and relatedItem.
8
+ # Each method here expects to find at most ONE matching element. Subsequent potential matches
9
+ # are ignored.
8
10
  class Record < ::Mods::Record
9
11
  # return box number (note: single valued and might be something like 35A)
10
12
  # data in location/physicalLocation or in relatedItem/location/physicalLocation
@@ -56,7 +58,7 @@ module Stanford
56
58
  def physical_location_str
57
59
  # _location.physicalLocation should find top level and relatedItem
58
60
  loc = @mods_ng_xml._location.physicalLocation.map do |node|
59
- node.text if node.text.match(/.*(Series)|(Accession)|(Folder)|(Box).*/i)
61
+ node.text if node.text =~ /.*(Series)|(Accession)|(Folder)|(Box).*/i
60
62
  end.compact
61
63
 
62
64
  # There should only be one location
@@ -7,18 +7,28 @@ require 'mods'
7
7
  # SearchWorks specific wranglings of MODS metadata as a mixin to the Stanford::Mods::Record object
8
8
  module Stanford
9
9
  module Mods
10
-
11
10
  class Record < ::Mods::Record
11
+ attr_writer :druid
12
+ attr_writer :logger
13
+
14
+ def druid
15
+ @druid || 'Unknown item'
16
+ end
17
+
18
+ def logger
19
+ @logger ||= Logger.new(STDOUT)
20
+ end
21
+ alias sw_logger logger
12
22
 
13
23
  # include langagues known to SearchWorks; try to error correct when possible (e.g. when ISO-639 disagrees with MARC standard)
14
24
  def sw_language_facet
15
25
  result = []
16
- @mods_ng_xml.language.each { |n|
26
+ mods_ng_xml.language.each { |n|
17
27
  # get languageTerm codes and add their translations to the result
18
28
  n.code_term.each { |ct|
19
- if ct.authority.match(/^iso639/)
29
+ if ct.authority =~ /^iso639/
20
30
  begin
21
- vals = ct.text.split(/[,|\ ]/).reject {|x| x.strip.length == 0 }
31
+ vals = ct.text.split(/[,|\ ]/).reject { |x| x.strip.empty? }
22
32
  vals.each do |v|
23
33
  iso639_val = ISO_639.find(v.strip).english_name
24
34
  if SEARCHWORKS_LANGUAGES.has_value?(iso639_val)
@@ -32,7 +42,7 @@ module Stanford
32
42
  p "Couldn't find english name for #{ct.text}"
33
43
  end
34
44
  else
35
- vals = ct.text.split(/[,|\ ]/).reject {|x| x.strip.length == 0 }
45
+ vals = ct.text.split(/[,|\ ]/).reject { |x| x.strip.empty? }
36
46
  vals.each do |v|
37
47
  result << SEARCHWORKS_LANGUAGES[v.strip]
38
48
  end
@@ -41,18 +51,17 @@ module Stanford
41
51
  # add languageTerm text values
42
52
  n.text_term.each { |tt|
43
53
  val = tt.text.strip
44
- result << val if val.length > 0 && SEARCHWORKS_LANGUAGES.has_value?(val)
54
+ result << val if !val.empty? && SEARCHWORKS_LANGUAGES.has_value?(val)
45
55
  }
46
56
 
47
57
  # add language values that aren't in languageTerm subelement
48
- if n.languageTerm.size == 0
58
+ if n.languageTerm.empty?
49
59
  result << n.text if SEARCHWORKS_LANGUAGES.has_value?(n.text)
50
60
  end
51
61
  }
52
62
  result.uniq
53
63
  end # language_facet
54
64
 
55
-
56
65
  # ---- AUTHOR ----
57
66
 
58
67
  # @return [String] value for author_1xx_search field
@@ -73,18 +82,17 @@ module Stanford
73
82
  # return the display_value_w_date for all <mods><name> elements that do not have type='personal'
74
83
  # @return [Array<String>] values for author_other_facet
75
84
  def sw_impersonal_authors
76
- @mods_ng_xml.plain_name.select {|n| n.type_at != 'personal'}.map { |n| n.display_value_w_date }
85
+ mods_ng_xml.plain_name.select { |n| n.type_at != 'personal' }.map { |n| n.display_value_w_date }
77
86
  end
78
87
 
79
88
  # @return [Array<String>] values for author_corp_display
80
89
  def sw_corporate_authors
81
- val = @mods_ng_xml.plain_name.select {|n| n.type_at == 'corporate'}.map { |n| n.display_value_w_date }
82
- val
90
+ mods_ng_xml.plain_name.select { |n| n.type_at == 'corporate' }.map { |n| n.display_value_w_date }
83
91
  end
84
92
 
85
93
  # @return [Array<String>] values for author_meeting_display
86
94
  def sw_meeting_authors
87
- @mods_ng_xml.plain_name.select {|n| n.type_at == 'conference'}.map { |n| n.display_value_w_date }
95
+ mods_ng_xml.plain_name.select { |n| n.type_at == 'conference' }.map { |n| n.display_value_w_date }
88
96
  end
89
97
 
90
98
  # Returns a sortable version of the main_author:
@@ -93,17 +101,15 @@ module Stanford
93
101
  # @return [String] value for author_sort field
94
102
  def sw_sort_author
95
103
  # substitute java Character.MAX_CODE_POINT for nil main_author so missing main authors sort last
96
- val = '' + (main_author_w_date ? main_author_w_date : "\u{10FFFF} ") + ( sort_title ? sort_title : '')
104
+ val = '' + (main_author_w_date ? main_author_w_date : "\u{10FFFF} ") + (sort_title ? sort_title : '')
97
105
  val.gsub(/[[:punct:]]*/, '').strip
98
106
  end
99
107
 
100
108
  def main_author_w_date_test
101
109
  result = nil
102
110
  first_wo_role = nil
103
- self.plain_name.each { |n|
104
- if n.role.size == 0
105
- first_wo_role ||= n
106
- end
111
+ plain_name.each { |n|
112
+ first_wo_role ||= n if n.role.empty?
107
113
  n.role.each { |r|
108
114
  if r.authority.include?('marcrelator') &&
109
115
  (r.value.include?('Creator') || r.value.include?('Author'))
@@ -111,9 +117,7 @@ module Stanford
111
117
  end
112
118
  }
113
119
  }
114
- if !result && first_wo_role
115
- result = first_wo_role.display_value_w_date
116
- end
120
+ result = first_wo_role.display_value_w_date if !result && first_wo_role
117
121
  result
118
122
  end
119
123
 
@@ -128,38 +132,35 @@ module Stanford
128
132
 
129
133
  # @return [String] value for title_245_search, title_full_display
130
134
  def sw_full_title
131
- outer_nodes = @mods_ng_xml.title_info
135
+ outer_nodes = mods_ng_xml.title_info
132
136
  outer_node = outer_nodes ? outer_nodes.first : nil
133
- if outer_node
134
- nonSort = outer_node.nonSort.text.strip.empty? ? nil : outer_node.nonSort.text.strip
135
- title = outer_node.title.text.strip.empty? ? nil : outer_node.title.text.strip
136
- preSubTitle = nonSort ? [nonSort, title].compact.join(" ") : title
137
- preSubTitle.sub!(/:$/, '') if preSubTitle # remove trailing colon
138
-
139
- subTitle = outer_node.subTitle.text.strip
140
- preParts = subTitle.empty? ? preSubTitle : preSubTitle + " : " + subTitle
141
- preParts.sub!(/\.$/, '') if preParts # remove trailing period
142
-
143
- partName = outer_node.partName.text.strip unless outer_node.partName.text.strip.empty?
144
- partNumber = outer_node.partNumber.text.strip unless outer_node.partNumber.text.strip.empty?
145
- partNumber.sub!(/,$/, '') if partNumber # remove trailing comma
146
- if partNumber && partName
147
- parts = partNumber + ", " + partName
148
- elsif partNumber
149
- parts = partNumber
150
- elsif partName
151
- parts = partName
152
- end
153
- parts.sub!(/\.$/, '') if parts
154
-
155
- result = parts ? preParts + ". " + parts : preParts
156
- result += "." if !result.match(/[[:punct:]]$/)
157
- result.strip!
158
- result = nil if result.empty?
159
- result
160
- else
161
- nil
137
+ return nil unless outer_node
138
+ nonSort = outer_node.nonSort.text.strip.empty? ? nil : outer_node.nonSort.text.strip
139
+ title = outer_node.title.text.strip.empty? ? nil : outer_node.title.text.strip
140
+ preSubTitle = nonSort ? [nonSort, title].compact.join(" ") : title
141
+ preSubTitle.sub!(/:$/, '') if preSubTitle # remove trailing colon
142
+
143
+ subTitle = outer_node.subTitle.text.strip
144
+ preParts = subTitle.empty? ? preSubTitle : preSubTitle + " : " + subTitle
145
+ preParts.sub!(/\.$/, '') if preParts # remove trailing period
146
+
147
+ partName = outer_node.partName.text.strip unless outer_node.partName.text.strip.empty?
148
+ partNumber = outer_node.partNumber.text.strip unless outer_node.partNumber.text.strip.empty?
149
+ partNumber.sub!(/,$/, '') if partNumber # remove trailing comma
150
+ if partNumber && partName
151
+ parts = partNumber + ", " + partName
152
+ elsif partNumber
153
+ parts = partNumber
154
+ elsif partName
155
+ parts = partName
162
156
  end
157
+ parts.sub!(/\.$/, '') if parts
158
+
159
+ result = parts ? preParts + ". " + parts : preParts
160
+ result += "." unless result =~ /[[:punct:]]$/
161
+ result.strip!
162
+ result = nil if result.empty?
163
+ result
163
164
  end
164
165
 
165
166
  # like sw_full_title without trailing \,/;:.
@@ -167,12 +168,9 @@ module Stanford
167
168
  # title_display = custom, removeTrailingPunct(245abdefghijklmnopqrstuvwxyz, [\\\\,/;:], ([A-Za-z]{4}|[0-9]{3}|\\)|\\,))
168
169
  # @return [String] value for title_display (like title_full_display without trailing punctuation)
169
170
  def sw_title_display
170
- result = sw_full_title ? sw_full_title : nil
171
- if result
172
- result.sub!(/[\.,;:\/\\]+$/, '')
173
- result.strip!
174
- end
175
- result
171
+ result = sw_full_title
172
+ return nil unless result
173
+ result.sub(/[\.,;:\/\\]+$/, '').strip
176
174
  end
177
175
 
178
176
  # this includes all titles except
@@ -185,22 +183,22 @@ module Stanford
185
183
  # @return [String] value for title_sort field
186
184
  def sw_sort_title
187
185
  # get nonSort piece
188
- outer_nodes = @mods_ng_xml.title_info
186
+ outer_nodes = mods_ng_xml.title_info
189
187
  outer_node = outer_nodes ? outer_nodes.first : nil
190
188
  if outer_node
191
189
  nonSort = outer_node.nonSort.text.strip.empty? ? nil : outer_node.nonSort.text.strip
192
190
  end
193
191
 
194
- val = '' + ( sw_full_title ? sw_full_title : '')
192
+ val = '' + (sw_full_title ? sw_full_title : '')
195
193
  val.sub!(Regexp.new("^" + Regexp.escape(nonSort)), '') if nonSort
196
194
  val.gsub!(/[[:punct:]]*/, '').strip
197
195
  val.squeeze(" ").strip
198
196
  end
199
197
 
200
- #remove trailing commas
198
+ # remove trailing commas
201
199
  # @deprecated in favor of sw_title_display
202
200
  def sw_full_title_without_commas
203
- result = self.sw_full_title
201
+ result = sw_full_title
204
202
  result.sub!(/,$/, '') if result
205
203
  result
206
204
  end
@@ -215,60 +213,55 @@ module Stanford
215
213
  # see origin_info.rb (as all this information comes from top level originInfo element)
216
214
  # ---- end PUBLICATION (place, year) ----
217
215
 
218
- def sw_logger
219
- @logger ||= Logger.new(STDOUT)
220
- end
221
-
222
216
  # select one or more format values from the controlled vocabulary here:
223
217
  # http://searchworks-solr-lb.stanford.edu:8983/solr/select?facet.field=format&rows=0&facet.sort=index
224
218
  # @return <Array[String]> value in the SearchWorks controlled vocabulary
225
219
  # @deprecated - kept for backwards compatibility but not part of SW UI redesign work Summer 2014
226
220
  # @deprecated: this is no longer used in SW, Revs or Spotlight Jan 2016
227
221
  def format
222
+ types = term_values(:typeOfResource)
223
+ return [] unless types
224
+ genres = term_values(:genre)
225
+ issuance = term_values([:origin_info, :issuance])
228
226
  val = []
229
- types = self.term_values(:typeOfResource)
230
- if types
231
- genres = self.term_values(:genre)
232
- issuance = self.term_values([:origin_info,:issuance])
233
- types.each do |type|
234
- case type
235
- when 'cartographic'
236
- val << 'Map/Globe'
237
- when 'mixed material'
238
- val << 'Manuscript/Archive'
239
- when 'moving image'
240
- val << 'Video'
241
- when 'notated music'
242
- val << 'Music - Score'
243
- when 'software, multimedia'
244
- val << 'Computer File'
245
- when 'sound recording-musical'
246
- val << 'Music - Recording'
247
- when 'sound recording-nonmusical', 'sound recording'
248
- val << 'Sound Recording'
249
- when 'still image'
250
- val << 'Image'
251
- when 'text'
252
- val << 'Book' if issuance && issuance.include?('monographic')
253
- book_genres = ['book chapter', 'Book chapter', 'Book Chapter',
254
- 'issue brief', 'Issue brief', 'Issue Brief',
255
- 'librettos', 'Librettos',
256
- 'project report', 'Project report', 'Project Report',
257
- 'technical report', 'Technical report', 'Technical Report',
258
- 'working paper', 'Working paper', 'Working Paper']
259
- val << 'Book' if genres && !(genres & book_genres).empty?
260
- conf_pub = ['conference publication', 'Conference publication', 'Conference Publication']
261
- val << 'Conference Proceedings' if genres && !(genres & conf_pub).empty?
262
- val << 'Journal/Periodical' if issuance && issuance.include?('continuing')
263
- article = ['article', 'Article']
264
- val << 'Journal/Periodical' if genres && !(genres & article).empty?
265
- stu_proj_rpt = ['student project report', 'Student project report', 'Student Project report', 'Student Project Report']
266
- val << 'Other' if genres && !(genres & stu_proj_rpt).empty?
267
- thesis = ['thesis', 'Thesis']
268
- val << 'Thesis' if genres && !(genres & thesis).empty?
269
- when 'three dimensional object'
270
- val << 'Other'
271
- end
227
+ types.each do |type|
228
+ case type
229
+ when 'cartographic'
230
+ val << 'Map/Globe'
231
+ when 'mixed material'
232
+ val << 'Manuscript/Archive'
233
+ when 'moving image'
234
+ val << 'Video'
235
+ when 'notated music'
236
+ val << 'Music - Score'
237
+ when 'software, multimedia'
238
+ val << 'Computer File'
239
+ when 'sound recording-musical'
240
+ val << 'Music - Recording'
241
+ when 'sound recording-nonmusical', 'sound recording'
242
+ val << 'Sound Recording'
243
+ when 'still image'
244
+ val << 'Image'
245
+ when 'text'
246
+ val << 'Book' if issuance && issuance.include?('monographic')
247
+ book_genres = ['book chapter', 'Book chapter', 'Book Chapter',
248
+ 'issue brief', 'Issue brief', 'Issue Brief',
249
+ 'librettos', 'Librettos',
250
+ 'project report', 'Project report', 'Project Report',
251
+ 'technical report', 'Technical report', 'Technical Report',
252
+ 'working paper', 'Working paper', 'Working Paper']
253
+ val << 'Book' if genres && !(genres & book_genres).empty?
254
+ conf_pub = ['conference publication', 'Conference publication', 'Conference Publication']
255
+ val << 'Conference Proceedings' if genres && !(genres & conf_pub).empty?
256
+ val << 'Journal/Periodical' if issuance && issuance.include?('continuing')
257
+ article = ['article', 'Article']
258
+ val << 'Journal/Periodical' if genres && !(genres & article).empty?
259
+ stu_proj_rpt = ['student project report', 'Student project report', 'Student Project report', 'Student Project Report']
260
+ val << 'Other' if genres && !(genres & stu_proj_rpt).empty?
261
+ thesis = ['thesis', 'Thesis']
262
+ val << 'Thesis' if genres && !(genres & thesis).empty?
263
+ when 'three dimensional object'
264
+ val << 'Other'
272
265
  end
273
266
  end
274
267
  val.uniq
@@ -280,8 +273,8 @@ module Stanford
280
273
  # resource type should be only Map and not include Software, multimedia.
281
274
  # @return <Array[String]> value in the SearchWorks controlled vocabulary
282
275
  def format_main
283
- val = []
284
- types = self.term_values(:typeOfResource)
276
+ types = term_values(:typeOfResource)
277
+ return [] unless types
285
278
  article_genres = ['article', 'Article',
286
279
  'book chapter', 'Book chapter', 'Book Chapter',
287
280
  'issue brief', 'Issue brief', 'Issue Brief',
@@ -295,98 +288,72 @@ module Stanford
295
288
  'librettos', 'Librettos',
296
289
  'thesis', 'Thesis'
297
290
  ]
298
- if types
299
- genres = self.term_values(:genre)
300
- issuance = self.term_values([:origin_info, :issuance])
301
- types.each do |type|
302
- case type
303
- when 'cartographic'
304
- val << 'Map'
305
- val.delete 'Software/Multimedia'
306
- when 'mixed material'
307
- val << 'Archive/Manuscript'
308
- when 'moving image'
309
- val << 'Video'
310
- when 'notated music'
311
- val << 'Music score'
312
- when 'software, multimedia'
313
- if genres && (genres.include?('dataset') || genres.include?('Dataset'))
314
- val << 'Dataset'
315
- elsif (!val.include?('Map'))
316
- val << 'Software/Multimedia'
317
- end
318
- when 'sound recording-musical'
319
- val << 'Music recording'
320
- when 'sound recording-nonmusical', 'sound recording'
321
- val << 'Sound recording'
322
- when 'still image'
323
- val << 'Image'
324
- when 'text'
325
- val << 'Book' if genres && !(genres & article_genres).empty?
326
- val << 'Book' if issuance && issuance.include?('monographic')
327
- val << 'Book' if genres && !(genres & book_genres).empty?
328
- val << 'Journal/Periodical' if issuance && issuance.include?('continuing')
329
- val << 'Archived website' if genres && genres.include?('archived website')
330
- when 'three dimensional object'
331
- val << 'Object'
332
- end
291
+ val = []
292
+ genres = term_values(:genre)
293
+ issuance = term_values([:origin_info, :issuance])
294
+ types.each do |type|
295
+ case type
296
+ when 'cartographic'
297
+ val << 'Map'
298
+ val.delete 'Software/Multimedia'
299
+ when 'mixed material'
300
+ val << 'Archive/Manuscript'
301
+ when 'moving image'
302
+ val << 'Video'
303
+ when 'notated music'
304
+ val << 'Music score'
305
+ when 'software, multimedia'
306
+ if genres && (genres.include?('dataset') || genres.include?('Dataset'))
307
+ val << 'Dataset'
308
+ elsif !val.include?('Map')
309
+ val << 'Software/Multimedia'
310
+ end
311
+ when 'sound recording-musical'
312
+ val << 'Music recording'
313
+ when 'sound recording-nonmusical', 'sound recording'
314
+ val << 'Sound recording'
315
+ when 'still image'
316
+ val << 'Image'
317
+ when 'text'
318
+ val << 'Book' if genres && !(genres & article_genres).empty?
319
+ val << 'Book' if issuance && issuance.include?('monographic')
320
+ val << 'Book' if genres && !(genres & book_genres).empty?
321
+ val << 'Journal/Periodical' if issuance && issuance.include?('continuing')
322
+ val << 'Archived website' if genres && genres.include?('archived website')
323
+ when 'three dimensional object'
324
+ val << 'Object'
333
325
  end
334
326
  end
335
327
  val.uniq
336
328
  end
337
329
 
338
- # return values for the genre facet in SearchWorks
339
330
  # https://github.com/sul-dlss/stanford-mods/issues/66
340
331
  # Limit genre values to Government document, Conference proceedings,
341
332
  # Technical report and Thesis/Dissertation
342
- # @return <Array[String]>
333
+ # @return <Array[String]> values for the genre facet in SearchWorks
343
334
  def sw_genre
335
+ genres = term_values(:genre)
336
+ return [] unless genres
337
+ types = term_values(:typeOfResource)
344
338
  val = []
345
- genres = self.term_values(:genre)
346
- types = self.term_values(:typeOfResource)
347
- if genres
348
- if genres.include?('thesis') || genres.include?('Thesis')
349
- val << 'Thesis/Dissertation'
350
- end
339
+ val << 'Thesis/Dissertation' if genres.include?('thesis') || genres.include?('Thesis')
340
+ if genres && types && types.include?('text')
351
341
  conf_pub = ['conference publication', 'Conference publication', 'Conference Publication']
352
- if !(genres & conf_pub).empty?
353
- if types && types.include?('text')
354
- val << 'Conference proceedings'
355
- end
356
- end
357
- gov_pub = ['government publication', 'Government publication', 'Government Publication']
358
- if !(genres & gov_pub).empty?
359
- if types && types.include?('text')
360
- val << 'Government document'
361
- end
362
- end
342
+ gov_pub = ['government publication', 'Government publication', 'Government Publication']
363
343
  tech_rpt = ['technical report', 'Technical report', 'Technical Report']
364
- if !(genres & tech_rpt).empty?
365
- if types && types.include?('text')
366
- val << 'Technical report'
367
- end
368
- end
344
+ val << 'Conference proceedings' unless (genres & conf_pub).empty?
345
+ val << 'Government document' unless (genres & gov_pub).empty?
346
+ val << 'Technical report' unless (genres & tech_rpt).empty?
369
347
  end
370
348
  val.uniq
371
349
  end
372
350
 
373
351
  # @return [String] value with the numeric catkey in it, or nil if none exists
374
352
  def catkey
375
- catkey = self.term_values([:record_info, :recordIdentifier])
376
- if catkey && catkey.length > 0
377
- return catkey.first.tr('a', '') # ensure catkey is numeric only
378
- end
379
- nil
380
- end
381
-
382
- def druid=(new_druid)
383
- @druid = new_druid
353
+ catkey = term_values([:record_info, :recordIdentifier])
354
+ return nil unless catkey && !catkey.empty?
355
+ catkey.first.tr('a', '') # ensure catkey is numeric only
384
356
  end
385
-
386
- def druid
387
- @druid ? @druid : 'Unknown item'
388
- end
389
-
390
357
  end # class Record
391
358
  end # Module Mods
392
359
  end # Module Stanford