alma 0.3.1 → 0.3.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.circleci/config.yml +54 -0
- data/.circleci/setup-rubygems.sh +3 -0
- data/.github/dependabot.yml +7 -0
- data/.gitignore +3 -0
- data/.rubocop.yml +134 -0
- data/.ruby-version +1 -1
- data/Gemfile +4 -3
- data/Rakefile +3 -1
- data/alma.gemspec +17 -17
- data/lib/alma.rb +34 -26
- data/lib/alma/alma_record.rb +3 -3
- data/lib/alma/api_defaults.rb +10 -1
- data/lib/alma/availability_response.rb +49 -52
- data/lib/alma/bib.rb +23 -21
- data/lib/alma/bib_holding.rb +25 -0
- data/lib/alma/bib_item.rb +22 -9
- data/lib/alma/bib_item_set.rb +19 -8
- data/lib/alma/config.rb +3 -1
- data/lib/alma/course.rb +47 -0
- data/lib/alma/course_set.rb +17 -0
- data/lib/alma/electronic.rb +1 -1
- data/lib/alma/electronic/batch_utils.rb +11 -11
- data/lib/alma/error.rb +4 -3
- data/lib/alma/fine.rb +3 -2
- data/lib/alma/fine_set.rb +1 -1
- data/lib/alma/item_request_options.rb +4 -3
- data/lib/alma/library.rb +29 -0
- data/lib/alma/library_set.rb +21 -0
- data/lib/alma/loan.rb +4 -2
- data/lib/alma/loan_set.rb +3 -3
- data/lib/alma/location.rb +29 -0
- data/lib/alma/location_set.rb +21 -0
- data/lib/alma/renewal_response.rb +8 -8
- data/lib/alma/request.rb +16 -14
- data/lib/alma/request_options.rb +9 -7
- data/lib/alma/request_set.rb +1 -1
- data/lib/alma/user.rb +61 -59
- data/lib/alma/user_request.rb +3 -1
- data/lib/alma/version.rb +3 -1
- metadata +46 -5
- data/.travis.yml +0 -13
data/lib/alma/bib.rb
CHANGED
@@ -1,16 +1,18 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Alma
|
2
4
|
class Bib
|
3
5
|
extend Alma::ApiDefaults
|
4
6
|
extend Forwardable
|
5
|
-
|
7
|
+
|
6
8
|
def self.find(ids, args)
|
7
9
|
get_bibs(ids, args)
|
8
10
|
end
|
9
11
|
|
10
|
-
def self.get_bibs(ids, args={})
|
12
|
+
def self.get_bibs(ids, args = {})
|
11
13
|
response = HTTParty.get(
|
12
|
-
self.bibs_base_path,
|
13
|
-
query: {mms_id: ids_from_array(ids) }.merge(args),
|
14
|
+
self.bibs_base_path,
|
15
|
+
query: { mms_id: ids_from_array(ids) }.merge(args),
|
14
16
|
headers: headers,
|
15
17
|
timeout: timeout
|
16
18
|
)
|
@@ -19,12 +21,12 @@ module Alma
|
|
19
21
|
Alma::BibSet.new(get_body_from(response))
|
20
22
|
else
|
21
23
|
raise StandardError, get_body_from(response)
|
22
|
-
end
|
24
|
+
end
|
23
25
|
end
|
24
26
|
|
25
27
|
|
26
|
-
def self.get_availability(ids, args={})
|
27
|
-
args.merge!({expand:
|
28
|
+
def self.get_availability(ids, args = {})
|
29
|
+
args.merge!({ expand: "p_avail,e_avail,d_avail" })
|
28
30
|
bibs = get_bibs(ids, args)
|
29
31
|
|
30
32
|
Alma::AvailabilityResponse.new(bibs)
|
@@ -39,31 +41,31 @@ module Alma
|
|
39
41
|
|
40
42
|
def initialize(response_body)
|
41
43
|
@response = response_body
|
42
|
-
@id = @response[
|
44
|
+
@id = @response["mms_id"].to_s
|
43
45
|
end
|
44
46
|
|
45
47
|
# The raw MARCXML record, converted to a Hash
|
46
48
|
def record
|
47
|
-
@record ||= XmlSimple.xml_in(response[
|
49
|
+
@record ||= XmlSimple.xml_in(response["anies"].first)
|
48
50
|
end
|
49
51
|
|
50
52
|
|
51
53
|
private
|
52
54
|
|
53
|
-
|
54
|
-
|
55
|
-
|
55
|
+
def bibs_base_path
|
56
|
+
self.class.bibs_base_path
|
57
|
+
end
|
56
58
|
|
57
|
-
|
58
|
-
|
59
|
-
|
59
|
+
def headers
|
60
|
+
self.class.headers
|
61
|
+
end
|
60
62
|
|
61
|
-
|
62
|
-
|
63
|
-
|
63
|
+
def self.get_body_from(response)
|
64
|
+
JSON.parse(response.body)
|
65
|
+
end
|
64
66
|
|
65
|
-
|
66
|
-
|
67
|
-
|
67
|
+
def self.ids_from_array(ids)
|
68
|
+
ids.map(&:to_s).map(&:strip).join(",")
|
69
|
+
end
|
68
70
|
end
|
69
71
|
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Alma
|
4
|
+
class BibHolding
|
5
|
+
extend Alma::ApiDefaults
|
6
|
+
extend Forwardable
|
7
|
+
|
8
|
+
def self.find(mms_id:, holding_id:)
|
9
|
+
url = "#{bibs_base_path}/#{mms_id}/holdings/#{holding_id}"
|
10
|
+
response = HTTParty.get(url, headers: headers, timeout: timeout)
|
11
|
+
new(response)
|
12
|
+
end
|
13
|
+
|
14
|
+
attr_reader :holding
|
15
|
+
def_delegators :holding, :[], :[]=, :has_key?, :keys, :to_json, :each
|
16
|
+
|
17
|
+
def initialize(holding)
|
18
|
+
@holding = holding
|
19
|
+
end
|
20
|
+
|
21
|
+
def holding_id
|
22
|
+
holding["holding_id"]
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
data/lib/alma/bib_item.rb
CHANGED
@@ -1,4 +1,6 @@
|
|
1
|
-
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "alma/bib_item_set"
|
2
4
|
module Alma
|
3
5
|
class BibItem
|
4
6
|
extend Alma::ApiDefaults
|
@@ -7,17 +9,28 @@ module Alma
|
|
7
9
|
attr_reader :item
|
8
10
|
def_delegators :item, :[], :has_key?, :keys, :to_json
|
9
11
|
|
10
|
-
PERMITTED_ARGS
|
12
|
+
PERMITTED_ARGS = [
|
11
13
|
:limit, :offset, :expand, :user_id, :current_library,
|
12
14
|
:current_location, :q, :order_by, :direction
|
13
15
|
]
|
14
16
|
|
15
|
-
def self.find(mms_id, options={})
|
17
|
+
def self.find(mms_id, options = {})
|
16
18
|
holding_id = options.delete(:holding_id) || "ALL"
|
17
|
-
options.select! {|k,_| PERMITTED_ARGS.include? k }
|
19
|
+
options.select! { |k, _| PERMITTED_ARGS.include? k }
|
18
20
|
url = "#{bibs_base_path}/#{mms_id}/holdings/#{holding_id}/items"
|
19
21
|
response = HTTParty.get(url, headers: headers, query: options, timeout: timeout)
|
20
|
-
BibItemSet.new(response, options.merge({mms_id: mms_id, holding_id: holding_id}))
|
22
|
+
BibItemSet.new(response, options.merge({ mms_id: mms_id, holding_id: holding_id }))
|
23
|
+
end
|
24
|
+
|
25
|
+
def self.find_by_barcode(barcode)
|
26
|
+
response = HTTParty.get(items_base_path, headers: headers, query: { item_barcode: barcode }, timeout: timeout, follow_redirects: true)
|
27
|
+
new(response)
|
28
|
+
end
|
29
|
+
|
30
|
+
def self.scan(mms_id:, holding_id:, item_pid:, options: {})
|
31
|
+
url = "#{bibs_base_path}/#{mms_id}/holdings/#{holding_id}/items/#{item_pid}"
|
32
|
+
response = HTTParty.post(url, headers: headers, query: options)
|
33
|
+
new(response)
|
21
34
|
end
|
22
35
|
|
23
36
|
def initialize(item)
|
@@ -85,7 +98,7 @@ module Alma
|
|
85
98
|
end
|
86
99
|
|
87
100
|
def temp_call_number
|
88
|
-
holding_data.fetch("temp_call_number","")
|
101
|
+
holding_data.fetch("temp_call_number", "")
|
89
102
|
end
|
90
103
|
|
91
104
|
def has_temp_call_number?
|
@@ -96,7 +109,7 @@ module Alma
|
|
96
109
|
if has_temp_call_number?
|
97
110
|
holding_data.fetch("temp_call_number")
|
98
111
|
else
|
99
|
-
holding_data.fetch("call_number","")
|
112
|
+
holding_data.fetch("call_number", "")
|
100
113
|
end
|
101
114
|
end
|
102
115
|
|
@@ -105,7 +118,7 @@ module Alma
|
|
105
118
|
end
|
106
119
|
|
107
120
|
def alt_call_number
|
108
|
-
item_data.fetch("alternative_call_number","")
|
121
|
+
item_data.fetch("alternative_call_number", "")
|
109
122
|
end
|
110
123
|
|
111
124
|
def has_process_type?
|
@@ -121,7 +134,7 @@ module Alma
|
|
121
134
|
end
|
122
135
|
|
123
136
|
def base_status
|
124
|
-
item_data.dig("base_status","value")|| ""
|
137
|
+
item_data.dig("base_status", "value") || ""
|
125
138
|
end
|
126
139
|
|
127
140
|
def in_place?
|
data/lib/alma/bib_item_set.rb
CHANGED
@@ -1,8 +1,8 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
module Alma
|
4
|
-
|
5
4
|
class BibItemSet < ResultSet
|
5
|
+
ITEMS_PER_PAGE = 100
|
6
6
|
|
7
7
|
class ResponseError < ::Alma::StandardError
|
8
8
|
end
|
@@ -13,7 +13,7 @@ module Alma
|
|
13
13
|
def_delegators :items, :[], :[]=, :empty?, :size, :each
|
14
14
|
def_delegators :raw_response, :response, :request
|
15
15
|
|
16
|
-
def initialize(response, options={})
|
16
|
+
def initialize(response, options = {})
|
17
17
|
@raw_response = response
|
18
18
|
parsed = response.parsed_response
|
19
19
|
@total_record_count = parsed["total_record_count"]
|
@@ -25,7 +25,7 @@ module Alma
|
|
25
25
|
end
|
26
26
|
|
27
27
|
def loggable
|
28
|
-
{ total_record_count: @total_record_count,
|
28
|
+
{ total_record_count: @total_record_count.to_s,
|
29
29
|
mms_id: @mms_id,
|
30
30
|
uri: @raw_response&.request&.uri.to_s
|
31
31
|
}.select { |k, v| !(v.nil? || v.empty?) }
|
@@ -49,22 +49,29 @@ module Alma
|
|
49
49
|
end
|
50
50
|
|
51
51
|
def all
|
52
|
+
@last_page_index ||= false
|
52
53
|
Enumerator.new do |yielder|
|
53
54
|
offset = 0
|
54
|
-
|
55
|
-
r = (offset == 0) ? self : single_record_class.find(@mms_id, options
|
55
|
+
while (!@last_page_index || @last_page_index >= offset / items_per_page) do
|
56
|
+
r = (offset == 0) ? self : single_record_class.find(@mms_id, options = @options.merge({ limit: items_per_page, offset: offset }))
|
56
57
|
unless r.empty?
|
57
58
|
r.map { |item| yielder << item }
|
58
|
-
offset
|
59
|
+
@last_page_index = (offset / items_per_page)
|
59
60
|
else
|
60
|
-
|
61
|
+
@last_page_index = @last_page_index ? @last_page_index - 1 : -1
|
62
|
+
end
|
63
|
+
|
64
|
+
if r.size == items_per_page
|
65
|
+
@last_page_index += 1
|
61
66
|
end
|
67
|
+
|
68
|
+
offset += items_per_page
|
62
69
|
end
|
63
70
|
end
|
64
71
|
end
|
65
72
|
|
66
73
|
def each(&block)
|
67
|
-
|
74
|
+
@items.each(&block)
|
68
75
|
end
|
69
76
|
|
70
77
|
def success?
|
@@ -78,5 +85,9 @@ module Alma
|
|
78
85
|
def single_record_class
|
79
86
|
Alma::BibItem
|
80
87
|
end
|
88
|
+
|
89
|
+
def items_per_page
|
90
|
+
ITEMS_PER_PAGE
|
91
|
+
end
|
81
92
|
end
|
82
93
|
end
|
data/lib/alma/config.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Alma
|
2
4
|
class << self
|
3
5
|
attr_accessor :configuration
|
@@ -14,7 +16,7 @@ module Alma
|
|
14
16
|
|
15
17
|
def initialize
|
16
18
|
@apikey = "TEST_API_KEY"
|
17
|
-
@region =
|
19
|
+
@region = "https://api-na.hosted.exlibrisgroup.com"
|
18
20
|
@enable_loggable = false
|
19
21
|
@timeout = 5
|
20
22
|
@http_retries = 3
|
data/lib/alma/course.rb
ADDED
@@ -0,0 +1,47 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Alma
|
4
|
+
class Course
|
5
|
+
extend Alma::ApiDefaults
|
6
|
+
extend Forwardable
|
7
|
+
|
8
|
+
def self.all_courses(args: {})
|
9
|
+
response = HTTParty.get("#{courses_base_path}/courses",
|
10
|
+
query: args,
|
11
|
+
headers: headers,
|
12
|
+
timeout: timeout)
|
13
|
+
if response.code == 200
|
14
|
+
Alma::CourseSet.new(get_body_from(response))
|
15
|
+
else
|
16
|
+
raise StandardError, get_body_from(response)
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
attr_accessor :response
|
21
|
+
|
22
|
+
# The Course object can respond directly to Hash like access of attributes
|
23
|
+
def_delegators :response, :[], :[]=, :has_key?, :keys, :to_json
|
24
|
+
|
25
|
+
def initialize(response_body)
|
26
|
+
@response = response_body
|
27
|
+
end
|
28
|
+
|
29
|
+
private
|
30
|
+
|
31
|
+
def self.get_body_from(response)
|
32
|
+
JSON.parse(response.body)
|
33
|
+
end
|
34
|
+
|
35
|
+
def self.courses_base_path
|
36
|
+
"https://api-na.hosted.exlibrisgroup.com/almaws/v1"
|
37
|
+
end
|
38
|
+
|
39
|
+
def courses_base_path
|
40
|
+
self.class.courses_base_path
|
41
|
+
end
|
42
|
+
|
43
|
+
def headers
|
44
|
+
self.class.headers
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
data/lib/alma/electronic.rb
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
|
+
|
2
3
|
require "httparty"
|
3
4
|
require "active_support"
|
4
5
|
require "active_support/core_ext"
|
@@ -7,7 +8,6 @@ require "alma/config"
|
|
7
8
|
module Alma
|
8
9
|
# Alma::Electronic APIs wrapper.
|
9
10
|
class Electronic
|
10
|
-
|
11
11
|
class ElectronicError < ArgumentError
|
12
12
|
end
|
13
13
|
|
@@ -81,12 +81,12 @@ module Alma
|
|
81
81
|
end
|
82
82
|
|
83
83
|
self.class.new(options.merge(
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
84
|
+
chain: chain,
|
85
|
+
ids: ids,
|
86
|
+
type: type,
|
87
|
+
tag: tag,
|
88
|
+
notes: notes,
|
89
|
+
logger: @@logger,
|
90
90
|
))
|
91
91
|
end
|
92
92
|
|
@@ -179,11 +179,11 @@ module Alma
|
|
179
179
|
end
|
180
180
|
|
181
181
|
self.class.new(options.merge(
|
182
|
-
|
183
|
-
|
184
|
-
|
185
|
-
|
186
|
-
|
182
|
+
chain: chain,
|
183
|
+
notes: notes,
|
184
|
+
type: type,
|
185
|
+
tag: tag,
|
186
|
+
logger: @@logger,
|
187
187
|
))
|
188
188
|
end
|
189
189
|
|
data/lib/alma/error.rb
CHANGED
@@ -1,15 +1,16 @@
|
|
1
|
-
|
1
|
+
# frozen_string_literal: true
|
2
2
|
|
3
|
+
module Alma::Error
|
3
4
|
def has_error?
|
4
5
|
!error.empty?
|
5
6
|
end
|
6
7
|
|
7
8
|
def error_message
|
8
|
-
(has_error?) ? error[
|
9
|
+
(has_error?) ? error["errorList"]["error"]["errorMessage"] : ""
|
9
10
|
end
|
10
11
|
|
11
12
|
def error
|
12
|
-
@response.fetch(
|
13
|
+
@response.fetch("web_service_result", {})
|
13
14
|
end
|
14
15
|
end
|
15
16
|
|
data/lib/alma/fine.rb
CHANGED
@@ -1,9 +1,10 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Alma
|
2
4
|
class Fine < AlmaRecord
|
3
5
|
extend Alma::ApiDefaults
|
4
6
|
|
5
|
-
def self.where_user(user_id, args={})
|
6
|
-
|
7
|
+
def self.where_user(user_id, args = {})
|
7
8
|
response = HTTParty.get("#{users_base_path}/#{user_id}/fees", query: args, headers: headers, timeout: timeout)
|
8
9
|
if response.code == 200
|
9
10
|
Alma::FineSet.new(response)
|
data/lib/alma/fine_set.rb
CHANGED
@@ -1,12 +1,13 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Alma
|
2
4
|
class ItemRequestOptions < RequestOptions
|
3
|
-
|
4
5
|
class ResponseError < Alma::StandardError
|
5
6
|
end
|
6
7
|
|
7
|
-
def self.get(mms_id, holding_id=nil, item_pid=nil, options={})
|
8
|
+
def self.get(mms_id, holding_id = nil, item_pid = nil, options = {})
|
8
9
|
url = "#{bibs_base_path}/#{mms_id}/holdings/#{holding_id}/items/#{item_pid}/request-options"
|
9
|
-
options.select! {|k,_| REQUEST_OPTIONS_PERMITTED_ARGS.include? k }
|
10
|
+
options.select! { |k, _| REQUEST_OPTIONS_PERMITTED_ARGS.include? k }
|
10
11
|
response = HTTParty.get(url, headers: headers, query: options, timeout: timeout)
|
11
12
|
new(response)
|
12
13
|
end
|