evergreen_holdings 0.4.0 → 0.5.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: e5800a7a145695ef115c882d45a1ba4264ea8f97888d7d305b7fdbbda4085b84
4
- data.tar.gz: 0eaf07e5c8bb021fd79fcee3ec8584beff6b1842d097de72b7285614e2866368
3
+ metadata.gz: b34258835d3686af2107f5ea96b6a3a95f2eca5dc4e19630fe1cc8fecce583d1
4
+ data.tar.gz: f285caa0b0a3cc693ad27a9b169c540dd3bc30f1cde438967d1b44971a6d97f2
5
5
  SHA512:
6
- metadata.gz: 14af7152bf4201748e500b1821152cc0331413e6b4e7df8ede03983b180bfbe3e32f9d368714b8bf7d5f9a015003500b32fcfce5a98e757b98c40ced3813166e
7
- data.tar.gz: e4e82b9fe288ae589cad6089d34464421a5f0ffb698abbaa1ae2d41e55a9f1b6cbd2477ba545e0fc7bbc897828f3bce8fc3262a9e79872c16d3c6e20fa23c881
6
+ metadata.gz: 79564fcba394887f6efaeb9046a269a47796d14efc6def71771c22bce4852c6eec148c3e9ef92b4fa408461cde87fa407d2e1fd27e9d9ad4a1c46ea3c575dd90
7
+ data.tar.gz: defa58f9e2349386a241c9d70bef66764d74d37bc993fd3a09202a6803300e4bf6e9b8501781862e7f8424266a243668e3086d2632054b92f3accab4cd0db7cc
@@ -1,233 +1,232 @@
1
- # frozen_string_literal: true
2
-
3
- require 'net/http'
4
- require 'json'
5
- require 'evergreen_holdings/errors'
6
- require 'nokogiri'
7
- require 'open-uri'
8
-
9
- OSRF_PATH = '/osrf-gateway-v1'
10
-
11
- module EvergreenHoldings
12
- class Connection
13
- attr_reader :org_units
14
- # Create a new object with the evergreen_domain
15
- # specified, e.g. http://libcat.linnbenton.edu
16
- #
17
- # Usage: `conn = EvergreenHoldings::Connection.new 'http://gapines.org'`
18
- def initialize(evergreen_domain)
19
- @evergreen_domain = evergreen_domain
20
- @gateway = URI evergreen_domain + OSRF_PATH
21
- @acpl_cache = {}
22
- fetch_idl_order
23
- raise CouldNotConnectToEvergreenError unless fetch_statuses
24
-
25
- fetch_ou_tree
26
- end
27
-
28
- # Fetch holdings data from the Evergreen server
29
- # Returns a Status object
30
- #
31
- # Usage: `stat = conn.get_holdings 23405`
32
- # If you just want holdings at a specific org_unit: `my_connection.get_holdings 23405, org_unit: 5`
33
- def get_holdings(tcn, options = {})
34
- if options.key?(:org_unit)
35
- if options[:descendants]
36
- params = "format=json&input_format=json&service=open-ils.cat&method=open-ils.cat.asset.copy_tree.retrieve&param=auth_token_not_needed_for_this_call&param=#{tcn}"
37
- @org_units[options[:org_unit]][:descendants]&.each do |ou|
38
- params << + "&param=#{ou}"
39
- end
40
- else
41
- params = "format=json&input_format=json&service=open-ils.cat&method=open-ils.cat.asset.copy_tree.retrieve&param=auth_token_not_needed_for_this_call&param=#{tcn}&param=#{options[:org_unit]}"
42
- end
43
- else
44
- params = "format=json&input_format=json&service=open-ils.cat&method=open-ils.cat.asset.copy_tree.global.retrieve&param=auth_token_not_needed_for_this_call&param=#{tcn}"
45
- end
46
- @gateway.query = params
47
-
48
- res = send_query
49
- return Status.new res.body, @idl_order, self if res
50
- end
51
-
52
- # Given an ID, returns a human-readable name
53
- def location_name(id)
54
- @acpl_cache.fetch(id) { |id| fetch_new_acpl(id) || id }
55
- end
56
-
57
- def status_name(id)
58
- @possible_item_statuses[id]
59
- end
60
-
61
- def ou_name(id)
62
- @org_units[id][:name]
63
- end
64
-
65
- private
66
-
67
- def add_ou_descendants(id, parent)
68
- (@org_units[parent][:descendants] ||= []) << id
69
- add_ou_descendants id, @org_units[parent][:parent] if @org_units[parent][:parent]
70
- end
71
-
72
- def take_info_from_ou_tree(o)
73
- id = o[@idl_order[:aou]['id']]
74
- @org_units[id] = {}
75
- @org_units[id][:name] = o[@idl_order[:aou]['name']]
76
- if o[@idl_order[:aou]['parent_ou']]
77
- @org_units[id][:parent] = o[@idl_order[:aou]['parent_ou']]
78
- add_ou_descendants id, o[@idl_order[:aou]['parent_ou']]
79
- end
80
- o[@idl_order[:aou]['children']].each do |p|
81
- take_info_from_ou_tree p['__p']
82
- end
83
- end
84
-
85
- # Given the ID of a shelving location, this method
86
- # finds the name of the location, caches it, and
87
- # returns it
88
- def fetch_new_acpl(id)
89
- params = "format=json&input_format=json&service=open-ils.circ&method=open-ils.circ.copy_location.retrieve&param=#{id}"
90
- @gateway.query = params
91
- res = send_query
92
- if res
93
- data = JSON.parse(res.body)['payload'][0]
94
- name = data['__p'][@idl_order[:acpl]['name']] unless data.key? 'stacktrace'
95
- @acpl_cache[id] = name
96
- return name if name
97
- end
98
- false
99
- end
100
-
101
- def send_query
102
- begin
103
- res = Net::HTTP.get_response(@gateway)
104
- rescue Errno::ECONNREFUSED, Net::ReadTimeout
105
- return nil
106
- end
107
- return res if res.is_a?(Net::HTTPSuccess)
108
-
109
- nil
110
- end
111
-
112
- def fetch_idl_order
113
- @idl_order = {}
114
-
115
- idl = Nokogiri::XML(open(@evergreen_domain + '/reports/fm_IDL.xml'))
116
-
117
- %i[acn acp acpl aou ccs circ].each do |idl_class|
118
- i = 0
119
- @idl_order[idl_class] = {}
120
- fields = idl.xpath("//idl:class[@id='#{idl_class}']/idl:fields/idl:field", 'idl' => 'http://opensrf.org/spec/IDL/base/v1')
121
- fields.each do |field|
122
- @idl_order[idl_class][field['name']] = i
123
- i += 1
124
- end
125
- end
126
- end
127
-
128
- def fetch_statuses
129
- @possible_item_statuses = []
130
- params = 'format=json&input_format=json&service=open-ils.search&method=open-ils.search.config.copy_status.retrieve.all'
131
- @gateway.query = params
132
- res = send_query
133
- if res
134
- stats = JSON.parse(res.body)['payload'][0]
135
- stats.each do |stat|
136
- @possible_item_statuses[stat['__p'][@idl_order[:ccs]['id']]] = stat['__p'][@idl_order[:ccs]['name']]
137
- end
138
- return true unless stats.empty?
139
- end
140
- false
141
- end
142
-
143
- def fetch_ou_tree
144
- @org_units = {}
145
- params = 'format=json&input_format=json&service=open-ils.actor&method=open-ils.actor.org_tree.retrieve'
146
- @gateway.query = params
147
- res = send_query
148
- if res
149
- raw_orgs = JSON.parse(res.body)['payload'][0]['__p']
150
- take_info_from_ou_tree raw_orgs
151
- return true unless @org_units.empty?
152
- end
153
- false
154
- end
155
- end
156
-
157
- # Status objects represent all the holdings attached to a specific tcn
158
- class Status
159
- attr_reader :copies, :libraries
160
- def initialize(json_data, idl_order, connection = nil)
161
- @idl_order = idl_order
162
- @connection = connection
163
- @raw_data = JSON.parse(json_data)['payload'][0]
164
- extract_copies
165
- substitute_values_for_ids unless @connection.nil?
166
- @available_copies = []
167
- @next_copy_available = 'a date'
168
- end
169
-
170
- # Determines if any copies are available for your patrons
171
- def any_copies_available?
172
- @copies.each do |copy|
173
- return true if copy.status.zero?
174
- return true if copy.status == 'Available'
175
- end
176
- false
177
- end
178
-
179
- private
180
-
181
- # Look through @raw_data and find the copies
182
- def extract_copies
183
- @copies = []
184
- @raw_data.each do |vol|
185
- next if vol['__p'][0].empty?
186
-
187
- vol['__p'][0].each do |item|
188
- item_info = {
189
- barcode: item['__p'][@idl_order[:acp]['barcode']],
190
- call_number: vol['__p'][@idl_order[:acn]['label']],
191
- location: item['__p'][@idl_order[:acp]['location']],
192
- status: item['__p'][@idl_order[:acp]['status']],
193
- owning_lib: item['__p'][@idl_order[:acp]['circ_lib']]
194
- }
195
- if item['__p'][@idl_order[:acp]['circulations']].is_a? Array
196
- begin
197
- item_info[:due_date] = item['__p'][@idl_order[:acp]['circulations']][0]['__p'][@idl_order[:circ]['due_date']]
198
- rescue StandardError
199
- end
200
- @copies.push Item.new item_info
201
- else
202
- @copies.push Item.new item_info
203
- end
204
- end
205
- end
206
- end
207
-
208
- def substitute_values_for_ids
209
- @libraries = @connection.org_units.clone
210
- @libraries.each { |_key, lib| lib[:copies] = [] }
211
- @copies.each do |copy|
212
- copy.location = @connection.location_name copy.location if copy.location.is_a? Numeric
213
- copy.status = @connection.status_name copy.status if copy.status.is_a? Numeric
214
- next unless copy.owning_lib.is_a? Numeric
215
-
216
- ou_id = copy.owning_lib
217
- copy.owning_lib = @connection.ou_name copy.owning_lib
218
- @libraries[ou_id][:copies].push copy
219
- end
220
- end
221
- end
222
-
223
- # A physical copy of an item
224
- class Item
225
- attr_accessor :location, :status, :owning_lib
226
- attr_reader :barcode, :call_number, :due_date
227
- def initialize(data = {})
228
- data.each do |k, v|
229
- instance_variable_set("@#{k}", v) unless v.nil?
230
- end
231
- end
232
- end
233
- end
1
+ # frozen_string_literal: true
2
+
3
+ require 'net/http'
4
+ require 'json'
5
+ require 'evergreen_holdings/errors'
6
+ require 'evergreen_holdings/idl_parser'
7
+ require 'nokogiri'
8
+ require 'open-uri'
9
+
10
+ OSRF_PATH = '/osrf-gateway-v1'
11
+
12
+ module EvergreenHoldings
13
+ class Connection
14
+ attr_reader :org_units
15
+
16
+ # Create a new object with the evergreen_domain
17
+ # specified, e.g. http://libcat.linnbenton.edu
18
+ #
19
+ # Usage: `conn = EvergreenHoldings::Connection.new 'http://gapines.org'`
20
+ def initialize(evergreen_domain)
21
+ @evergreen_domain = evergreen_domain
22
+ @gateway = URI evergreen_domain + OSRF_PATH
23
+ @acpl_cache = {}
24
+ fetch_idl_order
25
+ raise CouldNotConnectToEvergreenError unless fetch_statuses
26
+
27
+ fetch_ou_tree
28
+ end
29
+
30
+ # Fetch holdings data from the Evergreen server
31
+ # Returns a Status object
32
+ #
33
+ # Usage: `stat = conn.get_holdings 23405`
34
+ # If you just want holdings at a specific org_unit: `my_connection.get_holdings 23405, org_unit: 5`
35
+ def get_holdings(tcn, options = {})
36
+ if options.key?(:org_unit)
37
+ if options[:descendants]
38
+ params = "format=json&input_format=json&service=open-ils.cat&method=open-ils.cat.asset.copy_tree.retrieve&param=auth_token_not_needed_for_this_call&param=#{tcn}"
39
+ @org_units[options[:org_unit]][:descendants]&.each do |ou|
40
+ params << + "&param=#{ou}"
41
+ end
42
+ else
43
+ params = "format=json&input_format=json&service=open-ils.cat&method=open-ils.cat.asset.copy_tree.retrieve&param=auth_token_not_needed_for_this_call&param=#{tcn}&param=#{options[:org_unit]}"
44
+ end
45
+ else
46
+ params = "format=json&input_format=json&service=open-ils.cat&method=open-ils.cat.asset.copy_tree.global.retrieve&param=auth_token_not_needed_for_this_call&param=#{tcn}"
47
+ end
48
+ @gateway.query = params
49
+
50
+ res = send_query
51
+ return Status.new res.body, @idl_order, self if res
52
+ end
53
+
54
+ # Given an ID, returns a human-readable name
55
+ def location_name(id)
56
+ @acpl_cache.fetch(id) { |id| fetch_new_acpl(id) || id }
57
+ end
58
+
59
+ def status_name(id)
60
+ @possible_item_statuses[id]
61
+ end
62
+
63
+ def ou_name(id)
64
+ @org_units[id][:name]
65
+ end
66
+
67
+ private
68
+
69
+ def add_ou_descendants(id, parent)
70
+ (@org_units[parent][:descendants] ||= []) << id
71
+ add_ou_descendants id, @org_units[parent][:parent] if @org_units[parent][:parent]
72
+ end
73
+
74
+ def take_info_from_ou_tree(o)
75
+ id = o[@idl_order[:aou]['id']]
76
+ @org_units[id] = {}
77
+ @org_units[id][:name] = o[@idl_order[:aou]['name']]
78
+ if o[@idl_order[:aou]['parent_ou']]
79
+ @org_units[id][:parent] = o[@idl_order[:aou]['parent_ou']]
80
+ add_ou_descendants id, o[@idl_order[:aou]['parent_ou']]
81
+ end
82
+ o[@idl_order[:aou]['children']].each do |p|
83
+ take_info_from_ou_tree p['__p']
84
+ end
85
+ end
86
+
87
+ # Given the ID of a shelving location, this method
88
+ # finds the name of the location, caches it, and
89
+ # returns it
90
+ def fetch_new_acpl(id)
91
+ params = "format=json&input_format=json&service=open-ils.circ&method=open-ils.circ.copy_location.retrieve&param=#{id}"
92
+ @gateway.query = params
93
+ res = send_query
94
+ if res
95
+ data = JSON.parse(res.body)['payload'][0]
96
+ name = data['__p'][@idl_order[:acpl]['name']] unless data.key? 'stacktrace'
97
+ @acpl_cache[id] = name
98
+ return name if name
99
+ end
100
+ false
101
+ end
102
+
103
+ def send_query
104
+ begin
105
+ res = Net::HTTP.get_response(@gateway)
106
+ rescue Errno::ECONNREFUSED, Net::ReadTimeout
107
+ return nil
108
+ end
109
+ return res if res.is_a?(Net::HTTPSuccess)
110
+
111
+ nil
112
+ end
113
+
114
+ def fetch_idl_order
115
+ begin
116
+ idl = Nokogiri::XML(URI.parse("#{@evergreen_domain}/reports/fm_IDL.xml").open)
117
+ rescue Errno::ECONNREFUSED, Net::ReadTimeout, OpenURI::HTTPError
118
+ raise CouldNotConnectToEvergreenError
119
+ end
120
+
121
+ @idl_order = IDLParser.new(idl).field_order_by_class %i[acn acp acpl aou ccs circ]
122
+ end
123
+
124
+ def fetch_statuses
125
+ @possible_item_statuses = []
126
+ params = 'format=json&input_format=json&service=open-ils.search&method=open-ils.search.config.copy_status.retrieve.all'
127
+ @gateway.query = params
128
+ res = send_query
129
+ if res
130
+ stats = JSON.parse(res.body)['payload'][0]
131
+ stats.each do |stat|
132
+ @possible_item_statuses[stat['__p'][@idl_order[:ccs]['id']]] = stat['__p'][@idl_order[:ccs]['name']]
133
+ end
134
+ return true unless stats.empty?
135
+ end
136
+ false
137
+ end
138
+
139
+ def fetch_ou_tree
140
+ @org_units = {}
141
+ params = 'format=json&input_format=json&service=open-ils.actor&method=open-ils.actor.org_tree.retrieve'
142
+ @gateway.query = params
143
+ res = send_query
144
+ if res
145
+ raw_orgs = JSON.parse(res.body)['payload'][0]['__p']
146
+ take_info_from_ou_tree raw_orgs
147
+ return true unless @org_units.empty?
148
+ end
149
+ false
150
+ end
151
+ end
152
+
153
+ # Status objects represent all the holdings attached to a specific tcn
154
+ class Status
155
+ attr_reader :copies, :libraries
156
+
157
+ def initialize(json_data, idl_order, connection = nil)
158
+ @idl_order = idl_order
159
+ @connection = connection
160
+ @raw_data = JSON.parse(json_data)['payload'][0]
161
+ extract_copies
162
+ substitute_values_for_ids unless @connection.nil?
163
+ @available_copies = []
164
+ @next_copy_available = 'a date'
165
+ end
166
+
167
+ # Determines if any copies are available for your patrons
168
+ def any_copies_available?
169
+ @copies.each do |copy|
170
+ return true if copy.status.zero?
171
+ return true if copy.status == 'Available'
172
+ end
173
+ false
174
+ end
175
+
176
+ private
177
+
178
+ # Look through @raw_data and find the copies
179
+ def extract_copies
180
+ @copies = []
181
+ @raw_data.each do |vol|
182
+ next if vol['__p'][0].empty?
183
+
184
+ vol['__p'][0].each do |item|
185
+ item_info = {
186
+ barcode: item['__p'][@idl_order[:acp]['barcode']],
187
+ call_number: vol['__p'][@idl_order[:acn]['label']],
188
+ location: item['__p'][@idl_order[:acp]['location']],
189
+ status: item['__p'][@idl_order[:acp]['status']],
190
+ owning_lib: item['__p'][@idl_order[:acp]['circ_lib']]
191
+ }
192
+ if item['__p'][@idl_order[:acp]['circulations']].is_a? Array
193
+ begin
194
+ item_info[:due_date] =
195
+ item['__p'][@idl_order[:acp]['circulations']][0]['__p'][@idl_order[:circ]['due_date']]
196
+ rescue StandardError
197
+ end
198
+ @copies.push Item.new item_info
199
+ else
200
+ @copies.push Item.new item_info
201
+ end
202
+ end
203
+ end
204
+ end
205
+
206
+ def substitute_values_for_ids
207
+ @libraries = @connection.org_units.clone
208
+ @libraries.each { |_key, lib| lib[:copies] = [] }
209
+ @copies.each do |copy|
210
+ copy.location = @connection.location_name copy.location if copy.location.is_a? Numeric
211
+ copy.status = @connection.status_name copy.status if copy.status.is_a? Numeric
212
+ next unless copy.owning_lib.is_a? Numeric
213
+
214
+ ou_id = copy.owning_lib
215
+ copy.owning_lib = @connection.ou_name copy.owning_lib
216
+ @libraries[ou_id][:copies].push copy
217
+ end
218
+ end
219
+ end
220
+
221
+ # A physical copy of an item
222
+ class Item
223
+ attr_accessor :location, :status, :owning_lib
224
+ attr_reader :barcode, :call_number, :due_date
225
+
226
+ def initialize(data = {})
227
+ data.each do |k, v|
228
+ instance_variable_set("@#{k}", v) unless v.nil?
229
+ end
230
+ end
231
+ end
232
+ end
@@ -1,2 +1,4 @@
1
+ # frozen_string_literals: true
2
+
1
3
  class CouldNotConnectToEvergreenError < StandardError
