exlibris-primo 0.1.0 → 0.1.1
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.
- 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
|