pennmarc 1.0.23 → 1.0.25
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.
- checksums.yaml +4 -4
- data/lib/pennmarc/enriched.rb +1 -0
- data/lib/pennmarc/helpers/access.rb +8 -6
- data/lib/pennmarc/helpers/creator.rb +84 -21
- data/lib/pennmarc/helpers/identifier.rb +12 -0
- data/lib/pennmarc/helpers/subject.rb +10 -4
- data/lib/pennmarc/helpers/title.rb +39 -26
- data/lib/pennmarc/mappings/locations.yml +6 -0
- data/lib/pennmarc/version.rb +1 -1
- data/spec/lib/pennmarc/helpers/access_spec.rb +11 -0
- data/spec/lib/pennmarc/helpers/creator_spec.rb +33 -0
- data/spec/lib/pennmarc/helpers/identifer_spec.rb +14 -0
- data/spec/lib/pennmarc/helpers/subject_spec.rb +16 -0
- data/spec/lib/pennmarc/helpers/title_spec.rb +20 -0
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 8b540ecd84333f097b50a3682732229854b188fcde76921eb0ec184622a690dd
|
4
|
+
data.tar.gz: 9203fadee45b9ad65ec20880a1acbc23356000b748d32d07428ec093590cd55a
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 6770815e8f5f828c15451fc71c04dbef6a131203e8c58d721c063b15f218d5814a71b37fd6c4f088a9c7164d5d989ff6933abc820094068921f218c937a87410
|
7
|
+
data.tar.gz: 94eee63c29ae06151816a532a5afb7db1f27490de798651c909dc07fd0f33de1b4a1ee26057b6e3a8abc5d15c54d09709df8942e6e21ad828c1296fe3191725e
|
data/lib/pennmarc/enriched.rb
CHANGED
@@ -12,6 +12,7 @@ module PennMARC
|
|
12
12
|
PHYS_INVENTORY_TAG = 'hld'
|
13
13
|
ELEC_INVENTORY_TAG = 'prt'
|
14
14
|
ITEM_TAG = 'itm'
|
15
|
+
RELATED_RECORD_TAG = 'rel'
|
15
16
|
|
16
17
|
# Subfields for HLD tags
|
17
18
|
# Follow MARC 852 spec: https://www.loc.gov/marc/holdings/hd852.html, but names are translated into Alma parlance
|
@@ -5,14 +5,13 @@ module PennMARC
|
|
5
5
|
class Access < Helper
|
6
6
|
ONLINE = 'Online'
|
7
7
|
AT_THE_LIBRARY = 'At the library'
|
8
|
+
RESOURCE_LINK_BASE_URL = 'hdl.library.upenn.edu'
|
8
9
|
|
9
10
|
class << self
|
10
11
|
# Based on enhanced metadata fields added by Alma publishing process or API, determine if the record has
|
11
12
|
# electronic access or has physical holdings, and is therefore "Online" or "At the library". If a record is "At
|
12
13
|
# the library", but has a link to a finding aid in the 856 field (matching certain criteria), also add 'Online' as
|
13
14
|
# an access method.
|
14
|
-
# @todo What if none of these criteria match? Should we include "At the library" by default? Records with no value
|
15
|
-
# in this field would be lost if the user selects a facet value.
|
16
15
|
# @param [MARC::Record] record
|
17
16
|
# @return [Array]
|
18
17
|
def facet(record)
|
@@ -24,7 +23,7 @@ module PennMARC
|
|
24
23
|
return values if values.size == 2 # return early if all values are already present
|
25
24
|
|
26
25
|
# only check if ONLINE isn't already there
|
27
|
-
values << ONLINE if values.exclude?(ONLINE) &&
|
26
|
+
values << ONLINE if values.exclude?(ONLINE) && resource_link?(record)
|
28
27
|
values.uniq
|
29
28
|
end
|
30
29
|
|
@@ -44,20 +43,23 @@ module PennMARC
|
|
44
43
|
field.tag.in? [Enriched::Pub::PHYS_INVENTORY_TAG, Enriched::Api::PHYS_INVENTORY_TAG]
|
45
44
|
end
|
46
45
|
|
47
|
-
# Check if a record contains an 856 entry
|
46
|
+
# Check if a record contains an 856 entry with a Penn Handle server link meeting these criteria:
|
48
47
|
# 1. Indicator 1 is 4 (HTTP resource)
|
49
48
|
# 2. Indicator 2 is NOT 2 (indicating the linkage is to a "related" thing)
|
50
49
|
# 3. The URL specified in subfield u (URI) is a Penn Handle link
|
50
|
+
# 4. The subfield z does NOT include the string 'Finding aid'
|
51
51
|
# See: https://www.loc.gov/marc/bibliographic/bd856.html
|
52
|
+
# @note Some electronic records do not have Portfolios in Alma, so we rely upon the Resource Link in the 856 to
|
53
|
+
# get these records included in the Online category.
|
52
54
|
# @param [MARC::Record] record
|
53
55
|
# @return [Boolean]
|
54
|
-
def
|
56
|
+
def resource_link?(record)
|
55
57
|
record.fields('856').filter_map do |field|
|
56
58
|
next if field.indicator2 == '2' || field.indicator1 != '4'
|
57
59
|
|
58
60
|
subz = subfield_values(field, 'z')
|
59
61
|
subfield_values(field, 'u').filter_map do |value|
|
60
|
-
return true if subz.
|
62
|
+
return true if subz.exclude?('Finding aid') && value.include?(RESOURCE_LINK_BASE_URL)
|
61
63
|
end
|
62
64
|
end
|
63
65
|
false
|
@@ -21,6 +21,12 @@ module PennMARC
|
|
21
21
|
|
22
22
|
CONTRIBUTOR_TAGS = %w[700 710].freeze
|
23
23
|
|
24
|
+
FACET_SOURCE_MAP = {
|
25
|
+
100 => 'abcdjq', 110 => 'abcdjq', 111 => 'abcen',
|
26
|
+
700 => 'abcdjq', 710 => 'abcdjq', 711 => 'abcen',
|
27
|
+
800 => 'abcdjq', 810 => 'abcdjq', 811 => 'abcen'
|
28
|
+
}.freeze
|
29
|
+
|
24
30
|
# Author/Creator search field. Includes all subfield values (even ǂ0 URIs) from
|
25
31
|
# {https://www.oclc.org/bibformats/en/1xx/100.html 100 Main Entry--Personal Name} and
|
26
32
|
# {https://www.oclc.org/bibformats/en/1xx/110.html 110 Main Entry--Corporate Name}. Maps any relator codes found
|
@@ -51,19 +57,33 @@ module PennMARC
|
|
51
57
|
end
|
52
58
|
|
53
59
|
# Retrieve creator values for display from fields {https://www.loc.gov/marc/bibliographic/bd100.html 100}
|
54
|
-
# and {https://www.loc.gov/marc/bibliographic/bd110.html 110} and their linked alternates.
|
55
|
-
#
|
60
|
+
# and {https://www.loc.gov/marc/bibliographic/bd110.html 110} and their linked alternates. First, joins subfields
|
61
|
+
# other than $0, $1, $4, $6, $8, $e, and w. Then, appends any encoded relators found in $4.
|
62
|
+
# If there are no valid encoded relators, uses the value found in $e.
|
56
63
|
# @param [MARC::Record] record
|
57
64
|
# @return [Array<String>] array of author/creator values for display
|
58
65
|
def show(record, relator_map: Mappers.relator)
|
59
66
|
fields = record.fields(TAGS)
|
60
67
|
fields += record.fields('880').select { |field| subfield_value?(field, '6', /^(#{TAGS.join('|')})/) }
|
61
68
|
fields.filter_map { |field|
|
62
|
-
|
63
|
-
append_relator(field: field, joined_subfields: creator, relator_term_sf: 'e', relator_map: relator_map)
|
69
|
+
parse_show_value(field, relator_map: relator_map)
|
64
70
|
}.uniq
|
65
71
|
end
|
66
72
|
|
73
|
+
# Hash with main creator show values as the fields and the corresponding facet as the values.
|
74
|
+
# Does not include linked 880s.
|
75
|
+
# @param [MARC::Record] record
|
76
|
+
# @param [Hash] relator_map
|
77
|
+
# @return [Hash]
|
78
|
+
def show_facet_map(record, relator_map: Mappers.relator)
|
79
|
+
creators = record.fields(TAGS).filter_map do |field|
|
80
|
+
show = parse_show_value(field, relator_map: relator_map)
|
81
|
+
facet = parse_facet_value(field, FACET_SOURCE_MAP[field.tag.to_i].chars)
|
82
|
+
{ show: show, facet: facet }
|
83
|
+
end
|
84
|
+
creators.to_h { |h| [h[:show], h[:facet]] }
|
85
|
+
end
|
86
|
+
|
67
87
|
# All author/creator values for display (like #show, but multivalued?) - no 880 linkage
|
68
88
|
# Performs additional normalization of author names
|
69
89
|
# @note ported from get_author_creator_values (indexed as author_creator_a) - shown on results page
|
@@ -94,14 +114,9 @@ module PennMARC
|
|
94
114
|
# @param [MARC::Record] record
|
95
115
|
# @return [Array<String>] array of author/creator values for faceting
|
96
116
|
def facet(record)
|
97
|
-
|
98
|
-
100 => 'abcdjq', 110 => 'abcdjq', 111 => 'abcen',
|
99
|
-
700 => 'abcdjq', 710 => 'abcdjq', 711 => 'abcen',
|
100
|
-
800 => 'abcdjq', 810 => 'abcdjq', 811 => 'abcen'
|
101
|
-
}
|
102
|
-
source_map.flat_map { |field_num, subfields|
|
117
|
+
FACET_SOURCE_MAP.flat_map { |field_num, subfields|
|
103
118
|
record.fields(field_num.to_s).map do |field|
|
104
|
-
|
119
|
+
parse_facet_value(field, subfields.chars)
|
105
120
|
end
|
106
121
|
}.uniq
|
107
122
|
end
|
@@ -117,7 +132,11 @@ module PennMARC
|
|
117
132
|
}.uniq
|
118
133
|
end
|
119
134
|
|
120
|
-
# Conference detailed display, intended for record show page.
|
135
|
+
# Conference detailed display, intended for record show page. Retrieve conference values for record display from
|
136
|
+
# {https://www.loc.gov/marc/bibliographic/bd111.html 111}, {https://www.loc.gov/marc/bibliographic/bd711.html 711}
|
137
|
+
# , and their linked 880s. If there is no $i, we join subfield $i we join subfield values other than
|
138
|
+
# $0, $4, $5, $6, $8, $e, $j, and $w. to create the conference value. We then join the conference subunit value
|
139
|
+
# using subfields $e and $w. We append any relators, preferring those defined in $4 and using $j as a fallback.
|
121
140
|
# @note ported from get_conference_values
|
122
141
|
# @todo what is ǂi for?
|
123
142
|
# @param [MARC::Record] record
|
@@ -126,15 +145,7 @@ module PennMARC
|
|
126
145
|
conferences = record.fields(%w[111 711]).filter_map do |field|
|
127
146
|
next unless field.indicator2.in? ['', ' ']
|
128
147
|
|
129
|
-
|
130
|
-
join_subfields field, &subfield_not_in?(%w[0 4 5 6 8 e j w])
|
131
|
-
else
|
132
|
-
''
|
133
|
-
end
|
134
|
-
sub_unit = join_subfields(field, &subfield_in?(%w[e w]))
|
135
|
-
conf = [conf, sub_unit].compact_blank.join(' ')
|
136
|
-
|
137
|
-
append_relator(field: field, joined_subfields: conf, relator_term_sf: 'j', relator_map: relator_map)
|
148
|
+
parse_conference_detail_show_value(field, relator_map: relator_map)
|
138
149
|
end
|
139
150
|
conferences += record.fields('880').filter_map do |field|
|
140
151
|
next unless subfield_value? field, '6', /^(111|711)/
|
@@ -150,6 +161,24 @@ module PennMARC
|
|
150
161
|
conferences.uniq
|
151
162
|
end
|
152
163
|
|
164
|
+
# Return hash of detailed conference values mapped to their corresponding facets from fields
|
165
|
+
# {https://www.loc.gov/marc/bibliographic/bd111.html 111} and
|
166
|
+
# {https://www.loc.gov/marc/bibliographic/bd711.html 711}. Does not include linked 880s.
|
167
|
+
# @param [MARC::Record] record
|
168
|
+
# @param [Hash] relator_map
|
169
|
+
# @return [Hash]
|
170
|
+
def conference_detail_show_facet_map(record, relator_map: Mappers.relator)
|
171
|
+
conferences = record.fields(%w[111 711]).filter_map do |field|
|
172
|
+
next unless field.indicator2.in? ['', ' ']
|
173
|
+
|
174
|
+
show = parse_conference_detail_show_value(field, relator_map: relator_map)
|
175
|
+
facet = parse_facet_value(field, FACET_SOURCE_MAP[field.tag.to_i].chars)
|
176
|
+
{ show: show, facet: facet }
|
177
|
+
end
|
178
|
+
|
179
|
+
conferences.to_h { |conf| [conf[:show], conf[:facet]] }
|
180
|
+
end
|
181
|
+
|
153
182
|
# Conference name values for searching
|
154
183
|
# @param [MARC::Record] record
|
155
184
|
# @return [Array<String>]
|
@@ -264,6 +293,40 @@ module PennMARC
|
|
264
293
|
before_comma = substring_before(name, ', ')
|
265
294
|
"#{after_comma} #{before_comma}".squish
|
266
295
|
end
|
296
|
+
|
297
|
+
# Parse creator facet value from given creator field and desired subfields
|
298
|
+
# @param [MARC::Field] field
|
299
|
+
# @param [Array<String>] subfields
|
300
|
+
# @return [String]
|
301
|
+
def parse_facet_value(field, subfields)
|
302
|
+
trim_punctuation(join_subfields(field, &subfield_in?(subfields)))
|
303
|
+
end
|
304
|
+
|
305
|
+
# Parse creator show value from given main creator fields (100/110).
|
306
|
+
# @param [MARC::Field] field
|
307
|
+
# @param [Hash] relator_map
|
308
|
+
# @return [String]
|
309
|
+
def parse_show_value(field, relator_map: Mappers.relator)
|
310
|
+
creator = join_subfields(field, &subfield_not_in?(%w[0 1 4 6 8 e w]))
|
311
|
+
append_relator(field: field, joined_subfields: creator, relator_term_sf: 'e', relator_map: relator_map)
|
312
|
+
end
|
313
|
+
|
314
|
+
# Parse detailed conference show value from given conference field (111/711). If there is no $i, we join subfield
|
315
|
+
# values other than $0, $4, $5, $6, $8, $e, $j, and $w to create conference value. We join subfields $e and $w to
|
316
|
+
# determine the subunit value. We append any relators, preferring those defined in $4 and using $j as a fallback.
|
317
|
+
# @param [MARC::Field] field
|
318
|
+
# @return [String]
|
319
|
+
def parse_conference_detail_show_value(field, relator_map: Mappers.relator)
|
320
|
+
conf = if subfield_undefined? field, 'i'
|
321
|
+
join_subfields field, &subfield_not_in?(%w[0 4 5 6 8 e j w])
|
322
|
+
else
|
323
|
+
''
|
324
|
+
end
|
325
|
+
sub_unit = join_subfields(field, &subfield_in?(%w[e w]))
|
326
|
+
conf = [conf, sub_unit].compact_blank.join(' ')
|
327
|
+
|
328
|
+
append_relator(field: field, joined_subfields: conf, relator_term_sf: 'j', relator_map: relator_map)
|
329
|
+
end
|
267
330
|
end
|
268
331
|
end
|
269
332
|
end
|
@@ -159,6 +159,18 @@ module PennMARC
|
|
159
159
|
}.uniq
|
160
160
|
end
|
161
161
|
|
162
|
+
# Gets any Host record MMS ID values from an Enriched::Pub::RELATED_RECORD_TAG field added during Alma enrichment.
|
163
|
+
# This aids in our handling of "bound with" records.
|
164
|
+
# @param [MARC::Record] record
|
165
|
+
# @return [Array<String>]
|
166
|
+
def host_record_id(record)
|
167
|
+
record.fields(Enriched::Pub::RELATED_RECORD_TAG).filter_map { |field|
|
168
|
+
next unless subfield_value?(field, 'c', /contains/i)
|
169
|
+
|
170
|
+
subfield_values field, :w
|
171
|
+
}.flatten.uniq
|
172
|
+
end
|
173
|
+
|
162
174
|
private
|
163
175
|
|
164
176
|
# Determine if subfield 'a' is an OCLC id.
|
@@ -18,7 +18,7 @@ module PennMARC
|
|
18
18
|
# - 2: MeSH
|
19
19
|
# - 4: Source not specified (local?)
|
20
20
|
# - 7: Source specified in ǂ2
|
21
|
-
|
21
|
+
VALID_SOURCE_INDICATORS = %w[0 1 2 4 7].freeze
|
22
22
|
|
23
23
|
# Tags that serve as sources for Subject facet values
|
24
24
|
DISPLAY_TAGS = %w[600 610 611 630 650 651].freeze
|
@@ -27,7 +27,7 @@ module PennMARC
|
|
27
27
|
LOCAL_TAGS = %w[690 691 697].freeze
|
28
28
|
|
29
29
|
# All Subjects for searching. This includes most subfield content from any field contained in {SEARCH_TAGS} or
|
30
|
-
# 69X, including any linked 880 fields. Fields must have an indicator2 value in {
|
30
|
+
# 69X, including any linked 880 fields. Fields must have an indicator2 value in {VALID_SOURCE_INDICATORS}.
|
31
31
|
# @todo this includes subfields that may not be desired like 1 (uri) and 2 (source code) but this might be OK for
|
32
32
|
# a search (non-display) field?
|
33
33
|
# @param [Hash] relator_map
|
@@ -179,12 +179,18 @@ module PennMARC
|
|
179
179
|
end
|
180
180
|
end
|
181
181
|
|
182
|
-
# Is a field intended for display in a general subject field
|
182
|
+
# Is a field intended for display in a general subject field? To be included, the field tag is in either
|
183
|
+
# {DISPLAY_TAGS} or {LOCAL_TAGS}, and has an indicator 2 value that is in {VALID_SOURCE_INDICATORS}. If
|
184
|
+
# indicator 2 is '7' - indicating "source specified", the specified source must be in our approved source code
|
185
|
+
# list.
|
186
|
+
# @see Util.valid_subject_genre_source_code?
|
183
187
|
# @param [MARC::DataField] field
|
184
188
|
# @return [Boolean] whether a MARC field is intended for display under general "Subjects"
|
185
189
|
def subject_general_display_field?(field)
|
186
190
|
return false unless field.tag.in?(DISPLAY_TAGS + LOCAL_TAGS) && field.respond_to?(:indicator2)
|
187
191
|
|
192
|
+
return false if field.indicator2.present? && !field.indicator2.in?(VALID_SOURCE_INDICATORS)
|
193
|
+
|
188
194
|
return false if field.indicator2 == '7' && !valid_subject_genre_source_code?(field)
|
189
195
|
|
190
196
|
true
|
@@ -278,7 +284,7 @@ module PennMARC
|
|
278
284
|
# @param [MARC::DataField] field
|
279
285
|
# @return [Boolean]
|
280
286
|
def subject_search_field?(field)
|
281
|
-
return false unless field.respond_to?(:indicator2) &&
|
287
|
+
return false unless field.respond_to?(:indicator2) && VALID_SOURCE_INDICATORS.include?(field.indicator2)
|
282
288
|
|
283
289
|
tag = if field.tag == '880'
|
284
290
|
subfield_values(field, '6').first
|
@@ -3,33 +3,36 @@
|
|
3
3
|
module PennMARC
|
4
4
|
# This helper contains logic for parsing out Title and Title-related fields.
|
5
5
|
class Title < Helper
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
6
|
+
# We use these fields when retrieving auxiliary titles in the *search_aux methods:
|
7
|
+
# {https://www.loc.gov/marc/bibliographic/bd130.html 130},
|
8
|
+
# {https://www.loc.gov/marc/bibliographic/bd210.html 210},
|
9
|
+
# {https://www.loc.gov/marc/bibliographic/bd245.html 245},
|
10
|
+
# {https://www.loc.gov/marc/bibliographic/bd246.html 246},
|
11
|
+
# {https://www.loc.gov/marc/bibliographic/bd247.html 247},
|
12
|
+
# {https://www.loc.gov/marc/bibliographic/bd440.html 440},
|
13
|
+
# {https://www.loc.gov/marc/bibliographic/bd490.html 490},
|
14
|
+
# {https://www.loc.gov/marc/bibliographic/bd730.html 730},
|
15
|
+
# {https://www.loc.gov/marc/bibliographic/bd740.html 740},
|
16
|
+
# {https://www.loc.gov/marc/bibliographic/bd830.html 830},
|
17
|
+
# {https://www.loc.gov/marc/bibliographic/bd773.html 773},
|
18
|
+
# {https://www.loc.gov/marc/bibliographic/bd774.html 774},
|
19
|
+
# {https://www.loc.gov/marc/bibliographic/bd780.html 780},
|
20
|
+
# {https://www.loc.gov/marc/bibliographic/bd785.html 785},
|
21
|
+
# {https://www.loc.gov/marc/bibliographic/bd700.html 700},
|
22
|
+
# {https://www.loc.gov/marc/bibliographic/bd710.html 710},
|
23
|
+
# {https://www.loc.gov/marc/bibliographic/bd711.html 711},
|
24
|
+
# {https://www.loc.gov/marc/bibliographic/bd505.html 505}
|
25
|
+
AUX_TITLE_TAGS = {
|
26
|
+
main: %w[130 210 240 245 246 247 440 490 730 740 830],
|
27
|
+
related: %w[773 774 780 785],
|
28
|
+
entity: %w[700 710 711],
|
29
|
+
note: %w[505]
|
30
|
+
}.freeze
|
31
|
+
|
32
|
+
# This text is used in Alma to indicate a Bib record is a "Host" record for other bibs (bound-withs)
|
33
|
+
HOST_BIB_TITLE = 'Host bibliographic record for boundwith'
|
32
34
|
|
35
|
+
class << self
|
33
36
|
# Main Title Search field. Takes from {https://www.loc.gov/marc/bibliographic/bd245.html 245} and linked 880.
|
34
37
|
# @note Ported from get_title_1_search_values.
|
35
38
|
# @param [MARC::Record] record
|
@@ -217,6 +220,16 @@ module PennMARC
|
|
217
220
|
}.uniq
|
218
221
|
end
|
219
222
|
|
223
|
+
# Determine if the record is a "Host" bibliographic record for other bib records ("bound-withs")
|
224
|
+
# @param [MARC::Record] record
|
225
|
+
# @return [Boolean]
|
226
|
+
def host_bib_record?(record)
|
227
|
+
record.fields('245').any? do |f|
|
228
|
+
title = join_subfields(f, &subfield_in?(%w[a]))
|
229
|
+
title.include?(HOST_BIB_TITLE)
|
230
|
+
end
|
231
|
+
end
|
232
|
+
|
220
233
|
private
|
221
234
|
|
222
235
|
# Create prefix/filing hash for representing a title value with filing characters removed, with special
|
@@ -547,6 +547,12 @@ dent:
|
|
547
547
|
- Health Sciences Libraries
|
548
548
|
- Levy Dental Medicine Library
|
549
549
|
display: Levy Dental Medicine Library - Stacks
|
550
|
+
dentpcare:
|
551
|
+
specific_location: Levy Dental Medicine Library - PCare
|
552
|
+
library:
|
553
|
+
- Health Sciences Libraries
|
554
|
+
- Levy Dental Medicine Library
|
555
|
+
display: Levy Dental Medicine Library - PCare
|
550
556
|
dentrare:
|
551
557
|
specific_location: Levy Dental Medicine Library - Rare Books
|
552
558
|
library:
|
data/lib/pennmarc/version.rb
CHANGED
@@ -69,6 +69,17 @@ describe 'PennMARC::Access' do
|
|
69
69
|
{ z: 'Finding aid', u: 'http://hdl.library.upenn.edu/1017/d/pacscl/UPENN_RBML_MsColl200' }
|
70
70
|
end
|
71
71
|
|
72
|
+
it 'does not include online access' do
|
73
|
+
expect(helper.facet(record)).to contain_exactly(PennMARC::Access::AT_THE_LIBRARY)
|
74
|
+
end
|
75
|
+
end
|
76
|
+
|
77
|
+
context 'with an 856 describing a resource link' do
|
78
|
+
let(:indicators) { { indicator1: '4', indicator2: '1' } }
|
79
|
+
let(:location_and_access_subfields) do
|
80
|
+
{ z: 'Connect to resource', u: 'http://hdl.library.upenn.edu/1234' }
|
81
|
+
end
|
82
|
+
|
72
83
|
it 'includes online access' do
|
73
84
|
expect(helper.facet(record)).to contain_exactly(PennMARC::Access::ONLINE, PennMARC::Access::AT_THE_LIBRARY)
|
74
85
|
end
|
@@ -95,6 +95,23 @@ describe 'PennMARC::Creator' do
|
|
95
95
|
end
|
96
96
|
end
|
97
97
|
|
98
|
+
describe '.show_facet_map' do
|
99
|
+
let(:record) do
|
100
|
+
marc_record fields: [
|
101
|
+
marc_field(tag: '100', subfields: { a: 'Surname, Name', '0': 'http://cool.uri/12345', d: '1900-2000',
|
102
|
+
e: 'author.', '4': 'http://cool.uri/vocabulary/relators/aut' }),
|
103
|
+
marc_field(tag: '110', subfields: { a: 'Group of People', b: 'Annual Meeting', '4': 'aut' }),
|
104
|
+
marc_field(tag: '880', subfields: { a: 'Ignore', '6': '100' })
|
105
|
+
]
|
106
|
+
end
|
107
|
+
|
108
|
+
it 'returns expected hash' do
|
109
|
+
values = helper.show_facet_map(record, relator_map: mapping)
|
110
|
+
expect(values).to eq({ 'Surname, Name 1900-2000, author.' => 'Surname, Name 1900-2000',
|
111
|
+
'Group of People Annual Meeting, Author.' => 'Group of People Annual Meeting' })
|
112
|
+
end
|
113
|
+
end
|
114
|
+
|
98
115
|
describe '.show_aux' do
|
99
116
|
let(:record) { marc_record fields: fields }
|
100
117
|
|
@@ -257,6 +274,22 @@ describe 'PennMARC::Creator' do
|
|
257
274
|
end
|
258
275
|
end
|
259
276
|
|
277
|
+
describe '.conference_detail_show_facet_map' do
|
278
|
+
let(:record) do
|
279
|
+
marc_record fields: [
|
280
|
+
marc_field(tag: '111', subfields: { a: 'Council of Trent', d: '(1545-1563 :', c: 'Trento, Italy)' }),
|
281
|
+
marc_field(tag: '711', subfields: { a: 'Code4Lib', n: '(18th :', d: '2024 :', c: 'Ann Arbor, MI)' }),
|
282
|
+
marc_field(tag: '880', subfields: { a: 'Alt Ignore', '6': '111' })
|
283
|
+
]
|
284
|
+
end
|
285
|
+
|
286
|
+
it 'returns the expected hash' do
|
287
|
+
value = helper.conference_detail_show_facet_map(record)
|
288
|
+
expect(value).to eq({ 'Council of Trent (1545-1563 : Trento, Italy)' => 'Council of Trent Trento, Italy)',
|
289
|
+
'Code4Lib (18th : 2024 : Ann Arbor, MI)' => 'Code4Lib (18th : Ann Arbor, MI)' })
|
290
|
+
end
|
291
|
+
end
|
292
|
+
|
260
293
|
describe '.conference_search' do
|
261
294
|
let(:record) do
|
262
295
|
marc_record fields: [
|
@@ -161,4 +161,18 @@ describe 'PennMARC::Identifier' do
|
|
161
161
|
'10.1038/sdata.2016.18', '10.18574/9781479842865')
|
162
162
|
end
|
163
163
|
end
|
164
|
+
|
165
|
+
describe '.host_record_id' do
|
166
|
+
let(:record) do
|
167
|
+
marc_record fields: [
|
168
|
+
marc_field(tag: PennMARC::Enriched::Pub::RELATED_RECORD_TAG, subfields: { w: '123456789', c: 'Contains',
|
169
|
+
a: 'Title' }),
|
170
|
+
marc_field(tag: PennMARC::Enriched::Pub::RELATED_RECORD_TAG, subfields: { w: '666666666', c: 'Contained In' })
|
171
|
+
]
|
172
|
+
end
|
173
|
+
|
174
|
+
it 'returns only the desired host record MMS ID values' do
|
175
|
+
expect(helper.host_record_id(record)).to contain_exactly '123456789'
|
176
|
+
end
|
177
|
+
end
|
164
178
|
end
|
@@ -288,6 +288,22 @@ describe 'PennMARC::Subject' do
|
|
288
288
|
'Early works to 1950.')
|
289
289
|
end
|
290
290
|
end
|
291
|
+
|
292
|
+
context 'with a mix of allowed and disallowed heading sources' do
|
293
|
+
let(:fields) do
|
294
|
+
[marc_field(tag: '650', indicator2: '7', subfields: {
|
295
|
+
'2': 'fast',
|
296
|
+
a: 'Philosophy in motion pictures.',
|
297
|
+
'0': 'http://id.loc.gov/authorities/subjects/sh92003501'
|
298
|
+
}),
|
299
|
+
marc_field(tag: '650', indicator2: '7', subfields: { '2': 'gnd', a: 'Filmästhetik.' }),
|
300
|
+
marc_field(tag: '650', indicator2: '6', subfields: { a: 'Cinéma et arts.' })]
|
301
|
+
end
|
302
|
+
|
303
|
+
it 'includes only permitted headings from approved ontologies' do
|
304
|
+
expect(values).to contain_exactly 'Philosophy in motion pictures.'
|
305
|
+
end
|
306
|
+
end
|
291
307
|
end
|
292
308
|
|
293
309
|
describe '.childrens_show' do
|
@@ -249,4 +249,24 @@ describe 'PennMARC::Title' do
|
|
249
249
|
expect(values).not_to include 'Linkage', '247'
|
250
250
|
end
|
251
251
|
end
|
252
|
+
|
253
|
+
describe '.host_bib_record?' do
|
254
|
+
let(:record) { marc_record fields: [marc_field(tag: '245', subfields: subfields)] }
|
255
|
+
|
256
|
+
context 'with a host record' do
|
257
|
+
let(:subfields) { { a: "#{PennMARC::Title::HOST_BIB_TITLE} for 123456789" } }
|
258
|
+
|
259
|
+
it 'returns true' do
|
260
|
+
expect(helper.host_bib_record?(record)).to be true
|
261
|
+
end
|
262
|
+
end
|
263
|
+
|
264
|
+
context 'with a non-host record' do
|
265
|
+
let(:subfields) { { a: 'Regular record' } }
|
266
|
+
|
267
|
+
it 'returns false' do
|
268
|
+
expect(helper.host_bib_record?(record)).to be false
|
269
|
+
end
|
270
|
+
end
|
271
|
+
end
|
252
272
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: pennmarc
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0.
|
4
|
+
version: 1.0.25
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Mike Kanning
|
@@ -10,7 +10,7 @@ authors:
|
|
10
10
|
autorequire:
|
11
11
|
bindir: bin
|
12
12
|
cert_chain: []
|
13
|
-
date: 2024-06-
|
13
|
+
date: 2024-06-26 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: activesupport
|