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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 7a3741c94c674bb6ad2ee0762253ecf194461c56
4
- data.tar.gz: 1bd6a82594d5fbd771624ea23b05fc8ff6cfda33
3
+ metadata.gz: 83fa8bd4be333b6f8270042fdd45a36715bca717
4
+ data.tar.gz: 4d325d45f0dda818c3f31203053aa31428c65fa3
5
5
  SHA512:
6
- metadata.gz: 0971fffc5e2d70131d87e63c05dd9a6e2a9ac754cd9b8c5b7e4e45cc9391cb5639a9ede46b1ae8b50e3d531ef0414d3053f9be3976be5e71299a6115f145cb7a
7
- data.tar.gz: 0bdbdc59f3a61fd6c7ad8f52a610305134c8a58ed21e9c5494cc4b479e01243ee0f5d29ba409983ad2c224bdc2f8e7e326b9ca4a88c9f0ab472b61ae43e12298
6
+ metadata.gz: cf0452e4da45cb8e89276369b30f71c250e6820b2a2fef3b335562de10a082b3ec73dfb1de6b2858db6a500836f5cc128e31aff40956b168fa39054a35770c86
7
+ data.tar.gz: 685221df20098653c37366fde7082fa0cf10e537dbe8b86d2c198316edc6541671a33f2ccfd160f14a9a754c0bb6ab19730a0d603478168deea8a45e78279c31
@@ -1,6 +1,6 @@
1
1
  Gem::Specification.new do |s|
2
2
  s.name = "data-provider"
3
- s.version = '0.2.1'
3
+ s.version = '0.2.2'
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"]
@@ -98,6 +98,10 @@ module DataProvider
98
98
  def provider_id *args
99
99
  dpc.provider_id *args
100
100
  end
101
+
102
+ def take_super
103
+ dpc.take_super(:scope => self)
104
+ end
101
105
  end
102
106
 
103
107
  module ClassMethods
@@ -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 || []) + [id]
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 || []) + [scoped_id]
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 || []) + [id]
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 provider_id
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{|provider_id| provider_id.is_a?(Array) ? provider_id[0..-2] : []}
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
- args = providers.find{|args| args.first == id}
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
@@ -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 fmor outside a provider" do
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
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.1
4
+ version: 0.2.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Mark van de Korput