exlibris-primo 0.1.0 → 0.1.1
Sign up to get free protection for your applications and to get access to all the features.
- data/README.rdoc +35 -1
- data/lib/exlibris-primo.rb +4 -2
- data/lib/exlibris/primo/eshelf.rb +80 -0
- data/lib/exlibris/primo/record.rb +112 -0
- data/lib/exlibris/primo/version.rb +1 -1
- data/lib/exlibris/primo/web_service.rb +65 -5
- data/test/unit/eshelf_test.rb +152 -0
- data/test/unit/record_test.rb +77 -0
- data/test/unit/web_service_test.rb +22 -0
- metadata +16 -10
data/README.rdoc
CHANGED
@@ -6,7 +6,7 @@ Exlibris::Primo offers a set of libraries for interacting with the ExLibris Prim
|
|
6
6
|
The Exlibris::Primo::Searcher class performs a search against Primo for given parameters
|
7
7
|
and exposes the set of holdings (availibrary elements), rsrcs, tocs, and related links (addlink elements).
|
8
8
|
|
9
|
-
|
9
|
+
=== Example of Exlibris::Primo::Searcher in action
|
10
10
|
setup = {
|
11
11
|
:base_url => "http://primo.institution.edu", :vid => "VID", :institution => "INSTITUTION",
|
12
12
|
:config => {
|
@@ -29,3 +29,37 @@ and exposes the set of holdings (availibrary elements), rsrcs, tocs, and related
|
|
29
29
|
rsrcs = searcher.rsrcs
|
30
30
|
tocs = searcher.tocs
|
31
31
|
related_links = searcher.related_links
|
32
|
+
|
33
|
+
== Exlibris::Primo::Record
|
34
|
+
The Exlibris::Primo::Record class creates an object representation of a Primo record for given parameters
|
35
|
+
and exposes the record's primary attributes (format, title, author, url, openurl) and full record Xml (raw_xml)
|
36
|
+
as instance variables.
|
37
|
+
|
38
|
+
=== Example of Exlibris::Primo::Record in action
|
39
|
+
setup = {
|
40
|
+
:base_url => "http://primo.institution.edu",
|
41
|
+
:resolver_base_url => "http://sfx.institution.edu",
|
42
|
+
:vid => "VID",
|
43
|
+
:institution => "DEFAULT",
|
44
|
+
:record_id => "PrimoRecordId"
|
45
|
+
}
|
46
|
+
record = Exlibris::Primo::Record.new(setup)
|
47
|
+
raw_xml = record.instance_variable_get(:@raw_xml)
|
48
|
+
record_hash = record.to_h
|
49
|
+
openurl = record_hash["openurl"]
|
50
|
+
|
51
|
+
== Exlibris::Primo::EShelf
|
52
|
+
The Exlibris::Primo::EShelf class provides methods for reading a given user's Primo eshelf and eshelf structure as well as adding and removing records.
|
53
|
+
|
54
|
+
=== Example of Exlibris::Primo::EShelf in action
|
55
|
+
setup = {
|
56
|
+
:base_url => "http://primo.institution.edu",
|
57
|
+
:vid => "VID",
|
58
|
+
:resolver_base_url => "http://sfx.institution.edu"
|
59
|
+
}
|
60
|
+
eshelf = Exlibris::Primo::EShelf.new(setup, "USER_ID", "PRIMO")
|
61
|
+
records = eshelf.records
|
62
|
+
p records.first.class
|
63
|
+
record_count = eshelf.count
|
64
|
+
basket_id = eshelf.basket_id
|
65
|
+
eshelf.add_records(["PrimoRecordId","PrimoRecordId2"], basket_id)
|
data/lib/exlibris-primo.rb
CHANGED
@@ -1,5 +1,7 @@
|
|
1
|
-
|
1
|
+
PRIMO_PATH = File.dirname(__FILE__) + "/exlibris/primo/"
|
2
2
|
[
|
3
|
+
'record',
|
4
|
+
'eshelf',
|
3
5
|
'web_service',
|
4
6
|
'holding',
|
5
7
|
'related_link',
|
@@ -8,5 +10,5 @@ PATH = File.dirname(__FILE__) + "/exlibris/primo/"
|
|
8
10
|
'searcher',
|
9
11
|
'source/aleph'
|
10
12
|
].each do |library|
|
11
|
-
require
|
13
|
+
require PRIMO_PATH + library
|
12
14
|
end
|
@@ -0,0 +1,80 @@
|
|
1
|
+
module Exlibris
|
2
|
+
module Primo
|
3
|
+
# == Overview
|
4
|
+
# Exlibris::Primo::EShelf provides access to the Primo Eshelf for a given user.
|
5
|
+
# An instance of Exlibris::Primo::EShelf can be created by passing
|
6
|
+
# in a hash with setup parameters, a user_id and an institution.
|
7
|
+
# Valid setup parameters include:
|
8
|
+
# :base_url, :resolver_base_url, :vid, :config
|
9
|
+
#
|
10
|
+
# == Examples of usage
|
11
|
+
# Exlibris::Primo::EShelf.new({ :base_url => "http://primo.institution.edu", :vid => "VID", :resolver_base_url => "http://sfx.institution.edu"} , "USER_ID", "PRIMO").count
|
12
|
+
# Exlibris::Primo::EShelf.new(@eshelf_setup, @valid_user_id, @valid_institute).basket_id
|
13
|
+
class EShelf
|
14
|
+
|
15
|
+
#Namespaces
|
16
|
+
SEAR_NS = {'sear' => 'http://www.exlibrisgroup.com/xsd/jaguar/search'}
|
17
|
+
PRIM_NS = {'prim' => 'http://www.exlibris.com/primo/xsd/primoeshelffolder'}
|
18
|
+
|
19
|
+
def initialize(setup, user_id, institution)
|
20
|
+
@base_url = setup[:base_url]
|
21
|
+
raise_required_setup_parameter_error :base_url if @base_url.nil?
|
22
|
+
@resolver_base_url = setup[:resolver_base_url]
|
23
|
+
@vid = setup.fetch(:vid, "DEFAULT")
|
24
|
+
raise_required_setup_parameter_error :vid if @vid.nil?
|
25
|
+
@config = setup.fetch(:config, {})
|
26
|
+
raise_required_setup_parameter_error :config if @config.nil?
|
27
|
+
@user_id = user_id
|
28
|
+
raise_required_setup_parameter_error :user_id if @user_id.nil?
|
29
|
+
@institution = institution
|
30
|
+
raise_required_setup_parameter_error :institution if @institution.nil?
|
31
|
+
@records = []
|
32
|
+
end
|
33
|
+
|
34
|
+
# Call Web Service to get Eshelf contents and return
|
35
|
+
def eshelf
|
36
|
+
@eshelf ||= Exlibris::Primo::WebService::GetEShelf.new(@user_id, @institution, @base_url).response
|
37
|
+
end
|
38
|
+
|
39
|
+
# Call Web Service to get Eshelf structure and return
|
40
|
+
def eshelfStructure
|
41
|
+
@eshelfStructure ||= Exlibris::Primo::WebService::GetEShelfStructure.new(@user_id, @institution, @base_url).response
|
42
|
+
end
|
43
|
+
|
44
|
+
# Fetch the number of records in user's Eshelf
|
45
|
+
def count
|
46
|
+
@count ||= Integer(eshelf.at("//sear:DOCSET", SEAR_NS)["TOTALHITS"])
|
47
|
+
end
|
48
|
+
|
49
|
+
# Fetch all records from user's Eshelf as an array of Primo Record objects
|
50
|
+
def records
|
51
|
+
eshelf.search("//sear:DOC", SEAR_NS).each { |doc|
|
52
|
+
@records.push(Record.new({ :base_url => @base_url, :resolver_base_url => @resolver_base_url, :vid => @vid, :record => doc.at("//xmlns:record", doc.namespaces), :institution => @institution }))
|
53
|
+
} if @records.empty?
|
54
|
+
return @records
|
55
|
+
end
|
56
|
+
|
57
|
+
# Fetch default basket id from eshelf structure web service call
|
58
|
+
def basket_id
|
59
|
+
@basket_id ||= eshelfStructure.at(
|
60
|
+
"//prim:eshelf_folders//prim:eshelf_folder[./prim:folder_name='Basket']", PRIM_NS).
|
61
|
+
get_attribute("folder_id") unless eshelfStructure.at("//prim:eshelf_folders//prim:eshelf_folder[./prim:folder_name='Basket']", PRIM_NS).nil?
|
62
|
+
end
|
63
|
+
|
64
|
+
# Call Web Service to add records to remote Eshelf
|
65
|
+
def add_records(doc_ids, folder_id)
|
66
|
+
Exlibris::Primo::WebService::AddToEShelf.new(doc_ids, folder_id, @user_id, @institution, @base_url) unless doc_ids.empty?
|
67
|
+
end
|
68
|
+
|
69
|
+
# Call Web Service to remove records from remote EShelf
|
70
|
+
def remove_records(doc_ids, folder_id)
|
71
|
+
Exlibris::Primo::WebService::RemoveFromEShelf.new(doc_ids, folder_id, @user_id, @institution, @base_url) unless doc_ids.empty?
|
72
|
+
end
|
73
|
+
|
74
|
+
private
|
75
|
+
def raise_required_setup_parameter_error(parameter)
|
76
|
+
raise ArgumentError.new("Error in #{self.class}. Missing required setup parameter: #{parameter}.")
|
77
|
+
end
|
78
|
+
end
|
79
|
+
end
|
80
|
+
end
|
@@ -0,0 +1,112 @@
|
|
1
|
+
module Exlibris
|
2
|
+
module Primo
|
3
|
+
# == Overview
|
4
|
+
# Exlibris::Primo::Record is an abstract representation of a Primo record.
|
5
|
+
# An instance of Exlibris::Primo::Record can be created by passing
|
6
|
+
# in a hash with setup parameters.
|
7
|
+
# Valid parameters include:
|
8
|
+
# :base_url, :resolver_base_url, :vid, :institution, :record_id, :record
|
9
|
+
# A URL to the native record (dlDisplay.do) and an OpenUrl are generated by default.
|
10
|
+
# If no resolver_base_url is provided, an OpenUrl querystring will be returned.
|
11
|
+
# A raw_xml attribute is generated either by the record XML passed in or by fetching it from the record_id.
|
12
|
+
# By default the raw_xml is not included in the hash representation, but can be overridden to.
|
13
|
+
#
|
14
|
+
# == Tips on Extending
|
15
|
+
# When extending the class, a few basics guidelines should be observed.
|
16
|
+
# 1. A Exlibris::Primo::Record is initialized from a Hash of parameters.
|
17
|
+
# These params are used to create instance variables of the record attributes.
|
18
|
+
#
|
19
|
+
# 2. The following methods are available for overriding:
|
20
|
+
# to_h - if a sub class creates more instance variables, these should be added to the hash
|
21
|
+
# raw - cleans up characters and spaces in raw record and wraps in <record /> tag, implementations may differ
|
22
|
+
#
|
23
|
+
# == Examples of usage
|
24
|
+
# Record.new({ :base_url => @base_url, :vid => @vid, :record => doc.at("//record") })
|
25
|
+
class Record
|
26
|
+
|
27
|
+
SEAR_NS = {'sear' => 'http://www.exlibrisgroup.com/xsd/jaguar/search'}
|
28
|
+
attr_reader :record_id, :type, :title, :url, :openurl, :creator, :raw_xml
|
29
|
+
|
30
|
+
def initialize(parameters={})
|
31
|
+
# Get base url of Primo application, required
|
32
|
+
base_url = parameters[:base_url]
|
33
|
+
raise_required_setup_parameter_error :base_url if base_url.nil?
|
34
|
+
# Get base url of link resolver, if blank openurl generates just querystring
|
35
|
+
resolver_base_url = parameters[:resolver_base_url]
|
36
|
+
# Get vid from parameters, required
|
37
|
+
vid = parameters.fetch(:vid, "DEFAULT")
|
38
|
+
raise_required_setup_parameter_error :vid if vid.nil?
|
39
|
+
# Get institution from parameters, required
|
40
|
+
institution = parameters.fetch(:institution, "PRIMO")
|
41
|
+
raise_required_setup_parameter_error :institution if institution.nil?
|
42
|
+
# Get record: either fetch record from Web Service based on DocId or use passed in record xml, required
|
43
|
+
record = (parameters[:record].nil?) ?
|
44
|
+
(parameters[:record_id].nil?) ?
|
45
|
+
nil : record_from_id(parameters.delete(:record_id), base_url, {:institution => institution, :vid => vid}) : parameters.delete(:record)
|
46
|
+
raise_required_setup_parameter_error "record or record_id" if record.nil?
|
47
|
+
# Set instance variables for record
|
48
|
+
@record_id = record.at("control/recordid",record.namespaces).inner_text unless record.at("control/recordid",record.namespaces).nil?
|
49
|
+
@type = record.at("display/type",record.namespaces).inner_text unless record.at("display/type",record.namespaces).nil?
|
50
|
+
@title = record.at("display/title",record.namespaces).inner_text unless record.at("display/title",record.namespaces).nil?
|
51
|
+
@url = construct_url(base_url, @record_id, institution, vid)
|
52
|
+
@openurl = construct_openurl(resolver_base_url, record, @record_id)
|
53
|
+
@creator = record.at("display/creator",record.namespaces).inner_text unless record.at("display/creator",record.namespaces).nil?
|
54
|
+
@raw_xml = raw(record)
|
55
|
+
end
|
56
|
+
|
57
|
+
# Return a hash representation of the primary record attributes
|
58
|
+
def to_h
|
59
|
+
return {
|
60
|
+
"format" => @type.capitalize,
|
61
|
+
"title" => @title,
|
62
|
+
"author" => @creator,
|
63
|
+
"url" => @url,
|
64
|
+
"openurl" => @openurl
|
65
|
+
}
|
66
|
+
end
|
67
|
+
|
68
|
+
# Method for cleaning up raw xml from record
|
69
|
+
def raw(record)
|
70
|
+
raw = "<record>"
|
71
|
+
# Hack to strip out spacing in record
|
72
|
+
record.children.each{|child| raw << child.to_xml.gsub(/\n\s*/, "").gsub(/\s$/, "")}
|
73
|
+
raw << "</record>"
|
74
|
+
return raw
|
75
|
+
end
|
76
|
+
|
77
|
+
private
|
78
|
+
# Method for consturcting openurl from record
|
79
|
+
def construct_openurl(resolver_base_url, record, record_id)
|
80
|
+
raise_required_setup_parameter_error :record if record.nil?
|
81
|
+
raise_required_setup_parameter_error :record_id if record_id.nil?
|
82
|
+
openurl = (resolver_base_url.nil?) ? "?" : "#{resolver_base_url}?"
|
83
|
+
record.search("addata/*",record.namespaces).each do |addata|
|
84
|
+
openurl << "rft.#{addata.name}=#{addata.inner_text}&" unless (addata.inner_text.nil? or addata.inner_text.strip.empty?)
|
85
|
+
end
|
86
|
+
openurl << "rft.primo=#{record_id}"
|
87
|
+
return openurl
|
88
|
+
end
|
89
|
+
|
90
|
+
# Method for constructing deep link url from record
|
91
|
+
def construct_url(base_url, record_id, institution, vid)
|
92
|
+
raise_required_setup_parameter_error :base_url if base_url.nil?
|
93
|
+
raise_required_setup_parameter_error :record_id if record_id.nil?
|
94
|
+
raise_required_setup_parameter_error :institution if institution.nil?
|
95
|
+
raise_required_setup_parameter_error :vid if vid.nil?
|
96
|
+
url = "#{base_url}/primo_library/libweb/action/dlDisplay.do?dym=false&onCampus=false&docId=#{record_id}&institution=#{institution}&vid=#{vid}"
|
97
|
+
return url
|
98
|
+
end
|
99
|
+
|
100
|
+
# Fetch record from Primo Web Service
|
101
|
+
def record_from_id(record_id, base_url, options={})
|
102
|
+
doc = Exlibris::Primo::WebService::GetRecord.new(record_id, base_url, options).response.at("//sear:DOC", SEAR_NS)
|
103
|
+
return doc.at("//xmlns:record",doc.namespaces)
|
104
|
+
end
|
105
|
+
|
106
|
+
# Raise error wrapper
|
107
|
+
def raise_required_setup_parameter_error(parameter)
|
108
|
+
raise ArgumentError.new("Error in #{self.class}. Missing required setup parameter: #{parameter}.")
|
109
|
+
end
|
110
|
+
end
|
111
|
+
end
|
112
|
+
end
|
@@ -27,10 +27,18 @@ module Exlibris
|
|
27
27
|
raise "Error making call to Primo web service. Response from web service is #{@response}." if @response.nil?
|
28
28
|
@error = []
|
29
29
|
response.search("ERROR").each do |e|
|
30
|
-
|
30
|
+
# Primo Web Service calls will return an <ERROR MESSAGE="{MESSAGE}" CODE="{CODE}" />
|
31
|
+
# tag even when it succeeds. Key off CODE == 0 which is a successful call.
|
32
|
+
#debugger
|
33
|
+
@error.push(e.attributes["MESSAGE"]) unless e.nil? or e.attributes["CODE"].value.to_i == 0
|
31
34
|
end
|
32
35
|
raise "Error making call to Primo web service. #{@error.inspect}" unless @error.empty?
|
33
36
|
end
|
37
|
+
|
38
|
+
private
|
39
|
+
def tag!(name, value)
|
40
|
+
REXML::Element.new(name).add_text(value)
|
41
|
+
end
|
34
42
|
end
|
35
43
|
|
36
44
|
# Search is the base class for Search web services
|
@@ -108,10 +116,6 @@ module Exlibris
|
|
108
116
|
def genre_query_term(genre)
|
109
117
|
return query_term(genre, "any", "exact")
|
110
118
|
end
|
111
|
-
|
112
|
-
def tag!(name, value)
|
113
|
-
REXML::Element.new(name).add_text(value)
|
114
|
-
end
|
115
119
|
end
|
116
120
|
|
117
121
|
# SearchBrief does a brief result search through the Primo APIs
|
@@ -138,6 +142,62 @@ module Exlibris
|
|
138
142
|
super("getRecord", "getRecordRequest", "fullViewRequest", primo_search_request, additional_input, base_url, options)
|
139
143
|
end
|
140
144
|
end
|
145
|
+
|
146
|
+
# EShelf is the base class for EShelf web services
|
147
|
+
# It can be extended but is not intended for use by itself
|
148
|
+
# Known implementations are GetEShelf, AddToEShelf, RemoveFromEShelf, GetEShelfStructure
|
149
|
+
class EShelf < WebServiceBase
|
150
|
+
def initialize(method_name, param_name, input_root, user_id, institution, additional_input, base_url, options, service_name = nil)
|
151
|
+
input = REXML::Element.new(input_root)
|
152
|
+
input.add_namespace("http://www.exlibris.com/primo/xsd/wsRequest")
|
153
|
+
input.add_element(tag!("userId", user_id)) if !user_id.nil?
|
154
|
+
input.add_element(tag!("institution", institution)) if !institution.nil?
|
155
|
+
additional_input.each do |e|
|
156
|
+
input.add_element(e)
|
157
|
+
end
|
158
|
+
service_name = "eshelf" if service_name.nil?
|
159
|
+
make_call(base_url, service_name, method_name, param_name, input)
|
160
|
+
end
|
161
|
+
|
162
|
+
private
|
163
|
+
def docs(doc_ids=[], folder_id=nil, folder_name=nil)
|
164
|
+
additional_input = []
|
165
|
+
doc_ids.each { |doc_id| additional_input.push(tag!("docId", doc_id)) }
|
166
|
+
additional_input.push(tag!("folderId", folder_id)) unless folder_id.nil?
|
167
|
+
additional_input.push(tag!("folderName", folder_name)) unless folder_name.nil?
|
168
|
+
return additional_input
|
169
|
+
end
|
170
|
+
end
|
171
|
+
|
172
|
+
# Get EShelf based on user_id and institution
|
173
|
+
class GetEShelf < EShelf
|
174
|
+
def initialize(user_id, institution, base_url, options={})
|
175
|
+
super("getEshelf", "getEshelfRequest", "getEshelfRequest", user_id, institution, [], base_url, options)
|
176
|
+
raise "Error making call to Primo web service. #{@error.inspect}" unless @error.empty? or @error.attribe
|
177
|
+
end
|
178
|
+
end
|
179
|
+
|
180
|
+
# Get EShelf structure based on user_id and institution
|
181
|
+
class GetEShelfStructure < EShelf
|
182
|
+
def initialize(user_id, institution, base_url, options={})
|
183
|
+
super("getEshelfStructure", "getEshelfStructureRequest", "getEshelfStructureRequest", user_id, institution, [tag!("includeBasketItems","false")], base_url, options, "eshelfstructure")
|
184
|
+
raise "Error making call to Primo web service. #{@error.inspect}" unless @error.empty? or @error.attribe
|
185
|
+
end
|
186
|
+
end
|
187
|
+
|
188
|
+
# Add document to EShelf based on user_id and institution
|
189
|
+
class AddToEShelf < EShelf
|
190
|
+
def initialize(doc_ids, folder_id, user_id, institution, base_url, options={})
|
191
|
+
super("addToEshelf", "addToEshelfRequest", "addToEshelfRequest", user_id, institution, docs(doc_ids, folder_id), base_url, options)
|
192
|
+
end
|
193
|
+
end
|
194
|
+
|
195
|
+
# Remove document from EShelf based on user_id and institution
|
196
|
+
class RemoveFromEShelf < EShelf
|
197
|
+
def initialize(doc_ids, folder_id, user_id, institution, base_url, options={})
|
198
|
+
super("removeFromEshelf", "removeFromEshelfRequest", "removeFromEshelfRequest", user_id, institution, docs(doc_ids, folder_id), base_url, options)
|
199
|
+
end
|
200
|
+
end
|
141
201
|
end
|
142
202
|
end
|
143
203
|
end
|
@@ -0,0 +1,152 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
class EShelfTest < ActiveSupport::TestCase
|
4
|
+
PNX_NS = {'pnx' => 'http://www.exlibrisgroup.com/xsd/primo/primo_nm_bib'}
|
5
|
+
SEARCH_NS = {'search' => 'http://www.exlibrisgroup.com/xsd/jaguar/search'}
|
6
|
+
SEAR_NS = {'sear' => 'http://www.exlibrisgroup.com/xsd/jaguar/search'}
|
7
|
+
PRIM_NS = {'prim' => 'http://www.exlibris.com/primo/xsd/primoeshelffolder'}
|
8
|
+
|
9
|
+
def setup
|
10
|
+
@primo_definition = YAML.load( %{
|
11
|
+
type: PrimoService
|
12
|
+
priority: 2 # After SFX, to get SFX metadata enhancement
|
13
|
+
status: active
|
14
|
+
base_url: http://bobcat.library.nyu.edu
|
15
|
+
resolver_base_url: https://getit.library.nyu.edu/resolve
|
16
|
+
vid: NYU
|
17
|
+
institution: NYU
|
18
|
+
holding_search_institution: NYU
|
19
|
+
holding_search_text: Search for this title in BobCat.
|
20
|
+
suppress_holdings: [ !ruby/regexp '/\$\$LBWEB/', !ruby/regexp '/\$\$LNWEB/', !ruby/regexp '/\$\$LTWEB/', !ruby/regexp '/\$\$LWEB/', !ruby/regexp '/\$\$1Restricted Internet Resources/' ]
|
21
|
+
ez_proxy: !ruby/regexp '/https\:\/\/ezproxy\.library\.nyu\.edu\/login\?url=/'
|
22
|
+
service_types:
|
23
|
+
- primo_source
|
24
|
+
- holding_search
|
25
|
+
- fulltext
|
26
|
+
- table_of_contents
|
27
|
+
- referent_enhance
|
28
|
+
- cover_image
|
29
|
+
})
|
30
|
+
|
31
|
+
@base_url = @primo_definition["base_url"]
|
32
|
+
@vid = @primo_definition["vid"]
|
33
|
+
@valid_user_id = "N18158418"
|
34
|
+
@invalid_user_id = "INVALID_USER"
|
35
|
+
@eshelf_setup = {
|
36
|
+
:base_url => @base_url,
|
37
|
+
:vid => @vid,
|
38
|
+
:resolver_base_url => @primo_definition["resolver_base_url"]
|
39
|
+
}
|
40
|
+
@valid_institute = "NYU"
|
41
|
+
@invalid_institute = "INVALID_INST"
|
42
|
+
@valid_doc_ids = ["nyu_aleph000062856"]
|
43
|
+
@invalid_doc_ids = ["INVALID_DOC_ID"]
|
44
|
+
@valid_basket = "298560007"
|
45
|
+
#@valid_folder = "344619707"
|
46
|
+
@invalid_basket = "INVALID_BASKET"
|
47
|
+
end
|
48
|
+
|
49
|
+
test "new" do
|
50
|
+
eshelf = Exlibris::Primo::EShelf.new(@eshelf_setup, @valid_user_id, @valid_institute)
|
51
|
+
assert_not_nil(eshelf, "#{eshelf.class} returned nil when instantiated.")
|
52
|
+
|
53
|
+
assert_equal(@base_url, eshelf.instance_variable_get(:@base_url))
|
54
|
+
assert_equal(@vid, eshelf.instance_variable_get(:@vid))
|
55
|
+
assert_equal(@valid_user_id, eshelf.instance_variable_get(:@user_id))
|
56
|
+
assert_equal(@valid_institute, eshelf.instance_variable_get(:@institution))
|
57
|
+
|
58
|
+
assert_nothing_raised{Exlibris::Primo::EShelf.new({:base_url => @base_url}, @valid_user_id, @valid_institute)}
|
59
|
+
assert_nothing_raised{Exlibris::Primo::EShelf.new({:base_url => @base_url, :vid => @vid}, @valid_user_id, @valid_institute)}
|
60
|
+
|
61
|
+
assert_raise(ArgumentError){Exlibris::Primo::EShelf.new({}, @valid_user_id, @valid_institute)}
|
62
|
+
assert_raise(ArgumentError){Exlibris::Primo::EShelf.new(@eshelf_setup, nil, nil)}
|
63
|
+
assert_raise(ArgumentError){Exlibris::Primo::EShelf.new(@eshelf_setup, nil, nil)}
|
64
|
+
assert_raise(ArgumentError){Exlibris::Primo::EShelf.new(@eshelf_setup, @valid_user_id, nil)}
|
65
|
+
|
66
|
+
end
|
67
|
+
|
68
|
+
test "valid_eshelf" do
|
69
|
+
eshelf = nil
|
70
|
+
assert_nothing_raised{eshelf = Exlibris::Primo::EShelf.new(@eshelf_setup, @valid_user_id, @valid_institute).eshelf}
|
71
|
+
assert_not_nil(eshelf)
|
72
|
+
assert_instance_of(Nokogiri::XML::Document, eshelf)
|
73
|
+
end
|
74
|
+
|
75
|
+
test "valid_eshelf_structure" do
|
76
|
+
eshelfStructure = nil
|
77
|
+
assert_nothing_raised{eshelfStructure = Exlibris::Primo::EShelf.new(@eshelf_setup, @valid_user_id, @valid_institute).eshelfStructure}
|
78
|
+
assert_not_nil(eshelfStructure)
|
79
|
+
assert(eshelfStructure.is_a? Nokogiri::XML::Document)
|
80
|
+
end
|
81
|
+
|
82
|
+
test "basket_id" do
|
83
|
+
assert_equal(@valid_basket, Exlibris::Primo::EShelf.new(@eshelf_setup, @valid_user_id, @valid_institute).basket_id)
|
84
|
+
end
|
85
|
+
|
86
|
+
test "invalid_user_eshelf" do
|
87
|
+
ws = nil
|
88
|
+
assert_nothing_raised(){ws = Exlibris::Primo::EShelf.new(@eshelf_setup, @invalid_user_id, @valid_institute)}
|
89
|
+
assert_not_nil(ws)
|
90
|
+
eshelf = nil
|
91
|
+
assert_nothing_raised(){eshelf = ws.eshelf}
|
92
|
+
assert_not_nil(eshelf)
|
93
|
+
assert_instance_of(Nokogiri::XML::Document, eshelf)
|
94
|
+
assert_equal(0, ws.count)
|
95
|
+
end
|
96
|
+
|
97
|
+
test "invalid_institution_eshelf" do
|
98
|
+
ws = nil
|
99
|
+
assert_nothing_raised(){ws = Exlibris::Primo::EShelf.new(@eshelf_setup, @invalid_user_id, @valid_institute)}
|
100
|
+
assert_not_nil(ws)
|
101
|
+
eshelf = nil
|
102
|
+
assert_nothing_raised(){eshelf = ws.eshelf}
|
103
|
+
assert_not_nil(eshelf)
|
104
|
+
assert_instance_of(Nokogiri::XML::Document, eshelf)
|
105
|
+
assert_equal(0, ws.count)
|
106
|
+
end
|
107
|
+
|
108
|
+
test "records" do
|
109
|
+
records = nil
|
110
|
+
assert_nothing_raised(){records = Exlibris::Primo::EShelf.new(@eshelf_setup, @valid_user_id, @valid_institute).records}
|
111
|
+
assert_not_nil(records)
|
112
|
+
assert_instance_of(Array, records)
|
113
|
+
assert(!records.empty?, "Eshelf records returned empty")
|
114
|
+
end
|
115
|
+
|
116
|
+
test "cant_add_same_record_twice" do
|
117
|
+
eshelf = Exlibris::Primo::EShelf.new(@eshelf_setup, @valid_user_id, @valid_institute)
|
118
|
+
assert_not_nil(eshelf)
|
119
|
+
# Add record
|
120
|
+
assert_nothing_raised(){ eshelf.add_records(@valid_doc_ids, @valid_basket) }
|
121
|
+
# Add same record again
|
122
|
+
assert_raise(RuntimeError){ eshelf.add_records(@valid_doc_ids, @valid_basket) }
|
123
|
+
# Remove record
|
124
|
+
assert_nothing_raised(){ eshelf.remove_records(@valid_doc_ids, @valid_basket) }
|
125
|
+
end
|
126
|
+
|
127
|
+
test "cant_add_invalid_records" do
|
128
|
+
eshelf = Exlibris::Primo::EShelf.new(@eshelf_setup, @valid_user_id, @valid_institute)
|
129
|
+
assert_not_nil(eshelf)
|
130
|
+
# Attempt to add record
|
131
|
+
assert_raise(RuntimeError){ eshelf.add_records(@invalid_doc_ids, @valid_basket) }
|
132
|
+
# Attempt to remove record which was never added
|
133
|
+
assert_raise(RuntimeError){ eshelf.remove_records(@invalid_doc_ids, @valid_basket) }
|
134
|
+
end
|
135
|
+
|
136
|
+
test "cant_add_to_invalid_basket" do
|
137
|
+
eshelf = Exlibris::Primo::EShelf.new(@eshelf_setup, @valid_user_id, @valid_institute)
|
138
|
+
assert_not_nil(eshelf)
|
139
|
+
# Attempt to add record to basket with invalid folder name
|
140
|
+
assert_raise(RuntimeError){ eshelf.add_records(@valid_doc_ids, @invalid_basket) }
|
141
|
+
end
|
142
|
+
|
143
|
+
test "can_add_to_empty_folder" do
|
144
|
+
eshelf = Exlibris::Primo::EShelf.new(@eshelf_setup, @valid_user_id, @valid_institute)
|
145
|
+
assert_not_nil(eshelf)
|
146
|
+
# Add record to basket with no folder id
|
147
|
+
assert_nothing_raised(){ eshelf.add_records(@valid_doc_ids, nil) }
|
148
|
+
# Remove record from basket with no folder id
|
149
|
+
assert_nothing_raised(){ eshelf.remove_records(@valid_doc_ids, @valid_basket) }
|
150
|
+
end
|
151
|
+
|
152
|
+
end
|
@@ -0,0 +1,77 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
class RecordTest < ActiveSupport::TestCase
|
4
|
+
|
5
|
+
SEAR_NS = {'sear' => 'http://www.exlibrisgroup.com/xsd/jaguar/search'}
|
6
|
+
|
7
|
+
def setup
|
8
|
+
@record_definition = YAML.load( %{
|
9
|
+
base_url: http://bobcat.library.nyu.edu
|
10
|
+
resolver_base_url: https://getit.library.nyu.edu/resolve
|
11
|
+
vid: NYU
|
12
|
+
institution: NYU
|
13
|
+
record_id: nyu_aleph000062856
|
14
|
+
})
|
15
|
+
|
16
|
+
@base_url = @record_definition["base_url"]
|
17
|
+
@resolver_base_url = @record_definition["resolver_base_url"]
|
18
|
+
@vid = @record_definition["vid"]
|
19
|
+
@institution = @record_definition["institution"]
|
20
|
+
@valid_record_id = @record_definition["record_id"]
|
21
|
+
@invalid_record_id = "INVALID_RECORD"
|
22
|
+
@setup_args = {
|
23
|
+
:base_url => @base_url,
|
24
|
+
:resolver_base_url => @resolver_base_url,
|
25
|
+
:vid => @vid,
|
26
|
+
:institution => @institution,
|
27
|
+
:record_id => @valid_record_id
|
28
|
+
}
|
29
|
+
end
|
30
|
+
|
31
|
+
test "new" do
|
32
|
+
record = nil
|
33
|
+
assert_nothing_raised(){ record = Exlibris::Primo::Record.new(@setup_args) }
|
34
|
+
assert_not_nil(record)
|
35
|
+
assert_not_nil(record.instance_variable_get(:@record_id))
|
36
|
+
assert_not_nil(record.instance_variable_get(:@type))
|
37
|
+
assert_not_nil(record.instance_variable_get(:@title))
|
38
|
+
assert_not_nil(record.instance_variable_get(:@url))
|
39
|
+
assert_not_nil(record.instance_variable_get(:@openurl))
|
40
|
+
assert_not_nil(record.instance_variable_get(:@creator))
|
41
|
+
assert_not_nil(record.instance_variable_get(:@raw_xml))
|
42
|
+
assert_raise(ArgumentError){ Exlibris::Primo::Record.new(@setup_args.merge({:base_url => nil})) }
|
43
|
+
assert_raise(ArgumentError){ Exlibris::Primo::Record.new(@setup_args.merge({:institution => nil})) }
|
44
|
+
assert_raise(ArgumentError){ Exlibris::Primo::Record.new(@setup_args.merge({:vid => nil})) }
|
45
|
+
assert_raise(ArgumentError){ Exlibris::Primo::Record.new(@setup_args.merge({:record_id => nil})) }
|
46
|
+
assert_raise(RuntimeError){ Exlibris::Primo::Record.new(@setup_args.merge({:record_id => @invalid_record_id})) }
|
47
|
+
end
|
48
|
+
|
49
|
+
test "to_hash_function" do
|
50
|
+
record = Exlibris::Primo::Record.new(@setup_args)
|
51
|
+
assert((record.to_h.is_a? Hash), "#{record.class} was expected to be a Hash, was #{record.to_h.class}")
|
52
|
+
end
|
53
|
+
|
54
|
+
test "sub_class" do
|
55
|
+
class SubRecord < Exlibris::Primo::Record
|
56
|
+
def initialize(parameters={})
|
57
|
+
super(parameters)
|
58
|
+
end
|
59
|
+
end
|
60
|
+
record = nil
|
61
|
+
assert_nothing_raised(){ record = SubRecord.new(@setup_args) }
|
62
|
+
assert_not_nil(record)
|
63
|
+
assert_raise(ArgumentError){ record = SubRecord.new() }
|
64
|
+
end
|
65
|
+
|
66
|
+
test "raw_xml" do
|
67
|
+
record = Exlibris::Primo::Record.new(@setup_args)
|
68
|
+
raw_xml = record.instance_variable_get(:@raw_xml)
|
69
|
+
assert_not_nil(raw_xml)
|
70
|
+
assert_instance_of(String, raw_xml)
|
71
|
+
doc = nil
|
72
|
+
assert_nothing_raised(){ doc = Nokogiri::XML.parse(raw_xml) }
|
73
|
+
assert_not_nil(doc)
|
74
|
+
assert_not_empty(doc.xpath("//record", doc.namespaces))
|
75
|
+
end
|
76
|
+
|
77
|
+
end
|
@@ -3,6 +3,8 @@ require 'test_helper'
|
|
3
3
|
class WebServiceTest < ActiveSupport::TestCase
|
4
4
|
PNX_NS = {'pnx' => 'http://www.exlibrisgroup.com/xsd/primo/primo_nm_bib'}
|
5
5
|
SEARCH_NS = {'search' => 'http://www.exlibrisgroup.com/xsd/jaguar/search'}
|
6
|
+
SEAR_NS = {'sear' => 'http://www.exlibrisgroup.com/xsd/jaguar/search'}
|
7
|
+
PRIM_NS = {'prim' => 'http://www.exlibris.com/primo/xsd/primoeshelffolder'}
|
6
8
|
|
7
9
|
def setup
|
8
10
|
@primo_definition = YAML.load( %{
|
@@ -25,6 +27,9 @@ class WebServiceTest < ActiveSupport::TestCase
|
|
25
27
|
- cover_image
|
26
28
|
})
|
27
29
|
|
30
|
+
@valid_user_id = "N18158418"
|
31
|
+
@invalid_user_id = "INVALID_USER"
|
32
|
+
@default_institution = "NYU"
|
28
33
|
@base_url = @primo_definition["base_url"]
|
29
34
|
@bogus_404_url = "http://library.nyu.edu/bogus"
|
30
35
|
@bogus_200_url = "http://library.nyu.edu"
|
@@ -121,4 +126,21 @@ class WebServiceTest < ActiveSupport::TestCase
|
|
121
126
|
assert_instance_of( Nokogiri::XML::Document, ws.response, "#{ws.class} response is an unexpected object: #{ws.response.class}")
|
122
127
|
assert_equal([], ws.error, "#{ws.class} encountered errors: #{ws.error}")
|
123
128
|
end
|
129
|
+
|
130
|
+
test "get_new_eshelf" do
|
131
|
+
ws = Exlibris::Primo::WebService::GetEShelf.new(@valid_user_id, @default_institution, @base_url)
|
132
|
+
assert_not_nil(ws, "#{ws.class} returned nil when instantiated.")
|
133
|
+
assert_instance_of( Nokogiri::XML::Document, ws.response, "#{ws.class} response is an unexpected object: #{ws.response.class}")
|
134
|
+
assert_equal([], ws.error, "#{ws.class} encountered errors: #{ws.error}")
|
135
|
+
assert_not_nil(ws.response.at("//sear:DOC", SEAR_NS), "#{ws.class} response returned a nil document")
|
136
|
+
end
|
137
|
+
|
138
|
+
test "get_new_eshelf_structure" do
|
139
|
+
ws = Exlibris::Primo::WebService::GetEShelfStructure.new(@valid_user_id, @default_institution, @base_url)
|
140
|
+
assert_not_nil(ws, "#{ws.class} returned nil when instantiated.")
|
141
|
+
assert_instance_of( Nokogiri::XML::Document, ws.response, "#{ws.class} response is an unexpected object: #{ws.response.class}")
|
142
|
+
assert_equal([], ws.error, "#{ws.class} encountered errors: #{ws.error}")
|
143
|
+
assert_not_nil(ws.response.at("//prim:eshelf_folders", PRIM_NS), "#{ws.class} response returned a nil document")
|
144
|
+
end
|
145
|
+
|
124
146
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: exlibris-primo
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.1
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,11 +9,11 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-
|
12
|
+
date: 2012-04-11 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: rails
|
16
|
-
requirement: &
|
16
|
+
requirement: &2152674040 !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
19
|
- - ~>
|
@@ -21,10 +21,10 @@ dependencies:
|
|
21
21
|
version: 3.2.0
|
22
22
|
type: :runtime
|
23
23
|
prerelease: false
|
24
|
-
version_requirements: *
|
24
|
+
version_requirements: *2152674040
|
25
25
|
- !ruby/object:Gem::Dependency
|
26
26
|
name: nokogiri
|
27
|
-
requirement: &
|
27
|
+
requirement: &2152673580 !ruby/object:Gem::Requirement
|
28
28
|
none: false
|
29
29
|
requirements:
|
30
30
|
- - ! '>='
|
@@ -32,10 +32,10 @@ dependencies:
|
|
32
32
|
version: '0'
|
33
33
|
type: :runtime
|
34
34
|
prerelease: false
|
35
|
-
version_requirements: *
|
35
|
+
version_requirements: *2152673580
|
36
36
|
- !ruby/object:Gem::Dependency
|
37
37
|
name: soap4r-ruby1.9
|
38
|
-
requirement: &
|
38
|
+
requirement: &2152672900 !ruby/object:Gem::Requirement
|
39
39
|
none: false
|
40
40
|
requirements:
|
41
41
|
- - ! '>='
|
@@ -43,10 +43,10 @@ dependencies:
|
|
43
43
|
version: '0'
|
44
44
|
type: :runtime
|
45
45
|
prerelease: false
|
46
|
-
version_requirements: *
|
46
|
+
version_requirements: *2152672900
|
47
47
|
- !ruby/object:Gem::Dependency
|
48
48
|
name: sqlite3
|
49
|
-
requirement: &
|
49
|
+
requirement: &2152672320 !ruby/object:Gem::Requirement
|
50
50
|
none: false
|
51
51
|
requirements:
|
52
52
|
- - ! '>='
|
@@ -54,7 +54,7 @@ dependencies:
|
|
54
54
|
version: '0'
|
55
55
|
type: :development
|
56
56
|
prerelease: false
|
57
|
-
version_requirements: *
|
57
|
+
version_requirements: *2152672320
|
58
58
|
description: Library to work with Exlibris' Primo discovery system.
|
59
59
|
email:
|
60
60
|
- scotdalton@gmail.com
|
@@ -62,7 +62,9 @@ executables: []
|
|
62
62
|
extensions: []
|
63
63
|
extra_rdoc_files: []
|
64
64
|
files:
|
65
|
+
- lib/exlibris/primo/eshelf.rb
|
65
66
|
- lib/exlibris/primo/holding.rb
|
67
|
+
- lib/exlibris/primo/record.rb
|
66
68
|
- lib/exlibris/primo/related_link.rb
|
67
69
|
- lib/exlibris/primo/rsrc.rb
|
68
70
|
- lib/exlibris/primo/searcher.rb
|
@@ -108,6 +110,8 @@ files:
|
|
108
110
|
- test/dummy/script/rails
|
109
111
|
- test/exlibris-primo_test.rb
|
110
112
|
- test/test_helper.rb
|
113
|
+
- test/unit/eshelf_test.rb
|
114
|
+
- test/unit/record_test.rb
|
111
115
|
- test/unit/searcher_benchmarks.rb
|
112
116
|
- test/unit/searcher_test.rb
|
113
117
|
- test/unit/web_service_benchmarks.rb
|
@@ -170,6 +174,8 @@ test_files:
|
|
170
174
|
- test/dummy/script/rails
|
171
175
|
- test/exlibris-primo_test.rb
|
172
176
|
- test/test_helper.rb
|
177
|
+
- test/unit/eshelf_test.rb
|
178
|
+
- test/unit/record_test.rb
|
173
179
|
- test/unit/searcher_benchmarks.rb
|
174
180
|
- test/unit/searcher_test.rb
|
175
181
|
- test/unit/web_service_benchmarks.rb
|