qa 5.2.0 → 5.5.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.
- checksums.yaml +5 -5
- data/README.md +99 -73
- data/app/services/qa/linked_data/graph_service.rb +1 -0
- data/app/services/qa/linked_data/request_header_service.rb +20 -1
- data/lib/generators/qa/install/templates/config/initializers/qa.rb +5 -0
- data/lib/qa/authorities/geonames.rb +30 -4
- data/lib/qa/authorities/linked_data/find_term.rb +6 -4
- data/lib/qa/authorities/linked_data/search_query.rb +6 -4
- data/lib/qa/authorities/loc/generic_authority.rb +2 -2
- data/lib/qa/configuration.rb +9 -0
- data/lib/qa/version.rb +1 -1
- data/spec/controllers/linked_data_terms_controller_spec.rb +15 -0
- data/spec/controllers/terms_controller_spec.rb +2 -2
- data/spec/lib/authorities/geonames_spec.rb +30 -2
- data/spec/lib/authorities/getty/aat_spec.rb +2 -2
- data/spec/lib/authorities/getty/tgn_spec.rb +2 -2
- data/spec/lib/authorities/loc_spec.rb +9 -9
- data/spec/lib/mesh_data_parser_spec.rb +2 -2
- data/spec/services/linked_data/request_header_service_spec.rb +49 -0
- metadata +48 -9
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 7205f6d228b7548f6dc39ce9781dd4b591d2f4c5e56d5b2bcc4189b3c9005f7e
|
4
|
+
data.tar.gz: 5cdce31ba635c298e5da88cfc01cc86237426a45a1b8ccf3095c316c1eb7b8f4
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 39259b1eb80bcaab90653152302e38b853d24ecf1ff9bb46ca16afe637a35fe53b7d4abcf85ee2cc7ee7550b57bb6e7505f558adb10792056ea5573d7607b025
|
7
|
+
data.tar.gz: 3a748c62a1aa1b05d0f0b768af0a03ea2d2c6918c892c40cfc7ab1fdb619866053fb272d16b20a3241b9024c5d1dde8521fde108c36e33b59d55037d5d618e96
|
data/README.md
CHANGED
@@ -1,77 +1,83 @@
|
|
1
1
|
# Questioning Authority
|
2
2
|
|
3
|
-
Code:
|
4
|
-
[](http://badge.fury.io/rb/qa)
|
5
|
-
[](https://circleci.com/gh/samvera/questioning_authority)
|
6
|
-
[](https://coveralls.io/github/samvera/questioning_authority?branch=master)
|
3
|
+
Code: [](http://badge.fury.io/rb/qa) [](https://circleci.com/gh/samvera/questioning_authority) [](https://coveralls.io/github/samvera/questioning_authority?branch=master)
|
7
4
|
|
8
|
-
Docs:
|
9
|
-
[](./CONTRIBUTING.md)
|
10
|
-
[](./LICENSE)
|
5
|
+
Docs: [](./CONTRIBUTING.md) [](./LICENSE)
|
11
6
|
|
12
7
|
Jump In: [](http://slack.samvera.org/)
|
13
8
|
|
14
9
|
You should question your authorities.
|
15
10
|
|
16
|
-
|
11
|
+
--------------------------------------------------------------------------------
|
12
|
+
|
17
13
|
## Table of Contents
|
18
14
|
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
15
|
+
- [What does this do?](#what-does-this-do)
|
16
|
+
- [How does it work?](#how-does-it-work)
|
17
|
+
|
18
|
+
- [Sub-Authorities](#sub-authorities)
|
19
|
+
|
20
|
+
- [How do I use this?](#how-do-i-use-this)
|
21
|
+
|
22
|
+
- [Basic QA Requests](#basic-qa-requests)
|
23
|
+
- [Typical JSON Results](#typical-json-results)
|
24
|
+
|
25
|
+
- [Authority Sources information](#authority-sources-information)
|
26
|
+
|
27
|
+
- [Developer Notes](#developer-notes)
|
28
|
+
|
29
|
+
- [Compatibility](#compatibility)
|
30
|
+
- [Product Owner & Maintenance](#product-owner--maintenance)
|
31
|
+
|
32
|
+
- [Product Owner](#product-owner)
|
33
|
+
|
34
|
+
- [Help](#help)
|
35
|
+
|
36
|
+
- [Acknowledgments](#acknowledgments)
|
37
|
+
|
38
|
+
## Not seeing documentation you used to find in the README?
|
39
|
+
|
40
|
+
Much of the documentation has moved to the [Questioning Authority wiki](https://github.com/samvera/questioning_authority/wiki) to allow for better organization. We hope that you will find this easier to use.
|
41
|
+
|
42
|
+
--------------------------------------------------------------------------------
|
43
|
+
|
38
44
|
## What does this do?
|
39
45
|
|
40
|
-
Provides a set of uniform RESTful routes to query any controlled vocabulary or set of authority terms.
|
41
|
-
Results are returned in JSON and can be used within the context of a Rails application or any other
|
42
|
-
Ruby environment. Primary examples would include providing auto-complete functionality via Javascript
|
43
|
-
or populating a dropdown menu with a set of terms.
|
46
|
+
Provides a set of uniform RESTful routes to query any controlled vocabulary or set of authority terms. Results are returned in JSON and can be used within the context of a Rails application or any other Ruby environment. Primary examples would include providing auto-complete functionality via Javascript or populating a dropdown menu with a set of terms.
|
44
47
|
|
45
48
|
## How does it work?
|
46
49
|
|
47
|
-
Authorities are defined as classes, each implementing a set of methods allowing a controller to return
|
48
|
-
results from a given vocabulary in the JSON format. The controller does three things:
|
50
|
+
Authorities are defined as classes, each implementing a set of methods allowing a controller to return results from a given vocabulary in the JSON format. The controller does three things:
|
49
51
|
|
50
|
-
|
51
|
-
|
52
|
-
|
52
|
+
- provide a list of all terms (if allowed by the class)
|
53
|
+
- return a set of terms matching a given query
|
54
|
+
- return the complete information for a specific term given its identifier
|
53
55
|
|
54
|
-
Depending on the kind of authority or its API, the controller may not do all of these things such
|
55
|
-
as return a complete list of terms.
|
56
|
+
Depending on the kind of authority or its API, the controller may not do all of these things such as return a complete list of terms.
|
56
57
|
|
57
58
|
### Sub-Authorities
|
58
59
|
|
59
|
-
Some authorities, such as Library of Congress, allow sub-authorities which is an additional parameter that
|
60
|
-
further defines the kind of authority to use with the context of a larger one.
|
60
|
+
Some authorities, such as Library of Congress, allow sub-authorities which is an additional parameter that further defines the kind of authority to use with the context of a larger one.
|
61
61
|
|
62
62
|
## How do I use this?
|
63
63
|
|
64
64
|
Add the gem to your Gemfile
|
65
65
|
|
66
|
-
|
66
|
+
```
|
67
|
+
gem 'qa'
|
68
|
+
```
|
67
69
|
|
68
70
|
Run bundler
|
69
71
|
|
70
|
-
|
72
|
+
```
|
73
|
+
bundle install
|
74
|
+
```
|
71
75
|
|
72
76
|
Install the gem to your application
|
73
77
|
|
74
|
-
|
78
|
+
```
|
79
|
+
rails generate qa:install
|
80
|
+
```
|
75
81
|
|
76
82
|
This will copy over some additional config files and add the engine's routes to your `config/route.rb`.
|
77
83
|
|
@@ -79,84 +85,104 @@ Start questioning your authorities!
|
|
79
85
|
|
80
86
|
### Basic QA Requests
|
81
87
|
|
82
|
-
These show the basic routing patterns for connecting to authorities.
|
88
|
+
These show the basic routing patterns for connecting to authorities. See the [Questioning Authority wiki](https://github.com/samvera/questioning_authority/wiki) documentation for detailed documentation and examples for each authority and local authorities.
|
83
89
|
|
84
90
|
Return a complete list of terms:
|
85
91
|
|
86
|
-
|
87
|
-
|
92
|
+
```
|
93
|
+
/qa/terms/:vocab
|
94
|
+
/qa/terms/:vocab/:subauthority
|
95
|
+
```
|
88
96
|
|
89
97
|
Return a set of terms matching a given query
|
90
98
|
|
91
|
-
|
92
|
-
|
99
|
+
```
|
100
|
+
/qa/search/:vocab?q=search_term
|
101
|
+
/qa/search/:vocab/:subauthority?q=search_term
|
102
|
+
```
|
93
103
|
|
94
104
|
Return the complete information for a specific term given its identifier
|
95
105
|
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
106
|
+
```
|
107
|
+
/qa/show/:vocab/:id
|
108
|
+
/qa/show/:vocab/:subauthority/:id
|
109
|
+
```
|
100
110
|
|
101
111
|
### Typical JSON Results
|
102
112
|
|
103
113
|
Results are returned in JSON in this format:
|
104
114
|
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
115
|
+
```
|
116
|
+
[
|
117
|
+
{"id" : "subject_id_1", "label" : "First labels"},
|
118
|
+
{"id" : "subject_id_2", "label" : "Printing labels"},
|
119
|
+
{"id" : "", "label" : "This term has no id number"},
|
120
|
+
{"id" : "", "label" : "Neither does this"}
|
121
|
+
]
|
122
|
+
```
|
112
123
|
|
113
124
|
# Authority Sources information
|
114
125
|
|
115
126
|
See the [Questioning Authority wiki](https://github.com/samvera/questioning_authority/wiki) for documentation on how to connect to the supported authorities, documentation on how to create new authorities, and other useful tips.
|
116
127
|
|
117
|
-
|
118
128
|
# Developer Notes
|
119
129
|
|
120
130
|
[How to Contribute](./CONTRIBUTING.md)
|
121
131
|
|
122
132
|
To develop this gem, clone the repository, then run:
|
123
133
|
|
124
|
-
|
125
|
-
|
134
|
+
```
|
135
|
+
bundle install
|
136
|
+
rake ci
|
137
|
+
```
|
126
138
|
|
127
|
-
This will install the gems, create a dummy application under spec/internal and run the tests.
|
128
|
-
make sure you've included tests and run the test suite with a new sample application:
|
139
|
+
This will install the gems, create a dummy application under spec/internal and run the tests. After you've made changes, make sure you've included tests and run the test suite with a new sample application:
|
129
140
|
|
130
|
-
|
131
|
-
|
141
|
+
```
|
142
|
+
rake engine_cart:clean
|
143
|
+
rake ci
|
144
|
+
```
|
132
145
|
|
133
146
|
Commit your features into a new branch and submit a pull request.
|
134
147
|
|
135
148
|
## Compatibility
|
136
149
|
|
137
|
-
|
138
|
-
|
150
|
+
- Ruby 2.5 or the latest 2.4 version is recommended. Later versions may also work.
|
151
|
+
- Rails 5 is required. We recommend the latest Rails 5.2 release.
|
139
152
|
|
140
153
|
## Product Owner & Maintenance
|
141
154
|
|
142
|
-
Questioning Authority is a Core Component of the Samvera community. The documentation for
|
143
|
-
what this means can be found [here](http://samvera.github.io/core_components.html#requirements-for-a-core-component).
|
155
|
+
Questioning Authority is a Core Component of the Samvera community. The documentation for what this means can be found [here](http://samvera.github.io/core_components.html#requirements-for-a-core-component).
|
144
156
|
|
145
157
|
### Product Owner
|
146
158
|
|
147
159
|
[elrayle](https://github.com/elrayle)
|
148
160
|
|
161
|
+
## Releasing
|
162
|
+
|
163
|
+
1. `bundle install`
|
164
|
+
2. Increase the version number in `lib/qa/version.rb`
|
165
|
+
3. Increase the same version number in `.github_changelog_generator`
|
166
|
+
4. Update `CHANGELOG.md` by running this command:
|
167
|
+
|
168
|
+
```
|
169
|
+
github_changelog_generator --user samvera --project questioning_authority --token YOUR_GITHUB_TOKEN_HERE
|
170
|
+
```
|
171
|
+
|
172
|
+
5. Commit these changes to the master branch
|
173
|
+
|
174
|
+
6. Run `rake release`
|
175
|
+
|
149
176
|
# Help
|
150
177
|
|
151
178
|
The Samvera community is here to help. Please see our [support guide](./SUPPORT.md).
|
152
179
|
|
153
180
|
# Acknowledgments
|
154
181
|
|
155
|
-
This software has been developed by and is brought to you by the Samvera community.
|
156
|
-
[Samvera website](http://samvera.org/).
|
182
|
+
This software has been developed by and is brought to you by the Samvera community. Learn more at the [Samvera website](http://samvera.org/).
|
157
183
|
|
158
184
|

|
159
185
|
|
160
|
-
|
186
|
+
## Special thanks to...
|
161
187
|
|
162
188
|
[Jeremy Friesen](https://github.com/jeremyf) who gave us the name for our gem.
|
@@ -91,6 +91,7 @@ module Qa
|
|
91
91
|
end
|
92
92
|
|
93
93
|
def process_error(e, url)
|
94
|
+
Rails.logger.warn("******** RDF::Graph#load failure: exception=#{e.inspect}, url=#{url}")
|
94
95
|
uri = URI(url)
|
95
96
|
raise RDF::FormatError, "Unknown RDF format of results returned by #{uri}. (RDF::FormatError) You may need to include gem 'linkeddata'." if e.is_a? RDF::FormatError
|
96
97
|
response_code = ioerror_code(e)
|
@@ -1,8 +1,9 @@
|
|
1
1
|
# Service to construct a request header that includes optional attributes for search and fetch requests.
|
2
|
+
require 'geocoder'
|
2
3
|
module Qa
|
3
4
|
module LinkedData
|
4
5
|
class RequestHeaderService
|
5
|
-
attr_reader :request, :params
|
6
|
+
attr_reader :request, :params, :request_id
|
6
7
|
|
7
8
|
# @param request [HttpRequest] request from controller
|
8
9
|
# @param params [Hash] attribute-value pairs holding the request parameters
|
@@ -16,6 +17,8 @@ module Qa
|
|
16
17
|
def initialize(request:, params:)
|
17
18
|
@request = request
|
18
19
|
@params = params
|
20
|
+
@request_id = request.request_id
|
21
|
+
log_request
|
19
22
|
end
|
20
23
|
|
21
24
|
# Construct request parameters to pass to search_query (linked data module).
|
@@ -23,6 +26,8 @@ module Qa
|
|
23
26
|
# @see Qa::Authorities::LinkedData::SearchQuery
|
24
27
|
def search_header
|
25
28
|
header = {}
|
29
|
+
header[:request] = request
|
30
|
+
header[:request_id] = request_id
|
26
31
|
header[:subauthority] = params.fetch(:subauthority, nil)
|
27
32
|
header[:user_language] = user_language
|
28
33
|
header[:performance_data] = performance_data?
|
@@ -37,6 +42,8 @@ module Qa
|
|
37
42
|
# @see Qa::Authorities::LinkedData::FindTerm
|
38
43
|
def fetch_header
|
39
44
|
header = {}
|
45
|
+
header[:request] = request
|
46
|
+
header[:request_id] = request_id
|
40
47
|
header[:subauthority] = params.fetch(:subauthority, nil)
|
41
48
|
header[:user_language] = user_language
|
42
49
|
header[:performance_data] = performance_data?
|
@@ -62,6 +69,18 @@ module Qa
|
|
62
69
|
|
63
70
|
private
|
64
71
|
|
72
|
+
def log_request
|
73
|
+
msg = "******** #{request.path_parameters[:action].upcase}"
|
74
|
+
unless Qa.config.suppress_ip_data_from_log
|
75
|
+
gc = request.respond_to?(:location) ? request.location : nil
|
76
|
+
city = gc.nil? ? "UNKNOWN" : gc.city
|
77
|
+
state = gc.nil? ? "UNKNOWN" : gc.state
|
78
|
+
country = gc.nil? ? "UNKNOWN" : gc.country
|
79
|
+
msg += " from IP #{request.ip} in {city: #{city}, state: #{state}, country: #{country}}"
|
80
|
+
end
|
81
|
+
Rails.logger.info(msg)
|
82
|
+
end
|
83
|
+
|
65
84
|
# filter literals in results to this language
|
66
85
|
def user_language
|
67
86
|
request_language = request.env['HTTP_ACCEPT_LANGUAGE']
|
@@ -23,4 +23,9 @@ Qa.config do |config|
|
|
23
23
|
# When false, properties that do not override default optional behavior will be shown whether or not the property has a value in the graph.
|
24
24
|
# When true, properties that do not override default optional behavior will not be shown whn the property does not have a value in the graph.
|
25
25
|
# config.property_map_default_for_optional = false
|
26
|
+
|
27
|
+
# IP data including IP address, city, state, and country will be logged with each request.
|
28
|
+
# When false, IP data is logged
|
29
|
+
# When true, IP data will not be logged (default for backward compatibility)
|
30
|
+
# config.suppress_ip_data_from_log = true
|
26
31
|
end
|
@@ -2,7 +2,33 @@ module Qa::Authorities
|
|
2
2
|
class Geonames < Base
|
3
3
|
include WebServiceBase
|
4
4
|
|
5
|
-
class_attribute :username, :label
|
5
|
+
class_attribute :username, :label, :query_url_host, :find_url_host
|
6
|
+
|
7
|
+
# You may need to change your query_url_host in your implementation. To do
|
8
|
+
# so, in the installed application's config/initializers/qa.rb add the
|
9
|
+
# following:
|
10
|
+
#
|
11
|
+
# @example
|
12
|
+
# Qa::Authorities::Geonames.query_url_host = "http://ws.geonames.net"
|
13
|
+
#
|
14
|
+
# @note This is not exposed as part of the configuration block, but is
|
15
|
+
# something you can add after the configuration block.
|
16
|
+
# @todo Expose this magic value as a configuration option; Which likely
|
17
|
+
# requires consideration about how to do this for the general case
|
18
|
+
self.query_url_host = "http://api.geonames.org"
|
19
|
+
|
20
|
+
# You may need to change your query_url_host in your implementation. To do
|
21
|
+
# so, in the installed application's config/initializers/qa.rb add the
|
22
|
+
# following:
|
23
|
+
#
|
24
|
+
# @example
|
25
|
+
# Qa::Authorities::Geonames.find_url_host = "http://ws.geonames.net"
|
26
|
+
#
|
27
|
+
# @note This is not exposed as part of the configuration block, but is
|
28
|
+
# something you can add after the configuration block.
|
29
|
+
# @todo Expose this magic value as a configuration option; Which likely
|
30
|
+
# requires consideration about how to do this for the general case
|
31
|
+
self.find_url_host = "http://www.geonames.org"
|
6
32
|
|
7
33
|
self.label = lambda do |item|
|
8
34
|
[item['name'], item['adminName1'], item['countryName']].compact.join(', ')
|
@@ -18,7 +44,7 @@ module Qa::Authorities
|
|
18
44
|
|
19
45
|
def build_query_url(q)
|
20
46
|
query = ERB::Util.url_encode(untaint(q))
|
21
|
-
"
|
47
|
+
File.join(query_url_host, "searchJSON?q=#{query}&username=#{username}&maxRows=10")
|
22
48
|
end
|
23
49
|
|
24
50
|
def untaint(q)
|
@@ -30,7 +56,7 @@ module Qa::Authorities
|
|
30
56
|
end
|
31
57
|
|
32
58
|
def find_url(id)
|
33
|
-
"
|
59
|
+
File.join(find_url_host, "getJSON?geonameId=#{id}&username=#{username}")
|
34
60
|
end
|
35
61
|
|
36
62
|
private
|
@@ -39,7 +65,7 @@ module Qa::Authorities
|
|
39
65
|
def parse_authority_response(response)
|
40
66
|
response['geonames'].map do |result|
|
41
67
|
# Note: the trailing slash is meaningful.
|
42
|
-
{ 'id' => "
|
68
|
+
{ 'id' => "https://sws.geonames.org/#{result['geonameId']}/",
|
43
69
|
'label' => label.call(result) }
|
44
70
|
end
|
45
71
|
end
|
@@ -15,8 +15,8 @@ module Qa::Authorities
|
|
15
15
|
@term_config = term_config
|
16
16
|
end
|
17
17
|
|
18
|
-
attr_reader :term_config, :full_graph, :filtered_graph, :language, :id, :uri, :access_time_s, :normalize_time_s, :subauthority, :request_header
|
19
|
-
private :full_graph, :filtered_graph, :language, :id, :uri, :access_time_s, :normalize_time_s, :subauthority, :request_header
|
18
|
+
attr_reader :term_config, :full_graph, :filtered_graph, :language, :id, :uri, :access_time_s, :normalize_time_s, :subauthority, :request_header, :request_id, :request
|
19
|
+
private :full_graph, :filtered_graph, :language, :id, :uri, :access_time_s, :normalize_time_s, :subauthority, :request_header, :request_id, :request
|
20
20
|
|
21
21
|
delegate :term_subauthority?, :prefixes, :authority_name, to: :term_config
|
22
22
|
|
@@ -92,6 +92,8 @@ module Qa::Authorities
|
|
92
92
|
|
93
93
|
def unpack_request_header(request_header)
|
94
94
|
@request_header = request_header
|
95
|
+
@request = request_header.fetch(:request, nil)
|
96
|
+
@request_id = request_header.fetch(:request_id, 'UNASSIGNED')
|
95
97
|
@subauthority = request_header.fetch(:subauthority, nil)
|
96
98
|
@format = request_header.fetch(:format, 'json')
|
97
99
|
@performance_data = request_header.fetch(:performance_data, false)
|
@@ -110,8 +112,8 @@ module Qa::Authorities
|
|
110
112
|
predicate_map = preds_for_term
|
111
113
|
ldpath_map = ldpaths_for_term
|
112
114
|
|
113
|
-
raise Qa::InvalidConfiguration, "do not specify results using both predicates and ldpath in term configuration for linked data authority #{authority_name} (ldpath is preferred)" if predicate_map.present? && ldpath_map.present? # rubocop:disable
|
114
|
-
raise Qa::InvalidConfiguration, "must specify label_ldpath or label_predicate in term configuration for linked data authority #{authority_name} (label_ldpath is preferred)" unless ldpath_map.key?(:label) || predicate_map.key?(:label) # rubocop:disable
|
115
|
+
raise Qa::InvalidConfiguration, "do not specify results using both predicates and ldpath in term configuration for linked data authority #{authority_name} (ldpath is preferred)" if predicate_map.present? && ldpath_map.present? # rubocop:disable Layout/LineLength
|
116
|
+
raise Qa::InvalidConfiguration, "must specify label_ldpath or label_predicate in term configuration for linked data authority #{authority_name} (label_ldpath is preferred)" unless ldpath_map.key?(:label) || predicate_map.key?(:label) # rubocop:disable Layout/LineLength
|
115
117
|
|
116
118
|
if predicate_map.present?
|
117
119
|
Qa.deprecation_warning(
|
@@ -15,8 +15,8 @@ module Qa::Authorities
|
|
15
15
|
@search_config = search_config
|
16
16
|
end
|
17
17
|
|
18
|
-
attr_reader :search_config, :full_graph, :filtered_graph, :language, :access_time_s, :normalize_time_s, :subauthority, :request_header
|
19
|
-
private :full_graph, :filtered_graph, :language, :access_time_s, :normalize_time_s, :subauthority, :request_header
|
18
|
+
attr_reader :search_config, :full_graph, :filtered_graph, :language, :access_time_s, :normalize_time_s, :subauthority, :request_header, :request_id, :request
|
19
|
+
private :full_graph, :filtered_graph, :language, :access_time_s, :normalize_time_s, :subauthority, :request_header, :request_id, :request
|
20
20
|
|
21
21
|
delegate :subauthority?, :supports_sort?, :prefixes, :authority_name, to: :search_config
|
22
22
|
|
@@ -74,8 +74,8 @@ module Qa::Authorities
|
|
74
74
|
predicate_map = preds_for_search
|
75
75
|
ldpath_map = ldpaths_for_search
|
76
76
|
|
77
|
-
raise Qa::InvalidConfiguration, "do not specify results using both predicates and ldpath in search configuration for linked data authority #{authority_name} (ldpath is preferred)" if predicate_map.present? && ldpath_map.present? # rubocop:disable
|
78
|
-
raise Qa::InvalidConfiguration, "must specify label_ldpath or label_predicate in search configuration for linked data authority #{authority_name} (label_ldpath is preferred)" unless ldpath_map.key?(:label) || predicate_map.key?(:label) # rubocop:disable
|
77
|
+
raise Qa::InvalidConfiguration, "do not specify results using both predicates and ldpath in search configuration for linked data authority #{authority_name} (ldpath is preferred)" if predicate_map.present? && ldpath_map.present? # rubocop:disable Layout/LineLength
|
78
|
+
raise Qa::InvalidConfiguration, "must specify label_ldpath or label_predicate in search configuration for linked data authority #{authority_name} (label_ldpath is preferred)" unless ldpath_map.key?(:label) || predicate_map.key?(:label) # rubocop:disable Layout/LineLength
|
79
79
|
|
80
80
|
if predicate_map.present?
|
81
81
|
Qa.deprecation_warning(
|
@@ -91,6 +91,8 @@ module Qa::Authorities
|
|
91
91
|
|
92
92
|
def unpack_request_header(request_header)
|
93
93
|
@request_header = request_header
|
94
|
+
@request = request_header.fetch(:request, nil)
|
95
|
+
@request_id = request_header.fetch(:request_id, 'UNASSIGNED')
|
94
96
|
@subauthority = request_header.fetch(:subauthority, nil)
|
95
97
|
@context = request_header.fetch(:context, false)
|
96
98
|
@performance_data = request_header.fetch(:performance_data, false)
|
@@ -26,7 +26,7 @@ module Qa::Authorities
|
|
26
26
|
def build_query_url(q)
|
27
27
|
escaped_query = ERB::Util.url_encode(q)
|
28
28
|
authority_fragment = Loc.get_url_for_authority(subauthority) + ERB::Util.url_encode(subauthority)
|
29
|
-
"
|
29
|
+
"https://id.loc.gov/search/?q=#{escaped_query}&q=#{authority_fragment}&format=json"
|
30
30
|
end
|
31
31
|
|
32
32
|
def find(id)
|
@@ -34,7 +34,7 @@ module Qa::Authorities
|
|
34
34
|
end
|
35
35
|
|
36
36
|
def find_url(id)
|
37
|
-
"
|
37
|
+
"https://id.loc.gov/authorities/#{@subauthority}/#{id}.json"
|
38
38
|
end
|
39
39
|
|
40
40
|
private
|
data/lib/qa/configuration.rb
CHANGED
@@ -54,5 +54,14 @@ module Qa
|
|
54
54
|
@property_map_default_for_optional = false if @property_map_default_for_optional.nil?
|
55
55
|
@property_map_default_for_optional
|
56
56
|
end
|
57
|
+
|
58
|
+
# IP data including IP address, city, state, and country will be logged with each request.
|
59
|
+
# When false, IP data is logged
|
60
|
+
# When true, IP data will not be logged (default for backward compatibility)
|
61
|
+
attr_writer :suppress_ip_data_from_log
|
62
|
+
def suppress_ip_data_from_log
|
63
|
+
@suppress_ip_data_from_log = true if @suppress_ip_data_from_log.nil?
|
64
|
+
@suppress_ip_data_from_log
|
65
|
+
end
|
57
66
|
end
|
58
67
|
end
|
data/lib/qa/version.rb
CHANGED
@@ -2,6 +2,7 @@ require 'spec_helper'
|
|
2
2
|
require 'json'
|
3
3
|
|
4
4
|
describe Qa::LinkedDataTermsController, type: :controller do
|
5
|
+
let(:graph_load_failure) { /^\*\*\*\*\*\*\*\* RDF\:\:Graph\#load failure/ }
|
5
6
|
before do
|
6
7
|
@routes = Qa::Engine.routes
|
7
8
|
end
|
@@ -140,6 +141,7 @@ describe Qa::LinkedDataTermsController, type: :controller do
|
|
140
141
|
.to_return(status: 500)
|
141
142
|
end
|
142
143
|
it 'returns 500' do
|
144
|
+
expect(Rails.logger).to receive(:warn).with(graph_load_failure)
|
143
145
|
expect(Rails.logger).to receive(:warn).with("Internal Server Error - Search query my_query unsuccessful for authority OCLC_FAST")
|
144
146
|
get :search, params: { q: 'my_query', vocab: 'OCLC_FAST', maximumRecords: '3' }
|
145
147
|
expect(response.code).to eq('500')
|
@@ -154,6 +156,7 @@ describe Qa::LinkedDataTermsController, type: :controller do
|
|
154
156
|
end
|
155
157
|
it 'returns 500' do
|
156
158
|
msg = "RDF Format Error - Results from search query my_query for authority OCLC_FAST was not identified as a valid RDF format. You may need to include the linkeddata gem."
|
159
|
+
expect(Rails.logger).to receive(:warn).with(graph_load_failure)
|
157
160
|
expect(Rails.logger).to receive(:warn).with(msg)
|
158
161
|
get :search, params: { q: 'my_query', vocab: 'OCLC_FAST', maximumRecords: '3' }
|
159
162
|
expect(response.code).to eq('500')
|
@@ -166,6 +169,7 @@ describe Qa::LinkedDataTermsController, type: :controller do
|
|
166
169
|
.to_return(status: 501)
|
167
170
|
end
|
168
171
|
it 'returns 500' do
|
172
|
+
expect(Rails.logger).to receive(:warn).with(graph_load_failure)
|
169
173
|
expect(Rails.logger).to receive(:warn).with("Internal Server Error - Search query my_query unsuccessful for authority OCLC_FAST")
|
170
174
|
get :search, params: { q: 'my_query', vocab: 'OCLC_FAST', maximumRecords: '3' }
|
171
175
|
expect(response.code).to eq('500')
|
@@ -179,6 +183,7 @@ describe Qa::LinkedDataTermsController, type: :controller do
|
|
179
183
|
.to_return(status: 503)
|
180
184
|
end
|
181
185
|
it 'returns 503' do
|
186
|
+
expect(Rails.logger).to receive(:warn).with(graph_load_failure)
|
182
187
|
expect(Rails.logger).to receive(:warn).with("Service Unavailable - Search query my_query unsuccessful for authority OCLC_FAST")
|
183
188
|
get :search, params: { q: 'my_query', vocab: 'OCLC_FAST', maximumRecords: '3' }
|
184
189
|
expect(response.code).to eq('503')
|
@@ -355,6 +360,7 @@ describe Qa::LinkedDataTermsController, type: :controller do
|
|
355
360
|
stub_request(:get, 'http://id.worldcat.org/fast/530369').to_return(status: 500)
|
356
361
|
end
|
357
362
|
it 'returns 500' do
|
363
|
+
expect(Rails.logger).to receive(:warn).with(graph_load_failure)
|
358
364
|
expect(Rails.logger).to receive(:warn).with("Internal Server Error - Fetch term 530369 unsuccessful for authority OCLC_FAST")
|
359
365
|
get :show, params: { id: '530369', vocab: 'OCLC_FAST' }
|
360
366
|
expect(response.code).to eq('500')
|
@@ -380,6 +386,7 @@ describe Qa::LinkedDataTermsController, type: :controller do
|
|
380
386
|
end
|
381
387
|
it 'returns 500' do
|
382
388
|
msg = "RDF Format Error - Results from fetch term 530369 for authority OCLC_FAST was not identified as a valid RDF format. You may need to include the linkeddata gem."
|
389
|
+
expect(Rails.logger).to receive(:warn).with(graph_load_failure)
|
383
390
|
expect(Rails.logger).to receive(:warn).with(msg)
|
384
391
|
get :show, params: { id: '530369', vocab: 'OCLC_FAST' }
|
385
392
|
expect(response.code).to eq('500')
|
@@ -391,6 +398,7 @@ describe Qa::LinkedDataTermsController, type: :controller do
|
|
391
398
|
stub_request(:get, 'http://id.worldcat.org/fast/530369').to_return(status: 501)
|
392
399
|
end
|
393
400
|
it 'returns 500' do
|
401
|
+
expect(Rails.logger).to receive(:warn).with(graph_load_failure)
|
394
402
|
expect(Rails.logger).to receive(:warn).with("Internal Server Error - Fetch term 530369 unsuccessful for authority OCLC_FAST")
|
395
403
|
get :show, params: { id: '530369', vocab: 'OCLC_FAST' }
|
396
404
|
expect(response.code).to eq('500')
|
@@ -403,6 +411,7 @@ describe Qa::LinkedDataTermsController, type: :controller do
|
|
403
411
|
stub_request(:get, 'http://id.worldcat.org/fast/530369').to_return(status: 503)
|
404
412
|
end
|
405
413
|
it 'returns 503' do
|
414
|
+
expect(Rails.logger).to receive(:warn).with(graph_load_failure)
|
406
415
|
expect(Rails.logger).to receive(:warn).with("Service Unavailable - Fetch term 530369 unsuccessful for authority OCLC_FAST")
|
407
416
|
get :show, params: { id: '530369', vocab: 'OCLC_FAST' }
|
408
417
|
expect(response.code).to eq('503')
|
@@ -414,6 +423,7 @@ describe Qa::LinkedDataTermsController, type: :controller do
|
|
414
423
|
stub_request(:get, 'http://id.worldcat.org/fast/FAKE_ID').to_return(status: 404, body: '', headers: {})
|
415
424
|
end
|
416
425
|
it 'returns 404' do
|
426
|
+
expect(Rails.logger).to receive(:warn).with(graph_load_failure)
|
417
427
|
expect(Rails.logger).to receive(:warn).with('Term Not Found - Fetch term FAKE_ID unsuccessful for authority OCLC_FAST')
|
418
428
|
get :show, params: { id: 'FAKE_ID', vocab: 'OCLC_FAST' }
|
419
429
|
expect(response.code).to eq('404')
|
@@ -566,6 +576,7 @@ describe Qa::LinkedDataTermsController, type: :controller do
|
|
566
576
|
stub_request(:get, 'http://localhost/test_default/term?uri=http://id.worldcat.org/fast/530369').to_return(status: 500)
|
567
577
|
end
|
568
578
|
it 'returns 500' do
|
579
|
+
expect(Rails.logger).to receive(:warn).with(graph_load_failure)
|
569
580
|
expect(Rails.logger).to receive(:warn).with("Internal Server Error - Fetch term http://id.worldcat.org/fast/530369 unsuccessful for authority LOD_TERM_URI_PARAM_CONFIG")
|
570
581
|
get :fetch, params: { vocab: 'LOD_TERM_URI_PARAM_CONFIG', uri: 'http://id.worldcat.org/fast/530369' }
|
571
582
|
expect(response.code).to eq('500')
|
@@ -580,6 +591,7 @@ describe Qa::LinkedDataTermsController, type: :controller do
|
|
580
591
|
it 'returns 500' do
|
581
592
|
msg = "RDF Format Error - Results from fetch term http://id.worldcat.org/fast/530369 for authority LOD_TERM_URI_PARAM_CONFIG was not identified as a valid RDF format. " \
|
582
593
|
"You may need to include the linkeddata gem."
|
594
|
+
expect(Rails.logger).to receive(:warn).with(graph_load_failure)
|
583
595
|
expect(Rails.logger).to receive(:warn).with(msg)
|
584
596
|
get :fetch, params: { uri: 'http://id.worldcat.org/fast/530369', vocab: 'LOD_TERM_URI_PARAM_CONFIG' }
|
585
597
|
expect(response.code).to eq('500')
|
@@ -591,6 +603,7 @@ describe Qa::LinkedDataTermsController, type: :controller do
|
|
591
603
|
stub_request(:get, 'http://localhost/test_default/term?uri=http://id.worldcat.org/fast/530369').to_return(status: 501)
|
592
604
|
end
|
593
605
|
it 'returns 500' do
|
606
|
+
expect(Rails.logger).to receive(:warn).with(graph_load_failure)
|
594
607
|
expect(Rails.logger).to receive(:warn).with("Internal Server Error - Fetch term http://id.worldcat.org/fast/530369 unsuccessful for authority LOD_TERM_URI_PARAM_CONFIG")
|
595
608
|
get :fetch, params: { uri: 'http://id.worldcat.org/fast/530369', vocab: 'LOD_TERM_URI_PARAM_CONFIG' }
|
596
609
|
expect(response.code).to eq('500')
|
@@ -603,6 +616,7 @@ describe Qa::LinkedDataTermsController, type: :controller do
|
|
603
616
|
stub_request(:get, 'http://localhost/test_default/term?uri=http://id.worldcat.org/fast/530369').to_return(status: 503)
|
604
617
|
end
|
605
618
|
it 'returns 503' do
|
619
|
+
expect(Rails.logger).to receive(:warn).with(graph_load_failure)
|
606
620
|
expect(Rails.logger).to receive(:warn).with("Service Unavailable - Fetch term http://id.worldcat.org/fast/530369 unsuccessful for authority LOD_TERM_URI_PARAM_CONFIG")
|
607
621
|
get :fetch, params: { uri: 'http://id.worldcat.org/fast/530369', vocab: 'LOD_TERM_URI_PARAM_CONFIG' }
|
608
622
|
expect(response.code).to eq('503')
|
@@ -614,6 +628,7 @@ describe Qa::LinkedDataTermsController, type: :controller do
|
|
614
628
|
stub_request(:get, 'http://localhost/test_default/term?uri=http://test.org/FAKE_ID').to_return(status: 404, body: '', headers: {})
|
615
629
|
end
|
616
630
|
it 'returns 404' do
|
631
|
+
expect(Rails.logger).to receive(:warn).with(graph_load_failure)
|
617
632
|
expect(Rails.logger).to receive(:warn).with('Term Not Found - Fetch term http://test.org/FAKE_ID unsuccessful for authority LOD_TERM_URI_PARAM_CONFIG')
|
618
633
|
get :fetch, params: { uri: 'http://test.org/FAKE_ID', vocab: 'LOD_TERM_URI_PARAM_CONFIG' }
|
619
634
|
expect(response.code).to eq('404')
|
@@ -82,7 +82,7 @@ describe Qa::TermsController, type: :controller do
|
|
82
82
|
|
83
83
|
context "loc" do
|
84
84
|
before do
|
85
|
-
stub_request(:get, "
|
85
|
+
stub_request(:get, "https://id.loc.gov/search/?format=json&q=Berry&q=cs:http://id.loc.gov/authorities/names")
|
86
86
|
.with(headers: { 'Accept' => 'application/json' })
|
87
87
|
.to_return(body: webmock_fixture("loc-names-response.txt"), status: 200)
|
88
88
|
end
|
@@ -188,7 +188,7 @@ describe Qa::TermsController, type: :controller do
|
|
188
188
|
describe "#show" do
|
189
189
|
context "with supported authorities" do
|
190
190
|
before do
|
191
|
-
stub_request(:get, "
|
191
|
+
stub_request(:get, "https://id.loc.gov/authorities/subjects/sh85077565.json")
|
192
192
|
.with(headers: { 'Accept' => 'application/json' })
|
193
193
|
.to_return(status: 200, body: webmock_fixture("loc-names-response.txt"), headers: {})
|
194
194
|
end
|
@@ -7,6 +7,34 @@ describe Qa::Authorities::Geonames do
|
|
7
7
|
|
8
8
|
let(:authority) { described_class.new }
|
9
9
|
|
10
|
+
describe ".query_url_host" do
|
11
|
+
subject { described_class.query_url_host }
|
12
|
+
it { is_expected.to eq "http://api.geonames.org" }
|
13
|
+
it "can be overridden" do
|
14
|
+
begin
|
15
|
+
before_change = described_class.query_url_host
|
16
|
+
described_class.query_url_host = "http://myhost.com"
|
17
|
+
expect(described_class.query_url_host).to eq("http://myhost.com")
|
18
|
+
ensure
|
19
|
+
described_class.query_url_host = before_change
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
describe ".find_url_host" do
|
25
|
+
subject { described_class.find_url_host }
|
26
|
+
it { is_expected.to eq "http://www.geonames.org" }
|
27
|
+
it "can be overridden" do
|
28
|
+
begin
|
29
|
+
before_change = described_class.find_url_host
|
30
|
+
described_class.find_url_host = "http://myhost.com"
|
31
|
+
expect(described_class.find_url_host).to eq("http://myhost.com")
|
32
|
+
ensure
|
33
|
+
described_class.find_url_host = before_change
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
10
38
|
describe "#build_query_url" do
|
11
39
|
subject { authority.build_query_url("foo") }
|
12
40
|
it { is_expected.to eq 'http://api.geonames.org/searchJSON?q=foo&username=dummy&maxRows=10' }
|
@@ -28,9 +56,9 @@ describe Qa::Authorities::Geonames do
|
|
28
56
|
|
29
57
|
context "with default label" do
|
30
58
|
it "has id and label keys" do
|
31
|
-
expect(subject.first).to eq("id" => '
|
59
|
+
expect(subject.first).to eq("id" => 'https://sws.geonames.org/2088122/',
|
32
60
|
"label" => "Port Moresby, National Capital, Papua New Guinea")
|
33
|
-
expect(subject.last).to eq("id" => '
|
61
|
+
expect(subject.last).to eq("id" => 'https://sws.geonames.org/377039/',
|
34
62
|
"label" => "Port Sudan, Red Sea, Sudan")
|
35
63
|
expect(subject.size).to eq(10)
|
36
64
|
end
|
@@ -77,7 +77,7 @@ describe Qa::Authorities::Getty::AAT do
|
|
77
77
|
subject { authority.request_options }
|
78
78
|
it { is_expected.to eq(accept: "application/sparql-results+json") }
|
79
79
|
end
|
80
|
-
# rubocop:disable
|
80
|
+
# rubocop:disable Layout/LineLength
|
81
81
|
describe "#sparql" do
|
82
82
|
context "using a single subject term" do
|
83
83
|
subject { authority.sparql('search_term') }
|
@@ -92,5 +92,5 @@ describe Qa::Authorities::Getty::AAT do
|
|
92
92
|
}
|
93
93
|
end
|
94
94
|
end
|
95
|
-
# rubocop:enable
|
95
|
+
# rubocop:enable Layout/LineLength
|
96
96
|
end
|
@@ -77,7 +77,7 @@ describe Qa::Authorities::Getty::TGN do
|
|
77
77
|
subject { authority.request_options }
|
78
78
|
it { is_expected.to eq(accept: "application/sparql-results+json") }
|
79
79
|
end
|
80
|
-
# rubocop:disable
|
80
|
+
# rubocop:disable Layout/LineLength
|
81
81
|
describe "#sparql" do
|
82
82
|
context "using a single subject term" do
|
83
83
|
subject { authority.sparql('search_term') }
|
@@ -92,5 +92,5 @@ describe Qa::Authorities::Getty::TGN do
|
|
92
92
|
}
|
93
93
|
end
|
94
94
|
end
|
95
|
-
# rubocop:enable
|
95
|
+
# rubocop:enable Layout/LineLength
|
96
96
|
end
|
@@ -28,14 +28,14 @@ describe Qa::Authorities::Loc do
|
|
28
28
|
end
|
29
29
|
|
30
30
|
context "for searching" do
|
31
|
-
let(:url) { '
|
31
|
+
let(:url) { 'https://id.loc.gov/search/?q=foo&q=cs%3Ahttp%3A%2F%2Fid.loc.gov%2Fauthorities%2Fsubjects&format=json' }
|
32
32
|
it "returns a url" do
|
33
33
|
expect(authority.build_query_url("foo")).to eq(url)
|
34
34
|
end
|
35
35
|
end
|
36
36
|
|
37
37
|
context "for returning single terms" do
|
38
|
-
let(:url) { "
|
38
|
+
let(:url) { "https://id.loc.gov/authorities/subjects/sh2002003586.json" }
|
39
39
|
it "returns a url with an authority and id" do
|
40
40
|
expect(authority.find_url("sh2002003586")).to eq(url)
|
41
41
|
end
|
@@ -49,15 +49,15 @@ describe Qa::Authorities::Loc do
|
|
49
49
|
end
|
50
50
|
|
51
51
|
before do
|
52
|
-
stub_request(:get, "
|
52
|
+
stub_request(:get, "https://id.loc.gov/search/?format=json&q=cs:http://id.loc.gov/authorities/subjects")
|
53
53
|
.with(headers: { 'Accept' => 'application/json' })
|
54
54
|
.to_return(status: 200, body: "")
|
55
55
|
end
|
56
56
|
|
57
57
|
context "with flat params encoded" do
|
58
|
-
let(:url) { '
|
58
|
+
let(:url) { 'https://id.loc.gov/search/?q=foo&q=cs%3Ahttp%3A%2F%2Fid.loc.gov%2Fauthorities%2Fsubjects&format=json' }
|
59
59
|
it "returns a response" do
|
60
|
-
flat_params_url = "
|
60
|
+
flat_params_url = "https://id.loc.gov/search/?format=json&q=foo&q=cs%3Ahttp%3A%2F%2Fid.loc.gov%2Fauthorities%2Fsubjects"
|
61
61
|
expect(subject.env.url.to_s).to eq(flat_params_url)
|
62
62
|
end
|
63
63
|
end
|
@@ -66,7 +66,7 @@ describe Qa::Authorities::Loc do
|
|
66
66
|
describe "#search" do
|
67
67
|
context "any LOC authorities" do
|
68
68
|
let :authority do
|
69
|
-
stub_request(:get, "
|
69
|
+
stub_request(:get, "https://id.loc.gov/search/?format=json&q=s&q=cs:http://id.loc.gov/vocabulary/geographicAreas")
|
70
70
|
.with(headers: { 'Accept' => 'application/json' })
|
71
71
|
.to_return(body: webmock_fixture("loc-response.txt"), status: 200)
|
72
72
|
described_class.subauthority_for("geographicAreas")
|
@@ -95,7 +95,7 @@ describe Qa::Authorities::Loc do
|
|
95
95
|
|
96
96
|
context "subject terms" do
|
97
97
|
let :results do
|
98
|
-
stub_request(:get, "
|
98
|
+
stub_request(:get, "https://id.loc.gov/search/?format=json&q=History--&q=cs:http://id.loc.gov/authorities/subjects")
|
99
99
|
.with(headers: { 'Accept' => 'application/json' })
|
100
100
|
.to_return(body: webmock_fixture("loc-subjects-response.txt"), status: 200)
|
101
101
|
described_class.subauthority_for("subjects").search("History--")
|
@@ -111,7 +111,7 @@ describe Qa::Authorities::Loc do
|
|
111
111
|
|
112
112
|
context "name terms" do
|
113
113
|
let :results do
|
114
|
-
stub_request(:get, "
|
114
|
+
stub_request(:get, "https://id.loc.gov/search/?format=json&q=Berry&q=cs:http://id.loc.gov/authorities/names")
|
115
115
|
.with(headers: { 'Accept' => 'application/json' })
|
116
116
|
.to_return(body: webmock_fixture("loc-names-response.txt"), status: 200)
|
117
117
|
described_class.subauthority_for("names").search("Berry")
|
@@ -125,7 +125,7 @@ describe Qa::Authorities::Loc do
|
|
125
125
|
describe "#find" do
|
126
126
|
context "using a subject id" do
|
127
127
|
let :results do
|
128
|
-
stub_request(:get, "
|
128
|
+
stub_request(:get, "https://id.loc.gov/authorities/subjects/sh2002003586.json")
|
129
129
|
.with(headers: { 'Accept' => 'application/json' })
|
130
130
|
.to_return(status: 200, body: webmock_fixture("loc-subject-find-response.txt"), headers: {})
|
131
131
|
described_class.subauthority_for("subjects").find("sh2002003586")
|
@@ -47,7 +47,7 @@ EOS
|
|
47
47
|
expect(records[1]).to eq({})
|
48
48
|
end
|
49
49
|
|
50
|
-
# rubocop:disable
|
50
|
+
# rubocop:disable Layout/LineLength
|
51
51
|
it 'parses a sample mesh file' do
|
52
52
|
mesh = described_class.new(webmock_fixture('mesh.txt'))
|
53
53
|
records = mesh.all_records
|
@@ -117,5 +117,5 @@ EOS
|
|
117
117
|
"DX" => ["19840101"],
|
118
118
|
"UI" => ["D000001"])
|
119
119
|
end
|
120
|
-
# rubocop:enable
|
120
|
+
# rubocop:enable Layout/LineLength
|
121
121
|
end
|
@@ -2,8 +2,44 @@ require 'spec_helper'
|
|
2
2
|
|
3
3
|
RSpec.describe Qa::LinkedData::RequestHeaderService do
|
4
4
|
let(:request) { double }
|
5
|
+
let(:request_id) { 'anID' }
|
6
|
+
let(:some_params) { double }
|
7
|
+
let(:location) { double }
|
8
|
+
let(:fake_ip) { '111.22.33.4444' }
|
9
|
+
let(:city) { 'Ithaca' }
|
10
|
+
let(:state) { 'New York' }
|
11
|
+
let(:country) { 'US' }
|
12
|
+
before do
|
13
|
+
allow(request).to receive(:request_id).and_return(request_id)
|
14
|
+
allow(request).to receive_message_chain(:path_parameters, :[]).with(:action).and_return('search') # rubocop:disable RSpec/MessageChain
|
15
|
+
allow(request).to receive(:location).and_return(location)
|
16
|
+
allow(request).to receive(:ip).and_return(fake_ip)
|
17
|
+
allow(location).to receive(:city).and_return(city)
|
18
|
+
allow(location).to receive(:state).and_return(state)
|
19
|
+
allow(location).to receive(:country).and_return(country)
|
20
|
+
end
|
21
|
+
|
22
|
+
describe '#initialize' do
|
23
|
+
context 'when Qa.config.suppress_ip_data_from_log is true' do
|
24
|
+
before { allow(Qa).to receive_message_chain(:config, :suppress_ip_data_from_log).and_return(true) } # rubocop:disable RSpec/MessageChain
|
25
|
+
it 'does not include IP info in log message' do
|
26
|
+
expect(Rails.logger).to receive(:info).with("******** SEARCH")
|
27
|
+
described_class.new(request: request, params: some_params)
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
context 'when Qa.config.suppress_ip_data_from_log is false' do
|
32
|
+
before { allow(Qa).to receive_message_chain(:config, :suppress_ip_data_from_log).and_return(false) } # rubocop:disable RSpec/MessageChain
|
33
|
+
it 'does include IP info in log message' do
|
34
|
+
expect(Rails.logger).to receive(:info).with("******** SEARCH from IP #{fake_ip} in {city: #{city}, state: #{state}, country: #{country}}")
|
35
|
+
described_class.new(request: request, params: some_params)
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
5
39
|
|
6
40
|
describe '#search_header' do
|
41
|
+
let(:request_id) { 's1' }
|
42
|
+
|
7
43
|
context 'when optional params are defined' do
|
8
44
|
let(:search_params) do
|
9
45
|
{
|
@@ -20,6 +56,8 @@ RSpec.describe Qa::LinkedData::RequestHeaderService do
|
|
20
56
|
it 'uses passed in params' do
|
21
57
|
expected_results =
|
22
58
|
{
|
59
|
+
request: request,
|
60
|
+
request_id: request_id,
|
23
61
|
context: true,
|
24
62
|
performance_data: true,
|
25
63
|
replacements: { 'maxRecords' => '4' },
|
@@ -37,6 +75,8 @@ RSpec.describe Qa::LinkedData::RequestHeaderService do
|
|
37
75
|
it 'returns defaults' do
|
38
76
|
expected_results =
|
39
77
|
{
|
78
|
+
request: request,
|
79
|
+
request_id: request_id,
|
40
80
|
context: false,
|
41
81
|
performance_data: false,
|
42
82
|
replacements: {},
|
@@ -53,6 +93,8 @@ RSpec.describe Qa::LinkedData::RequestHeaderService do
|
|
53
93
|
it 'returns defaults with language set to request language' do
|
54
94
|
expected_results =
|
55
95
|
{
|
96
|
+
request: request,
|
97
|
+
request_id: request_id,
|
56
98
|
context: false,
|
57
99
|
performance_data: false,
|
58
100
|
replacements: {},
|
@@ -67,6 +109,7 @@ RSpec.describe Qa::LinkedData::RequestHeaderService do
|
|
67
109
|
end
|
68
110
|
|
69
111
|
describe '#fetch_header' do
|
112
|
+
let(:request_id) { 'f1' }
|
70
113
|
context 'when optional params are defined' do
|
71
114
|
let(:fetch_params) do
|
72
115
|
{
|
@@ -84,6 +127,8 @@ RSpec.describe Qa::LinkedData::RequestHeaderService do
|
|
84
127
|
it 'uses passed in params' do
|
85
128
|
expected_results =
|
86
129
|
{
|
130
|
+
request: request,
|
131
|
+
request_id: request_id,
|
87
132
|
format: 'n3',
|
88
133
|
performance_data: true,
|
89
134
|
replacements: { 'extra' => 'data', 'even' => 'more data' },
|
@@ -101,6 +146,8 @@ RSpec.describe Qa::LinkedData::RequestHeaderService do
|
|
101
146
|
it 'returns defaults' do
|
102
147
|
expected_results =
|
103
148
|
{
|
149
|
+
request: request,
|
150
|
+
request_id: request_id,
|
104
151
|
format: 'json',
|
105
152
|
performance_data: false,
|
106
153
|
replacements: {},
|
@@ -117,6 +164,8 @@ RSpec.describe Qa::LinkedData::RequestHeaderService do
|
|
117
164
|
it 'returns defaults with language set to request language' do
|
118
165
|
expected_results =
|
119
166
|
{
|
167
|
+
request: request,
|
168
|
+
request_id: request_id,
|
120
169
|
format: 'json',
|
121
170
|
performance_data: false,
|
122
171
|
replacements: {},
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: qa
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 5.
|
4
|
+
version: 5.5.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Stephen Anderson
|
@@ -13,10 +13,10 @@ authors:
|
|
13
13
|
- Mike Stroming
|
14
14
|
- Adam Wead
|
15
15
|
- E. Lynette Rayle
|
16
|
-
autorequire:
|
16
|
+
autorequire:
|
17
17
|
bindir: bin
|
18
18
|
cert_chain: []
|
19
|
-
date:
|
19
|
+
date: 2020-08-14 00:00:00.000000000 Z
|
20
20
|
dependencies:
|
21
21
|
- !ruby/object:Gem::Dependency
|
22
22
|
name: activerecord-import
|
@@ -60,6 +60,20 @@ dependencies:
|
|
60
60
|
- - ">="
|
61
61
|
- !ruby/object:Gem::Version
|
62
62
|
version: '0'
|
63
|
+
- !ruby/object:Gem::Dependency
|
64
|
+
name: geocoder
|
65
|
+
requirement: !ruby/object:Gem::Requirement
|
66
|
+
requirements:
|
67
|
+
- - ">="
|
68
|
+
- !ruby/object:Gem::Version
|
69
|
+
version: '0'
|
70
|
+
type: :runtime
|
71
|
+
prerelease: false
|
72
|
+
version_requirements: !ruby/object:Gem::Requirement
|
73
|
+
requirements:
|
74
|
+
- - ">="
|
75
|
+
- !ruby/object:Gem::Version
|
76
|
+
version: '0'
|
63
77
|
- !ruby/object:Gem::Dependency
|
64
78
|
name: ldpath
|
65
79
|
requirement: !ruby/object:Gem::Requirement
|
@@ -128,14 +142,40 @@ dependencies:
|
|
128
142
|
requirements:
|
129
143
|
- - "~>"
|
130
144
|
- !ruby/object:Gem::Version
|
131
|
-
version:
|
145
|
+
version: 3.0.0
|
132
146
|
type: :development
|
133
147
|
prerelease: false
|
134
148
|
version_requirements: !ruby/object:Gem::Requirement
|
135
149
|
requirements:
|
136
150
|
- - "~>"
|
137
151
|
- !ruby/object:Gem::Version
|
138
|
-
version:
|
152
|
+
version: 3.0.0
|
153
|
+
- !ruby/object:Gem::Dependency
|
154
|
+
name: rails
|
155
|
+
requirement: !ruby/object:Gem::Requirement
|
156
|
+
requirements:
|
157
|
+
- - "!="
|
158
|
+
- !ruby/object:Gem::Version
|
159
|
+
version: 5.2.0
|
160
|
+
- - "!="
|
161
|
+
- !ruby/object:Gem::Version
|
162
|
+
version: 5.2.1
|
163
|
+
- - "!="
|
164
|
+
- !ruby/object:Gem::Version
|
165
|
+
version: 5.2.2
|
166
|
+
type: :development
|
167
|
+
prerelease: false
|
168
|
+
version_requirements: !ruby/object:Gem::Requirement
|
169
|
+
requirements:
|
170
|
+
- - "!="
|
171
|
+
- !ruby/object:Gem::Version
|
172
|
+
version: 5.2.0
|
173
|
+
- - "!="
|
174
|
+
- !ruby/object:Gem::Version
|
175
|
+
version: 5.2.1
|
176
|
+
- - "!="
|
177
|
+
- !ruby/object:Gem::Version
|
178
|
+
version: 5.2.2
|
139
179
|
- !ruby/object:Gem::Dependency
|
140
180
|
name: byebug
|
141
181
|
requirement: !ruby/object:Gem::Requirement
|
@@ -577,7 +617,7 @@ homepage: https://github.com/projecthydra/questioning_authority
|
|
577
617
|
licenses:
|
578
618
|
- APACHE-2
|
579
619
|
metadata: {}
|
580
|
-
post_install_message:
|
620
|
+
post_install_message:
|
581
621
|
rdoc_options: []
|
582
622
|
require_paths:
|
583
623
|
- lib
|
@@ -592,9 +632,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
592
632
|
- !ruby/object:Gem::Version
|
593
633
|
version: '0'
|
594
634
|
requirements: []
|
595
|
-
|
596
|
-
|
597
|
-
signing_key:
|
635
|
+
rubygems_version: 3.0.8
|
636
|
+
signing_key:
|
598
637
|
specification_version: 4
|
599
638
|
summary: You should question your authorities.
|
600
639
|
test_files:
|