alma 0.2.4 → 0.3.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (52) hide show
  1. checksums.yaml +5 -5
  2. data/.circleci/config.yml +54 -0
  3. data/.circleci/setup-rubygems.sh +3 -0
  4. data/.github/dependabot.yml +7 -0
  5. data/.gitignore +3 -0
  6. data/.rubocop.yml +134 -0
  7. data/.ruby-version +1 -1
  8. data/Gemfile +5 -1
  9. data/Guardfile +75 -0
  10. data/README.md +146 -57
  11. data/Rakefile +3 -1
  12. data/alma.gemspec +21 -12
  13. data/lib/alma.rb +34 -54
  14. data/lib/alma/alma_record.rb +3 -3
  15. data/lib/alma/api_defaults.rb +39 -0
  16. data/lib/alma/availability_response.rb +69 -31
  17. data/lib/alma/bib.rb +54 -29
  18. data/lib/alma/bib_holding.rb +25 -0
  19. data/lib/alma/bib_item.rb +164 -0
  20. data/lib/alma/bib_item_set.rb +93 -0
  21. data/lib/alma/bib_set.rb +5 -10
  22. data/lib/alma/config.rb +10 -4
  23. data/lib/alma/course.rb +47 -0
  24. data/lib/alma/course_set.rb +17 -0
  25. data/lib/alma/electronic.rb +167 -0
  26. data/lib/alma/electronic/README.md +20 -0
  27. data/lib/alma/electronic/batch_utils.rb +224 -0
  28. data/lib/alma/electronic/business.rb +29 -0
  29. data/lib/alma/error.rb +16 -4
  30. data/lib/alma/fine.rb +16 -0
  31. data/lib/alma/fine_set.rb +41 -8
  32. data/lib/alma/item_request_options.rb +23 -0
  33. data/lib/alma/library.rb +29 -0
  34. data/lib/alma/library_set.rb +21 -0
  35. data/lib/alma/loan.rb +31 -2
  36. data/lib/alma/loan_set.rb +62 -4
  37. data/lib/alma/location.rb +29 -0
  38. data/lib/alma/location_set.rb +21 -0
  39. data/lib/alma/renewal_response.rb +25 -14
  40. data/lib/alma/request.rb +167 -0
  41. data/lib/alma/request_options.rb +66 -0
  42. data/lib/alma/request_set.rb +69 -5
  43. data/lib/alma/response.rb +45 -0
  44. data/lib/alma/result_set.rb +27 -35
  45. data/lib/alma/user.rb +142 -86
  46. data/lib/alma/user_request.rb +19 -0
  47. data/lib/alma/user_set.rb +5 -6
  48. data/lib/alma/version.rb +3 -1
  49. data/log/.gitignore +4 -0
  50. metadata +149 -10
  51. data/.travis.yml +0 -5
  52. data/lib/alma/api.rb +0 -33
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: a61f0bfe79181cdb4d99e0eca51ba16b1be6550f
4
- data.tar.gz: 8f024c368175b3a8ac0fe2e6eb836f436516a566
2
+ SHA256:
3
+ metadata.gz: f162f9bb1a3b0eee2af44a379b1d094141b6cc9c06767d17acb39d909eb27ed1
4
+ data.tar.gz: 98eb300d6c0ab62ae07790fa64449c65839f89bd3903b3c0e010e911bf4d3ce0
5
5
  SHA512:
6
- metadata.gz: 58b8bcfbe9b5c4f6ccd688df845bfb86e3fe8115199b06862c03b6faeaf31e08e4f9a33cca5209c082fa69f8416461dc9c45bef34a9c57179a48d4f29f7b2397
7
- data.tar.gz: 60e8ea0221d2dce2001e53afd41d0f046cb822e56c74f2e07ecffcacc7fa9e94ce9c4730572f79cd0463d12c09506e64a4af9b52ed871cefa2be625a650e6cbb
6
+ metadata.gz: bff5a50e3f546962f71c3ce2fbfe2ed553b63fc4698df62b1ce2828e53c86c62c018716a476005759ed8b94102d371911e9b3ef69f6b03752b96fe85bcbf7f97
7
+ data.tar.gz: 8159b943d247e6bd34f3efcd09325191806ca26471252d39d3f54be4182a5b45bc875b2eb7c5bc432b492b70e932cbac8c12054ba0b64883ac14e974933c215f
@@ -0,0 +1,54 @@
1
+ version: 2.1
2
+ orbs:
3
+ ruby: circleci/ruby@0.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-node
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
+ - ruby/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: circleci/ruby:2.7.2-node-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)"
@@ -0,0 +1,3 @@
1
+ mkdir ~/.gem
2
+ echo -e "---\r\n:rubygems_api_key: $ALMA_RUBYGEMS" > ~/.gem/credentials
3
+ chmod 0600 /home/circleci/.gem/credentials
@@ -0,0 +1,7 @@
1
+ version: 2
2
+ updates:
3
+ - package-ecosystem: bundler
4
+ directory: "/"
5
+ schedule:
6
+ interval: daily
7
+ open-pull-requests-limit: 10
data/.gitignore CHANGED
@@ -7,3 +7,6 @@
7
7
  /pkg/
