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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 52a371da7111d83a7616bdd5de68deabd1c6983a
4
- data.tar.gz: 00fae54472789a602ad4cd50cab93f88d4778308
3
+ metadata.gz: d2f5c44d4608f6e09bd9742eb79b651d4eb34bc3
4
+ data.tar.gz: 92d50beccaef1aff8659f0843a225b2c3c4c38c9
5
5
  SHA512:
6
- metadata.gz: b195bf1718c6715555487dc15f3d2eaccd62e5a2ec7152fb606a7a07a069b95a66d7758c83b5a04fd7d321b05889965e7e9c75e8eedf7d0933b6244f0ede8207
7
- data.tar.gz: a4b22c20bcc5c092dd55414e4cfd4a427049e277e10c2cd4ce76ac8f27184daa9fa69334cd28e4ab2f5afa2885407bb00c0ddabfe55ae319b242b169c9b28daa
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
@@ -4,7 +4,6 @@ require 'ebsco/eds/info'
4
4
  require 'ebsco/eds/results'
5
5
  require 'ebsco/eds/record'
6
6
  require 'ebsco/eds/error'
7
- require 'ebsco/eds/http_exception'
8
7
 
9
8
  module EBSCO
10
9
 
@@ -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
- DBS[self.database_id.upcase] || @record['Header']['DbLabel']
530
+ @record['Header']['DbLabel']
534
531
  end
535
532
 
536
533
  # not sure the rules for when this appears or not - RecordInfo.AccessInfo?
@@ -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
- if DBS.key?(database['Id'].upcase)
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
@@ -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 ||= EBSCO::EDS::Info.new(do_request(:get, path: INFO_URL))
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
- Faraday.new(url: EDS_API_BASE) do |faraday|
638
- faraday.headers['Content-Type'] = 'application/json;charset=UTF-8'
639
- faraday.headers['Accept'] = 'application/json'
640
- faraday.headers['x-sessionToken'] = @session_token ? @session_token : ''
641
- faraday.headers['x-authenticationToken'] = @auth_token ? @auth_token : ''
642
- faraday.headers['User-Agent'] = USER_AGENT
643
- faraday.request :url_encoded
644
- faraday.use FaradayMiddleware::RaiseHttpException
645
- faraday.response :json, :content_type => /\bjson$/
646
- #faraday.response :logger, Logger.new(LOG)
647
- faraday.adapter Faraday.default_adapter
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') == 0
655
- _response = do_request(:post, path: IP_AUTH_URL)
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
- _response = do_request(:post, path: UID_AUTH_URL, payload: {:UserId => @user, :Password => @pass})
660
- @auth_token = _response['AuthToken']
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
- _response = do_request(:post, path: CREATE_SESSION_URL, payload: {:Profile => @profile, :Guest => @guest})
668
- @session_token = _response['SessionToken']
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.length == 0
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
@@ -1,5 +1,5 @@
1
1
  module EBSCO
2
2
  module EDS
3
- VERSION = '0.0.6.pre'
3
+ VERSION = '0.0.7.pre'
4
4
  end
5
5
  end
@@ -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.6.pre
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-29 00:00:00.000000000 Z
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
@@ -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