pennmarc 1.0.23 → 1.0.24

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 7c906223a9bcdb4ba4792ac50462b8c57e41e71fa1e83cd8e63018d360ebfe0a
4
- data.tar.gz: 5d1a420e07734370c95ab1f83d3c519a1d75a7faaa807f1d3ee436808779c586
3
+ metadata.gz: 59881d630f244bc6d8b76665df84f4b22297de2d51c44f5272df4226f4e27e75
4
+ data.tar.gz: 8d4e78c359dea40f482adc5b4deaa3fbb75bbe15a4fce5955ad48de054ce82c4
5
5
  SHA512:
6
- metadata.gz: 32e47c254c1a2bb78e861003c864bdbc22833439cff22ebe00148df081c74fed85f60e2f743b5ea65065e5db576e3a304710b1a68b2cdc1e08a1a5f7808e5fc3
7
- data.tar.gz: 6051840a95afdcb41640abf2c42ce699deddc93970c5d117cb445474d4f5998996ee05651ec1e59da3e45886e00f6c058b881b1bf9103de92deb5cf6d868ce80
6
+ metadata.gz: 4a3a43ff1cecadf978a8c50d59b382c2592925116cacd757f368ea0a698e9b370a94e74fd98e1a6a06a3b837ab0dbdce2efece991aaf3da4b53c74396a73ee2e
7
+ data.tar.gz: 7f5468f9891c9fe15003160fb4d5a6c04cd8291ead5e803f0652368376e1fd67381195a7bdffd7ea9a7aa996c071b75240405dd956c46d879753f6811eca1b0a
@@ -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. Appends any encoded
55
- # relationships found in $4. If there are no valid encoded relationships, uses the value found in $e.
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
- creator = join_subfields(field, &subfield_not_in?(%w[0 1 4 6 8 e w]))
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
- source_map = {
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
- trim_punctuation(join_subfields(field, &subfield_in?(subfields.chars)))
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
- conf = if subfield_undefined? field, 'i'
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
@@ -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:
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module PennMARC
4
- VERSION = '1.0.23'
4
+ VERSION = '1.0.24'
5
5
  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: [
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.23
4
+ version: 1.0.24
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-04 00:00:00.000000000 Z
13
+ date: 2024-06-18 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: activesupport