2
4
  end
@@ -0,0 +1,17 @@
1
+ # frozen_string_literals: true
2
+
3
+ module EvergreenHoldings
4
+ class IDLParser
5
+ def initialize(idl)
6
+ @idl = idl
7
+ end
8
+
9
+ def field_order_by_class(classes)
10
+ classes.map do |idl_class|
11
+ fields = @idl.xpath("//idl:class[@id='#{idl_class}']/idl:fields/idl:field", 'idl' => 'http://opensrf.org/spec/IDL/base/v1')
12
+ .map.with_index { |field, index| [field['name'], index] }
13
+ [idl_class, fields.to_h]
14
+ end.to_h
15
+ end
16
+ end
17
+ end
@@ -1,21 +1,21 @@
1
- require 'coveralls'
2
- Coveralls.wear!
3
- require 'minitest/autorun'
4
- require 'evergreen_holdings'
5
-
6
- class EvergreenHoldingsTest < Minitest::Test
7
- def test_connecting_to_eg_returns_a_connection_object
8
- conn = EvergreenHoldings::Connection.new 'http://gapines.org'
9
- assert_instance_of EvergreenHoldings::Connection, conn
10
- end
11
- def test_connecting_to_a_404_throws_an_error
12
- assert_raises('CouldNotConnectToEvergreenError') {
13
- EvergreenHoldings::Connection.new('http://httpstat.us/404')
14
- }
15
- end
16
- def test_connecting_to_a_non_evergreen_server_throws_an_error
17
- assert_raises('CouldNotConnectToEvergreenError') {
18
- EvergreenHoldings::Connection.new('http://libfind.linnbenton.edu')
19
- }
20
- end
21
- end
1
+ require 'minitest/autorun'
2
+ require 'evergreen_holdings'
3
+
4
+ class EvergreenHoldingsTest < Minitest::Test
5
+ def test_connecting_to_eg_returns_a_connection_object
6
+ conn = EvergreenHoldings::Connection.new 'https://gapines.org'
7
+ assert_instance_of EvergreenHoldings::Connection, conn
8
+ end
9
+
10
+ def test_connecting_to_a_404_throws_an_error
11
+ assert_raises(CouldNotConnectToEvergreenError) do
12
+ EvergreenHoldings::Connection.new('http://httpstat.us/404')
13
+ end
14
+ end
15
+
16
+ def test_connecting_to_a_non_evergreen_server_throws_an_error
17
+ assert_raises(CouldNotConnectToEvergreenError) do
18
+ EvergreenHoldings::Connection.new('http://libfind.linnbenton.edu')
19
+ end
20
+ end
21
+ end
metadata CHANGED
@@ -1,22 +1,22 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: evergreen_holdings
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.0
4
+ version: 0.5.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jane Sandberg
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2019-12-27 00:00:00.000000000 Z
11
+ date: 2021-04-07 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
+ name: nokogiri
14
15
  requirement: !ruby/object:Gem::Requirement
