evergreen_holdings 0.1.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 5511d7fa326b339080aac864cb223a99d5adc935
4
+ data.tar.gz: e841a0ae4593c453599c45dc018d4c38e14dacad
5
+ SHA512:
6
+ metadata.gz: b4545c01d0127a6be4eca3f1e2173431bc58d87a4dda771c18232af34922f76540ea8b589b49e28fa5380da9152440b00653754eb37350b03a66a321879e1f94
7
+ data.tar.gz: 3c5e4b56a6ca22c7503db5709c6d82e9ea0f78075a7e3e0a93703bd2fe5e5956ab47cdf676253b710a942dd873912293e55c4f8fca3e45aa301bafc873b349c7
@@ -0,0 +1,2 @@
1
+ class CouldNotConnectToEvergreenError < StandardError
2
+ end
@@ -0,0 +1,136 @@
1
+ require 'net/http'
2
+ require 'json'
3
+ require 'evergreen_holdings/errors'
4
+
5
+ OSRF_PATH = '/osrf-gateway-v1'
6
+
7
+ module EvergreenHoldings
8
+ class Connection
9
+ # Create a new object with the evergreen_domain
10
+ # specified, e.g. http://libcat.linnbenton.edu
11
+ #
12
+ # Usage: `conn = EvergreenHoldings::Connection.new 'http://gapines.org'`
13
+ def initialize evergreen_domain
14
+ @gateway = URI evergreen_domain+OSRF_PATH
15
+ unless fetch_statuses
16
+ raise CouldNotConnectToEvergreenError
17
+ end
18
+ end
19
+
20
+ # Fetch holdings data from the Evergreen server
21
+ # Returns a Status object
22
+ #
23
+ # Usage: `stat = conn.get_holdings 23405`
24
+ # If you just want holdings at a specific org_unit: `my_connection.get_holdings 23405, org_unit: 5`
25
+ def get_holdings tcn, options = {}
26
+ if options.key?(:org_unit)
27
+ 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]}"
28
+ else
29
+ 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}"
30
+ end
31
+ @gateway.query = params
32
+
33
+ res = Net::HTTP.get_response(@gateway)
34
+ return Status.new res.body, self if res.is_a?(Net::HTTPSuccess)
35
+ end
36
+
37
+ def location_name id
38
+ params = "format=json&input_format=json&service=open-ils.circ&method=open-ils.circ.copy_location.retrieve&param=#{id}"
39
+ @gateway.query = params
40
+ res = Net::HTTP.get_response(@gateway)
41
+ if res.is_a? Net::HTTPSuccess
42
+ data = JSON.parse(res.body)['payload'][0]
43
+ unless data.key? 'stacktrace'
44
+ return data['__p'][4]
45
+ end
46
+ end
47
+ return id
48
+ end
49
+
50
+ def status_name id
51
+ return @possible_item_statuses[id]
52
+ end
53
+
54
+ private
55
+
56
+ def fetch_statuses
57
+ @possible_item_statuses = []
58
+ params = 'format=json&input_format=json&service=open-ils.search&method=open-ils.search.config.copy_status.retrieve.all'
59
+ @gateway.query = params
60
+ res = Net::HTTP.get_response(@gateway)
61
+ if res.is_a?(Net::HTTPSuccess)
62
+ stats = JSON.parse(res.body)['payload'][0]
63
+ stats.each do |stat|
64
+ @possible_item_statuses[stat['__p'][1]] = stat['__p'][2]
65
+ end
66
+ return true if stats.size > 0
67
+ end
68
+ return false
69
+ end
70
+
71
+ end
72
+
73
+ class Status
74
+ attr_reader :copies
75
+ def initialize json_data, connection = nil
76
+ @connection = connection
77
+ @raw_data = JSON.parse(json_data)['payload'][0]
78
+ @copies = extract_copies
79
+ substitute_values_for_ids unless @connection.nil?
80
+ @available_copies = []
81
+ @next_copy_available = 'a date'
82
+ end
83
+
84
+ # Determines if any copies are available for your patrons
85
+ def any_copies_available?
86
+ @copies.each do |copy|
87
+ return true if 0 == copy.status
88
+ return true if 'Available' == copy.status
89
+ end
90
+ end
91
+
92
+ private
93
+ # Look through @raw_data and find the copies
94
+ def extract_copies
95
+ copies = Array.new
96
+ @raw_data.each do |vol|
97
+ if vol['__p'][0].size > 0
98
+ vol['__p'][0].each do |item|
99
+ unless item['__p'][35].nil?
100
+ copies.push Item.new barcode: item['__p'][2], call_number: vol['__p'][7], location: item['__p'][24], status: item['__p'][28]
101
+ else
102
+ begin
103
+ copies.push Item.new barcode: item['__p'][2], call_number: vol['__p'][7], due_date: item['__p'][35][0]['__p'][6], location: item['__p'][24], status: item['__p'][28]
104
+ rescue
105
+ copies.push Item.new barcode: item['__p'][2], call_number: vol['__p'][7], location: item['__p'][24], status: item['__p'][28]
106
+ end
107
+ end
108
+ end
109
+ end
110
+ end
111
+ return copies
112
+ end
113
+
114
+ def substitute_values_for_ids
115
+ @copies.each do |copy|
116
+ if copy.location.is_a? Numeric
117
+ copy.location = @connection.location_name copy.location
118
+ end
119
+ if copy.status.is_a? Numeric
120
+ copy.status = @connection.status_name copy.status
121
+ end
122
+ end
123
+ end
124
+
125
+ end
126
+
127
+ class Item
128
+ attr_accessor :location, :status
129
+ attr_reader :barcode
130
+ def initialize data = {}
131
+ data.each do |k,v|
132
+ instance_variable_set("@#{k}", v) unless v.nil?
133
+ end
134
+ end
135
+ end
136
+ end
@@ -0,0 +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
metadata ADDED
@@ -0,0 +1,76 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: evergreen_holdings
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.1
5
+ platform: ruby
6
+ authors:
7
+ - Jane Sandberg
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2016-09-27 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: minitest
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: coveralls
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - '='
32
+ - !ruby/object:Gem::Version
33
+ version: 0.7.0
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - '='
39
+ - !ruby/object:Gem::Version
40
+ version: 0.7.0
41
+ description: Access holdings information from Evergreen ILS
42
+ email: sandbej@linnbenton.edu
43
+ executables: []
44
+ extensions: []
45
+ extra_rdoc_files: []
46
+ files:
47
+ - lib/evergreen_holdings.rb
48
+ - lib/evergreen_holdings/errors.rb
49
+ - test/evergreen_holdings_test.rb
50
+ homepage:
51
+ licenses:
52
+ - MIT
53
+ metadata: {}
54
+ post_install_message:
55
+ rdoc_options: []
56
+ require_paths:
57
+ - lib
58
+ required_ruby_version: !ruby/object:Gem::Requirement
59
+ requirements:
60
+ - - ">="
61
+ - !ruby/object:Gem::Version
62
+ version: '0'
63
+ required_rubygems_version: !ruby/object:Gem::Requirement
64
+ requirements:
65
+ - - ">="
66
+ - !ruby/object:Gem::Version
67
+ version: '0'
68
+ requirements: []
69
+ rubyforge_project:
70
+ rubygems_version: 2.5.1
71
+ signing_key:
72
+ specification_version: 4
73
+ summary: A ruby gem for getting information about copy availability from Evergreen
74
+ ILS
75
+ test_files:
76
+ - test/evergreen_holdings_test.rb