pennmarc 1.0.23 → 1.0.24

Sign up to get free protection for your applications and to get access to all the features.
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