pennmarc 1.1.1 → 1.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 9003d5a58efd2cbef83a220bd0d609edfdc2bfb883378c003d0bafa2d85e520e
4
- data.tar.gz: d8f841dbba9e412848b31a7a11284b14e2bbb772fbb98762b827ab9e2baf6355
3
+ metadata.gz: b7c380943acc4f69a8a7555260d122aa77046b2ab62a2f73e1b3559740bd409b
4
+ data.tar.gz: 0cc7fb1a1860265fb9bb2fcd637966d0d2972e6496a79545328649fa27fc1445
5
5
  SHA512:
6
- metadata.gz: a45d1e909a7a9efad1aec8047d79f3358b1ee3b523958661459c27b397f3a0f33c00deffeae2bdd30fad14156b8f348171639375677e6f600086e1b592fe2c51
7
- data.tar.gz: ba609fef49f12f9341328fc292cc510fab6ab298174791afc99ec802ecd1c62448c9ccc009a7f01c6aefef7be2c56d794cc5f2e0bddf01c72fc4e9db11ce6961
6
+ metadata.gz: 0265623f80ef1573fdf1d5c2a6a62636291a8edc4e7d06350238b3133071b30cd01a58a9679047578546e856f166ac6df9a9e413c562fafff60eecfc6eb12b93
7
+ data.tar.gz: aea9b53a26a97e7ff018fda2aacb6101bfb1c21585ac663fcbbdfba7084235de148643b9b03cc1478e230944ce3d45be641189f9852c6b88d7017da00c652bbc
data/.rubocop_todo.yml CHANGED
@@ -1,6 +1,6 @@
1
1
  # This configuration was generated by
2
2
  # `rubocop --auto-gen-config --auto-gen-only-exclude --exclude-limit 10000`
3
- # on 2024-08-20 20:46:53 UTC using RuboCop version 1.51.0.
3
+ # on 2024-08-30 16:12:14 UTC using RuboCop version 1.51.0.
4
4
  # The point is for the user to remove these configuration records
5
5
  # one by one as the offenses are removed from the code base.
6
6
  # Note that changes in the inspected code, or installation of new
@@ -138,7 +138,7 @@ RSpec/FilePath:
138
138
  Exclude:
139
139
  - 'spec/lib/pennmarc/parser_spec.rb'
140
140
 
141
- # Offense count: 26
141
+ # Offense count: 27
142
142
  # Configuration parameters: Max, AllowedGroups.
143
143
  RSpec/NestedGroups:
144
144
  Exclude:
@@ -35,6 +35,23 @@ module PennMARC
35
35
  series_values.uniq
36
36
  end
37
37
 
38
+ # Hash that associates {https://www.loc.gov/marc/bibliographic/bd830.html 830} and
39
+ # {https://www.loc.gov/marc/bibliographic/bd440.html 440} show values to query values to make building fielded
40
+ # search links easier in the downstream app.
41
+ # @param record [MARC::Record]
42
+ # @return [Hash]
43
+ def show_query_map(record)
44
+ record.fields(%w[830 440]).each_with_object({}) do |field, hash|
45
+ show_values = title_show_entries(record, field.tag) + [remaining_show_value(field)]
46
+
47
+ query_value = trim_punctuation(join_subfields(field, &subfield_in?(%w[a n p])))
48
+
49
+ show_values.each do |show_value|
50
+ hash[show_value] = query_value
51
+ end
52
+ end
53
+ end
54
+
38
55
  # Values from series fields for display.
39
56
  # @param record [MARC::Record]
40
57
  # @param relator_map [Hash]
@@ -141,10 +158,10 @@ module PennMARC
141
158
  # @note added 2017/04/10: filter out 0 (authority record numbers) added by Alma
142
159
  # @param record [MARC::Record]
143
160
  # @param tags_present [Array<String>]
