replace the SiteProxy class by a more generic mechanism which also can be used to defer services

did committed Aug 16, 2015
commit fa38be626e07495c7c91aea91bc712cc82db1e41
Showing 2 changed files with 32 additions and 15 deletions
locomotive/steam/services.rb b/lib/locomotive/steam/services.rb +9 -14
@@ @@ -15,26 +15,17 @@ module Locomotive
end
end
- class SiteProxy < SimpleDelegator
-
+ class Defer < SimpleDelegator
def initialize(&block)
- @site = nil
- @default = block
- super(@site)
+ @constructor = block
+ super(nil)
end
-
def __getobj__
- @site || (@site = @default.call)
- end
-
- def __setobj__(site)
- @site = super
+ super || __setobj__(@constructor.call)
end
-
def nil?
__getobj__.nil?
end
-
end
class Instance < Struct.new(:request)
@@ @@ -42,7 +33,7 @@ module Locomotive
include Morphine
register :current_site do
- repositories.current_site = SiteProxy.new { site_finder.find }
+ repositories.current_site = Defer.new { site_finder.find }
end
register :repositories do
@@ @@ -138,6 +129,10 @@ module Locomotive
self.current_site.__setobj__(site)
end
+ def defer(name, &block)
+ send(:"#{name}=", Defer.new(&block))
+ end
+
end
end
spec/unit/services_spec.rb +23 -1
@@ @@ -18,8 +18,30 @@ describe Locomotive::Steam::Services do
it { expect(subject.repositories).to be_instance_of(MyService) }
+ describe '#defer' do
+
+ let(:status) { { initialized: false } }
+
+ before do
+ Locomotive::Steam.configure do |config|
+ config.services_hook = -> (services) {
+ services.defer(:repositories) { MyService.new(status) }
+ }
+ end
+ end
+
+ it { subject.repositories; expect(status[:initialized]).to eq false }
+ it { subject.repositories.do; expect(status[:initialized]).to eq true }
+
+ end
+
end
- class MyService; end
+ class MyService
+ def initialize(status = {})
+ status[:initialized] = true
+ end
+ def do; end
+ end
end