pennmarc 1.0.3 → 1.0.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
data/lib/pennmarc/util.rb CHANGED
@@ -5,6 +5,14 @@ require_relative 'heading_control'
5
5
  module PennMARC
6
6
  # class to hold "utility" methods used in MARC parsing methods
7
7
  module Util
8
+ # Check if a given record has a field present by tag (e.g., '041')
9
+ # @param [MARC::Record] record
10
+ # @param [String] marc_field
11
+ # @return [Boolean]
12
+ def field_defined?(record, marc_field)
13
+ record.select { |field| field.tag == marc_field }.any?
14
+ end
15
+
8
16
  # Join subfields from a field selected based on a provided proc
9
17
  # @param [MARC::DataField] field
10
18
  # @param [Proc] selector
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module PennMARC
4
- VERSION = '1.0.3'
4
+ VERSION = '1.0.5'
5
5
  end
@@ -0,0 +1,58 @@
1
+ # frozen_string_literal: true
2
+
3
+ describe 'PennMARC::Access' do
4
+ include MarcSpecHelpers
5
+
6
+ let(:helper) { PennMARC::Access }
7
+
8
+ describe '.facet' do
9
+ context 'with an electronic record' do
10
+ let(:record) do
11
+ marc_record fields: [marc_field(tag: 'prt')]
12
+ end
13
+
14
+ it 'returns expected access value' do
15
+ expect(helper.facet(record)).to contain_exactly(PennMARC::Access::ONLINE)
16
+ end
17
+ end
18
+
19
+ context 'with a print record' do
20
+ let(:record) do
21
+ marc_record fields: [marc_field(tag: 'hld')]
22
+ end
23
+
24
+ it 'returns expected access value' do
25
+ expect(helper.facet(record)).to contain_exactly(PennMARC::Access::AT_THE_LIBRARY)
26
+ end
27
+ end
28
+
29
+ context 'with a record containing a link to a finding aid (as a handle link)' do
30
+ let(:record) do
31
+ marc_record fields: [marc_field(tag: 'hld'),
32
+ marc_field(tag: '856', subfields: location_and_access_subfields, **indicators)]
33
+ end
34
+
35
+ context 'with an 856 describing a related record, not the record itself' do
36
+ let(:indicators) { { indicator1: '4', indicator2: '2' } }
37
+ let(:location_and_access_subfields) do
38
+ { z: 'Finding Aid', u: 'http://hdl.library.upenn.edu/1017/d/pacscl/UPENN_RBML_MsColl200' }
39
+ end
40
+
41
+ it 'does not include online access' do
42
+ expect(helper.facet(record)).not_to include PennMARC::Access::ONLINE
43
+ end
44
+ end
45
+
46
+ context 'with an 865 describing a link to a finding aid' do
47
+ let(:indicators) { { indicator1: '4', indicator2: '1' } }
48
+ let(:location_and_access_subfields) do
49
+ { z: 'Finding aid', u: 'http://hdl.library.upenn.edu/1017/d/pacscl/UPENN_RBML_MsColl200' }
50
+ end
51
+
52
+ it 'includes online access' do
53
+ expect(helper.facet(record)).to contain_exactly(PennMARC::Access::ONLINE, PennMARC::Access::AT_THE_LIBRARY)
54
+ end
55
+ end
56
+ end
57
+ end
58
+ end
@@ -17,9 +17,11 @@ 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, 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']
20
+ expect(helper.search(record, relator_map: mapping)).to eq [
21
+ 'Name Surname http://cool.uri/12345 author 1900-2000.',
22
+ 'Surname, Name http://cool.uri/12345 author 1900-2000.',
23
+ 'Alternative Surname'
24
+ ]
23
25
  end
24
26
  end
25
27
 
@@ -58,7 +60,9 @@ describe 'PennMARC::Creator' do
58
60
  end
59
61
 
60
62
  it 'returns values for the corporate author, including mapped relator code from ǂ4' do
61
- expect(helper.values(record, relator_map: mapping)).to contain_exactly 'Annual Report Leader author, Author.'
63
+ expect(helper.values(record, relator_map: mapping)).to contain_exactly(
64
+ 'Annual Report Leader author, Author.'
65
+ )
62
66
  end
63
67
  end
64
68
  end
@@ -146,7 +150,8 @@ describe 'PennMARC::Creator' do
146
150
  end
147
151
 
148
152
  it 'includes corporate author and creator values from allowed subfields' do
149
- expect(values).to contain_exactly 'Conference on Things Earth', 'Series of Things Earth', 'Thing Institute'
153
+ expect(values).to contain_exactly 'Conference on Things Earth', 'Series of Things Earth',
154
+ 'Thing Institute'
150
155
  end
151
156
  end
152
157
  end
@@ -27,6 +27,22 @@ describe 'PennMARC::Date' do
27
27
  end
28
28
 
29
29
  describe '.added' do
