qa 4.2.0 → 4.3.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -5
- data/app/controllers/qa/linked_data_terms_controller.rb +17 -39
- data/app/controllers/qa/terms_controller.rb +26 -2
- data/app/services/qa/linked_data/authority_url_service.rb +35 -21
- data/app/services/qa/linked_data/graph_service.rb +2 -4
- data/app/services/qa/linked_data/request_header_service.rb +97 -0
- data/lib/qa/authorities/discogs/discogs_instance_builder.rb +17 -19
- data/lib/qa/authorities/discogs/discogs_translation.rb +26 -22
- data/lib/qa/authorities/discogs/discogs_utils.rb +32 -20
- data/lib/qa/authorities/discogs/discogs_works_builder.rb +26 -47
- data/lib/qa/authorities/discogs/generic_authority.rb +64 -33
- data/lib/qa/authorities/getty/tgn.rb +1 -1
- data/lib/qa/authorities/linked_data/find_term.rb +60 -18
- data/lib/qa/authorities/linked_data/search_query.rb +43 -15
- data/lib/qa/authorities/loc/generic_authority.rb +2 -2
- data/lib/qa/version.rb +1 -1
- data/spec/controllers/linked_data_terms_controller_spec.rb +36 -0
- data/spec/controllers/terms_controller_spec.rb +26 -2
- data/spec/fixtures/discogs-find-response-json.json +1 -1
- data/spec/lib/authorities/discogs/generic_authority_spec.rb +103 -9
- data/spec/lib/authorities/getty/tgn_spec.rb +2 -2
- data/spec/lib/authorities/linked_data/find_term_spec.rb +11 -11
- data/spec/lib/authorities/linked_data/search_query_spec.rb +9 -9
- data/spec/lib/authorities/loc_spec.rb +9 -9
- data/spec/services/linked_data/authority_url_service_spec.rb +14 -8
- data/spec/services/linked_data/graph_service_spec.rb +2 -1
- data/spec/services/linked_data/request_header_service_spec.rb +124 -0
- metadata +9 -7
@@ -28,7 +28,7 @@ module Qa::Authorities
|
|
28
28
|
end
|
29
29
|
%(SELECT DISTINCT ?s ?name ?par {
|
30
30
|
?s a skos:Concept; luc:term "#{search}";
|
31
|
-
skos:inScheme <http://vocab.getty.edu/
|
31
|
+
skos:inScheme <http://vocab.getty.edu/tgn/> ;
|
32
32
|
gvp:prefLabelGVP [skosxl:literalForm ?name] ;
|
33
33
|
gvp:parentString ?par .
|
34
34
|
FILTER #{ex} .
|
@@ -15,17 +15,21 @@ 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, :fetched_size, :normalized_size
|
19
|
-
private :full_graph, :filtered_graph, :language, :id, :uri, :access_time_s, :normalize_time_s, :fetched_size, :normalized_size
|
18
|
+
attr_reader :term_config, :full_graph, :filtered_graph, :language, :id, :uri, :access_time_s, :normalize_time_s, :fetched_size, :normalized_size, :subauthority
|
19
|
+
private :full_graph, :filtered_graph, :language, :id, :uri, :access_time_s, :normalize_time_s, :fetched_size, :normalized_size, :subauthority
|
20
20
|
|
21
21
|
delegate :term_subauthority?, :prefixes, :authority_name, to: :term_config
|
22
22
|
|
23
23
|
# Find a single term in a linked data authority
|
24
24
|
# @param [String] the id of the term to fetch
|
25
|
-
# @param [
|
26
|
-
# @
|
27
|
-
# @
|
28
|
-
# @
|
25
|
+
# @param request_header [Hash] optional attributes that can be appended to the generated URL
|
26
|
+
# @option language [Symbol] language used to select literals when multi-language is supported (e.g. :en, :fr, etc.)
|
27
|
+
# @option replacements [Hash] replacement values with { pattern_name (defined in YAML config) => value }
|
28
|
+
# @option subauthority [String] the subauthority from which to fetch the term
|
29
|
+
# @option format [String] return data in this format
|
30
|
+
# @option performance_data [Boolean] true if include_performance_data should be returned with the results; otherwise, false (default: false)
|
31
|
+
# @note All parameters after request_header are deprecated and will be removed in the next major release.
|
32
|
+
# @return [Hash, String] normalized json results when format='json'; otherwise, serialized RDF in the requested format
|
29
33
|
# @example Json Results for Linked Data Term
|
30
34
|
# { "uri":"http://id.worldcat.org/fast/530369",
|
31
35
|
# "id":"530369","label":"Cornell University",
|
@@ -39,13 +43,12 @@ module Qa::Authorities
|
|
39
43
|
# "http://schema.org/name":["Cornell University","Ithaca (N.Y.). Cornell University"],
|
40
44
|
# "http://www.w3.org/2004/02/skos/core#altLabel":["Ithaca (N.Y.). Cornell University"],
|
41
45
|
# "http://schema.org/sameAs":["http://id.loc.gov/authorities/names/n79021621","https://viaf.org/viaf/126293486"] } }
|
42
|
-
def find(id, language: nil, replacements: {}, subauth: nil,
|
43
|
-
|
44
|
-
|
46
|
+
def find(id, request_header: {}, language: nil, replacements: {}, subauth: nil, format: 'json', performance_data: false) # rubocop:disable Metrics/ParameterLists
|
47
|
+
request_header = build_request_header(language: language, replacements: replacements, subauth: subauth, format: format, performance_data: performance_data) if request_header.empty?
|
48
|
+
unpack_request_header(request_header)
|
49
|
+
raise Qa::InvalidLinkedDataAuthority, "Unable to initialize linked data term sub-authority #{subauthority}" unless subauthority.nil? || term_subauthority?(subauthority)
|
45
50
|
@id = id
|
46
|
-
|
47
|
-
@jsonld = jsonld
|
48
|
-
url = authority_service.build_url(action_config: term_config, action: :term, action_request: normalize_id, substitutions: replacements, subauthority: subauth, language: @language)
|
51
|
+
url = authority_service.build_url(action_config: term_config, action: :term, action_request: normalize_id, request_header: request_header)
|
49
52
|
Rails.logger.info "QA Linked Data term url: #{url}"
|
50
53
|
load_graph(url: url)
|
51
54
|
normalize_results
|
@@ -66,20 +69,22 @@ module Qa::Authorities
|
|
66
69
|
|
67
70
|
def normalize_results
|
68
71
|
normalize_start_dt = Time.now.utc
|
69
|
-
normalize_end_dt = Time.now.utc
|
70
72
|
|
71
|
-
|
73
|
+
results = perform_normalization
|
72
74
|
|
75
|
+
normalize_end_dt = Time.now.utc
|
73
76
|
@normalize_time_s = normalize_end_dt - normalize_start_dt
|
74
|
-
@normalized_size =
|
75
|
-
Rails.logger.info("Time to
|
76
|
-
|
77
|
-
|
77
|
+
@normalized_size = results.to_s.size if performance_data?
|
78
|
+
Rails.logger.info("Time to normalize data: #{normalize_time_s}s")
|
79
|
+
results = append_performance_data(results) if performance_data?
|
80
|
+
results
|
78
81
|
end
|
79
82
|
|
80
83
|
def perform_normalization
|
81
84
|
return "{}" unless full_graph.size.positive?
|
82
85
|
return full_graph.dump(:jsonld, standard_prefixes: true) if jsonld?
|
86
|
+
return full_graph.dump(:n3, standard_prefixes: true) if n3?
|
87
|
+
return full_graph.dump(:ntriples, standard_prefixes: true) if ntriples?
|
83
88
|
|
84
89
|
filter_graph
|
85
90
|
extract_uri
|
@@ -87,6 +92,15 @@ module Qa::Authorities
|
|
87
92
|
convert_results_to_json(results)
|
88
93
|
end
|
89
94
|
|
95
|
+
def unpack_request_header(request_header)
|
96
|
+
@subauthority = request_header.fetch(:subauthority, nil)
|
97
|
+
@format = request_header.fetch(:format, 'json')
|
98
|
+
@performance_data = request_header.fetch(:performance_data, false)
|
99
|
+
@language = language_service.preferred_language(user_language: request_header.fetch(:user_language, nil),
|
100
|
+
authority_language: term_config.term_language)
|
101
|
+
request_header[:language] = Array(@language)
|
102
|
+
end
|
103
|
+
|
90
104
|
def filter_graph
|
91
105
|
@filtered_graph = graph_service.deep_copy(graph: @full_graph)
|
92
106
|
@filtered_graph = graph_service.filter(graph: @filtered_graph, language: language) unless language.blank?
|
@@ -182,10 +196,20 @@ module Qa::Authorities
|
|
182
196
|
opt_ldpaths.delete_if { |_k, v| v.blank? }
|
183
197
|
end
|
184
198
|
|
199
|
+
# Give precedent to format parameter over jsonld parameter. NOTE: jsonld parameter for find method is deprecated.
|
185
200
|
def jsonld?
|
201
|
+
return @format.casecmp?('jsonld') if @format
|
186
202
|
@jsonld == true
|
187
203
|
end
|
188
204
|
|
205
|
+
def n3?
|
206
|
+
@format && @format.casecmp?('n3')
|
207
|
+
end
|
208
|
+
|
209
|
+
def ntriples?
|
210
|
+
@format && @format.casecmp?('ntriples')
|
211
|
+
end
|
212
|
+
|
189
213
|
def performance_data?
|
190
214
|
@performance_data == true && !jsonld?
|
191
215
|
end
|
@@ -270,6 +294,24 @@ module Qa::Authorities
|
|
270
294
|
total_time_s: (access_time_s + normalize_time_s) }
|
271
295
|
{ performance: performance, results: results }
|
272
296
|
end
|
297
|
+
|
298
|
+
# This is providing support for calling build_url with individual parameters instead of the request_header.
|
299
|
+
# This is deprecated and will be removed in the next major release.
|
300
|
+
def build_request_header(language:, replacements:, subauth:, format:, performance_data:) # rubocop:disable Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
|
301
|
+
unless language.blank? && replacements.blank? && subauth.blank? && format == 'json' && !performance_data
|
302
|
+
Qa.deprecation_warning(
|
303
|
+
in_msg: 'Qa::Authorities::LinkedData::FindTerm',
|
304
|
+
msg: "individual attributes for options (e.g. replacements, subauth, language) are deprecated; use request_header instead"
|
305
|
+
)
|
306
|
+
end
|
307
|
+
request_header = {}
|
308
|
+
request_header[:replacements] = replacements || {}
|
309
|
+
request_header[:subauthority] = subauth || nil
|
310
|
+
request_header[:language] = language || nil
|
311
|
+
request_header[:format] = format || 'json'
|
312
|
+
request_header[:performance_data] = performance_data
|
313
|
+
request_header
|
314
|
+
end
|
273
315
|
end
|
274
316
|
end
|
275
317
|
end
|
@@ -15,29 +15,30 @@ 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, :fetched_size, :normalized_size
|
19
|
-
private :full_graph, :filtered_graph, :language, :access_time_s, :normalize_time_s, :fetched_size, :normalized_size
|
18
|
+
attr_reader :search_config, :full_graph, :filtered_graph, :language, :access_time_s, :normalize_time_s, :fetched_size, :normalized_size, :subauthority
|
19
|
+
private :full_graph, :filtered_graph, :language, :access_time_s, :normalize_time_s, :fetched_size, :normalized_size, :subauthority
|
20
20
|
|
21
21
|
delegate :subauthority?, :supports_sort?, :prefixes, :authority_name, to: :search_config
|
22
22
|
|
23
23
|
# Search a linked data authority
|
24
24
|
# @praram [String] the query
|
25
|
-
# @param
|
26
|
-
# @
|
27
|
-
# @
|
28
|
-
# @
|
29
|
-
# @
|
25
|
+
# @param request_header [Hash] optional attributes that can be appended to the generated URL
|
26
|
+
# @option language [Symbol] language used to select literals when multi-language is supported (e.g. :en, :fr, etc.)
|
27
|
+
# @option replacements [Hash] replacement values with { pattern_name (defined in YAML config) => value }
|
28
|
+
# @option subauthority [String] the subauthority to query
|
29
|
+
# @option context [Boolean] true if context should be returned with the results; otherwise, false (default: false)
|
30
|
+
# @option performance_data [Boolean] true if include_performance_data should be returned with the results; otherwise, false (default: false)
|
30
31
|
# @return [String] json results
|
32
|
+
# @note All parameters after request_header are deprecated and will be removed in the next major release.
|
31
33
|
# @example Json Results for Linked Data Search
|
32
34
|
# [ {"uri":"http://id.worldcat.org/fast/5140","id":"5140","label":"Cornell, Joseph"},
|
33
35
|
# {"uri":"http://id.worldcat.org/fast/72456","id":"72456","label":"Cornell, Sarah Maria, 1802-1832"},
|
34
36
|
# {"uri":"http://id.worldcat.org/fast/409667","id":"409667","label":"Cornell, Ezra, 1807-1874"} ]
|
35
|
-
def search(query, language: nil, replacements: {}, subauth: nil, context: false, performance_data: false) # rubocop:disable Metrics/ParameterLists
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
url = authority_service.build_url(action_config: search_config, action: :search, action_request: query, substitutions: replacements, subauthority: subauth, language: @language)
|
37
|
+
def search(query, request_header: {}, language: nil, replacements: {}, subauth: nil, context: false, performance_data: false) # rubocop:disable Metrics/ParameterLists
|
38
|
+
request_header = build_request_header(language: language, replacements: replacements, subauth: subauth, context: context, performance_data: performance_data) if request_header.empty?
|
39
|
+
unpack_request_header(request_header)
|
40
|
+
raise Qa::InvalidLinkedDataAuthority, "Unable to initialize linked data search sub-authority #{subauthority}" unless subauthority.nil? || subauthority?(subauthority)
|
41
|
+
url = authority_service.build_url(action_config: search_config, action: :search, action_request: query, request_header: request_header)
|
41
42
|
Rails.logger.info "QA Linked Data search url: #{url}"
|
42
43
|
load_graph(url: url)
|
43
44
|
normalize_results
|
@@ -66,7 +67,7 @@ module Qa::Authorities
|
|
66
67
|
normalize_end_dt = Time.now.utc
|
67
68
|
@normalize_time_s = normalize_end_dt - normalize_start_dt
|
68
69
|
@normalized_size = json.to_s.size if performance_data?
|
69
|
-
Rails.logger.info("Time to
|
70
|
+
Rails.logger.info("Time to normalize data: #{normalize_time_s}s")
|
70
71
|
json = append_performance_data(json) if performance_data?
|
71
72
|
json
|
72
73
|
end
|
@@ -87,7 +88,16 @@ module Qa::Authorities
|
|
87
88
|
|
88
89
|
results_mapper_service.map_values(graph: filtered_graph, prefixes: prefixes, ldpath_map: ldpath_map,
|
89
90
|
predicate_map: predicate_map, sort_key: :sort,
|
90
|
-
preferred_language:
|
91
|
+
preferred_language: language, context_map: context_map)
|
92
|
+
end
|
93
|
+
|
94
|
+
def unpack_request_header(request_header)
|
95
|
+
@subauthority = request_header.fetch(:subauthority, nil)
|
96
|
+
@context = request_header.fetch(:context, false)
|
97
|
+
@performance_data = request_header.fetch(:performance_data, false)
|
98
|
+
@language = language_service.preferred_language(user_language: request_header.fetch(:user_language, nil),
|
99
|
+
authority_language: search_config.language)
|
100
|
+
request_header[:language] = Array(@language)
|
91
101
|
end
|
92
102
|
|
93
103
|
def context_map
|
@@ -180,6 +190,24 @@ module Qa::Authorities
|
|
180
190
|
total_time_s: (access_time_s + normalize_time_s) }
|
181
191
|
{ performance: performance, results: results }
|
182
192
|
end
|
193
|
+
|
194
|
+
# This is providing support for calling build_url with individual parameters instead of the request_header.
|
195
|
+
# This is deprecated and will be removed in the next major release.
|
196
|
+
def build_request_header(language:, replacements:, subauth:, context:, performance_data:) # rubocop:disable Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
|
197
|
+
unless language.blank? && replacements.blank? && subauth.blank? && !context && !performance_data
|
198
|
+
Qa.deprecation_warning(
|
199
|
+
in_msg: 'Qa::Authorities::LinkedData::SearchQuery',
|
200
|
+
msg: "individual attributes for options (e.g. replacements, subauth, language) are deprecated; use request_header instead"
|
201
|
+
)
|
202
|
+
end
|
203
|
+
request_header = {}
|
204
|
+
request_header[:replacements] = replacements || {}
|
205
|
+
request_header[:subauthority] = subauth || nil
|
206
|
+
request_header[:language] = language || nil
|
207
|
+
request_header[:context] = context
|
208
|
+
request_header[:performance_data] = performance_data
|
209
|
+
request_header
|
210
|
+
end
|
183
211
|
end
|
184
212
|
end
|
185
213
|
end
|
@@ -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/version.rb
CHANGED
@@ -425,6 +425,24 @@ describe Qa::LinkedDataTermsController, type: :controller do
|
|
425
425
|
expect(JSON.parse(response.body).keys).to match_array ["@context", "@graph"]
|
426
426
|
end
|
427
427
|
end
|
428
|
+
|
429
|
+
context 'and it was requested as n3' do
|
430
|
+
it 'succeeds and returns term data as n3 content type' do
|
431
|
+
get :show, params: { id: '530369', vocab: 'OCLC_FAST', format: 'n3' }
|
432
|
+
expect(response).to be_successful
|
433
|
+
expect(response.content_type).to eq 'text/n3'
|
434
|
+
expect(response.body).to start_with "@prefix"
|
435
|
+
end
|
436
|
+
end
|
437
|
+
|
438
|
+
context 'and it was requested as ntriples' do
|
439
|
+
it 'succeeds and returns term data as ntriples content type' do
|
440
|
+
get :show, params: { id: '530369', vocab: 'OCLC_FAST', format: 'ntriples' }
|
441
|
+
expect(response).to be_successful
|
442
|
+
expect(response.content_type).to eq 'application/n-triples'
|
443
|
+
expect(response.body).to include('<http://id.worldcat.org/fast/530369> <http://www.w3.org/2004/02/skos/core#prefLabel> "Cornell University"')
|
444
|
+
end
|
445
|
+
end
|
428
446
|
end
|
429
447
|
|
430
448
|
context 'when cors headers are enabled' do
|
@@ -587,6 +605,24 @@ describe Qa::LinkedDataTermsController, type: :controller do
|
|
587
605
|
end
|
588
606
|
end
|
589
607
|
|
608
|
+
context 'and it was requested as n3' do
|
609
|
+
it 'succeeds and returns term data as n3 content type' do
|
610
|
+
get :fetch, params: { uri: 'http://id.worldcat.org/fast/530369', vocab: 'LOD_TERM_URI_PARAM_CONFIG', format: 'n3' }
|
611
|
+
expect(response).to be_successful
|
612
|
+
expect(response.content_type).to eq 'text/n3'
|
613
|
+
expect(response.body).to start_with "@prefix"
|
614
|
+
end
|
615
|
+
end
|
616
|
+
|
617
|
+
context 'and it was requested as ntriples' do
|
618
|
+
it 'succeeds and returns term data as ntriples content type' do
|
619
|
+
get :fetch, params: { uri: 'http://id.worldcat.org/fast/530369', vocab: 'LOD_TERM_URI_PARAM_CONFIG', format: 'ntriples' }
|
620
|
+
expect(response).to be_successful
|
621
|
+
expect(response.content_type).to eq 'application/n-triples'
|
622
|
+
expect(response.body).to include('<http://id.worldcat.org/fast/530369> <http://www.w3.org/2004/02/skos/core#prefLabel> "Cornell University"')
|
623
|
+
end
|
624
|
+
end
|
625
|
+
|
590
626
|
context 'blank nodes not included in predicates list' do
|
591
627
|
before do
|
592
628
|
stub_request(:get, 'http://localhost/test_default/term?uri=http://id.worldcat.org/fast/530369wbn')
|
@@ -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
|
@@ -228,5 +228,29 @@ describe Qa::TermsController, type: :controller do
|
|
228
228
|
end
|
229
229
|
end
|
230
230
|
end
|
231
|
+
context "with request for n3" do
|
232
|
+
before do
|
233
|
+
stub_request(:get, "https://api.discogs.com/releases/3380671")
|
234
|
+
.to_return(status: 200, body: webmock_fixture("discogs-find-response-json.json"))
|
235
|
+
end
|
236
|
+
it 'Access-Control-Allow-Origin is not present' do
|
237
|
+
get :show, params: { vocab: "discogs", subauthority: "release", id: "3380671", format: 'n3' }
|
238
|
+
expect(response).to be_successful
|
239
|
+
expect(response.content_type).to eq 'text/n3'
|
240
|
+
expect(response.body).to start_with "@prefix"
|
241
|
+
end
|
242
|
+
end
|
243
|
+
context "with request for ntriples" do
|
244
|
+
before do
|
245
|
+
stub_request(:get, "https://api.discogs.com/releases/3380671")
|
246
|
+
.to_return(status: 200, body: webmock_fixture("discogs-find-response-json.json"))
|
247
|
+
end
|
248
|
+
it 'Access-Control-Allow-Origin is not present' do
|
249
|
+
get :show, params: { vocab: "discogs", subauthority: "release", id: "3380671", format: 'ntriples' }
|
250
|
+
expect(response).to be_successful
|
251
|
+
expect(response.content_type).to eq 'application/n-triples'
|
252
|
+
expect(response.body).to include('_:agentn1 <http://www.w3.org/2000/01/rdf-schema#label> "Dexter Gordon"')
|
253
|
+
end
|
254
|
+
end
|
231
255
|
end
|
232
256
|
end
|
@@ -1 +1 @@
|
|
1
|
-
{"status":"Accepted","series":[],"labels":[{"name":"Blue Note"}],"year":1962,"artists":[{"name":"Dexter Gordon"}],"id":3380671,"genres":["Jazz"],"title":"A Swingin' Affair","styles":["Hard Bop"],"formats":[{"qty":"1","descriptions":["LP","Album","Mono"],"name":"Vinyl"}]}
|
1
|
+
{"status":"Accepted","series":[],"labels":[{"name":"Blue Note"}],"year":1962,"artists":[{"name":"Dexter Gordon"}],"id":3380671,"genres":["Jazz"],"title":"A Swingin' Affair","styles":["Hard Bop"],"formats":[{"qty":"1","descriptions":["LP","Album","Mono"],"name":"Vinyl"}],"uri":"https://www.discogs.com/Dexter-Gordon-A-Swingin-Affair/release/3380671","resource_url":"https://api.discogs.com/releases/3380671"}
|
@@ -136,6 +136,50 @@ describe Qa::Authorities::Discogs::GenericAuthority do
|
|
136
136
|
end
|
137
137
|
end
|
138
138
|
|
139
|
+
context "n3 format and subauthority master" do
|
140
|
+
let(:tc) { instance_double(Qa::TermsController) }
|
141
|
+
let :results do
|
142
|
+
authority.find("950011", tc)
|
143
|
+
end
|
144
|
+
before do
|
145
|
+
allow(Qa::TermsController).to receive(:new).and_return(tc)
|
146
|
+
allow(tc).to receive(:params).and_return('format' => "n3", 'subauthority' => "master")
|
147
|
+
end
|
148
|
+
|
149
|
+
it "returns the Discogs data converted to n3 for a given id" do
|
150
|
+
expect(results).to start_with "@prefix"
|
151
|
+
expect(results).to include("Blue Moon / You Go To My Head")
|
152
|
+
expect(results).to include("Billie Holiday And Her Orchestra")
|
153
|
+
expect(results).to include("Haven Gillespie")
|
154
|
+
expect(results).to include("1952")
|
155
|
+
expect(results).to include("Jazz")
|
156
|
+
expect(results).to include("Barney Kessel")
|
157
|
+
expect(results).to include("Guitar")
|
158
|
+
end
|
159
|
+
end
|
160
|
+
|
161
|
+
context "ntriples format and subauthority master" do
|
162
|
+
let(:tc) { instance_double(Qa::TermsController) }
|
163
|
+
let :results do
|
164
|
+
authority.find("950011", tc)
|
165
|
+
end
|
166
|
+
before do
|
167
|
+
allow(Qa::TermsController).to receive(:new).and_return(tc)
|
168
|
+
allow(tc).to receive(:params).and_return('format' => "ntriples", 'subauthority' => "master")
|
169
|
+
end
|
170
|
+
|
171
|
+
it "returns the Discogs data converted to ntriples for a given id" do
|
172
|
+
expect(results).to include("https://www.discogs.com/Billie-Holiday-And-Her-Orchestra-Blue-Moon-You-Go-To-My-Head/master/950011")
|
173
|
+
expect(results).to include("Blue Moon / You Go To My Head")
|
174
|
+
expect(results).to include("Billie Holiday And Her Orchestra")
|
175
|
+
expect(results).to include("Haven Gillespie")
|
176
|
+
expect(results).to include("1952")
|
177
|
+
expect(results).to include("Jazz")
|
178
|
+
expect(results).to include("Barney Kessel")
|
179
|
+
expect(results).to include("Guitar")
|
180
|
+
end
|
181
|
+
end
|
182
|
+
|
139
183
|
context "json-ld format and subauthority all" do
|
140
184
|
let(:tc) { instance_double(Qa::TermsController) }
|
141
185
|
let :results do
|
@@ -161,6 +205,56 @@ describe Qa::Authorities::Discogs::GenericAuthority do
|
|
161
205
|
expect(results).to include("1952")
|
162
206
|
end
|
163
207
|
end
|
208
|
+
|
209
|
+
context "n3 format and subauthority all" do
|
210
|
+
let(:tc) { instance_double(Qa::TermsController) }
|
211
|
+
let :results do
|
212
|
+
authority.find("7143179", tc)
|
213
|
+
end
|
214
|
+
before do
|
215
|
+
allow(Qa::TermsController).to receive(:new).and_return(tc)
|
216
|
+
allow(tc).to receive(:params).and_return('format' => "n3", 'subauthority' => "all")
|
217
|
+
end
|
218
|
+
|
219
|
+
it "returns the Discogs data converted to n3 for a given id" do
|
220
|
+
expect(results).to start_with "@prefix"
|
221
|
+
expect(results).to include("You Go To My Head")
|
222
|
+
expect(results).to include("Rodgers & Hart")
|
223
|
+
expect(results).to include("Ray Brown")
|
224
|
+
expect(results).to include("1952")
|
225
|
+
expect(results).to include("Single")
|
226
|
+
expect(results).to include("mono")
|
227
|
+
expect(results).to include("45 RPM")
|
228
|
+
expect(results).to include("Vinyl")
|
229
|
+
expect(results).to include("http://id.loc.gov/vocabulary/carriers/sd")
|
230
|
+
expect(results).to include("1952")
|
231
|
+
end
|
232
|
+
end
|
233
|
+
|
234
|
+
context "ntriples format and subauthority all" do
|
235
|
+
let(:tc) { instance_double(Qa::TermsController) }
|
236
|
+
let :results do
|
237
|
+
authority.find("7143179", tc)
|
238
|
+
end
|
239
|
+
before do
|
240
|
+
allow(Qa::TermsController).to receive(:new).and_return(tc)
|
241
|
+
allow(tc).to receive(:params).and_return('format' => "ntriples", 'subauthority' => "all")
|
242
|
+
end
|
243
|
+
|
244
|
+
it "returns the Discogs data converted to ntriples for a given id" do
|
245
|
+
expect(results).to include("https://www.discogs.com/Billie-Holiday-And-Her-Orchestra-Blue-Moon-You-Go-To-My-Head/release/7143179")
|
246
|
+
expect(results).to include("You Go To My Head")
|
247
|
+
expect(results).to include("Rodgers & Hart")
|
248
|
+
expect(results).to include("Ray Brown")
|
249
|
+
expect(results).to include("1952")
|
250
|
+
expect(results).to include("Single")
|
251
|
+
expect(results).to include("mono")
|
252
|
+
expect(results).to include("45 RPM")
|
253
|
+
expect(results).to include("Vinyl")
|
254
|
+
expect(results).to include("http://id.loc.gov/vocabulary/carriers/sd")
|
255
|
+
expect(results).to include("1952")
|
256
|
+
end
|
257
|
+
end
|
164
258
|
end
|
165
259
|
end
|
166
260
|
|
@@ -179,13 +273,13 @@ describe Qa::Authorities::Discogs::GenericAuthority do
|
|
179
273
|
end
|
180
274
|
|
181
275
|
it "has id and label keys" do
|
182
|
-
expect(results.first["uri"]).to eq("https://
|
276
|
+
expect(results.first["uri"]).to eq("https://www.discogs.com/Melody-Gardot-Who-Will-Comfort-Me-Over-The-Rainbow/release/1750352")
|
183
277
|
expect(results.first["id"]).to eq "1750352"
|
184
278
|
expect(results.first["label"]).to eq "Melody Gardot - Who Will Comfort Me / Over The Rainbow"
|
185
|
-
expect(results.first["context"]["
|
186
|
-
expect(results.first["context"]["
|
187
|
-
expect(results.first["context"]["
|
188
|
-
expect(results.first["context"]["
|
279
|
+
expect(results.first["context"][1]["values"]).to eq ["2009"]
|
280
|
+
expect(results.first["context"][3]["values"][0]).to eq "Vinyl"
|
281
|
+
expect(results.first["context"][2]["values"][1]).to eq "Universal Music Classics & Jazz"
|
282
|
+
expect(results.first["context"][4]["values"][0]).to eq "release"
|
189
283
|
end
|
190
284
|
end
|
191
285
|
|
@@ -202,12 +296,12 @@ describe Qa::Authorities::Discogs::GenericAuthority do
|
|
202
296
|
end
|
203
297
|
|
204
298
|
it "has id and label keys" do
|
205
|
-
expect(results.first['uri']).to eq "https://
|
299
|
+
expect(results.first['uri']).to eq "https://www.discogs.com/Wes-Montgomery-Bumpin-On-Sunset-Tequila/master/606116"
|
206
300
|
expect(results.first['id']).to eq "606116"
|
207
301
|
expect(results.first['label']).to eq "Wes Montgomery - Bumpin' On Sunset / Tequila"
|
208
|
-
expect(results.first['context']["
|
209
|
-
expect(results.first['context']["
|
210
|
-
expect(results.first["context"]["
|
302
|
+
expect(results.first['context'][1]["values"]).to eq ['1966']
|
303
|
+
expect(results.first['context'][3]["values"][2]).to eq "45 RPM"
|
304
|
+
expect(results.first["context"][4]["values"][0]).to eq "master"
|
211
305
|
end
|
212
306
|
end
|
213
307
|
|