15
16
  requirements:
16
17
  - - "~>"
17
18
  - !ruby/object:Gem::Version
18
19
  version: '1.11'
19
- name: nokogiri
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
@@ -25,34 +25,35 @@ dependencies:
25
25
  - !ruby/object:Gem::Version
26
26
  version: '1.11'
27
27
  - !ruby/object:Gem::Dependency
28
+ name: minitest
28
29
  requirement: !ruby/object:Gem::Requirement
29
30
  requirements:
30
31
  - - "~>"
31
32
  - !ruby/object:Gem::Version
32
- version: 0.7.0
33
- name: coveralls
33
+ version: 5.0.0
34
34
  type: :development
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
38
  - - "~>"
39
39
  - !ruby/object:Gem::Version
40
- version: 0.7.0
40
+ version: 5.0.0
41
41
  - !ruby/object:Gem::Dependency
42
+ name: rake
42
43
  requirement: !ruby/object:Gem::Requirement
43
44
  requirements:
44
- - - "~>"
45
+ - - ">="
45
46
  - !ruby/object:Gem::Version
46
- version: 5.0.0
47
- name: minitest
47
+ version: '0'
48
48
  type: :development
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
- - - "~>"
52
+ - - ">="
53
53
  - !ruby/object:Gem::Version
54
- version: 5.0.0
54
+ version: '0'
55
55
  - !ruby/object:Gem::Dependency
