exlibris-primo 0.0.4 → 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- data/README.rdoc +29 -1
- data/lib/exlibris/primo/holding.rb +44 -36
- data/lib/exlibris/primo/related_link.rb +1 -0
- data/lib/exlibris/primo/rsrc.rb +1 -0
- data/lib/exlibris/primo/searcher.rb +18 -14
- data/lib/exlibris/primo/source/aleph.rb +3 -3
- data/lib/exlibris/primo/toc.rb +1 -0
- data/lib/exlibris/primo/version.rb +1 -1
- data/lib/exlibris/primo/web_service.rb +12 -14
- data/test/dummy/log/test.log +56 -0
- metadata +10 -10
data/README.rdoc
CHANGED
@@ -1,3 +1,31 @@
|
|
1
1
|
= Exlibris::Primo
|
2
2
|
|
3
|
-
|
3
|
+
Exlibris::Primo offers a set of libraries for interacting with the ExLibris Primo APIs.
|
4
|
+
|
5
|
+
== Exlibris::Primo::Searcher
|
6
|
+
The Exlibris::Primo::Searcher class performs a search against Primo for given parameters
|
7
|
+
and exposes the set of holdings (availibrary elements), rsrcs, tocs, and related links (addlink elements).
|
8
|
+
|
9
|
+
== Example of Exlibris::Primo::Searcher in action
|
10
|
+
setup = {
|
11
|
+
:base_url => "http://primo.institution.edu", :vid => "VID", :institution => "INSTITUTION",
|
12
|
+
:config => {
|
13
|
+
"libraries" =>
|
14
|
+
{"library_code1" => "library_display_1", "library_code2" => "library_display_1"},
|
15
|
+
"statuses" =>
|
16
|
+
{"status_code1" => "status_display_1", "status_code2" => "status_display_2"}}
|
17
|
+
}
|
18
|
+
params = {
|
19
|
+
:primo_id => primo_id,
|
20
|
+
:isbn => isbn,
|
21
|
+
:issn => issn,
|
22
|
+
:title => title,
|
23
|
+
:author => author,
|
24
|
+
:genre => genre
|
25
|
+
}
|
26
|
+
searcher = Exlibris::Primo::Searcher.new(setup, params)
|
27
|
+
count = search.count
|
28
|
+
holdings = searcher.holdings
|
29
|
+
rsrcs = searcher.rsrcs
|
30
|
+
tocs = searcher.tocs
|
31
|
+
related_links = searcher.related_links
|
@@ -1,40 +1,46 @@
|
|
1
|
-
# == Overview
|
2
|
-
# Exlibris::Primo::Holding represents a Primo holding.
|
3
|
-
# This class should be extended to create Primo source objects for
|
4
|
-
# expanding holdings information, linking to Primo sources, and storing
|
5
|
-
# additional metadata based on those sources.
|
6
|
-
#
|
7
|
-
# == Tips on Extending
|
8
|
-
# When extending the class, a few basics guidelines should be observed.
|
9
|
-
# 1. A Exlibris::Primo::Holding is initialized from random Hash of parameters.
|
10
|
-
# Instance variables are created from these parameters for use in the class.
|
11
|
-
#
|
12
|
-
# 2. A Exlibris::Primo::Holding can be initialized from an input
|
13
|
-
# Exlibris::Primo::Holding by specifying the reserved
|
14
|
-
# parameter name :holding, i.e. :holding => input_holding.
|
15
|
-
# If the input holding has instance variables that are also specified in
|
16
|
-
# the random Hash, the value in the Hash takes precedence.
|
17
|
-
#
|
18
|
-
# 3. The following methods are available for overriding:
|
19
|
-
# expand - expand holdings information based on data source. default: [self]
|
20
|
-
# dedup? - does this data source contain duplicate holdings that need to be deduped? default: false
|
21
|
-
#
|
22
|
-
# 4. The following instance variables will be saved in the view_data and will be available
|
23
|
-
# to a local holding partial:
|
24
|
-
# @record_id, @source_id, @original_source_id, @source_record_id,
|
25
|
-
# @availlibrary, @institution_code, @institution, @library_code, @library,
|
26
|
-
# @status_code, @status, @id_one, @id_two, @origin, @display_type, @coverage, @notes,
|
27
|
-
# @url, @request_url, @source_data
|
28
|
-
#
|
29
|
-
# 5. Additional source data should be saved in the @source_data instance variable.
|
30
|
-
# @source_data is a hash that can contain any number of string elements,
|
31
|
-
# perfect for storing local source information.
|
32
|
-
#
|
33
|
-
# == Examples
|
34
|
-
# Example of Primo source implementations are:
|
35
|
-
# * Exlibris::Primo::Source::Aleph
|
36
1
|
module Exlibris
|
37
2
|
module Primo
|
3
|
+
# == Overview
|
4
|
+
# Exlibris::Primo::Holding represents a Primo availibrary entry.
|
5
|
+
# An instance of Exlibris::Primo::Holding can be created by passing
|
6
|
+
# in a set of parameters containing the data for the holding.
|
7
|
+
# Valid parameters include:
|
8
|
+
# :record_id, :title, :author, :source_id, :original_source_id, :source_record_id,
|
9
|
+
# :availlibrary,:institution_code, :library_code, :status_code, :id_one, :id_two,
|
10
|
+
# :origin, :display_type, :coverage, :notes, :url, :request_url, :source_data
|
11
|
+
# When creating an instance of Exlibris::Primo::Holding, calling
|
12
|
+
# classes may send in a :config hash that contains config mappings
|
13
|
+
# for decoding libraries and statuses. The :config hash should be
|
14
|
+
# of the form
|
15
|
+
# {"libraries" => {"library_code1" => "library_display_1", "library_code2" => "library_display_1"}, "statuses" => {"status_code1" => "status_display_1", "status_code2" => "status_display_2"}}
|
16
|
+
# The config can also include information about Primo::Source classes in the form:
|
17
|
+
# "sources" => {"source_id1" => {"class_name" => "SourceKlassName", "source_config1" => "source_config_one"}}
|
18
|
+
# Primo::Source classes can be used to represent a Primo source for expanding holdings
|
19
|
+
# information, linking to Primo sources, and storing additional metadata based on those sources.
|
20
|
+
# In order to create a source class, implementations should extend Exlibris::Primo::Holding.
|
21
|
+
#
|
22
|
+
# == Tips on Extending
|
23
|
+
# When extending the class, a few basics guidelines should be observed.
|
24
|
+
# 1. A Exlibris::Primo::Holding is initialized from random Hash of parameters.
|
25
|
+
# Instance variables are created from these parameters for use in the class.
|
26
|
+
#
|
27
|
+
# 2. A Exlibris::Primo::Holding can also be initialized from an input
|
28
|
+
# Exlibris::Primo::Holding by specifying the reserved
|
29
|
+
# parameter name :holding, i.e. :holding => input_holding.
|
30
|
+
# If the input holding has instance variables that are also specified in
|
31
|
+
# the random Hash, the value in the Hash takes precedence.
|
32
|
+
#
|
33
|
+
# 3. The following methods are available for overriding:
|
34
|
+
# expand - expand holdings information based on data source. default: [self]
|
35
|
+
# dedup? - does this data source contain duplicate holdings that need to be deduped? default: false
|
36
|
+
#
|
37
|
+
# 4. Additional source data should be saved in the @source_data instance variable.
|
38
|
+
# @source_data is a hash that can contain any number of string elements,
|
39
|
+
# perfect for storing local source information.
|
40
|
+
#
|
41
|
+
# == Examples
|
42
|
+
# Example of Primo source implementations are:
|
43
|
+
# * Exlibris::Primo::Source::Aleph
|
38
44
|
class Holding
|
39
45
|
@base_attributes = [ :record_id, :title, :author, :source_id, :original_source_id,
|
40
46
|
:source_record_id, :availlibrary, :institution_code, :institution, :library_code,
|
@@ -149,12 +155,14 @@ module Exlibris
|
|
149
155
|
end
|
150
156
|
end
|
151
157
|
|
158
|
+
# Convenience method for making base attributes accessible via Hash-like syntax.
|
152
159
|
def [](key)
|
153
160
|
raise "Error in #{self.class}. #{key} doesn't exist or is restricted." unless self.class.base_attributes.include?(key)
|
154
161
|
method(key).call
|
155
162
|
end
|
156
163
|
|
157
164
|
protected
|
165
|
+
# Decode based on the pased in config
|
158
166
|
def decode(var, decode_params={}, refresh=false)
|
159
167
|
return instance_variable_get("@#{var}") unless (not instance_variable_defined?("@#{var}")) or refresh
|
160
168
|
code_sym = (decode_params[:code].nil?) ? "#{var}_code".to_sym : decode_params[:code]
|
@@ -178,4 +186,4 @@ module Exlibris
|
|
178
186
|
end
|
179
187
|
end
|
180
188
|
end
|
181
|
-
end
|
189
|
+
end
|
data/lib/exlibris/primo/rsrc.rb
CHANGED
@@ -1,15 +1,18 @@
|
|
1
|
-
# == Overview
|
2
|
-
# Searcher searches Primo for records.
|
3
|
-
# Searcher must have sufficient metadata to make
|
4
|
-
# the request. Sufficient means either:
|
5
|
-
# * We have a Primo doc id
|
6
|
-
# * We have either an isbn OR an issn
|
7
|
-
# * We have a title AND an author AND a genre
|
8
|
-
# If none of these criteria are met, Searcher.search
|
9
|
-
# will raise a RuntimeException.
|
10
|
-
|
11
1
|
module Exlibris
|
12
2
|
module Primo
|
3
|
+
# == Overview
|
4
|
+
# Exlibris::Primo::Searcher searches Primo for records.
|
5
|
+
# Exlibris::Primo::Searcher must have sufficient metadata to make
|
6
|
+
# the request. Sufficient means either:
|
7
|
+
# * We have a Primo doc id
|
8
|
+
# * We have either an isbn OR an issn
|
9
|
+
# * We have a title AND an author AND a genre
|
10
|
+
# If none of these criteria are met, Exlibris::Primo::Searcher.search
|
11
|
+
# will log a warning in the Rails log.
|
12
|
+
# Exlibris::Primo::Searcher will populate the following instance variables
|
13
|
+
# accessible through readers:
|
14
|
+
# :count, :holdings, :rsrcs, :tocs, :related_links
|
15
|
+
# The reader :response makes the full xml result available as a Nokogiri::XML::Document.
|
13
16
|
class Searcher
|
14
17
|
#@required_setup = [ :base_url ]
|
15
18
|
#@setup_default_values = { :vid => "DEFAULT", :config => {} }
|
@@ -21,11 +24,12 @@ module Exlibris
|
|
21
24
|
SEARCH_NS = {'search' => 'http://www.exlibrisgroup.com/xsd/jaguar/search'}
|
22
25
|
|
23
26
|
# Instantiates the object and performs the search for based on the input search criteria.
|
24
|
-
# setup parameter requires { :base_url => http://primo.
|
27
|
+
# :setup parameter requires { :base_url => http://primo.institution.edu }
|
25
28
|
# Other optional parameters are :vid => "view_id", :config => { Hash of primo config settings}
|
26
|
-
#
|
27
|
-
# {
|
28
|
-
#
|
29
|
+
# Hash of config settings are of the form:
|
30
|
+
# {"libraries" => {"library_code1" => "library_display_1", "library_code2" => "library_display_1"}, "statuses" => {"status_code1" => "status_display_1", "status_code2" => "status_display_2"}}
|
31
|
+
# :search_params are a sufficient combination of
|
32
|
+
# { :primo_id => "primo_1", :isbn => "ISBN", :issn => "ISSN", :title => "Title", :author => "Author", :genre => "Genre" }
|
29
33
|
def initialize(setup, search_params)
|
30
34
|
@holdings = []
|
31
35
|
@rsrcs = []
|
@@ -1,9 +1,9 @@
|
|
1
|
-
# == Overview
|
2
|
-
# Aleph is an Exlibris::Primo::Holding that provides a link to Aleph
|
3
|
-
# and a request button based on config settings in the primo_config file.
|
4
1
|
module Exlibris
|
5
2
|
module Primo
|
6
3
|
module Source
|
4
|
+
# == Overview
|
5
|
+
# Exlibris::Primo::Source::Aleph is an Exlibris::Primo::Holding that provides a link to Aleph
|
6
|
+
# and a request button based on config settings in the Primo config file.
|
7
7
|
class Aleph < Exlibris::Primo::Holding
|
8
8
|
@attribute_aliases = Exlibris::Primo::Holding.attribute_aliases.merge({
|
9
9
|
:aleph_doc_library => :original_source_id, :aleph_sub_library => :library,
|
data/lib/exlibris/primo/toc.rb
CHANGED
@@ -1,16 +1,18 @@
|
|
1
|
-
# Module for calling Primo Web Services
|
2
|
-
# Please note the following:
|
3
|
-
# * Be sure to configure the Primo Back Office with the relevant IPs to enable interaction via the Web Services
|
4
|
-
# * This module does not parse the response but instead stores it as an Nokogiri::XML::Document for the calling classes to parse
|
5
1
|
module Exlibris
|
6
2
|
module Primo
|
3
|
+
# == Overview
|
4
|
+
# Module for calling Primo Web Services
|
5
|
+
# Please note the following:
|
6
|
+
# * Be sure to configure the Primo Back Office with the relevant IPs to enable interaction via the Web Services
|
7
|
+
# * This module does not parse the response but instead stores it as an Nokogiri::XML::Document for the calling classes to parse
|
7
8
|
module WebService
|
8
9
|
require 'nokogiri'
|
9
10
|
require 'rexml/document'
|
10
11
|
|
11
12
|
# WebServiceBase is the base class for all Primo Web Services
|
12
13
|
# It can be extended but is not intended for use by itself
|
13
|
-
# To call a PrimoWebService must explicity
|
14
|
+
# To call a PrimoWebService implementing classes must explicity
|
15
|
+
# call the method make_call.
|
14
16
|
class WebServiceBase
|
15
17
|
attr_reader :response, :error
|
16
18
|
|
@@ -113,14 +115,10 @@ module Exlibris
|
|
113
115
|
end
|
114
116
|
|
115
117
|
# SearchBrief does a brief result search through the Primo APIs
|
116
|
-
# Not all options are currently supported
|
118
|
+
# Not all Primo API options are currently supported
|
117
119
|
# Supported search params are
|
118
|
-
# :isbn
|
119
|
-
# :
|
120
|
-
# :title
|
121
|
-
# :author
|
122
|
-
# :genre
|
123
|
-
# e.g. {:isbn => "0143039008", :title => "Travels with My Aunt"}
|
120
|
+
# :isbn, :issn, :title :author, :genre
|
121
|
+
# e.g. {:isbn => "0143039008", :title => "Travels with My Aunt"}
|
124
122
|
# Invalid params will raise an exception
|
125
123
|
class SearchBrief < Search
|
126
124
|
def initialize(search_params, base_url, options={})
|
@@ -130,8 +128,8 @@ module Exlibris
|
|
130
128
|
end
|
131
129
|
end
|
132
130
|
|
133
|
-
# GetRecord get a
|
134
|
-
# Not all options are currently supported
|
131
|
+
# GetRecord get a Primo record based on doc id
|
132
|
+
# Not all Primo API options are currently supported
|
135
133
|
class GetRecord < Search
|
136
134
|
def initialize(doc_id, base_url, options={})
|
137
135
|
additional_input=[]
|
data/test/dummy/log/test.log
CHANGED
@@ -1646,3 +1646,59 @@
|
|
1646
1646
|
[1m[35m (0.1ms)[0m rollback transaction
|
1647
1647
|
[1m[36m (0.0ms)[0m [1mbegin transaction[0m
|
1648
1648
|
[1m[35m (0.1ms)[0m rollback transaction
|
1649
|
+
[1m[36m (1.5ms)[0m [1mbegin transaction[0m
|
1650
|
+
[1m[35m (0.0ms)[0m rollback transaction
|
1651
|
+
[1m[36m (0.0ms)[0m [1mbegin transaction[0m
|
1652
|
+
[1m[35m (0.1ms)[0m rollback transaction
|
1653
|
+
[1m[36m (0.0ms)[0m [1mbegin transaction[0m
|
1654
|
+
[1m[35m (0.1ms)[0m rollback transaction
|
1655
|
+
[1m[36m (0.0ms)[0m [1mbegin transaction[0m
|
1656
|
+
[1m[35m (0.1ms)[0m rollback transaction
|
1657
|
+
[1m[36m (0.0ms)[0m [1mbegin transaction[0m
|
1658
|
+
[1m[35m (0.1ms)[0m rollback transaction
|
1659
|
+
[1m[36m (0.0ms)[0m [1mbegin transaction[0m
|
1660
|
+
[1m[35m (0.1ms)[0m rollback transaction
|
1661
|
+
[1m[36m (0.0ms)[0m [1mbegin transaction[0m
|
1662
|
+
[1m[35m (0.1ms)[0m rollback transaction
|
1663
|
+
[1m[36m (0.0ms)[0m [1mbegin transaction[0m
|
1664
|
+
[1m[35m (0.1ms)[0m rollback transaction
|
1665
|
+
[1m[36m (0.0ms)[0m [1mbegin transaction[0m
|
1666
|
+
[1m[35m (0.1ms)[0m rollback transaction
|
1667
|
+
[1m[36m (0.0ms)[0m [1mbegin transaction[0m
|
1668
|
+
[1m[35m (0.1ms)[0m rollback transaction
|
1669
|
+
[1m[36m (0.0ms)[0m [1mbegin transaction[0m
|
1670
|
+
[1m[35m (0.1ms)[0m rollback transaction
|
1671
|
+
[1m[36m (0.0ms)[0m [1mbegin transaction[0m
|
1672
|
+
[1m[35m (0.0ms)[0m rollback transaction
|
1673
|
+
[1m[36m (0.0ms)[0m [1mbegin transaction[0m
|
1674
|
+
[1m[35m (0.0ms)[0m rollback transaction
|
1675
|
+
[1m[36m (0.0ms)[0m [1mbegin transaction[0m
|
1676
|
+
[1m[35m (0.1ms)[0m rollback transaction
|
1677
|
+
[1m[36m (0.0ms)[0m [1mbegin transaction[0m
|
1678
|
+
[1m[35m (0.1ms)[0m rollback transaction
|
1679
|
+
[1m[36m (0.0ms)[0m [1mbegin transaction[0m
|
1680
|
+
[1m[35m (0.1ms)[0m rollback transaction
|
1681
|
+
[1m[36m (0.0ms)[0m [1mbegin transaction[0m
|
1682
|
+
[1m[35m (0.1ms)[0m rollback transaction
|
1683
|
+
[1m[36m (0.0ms)[0m [1mbegin transaction[0m
|
1684
|
+
[1m[35m (0.1ms)[0m rollback transaction
|
1685
|
+
[1m[36m (0.0ms)[0m [1mbegin transaction[0m
|
1686
|
+
[1m[35m (0.1ms)[0m rollback transaction
|
1687
|
+
[1m[36m (0.0ms)[0m [1mbegin transaction[0m
|
1688
|
+
[1m[35m (0.1ms)[0m rollback transaction
|
1689
|
+
[1m[36m (0.0ms)[0m [1mbegin transaction[0m
|
1690
|
+
[1m[35m (0.1ms)[0m rollback transaction
|
1691
|
+
[1m[36m (0.0ms)[0m [1mbegin transaction[0m
|
1692
|
+
[1m[35m (0.1ms)[0m rollback transaction
|
1693
|
+
[1m[36m (0.0ms)[0m [1mbegin transaction[0m
|
1694
|
+
[1m[35m (0.1ms)[0m rollback transaction
|
1695
|
+
[1m[36m (0.0ms)[0m [1mbegin transaction[0m
|
1696
|
+
[1m[35m (0.1ms)[0m rollback transaction
|
1697
|
+
[1m[36m (0.0ms)[0m [1mbegin transaction[0m
|
1698
|
+
[1m[35m (0.1ms)[0m rollback transaction
|
1699
|
+
[1m[36m (0.0ms)[0m [1mbegin transaction[0m
|
1700
|
+
[1m[35m (0.1ms)[0m rollback transaction
|
1701
|
+
[1m[36m (0.0ms)[0m [1mbegin transaction[0m
|
1702
|
+
[1m[35m (0.1ms)[0m rollback transaction
|
1703
|
+
[1m[36m (0.0ms)[0m [1mbegin transaction[0m
|
1704
|
+
[1m[35m (0.1ms)[0m rollback transaction
|
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.0
|
4
|
+
version: 0.1.0
|
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-03-
|
12
|
+
date: 2012-03-30 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: rails
|
16
|
-
requirement: &
|
16
|
+
requirement: &2152708140 !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: *2152708140
|
25
25
|
- !ruby/object:Gem::Dependency
|
26
26
|
name: nokogiri
|
27
|
-
requirement: &
|
27
|
+
requirement: &2152707580 !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: *2152707580
|
36
36
|
- !ruby/object:Gem::Dependency
|
37
37
|
name: soap4r-ruby1.9
|
38
|
-
requirement: &
|
38
|
+
requirement: &2152706900 !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: *2152706900
|
47
47
|
- !ruby/object:Gem::Dependency
|
48
48
|
name: sqlite3
|
49
|
-
requirement: &
|
49
|
+
requirement: &2152706260 !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: *2152706260
|
58
58
|
description: Library to work with Exlibris' Primo discovery system.
|
59
59
|
email:
|
60
60
|
- scotdalton@gmail.com
|