pennmarc 1.2.3 → 1.2.5
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/.gitlab-ci.yml +26 -57
- data/.pipeline.yml +64 -0
- data/lib/pennmarc/helpers/genre.rb +4 -1
- data/lib/pennmarc/helpers/relation.rb +10 -0
- data/lib/pennmarc/helpers/title.rb +5 -0
- data/lib/pennmarc/mappings/locations.yml +23 -1
- data/lib/pennmarc/version.rb +1 -1
- data/spec/lib/pennmarc/helpers/genre_spec.rb +7 -5
- data/spec/lib/pennmarc/helpers/relation_spec.rb +10 -0
- data/spec/lib/pennmarc/helpers/title_spec.rb +81 -98
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 21463a3d231e3ba853929bc03241d8e3c109c6191d3a5747c1a397aad40e454d
|
4
|
+
data.tar.gz: e747a26ee6ed508b13a3079acd2291d194d4a9a9bc4a984dcefd8145d5f76084
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ee0a42b85b4862caca7417176947497d63253d07818341e3ef483789554dfcf06eff4f658a89d44d865e7354f4dcae3e88e060cdd41c941e016de5d86e8ad365
|
7
|
+
data.tar.gz: ca200369654cb607e14ea1225ce785a90ca05da9f5fe9a3a7390748b997b4b5e423f26a1c832bfab14c339a493af39f2422171b647542f92a926e5c2a7405993
|
data/.gitlab-ci.yml
CHANGED
@@ -1,65 +1,34 @@
|
|
1
|
+
---
|
1
2
|
include:
|
2
|
-
-
|
3
|
-
file:
|
4
|
-
- ".install_hashicorp_vault.yml"
|
5
|
-
- ".vault_jwt_auth.yml"
|
6
|
-
- project: "devops/gitlab/ci-templates/ruby"
|
7
|
-
ref: "sans-dind"
|
8
|
-
file:
|
9
|
-
- ".rspec.yml"
|
10
|
-
- ".rubocop.yml"
|
11
|
-
- template: "Workflows/MergeRequest-Pipelines.gitlab-ci.yml"
|
3
|
+
- template: Jobs/Secret-Detection.gitlab-ci.yml
|
12
4
|
|
13
5
|
stages:
|
14
|
-
-
|
15
|
-
-
|
6
|
+
- secret_check
|
7
|
+
- main_pipeline
|
16
8
|
|
17
|
-
|
18
|
-
stage:
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
tags:
|
25
|
-
- build
|
26
|
-
|
27
|
-
rubocop_app_test:
|
28
|
-
stage: test
|
29
|
-
image: ruby:3.2.2
|
30
|
-
before_script:
|
31
|
-
- bundle install -j $(nproc)
|
32
|
-
extends:
|
33
|
-
- .rubocop
|
9
|
+
secret_detection:
|
10
|
+
stage: secret_check
|
11
|
+
allow_failure: false
|
12
|
+
artifacts:
|
13
|
+
paths:
|
14
|
+
- .pipeline.yml
|
15
|
+
expire_in: 1 day
|
34
16
|
tags:
|
35
17
|
- build
|
18
|
+
rules:
|
19
|
+
- when: always
|
36
20
|
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
- export GEM_HOST_API_KEY="$(vault kv get -field=rubygems_api_key ${VAULT_KV_ENDPOINT}${ENVIRONMENT})"
|
48
|
-
- |
|
49
|
-
gem -v
|
50
|
-
rm -f ./*.gem
|
51
|
-
[ -f "${GEMSPEC_FILE}" ] || (echo "No ${GEMSPEC_FILE} file found!" && exit 1)
|
52
|
-
- '[ -n "${GEM_HOST_API_KEY}" ] || (echo "GEM_HOST_API_KEY is not set!" && exit 1)'
|
53
|
-
script:
|
54
|
-
- GEM_FILE=$(echo "${CI_PROJECT_NAME}-${CI_COMMIT_TAG:1}.gem")
|
55
|
-
- |
|
56
|
-
gem build "${GEMSPEC_FILE}"
|
57
|
-
[ -f "${GEM_FILE}" ] || (echo "No ${GEM_FILE} file found!" && exit 1)
|
58
|
-
- '[ "${DISABLE_GEM_PUSH}" == "true" ] || gem push "${GEM_FILE}"'
|
21
|
+
main:
|
22
|
+
stage: main_pipeline
|
23
|
+
needs:
|
24
|
+
- secret_detection
|
25
|
+
allow_failure: false
|
26
|
+
trigger:
|
27
|
+
include:
|
28
|
+
- artifact: .pipeline.yml
|
29
|
+
job: secret_detection
|
30
|
+
strategy: depend
|
59
31
|
rules:
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
- "*.gem"
|
64
|
-
tags:
|
65
|
-
- deploy
|
32
|
+
- if: "$CI_MERGE_REQUEST_IID"
|
33
|
+
- if: "$CI_COMMIT_TAG"
|
34
|
+
- if: "$CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH"
|
data/.pipeline.yml
ADDED
@@ -0,0 +1,64 @@
|
|
1
|
+
include:
|
2
|
+
- project: "devops/gitlab/ci-templates/general"
|
3
|
+
file:
|
4
|
+
- ".install_hashicorp_vault.yml"
|
5
|
+
- ".vault_jwt_auth.yml"
|
6
|
+
- project: "devops/gitlab/ci-templates/ruby"
|
7
|
+
ref: "sans-dind"
|
8
|
+
file:
|
9
|
+
- ".rspec.yml"
|
10
|
+
- ".rubocop.yml"
|
11
|
+
|
12
|
+
stages:
|
13
|
+
- test
|
14
|
+
- deploy
|
15
|
+
|
16
|
+
rspec_app_test:
|
17
|
+
stage: test
|
18
|
+
image: ruby:3.2.2
|
19
|
+
before_script:
|
20
|
+
- bundle install -j $(nproc)
|
21
|
+
extends:
|
22
|
+
- .rspec
|
23
|
+
tags:
|
24
|
+
- build
|
25
|
+
|
26
|
+
rubocop_app_test:
|
27
|
+
stage: test
|
28
|
+
image: ruby:3.2.2
|
29
|
+
before_script:
|
30
|
+
- bundle install -j $(nproc)
|
31
|
+
extends:
|
32
|
+
- .rubocop
|
33
|
+
tags:
|
34
|
+
- build
|
35
|
+
|
36
|
+
# This step was inspired from Gitlab's example of gem publication:
|
37
|
+
# https://gitlab.com/gitlab-org/quality/pipeline-common/-/blob/master/ci/gem-release.yml
|
38
|
+
gem_publication:
|
39
|
+
stage: deploy
|
40
|
+
image: ruby:3.2.2
|
41
|
+
variables:
|
42
|
+
GEMSPEC_FILE: "${CI_PROJECT_NAME}.gemspec"
|
43
|
+
before_script:
|
44
|
+
- !reference [.install_hashicorp_vault, before_script]
|
45
|
+
- !reference [.vault_jwt_auth, before_script]
|
46
|
+
- export GEM_HOST_API_KEY="$(vault kv get -field=rubygems_api_key ${VAULT_KV_ENDPOINT}${ENVIRONMENT})"
|
47
|
+
- |
|
48
|
+
gem -v
|
49
|
+
rm -f ./*.gem
|
50
|
+
[ -f "${GEMSPEC_FILE}" ] || (echo "No ${GEMSPEC_FILE} file found!" && exit 1)
|
51
|
+
- '[ -n "${GEM_HOST_API_KEY}" ] || (echo "GEM_HOST_API_KEY is not set!" && exit 1)'
|
52
|
+
script:
|
53
|
+
- GEM_FILE=$(echo "${CI_PROJECT_NAME}-${CI_COMMIT_TAG:1}.gem")
|
54
|
+
- |
|
55
|
+
gem build "${GEMSPEC_FILE}"
|
56
|
+
[ -f "${GEM_FILE}" ] || (echo "No ${GEM_FILE} file found!" && exit 1)
|
57
|
+
- '[ "${DISABLE_GEM_PUSH}" == "true" ] || gem push "${GEM_FILE}"'
|
58
|
+
rules:
|
59
|
+
- if: $CI_COMMIT_TAG =~ /^v\d+\.\d+\.\d+(\.[a-zA-Z0-9]+)?$/
|
60
|
+
artifacts:
|
61
|
+
paths:
|
62
|
+
- "*.gem"
|
63
|
+
tags:
|
64
|
+
- deploy
|
@@ -43,7 +43,8 @@ module PennMARC
|
|
43
43
|
}.uniq
|
44
44
|
end
|
45
45
|
|
46
|
-
# Genre values for faceting. We only set Genre facet values for movies (videos) and manuscripts(?)
|
46
|
+
# Genre values for faceting. We only set Genre facet values for movies (videos) and manuscripts(?), and ensure
|
47
|
+
# that the headings come from our set of approved ontologies.
|
47
48
|
# @todo the Genre facet in Franklin is pretty ugly. It could be cleaned up by limiting the subfields included
|
48
49
|
# here and cleaning up punctuation.
|
49
50
|
# @param record [MARC::Record]
|
@@ -55,6 +56,8 @@ module PennMARC
|
|
55
56
|
return [] unless manuscript || video
|
56
57
|
|
57
58
|
record.fields('655').filter_map { |field|
|
59
|
+
next unless allowed_genre_field?(field)
|
60
|
+
|
58
61
|
join_subfields field, &subfield_not_in?(%w[0 2 5 c])
|
59
62
|
}.uniq
|
60
63
|
end
|
@@ -21,6 +21,16 @@ module PennMARC
|
|
21
21
|
}.uniq
|
22
22
|
end
|
23
23
|
|
24
|
+
# Get "Contained in" values from {https://www.oclc.org/bibformats/en/7xx/773.html MARC 773}
|
25
|
+
# subfield g for related parts.
|
26
|
+
# @param record [MARC::Record]
|
27
|
+
# @return [Array<String>] related parts values for display
|
28
|
+
def contained_in_related_parts_show(record)
|
29
|
+
record.fields('773').map { |field|
|
30
|
+
join_subfields(field, &subfield_in?(%w[g]))
|
31
|
+
}.uniq
|
32
|
+
end
|
33
|
+
|
24
34
|
# Get "chronology" information from specially-prefixed 650 (subject) fields
|
25
35
|
# @todo why do we stuff chronology data in a 650 field?
|
26
36
|
# @param record [MARC::Record]
|
@@ -32,6 +32,9 @@ module PennMARC
|
|
32
32
|
# This text is used in Alma to indicate a Bib record is a "Host" record for other bibs (bound-withs)
|
33
33
|
HOST_BIB_TITLE = 'Host bibliographic record for boundwith'
|
34
34
|
|
35
|
+
# Title to use when no 245 field is present. This "shouldn't" occur, but it does.
|
36
|
+
NO_TITLE_PROVIDED = '[No title provided]'
|
37
|
+
|
35
38
|
class << self
|
36
39
|
# Main Title Search field. Takes from {https://www.loc.gov/marc/bibliographic/bd245.html 245} and linked 880.
|
37
40
|
# @note Ported from get_title_1_search_values.
|
@@ -93,6 +96,8 @@ module PennMARC
|
|
93
96
|
# @return [String] single title for display
|
94
97
|
def show(record)
|
95
98
|
field = record.fields('245')&.first
|
99
|
+
return Array.wrap(NO_TITLE_PROVIDED) unless field.present?
|
100
|
+
|
96
101
|
values = title_values(field)
|
97
102
|
[format_title(values[:title_or_form]), values[:punctuation], values[:other_info]].compact_blank.join(' ')
|
98
103
|
end
|
@@ -592,6 +592,12 @@ dentshils:
|
|
592
592
|
- Health Sciences Libraries
|
593
593
|
- Levy Dental Medicine Library
|
594
594
|
display: Levy Dental Medicine Library - Shils Boardroom
|
595
|
+
dentwellrm:
|
596
|
+
specific_location: Levy Dental Medicine Library - Wellness Room
|
597
|
+
library:
|
598
|
+
- Health Sciences Libraries
|
599
|
+
- Levy Dental Medicine Library
|
600
|
+
display: Levy Dental Medicine Library - Wellness Room
|
595
601
|
dncirc:
|
596
602
|
specific_location: Levy Dental Medicine Library - Circulation
|
597
603
|
library:
|
@@ -834,6 +840,10 @@ mideastres:
|
|
834
840
|
- Van Pelt-Dietrich Library Center
|
835
841
|
- Reserve
|
836
842
|
display: Van Pelt - Middle East Seminar Reserve
|
843
|
+
mscirc:
|
844
|
+
specific_location: Penn Museum Library - Circulation
|
845
|
+
library: Penn Museum Library
|
846
|
+
display: Penn Museum Library - Circulation
|
837
847
|
muse:
|
838
848
|
specific_location: Penn Museum Library
|
839
849
|
library: Penn Museum Library
|
@@ -861,6 +871,14 @@ museegypov:
|
|
861
871
|
specific_location: Penn Museum Library - Egyptian Oversize
|
862
872
|
library: Penn Museum Library
|
863
873
|
display: Penn Museum Library - Egyptian Oversize
|
874
|
+
museexhi:
|
875
|
+
specific_location: Penn Museum Library - Exhibition
|
876
|
+
library: Penn Museum Library
|
877
|
+
display: Penn Museum Library - Exhibition
|
878
|
+
musefolio:
|
879
|
+
specific_location: Penn Museum Library - Folio
|
880
|
+
library: Penn Museum Library
|
881
|
+
display: Penn Museum Library - Folio
|
864
882
|
musekolb:
|
865
883
|
specific_location: Penn Museum Library - Kolb
|
866
884
|
library: Penn Museum Library
|
@@ -876,10 +894,14 @@ musemedia:
|
|
876
894
|
specific_location: Penn Museum Library - Media
|
877
895
|
library: Penn Museum Library
|
878
896
|
display: Penn Museum Library - Media
|
879
|
-
|
897
|
+
musenewbks:
|
880
898
|
specific_location: Penn Museum Library - New Books Display
|
881
899
|
library: Penn Museum Library
|
882
900
|
display: Penn Museum Library - New Books Display
|
901
|
+
museover:
|
902
|
+
specific_location: Penn Museum Library - Oversize
|
903
|
+
library: Penn Museum Library
|
904
|
+
display: Penn Museum Library - Oversize
|
883
905
|
muserefe:
|
884
906
|
specific_location: Penn Museum Library - Reference
|
885
907
|
library: Penn Museum Library
|
data/lib/pennmarc/version.rb
CHANGED
@@ -47,7 +47,7 @@ describe 'PennMARC::Genre' do
|
|
47
47
|
let(:fields) do
|
48
48
|
[marc_control_field(tag: '007', value: 'x'),
|
49
49
|
marc_field(tag: 'hld', subfields: { c: 'vanp' }),
|
50
|
-
marc_field(tag: '655', indicator2: '
|
50
|
+
marc_field(tag: '655', indicator2: '0', subfields: { a: 'Genre.' })]
|
51
51
|
end
|
52
52
|
|
53
53
|
it 'returns no genre values for faceting' do
|
@@ -59,11 +59,13 @@ describe 'PennMARC::Genre' do
|
|
59
59
|
let(:fields) do
|
60
60
|
[marc_control_field(tag: '007', value: 'v'),
|
61
61
|
marc_field(tag: 'hld', subfields: { c: 'vanp' }),
|
62
|
-
marc_field(tag: '655', indicator2: '
|
63
|
-
marc_field(tag: '655', indicator2: '7', subfields: { a: 'Sports' })
|
62
|
+
marc_field(tag: '655', indicator2: '0', subfields: { a: 'Documentary films' }),
|
63
|
+
marc_field(tag: '655', indicator2: '7', subfields: { a: 'Sports', '2': 'fast' }),
|
64
|
+
marc_field(tag: '655', indicator2: '7', subfields: { a: 'Le cyclisme', '2': 'qlsp' }), # excluded due to sf2
|
65
|
+
marc_field(tag: '655', indicator2: '1', subfields: { a: 'Shredding' })] # excluded, invalid indicator value
|
64
66
|
end
|
65
67
|
|
66
|
-
it 'contains the
|
68
|
+
it 'contains only the desired genre facet values' do
|
67
69
|
expect(values).to contain_exactly 'Documentary films', 'Sports'
|
68
70
|
end
|
69
71
|
end
|
@@ -72,7 +74,7 @@ describe 'PennMARC::Genre' do
|
|
72
74
|
let(:record) { marc_record fields: fields, leader: ' t' }
|
73
75
|
let(:fields) do
|
74
76
|
[marc_control_field(tag: '007', value: 'x'),
|
75
|
-
marc_field(tag: '655', indicator2: '7', subfields: { a: 'Astronomy', '2': '
|
77
|
+
marc_field(tag: '655', indicator2: '7', subfields: { a: 'Astronomy', '2': 'fast' })]
|
76
78
|
end
|
77
79
|
|
78
80
|
it 'returns the expected genre values' do
|
@@ -16,6 +16,16 @@ describe 'PennMARC::Relation' do
|
|
16
16
|
end
|
17
17
|
end
|
18
18
|
|
19
|
+
describe '.contained_in_related_parts_show' do
|
20
|
+
let(:fields) do
|
21
|
+
[marc_field(tag: '773', subfields: { g: 'Vol. 24, pt. B no. 9 (Sept. 1993)', q: '24:B:9<235' })]
|
22
|
+
end
|
23
|
+
|
24
|
+
it 'returns only the specified subfields' do
|
25
|
+
expect(helper.contained_in_related_parts_show(record)).to eq ['Vol. 24, pt. B no. 9 (Sept. 1993)']
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
19
29
|
describe '.chronology_show' do
|
20
30
|
let(:fields) do
|
21
31
|
[marc_field(tag: '650', indicator2: '4', subfields: { a: 'CHR Heading' }),
|
@@ -2,13 +2,14 @@
|
|
2
2
|
|
3
3
|
describe 'PennMARC::Title' do
|
4
4
|
let(:helper) { PennMARC::Title }
|
5
|
+
let(:leader) { nil }
|
6
|
+
let(:fields) { [marc_field(tag: '245', subfields: subfields)] }
|
7
|
+
let(:record) { marc_record fields: fields, leader: leader }
|
5
8
|
|
6
9
|
describe '.search' do
|
7
|
-
let(:
|
8
|
-
|
9
|
-
|
10
|
-
marc_field(tag: '880', subfields: { a: 'Linked Title', '6': '245' })
|
11
|
-
]
|
10
|
+
let(:fields) do
|
11
|
+
[marc_field(tag: '245', subfields: { a: 'Title', b: 'Subtitle', c: 'Responsibility', h: 'Medium' }),
|
12
|
+
marc_field(tag: '880', subfields: { a: 'Linked Title', '6': '245' })]
|
12
13
|
end
|
13
14
|
|
14
15
|
it 'returns search values without ǂc or ǂh content' do
|
@@ -20,16 +21,14 @@ describe 'PennMARC::Title' do
|
|
20
21
|
|
21
22
|
describe '.search_aux' do
|
22
23
|
let(:leader) { 'ZZZZZnaaZa22ZZZZZzZZ4500' }
|
23
|
-
let(:
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
indicator1: '0', indicator2: '0')
|
32
|
-
], leader: leader
|
24
|
+
let(:fields) do
|
25
|
+
[marc_field(tag: '130', subfields: { a: 'Uniform Title', c: '130 not included' }),
|
26
|
+
marc_field(tag: '880', subfields: { '6': '130', a: 'Alternative Uniform Title' }),
|
27
|
+
marc_field(tag: '773', subfields: { a: 'Host Uniform Title', s: '773 not included' }),
|
28
|
+
marc_field(tag: '700', subfields: { t: 'Personal Entry Title', s: '700 not included' }),
|
29
|
+
marc_field(tag: '505', subfields: { t: 'Invalid Formatted Contents Note Title' }, indicator1: 'invalid'),
|
30
|
+
marc_field(tag: '505', subfields: { t: 'Formatted Contents Note Title', s: '505 not included' },
|
31
|
+
indicator1: '0', indicator2: '0')]
|
33
32
|
end
|
34
33
|
|
35
34
|
it 'returns auxiliary titles' do
|
@@ -51,12 +50,10 @@ describe 'PennMARC::Title' do
|
|
51
50
|
|
52
51
|
describe '.journal_search' do
|
53
52
|
let(:leader) { 'ZZZZZnasZa22ZZZZZzZZ4500' }
|
54
|
-
let(:
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
marc_field(tag: '880', subfields: { a: 'Unrelated 880', '6': 'invalid' })
|
59
|
-
], leader: leader
|
53
|
+
let(:fields) do
|
54
|
+
[marc_field(tag: '245', subfields: { a: 'Some Journal Title' }),
|
55
|
+
marc_field(tag: '880', subfields: { a: 'Alternative Script', '6': '245' }),
|
56
|
+
marc_field(tag: '880', subfields: { a: 'Unrelated 880', '6': 'invalid' })]
|
60
57
|
end
|
61
58
|
|
62
59
|
it 'returns journal search titles' do
|
@@ -74,16 +71,14 @@ describe 'PennMARC::Title' do
|
|
74
71
|
|
75
72
|
describe '.journal_search_aux' do
|
76
73
|
let(:leader) { 'ZZZZZnasZa22ZZZZZzZZ4500' }
|
77
|
-
let(:
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
indicator1: '0', indicator2: '0')
|
86
|
-
], leader: leader
|
74
|
+
let(:fields) do
|
75
|
+
[marc_field(tag: '130', subfields: { a: 'Uniform Title', c: '130 not included' }),
|
76
|
+
marc_field(tag: '880', subfields: { '6': '130', a: 'Alternative Uniform Title' }),
|
77
|
+
marc_field(tag: '773', subfields: { a: 'Host Uniform Title', s: '773 not included' }),
|
78
|
+
marc_field(tag: '700', subfields: { t: 'Personal Entry Title', s: '700 not included' }),
|
79
|
+
marc_field(tag: '505', subfields: { t: 'Invalid Formatted Contents Note Title' }, indicator1: 'invalid'),
|
80
|
+
marc_field(tag: '505', subfields: { t: 'Formatted Contents Note Title', s: '505 not included' },
|
81
|
+
indicator1: '0', indicator2: '0')]
|
87
82
|
end
|
88
83
|
|
89
84
|
it 'returns auxiliary journal search titles' do
|
@@ -102,9 +97,19 @@ describe 'PennMARC::Title' do
|
|
102
97
|
end
|
103
98
|
|
104
99
|
describe '.show' do
|
105
|
-
|
100
|
+
context 'with no 245' do
|
101
|
+
let(:fields) do
|
102
|
+
# Simulate a miscoded record
|
103
|
+
[marc_field(tag: '246', indicator1: '1', indicator2: '4', subfields: { a: 'The horn concertos', c: 'Mozart' })]
|
104
|
+
end
|
105
|
+
|
106
|
+
it 'returns default title' do
|
107
|
+
expect(helper.show(record)).to eq [PennMARC::Title::NO_TITLE_PROVIDED]
|
108
|
+
end
|
109
|
+
end
|
106
110
|
|
107
111
|
context 'with ǂa, ǂk and ǂn defined' do
|
112
|
+
let(:fields) { [marc_field(tag: '245', subfields: subfields)] }
|
108
113
|
let(:subfields) { { a: 'Five Decades of MARC usage', k: 'journals', n: 'Part One' } }
|
109
114
|
|
110
115
|
it 'returns single title value with text from ǂa and ǂn but not ǂk' do
|
@@ -113,6 +118,7 @@ describe 'PennMARC::Title' do
|
|
113
118
|
end
|
114
119
|
|
115
120
|
context 'with no ǂa but a ǂk and ǂn defined' do
|
121
|
+
let(:fields) { [marc_field(tag: '245', subfields: subfields)] }
|
116
122
|
let(:subfields) { { k: 'journals', n: 'Part One' } }
|
117
123
|
|
118
124
|
it 'returns single title value with text from ǂk and ǂn' do
|
@@ -140,10 +146,8 @@ describe 'PennMARC::Title' do
|
|
140
146
|
|
141
147
|
describe '.detailed_show' do
|
142
148
|
context 'with subfields ǂk, ǂf and ǂc' do
|
143
|
-
let(:
|
144
|
-
|
145
|
-
marc_field(tag: '245', subfields: { k: 'Letters,', f: '1972-1982,', b: 'to Lewis Mumford.' })
|
146
|
-
]
|
149
|
+
let(:fields) do
|
150
|
+
[marc_field(tag: '245', subfields: { k: 'Letters,', f: '1972-1982,', b: 'to Lewis Mumford.' })]
|
147
151
|
end
|
148
152
|
|
149
153
|
it 'returns detailed title values' do
|
@@ -152,10 +156,8 @@ describe 'PennMARC::Title' do
|
|
152
156
|
end
|
153
157
|
|
154
158
|
context 'with subfields ǂk and ǂb' do
|
155
|
-
let(:
|
156
|
-
|
157
|
-
marc_field(tag: '245', subfields: { k: 'Letters', b: 'to Lewis Mumford.' })
|
158
|
-
]
|
159
|
+
let(:fields) do
|
160
|
+
[marc_field(tag: '245', subfields: { k: 'Letters', b: 'to Lewis Mumford.' })]
|
159
161
|
end
|
160
162
|
|
161
163
|
it 'returns title value without dates' do
|
@@ -165,12 +167,10 @@ describe 'PennMARC::Title' do
|
|
165
167
|
|
166
168
|
# e.g., 9977704838303681
|
167
169
|
context 'with ǂa containing an " : " as well as inclusive dates' do
|
168
|
-
let(:
|
169
|
-
|
170
|
-
|
171
|
-
|
172
|
-
f: '1830 / ', c: 'by the author of Hobomok.' })
|
173
|
-
]
|
170
|
+
let(:fields) do
|
171
|
+
[marc_field(tag: '245', subfields: { a: 'The frugal housewife : ',
|
172
|
+
b: 'dedicated to those who are not ashamed of economy, ',
|
173
|
+
f: '1830 / ', c: 'by the author of Hobomok.' })]
|
174
174
|
end
|
175
175
|
|
176
176
|
it 'returns single title value with text from ǂa and ǂn' do
|
@@ -182,11 +182,9 @@ describe 'PennMARC::Title' do
|
|
182
182
|
end
|
183
183
|
|
184
184
|
describe '.alternate_show' do
|
185
|
-
let(:
|
186
|
-
|
187
|
-
|
188
|
-
marc_field(tag: '880', subfields: { '6': '245', k: 'Lettres', b: 'à Lewis Mumford.' })
|
189
|
-
]
|
185
|
+
let(:fields) do
|
186
|
+
[marc_field(tag: '245', subfields: { k: 'Letters', b: 'to Lewis Mumford. ' }),
|
187
|
+
marc_field(tag: '880', subfields: { '6': '245', k: 'Lettres', b: 'à Lewis Mumford.' })]
|
190
188
|
end
|
191
189
|
|
192
190
|
context 'with subfields ǂk and ǂb' do
|
@@ -196,10 +194,8 @@ describe 'PennMARC::Title' do
|
|
196
194
|
end
|
197
195
|
|
198
196
|
context 'when 880 field is not present' do
|
199
|
-
let(:
|
200
|
-
|
201
|
-
marc_field(tag: '245', subfields: { k: 'Letters', b: 'to Lewis Mumford. ' })
|
202
|
-
]
|
197
|
+
let(:fields) do
|
198
|
+
[marc_field(tag: '245', subfields: { k: 'Letters', b: 'to Lewis Mumford. ' })]
|
203
199
|
end
|
204
200
|
|
205
201
|
it 'returns nil' do
|
@@ -210,10 +206,9 @@ describe 'PennMARC::Title' do
|
|
210
206
|
|
211
207
|
describe '.sort' do
|
212
208
|
context 'with no 245' do
|
213
|
-
let(:
|
209
|
+
let(:fields) do
|
214
210
|
# Simulate a miscoded record
|
215
|
-
|
216
|
-
subfields: { a: 'The horn concertos', c: 'Mozart' })]
|
211
|
+
[marc_field(tag: '246', indicator1: '1', indicator2: '4', subfields: { a: 'The horn concertos', c: 'Mozart' })]
|
217
212
|
end
|
218
213
|
|
219
214
|
it 'returns nil' do
|
@@ -222,14 +217,12 @@ describe 'PennMARC::Title' do
|
|
222
217
|
end
|
223
218
|
|
224
219
|
context 'with a record with a valid indicator2 value' do
|
225
|
-
let(:
|
226
|
-
|
227
|
-
|
228
|
-
|
229
|
-
|
230
|
-
|
231
|
-
})
|
232
|
-
]
|
220
|
+
let(:fields) do
|
221
|
+
[marc_field(tag: '245', indicator2: '4', subfields: {
|
222
|
+
a: 'The Record Title',
|
223
|
+
b: 'Remainder', n: 'Number', p: 'Section',
|
224
|
+
h: 'Do not display'
|
225
|
+
})]
|
233
226
|
end
|
234
227
|
|
235
228
|
it 'properly removes and appends the number of characters specified in indicator 2' do
|
@@ -244,8 +237,8 @@ describe 'PennMARC::Title' do
|
|
244
237
|
end
|
245
238
|
|
246
239
|
context 'with a record with no indicator2 value' do
|
247
|
-
let(:
|
248
|
-
|
240
|
+
let(:fields) do
|
241
|
+
[marc_field(tag: '245', subfields: { a: 'The Record Title' })]
|
249
242
|
end
|
250
243
|
|
251
244
|
it 'does not transform the title value' do
|
@@ -254,9 +247,7 @@ describe 'PennMARC::Title' do
|
|
254
247
|
end
|
255
248
|
|
256
249
|
context 'with a record with no ǂa and no indicator2 value' do
|
257
|
-
let(:
|
258
|
-
marc_record fields: [marc_field(tag: '245', subfields: { k: 'diaries' })]
|
259
|
-
end
|
250
|
+
let(:fields) { [marc_field(tag: '245', subfields: { k: 'diaries' })] }
|
260
251
|
|
261
252
|
it 'uses ǂk (form) value without transformation' do
|
262
253
|
expect(helper.sort(record)).to eq 'diaries'
|
@@ -264,9 +255,7 @@ describe 'PennMARC::Title' do
|
|
264
255
|
end
|
265
256
|
|
266
257
|
context 'with a record with a leading bracket' do
|
267
|
-
let(:
|
268
|
-
marc_record fields: [marc_field(tag: '245', subfields: { a: '[The Record Title]' })]
|
269
|
-
end
|
258
|
+
let(:fields) { [marc_field(tag: '245', subfields: { a: '[The Record Title]' })] }
|
270
259
|
|
271
260
|
# TODO: is this the expected behavior? It would sort right, but looks silly.
|
272
261
|
it 'removes the leading bracket and appends it to the full value' do
|
@@ -276,17 +265,15 @@ describe 'PennMARC::Title' do
|
|
276
265
|
end
|
277
266
|
|
278
267
|
describe '.standardized_show' do
|
279
|
-
let(:
|
280
|
-
|
281
|
-
|
282
|
-
|
283
|
-
|
284
|
-
|
285
|
-
|
286
|
-
|
287
|
-
|
288
|
-
marc_field(tag: '880', subfields: { '6': '100', a: 'Alt Ignore' })
|
289
|
-
]
|
268
|
+
let(:fields) do
|
269
|
+
[marc_field(tag: '130', subfields: { a: 'Uniform Title', f: '2000', '8': 'Not Included' }),
|
270
|
+
marc_field(tag: '240', subfields: { a: 'Another Uniform Title', '0': 'Ugly Control Number' }),
|
271
|
+
marc_field(tag: '730', indicator2: '', subfields: { a: 'Yet Another Uniform Title' }),
|
272
|
+
marc_field(tag: '730', indicator1: '0', indicator2: '2', subfields: { a: 'Not Printed Title' }),
|
273
|
+
marc_field(tag: '730', indicator1: '', subfields: { i: 'Subfield i Title' }),
|
274
|
+
marc_field(tag: '880', subfields: { '6': '240', a: 'Translated Uniform Title' }),
|
275
|
+
marc_field(tag: '880', subfields: { '6': '730', a: 'Alt Ignore', i: 'Alt Subfield i' }),
|
276
|
+
marc_field(tag: '880', subfields: { '6': '100', a: 'Alt Ignore' })]
|
290
277
|
end
|
291
278
|
|
292
279
|
it 'returns the expected standardized title display values' do
|
@@ -299,13 +286,11 @@ describe 'PennMARC::Title' do
|
|
299
286
|
end
|
300
287
|
|
301
288
|
describe '.other_show' do
|
302
|
-
let(:
|
303
|
-
|
304
|
-
|
305
|
-
|
306
|
-
|
307
|
-
marc_field(tag: '880', subfields: { '6': '246', a: 'Alternate Varied Title' })
|
308
|
-
]
|
289
|
+
let(:fields) do
|
290
|
+
[marc_field(tag: '246', subfields: { a: 'Varied Title', f: '2000', '8': 'Not Included' }),
|
291
|
+
marc_field(tag: '740', indicator2: '0', subfields: { a: 'Uncontrolled Title', '5': 'Penn' }),
|
292
|
+
marc_field(tag: '740', indicator2: '2', subfields: { a: 'A Title We Do Not Like' }),
|
293
|
+
marc_field(tag: '880', subfields: { '6': '246', a: 'Alternate Varied Title' })]
|
309
294
|
end
|
310
295
|
|
311
296
|
it 'returns the expected other title display values' do
|
@@ -316,11 +301,9 @@ describe 'PennMARC::Title' do
|
|
316
301
|
end
|
317
302
|
|
318
303
|
describe '.former_show' do
|
319
|
-
let(:
|
320
|
-
|
321
|
-
|
322
|
-
marc_field(tag: '880', subfields: { a: 'Alt Title', n: 'Part', '6': '247' })
|
323
|
-
]
|
304
|
+
let(:fields) do
|
305
|
+
[marc_field(tag: '247', subfields: { a: 'Former Title', n: 'Part', '6': 'Linkage', e: 'Append' }),
|
306
|
+
marc_field(tag: '880', subfields: { a: 'Alt Title', n: 'Part', '6': '247' })]
|
324
307
|
end
|
325
308
|
|
326
309
|
it 'returns the expected former title value' do
|
@@ -331,7 +314,7 @@ describe 'PennMARC::Title' do
|
|
331
314
|
end
|
332
315
|
|
333
316
|
describe '.host_bib_record?' do
|
334
|
-
let(:
|
317
|
+
let(:fields) { [marc_field(tag: '245', subfields: subfields)] }
|
335
318
|
|
336
319
|
context 'with a host record' do
|
337
320
|
let(:subfields) { { a: "#{PennMARC::Title::HOST_BIB_TITLE} for 123456789" } }
|
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.2.
|
4
|
+
version: 1.2.5
|
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-
|
15
|
+
date: 2024-12-17 00:00:00.000000000 Z
|
16
16
|
dependencies:
|
17
17
|
- !ruby/object:Gem::Dependency
|
18
18
|
name: activesupport
|
@@ -81,6 +81,7 @@ files:
|
|
81
81
|
- ".gitignore"
|
82
82
|
- ".gitlab-ci.yml"
|
83
83
|
- ".gitleaks.toml"
|
84
|
+
- ".pipeline.yml"
|
84
85
|
- ".rspec"
|
85
86
|
- ".rubocop.yml"
|
86
87
|
- ".rubocop_todo.yml"
|