qa 5.2.0 → 5.5.1
Sign up to get free protection for your applications and to get access to all the features.
- 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
|
-
[![Gem Version](https://badge.fury.io/rb/qa.png)](http://badge.fury.io/rb/qa)
|
5
|
-
[![Build Status](https://circleci.com/gh/samvera/questioning_authority.svg?style=svg)](https://circleci.com/gh/samvera/questioning_authority)
|
6
|
-
[![Coverage Status](https://coveralls.io/repos/github/samvera/questioning_authority/badge.svg?branch=master)](https://coveralls.io/github/samvera/questioning_authority?branch=master)
|
3
|
+
Code: [![Gem Version](https://badge.fury.io/rb/qa.png)](http://badge.fury.io/rb/qa) [![Build Status](https://circleci.com/gh/samvera/questioning_authority.svg?style=svg)](https://circleci.com/gh/samvera/questioning_authority) [![Coverage Status](https://coveralls.io/repos/github/samvera/questioning_authority/badge.svg?branch=master)](https://coveralls.io/github/samvera/questioning_authority?branch=master)
|
7
4
|
|
8
|
-
Docs:
|
9
|
-
[![Contribution Guidelines](http://img.shields.io/badge/CONTRIBUTING-Guidelines-blue.svg)](./CONTRIBUTING.md)
|
10
|
-
[![Apache 2.0 License](http://img.shields.io/badge/APACHE2-license-blue.svg)](./LICENSE)
|
5
|
+
Docs: [![Contribution Guidelines](http://img.shields.io/badge/CONTRIBUTING-Guidelines-blue.svg)](./CONTRIBUTING.md) [![Apache 2.0 License](http://img.shields.io/badge/APACHE2-license-blue.svg)](./LICENSE)
|
11
6
|
|
12
7
|
Jump In: [![Slack Status](http://slack.samvera.org/badge.svg)](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
|
![Samvera Logo](https://wiki.duraspace.org/download/thumbnails/87459292/samvera-fall-font2-200w.png?version=1&modificationDate=1498550535816&api=v2)
|
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:
|