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 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