qa 4.0.0 → 4.1.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 +1 -1
- data/app/controllers/qa/linked_data_terms_controller.rb +30 -9
- data/app/controllers/qa/terms_controller.rb +3 -2
- data/app/models/qa/linked_data/config/context_property_map.rb +6 -25
- data/app/services/qa/iri_template_service.rb +32 -24
- data/app/services/qa/linked_data/authority_service.rb +8 -0
- data/app/services/qa/linked_data/authority_url_service.rb +27 -8
- data/app/services/qa/linked_data/deep_sort_service.rb +3 -2
- data/app/services/qa/linked_data/graph_service.rb +13 -0
- data/app/services/qa/linked_data/language_service.rb +12 -0
- data/app/services/qa/linked_data/language_sort_service.rb +7 -2
- data/app/services/qa/linked_data/ldpath_service.rb +40 -0
- data/app/services/qa/linked_data/mapper/graph_ldpath_mapper_service.rb +49 -0
- data/app/services/qa/linked_data/mapper/graph_mapper_service.rb +3 -11
- data/app/services/qa/linked_data/mapper/graph_predicate_mapper_service.rb +40 -0
- data/app/services/qa/linked_data/mapper/search_results_mapper_service.rb +58 -11
- data/app/services/qa/linked_data/mapper/term_results_mapper_service.rb +80 -0
- data/config/authorities/linked_data/loc.json +13 -7
- data/config/authorities/linked_data/oclc_fast.json +13 -8
- data/lib/generators/qa/discogs/USAGE +10 -0
- data/lib/generators/qa/discogs/discogs_generator.rb +12 -0
- data/lib/generators/qa/discogs/templates/config/discogs-formats.yml +346 -0
- data/lib/generators/qa/discogs/templates/config/discogs-genres.yml +627 -0
- data/lib/generators/qa/install/templates/config/initializers/qa.rb +4 -0
- data/lib/qa.rb +6 -0
- data/lib/qa/authorities.rb +2 -0
- data/lib/qa/authorities/discogs.rb +28 -0
- data/lib/qa/authorities/discogs/discogs_instance_builder.rb +145 -0
- data/lib/qa/authorities/discogs/discogs_translation.rb +126 -0
- data/lib/qa/authorities/discogs/discogs_utils.rb +89 -0
- data/lib/qa/authorities/discogs/discogs_works_builder.rb +153 -0
- data/lib/qa/authorities/discogs/generic_authority.rb +151 -0
- data/lib/qa/authorities/discogs_subauthority.rb +9 -0
- data/lib/qa/authorities/linked_data/config.rb +7 -3
- data/lib/qa/authorities/linked_data/config/search_config.rb +99 -11
- data/lib/qa/authorities/linked_data/config/term_config.rb +112 -8
- data/lib/qa/authorities/linked_data/find_term.rb +154 -84
- data/lib/qa/authorities/linked_data/search_query.rb +76 -13
- data/lib/qa/configuration.rb +8 -0
- data/lib/qa/version.rb +1 -1
- data/spec/controllers/linked_data_terms_controller_spec.rb +151 -30
- data/spec/controllers/terms_controller_spec.rb +4 -0
- data/spec/features/linked_data/language_spec.rb +298 -0
- data/spec/fixtures/authorities/linked_data/lod_full_config.json +21 -5
- data/spec/fixtures/authorities/linked_data/lod_lang_defaults.json +4 -4
- data/spec/fixtures/authorities/linked_data/lod_lang_multi_defaults.json +4 -4
- data/spec/fixtures/authorities/linked_data/lod_lang_no_defaults.json +4 -5
- data/spec/fixtures/authorities/linked_data/lod_lang_param.json +4 -4
- data/spec/fixtures/authorities/linked_data/lod_term_uri_param_config.json +1 -1
- data/spec/fixtures/discogs-find-response-json.json +1 -0
- data/spec/fixtures/discogs-find-response-jsonld-master.json +1 -0
- data/spec/fixtures/discogs-find-response-jsonld-release.json +1 -0
- data/spec/fixtures/discogs-id-matches-master.json +1 -0
- data/spec/fixtures/discogs-id-matches-release.json +1 -0
- data/spec/fixtures/discogs-id-not-found-master.json +1 -0
- data/spec/fixtures/discogs-id-not-found-release.json +1 -0
- data/spec/fixtures/discogs-search-response-no-auth.json +1 -0
- data/spec/fixtures/discogs-search-response-no-subauth.json +1 -0
- data/spec/fixtures/discogs-search-response-subauth.json +1 -0
- data/spec/fixtures/lod_lang_search_enesfrde.rdf.xml +60 -0
- data/spec/fixtures/lod_lang_search_sv.rdf.xml +42 -0
- data/spec/fixtures/lod_loc_term_found.rdf.xml +5 -0
- data/spec/lib/authorities/discogs/generic_authority_spec.rb +235 -0
- data/spec/lib/authorities/discogs_spec.rb +17 -0
- data/spec/lib/authorities/linked_data/config_spec.rb +68 -5
- data/spec/lib/authorities/linked_data/find_term_spec.rb +298 -3
- data/spec/lib/authorities/linked_data/generic_authority_spec.rb +46 -485
- data/spec/lib/authorities/linked_data/search_config_spec.rb +154 -3
- data/spec/lib/authorities/linked_data/search_query_spec.rb +240 -3
- data/spec/lib/authorities/linked_data/term_config_spec.rb +193 -5
- data/spec/lib/configuration_spec.rb +18 -0
- data/spec/models/linked_data/config/context_property_map_spec.rb +3 -31
- data/spec/services/iri_template_service_spec.rb +54 -12
- data/spec/{lib/authorities → services}/linked_data/authority_service_spec.rb +47 -0
- data/spec/services/linked_data/language_service_spec.rb +52 -11
- data/spec/services/linked_data/ldpath_service_spec.rb +61 -0
- data/spec/services/linked_data/mapper/graph_ldpath_mapper_service_spec.rb +118 -0
- data/spec/services/linked_data/mapper/graph_predicate_mapper_service_spec.rb +110 -0
- data/spec/services/linked_data/mapper/term_results_mapper_service_spec.rb +94 -0
- data/spec/spec_helper.rb +1 -1
- data/spec/support/matchers/include_hash.rb +5 -0
- data/spec/test_app_templates/lib/generators/test_app_generator.rb +4 -0
- metadata +73 -5
- data/lib/qa/authorities/linked_data/rdf_helper.rb +0 -49
|
@@ -44,4 +44,51 @@ describe Qa::LinkedData::AuthorityService do
|
|
|
44
44
|
expect(described_class.authority_names).to eq auth_names
|
|
45
45
|
end
|
|
46
46
|
end
|
|
47
|
+
|
|
48
|
+
describe '#authority_details' do
|
|
49
|
+
let(:term_details) do
|
|
50
|
+
{
|
|
51
|
+
"label" => "oclc_fast term (QA)",
|
|
52
|
+
"uri" => "urn:qa:term:oclc_fast",
|
|
53
|
+
"authority" => "oclc_fast",
|
|
54
|
+
"action" => "term",
|
|
55
|
+
"language" => ["en"]
|
|
56
|
+
}
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
let(:search_details) do
|
|
60
|
+
{
|
|
61
|
+
"label" => "oclc_fast search (QA)",
|
|
62
|
+
"uri" => "urn:qa:search:oclc_fast",
|
|
63
|
+
"authority" => "oclc_fast",
|
|
64
|
+
"action" => "search",
|
|
65
|
+
"language" => ["en"]
|
|
66
|
+
}
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
let(:search_details_with_subauth) do
|
|
70
|
+
{
|
|
71
|
+
"label" => "oclc_fast search topic (QA)",
|
|
72
|
+
"uri" => "urn:qa:search:oclc_fast:topic",
|
|
73
|
+
"authority" => "oclc_fast",
|
|
74
|
+
"subauthority" => "topic",
|
|
75
|
+
"action" => "search",
|
|
76
|
+
"language" => ["en"]
|
|
77
|
+
}
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
let(:details) { described_class.authority_details }
|
|
81
|
+
|
|
82
|
+
it "returns a list with details for term without subauthorities" do
|
|
83
|
+
expect(details).to include_hash(term_details)
|
|
84
|
+
end
|
|
85
|
+
|
|
86
|
+
it "returns a list with details for search without subauthorities" do
|
|
87
|
+
expect(details).to include_hash(search_details)
|
|
88
|
+
end
|
|
89
|
+
|
|
90
|
+
it "returns a list with details for search with a subauthority" do
|
|
91
|
+
expect(details).to include_hash(search_details_with_subauth)
|
|
92
|
+
end
|
|
93
|
+
end
|
|
47
94
|
end
|
|
@@ -8,33 +8,74 @@ RSpec.describe Qa::LinkedData::LanguageService do
|
|
|
8
8
|
let(:authority_language) { nil }
|
|
9
9
|
|
|
10
10
|
context 'when neither user nor authority language are passed in' do
|
|
11
|
-
|
|
12
|
-
|
|
11
|
+
context 'and site wide default language is set' do
|
|
12
|
+
before do
|
|
13
|
+
allow(Qa.config).to receive(:default_language).and_return(:en)
|
|
14
|
+
end
|
|
15
|
+
it 'returns default language from Qa configuration' do
|
|
16
|
+
expect(subject).to match_array [:en]
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
context 'and site wide default language is WILDCARD' do
|
|
21
|
+
before do
|
|
22
|
+
allow(Qa.config).to receive(:default_language).and_return(Qa::LinkedData::LanguageService::WILDCARD)
|
|
23
|
+
end
|
|
24
|
+
it 'returns default language from Qa configuration' do
|
|
25
|
+
expect(subject).to eq nil
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
context 'and site wide default language is not specified' do
|
|
30
|
+
before do
|
|
31
|
+
allow(Qa.config).to receive(:default_language).and_return(nil)
|
|
32
|
+
end
|
|
33
|
+
it 'returns default language from Qa configuration' do
|
|
34
|
+
expect(subject).to eq nil
|
|
35
|
+
end
|
|
13
36
|
end
|
|
14
37
|
end
|
|
15
38
|
|
|
16
39
|
context 'when authority language is passed in and user language is NOT passed in' do
|
|
17
|
-
|
|
40
|
+
context 'and site wide default language is set' do
|
|
41
|
+
let(:authority_language) { :fr }
|
|
42
|
+
|
|
43
|
+
it 'returns authority language' do
|
|
44
|
+
expect(subject).to match_array [:fr]
|
|
45
|
+
end
|
|
46
|
+
end
|
|
18
47
|
|
|
19
|
-
|
|
20
|
-
|
|
48
|
+
context 'and authority default language is WILDCARD' do
|
|
49
|
+
let(:authority_language) { '*' }
|
|
50
|
+
|
|
51
|
+
it 'returns default language from Qa configuration' do
|
|
52
|
+
expect(subject).to eq nil
|
|
53
|
+
end
|
|
21
54
|
end
|
|
22
55
|
end
|
|
23
56
|
|
|
24
57
|
context 'when user and authority language are passed in' do
|
|
25
|
-
let(:user_language) { :de }
|
|
26
58
|
let(:authority_language) { :fr }
|
|
59
|
+
let(:user_language) { :de }
|
|
27
60
|
|
|
28
61
|
it 'returns user language' do
|
|
29
62
|
expect(subject).to match_array [:de]
|
|
30
63
|
end
|
|
31
|
-
end
|
|
32
64
|
|
|
33
|
-
|
|
34
|
-
|
|
65
|
+
context 'and there are multiple user languages' do
|
|
66
|
+
let(:user_language) { [:de, :fr] }
|
|
67
|
+
|
|
68
|
+
it 'returns multiple languages' do
|
|
69
|
+
expect(subject).to match_array [:de, :fr]
|
|
70
|
+
end
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
context 'and user language is wildcard' do
|
|
74
|
+
let(:user_language) { '*' }
|
|
35
75
|
|
|
36
|
-
|
|
37
|
-
|
|
76
|
+
it 'returns user language' do
|
|
77
|
+
expect(subject).to eq nil
|
|
78
|
+
end
|
|
38
79
|
end
|
|
39
80
|
end
|
|
40
81
|
end
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
|
|
3
|
+
RSpec.describe Qa::LinkedData::LdpathService do
|
|
4
|
+
let(:ldpath) { 'skos:prefLabel ::xsd:string' }
|
|
5
|
+
|
|
6
|
+
describe '.ldpath_program' do
|
|
7
|
+
subject { described_class.ldpath_program(ldpath: ldpath, prefixes: prefixes) }
|
|
8
|
+
|
|
9
|
+
let(:prefixes) do
|
|
10
|
+
{ skos: 'http://www.w3.org/2004/02/skos/core#' }
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
it 'returns instance of Ldpath::Program' do
|
|
14
|
+
expect(subject).to be_kind_of Ldpath::Program
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
context 'when ldpath_program gets parse error' do
|
|
18
|
+
let(:cause) { "undefined method `ascii_tree' for nil:NilClass" }
|
|
19
|
+
let(:warning) { I18n.t('qa.linked_data.ldpath.parse_logger_error') }
|
|
20
|
+
let(:program_code) { "@prefix skos : <http://www.w3.org/2004/02/skos/core#> ;\nproperty = skos:prefLabel ::xsd:string ;" }
|
|
21
|
+
let(:log_message) { "WARNING: #{warning}... cause: #{cause}\n ldpath_program=\n#{program_code}" }
|
|
22
|
+
|
|
23
|
+
before { allow(Ldpath::Program).to receive(:parse).with(anything).and_raise(cause) }
|
|
24
|
+
|
|
25
|
+
it 'logs error and returns PARSE ERROR as the value' do
|
|
26
|
+
expect(Rails.logger).to receive(:warn).with(log_message)
|
|
27
|
+
expect { subject.values(graph, subject_uri) }.to raise_error StandardError, I18n.t('qa.linked_data.ldpath.parse_error') + "... cause: #{cause}"
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
describe '.ldpath_evaluate' do
|
|
33
|
+
subject { described_class.ldpath_evaluate(program: program, graph: graph, subject_uri: subject_uri) }
|
|
34
|
+
|
|
35
|
+
let(:program) { instance_double(Ldpath::Program) }
|
|
36
|
+
let(:graph) { instance_double(RDF::Graph) }
|
|
37
|
+
let(:subject_uri) { instance_double(RDF::URI) }
|
|
38
|
+
let(:values) { ['Expanded Label'] }
|
|
39
|
+
|
|
40
|
+
before do
|
|
41
|
+
allow(Ldpath::Program).to receive(:parse).with('property = skos:prefLabel ::xsd:string ;').and_return(program)
|
|
42
|
+
allow(program).to receive(:evaluate).with(subject_uri, context: graph, limit_to_context: true).and_return('property' => values)
|
|
43
|
+
end
|
|
44
|
+
it 'returns the extracted label' do
|
|
45
|
+
expect(subject).to match_array values
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
context 'when ldpath_evaluate gets parse error' do
|
|
49
|
+
let(:cause) { "unknown cause" }
|
|
50
|
+
let(:warning) { I18n.t('qa.linked_data.ldpath.evaluate_logger_error') }
|
|
51
|
+
let(:log_message) { "WARNING: #{warning} (cause: #{cause}" }
|
|
52
|
+
|
|
53
|
+
before { allow(program).to receive(:evaluate).with(subject_uri, context: graph, limit_to_context: true).and_raise(cause) }
|
|
54
|
+
|
|
55
|
+
it 'logs error and returns PARSE ERROR as the value' do
|
|
56
|
+
expect(Rails.logger).to receive(:warn).with(log_message)
|
|
57
|
+
expect { subject.values(graph, subject_uri) }.to raise_error StandardError, I18n.t('qa.linked_data.ldpath.evaluate_error') + "... cause: #{cause}"
|
|
58
|
+
end
|
|
59
|
+
end
|
|
60
|
+
end
|
|
61
|
+
end
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
|
|
3
|
+
RSpec.describe Qa::LinkedData::Mapper::GraphLdpathMapperService do
|
|
4
|
+
let(:graph) { Qa::LinkedData::GraphService.load_graph(url: 'http://local.data') }
|
|
5
|
+
let(:prefixes) do
|
|
6
|
+
{
|
|
7
|
+
uri: :subject_uri,
|
|
8
|
+
dcterms: 'http://purl.org/dc/terms/',
|
|
9
|
+
skos: 'http://www.w3.org/2004/02/skos/core#',
|
|
10
|
+
vivoweb: 'http://vivoweb.org/ontology/core#'
|
|
11
|
+
}
|
|
12
|
+
end
|
|
13
|
+
let(:ldpath_map) do
|
|
14
|
+
{
|
|
15
|
+
uri: :subject_uri,
|
|
16
|
+
id: 'dcterms:identifier',
|
|
17
|
+
label: 'skos:prefLabel',
|
|
18
|
+
altlabel: 'skos:altLabel',
|
|
19
|
+
sameas: 'skos:sameAs',
|
|
20
|
+
sort: 'vivoweb:rank'
|
|
21
|
+
}
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
before do
|
|
25
|
+
stub_request(:get, 'http://local.data')
|
|
26
|
+
.to_return(status: 200, body: webmock_fixture('lod_3_ranked_varying_preds.nt'), headers: { 'Content-Type' => 'application/n-triples' })
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
describe '.map_values' do
|
|
30
|
+
subject { described_class.map_values(graph: graph, prefixes: prefixes, ldpath_map: ldpath_map, subject_uri: subject_uri) }
|
|
31
|
+
|
|
32
|
+
context 'when each predicate has one value' do
|
|
33
|
+
let(:subject_uri) { RDF::URI.new('http://id.worldcat.org/fast/530369') }
|
|
34
|
+
|
|
35
|
+
it 'maps graph values to predicates' do
|
|
36
|
+
expect(subject.count).to eq 6
|
|
37
|
+
expect(subject).to be_kind_of Hash
|
|
38
|
+
expect(subject.keys).to match_array [:uri, :id, :label, :altlabel, :sameas, :sort]
|
|
39
|
+
|
|
40
|
+
validate_entry(subject, :uri, [subject_uri.to_s], RDF::URI)
|
|
41
|
+
validate_entry(subject, :id, ['530369'], String)
|
|
42
|
+
validate_entry(subject, :label, ['Cornell University'], String)
|
|
43
|
+
validate_entry(subject, :altlabel, ['Ithaca (N.Y.). Cornell University'], String)
|
|
44
|
+
validate_entry(subject, :sameas, ['http://id.loc.gov/authorities/names/n79021621'], RDF::URI)
|
|
45
|
+
validate_entry(subject, :sort, ['1'], String)
|
|
46
|
+
end
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
context 'when some predicates have multiple values' do
|
|
50
|
+
let(:subject_uri) { RDF::URI.new('http://id.worldcat.org/fast/510103') }
|
|
51
|
+
|
|
52
|
+
it 'maps graph values to predicates' do
|
|
53
|
+
expect(subject.count).to eq 6
|
|
54
|
+
expect(subject).to be_kind_of Hash
|
|
55
|
+
expect(subject.keys).to match_array [:uri, :id, :label, :altlabel, :sameas, :sort]
|
|
56
|
+
|
|
57
|
+
validate_entry(subject, :uri, [subject_uri.to_s], RDF::URI)
|
|
58
|
+
validate_entry(subject, :id, ['510103'], String)
|
|
59
|
+
validate_entry(subject, :label, ['Cornell University. Libraries'], String)
|
|
60
|
+
validate_entry(subject, :altlabel, ['Cornell University. Central Libraries', 'Cornell University. John M. Olin Library', 'Cornell University. White Library'], String)
|
|
61
|
+
validate_entry(subject, :sameas, ['http://id.loc.gov/authorities/names/n50000040', 'https://viaf.org/viaf/147713418'], RDF::URI)
|
|
62
|
+
validate_entry(subject, :sort, ['2'], String)
|
|
63
|
+
end
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
context 'when some predicates has no values' do
|
|
67
|
+
let(:subject_uri) { RDF::URI.new('http://id.worldcat.org/fast/5140') }
|
|
68
|
+
|
|
69
|
+
it 'maps graph values to predicates' do
|
|
70
|
+
expect(subject.count).to eq 6
|
|
71
|
+
expect(subject).to be_kind_of Hash
|
|
72
|
+
expect(subject.keys).to match_array [:uri, :id, :label, :altlabel, :sameas, :sort]
|
|
73
|
+
|
|
74
|
+
validate_entry(subject, :uri, [subject_uri.to_s], RDF::URI)
|
|
75
|
+
validate_entry(subject, :id, ['5140'], String)
|
|
76
|
+
validate_entry(subject, :label, ['Cornell, Joseph'], String)
|
|
77
|
+
validate_entry(subject, :altlabel, [], NilClass)
|
|
78
|
+
validate_entry(subject, :sameas, [], NilClass)
|
|
79
|
+
validate_entry(subject, :sort, ['3'], String)
|
|
80
|
+
end
|
|
81
|
+
end
|
|
82
|
+
|
|
83
|
+
context 'when block is passed in' do
|
|
84
|
+
let(:subject_uri) { RDF::URI.new('http://id.worldcat.org/fast/5140') }
|
|
85
|
+
let(:context) do
|
|
86
|
+
{ location: '42.4488° N, 76.4763° W' }
|
|
87
|
+
end
|
|
88
|
+
let(:subject) do
|
|
89
|
+
described_class.map_values(graph: graph, prefixes: prefixes, ldpath_map: ldpath_map, subject_uri: subject_uri) do |value_map|
|
|
90
|
+
value_map[:context] = context
|
|
91
|
+
value_map
|
|
92
|
+
end
|
|
93
|
+
end
|
|
94
|
+
|
|
95
|
+
it 'yields to passed in block' do
|
|
96
|
+
expect(subject.count).to eq 7
|
|
97
|
+
expect(subject).to be_kind_of Hash
|
|
98
|
+
expect(subject.keys).to match_array [:uri, :id, :label, :altlabel, :sameas, :sort, :context]
|
|
99
|
+
|
|
100
|
+
validate_entry(subject, :uri, [subject_uri.to_s], RDF::URI)
|
|
101
|
+
validate_entry(subject, :id, ['5140'], String)
|
|
102
|
+
validate_entry(subject, :label, ['Cornell, Joseph'], String)
|
|
103
|
+
validate_entry(subject, :altlabel, [], NilClass)
|
|
104
|
+
validate_entry(subject, :sameas, [], NilClass)
|
|
105
|
+
validate_entry(subject, :sort, ['3'], String)
|
|
106
|
+
|
|
107
|
+
expect(subject[:context]).to be_kind_of Hash
|
|
108
|
+
expect(subject[:context]).to include(context)
|
|
109
|
+
end
|
|
110
|
+
end
|
|
111
|
+
end
|
|
112
|
+
|
|
113
|
+
def validate_entry(results, key, values, entry_kind)
|
|
114
|
+
expect(results[key]).to be_kind_of Array
|
|
115
|
+
expect(results[key].first).to be_kind_of entry_kind
|
|
116
|
+
expect(results[key].map(&:to_s)).to match_array values
|
|
117
|
+
end
|
|
118
|
+
end
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
|
|
3
|
+
RSpec.describe Qa::LinkedData::Mapper::GraphPredicateMapperService do
|
|
4
|
+
let(:graph) { Qa::LinkedData::GraphService.load_graph(url: 'http://local.data') }
|
|
5
|
+
let(:predicate_map) do
|
|
6
|
+
{
|
|
7
|
+
uri: :subject_uri,
|
|
8
|
+
id: RDF::URI.new('http://purl.org/dc/terms/identifier'),
|
|
9
|
+
label: RDF::URI.new('http://www.w3.org/2004/02/skos/core#prefLabel'),
|
|
10
|
+
altlabel: RDF::URI.new('http://www.w3.org/2004/02/skos/core#altLabel'),
|
|
11
|
+
sameas: RDF::URI.new('http://www.w3.org/2004/02/skos/core#sameAs'),
|
|
12
|
+
sort: RDF::URI.new('http://vivoweb.org/ontology/core#rank')
|
|
13
|
+
}
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
before do
|
|
17
|
+
stub_request(:get, 'http://local.data')
|
|
18
|
+
.to_return(status: 200, body: webmock_fixture('lod_3_ranked_varying_preds.nt'), headers: { 'Content-Type' => 'application/n-triples' })
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
describe '.map_values' do
|
|
22
|
+
subject { described_class.map_values(graph: graph, predicate_map: predicate_map, subject_uri: subject_uri) }
|
|
23
|
+
|
|
24
|
+
context 'when each predicate has one value' do
|
|
25
|
+
let(:subject_uri) { RDF::URI.new('http://id.worldcat.org/fast/530369') }
|
|
26
|
+
|
|
27
|
+
it 'maps graph values to predicates' do
|
|
28
|
+
expect(subject.count).to eq 6
|
|
29
|
+
expect(subject).to be_kind_of Hash
|
|
30
|
+
expect(subject.keys).to match_array [:uri, :id, :label, :altlabel, :sameas, :sort]
|
|
31
|
+
|
|
32
|
+
validate_entry(subject, :uri, [subject_uri.to_s], RDF::URI)
|
|
33
|
+
validate_entry(subject, :id, ['530369'], RDF::Literal)
|
|
34
|
+
validate_entry(subject, :label, ['Cornell University'], RDF::Literal)
|
|
35
|
+
validate_entry(subject, :altlabel, ['Ithaca (N.Y.). Cornell University'], RDF::Literal)
|
|
36
|
+
validate_entry(subject, :sameas, ['http://id.loc.gov/authorities/names/n79021621'], RDF::URI)
|
|
37
|
+
validate_entry(subject, :sort, ['1'], RDF::Literal)
|
|
38
|
+
end
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
context 'when some predicates have multiple values' do
|
|
42
|
+
let(:subject_uri) { RDF::URI.new('http://id.worldcat.org/fast/510103') }
|
|
43
|
+
|
|
44
|
+
it 'maps graph values to predicates' do
|
|
45
|
+
expect(subject.count).to eq 6
|
|
46
|
+
expect(subject).to be_kind_of Hash
|
|
47
|
+
expect(subject.keys).to match_array [:uri, :id, :label, :altlabel, :sameas, :sort]
|
|
48
|
+
|
|
49
|
+
validate_entry(subject, :uri, [subject_uri.to_s], RDF::URI)
|
|
50
|
+
validate_entry(subject, :id, ['510103'], RDF::Literal)
|
|
51
|
+
validate_entry(subject, :label, ['Cornell University. Libraries'], RDF::Literal)
|
|
52
|
+
validate_entry(subject, :altlabel, ['Cornell University. Central Libraries', 'Cornell University. John M. Olin Library', 'Cornell University. White Library'], RDF::Literal)
|
|
53
|
+
validate_entry(subject, :sameas, ['http://id.loc.gov/authorities/names/n50000040', 'https://viaf.org/viaf/147713418'], RDF::URI)
|
|
54
|
+
validate_entry(subject, :sort, ['2'], RDF::Literal)
|
|
55
|
+
end
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
context 'when some predicates has no values' do
|
|
59
|
+
let(:subject_uri) { RDF::URI.new('http://id.worldcat.org/fast/5140') }
|
|
60
|
+
|
|
61
|
+
it 'maps graph values to predicates' do
|
|
62
|
+
expect(subject.count).to eq 6
|
|
63
|
+
expect(subject).to be_kind_of Hash
|
|
64
|
+
expect(subject.keys).to match_array [:uri, :id, :label, :altlabel, :sameas, :sort]
|
|
65
|
+
|
|
66
|
+
validate_entry(subject, :uri, [subject_uri.to_s], RDF::URI)
|
|
67
|
+
validate_entry(subject, :id, ['5140'], RDF::Literal)
|
|
68
|
+
validate_entry(subject, :label, ['Cornell, Joseph'], RDF::Literal)
|
|
69
|
+
validate_entry(subject, :altlabel, [], NilClass)
|
|
70
|
+
validate_entry(subject, :sameas, [], NilClass)
|
|
71
|
+
validate_entry(subject, :sort, ['3'], RDF::Literal)
|
|
72
|
+
end
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
context 'when block is passed in' do
|
|
76
|
+
let(:subject_uri) { RDF::URI.new('http://id.worldcat.org/fast/5140') }
|
|
77
|
+
let(:context) do
|
|
78
|
+
{ location: '42.4488° N, 76.4763° W' }
|
|
79
|
+
end
|
|
80
|
+
let(:subject) do
|
|
81
|
+
described_class.map_values(graph: graph, predicate_map: predicate_map, subject_uri: subject_uri) do |value_map|
|
|
82
|
+
value_map[:context] = context
|
|
83
|
+
value_map
|
|
84
|
+
end
|
|
85
|
+
end
|
|
86
|
+
|
|
87
|
+
it 'yields to passed in block' do
|
|
88
|
+
expect(subject.count).to eq 7
|
|
89
|
+
expect(subject).to be_kind_of Hash
|
|
90
|
+
expect(subject.keys).to match_array [:uri, :id, :label, :altlabel, :sameas, :sort, :context]
|
|
91
|
+
|
|
92
|
+
validate_entry(subject, :uri, [subject_uri.to_s], RDF::URI)
|
|
93
|
+
validate_entry(subject, :id, ['5140'], RDF::Literal)
|
|
94
|
+
validate_entry(subject, :label, ['Cornell, Joseph'], RDF::Literal)
|
|
95
|
+
validate_entry(subject, :altlabel, [], NilClass)
|
|
96
|
+
validate_entry(subject, :sameas, [], NilClass)
|
|
97
|
+
validate_entry(subject, :sort, ['3'], RDF::Literal)
|
|
98
|
+
|
|
99
|
+
expect(subject[:context]).to be_kind_of Hash
|
|
100
|
+
expect(subject[:context]).to include(context)
|
|
101
|
+
end
|
|
102
|
+
end
|
|
103
|
+
end
|
|
104
|
+
|
|
105
|
+
def validate_entry(results, key, values, entry_kind)
|
|
106
|
+
expect(results[key]).to be_kind_of Array
|
|
107
|
+
expect(results[key].first).to be_kind_of entry_kind
|
|
108
|
+
expect(results[key].map(&:to_s)).to match_array values
|
|
109
|
+
end
|
|
110
|
+
end
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
|
|
3
|
+
RSpec.describe Qa::LinkedData::Mapper::TermResultsMapperService do
|
|
4
|
+
let(:graph) { Qa::LinkedData::GraphService.load_graph(url: 'http://local.data') }
|
|
5
|
+
let(:subjects) { subject.map { |result| result[:uri].first.to_s } }
|
|
6
|
+
|
|
7
|
+
let(:expected) do
|
|
8
|
+
{
|
|
9
|
+
uri: ['http://aims.fao.org/aos/agrovoc/c_9513'],
|
|
10
|
+
id: ['http://aims.fao.org/aos/agrovoc/c_9513'],
|
|
11
|
+
label: ['buttermilk'],
|
|
12
|
+
altlabel: ['yummy'],
|
|
13
|
+
broader: ['http://aims.fao.org/aos/agrovoc/c_4830'],
|
|
14
|
+
narrower: [],
|
|
15
|
+
sameas: ['http://cat.aii.caas.cn/concept/c_26308',
|
|
16
|
+
'http://lod.nal.usda.gov/nalt/20627',
|
|
17
|
+
'http://d-nb.info/gnd/4147072-2']
|
|
18
|
+
}
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
let(:results) do
|
|
22
|
+
results = {}
|
|
23
|
+
subject.each { |k, v| results[k] = v.map(&:to_s) }
|
|
24
|
+
results
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
before do
|
|
28
|
+
stub_request(:get, 'http://local.data')
|
|
29
|
+
.to_return(status: 200, body: webmock_fixture('lod_lang_term_en.rdf.xml'), headers: { 'Content-Type' => 'application/application/rdf+xml' })
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
describe '.map_values' do
|
|
33
|
+
context 'when given a predicate map' do
|
|
34
|
+
subject { described_class.map_values(graph: graph, predicate_map: predicate_map, subject_uri: RDF::URI.new('http://aims.fao.org/aos/agrovoc/c_9513')) }
|
|
35
|
+
|
|
36
|
+
let(:predicate_map) do
|
|
37
|
+
{
|
|
38
|
+
uri: :subject_uri,
|
|
39
|
+
id: :subject_uri,
|
|
40
|
+
label: RDF::URI.new('http://www.w3.org/2004/02/skos/core#prefLabel'),
|
|
41
|
+
altlabel: RDF::URI.new('http://www.w3.org/2004/02/skos/core#altLabel'),
|
|
42
|
+
narrower: RDF::URI.new('http://www.w3.org/2004/02/skos/core#narrower'),
|
|
43
|
+
broader: RDF::URI.new('http://www.w3.org/2004/02/skos/core#broader'),
|
|
44
|
+
sameas: RDF::URI.new('http://www.w3.org/2004/02/skos/core#exactMatch')
|
|
45
|
+
}
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
it 'maps all values with a subject uri' do
|
|
49
|
+
expect(subject).to be_kind_of Hash
|
|
50
|
+
expect(results[:uri]).to match_array expected[:uri]
|
|
51
|
+
expect(results[:id]).to match_array expected[:id]
|
|
52
|
+
expect(results[:label]).to match_array expected[:label]
|
|
53
|
+
expect(results[:altlabel]).to match_array expected[:altlabel]
|
|
54
|
+
expect(results[:broader]).to match_array expected[:broader]
|
|
55
|
+
expect(results[:narrower]).to match_array expected[:narrower]
|
|
56
|
+
expect(results[:sameas]).to match_array expected[:sameas]
|
|
57
|
+
end
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
context 'when given an ldpath map' do
|
|
61
|
+
subject { described_class.map_values(graph: graph, prefixes: prefixes, ldpath_map: ldpath_map, subject_uri: RDF::URI.new('http://aims.fao.org/aos/agrovoc/c_9513')) }
|
|
62
|
+
|
|
63
|
+
let(:prefixes) do
|
|
64
|
+
{
|
|
65
|
+
dcterms: 'http://purl.org/dc/terms/',
|
|
66
|
+
skos: 'http://www.w3.org/2004/02/skos/core#'
|
|
67
|
+
}
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
let(:ldpath_map) do
|
|
71
|
+
{
|
|
72
|
+
uri: :subject_uri,
|
|
73
|
+
id: :subject_uri,
|
|
74
|
+
label: 'skos:prefLabel :: xsd:string',
|
|
75
|
+
altlabel: 'skos:altLabel :: xsd:string',
|
|
76
|
+
narrower: 'skos:narrower :: xsd:anyURI',
|
|
77
|
+
broader: 'skos:broader :: xsd:anyURI',
|
|
78
|
+
sameas: 'skos:exactMatch :: xsd:anyURI'
|
|
79
|
+
}
|
|
80
|
+
end
|
|
81
|
+
|
|
82
|
+
it 'maps all values with a subject uri' do
|
|
83
|
+
expect(subject).to be_kind_of Hash
|
|
84
|
+
expect(results[:uri]).to match_array expected[:uri]
|
|
85
|
+
expect(results[:id]).to match_array expected[:id]
|
|
86
|
+
expect(results[:label]).to match_array expected[:label]
|
|
87
|
+
expect(results[:altlabel]).to match_array expected[:altlabel]
|
|
88
|
+
expect(results[:broader]).to match_array expected[:broader]
|
|
89
|
+
expect(results[:narrower]).to match_array expected[:narrower]
|
|
90
|
+
expect(results[:sameas]).to match_array expected[:sameas]
|
|
91
|
+
end
|
|
92
|
+
end
|
|
93
|
+
end
|
|
94
|
+
end
|