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