qa 2.0.0 → 2.0.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 15f2c24ef66af417831964088303e576bc6a41b2
4
- data.tar.gz: d1f95c9f7f81a25052efb3fad0a9e9aec4dd94d8
3
+ metadata.gz: 975793a758ca32fe1b35d6f8301a7c418e57f0a4
4
+ data.tar.gz: 6559c2e07eac3ecb9e0312d703108cf4ac2e6d73
5
5
  SHA512:
6
- metadata.gz: 4c37c298ea575d83360d160e4d5463077da86375cdb0596bf0ca0914e3f137febe7de56cf1eb014a8b740b380b4168018e6f356219b2d0ced6cb77c0a0c6616a
7
- data.tar.gz: 0ab1fa42c0d0722fb8e455c3cca0de392561763f5535ce04afeaf9095941e91b271d882162f1d2edbdab15f1234a9b45dbe00a1c249a9b28765b0684a0bdd8bc
6
+ metadata.gz: '08a4dfabf5896a359ededc1266bf3e3231b892816608638127c3b1be0b5287f85581fcdbdf67020c7092865c02c5a83ec70195c2264dbef39509c0d9a11a8b76'
7
+ data.tar.gz: 85e3c2a1be10878ab183f0561fb20ebb37e1b3e09754e313dcdab458cb274db6dfcd58a448d4f7fdd599ad15283eea0e640720557cff2f470b3400c886f26685
data/README.md CHANGED
@@ -385,6 +385,8 @@ gem 'rdf-rdfxml'
385
385
 
386
386
  #### Configuring a LOD Authority
387
387
 
