ebsco-eds 0.0.6.pre → 0.0.7.pre
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/ebsco-eds.gemspec +1 -0
- data/lib/ebsco/eds.rb +0 -1
- data/lib/ebsco/eds/record.rb +1 -4
- data/lib/ebsco/eds/results.rb +1 -8
- data/lib/ebsco/eds/session.rb +30 -20
- data/lib/ebsco/eds/version.rb +1 -1
- data/lib/faraday/eds_middleware.rb +143 -0
- data/lib/faraday_eds_middleware.rb +7 -0
- metadata +18 -4
- data/lib/ebsco/eds/http_exception.rb +0 -49
- data/lib/ebsco/eds/settings.yml +0 -35
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: d2f5c44d4608f6e09bd9742eb79b651d4eb34bc3
|
4
|
+
data.tar.gz: 92d50beccaef1aff8659f0843a225b2c3c4c38c9
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: af3195f29647ba7182a2e31cc7569b543942681689eadd2ea9ed9d3b4c2018fa09c0a0e365af44efefd8a5242ffe03452fb80cb15330918483831cddf3d0275b
|
7
|
+
data.tar.gz: c67f556bd18164bb666bcdbf0bdafdca4b2e1ca1c48bcd7b993646b82a418380981b7538a1f95b99a8cd2a4ae3166163df5b4bf4a8d3dacaba71e31ff9196cce
|
data/ebsco-eds.gemspec
CHANGED
@@ -37,6 +37,7 @@ Gem::Specification.new do |spec|
|
|
37
37
|
spec.add_dependency 'climate_control', '~> 0'
|
38
38
|
spec.add_dependency 'require_all', '~> 1.3'
|
39
39
|
spec.add_dependency 'bibtex-ruby', '~> 4.0'
|
40
|
+
spec.add_dependency 'activesupport', '~> 4.2'
|
40
41
|
|
41
42
|
spec.add_development_dependency 'bundler', '~> 1.13'
|
42
43
|
spec.add_development_dependency 'rake', '~> 12.0'
|
data/lib/ebsco/eds.rb
CHANGED
data/lib/ebsco/eds/record.rb
CHANGED
@@ -13,9 +13,6 @@ module EBSCO
|
|
13
13
|
# Raw record as returned by the \EDS API via search or retrieve
|
14
14
|
attr_reader :record
|
15
15
|
|
16
|
-
# Lookup table of databases that have their labels suppressed in the response.
|
17
|
-
DBS = YAML::load_file(File.join(__dir__, 'settings.yml'))['databases']
|
18
|
-
|
19
16
|
# Creates a search or retrieval result record
|
20
17
|
def initialize(results_record)
|
21
18
|
|
@@ -530,7 +527,7 @@ module EBSCO
|
|
530
527
|
end
|
531
528
|
|
532
529
|
def header_db_label
|
533
|
-
|
530
|
+
@record['Header']['DbLabel']
|
534
531
|
end
|
535
532
|
|
536
533
|
# not sure the rules for when this appears or not - RecordInfo.AccessInfo?
|
data/lib/ebsco/eds/results.rb
CHANGED
@@ -19,9 +19,6 @@ module EBSCO
|
|
19
19
|
|
20
20
|
attr_accessor :stat_total_hits
|
21
21
|
|
22
|
-
# Lookup table of databases that have their labels suppressed in the response.
|
23
|
-
DBS = YAML::load_file(File.join(__dir__, 'settings.yml'))['databases']
|
24
|
-
|
25
22
|
# Creates search results from the \EDS API search response. It includes information about the results and a list
|
26
23
|
# of Record items.
|
27
24
|
def initialize(search_results, additional_limiters = {}, raw_options = {})
|
@@ -344,11 +341,7 @@ module EBSCO
|
|
344
341
|
databases = []
|
345
342
|
databases_facet = @results['SearchResult']['Statistics']['Databases']
|
346
343
|
databases_facet.each do |database|
|
347
|
-
|
348
|
-
db_label = DBS[database['Id'].upcase];
|
349
|
-
else
|
350
|
-
db_label = database['Label']
|
351
|
-
end
|
344
|
+
db_label = database['Label']
|
352
345
|
databases.push({id: database['Id'], hits: database['Hits'], label: db_label})
|
353
346
|
end
|
354
347
|
databases
|
data/lib/ebsco/eds/session.rb
CHANGED
@@ -5,6 +5,8 @@ require 'faraday'
|
|
5
5
|
require 'faraday_middleware'
|
6
6
|
require 'logger'
|
7
7
|
require 'json'
|
8
|
+
require 'active_support'
|
9
|
+
require 'faraday_eds_middleware'
|
8
10
|
|
9
11
|
module EBSCO
|
10
12
|
|
@@ -57,6 +59,10 @@ module EBSCO
|
|
57
59
|
# }
|
58
60
|
def initialize(options = {})
|
59
61
|
|
62
|
+
|
63
|
+
cache_dir = File.join(ENV['TMPDIR'] || '/tmp', 'faraday_eds_cache')
|
64
|
+
@cache_store = ActiveSupport::Cache::FileStore.new cache_dir
|
65
|
+
|
60
66
|
@session_token = ''
|
61
67
|
@auth_token = ''
|
62
68
|
@guest = 'y'
|
@@ -114,7 +120,7 @@ module EBSCO
|
|
114
120
|
@session_token = create_session_token
|
115
121
|
end
|
116
122
|
|
117
|
-
@info
|
123
|
+
@info = EBSCO::EDS::Info.new(do_request(:get, path: INFO_URL))
|
118
124
|
@current_page = 0
|
119
125
|
@search_options = nil
|
120
126
|
|
@@ -634,43 +640,47 @@ module EBSCO
|
|
634
640
|
private
|
635
641
|
|
636
642
|
def connection
|
637
|
-
|
638
|
-
|
639
|
-
|
640
|
-
|
641
|
-
|
642
|
-
|
643
|
-
|
644
|
-
|
645
|
-
|
646
|
-
|
647
|
-
|
643
|
+
logger = Logger.new(LOG)
|
644
|
+
logger.level = Logger::DEBUG
|
645
|
+
Faraday.new(url: EDS_API_BASE) do |conn|
|
646
|
+
conn.headers['Content-Type'] = 'application/json;charset=UTF-8'
|
647
|
+
conn.headers['Accept'] = 'application/json'
|
648
|
+
conn.headers['x-sessionToken'] = @session_token ? @session_token : ''
|
649
|
+
conn.headers['x-authenticationToken'] = @auth_token ? @auth_token : ''
|
650
|
+
conn.headers['User-Agent'] = USER_AGENT
|
651
|
+
conn.request :url_encoded
|
652
|
+
conn.use :eds_middleware, store: @cache_store
|
653
|
+
conn.response :json, content_type: /\bjson$/
|
654
|
+
conn.response :logger, logger
|
655
|
+
conn.adapter Faraday.default_adapter
|
648
656
|
end
|
649
657
|
end
|
650
658
|
|
651
659
|
def create_auth_token
|
652
660
|
if blank?(@auth_token)
|
653
661
|
# ip auth
|
654
|
-
if (blank?(@user) && blank?(@pass)) || @auth_type.casecmp('ip')
|
655
|
-
|
656
|
-
@auth_token = _response['AuthToken']
|
662
|
+
if (blank?(@user) && blank?(@pass)) || @auth_type.casecmp('ip').zero?
|
663
|
+
resp = do_request(:post, path: IP_AUTH_URL)
|
657
664
|
# user auth
|
658
665
|
else
|
659
|
-
|
660
|
-
|
666
|
+
resp = do_request(:post, path: UID_AUTH_URL, payload:
|
667
|
+
{ UserId: @user, Password: @pass })
|
661
668
|
end
|
662
669
|
end
|
670
|
+
@auth_token = resp['AuthToken']
|
663
671
|
@auth_token
|
664
672
|
end
|
665
673
|
|
666
674
|
def create_session_token
|
667
|
-
|
668
|
-
|
675
|
+
resp = do_request(:get, path: CREATE_SESSION_URL +
|
676
|
+
'?profile=' + @profile + '&guest=' + @guest +
|
677
|
+
'&displaydatabasename=y')
|
678
|
+
@session_token = resp['SessionToken']
|
669
679
|
end
|
670
680
|
|
671
681
|
# helper methods
|
672
682
|
def blank?(var)
|
673
|
-
var.nil? || var.respond_to?(:length) && var.
|
683
|
+
var.nil? || var.respond_to?(:length) && var.empty?
|
674
684
|
end
|
675
685
|
|
676
686
|
# used to reliably create empty results when there are no search terms provided
|
data/lib/ebsco/eds/version.rb
CHANGED
@@ -0,0 +1,143 @@
|
|
1
|
+
require 'faraday'
|
2
|
+
|
3
|
+
module Faraday
|
4
|
+
|
5
|
+
class EdsMiddleware < Faraday::Middleware
|
6
|
+
|
7
|
+
INFO_URI = URI.parse('https://eds-api.ebscohost.com/edsapi/rest/Info')
|
8
|
+
AUTH_URI = URI.parse('https://eds-api.ebscohost.com/authservice/rest/uidauth')
|
9
|
+
|
10
|
+
def initialize(app, *args)
|
11
|
+
super(app)
|
12
|
+
options = args.first || {}
|
13
|
+
@expires_in = options.fetch(:expires_in, 30)
|
14
|
+
@logger = options.fetch(:logger, nil)
|
15
|
+
@namespace = options.fetch(:namespace, 'faraday-eds-cache')
|
16
|
+
@store = options.fetch(:store, :memory_store)
|
17
|
+
@store_options = options.fetch(:store_options, {})
|
18
|
+
|
19
|
+
@store_options[:namespace] ||= @namespace
|
20
|
+
|
21
|
+
initialize_store
|
22
|
+
end
|
23
|
+
|
24
|
+
def call(env)
|
25
|
+
dup.call!(env)
|
26
|
+
end
|
27
|
+
|
28
|
+
protected
|
29
|
+
|
30
|
+
def call!(env)
|
31
|
+
response_env = cached_response(env)
|
32
|
+
|
33
|
+
if response_env
|
34
|
+
response_env.response_headers['x-faraday-eds-cache'] = 'HIT'
|
35
|
+
to_response(response_env)
|
36
|
+
else
|
37
|
+
@app.call(env).on_complete do |response_env|
|
38
|
+
case response_env.status
|
39
|
+
when 200
|
40
|
+
response_env.response_headers['x-faraday-eds-cache'] = 'MISS'
|
41
|
+
cache_response(response_env)
|
42
|
+
when 400
|
43
|
+
raise EBSCO::EDS::BadRequest.new(error_message(response_env))
|
44
|
+
# when 401
|
45
|
+
# raise EBSCO::EDS::Unauthorized.new
|
46
|
+
# when 403
|
47
|
+
# raise EBSCO::EDS::Forbidden.new
|
48
|
+
# when 404
|
49
|
+
# raise EBSCO::EDS::NotFound.new
|
50
|
+
# when 429
|
51
|
+
# raise EBSCO::EDS::TooManyRequests.new
|
52
|
+
# when 500
|
53
|
+
# raise EBSCO::EDS::InternalServerError.new
|
54
|
+
# when 503
|
55
|
+
# raise EBSCO::EDS::ServiceUnavailable.new
|
56
|
+
else
|
57
|
+
raise EBSCO::EDS::BadRequest.new(error_message(response_env))
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
def cache_response(env)
|
64
|
+
return unless cacheable?(env) && !env.request_headers['x-faraday-eds-cache']
|
65
|
+
|
66
|
+
info "Cache WRITE: #{key(env)}"
|
67
|
+
custom_expires_in = @expires_in
|
68
|
+
uri = env.url
|
69
|
+
|
70
|
+
if uri == AUTH_URI
|
71
|
+
custom_expires_in = 1800 # 30 minutes
|
72
|
+
info "#{uri} - Setting custom expires: #{custom_expires_in}"
|
73
|
+
end
|
74
|
+
|
75
|
+
if uri == INFO_URI
|
76
|
+
custom_expires_in = 86400 # 24 hours
|
77
|
+
info "#{uri} - Setting custom expires: #{custom_expires_in}"
|
78
|
+
end
|
79
|
+
|
80
|
+
@store.write(key(env), env, expires_in: custom_expires_in)
|
81
|
+
end
|
82
|
+
|
83
|
+
def cacheable?(env)
|
84
|
+
uri = env.url
|
85
|
+
if uri == AUTH_URI || uri == INFO_URI
|
86
|
+
info "CACHEABLE URI: #{uri}"
|
87
|
+
true
|
88
|
+
else
|
89
|
+
info "NOT CACHEABLE URI: #{uri}"
|
90
|
+
false
|
91
|
+
end
|
92
|
+
end
|
93
|
+
|
94
|
+
def cached_response(env)
|
95
|
+
if cacheable?(env) && !env.request_headers['x-faraday-eds-cache']
|
96
|
+
response_env = @store.fetch(key(env))
|
97
|
+
end
|
98
|
+
|
99
|
+
if response_env
|
100
|
+
info "Cache HIT: #{key(env)}"
|
101
|
+
else
|
102
|
+
info "Cache MISS: #{key(env)}"
|
103
|
+
end
|
104
|
+
|
105
|
+
# info "CACHE: #{response_env.inspect}"
|
106
|
+
|
107
|
+
response_env
|
108
|
+
end
|
109
|
+
|
110
|
+
def info(message)
|
111
|
+
@logger.info(message) unless @logger.nil?
|
112
|
+
end
|
113
|
+
|
114
|
+
def key(env)
|
115
|
+
env.url
|
116
|
+
end
|
117
|
+
|
118
|
+
def initialize_store
|
119
|
+
return unless @store.is_a? Symbol
|
120
|
+
|
121
|
+
require 'active_support/cache'
|
122
|
+
@store = ActiveSupport::Cache.lookup_store(@store, @store_options)
|
123
|
+
end
|
124
|
+
|
125
|
+
def to_response(env)
|
126
|
+
env = env.dup
|
127
|
+
env.response_headers['x-faraday-eds-cache'] = 'HIT'
|
128
|
+
response = Response.new
|
129
|
+
response.finish(env) unless env.parallel?
|
130
|
+
env.response = response
|
131
|
+
end
|
132
|
+
|
133
|
+
def error_message(response)
|
134
|
+
# puts response.inspect
|
135
|
+
{
|
136
|
+
method: response.method,
|
137
|
+
url: response.url,
|
138
|
+
status: response.status,
|
139
|
+
error_body: response.body
|
140
|
+
}
|
141
|
+
end
|
142
|
+
end
|
143
|
+
end
|
@@ -0,0 +1,7 @@
|
|
1
|
+
require 'faraday/eds_middleware'
|
2
|
+
|
3
|
+
if Faraday.respond_to?(:register_middleware)
|
4
|
+
Faraday.register_middleware eds_middleware: Faraday::EdsMiddleware
|
5
|
+
elsif Faraday::Middleware.respond_to?(:register_middleware)
|
6
|
+
Faraday::Middleware.register_middleware eds_middleware: Faraday::EdsMiddleware
|
7
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ebsco-eds
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.7.pre
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Bill McKinney
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: exe
|
11
11
|
cert_chain: []
|
12
|
-
date: 2017-03-
|
12
|
+
date: 2017-03-30 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: faraday
|
@@ -123,6 +123,20 @@ dependencies:
|
|
123
123
|
- - "~>"
|
124
124
|
- !ruby/object:Gem::Version
|
125
125
|
version: '4.0'
|
126
|
+
- !ruby/object:Gem::Dependency
|
127
|
+
name: activesupport
|
128
|
+
requirement: !ruby/object:Gem::Requirement
|
129
|
+
requirements:
|
130
|
+
- - "~>"
|
131
|
+
- !ruby/object:Gem::Version
|
132
|
+
version: '4.2'
|
133
|
+
type: :runtime
|
134
|
+
prerelease: false
|
135
|
+
version_requirements: !ruby/object:Gem::Requirement
|
136
|
+
requirements:
|
137
|
+
- - "~>"
|
138
|
+
- !ruby/object:Gem::Version
|
139
|
+
version: '4.2'
|
126
140
|
- !ruby/object:Gem::Dependency
|
127
141
|
name: bundler
|
128
142
|
requirement: !ruby/object:Gem::Requirement
|
@@ -212,15 +226,15 @@ files:
|
|
212
226
|
- ebsco-eds.gemspec
|
213
227
|
- lib/ebsco/eds.rb
|
214
228
|
- lib/ebsco/eds/error.rb
|
215
|
-
- lib/ebsco/eds/http_exception.rb
|
216
229
|
- lib/ebsco/eds/info.rb
|
217
230
|
- lib/ebsco/eds/jsonable.rb
|
218
231
|
- lib/ebsco/eds/options.rb
|
219
232
|
- lib/ebsco/eds/record.rb
|
220
233
|
- lib/ebsco/eds/results.rb
|
221
234
|
- lib/ebsco/eds/session.rb
|
222
|
-
- lib/ebsco/eds/settings.yml
|
223
235
|
- lib/ebsco/eds/version.rb
|
236
|
+
- lib/faraday/eds_middleware.rb
|
237
|
+
- lib/faraday_eds_middleware.rb
|
224
238
|
homepage: https://github.com/ebsco/edsapi-ruby
|
225
239
|
licenses:
|
226
240
|
- MIT
|
@@ -1,49 +0,0 @@
|
|
1
|
-
require 'faraday'
|
2
|
-
|
3
|
-
module FaradayMiddleware
|
4
|
-
|
5
|
-
class RaiseHttpException < Faraday::Middleware
|
6
|
-
|
7
|
-
def initialize(app)
|
8
|
-
super app
|
9
|
-
end
|
10
|
-
|
11
|
-
def call(env)
|
12
|
-
@app.call(env).on_complete do |response|
|
13
|
-
case response.status
|
14
|
-
when 200
|
15
|
-
when 400
|
16
|
-
raise EBSCO::EDS::BadRequest.new(error_message(response))
|
17
|
-
# when 401
|
18
|
-
# raise EBSCO::EDS::Unauthorized.new
|
19
|
-
# when 403
|
20
|
-
# raise EBSCO::EDS::Forbidden.new
|
21
|
-
# when 404
|
22
|
-
# raise EBSCO::EDS::NotFound.new
|
23
|
-
# when 429
|
24
|
-
# raise EBSCO::EDS::TooManyRequests.new
|
25
|
-
# when 500
|
26
|
-
# raise EBSCO::EDS::InternalServerError.new
|
27
|
-
# when 503
|
28
|
-
# raise EBSCO::EDS::ServiceUnavailable.new
|
29
|
-
else
|
30
|
-
raise EBSCO::EDS::BadRequest.new(error_message(response))
|
31
|
-
end
|
32
|
-
end
|
33
|
-
end
|
34
|
-
|
35
|
-
private
|
36
|
-
|
37
|
-
def error_message(response)
|
38
|
-
#puts response.inspect
|
39
|
-
{
|
40
|
-
method: response.method,
|
41
|
-
url: response.url,
|
42
|
-
status: response.status,
|
43
|
-
error_body: response.body
|
44
|
-
}
|
45
|
-
end
|
46
|
-
|
47
|
-
end
|
48
|
-
|
49
|
-
end
|
data/lib/ebsco/eds/settings.yml
DELETED
@@ -1,35 +0,0 @@
|
|
1
|
-
|
2
|
-
databases:
|
3
|
-
EDB: Publisher Provided Full Text Searching File,
|
4
|
-
EDO: Supplemental Index,
|
5
|
-
ASX: Academic Search Index,
|
6
|
-
A9H: Academic Search Complete,
|
7
|
-
APH: Academic Search Premier,
|
8
|
-
AFH: Academic Search Elite,
|
9
|
-
A2H: Academic Search Alumni Edition,
|
10
|
-
ASM: Academic Search Main Edition,
|
11
|
-
ASR: STM Source,
|
12
|
-
BSX: Business Source Index,
|
13
|
-
EDSEBK: Discovery eBooks,
|
14
|
-
VTH: Art & Architecture Complete,
|
15
|
-
IIH: Computers & Applied Sciences Complete,
|
16
|
-
CMH: Consumer Health Complete - CHC Platform,
|
17
|
-
C9H: Consumer Health Complete - EBSCOhost,
|
18
|
-
EOAH: E-Journals Database,
|
19
|
-
EHH: Education Research Complete,
|
20
|
-
HCH: Health Source - Nursing/Academic,
|
21
|
-
HXH: Health Source - Consumer Edition,
|
22
|
-
HLH: Humanities International Complete,
|
23
|
-
LGH: Legal Collection,
|
24
|
-
SLH: Sociological Collection,
|
25
|
-
CPH: Computer Source,
|
26
|
-
PBH: Psychology & Behavioral Sciences Collection,
|
27
|
-
RLH: Religion & Philosophy Collection,
|
28
|
-
NFH: Newspaper Source,
|
29
|
-
N5H: Newspaper Source Plus,
|
30
|
-
BWH: Regional Business News,
|
31
|
-
OFM: OmniFile Full Text Mega,
|
32
|
-
RSS: Rehabilitation & Sports Medicine Source,
|
33
|
-
SYH: Science & Technology Collection,
|
34
|
-
SCF: Science Full Text Select,
|
35
|
-
HEH: Health Business Elite
|