exlibris-primo 0.0.4 → 0.1.0
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 +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
|