foederati 0.1.0 → 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/foederati.rb +1 -0
- data/lib/foederati/provider.rb +8 -1
- data/lib/foederati/provider/request.rb +6 -2
- data/lib/foederati/provider/response.rb +3 -1
- data/lib/foederati/providers/digitalnz.rb +2 -0
- data/lib/foederati/providers/dpla.rb +2 -0
- data/lib/foederati/providers/trove.rb +14 -3
- data/lib/foederati/version.rb +1 -1
- data/spec/lib/foederati/provider/request_spec.rb +17 -7
- data/spec/lib/foederati/provider_spec.rb +22 -0
- data/spec/lib/foederati/providers/digitalnz_spec.rb +15 -0
- data/spec/lib/foederati/providers/dpla_spec.rb +15 -0
- data/spec/lib/foederati/providers/europeana_spec.rb +9 -0
- data/spec/lib/foederati/providers/trove_spec.rb +22 -0
- metadata +6 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 6c5cfad12d15dcb7be6a6736da964e625af651a9
|
4
|
+
data.tar.gz: ec34ace9f9ee56f4d311c78bf2d7e893302b0184
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 253ef90d2ee8609678e6109ffab70609cc5c311a97c0feb80d4e249507cc0ffefc872bb08c2b8363dd4810831c770ceab259f6db82756be98196aac25118ed8d
|
7
|
+
data.tar.gz: 901aa884c5d56172e0d3f3586eb6187fc1ae748390d9d05fab15dab97824b8d0f27c16084bc666766c675b59dea5939b25caf4f9cbb6d185386938bb09db4743
|
data/lib/foederati.rb
CHANGED
@@ -2,6 +2,7 @@
|
|
2
2
|
require 'active_support/core_ext/module/delegation'
|
3
3
|
require 'active_support/core_ext/object/blank'
|
4
4
|
require 'active_support/hash_with_indifferent_access'
|
5
|
+
require 'active_support/inflector'
|
5
6
|
require 'faraday'
|
6
7
|
require 'faraday_middleware'
|
7
8
|
require 'foederati/faraday_middleware'
|
data/lib/foederati/provider.rb
CHANGED
@@ -11,14 +11,17 @@ module Foederati
|
|
11
11
|
|
12
12
|
# TODO validate the type of values added to these
|
13
13
|
Urls = Struct.new(:api, :site)
|
14
|
+
DefaultParams = Struct.new(:query)
|
14
15
|
Results = Struct.new(:items, :total)
|
15
16
|
Fields = Struct.new(:title, :thumbnail, :url)
|
16
17
|
|
17
|
-
attr_reader :id, :urls, :results, :fields
|
18
|
+
attr_reader :id, :urls, :default_params, :results, :fields
|
19
|
+
attr_writer :name
|
18
20
|
|
19
21
|
def initialize(id, &block)
|
20
22
|
@id = id
|
21
23
|
@urls = Urls.new
|
24
|
+
@default_params = DefaultParams.new
|
22
25
|
@results = Results.new
|
23
26
|
@fields = Fields.new
|
24
27
|
|
@@ -27,6 +30,10 @@ module Foederati
|
|
27
30
|
self
|
28
31
|
end
|
29
32
|
|
33
|
+
def name
|
34
|
+
@name || id.to_s.titleize
|
35
|
+
end
|
36
|
+
|
30
37
|
# TODO sanity check things like presence of API URL
|
31
38
|
def search(**params)
|
32
39
|
request.execute(params).normalise
|
@@ -34,7 +34,9 @@ module Foederati
|
|
34
34
|
#
|
35
35
|
# @return [Hash]
|
36
36
|
def default_params
|
37
|
-
{ api_key: Foederati.api_keys.send(id) }.
|
37
|
+
{ api_key: Foederati.api_keys.send(id) }.
|
38
|
+
merge(Foederati.defaults.to_h).
|
39
|
+
merge(provider.default_params.to_h)
|
38
40
|
end
|
39
41
|
|
40
42
|
##
|
@@ -43,7 +45,9 @@ module Foederati
|
|
43
45
|
# @param params [Hash] query-specific URL parameters
|
44
46
|
# @return [String] the provider's API URL with all necessary params
|
45
47
|
def api_url(**params)
|
46
|
-
|
48
|
+
local_params = params.dup
|
49
|
+
local_params.delete(:query) if local_params[:query].blank? && provider.default_params.query.present?
|
50
|
+
format(urls.api, default_params.merge(local_params))
|
47
51
|
end
|
48
52
|
end
|
49
53
|
end
|
@@ -27,9 +27,11 @@ module Foederati
|
|
27
27
|
id => {
|
28
28
|
total: fetch_from_response(results.total, body) || 0,
|
29
29
|
results: items_from_response.map do |item|
|
30
|
+
thumbnail = fetch_from_response(fields.thumbnail, item)
|
31
|
+
thumbnail = thumbnail.is_a?(Array) ? thumbnail.first : thumbnail
|
30
32
|
{
|
31
33
|
title: fetch_from_response(fields.title, item),
|
32
|
-
thumbnail:
|
34
|
+
thumbnail: thumbnail,
|
33
35
|
url: fetch_from_response(fields.url, item)
|
34
36
|
}
|
35
37
|
end
|
@@ -5,10 +5,21 @@ Foederati::Providers.register :trove do
|
|
5
5
|
urls.api = 'http://api.trove.nla.gov.au/result?key=%{api_key}&q=%{query}&n=%{limit}&zone=picture&encoding=json'
|
6
6
|
urls.site = 'http://trove.nla.gov.au/result?q=%{query}'
|
7
7
|
|
8
|
-
|
9
|
-
|
8
|
+
default_params.query = '%20'
|
9
|
+
|
10
|
+
results.items = lambda do |response|
|
11
|
+
response['response']['zone'] ? response['response']['zone'].detect { |zone| zone['name'] == 'picture' }['records']['work'] : []
|
12
|
+
end
|
13
|
+
results.total = lambda do |response|
|
14
|
+
response['response']['zone'] ? response['response']['zone'].detect { |zone| zone['name'] == 'picture' }['records']['total'].to_i : 0
|
15
|
+
end
|
10
16
|
|
11
17
|
fields.title = 'title'
|
12
|
-
fields.thumbnail =
|
18
|
+
fields.thumbnail = lambda do |item|
|
19
|
+
if item['identifier']
|
20
|
+
thumb_identifier = item['identifier'].detect { |identifier| identifier['linktype'] == 'thumbnail' }
|
21
|
+
thumb_identifier ? thumb_identifier['value'] : nil
|
22
|
+
end
|
23
|
+
end
|
13
24
|
fields.url = 'troveUrl'
|
14
25
|
end
|
data/lib/foederati/version.rb
CHANGED
@@ -5,10 +5,12 @@ RSpec.describe Foederati::Provider::Request do
|
|
5
5
|
let(:provider) do
|
6
6
|
Foederati::Provider.new(:good_provider).tap do |p|
|
7
7
|
p.urls.api = "#{api_url}?q=%{query}&k=%{api_key}&l=%{limit}"
|
8
|
+
p.default_params.query = empty_query
|
8
9
|
end
|
9
10
|
end
|
10
11
|
let(:api_url) { 'http://api.example.com/' }
|
11
12
|
let(:query) { 'whale' }
|
13
|
+
let(:empty_query) { 'EMPTY' }
|
12
14
|
let(:api_key) { 'moby' }
|
13
15
|
let(:result_limit) { 10 }
|
14
16
|
|
@@ -68,14 +70,22 @@ RSpec.describe Foederati::Provider::Request do
|
|
68
70
|
end
|
69
71
|
|
70
72
|
describe '#api_url' do
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
73
|
+
context 'when the query is set' do
|
74
|
+
it 'replaces placeholders in API URL with params' do
|
75
|
+
expect(subject.api_url(query: query)).to \
|
76
|
+
eq("http://api.example.com/?q=#{query}&k=#{api_key}&l=#{result_limit}")
|
77
|
+
end
|
75
78
|
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
+
it 'overrides defaults with args' do
|
80
|
+
expect(subject.api_url(query: query, limit: 5)).to \
|
81
|
+
eq("http://api.example.com/?q=#{query}&k=#{api_key}&l=5")
|
82
|
+
end
|
83
|
+
end
|
84
|
+
context 'when the query is empty' do
|
85
|
+
it 'replaces the query with the default empty query' do
|
86
|
+
expect(subject.api_url(query: '')).to \
|
87
|
+
eq("http://api.example.com/?q=#{empty_query}&k=#{api_key}&l=#{result_limit}")
|
88
|
+
end
|
79
89
|
end
|
80
90
|
end
|
81
91
|
end
|
@@ -6,6 +6,11 @@ RSpec.describe Foederati::Provider do
|
|
6
6
|
it { is_expected.to respond_to :site }
|
7
7
|
end
|
8
8
|
|
9
|
+
describe '#default_params' do
|
10
|
+
subject { described_class.new(:new_provider).default_params }
|
11
|
+
it { is_expected.to respond_to :query }
|
12
|
+
end
|
13
|
+
|
9
14
|
describe '#results' do
|
10
15
|
subject { described_class.new(:new_provider).results }
|
11
16
|
it { is_expected.to respond_to :items }
|
@@ -19,6 +24,23 @@ RSpec.describe Foederati::Provider do
|
|
19
24
|
it { is_expected.to respond_to :url }
|
20
25
|
end
|
21
26
|
|
27
|
+
describe '#name' do
|
28
|
+
subject { described_class.new(:new_provider) }
|
29
|
+
|
30
|
+
context 'when not set' do
|
31
|
+
it 'is derived from ID' do
|
32
|
+
expect(subject.name).to eq('New Provider')
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
context 'when set' do
|
37
|
+
it 'is returned as set' do
|
38
|
+
subject.name = 'Nice name'
|
39
|
+
expect(subject.name).to eq('Nice name')
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
22
44
|
describe '#initialize' do
|
23
45
|
it 'evaluates a given block' do
|
24
46
|
provider = described_class.new(:new_provider) do
|
@@ -0,0 +1,15 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
RSpec.describe Foederati::Providers do
|
3
|
+
it 'has registered DigitalNZ' do
|
4
|
+
expect(described_class.registry).to have_key(:digitalnz)
|
5
|
+
end
|
6
|
+
|
7
|
+
describe 'DigitalNZ provider' do
|
8
|
+
let(:provider) { described_class.get(:digitalnz) }
|
9
|
+
|
10
|
+
describe '#name' do
|
11
|
+
subject { provider.name }
|
12
|
+
it { is_expected.to eq('DigitalNZ') }
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
RSpec.describe Foederati::Providers do
|
3
|
+
it 'has registered DPLA' do
|
4
|
+
expect(described_class.registry).to have_key(:dpla)
|
5
|
+
end
|
6
|
+
|
7
|
+
describe 'DPLA provider' do
|
8
|
+
let(:provider) { described_class.get(:dpla) }
|
9
|
+
|
10
|
+
describe '#name' do
|
11
|
+
subject { provider.name }
|
12
|
+
it { is_expected.to eq('DPLA') }
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
@@ -3,4 +3,13 @@ RSpec.describe Foederati::Providers do
|
|
3
3
|
it 'has registered Europeana' do
|
4
4
|
expect(described_class.registry).to have_key(:europeana)
|
5
5
|
end
|
6
|
+
|
7
|
+
describe 'Europeana provider' do
|
8
|
+
let(:provider) { described_class.get(:europeana) }
|
9
|
+
|
10
|
+
describe '#name' do
|
11
|
+
subject { provider.name }
|
12
|
+
it { is_expected.to eq('Europeana') }
|
13
|
+
end
|
14
|
+
end
|
6
15
|
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
RSpec.describe Foederati::Providers do
|
3
|
+
it 'has registered Trove' do
|
4
|
+
expect(described_class.registry).to have_key(:trove)
|
5
|
+
end
|
6
|
+
|
7
|
+
describe 'Trove provider' do
|
8
|
+
let(:provider) { described_class.get(:trove) }
|
9
|
+
|
10
|
+
describe '#name' do
|
11
|
+
subject { provider.name }
|
12
|
+
it { is_expected.to eq('Trove') }
|
13
|
+
end
|
14
|
+
|
15
|
+
describe '#default_params' do
|
16
|
+
describe '#query' do
|
17
|
+
subject { provider.default_params.query }
|
18
|
+
it { is_expected.to eq('%20') }
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: foederati
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Richard Doe
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-
|
11
|
+
date: 2017-06-14 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activesupport
|
@@ -153,7 +153,10 @@ files:
|
|
153
153
|
- spec/lib/foederati/provider/request_spec.rb
|
154
154
|
- spec/lib/foederati/provider/response_spec.rb
|
155
155
|
- spec/lib/foederati/provider_spec.rb
|
156
|
+
- spec/lib/foederati/providers/digitalnz_spec.rb
|
157
|
+
- spec/lib/foederati/providers/dpla_spec.rb
|
156
158
|
- spec/lib/foederati/providers/europeana_spec.rb
|
159
|
+
- spec/lib/foederati/providers/trove_spec.rb
|
157
160
|
- spec/lib/foederati/providers_spec.rb
|
158
161
|
- spec/lib/foederati_spec.rb
|
159
162
|
- spec/spec_helper.rb
|
@@ -177,7 +180,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
177
180
|
version: '0'
|
178
181
|
requirements: []
|
179
182
|
rubyforge_project:
|
180
|
-
rubygems_version: 2.5.
|
183
|
+
rubygems_version: 2.5.1
|
181
184
|
signing_key:
|
182
185
|
specification_version: 4
|
183
186
|
summary: Federated search
|