data-provider 0.2.2 → 0.2.3

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: 83fa8bd4be333b6f8270042fdd45a36715bca717
4
- data.tar.gz: 4d325d45f0dda818c3f31203053aa31428c65fa3
3
+ metadata.gz: 6553850094492d6ea8435a9098391c95b90ac4c7
4
+ data.tar.gz: 31ef7fcd6b10dc7b0cb4fa64bb70fce514bccd67
5
5
  SHA512:
6
- metadata.gz: cf0452e4da45cb8e89276369b30f71c250e6820b2a2fef3b335562de10a082b3ec73dfb1de6b2858db6a500836f5cc128e31aff40956b168fa39054a35770c86
7
- data.tar.gz: 685221df20098653c37366fde7082fa0cf10e537dbe8b86d2c198316edc6541671a33f2ccfd160f14a9a754c0bb6ab19730a0d603478168deea8a45e78279c31
6
+ metadata.gz: f8ee310527986bcb7e2dc97643410f1d3baddc40b4ce2e632aa2745bf985bdbbcfec12b0146f736e7694039a7f0a4e0b0bf26b811a03b66ab96d3b047250758c
7
+ data.tar.gz: 30df84e79b9746a38c6076d7a7eda4406de47e910d069bdf6c9c746c1125bae4db9d403298599668db6d11c3ea1cf2a91faed298b3e545dc35021ecfdd89fa3f
@@ -1,6 +1,6 @@
1
1
  Gem::Specification.new do |s|
2
2
  s.name = "data-provider"
3
- s.version = '0.2.2'
3
+ s.version = '0.2.3'
4
4
  s.files = `git ls-files`.split($/)
5
5
  s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
6
6
  s.require_paths = ["lib"]
@@ -143,7 +143,7 @@ module DataProvider
143
143
  return self
144
144
  end
145
145
 
146
- # classes/modules can't be cloned, so add behave just like 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
- if opts[:skip]
294
- matches = providers.find_all{|args| args.first == id}
295
- args = matches[opts[:skip].to_i]
296
- else
297
- args = providers.find{|args| args.first == id}
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
@@ -16,5 +16,8 @@ module DataProvider
16
16
  [options[:requires]].flatten.compact
17
17
  end
18
18
 
19
+ def priority
20
+ options[:priority]
21
+ end
19
22
  end # module Provider
20
23
  end # module DataProvider
@@ -1,7 +1,7 @@
1
1
  require File.dirname(__FILE__) + '/spec_helper'
2
2
 
3
3
  describe DataProvider::Container do
4
- # Example implementation of DataProvider::Base
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
@@ -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.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.0.14
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