388
+ There are a number of authority configurations that are available. See (ld4l-labs/linked_data_authorities)[https://github.com/ld4l-labs/linked_data_authorities] for configurations and instructions on how to use them. These are updated periodically, so check back from time to time to see what's new.
389
+
388
390
  Access to LOD authorities can be configured. Currently, a configuration exists in QA for OCLC Fast Linked Data, Library of
389
391
  Congress (terms only), and Agrovoc. Look for configuration files in
390
392
  [/config/authorities/linked_data](https://github.com/samvera/questioning_authority/tree/master/config/authorities/linked_data).
@@ -1,6 +1,7 @@
1
1
  require 'qa/authorities/linked_data/config/term_config'.freeze
2
2
  require 'qa/authorities/linked_data/config/search_config'.freeze
3
3
  require 'json'
4
+ require 'erb'
4
5
 
5
6
  # Provide attr_reader methods for linked data authority configurations. Some default configurations are provided for several
6
7
  # linked data authorities and can be found at /config/authorities/linked_data. You can add configurations for new authorities by
@@ -17,6 +18,10 @@ require 'json'
17
18
  module Qa::Authorities
18
19
  module LinkedData
19
20
  class Config
21
+ class << self
22
+ include ERB::Util
23
+ end
24
+
20
25
  attr_reader :authority_name
21
26
  attr_reader :authority_config
22
27
 
@@ -56,7 +61,8 @@ module Qa::Authorities
56
61
  pred_uri
57
62
  end
58
63
 
59
- def self.replace_pattern(url, pattern, value)
64
+ def self.replace_pattern(url, pattern, value, encode = false)
65
+ value = url_encode(value).gsub(".", "%2E") if encode
60
66
  url.gsub("{?#{pattern}}", value)
61
67
  end
62
68
 
@@ -71,7 +77,7 @@ module Qa::Authorities
71
77
  config.each do |param_key, rep_pattern|
72
78
  s_param_key = param_key.to_s
73
79
  value = replacements[param_key] || replacements[s_param_key] || rep_pattern[:default]
74
- url = replace_pattern(url, param_key, value)
80
+ url = replace_pattern(url, param_key, value, rep_pattern[:encode])
75
81
  end
76
82
  url
77
83
  end
@@ -95,12 +95,26 @@ module Qa::Authorities
95
95
  search_config.fetch(:qa_replacement_patterns)
96
96
  end
97
97
 
98
+ # Should the replacement pattern be encoded?
99
+ # @return [Boolean] true, if the pattern should be encoded; otherwise, false
100
+ def qa_replacement_encoded?(pattern_key)
101
+ map_key = qa_replacement_patterns[pattern_key].to_sym
102
+ replacement_encoded? map_key
103
+ end
104
+
98
105
  # Are there replacement parameters configured for search query?
99
106
  # @return [True|False] true if there are replacement parameters configured for search query; otherwise, false
100
107
  def replacements?
101
108
  replacement_count.positive?
102
109
  end
103
110
 
111
+ # Should the replacement parameter be encoded?
112
+ # @return [True|False] true if the replacement parameter should be encoded; otherwise, false
113
+ def replacement_encoded?(map_key)
114
+ return false unless url_mappings[map_key].key? :encode
115
+ url_mappings[map_key][:encode]
116
+ end
117
+
104
118
  # Return the number of possible replacement values to make in the search URL
105
119
  # @return [Integer] the configured number of possible replacements in the search url
106
120
  def replacement_count
@@ -159,8 +173,8 @@ module Qa::Authorities
159
173
  # @return [String] the search encoded url
160
174
  def url_with_replacements(query, sub_auth = nil, search_replacements = {})
161
175
  return nil unless supports_search?
162
- sub_auth = sub_auth.to_sym if sub_auth.is_a? String
163
- url = Config.replace_pattern(url_template, qa_replacement_patterns[:query], query)
176
+ sub_auth = sub_auth.to_sym if sub_auth.present?
177
+ url = Config.replace_pattern(url_template, qa_replacement_patterns[:query], query, qa_replacement_encoded?(:query))
164
178
  url = Config.process_subauthority(url, subauthority_replacement_pattern, subauthorities, sub_auth) if subauthorities?
165
179
  url = Config.apply_replacements(url, replacements, search_replacements) if replacements?
166
180
  url
@@ -112,12 +112,26 @@ module Qa::Authorities
112
112
  Config.config_value(term_config, :qa_replacement_patterns)
113
113
  end
114
114
 
115
+ # Should the replacement pattern be encoded?
116
+ # @return [Boolean] true, if the pattern should be encoded; otherwise, false
117
+ def term_qa_replacement_encoded?(pattern_key)
118
+ map_key = term_qa_replacement_patterns[pattern_key].to_sym
119
+ term_replacement_encoded? map_key
120
+ end
121
+
115
122
  # Are there replacement parameters configured for term fetch?
116
- # @return [True|False] true if there are replacement parameters configured for term fetch; otherwise, false
123
+ # @return [Boolean] true if there are replacement parameters configured for term fetch; otherwise, false
117
124
  def term_replacements?
118
125
  term_replacement_count.positive?
119
126
  end
120
127
 
128
+ # Should the replacement parameter be encoded?
129
+ # @return [Boolean] true if the replacement parameter should be encoded; otherwise, false
130
+ def term_replacement_encoded?(map_key)
131
+ return false unless term_url_mappings[map_key].key? :encode
132
+ term_url_mappings[map_key][:encode]
133
+ end
134
+
121
135
  # Return the number of possible replacement values to make in the term URL
122
136
  # @return [Integer] the configured number of possible replacements in the term url
123
137
  def term_replacement_count
@@ -129,7 +143,7 @@ module Qa::Authorities
129
143
  def term_replacements
130
144
  return @term_replacements unless @term_replacements.nil?
131
145
  @term_replacements = {}
132
- @term_replacements = term_url_mappings.select { |k, _v| !term_qa_replacement_patterns.include?(k) } unless term_config.nil? || term_url_mappings.nil?
146
+ @term_replacements = term_url_mappings.select { |k, _v| !term_qa_replacement_patterns.value?(k.to_s) } unless term_config.nil? || term_url_mappings.nil?
133
147
  @term_replacements
134
148
  end
135
149
 
@@ -176,7 +190,7 @@ module Qa::Authorities
176
190
  def term_url_with_replacements(id, sub_auth = nil, replacements = {})
177
191
  return nil unless supports_term?
178
192
  sub_auth = sub_auth.to_sym if sub_auth.is_a? String
179
- url = Config.replace_pattern(term_url_template, term_qa_replacement_patterns[:term_id], id)
193
+ url = Config.replace_pattern(term_url_template, term_qa_replacement_patterns[:term_id], id, term_qa_replacement_encoded?(:term_id))
180
194
  url = Config.process_subauthority(url, term_subauthority_replacement_pattern, term_subauthorities, sub_auth) if term_subauthorities?
181
195
  url = Config.apply_replacements(url, term_replacements, replacements) if term_replacements?
182
196
  url
@@ -1,3 +1,3 @@
1
1
  module Qa
2
- VERSION = "2.0.0".freeze
2
+ VERSION = "2.0.1".freeze
3
3
  end
@@ -0,0 +1,91 @@
1
+ {
2
+ "term": {
3
+ "url": {
4
+ "@context": "http://www.w3.org/ns/hydra/context.jsonld",
5
+ "@type": "IriTemplate",
6
+ "template": "http://localhost/test_default/term?uri={?term_uri}&{?encode_true}&{?encode_false}&{?encode_not_specified}",
7
+ "variableRepresentation": "BasicRepresentation",
8
+ "mapping": [
9
+ {
10
+ "@type": "IriTemplateMapping",
11
+ "variable": "term_uri",
12
+ "property": "hydra:freetextQuery",
13
+ "required": true,
14
+ "encode": true
15
+ },
16
+ {
17
+ "@type": "IriTemplateMapping",
18
+ "variable": "encode_true",
19
+ "property": "hydra:freetextQuery",
20
+ "required": true,
21
+ "encode": true
22
+ },
23
+ {
24
+ "@type": "IriTemplateMapping",
25
+ "variable": "encode_false",
26
+ "property": "hydra:freetextQuery",
27
+ "required": true,
28
+ "encode": false
29
+ },
30
+ {
31
+ "@type": "IriTemplateMapping",
32
+ "variable": "encode_not_specified",
33
+ "property": "hydra:freetextQuery",
34
+ "required": true
35
+ }
36
+ ]
37
+ },
38
+ "qa_replacement_patterns": {
39
+ "term_id": "term_uri"
40
+ },
41
+ "term_id": "URI",
42
+ "results": {
43
+ "id_predicate": "http://id.loc.gov/vocabulary/identifiers/lccn",
44
+ "label_predicate": "http://www.w3.org/2004/02/skos/core#prefLabel"
45
+ }
46
+ },
47
+ "search": {
48
+ "url": {
49
+ "@context": "http://www.w3.org/ns/hydra/context.jsonld",
50
+ "@type": "IriTemplate",
51
+ "template": "http://localhost/test_default/search?query={?query}&{?encode_true}&{?encode_false}&{?encode_not_specified}",
52
+ "variableRepresentation": "BasicRepresentation",
53
+ "mapping": [
54
+ {
55
+ "@type": "IriTemplateMapping",
56
+ "variable": "query",
57
+ "property": "hydra:freetextQuery",
58
+ "required": true,
59
+ "encode": true
60
+ },
61
+ {
62
+ "@type": "IriTemplateMapping",
63
+ "variable": "encode_true",
64
+ "property": "hydra:freetextQuery",
65
+ "required": true,
66
+ "encode": true
67
+ },
68
+ {
69
+ "@type": "IriTemplateMapping",
70
+ "variable": "encode_false",
71
+ "property": "hydra:freetextQuery",
72
+ "required": true,
73
+ "encode": false
74
+ },
75
+ {
76
+ "@type": "IriTemplateMapping",
77
+ "variable": "encode_not_specified",
78
+ "property": "hydra:freetextQuery",
79
+ "required": true
80
+ }
81
+ ]
82
+ },
83
+ "qa_replacement_patterns": {
84
+ "query": "query"
85
+ },
86
+ "results": {
87
+ "id_predicate": "http://purl.org/dc/terms/identifier",
88
+ "label_predicate": "http://www.w3.org/2004/02/skos/core#prefLabel"
89
+ }
90
+ }
91
+ }
@@ -0,0 +1,27 @@
1
+ {
2
+ "term": {
3
+ "url": {
4
+ "@context": "http://www.w3.org/ns/hydra/context.jsonld",
5
+ "@type": "IriTemplate",
6
+ "template": "http://localhost/test_default/term/{?term_id}",
7
+ "variableRepresentation": "BasicRepresentation",
8
+ "mapping": [
9
+ {
10
+ "@type": "IriTemplateMapping",
11
+ "variable": "term_id",
12
+ "property": "hydra:freetextQuery",
13
+ "required": true
14
+ }
15
+ ]
16
+ },
17
+ "qa_replacement_patterns": {
18
+ "term_id": "term_id"
19
+ },
20
+ "term_id": "ID",
21
+ "results": {
22
+ "id_predicate": "http://id.loc.gov/vocabulary/identifiers/lccn",
23
+ "label_predicate": "http://www.w3.org/2004/02/skos/core#prefLabel"
24
+ }
25
+ },
26
+ "search": {}
27
+ }
@@ -4,6 +4,7 @@ RSpec.describe Qa::Authorities::LinkedData::SearchConfig do
4
4
  let(:full_config) { Qa::Authorities::LinkedData::Config.new(:LOD_FULL_CONFIG).search }
5
5
  let(:min_config) { Qa::Authorities::LinkedData::Config.new(:LOD_MIN_CONFIG).search }
6
6
  let(:term_only_config) { Qa::Authorities::LinkedData::Config.new(:LOD_TERM_ONLY_CONFIG).search }
7
+ let(:encoding_config) { Qa::Authorities::LinkedData::Config.new(:LOD_ENCODING_CONFIG).search }
7
8
 
8
9
  describe '#search_config' do
9
10
  let(:full_search_config) do
@@ -381,5 +382,14 @@ RSpec.describe Qa::Authorities::LinkedData::SearchConfig do
381
382
  expect(min_config.url_with_replacements('Smith', nil, fake_replacement_key: 'fake_value')).to eq expected_url
382
383
  end
383
384
  end
385
+
386
+ context 'with encoding specified in config' do
387
+ it 'returns the uri as the url' do
388
+ expected_url = 'http://localhost/test_default/search?query=encoded%20because%3Aencode%3Dtrue&yes%3Aencoded%20here&no:encoding here&defaults:to not encoded'
389
+ query = 'encoded because:encode=true'
390
+ replacements = { encode_true: 'yes:encoded here', encode_false: 'no:encoding here', encode_not_specified: 'defaults:to not encoded' }
391
+ expect(encoding_config.url_with_replacements(query, nil, replacements)).to eq expected_url
392
+ end
393
+ end
384
394
  end
385
395
  end
@@ -4,6 +4,7 @@ describe Qa::Authorities::LinkedData::TermConfig do
4
4
  let(:full_config) { Qa::Authorities::LinkedData::Config.new(:LOD_FULL_CONFIG).term }
5
5
  let(:min_config) { Qa::Authorities::LinkedData::Config.new(:LOD_MIN_CONFIG).term }
6
6
  let(:search_only_config) { Qa::Authorities::LinkedData::Config.new(:LOD_SEARCH_ONLY_CONFIG).term }
7
+ let(:encoding_config) { Qa::Authorities::LinkedData::Config.new(:LOD_ENCODING_CONFIG).term }
7
8
 
8
9
  describe '#term_config' do
9
10
  let(:full_term_config) do
@@ -415,5 +416,14 @@ describe Qa::Authorities::LinkedData::TermConfig do
415
416
  expect(min_config.term_url_with_replacements('C123', nil, fake_replacement_key: 'fake_value')).to eq expected_url
416
417
  end
417
418
  end
419
+
420
+ context 'with encoding specified in config' do
421
+ it 'returns the uri as the url' do
422
+ expected_url = 'http://localhost/test_default/term?uri=http%3A%2F%2Fencoded%2Ebecause%3Fencode%3Dtrue&yes%3Aencoded%20here&no:encoding here&defaults:to not encoded'
423
+ term_uri = 'http://encoded.because?encode=true'
424
+ replacements = { encode_true: 'yes:encoded here', encode_false: 'no:encoding here', encode_not_specified: 'defaults:to not encoded' }
425
+ expect(encoding_config.term_url_with_replacements(term_uri, nil, replacements)).to eq expected_url
426
+ end
427
+ end
418
428
  end
419
429
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: qa
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.0.0
4
+ version: 2.0.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Stephen Anderson
@@ -15,7 +15,7 @@ authors:
15
15
  autorequire:
16
16
  bindir: bin
17
17
  cert_chain: []
18
- date: 2017-10-05 00:00:00.000000000 Z
18
+ date: 2018-02-22 00:00:00.000000000 Z
19
19
  dependencies:
20
20
  - !ruby/object:Gem::Dependency
21
21
  name: rails
@@ -354,6 +354,7 @@ files:
354
354
  - spec/fixtures/authorities/authority_B.yml
355
355
  - spec/fixtures/authorities/authority_C.yml
356
356
  - spec/fixtures/authorities/authority_D.yml
357
+ - spec/fixtures/authorities/linked_data/lod_encoding_config.json
357
358
  - spec/fixtures/authorities/linked_data/lod_full_config.json
358
359
  - spec/fixtures/authorities/linked_data/lod_lang_defaults.json
359
360
  - spec/fixtures/authorities/linked_data/lod_lang_multi_defaults.json
@@ -362,6 +363,7 @@ files:
362
363
  - spec/fixtures/authorities/linked_data/lod_min_config.json
363
364
  - spec/fixtures/authorities/linked_data/lod_search_only_config.json
364
365
  - spec/fixtures/authorities/linked_data/lod_sort.json
366
+ - spec/fixtures/authorities/linked_data/lod_term_id_param_config.json
365
367
  - spec/fixtures/authorities/linked_data/lod_term_only_config.json
366
368
  - spec/fixtures/funders-find-response.json
367
369
  - spec/fixtures/funders-noquery.json
@@ -458,7 +460,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
458
460
  version: '0'
459
461
  requirements: []
460
462
  rubyforge_project:
461
- rubygems_version: 2.6.8
463
+ rubygems_version: 2.6.14
462
464
  signing_key:
463
465
  specification_version: 4
464
466
  summary: You should question your authorities.
@@ -474,6 +476,7 @@ test_files:
474
476
  - spec/fixtures/authorities/authority_B.yml
475
477
  - spec/fixtures/authorities/authority_C.yml
476
478
  - spec/fixtures/authorities/authority_D.yml
479
+ - spec/fixtures/authorities/linked_data/lod_encoding_config.json
477
480
  - spec/fixtures/authorities/linked_data/lod_full_config.json
478
481
  - spec/fixtures/authorities/linked_data/lod_lang_defaults.json
479
482
  - spec/fixtures/authorities/linked_data/lod_lang_multi_defaults.json
@@ -482,6 +485,7 @@ test_files:
482
485
  - spec/fixtures/authorities/linked_data/lod_min_config.json
483
486
  - spec/fixtures/authorities/linked_data/lod_search_only_config.json
484
487
  - spec/fixtures/authorities/linked_data/lod_sort.json
488
+ - spec/fixtures/authorities/linked_data/lod_term_id_param_config.json
485
489
  - spec/fixtures/authorities/linked_data/lod_term_only_config.json
486
490
  - spec/fixtures/funders-find-response.json
487
491
  - spec/fixtures/funders-noquery.json