144
- # @return [Array<Hash>] array of remaining show entry hashes
161
+ # @return [Array<String>] array of remaining show entry hashes
145
162
  def remaining_show_entries(record, tags_present)
146
163
  record.fields(tags_present.drop(1)).map do |field|
147
- join_subfields(field, &subfield_not_in?(%w[0 5 6 8]))
164
+ remaining_show_value(field)
148
165
  end || []
149
166
  end
150
167
 
@@ -200,6 +217,13 @@ module PennMARC
200
217
  join_subfields(field, &subfield_in?(%w[i a s t n d]))
201
218
  end
202
219
  end
220
+
221
+ # Parse the value for a given remaining show field
222
+ # @param field [MARC::Field]
223
+ # @return [String]
224
+ def remaining_show_value(field)
225
+ join_subfields(field, &subfield_not_in?(%w[0 5 6 8]))
226
+ end
203
227
  end
204
228
  end
205
229
  end
@@ -88,7 +88,6 @@ module PennMARC
88
88
  # Single-valued Title, for use in headings. Takes the first {https://www.oclc.org/bibformats/en/2xx/245.html 245}
89
89
  # value. Special consideration for
90
90
  # {https://www.oclc.org/bibformats/en/2xx/245.html#punctuation punctuation practices}.
91
- # @todo still consider ǂh? medium, which OCLC doc says DO NOT USE...but that is OCLC...
92
91
  # @todo is punctuation handling still as desired? treatment here is described in spreadsheet from 2011
93
92
  # @param record [MARC::Record]
94
93
  # @return [String] single title for display
@@ -98,15 +97,14 @@ module PennMARC
98
97
  [format_title(values[:title_or_form]), values[:punctuation], values[:other_info]].compact_blank.join(' ')
99
98
  end
100
99
 
101
- # Same as show, but with inclusive dates appended. For use on show page.
100
+ # Same as show, but with all subfields included as found - except for subfield c.
102
101
  # @param record [MARC::Record]
103
102
  # @return [String] detailed title for display
104
103
  def detailed_show(record)
105
104
  field = record.fields('245')&.first
106
- values = title_values(field)
107
- title = [format_title(values[:title_or_form]), values[:punctuation],
108
- trim_trailing(:period, values[:other_info])].compact_blank.join(' ')
109
- values[:inclusive_dates].present? ? [title, values[:inclusive_dates]].compact_blank.join(', ') : title
105
+ return unless field
106
+
107
+ join_subfields(field, &subfield_not_in?(%w[6 8]))
110
108
  end
111
109
 
112
110
  # Same structure as show, but linked alternate title.
@@ -124,17 +122,6 @@ module PennMARC
124
122
  [format_title(values[:title_or_form]), values[:punctuation], values[:other_info]].compact_blank.join(' ')
125
123
  end
126
124
 
127
- # Title statement of responsibility (field 245, subfield c) and linked alternate for display.
128
- # See https://www.oclc.org/bibformats/en/2xx/245.html#subfieldc for examples
129
- # @param [MARC::Record] record
130
- # @return [Array<String>] statement of responsibility and linked alternate
131
- def statement_of_responsibility_show(record)
132
- field = record.fields('245').first
133
- statement = field&.find { |sf| sf.code == 'c' }&.value
134
- alternate_statement = linked_alternate(record, '245', &subfield_in?(%w[c]))&.first
135
- [statement, alternate_statement].compact_blank
136
- end
137
-
138
125
  # Canonical title with non-filing characters relocated to the end.
139
126
  #
140
127
  # @note Currently we index two "title sort" fields: title_nssort (ssort type - regex token filter applied) and
@@ -269,7 +256,6 @@ module PennMARC
269
256
  title_or_form = field.find_all(&subfield_in?(%w[a k]))
270
257
  .map { |sf| trim_trailing(:comma, trim_trailing(:slash, sf.value).rstrip) }
271
258
  .first || ''