30
+ context 'with a robust itm tag' do
31
+ let(:fields) do
32
+ [marc_field(tag: 'itm', subfields: { g: 'VanPeltLib', i: 'Tw .156', q: '2023-10-19' })]
33
+ end
34
+
35
+ it 'returns only the expected date_added value' do
36
+ expect(helper.added(record)).to eq DateTime.strptime('2023-10-19', '%Y-%m-%d')
37
+ end
38
+
39
+ it 'does not output any warning to STDOUT' do
40
+ expect {
41
+ helper.added(record)
42
+ }.not_to output(a_string_including('Error parsing date in date added subfield')).to_stdout
43
+ end
44
+ end
45
+
30
46
  context "with date formatted '%Y-%m-%d'" do
31
47
  let(:fields) { [marc_field(tag: 'itm', subfields: { q: '2023-06-28' })] }
32
48
 
@@ -113,7 +113,6 @@ describe 'PennMARC::Identifier' do
113
113
  it 'does not return DOI values' do
114
114
  expect(helper.publisher_number_show(record)).not_to include('10.18574/9781479842865')
115
115
  expect(helper.publisher_number_show(record)).not_to include('doi')
116
-
117
116
  end
118
117
  end
119
118
 
@@ -4,27 +4,75 @@ describe 'PennMARC::Language' do
4
4
  include MarcSpecHelpers
5
5
 
6
6
  let(:helper) { PennMARC::Language }
7
- let(:mapping) do
8
- { eng: 'English', und: 'Undetermined' }
7
+ let(:iso_639_2_mapping) do
8
+ { eng: 'English', und: 'Undetermined', fre: 'French', ger: 'German', ulw: 'Ulwa' }
9
+ end
10
+ let(:iso_639_3_mapping) do
11
+ { eng: 'American', und: 'Undetermined', fre: 'Francais', ger: 'Deutsch', twf: 'Northern Tiwa' }
9
12
  end
10
13
  let(:record) do
11
14
  marc_record fields: [
12
15
  marc_control_field(tag: '008', value: ' eng'),
16
+ marc_field(tag: '041', subfields: { '2': 'iso639-2', a: 'eng', b: 'fre', d: 'ger' }),
13
17
  marc_field(tag: '546', subfields: { a: 'Great', c: 'Content', '6': 'Not Included' }),
14
18
  marc_field(tag: '546', subfields: { b: 'More!', '8': 'Not Included' }),
15
19
  marc_field(tag: '880', subfields: { c: 'Mas!', '6': '546', '8': 'Not Included' })
16
20
  ]
17
21
  end
18
22
 
19
- describe '.search' do
20
- it 'returns the expected display value' do
21
- expect(helper.search(record, language_map: mapping)).to eq 'English'
22
- end
23
- end
24
-
25
23
  describe '.show' do
26
24
  it 'returns the expected show values' do
27
25
  expect(helper.show(record)).to contain_exactly 'Great Content', 'More!', 'Mas!'
28
26
  end
29
27
  end
28
+
29
+ describe '.search' do
30
+ context 'when using iso 639-2 spec' do
31
+ it 'returns the expected display values from iso639-2' do
32
+ expect(helper.values(record,
33
+ iso_639_2_mapping: iso_639_2_mapping,
34
+ iso_639_3_mapping: iso_639_3_mapping)).to contain_exactly('English', 'French', 'German')
35
+ end
36
+ end
37
+
38
+ context 'when using iso639-3 spec' do
39
+ let(:record) do
40
+ marc_record fields: [marc_field(tag: '041', subfields: { '2': 'iso639-3', a: 'eng', b: 'fre', d: 'ger' }),
41
+ marc_field(tag: '041', subfields: { '2': 'iso639-3', a: 'twf' })]
42
+ end
43
+
44
+ it 'returns the expected display values from iso639-3' do
45
+ expect(helper.values(record,
46
+ iso_639_2_mapping: iso_639_2_mapping,
47
+ iso_639_3_mapping: iso_639_3_mapping)).to contain_exactly('American', 'Francais',
48
+ 'Deutsch', 'Northern Tiwa')
49
+ end
50
+ end
51
+
52
+ context 'when using multiple specs' do
53
+ let(:record) do
54
+ marc_record fields: [marc_field(tag: '041', subfields: { '2': 'iso639-3', a: 'eng', b: 'fre', d: 'ger' }),
55
+ marc_field(tag: '041', subfields: { '2': 'iso639-2', a: 'ulw' })]
56
+ end
57
+
58
+ it 'returns the expected display values from iso639-3' do
59
+ expect(helper.values(record,
60
+ iso_639_2_mapping: iso_639_2_mapping,
61
+ iso_639_3_mapping: iso_639_3_mapping)).to contain_exactly('American', 'Francais',
62
+ 'Deutsch', 'Ulwa')
63
+ end
64
+ end
65
+
66
+ context 'with an empty record' do
67
+ let(:record) do
68
+ marc_record fields: [marc_field(tag: '041', subfields: { c: 'test' })]
69
+ end
70
+
71
+ it 'returns undetermined when there are no values' do
72
+ expect(helper.values(record,
73
+ iso_639_2_mapping: iso_639_2_mapping,
74
+ iso_639_3_mapping: iso_639_3_mapping)).to contain_exactly('Undetermined')
75
+ end
76
+ end
77
+ end
30
78
  end