56
+ name: rubocop
56
57
  requirement: !ruby/object:Gem::Requirement
57
58
  requirements:
58
59
  - - ">"
@@ -61,7 +62,6 @@ dependencies:
61
62
  - - "<"
62
63
  - !ruby/object:Gem::Version
63
64
  version: '2'
64
- name: rubocop
65
65
  type: :development
66
66
  prerelease: false
67
67
  version_requirements: !ruby/object:Gem::Requirement
@@ -80,12 +80,13 @@ extra_rdoc_files: []
80
80
  files:
81
81
  - lib/evergreen_holdings.rb
82
82
  - lib/evergreen_holdings/errors.rb
83
+ - lib/evergreen_holdings/idl_parser.rb
83
84
  - test/evergreen_holdings_test.rb
84
85
  homepage: https://github.com/sandbergja/evergreen_holdings_gem
85
86
  licenses:
86
87
  - MIT
87
88
  metadata: {}
88
- post_install_message:
89
+ post_install_message:
89
90
  rdoc_options: []
90
91
  require_paths:
91
92
  - lib
@@ -100,8 +101,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
100
101
  - !ruby/object:Gem::Version
101
102
  version: '0'
102
103
  requirements: []
103
- rubygems_version: 3.0.6
104
- signing_key:
104
+ rubygems_version: 3.0.3
105
+ signing_key:
105
106
  specification_version: 4
106
107
  summary: A ruby gem for getting information about copy availability from Evergreen
107
108
  ILS