data-provider 0.2.1 → 0.2.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/data-provider.gemspec +1 -1
- data/lib/data_provider/base.rb +4 -0
- data/lib/data_provider/container.rb +36 -10
- data/spec/base_spec.rb +54 -1
- data/spec/container_spec.rb +55 -3
- metadata +1 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 83fa8bd4be333b6f8270042fdd45a36715bca717
|
4
|
+
data.tar.gz: 4d325d45f0dda818c3f31203053aa31428c65fa3
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: cf0452e4da45cb8e89276369b30f71c250e6820b2a2fef3b335562de10a082b3ec73dfb1de6b2858db6a500836f5cc128e31aff40956b168fa39054a35770c86
|
7
|
+
data.tar.gz: 685221df20098653c37366fde7082fa0cf10e537dbe8b86d2c198316edc6541671a33f2ccfd160f14a9a754c0bb6ab19730a0d603478168deea8a45e78279c31
|
data/data-provider.gemspec
CHANGED
data/lib/data_provider/base.rb
CHANGED
@@ -75,16 +75,18 @@ module DataProvider
|
|
75
75
|
logger.debug "DataProvider::Container#take with id: #{id.inspect}"
|
76
76
|
|
77
77
|
# first try the simple providers
|
78
|
-
if provides.has_key?(id)
|
78
|
+
if provides.has_key?(id) && opts[:skip].nil?
|
79
79
|
provider = provides[id]
|
80
80
|
return provider.is_a?(Proc) ? provider.call : provider
|
81
81
|
end
|
82
82
|
|
83
83
|
# try to get a provider object
|
84
|
-
provider = get_provider(id)
|
84
|
+
provider = get_provider(id, :skip => opts[:skip])
|
85
85
|
if provider
|
86
|
-
@stack = (@stack || []) + [
|
86
|
+
@stack = (@stack || []) + [provider]
|
87
|
+
@skip_stack = (@skip_stack || []) + [opts[:skip].to_i]
|
87
88
|
result = (opts[:scope] || self).instance_eval(&provider.block)
|
89
|
+
@skip_stack.pop
|
88
90
|
@stack.pop
|
89
91
|
# execute provider object's block within the scope of self
|
90
92
|
return result
|
@@ -93,10 +95,12 @@ module DataProvider
|
|
93
95
|
# try to get a scoped provider object
|
94
96
|
if scope.length > 0
|
95
97
|
scoped_id = [scope, id].flatten
|
96
|
-
provider = get_provider(scoped_id)
|
98
|
+
provider = get_provider(scoped_id, :skip => opts[:skip])
|
97
99
|
if provider
|
98
|
-
@stack = (@stack || []) + [
|
100
|
+
@stack = (@stack || []) + [provider]
|
101
|
+
@skip_stack = (@skip_stack || []) + [opts[:skip].to_i]
|
99
102
|
result = (opts[:scope] || self).instance_eval(&provider.block)
|
103
|
+
@skip_stack.pop
|
100
104
|
@stack.pop
|
101
105
|
# execute provider object's block within the scope of self
|
102
106
|
return result
|
@@ -108,8 +112,10 @@ module DataProvider
|
|
108
112
|
# temporarily set the @missing_provider instance variable, so the
|
109
113
|
# fallback provider can use it through the missing_provider private method
|
110
114
|
@missing_provider = id
|
111
|
-
@stack = (@stack || []) + [
|
115
|
+
@stack = (@stack || []) + [provider]
|
116
|
+
@skip_stack = (@skip_stack || []) + [opts[:skip].to_i]
|
112
117
|
result = (opts[:scope] || self).instance_eval(&provider.block) # provider.block.call # with the block.call method the provider can't access private methods like missing_provider
|
118
|
+
@skip_stack.pop
|
113
119
|
@stack.pop # = nil
|
114
120
|
@missing_provider = nil
|
115
121
|
return result
|
@@ -125,6 +131,12 @@ module DataProvider
|
|
125
131
|
return nil
|
126
132
|
end
|
127
133
|
|
134
|
+
# take_super is only meant to be called form inside a provider
|
135
|
+
# returns the result of next provider with the same ID
|
136
|
+
def take_super(opts = {})
|
137
|
+
take(provider_id, opts.merge(:skip => current_skip + 1))
|
138
|
+
end
|
139
|
+
|
128
140
|
#
|
129
141
|
# "adding existing containers"-related methods
|
130
142
|
#
|
@@ -239,18 +251,26 @@ module DataProvider
|
|
239
251
|
(@stack || []).clone
|
240
252
|
end
|
241
253
|
|
242
|
-
def
|
254
|
+
def current_provider
|
243
255
|
provider_stack.last
|
244
256
|
end
|
245
257
|
|
258
|
+
def provider_id
|
259
|
+
current_provider ? current_provider.id : nil
|
260
|
+
end
|
261
|
+
|
246
262
|
def scopes
|
247
|
-
provider_stack.map{|
|
263
|
+
provider_stack.map{|provider| provider.id.is_a?(Array) ? provider.id[0..-2] : []}
|
248
264
|
end
|
249
265
|
|
250
266
|
def scope
|
251
267
|
scopes.last || []
|
252
268
|
end
|
253
269
|
|
270
|
+
def current_skip
|
271
|
+
(@skip_stack || []).last.to_i
|
272
|
+
end
|
273
|
+
|
254
274
|
private
|
255
275
|
|
256
276
|
def add_provider(identifier, opts = {}, block = nil)
|
@@ -269,8 +289,14 @@ module DataProvider
|
|
269
289
|
end
|
270
290
|
|
271
291
|
# returns the requested provider as a Provider object
|
272
|
-
def get_provider(id)
|
273
|
-
|
292
|
+
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}
|
298
|
+
end
|
299
|
+
|
274
300
|
return args.nil? ? nil : Provider.new(*args)
|
275
301
|
end
|
276
302
|
end # class Container
|
data/spec/base_spec.rb
CHANGED
@@ -795,8 +795,12 @@ describe DataProvider::Base do
|
|
795
795
|
end
|
796
796
|
}
|
797
797
|
|
798
|
+
it "gives Provider objects" do
|
799
|
+
expect(instance.take(:one).map(&:class)).to eq [DataProvider::Provider]*2
|
800
|
+
end
|
801
|
+
|
798
802
|
it "gives the provider's callstack" do
|
799
|
-
expect(instance.take(:one)).to eq [:one, :two]
|
803
|
+
expect(instance.take(:one).map(&:id)).to eq [:one, :two]
|
800
804
|
end
|
801
805
|
end
|
802
806
|
|
@@ -814,5 +818,54 @@ describe DataProvider::Base do
|
|
814
818
|
expect(instance.take(:narcissist)).to eq :narcissist
|
815
819
|
end
|
816
820
|
end
|
821
|
+
|
822
|
+
describe "#take_super" do
|
823
|
+
module HelloExtension
|
824
|
+
include DataProvider::Base
|
825
|
+
provider :new do
|
826
|
+
'Hello!'
|
827
|
+
end
|
828
|
+
end
|
829
|
+
|
830
|
+
let(:instance){
|
831
|
+
Class.new(Object) do
|
832
|
+
include DataProvider::Base
|
833
|
+
provider :name do
|
834
|
+
'Arno'
|
835
|
+
end
|
836
|
+
|
837
|
+
provider :name do
|
838
|
+
add HelloExtension
|
839
|
+
'Bob'
|
840
|
+
end
|
841
|
+
|
842
|
+
provider :name do
|
843
|
+
"[super] #{take_super}"
|
844
|
+
end
|
845
|
+
end
|
846
|
+
}
|
847
|
+
|
848
|
+
it "gives the result of the previous provider with the same name" do
|
849
|
+
expect{
|
850
|
+
expect(instance.take(:name)).to eq '[super] Bob'
|
851
|
+
# NoMethodError happened when the take_super accidentally got executed inside
|
852
|
+
# the container's instance scope instead of the object instance scope
|
853
|
+
}.to_not raise_error
|
854
|
+
|
855
|
+
instance.provider :name do
|
856
|
+
"[ultra] #{take_super}"
|
857
|
+
end
|
858
|
+
|
859
|
+
expect(instance.take(:name)).to eq '[ultra] [super] Bob'
|
860
|
+
end
|
861
|
+
|
862
|
+
it "raises the ProviderMissingException if there is no older provider with the same ID" do
|
863
|
+
instance.provider :age do
|
864
|
+
take_super
|
865
|
+
end
|
866
|
+
|
867
|
+
expect{instance.take(:age)}.to raise_error(DataProvider::ProviderMissingException)
|
868
|
+
end
|
869
|
+
end
|
817
870
|
end
|
818
871
|
end
|
data/spec/container_spec.rb
CHANGED
@@ -617,9 +617,13 @@ describe DataProvider::Container do
|
|
617
617
|
end
|
618
618
|
}
|
619
619
|
|
620
|
+
it "gives Provider objects" do
|
621
|
+
expect(container.take(:a).map(&:class)).to eq [DataProvider::Provider]*4
|
622
|
+
end
|
623
|
+
|
620
624
|
it "gives providers an array resembling the current provider 'callstack'" do
|
621
|
-
expect(container.take(:a)).to eq [:a, :b, ['prefix', :c], ['prefix', :d]]
|
622
|
-
expect(container.take(:b)).to eq [:b, ['prefix', :c], ['prefix', :d]]
|
625
|
+
expect(container.take(:a).map(&:id)).to eq [:a, :b, ['prefix', :c], ['prefix', :d]]
|
626
|
+
expect(container.take(:b).map(&:id)).to eq [:b, ['prefix', :c], ['prefix', :d]]
|
623
627
|
end
|
624
628
|
end
|
625
629
|
|
@@ -646,7 +650,7 @@ describe DataProvider::Container do
|
|
646
650
|
expect(container.take(['prefix', :d])).to eq ['prefix', :d]
|
647
651
|
end
|
648
652
|
|
649
|
-
it "gives nil when called
|
653
|
+
it "gives nil when called from outside a provider" do
|
650
654
|
expect(container.provider_id).to eq nil
|
651
655
|
end
|
652
656
|
end
|
@@ -789,4 +793,52 @@ describe DataProvider::Container do
|
|
789
793
|
expect(c.fallback_provider?).to eq true
|
790
794
|
end
|
791
795
|
end
|
796
|
+
|
797
|
+
describe "#take_super" do
|
798
|
+
let(:container){
|
799
|
+
DataProvider::Container.new.tap do |c|
|
800
|
+
c.provider :value do
|
801
|
+
"original"
|
802
|
+
end
|
803
|
+
end
|
804
|
+
}
|
805
|
+
|
806
|
+
let(:extension1){
|
807
|
+
DataProvider::Container.new.tap do |c|
|
808
|
+
c.provider :value do
|
809
|
+
"new"
|
810
|
+
end
|
811
|
+
end
|
812
|
+
}
|
813
|
+
|
814
|
+
let(:extension2){
|
815
|
+
DataProvider::Container.new.tap do |c|
|
816
|
+
c.provider :value do
|
817
|
+
"#{take_super} [extended]"
|
818
|
+
end
|
819
|
+
end
|
820
|
+
}
|
821
|
+
|
822
|
+
it "gives the result of the provider with the same identifier that was added before it" do
|
823
|
+
c = container.add extension2
|
824
|
+
expect(c.take(:value)).to eq 'original [extended]'
|
825
|
+
c.add! extension1
|
826
|
+
expect(c.take(:value)).to eq 'new'
|
827
|
+
c.add! extension2
|
828
|
+
expect(c.take(:value)).to eq 'new [extended]'
|
829
|
+
c.add! extension2
|
830
|
+
expect(c.take(:value)).to eq 'new [extended] [extended]'
|
831
|
+
end
|
832
|
+
|
833
|
+
it "raises the ProviderMissingException if there is no older provider with the same ID" do
|
834
|
+
instance = DataProvider::Container.new.tap do |c|
|
835
|
+
c.provider :whatever do
|
836
|
+
take_super
|
837
|
+
end
|
838
|
+
end
|
839
|
+
|
840
|
+
expect{instance.take(:whatever)}.to raise_error(DataProvider::ProviderMissingException)
|
841
|
+
end
|
842
|
+
|
843
|
+
end
|
792
844
|
end
|