data-provider 0.2.2 → 0.2.3
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/data-provider.gemspec +1 -1
- data/lib/data_provider/base.rb +1 -1
- data/lib/data_provider/container.rb +15 -5
- data/lib/data_provider/provider.rb +3 -0
- data/spec/container_spec.rb +52 -1
- data/spec/data_provider_spec.rb +66 -1
- metadata +10 -10
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 6553850094492d6ea8435a9098391c95b90ac4c7
|
4
|
+
data.tar.gz: 31ef7fcd6b10dc7b0cb4fa64bb70fce514bccd67
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f8ee310527986bcb7e2dc97643410f1d3baddc40b4ce2e632aa2745bf985bdbbcfec12b0146f736e7694039a7f0a4e0b0bf26b811a03b66ab96d3b047250758c
|
7
|
+
data.tar.gz: 30df84e79b9746a38c6076d7a7eda4406de47e910d069bdf6c9c746c1125bae4db9d403298599668db6d11c3ea1cf2a91faed298b3e545dc35021ecfdd89fa3f
|
data/data-provider.gemspec
CHANGED
data/lib/data_provider/base.rb
CHANGED
@@ -143,7 +143,7 @@ module DataProvider
|
|
143
143
|
return self
|
144
144
|
end
|
145
145
|
|
146
|
-
# classes/modules can't be cloned, so add
|
146
|
+
# classes/modules can't be cloned, so add behaves just like add!
|
147
147
|
alias :add :add!
|
148
148
|
alias :add_scoped :add_scoped!
|
149
149
|
end # module ClassMethods
|
@@ -27,6 +27,10 @@ module DataProvider
|
|
27
27
|
end
|
28
28
|
end
|
29
29
|
|
30
|
+
def default_priority
|
31
|
+
options[:default_priority].to_i
|
32
|
+
end
|
33
|
+
|
30
34
|
def provider identifier, opts = {}, &block
|
31
35
|
add_provider(identifier, opts, block_given? ? block : nil)
|
32
36
|
end
|
@@ -290,12 +294,18 @@ module DataProvider
|
|
290
294
|
|
291
295
|
# returns the requested provider as a Provider object
|
292
296
|
def get_provider(id, opts = {})
|
293
|
-
|
294
|
-
|
295
|
-
|
296
|
-
|
297
|
-
|
297
|
+
# get all matching providers
|
298
|
+
matching_provider_args = providers.find_all{|args| args.first == id}
|
299
|
+
# sort providers on priority, form high to low
|
300
|
+
matching_provider_args.sort! do |args_a, args_b|
|
301
|
+
# we want to sort from high priority to low, but providers with the same priority level
|
302
|
+
# should stay in the same order because among those, the last one added has the highest priority
|
303
|
+
# (last added means first in the array, since they are pushed into the beginning of the array)
|
304
|
+
(Provider.new(*args_b).priority || self.default_priority) <=> (Provider.new(*args_a).priority || self.default_priority)
|
298
305
|
end
|
306
|
+
# if no skip option is given, opts[:skip].to_i will result in zero, so it'll grab thefirst from the array
|
307
|
+
# if the array is empty, args will always turn out nil
|
308
|
+
args = matching_provider_args[opts[:skip].to_i]
|
299
309
|
|
300
310
|
return args.nil? ? nil : Provider.new(*args)
|
301
311
|
end
|
data/spec/container_spec.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
require File.dirname(__FILE__) + '/spec_helper'
|
2
2
|
|
3
3
|
describe DataProvider::Container do
|
4
|
-
|
4
|
+
# Example implementation of DataProvider::Base
|
5
5
|
let(:container){
|
6
6
|
DataProvider::Container.new.tap do |container|
|
7
7
|
container.provider :sum, :requires => [:array] do
|
@@ -60,6 +60,48 @@ describe DataProvider::Container do
|
|
60
60
|
end
|
61
61
|
end
|
62
62
|
|
63
|
+
describe "#default_priority" do
|
64
|
+
it "gives the default priority for providers" do
|
65
|
+
expect(DataProvider::Container.new.default_priority).to eq 0 # zero is the default default
|
66
|
+
end
|
67
|
+
|
68
|
+
describe ":default_priority" do
|
69
|
+
it "lets the owner specify the default_priority at initialize-time" do
|
70
|
+
expect(DataProvider::Container.new(:default_priority => 100).default_priority).to eq 100
|
71
|
+
end
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
75
|
+
describe "#provider" do
|
76
|
+
it "lets the owner add a new provider to the container" do
|
77
|
+
c = DataProvider::Container.new
|
78
|
+
expect(c.has_provider?(:no_yet)).to be false
|
79
|
+
end
|
80
|
+
|
81
|
+
describe ":priority" do
|
82
|
+
it "by default -without explicitly specified priorities- gives highest priority to the latest added provider" do
|
83
|
+
c = DataProvider::Container.new
|
84
|
+
c.provider(:foo){ 'bar' } # only one at this point
|
85
|
+
expect(c.take(:foo)).to eq 'bar'
|
86
|
+
c.provider(:foo){ 'cafe' } # last added, so get highest priority
|
87
|
+
expect(c.take(:foo)).to eq 'cafe'
|
88
|
+
end
|
89
|
+
|
90
|
+
it "lets the owner specify a priority level for the provider" do
|
91
|
+
c = DataProvider::Container.new
|
92
|
+
c.provider(:foo, :priority => 10){ 'bar' } # only one at this point
|
93
|
+
expect(c.take(:foo)).to eq 'bar'
|
94
|
+
c.provider(:foo){ 'cafe' } # last added, but default priority is 0, so lower prio
|
95
|
+
expect(c.take(:foo)).to eq 'bar'
|
96
|
+
c.provider(:foo, :priority => 5){ 'dive' } # lower explicit prio
|
97
|
+
expect(c.take(:foo)).to eq 'bar'
|
98
|
+
c.provider(:foo, :priority => 11){ 'lounge' } # higher explicit prio
|
99
|
+
expect(c.take(:foo)).to eq 'lounge'
|
100
|
+
|
101
|
+
end
|
102
|
+
end
|
103
|
+
end
|
104
|
+
|
63
105
|
describe "#has_providers_with_scope?" do
|
64
106
|
let(:container){
|
65
107
|
DataProvider::Container.new.tap do |container|
|
@@ -840,5 +882,14 @@ describe DataProvider::Container do
|
|
840
882
|
expect{instance.take(:whatever)}.to raise_error(DataProvider::ProviderMissingException)
|
841
883
|
end
|
842
884
|
|
885
|
+
it "plays nice with the :priority option" do
|
886
|
+
c = DataProvider::Container.new
|
887
|
+
c.provider(:foo){ 'bar0' }
|
888
|
+
expect(c.take(:foo)).to eq 'bar0'
|
889
|
+
c.provider(:foo, :priority => 5){ 'bar5' }
|
890
|
+
expect(c.take(:foo)).to eq 'bar5'
|
891
|
+
c.provider(:foo, :priority => 3){ 'bar3' }
|
892
|
+
expect(c.take(:foo)).to eq 'bar5'
|
893
|
+
end
|
843
894
|
end
|
844
895
|
end
|
data/spec/data_provider_spec.rb
CHANGED
@@ -153,4 +153,69 @@ describe "Exceptions" do
|
|
153
153
|
it "can call missing methods" do
|
154
154
|
expect { provider.take(:nomethod) }.to raise_error(NameError)
|
155
155
|
end
|
156
|
-
end
|
156
|
+
end
|
157
|
+
|
158
|
+
describe "#provider" do
|
159
|
+
describe ":priority" do
|
160
|
+
|
161
|
+
module PriorityHighModule
|
162
|
+
include DataProvider::Base
|
163
|
+
|
164
|
+
provider :foo, :priority => 12 do
|
165
|
+
'bar12'
|
166
|
+
end
|
167
|
+
end
|
168
|
+
|
169
|
+
module PriorityLowModule
|
170
|
+
include DataProvider::Base
|
171
|
+
|
172
|
+
provider :foo, :priority => 2 do
|
173
|
+
'bar2'
|
174
|
+
end
|
175
|
+
end
|
176
|
+
|
177
|
+
class PriorityClass
|
178
|
+
include DataProvider::Base
|
179
|
+
|
180
|
+
provider :foo do
|
181
|
+
'bar0'
|
182
|
+
end
|
183
|
+
|
184
|
+
provider :foo, :priority => 10 do
|
185
|
+
'bar10'
|
186
|
+
end
|
187
|
+
|
188
|
+
provider :foo, :priority => 5 do
|
189
|
+
'bar5'
|
190
|
+
end
|
191
|
+
end
|
192
|
+
|
193
|
+
class PrioritizedClass
|
194
|
+
include DataProvider::Base
|
195
|
+
add PriorityLowModule
|
196
|
+
add PriorityHighModule
|
197
|
+
provider :foo, :priority => 10 do
|
198
|
+
'bar10'
|
199
|
+
end
|
200
|
+
end
|
201
|
+
|
202
|
+
class UnprioritizedClass
|
203
|
+
include DataProvider::Base
|
204
|
+
|
205
|
+
provider :foo, :priority => 10 do
|
206
|
+
'bar10'
|
207
|
+
end
|
208
|
+
|
209
|
+
add PriorityHighModule
|
210
|
+
add PriorityLowModule
|
211
|
+
end
|
212
|
+
|
213
|
+
it "lets the owner specify a priority level or the provider" do
|
214
|
+
instance = PriorityClass.new
|
215
|
+
expect(instance.take(:foo)).to eq 'bar10'
|
216
|
+
expect(PrioritizedClass.new.take(:foo)).to eq 'bar12'
|
217
|
+
expect(UnprioritizedClass.new.take(:foo)).to eq 'bar12'
|
218
|
+
end
|
219
|
+
|
220
|
+
end # :priority
|
221
|
+
end # #provider
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: data-provider
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.2.
|
4
|
+
version: 0.2.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Mark van de Korput
|
@@ -14,28 +14,28 @@ dependencies:
|
|
14
14
|
name: rake
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
|
-
- - ~>
|
17
|
+
- - "~>"
|
18
18
|
- !ruby/object:Gem::Version
|
19
19
|
version: '10.1'
|
20
20
|
type: :development
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
|
-
- - ~>
|
24
|
+
- - "~>"
|
25
25
|
- !ruby/object:Gem::Version
|
26
26
|
version: '10.1'
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: rspec
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
|
-
- - ~>
|
31
|
+
- - "~>"
|
32
32
|
- !ruby/object:Gem::Version
|
33
33
|
version: '3.3'
|
34
34
|
type: :development
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
|
-
- - ~>
|
38
|
+
- - "~>"
|
39
39
|
- !ruby/object:Gem::Version
|
40
40
|
version: '3.3'
|
41
41
|
description: A library of Ruby classes to help create consistent data interfaces
|
@@ -44,8 +44,8 @@ executables: []
|
|
44
44
|
extensions: []
|
45
45
|
extra_rdoc_files: []
|
46
46
|
files:
|
47
|
-
- .gitignore
|
48
|
-
- .travis.yml
|
47
|
+
- ".gitignore"
|
48
|
+
- ".travis.yml"
|
49
49
|
- Gemfile
|
50
50
|
- Gemfile.lock
|
51
51
|
- LICENSE
|
@@ -70,17 +70,17 @@ require_paths:
|
|
70
70
|
- lib
|
71
71
|
required_ruby_version: !ruby/object:Gem::Requirement
|
72
72
|
requirements:
|
73
|
-
- -
|
73
|
+
- - ">="
|
74
74
|
- !ruby/object:Gem::Version
|
75
75
|
version: '0'
|
76
76
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
77
77
|
requirements:
|
78
|
-
- -
|
78
|
+
- - ">="
|
79
79
|
- !ruby/object:Gem::Version
|
80
80
|
version: '0'
|
81
81
|
requirements: []
|
82
82
|
rubyforge_project:
|
83
|
-
rubygems_version: 2.
|
83
|
+
rubygems_version: 2.2.2
|
84
84
|
signing_key:
|
85
85
|
specification_version: 4
|
86
86
|
summary: A library of Ruby classes to help create consistent data interfaces
|