berkeley_library-alma 0.0.1
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 +7 -0
- data/.github/workflows/build.yml +18 -0
- data/.gitignore +388 -0
- data/.idea/.gitignore +8 -0
- data/.idea/alma.iml +55 -0
- data/.idea/codeStyles/codeStyleConfig.xml +5 -0
- data/.idea/inspectionProfiles/Project_Default.xml +26 -0
- data/.idea/misc.xml +4 -0
- data/.idea/modules.xml +8 -0
- data/.idea/vcs.xml +6 -0
- data/.rubocop.yml +334 -0
- data/.ruby-version +1 -0
- data/.simplecov +8 -0
- data/.yardopts +2 -0
- data/CHANGES.md +3 -0
- data/Dockerfile +54 -0
- data/Gemfile +3 -0
- data/Jenkinsfile +18 -0
- data/LICENSE.md +21 -0
- data/README.md +210 -0
- data/Rakefile +20 -0
- data/berkeley_library-alma.gemspec +42 -0
- data/bin/alma-mms-lookup +64 -0
- data/docker-compose.yml +15 -0
- data/lib/berkeley_library/alma/bib_number.rb +90 -0
- data/lib/berkeley_library/alma/config.rb +178 -0
- data/lib/berkeley_library/alma/constants.rb +16 -0
- data/lib/berkeley_library/alma/mms_id.rb +100 -0
- data/lib/berkeley_library/alma/module_info.rb +14 -0
- data/lib/berkeley_library/alma/record_id.rb +113 -0
- data/lib/berkeley_library/alma.rb +1 -0
- data/rakelib/bundle.rake +8 -0
- data/rakelib/coverage.rake +11 -0
- data/rakelib/gem.rake +54 -0
- data/rakelib/rubocop.rake +18 -0
- data/rakelib/spec.rake +2 -0
- data/spec/.rubocop.yml +37 -0
- data/spec/data/991054360089706532-sru.xml +186 -0
- data/spec/data/b11082434-sru.xml +165 -0
- data/spec/data/bibs_with_check_digits.txt +151 -0
- data/spec/lib/berkeley_library/alma/bib_number_spec.rb +95 -0
- data/spec/lib/berkeley_library/alma/config_spec.rb +94 -0
- data/spec/lib/berkeley_library/alma/mms_id_spec.rb +111 -0
- data/spec/lib/berkeley_library/alma/record_id_spec.rb +41 -0
- data/spec/spec_helper.rb +56 -0
- metadata +325 -0
@@ -0,0 +1,95 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
module BerkeleyLibrary
|
4
|
+
module Alma
|
5
|
+
describe BibNumber do
|
6
|
+
before(:each) do
|
7
|
+
BerkeleyLibrary::Alma.configure do
|
8
|
+
Config.alma_sru_host = 'berkeley.alma.exlibrisgroup.com'
|
9
|
+
Config.alma_institution_code = '01UCS_BER'
|
10
|
+
Config.alma_primo_host = 'search.library.berkeley.edu'
|
11
|
+
Config.alma_permalink_key = 'iqob43'
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
after(:each) do
|
16
|
+
BerkeleyLibrary::Alma::Config.send(:clear!)
|
17
|
+
end
|
18
|
+
|
19
|
+
let(:expected_check_digits_by_bib) do
|
20
|
+
infile = 'spec/data/bibs_with_check_digits.txt'
|
21
|
+
File.readlines(infile, chomp: true).each_with_object({}) do |bib, x|
|
22
|
+
x[bib[0, 9]] = bib[9]
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
describe :new do
|
27
|
+
it "raises an error for input that's not a bib number" do
|
28
|
+
bad_record_numbers = %w[
|
29
|
+
b1234567
|
30
|
+
b123456789abcdef
|
31
|
+
(coll)12345
|
32
|
+
o12345678
|
33
|
+
991054360089706532
|
34
|
+
]
|
35
|
+
|
36
|
+
aggregate_failures do
|
37
|
+
bad_record_numbers.each do |bad_bib|
|
38
|
+
expect { BibNumber.new(bad_bib) }.to raise_error(ArgumentError), "#{bad_bib}: No error raised for #{bad_bib}"
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
it 'produces the expected check digit' do
|
44
|
+
aggregate_failures do
|
45
|
+
expected_check_digits_by_bib.each do |bib_expected, cd_expected|
|
46
|
+
bib_with_cd = BibNumber.new(bib_expected).to_s
|
47
|
+
expect(bib_with_cd[0, 9]).to eq(bib_expected) # just to be sure
|
48
|
+
|
49
|
+
cd_actual = bib_with_cd[9]
|
50
|
+
expect(cd_actual).to eq(cd_expected), "Wrong check digit for #{bib_expected}; should be #{cd_expected}, was #{cd_actual}"
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
it 'raises an error if passed an invalid check digit' do
|
56
|
+
aggregate_failures do
|
57
|
+
expected_check_digits_by_bib.each do |bib, cd|
|
58
|
+
cd_i = cd == 'x' ? 10 : cd.to_i
|
59
|
+
bad_cd = cd_i == 0 ? 'x' : (cd_i - 1).to_s
|
60
|
+
bad_bib = "#{bib}#{bad_cd}"
|
61
|
+
expect { BibNumber.new(bad_bib).to_s }.to raise_error(ArgumentError), "#{bib}: No error raised for #{bad_cd} (should be #{cd})"
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
it 'ignores a wildcard "a" check digit, but returns the correct digit' do
|
67
|
+
aggregate_failures do
|
68
|
+
expected_check_digits_by_bib.each do |bib, cd|
|
69
|
+
wildcard = "#{bib}a"
|
70
|
+
expected = "#{bib}#{cd}"
|
71
|
+
begin
|
72
|
+
actual = BibNumber.new(wildcard).to_s
|
73
|
+
expect(actual).to eq(expected)
|
74
|
+
rescue ArgumentError => e
|
75
|
+
raise("Expected #{wildcard} not to raise error, got #{e.class}: #{e}")
|
76
|
+
end
|
77
|
+
end
|
78
|
+
end
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
82
|
+
describe :marc_record do
|
83
|
+
it 'returns the MARC record' do
|
84
|
+
raw_bib_number = 'b11082434'
|
85
|
+
stub_sru_request(raw_bib_number)
|
86
|
+
|
87
|
+
bib_number = BibNumber.new(raw_bib_number)
|
88
|
+
marc_record = bib_number.get_marc_record
|
89
|
+
expect(marc_record).not_to be_nil
|
90
|
+
expect(marc_record.record_id).to eq('991038544199706532')
|
91
|
+
end
|
92
|
+
end
|
93
|
+
end
|
94
|
+
end
|
95
|
+
end
|
@@ -0,0 +1,94 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'uri'
|
3
|
+
require 'ostruct'
|
4
|
+
|
5
|
+
module BerkeleyLibrary
|
6
|
+
module Alma
|
7
|
+
describe Config do
|
8
|
+
|
9
|
+
after(:each) do
|
10
|
+
Config.send(:clear!)
|
11
|
+
end
|
12
|
+
|
13
|
+
describe :alma_sru_host= do
|
14
|
+
it 'sets the hostname' do
|
15
|
+
expected_host = 'alma.example.org'
|
16
|
+
Config.alma_sru_host = expected_host
|
17
|
+
expect(Config.alma_sru_host).to eq(expected_host)
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
describe :alma_institution_code= do
|
22
|
+
it 'sets the Alma institution code' do
|
23
|
+
expected_code = '01UCS_BER'
|
24
|
+
Config.alma_institution_code = expected_code
|
25
|
+
expect(Config.alma_institution_code).to eq(expected_code)
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
describe :alma_sru_base_uri do
|
30
|
+
it 'generates the base URI from the SRU host and institution code' do
|
31
|
+
expected_host = 'alma.example.org'
|
32
|
+
Config.alma_sru_host = expected_host
|
33
|
+
|
34
|
+
expected_code = '01UCS_BER'
|
35
|
+
Config.alma_institution_code = expected_code
|
36
|
+
|
37
|
+
base_uri = Config.alma_sru_base_uri
|
38
|
+
expect(base_uri.host).to eq(expected_host)
|
39
|
+
expect(base_uri.path).to end_with("/#{expected_code}")
|
40
|
+
end
|
41
|
+
|
42
|
+
it 'requires both the SRU host and institution code to be set' do
|
43
|
+
expect { Config.alma_sru_base_uri }.to raise_error(ArgumentError)
|
44
|
+
|
45
|
+
Config.alma_sru_host = 'alma.example.org'
|
46
|
+
Config.alma_institution_code = '01UCS_BER'
|
47
|
+
|
48
|
+
Config.alma_sru_base_uri
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
describe 'with Rails config' do
|
53
|
+
attr_reader :rails_config
|
54
|
+
|
55
|
+
before(:each) do
|
56
|
+
@rails_config = OpenStruct.new
|
57
|
+
|
58
|
+
application = double(Object)
|
59
|
+
allow(application).to receive(:config).and_return(rails_config)
|
60
|
+
|
61
|
+
rails = double(Object)
|
62
|
+
allow(rails).to receive(:application).and_return(application)
|
63
|
+
|
64
|
+
Object.const_set(:Rails, rails)
|
65
|
+
end
|
66
|
+
|
67
|
+
after(:each) do
|
68
|
+
Object.send(:remove_const, :Rails)
|
69
|
+
end
|
70
|
+
|
71
|
+
describe :alma_sru_base_uri do
|
72
|
+
it 'generates the base URI from the SRU host and institution code' do
|
73
|
+
expected_host = 'alma.example.org'
|
74
|
+
rails_config.alma_sru_host = expected_host
|
75
|
+
|
76
|
+
expected_code = '01UCS_BER'
|
77
|
+
rails_config.alma_institution_code = expected_code
|
78
|
+
|
79
|
+
base_uri = Config.alma_sru_base_uri
|
80
|
+
expect(base_uri.host).to eq(expected_host)
|
81
|
+
expect(base_uri.path).to end_with("/#{expected_code}")
|
82
|
+
end
|
83
|
+
end
|
84
|
+
end
|
85
|
+
|
86
|
+
describe :default! do
|
87
|
+
it 'sets the defaults' do
|
88
|
+
Config.default!
|
89
|
+
expect(Config.missing).to be_empty
|
90
|
+
end
|
91
|
+
end
|
92
|
+
end
|
93
|
+
end
|
94
|
+
end
|
@@ -0,0 +1,111 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
module BerkeleyLibrary
|
4
|
+
module Alma
|
5
|
+
describe MMSID do
|
6
|
+
before(:each) do
|
7
|
+
BerkeleyLibrary::Alma.configure do
|
8
|
+
Config.alma_sru_host = 'berkeley.alma.exlibrisgroup.com'
|
9
|
+
Config.alma_institution_code = '01UCS_BER'
|
10
|
+
Config.alma_primo_host = 'search.library.berkeley.edu'
|
11
|
+
Config.alma_permalink_key = 'iqob43'
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
after(:each) do
|
16
|
+
BerkeleyLibrary::Alma::Config.send(:clear!)
|
17
|
+
end
|
18
|
+
|
19
|
+
describe :new do
|
20
|
+
it "raises an error for input that's not an MMS ID" do
|
21
|
+
bad_record_numbers = %w[
|
22
|
+
b11082434
|
23
|
+
(coll)12345
|
24
|
+
99127506531
|
25
|
+
235607980063450199
|
26
|
+
]
|
27
|
+
|
28
|
+
aggregate_failures do
|
29
|
+
bad_record_numbers.each do |bad_mms_id|
|
30
|
+
expect { MMSID.new(bad_mms_id) }.to raise_error(ArgumentError), "#{bad_mms_id}: No error raised for #{bad_mms_id}"
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
describe :to_s do
|
37
|
+
it 'returns the MMS ID' do
|
38
|
+
raw_mms_id = '991054360089706532'
|
39
|
+
mms_id = MMSID.new(raw_mms_id)
|
40
|
+
expect(mms_id.to_s).to eq(raw_mms_id)
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
describe :berkeley? do
|
45
|
+
it 'returns true for a Berkeley ID' do
|
46
|
+
raw_mms_id = '991054360089706532'
|
47
|
+
mms_id = MMSID.new(raw_mms_id)
|
48
|
+
expect(mms_id).to be_berkeley
|
49
|
+
end
|
50
|
+
|
51
|
+
it 'returns false for a non-Berkeley ID' do
|
52
|
+
raw_mms_id = '9912727694506531'
|
53
|
+
mms_id = MMSID.new(raw_mms_id)
|
54
|
+
expect(mms_id).not_to be_berkeley
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
describe :marc_record do
|
59
|
+
it 'returns the MARC record' do
|
60
|
+
raw_mms_id = '991054360089706532'
|
61
|
+
stub_sru_request(raw_mms_id)
|
62
|
+
|
63
|
+
mms_id = MMSID.new(raw_mms_id)
|
64
|
+
marc_record = mms_id.get_marc_record
|
65
|
+
expect(marc_record).not_to be_nil
|
66
|
+
expect(marc_record.record_id).to eq(raw_mms_id)
|
67
|
+
end
|
68
|
+
|
69
|
+
it 'returns nil for an empty response' do
|
70
|
+
empty_sru_response = <<~XML.strip
|
71
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
72
|
+
<searchRetrieveResponse>
|
73
|
+
<version>1.2</version>
|
74
|
+
<numberOfRecords>0</numberOfRecords>
|
75
|
+
<records/>
|
76
|
+
</searchRetrieveResponse>
|
77
|
+
XML
|
78
|
+
|
79
|
+
raw_mms_id = '991054360089706532'
|
80
|
+
sru_url = sru_url_for(raw_mms_id)
|
81
|
+
stub_request(:get, sru_url).to_return(status: 200, body: empty_sru_response)
|
82
|
+
|
83
|
+
mms_id = MMSID.new(raw_mms_id)
|
84
|
+
marc_record = mms_id.get_marc_record
|
85
|
+
expect(marc_record).to be_nil
|
86
|
+
end
|
87
|
+
|
88
|
+
it 'returns nil for an HTTP error response' do
|
89
|
+
raw_mms_id = '991054360089706532'
|
90
|
+
sru_url = sru_url_for(raw_mms_id)
|
91
|
+
stub_request(:get, sru_url).to_return(status: 404)
|
92
|
+
|
93
|
+
mms_id = MMSID.new(raw_mms_id)
|
94
|
+
marc_record = mms_id.get_marc_record
|
95
|
+
expect(marc_record).to be_nil
|
96
|
+
end
|
97
|
+
end
|
98
|
+
|
99
|
+
describe :permalink_uri do
|
100
|
+
it 'returns the permalink' do
|
101
|
+
raw_mms_id = '991054360089706532'
|
102
|
+
expected_url = "https://search.library.berkeley.edu/permalink/01UCS_BER/iqob43/alma#{raw_mms_id}"
|
103
|
+
|
104
|
+
mms_id = MMSID.new(raw_mms_id)
|
105
|
+
expected_uri = URI.parse(expected_url)
|
106
|
+
expect(mms_id.permalink_uri).to eq(expected_uri)
|
107
|
+
end
|
108
|
+
end
|
109
|
+
end
|
110
|
+
end
|
111
|
+
end
|
@@ -0,0 +1,41 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
module BerkeleyLibrary
|
4
|
+
module Alma
|
5
|
+
describe RecordId do
|
6
|
+
describe :parse do
|
7
|
+
it 'parses a bib number' do
|
8
|
+
raw_bib = 'b11082434'
|
9
|
+
bib_number = BibNumber.new(raw_bib)
|
10
|
+
|
11
|
+
expect(RecordId.parse(raw_bib)).to eq(bib_number)
|
12
|
+
end
|
13
|
+
|
14
|
+
it 'parses an MMS ID' do
|
15
|
+
raw_mms_id = '991038544199706532'
|
16
|
+
mms_id = MMSID.new(raw_mms_id)
|
17
|
+
|
18
|
+
expect(RecordId.parse(raw_mms_id)).to eq(mms_id)
|
19
|
+
end
|
20
|
+
|
21
|
+
it 'returns nil for things that are not record IDs' do
|
22
|
+
bad_ids = %w[
|
23
|
+
b1234567
|
24
|
+
b123456789abcdef
|
25
|
+
(coll)12345
|
26
|
+
o12345678
|
27
|
+
99127506531
|
28
|
+
235607980063450199
|
29
|
+
]
|
30
|
+
|
31
|
+
aggregate_failures do
|
32
|
+
bad_ids.each do |bad_id|
|
33
|
+
parsed_id = RecordId.parse(bad_id)
|
34
|
+
expect(parsed_id).to be_nil, "Expected nil for #{bad_id}, got #{parsed_id}"
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,56 @@
|
|
1
|
+
# ------------------------------------------------------------
|
2
|
+
# Simplecov
|
3
|
+
|
4
|
+
if ENV['COVERAGE']
|
5
|
+
require 'colorize'
|
6
|
+
require 'simplecov'
|
7
|
+
end
|
8
|
+
|
9
|
+
# ------------------------------------------------------------
|
10
|
+
# RSpec
|
11
|
+
|
12
|
+
require 'webmock/rspec'
|
13
|
+
|
14
|
+
RSpec.configure do |config|
|
15
|
+
config.color = true
|
16
|
+
config.tty = true
|
17
|
+
config.formatter = :documentation
|
18
|
+
config.before(:each) { WebMock.disable_net_connect!(allow_localhost: true) }
|
19
|
+
config.after(:each) { WebMock.allow_net_connect! }
|
20
|
+
config.mock_with :rspec do |mocks|
|
21
|
+
mocks.verify_partial_doubles = true
|
22
|
+
end
|
23
|
+
config.shared_context_metadata_behavior = :apply_to_host_groups
|
24
|
+
end
|
25
|
+
|
26
|
+
# ------------------------------------------------------------
|
27
|
+
# Code under test
|
28
|
+
|
29
|
+
require 'berkeley_library/alma'
|
30
|
+
|
31
|
+
# ------------------------------------------------------------
|
32
|
+
# Utility methods
|
33
|
+
|
34
|
+
def sru_url_for(record_id)
|
35
|
+
sru_url_base = 'https://berkeley.alma.exlibrisgroup.com/view/sru/01UCS_BER?version=1.2&operation=searchRetrieve&query='
|
36
|
+
|
37
|
+
if BerkeleyLibrary::Alma::Constants::ALMA_RECORD_RE =~ record_id
|
38
|
+
"#{sru_url_base}alma.mms_id%3D#{record_id}"
|
39
|
+
elsif BerkeleyLibrary::Alma::Constants::MILLENNIUM_RECORD_RE =~ record_id
|
40
|
+
full_bib_number = BerkeleyLibrary::Alma::BibNumber.new(record_id).to_s
|
41
|
+
"#{sru_url_base}alma.other_system_number%3DUCB-#{full_bib_number}-01ucs_ber"
|
42
|
+
else
|
43
|
+
raise ArgumentError, "Unknown record ID type: #{record_id}"
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
def sru_data_path_for(record_id)
|
48
|
+
"spec/data/#{record_id}-sru.xml"
|
49
|
+
end
|
50
|
+
|
51
|
+
def stub_sru_request(record_id)
|
52
|
+
sru_url = sru_url_for(record_id)
|
53
|
+
marc_xml_path = sru_data_path_for(record_id)
|
54
|
+
|
55
|
+
stub_request(:get, sru_url).to_return(status: 200, body: File.read(marc_xml_path))
|
56
|
+
end
|