ebsco-eds 0.0.6.pre → 0.0.7.pre
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/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
|