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