berkeley_library-marc 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (72) hide show
  1. checksums.yaml +7 -0
  2. data/.github/workflows/build.yml +18 -0
  3. data/.gitignore +388 -0
  4. data/.idea/inspectionProfiles/Project_Default.xml +20 -0
  5. data/.idea/marc.iml +101 -0
  6. data/.idea/misc.xml +4 -0
  7. data/.idea/modules.xml +8 -0
  8. data/.idea/vcs.xml +6 -0
  9. data/.rubocop.yml +334 -0
  10. data/.ruby-version +1 -0
  11. data/.simplecov +8 -0
  12. data/.yardopts +1 -0
  13. data/CHANGES.md +12 -0
  14. data/Dockerfile +57 -0
  15. data/Gemfile +3 -0
  16. data/Jenkinsfile +18 -0
  17. data/LICENSE.md +21 -0
  18. data/README.md +4 -0
  19. data/Rakefile +20 -0
  20. data/berkeley_library-marc.gemspec +42 -0
  21. data/docker-compose.yml +15 -0
  22. data/lib/.rubocop.yml +6 -0
  23. data/lib/berkeley_library/marc.rb +3 -0
  24. data/lib/berkeley_library/marc/field_info.rb +1 -0
  25. data/lib/berkeley_library/marc/field_info/ctrl_fields/data/ctrl_fields_standard.txt +2143 -0
  26. data/lib/berkeley_library/marc/field_info/leader/data/leader_standard.txt +87 -0
  27. data/lib/berkeley_library/marc/field_info/var_fields.rb +46 -0
  28. data/lib/berkeley_library/marc/field_info/var_fields/data.rb +4 -0
  29. data/lib/berkeley_library/marc/field_info/var_fields/data/mapping-orig.tsv +265 -0
  30. data/lib/berkeley_library/marc/field_info/var_fields/data/var_fields_berkeley_9xx.txt +53 -0
  31. data/lib/berkeley_library/marc/field_info/var_fields/data/var_fields_berkeley_9xx_parsed.rb +51 -0
  32. data/lib/berkeley_library/marc/field_info/var_fields/data/var_fields_standard.txt +5458 -0
  33. data/lib/berkeley_library/marc/field_info/var_fields/data/var_fields_standard_parsed.rb +6577 -0
  34. data/lib/berkeley_library/marc/field_info/var_fields/data/var_fields_tind_reserved.txt +44 -0
  35. data/lib/berkeley_library/marc/field_info/var_fields/data/var_fields_tind_reserved_parsed.rb +30 -0
  36. data/lib/berkeley_library/marc/field_info/var_fields/data/var_fields_ucblit_tind.txt +105 -0
  37. data/lib/berkeley_library/marc/field_info/var_fields/data/var_fields_ucblit_tind_parsed.rb +114 -0
  38. data/lib/berkeley_library/marc/field_info/var_fields/ind_def.rb +39 -0
  39. data/lib/berkeley_library/marc/field_info/var_fields/ind_val_def.rb +27 -0
  40. data/lib/berkeley_library/marc/field_info/var_fields/instrument_or_voices_code.rb +26 -0
  41. data/lib/berkeley_library/marc/field_info/var_fields/obsolescible.rb +55 -0
  42. data/lib/berkeley_library/marc/field_info/var_fields/section.rb +50 -0
  43. data/lib/berkeley_library/marc/field_info/var_fields/subfield_def.rb +50 -0
  44. data/lib/berkeley_library/marc/field_info/var_fields/subfield_val.rb +24 -0
  45. data/lib/berkeley_library/marc/field_info/var_fields/var_field_def.rb +62 -0
  46. data/lib/berkeley_library/marc/field_info/var_fields/var_field_list.rb +43 -0
  47. data/lib/berkeley_library/marc/field_info/var_fields/var_field_parser.rb +136 -0
  48. data/lib/berkeley_library/marc/field_info/var_fields/var_field_transform.rb +160 -0
  49. data/lib/berkeley_library/marc/module_info.rb +14 -0
  50. data/lib/marc_extensions.rb +1 -0
  51. data/lib/marc_extensions/data_field.rb +29 -0
  52. data/lib/marc_extensions/field_map.rb +63 -0
  53. data/lib/marc_extensions/record.rb +100 -0
  54. data/lib/marc_extensions/subfield.rb +21 -0
  55. data/lib/marc_extensions/xml_reader.rb +19 -0
  56. data/rakelib/bundle.rake +8 -0
  57. data/rakelib/coverage.rake +11 -0
  58. data/rakelib/gem.rake +54 -0
  59. data/rakelib/rubocop.rake +18 -0
  60. data/rakelib/spec.rake +2 -0
  61. data/spec/.rubocop.yml +37 -0
  62. data/spec/berkeley_library/marc/field_info/var_fields/var_field_def_spec.rb +26 -0
  63. data/spec/berkeley_library/marc/field_info/var_fields/var_field_parser_spec.rb +596 -0
  64. data/spec/berkeley_library/marc/field_info/var_fields/var_field_transform_spec.rb +173 -0
  65. data/spec/berkeley_library/marc/field_info/var_fields_spec.rb +112 -0
  66. data/spec/data/field_info/vf_046.txt +32 -0
  67. data/spec/data/field_info/vf_048.txt +112 -0
  68. data/spec/data/record-187888.xml +78 -0
  69. data/spec/marc_extensions/data_field_spec.rb +13 -0
  70. data/spec/marc_extensions/record_spec.rb +211 -0
  71. data/spec/spec_helper.rb +27 -0
  72. metadata +354 -0