@@ -19,9 +19,11 @@ describe 'PennMARC::Series' do
19
19
 
20
20
  describe '.show' do
21
21
  it 'returns the series' do
22
- expect(helper.show(record, relator_map: mapping)).to contain_exactly('Bean Bagatolvski 1997- bk. 1',
23
- 'Teachings of the feathered pillow',
24
- 'Учения пернатой подушки', 'Evil Giant Megacorp')
22
+ expect(helper.show(record, relator_map: mapping)).to contain_exactly(
23
+ 'Bean Bagatolvski 1997- bk. 1',
24
+ 'Teachings of the feathered pillow',
25
+ 'Учения пернатой подушки', 'Evil Giant Megacorp'
26
+ )
25
27
  end
26
28
  end
27
29
 
@@ -7,6 +7,18 @@ describe 'PennMARC::Util' do
7
7
  Class.new { extend PennMARC::Util }
8
8
  end
9
9
 
10
+ describe '.field_defined?' do
11
+ let(:record) { marc_record fields: [marc_field(tag: '100')] }
12
+
13
+ it 'returns true if the field is present in the record' do
14
+ expect(util.field_defined?(record, '100')).to be true
15
+ end
16
+
17
+ it 'returns false if the field is not present in the record' do
18
+ expect(util.field_defined?(record, '101')).to be false
19
+ end
20
+ end
21
+
10
22
  describe '.join_subfields' do
11
23
  let(:field) { marc_field subfields: { a: 'bad', '1': 'join', '3': '', '9': 'subfields' } }
12
24
 
@@ -8,12 +8,12 @@ describe PennMARC::Parser do
8
8
  let(:record) { record_from 'test.xml' }
9
9
 
10
10
  it 'delegates to helper modules properly' do
11
- expect(parser.language_search(record)).to eq 'English'
11
+ expect(parser.language_values(record)).to contain_exactly 'English'
12
12
  end
13
13
 
14
14
  it 'delegates to helper modules properly with extra params' do
15
15
  bogus_map = { eng: 'American' }
16
- expect(parser.language_search(record, language_map: bogus_map)).to eq 'American'
16
+ expect(parser.language_values(record, iso_639_2_mapping: bogus_map)).to contain_exactly 'American'
17
17
  end
18
18
 
19
19
  it 'raises an exception if the method call is invalid' do
@@ -23,7 +23,7 @@ describe PennMARC::Parser do
23
23
 
24
24
  describe '#respond_to?' do
25
25
  it 'returns true if a helper has the expected method' do
26
- expect(parser).to respond_to :language_search
26
+ expect(parser).to respond_to :language_values
27
27
  end
28
28
 
29
29
  it 'returns false if a helper does not have the expected method' do
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: pennmarc
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.3
4
+ version: 1.0.5
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-10-12 00:00:00.000000000 Z
13
+ date: 2023-11-09 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
+ - ".gitleaks.toml"
80
81
  - ".rspec"
81
82
  - ".rubocop.yml"
82
83
  - ".rubocop_todo.yml"
@@ -88,6 +89,7 @@ files:
88
89
  - lib/pennmarc/encoding_level.rb
89
90
  - lib/pennmarc/enriched_marc.rb
90
91
  - lib/pennmarc/heading_control.rb
92
+ - lib/pennmarc/helpers/access.rb
91
93
  - lib/pennmarc/helpers/citation.rb
92
94
  - lib/pennmarc/helpers/creator.rb
93
95
  - lib/pennmarc/helpers/database.rb
@@ -107,7 +109,8 @@ files:
107
109
  - lib/pennmarc/helpers/subject.rb
108
110
  - lib/pennmarc/helpers/title.rb
109
111
  - lib/pennmarc/mappers.rb
110
- - lib/pennmarc/mappings/language.yml
112
+ - lib/pennmarc/mappings/iso639-2-languages.yml
113
+ - lib/pennmarc/mappings/iso639-3-languages.yml
111
114
  - lib/pennmarc/mappings/locations.yml
112
115
  - lib/pennmarc/mappings/relator.yml
113
116
  - lib/pennmarc/parser.rb
@@ -115,6 +118,7 @@ files:
115
118
  - lib/pennmarc/version.rb
116
119
  - pennmarc.gemspec
117
120
  - spec/fixtures/marcxml/test.xml
121
+ - spec/lib/pennmarc/helpers/access_spec.rb
118
122
  - spec/lib/pennmarc/helpers/citation_spec.rb
119
123
  - spec/lib/pennmarc/helpers/creator_spec.rb
120
124
  - spec/lib/pennmarc/helpers/database_spec.rb