8
8
  /spec/reports/
9
9
  /tmp/
10
+ .byebug_history
11
+ .DS_Store
12
+ spec/.DS_Store
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.3.3
1
+ ruby-2.7.2
data/Gemfile CHANGED
@@ -1,4 +1,8 @@
1
- source 'https://rubygems.org'
1
+ # frozen_string_literal: true
2
+
3
+ source "https://rubygems.org"
2
4
 
3
5
  # Specify your gem's dependencies in alma.gemspec
4
6
  gemspec
7
+
8
+ gem "simplecov", require: false, group: :test
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,10 +26,16 @@ 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 te apikey
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 Api servers. You can override that here.
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
 
@@ -37,99 +43,78 @@ Now you can access those configuration attributes with `Alma.configuration.apike
37
43
 
38
44
  ### Making Requests
39
45
 
40
- #### Get a list of Users
41
- ```ruby
42
- users = Alma::User.find
43
-
44
- users.total count
45
- > 402
46
-
47
- users.list.first.id
48
- > 123456789
49
- ```
50
-
51
46
  #### Get a Single user
52
47
  ```ruby
53
- user = Alma::User.find({:user_id => 123456789})
54
-
48
+ user = Alma::User.find(123456789)
49
+
55
50
  user.first_name
56
51
  > Chad
57
-
52
+
58
53
  user.email
59
54
  > chad.nelson@fictional.edu
55
+
56
+ user.keys
57
+ >{first_name: "Chad",
58
+ ...}
60
59
  ```
61
-
60
+
62
61
  #### Get details on a users fines
63
-
62
+
64
63
  ```ruby
65
64
  fines = user.fines
66
65
  fines.sum
67
66
  > "20.0"
68
-
67
+
69
68
  fines.total_record_count
70
69
  > "2"
71
-
72
- fines.list
70
+
71
+ fines
73
72
  > [#<Alma::AlmaRecord:0x000000038b7b50
74
73
  ...>,
75
74
  #<Alma::AlmaRecord:0x000000038b7b28
76
75
  ...>]
77
-
78
- fines.list.first.title
76
+
77
+ fines.first.title
79
78
  > "Practical Object Oriented Design with Ruby"
80
-
79
+
81
80
  ```
82
81
 
83
- Each fine 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_fees.xsd?tags=GET)
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)
84
83
 
85
84
  #### Get details on a users loans
86
-
85
+
87
86
  ```ruby
88
87
  loans = user.loans
89
88
 
90
89
  loans.total_record_count
91
90
  > "2"
92
-
93
- loans.list
91
+
92
+ loans
94
93
  > [#<Alma::Loan:0x000000038c6b79
95
94
  ...>,
96
95
  #<Alma::Loan:0x000000038c6b34
97
96
  ...>]
98
-
99
- loans.list.first.title
100
- > "Javascript: The Good Parts"
101
-
102
- loans.list.first.due_date
103
- "2016-12-26z
104
-
105
- ```
106
- 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)
107
97
 
108
- To renew an item you can can call the Loan objects renew method
109
-
110
- ```ruby
111
- renewal = loans.list.first.renew
112
-
113
- renewal.renewed?
114
- > True
98
+ loans.first.title
99
+ > "Javascript: The Good Parts"
115
100
 
116
- renewal.message
117
- > "Javascript: The Good Parts is now due 02-20-17"
101
+ loans.first.due_date
102
+ "2016-12-26z"
118
103
 
119
104
  ```
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)
120
106
 
121
107
 
122
-
123
- #### Get details on a users requests
108
+ #### Get details on a users requests - WIP
124
109
  ```ruby
125
110
  requests = user.requests
126
111
 
127
112
  requests.total_record_count
128
113
  > "1"
129
-
114
+
130
115
  requests.list
131
116
  > [#<Alma::AlmaRecord:0x000000038c6b79...>]
132
-
117
+
133
118
  requests.list.first.title
134
119
  > "Food in history / Reay Tannahill."
135
120
 
@@ -138,32 +123,136 @@ requests.list.first.pickup_location
138
123
 
139
124
  requests.list.first.request_status
140
125
  > "In Process"
141
-
126
+
142
127
  ```
143
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)
144
129
 
145
130
  Loans, fines and Requests can also be accessed statically
146
-
131
+
147
132
  ```ruby
148
133
  Alma::User.get_fines({:user_id => 123456789})
149
-
134
+
150
135
  Alma::User.get_loans({:user_id => 123456789})
151
136
 
152
137
  Alma::User.get_requests({:user_id => 123456789})
153
-
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
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
+
154
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
+
155
243
  ## Development
156
244
 
157
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.
158
246
 
159
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).
160
248
 
249
+ Use `bundle exec guard` to continuously run specs while developing.
250
+
161
251
  ## Contributing
162
252
 
163
- Bug reports and pull requests are welcome on GitHub at https://github.com/[USERNAME]/alma. 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.
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.
164
254
 
165
255
 
166
256
  ## License
167
257
 
168
258
  The gem is available as open source under the terms of the [MIT License](http://opensource.org/licenses/MIT).
169
-