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