pennmarc 1.0.0 → 1.0.2
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/.rubocop.yml +3 -0
- data/.rubocop_todo.yml +37 -21
- data/Gemfile.lock +3 -0
- data/README.md +12 -2
- data/lib/pennmarc/helpers/creator.rb +24 -20
- data/lib/pennmarc/helpers/edition.rb +15 -13
- data/lib/pennmarc/helpers/format.rb +3 -3
- data/lib/pennmarc/helpers/genre.rb +5 -4
- data/lib/pennmarc/helpers/helper.rb +1 -0
- data/lib/pennmarc/helpers/identifier.rb +32 -15
- data/lib/pennmarc/helpers/language.rb +3 -3
- data/lib/pennmarc/helpers/location.rb +10 -10
- data/lib/pennmarc/helpers/note.rb +0 -2
- data/lib/pennmarc/helpers/relation.rb +7 -7
- data/lib/pennmarc/helpers/series.rb +19 -31
- data/lib/pennmarc/helpers/subject.rb +11 -11
- data/lib/pennmarc/helpers/title.rb +1 -1
- data/lib/pennmarc/mappers.rb +31 -0
- data/lib/pennmarc/parser.rb +36 -62
- data/lib/pennmarc/util.rb +10 -11
- data/lib/pennmarc/version.rb +5 -0
- data/pennmarc.gemspec +5 -1
- data/spec/lib/pennmarc/helpers/creator_spec.rb +9 -9
- data/spec/lib/pennmarc/helpers/edition_spec.rb +3 -2
- data/spec/lib/pennmarc/helpers/format_spec.rb +1 -1
- data/spec/lib/pennmarc/helpers/genre_spec.rb +1 -1
- data/spec/lib/pennmarc/helpers/identifer_spec.rb +43 -14
- data/spec/lib/pennmarc/helpers/language_spec.rb +1 -1
- data/spec/lib/pennmarc/helpers/location_spec.rb +8 -8
- data/spec/lib/pennmarc/helpers/relation_spec.rb +2 -2
- data/spec/lib/pennmarc/helpers/series_spec.rb +6 -5
- data/spec/lib/pennmarc/helpers/subject_spec.rb +1 -1
- data/spec/lib/pennmarc/parser_spec.rb +22 -1
- metadata +7 -8
- data/legacy/indexer.rb +0 -568
- data/legacy/marc.rb +0 -2964
- data/legacy/test_file_output.json +0 -49
@@ -4,7 +4,6 @@ module PennMARC
|
|
4
4
|
# Do Series and series-related field processing. Many of these fields are added entries that are justified by
|
5
5
|
# corresponding series statements (usually 490). These fields provide information about the published series in which
|
6
6
|
# a book, encoded finding aid, or other published work has appeared
|
7
|
-
# @todo We may want to include 410 in the display tags, since it is included in references below.
|
8
7
|
class Series < Helper
|
9
8
|
class << self
|
10
9
|
# 800 - Series Added Entry-Personal Name - https://www.loc.gov/marc/bibliographic/bd800.html
|
@@ -16,17 +15,17 @@ module PennMARC
|
|
16
15
|
# 411 - Series Statement/Added Entry Meeting Name - https://www.loc.gov/marc/bibliographic/bd411.html
|
17
16
|
# 440 - Series Statement/Added Entry-Title - https://www.loc.gov/marc/bibliographic/bd440.html
|
18
17
|
# 490 - Series Statement - https://www.loc.gov/marc/bibliographic/bd490.html
|
19
|
-
DISPLAY_TAGS = %w[800 810 811 830 400 411 440 490].freeze
|
18
|
+
DISPLAY_TAGS = %w[800 810 811 830 400 410 411 440 490].freeze
|
20
19
|
|
21
20
|
# Fields for display that pertain to series information.
|
22
21
|
# @param [MARC::Record] record
|
23
|
-
# @param [Hash]
|
22
|
+
# @param [Hash] relator_map
|
24
23
|
# @return [Array<String>] array of series information
|
25
|
-
def show(record,
|
24
|
+
def show(record, relator_map: Mappers.relator)
|
26
25
|
tags_present = DISPLAY_TAGS.select { |tag| record[tag].present? }
|
27
26
|
|
28
27
|
values = if %w[800 810 811 400 410 411].member?(tags_present.first)
|
29
|
-
author_show_entries(record, tags_present.first,
|
28
|
+
author_show_entries(record, tags_present.first, relator_map)
|
30
29
|
elsif %w[830 440 490].member?(tags_present.first)
|
31
30
|
title_show_entries(record, tags_present.first)
|
32
31
|
end || []
|
@@ -37,14 +36,14 @@ module PennMARC
|
|
37
36
|
|
38
37
|
# Values from series fields for display.
|
39
38
|
# @param [MARC::Record] record
|
40
|
-
# @param [Hash]
|
39
|
+
# @param [Hash] relator_map
|
41
40
|
# @return [Array<String>] array of series values
|
42
|
-
def values(record,
|
41
|
+
def values(record, relator_map: Mappers.relator)
|
43
42
|
series_8x = record.fields(%w[800 810 811 830]).first
|
44
|
-
return Array.wrap(
|
43
|
+
return Array.wrap(series_field(series_8x, relator_map)) if series_8x
|
45
44
|
|
46
45
|
series_4x = record.fields(%w[400 410 411 440 490]).first
|
47
|
-
|
46
|
+
Array.wrap(series_field(series_4x, relator_map)) if series_4x
|
48
47
|
end
|
49
48
|
|
50
49
|
# Series fields for search.
|
@@ -111,8 +110,9 @@ module PennMARC
|
|
111
110
|
def author_show_entries(record, first_tag, relator_mapping)
|
112
111
|
record.fields(first_tag).map do |field|
|
113
112
|
series = join_subfields(field, &subfield_not_in?(%w[0 5 6 8 e t w v n]))
|
113
|
+
author_show_subfields = %w[e w v n t]
|
114
114
|
pairs = field.map do |sf|
|
115
|
-
if
|
115
|
+
if author_show_subfields.member?(sf.code)
|
116
116
|
[' ', sf.value]
|
117
117
|
elsif sf.code == '4'
|
118
118
|
[', ', translate_relator(sf.value, relator_mapping)]
|
@@ -164,31 +164,19 @@ module PennMARC
|
|
164
164
|
end || []
|
165
165
|
end
|
166
166
|
|
167
|
-
# Assemble a formatted string of a given
|
168
|
-
# @note added 2017/04/10: filter out 0 (authority record numbers) added by Alma
|
169
|
-
# @param [String] field
|
170
|
-
# @param [Hash] relator_mapping
|
171
|
-
# @return [String] series 8xx field
|
172
|
-
def series_8xx_field(field, relator_mapping)
|
173
|
-
s = field.filter_map { |sf|
|
174
|
-
if %w[0 4 5 6 8].exclude?(sf.code)
|
175
|
-
" #{sf.value}"
|
176
|
-
elsif sf.code == '4'
|
177
|
-
", #{translate_relator(sf.value, relator_mapping)}"
|
178
|
-
end
|
179
|
-
}.join
|
180
|
-
s2 = s + (%w[. -].exclude?(s[-1]) ? '.' : '')
|
181
|
-
s2.squish
|
182
|
-
end
|
183
|
-
|
184
|
-
# Assemble a formatted string of a given 4xx field.
|
167
|
+
# Assemble a formatted string of a given field.
|
185
168
|
# @note added 2017/04/10: filter out 0 (authority record numbers) added by Alma
|
186
|
-
# @param [
|
169
|
+
# @param [MARC::Field] field
|
187
170
|
# @param [Hash] relator_mapping
|
188
171
|
# @return [String] series 4xx field
|
189
|
-
def
|
172
|
+
def series_field(field, relator_mapping)
|
173
|
+
subfields = if field.tag.start_with? '4'
|
174
|
+
%w[0 4 6 8]
|
175
|
+
else
|
176
|
+
%w[0 4 5 6 8]
|
177
|
+
end
|
190
178
|
s = field.filter_map { |sf|
|
191
|
-
if
|
179
|
+
if subfields.exclude?(sf.code)
|
192
180
|
" #{sf.value}"
|
193
181
|
elsif sf.code == '4'
|
194
182
|
", #{translate_relator(sf.value, relator_mapping)}"
|
@@ -26,14 +26,14 @@ module PennMARC
|
|
26
26
|
# Local subject heading tags
|
27
27
|
LOCAL_TAGS = %w[690 691 697].freeze
|
28
28
|
|
29
|
-
# All Subjects for searching. This includes most subfield content from any field contained in {SEARCH_TAGS} or
|
30
|
-
# including any linked 880 fields. Fields must have an indicator2 value in {SEARCH_SOURCE_INDICATORS}.
|
29
|
+
# All Subjects for searching. This includes most subfield content from any field contained in {SEARCH_TAGS} or
|
30
|
+
# 69X, including any linked 880 fields. Fields must have an indicator2 value in {SEARCH_SOURCE_INDICATORS}.
|
31
31
|
# @todo this includes subfields that may not be desired like 1 (uri) and 2 (source code) but this might be OK for
|
32
32
|
# a search (non-display) field?
|
33
|
-
# @param [Hash]
|
33
|
+
# @param [Hash] relator_map
|
34
34
|
# @param [MARC::Record] record
|
35
35
|
# @return [Array] array of all subject values for search
|
36
|
-
def search(record,
|
36
|
+
def search(record, relator_map: Mappers.relator)
|
37
37
|
subject_fields(record, type: :search).filter_map do |field|
|
38
38
|
subj_parts = field.filter_map do |subfield|
|
39
39
|
# TODO: use term hash here? pro/chr would be rejected...
|
@@ -45,10 +45,9 @@ module PennMARC
|
|
45
45
|
# remove any ? at the end
|
46
46
|
subfield.value.gsub(/^%?(PRO|CHR)/, '').gsub(/\?$/, '').strip
|
47
47
|
when '4'
|
48
|
-
# TODO: use relation mapping method from Title helper? for potential URI support?
|
49
48
|
# sf 4 should contain a 3-letter code or URI "that specifies the relationship from the entity described
|
50
49
|
# in the record to the entity referenced in the field"
|
51
|
-
"#{subfield.value} #{
|
50
|
+
"#{subfield.value} #{translate_relator(subfield.value.to_sym, relator_map)}".strip
|
52
51
|
else
|
53
52
|
subfield.value
|
54
53
|
end
|
@@ -169,7 +168,8 @@ module PennMARC
|
|
169
168
|
def format_term(type:, term:)
|
170
169
|
return unless type.in? %i[facet display]
|
171
170
|
|
172
|
-
|
171
|
+
# attempt to handle poorly coded record
|
172
|
+
normalize_single_subfield(term[:parts].first) if term[:count] == 1 && term[:parts].first.present?
|
173
173
|
|
174
174
|
case type.to_sym
|
175
175
|
when :facet
|
@@ -183,7 +183,7 @@ module PennMARC
|
|
183
183
|
# @param [MARC::DataField] field
|
184
184
|
# @return [Boolean] whether a MARC field is intended for display under general "Subjects"
|
185
185
|
def subject_general_display_field?(field)
|
186
|
-
return false unless field.tag.in?
|
186
|
+
return false unless field.tag.in?(DISPLAY_TAGS + LOCAL_TAGS) && field.respond_to?(:indicator2)
|
187
187
|
|
188
188
|
return false if field.indicator2 == '7' && !valid_subject_genre_source_code?(field)
|
189
189
|
|
@@ -200,7 +200,7 @@ module PennMARC
|
|
200
200
|
# @param [Hash] options include :tags and :indicator2 values
|
201
201
|
# @return [Boolean] whether a MARC field should be considered for display
|
202
202
|
def subject_display_field?(field, options)
|
203
|
-
return false
|
203
|
+
return false unless field.respond_to?(:indicator2)
|
204
204
|
|
205
205
|
return true if field.tag.in?(options[:tags]) && field.indicator2.in?(options[:indicator2])
|
206
206
|
|
@@ -210,7 +210,7 @@ module PennMARC
|
|
210
210
|
# @param [MARC::DataField] field
|
211
211
|
# @return [Boolean]
|
212
212
|
def subject_facet_field?(field)
|
213
|
-
return false
|
213
|
+
return false unless field.respond_to?(:indicator2)
|
214
214
|
|
215
215
|
return true if field.tag.in?(DISPLAY_TAGS) && field.indicator2.in?(%w[0 2 4])
|
216
216
|
|
@@ -269,7 +269,7 @@ module PennMARC
|
|
269
269
|
# @param [MARC::DataField] field
|
270
270
|
# @return [Boolean]
|
271
271
|
def subject_search_field?(field)
|
272
|
-
return false
|
272
|
+
return false unless field.respond_to?(:indicator2) && SEARCH_SOURCE_INDICATORS.include?(field.indicator2)
|
273
273
|
|
274
274
|
tag = if field.tag == '880'
|
275
275
|
subfield_values(field, '6').first
|
@@ -89,7 +89,7 @@ module PennMARC
|
|
89
89
|
end
|
90
90
|
raw_title = join_subfields(title_field, &subfield_in?(['a'])) # get title from subfield a
|
91
91
|
value = if offset.between?(1, 9)
|
92
|
-
{ prefix: raw_title[0..offset - 1]
|
92
|
+
{ prefix: raw_title[0..offset - 1]&.strip, filing: raw_title[offset..]&.strip }
|
93
93
|
elsif raw_title.present?
|
94
94
|
handle_bracket_prefix raw_title
|
95
95
|
else
|
@@ -0,0 +1,31 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module PennMARC
|
4
|
+
# reusable static mappers
|
5
|
+
class Mappers
|
6
|
+
class << self
|
7
|
+
# @return [Hash]
|
8
|
+
def language
|
9
|
+
@language ||= load_map('language.yml')
|
10
|
+
end
|
11
|
+
|
12
|
+
# @return [Hash]
|
13
|
+
def location
|
14
|
+
@location ||= load_map('locations.yml')
|
15
|
+
end
|
16
|
+
|
17
|
+
# @return [Hash]
|
18
|
+
def relator
|
19
|
+
@relator ||= load_map('relator.yml')
|
20
|
+
end
|
21
|
+
|
22
|
+
# @param [String] filename of mapping file in config directory, with file extension
|
23
|
+
# @return [Hash] mapping as hash
|
24
|
+
def load_map(filename)
|
25
|
+
puts { "Loading #{filename}" }
|
26
|
+
YAML.safe_load(File.read(File.join(File.expand_path(__dir__), 'mappings', filename)),
|
27
|
+
symbolize_names: true)
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
data/lib/pennmarc/parser.rb
CHANGED
@@ -2,79 +2,53 @@
|
|
2
2
|
|
3
3
|
require 'active_support/all'
|
4
4
|
require_relative 'helpers/helper'
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
require_relative 'helpers/genre'
|
10
|
-
require_relative 'helpers/identifier'
|
11
|
-
require_relative 'helpers/language'
|
12
|
-
require_relative 'helpers/link'
|
13
|
-
require_relative 'helpers/location'
|
14
|
-
require_relative 'helpers/subject'
|
15
|
-
require_relative 'helpers/title'
|
16
|
-
require_relative 'helpers/citation'
|
17
|
-
require_relative 'helpers/relation'
|
18
|
-
require_relative 'helpers/production'
|
19
|
-
require_relative 'helpers/edition'
|
20
|
-
require_relative 'helpers/note'
|
21
|
-
require_relative 'helpers/series'
|
5
|
+
|
6
|
+
# Require all files in helpers directory
|
7
|
+
# TODO: this double-requires Helper, but that needs to be required before other helpers...
|
8
|
+
Dir[File.join(__dir__, 'helpers', '*.rb')].each { |file| require file }
|
22
9
|
|
23
10
|
# Top level gem namespace
|
24
11
|
module PennMARC
|
25
|
-
|
26
|
-
|
27
|
-
DEFINED_HELPERS = %w[Creator Database Date Format Genre Language Link Location Subject Title Relation].freeze
|
28
|
-
|
29
|
-
# Methods here should return values used in the indexer. The parsing logic should
|
30
|
-
# NOT return values specific to any particular site/interface, but just general
|
31
|
-
# MARC parsing logic for "title", "subject", "author", etc., as much as reasonably
|
32
|
-
# possible. We'll see how it goes.
|
33
|
-
#
|
34
|
-
# Methods should, by default, take in a MARC::Record
|
12
|
+
# Access point for magic calls to helper methods
|
35
13
|
class Parser
|
36
|
-
|
37
|
-
|
38
|
-
|
14
|
+
# Allow calls to `respond_to?` on parser instances to respond accurately by checking helper classes
|
15
|
+
# @param [String, Symbol] name
|
16
|
+
# @return [Boolean]
|
17
|
+
def respond_to_missing?(name, include_private = false)
|
18
|
+
helper, method_name = parse_call(name)
|
19
|
+
begin
|
20
|
+
"PennMARC::#{helper}".constantize.respond_to?(method_name)
|
21
|
+
rescue NameError
|
22
|
+
super # Helper is not defined, so check self
|
23
|
+
end
|
39
24
|
end
|
40
25
|
|
41
|
-
|
42
|
-
name.split('_').first.in? @helpers
|
43
|
-
end
|
44
|
-
|
45
|
-
# Call helper class methods, e.g.,
|
26
|
+
# Call helper class methods, passing along additional arguments as needed, e.g.:
|
46
27
|
# #title_show -> PennMARC::Title.show
|
47
28
|
# #subject_facet -> PennMARC::Subject.facet
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
29
|
+
# @param [Symbol] name
|
30
|
+
# @param [MARC::Record] record
|
31
|
+
# @param [Array] opts
|
32
|
+
def method_missing(name, record, *opts)
|
33
|
+
helper, method_name = parse_call(name)
|
34
|
+
raise NoMethodError unless helper && method_name
|
35
|
+
|
36
|
+
helper_klass = "PennMARC::#{helper.titleize}".constantize
|
37
|
+
if opts.any?
|
38
|
+
helper_klass.public_send(method_name, record, **opts.first)
|
39
|
+
else
|
40
|
+
helper_klass.public_send(method_name, record)
|
41
|
+
end
|
53
42
|
end
|
54
43
|
|
55
|
-
|
56
|
-
# @return [Hash]
|
57
|
-
def language_map
|
58
|
-
@mappings[:language] ||= load_map('language.yml')
|
59
|
-
end
|
60
|
-
|
61
|
-
# Load location map from YAML and memoize in @mappings hash
|
62
|
-
# @return [Hash]
|
63
|
-
def location_map
|
64
|
-
@mappings[:location] ||= load_map('locations.yml')
|
65
|
-
end
|
44
|
+
private
|
66
45
|
|
67
|
-
#
|
68
|
-
# @
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
# @param [String] filename of mapping file in config directory, with file extension
|
74
|
-
# @return [Hash] mapping as hash
|
75
|
-
def load_map(filename)
|
76
|
-
YAML.safe_load(File.read(File.join(File.expand_path(__dir__), 'mappings', filename)),
|
77
|
-
symbolize_names: true)
|
46
|
+
# Parse out a method call name in the way method_missing is configured to handle
|
47
|
+
# @param [String, Symbol] name
|
48
|
+
# @return [Array]
|
49
|
+
def parse_call(name)
|
50
|
+
call = name.to_s.split('_')
|
51
|
+
[call.shift&.titleize, call.join('_').to_sym]
|
78
52
|
end
|
79
53
|
end
|
80
54
|
end
|
data/lib/pennmarc/util.rb
CHANGED
@@ -9,8 +9,10 @@ module PennMARC
|
|
9
9
|
# @param [MARC::DataField] field
|
10
10
|
# @param [Proc] selector
|
11
11
|
# @return [String]
|
12
|
-
def join_subfields(field, &)
|
13
|
-
|
12
|
+
def join_subfields(field, &selector)
|
13
|
+
return '' unless field
|
14
|
+
|
15
|
+
field.select(&selector).filter_map { |sf|
|
14
16
|
value = sf.value&.strip
|
15
17
|
next if value.blank?
|
16
18
|
|
@@ -26,7 +28,7 @@ module PennMARC
|
|
26
28
|
# @param [Regexp] regex
|
27
29
|
# @return [TrueClass, FalseClass]
|
28
30
|
def subfield_value?(field, subfield, regex)
|
29
|
-
field
|
31
|
+
field&.any? { |sf| sf.code == subfield.to_s && sf.value =~ regex }
|
30
32
|
end
|
31
33
|
|
32
34
|
# returns true if a given field has a given subfield value in a given array
|
@@ -49,7 +51,6 @@ module PennMARC
|
|
49
51
|
end
|
50
52
|
|
51
53
|
# returns a lambda checking if passed-in subfield's code is a member of array
|
52
|
-
# TODO: include lambda returning methods in their own module?
|
53
54
|
# @param [Array] array
|
54
55
|
# @return [Proc]
|
55
56
|
def subfield_in?(array)
|
@@ -57,7 +58,6 @@ module PennMARC
|
|
57
58
|
end
|
58
59
|
|
59
60
|
# returns a lambda checking if passed-in subfield's code is NOT a member of array
|
60
|
-
# TODO: include lambda returning methods in their own module?
|
61
61
|
# @param [Array] array
|
62
62
|
# @return [Proc]
|
63
63
|
def subfield_not_in?(array)
|
@@ -124,16 +124,15 @@ module PennMARC
|
|
124
124
|
# See: https://www.loc.gov/marc/bibliographic/bd880.html
|
125
125
|
# @param [MARC::Record] record
|
126
126
|
# @param [String|Array] subfield6_value either a string to look for in sub6 or an array of them
|
127
|
-
# @param
|
127
|
+
# @param [Proc] selector takes a subfield as argument, returns a boolean
|
128
128
|
# @return [Array] array of linked alternates
|
129
|
-
def linked_alternate(record, subfield6_value, &)
|
129
|
+
def linked_alternate(record, subfield6_value, &selector)
|
130
130
|
record.fields('880').filter_map do |field|
|
131
131
|
next unless subfield_value?(field, '6', /^#{Array.wrap(subfield6_value).join('|')}/)
|
132
132
|
|
133
|
-
field.select(&).map(&:value).join(' ')
|
133
|
+
field.select(&selector).map(&:value).join(' ')
|
134
134
|
end
|
135
135
|
end
|
136
|
-
alias get_880 linked_alternate
|
137
136
|
|
138
137
|
# Common case of wanting to extract all the subfields besides 6 or 8,
|
139
138
|
# from 880 datafield that has a particular subfield 6 value. We exclude 6 because
|
@@ -142,8 +141,9 @@ module PennMARC
|
|
142
141
|
# @param [String|Array] subfield6_value either a string to look for in sub6 or an array of them
|
143
142
|
# @return [Array] array of linked alternates without 8 or 6 values
|
144
143
|
def linked_alternate_not_6_or_8(record, subfield6_value)
|
144
|
+
excluded_subfields = %w[6 8]
|
145
145
|
linked_alternate(record, subfield6_value) do |sf|
|
146
|
-
|
146
|
+
excluded_subfields.exclude?(sf.code)
|
147
147
|
end
|
148
148
|
end
|
149
149
|
|
@@ -179,7 +179,6 @@ module PennMARC
|
|
179
179
|
def join_and_squish(array)
|
180
180
|
array.join(' ').squish
|
181
181
|
end
|
182
|
-
alias join_and_trim_whitespace join_and_squish
|
183
182
|
|
184
183
|
# If there's a subfield i, extract its value, and if there's something
|
185
184
|
# in parentheses in that value, extract that.
|
data/pennmarc.gemspec
CHANGED
@@ -1,8 +1,12 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
+
lib = File.expand_path('lib', __dir__)
|
4
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
5
|
+
require 'pennmarc/version'
|
6
|
+
|
3
7
|
Gem::Specification.new do |s|
|
4
8
|
s.name = 'pennmarc'
|
5
|
-
s.version =
|
9
|
+
s.version = PennMARC::VERSION
|
6
10
|
s.summary = 'Penn Libraries Catalog MARC parsing wisdom for cross-project usage'
|
7
11
|
s.description = 'This gem provides methods for parsing a Penn Libraries MARCXML record into string, array and date
|
8
12
|
objects for use in discovery or preservation applications.'
|
@@ -17,9 +17,9 @@ describe 'PennMARC::Creator' do
|
|
17
17
|
end
|
18
18
|
|
19
19
|
it 'contains the expected search field values for a single author work' do
|
20
|
-
expect(helper.search(record, mapping)).to eq ['Name Surname http://cool.uri/12345 author 1900-2000.',
|
21
|
-
|
22
|
-
|
20
|
+
expect(helper.search(record, relator_map: mapping)).to eq ['Name Surname http://cool.uri/12345 author 1900-2000.',
|
21
|
+
'Surname, Name http://cool.uri/12345 author 1900-2000.',
|
22
|
+
'Alternative Surname']
|
23
23
|
end
|
24
24
|
end
|
25
25
|
|
@@ -30,8 +30,8 @@ describe 'PennMARC::Creator' do
|
|
30
30
|
end
|
31
31
|
|
32
32
|
it 'contains the expected search field values for a corporate author work' do
|
33
|
-
expect(helper.search(record, mapping)).to eq ['Group of People Annual Meeting Author.',
|
34
|
-
|
33
|
+
expect(helper.search(record, relator_map: mapping)).to eq ['Group of People Annual Meeting Author.',
|
34
|
+
'Alt. Group Name Alt. Annual Meeting']
|
35
35
|
end
|
36
36
|
end
|
37
37
|
end
|
@@ -46,7 +46,7 @@ describe 'PennMARC::Creator' do
|
|
46
46
|
end
|
47
47
|
|
48
48
|
it 'returns values for the author, including mapped relator code from ǂ4' do
|
49
|
-
values = helper.values(record, mapping)
|
49
|
+
values = helper.values(record, relator_map: mapping)
|
50
50
|
expect(values).to contain_exactly 'Author Fancy active 24th century AD, Author.'
|
51
51
|
expect(values.join.downcase).not_to include 'alt'
|
52
52
|
end
|
@@ -58,7 +58,7 @@ describe 'PennMARC::Creator' do
|
|
58
58
|
end
|
59
59
|
|
60
60
|
it 'returns values for the corporate author, including mapped relator code from ǂ4' do
|
61
|
-
expect(helper.values(record, mapping)).to contain_exactly 'Annual Report Leader author, Author.'
|
61
|
+
expect(helper.values(record, relator_map: mapping)).to contain_exactly 'Annual Report Leader author, Author.'
|
62
62
|
end
|
63
63
|
end
|
64
64
|
end
|
@@ -160,7 +160,7 @@ describe 'PennMARC::Creator' do
|
|
160
160
|
end
|
161
161
|
|
162
162
|
it 'returns conference name information for display, ignoring any linked 880 fields' do
|
163
|
-
expect(helper.conference_show(record, mapping)).to eq ['MARC History Symposium, Author.']
|
163
|
+
expect(helper.conference_show(record, relator_map: mapping)).to eq ['MARC History Symposium, Author.']
|
164
164
|
end
|
165
165
|
end
|
166
166
|
|
@@ -204,7 +204,7 @@ describe 'PennMARC::Creator' do
|
|
204
204
|
end
|
205
205
|
|
206
206
|
it 'returns expected contributor values' do
|
207
|
-
expect(helper.contributor_show(record, mapping)).to contain_exactly(
|
207
|
+
expect(helper.contributor_show(record, relator_map: mapping)).to contain_exactly(
|
208
208
|
'Name I laureate 1968 pseud Fuller Name author affiliation materials, Author',
|
209
209
|
'Corporation A division Office 1968 author affiliation materials, Author',
|
210
210
|
'Alt Name Alt num Alt title Alt date Alt qualifier Alt Fuller Name Alt relator Alt affiliation Alt materials',
|
@@ -28,8 +28,9 @@ describe 'PennMARC::Edition' do
|
|
28
28
|
|
29
29
|
describe '.other_show' do
|
30
30
|
it 'returns other edition values' do
|
31
|
-
expect(helper.other_show(record, mapping)).to
|
32
|
-
|
31
|
+
expect(helper.other_show(record, relator_map: mapping)).to(
|
32
|
+
contain_exactly('Autre Editione', 'Other Edition: Author. (Cool Book)')
|
33
|
+
)
|
33
34
|
end
|
34
35
|
end
|
35
36
|
end
|
@@ -43,7 +43,7 @@ describe 'PennMARC::Genre' do
|
|
43
43
|
end
|
44
44
|
|
45
45
|
describe '.facet' do
|
46
|
-
let(:values) { helper.facet(record, location_map) }
|
46
|
+
let(:values) { helper.facet(record, location_map: location_map) }
|
47
47
|
let(:location_map) do
|
48
48
|
{ manu: { specific_location: 'Secure Manuscripts Storage' },
|
49
49
|
vanp: { specific_location: 'Van Pelt' } }
|
@@ -16,13 +16,14 @@ describe 'PennMARC::Identifier' do
|
|
16
16
|
describe '.isxn_search' do
|
17
17
|
let(:record) do
|
18
18
|
marc_record fields: [
|
19
|
-
marc_field(tag: '020', subfields: { a: '9781594205071', z: '
|
20
|
-
marc_field(tag: '022', subfields: { a: '0008-6533', l: '0300-7162', z: '
|
19
|
+
marc_field(tag: '020', subfields: { a: '9781594205071', z: '1555975275' }),
|
20
|
+
marc_field(tag: '022', subfields: { a: '0008-6533', l: '0300-7162', z: '0799-5946 ' })
|
21
21
|
]
|
22
22
|
end
|
23
23
|
|
24
24
|
it 'returns expected search values' do
|
25
|
-
expect(helper.isxn_search(record)).to contain_exactly('9781594205071', '
|
25
|
+
expect(helper.isxn_search(record)).to contain_exactly('9781594205071', '1555975275', '9781555975272',
|
26
|
+
'1594205078', '0300-7162', '0008-6533', '0799-5946 ')
|
26
27
|
end
|
27
28
|
|
28
29
|
it 'converts ISBN10 values to ISBN13' do
|
@@ -40,9 +41,9 @@ describe 'PennMARC::Identifier' do
|
|
40
41
|
]
|
41
42
|
end
|
42
43
|
|
43
|
-
it 'returns expected
|
44
|
-
expect(helper.isbn_show(record)).to contain_exactly('9781594205071
|
45
|
-
'0735222789
|
44
|
+
it 'returns expected ǂa values' do
|
45
|
+
expect(helper.isbn_show(record)).to contain_exactly('9781594205071', '0805073698',
|
46
|
+
'0735222789')
|
46
47
|
end
|
47
48
|
end
|
48
49
|
|
@@ -55,9 +56,9 @@ describe 'PennMARC::Identifier' do
|
|
55
56
|
]
|
56
57
|
end
|
57
58
|
|
58
|
-
it 'returns
|
59
|
-
expect(helper.issn_show(record)).to contain_exactly('0008-6533
|
60
|
-
'1080-6512
|
59
|
+
it 'returns ǂa values' do
|
60
|
+
expect(helper.issn_show(record)).to contain_exactly('0008-6533', '2470-6302',
|
61
|
+
'1080-6512')
|
61
62
|
end
|
62
63
|
end
|
63
64
|
|
@@ -79,9 +80,11 @@ describe 'PennMARC::Identifier' do
|
|
79
80
|
let(:record) do
|
80
81
|
marc_record fields: [
|
81
82
|
marc_field(tag: '024', subfields: { a: '602537854325', '6': '880-01' }),
|
83
|
+
marc_field(tag: '024', subfields: { a: '10.18574/9781479842865', '2': 'doi' }),
|
82
84
|
marc_field(tag: '028', subfields: { a: 'B002086600', b: 'Island Def Jam Music Group', '6': '880-01' }),
|
83
85
|
marc_field(tag: '880', subfields: { a: '523458735206', '6': '024' }),
|
84
|
-
marc_field(tag: '880', subfields: { a: '006680200B', b: 'Island', '6': '028' })
|
86
|
+
marc_field(tag: '880', subfields: { a: '006680200B', b: 'Island', '6': '028' }),
|
87
|
+
marc_field(tag: '880', subfields: { a: '006680200B', b: 'Island', '6': '021' })
|
85
88
|
]
|
86
89
|
end
|
87
90
|
|
@@ -90,18 +93,26 @@ describe 'PennMARC::Identifier' do
|
|
90
93
|
'B002086600 Island Def Jam Music Group',
|
91
94
|
'523458735206', '006680200B Island')
|
92
95
|
end
|
96
|
+
|
97
|
+
it 'does not return DOI values' do
|
98
|
+
expect(helper.publisher_number_show(record)).not_to include('10.18574/9781479842865')
|
99
|
+
expect(helper.publisher_number_show(record)).not_to include('doi')
|
100
|
+
|
101
|
+
end
|
93
102
|
end
|
94
103
|
|
95
104
|
describe '.publisher_number_search' do
|
96
105
|
let(:record) do
|
97
106
|
marc_record fields: [
|
98
|
-
marc_field(tag: '024', subfields: { a: '602537854325' }),
|
107
|
+
marc_field(tag: '024', subfields: { a: '602537854325', b: 'exclude' }),
|
108
|
+
marc_field(tag: '024', subfields: { a: '10.18574/9781479842865', '2': 'doi' }),
|
99
109
|
marc_field(tag: '028', subfields: { a: 'B002086600', b: 'Island Def Jam Music Group' })
|
100
110
|
]
|
101
111
|
end
|
102
112
|
|
103
|
-
it 'returns
|
104
|
-
expect(helper.publisher_number_search(record)).to contain_exactly('
|
113
|
+
it 'returns publisher numbers from 024/028 ǂa and DOI values in 024 ǂ2' do
|
114
|
+
expect(helper.publisher_number_search(record)).to contain_exactly('10.18574/9781479842865', '602537854325',
|
115
|
+
'B002086600')
|
105
116
|
end
|
106
117
|
end
|
107
118
|
|
@@ -117,4 +128,22 @@ describe 'PennMARC::Identifier' do
|
|
117
128
|
expect(helper.fingerprint_show(record)).to contain_exactly('dete nkck vess lodo Anno Domini MDCXXXVI 3')
|
118
129
|
end
|
119
130
|
end
|
120
|
-
|
131
|
+
|
132
|
+
describe '.doi_show' do
|
133
|
+
let(:record) do
|
134
|
+
marc_record fields: [
|
135
|
+
marc_field(tag: '024', indicator1: '7', subfields: { a: '10.1038/sdata.2016.18 ', '2': 'doi' }),
|
136
|
+
marc_field(tag: '024', indicator1: '7', subfields: { a: '10.18574/9781479842865', '2': 'doi' }),
|
137
|
+
marc_field(tag: '024', indicator1: '7',
|
138
|
+
subfields: { a: '10.1016.12.31/nature.S0735-1097(98)2000/12?/31/34:7-7', '2': 'doi' }),
|
139
|
+
marc_field(tag: '024', indicator1: '7', subfields: { a: 'excluded', '2': 'non doi' }),
|
140
|
+
marc_field(tag: '024', indicator1: '0', subfields: { a: 'excluded', '2': 'doi' })
|
141
|
+
]
|
142
|
+
end
|
143
|
+
|
144
|
+
it 'returns valid DOI values' do
|
145
|
+
expect(helper.doi_show(record)).to contain_exactly('10.1016.12.31/nature.S0735-1097(98)2000/12?/31/34:7-7',
|
146
|
+
'10.1038/sdata.2016.18', '10.18574/9781479842865')
|
147
|
+
end
|
148
|
+
end
|
149
|
+
end
|