alma 0.2.6 → 0.3.3
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/.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/CODE_OF_CONDUCT.md +1 -1
- data/Gemfile +4 -3
- data/Guardfile +75 -0
- data/README.md +136 -26
- data/Rakefile +3 -1
- data/alma.gemspec +21 -16
- data/lib/alma/alma_record.rb +3 -3
- data/lib/alma/api_defaults.rb +39 -0
- data/lib/alma/availability_response.rb +50 -53
- data/lib/alma/bib.rb +26 -42
- data/lib/alma/bib_holding.rb +25 -0
- data/lib/alma/bib_item.rb +28 -38
- data/lib/alma/bib_item_set.rb +72 -12
- data/lib/alma/bib_set.rb +7 -21
- data/lib/alma/config.rb +10 -4
- data/lib/alma/course.rb +47 -0
- data/lib/alma/course_set.rb +17 -0
- data/lib/alma/electronic/README.md +20 -0
- data/lib/alma/electronic/batch_utils.rb +224 -0
- data/lib/alma/electronic/business.rb +29 -0
- data/lib/alma/electronic.rb +167 -0
- data/lib/alma/error.rb +16 -4
- data/lib/alma/fine.rb +16 -0
- data/lib/alma/fine_set.rb +36 -21
- data/lib/alma/item_request_options.rb +23 -0
- data/lib/alma/library.rb +29 -0
- data/lib/alma/library_set.rb +21 -0
- data/lib/alma/loan.rb +31 -2
- data/lib/alma/loan_set.rb +62 -15
- data/lib/alma/location.rb +29 -0
- data/lib/alma/location_set.rb +21 -0
- data/lib/alma/renewal_response.rb +19 -11
- data/lib/alma/request.rb +167 -0
- data/lib/alma/request_options.rb +36 -17
- data/lib/alma/request_set.rb +64 -15
- data/lib/alma/response.rb +45 -0
- data/lib/alma/result_set.rb +27 -35
- data/lib/alma/user.rb +111 -92
- data/lib/alma/user_request.rb +19 -0
- data/lib/alma/user_set.rb +5 -6
- data/lib/alma/version.rb +3 -1
- data/lib/alma.rb +34 -22
- data/log/.gitignore +4 -0
- metadata +118 -10
- data/.travis.yml +0 -5
- data/lib/alma/api.rb +0 -33
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 210d45982a6c339d9b8c170a73077be4f56bcf4eaa989debe95d2f9d97897c0e
|
4
|
+
data.tar.gz: 1b988140c47bc0974e617cc1131aee0b82dfbcd50ce20d408fbd2a969cf180c7
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 1667314072be96beb05c3f389c5240142ff5e0f44be0eed44d2240653ad4dd38f07a221b2ab3235921e37e7620e4518128e1b8806880daadffc9f570bbccd773
|
7
|
+
data.tar.gz: b98783202cf24c6a33c0c249f70d9f55a715b611c89a3249d4cf14a1352f2dca476123315649f9d3f624b1533fa0547d285605af309cfab8c537a1b6d81db85b
|
@@ -0,0 +1,54 @@
|
|
1
|
+
version: 2.1
|
2
|
+
orbs:
|
3
|
+
ruby: circleci/ruby@1.2
|
4
|
+
|
5
|
+
workflows:
|
6
|
+
version: 2
|
7
|
+
test-deploy:
|
8
|
+
jobs:
|
9
|
+
- build
|
10
|
+
- deploy:
|
11
|
+
filters:
|
12
|
+
tags:
|
13
|
+
only: /.*/
|
14
|
+
branches:
|
15
|
+
ignore: /.*/
|
16
|
+
|
17
|
+
jobs:
|
18
|
+
build:
|
19
|
+
docker:
|
20
|
+
- image: cimg/ruby:2.7.2-browsers
|
21
|
+
auth:
|
22
|
+
username: $DOCKERHUB_USER
|
23
|
+
password: $DOCKERHUB_PASSWORD
|
24
|
+
|
25
|
+
executor: ruby/default
|
26
|
+
steps:
|
27
|
+
- checkout
|
28
|
+
- run:
|
29
|
+
name: Which bundler?
|
30
|
+
command: bundle -v
|
31
|
+
- run: bundle install
|
32
|
+
- run:
|
33
|
+
name: lint
|
34
|
+
command: bundle exec rubocop
|
35
|
+
- run:
|
36
|
+
name: test
|
37
|
+
command: bundle exec rake
|
38
|
+
deploy:
|
39
|
+
docker:
|
40
|
+
- image: cimg/ruby:2.7.2-browsers
|
41
|
+
|
42
|
+
working_directory: ~/repo
|
43
|
+
|
44
|
+
steps:
|
45
|
+
- checkout
|
46
|
+
- run:
|
47
|
+
name: Setup Rubygems
|
48
|
+
command: bash .circleci/setup-rubygems.sh
|
49
|
+
|
50
|
+
- run:
|
51
|
+
name: Publish to Rubygems
|
52
|
+
command: |
|
53
|
+
gem build alma.gemspec
|
54
|
+
gem push "$(ls alma-*.gem)"
|
data/.gitignore
CHANGED
data/.rubocop.yml
ADDED
@@ -0,0 +1,134 @@
|
|
1
|
+
require:
|
2
|
+
- rubocop-rails
|
3
|
+
|
4
|
+
AllCops:
|
5
|
+
TargetRubyVersion: 2.7
|
6
|
+
# RuboCop has a bunch of cops enabled by default. This setting tells RuboCop
|
7
|
+
# to ignore them, so only the ones explicitly set in this file are enabled.
|
8
|
+
DisabledByDefault: true
|
9
|
+
Exclude:
|
10
|
+
- 'node_modules/**/*'
|
11
|
+
- '**/templates/**/*'
|
12
|
+
- '**/vendor/**/*'
|
13
|
+
- 'actionpack/lib/action_dispatch/journey/parser.rb'
|
14
|
+
- 'bin/*'
|
15
|
+
- 'solr/**/*'
|
16
|
+
|
17
|
+
# Prefer &&/|| over and/or.
|
18
|
+
Style/AndOr:
|
19
|
+
Enabled: true
|
20
|
+
|
21
|
+
# Align `when` with `case`.
|
22
|
+
Layout/CaseIndentation:
|
23
|
+
Enabled: true
|
24
|
+
|
25
|
+
# Align comments with method definitions.
|
26
|
+
Layout/CommentIndentation:
|
27
|
+
Enabled: true
|
28
|
+
|
29
|
+
Layout/EmptyLineAfterMagicComment:
|
30
|
+
Enabled: true
|
31
|
+
|
32
|
+
# In a regular class definition, no empty lines around the body.
|
33
|
+
Layout/EmptyLinesAroundClassBody:
|
34
|
+
Enabled: true
|
35
|
+
|
36
|
+
# In a regular method definition, no empty lines around the body.
|
37
|
+
Layout/EmptyLinesAroundMethodBody:
|
38
|
+
Enabled: true
|
39
|
+
|
40
|
+
# In a regular module definition, no empty lines around the body.
|
41
|
+
Layout/EmptyLinesAroundModuleBody:
|
42
|
+
Enabled: true
|
43
|
+
|
44
|
+
Layout/FirstArgumentIndentation:
|
45
|
+
Enabled: true
|
46
|
+
|
47
|
+
# Use Ruby >= 1.9 syntax for hashes. Prefer { a: :b } over { :a => :b }.
|
48
|
+
Style/HashSyntax:
|
49
|
+
Enabled: true
|
50
|
+
|
51
|
+
# Method definitions after `private` or `protected` isolated calls need one
|
52
|
+
# extra level of indentation.
|
53
|
+
Layout/IndentationConsistency:
|
54
|
+
Enabled: true
|
55
|
+
EnforcedStyle: indented_internal_methods
|
56
|
+
|
57
|
+
# Two spaces, no tabs (for indentation).
|
58
|
+
Layout/IndentationWidth:
|
59
|
+
Enabled: true
|
60
|
+
|
61
|
+
Layout/SpaceAfterColon:
|
62
|
+
Enabled: true
|
63
|
+
|
64
|
+
Layout/SpaceAfterComma:
|
65
|
+
Enabled: true
|
66
|
+
|
67
|
+
Layout/SpaceAroundEqualsInParameterDefault:
|
68
|
+
Enabled: true
|
69
|
+
|
70
|
+
Layout/SpaceAroundKeyword:
|
71
|
+
Enabled: true
|
72
|
+
|
73
|
+
Layout/SpaceAroundOperators:
|
74
|
+
Enabled: true
|
75
|
+
|
76
|
+
Layout/SpaceBeforeFirstArg:
|
77
|
+
Enabled: true
|
78
|
+
|
79
|
+
# Defining a method with parameters needs parentheses.
|
80
|
+
Style/MethodDefParentheses:
|
81
|
+
Enabled: true
|
82
|
+
|
83
|
+
Style/FrozenStringLiteralComment:
|
84
|
+
Enabled: true
|
85
|
+
EnforcedStyle: always
|
86
|
+
Exclude:
|
87
|
+
- 'app/models/traject_indexer.rb'
|
88
|
+
- 'db/schema.rb'
|
89
|
+
|
90
|
+
# Use `foo {}` not `foo{}`.
|
91
|
+
Layout/SpaceBeforeBlockBraces:
|
92
|
+
Enabled: true
|
93
|
+
|
94
|
+
# Use `foo { bar }` not `foo {bar}`.
|
95
|
+
Layout/SpaceInsideBlockBraces:
|
96
|
+
Enabled: true
|
97
|
+
|
98
|
+
# Use `{ a: 1 }` not `{a:1}`.
|
99
|
+
Layout/SpaceInsideHashLiteralBraces:
|
100
|
+
Enabled: true
|
101
|
+
|
102
|
+
Layout/SpaceInsideParens:
|
103
|
+
Enabled: true
|
104
|
+
|
105
|
+
# Check quotes usage according to lint rule below.
|
106
|
+
Style/StringLiterals:
|
107
|
+
Enabled: true
|
108
|
+
EnforcedStyle: double_quotes
|
109
|
+
|
110
|
+
# Detect hard tabs, no hard tabs.
|
111
|
+
Layout/IndentationStyle:
|
112
|
+
Enabled: true
|
113
|
+
|
114
|
+
# Blank lines should not have any spaces.
|
115
|
+
Layout/TrailingEmptyLines:
|
116
|
+
Enabled: true
|
117
|
+
|
118
|
+
# No trailing whitespace.
|
119
|
+
Layout/TrailingWhitespace:
|
120
|
+
Enabled: true
|
121
|
+
|
122
|
+
# Use quotes for string literals when they are enough.
|
123
|
+
Style/RedundantPercentQ:
|
124
|
+
Enabled: true
|
125
|
+
|
126
|
+
# Align `end` with the matching keyword or starting expression except for
|
127
|
+
# assignments, where it should be aligned with the LHS.
|
128
|
+
Layout/EndAlignment:
|
129
|
+
Enabled: true
|
130
|
+
EnforcedStyleAlignWith: variable
|
131
|
+
|
132
|
+
# Use my_method(my_arg) not my_method( my_arg ) or my_method my_arg.
|
133
|
+
Lint/RequireParentheses:
|
134
|
+
Enabled: true
|
data/.ruby-version
CHANGED
@@ -1 +1 @@
|
|
1
|
-
ruby-2.
|
1
|
+
ruby-2.7.2
|
data/CODE_OF_CONDUCT.md
CHANGED
@@ -55,7 +55,7 @@ further defined and clarified by project maintainers.
|
|
55
55
|
## Enforcement
|
56
56
|
|
57
57
|
Instances of abusive, harassing, or otherwise unacceptable behavior may be
|
58
|
-
reported by contacting the project team at
|
58
|
+
reported by contacting the project team at svc.libdev@temple.edu. All
|
59
59
|
complaints will be reviewed and investigated and will result in a response that
|
60
60
|
is deemed necessary and appropriate to the circumstances. The project team is
|
61
61
|
obligated to maintain confidentiality with regard to the reporter of an incident.
|
data/Gemfile
CHANGED
data/Guardfile
ADDED
@@ -0,0 +1,75 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# A sample Guardfile
|
4
|
+
# More info at https://github.com/guard/guard#readme
|
5
|
+
|
6
|
+
## Uncomment and set this to only include directories you want to watch
|
7
|
+
# directories %w(app lib config test spec features) \
|
8
|
+
# .select{|d| Dir.exists?(d) ? d : UI.warning("Directory #{d} does not exist")}
|
9
|
+
|
10
|
+
## Note: if you are using the `directories` clause above and you are not
|
11
|
+
## watching the project directory ('.'), then you will want to move
|
12
|
+
## the Guardfile to a watched dir and symlink it back, e.g.
|
13
|
+
#
|
14
|
+
# $ mkdir config
|
15
|
+
# $ mv Guardfile config/
|
16
|
+
# $ ln -s config/Guardfile .
|
17
|
+
#
|
18
|
+
# and, you'll have to watch "config/Guardfile" instead of "Guardfile"
|
19
|
+
|
20
|
+
# Note: The cmd option is now required due to the increasing number of ways
|
21
|
+
# rspec may be run, below are examples of the most common uses.
|
22
|
+
# * bundler: 'bundle exec rspec'
|
23
|
+
# * bundler binstubs: 'bin/rspec'
|
24
|
+
# * spring: 'bin/rspec' (This will use spring if running and you have
|
25
|
+
# installed the spring binstubs per the docs)
|
26
|
+
# * zeus: 'zeus rspec' (requires the server to be started separately)
|
27
|
+
# * 'just' rspec: 'rspec'
|
28
|
+
|
29
|
+
guard :rspec, cmd: "bundle exec rspec" do
|
30
|
+
require "guard/rspec/dsl"
|
31
|
+
dsl = Guard::RSpec::Dsl.new(self)
|
32
|
+
|
33
|
+
# Feel free to open issues for suggestions and improvements
|
34
|
+
|
35
|
+
# RSpec files
|
36
|
+
rspec = dsl.rspec
|
37
|
+
watch(rspec.spec_helper) { rspec.spec_dir }
|
38
|
+
watch(rspec.spec_support) { rspec.spec_dir }
|
39
|
+
watch(rspec.spec_files)
|
40
|
+
|
41
|
+
# Ruby files
|
42
|
+
ruby = dsl.ruby
|
43
|
+
dsl.watch_spec_files_for(ruby.lib_files)
|
44
|
+
|
45
|
+
# Rails files
|
46
|
+
rails = dsl.rails(view_extensions: %w(erb haml slim))
|
47
|
+
dsl.watch_spec_files_for(rails.app_files)
|
48
|
+
dsl.watch_spec_files_for(rails.views)
|
49
|
+
|
50
|
+
watch(rails.controllers) do |m|
|
51
|
+
[
|
52
|
+
rspec.spec.call("routing/#{m[1]}_routing"),
|
53
|
+
rspec.spec.call("controllers/#{m[1]}_controller"),
|
54
|
+
rspec.spec.call("acceptance/#{m[1]}")
|
55
|
+
]
|
56
|
+
end
|
57
|
+
|
58
|
+
# Rails config changes
|
59
|
+
watch(rails.spec_helper) { rspec.spec_dir }
|
60
|
+
watch(rails.routes) { "#{rspec.spec_dir}/routing" }
|
61
|
+
watch(rails.app_controller) { "#{rspec.spec_dir}/controllers" }
|
62
|
+
|
63
|
+
# Capybara features specs
|
64
|
+
watch(rails.view_dirs) { |m| rspec.spec.call("features/#{m[1]}") }
|
65
|
+
watch(rails.layouts) { |m| rspec.spec.call("features/#{m[1]}") }
|
66
|
+
|
67
|
+
# Turnip features and steps
|
68
|
+
watch(%r{^spec/acceptance/(.+)\.feature$})
|
69
|
+
watch(%r{^spec/acceptance/steps/(.+)_steps\.rb$}) do |m|
|
70
|
+
Dir[File.join("**/#{m[1]}.feature")][0] || "spec/acceptance"
|
71
|
+
end
|
72
|
+
|
73
|
+
# Specific files when defaults don't work (for some reason):
|
74
|
+
watch("lib/alma.rb") { "spec/alma_spec.rb" }
|
75
|
+
end
|
data/README.md
CHANGED
@@ -26,75 +26,81 @@ You'll need to configure the Alma gem to ensure you query the appropriate data.
|
|
26
26
|
|
27
27
|
```ruby
|
28
28
|
Alma.configure do |config|
|
29
|
-
# You have to set
|
29
|
+
# You have to set the apikey
|
30
30
|
config.apikey = 'EXAMPLE_EL_DEV_NETWORK_APPLICATION_KEY'
|
31
|
-
# Alma gem defaults to querying Ex Libris's North American
|
32
|
-
config.region = "https://api-eu.hosted.exlibrisgroup.com
|
31
|
+
# Alma gem defaults to querying Ex Libris's North American API servers. You can override that here.
|
32
|
+
config.region = "https://api-eu.hosted.exlibrisgroup.com"
|
33
|
+
|
34
|
+
# By default enable_loggable is set to false
|
35
|
+
config.enable_loggable = false
|
36
|
+
|
37
|
+
# By default timeout is set to 5 seconds; can only provide integers
|
38
|
+
config.timeout = 10
|
33
39
|
end
|
34
40
|
```
|
35
41
|
|
36
42
|
Now you can access those configuration attributes with `Alma.configuration.apikey`
|
37
43
|
|
38
44
|
### Making Requests
|
39
|
-
|
45
|
+
|
40
46
|
#### Get a Single user
|
41
47
|
```ruby
|
42
48
|
user = Alma::User.find(123456789)
|
43
|
-
|
49
|
+
|
44
50
|
user.first_name
|
45
51
|
> Chad
|
46
|
-
|
52
|
+
|
47
53
|
user.email
|
48
54
|
> chad.nelson@fictional.edu
|
49
|
-
|
55
|
+
|
50
56
|
user.keys
|
51
57
|
>{first_name: "Chad",
|
52
58
|
...}
|
53
59
|
```
|
54
|
-
|
60
|
+
|
55
61
|
#### Get details on a users fines
|
56
|
-
|
62
|
+
|
57
63
|
```ruby
|
58
64
|
fines = user.fines
|
59
65
|
fines.sum
|
60
66
|
> "20.0"
|
61
|
-
|
67
|
+
|
62
68
|
fines.total_record_count
|
63
69
|
> "2"
|
64
|
-
|
70
|
+
|
65
71
|
fines
|
66
72
|
> [#<Alma::AlmaRecord:0x000000038b7b50
|
67
73
|
...>,
|
68
74
|
#<Alma::AlmaRecord:0x000000038b7b28
|
69
75
|
...>]
|
70
|
-
|
76
|
+
|
71
77
|
fines.first.title
|
72
78
|
> "Practical Object Oriented Design with Ruby"
|
73
|
-
|
79
|
+
|
74
80
|
```
|
75
81
|
|
76
82
|
Each fine object reflects the available fields in the returned JSON,[as documented on the Ex Libris Api docs](https://developers.exlibrisgroup.com/alma/apis/xsd/rest_fees.xsd?tags=GET)
|
77
83
|
|
78
84
|
#### Get details on a users loans
|
79
|
-
|
85
|
+
|
80
86
|
```ruby
|
81
87
|
loans = user.loans
|
82
88
|
|
83
89
|
loans.total_record_count
|
84
90
|
> "2"
|
85
|
-
|
91
|
+
|
86
92
|
loans
|
87
93
|
> [#<Alma::Loan:0x000000038c6b79
|
88
94
|
...>,
|
89
95
|
#<Alma::Loan:0x000000038c6b34
|
90
96
|
...>]
|
91
|
-
|
97
|
+
|
92
98
|
loans.first.title
|
93
99
|
> "Javascript: The Good Parts"
|
94
|
-
|
100
|
+
|
95
101
|
loans.first.due_date
|
96
|
-
"2016-12-26z
|
97
|
-
|
102
|
+
"2016-12-26z"
|
103
|
+
|
98
104
|
```
|
99
105
|
Each loan object reflects the available fields in the returned XML,[as documented on the Ex Libris Api docs](https://developers.exlibrisgroup.com/alma/apis/xsd/rest_item_loans.xsd?tags=GET)
|
100
106
|
|
@@ -105,10 +111,10 @@ requests = user.requests
|
|
105
111
|
|
106
112
|
requests.total_record_count
|
107
113
|
> "1"
|
108
|
-
|
114
|
+
|
109
115
|
requests.list
|
110
116
|
> [#<Alma::AlmaRecord:0x000000038c6b79...>]
|
111
|
-
|
117
|
+
|
112
118
|
requests.list.first.title
|
113
119
|
> "Food in history / Reay Tannahill."
|
114
120
|
|
@@ -117,26 +123,131 @@ requests.list.first.pickup_location
|
|
117
123
|
|
118
124
|
requests.list.first.request_status
|
119
125
|
> "In Process"
|
120
|
-
|
126
|
+
|
121
127
|
```
|
122
128
|
Each request object reflects the available fields in the returned XML,[as documented on the Ex Libris Api docs](https://developers.exlibrisgroup.com/alma/apis/xsd/rest_user_requests.xsd?tags=GET)
|
123
129
|
|
124
130
|
Loans, fines and Requests can also be accessed statically
|
125
|
-
|
131
|
+
|
126
132
|
```ruby
|
127
133
|
Alma::User.get_fines({:user_id => 123456789})
|
128
|
-
|
134
|
+
|
129
135
|
Alma::User.get_loans({:user_id => 123456789})
|
130
136
|
|
131
137
|
Alma::User.get_requests({:user_id => 123456789})
|
132
|
-
|
138
|
+
|
139
|
+
```
|
140
|
+
|
141
|
+
### Bib Records
|
142
|
+
Wrappings for some of the API endpoints described by the [Bibliographic Records and Inventory
|
143
|
+
](https://developers.exlibrisgroup.com/alma/apis/bibs) section of the Ex Libris Developers Network
|
144
|
+
|
145
|
+
### All the items for a Bib Records
|
146
|
+
Corresponds to the [Retrieve Items list](https://developers.exlibrisgroup.com/alma/apis/bibs/GET/gwPcGly021om4RTvtjbPleCklCGxeYAfEqJOcQOaLEvNcHQT0/ozqu3DGTurs/XxIP4LrexQUdc=/af2fb69d-64f4-42bc-bb05-d8a0ae56936e) api endpoint
|
147
|
+
|
148
|
+
To get the list of items for all holdings of a bib record.
|
149
|
+
`items = Alma::BibItem.find("EXAMPLE_MMS_ID")`
|
150
|
+
|
151
|
+
You can also pass a holding ID as an option, if you only want that holdings items.
|
152
|
+
`items = Alma::BibItem.find("EXAMPLE_MMS_ID", holding_id: EXAMPLE_HOLDING_ID)`
|
153
|
+
|
154
|
+
|
155
|
+
The response is a BibItemSet which can be iterated over to access items:
|
156
|
+
|
157
|
+
```ruby
|
158
|
+
items.each { ... }
|
159
|
+
|
160
|
+
items.total_record_count
|
161
|
+
> 4
|
133
162
|
```
|
163
|
+
|
164
|
+
You can remove items that are missing or lost from the result set
|
165
|
+
` avail_items = items.filter_missing_and_lost
|
166
|
+
`
|
167
|
+
|
168
|
+
Items can be grouped by the library they are held at, which returns a hash with library codes as the keys and an array of items as the values.
|
169
|
+
|
170
|
+
```ruby
|
171
|
+
items.grouped_by_library
|
172
|
+
{ "MAIN" =>
|
173
|
+
[#<Alma::BibItem:0x000000038c6b79...>],
|
174
|
+
"NOT_MAIN" =>
|
175
|
+
[#<Alma::BibItem:0x000000038c6b88...>, #<Alma::BibItem:0x000000038c6b94...>,],
|
176
|
+
}
|
177
|
+
```
|
178
|
+
|
179
|
+
The data for each item can be accessed via hash representation of the [item structure](https://developers.exlibrisgroup.com/alma/apis/xsd/rest_item.xsd), e.g.:
|
180
|
+
|
181
|
+
```ruby
|
182
|
+
item = items.first
|
183
|
+
|
184
|
+
item["holding_data"]["call_number"]
|
185
|
+
"T385 .F79 2008"
|
186
|
+
|
187
|
+
item["item_data"]["location"]["value"]
|
188
|
+
"STACKS"
|
189
|
+
|
190
|
+
```
|
191
|
+
|
192
|
+
There are also numerous convenience methods
|
193
|
+
|
194
|
+
```ruby
|
195
|
+
# Boolean checks
|
196
|
+
item.in_temp_location?
|
197
|
+
item.in_place? # Basically, On Shelf or Not
|
198
|
+
item.non_circulating?
|
199
|
+
item.missing_or_lost?
|
200
|
+
item.has_temp_call_number?
|
201
|
+
item.has_alt_call_number?
|
202
|
+
item.has_process_type?
|
203
|
+
|
204
|
+
|
205
|
+
# Opinionated Accessors - return the value, or an empty string
|
206
|
+
|
207
|
+
# Returns temp library/location if appropriate, else normal library/location
|
208
|
+
item.library
|
209
|
+
item.library_name
|
210
|
+
item.location
|
211
|
+
item.location_name
|
212
|
+
|
213
|
+
# which use these methods under the hood
|
214
|
+
item.holding_library
|
215
|
+
item.holding_location
|
216
|
+
|
217
|
+
item.temp_library
|
218
|
+
item.temp_location
|
219
|
+
|
220
|
+
|
221
|
+
# Looks for Temp call number, then alternate call number, then normal call number
|
222
|
+
item.call_number
|
223
|
+
|
224
|
+
# and which use
|
225
|
+
item.temp_call_number
|
226
|
+
item.alt_call_number
|
227
|
+
|
228
|
+
|
229
|
+
# standard accessors
|
230
|
+
item.process_type
|
231
|
+
item.base_status
|
232
|
+
item.circulation_policy
|
233
|
+
item.description
|
234
|
+
item.public_note
|
235
|
+
|
236
|
+
```
|
237
|
+
|
238
|
+
### Logging
|
239
|
+
This gem exposes a loggable interface to responses. Thus a response will respond to `loggable` and return a hash with state values that may be of use to log.
|
240
|
+
|
241
|
+
As a bonus, when we enable this feature using the `enable_loggable` configuration, error messages will contain the loggable values and be formatted as JSON.
|
242
|
+
|
134
243
|
## Development
|
135
244
|
|
136
245
|
After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake spec` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
|
137
246
|
|
138
247
|
To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org).
|
139
248
|
|
249
|
+
Use `bundle exec guard` to continuously run specs while developing.
|
250
|
+
|
140
251
|
## Contributing
|
141
252
|
|
142
253
|
Bug reports and pull requests are welcome on GitHub at https://github.com/tulibraries/alma_rb. This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the [Contributor Covenant](http://contributor-covenant.org) code of conduct.
|
@@ -145,4 +256,3 @@ Bug reports and pull requests are welcome on GitHub at https://github.com/tulibr
|
|
145
256
|
## License
|
146
257
|
|
147
258
|
The gem is available as open source under the terms of the [MIT License](http://opensource.org/licenses/MIT).
|
148
|
-
|
data/Rakefile
CHANGED
data/alma.gemspec
CHANGED
@@ -1,16 +1,18 @@
|
|
1
1
|
# coding: utf-8
|
2
|
-
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
4
|
+
lib = File.expand_path("../lib", __FILE__)
|
3
5
|
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
-
require
|
6
|
+
require "alma/version"
|
5
7
|
|
6
8
|
Gem::Specification.new do |spec|
|
7
9
|
spec.name = "alma"
|
8
10
|
spec.version = Alma::VERSION
|
9
|
-
spec.authors = ["Chad Nelson"]
|
10
|
-
spec.email = ["chad.nelson@temple.edu"]
|
11
|
+
spec.authors = ["Jennifer Anton", "David Kinzer", "Chad Nelson"]
|
12
|
+
spec.email = ["jennifer.anton@temple.edu", "david.kinzer@temple.edu", "chad.nelson@temple.edu"]
|
11
13
|
|
12
|
-
spec.summary =
|
13
|
-
spec.description =
|
14
|
+
spec.summary = "Client for Ex Libris Alma Web Services"
|
15
|
+
spec.description = "Client for Ex Libris Alma Web Services"
|
14
16
|
spec.homepage = "https://github.com/tulibraries/alma_rb"
|
15
17
|
spec.license = "MIT"
|
16
18
|
|
@@ -21,16 +23,19 @@ Gem::Specification.new do |spec|
|
|
21
23
|
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
22
24
|
spec.require_paths = ["lib"]
|
23
25
|
|
24
|
-
spec.add_dependency
|
25
|
-
spec.add_dependency
|
26
|
-
spec.add_dependency
|
27
|
-
|
28
|
-
|
29
|
-
|
26
|
+
spec.add_dependency "ezwadl"
|
27
|
+
spec.add_dependency "httparty"
|
28
|
+
spec.add_dependency "xml-simple"
|
29
|
+
spec.add_dependency "activesupport"
|
30
30
|
|
31
|
-
spec.add_development_dependency "bundler", "~>
|
32
|
-
spec.add_development_dependency "rake", "~>
|
31
|
+
spec.add_development_dependency "bundler", "~> 2.0"
|
32
|
+
spec.add_development_dependency "rake", "~> 13.0"
|
33
33
|
spec.add_development_dependency "rspec", "~> 3.0"
|
34
|
-
spec.add_development_dependency
|
35
|
-
spec.add_development_dependency
|
34
|
+
spec.add_development_dependency "webmock"
|
35
|
+
spec.add_development_dependency "pry"
|
36
|
+
spec.add_development_dependency "rubocop"
|
37
|
+
spec.add_development_dependency "rubocop-rails"
|
38
|
+
spec.add_development_dependency "byebug"
|
39
|
+
spec.add_development_dependency "guard"
|
40
|
+
spec.add_development_dependency "guard-rspec"
|
36
41
|
end
|
data/lib/alma/alma_record.rb
CHANGED
@@ -1,6 +1,7 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Alma
|
2
4
|
class AlmaRecord
|
3
|
-
|
4
5
|
def initialize(record)
|
5
6
|
@raw_record = record
|
6
7
|
post_initialize()
|
@@ -23,6 +24,5 @@ module Alma
|
|
23
24
|
# Subclasses can define this method to perform extra initialization
|
24
25
|
# after the super class init.
|
25
26
|
end
|
26
|
-
|
27
27
|
end
|
28
|
-
end
|
28
|
+
end
|