pennmarc 1.0.9 → 1.0.11.pre1

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: 652039b781e2ce7442f628ca722f4fda59207d1d8171bfd2fad84d2c67f3c06f
4
- data.tar.gz: 166bbf8498f673b36373671db47031ef8a2f4d5496ed1fddeee89718bd23e09c
3
+ metadata.gz: 102f9a975e2d103cdec48de5ef76c1577216d1055f46893ca39ac40a9fd717aa
4
+ data.tar.gz: 759fef85e9a2f5cc69bd100cd8552912831c7f70df5066f52824ec51ab483e03
5
5
  SHA512:
6
- metadata.gz: 68df667344adaff013da3eab5417bdd44748726a113190d20c44cc1cf4d061269619265e3de1edc9c7c767ffff5a4548a9fcb3ed2039b28a2608ec62a6e024d1
7
- data.tar.gz: 8df6d32dbc84ff3851e4b35576e24c96c42b536330ded1f0f1678de3d1aa0729547a71b0c6ccea15e7c949ee15e068d1c0f19b18a6b414167cb736effa2b01dd
6
+ metadata.gz: e2fbd84b36717b7c24a3966a19912e59be09b258eea4d62f2905ff7f117786f0594a9a9e9a6da031c52e639bad2407efa5feeef65d092e991457a449e8a17259
7
+ data.tar.gz: 1297a465f711238695f9faace643c20d06f2a07e56ba641c239ee4af71db38c6a1067a073703f0898031cb76bad1c4c8668835d5970ab5f6fc58508af7596105
data/.gitlab-ci.yml ADDED
@@ -0,0 +1,72 @@
1
+ include:
2
+ - project: "devops/gitlab/ci-templates/ruby"
3
+ ref: "sans-dind"
4
+ file:
5
+ - ".rspec.yml"
6
+ - ".rubocop.yml"
7
+ - template: "Workflows/MergeRequest-Pipelines.gitlab-ci.yml"
8
+
9
+ stages:
10
+ - test
11
+ - deploy
12
+
13
+ rspec_app_test:
14
+ stage: test
15
+ image: ruby:3.2.2
16
+ before_script:
17
+ - bundle install -j $(nproc)
18
+ extends:
19
+ - .rspec
20
+ tags:
21
+ - build
22
+
23
+ rubocop_app_test:
24
+ stage: test
25
+ image: ruby:3.2.2
26
+ before_script:
27
+ - bundle install -j $(nproc)
28
+ extends:
29
+ - .rubocop
30
+ tags:
31
+ - build
32
+ allow_failure: true
33
+
34
+ # This step was inspired from Gitlab's example of gem publication:
35
+ # https://gitlab.com/gitlab-org/quality/pipeline-common/-/blob/master/ci/gem-release.yml
36
+ gem_publication:
37
+ stage: deploy
38
+ image: ruby:3.2.2
39
+ variables:
40
+ GEMSPEC_FILE: "${CI_PROJECT_NAME}.gemspec"
41
+ VAULT_VERSION: "1.10.1"
42
+ before_script:
43
+ - |
44
+ apt-get update && apt-get -y install \
45
+ wget \
46
+ unzip && \
47
+ wget https://releases.hashicorp.com/vault/${VAULT_VERSION}/vault_${VAULT_VERSION}_linux_amd64.zip -O /tmp/vault_${VAULT_VERSION}.zip && \
48
+ unzip /tmp/vault_${VAULT_VERSION}.zip -d /usr/bin && \
49
+ rm -fr /tmp/vault_${VAULT_VERSION}.zip && \
50
+ apt-get remove -y wget unzip && \
51
+ apt-get clean
52
+ - export VAULT_ADDR=${VAULT_URL}
53
+ - export VAULT_TOKEN="$(vault write -field=token auth/jwt/${CI_SERVER_HOST}/login role=${JWT_ROLE} jwt=${CI_JOB_JWT})"
54
+ - export GEM_HOST_API_KEY="$(vault kv get -field=rubygems_api_key ${VAULT_KV_ENDPOINT}${ENVIRONMENT})"
55
+ - |
56
+ gem -v
57
+ rm -f ./*.gem
58
+ [ -f "${GEMSPEC_FILE}" ] || (echo "No ${GEMSPEC_FILE} file found!" && exit 1)
59
+ - '[ -n "${GEM_HOST_API_KEY}" ] || (echo "GEM_HOST_API_KEY is not set!" && exit 1)'
60
+ script:
61
+ - GEM_FILE=$(echo "${CI_PROJECT_NAME}-${CI_COMMIT_TAG:1}.gem")
62
+ - |
63
+ gem build "${GEMSPEC_FILE}"
64
+ [ -f "${GEM_FILE}" ] || (echo "No ${GEM_FILE} file found!" && exit 1)
65
+ - '[ "${DISABLE_GEM_PUSH}" == "true" ] || gem push "${GEM_FILE}"'
66
+ rules:
67
+ - if: $CI_COMMIT_TAG =~ /^v\d+\.\d+\.\d+(\.[a-zA-Z0-9]+)?$/
68
+ artifacts:
69
+ paths:
70
+ - "*.gem"
71
+ tags:
72
+ - deploy
data/Gemfile.lock CHANGED
@@ -23,6 +23,8 @@ GEM
23
23
  racc (~> 1.4)
24
24
  nokogiri (1.15.2-x64-mingw-ucrt)
25
25
  racc (~> 1.4)
26
+ nokogiri (1.15.2-x86_64-darwin)
27
+ racc (~> 1.4)
26
28
  nokogiri (1.15.2-x86_64-linux)
27
29
  racc (~> 1.4)
28
30
  parallel (1.23.0)
@@ -104,6 +106,7 @@ PLATFORMS
104
106
  arm64-darwin-21
105
107
  arm64-darwin-22
106
108
  x64-mingw-ucrt
109
+ x86_64-darwin-21
107
110
  x86_64-linux
108
111
 
109
112
  DEPENDENCIES
data/README.md CHANGED
@@ -71,22 +71,20 @@ rspec
71
71
 
72
72
  ## Publishing the Gem
73
73
 
74
- 1. Update the `VERSION` constant in `lib/pennmarc/version.rb`.
75
- 2. Run `gem build pennmarc.gemspec` with the latest code
76
- 3. Run `gem push pennmarc-{version number here}.gem`(e.g. `gem push pennmarc-1.0.0.gem`) to push to RubyGems. You will need access and MFA setup with RubyGems.
77
-
78
- ## QA
79
-
80
- ### Checking output of an arbitrary MARC XML file
81
-
82
- TODO
83
-
84
- ```bash
85
- MARC_FILE=path/to/marc.xml bundle exec rake pennmarc:parse
86
- ```
87
-
88
- ## TODO
89
- - rake task or some similar command to return a full set of values extracted from a specified marcxml file
90
- - Pipeline to run tests and publish to Rubygems
91
- - rubocop check
92
- - rdoc/yard coverage checks?
74
+ 1. Update the `VERSION` constant in [lib/pennmarc/version.rb](lib/pennmarc/version.rb) following this gem's versioning pattern (ex 1.1.0).
75
+ 2. Merge the change into `main`.
76
+ 3. Create a Gitlab Release:
77
+ 1. Go to https://gitlab.library.upenn.edu/dld/catalog/pennmarc/-/releases/new
78
+ 2. Create a new tag that matches the version set in step 1 (ex: v1.1.0).
79
+ 3. Add a release title that is the same as the tag name.
80
+ 4. Submit by clicking "Create Release".
81
+ 4. Once the release is created a pipeline will run to publish the gem to RubyGems.
82
+
83
+ ### Versioning Guidelines
84
+
85
+ We do not explicitly follow [Semantic Versioning](https://semver.org/) principles, but follow it's general principles.
86
+ In common cases, here's what to do:
87
+
88
+ - Increment **MAJOR_VERSION** if the `Parser` class functionality is modified in a breaking fashion.
89
+ - Increment **MINOR_VERSION** if a `Helper` class is renamed, or if an existing helper method is renamed.
90
+ - Increment **PATCH_VERSION** if a new `Helper` class or method is added, of if any non-breaking bugfix is made.
@@ -42,6 +42,8 @@ module PennMARC
42
42
 
43
43
  SUB_PHYSICAL_CALL_NUMBER = 'd'
44
44
  SUB_PHYSICAL_CALL_NUMBER_TYPE = 'k'
45
+
46
+ SUB_HOLDING_LOCATION_CODE = 'j'
45
47
  end
46
48
  end
47
49
  end
@@ -5,8 +5,6 @@ module PennMARC
5
5
  class Access < Helper
6
6
  ONLINE = 'Online'
7
7
  AT_THE_LIBRARY = 'At the library'
8
- ELEC_AVAILABILITY_TAG = 'AVE'
9
- PHYS_AVAILABILITY_TAG = 'AVA'
10
8
 
11
9
  class << self
12
10
  # Based on enhanced metadata fields added by Alma publishing process or API, determine if the record has
@@ -35,14 +33,14 @@ module PennMARC
35
33
  # @param [MARC::Field] field
36
34
  # @return [Boolean]
37
35
  def electronic_holding_tag?(field)
38
- field.tag.in? [EnrichedMarc::TAG_ELECTRONIC_INVENTORY, ELEC_AVAILABILITY_TAG]
36
+ field.tag.in? [EnrichedMarc::TAG_ELECTRONIC_INVENTORY, EnrichedMarc::AlmaApi::TAG_ELECTRONIC_INVENTORY]
39
37
  end
40
38
 
41
39
  # Does the record have added physical holding info?
42
40
  # @param [MARC::Field] field
43
41
  # @return [Boolean]
44
42
  def physical_holding_tag?(field)
45
- field.tag.in? [EnrichedMarc::TAG_HOLDING, PHYS_AVAILABILITY_TAG]
43
+ field.tag.in? [EnrichedMarc::TAG_HOLDING, EnrichedMarc::AlmaApi::TAG_PHYSICAL_INVENTORY]
46
44
  end
47
45
 
48
46
  # Check if a record contains an 856 entry for an online finding aid, meeting these criteria:
@@ -18,7 +18,7 @@ module PennMARC
18
18
  # local field 944}. Only returns database subtype if Penn's Database facet value is present in subfield 'a'.
19
19
  # @param [Marc::Record]
20
20
  # @return [Array<string>] Array of types
21
- def type(record)
21
+ def type_facet(record)
22
22
  record.fields('944').filter_map do |field|
23
23
  # skip unless specified database format type present
24
24
  next unless subfield_value?(field, 'a', /#{DATABASES_FACET_VALUE}/o)
@@ -34,7 +34,7 @@ module PennMARC
34
34
  # subfield '2'.
35
35
  # @param [Marc::Record]
36
36
  # @return [Array<string>] Array of categories
37
- def db_category(record)
37
+ def category_facet(record)
38
38
  return [] unless curated_db?(record)
39
39
 
40
40
  record.fields('943').filter_map do |field|
@@ -55,7 +55,7 @@ module PennMARC
55
55
  # an empty array.
56
56
  # @param [Marc::Record]
57
57
  # @return [Array<string>] Array of "category--subcategory"
58
- def db_subcategory(record)
58
+ def subcategory_facet(record)
59
59
  return [] unless curated_db?(record)
60
60
 
61
61
  record.fields('943').filter_map do |field|
@@ -20,7 +20,8 @@ module PennMARC
20
20
  end
21
21
 
22
22
  # Retrieve date added (subfield 'q') from enriched marc 'itm' field.
23
- # {PennMARC::EnrichedMarc} maps enriched marc fields and subfields created during Alma publishing.
23
+ # {PennMARC::EnrichedMarc} maps enriched marc fields and subfields created during Alma publishing. The enriched
24
+ # metadata provided by the Alma API does not include the date created value, so we can't work with that here.
24
25
  # @param [MARC::Record] record
25
26
  # @return [DateTime, nil] The date added, or nil if date found in record is invalid
26
27
  def added(record)
@@ -80,13 +80,6 @@ module PennMARC
80
80
  title_medium = subfield_values_for tag: '245', subfield: :h, record: record
81
81
  media_type = subfield_values_for tag: '337', subfield: :a, record: record
82
82
 
83
- # Get Call Number for holdings - ǂh gives us the 'Classification part' which can contain strings like
84
- # 'Microfilm'
85
- call_nums = record.fields(EnrichedMarc::TAG_HOLDING).map do |field|
86
- join_subfields(field, &subfield_in?([EnrichedMarc::SUB_HOLDING_CLASSIFICATION_PART,
87
- EnrichedMarc::SUB_HOLDING_ITEM_PART]))
88
- end
89
-
90
83
  # get all specific_location values from inventory info
91
84
  locations = Location.location record: record, location_map: location_map,
92
85
  display_value: :specific_location
@@ -95,7 +88,7 @@ module PennMARC
95
88
  formats << MANUSCRIPT
96
89
  elsif archives_but_not_cajs_or_nursing?(locations)
97
90
  formats << ARCHIVE
98
- elsif micro_or_microform?(call_nums, locations, media_type, title_medium)
91
+ elsif micro_or_microform?(call_nums(record), locations, media_type, title_medium)
99
92
  formats << MICROFORMAT
100
93
  else
101
94
  # any of these
@@ -167,6 +160,25 @@ module PennMARC
167
160
 
168
161
  private
169
162
 
163
+ # Get Call Numbers for holdings using the 'Classification part' which can contain strings like
164
+ # 'Microfilm'. Look in enriched tags used by both Alma Publishing and API.
165
+ # @param [MARC::Record] record
166
+ # @return [Array]
167
+ def call_nums(record)
168
+ if field_defined?(record, EnrichedMarc::TAG_HOLDING)
169
+ record.fields(EnrichedMarc::TAG_HOLDING).map do |field|
170
+ join_subfields(field, &subfield_in?([EnrichedMarc::SUB_HOLDING_CLASSIFICATION_PART,
171
+ EnrichedMarc::SUB_HOLDING_ITEM_PART]))
172
+ end
173
+ elsif field_defined?(record, EnrichedMarc::AlmaApi::TAG_PHYSICAL_INVENTORY)
174
+ record.fields(EnrichedMarc::AlmaApi::TAG_PHYSICAL_INVENTORY).map do |field|
175
+ join_subfields(field, &subfield_in?([EnrichedMarc::AlmaApi::SUB_PHYSICAL_CALL_NUMBER_TYPE]))
176
+ end
177
+ else
178
+ []
179
+ end
180
+ end
181
+
170
182
  # Get 'Curated' format from.
171
183
  # {https://upennlibrary.atlassian.net/wiki/spaces/ALMA/pages/323912493/Local+9XX+Field+Use+in+Alma local field
172
184
  # 944} ǂa, as long as it is not a numerical value.
@@ -13,7 +13,7 @@ module PennMARC
13
13
  # Full text links from MARC 856 fields.
14
14
  # @param [MARC::Record] record
15
15
  # @return [Array] array of hashes
16
- def full_text(record)
16
+ def full_text_links(record)
17
17
  indicator2_options = %w[0 1]
18
18
  links_from_record(record, indicator2_options)
19
19
  end
@@ -21,7 +21,7 @@ module PennMARC
21
21
  # Web text links from MARC 856 fields.
22
22
  # @param [MARC::Record] record
23
23
  # @return [Array] array of hashes
24
- def web(record)
24
+ def web_links(record)
25
25
  indicator2_options = ['2', ' ', '']
26
26
  links_from_record(record, indicator2_options)
27
27
  end
@@ -85,9 +85,14 @@ module PennMARC
85
85
  tag = PennMARC::EnrichedMarc::TAG_HOLDING
86
86
  subfield_code = PennMARC::EnrichedMarc::SUB_HOLDING_SHELVING_LOCATION
87
87
 
88
- if record.fields(PennMARC::EnrichedMarc::TAG_ITEM).any?
88
+ # if the record has an enriched item field present, use it
89
+ if field_defined?(record, PennMARC::EnrichedMarc::TAG_ITEM)
89
90
  tag = PennMARC::EnrichedMarc::TAG_ITEM
90
91
  subfield_code = PennMARC::EnrichedMarc::SUB_ITEM_CURRENT_LOCATION
92
+ # otherwise, use the api enriched field value
93
+ elsif field_defined?(record, EnrichedMarc::AlmaApi::TAG_PHYSICAL_INVENTORY)
94
+ tag = EnrichedMarc::AlmaApi::TAG_PHYSICAL_INVENTORY
95
+ subfield_code = EnrichedMarc::AlmaApi::SUB_HOLDING_LOCATION_CODE
91
96
  end
92
97
 
93
98
  { tag: tag, subfield_code: subfield_code }
@@ -6,15 +6,16 @@ module PennMARC
6
6
  class << self
7
7
  # Retrieve notes for display from fields {https://www.oclc.org/bibformats/en/5xx/500.html 500},
8
8
  # {https://www.oclc.org/bibformats/en/5xx/502.html 502}, {https://www.oclc.org/bibformats/en/5xx/504.html 504},
9
- # {https://www.oclc.org/bibformats/en/5xx/515.html 515}, {https://www.oclc.org/bibformats/en/5xx/518.html 518}
9
+ # {https://www.oclc.org/bibformats/en/5xx/515.html 515}, {https://www.oclc.org/bibformats/en/5xx/518.html 518},
10
10
  # {https://www.oclc.org/bibformats/en/5xx/525.html 525}, {https://www.oclc.org/bibformats/en/5xx/533.html 533},
11
- # {https://www.oclc.org/bibformats/en/5xx/550.html 550}, {https://www.oclc.org/bibformats/en/5xx/580.html 580},
12
- # {https://www.oclc.org/bibformats/en/5xx/586.html 586}, {https://www.oclc.org/bibformats/en/5xx/588.html 588},
11
+ # {https://www.oclc.org/bibformats/en/5xx/540.html 540}, {https://www.oclc.org/bibformats/en/5xx/550.html 550},
12
+ # {https://www.oclc.org/bibformats/en/5xx/580.html 580}, {https://www.oclc.org/bibformats/en/5xx/586.html 586},
13
+ # {https://www.oclc.org/bibformats/en/5xx/588.html 588}
13
14
  # and their linked alternates.
14
15
  # @param [MARC::Record] record
15
16
  # @return [Array<String>]
16
17
  def notes_show(record)
17
- notes_fields = %w[500 502 504 515 518 525 533 550 580 586 588]
18
+ notes_fields = %w[500 502 504 515 518 525 533 540 550 580 586 588]
18
19
  record.fields(notes_fields + ['880']).filter_map do |field|
19
20
  next if field.tag == '880' && subfield_value_not_in?(field, '6', notes_fields)
20
21
 
@@ -84,7 +84,7 @@ module PennMARC
84
84
  # https://www.loc.gov/marc/bibliographic/bd780.html
85
85
  # @param [MARC::Record] record
86
86
  # @return [String] continues fields string
87
- def get_continues_display(record)
87
+ def get_continues_show(record)
88
88
  continues(record, '780')
89
89
  end
90
90
 
@@ -94,7 +94,7 @@ module PennMARC
94
94
  # https://www.loc.gov/marc/bibliographic/bd785.html
95
95
  # @param [MARC::Record] record
96
96
  # @return [String] continued by fields string
97
- def get_continued_by_display(record)
97
+ def get_continued_by_show(record)
98
98
  continues(record, '785')
99
99
  end
100
100
 
@@ -149,7 +149,7 @@ module PennMARC
149
149
  # title browse and we will not be supporting that at this time
150
150
  # @param [MARC::Record] record
151
151
  # @return [Array<String>] Array of standardized titles as strings
152
- def standardized(record)
152
+ def standardized_show(record)
153
153
  standardized_titles = record.fields(%w[130 240]).map do |field|
154
154
  join_subfields(field, &subfield_not_in?(%w[0 6 8 e w]))
155
155
  end
@@ -177,7 +177,7 @@ module PennMARC
177
177
  #
178
178
  # @param [MARC::Record] record
179
179
  # @return [Array<String>] Array of other titles as strings
180
- def other(record)
180
+ def other_show(record)
181
181
  other_titles = record.fields('246').map do |field|
182
182
  join_subfields(field, &subfield_not_in?(%w[6 8]))
183
183
  end
@@ -202,7 +202,7 @@ module PennMARC
202
202
  # @todo what are e and w subfields?
203
203
  # @param [MARC::Record] record
204
204
  # @return [Array<String>] array of former titles
205
- def former(record)
205
+ def former_show(record)
206
206
  record.fields
207
207
  .filter_map do |field|
208
208
  next unless field.tag == '247' || (field.tag == '880' && subfield_value?(field, '6', /^247/))
@@ -1,8 +1,4 @@
1
1
  ---
2
- 3eastelev:
3
- specific_location: Van Pelt - third floor east elevator lobby
4
- library: Van Pelt-Dietrich Library Center
5
- display: Van Pelt - third floor east elevator lobby
6
2
  afro:
7
3
  specific_location: Van Pelt - Africana Studies Resource Room
8
4
  library: Van Pelt-Dietrich Library Center
@@ -177,12 +173,6 @@ biomlibr:
177
173
  - Health Sciences Libraries
178
174
  - Holman Biotech Commons
179
175
  display: Holman Biotech Commons - Librarian's Office
180
- biomonli:
181
- specific_location: Holman Biotech Commons - Online Office
182
- library:
183
- - Health Sciences Libraries
184
- - Holman Biotech Commons
185
- display: Holman Biotech Commons - Online Office
186
176
  biomperi:
187
177
  specific_location: Holman Biotech Commons - Periodicals
188
178
  library:
@@ -550,10 +540,6 @@ dncirc:
550
540
  - Health Sciences Libraries
551
541
  - Levy Dental Medicine Library
552
542
  display: Levy Dental Medicine Library - Circulation
553
- easiacom:
554
- specific_location: Van Pelt - East Asia Compact Shelving
555
- library: Van Pelt-Dietrich Library Center
556
- display: Van Pelt - East Asia Compact Shelving
557
543
  easiacmx:
558
544
  specific_location: Van Pelt - East Asia Comics
559
545
  library: Van Pelt-Dietrich Library Center
@@ -576,40 +562,6 @@ edcomm:
576
562
  - Van Pelt-Dietrich Library Center
577
563
  - Education Commons
578
564
  display: Education Commons
579
- engi:
580
- specific_location: Engineering Library
581
- library: Engineering Library
582
- display: Engineering Library
583
- engicirc:
584
- specific_location: Engineering Library - Circulation Desk
585
- library: Engineering Library
586
- display: Engineering Library - Circulation Desk
587
- enginewbk:
588
- specific_location: Engineering Library - New Book
589
- library: Engineering Library
590
- display: Engineering Library - New Book
591
- engiperi:
592
- specific_location: Engineering Library - Periodicals
593
- library: Engineering Library
594
- display: Engineering Library - Periodicals (alphabetical by title)
595
- engirefe:
596
- specific_location: Engineering Library - Reference
597
- library: Engineering Library
598
- display: Engineering Library - Reference
599
- engirese:
600
- specific_location: Engineering Library - Reserve
601
- library:
602
- - Engineering Library
603
- - Reserve
604
- display: Engineering Library - Reserve
605
- engsc:
606
- specific_location: Engineering Library - Study Collection
607
- library: Engineering Library
608
- display: Engineering Library - Study Collection
609
- eres:
610
- specific_location:
611
- library:
612
- display: E-reserves
613
565
  fanewbook:
614
566
  specific_location: Fisher Fine Arts Library - New Book Display
615
567
  library: Fisher Fine Arts Library
@@ -684,10 +636,6 @@ finestudio:
684
636
  specific_location: Fisher Fine Arts Library - Studio Collection
685
637
  library: Fisher Fine Arts Library
686
638
  display: Fine Arts Library - Studio Collection
687
- HARR:
688
- specific_location:
689
- library:
690
- display:
691
639
  judaica:
692
640
  specific_location: Van Pelt - Judaica and Ancient Near East Resource Room
693
641
  library: Van Pelt-Dietrich Library Center
@@ -822,20 +770,6 @@ mideastres:
822
770
  - Van Pelt-Dietrich Library Center
823
771
  - Reserve
824
772
  display: Van Pelt - Middle East Seminar Reserve
825
- moor:
826
- specific_location: Engineering Library
827
- library: Engineering Library
828
- display: Engineering Library
829
- moorrefe:
830
- specific_location: Engineering Library - Reference
831
- library: Engineering Library
832
- display: Engineering Library - Reference
833
- moorrese:
834
- specific_location: Engineering Library - Reserve
835
- library:
836
- - Engineering Library
837
- - Reserve
838
- display: Engineering Library - Reserve
839
773
  muse:
840
774
  specific_location: Penn Museum Library
841
775
  library: Penn Museum Library
@@ -876,6 +810,10 @@ musemedia:
876
810
  specific_location: Penn Museum Library - Media
877
811
  library: Penn Museum Library
878
812
  display: Penn Museum Library - Media
813
+ musenewbk:
814
+ specific_location: Penn Museum Library - New Books Display
815
+ library: Penn Museum Library
816
+ display: Penn Museum Library - New Books Display
879
817
  muserefe:
880
818
  specific_location: Penn Museum Library - Reference
881
819
  library: Penn Museum Library
@@ -965,83 +903,6 @@ nursarch:
965
903
  specific_location: Nursing Archives
966
904
  library: Nursing Archives
967
905
  display: Barbara Bates Center for History of Nursing - Fagin Hall 2U
968
- oobiom:
969
- specific_location: On Order
970
- library:
971
- - Health Sciences Libraries
972
- - Holman Biotech Commons
973
- display: Ordered for Holman Biotech Commons
974
- oochem:
975
- specific_location: On Order
976
- library: Chemistry Library
977
- display: Ordered for Chemistry Library
978
- oocjs:
979
- specific_location: On Order
980
- library: Library at the Katz Center for Advanced Judaic Studies
981
- display: Ordered for Center for Judaic Studies Library
982
- oodental:
983
- specific_location: On Order
984
- library:
985
- - Health Sciences Libraries
986
- - Levy Dental Medicine Library
987
- display: Ordered for Levy Dental Medicine Library
988
- ooeastasia:
989
- specific_location: On Order
990
- library: Van Pelt-Dietrich Library Center
991
- display: Ordered for East Asia
992
- ooengi:
993
- specific_location: On Order
994
- library: Engineering Library
995
- display: Ordered for Engineering Library
996
- oofine:
997
- specific_location: On Order
998
- library: Fisher Fine Arts Library
999
- display: Ordered for Fine Arts Library
1000
- oolipp:
1001
- specific_location: On Order
1002
- library: Lippincott Library
1003
- display: Ordered for Lippincott Library
1004
- oomath:
1005
- specific_location: On Order
1006
- library: Math/Physics/Astronomy Library
1007
- display: Ordered for Math-Physics-Astronomy Library
1008
- oomuse:
1009
- specific_location: On Order
1010
- library: Penn Museum Library
1011
- display: Ordered for Museum Library
1012
- oomusic:
1013
- specific_location: On Order
1014
- library: Van Pelt-Dietrich Library Center
1015
- display: Ordered for Music Library
1016
- oonewbolt:
1017
- specific_location: On Order
1018
- library:
1019
- - Health Sciences Libraries
1020
- - Veterinary
1021
- - 'Veterinary: du Pont Library (New Bolton)'
1022
- display: Ordered for New Bolton Library
1023
- ooormandy:
1024
- specific_location: On Order
1025
- library: Van Pelt-Dietrich Library Center
1026
- display: Ordered for Ormandy Center
1027
- oostor:
1028
- specific_location: On Order
1029
- library: LIBRA
1030
- display: Ordered for LIBRA
1031
- oovanp:
1032
- specific_location: On Order
1033
- library: Van Pelt-Dietrich Library Center
1034
- display: Ordered for Van Pelt Library
1035
- oovete:
1036
- specific_location: On Order
1037
- library:
1038
- - Health Sciences Libraries
1039
- - Veterinary
1040
- display: 'Ordered for Veterinary: Atwood Library (Campus)'
1041
- ooyarn:
1042
- specific_location: On Order
1043
- library: Yarnall Collection
1044
- display: Ordered for Yarnall collection
1045
906
  pah:
1046
907
  specific_location: Pennsylvania Hospital Library
1047
908
  library:
@@ -1108,24 +969,6 @@ religious:
1108
969
  specific_location: Van Pelt - Medieval Studies Resource Room
1109
970
  library: Van Pelt-Dietrich Library Center
1110
971
  display: Van Pelt - Medieval Studies Resource Room (405)
1111
- rosedesk:
1112
- specific_location: Van Pelt - Rosengarten Reserve
1113
- library:
1114
- - Van Pelt-Dietrich Library Center
1115
- - Reserve
1116
- display: Van Pelt - Rosengarten Reserve Desk
1117
- roserefe:
1118
- specific_location: Van Pelt - Rosengarten Reserve
1119
- library:
1120
- - Van Pelt-Dietrich Library Center
1121
- - Reserve
1122
- display: Van Pelt - Rosengarten Reserve Reference
1123
- roserese:
1124
- specific_location: Van Pelt - Rosengarten Reserve
1125
- library:
1126
- - Van Pelt-Dietrich Library Center
1127
- - Reserve
1128
- display: Van Pelt - Rosengarten Reserve
1129
972
  rotc:
1130
973
  specific_location:
1131
974
  library:
@@ -1526,41 +1369,14 @@ scrunning:
1526
1369
  - Special Collections
1527
1370
  - LIBRA
1528
1371
  display: LIBRA Running Press Collection
1529
- sw3rdfl:
1530
- specific_location: Van Pelt - Temporarily shelved on third floor southwest corner
1531
- library: Van Pelt-Dietrich Library Center
1532
- display: Van Pelt - Temporarily shelved on third floor southwest corner
1533
- refsw3rdfl:
1534
- specific_location: Van Pelt - Temporarily shelved on third floor southwest reference
1535
- corner
1536
- library: Van Pelt-Dietrich Library Center
1537
- display: Van Pelt - Temporarily shelved on third floor southwest reference corner
1538
- town:
1539
- specific_location: Engineering Library
1540
- library: Engineering Library
1541
- display: Engineering Library
1542
- townrefe:
1543
- specific_location: Engineering Library - Reference
1544
- library: Engineering Library
1545
- display: Engineering Library - Reference
1546
- townrese:
1547
- specific_location: Engineering Library - Reserve
1548
- library:
1549
- - Engineering Library
1550
- - Reserve
1551
- display: Engineering Library - Reserve
1552
- townthes:
1553
- specific_location: Engineering Library - Theses
1554
- library: Engineering Library
1555
- display: Engineering Library - Theses
1556
- twcirc:
1557
- specific_location:
1558
- library: Engineering Library
1559
- display: Engineering Library - Circulation Desk
1560
1372
  univarch:
1561
1373
  specific_location: University Archives
1562
1374
  library: University Archives
1563
1375
  display: University Archives
1376
+ RDDSXBooks:
1377
+ specific_location: Van Pelt - RDDSX Books
1378
+ library: Van Pelt-Dietrich Library Center
1379
+ display: Van Pelt - RDDSX Books
1564
1380
  vanp:
1565
1381
  specific_location: Van Pelt - Stacks
1566
1382
  library: Van Pelt-Dietrich Library Center
@@ -1577,14 +1393,14 @@ vanpcgc:
1577
1393
  specific_location: Van Pelt - Center for Global Collections
1578
1394
  library: Van Pelt-Dietrich Library Center
1579
1395
  display: Van Pelt - Center for Global Collections
1396
+ vanpcgccm:
1397
+ specific_location: Van Pelt - Global Comics Collection
1398
+ library: Van Pelt-Dietrich Library Center
1399
+ display: Van Pelt - Global Comics Collection
1580
1400
  vanpmicro:
1581
1401
  specific_location: Van Pelt - Microtext
1582
1402
  library: Van Pelt-Dietrich Library Center
1583
1403
  display: Van Pelt - Microtext
1584
- vanpmiddle:
1585
- specific_location:
1586
- library:
1587
- display: Van Pelt - Middle East Tech Services
1588
1404
  vanpNoCirc:
1589
1405
  specific_location: Van Pelt - Non Circulating
1590
1406
  library: Van Pelt-Dietrich Library Center
@@ -1798,4 +1614,4 @@ hspref:
1798
1614
  hspstafref:
1799
1615
  specific_location: Historical Society of Pennsylvania - Staff Reference
1800
1616
  library: Historical Society of Pennsylvania
1801
- display: Historical Society of Pennsylvania - Staff Reference
1617
+ display: Historical Society of Pennsylvania - Staff Reference
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module PennMARC
4
- VERSION = '1.0.9'
4
+ VERSION = '1.0.11.pre1'
5
5
  end
data/pennmarc.gemspec CHANGED
@@ -23,5 +23,5 @@ Gem::Specification.new do |s|
23
23
  s.add_dependency 'marc', '~> 1.2'
24
24
  s.add_dependency 'nokogiri', '~> 1.15'
25
25
 
26
- s.metadata['rubygems_mfa_required'] = 'true'
26
+ s.metadata['rubygems_mfa_required'] = 'false'
27
27
  end
@@ -18,7 +18,7 @@ describe 'PennMARC::Access' do
18
18
  end
19
19
 
20
20
  context 'with enrichment with availability info via the Alma API' do
21
- let(:tag) { PennMARC::Access::ELEC_AVAILABILITY_TAG }
21
+ let(:tag) { PennMARC::EnrichedMarc::AlmaApi::TAG_ELECTRONIC_INVENTORY }
22
22
 
23
23
  it 'returns expected access value' do
24
24
  expect(helper.facet(record)).to contain_exactly(PennMARC::Access::ONLINE)
@@ -38,7 +38,7 @@ describe 'PennMARC::Access' do
38
38
  end
39
39
 
40
40
  context 'with enrichment with availability info via the Alma API' do
41
- let(:tag) { PennMARC::Access::PHYS_AVAILABILITY_TAG }
41
+ let(:tag) { PennMARC::EnrichedMarc::AlmaApi::TAG_PHYSICAL_INVENTORY }
42
42
 
43
43
  it 'returns expected access value' do
44
44
  expect(helper.facet(record)).to contain_exactly(PennMARC::Access::AT_THE_LIBRARY)
@@ -21,39 +21,39 @@ describe 'PennMARC::Database' do
21
21
  ])
22
22
  end
23
23
 
24
- describe '.type' do
24
+ describe '.type_facet' do
25
25
  it 'returns database types' do
26
- expect(helper.type(record)).to contain_exactly('Dictionaries and Thesauri (language based)',
27
- 'Reference and Handbooks')
26
+ expect(helper.type_facet(record)).to contain_exactly('Dictionaries and Thesauri (language based)',
27
+ 'Reference and Handbooks')
28
28
  end
29
29
 
30
30
  context 'with uncurated database' do
31
31
  it 'returns empty array' do
32
- expect(helper.type(record_uncurated_db)).to be_empty
32
+ expect(helper.type_facet(record_uncurated_db)).to be_empty
33
33
  end
34
34
  end
35
35
  end
36
36
 
37
- describe '.db_category' do
37
+ describe '.category_facet' do
38
38
  it 'returns database categories' do
39
- expect(helper.db_category(record)).to contain_exactly('Humanities', 'Social Sciences')
39
+ expect(helper.category_facet(record)).to contain_exactly('Humanities', 'Social Sciences')
40
40
  end
41
41
 
42
42
  context 'with uncurated database' do
43
43
  it 'returns empty array' do
44
- expect(helper.db_category(record_uncurated_db)).to be_empty
44
+ expect(helper.category_facet(record_uncurated_db)).to be_empty
45
45
  end
46
46
  end
47
47
  end
48
48
 
49
- describe '.db_subcategory' do
49
+ describe '.subcategory_facet' do
50
50
  it 'returns database subcategories' do
51
- expect(helper.db_subcategory(record)).to contain_exactly('Social Sciences--Linguistics')
51
+ expect(helper.subcategory_facet(record)).to contain_exactly('Social Sciences--Linguistics')
52
52
  end
53
53
 
54
54
  context 'with uncurated database' do
55
55
  it 'returns empty array' do
56
- expect(helper.db_subcategory(record_uncurated_db)).to be_empty
56
+ expect(helper.subcategory_facet(record_uncurated_db)).to be_empty
57
57
  end
58
58
  end
59
59
  end
@@ -60,18 +60,38 @@ describe 'PennMARC::Format' do
60
60
  end
61
61
 
62
62
  it 'returns a facet value of only "Microformat"' do
63
- # expect(formats).to eq %w[Microformat Thesis/Dissertation]
64
63
  expect(formats).to eq %w[Microformat]
65
64
  end
66
65
  end
67
66
 
68
67
  context 'with Microformats as determined by the holding call numbers' do
69
- let(:record) do
70
- marc_record fields: [marc_field(tag: 'hld', subfields: { h: 'AB123', i: '.456 Microfilm' })]
68
+ context 'with API enriched fields' do
69
+ let(:record) do
70
+ marc_record fields: [
71
+ marc_field(tag: PennMARC::EnrichedMarc::AlmaApi::TAG_PHYSICAL_INVENTORY, subfields: {
72
+ :h => 'AB123',
73
+ PennMARC::EnrichedMarc::AlmaApi::SUB_PHYSICAL_CALL_NUMBER_TYPE => '.456 Microfilm'
74
+ })
75
+ ]
76
+ end
77
+
78
+ it 'returns a facet value of "Microformat"' do
79
+ expect(formats).to eq ['Microformat']
80
+ end
71
81
  end
72
82
 
73
- it 'returns a facet value of "Microformat"' do
74
- expect(formats).to eq ['Microformat']
83
+ context 'with publishing enriched fields' do
84
+ let(:record) do
85
+ marc_record fields: [
86
+ marc_field(tag: PennMARC::EnrichedMarc::TAG_HOLDING,
87
+ subfields: { :h => 'AB123',
88
+ PennMARC::EnrichedMarc::SUB_ITEM_CALL_NUMBER_TYPE => '.456 Microfilm' })
89
+ ]
90
+ end
91
+
92
+ it 'returns a facet value of "Microformat"' do
93
+ expect(formats).to eq ['Microformat']
94
+ end
75
95
  end
76
96
  end
77
97
 
@@ -5,7 +5,7 @@ describe 'PennMARC::Link' do
5
5
 
6
6
  let(:helper) { PennMARC::Link }
7
7
 
8
- describe '.full_text' do
8
+ describe '.full_text_link' do
9
9
  let(:record) do
10
10
  marc_record fields: [marc_field(tag: '856', subfields: { '3': 'Materials specified',
11
11
  z: 'Public note',
@@ -15,12 +15,12 @@ describe 'PennMARC::Link' do
15
15
  end
16
16
 
17
17
  it 'returns full text link text and url' do
18
- expect(helper.full_text(record)).to contain_exactly({ link_text: 'Materials specified Public note',
19
- link_url: 'https://www.test-uri.com/' })
18
+ expect(helper.full_text_links(record)).to contain_exactly({ link_text: 'Materials specified Public note',
19
+ link_url: 'https://www.test-uri.com/' })
20
20
  end
21
21
  end
22
22
 
23
- describe '.web' do
23
+ describe '.web_link' do
24
24
  let(:record) do
25
25
  marc_record fields: [marc_field(tag: '856', subfields: { '3': 'Materials specified',
26
26
  z: 'Public note',
@@ -30,8 +30,8 @@ describe 'PennMARC::Link' do
30
30
  end
31
31
 
32
32
  it 'returns web link text and url' do
33
- expect(helper.web(record)).to contain_exactly({ link_text: 'Materials specified Public note',
34
- link_url: 'https://www.test-uri.com/' })
33
+ expect(helper.web_links(record)).to contain_exactly({ link_text: 'Materials specified Public note',
34
+ link_url: 'https://www.test-uri.com/' })
35
35
  end
36
36
  end
37
37
  end
@@ -67,5 +67,17 @@ describe 'PennMARC::Location' do
67
67
  display_value: :library)).to contain_exactly('LIBRA', 'Online library')
68
68
  end
69
69
  end
70
+
71
+ context 'with AVA fields' do
72
+ let(:record) do
73
+ marc_record(fields: [marc_field(tag: 'AVA', subfields: { b: 'Libra', c: 'LIBRA', j: 'stor' })])
74
+ end
75
+
76
+ it 'returns expected values' do
77
+ expect(helper.location(record: record, location_map: mapping, display_value: :library)).to(
78
+ contain_exactly('LIBRA')
79
+ )
80
+ end
81
+ end
70
82
  end
71
83
  end
@@ -18,6 +18,7 @@ describe 'PennMARC::Note' do
18
18
  b: 'UK', c: 'Historical Association',
19
19
  d: '1917', e: '434 reels',
20
20
  f: '(Seized records)' }),
21
+ marc_field(tag: '540', subfields: { a: 'Restricted: Copying allowed only for nonprofit organizations' }),
21
22
  marc_field(tag: '588', subfields: { a: 'Print version record', '5': 'LoC' }),
22
23
  marc_field(tag: '880', subfields: { b: 'Alt PhD', c: 'Alt UPenn', d: 'Alt 2021', '6': '502' }),
23
24
  marc_field(tag: '880', subfields: { b: 'Ignore Note', '6': '501' })
@@ -32,6 +33,7 @@ describe 'PennMARC::Note' do
32
33
  'PhD University of Pennsylvania 2021',
33
34
  'Includes bibliographical references (pages 329-[342]) and index.',
34
35
  'Archives Microfilm UK Historical Association 1917 434 reels (Seized records)',
36
+ 'Restricted: Copying allowed only for nonprofit organizations',
35
37
  'Print version record', 'Alt PhD Alt UPenn Alt 2021')
36
38
  end
37
39
  end
@@ -18,7 +18,7 @@ describe 'PennMARC::Series' do
18
18
  end
19
19
 
20
20
  describe '.show' do
21
- it 'returns the series' do
21
+ it 'returns the series values for display' do
22
22
  expect(helper.show(record, relator_map: mapping)).to contain_exactly(
23
23
  'Bean Bagatolvski 1997- bk. 1',
24
24
  'Teachings of the feathered pillow',
@@ -28,7 +28,7 @@ describe 'PennMARC::Series' do
28
28
  end
29
29
 
30
30
  describe '.values' do
31
- it 'returns the values' do
31
+ it 'returns the series values' do
32
32
  expect(helper.values(record, relator_map: mapping)).to contain_exactly('Bean Bagatolvski 1997- bk. 1.')
33
33
  end
34
34
  end
@@ -43,15 +43,15 @@ describe 'PennMARC::Series' do
43
43
  end
44
44
  end
45
45
 
46
- describe '.get_continues_display' do
47
- it 'gets continues for display' do
48
- expect(helper.get_continues_display(record)).to contain_exactly('National Comfort Association')
46
+ describe '.get_continues_show' do
47
+ it 'gets continues values for display' do
48
+ expect(helper.get_continues_show(record)).to contain_exactly('National Comfort Association')
49
49
  end
50
50
  end
51
51
 
52
- describe '.get_continued_by_display' do
53
- it 'gets continued by display' do
54
- expect(helper.get_continued_by_display(record)).to contain_exactly('NCA quarterly comfortology bulletin')
52
+ describe '.get_continued_by_show' do
53
+ it 'gets continued by values for display' do
54
+ expect(helper.get_continued_by_show(record)).to contain_exactly('NCA quarterly comfortology bulletin')
55
55
  end
56
56
  end
57
57
  end
@@ -195,7 +195,7 @@ describe 'PennMARC::Title' do
195
195
  end
196
196
  end
197
197
 
198
- describe '.standardized' do
198
+ describe '.standardized_show' do
199
199
  let(:record) do
200
200
  marc_record fields: [
201
201
  marc_field(tag: '130', subfields: { a: 'Uniform Title', f: '2000', '8': 'Not Included' }),
@@ -208,7 +208,7 @@ describe 'PennMARC::Title' do
208
208
  end
209
209
 
210
210
  it 'returns the expected standardized title display values' do
211
- values = helper.standardized(record)
211
+ values = helper.standardized_show(record)
212
212
  expect(values).to contain_exactly(
213
213
  'Another Uniform Title', 'Translated Uniform Title', 'Uniform Title 2000', 'Yet Another Uniform Title'
214
214
  )
@@ -216,7 +216,7 @@ describe 'PennMARC::Title' do
216
216
  end
217
217
  end
218
218
 
219
- describe '.other' do
219
+ describe '.other_show' do
220
220
  let(:record) do
221
221
  marc_record fields: [
222
222
  marc_field(tag: '246', subfields: { a: 'Varied Title', f: '2000', '8': 'Not Included' }),
@@ -227,13 +227,13 @@ describe 'PennMARC::Title' do
227
227
  end
228
228
 
229
229
  it 'returns the expected other title display values' do
230
- expect(helper.other(record)).to contain_exactly(
230
+ expect(helper.other_show(record)).to contain_exactly(
231
231
  'Alternate Varied Title', 'Uncontrolled Title', 'Varied Title 2000'
232
232
  )
233
233
  end
234
234
  end
235
235
 
236
- describe '.former' do
236
+ describe '.former_show' do
237
237
  let(:record) do
238
238
  marc_record fields: [
239
239
  marc_field(tag: '247', subfields: { a: 'Former Title', n: 'Part', '6': 'Linkage', e: 'Append' }),
@@ -242,7 +242,7 @@ describe 'PennMARC::Title' do
242
242
  end
243
243
 
244
244
  it 'returns the expected former title value' do
245
- values = helper.former(record)
245
+ values = helper.former_show(record)
246
246
  expect(values).to contain_exactly 'Former Title Part Append', 'Alt Title Part'
247
247
  expect(values).not_to include 'Linkage', '247'
248
248
  end
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.9
4
+ version: 1.0.11.pre1
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: 2023-12-08 00:00:00.000000000 Z
13
+ date: 2024-01-11 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: activesupport
@@ -77,6 +77,7 @@ extensions: []
77
77
  extra_rdoc_files: []
78
78
  files:
79
79
  - ".gitignore"
80
+ - ".gitlab-ci.yml"
80
81
  - ".gitleaks.toml"
81
82
  - ".rspec"
82
83
  - ".rubocop.yml"
@@ -148,7 +149,7 @@ homepage: https://gitlab.library.upenn.edu/dld/catalog/pennmarc
148
149
  licenses:
149
150
  - MIT
150
151
  metadata:
151
- rubygems_mfa_required: 'true'
152
+ rubygems_mfa_required: 'false'
152
153
  post_install_message:
153
154
  rdoc_options: []
154
155
  require_paths:
@@ -160,9 +161,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
160
161
  version: '3.2'
161
162
  required_rubygems_version: !ruby/object:Gem::Requirement
162
163
  requirements:
163
- - - ">="
164
+ - - ">"
164
165
  - !ruby/object:Gem::Version
165
- version: '0'
166
+ version: 1.3.1
166
167
  requirements: []
167
168
  rubygems_version: 3.4.10
168
169
  signing_key: