umlaut-primo 0.0.1 → 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
data/README.md CHANGED
@@ -5,6 +5,94 @@
5
5
  [![Code Climate](https://codeclimate.com/github/team-umlaut/umlaut-primo.png)](https://codeclimate.com/github/team-umlaut/umlaut-primo)
6
6
  [![Coverage Status](https://coveralls.io/repos/team-umlaut/umlaut-primo/badge.png?branch=master)](https://coveralls.io/r/team-umlaut/umlaut-primo)
7
7
 
8
- Umlaut service to provide full text service responses, holdings, etc. from the Primo discovery solution.
8
+ Umlaut services to provide full text service responses, holdings, etc. from the Primo discovery solution.
9
9
 
10
- ## DOCUMENTATION COMING SOON
10
+ ## Installation
11
+ In order to use the Umlaut Primo service, first
12
+ [install Umlaut](https://github.com/team-umlaut/umlaut/wiki/Installation).
13
+ Then, in your Gemfile, add in the umlaut-primo gem, `gem 'umlaut-primo', '~> 0.1.0'`.
14
+ Run `bundle intall` to get the Gem and then start your application as you normally would.
15
+
16
+ ## Service Configuration
17
+ To use the Umlaut Primo services, they must be configured in `config/umlaut_service.yml`.
18
+ Two services are available for use, PrimoService and PrimoSource.
19
+
20
+ ### PrimoService
21
+ The `PrimoService` is the basic Primo service for getting service data from Primo.
22
+
23
+ Several configurations parameters are available to be set in config/umlaut_services.yml.
24
+ A sample configuration is below.
25
+
26
+ Primo: # Name of your choice
27
+ type: PrimoService # Required
28
+ priority: 2 # Required. I suggest running after the SFX service so you get the SFX referent enhancements
29
+ base_url: http://primo.library.edu # Required
30
+ vid: VID # Required
31
+ institution: INST # Required
32
+ holding_search_institution: SEARCH_INST # Optional. Defaults to the institution above.
33
+ holding_search_text: Search for this title in Primo. # Optional text for holding search. Defaults to "Search for this title."
34
+ suppress_holdings: [ !ruby/regexp '/\$\$LWEB/', !ruby/regexp '/\$\$1Restricted Internet Resources/' ] # Optional
35
+ ez_proxy: !ruby/regexp '/https\:\/\/ezproxy\.library\.edu\/login\?url=/' # Optional
36
+ service_types: # Optional. Defaults to [ "fulltext", "holding", "holding_search", "table_of_contents", "referent_enhance" ]
37
+ - holding
38
+ - holding_search
39
+ - fulltext
40
+ - table_of_contents
41
+ - referent_enhance
42
+ - highlighted_link
43
+
44
+
45
+
46
+ ### PrimoSource
47
+ The `PrimoSource` service depends on `PrimoService` and is used to expand Primo holdings based on information
48
+ from the data source.
49
+
50
+ Fi8rst, PrimoService must be configured with the `primo_source` service type instead of `holding`.
51
+
52
+ Primo: # Name of your choice
53
+ ...
54
+ service_types:
55
+ - primo_source
56
+ - holding_search
57
+ ...
58
+
59
+ Then you can configure the PrimoSource service in config/umlaut_services.yml
60
+
61
+ PrimoSource: # Name of your choice
62
+ type: PrimoSource # Required
63
+ priority: 3 # Required. Must be run after PrimoService
64
+ base_url: http://primo.library.edu # Required
65
+ vid: VID # Required
66
+ institution: INST # Required
67
+ source_attributes: # Optional.
68
+ - request_link_supports_ajax_call
69
+ - requestability
70
+
71
+ ## Primo Configuration
72
+ Primo offers several configuration options, specified in the Primo Back Office.
73
+ Since Umlaut doesn't have access to the Primo back office, the configurations need to be set in a separate file.
74
+ Umlaut Primo leverages the [exlibris-primo](https://github.com/scotdalton/exlibris-primo) gem which can set this configuration
75
+ via a YAML file. Umlaut Primo expects this YAML file to be in `config/primo.yml`, but you can tell the PrimoService where the
76
+ YAML file is with the `primo_config` parameter.
77
+
78
+ A sample YAML config file would look like this:
79
+
80
+ institutions:
81
+ "primo_institution_code": "Primo Institution String"
82
+ libraries:
83
+ "primo_library_code": "Primo Library String"
84
+ availability_statuses:
85
+ "status1_code": "Status One"
86
+ sources:
87
+ data_source1:
88
+ base_url: "http://source1.base.url
89
+ type: source_type
90
+ class_name: Source1Implementation (in exlibris/primo/sources or exlibris/primo/sources/local)
91
+ source1_config_option1: source1_config_option1
92
+ source1_config_option2: source1_config_option2
93
+ data_source2:
94
+ base_url: "http://source2.base.url
95
+ type: source_type
96
+ class_name: Source2Implementation (in exlibris/primo/sources or exlibris/primo/sources/local)
97
+ source2_config_option1: source2_config_option1
98
+ source2_config_option2: source2_config_option2
@@ -0,0 +1 @@
1
+ require 'umlaut_primo/railtie'
@@ -1,10 +1,6 @@
1
1
  # == Overview
2
- # PrimoService is a Service that makes a call to the Primo web services based on the OpenURL key value pairs.
3
- #--
4
- # NOT YET:
5
- # It first looks for rft.primo *DEPRECATED*, failing that, it parses the identifier for an id.
6
- #++
7
- # It first looks for rft.primo, the Primo id.
2
+ # PrimoService is an Umlaut Service that makes a call to the Primo web services based on the requested context object.
3
+ # It first looks for rft.primo *DEPRECATED*, failing that, it parses the request referrer identifier for an id.
8
4
  # If the Primo id is present, the service gets the PNX record from the Primo web
9
5
  # services.
10
6
  # If no Primo id is found, the service searches Primo by (in order of precedence):
@@ -13,102 +9,100 @@
13
9
  # * Title, Author, Genre
14
10
  #
15
11
  # == Available Services
16
- # Several service types are available in the Primo service. The default service types are:
12
+ # Several service types are available in the PrimoService. The default service types are:
17
13
  # fulltext, holding, holding_search, table_of_contents, referent_enhance, cover_image
18
14
  # Available service types are listed below and can be configured using the service_types parameter
19
- # in service.yml:
15
+ # in config/umlaut_services.yml:
20
16
  # * fulltext - parsed from links/linktorsrc elements in the PNX record
21
17
  # * holding - parsed from display/availlibrary elements in the PNX record
22
18
  # * holding_search - link to an exact title search in Primo if no holdings found AND the OpenURL did not come from Primo
23
19
  # * primo_source - similar to holdings but used in conjuction with the PrimoSource service to map Primo records to their original sources; a PrimoSource service must be defined in service.yml for this to work
24
20
  # * table_of_contents - parsed from links/linktotoc elements in the PNX record
25
21
  # * referent_enhance - metadata parsed from the addata section of the PNX record when the record was found by Primo id
26
- # * cover_image - parsed from first addata/lad02 element in the PNX record
27
22
  # * highlighted_link - parsed from links/addlink elements in the PNX record
28
23
  #
29
24
  # ==Available Parameters
30
- # Several configurations parameters are available to be set in services.yml, e.g.
31
- # Primo:
32
- # type: PrimoService
33
- # priority: 2 # After SFX, to get SFX metadata enhancement
34
- # status: active
35
- # base_url: http://bobcat.library.nyu.edu
36
- # vid: NYU
37
- # holding_search_institution: NYU
38
- # holding_search_text: Search for this title in BobCat.
39
- # suppress_holdings: [ !ruby/regexp '/\$\$LWEB/', !ruby/regexp '/\$\$1Restricted Internet Resources/' ]
40
- # ez_proxy: !ruby/regexp '/https\:\/\/ezproxy\.library\.nyu\.edu\/login\?url=/'
41
- # service_types:
25
+ # Several configurations parameters are available to be set in config/umlaut_services.yml.
26
+ # Primo: # Name of your choice
27
+ # type: PrimoService # Required
28
+ # priority: 2 # Required. I suggest running after the SFX service so you get the SFX referent enhancements
29
+ # base_url: http://primo.library.edu # Required
30
+ # vid: VID # Required
31
+ # institution: INST # Required
32
+ # holding_search_institution: SEARCH_INST # Optional. Defaults to the institution above.
33
+ # holding_search_text: Search for this title in Primo. # Optional text for holding search. Defaults to "Search for this title."
34
+ # suppress_holdings: [ !ruby/regexp '/\$\$LWEB/', !ruby/regexp '/\$\$1Restricted Internet Resources/' ] # Optional
35
+ # ez_proxy: !ruby/regexp '/https\:\/\/ezproxy\.library\.edu\/login\?url=/' # Optional
36
+ # service_types: # Optional. Defaults to [ "fulltext", "holding", "holding_search", "table_of_contents", "referent_enhance" ]
42
37
  # - holding
43
38
  # - holding_search
44
39
  # - fulltext
45
40
  # - table_of_contents
46
41
  # - referent_enhance
47
- # - cover_image
48
42
  # - highlighted_link
43
+ #
49
44
  # base_url:: _required_ host and port of Primo server; used for Primo web services, deep links and holding_search
50
45
  # base_path:: *DEPRECATED* previous name of base_url
51
46
  # vid:: _required_ view id for Primo deep links and holding_search.
52
47
  # institution:: _required_ institution id for Primo institution; used for Primo web services
53
48
  # base_view_id:: *DEPRECATED* previous name of vid
54
- # holding_search_institution:: _required if service types include holding_search_ institution to be used for the holding_search
49
+ # holding_search_institution:: if service types include holding_search_ and the holding search institution is different from
50
+ # institution to be used for the holding_search
55
51
  # holding_search_text:: _optional_ text to display for the holding_search
56
- # default holding search text:: "Search for this title."
52
+ # default holding search text:: "Search for this title."
57
53
  # link_to_search_text:: *DEPRECATED* previous name of holding_search_text
58
54
  # service_types:: _optional_ array of strings that represent the service types desired.
59
- # options are: fulltext, holding, holding_search, table_of_contents,
60
- # referent_enhance, cover_image, primo_source
61
- # defaults are: fulltext, holding, holding_search, table_of_contents,
62
- # referent_enhance, cover_image
63
- # if no options are specified, default service types will be added.
55
+ # options are: fulltext, holding, holding_search, table_of_contents,
56
+ # referent_enhance, cover_image, primo_source
57
+ # defaults are: fulltext, holding, holding_search, table_of_contents,
58
+ # referent_enhance, cover_image
59
+ # if no options are specified, default service types will be added.
64
60
  # suppress_urls:: _optional_ array of strings or regexps to NOT use from the catalog.
65
- # Used for linktorsrc elements that may duplicate resources from in other services.
66
- # Regexps can be put in the services.yml like this:
67
- # [!ruby/regexp '/sagepub.com$/']
61
+ # Used for linktorsrc elements that may duplicate resources from in other services.
62
+ # Regexps can be put in the services.yml like this:
63
+ # [!ruby/regexp '/sagepub.com$/']
68
64
  # suppress_holdings:: _optional_ array of strings or regexps to NOT use from the catalog.
69
- # Used for availlibrary elements that may duplicate resources from in other services.
70
- # Regexps can be put in the services.yml like this:
71
- # [!ruby/regexp '/\$\$LWEB$/']
65
+ # Used for availlibrary elements that may duplicate resources from in other services.
66
+ # Regexps can be put in the services.yml like this:
67
+ # [!ruby/regexp '/\$\$LWEB$/']
72
68
  # suppress_tocs:: _optional_ array of strings or regexps to NOT link to for Tables of Contents.
73
- # Used for linktotoc elements that may duplicate resources from in other services.
74
- # Regexps can be put in the services.yml like this:
75
- # [!ruby/regexp '/\$\$LWEB$/']
69
+ # Used for linktotoc elements that may duplicate resources from in other services.
70
+ # Regexps can be put in the services.yml like this:
71
+ # [!ruby/regexp '/\$\$LWEB$/']
76
72
  # service_types:: _optional_ array of strings that represent the service types desired.
77
- # options are: fulltext, holding, holding_search, table_of_contents,
78
- # referent_enhance, cover_image, primo_source
79
- # defaults are: fulltext, holding, holding_search, table_of_contents,
80
- # referent_enhance, cover_image
81
- # if no options are specified, default service types will be added.
73
+ # options are: fulltext, holding, holding_search, table_of_contents,
74
+ # referent_enhance, cover_image, primo_source
75
+ # defaults are: fulltext, holding, holding_search, table_of_contents,
76
+ # referent_enhance
77
+ # if no options are specified, default service types will be added.
82
78
  # ez_proxy:: _optional_ string or regexp of an ezproxy prefix.
83
79
  # used in the case where an ezproxy prefix (on any other regexp) is hardcoded in the URL,
84
80
  # and needs to be removed in order to match against SFXUrls.
85
81
  # Example:
86
82
  # !ruby/regexp '/https\:\/\/ezproxy\.library\.nyu\.edu\/login\?url=/'
87
83
  # primo_config:: _optional_ string representing the primo yaml config file in config/
88
- # default file name: primo.yml
89
- # hash mappings from yaml config
90
- # institutions:
91
- # "primo_institution_code": "Primo Institution String"
92
- # libraries:
93
- # "primo_library_code": "Primo Library String"
94
- # statuses:
95
- # "status1_code": "Status One"
96
- # sources:
97
- # data_source1:
98
- # base_url: "http://source1.base.url
99
- # type: source_type
100
- # class_name: Source1Implementation (in exlibris/primo/sources or exlibris/primo/sources/local)
101
- # source1_config_option1: source1_config_option1
102
- # source1_config_option2: source1_config_option2
103
- # data_source2:
104
- # base_url: "http://source2.base.url
105
- # type: source_type
106
- # class_name: Source2Implementation (in exlibris/primo/sources or exlibris/primo/sources/local)
107
- # source2_config_option1: source2_config_option1
108
- # source2_config_option2: source2_config_option2
109
- # holding_attributes:: _optional_ array of Holding attribute readers to save to
110
- # holding/primo_source service_data; can be used to save
111
- # custom source implementation attributes for display by a custom holding partial
84
+ # default file name: primo.yml
85
+ # hash mappings from yaml config
86
+ # institutions:
87
+ # "primo_institution_code": "Primo Institution String"
88
+ # libraries:
89
+ # "primo_library_code": "Primo Library String"
90
+ # availability_statuses:
91
+ # "status1_code": "Status One"
92
+ # sources:
93
+ # data_source1:
94
+ # base_url: "http://source1.base.url
95
+ # type: source_type
96
+ # class_name: Source1Implementation (in exlibris/primo/sources or exlibris/primo/sources/local)
97
+ # source1_config_option1: source1_config_option1
98
+ # source1_config_option2: source1_config_option2
99
+ # data_source2:
100
+ # base_url: "http://source2.base.url
101
+ # type: source_type
102
+ # class_name: Source2Implementation (in exlibris/primo/sources or exlibris/primo/sources/local)
103
+ # source2_config_option1: source2_config_option1
104
+ # source2_config_option2: source2_config_option2
105
+ #
112
106
  require 'exlibris-primo'
113
107
  class PrimoService < Service
114
108
 
@@ -122,6 +116,7 @@ class PrimoService < Service
122
116
 
123
117
  # Overwrites Service#new.
124
118
  def initialize(config)
119
+ @holding_search_text = "Search for this title."
125
120
  # Configure Primo
126
121
  configure_primo
127
122
  # Attributes for holding service data.
@@ -153,18 +148,11 @@ class PrimoService < Service
153
148
  @suppress_related_links = []
154
149
  @suppress_holdings = []
155
150
  @service_types = [ "fulltext", "holding", "holding_search",
156
- "table_of_contents", "referent_enhance", "cover_image" ] if @service_types.nil?
151
+ "table_of_contents", "referent_enhance" ] if @service_types.nil?
157
152
  backward_compatibility(config)
158
153
  super(config)
159
- # For backward compatibility, handle the special case where holding_search_institution was not included.
160
- # Set holding_search_institution to vid and print warning in the logs.
161
- if @service_types.include?("holding_search") and @holding_search_institution.nil?
162
- @holding_search_institution = @institution
163
- Rails.logger.warn("Required parameter 'holding_search_institution' was not set. Please set the appropriate value in umlaut_services.yml. Defaulting institution to view id, #{@vid}.")
164
- end # End backward compatibility maintenance
165
- raise ArgumentError.new(
166
- "Missing Service configuration parameter. Service type #{self.class} (id: #{self.id}) requires a config parameter named 'holding_search_institution'. Check your config/umlaut_services.yml file."
167
- ) if @service_types.include?("holding_search") and @holding_search_institution.nil?
154
+ # Handle the case where holding_search_institution is the same as institution.
155
+ @holding_search_institution = @institution if @service_types.include?("holding_search") and @holding_search_institution.nil?
168
156
  end
169
157
 
170
158
  # Overwrites Service#service_types_generated.
@@ -368,7 +356,7 @@ class PrimoService < Service
368
356
  def add_holding_search_service(request)
369
357
  service_data = {}
370
358
  service_data[:type] = "link_to_search"
371
- service_data[:display_text] = (@holding_search_text.nil?) ? "Search for this title." : @holding_search_text
359
+ service_data[:display_text] = @holding_search_text
372
360
  service_data[:note] = ""
373
361
  service_data[:url] = deep_link_search_url
374
362
  request.add_service_response(
@@ -466,7 +454,7 @@ class PrimoService < Service
466
454
 
467
455
  def config_file
468
456
  config_file = @primo_config.nil? ? default_config_file : "#{Rails.root}/config/"+ @primo_config
469
- Rails.logger.warn("Primo config file not found: #{config_file}.") and return "" unless File.exists?(config_file)
457
+ Rails.logger.info("Primo config file not found: #{config_file}.") and return "" unless File.exists?(config_file)
470
458
  config_file
471
459
  end
472
460
  private :config_file
@@ -4,7 +4,37 @@
4
4
  # based on the given Primo sources and can be implemented per source.
5
5
  #
6
6
  # PrimoSources are not necessary to use the Primo service andthey require programming.
7
- # However, they do allow further customization and functionality.
7
+ # They do, however, allow further customization and functionality.
8
+ #
9
+ # == Prerequisites
10
+ # First, the PrimoService must be configured with the primo_source service type instead of holding.
11
+ #
12
+ # Primo: # Name of your choice
13
+ # type: PrimoService
14
+ # ...
15
+ # service_types:
16
+ # - primo_source
17
+ # - holding_search
18
+ # ...
19
+ #
20
+ # ==Available Parameters
21
+ # Several configurations parameters are available to be set in config/umlaut_services.yml.
22
+ # PrimoSource: # Name of your choice
23
+ # type: PrimoSource # Required
24
+ # priority: 3 # Required. Must be run after PrimoService
25
+ # base_url: http://primo.library.edu # Required
26
+ # vid: VID # Required
27
+ # institution: INST # Required
28
+ # source_attributes: # Optional.
29
+ # - request_link_supports_ajax_call
30
+ # - requestability
31
+ #
32
+ # base_url:: _required_ host and port of Primo server for Primo display deep link
33
+ # vid:: _required_ view id for Primo display deep link
34
+ # institution:: _required_ institution id for Primo display deep link
35
+ # source_attributes:: _optional_ Array of Holding attribute readers to persist to
36
+ # holding service_data; can be used to save custom source implementation attributes
37
+ # for display by a custom holding partial
8
38
  #
9
39
  class PrimoSource < PrimoService
10
40
 
@@ -0,0 +1,8 @@
1
+ module UmlautPrimo
2
+ class Railtie < Rails::Railtie
3
+ initializer "umlaut_primo.initialize" do |app|
4
+ require "require_all"
5
+ require_all "#{File.dirname(__FILE__)}/../umlaut_primo/"
6
+ end
7
+ end
8
+ end
@@ -1,3 +1,3 @@
1
1
  module UmlautPrimo
2
- VERSION = "0.0.1"
2
+ VERSION = "0.1.0"
3
3
  end
@@ -9,7 +9,6 @@ if defined?(Bundler)
9
9
  # Bundler.require(:default, :assets, Rails.env)
10
10
  end
11
11
 
12
- require "umlaut"
13
12
  module Dummy
14
13
  class Application < Rails::Application
15
14
  # Settings in config/environments/* take precedence over those specified here.
@@ -24,6 +24,3 @@ default:
24
24
  base_url: http://bobcat.library.nyu.edu
25
25
  vid: NYU
26
26
  institution: NYU
27
- holding_search_institution: NYU
28
- holding_search_text: Search for this title in Primo.
29
- ez_proxy: !ruby/regexp '/https\:\/\/ezproxy\.library\.edu\/login\?url=/'