272
- inclusive_dates = field.find { |sf| sf.code == 'f' }&.value
273
259
  other_info = field.find_all(&subfield_in?(%w[b n p]))
274
260
  .map { |sf| trim_trailing(:slash, sf.value) }
275
261
  .join(' ')
@@ -283,7 +269,6 @@ module PennMARC
283
269
  [title_punctuation, medium_punctuation].include?(':') ? ':' : nil
284
270
  end
285
271
  { title_or_form: title_or_form,
286
- inclusive_dates: inclusive_dates,
287
272
  other_info: other_info,
288
273
  punctuation: punctuation }
289
274
  end
@@ -62,9 +62,9 @@ britimp:
62
62
  display: Athenaeum of Philadelphia - British Imprints
63
63
  aeon: true
64
64
  carpco:
65
- specific_location: Athenaeum of Philadelphia - Carpenters' Company
66
- library: Athenaeum of Philadelphia
67
- display: Athenaeum of Philadelphia - Carpenters' Company
65
+ specific_location: Carpenters' Company of the City and County of Philadelphia
66
+ library: Special Collections
67
+ display: Carpenters' Company of the City and County of Philadelphia
68
68
  aeon: true
69
69
  catoffice:
70
70
  specific_location: Athenaeum of Philadelphia - Cataloging Office
@@ -160,12 +160,16 @@ vismatl:
160
160
  aeon: true
161
161
  athstor:
162
162
  specific_location: LIBRA - Athenaeum of Philadelphia
163
- library: LIBRA
163
+ library:
164
+ - LIBRA
165
+ - Athenaeum of Philadelphia
164
166
  display: LIBRA - Athenaeum of Philadelphia
165
167
  aeon: true
166
168
  athstorcir:
167
169
  specific_location: LIBRA - Athenaeum of Philadelphia Circulating
168
- library: LIBRA
170
+ library:
171
+ - LIBRA
172
+ - Athenaeum of Philadelphia
169
173
  display: LIBRA - Athenaeum of Philadelphia Circulating
170
174
  biom:
171
175
  specific_location: Holman Biotech Commons
@@ -594,10 +598,6 @@ dncirc:
594
598
  - Health Sciences Libraries
595
599
  - Levy Dental Medicine Library
596
600
  display: Levy Dental Medicine Library - Circulation
597
- easiacmx:
598
- specific_location: Van Pelt - East Asia Comics
599
- library: Van Pelt-Dietrich Library Center
600
- display: Van Pelt - East Asia Comics
601
601
  easiaover:
602
602
  specific_location: Van Pelt - East Asia Oversize
603
603
  library: Van Pelt-Dietrich Library Center
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module PennMARC
4
- VERSION = '1.1.1'
4
+ VERSION = '1.2.1'
5
5
  end
@@ -15,6 +15,24 @@ describe 'PennMARC::Series' do
15
15
  marc_record fields: [marc_field(tag: '666', subfields: { a: 'test' })]
16
16
  end
17
17
 
18
+ describe '.show_query_map' do
19
+ let(:record) do
20
+ marc_record fields: [
21
+ marc_field(tag: '440', subfields: { a: 'Teachings of the feathered pillow', n: 'number', p: 'section' }),
22
+ marc_field(tag: '490', subfields: { a: 'Ignored' }),
23
+ marc_field(tag: '830', subfields: { a: 'International litigation in practice', v: 'volume 13.' })
24
+ ]
25
+ end
26
+
27
+ it 'returns expected hash' do
28
+ expect(helper.show_query_map(record)).to eq(
29
+ { 'Teachings of the feathered pillow number section' => 'Teachings of the feathered pillow number section',
30
+ 'Teachings of the feathered pillow section number' => 'Teachings of the feathered pillow number section',
31
+ 'International litigation in practice volume 13.' => 'International litigation in practice' }
32
+ )
33
+ end
34
+ end
35
+
18
36
  describe '.show' do
