qa 4.2.0 → 4.3.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 +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
|
|