@@ -0,0 +1,13 @@
1
+ require 'spec_helper'
2
+
3
+ describe MARC::DataField do
4
+ let(:marc_record) { MARC::XMLReader.read('spec/data/record-187888.xml').first }
5
+
6
+ describe :subfield_codes do
7
+ it 'returns the subfield codes in order' do
8
+ expected_codes = %w[y 9 s u]
9
+
10
+ expect(marc_record['856'].subfield_codes).to eq(expected_codes)
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,211 @@
1
+ require 'spec_helper'
2
+
3
+ describe MARC::Record do
4
+ let(:marc_record) { MARC::XMLReader.read('spec/data/record-187888.xml').first }
5
+
6
+ describe :record_id do
7
+ it 'returns the 001 control field value, if present' do
8
+ expect(marc_record.record_id).to eq('187888')
9
+ end
10
+ end
11
+
12
+ describe :freeze do
13
+ it 'freezes the fields' do
14
+ expect(marc_record.fields).not_to be_frozen # just to be sure
15
+ marc_record.freeze
16
+ expect(marc_record.fields).to be_frozen
17
+ end
18
+
19
+ it 'freezes the leader' do
20
+ expect(marc_record.leader).not_to be_frozen # just to be sure
21
+ marc_record.freeze
22
+ expect(marc_record.leader).to be_frozen
23
+ end
24
+
25
+ it 'freezes the fields' do
26
+ marc_record.freeze
27
+ marc_record.fields.each do |df|
28
+ expect(df).to be_frozen
29
+ end
30
+ end
31
+
32
+ it 'does not clobber the data' do
33
+ expected = marc_record.to_hash
34
+ marc_record.freeze
35
+ expect(marc_record.to_hash).to eq(expected)
36
+ end
37
+ end
38
+
39
+ describe :frozen? do
40
+ it 'returns false neither fields nor leader are frozen' do
41
+ expect(marc_record.leader).not_to be_frozen # just to be sure
42
+ expect(marc_record.fields).not_to be_frozen # just to be sure
43
+ expect(marc_record).not_to be_frozen
44
+ end
45
+
46
+ it 'returns false if only fields are frozen' do
47
+ expect(marc_record.leader).not_to be_frozen # just to be sure
48
+ expect(marc_record.fields).not_to be_frozen # just to be sure
49
+ marc_record.leader.freeze
50
+ expect(marc_record).not_to be_frozen
51
+ end
52
+
53
+ it 'returns false if only leader is frozen' do
54
+ expect(marc_record.leader).not_to be_frozen # just to be sure
55
+ expect(marc_record.fields).not_to be_frozen # just to be sure
56
+ marc_record.fields.freeze
57
+ expect(marc_record).not_to be_frozen
58
+ end
59
+
60
+ it 'returns false if neither fields nor leader are frozen' do
61
+ expect(marc_record.leader).not_to be_frozen # just to be sure
62
+ expect(marc_record.fields).not_to be_frozen # just to be sure
63
+ expect(marc_record).not_to be_frozen
64
+ end
65
+
66
+ it 'returns true if both fields and leader are frozen' do
67
+ expect(marc_record.leader).not_to be_frozen # just to be sure
68
+ expect(marc_record.fields).not_to be_frozen # just to be sure
69
+ marc_record.fields.freeze
70
+ marc_record.leader.freeze
71
+ expect(marc_record).to be_frozen
72
+ end
73
+ end
74
+
75
+ describe :data_fields do
76
+ it 'returns only the data fields' do
77
+ expected_tags = %w[024 035 245 336 505 505 505 505 505 505 540 852 856 856 901 902 902 980 982 991]
78
+ dff = marc_record.data_fields
79
+ expect(dff.size).to eq(expected_tags.size)
80
+ expect(dff.map(&:tag)).to eq(expected_tags)
81
+ end
82
+
83
+ it 'returns the data fields in order as they appear' do
84
+ dff = marc_record.data_fields
85
+ dff_856 = dff.select { |df| df.tag == '856' }
86
+ expect(dff_856.size).to eq(2) # just to be sure
87
+ expected_sf9_values = %w[4a939fe2-2665-4c67-832b-b0e5267db449 0aacdd29-b467-4c5c-93ab-415069f431c0]
88
+ expected_sf9_values.each_with_index do |expected, i|
89
+ expect(dff_856[i]['9']).to eq(expected)
90
+ end
91
+ end
92
+
93
+ it 'groups fields by tag even when disordered' do
94
+ fields = marc_record.fields
95
+
96
+ df_852_ix = fields.find_index { |df| df.tag == '852' }
97
+ df_852 = fields.delete_at(df_852_ix)
98
+ expect(df_852.tag).to eq('852') # just to be sure
99
+
100
+ df_856_1, df_856_2 = fields[df_852_ix, 2]
101
+ [df_856_1, df_856_2].each { |df| expect(df.tag).to eq('856') } # just to be sure
102
+
103
+ fields.insert(df_852_ix + 1, df_852)
104
+ expect(fields[df_852_ix, 3]).to eq([df_856_1, df_852, df_856_2]) # just to be sure
105
+
106
+ dff = marc_record.data_fields
107
+ df_852_ix = dff.find_index { |df| df.tag == '852' }
108
+ expect(dff[df_852_ix, 3]).to eq([df_852, df_856_1, df_856_2])
109
+ end
110
+ end
111
+
112
+ describe :each_data_field do
113
+ it 'returns only the data fields, in order' do
114
+ expect(marc_record.each_data_field.to_a).to eq(marc_record.data_fields)
115
+ end
116
+
117
+ it 'groups fields by tag even when disordered' do
118
+ fields = marc_record.fields
119
+
120
+ df_852_ix = fields.find_index { |df| df.tag == '852' }
121
+ df_852 = fields.delete_at(df_852_ix)
122
+ df_856_1, df_856_2 = fields[df_852_ix, 2]
123
+ fields.insert(df_852_ix + 1, df_852)
124
+
125
+ dff = marc_record.each_data_field.to_a
126
+ df_852_ix = dff.find_index { |df| df.tag == '852' }
127
+ expect(dff[df_852_ix, 3]).to eq([df_852, df_856_1, df_856_2])
128
+ end
129
+ end
130
+
131
+ describe :each_sorted_by_tag do
132
+ let(:tags) do
133
+ %w[856 852] # NOTE: not sorted
134
+ end
135
+
136
+ let(:expected) do
137
+ [].tap do |ff|
138
+ ff << marc_record['852']
139
+ marc_record.each_by_tag('856') { |f| ff << f }
140
+ end
141
+ end
142
+
143
+ it 'returns only fields with the specified tags, sorted, in original order' do
144
+ result = []
145
+ marc_record.each_sorted_by_tag(tags) { |f| result << f }
146
+ expect(result).to eq(expected)
147
+ end
148
+
149
+ it 'returns nil if passed a block' do
150
+ result = marc_record.each_sorted_by_tag(tags) { |_| next }
151
+ expect(result).to be_nil
152
+ end
153
+
154
+ it 'returns an enum if not passed a block' do
155
+ enum = marc_record.each_sorted_by_tag(tags)
156
+ expect(enum).to be_a(Enumerator::Lazy)
157
+ expect(enum.to_a).to eq(expected)
158
+ end
159
+ end
160
+
161
+ describe :data_fields_by_tag do
162
+ it 'groups fields by tag' do
163
+ fields = marc_record.fields
164
+
165
+ df_852_ix = fields.find_index { |df| df.tag == '852' }
166
+ df_852 = fields.delete_at(df_852_ix)
167
+ fields.insert(df_852_ix + 1, df_852)
168
+
169
+ t2df = marc_record.data_fields_by_tag
170
+ expect(t2df).to be_a(Hash)
171
+
172
+ expected = {
173
+ '024' => 1, '035' => 1,
174
+ '245' => 1,
175
+ '336' => 1,
176
+ '505' => 6, '540' => 1,
177
+ '852' => 1, '856' => 2,
178
+ '901' => 1, '902' => 2, '980' => 1, '982' => 1, '991' => 1
179
+ }
180
+
181
+ expected.each do |tag, count|
182
+ dff = t2df[tag]
183
+ expect(dff).to be_a(Array)
184
+ expect(dff.size).to eq(count)
185
+ dff.each { |df| expect(df.tag).to eq(tag) }
186
+ end
187
+ end
188
+
189
+ describe :each_sorted_by_tag do
190
+ it 'returns all tags if not passed a tag list' do
191
+ fields = marc_record.fields
192
+
193
+ expected = fields.each_with_object({}) do |f, ex|
194
+ (ex[f.tag] ||= []) << f
195
+ end.values.flatten
196
+
197
+ enum = marc_record.each_sorted_by_tag
198
+ expect(enum.to_a).to eq(expected)
199
+ end
200
+ end
201
+ end
202
+
203
+ describe :each_control_field do
204
+ it 'returns only the control fields' do
205
+ expected_tags = %w[001 005]
206
+ cff = marc_record.each_control_field.to_a
207
+ expect(cff.size).to eq(expected_tags.size)
208
+ expect(cff.map(&:tag)).to eq(expected_tags)
209
+ end
210
+ end
211
+ end
@@ -0,0 +1,27 @@
1
+ # ------------------------------------------------------------
2
+ # Simplecov
3
+
4
+ require 'colorize'
5
+ require 'simplecov' if ENV['COVERAGE']
6
+
7
+ # ------------------------------------------------------------
8
+ # RSpec
9
+
10
+ require 'webmock/rspec'
11
+
12
+ RSpec.configure do |config|
13
+ config.color = true
14
+ config.tty = true
15
+ config.formatter = :documentation
16
+ config.before(:each) { WebMock.disable_net_connect!(allow_localhost: true) }
17
+ config.after(:each) { WebMock.allow_net_connect! }
18
+ config.mock_with :rspec do |mocks|
19
+ mocks.verify_partial_doubles = true
20
+ end
21
+ config.shared_context_metadata_behavior = :apply_to_host_groups
22
+ end
23
+
24
+ # ------------------------------------------------------------
25
+ # Code under test
26
+
27
+ require 'berkeley_library/marc'
metadata ADDED
@@ -0,0 +1,354 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: berkeley_library-marc
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.2.0
5
+ platform: ruby
6
+ authors:
7
+ - David Moles
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2021-08-19 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: marc
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '1.0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '1.0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: parslet
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '2.0'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '2.0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: bundle-audit
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '0.1'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '0.1'
55
+ - !ruby/object:Gem::Dependency
56
+ name: ci_reporter_rspec
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '1.0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '1.0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: colorize
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: '0.8'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: '0.8'
83
+ - !ruby/object:Gem::Dependency
84
+ name: dotenv
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - "~>"
88
+ - !ruby/object:Gem::Version
89
+ version: '2.7'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - "~>"
95
+ - !ruby/object:Gem::Version
96
+ version: '2.7'
97
+ - !ruby/object:Gem::Dependency
98
+ name: listen
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - ">="
102
+ - !ruby/object:Gem::Version
103
+ version: 3.0.5
104
+ - - "<"
105
+ - !ruby/object:Gem::Version
106
+ version: '3.2'
107
+ type: :development
108
+ prerelease: false
109
+ version_requirements: !ruby/object:Gem::Requirement
110
+ requirements:
111
+ - - ">="
112
+ - !ruby/object:Gem::Version
113
+ version: 3.0.5
114
+ - - "<"
115
+ - !ruby/object:Gem::Version
116
+ version: '3.2'
117
+ - !ruby/object:Gem::Dependency
118
+ name: rake
119
+ requirement: !ruby/object:Gem::Requirement
120
+ requirements:
121
+ - - "~>"
122
+ - !ruby/object:Gem::Version
123
+ version: '13.0'
124
+ type: :development
125
+ prerelease: false
126
+ version_requirements: !ruby/object:Gem::Requirement
127
+ requirements:
128
+ - - "~>"
129
+ - !ruby/object:Gem::Version
130
+ version: '13.0'
131
+ - !ruby/object:Gem::Dependency
132
+ name: rspec
133
+ requirement: !ruby/object:Gem::Requirement
134
+ requirements:
135
+ - - "~>"
136
+ - !ruby/object:Gem::Version
137
+ version: '3.10'
138
+ type: :development
139
+ prerelease: false
140
+ version_requirements: !ruby/object:Gem::Requirement
141
+ requirements:
142
+ - - "~>"
143
+ - !ruby/object:Gem::Version
144
+ version: '3.10'
145
+ - !ruby/object:Gem::Dependency
146
+ name: rubocop
147
+ requirement: !ruby/object:Gem::Requirement
148
+ requirements:
149
+ - - '='
150
+ - !ruby/object:Gem::Version
151
+ version: '1.11'
152
+ type: :development
153
+ prerelease: false
154
+ version_requirements: !ruby/object:Gem::Requirement
155
+ requirements:
156
+ - - '='
157
+ - !ruby/object:Gem::Version
158
+ version: '1.11'
159
+ - !ruby/object:Gem::Dependency
160
+ name: rubocop-rake
161
+ requirement: !ruby/object:Gem::Requirement
162
+ requirements:
163
+ - - "~>"
164
+ - !ruby/object:Gem::Version
165
+ version: '0.5'
166
+ type: :development
167
+ prerelease: false
168
+ version_requirements: !ruby/object:Gem::Requirement
169
+ requirements:
170
+ - - "~>"
171
+ - !ruby/object:Gem::Version
172
+ version: '0.5'
173
+ - !ruby/object:Gem::Dependency
174
+ name: rubocop-rspec
175
+ requirement: !ruby/object:Gem::Requirement
176
+ requirements:
177
+ - - "~>"
178
+ - !ruby/object:Gem::Version
179
+ version: '2.2'
180
+ type: :development
181
+ prerelease: false
182
+ version_requirements: !ruby/object:Gem::Requirement
183
+ requirements:
184
+ - - "~>"
185
+ - !ruby/object:Gem::Version
186
+ version: '2.2'
187
+ - !ruby/object:Gem::Dependency
188
+ name: ruby-prof
189
+ requirement: !ruby/object:Gem::Requirement
190
+ requirements:
191
+ - - "~>"
192
+ - !ruby/object:Gem::Version
193
+ version: 0.17.0
194
+ type: :development
195
+ prerelease: false
196
+ version_requirements: !ruby/object:Gem::Requirement
197
+ requirements:
198
+ - - "~>"
199
+ - !ruby/object:Gem::Version
200
+ version: 0.17.0
201
+ - !ruby/object:Gem::Dependency
202
+ name: simplecov
203
+ requirement: !ruby/object:Gem::Requirement
204
+ requirements:
205
+ - - "~>"
206
+ - !ruby/object:Gem::Version
207
+ version: '0.21'
208
+ type: :development
209
+ prerelease: false
210
+ version_requirements: !ruby/object:Gem::Requirement
211
+ requirements:
212
+ - - "~>"
213
+ - !ruby/object:Gem::Version
214
+ version: '0.21'
215
+ - !ruby/object:Gem::Dependency
216
+ name: simplecov-rcov
217
+ requirement: !ruby/object:Gem::Requirement
218
+ requirements:
219
+ - - "~>"
220
+ - !ruby/object:Gem::Version
221
+ version: '0.2'
222
+ type: :development
223
+ prerelease: false
224
+ version_requirements: !ruby/object:Gem::Requirement
225
+ requirements:
226
+ - - "~>"
227
+ - !ruby/object:Gem::Version
228
+ version: '0.2'
229
+ - !ruby/object:Gem::Dependency
230
+ name: webmock
231
+ requirement: !ruby/object:Gem::Requirement
232
+ requirements:
233
+ - - "~>"
234
+ - !ruby/object:Gem::Version
235
+ version: '3.12'
236
+ type: :development
237
+ prerelease: false
238
+ version_requirements: !ruby/object:Gem::Requirement
239
+ requirements:
240
+ - - "~>"
241
+ - !ruby/object:Gem::Version
242
+ version: '3.12'
243
+ description: A gem providing MARC-related utility code and extensions to ruby-marc
244
+ for the UC Berkeley Library
245
+ email: dmoles@berkeley.edu
246
+ executables: []
247
+ extensions: []
248
+ extra_rdoc_files: []
249
+ files:
250
+ - ".github/workflows/build.yml"
251
+ - ".gitignore"
252
+ - ".idea/inspectionProfiles/Project_Default.xml"
253
+ - ".idea/marc.iml"
254
+ - ".idea/misc.xml"
255
+ - ".idea/modules.xml"
256
+ - ".idea/vcs.xml"
257
+ - ".rubocop.yml"
258
+ - ".ruby-version"
259
+ - ".simplecov"
260
+ - ".yardopts"
261
+ - CHANGES.md
262
+ - Dockerfile
263
+ - Gemfile
264
+ - Jenkinsfile
265
+ - LICENSE.md
266
+ - README.md
267
+ - Rakefile
268
+ - berkeley_library-marc.gemspec
269
+ - docker-compose.yml
270
+ - lib/.rubocop.yml
271
+ - lib/berkeley_library/marc.rb
272
+ - lib/berkeley_library/marc/field_info.rb
273
+ - lib/berkeley_library/marc/field_info/ctrl_fields/data/ctrl_fields_standard.txt
274
+ - lib/berkeley_library/marc/field_info/leader/data/leader_standard.txt
275
+ - lib/berkeley_library/marc/field_info/var_fields.rb
276
+ - lib/berkeley_library/marc/field_info/var_fields/data.rb
277
+ - lib/berkeley_library/marc/field_info/var_fields/data/mapping-orig.tsv
278
+ - lib/berkeley_library/marc/field_info/var_fields/data/var_fields_berkeley_9xx.txt
279
+ - lib/berkeley_library/marc/field_info/var_fields/data/var_fields_berkeley_9xx_parsed.rb
280
+ - lib/berkeley_library/marc/field_info/var_fields/data/var_fields_standard.txt
281
+ - lib/berkeley_library/marc/field_info/var_fields/data/var_fields_standard_parsed.rb
282
+ - lib/berkeley_library/marc/field_info/var_fields/data/var_fields_tind_reserved.txt
283
+ - lib/berkeley_library/marc/field_info/var_fields/data/var_fields_tind_reserved_parsed.rb
284
+ - lib/berkeley_library/marc/field_info/var_fields/data/var_fields_ucblit_tind.txt
285
+ - lib/berkeley_library/marc/field_info/var_fields/data/var_fields_ucblit_tind_parsed.rb
286
+ - lib/berkeley_library/marc/field_info/var_fields/ind_def.rb
287
+ - lib/berkeley_library/marc/field_info/var_fields/ind_val_def.rb
288
+ - lib/berkeley_library/marc/field_info/var_fields/instrument_or_voices_code.rb
289
+ - lib/berkeley_library/marc/field_info/var_fields/obsolescible.rb
290
+ - lib/berkeley_library/marc/field_info/var_fields/section.rb
291
+ - lib/berkeley_library/marc/field_info/var_fields/subfield_def.rb
292
+ - lib/berkeley_library/marc/field_info/var_fields/subfield_val.rb
293
+ - lib/berkeley_library/marc/field_info/var_fields/var_field_def.rb
294
+ - lib/berkeley_library/marc/field_info/var_fields/var_field_list.rb
295
+ - lib/berkeley_library/marc/field_info/var_fields/var_field_parser.rb
296
+ - lib/berkeley_library/marc/field_info/var_fields/var_field_transform.rb
297
+ - lib/berkeley_library/marc/module_info.rb
298
+ - lib/marc_extensions.rb
299
+ - lib/marc_extensions/data_field.rb
300
+ - lib/marc_extensions/field_map.rb
301
+ - lib/marc_extensions/record.rb
302
+ - lib/marc_extensions/subfield.rb
303
+ - lib/marc_extensions/xml_reader.rb
304
+ - rakelib/bundle.rake
305
+ - rakelib/coverage.rake
306
+ - rakelib/gem.rake
307
+ - rakelib/rubocop.rake
308
+ - rakelib/spec.rake
309
+ - spec/.rubocop.yml
310
+ - spec/berkeley_library/marc/field_info/var_fields/var_field_def_spec.rb
311
+ - spec/berkeley_library/marc/field_info/var_fields/var_field_parser_spec.rb
312
+ - spec/berkeley_library/marc/field_info/var_fields/var_field_transform_spec.rb
313
+ - spec/berkeley_library/marc/field_info/var_fields_spec.rb
314
+ - spec/data/field_info/vf_046.txt
315
+ - spec/data/field_info/vf_048.txt
316
+ - spec/data/record-187888.xml
317
+ - spec/marc_extensions/data_field_spec.rb
318
+ - spec/marc_extensions/record_spec.rb
319
+ - spec/spec_helper.rb
320
+ homepage: https://github.com/BerkeleyLibrary/marc
321
+ licenses:
322
+ - MIT
323
+ metadata: {}
324
+ post_install_message:
325
+ rdoc_options: []
326
+ require_paths:
327
+ - lib
328
+ required_ruby_version: !ruby/object:Gem::Requirement
329
+ requirements:
330
+ - - ">="
331
+ - !ruby/object:Gem::Version
332
+ version: '2.7'
333
+ required_rubygems_version: !ruby/object:Gem::Requirement
334
+ requirements:
335
+ - - ">="
336
+ - !ruby/object:Gem::Version
337
+ version: '0'
338
+ requirements: []
339
+ rubygems_version: 3.1.6
340
+ signing_key:
341
+ specification_version: 4
342
+ summary: MARC utilities for the UC Berkeley Library
343
+ test_files:
344
+ - spec/.rubocop.yml
345
+ - spec/berkeley_library/marc/field_info/var_fields/var_field_def_spec.rb
346
+ - spec/berkeley_library/marc/field_info/var_fields/var_field_parser_spec.rb
347
+ - spec/berkeley_library/marc/field_info/var_fields/var_field_transform_spec.rb
348
+ - spec/berkeley_library/marc/field_info/var_fields_spec.rb
349
+ - spec/data/field_info/vf_046.txt
350
+ - spec/data/field_info/vf_048.txt
351
+ - spec/data/record-187888.xml
352
+ - spec/marc_extensions/data_field_spec.rb
353
+ - spec/marc_extensions/record_spec.rb
354
+ - spec/spec_helper.rb