ebsco-eds 0.0.9.pre → 0.1.0.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/lib/ebsco/eds.rb +1 -13
- data/lib/ebsco/eds/configuration.rb +63 -0
- data/lib/ebsco/eds/info.rb +3 -2
- data/lib/ebsco/eds/options.rb +9 -1
- data/lib/ebsco/eds/record.rb +132 -102
- data/lib/ebsco/eds/session.rb +48 -48
- data/lib/ebsco/eds/version.rb +1 -1
- data/lib/faraday/{eds_middleware.rb → eds_caching_middleware.rb} +3 -31
- data/lib/faraday/eds_exception_middleware.rb +49 -0
- data/lib/faraday_eds_middleware.rb +5 -5
- metadata +5 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 8bf7451cbf86071a743681b657692b002f44f390
|
4
|
+
data.tar.gz: 0730b334a687c1af3da7452405e882324475c03c
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: eeed69e878b466f93c3d1ea562a826f77fef9305a0e9b10f1925342e5ab9917725ea140e50db7b5d2231ab84f409186267d23ee114485a1c2978246ca62f28a5
|
7
|
+
data.tar.gz: cf5033d8a83440de5aab54af4b5a440c438d0ddd68cc3a7a4653670257b18a30281d23de14d4d8f1fd15c2f3d330acc52c242bd631eb05fa9e7cd58b629f9a2b
|
data/lib/ebsco/eds.rb
CHANGED
@@ -8,19 +8,7 @@ require 'ebsco/eds/error'
|
|
8
8
|
module EBSCO
|
9
9
|
|
10
10
|
module EDS
|
11
|
-
|
12
|
-
UID_AUTH_URL = '/authservice/rest/uidauth'
|
13
|
-
IP_AUTH_URL = '/authservice/rest/ipauth'
|
14
|
-
CREATE_SESSION_URL = '/edsapi/rest/CreateSession'
|
15
|
-
END_SESSION_URL = '/edsapi/rest/EndSession'
|
16
|
-
INFO_URL = '/edsapi/rest/Info'
|
17
|
-
SEARCH_URL = '/edsapi/rest/Search'
|
18
|
-
RETRIEVE_URL = '/edsapi/rest/Retrieve'
|
19
|
-
USER_AGENT = 'EBSCO EDS GEM v0.0.1'
|
20
|
-
INTERFACE_ID = 'EBSCO EDS GEM v0.0.1'
|
21
|
-
LOG = 'faraday.log'
|
22
|
-
MAX_ATTEMPTS = 2
|
23
|
-
MAX_RESULTS_PER_PAGE = 100
|
11
|
+
|
24
12
|
end
|
25
13
|
|
26
14
|
end
|
@@ -0,0 +1,63 @@
|
|
1
|
+
require 'yaml'
|
2
|
+
|
3
|
+
module EBSCO
|
4
|
+
|
5
|
+
module EDS
|
6
|
+
|
7
|
+
class Configuration
|
8
|
+
|
9
|
+
attr_reader :valid_config_keys
|
10
|
+
|
11
|
+
def initialize
|
12
|
+
# Configuration defaults
|
13
|
+
@config = {
|
14
|
+
:debug => false,
|
15
|
+
:guest => true,
|
16
|
+
:org => '',
|
17
|
+
:auth => 'user',
|
18
|
+
:auth_token => '',
|
19
|
+
:session_token => '',
|
20
|
+
:eds_api_base => 'https://eds-api.ebscohost.com',
|
21
|
+
:uid_auth_url => '/authservice/rest/uidauth',
|
22
|
+
:ip_auth_url => '/authservice/rest/ipauth',
|
23
|
+
:create_session_url => '/edsapi/rest/CreateSession',
|
24
|
+
:end_session_url => '/edsapi/rest/EndSession',
|
25
|
+
:info_url => '/edsapi/rest/Info',
|
26
|
+
:search_url => '/edsapi/rest/Search',
|
27
|
+
:retrieve_url => '/edsapi/rest/Retrieve',
|
28
|
+
:user_agent => 'EBSCO EDS GEM v0.0.1',
|
29
|
+
:interface_id => 'EBSCO EDS GEM v0.0.1',
|
30
|
+
:log => 'faraday.log',
|
31
|
+
:max_attempts => 2,
|
32
|
+
:max_results_per_page => 100,
|
33
|
+
:ebook_preferred_format => 'ebook-pdf',
|
34
|
+
:use_cache => true,
|
35
|
+
:eds_cache_dir => ENV['TMPDIR'] || '/tmp'
|
36
|
+
}
|
37
|
+
@valid_config_keys = @config.keys
|
38
|
+
end
|
39
|
+
|
40
|
+
def configure(opts = {})
|
41
|
+
opts.each do |k, v|
|
42
|
+
@config[k] = v if @valid_config_keys.include? k
|
43
|
+
end
|
44
|
+
@config
|
45
|
+
end
|
46
|
+
|
47
|
+
def configure_with(file)
|
48
|
+
begin
|
49
|
+
config = YAML.load_file(file ||= 'eds.yaml')
|
50
|
+
rescue Errno::ENOENT
|
51
|
+
#puts 'YAML configuration file couldn\'t be found. Using defaults.'
|
52
|
+
return
|
53
|
+
rescue Psych::SyntaxError
|
54
|
+
#puts 'YAML configuration file contains invalid syntax. Using defaults'
|
55
|
+
return
|
56
|
+
end
|
57
|
+
@config[:file] = file
|
58
|
+
configure(config)
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
end
|
63
|
+
end
|
data/lib/ebsco/eds/info.rb
CHANGED
@@ -7,7 +7,8 @@ module EBSCO
|
|
7
7
|
|
8
8
|
attr_accessor :available_search_criteria, :view_result_settings, :application_settings, :api_settings
|
9
9
|
|
10
|
-
def initialize(info)
|
10
|
+
def initialize(info, config = {})
|
11
|
+
@results_per_page = config[:max_results_per_page] ? config[:max_results_per_page] : 100
|
11
12
|
@available_search_criteria = info['AvailableSearchCriteria']
|
12
13
|
@view_result_settings = info['ViewResultSettings']
|
13
14
|
@application_settings = info['ApplicationSettings']
|
@@ -135,7 +136,7 @@ module EBSCO
|
|
135
136
|
end
|
136
137
|
|
137
138
|
def max_results_per_page
|
138
|
-
|
139
|
+
@results_per_page
|
139
140
|
end
|
140
141
|
|
141
142
|
def available_result_list_views
|
data/lib/ebsco/eds/options.rb
CHANGED
@@ -82,6 +82,7 @@ module EBSCO
|
|
82
82
|
if value.has_key?('content_provider_facet')
|
83
83
|
subj_list = value['content_provider_facet']
|
84
84
|
subj_list.each do |item|
|
85
|
+
item = eds_sanitize item
|
85
86
|
@Actions.push "addfacetfilter(ContentProvider:#{item})"
|
86
87
|
end
|
87
88
|
end
|
@@ -89,6 +90,7 @@ module EBSCO
|
|
89
90
|
if value.has_key?('library_location_facet')
|
90
91
|
subj_list = value['library_location_facet']
|
91
92
|
subj_list.each do |item|
|
93
|
+
item = eds_sanitize item
|
92
94
|
@Actions.push "addfacetfilter(LocationLibrary:#{item})"
|
93
95
|
end
|
94
96
|
end
|
@@ -157,7 +159,13 @@ module EBSCO
|
|
157
159
|
#end
|
158
160
|
end
|
159
161
|
end
|
160
|
-
|
162
|
+
|
163
|
+
def eds_sanitize(str)
|
164
|
+
pattern = /(\'|\"|\.|\*|\/|\-|\\|\)|\$|\+|\(|\^|\?|\!|\~|\`)/
|
165
|
+
str = str.gsub(pattern){ |match| '\\' + match }
|
166
|
+
str
|
167
|
+
end
|
168
|
+
|
161
169
|
# def is_valid_action(action, info)
|
162
170
|
# # actions in info that require an enumerated value (e.g., addlimiter(LA99:Bulgarian))
|
163
171
|
# _available_actions = info.available_actions
|
data/lib/ebsco/eds/record.rb
CHANGED
@@ -40,14 +40,13 @@ module EBSCO
|
|
40
40
|
.fetch('IsPartOfRelationships', {})[0]
|
41
41
|
|
42
42
|
@bibtex = BibTeX::Entry.new
|
43
|
-
@bibtex = retrieve_bibtex
|
44
43
|
end
|
45
44
|
|
46
45
|
# \Options hash containing accession number and database ID. This can be passed to the retrieve method.
|
47
46
|
def retrieve_options
|
48
47
|
options = {}
|
49
|
-
options['an'] =
|
50
|
-
options['dbid'] =
|
48
|
+
options['an'] = accession_number
|
49
|
+
options['dbid'] = database_id
|
51
50
|
options
|
52
51
|
end
|
53
52
|
|
@@ -90,6 +89,7 @@ module EBSCO
|
|
90
89
|
# The source title (e.g., Journal)
|
91
90
|
def source_title
|
92
91
|
_retval = bib_source_title || get_item_data_by_name('TitleSource')
|
92
|
+
_reval = nil? if _retval == title # suppress if it's identical to title
|
93
93
|
_retval.nil?? nil : CGI.unescapeHTML(_retval)
|
94
94
|
end
|
95
95
|
|
@@ -316,12 +316,12 @@ module EBSCO
|
|
316
316
|
|
317
317
|
# A list of all available links.
|
318
318
|
def all_links
|
319
|
-
|
319
|
+
fulltext_links + non_fulltext_links
|
320
320
|
end
|
321
321
|
|
322
322
|
# The first fulltext link.
|
323
323
|
def fulltext_link
|
324
|
-
|
324
|
+
fulltext_links.first || {}
|
325
325
|
end
|
326
326
|
|
327
327
|
# All available fulltext links.
|
@@ -341,13 +341,14 @@ module EBSCO
|
|
341
341
|
end
|
342
342
|
end
|
343
343
|
|
344
|
-
|
345
|
-
|
346
|
-
|
347
|
-
|
348
|
-
|
349
|
-
|
350
|
-
|
344
|
+
# commenting out for now, not sure how 'detail' urls are useful in a blacklight context?
|
345
|
+
# htmlfulltextcheck = @record.fetch('FullText',{}).fetch('Text',{}).fetch('Availability',{})
|
346
|
+
# if htmlfulltextcheck == '1'
|
347
|
+
# link_url = 'detail'
|
348
|
+
# link_label = 'Full Text in Browser'
|
349
|
+
# link_icon = 'Full Text in Browser Icon'
|
350
|
+
# links.push({url: link_url, label: link_label, icon: link_icon, type: 'html'})
|
351
|
+
# end
|
351
352
|
|
352
353
|
if ebscolinks.count > 0
|
353
354
|
ebscolinks.each do |ebscolink|
|
@@ -374,15 +375,19 @@ module EBSCO
|
|
374
375
|
items = @record.fetch('Items',{})
|
375
376
|
if items.count > 0
|
376
377
|
items.each do |item|
|
377
|
-
if item['Group'] == '
|
378
|
+
if item['Group'] == 'URL'
|
378
379
|
if item['Data'].include? 'linkTerm="'
|
379
380
|
link_start = item['Data'].index('linkTerm="')+15
|
380
381
|
link_url = item['Data'][link_start..-1]
|
381
382
|
link_end = link_url.index('"')-1
|
382
383
|
link_url = link_url[0..link_end]
|
383
|
-
|
384
|
-
|
385
|
-
|
384
|
+
if item['Label']
|
385
|
+
link_label = item['Label']
|
386
|
+
else
|
387
|
+
link_label_start = item['Data'].index('link>')+8
|
388
|
+
link_label = item['Data'][link_label_start..-1]
|
389
|
+
link_label = link_label.strip
|
390
|
+
end
|
386
391
|
else
|
387
392
|
link_url = item['Data']
|
388
393
|
link_label = item['Label']
|
@@ -436,85 +441,6 @@ module EBSCO
|
|
436
441
|
#:nodoc: all
|
437
442
|
# No need to document methods below
|
438
443
|
|
439
|
-
# Experimental bibtex support.
|
440
|
-
def retrieve_bibtex
|
441
|
-
|
442
|
-
@bibtex.key = accession_number
|
443
|
-
@bibtex.title = title.gsub('<highlight>', '').gsub('</highlight>', '')
|
444
|
-
if self.bib_authors_list.length > 0
|
445
|
-
@bibtex.author = self.bib_authors_list.join(' and ').chomp
|
446
|
-
end
|
447
|
-
@bibtex.year = self.publication_year.to_i
|
448
|
-
|
449
|
-
# bibtex type
|
450
|
-
_type = self.publication_type
|
451
|
-
case _type
|
452
|
-
when 'Academic Journal'
|
453
|
-
@bibtex.type = :article
|
454
|
-
@bibtex.journal = source_title
|
455
|
-
unless issue.nil?
|
456
|
-
@bibtex.issue = issue
|
457
|
-
end
|
458
|
-
unless volume.nil?
|
459
|
-
@bibtex.number = volume
|
460
|
-
end
|
461
|
-
if page_start && page_count
|
462
|
-
@bibtex.pages = page_start + '-' + (page_start.to_i + page_count.to_i-1).to_s
|
463
|
-
end
|
464
|
-
if self.bib_publication_month
|
465
|
-
@bibtex.month = self.bib_publication_month.to_i
|
466
|
-
end
|
467
|
-
if doi
|
468
|
-
@bibtex.doi = doi
|
469
|
-
@bibtex.url = 'https://doi.org/' + doi
|
470
|
-
end
|
471
|
-
when 'Conference'
|
472
|
-
@bibtex.type = :conference
|
473
|
-
@bibtex.booktitle = self.source_title
|
474
|
-
if self.issue
|
475
|
-
@bibtex.issue = self.issue
|
476
|
-
end
|
477
|
-
if self.volume
|
478
|
-
@bibtex.number = self.volume
|
479
|
-
end
|
480
|
-
if self.page_start && self.page_count
|
481
|
-
@bibtex.pages = self.page_start + '-' + (self.page_start.to_i + self.page_count.to_i-1).to_s
|
482
|
-
end
|
483
|
-
if self.bib_publication_month
|
484
|
-
@bibtex.month = self.bib_publication_month.to_i
|
485
|
-
end
|
486
|
-
if self.publisher_info
|
487
|
-
@bibtex.publisher = self.publisher_info
|
488
|
-
end
|
489
|
-
if self.series
|
490
|
-
@bibtex.series = self.series
|
491
|
-
end
|
492
|
-
when 'Book', 'eBook'
|
493
|
-
@bibtex.type = :book
|
494
|
-
if self.publisher_info
|
495
|
-
@bibtex.publisher = self.publisher_info
|
496
|
-
end
|
497
|
-
if self.series
|
498
|
-
@bibtex.series = self.series
|
499
|
-
end
|
500
|
-
if self.bib_publication_month
|
501
|
-
@bibtex.month = self.bib_publication_month.to_i
|
502
|
-
end
|
503
|
-
if isbns
|
504
|
-
@bibtex.isbn = self.isbns.first
|
505
|
-
end
|
506
|
-
else
|
507
|
-
@bibtex.type = :other
|
508
|
-
end
|
509
|
-
@bibtex
|
510
|
-
end
|
511
|
-
|
512
|
-
def bibtex_bibliography
|
513
|
-
bib = BibTeX::Bibliography.new
|
514
|
-
bib << @bibtex
|
515
|
-
bib
|
516
|
-
end
|
517
|
-
|
518
444
|
# ====================================================================================
|
519
445
|
# HEADER: DbId, DbLabel, An, PubType, PubTypeId, AccessLevel
|
520
446
|
# ====================================================================================
|
@@ -825,14 +751,98 @@ module EBSCO
|
|
825
751
|
end
|
826
752
|
end
|
827
753
|
|
754
|
+
|
755
|
+
# Experimental bibtex support.
|
756
|
+
def retrieve_bibtex
|
757
|
+
|
758
|
+
@bibtex.key = accession_number
|
759
|
+
@bibtex.title = title.gsub('<highlight>', '').gsub('</highlight>', '')
|
760
|
+
if bib_authors_list.length > 0
|
761
|
+
@bibtex.author = bib_authors_list.join(' and ').chomp
|
762
|
+
end
|
763
|
+
@bibtex.year = publication_year.to_i
|
764
|
+
|
765
|
+
# bibtex type
|
766
|
+
_type = publication_type
|
767
|
+
case _type
|
768
|
+
when 'Academic Journal', 'Reference'
|
769
|
+
@bibtex.type = :article
|
770
|
+
@bibtex.journal = source_title
|
771
|
+
unless issue.nil?
|
772
|
+
@bibtex.issue = issue
|
773
|
+
end
|
774
|
+
unless volume.nil?
|
775
|
+
@bibtex.number = volume
|
776
|
+
end
|
777
|
+
if page_start && page_count
|
778
|
+
@bibtex.pages = page_start + '-' + (page_start.to_i + page_count.to_i-1).to_s
|
779
|
+
end
|
780
|
+
if bib_publication_month
|
781
|
+
@bibtex.month = bib_publication_month.to_i
|
782
|
+
end
|
783
|
+
if doi
|
784
|
+
@bibtex.doi = doi
|
785
|
+
@bibtex.url = 'https://doi.org/' + doi
|
786
|
+
end
|
787
|
+
when 'Conference'
|
788
|
+
@bibtex.type = :conference
|
789
|
+
@bibtex.booktitle = source_title
|
790
|
+
if issue
|
791
|
+
@bibtex.issue = issue
|
792
|
+
end
|
793
|
+
if volume
|
794
|
+
@bibtex.number = volume
|
795
|
+
end
|
796
|
+
if page_start && page_count
|
797
|
+
@bibtex.pages = page_start + '-' + (page_start.to_i + page_count.to_i-1).to_s
|
798
|
+
end
|
799
|
+
if bib_publication_month
|
800
|
+
@bibtex.month = bib_publication_month.to_i
|
801
|
+
end
|
802
|
+
if publisher_info
|
803
|
+
@bibtex.publisher = publisher_info
|
804
|
+
end
|
805
|
+
if series
|
806
|
+
@bibtex.series = series
|
807
|
+
end
|
808
|
+
when 'Book', 'eBook'
|
809
|
+
@bibtex.type = :book
|
810
|
+
if publisher_info
|
811
|
+
@bibtex.publisher = publisher_info
|
812
|
+
end
|
813
|
+
if series
|
814
|
+
@bibtex.series = series
|
815
|
+
end
|
816
|
+
if bib_publication_month
|
817
|
+
@bibtex.month = bib_publication_month.to_i
|
818
|
+
end
|
819
|
+
if isbns
|
820
|
+
@bibtex.isbn = isbns.first
|
821
|
+
end
|
822
|
+
else
|
823
|
+
@bibtex.type = :other
|
824
|
+
end
|
825
|
+
@bibtex
|
826
|
+
end
|
827
|
+
|
828
|
+
##
|
829
|
+
# wrap bibtex entry in a bibliography so that it can be transformed into citations using citeproc
|
830
|
+
def bibtex_bibliography
|
831
|
+
bib = BibTeX::Bibliography.new
|
832
|
+
bib << @bibtex
|
833
|
+
bib
|
834
|
+
end
|
835
|
+
|
828
836
|
# this is used to generate solr fields
|
829
|
-
def to_hash
|
837
|
+
def to_hash(type = 'compact')
|
830
838
|
hash = {}
|
839
|
+
|
840
|
+
# information typically required by all views
|
831
841
|
if database_id && accession_number
|
832
842
|
safe_an = accession_number.gsub(/\./,'_')
|
833
843
|
hash['id'] = database_id + '__' + safe_an
|
834
844
|
end
|
835
|
-
|
845
|
+
unless title.nil?
|
836
846
|
hash['title_display'] = title.gsub('<highlight>', '').gsub('</highlight>', '')
|
837
847
|
end
|
838
848
|
if source_title
|
@@ -866,22 +876,36 @@ module EBSCO
|
|
866
876
|
if cover_medium_url
|
867
877
|
hash['cover_medium_url'] = cover_medium_url
|
868
878
|
end
|
869
|
-
if
|
870
|
-
|
879
|
+
# generate bibtex entry if it hasn't been done already
|
880
|
+
if @bibtex.key == 'unknown-a'
|
881
|
+
@bibtex = retrieve_bibtex
|
871
882
|
end
|
872
883
|
unless @bibtex.has_type?(:other)
|
873
884
|
hash['citation_apa'] = citation('apa').first.to_s
|
874
885
|
hash['citation_mla'] = citation('modern-language-association').first.to_s
|
875
886
|
hash['citation_chicago'] = citation('chicago-author-date').first.to_s
|
876
887
|
end
|
877
|
-
|
878
|
-
|
888
|
+
|
889
|
+
# extra information typically required by detailed item views
|
890
|
+
if type == 'verbose'
|
891
|
+
if all_links
|
892
|
+
hash['links'] = all_links
|
893
|
+
end
|
894
|
+
if doi
|
895
|
+
hash['doi'] = doi
|
896
|
+
end
|
897
|
+
if html_fulltext
|
898
|
+
hash['html_fulltext'] = html_fulltext
|
899
|
+
end
|
879
900
|
end
|
901
|
+
|
880
902
|
hash
|
881
903
|
end
|
882
904
|
|
883
905
|
def to_solr
|
884
906
|
# solr response
|
907
|
+
item_hash = to_hash 'verbose'
|
908
|
+
solr_response =
|
885
909
|
{
|
886
910
|
'responseHeader' => {
|
887
911
|
'status' => 0
|
@@ -889,12 +913,18 @@ module EBSCO
|
|
889
913
|
'response' => {
|
890
914
|
'numFound' => 1,
|
891
915
|
'start' => 0,
|
892
|
-
'docs' => [
|
916
|
+
'docs' => [item_hash]
|
893
917
|
}
|
894
918
|
}
|
919
|
+
# puts 'SOLR RESPONSE: ' + solr_response.inspect
|
920
|
+
solr_response
|
895
921
|
end
|
896
922
|
|
897
923
|
def citation(style = 'apa')
|
924
|
+
# generate bibtex entry if it hasn't been done already
|
925
|
+
if @bibtex.key == 'unknown-a'
|
926
|
+
@bibtex = retrieve_bibtex
|
927
|
+
end
|
898
928
|
# TODO: catch CSL::ParseError when style can't be found
|
899
929
|
CSL::Style.root = File.join(__dir__, 'csl/styles')
|
900
930
|
cp = CiteProc::Processor.new style: style, format: 'text'
|
data/lib/ebsco/eds/session.rb
CHANGED
@@ -7,6 +7,7 @@ require 'logger'
|
|
7
7
|
require 'json'
|
8
8
|
require 'active_support'
|
9
9
|
require 'faraday_eds_middleware'
|
10
|
+
require 'ebsco/eds/configuration'
|
10
11
|
|
11
12
|
module EBSCO
|
12
13
|
|
@@ -23,6 +24,8 @@ module EBSCO
|
|
23
24
|
attr_accessor :auth_token # :nodoc:
|
24
25
|
# The session token. This is passed along in the x-sessionToken HTTP header.
|
25
26
|
attr_accessor :session_token # :nodoc:
|
27
|
+
# The session configuration.
|
28
|
+
attr_reader :config
|
26
29
|
|
27
30
|
# Creates a new session.
|
28
31
|
#
|
@@ -59,14 +62,20 @@ module EBSCO
|
|
59
62
|
# }
|
60
63
|
def initialize(options = {})
|
61
64
|
|
62
|
-
|
63
|
-
cache_dir = File.join(ENV['TMPDIR'] || '/tmp', 'faraday_eds_cache')
|
64
|
-
@cache_store = ActiveSupport::Cache::FileStore.new cache_dir
|
65
|
-
|
66
65
|
@session_token = ''
|
67
66
|
@auth_token = ''
|
68
|
-
@
|
67
|
+
@config = {}
|
69
68
|
|
69
|
+
eds_config = EBSCO::EDS::Configuration.new
|
70
|
+
if options[:config]
|
71
|
+
@config = eds_config.configure_with(options[:config])
|
72
|
+
# return default if there is some problem with the yaml file (bad syntax, not found, etc.)
|
73
|
+
@config = eds_config.configure if @config.nil?
|
74
|
+
else
|
75
|
+
@config = eds_config.configure(options)
|
76
|
+
end
|
77
|
+
|
78
|
+
# these properties aren't in the config
|
70
79
|
if options.has_key? :user
|
71
80
|
@user = options[:user]
|
72
81
|
elsif ENV.has_key? 'EDS_USER'
|
@@ -86,27 +95,18 @@ module EBSCO
|
|
86
95
|
end
|
87
96
|
raise EBSCO::EDS::InvalidParameter, 'Session must specify a valid api profile.' if blank?(@profile)
|
88
97
|
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
end
|
98
|
+
# these config options can be overridden by environment vars
|
99
|
+
@auth_type = (ENV.has_key? 'EDS_AUTH') ? ENV['EDS_AUTH'] : @config[:auth]
|
100
|
+
@guest = (ENV.has_key? 'EDS_GUEST') ? ENV['EDS_GUEST'] : @config[:guest]
|
101
|
+
@org = (ENV.has_key? 'EDS_ORG') ? ENV['EDS_ORG'] : @config[:org]
|
94
102
|
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
@
|
103
|
+
# use cache for auth token and info calls?
|
104
|
+
if @config[:use_cache]
|
105
|
+
cache_dir = File.join(@config[:eds_cache_dir], 'faraday_eds_cache')
|
106
|
+
@cache_store = ActiveSupport::Cache::FileStore.new cache_dir
|
99
107
|
end
|
100
108
|
|
101
|
-
|
102
|
-
@auth_type = options[:auth]
|
103
|
-
elsif ENV.has_key? 'EDS_AUTH'
|
104
|
-
@auth_type = ENV['EDS_AUTH']
|
105
|
-
else
|
106
|
-
@auth_type = 'user'
|
107
|
-
end
|
108
|
-
|
109
|
-
@max_retries = MAX_ATTEMPTS
|
109
|
+
@max_retries = @config[:max_attempts]
|
110
110
|
|
111
111
|
if options.has_key? :auth_token
|
112
112
|
@auth_token = options[:auth_token]
|
@@ -119,18 +119,18 @@ module EBSCO
|
|
119
119
|
else
|
120
120
|
@session_token = create_session_token
|
121
121
|
end
|
122
|
-
|
123
|
-
@info = EBSCO::EDS::Info.new(do_request(:get, path: INFO_URL))
|
122
|
+
@info = EBSCO::EDS::Info.new(do_request(:get, path: @config[:info_url]), @config)
|
124
123
|
@current_page = 0
|
125
124
|
@search_options = nil
|
126
125
|
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
126
|
+
if @config[:debug]
|
127
|
+
if options.key? :caller
|
128
|
+
puts 'CREATE SESSION CALLER: ' + options[:caller].inspect
|
129
|
+
puts 'CALLER OPTIONS: ' + options.inspect
|
130
|
+
end
|
131
|
+
puts 'AUTH TOKEN: ' + @auth_token.inspect
|
132
|
+
puts 'SESSION TOKEN: ' + @session_token.inspect
|
133
|
+
end
|
134
134
|
|
135
135
|
end
|
136
136
|
|
@@ -168,7 +168,7 @@ module EBSCO
|
|
168
168
|
if @search_options.nil?
|
169
169
|
@search_results = EBSCO::EDS::Results.new(empty_results)
|
170
170
|
else
|
171
|
-
_response = do_request(:post, path:
|
171
|
+
_response = do_request(:post, path: @config[:search_url], payload: @search_options)
|
172
172
|
@search_results = EBSCO::EDS::Results.new(_response, @info.available_limiters, options)
|
173
173
|
@current_page = @search_results.page_number
|
174
174
|
@search_results
|
@@ -181,7 +181,7 @@ module EBSCO
|
|
181
181
|
if @search_options.nil? || !add_actions
|
182
182
|
@search_options = EBSCO::EDS::Options.new(options, @info)
|
183
183
|
end
|
184
|
-
_response = do_request(:post, path:
|
184
|
+
_response = do_request(:post, path: @config[:search_url], payload: @search_options)
|
185
185
|
@search_results = EBSCO::EDS::Results.new(_response, @info.available_limiters, options)
|
186
186
|
@current_page = @search_results.page_number
|
187
187
|
@search_results
|
@@ -223,20 +223,20 @@ module EBSCO
|
|
223
223
|
#
|
224
224
|
def retrieve(dbid:, an:, highlight: nil, ebook: 'ebook-pdf')
|
225
225
|
payload = { DbId: dbid, An: an, HighlightTerms: highlight, EbookPreferredFormat: ebook }
|
226
|
-
retrieve_response = do_request(:post, path:
|
226
|
+
retrieve_response = do_request(:post, path: @config[:retrieve_url], payload: payload)
|
227
227
|
record = EBSCO::EDS::Record.new(retrieve_response)
|
228
228
|
# puts 'RECORD: ' + record.pretty_inspect
|
229
229
|
record
|
230
230
|
end
|
231
231
|
|
232
|
-
def solr_retrieve_list(list: [], highlight: nil
|
232
|
+
def solr_retrieve_list(list: [], highlight: nil)
|
233
233
|
records = []
|
234
234
|
if list.any?
|
235
235
|
list.each { |id|
|
236
236
|
dbid = id.split('__').first
|
237
237
|
accession = id.split('__').last
|
238
238
|
accession.gsub!(/_/, '.')
|
239
|
-
records.push retrieve(dbid: dbid, an: accession, highlight: highlight, ebook:
|
239
|
+
records.push retrieve(dbid: dbid, an: accession, highlight: highlight, ebook: @config[:ebook_preferred_format])
|
240
240
|
}
|
241
241
|
end
|
242
242
|
r = empty_results(records.length)
|
@@ -249,7 +249,7 @@ module EBSCO
|
|
249
249
|
# Invalidates the session token. End Session should be called when you know a user has logged out.
|
250
250
|
def end
|
251
251
|
# todo: catch when there is no valid session?
|
252
|
-
do_request(:post, path:
|
252
|
+
do_request(:post, path: @config[:end_session_url], payload: {:SessionToken => @session_token})
|
253
253
|
connection.headers['x-sessionToken'] = ''
|
254
254
|
@session_token = ''
|
255
255
|
end
|
@@ -555,10 +555,9 @@ module EBSCO
|
|
555
555
|
|
556
556
|
def do_request(method, path:, payload: nil, attempt: 0) # :nodoc:
|
557
557
|
|
558
|
-
if attempt >
|
558
|
+
if attempt > @config[:max_attempts]
|
559
559
|
raise EBSCO::EDS::ApiError, 'EBSCO API error: Multiple attempts to perform request failed.'
|
560
560
|
end
|
561
|
-
|
562
561
|
begin
|
563
562
|
resp = connection.send(method) do |req|
|
564
563
|
case method
|
@@ -574,7 +573,7 @@ module EBSCO
|
|
574
573
|
end
|
575
574
|
end
|
576
575
|
resp.body
|
577
|
-
rescue
|
576
|
+
rescue Error => e
|
578
577
|
if e.respond_to? 'fault'
|
579
578
|
error_code = e.fault[:error_body]['ErrorNumber'] || e.fault[:error_body]['ErrorCode']
|
580
579
|
unless error_code.nil?
|
@@ -640,16 +639,17 @@ module EBSCO
|
|
640
639
|
private
|
641
640
|
|
642
641
|
def connection
|
643
|
-
logger = Logger.new(
|
642
|
+
logger = Logger.new(@config[:log])
|
644
643
|
logger.level = Logger::DEBUG
|
645
|
-
Faraday.new(url:
|
644
|
+
Faraday.new(url: @config[:eds_api_base]) do |conn|
|
646
645
|
conn.headers['Content-Type'] = 'application/json;charset=UTF-8'
|
647
646
|
conn.headers['Accept'] = 'application/json'
|
648
647
|
conn.headers['x-sessionToken'] = @session_token ? @session_token : ''
|
649
648
|
conn.headers['x-authenticationToken'] = @auth_token ? @auth_token : ''
|
650
|
-
conn.headers['User-Agent'] =
|
649
|
+
conn.headers['User-Agent'] = @config[:user_agent]
|
651
650
|
conn.request :url_encoded
|
652
|
-
conn.use :
|
651
|
+
conn.use :eds_caching_middleware, store: @cache_store if @config[:use_cache]
|
652
|
+
conn.use :eds_exception_middleware
|
653
653
|
conn.response :json, content_type: /\bjson$/
|
654
654
|
conn.response :logger, logger
|
655
655
|
conn.adapter Faraday.default_adapter
|
@@ -660,10 +660,10 @@ module EBSCO
|
|
660
660
|
if blank?(@auth_token)
|
661
661
|
# ip auth
|
662
662
|
if (blank?(@user) && blank?(@pass)) || @auth_type.casecmp('ip').zero?
|
663
|
-
resp = do_request(:post, path:
|
663
|
+
resp = do_request(:post, path: @config[:ip_auth_url])
|
664
664
|
# user auth
|
665
665
|
else
|
666
|
-
resp = do_request(:post, path:
|
666
|
+
resp = do_request(:post, path: @config[:uid_auth_url], payload:
|
667
667
|
{ UserId: @user, Password: @pass })
|
668
668
|
end
|
669
669
|
end
|
@@ -672,7 +672,7 @@ module EBSCO
|
|
672
672
|
end
|
673
673
|
|
674
674
|
def create_session_token
|
675
|
-
resp = do_request(:get, path:
|
675
|
+
resp = do_request(:get, path: @config[:create_session_url] +
|
676
676
|
'?profile=' + @profile + '&guest=' + @guest +
|
677
677
|
'&displaydatabasename=y')
|
678
678
|
@session_token = resp['SessionToken']
|
data/lib/ebsco/eds/version.rb
CHANGED
@@ -2,7 +2,7 @@ require 'faraday'
|
|
2
2
|
|
3
3
|
module Faraday
|
4
4
|
|
5
|
-
class
|
5
|
+
class EdsCachingMiddleware < Faraday::Middleware
|
6
6
|
|
7
7
|
INFO_URI = URI.parse('https://eds-api.ebscohost.com/edsapi/rest/Info')
|
8
8
|
AUTH_URI = URI.parse('https://eds-api.ebscohost.com/authservice/rest/uidauth')
|
@@ -35,27 +35,8 @@ module Faraday
|
|
35
35
|
to_response(response_env)
|
36
36
|
else
|
37
37
|
@app.call(env).on_complete do |response_env|
|
38
|
-
|
39
|
-
|
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
|
38
|
+
response_env.response_headers['x-faraday-eds-cache'] = 'MISS'
|
39
|
+
cache_response(response_env)
|
59
40
|
end
|
60
41
|
end
|
61
42
|
end
|
@@ -130,14 +111,5 @@ module Faraday
|
|
130
111
|
env.response = response
|
131
112
|
end
|
132
113
|
|
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
114
|
end
|
143
115
|
end
|
@@ -0,0 +1,49 @@
|
|
1
|
+
require 'faraday'
|
2
|
+
|
3
|
+
module Faraday
|
4
|
+
|
5
|
+
class EdsExceptionMiddleware < 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,7 +1,7 @@
|
|
1
|
-
require 'faraday/
|
1
|
+
require 'faraday/eds_caching_middleware'
|
2
|
+
require 'faraday/eds_exception_middleware'
|
2
3
|
|
3
|
-
if Faraday.respond_to?(:register_middleware)
|
4
|
-
Faraday.register_middleware
|
5
|
-
|
6
|
-
Faraday::Middleware.register_middleware eds_middleware: Faraday::EdsMiddleware
|
4
|
+
if Faraday::Middleware.respond_to?(:register_middleware)
|
5
|
+
Faraday::Middleware.register_middleware eds_caching_middleware: Faraday::EdsCachingMiddleware
|
6
|
+
Faraday::Middleware.register_middleware eds_exception_middleware: Faraday::EdsExceptionMiddleware
|
7
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.1.0.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-04-
|
12
|
+
date: 2017-04-13 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: faraday
|
@@ -300,6 +300,7 @@ files:
|
|
300
300
|
- bin/setup
|
301
301
|
- ebsco-eds.gemspec
|
302
302
|
- lib/ebsco/eds.rb
|
303
|
+
- lib/ebsco/eds/configuration.rb
|
303
304
|
- lib/ebsco/eds/csl/styles/apa.csl
|
304
305
|
- lib/ebsco/eds/csl/styles/chicago-author-date.csl
|
305
306
|
- lib/ebsco/eds/csl/styles/modern-language-association.csl
|
@@ -311,7 +312,8 @@ files:
|
|
311
312
|
- lib/ebsco/eds/results.rb
|
312
313
|
- lib/ebsco/eds/session.rb
|
313
314
|
- lib/ebsco/eds/version.rb
|
314
|
-
- lib/faraday/
|
315
|
+
- lib/faraday/eds_caching_middleware.rb
|
316
|
+
- lib/faraday/eds_exception_middleware.rb
|
315
317
|
- lib/faraday_eds_middleware.rb
|
316
318
|
homepage: https://github.com/ebsco/edsapi-ruby
|
317
319
|
licenses:
|