ebsco-discovery-service-api 1.1.10 → 1.1.12
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 +8 -8
- data/lib/ebsco-discovery-service-api.rb +997 -32
- metadata +3 -3
checksums.yaml
CHANGED
|
@@ -1,15 +1,15 @@
|
|
|
1
1
|
---
|
|
2
2
|
!binary "U0hBMQ==":
|
|
3
3
|
metadata.gz: !binary |-
|
|
4
|
-
|
|
4
|
+
NzMzM2U3MTFlNzlkNzA4NzlkNWJkYzM3ZDdjMTZmZjI5MDJiNGY5NQ==
|
|
5
5
|
data.tar.gz: !binary |-
|
|
6
|
-
|
|
6
|
+
OTlmY2E0MWU5MTJiMjlkN2U3ZDE3NmFlOTFjNzU0MmJlZTYzOWI2NQ==
|
|
7
7
|
SHA512:
|
|
8
8
|
metadata.gz: !binary |-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
9
|
+
NjkyOGNlOWYxMzViMGRmOWI2Mjk5NTM5ZjJjM2MzYWQzOWIzMDAxYmQxYTll
|
|
10
|
+
NTIxNDgxZTU5YTcwYzA2OTI1YmZmZGM3YmJmZjg2M2ZhMGY0YTM3OGFjYzI5
|
|
11
|
+
OWJmNWQzYmU0YTg4ZTlhMWEzOGE0ZWZhYWMxMDgxZjc4YjJiNWY=
|
|
12
12
|
data.tar.gz: !binary |-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
13
|
+
ZjE2MTQ4MWE3NzYzZmM1M2JkMWJhOTFjMGM1NjE2ODY1MDgzM2UyNjJkZWFh
|
|
14
|
+
MWEwMzljOTExYTE3MTNjNDc1OWZjMWFjNTI2ZDI5YjE0MTkwOWVlYjdlZGI1
|
|
15
|
+
Njc0MDA3NGY4NzgwZWQwYmMxNTIyMThjNzNjNzdlMzQ2NDRmODg=
|
|
@@ -2,21 +2,932 @@ require 'net/http'
|
|
|
2
2
|
require 'cgi'
|
|
3
3
|
require 'json'
|
|
4
4
|
|
|
5
|
-
#
|
|
6
|
-
#
|
|
7
|
-
# http://www.lh2cc.net/dse/efrierson/ruby/eds-alpha-demo.zip
|
|
5
|
+
#TO DO: Finish publication Exact Match object - probably needs to be a subclass of EDSAPIRecord
|
|
6
|
+
#TO DO: Finish Detailed Records
|
|
8
7
|
|
|
9
8
|
module EDSApi
|
|
10
|
-
|
|
9
|
+
|
|
11
10
|
API_URL = "http://eds-api.ebscohost.com/"
|
|
12
11
|
API_URL_S = "https://eds-api.ebscohost.com/"
|
|
13
|
-
|
|
12
|
+
|
|
13
|
+
DB_LABEL_LOOKUP = {}
|
|
14
|
+
DB_LABEL_LOOKUP["EDB"] = "Publisher Provided Full Text Searching File"
|
|
15
|
+
DB_LABEL_LOOKUP["EDO"] = "Supplemental Index"
|
|
16
|
+
DB_LABEL_LOOKUP["ASX"] = "Academic Search Index"
|
|
17
|
+
DB_LABEL_LOOKUP["A9H"] = "Academic Search Complete"
|
|
18
|
+
DB_LABEL_LOOKUP["APH"] = "Academic Search Premier"
|
|
19
|
+
DB_LABEL_LOOKUP["AFH"] = "Academic Search Elite"
|
|
20
|
+
DB_LABEL_LOOKUP["A2H"] = "Academic Search Alumni Edition"
|
|
21
|
+
DB_LABEL_LOOKUP["ASM"] = "Academic Search Main Edition"
|
|
22
|
+
DB_LABEL_LOOKUP["ASR"] = "STM Source"
|
|
23
|
+
DB_LABEL_LOOKUP["BSX"] = "Business Source Index"
|
|
24
|
+
DB_LABEL_LOOKUP["EDSEBK"] = "Discovery eBooks"
|
|
25
|
+
DB_LABEL_LOOKUP["VTH"] = "Art & Architecture Complete"
|
|
26
|
+
DB_LABEL_LOOKUP["IIH"] = "Computers & Applied Sciences Complete"
|
|
27
|
+
DB_LABEL_LOOKUP["CMH"] = "Consumer Health Complete - CHC Platform"
|
|
28
|
+
DB_LABEL_LOOKUP["C9H"] = "Consumer Health Complete - EBSCOhost"
|
|
29
|
+
DB_LABEL_LOOKUP["EOAH"] = "E-Journals Database"
|
|
30
|
+
DB_LABEL_LOOKUP["EHH"] = "Education Research Complete"
|
|
31
|
+
DB_LABEL_LOOKUP["HCH"] = "Health Source: Nursing/Academic"
|
|
32
|
+
DB_LABEL_LOOKUP["HXH"] = "Health Source: Consumer Edition"
|
|
33
|
+
DB_LABEL_LOOKUP["HLH"] = "Humanities International Complete"
|
|
34
|
+
DB_LABEL_LOOKUP["LGH"] = "Legal Collection"
|
|
35
|
+
DB_LABEL_LOOKUP["SLH"] = "Sociological Collection"
|
|
36
|
+
DB_LABEL_LOOKUP["CPH"] = "Computer Source"
|
|
37
|
+
DB_LABEL_LOOKUP["PBH"] = "Psychology & Behavioral Sciences Collection"
|
|
38
|
+
DB_LABEL_LOOKUP["RLH"] = "Religion & Philosophy Collection"
|
|
39
|
+
DB_LABEL_LOOKUP["NFH"] = "Newspaper Source"
|
|
40
|
+
DB_LABEL_LOOKUP["N5H"] = "Newspaper Source Plus"
|
|
41
|
+
DB_LABEL_LOOKUP["BWH"] = "Regional Business News"
|
|
42
|
+
DB_LABEL_LOOKUP["OFM"] = "OmniFile Full Text Mega"
|
|
43
|
+
DB_LABEL_LOOKUP["RSS"] = "Rehabilitation & Sports Medicine Source"
|
|
44
|
+
DB_LABEL_LOOKUP["SYH"] = "Science & Technology Collection"
|
|
45
|
+
DB_LABEL_LOOKUP["SCF"] = "Science Full Text Select"
|
|
46
|
+
DB_LABEL_LOOKUP["HEH"] = "Health Business Elite"
|
|
47
|
+
|
|
48
|
+
class EDSAPIRecord
|
|
49
|
+
|
|
50
|
+
attr_accessor :record
|
|
51
|
+
|
|
52
|
+
def initialize(results_record)
|
|
53
|
+
@record = results_record;
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
def resultid
|
|
57
|
+
@record["ResultId"]
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
def an
|
|
61
|
+
@record["Header"]["An"].to_s
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
def dbid
|
|
65
|
+
@record["Header"]["DbId"].to_s
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
def plink
|
|
69
|
+
@record["Header"]["PLink"]
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
def score
|
|
73
|
+
@record["Header"]["RelevancyScore"]
|
|
74
|
+
end
|
|
75
|
+
|
|
76
|
+
def pubtype
|
|
77
|
+
@record["Header"]["PubType"]
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
def pubtype_id
|
|
81
|
+
@record["Header"]["PubTypeId"]
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
def db_label
|
|
85
|
+
if DB_LABEL_LOOKUP.key?(self.dbid.upcase)
|
|
86
|
+
dblabel = DB_LABEL_LOOKUP[self.dbid.upcase];
|
|
87
|
+
else
|
|
88
|
+
dblabel = @record["Header"]["DbLabel"]
|
|
89
|
+
end
|
|
90
|
+
end
|
|
91
|
+
|
|
92
|
+
def images (size_requested = "all")
|
|
93
|
+
returned_images = []
|
|
94
|
+
|
|
95
|
+
images = @record.fetch('ImageInfo', {})
|
|
96
|
+
if images.count > 0
|
|
97
|
+
images.each do |image|
|
|
98
|
+
if size_requested == image["Size"] || size_requested == "all"
|
|
99
|
+
returned_images.push({size: image["Size"], src: image["Target"]})
|
|
100
|
+
end
|
|
101
|
+
end
|
|
102
|
+
end
|
|
103
|
+
return returned_images
|
|
104
|
+
end
|
|
105
|
+
|
|
106
|
+
def title
|
|
107
|
+
items = @record.fetch('Items',{})
|
|
108
|
+
if items.count > 0
|
|
109
|
+
items.each do |item|
|
|
110
|
+
if item["Group"] == "Ti"
|
|
111
|
+
return item["Data"]
|
|
112
|
+
end
|
|
113
|
+
end
|
|
114
|
+
end
|
|
115
|
+
|
|
116
|
+
titles = @record.fetch('RecordInfo', {}).fetch('BibRecord', {}).fetch('BibEntity', {}).fetch('Titles', {})
|
|
117
|
+
if titles.count > 0
|
|
118
|
+
titles.each do |title|
|
|
119
|
+
if title["Type"] == "main"
|
|
120
|
+
return title["TitleFull"]
|
|
121
|
+
end
|
|
122
|
+
end
|
|
123
|
+
end
|
|
124
|
+
|
|
125
|
+
return nil
|
|
126
|
+
end
|
|
127
|
+
|
|
128
|
+
def title_raw
|
|
129
|
+
titles = @record.fetch('RecordInfo', {}).fetch('BibRecord', {}).fetch('BibEntity', {}).fetch('Titles', {})
|
|
130
|
+
if titles.count > 0
|
|
131
|
+
titles.each do |title|
|
|
132
|
+
if title["Type"] == "main"
|
|
133
|
+
return title["TitleFull"]
|
|
134
|
+
end
|
|
135
|
+
end
|
|
136
|
+
end
|
|
137
|
+
items = @record.fetch('Items',{})
|
|
138
|
+
if items.count > 0
|
|
139
|
+
items.each do |item|
|
|
140
|
+
if item["Group"] == "Ti"
|
|
141
|
+
return item["Data"]
|
|
142
|
+
end
|
|
143
|
+
end
|
|
144
|
+
end
|
|
145
|
+
return nil
|
|
146
|
+
end
|
|
147
|
+
#end title_raw
|
|
148
|
+
|
|
149
|
+
def authors
|
|
150
|
+
|
|
151
|
+
items = @record.fetch('Items',{})
|
|
152
|
+
if items.count > 0
|
|
153
|
+
items.each do |item|
|
|
154
|
+
if item["Group"] == "Au"
|
|
155
|
+
return item["Data"]
|
|
156
|
+
end
|
|
157
|
+
end
|
|
158
|
+
end
|
|
159
|
+
|
|
160
|
+
contributors = @record.fetch('RecordInfo', {}).fetch('BibRecord', {}).fetch('BibRelationships', {}).fetch('HasContributorRelationships', {})
|
|
161
|
+
|
|
162
|
+
if contributors.count > 0
|
|
163
|
+
authors = []
|
|
164
|
+
contributors.each do |contributor|
|
|
165
|
+
names = contributor.fetch('PersonEntity',{})
|
|
166
|
+
authors.push(names['Name']['NameFull'])
|
|
167
|
+
end
|
|
168
|
+
author_str = authors.join("; ")
|
|
169
|
+
return author_str
|
|
170
|
+
end
|
|
171
|
+
|
|
172
|
+
return nil
|
|
173
|
+
end
|
|
174
|
+
|
|
175
|
+
def authors_raw
|
|
176
|
+
|
|
177
|
+
contributors = @record.fetch('RecordInfo', {}).fetch('BibRecord', {}).fetch('BibRelationships', {}).fetch('HasContributorRelationships', {})
|
|
178
|
+
|
|
179
|
+
if contributors.count > 0
|
|
180
|
+
authors = []
|
|
181
|
+
contributors.each do |contributor|
|
|
182
|
+
names = contributor.fetch('PersonEntity',{})
|
|
183
|
+
authors.push(names['Name']['NameFull'])
|
|
184
|
+
end
|
|
185
|
+
return authors
|
|
186
|
+
end
|
|
187
|
+
|
|
188
|
+
items = @record.fetch('Items',{})
|
|
189
|
+
if items.count > 0
|
|
190
|
+
items.each do |item|
|
|
191
|
+
if item["Group"] == "Au"
|
|
192
|
+
return [item["Data"]]
|
|
193
|
+
end
|
|
194
|
+
end
|
|
195
|
+
end
|
|
196
|
+
|
|
197
|
+
return []
|
|
198
|
+
end
|
|
199
|
+
|
|
200
|
+
|
|
201
|
+
def subjects
|
|
202
|
+
|
|
203
|
+
items = @record.fetch('Items',{})
|
|
204
|
+
if items.count > 0
|
|
205
|
+
items.each do |item|
|
|
206
|
+
if item["Group"] == "Su"
|
|
207
|
+
return item["Data"]
|
|
208
|
+
end
|
|
209
|
+
end
|
|
210
|
+
end
|
|
211
|
+
|
|
212
|
+
subjects = @record.fetch('RecordInfo', {}).fetch('BibRecord', {}).fetch('BibEntity', {}).fetch('Subjects', {})
|
|
213
|
+
|
|
214
|
+
if subjects.count > 0
|
|
215
|
+
subs = []
|
|
216
|
+
subjects.each do |subject|
|
|
217
|
+
subs.push(subject["SubjectFull"])
|
|
218
|
+
end
|
|
219
|
+
subs_str = subs.join("; ")
|
|
220
|
+
return subs_str
|
|
221
|
+
end
|
|
222
|
+
|
|
223
|
+
return nil
|
|
224
|
+
end
|
|
225
|
+
|
|
226
|
+
def subjects_raw
|
|
227
|
+
|
|
228
|
+
subjects = @record.fetch('RecordInfo', {}).fetch('BibRecord', {}).fetch('BibEntity', {}).fetch('Subjects', {})
|
|
229
|
+
|
|
230
|
+
if subjects.count > 0
|
|
231
|
+
subs = []
|
|
232
|
+
subjects.each do |subject|
|
|
233
|
+
subs.push(subject)
|
|
234
|
+
end
|
|
235
|
+
return subs
|
|
236
|
+
end
|
|
237
|
+
|
|
238
|
+
items = @record.fetch('Items',{})
|
|
239
|
+
if items.count > 0
|
|
240
|
+
items.each do |item|
|
|
241
|
+
if item["Group"] == "Su"
|
|
242
|
+
return [item["Data"]]
|
|
243
|
+
end
|
|
244
|
+
end
|
|
245
|
+
end
|
|
246
|
+
|
|
247
|
+
return []
|
|
248
|
+
end
|
|
249
|
+
|
|
250
|
+
def languages
|
|
251
|
+
language_section = @record.fetch('RecordInfo', {}).fetch('BibRecord', {}).fetch('BibEntity', {}).fetch('Languages', {})
|
|
252
|
+
|
|
253
|
+
if language_section.count > 0
|
|
254
|
+
langs = []
|
|
255
|
+
language_section.each do |language|
|
|
256
|
+
langs.push(language["Text"])
|
|
257
|
+
end
|
|
258
|
+
return langs
|
|
259
|
+
end
|
|
260
|
+
return []
|
|
261
|
+
end
|
|
262
|
+
|
|
263
|
+
def pages
|
|
264
|
+
pagination_section = @record.fetch('RecordInfo', {}).fetch('BibRecord', {}).fetch('BibEntity', {}).fetch('PhysicalDescription', {})
|
|
265
|
+
|
|
266
|
+
if pagination_section.count > 0
|
|
267
|
+
return pagination_section["Pagination"]
|
|
268
|
+
end
|
|
269
|
+
return {}
|
|
270
|
+
end
|
|
271
|
+
|
|
272
|
+
def abstract
|
|
273
|
+
items = @record.fetch('Items',{})
|
|
274
|
+
if items.count > 0
|
|
275
|
+
items.each do |item|
|
|
276
|
+
if item["Group"] == "Ab"
|
|
277
|
+
return item["Data"]
|
|
278
|
+
end
|
|
279
|
+
end
|
|
280
|
+
end
|
|
281
|
+
|
|
282
|
+
return nil
|
|
283
|
+
end
|
|
284
|
+
|
|
285
|
+
def html_fulltext
|
|
286
|
+
htmlfulltextcheck = @record.fetch('FullText',{}).fetch('Text',{}).fetch('Availability',0)
|
|
287
|
+
if htmlfulltextcheck == "1"
|
|
288
|
+
return @record.fetch('FullText',{}).fetch('Text',{})["Value"]
|
|
289
|
+
end
|
|
290
|
+
return nil
|
|
291
|
+
end
|
|
292
|
+
|
|
293
|
+
def source
|
|
294
|
+
|
|
295
|
+
items = @record.fetch('Items',{})
|
|
296
|
+
if items.count > 0
|
|
297
|
+
items.each do |item|
|
|
298
|
+
if item["Group"] == "Src"
|
|
299
|
+
return item["Data"]
|
|
300
|
+
end
|
|
301
|
+
end
|
|
302
|
+
end
|
|
303
|
+
|
|
304
|
+
return nil
|
|
305
|
+
end
|
|
306
|
+
|
|
307
|
+
def source_title
|
|
308
|
+
|
|
309
|
+
unless self.source.nil?
|
|
310
|
+
ispartof = @record.fetch('RecordInfo', {}).fetch('BibRecord', {}).fetch('BibRelationships', {}).fetch('IsPartOfRelationships', {})
|
|
311
|
+
|
|
312
|
+
if ispartof.count > 0
|
|
313
|
+
ispartof.each do |contributor|
|
|
314
|
+
titles = contributor.fetch('BibEntity',{}).fetch('Titles',{})
|
|
315
|
+
titles.each do |title_src|
|
|
316
|
+
if title_src["Type"] == "main"
|
|
317
|
+
return title_src["TitleFull"]
|
|
318
|
+
end
|
|
319
|
+
end
|
|
320
|
+
end
|
|
321
|
+
end
|
|
322
|
+
end
|
|
323
|
+
return nil
|
|
324
|
+
|
|
325
|
+
end
|
|
326
|
+
|
|
327
|
+
def numbering
|
|
328
|
+
ispartof = @record.fetch('RecordInfo', {}).fetch('BibRecord', {}).fetch('BibRelationships', {}).fetch('IsPartOfRelationships', {})
|
|
329
|
+
|
|
330
|
+
if ispartof.count > 0
|
|
331
|
+
numbering = []
|
|
332
|
+
ispartof.each do |contributor|
|
|
333
|
+
nums = contributor.fetch('BibEntity',{}).fetch('Numbering',{})
|
|
334
|
+
nums.each do |num|
|
|
335
|
+
numbering.push(num)
|
|
336
|
+
end
|
|
337
|
+
end
|
|
338
|
+
return numbering
|
|
339
|
+
end
|
|
340
|
+
|
|
341
|
+
return []
|
|
342
|
+
end
|
|
343
|
+
|
|
344
|
+
def doi
|
|
345
|
+
ispartof = @record.fetch('RecordInfo', {}).fetch('BibRecord', {}).fetch('BibEntity', {}).fetch('Identifiers', {})
|
|
346
|
+
|
|
347
|
+
if ispartof.count > 0
|
|
348
|
+
ispartof.each do |ids|
|
|
349
|
+
if ids["Type"] == "doi"
|
|
350
|
+
return ids["Value"]
|
|
351
|
+
end
|
|
352
|
+
end
|
|
353
|
+
end
|
|
354
|
+
|
|
355
|
+
return nil
|
|
356
|
+
end
|
|
357
|
+
|
|
358
|
+
def isbns
|
|
359
|
+
|
|
360
|
+
ispartof = @record.fetch('RecordInfo', {}).fetch('BibRecord', {}).fetch('BibRelationships', {}).fetch('IsPartOfRelationships', {})
|
|
361
|
+
|
|
362
|
+
if ispartof.count > 0
|
|
363
|
+
issns = []
|
|
364
|
+
ispartof.each do |part_of|
|
|
365
|
+
ids = part_of.fetch('BibEntity',{}).fetch('Identifiers',{})
|
|
366
|
+
ids.each do |id|
|
|
367
|
+
if id["Type"].include?("isbn") && !id["Type"].include?("locals")
|
|
368
|
+
issns.push(id)
|
|
369
|
+
end
|
|
370
|
+
end
|
|
371
|
+
end
|
|
372
|
+
return issns
|
|
373
|
+
end
|
|
374
|
+
return []
|
|
375
|
+
end
|
|
376
|
+
|
|
377
|
+
def issns
|
|
378
|
+
|
|
379
|
+
ispartof = @record.fetch('RecordInfo', {}).fetch('BibRecord', {}).fetch('BibRelationships', {}).fetch('IsPartOfRelationships', {})
|
|
380
|
+
|
|
381
|
+
if ispartof.count > 0
|
|
382
|
+
issns = []
|
|
383
|
+
ispartof.each do |part_of|
|
|
384
|
+
ids = part_of.fetch('BibEntity',{}).fetch('Identifiers',{})
|
|
385
|
+
ids.each do |id|
|
|
386
|
+
if id["Type"].include?("issn") && !id["Type"].include?("locals")
|
|
387
|
+
issns.push(id)
|
|
388
|
+
end
|
|
389
|
+
end
|
|
390
|
+
end
|
|
391
|
+
return issns
|
|
392
|
+
end
|
|
393
|
+
return []
|
|
394
|
+
end
|
|
395
|
+
|
|
396
|
+
def source_isbn
|
|
397
|
+
unless self.source.nil?
|
|
398
|
+
|
|
399
|
+
ispartof = @record.fetch('RecordInfo', {}).fetch('BibRecord', {}).fetch('BibRelationships', {}).fetch('IsPartOfRelationships', {})
|
|
400
|
+
|
|
401
|
+
if ispartof.count > 0
|
|
402
|
+
issns = []
|
|
403
|
+
ispartof.each do |part_of|
|
|
404
|
+
ids = part_of.fetch('BibEntity',{}).fetch('Identifiers',{})
|
|
405
|
+
ids.each do |id|
|
|
406
|
+
if id["Type"].include?("isbn") && !id["Type"].include?("locals")
|
|
407
|
+
issns.push(id)
|
|
408
|
+
end
|
|
409
|
+
end
|
|
410
|
+
end
|
|
411
|
+
return issns
|
|
412
|
+
end
|
|
413
|
+
end
|
|
414
|
+
return []
|
|
415
|
+
end
|
|
416
|
+
|
|
417
|
+
|
|
418
|
+
|
|
419
|
+
def pubyear
|
|
420
|
+
ispartofs = @record.fetch('RecordInfo', {}).fetch('BibRecord', {}).fetch('BibRelationships', {}).fetch('IsPartOfRelationships', {})
|
|
421
|
+
if ispartofs.count > 0
|
|
422
|
+
dates = ispartofs[0]["BibEntity"].fetch('Dates',{})
|
|
423
|
+
if dates.count > 0
|
|
424
|
+
dates.each do |date|
|
|
425
|
+
if date["Type"] == "published"
|
|
426
|
+
return date["Y"]
|
|
427
|
+
end
|
|
428
|
+
end
|
|
429
|
+
end
|
|
430
|
+
end
|
|
431
|
+
return nil
|
|
432
|
+
end
|
|
433
|
+
|
|
434
|
+
def pubdate
|
|
435
|
+
ispartofs = @record.fetch('RecordInfo', {}).fetch('BibRecord', {}).fetch('BibRelationships', {}).fetch('IsPartOfRelationships', {})
|
|
436
|
+
if ispartofs.count > 0
|
|
437
|
+
dates = ispartofs[0]["BibEntity"].fetch('Dates',{})
|
|
438
|
+
if dates.count > 0
|
|
439
|
+
dates.each do |date|
|
|
440
|
+
if date["Type"] == "published"
|
|
441
|
+
return date["Y"]+"-"+date["M"]+"-"+date["D"]
|
|
442
|
+
end
|
|
443
|
+
end
|
|
444
|
+
end
|
|
445
|
+
end
|
|
446
|
+
return nil
|
|
447
|
+
end
|
|
448
|
+
|
|
449
|
+
def all_links
|
|
450
|
+
links = self.fulltext_links
|
|
451
|
+
links = links + self.nonfulltext_links
|
|
452
|
+
return links
|
|
453
|
+
end
|
|
454
|
+
|
|
455
|
+
def fulltext_links
|
|
456
|
+
|
|
457
|
+
links = []
|
|
458
|
+
|
|
459
|
+
ebscolinks = @record.fetch('FullText',{}).fetch('Links',{})
|
|
460
|
+
if ebscolinks.count > 0
|
|
461
|
+
ebscolinks.each do |ebscolink|
|
|
462
|
+
if ebscolink["Type"] == "pdflink"
|
|
463
|
+
link_label = "PDF Full Text"
|
|
464
|
+
link_icon = "PDF Full Text Icon"
|
|
465
|
+
if ebscolink.key?("Url")
|
|
466
|
+
link_url = ebscolink["Url"]
|
|
467
|
+
else
|
|
468
|
+
link_url = "detail";
|
|
469
|
+
end
|
|
470
|
+
links.push({url: link_url, label: link_label, icon: link_icon, type: "pdf"})
|
|
471
|
+
end
|
|
472
|
+
end
|
|
473
|
+
end
|
|
474
|
+
|
|
475
|
+
htmlfulltextcheck = @record.fetch('FullText',{}).fetch('Text',{}).fetch('Availability',0)
|
|
476
|
+
if htmlfulltextcheck == "1"
|
|
477
|
+
link_url = "detail"
|
|
478
|
+
link_label = "Full Text in Browser"
|
|
479
|
+
link_icon = "Full Text in Browser Icon"
|
|
480
|
+
links.push({url: link_url, label: link_label, icon: link_icon, type: "html"})
|
|
481
|
+
end
|
|
482
|
+
|
|
483
|
+
if ebscolinks.count > 0
|
|
484
|
+
ebscolinks.each do |ebscolink|
|
|
485
|
+
if ebscolink["Type"] == "ebook-pdf"
|
|
486
|
+
link_label = "PDF eBook Full Text"
|
|
487
|
+
link_icon = "PDF eBook Full Text Icon"
|
|
488
|
+
if ebscolink.key?("Url")
|
|
489
|
+
link_url = ebscolink["Url"]
|
|
490
|
+
else
|
|
491
|
+
link_url = "detail";
|
|
492
|
+
end
|
|
493
|
+
links.push({url: link_url, label: link_label, icon: link_icon, type: "ebook-pdf"})
|
|
494
|
+
end
|
|
495
|
+
end
|
|
496
|
+
end
|
|
497
|
+
|
|
498
|
+
if ebscolinks.count > 0
|
|
499
|
+
ebscolinks.each do |ebscolink|
|
|
500
|
+
if ebscolink["Type"] == "ebook-epub"
|
|
501
|
+
link_label = "ePub eBook Full Text"
|
|
502
|
+
link_icon = "ePub eBook Full Text Icon"
|
|
503
|
+
if ebscolink.key?("Url")
|
|
504
|
+
link_url = ebscolink["Url"]
|
|
505
|
+
else
|
|
506
|
+
link_url = "detail";
|
|
507
|
+
end
|
|
508
|
+
links.push({url: link_url, label: link_label, icon: link_icon, type: "ebook-epub"})
|
|
509
|
+
end
|
|
510
|
+
end
|
|
511
|
+
end
|
|
512
|
+
|
|
513
|
+
items = @record.fetch('Items',{})
|
|
514
|
+
if items.count > 0
|
|
515
|
+
items.each do |item|
|
|
516
|
+
if item["Group"] == "URL"
|
|
517
|
+
if item["Data"].include? "linkTerm=""
|
|
518
|
+
link_start = item["Data"].index("linkTerm="")+15;
|
|
519
|
+
link_url = item["Data"][link_start..-1]
|
|
520
|
+
link_end = link_url.index(""")-1
|
|
521
|
+
link_url = link_url[0..link_end]
|
|
522
|
+
link_label_start = item["Data"].index("link>")+8
|
|
523
|
+
link_label = item["Data"][link_label_start..-1]
|
|
524
|
+
link_label = link_label.strip
|
|
525
|
+
else
|
|
526
|
+
link_url = item["Data"]
|
|
527
|
+
link_label = item["Label"]
|
|
528
|
+
end
|
|
529
|
+
link_icon = "Catalog Link Icon"
|
|
530
|
+
links.push({url: link_url, label: link_label, icon: link_icon, type: "cataloglink"})
|
|
531
|
+
end
|
|
532
|
+
end
|
|
533
|
+
end
|
|
534
|
+
|
|
535
|
+
if ebscolinks.count > 0
|
|
536
|
+
ebscolinks.each do |ebscolink|
|
|
537
|
+
if ebscolink["Type"] == "other"
|
|
538
|
+
link_label = "Linked Full Text"
|
|
539
|
+
link_icon = "Linked Full Text Icon"
|
|
540
|
+
if ebscolink.key?("Url")
|
|
541
|
+
link_url = ebscolink["Url"]
|
|
542
|
+
else
|
|
543
|
+
link_url = "detail";
|
|
544
|
+
end
|
|
545
|
+
links.push({url: link_url, label: link_label, icon: link_icon, type: "smartlinks+"})
|
|
546
|
+
end
|
|
547
|
+
end
|
|
548
|
+
end
|
|
549
|
+
|
|
550
|
+
ft_customlinks = @record.fetch('FullText',{}).fetch('CustomLinks',{})
|
|
551
|
+
if ft_customlinks.count > 0
|
|
552
|
+
ft_customlinks.each do |ft_customlink|
|
|
553
|
+
link_url = ft_customlink["Url"]
|
|
554
|
+
link_label = ft_customlink["Text"]
|
|
555
|
+
link_icon = ft_customlink["Icon"]
|
|
556
|
+
links.push({url: link_url, label: link_label, icon: link_icon, type: "customlink-fulltext"})
|
|
557
|
+
end
|
|
558
|
+
end
|
|
559
|
+
|
|
560
|
+
return links
|
|
561
|
+
end
|
|
562
|
+
|
|
563
|
+
def nonfulltext_links
|
|
564
|
+
links = []
|
|
565
|
+
other_customlinks = @record.fetch('CustomLinks',{})
|
|
566
|
+
if other_customlinks.count > 0
|
|
567
|
+
other_customlinks.each do |other_customlink|
|
|
568
|
+
link_url = other_customlink["Url"]
|
|
569
|
+
link_label = other_customlink["Text"]
|
|
570
|
+
link_icon = other_customlink["Icon"]
|
|
571
|
+
links.push({url: link_url, label: link_label, icon: link_icon, type: "customlink-other"})
|
|
572
|
+
end
|
|
573
|
+
end
|
|
574
|
+
|
|
575
|
+
return links
|
|
576
|
+
end
|
|
577
|
+
|
|
578
|
+
def best_fulltext_link
|
|
579
|
+
if self.fulltext_links.count > 0
|
|
580
|
+
return self.fulltext_links[0]
|
|
581
|
+
end
|
|
582
|
+
return {}
|
|
583
|
+
end
|
|
584
|
+
|
|
585
|
+
def retrieve_options
|
|
586
|
+
options = {}
|
|
587
|
+
options['an'] = self.an
|
|
588
|
+
options['dbid'] = self.dbid
|
|
589
|
+
return options
|
|
590
|
+
end
|
|
591
|
+
|
|
592
|
+
end
|
|
593
|
+
|
|
594
|
+
## SEARCH RESPONSE PARSING
|
|
595
|
+
|
|
596
|
+
class EDSAPIResponse
|
|
597
|
+
|
|
598
|
+
attr_accessor :results, :records, :dblabel, :researchstarters, :publicationmatch, :debug
|
|
599
|
+
|
|
600
|
+
def initialize(search_results)
|
|
601
|
+
@debug = ""
|
|
602
|
+
@results = search_results
|
|
603
|
+
|
|
604
|
+
unless @results['ErrorNumber'].nil?
|
|
605
|
+
return search_results
|
|
606
|
+
end
|
|
607
|
+
|
|
608
|
+
if self.hitcount > 0
|
|
609
|
+
@records = []
|
|
610
|
+
search_results["SearchResult"]["Data"]["Records"].each do |record|
|
|
611
|
+
@records.push(EDSApi::EDSAPIRecord.new(record))
|
|
612
|
+
end
|
|
613
|
+
else
|
|
614
|
+
@records = []
|
|
615
|
+
end
|
|
616
|
+
|
|
617
|
+
@researchstarters = []
|
|
618
|
+
relatedrecords = @results.fetch('SearchResult',{}).fetch('RelatedContent',{}).fetch('RelatedRecords',{})
|
|
619
|
+
if relatedrecords.count > 0
|
|
620
|
+
relatedrecords.each do |related_item|
|
|
621
|
+
if related_item["Type"] == "rs"
|
|
622
|
+
rs_entries = related_item.fetch('Records',{})
|
|
623
|
+
if rs_entries.count > 0
|
|
624
|
+
rs_entries.each do |rs_record|
|
|
625
|
+
@researchstarters.push(EDSApi::EDSAPIRecord.new(rs_record))
|
|
626
|
+
end
|
|
627
|
+
end
|
|
628
|
+
end
|
|
629
|
+
end
|
|
630
|
+
end
|
|
631
|
+
|
|
632
|
+
@publicationmatch = []
|
|
633
|
+
relatedpublications = @results.fetch('SearchResult',{}).fetch('RelatedContent',{}).fetch('RelatedPublications',{})
|
|
634
|
+
if relatedpublications.count > 0
|
|
635
|
+
relatedpublications.each do |related_item|
|
|
636
|
+
if related_item["Type"] == "emp"
|
|
637
|
+
publicationmatches = related_item.fetch('PublicationRecords',{})
|
|
638
|
+
if publicationmatches.count > 0
|
|
639
|
+
publicationmatches.each do |publication_record|
|
|
640
|
+
@publicationmatch.push(EDSApi::EDSAPIRecord.new(publication_record))
|
|
641
|
+
end
|
|
642
|
+
end
|
|
643
|
+
end
|
|
644
|
+
end
|
|
645
|
+
end
|
|
646
|
+
end
|
|
647
|
+
|
|
648
|
+
def hitcount
|
|
649
|
+
@results["SearchResult"]["Statistics"]["TotalHits"]
|
|
650
|
+
end
|
|
651
|
+
|
|
652
|
+
def searchtime
|
|
653
|
+
@results["SearchResult"]["Statistics"]["TotalSearchTime"]
|
|
654
|
+
end
|
|
655
|
+
|
|
656
|
+
def querystring
|
|
657
|
+
@results["SearchRequestGet"]["QueryString"]
|
|
658
|
+
end
|
|
659
|
+
|
|
660
|
+
def current_search
|
|
661
|
+
CGI::parse(self.querystring)
|
|
662
|
+
end
|
|
663
|
+
|
|
664
|
+
def applied_facets
|
|
665
|
+
|
|
666
|
+
af = []
|
|
667
|
+
|
|
668
|
+
applied_facets_section = @results["SearchRequestGet"].fetch('SearchCriteriaWithActions',{}).fetch('FacetFiltersWithAction',{})
|
|
669
|
+
applied_facets_section.each do |applied_facets|
|
|
670
|
+
applied_facets.fetch('FacetValuesWithAction',{}).each do |applied_facet|
|
|
671
|
+
af.push(applied_facet)
|
|
672
|
+
# unless applied_facet['FacetValuesWithAction'].nil?
|
|
673
|
+
# applied_facet_values = applied_facet.fetch('FacetValuesWithAction',{})
|
|
674
|
+
# applied_facet_values.each do |applied_facet_value|
|
|
675
|
+
# af.push(applied_facet_value)
|
|
676
|
+
# end
|
|
677
|
+
# end
|
|
678
|
+
end
|
|
679
|
+
end
|
|
680
|
+
|
|
681
|
+
return af
|
|
682
|
+
end
|
|
683
|
+
|
|
684
|
+
def applied_limiters
|
|
685
|
+
|
|
686
|
+
af = []
|
|
687
|
+
|
|
688
|
+
applied_limters_section = @results["SearchRequestGet"].fetch('SearchCriteriaWithActions',{}).fetch('LimitersWithAction',{})
|
|
689
|
+
applied_limters_section.each do |applied_limter|
|
|
690
|
+
af.push(applied_limter)
|
|
691
|
+
end
|
|
692
|
+
|
|
693
|
+
return af
|
|
694
|
+
end
|
|
695
|
+
|
|
696
|
+
def applied_expanders
|
|
697
|
+
|
|
698
|
+
af = []
|
|
699
|
+
|
|
700
|
+
applied_expanders_section = @results["SearchRequestGet"].fetch('SearchCriteriaWithActions',{}).fetch('ExpandersWithAction',{})
|
|
701
|
+
applied_expanders_section.each do |applied_explander|
|
|
702
|
+
af.push(applied_explander)
|
|
703
|
+
end
|
|
704
|
+
|
|
705
|
+
return af
|
|
706
|
+
end
|
|
707
|
+
|
|
708
|
+
def database_stats
|
|
709
|
+
databases = []
|
|
710
|
+
databases_facet = @results["SearchResult"]["Statistics"]["Databases"]
|
|
711
|
+
databases_facet.each do |database|
|
|
712
|
+
if DB_LABEL_LOOKUP.key?(database["Id"].upcase)
|
|
713
|
+
db_label = DB_LABEL_LOOKUP[database["Id"].upcase];
|
|
714
|
+
else
|
|
715
|
+
db_label = database["Label"]
|
|
716
|
+
end
|
|
717
|
+
databases.push({id: database["Id"], hits: database["Hits"], label: db_label})
|
|
718
|
+
end
|
|
719
|
+
return databases
|
|
720
|
+
end
|
|
721
|
+
|
|
722
|
+
def facets (facet_provided_id = "all")
|
|
723
|
+
facets_hash = []
|
|
724
|
+
available_facets = @results.fetch('SearchResult',{}).fetch('AvailableFacets',{})
|
|
725
|
+
available_facets.each do |available_facet|
|
|
726
|
+
if available_facet["Id"] == facet_provided_id || facet_provided_id == "all"
|
|
727
|
+
facet_label = available_facet["Label"]
|
|
728
|
+
facet_id = available_facet["Id"]
|
|
729
|
+
facet_values = []
|
|
730
|
+
available_facet["AvailableFacetValues"].each do |available_facet_value|
|
|
731
|
+
facet_value = available_facet_value["Value"]
|
|
732
|
+
facet_count = available_facet_value["Count"]
|
|
733
|
+
facet_action = available_facet_value["AddAction"]
|
|
734
|
+
facet_values.push({value: facet_value, hitcount: facet_count, action: facet_action})
|
|
735
|
+
end
|
|
736
|
+
facets_hash.push(id: facet_id, label: facet_label, values: facet_values)
|
|
737
|
+
end
|
|
738
|
+
end
|
|
739
|
+
return facets_hash
|
|
740
|
+
end
|
|
741
|
+
|
|
742
|
+
def date_range
|
|
743
|
+
mindate = @results["SearchResult"]["AvailableCriteria"]["DateRange"]["MinDate"]
|
|
744
|
+
maxdate = @results["SearchResult"]["AvailableCriteria"]["DateRange"]["MaxDate"]
|
|
745
|
+
minyear = mindate[0..3]
|
|
746
|
+
maxyear = maxdate[0..3]
|
|
747
|
+
return {mindate: mindate, maxdate: maxdate, minyear:minyear, maxyear:maxyear}
|
|
748
|
+
end
|
|
749
|
+
|
|
750
|
+
def did_you_mean
|
|
751
|
+
dym_suggestions = @results.fetch('SearchResult', {}).fetch('AutoSuggestedTerms',{})
|
|
752
|
+
dym_suggestions.each do |term|
|
|
753
|
+
return term
|
|
754
|
+
end
|
|
755
|
+
return nil
|
|
756
|
+
end
|
|
757
|
+
|
|
758
|
+
def searchterms
|
|
759
|
+
queries = @results.fetch('SearchRequestGet',{}).fetch('SearchCriteriaWithActions',{}).fetch('QueriesWithAction',{})
|
|
760
|
+
|
|
761
|
+
terms = []
|
|
762
|
+
queries.each do |query|
|
|
763
|
+
query['Query']['Term'].split.each do |word|
|
|
764
|
+
terms.push(word)
|
|
765
|
+
end
|
|
766
|
+
end
|
|
767
|
+
|
|
768
|
+
return terms
|
|
769
|
+
end
|
|
770
|
+
|
|
771
|
+
end
|
|
772
|
+
|
|
773
|
+
class EDSAPIInfo
|
|
774
|
+
|
|
775
|
+
attr_accessor :info
|
|
776
|
+
|
|
777
|
+
def initialize(info_raw)
|
|
778
|
+
@info = info_raw
|
|
779
|
+
end
|
|
780
|
+
|
|
781
|
+
def sorts (id = "all")
|
|
782
|
+
possible_sorts = []
|
|
783
|
+
available_sorts = @info['AvailableSearchCriteria'].fetch('AvailableSorts',{})
|
|
784
|
+
available_sorts.each do |available_sort|
|
|
785
|
+
if available_sort["Id"] == id || id == "all"
|
|
786
|
+
possible_sorts.push(available_sort)
|
|
787
|
+
end
|
|
788
|
+
end
|
|
789
|
+
return possible_sorts
|
|
790
|
+
end
|
|
791
|
+
|
|
792
|
+
def search_fields (id = "all")
|
|
793
|
+
possible_fields = []
|
|
794
|
+
available_fields = @info['AvailableSearchCriteria'].fetch('AvailableSearchFields',{})
|
|
795
|
+
available_fields.each do |available_field|
|
|
796
|
+
if available_field['FieldCode'] == id || id == "all"
|
|
797
|
+
possible_fields.push(available_field)
|
|
798
|
+
end
|
|
799
|
+
end
|
|
800
|
+
return possible_fields
|
|
801
|
+
end
|
|
802
|
+
|
|
803
|
+
def expanders (id = "all")
|
|
804
|
+
possible_expanders = []
|
|
805
|
+
available_expanders = @info['AvailableSearchCriteria'].fetch('AvailableExpanders',{})
|
|
806
|
+
available_expanders.each do |available_expander|
|
|
807
|
+
if available_expander['Id'] == id || id == "all"
|
|
808
|
+
possible_expanders.push(available_expander)
|
|
809
|
+
end
|
|
810
|
+
end
|
|
811
|
+
return possible_expanders
|
|
812
|
+
end
|
|
813
|
+
|
|
814
|
+
def limiters (id = "all")
|
|
815
|
+
possible_limiters = []
|
|
816
|
+
available_limiters = @info['AvailableSearchCriteria'].fetch('AvailableLimiters',{})
|
|
817
|
+
available_limiters.each do |available_limiter|
|
|
818
|
+
if available_limiter['Id'] == id || id == "all"
|
|
819
|
+
possible_limiters.push(available_limiter)
|
|
820
|
+
end
|
|
821
|
+
end
|
|
822
|
+
return possible_limiters
|
|
823
|
+
end
|
|
824
|
+
|
|
825
|
+
def search_modes (id = "all")
|
|
826
|
+
possible_search_modes = []
|
|
827
|
+
available_search_modes = @info['AvailableSearchCriteria'].fetch('AvailableSearchModes',{})
|
|
828
|
+
available_search_modes.each do |available_search_mode|
|
|
829
|
+
if available_search_mode['Mode'] == id || id == "all"
|
|
830
|
+
possible_search_modes.push(available_search_mode)
|
|
831
|
+
end
|
|
832
|
+
end
|
|
833
|
+
return possible_search_modes
|
|
834
|
+
end
|
|
835
|
+
|
|
836
|
+
def related_content (id = "all")
|
|
837
|
+
possible_related_contents = []
|
|
838
|
+
available_related_contents = @info['AvailableSearchCriteria'].fetch('AvailableRelatedContent',{})
|
|
839
|
+
available_related_contents.each do |available_related_content|
|
|
840
|
+
if available_related_content['Type'] == id || id == "all"
|
|
841
|
+
possible_related_contents.push(available_related_content)
|
|
842
|
+
end
|
|
843
|
+
end
|
|
844
|
+
return possible_related_contents
|
|
845
|
+
end
|
|
846
|
+
|
|
847
|
+
def did_you_mean (id = "all")
|
|
848
|
+
possible_dyms = []
|
|
849
|
+
available_dyms = @info['AvailableSearchCriteria'].fetch('AvailableDidYouMeanOptions',{})
|
|
850
|
+
available_dyms.each do |available_dym|
|
|
851
|
+
if available_dym['Id'] == id || id == "all"
|
|
852
|
+
possible_dyms.push(available_dym)
|
|
853
|
+
end
|
|
854
|
+
end
|
|
855
|
+
return possible_dyms
|
|
856
|
+
end
|
|
857
|
+
|
|
858
|
+
def results_per_page
|
|
859
|
+
return @info['ViewResultSettings']['ResultsPerPage']
|
|
860
|
+
end
|
|
861
|
+
|
|
862
|
+
def results_list_view
|
|
863
|
+
return @info['ViewResultSettings']['ResultListView']
|
|
864
|
+
end
|
|
865
|
+
|
|
866
|
+
def default_options
|
|
867
|
+
options = {}
|
|
868
|
+
self.search_modes.each do |search_mode|
|
|
869
|
+
if search_mode['DefaultOn'] == "y"
|
|
870
|
+
options['searchmode'] = [search_mode['Mode']]
|
|
871
|
+
end
|
|
872
|
+
end
|
|
873
|
+
|
|
874
|
+
options['resultsperpage'] = [self.results_per_page]
|
|
875
|
+
options['sort'] = ['relevance']
|
|
876
|
+
options['view'] = [self.results_list_view]
|
|
877
|
+
|
|
878
|
+
default_limiters = []
|
|
879
|
+
self.limiters.each do |limiter|
|
|
880
|
+
if limiter['Type'] == 'select' && limiter['DefaultOn'] == 'y'
|
|
881
|
+
default_limiters.push(limiter['Id']+":"+'y')
|
|
882
|
+
elsif limiter['Type'] == 'multiselectvalue'
|
|
883
|
+
limiter['LimiterValues'].each do |limiter_value|
|
|
884
|
+
unless limiter_value['DefaultOn'].nil?
|
|
885
|
+
default_limiters.push(limiter['Id']+":"+limiter_value['Value'])
|
|
886
|
+
end
|
|
887
|
+
end
|
|
888
|
+
end
|
|
889
|
+
end
|
|
890
|
+
if default_limiters.count > 0
|
|
891
|
+
options['limiter'] = default_limiters
|
|
892
|
+
end
|
|
893
|
+
|
|
894
|
+
default_expanders = []
|
|
895
|
+
self.expanders.each do |expander|
|
|
896
|
+
if expander['DefaultOn'] == 'y'
|
|
897
|
+
default_expanders.push(expander['Id'])
|
|
898
|
+
end
|
|
899
|
+
end
|
|
900
|
+
if default_expanders.count > 0
|
|
901
|
+
options['expander'] = default_expanders
|
|
902
|
+
end
|
|
903
|
+
|
|
904
|
+
default_relatedcontent = []
|
|
905
|
+
self.related_content.each do |related_info|
|
|
906
|
+
if related_info['DefaultOn'] == 'y'
|
|
907
|
+
default_relatedcontent.push(related_info['Type'])
|
|
908
|
+
end
|
|
909
|
+
end
|
|
910
|
+
if default_relatedcontent.count > 0
|
|
911
|
+
options['relatedcontent'] = [default_relatedcontent.join(",")]
|
|
912
|
+
end
|
|
913
|
+
|
|
914
|
+
return options
|
|
915
|
+
end
|
|
916
|
+
|
|
917
|
+
end
|
|
918
|
+
|
|
919
|
+
## CONNECTION HANDLING
|
|
920
|
+
|
|
14
921
|
# Connection object. Does what it says. ConnectionHandler is what is usually desired and wraps auto-reonnect features, etc.
|
|
15
922
|
class Connection
|
|
16
923
|
|
|
17
924
|
attr_accessor :auth_token, :session_token, :guest
|
|
18
925
|
attr_writer :userid, :password
|
|
19
|
-
|
|
926
|
+
|
|
927
|
+
def initialize
|
|
928
|
+
@log = ""
|
|
929
|
+
end
|
|
930
|
+
|
|
20
931
|
# Init the object with userid and pass.
|
|
21
932
|
def uid_init(userid, password, profile, guest = 'y')
|
|
22
933
|
@userid = userid
|
|
@@ -31,7 +942,7 @@ module EDSApi
|
|
|
31
942
|
return self
|
|
32
943
|
end
|
|
33
944
|
# Auth with the server. Currently only uid auth is supported.
|
|
34
|
-
|
|
945
|
+
|
|
35
946
|
###
|
|
36
947
|
def uid_authenticate(format = :xml)
|
|
37
948
|
# DO NOT SEND CALL IF YOU HAVE A VALID AUTH TOKEN
|
|
@@ -42,7 +953,7 @@ module EDSApi
|
|
|
42
953
|
req["Accept"] = "application/json" #if format == :json
|
|
43
954
|
req.body = xml
|
|
44
955
|
https = Net::HTTP.new(uri.hostname, uri.port)
|
|
45
|
-
https.read_timeout=10
|
|
956
|
+
https.read_timeout=10
|
|
46
957
|
https.use_ssl = true
|
|
47
958
|
https.verify_mode = OpenSSL::SSL::VERIFY_NONE
|
|
48
959
|
begin
|
|
@@ -54,11 +965,11 @@ module EDSApi
|
|
|
54
965
|
raise "Bad response from server - error code #{result['ErrorNumber']}"
|
|
55
966
|
else
|
|
56
967
|
@auth_token = doc['AuthToken']
|
|
57
|
-
end
|
|
968
|
+
end
|
|
58
969
|
end
|
|
59
970
|
def ip_authenticate(format = :xml)
|
|
60
971
|
uri = URI "#{API_URL_S}authservice/rest/ipauth"
|
|
61
|
-
req = Net::
|
|
972
|
+
req = Net::HTTP::Post.new(uri.request_uri)
|
|
62
973
|
req["Accept"] = "application/json" #if format == :json
|
|
63
974
|
https = Net::HTTP.new(uri.hostname, uri.port)
|
|
64
975
|
https.read_timeout=10
|
|
@@ -82,7 +993,7 @@ module EDSApi
|
|
|
82
993
|
# return doc['SessionToken']
|
|
83
994
|
# }
|
|
84
995
|
Net::HTTP.start(uri.hostname, uri.port, :read_timeout => 10) { |http|
|
|
85
|
-
|
|
996
|
+
|
|
86
997
|
begin
|
|
87
998
|
return http.request(req).body
|
|
88
999
|
rescue Timeout::Error, Net::ReadTimeout, Errno::EINVAL, Errno::ECONNRESET, EOFError, Net::HTTPBadResponse, Net::HTTPHeaderSyntaxError, Net::ProtocolError => e
|
|
@@ -105,8 +1016,9 @@ module EDSApi
|
|
|
105
1016
|
return true
|
|
106
1017
|
end
|
|
107
1018
|
# Run a search query, XML results are returned
|
|
108
|
-
|
|
1019
|
+
def request_search(options, format = :xml)
|
|
109
1020
|
uri = URI "#{API_URL}edsapi/rest/Search?#{options}"
|
|
1021
|
+
@log << uri.to_s << " -- "
|
|
110
1022
|
#return uri.request_uri
|
|
111
1023
|
req = Net::HTTP::Get.new(uri.request_uri)
|
|
112
1024
|
|
|
@@ -114,7 +1026,7 @@ module EDSApi
|
|
|
114
1026
|
req['x-sessionToken'] = @session_token
|
|
115
1027
|
req['Accept'] = 'application/json' #if format == :json
|
|
116
1028
|
|
|
117
|
-
Net::HTTP.start(uri.hostname, uri.port, :read_timeout =>
|
|
1029
|
+
Net::HTTP.start(uri.hostname, uri.port, :read_timeout => 10) { |http|
|
|
118
1030
|
begin
|
|
119
1031
|
return http.request(req).body
|
|
120
1032
|
rescue Timeout::Error, Net::ReadTimeout, Errno::EINVAL, Errno::ECONNRESET, EOFError, Net::HTTPBadResponse, Net::HTTPHeaderSyntaxError, Net::ProtocolError => e
|
|
@@ -123,8 +1035,10 @@ module EDSApi
|
|
|
123
1035
|
}
|
|
124
1036
|
end
|
|
125
1037
|
# Retrieve specific information
|
|
126
|
-
def
|
|
1038
|
+
def request_retrieve(dbid, an, highlightterms = "", ebookpreferredformat = "", format = :xml)
|
|
127
1039
|
uri = URI "#{API_URL}edsapi/rest/retrieve?dbid=#{dbid}&an=#{an}"
|
|
1040
|
+
@log << uri.to_s << " -- "
|
|
1041
|
+
|
|
128
1042
|
if highlightterms != ""
|
|
129
1043
|
updateURI = uri.to_s
|
|
130
1044
|
updateURI = updateURI + "&highlightterms=#{highlightterms}"
|
|
@@ -149,8 +1063,10 @@ module EDSApi
|
|
|
149
1063
|
}
|
|
150
1064
|
end
|
|
151
1065
|
# Info method
|
|
152
|
-
def
|
|
1066
|
+
def request_info(format = :xml)
|
|
153
1067
|
uri = URI "#{API_URL}edsapi/rest/Info"
|
|
1068
|
+
@log << uri.to_s << " -- "
|
|
1069
|
+
|
|
154
1070
|
req = Net::HTTP::Get.new(uri.request_uri)
|
|
155
1071
|
req['x-authenticationToken'] = @auth_token
|
|
156
1072
|
req['x-sessionToken'] = @session_token
|
|
@@ -163,32 +1079,79 @@ module EDSApi
|
|
|
163
1079
|
end
|
|
164
1080
|
}
|
|
165
1081
|
end
|
|
1082
|
+
|
|
1083
|
+
def show_log
|
|
1084
|
+
return @log
|
|
1085
|
+
end
|
|
166
1086
|
end
|
|
1087
|
+
|
|
167
1088
|
# Handles connections - retries failed connections, passes commands along
|
|
168
1089
|
class ConnectionHandler < Connection
|
|
1090
|
+
|
|
169
1091
|
attr_accessor :max_retries
|
|
170
1092
|
attr_accessor :session_token
|
|
1093
|
+
attr_accessor :info
|
|
1094
|
+
attr_accessor :search_results
|
|
1095
|
+
|
|
171
1096
|
def initialize(max_retries = 2)
|
|
172
1097
|
@max_retries = max_retries
|
|
1098
|
+
super()
|
|
173
1099
|
end
|
|
1100
|
+
|
|
174
1101
|
def show_session_token
|
|
175
1102
|
return @session_token
|
|
176
1103
|
end
|
|
1104
|
+
|
|
177
1105
|
def show_auth_token
|
|
178
1106
|
return @auth_token
|
|
179
1107
|
end
|
|
1108
|
+
|
|
180
1109
|
def create_session(auth_token = @auth_token, format = :xml)
|
|
181
1110
|
@auth_token = auth_token
|
|
182
|
-
|
|
183
|
-
|
|
1111
|
+
result = JSON.parse(super())
|
|
1112
|
+
if result.has_key?('ErrorNumber')
|
|
184
1113
|
return result.to_s
|
|
185
|
-
|
|
1114
|
+
else
|
|
186
1115
|
@session_token = result['SessionToken']
|
|
187
|
-
|
|
188
|
-
|
|
1116
|
+
@info = EDSApi::EDSAPIInfo.new(self.request_info(@session_token,@auth_token))
|
|
1117
|
+
return result['SessionToken']
|
|
1118
|
+
end
|
|
1119
|
+
end
|
|
1120
|
+
|
|
1121
|
+
def new_search(searchterm, use_defaults = "y")
|
|
1122
|
+
options = @info.default_options
|
|
1123
|
+
options['query'] = searchterm
|
|
1124
|
+
return self.search(options)
|
|
1125
|
+
end
|
|
1126
|
+
|
|
1127
|
+
def search(options, actions = [])
|
|
1128
|
+
if actions.kind_of?(Array) && actions.count > 0
|
|
1129
|
+
options['action'] = actions
|
|
1130
|
+
elsif actions.length > 0
|
|
1131
|
+
options['action'] = [actions]
|
|
1132
|
+
end
|
|
1133
|
+
apiresponse = EDSApi::EDSAPIResponse.new(request_search(URI.encode_www_form(options)))
|
|
1134
|
+
@current_searchterms = apiresponse.searchterms
|
|
1135
|
+
@search_results = apiresponse
|
|
1136
|
+
return apiresponse
|
|
189
1137
|
end
|
|
190
|
-
|
|
191
|
-
|
|
1138
|
+
|
|
1139
|
+
def search_actions(actions)
|
|
1140
|
+
return self.search(@search_results.current_search,actions)
|
|
1141
|
+
end
|
|
1142
|
+
|
|
1143
|
+
def retrieve(options)
|
|
1144
|
+
options['highlightterms'] = @current_searchterms
|
|
1145
|
+
options['ebookpreferredformat'] = 'ebook-epub'
|
|
1146
|
+
apiresponse = request_retrieve(options['dbid'],options['an'],options['hhighlightterms'])
|
|
1147
|
+
unless apiresponse["Record"].nil?
|
|
1148
|
+
return EDSApi::EDSAPIRecord.new(apiresponse["Record"])
|
|
1149
|
+
end
|
|
1150
|
+
return apiresponse
|
|
1151
|
+
end
|
|
1152
|
+
|
|
1153
|
+
def request_search(options, session_token = @session_token, auth_token = @auth_token, format = :xml)
|
|
1154
|
+
|
|
192
1155
|
# temporary fix while API SI resolves
|
|
193
1156
|
# catches case where user navigates past result page 250 and applies facet/limiter
|
|
194
1157
|
if (options.index('&action=') && (options.index('&action=') > 0))
|
|
@@ -203,7 +1166,7 @@ module EDSApi
|
|
|
203
1166
|
end
|
|
204
1167
|
end
|
|
205
1168
|
end
|
|
206
|
-
|
|
1169
|
+
|
|
207
1170
|
attempts = 0
|
|
208
1171
|
@session_token = session_token
|
|
209
1172
|
@auth_token = auth_token
|
|
@@ -224,7 +1187,7 @@ module EDSApi
|
|
|
224
1187
|
self.uid_authenticate(:json)
|
|
225
1188
|
result = JSON.parse(super(options, format))
|
|
226
1189
|
else
|
|
227
|
-
return result
|
|
1190
|
+
return result
|
|
228
1191
|
end
|
|
229
1192
|
unless result.has_key?('ErrorNumber')
|
|
230
1193
|
return result
|
|
@@ -238,10 +1201,11 @@ module EDSApi
|
|
|
238
1201
|
end
|
|
239
1202
|
end
|
|
240
1203
|
end
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
1204
|
+
|
|
1205
|
+
def request_info (session_token, auth_token, format= :xml)
|
|
1206
|
+
attempts = 0
|
|
1207
|
+
@auth_token = auth_token
|
|
1208
|
+
@session_token = session_token
|
|
245
1209
|
loop do
|
|
246
1210
|
result = JSON.parse(super(format)) # JSON Parse
|
|
247
1211
|
if result.has_key?('ErrorNumber')
|
|
@@ -262,9 +1226,10 @@ module EDSApi
|
|
|
262
1226
|
else
|
|
263
1227
|
return result
|
|
264
1228
|
end
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
1229
|
+
end
|
|
1230
|
+
end
|
|
1231
|
+
|
|
1232
|
+
def request_retrieve(dbid, an, highlightterms, ebookpreferredformat = 'ebook-epub', session_token = @session_token, auth_token = @auth_token, format = :xml)
|
|
268
1233
|
attempts = 0
|
|
269
1234
|
@session_token = session_token
|
|
270
1235
|
@auth_token = auth_token
|
|
@@ -312,4 +1277,4 @@ end
|
|
|
312
1277
|
if __FILE__ == $0
|
|
313
1278
|
benchmark(true)
|
|
314
1279
|
benchmark
|
|
315
|
-
end
|
|
1280
|
+
end
|
metadata
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: ebsco-discovery-service-api
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 1.1.
|
|
4
|
+
version: 1.1.12
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Eric Frierson
|
|
8
8
|
autorequire:
|
|
9
9
|
bindir: bin
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date:
|
|
11
|
+
date: 2017-03-16 00:00:00.000000000 Z
|
|
12
12
|
dependencies: []
|
|
13
13
|
description: Set of Ruby functions to interface with the EBSCO Discovery Service API.
|
|
14
14
|
email: eds@ebscohost.com
|
|
@@ -36,7 +36,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
|
36
36
|
version: '0'
|
|
37
37
|
requirements: []
|
|
38
38
|
rubyforge_project:
|
|
39
|
-
rubygems_version: 2.
|
|
39
|
+
rubygems_version: 2.6.6
|
|
40
40
|
signing_key:
|
|
41
41
|
specification_version: 4
|
|
42
42
|
summary: EBSCO Discovery Service API Ruby Library
|