19
37
  it 'returns the series values for display' do
20
38
  expect(helper.show(record, relator_map: mapping)).to contain_exactly(
@@ -139,15 +139,44 @@ describe 'PennMARC::Title' do
139
139
  end
140
140
 
141
141
  describe '.detailed_show' do
142
- let(:record) do
143
- marc_record fields: [
144
- marc_field(tag: '245', subfields: { k: 'Letters', f: '1972-1982', b: 'to Lewis Mumford.' })
145
- ]
146
- end
147
-
148
142
  context 'with subfields ǂk, ǂf and ǂc' do
143
+ let(:record) do
144
+ marc_record fields: [
145
+ marc_field(tag: '245', subfields: { k: 'Letters,', f: '1972-1982,', b: 'to Lewis Mumford.' })
146
+ ]
147
+ end
148
+
149
149
  it 'returns detailed title values' do
150
- expect(helper.detailed_show(record)).to eq 'Letters to Lewis Mumford, 1972-1982'
150
+ expect(helper.detailed_show(record)).to eq 'Letters, 1972-1982, to Lewis Mumford.'
151
+ end
152
+ end
153
+
154
+ context 'with subfields ǂk and ǂb' do
155
+ let(:record) do
156
+ marc_record fields: [
157
+ marc_field(tag: '245', subfields: { k: 'Letters', b: 'to Lewis Mumford.' })
158
+ ]
159
+ end
160
+
161
+ it 'returns title value without dates' do
162
+ expect(helper.detailed_show(record)).to eq 'Letters to Lewis Mumford.'
163
+ end
164
+ end
165
+
166
+ # e.g., 9977704838303681
167
+ context 'with ǂa containing an " : " as well as inclusive dates' do
168
+ let(:record) do
169
+ marc_record fields: [
170
+ marc_field(tag: '245', subfields: { a: 'The frugal housewife : ',
171
+ b: 'dedicated to those who are not ashamed of economy, ',
172
+ f: '1830 / ', c: 'by the author of Hobomok.' })
173
+ ]
174
+ end
175
+
176
+ it 'returns single title value with text from ǂa and ǂn' do
177
+ expect(helper.detailed_show(record)).to eq(
178
+ 'The frugal housewife : dedicated to those who are not ashamed of economy, 1830 / by the author of Hobomok.'
179
+ )
151
180
  end
152
181
  end
153
182
  end
@@ -179,25 +208,6 @@ describe 'PennMARC::Title' do
179
208
  end
180
209
  end
181
210
 
182
- describe '.statement_of_responsibility_show' do
183
- let(:record) do
184
- marc_record fields: [marc_field(tag: '245', subfields: { c: 'statement of responsibility' }),
185
- marc_field(tag: '880', subfields: { '6': '245', c: 'déclaration de responsabilité' })]
186
- end
187
-
188
- context 'with ǂc defined' do
189
- it 'returns statement of responsibility' do
190
- expect(helper.statement_of_responsibility_show(record)).to include 'statement of responsibility'
191
- end
192
- end
193
-
194
- context 'with linked alternate of 245 ǂc defined' do
195
- it 'returns alternate statement of responsibility' do
196
- expect(helper.statement_of_responsibility_show(record)).to include 'déclaration de responsabilité'
197
- end
198
- end
199
- end
200
-
201
211
  describe '.sort' do
202
212
  context 'with a record with a valid indicator2 value' do
203
213
  let(:record) do
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.1.1
4
+ version: 1.2.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Mike Kanning
@@ -12,7 +12,7 @@ authors:
12
12
  autorequire:
13
13
  bindir: bin
14
14
  cert_chain: []
15
- date: 2024-08-23 00:00:00.000000000 Z
15
+ date: 2024-09-17 00:00:00.000000000 Z
16
16
  dependencies:
17
17
  - !ruby/object:Gem::Dependency
18
18
  name: activesupport