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 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