data-provider 0.2.1 → 0.2.2
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 +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
|