qa 0.5.0 → 0.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/README.md +37 -0
- data/app/controllers/qa/terms_controller.rb +1 -1
- data/lib/qa/authorities.rb +2 -0
- data/lib/qa/authorities/assign_fast.rb +17 -0
- data/lib/qa/authorities/assign_fast/generic_authority.rb +61 -0
- data/lib/qa/authorities/assign_fast_subauthority.rb +31 -0
- data/lib/qa/authorities/getty.rb +12 -3
- data/lib/qa/authorities/getty/aat.rb +3 -2
- data/lib/qa/authorities/getty/tgn.rb +80 -0
- data/lib/qa/authorities/getty/ulan.rb +71 -0
- data/lib/qa/authorities/web_service_base.rb +6 -4
- data/lib/qa/version.rb +1 -1
- data/spec/controllers/terms_controller_spec.rb +26 -12
- data/spec/fixtures/assign-fast-noheader.json +1 -0
- data/spec/fixtures/assign-fast-noresults.json +10 -0
- data/spec/fixtures/assign-fast-oneresult.json +16 -0
- data/spec/fixtures/assign-fast-topical-result.json +130 -0
- data/spec/fixtures/getty-tgn-find-response.json +1469 -0
- data/spec/fixtures/getty-ulan-find-response.json +11565 -0
- data/spec/fixtures/tgn-response.txt +87 -0
- data/spec/fixtures/ulan-response.txt +1854 -0
- data/spec/lib/authorities/assign_fast_spec.rb +115 -0
- data/spec/lib/authorities/getty/aat_spec.rb +1 -1
- data/spec/lib/authorities/getty/tgn_spec.rb +95 -0
- data/spec/lib/authorities/getty/ulan_spec.rb +97 -0
- data/spec/lib/authorities/loc_spec.rb +1 -1
- data/spec/lib/tasks/mesh.rake_spec.rb +1 -1
- data/spec/spec_helper.rb +4 -3
- data/spec/test_app_templates/lib/generators/test_app_generator.rb +1 -1
- metadata +35 -116
- data/spec/internal/Gemfile +0 -44
- data/spec/internal/Gemfile.lock +0 -180
- data/spec/internal/README.rdoc +0 -28
- data/spec/internal/Rakefile +0 -6
- data/spec/internal/app/assets/javascripts/application.js +0 -16
- data/spec/internal/app/assets/stylesheets/application.css +0 -15
- data/spec/internal/app/controllers/application_controller.rb +0 -5
- data/spec/internal/app/helpers/application_helper.rb +0 -2
- data/spec/internal/app/views/layouts/application.html.erb +0 -14
- data/spec/internal/bin/bundle +0 -3
- data/spec/internal/bin/rails +0 -4
- data/spec/internal/bin/rake +0 -4
- data/spec/internal/bin/setup +0 -29
- data/spec/internal/config.ru +0 -4
- data/spec/internal/config/application.rb +0 -26
- data/spec/internal/config/authorities.yml +0 -1
- data/spec/internal/config/authorities/authority_A.yml +0 -10
- data/spec/internal/config/authorities/authority_B.yml +0 -7
- data/spec/internal/config/authorities/authority_C.yml +0 -4
- data/spec/internal/config/authorities/authority_D.yml +0 -4
- data/spec/internal/config/authorities/states.yml +0 -101
- data/spec/internal/config/boot.rb +0 -3
- data/spec/internal/config/database.yml +0 -25
- data/spec/internal/config/environment.rb +0 -5
- data/spec/internal/config/environments/development.rb +0 -41
- data/spec/internal/config/environments/production.rb +0 -79
- data/spec/internal/config/environments/test.rb +0 -42
- data/spec/internal/config/initializers/assets.rb +0 -11
- data/spec/internal/config/initializers/backtrace_silencers.rb +0 -7
- data/spec/internal/config/initializers/cookies_serializer.rb +0 -3
- data/spec/internal/config/initializers/filter_parameter_logging.rb +0 -4
- data/spec/internal/config/initializers/inflections.rb +0 -16
- data/spec/internal/config/initializers/mime_types.rb +0 -4
- data/spec/internal/config/initializers/session_store.rb +0 -3
- data/spec/internal/config/initializers/wrap_parameters.rb +0 -14
- data/spec/internal/config/locales/en.yml +0 -23
- data/spec/internal/config/oclcts-authorities.yml +0 -24
- data/spec/internal/config/routes.rb +0 -58
- data/spec/internal/config/secrets.yml +0 -22
- data/spec/internal/db/development.sqlite3 +0 -0
- data/spec/internal/db/migrate/20150311214117_create_qa_subject_mesh_terms.qa.rb +0 -12
- data/spec/internal/db/migrate/20150311214118_create_qa_mesh_tree.qa.rb +0 -11
- data/spec/internal/db/migrate/20150311214119_add_term_lower_to_qa_subject_mesh_terms.qa.rb +0 -8
- data/spec/internal/db/schema.rb +0 -34
- data/spec/internal/db/seeds.rb +0 -7
- data/spec/internal/db/test.sqlite3 +0 -0
- data/spec/internal/lib/generators/test_app_generator.rb +0 -29
- data/spec/internal/log/development.log +0 -21909
- data/spec/internal/public/404.html +0 -67
- data/spec/internal/public/422.html +0 -67
- data/spec/internal/public/500.html +0 -66
- data/spec/internal/public/favicon.ico +0 -0
- data/spec/internal/public/robots.txt +0 -5
- data/spec/internal/test/test_helper.rb +0 -10
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 16b9b7d34d5db8f520bb0a0c3330f75b836d0d01
|
4
|
+
data.tar.gz: fcea780be638d13a57f4ccd539f3ce90c5fcca48
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 85bdd4ca0d32bb58b07326aad0a19721fc3efc8139a16af66d8ab54f2c132458a4205e185bf0f5f9038f33f6a5a72d6f964bec722f9a711f8a93c370899dd012
|
7
|
+
data.tar.gz: 1a7a76fdc4e0c1b8cb843f95d122f9c21785023779bf19b2ea078845c1aed829a8c9b9709f2947e26b5c81c5d5333f225a6a82995a483544cd39a6ed2bf8c4c9
|
data/README.md
CHANGED
@@ -111,6 +111,43 @@ QA then presents this data to you in JSON format:
|
|
111
111
|
etc...
|
112
112
|
]
|
113
113
|
|
114
|
+
### FAST
|
115
|
+
|
116
|
+
In the same manner, QA provides a wrapper around OCLC's FAST autocomplete
|
117
|
+
service. The following subauthorities are available:
|
118
|
+
|
119
|
+
* all
|
120
|
+
* personal
|
121
|
+
* corporate
|
122
|
+
* event
|
123
|
+
* uniform
|
124
|
+
* topical
|
125
|
+
* geographic
|
126
|
+
* form_genre
|
127
|
+
|
128
|
+
Example qa URL: /qa/search/assign_fast/all?q=periodic+table
|
129
|
+
|
130
|
+
The result includes both 'label' and 'value' to help users select the correct
|
131
|
+
heading, e.g.:
|
132
|
+
|
133
|
+
[
|
134
|
+
{
|
135
|
+
"id":"fst01789629",
|
136
|
+
"label":"Periodic table",
|
137
|
+
"value":"Periodic table"
|
138
|
+
},
|
139
|
+
{
|
140
|
+
"id":"fst01789629",
|
141
|
+
"label":"Periodic table (Saunders, N.) USE Periodic table",
|
142
|
+
"value":"Periodic table"
|
143
|
+
},...
|
144
|
+
]
|
145
|
+
|
146
|
+
Make sure you handle these correctly in your form.
|
147
|
+
|
148
|
+
For more details on this OCLC API, see
|
149
|
+
http://www.oclc.org/developer/develop/web-services/fast-api/assign-fast.en.html
|
150
|
+
|
114
151
|
### Local Authorities
|
115
152
|
|
116
153
|
For simple use cases when you have a few terms that don't change very often.
|
@@ -30,7 +30,7 @@ class Qa::TermsController < ApplicationController
|
|
30
30
|
|
31
31
|
def init_authority
|
32
32
|
begin
|
33
|
-
mod = authority_class.constantize
|
33
|
+
mod = authority_class.camelize.constantize
|
34
34
|
rescue NameError => e
|
35
35
|
logger.warn "Unable to initialize authority #{authority_class}"
|
36
36
|
head :not_found
|
data/lib/qa/authorities.rb
CHANGED
@@ -0,0 +1,17 @@
|
|
1
|
+
module Qa::Authorities
|
2
|
+
# Provide authority namespace
|
3
|
+
module AssignFast
|
4
|
+
extend AuthorityWithSubAuthority
|
5
|
+
extend AssignFastSubauthority
|
6
|
+
|
7
|
+
require 'qa/authorities/assign_fast/generic_authority'
|
8
|
+
# Create an authority object for given subauthority
|
9
|
+
#
|
10
|
+
# @param [String] subauthority to use
|
11
|
+
# @return [GenericAuthority]
|
12
|
+
def self.subauthority_for(subauthority)
|
13
|
+
validate_subauthority!(subauthority)
|
14
|
+
GenericAuthority.new(subauthority)
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,61 @@
|
|
1
|
+
module Qa::Authorities
|
2
|
+
# A wrapper around the FAST api for use with questioning_authority
|
3
|
+
# API documentation:
|
4
|
+
# http://www.oclc.org/developer/develop/web-services/fast-api/assign-fast.en.html
|
5
|
+
class AssignFast::GenericAuthority < Base
|
6
|
+
attr_reader :subauthority
|
7
|
+
def initialize(subauthority)
|
8
|
+
@subauthority = subauthority
|
9
|
+
end
|
10
|
+
|
11
|
+
include WebServiceBase
|
12
|
+
|
13
|
+
# Search the FAST api
|
14
|
+
#
|
15
|
+
# @param [String] the query
|
16
|
+
# @return json results
|
17
|
+
def search q
|
18
|
+
url = build_query_url q
|
19
|
+
begin
|
20
|
+
raw_response = get_json(url)
|
21
|
+
rescue JSON::ParserError => error
|
22
|
+
Rails.logger.info "Could not parse response as JSON. Request url: #{url}"
|
23
|
+
return []
|
24
|
+
end
|
25
|
+
parse_authority_response(raw_response)
|
26
|
+
end
|
27
|
+
|
28
|
+
# Build a FAST API url
|
29
|
+
#
|
30
|
+
# @param [String] the query
|
31
|
+
# @return [String] the url
|
32
|
+
def build_query_url q
|
33
|
+
escaped_query = clean_query_string q
|
34
|
+
index = AssignFast.index_for_authority(subauthority)
|
35
|
+
return_data = "#{index}%2Cidroot%2Cauth%2Ctype"
|
36
|
+
num_rows = 20 # max allowed by the API
|
37
|
+
url = "http://fast.oclc.org/searchfast/fastsuggest?&query=#{escaped_query}&queryIndex=#{index}&queryReturn=#{return_data}&suggest=autoSubject&rows=#{num_rows}"
|
38
|
+
end
|
39
|
+
|
40
|
+
private
|
41
|
+
|
42
|
+
# Removes characters from the query string that are not tolerated by the API
|
43
|
+
# See oclc sample code at
|
44
|
+
# http://experimental.worldcat.org/fast/assignfast/js/assignFASTComplete.js
|
45
|
+
def clean_query_string q
|
46
|
+
URI.escape(q.gsub(/-|\(|\)|:/, ""))
|
47
|
+
end
|
48
|
+
|
49
|
+
def parse_authority_response(raw_response)
|
50
|
+
results = raw_response['response']['docs'].map do |doc|
|
51
|
+
index = AssignFast.index_for_authority(subauthority)
|
52
|
+
term = doc[index].first
|
53
|
+
if doc['type'] == 'alt'
|
54
|
+
term += ' USE ' + doc['auth']
|
55
|
+
end
|
56
|
+
{ id: doc['idroot'], label: term, value: doc['auth'] }
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
end
|
61
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
# Encapsulate information about assignFAST subauthorities
|
2
|
+
module Qa::Authorities::AssignFastSubauthority
|
3
|
+
|
4
|
+
# Hash of subauthority names used in qa routes => 'index' used by API
|
5
|
+
Subauthorities = {
|
6
|
+
'all' => 'suggestall',
|
7
|
+
'personal' => 'suggest00',
|
8
|
+
'corporate' => 'suggest10',
|
9
|
+
'event' => 'suggest11',
|
10
|
+
'uniform' => 'suggest30',
|
11
|
+
'topical' => 'suggest50',
|
12
|
+
'geographic' => 'suggest51',
|
13
|
+
'form_genre' => 'suggest55',
|
14
|
+
}
|
15
|
+
|
16
|
+
# Get a list of subauthorities by name
|
17
|
+
#
|
18
|
+
# @return [Array<String>]
|
19
|
+
def subauthorities
|
20
|
+
Subauthorities.keys
|
21
|
+
end
|
22
|
+
|
23
|
+
# Get an API index name from an English name
|
24
|
+
#
|
25
|
+
# @param [String] English name
|
26
|
+
# @return [String] index name
|
27
|
+
def index_for_authority authority
|
28
|
+
Subauthorities[authority]
|
29
|
+
end
|
30
|
+
|
31
|
+
end
|
data/lib/qa/authorities/getty.rb
CHANGED
@@ -3,14 +3,23 @@ require 'uri'
|
|
3
3
|
module Qa::Authorities
|
4
4
|
module Getty
|
5
5
|
require 'qa/authorities/getty/aat'
|
6
|
+
require 'qa/authorities/getty/tgn'
|
7
|
+
require 'qa/authorities/getty/ulan'
|
6
8
|
extend AuthorityWithSubAuthority
|
7
9
|
|
8
10
|
def self.subauthorities
|
9
|
-
[ "aat" ]
|
11
|
+
[ "aat" , "tgn", "ulan" ]
|
10
12
|
end
|
11
13
|
|
12
|
-
def self.subauthority_class(
|
13
|
-
|
14
|
+
def self.subauthority_class(subauthority)
|
15
|
+
case subauthority
|
16
|
+
when 'aat'
|
17
|
+
AAT
|
18
|
+
when 'tgn'
|
19
|
+
TGN
|
20
|
+
when 'ulan'
|
21
|
+
Ulan
|
22
|
+
end
|
14
23
|
end
|
15
24
|
end
|
16
25
|
end
|
@@ -1,6 +1,7 @@
|
|
1
1
|
module Qa::Authorities
|
2
2
|
class Getty::AAT < Base
|
3
3
|
include WebServiceBase
|
4
|
+
|
4
5
|
def search q
|
5
6
|
parse_authority_response(json(build_query_url(q)))
|
6
7
|
end
|
@@ -23,7 +24,7 @@ module Qa::Authorities
|
|
23
24
|
skos:inScheme <http://vocab.getty.edu/aat/> ;
|
24
25
|
gvp:prefLabelGVP [skosxl:literalForm ?name].
|
25
26
|
FILTER regex(?name, \"#{search}\", \"i\") .
|
26
|
-
}
|
27
|
+
} ORDER BY ?name"
|
27
28
|
end
|
28
29
|
|
29
30
|
def untaint(q)
|
@@ -44,7 +45,7 @@ module Qa::Authorities
|
|
44
45
|
|
45
46
|
private
|
46
47
|
|
47
|
-
# Reformats the data received from the
|
48
|
+
# Reformats the data received from the Getty service
|
48
49
|
def parse_authority_response(response)
|
49
50
|
response['results']['bindings'].map do |result|
|
50
51
|
{ 'id' => result['s']['value'], 'label' => result['name']['value'] }
|
@@ -0,0 +1,80 @@
|
|
1
|
+
module Qa::Authorities
|
2
|
+
class Getty::TGN < Base
|
3
|
+
include WebServiceBase
|
4
|
+
|
5
|
+
def search q
|
6
|
+
parse_authority_response(json(build_query_url(q)))
|
7
|
+
end
|
8
|
+
|
9
|
+
# get_json is not ideomatic, so we'll make an alias
|
10
|
+
def json(*args)
|
11
|
+
get_json(*args)
|
12
|
+
end
|
13
|
+
|
14
|
+
def build_query_url q
|
15
|
+
query = URI.escape(sparql(untaint(q)))
|
16
|
+
# Replace ampersands, otherwise the query will fail
|
17
|
+
# Gsub hack to convert the encoded regex in the REPLACE into a form Getty understands
|
18
|
+
"http://vocab.getty.edu/sparql.json?query=#{query.gsub('&','%26').gsub(',[%5E,]+,[%5E,]+$','%2C[^%2C]%2B%2C[^%2C]%2B%24')}&_implicit=false&implicit=true&_equivalent=false&_form=%2Fsparql"
|
19
|
+
end
|
20
|
+
|
21
|
+
# Use a regex to exclude the continent and 'world' from the query
|
22
|
+
# If only one word is entered only search the name (not the parent string)
|
23
|
+
# If more than one word is entered, one word must appear in the name, and all words in either parent or name
|
24
|
+
def sparql(q)
|
25
|
+
search = untaint(q)
|
26
|
+
if search.include?(' ')
|
27
|
+
ex = "(("
|
28
|
+
search.split(' ').each do | i |
|
29
|
+
ex += "regex(CONCAT(?name, ', ', REPLACE(str(?par), \",[^,]+,[^,]+$\", \"\")), \"#{i}\",\"i\" ) && "
|
30
|
+
end
|
31
|
+
ex = ex[0..ex.length - 4]
|
32
|
+
ex += ') && ('
|
33
|
+
search.split(' ').each do | i |
|
34
|
+
ex += "regex(?name, \"#{i}\",\"i\" ) || "
|
35
|
+
end
|
36
|
+
ex = ex[0..ex.length - 4]
|
37
|
+
ex += ") )"
|
38
|
+
|
39
|
+
else
|
40
|
+
ex = "regex(?name, \"#{search}\", \"i\")"
|
41
|
+
end
|
42
|
+
|
43
|
+
# The full text index matches on fields besides the term, so we filter to ensure the match is in the term.
|
44
|
+
sparql = "SELECT DISTINCT ?s ?name ?par {
|
45
|
+
?s a skos:Concept; luc:term \"#{search}\";
|
46
|
+
skos:inScheme <http://vocab.getty.edu/tgn/> ;
|
47
|
+
gvp:prefLabelGVP [skosxl:literalForm ?name] ;
|
48
|
+
gvp:parentString ?par .
|
49
|
+
FILTER #{ex} .
|
50
|
+
} ORDER BY ?name ASC(?par)"
|
51
|
+
end
|
52
|
+
|
53
|
+
def untaint(q)
|
54
|
+
q.gsub(/[^\w\s-]/, '')
|
55
|
+
end
|
56
|
+
|
57
|
+
def find id
|
58
|
+
json(find_url(id))
|
59
|
+
end
|
60
|
+
|
61
|
+
def find_url id
|
62
|
+
"http://vocab.getty.edu/tgn/#{id}.json"
|
63
|
+
end
|
64
|
+
|
65
|
+
def request_options
|
66
|
+
{ accept: 'application/sparql-results+json'}
|
67
|
+
end
|
68
|
+
|
69
|
+
private
|
70
|
+
|
71
|
+
# Reformats the data received from the service
|
72
|
+
# Adds the parentString, minus the contintent and 'World' for disambiguation
|
73
|
+
def parse_authority_response(response)
|
74
|
+
response['results']['bindings'].map do |result|
|
75
|
+
{ 'id' => result['s']['value'], 'label' => result['name']['value'] + ' (' + result['par']['value'].gsub(/\,[^\,]+\,[^\,]+$/, '') + ')' }
|
76
|
+
end
|
77
|
+
end
|
78
|
+
|
79
|
+
end
|
80
|
+
end
|
@@ -0,0 +1,71 @@
|
|
1
|
+
module Qa::Authorities
|
2
|
+
class Getty::Ulan < Base
|
3
|
+
include WebServiceBase
|
4
|
+
|
5
|
+
def search q
|
6
|
+
parse_authority_response(json(build_query_url(q)))
|
7
|
+
end
|
8
|
+
|
9
|
+
# get_json is not ideomatic, so we'll make an alias
|
10
|
+
def json(*args)
|
11
|
+
get_json(*args)
|
12
|
+
end
|
13
|
+
|
14
|
+
def build_query_url q
|
15
|
+
query = URI.escape(sparql(untaint(q)))
|
16
|
+
# Replace ampersands, otherwise the query will fail
|
17
|
+
"http://vocab.getty.edu/sparql.json?query=#{URI.escape(sparql(q)).gsub('&','%26')}&_implicit=false&implicit=true&_equivalent=false&_form=%2Fsparql"
|
18
|
+
end
|
19
|
+
|
20
|
+
def sparql(q)
|
21
|
+
search = untaint(q)
|
22
|
+
# if more than one term is supplied, check both preferred and alt labels
|
23
|
+
if search.include?(' ')
|
24
|
+
ex = "("
|
25
|
+
search.split(' ').each do | i |
|
26
|
+
ex += "regex(CONCAT(?name, ' ', ?alt), \"#{i}\",\"i\" ) && "
|
27
|
+
end
|
28
|
+
ex = ex[0..ex.length - 4]
|
29
|
+
ex += ")"
|
30
|
+
else
|
31
|
+
ex = "regex(?name, \"#{search}\", \"i\")"
|
32
|
+
end
|
33
|
+
# The full text index matches on fields besides the term, so we filter to ensure the match is in the term.
|
34
|
+
sparql = "SELECT DISTINCT ?s ?name ?bio {
|
35
|
+
?s a skos:Concept; luc:term \"#{search}\";
|
36
|
+
skos:inScheme <http://vocab.getty.edu/ulan/> ;
|
37
|
+
gvp:prefLabelGVP [skosxl:literalForm ?name] ;
|
38
|
+
foaf:focus/gvp:biographyPreferred [schema:description ?bio] ;
|
39
|
+
skos:altLabel ?alt .
|
40
|
+
FILTER #{ex} .
|
41
|
+
} ORDER BY ?name"
|
42
|
+
end
|
43
|
+
|
44
|
+
def untaint(q)
|
45
|
+
q.gsub(/[^\w\s-]/, '')
|
46
|
+
end
|
47
|
+
|
48
|
+
def find id
|
49
|
+
json(find_url(id))
|
50
|
+
end
|
51
|
+
|
52
|
+
def find_url id
|
53
|
+
"http://vocab.getty.edu/ulan/#{id}.json"
|
54
|
+
end
|
55
|
+
|
56
|
+
def request_options
|
57
|
+
{ accept: 'application/sparql-results+json'}
|
58
|
+
end
|
59
|
+
|
60
|
+
private
|
61
|
+
|
62
|
+
# Reformats the data received from the Getty service
|
63
|
+
# Add the bio for disambiguation
|
64
|
+
def parse_authority_response(response)
|
65
|
+
response['results']['bindings'].map do |result|
|
66
|
+
{ 'id' => result['s']['value'], 'label' => result['name']['value'] + ' (' + result['bio']['value'] + ')' }
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
end
|
71
|
+
end
|
@@ -1,4 +1,4 @@
|
|
1
|
-
require '
|
1
|
+
require 'faraday'
|
2
2
|
|
3
3
|
module Qa::Authorities
|
4
4
|
module WebServiceBase
|
@@ -6,12 +6,14 @@ module Qa::Authorities
|
|
6
6
|
|
7
7
|
# mix-in to retreive and parse JSON content from the web
|
8
8
|
def get_json(url)
|
9
|
-
r =
|
9
|
+
r = response(url).body
|
10
10
|
JSON.parse(r)
|
11
11
|
end
|
12
12
|
|
13
|
-
def
|
14
|
-
|
13
|
+
def response(url)
|
14
|
+
Faraday.get(url) do |req|
|
15
|
+
req.headers['Accept'] = 'application/json'
|
16
|
+
end
|
15
17
|
end
|
16
18
|
end
|
17
19
|
end
|
data/lib/qa/version.rb
CHANGED
@@ -49,20 +49,34 @@ describe Qa::TermsController, :type => :controller do
|
|
49
49
|
|
50
50
|
describe "#search" do
|
51
51
|
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
52
|
+
context "loc" do
|
53
|
+
before :each do
|
54
|
+
stub_request(:get, "http://id.loc.gov/search/?format=json&q=Berry&q=cs:http://id.loc.gov/authorities/names").
|
55
|
+
with(:headers => {'Accept'=>'application/json'}).
|
56
|
+
to_return(:body => webmock_fixture("loc-names-response.txt"), :status => 200)
|
57
|
+
end
|
58
|
+
|
59
|
+
it "should return a set of terms for a tgnlang query" do
|
60
|
+
get :search, {:q => "Tibetan", :vocab => "tgnlang" }
|
61
|
+
expect(response).to be_success
|
62
|
+
end
|
57
63
|
|
58
|
-
|
59
|
-
|
60
|
-
|
64
|
+
it "should not return 404 if subauthority is valid" do
|
65
|
+
get :search, { :q => "Berry", :vocab => "loc", :subauthority => "names" }
|
66
|
+
expect(response).to be_success
|
67
|
+
end
|
61
68
|
end
|
62
69
|
|
63
|
-
|
64
|
-
|
65
|
-
|
70
|
+
context "assign_fast" do
|
71
|
+
before do
|
72
|
+
stub_request(:get, "http://fast.oclc.org/searchfast/fastsuggest?query=word&queryIndex=suggest50&queryReturn=suggest50,idroot,auth,type&rows=20&suggest=autoSubject").
|
73
|
+
with(:headers => {'Accept'=>'application/json'}).
|
74
|
+
to_return(:body => webmock_fixture("assign-fast-topical-result.json"), :status => 200, :headers => {})
|
75
|
+
end
|
76
|
+
it "succeeds if authority class is camelcase" do
|
77
|
+
get :search, { :q => "word", :vocab => "assign_fast", :subauthority => "topical" }
|
78
|
+
expect(response).to be_success
|
79
|
+
end
|
66
80
|
end
|
67
81
|
|
68
82
|
end
|
@@ -103,7 +117,7 @@ describe Qa::TermsController, :type => :controller do
|
|
103
117
|
|
104
118
|
before do
|
105
119
|
stub_request(:get, "http://id.loc.gov/authorities/subjects/sh85077565.json").
|
106
|
-
with(:headers => {'Accept'=>'application/json'
|
120
|
+
with(:headers => {'Accept'=>'application/json'}).
|
107
121
|
to_return(:status => 200, :body => webmock_fixture("loc-names-response.txt"), :headers => {})
|
108
122
|
end
|
109
123
|
|