cistern 0.11.1 → 0.11.2.pre2
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/README.md +7 -7
 - data/lib/cistern.rb +2 -0
 - data/lib/cistern/attributes.rb +2 -2
 - data/lib/cistern/collection.rb +16 -10
 - data/lib/cistern/model.rb +13 -9
 - data/lib/cistern/request.rb +28 -0
 - data/lib/cistern/service.rb +38 -94
 - data/lib/cistern/singular.rb +1 -1
 - data/lib/cistern/string.rb +31 -0
 - data/lib/cistern/version.rb +1 -1
 - data/spec/collection_spec.rb +2 -3
 - data/spec/dirty_spec.rb +1 -1
 - data/spec/formatter_spec.rb +2 -3
 - data/spec/mock_data_spec.rb +16 -22
 - data/spec/model_spec.rb +6 -6
 - data/spec/request_spec.rb +37 -0
 - data/spec/service_spec.rb +0 -0
 - data/spec/singular_spec.rb +4 -4
 - data/spec/spec_helper.rb +1 -0
 - data/spec/support/service.rb +1 -0
 - data/spec/wait_for_spec.rb +8 -18
 - metadata +12 -4
 
    
        checksums.yaml
    CHANGED
    
    | 
         @@ -1,7 +1,7 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            ---
         
     | 
| 
       2 
2 
     | 
    
         
             
            SHA1:
         
     | 
| 
       3 
     | 
    
         
            -
              metadata.gz:  
     | 
| 
       4 
     | 
    
         
            -
              data.tar.gz:  
     | 
| 
      
 3 
     | 
    
         
            +
              metadata.gz: 1fd7d5118bf1337d421cb49d37ec448c99a6a348
         
     | 
| 
      
 4 
     | 
    
         
            +
              data.tar.gz: 3eb9da77dd49b2fdca439c4d0112af1ecf3e0d36
         
     | 
| 
       5 
5 
     | 
    
         
             
            SHA512:
         
     | 
| 
       6 
     | 
    
         
            -
              metadata.gz:  
     | 
| 
       7 
     | 
    
         
            -
              data.tar.gz:  
     | 
| 
      
 6 
     | 
    
         
            +
              metadata.gz: 26f8cf18cabc2699cd6b8e1ab18628408254e9ad3dc3d992cf923b322c3fae6bfc5b1406decb255ba969031fd98ea03d7eb39780915d4cd97048d46e9bcbead3
         
     | 
| 
      
 7 
     | 
    
         
            +
              data.tar.gz: 36f14d5bfbfae722156cd722ddae8fe4b5f4028631d98578f56ab2cef8812153d74fc8130cc98c95ee885b831c371554fdbc5da1c865c2f7ad7684fad78d1aa5
         
     | 
    
        data/README.md
    CHANGED
    
    | 
         @@ -208,7 +208,7 @@ Patient::Mock.store_in(:hash) 
     | 
|
| 
       208 
208 
     | 
    
         | 
| 
       209 
209 
     | 
    
         
             
            ### Model
         
     | 
| 
       210 
210 
     | 
    
         | 
| 
       211 
     | 
    
         
            -
            * ` 
     | 
| 
      
 211 
     | 
    
         
            +
            * `service` represents the associated `Foo::Client` instance.
         
     | 
| 
       212 
212 
     | 
    
         
             
            * `collection` represents the related collection (if applicable)
         
     | 
| 
       213 
213 
     | 
    
         | 
| 
       214 
214 
     | 
    
         
             
            Example
         
     | 
| 
         @@ -225,7 +225,7 @@ class Foo::Client::Bar < Cistern::Model 
     | 
|
| 
       225 
225 
     | 
    
         
             
                params  = {
         
     | 
| 
       226 
226 
     | 
    
         
             
                  "id" => self.identity
         
     | 
| 
       227 
227 
     | 
    
         
             
                }
         
     | 
| 
       228 
     | 
    
         
            -
                self. 
     | 
| 
      
 228 
     | 
    
         
            +
                self.service.destroy_bar(params).body["request"]
         
     | 
| 
       229 
229 
     | 
    
         
             
              end
         
     | 
| 
       230 
230 
     | 
    
         | 
| 
       231 
231 
     | 
    
         
             
              def save
         
     | 
| 
         @@ -239,11 +239,11 @@ class Foo::Client::Bar < Cistern::Model 
     | 
|
| 
       239 
239 
     | 
    
         
             
                }
         
     | 
| 
       240 
240 
     | 
    
         | 
| 
       241 
241 
     | 
    
         
             
                if new_record?
         
     | 
| 
       242 
     | 
    
         
            -
                  merge_attributes( 
     | 
| 
      
 242 
     | 
    
         
            +
                  merge_attributes(service.create_bar(params).body["bar"])
         
     | 
| 
       243 
243 
     | 
    
         
             
                else
         
     | 
| 
       244 
244 
     | 
    
         
             
                  requires :identity
         
     | 
| 
       245 
245 
     | 
    
         | 
| 
       246 
     | 
    
         
            -
                  merge_attributes( 
     | 
| 
      
 246 
     | 
    
         
            +
                  merge_attributes(service.update_bar(params).body["bar"])
         
     | 
| 
       247 
247 
     | 
    
         
             
                end
         
     | 
| 
       248 
248 
     | 
    
         
             
              end
         
     | 
| 
       249 
249 
     | 
    
         
             
            end
         
     | 
| 
         @@ -286,7 +286,7 @@ class Foo::Client::Bars < Cistern::Collection 
     | 
|
| 
       286 
286 
     | 
    
         
             
              model Foo::Client::Bar
         
     | 
| 
       287 
287 
     | 
    
         | 
| 
       288 
288 
     | 
    
         
             
              def all(params = {})
         
     | 
| 
       289 
     | 
    
         
            -
                response =  
     | 
| 
      
 289 
     | 
    
         
            +
                response = service.get_bars(params)
         
     | 
| 
       290 
290 
     | 
    
         | 
| 
       291 
291 
     | 
    
         
             
                data = response.body
         
     | 
| 
       292 
292 
     | 
    
         | 
| 
         @@ -300,11 +300,11 @@ class Foo::Client::Bars < Cistern::Collection 
     | 
|
| 
       300 
300 
     | 
    
         
             
                }
         
     | 
| 
       301 
301 
     | 
    
         
             
                params.merge!("location" => options[:location]) if options.key?(:location)
         
     | 
| 
       302 
302 
     | 
    
         | 
| 
       303 
     | 
    
         
            -
                 
     | 
| 
      
 303 
     | 
    
         
            +
                service.requests.new(service.discover_bar(params).body["request"])
         
     | 
| 
       304 
304 
     | 
    
         
             
              end
         
     | 
| 
       305 
305 
     | 
    
         | 
| 
       306 
306 
     | 
    
         
             
              def get(id)
         
     | 
| 
       307 
     | 
    
         
            -
                if data =  
     | 
| 
      
 307 
     | 
    
         
            +
                if data = service.get_bar("id" => id).body["bar"]
         
     | 
| 
       308 
308 
     | 
    
         
             
                  new(data)
         
     | 
| 
       309 
309 
     | 
    
         
             
                else
         
     | 
| 
       310 
310 
     | 
    
         
             
                  nil
         
     | 
    
        data/lib/cistern.rb
    CHANGED
    
    | 
         @@ -9,6 +9,7 @@ module Cistern 
     | 
|
| 
       9 
9 
     | 
    
         
             
              Timeout = Class.new(Error)
         
     | 
| 
       10 
10 
     | 
    
         | 
| 
       11 
11 
     | 
    
         
             
              require 'cistern/hash'
         
     | 
| 
      
 12 
     | 
    
         
            +
              require 'cistern/string'
         
     | 
| 
       12 
13 
     | 
    
         
             
              require 'cistern/mock'
         
     | 
| 
       13 
14 
     | 
    
         
             
              require 'cistern/wait_for'
         
     | 
| 
       14 
15 
     | 
    
         
             
              require 'cistern/attributes'
         
     | 
| 
         @@ -16,6 +17,7 @@ module Cistern 
     | 
|
| 
       16 
17 
     | 
    
         
             
              require 'cistern/model'
         
     | 
| 
       17 
18 
     | 
    
         
             
              require 'cistern/service'
         
     | 
| 
       18 
19 
     | 
    
         
             
              require 'cistern/singular'
         
     | 
| 
      
 20 
     | 
    
         
            +
              require 'cistern/request'
         
     | 
| 
       19 
21 
     | 
    
         
             
              require 'cistern/data'
         
     | 
| 
       20 
22 
     | 
    
         
             
              require 'cistern/data/hash'
         
     | 
| 
       21 
23 
     | 
    
         
             
              require 'cistern/data/redis'
         
     | 
    
        data/lib/cistern/attributes.rb
    CHANGED
    
    | 
         @@ -189,7 +189,7 @@ module Cistern::Attributes 
     | 
|
| 
       189 
189 
     | 
    
         
             
                        end
         
     | 
| 
       190 
190 
     | 
    
         
             
                      end
         
     | 
| 
       191 
191 
     | 
    
         | 
| 
       192 
     | 
    
         
            -
                      protected_methods = Cistern::Model.instance_methods - [: 
     | 
| 
      
 192 
     | 
    
         
            +
                      protected_methods = Cistern::Model.instance_methods - [:service, :identity, :collection]
         
     | 
| 
       193 
193 
     | 
    
         | 
| 
       194 
194 
     | 
    
         
             
                      if !protected_methods.include?(key) && self.respond_to?("#{key}=", true)
         
     | 
| 
       195 
195 
     | 
    
         
             
                        send("#{key}=", value)
         
     | 
| 
         @@ -236,7 +236,7 @@ module Cistern::Attributes 
     | 
|
| 
       236 
236 
     | 
    
         
             
                protected
         
     | 
| 
       237 
237 
     | 
    
         | 
| 
       238 
238 
     | 
    
         
             
                def missing_attributes(args)
         
     | 
| 
       239 
     | 
    
         
            -
                  ([: 
     | 
| 
      
 239 
     | 
    
         
            +
                  ([:service] | args).select{|arg| send("#{arg}").nil?}
         
     | 
| 
       240 
240 
     | 
    
         
             
                end
         
     | 
| 
       241 
241 
     | 
    
         | 
| 
       242 
242 
     | 
    
         
             
                def changed!(attribute, from, to)
         
     | 
    
        data/lib/cistern/collection.rb
    CHANGED
    
    | 
         @@ -1,6 +1,4 @@ 
     | 
|
| 
       1 
     | 
    
         
            -
             
     | 
| 
       2 
     | 
    
         
            -
              extend Cistern::Attributes::ClassMethods
         
     | 
| 
       3 
     | 
    
         
            -
              include Cistern::Attributes::InstanceMethods
         
     | 
| 
      
 1 
     | 
    
         
            +
            module Cistern::Collection
         
     | 
| 
       4 
2 
     | 
    
         | 
| 
       5 
3 
     | 
    
         
             
              BLACKLISTED_ARRAY_METHODS = [
         
     | 
| 
       6 
4 
     | 
    
         
             
                :compact!, :flatten!, :reject!, :reverse!, :rotate!, :map!,
         
     | 
| 
         @@ -8,13 +6,21 @@ class Cistern::Collection 
     | 
|
| 
       8 
6 
     | 
    
         
             
                :keep_if, :pop, :shift, :delete_at, :compact
         
     | 
| 
       9 
7 
     | 
    
         
             
              ].to_set # :nodoc:
         
     | 
| 
       10 
8 
     | 
    
         | 
| 
       11 
     | 
    
         
            -
               
     | 
| 
      
 9 
     | 
    
         
            +
              def self.service_collection(service, klass)
         
     | 
| 
      
 10 
     | 
    
         
            +
                plural_name = Cistern::String.underscore(Cistern::String.demodulize(klass.name))
         
     | 
| 
       12 
11 
     | 
    
         | 
| 
       13 
     | 
    
         
            -
             
     | 
| 
       14 
     | 
    
         
            -
             
     | 
| 
       15 
     | 
    
         
            -
                   
     | 
| 
       16 
     | 
    
         
            -
             
     | 
| 
       17 
     | 
    
         
            -
             
     | 
| 
      
 12 
     | 
    
         
            +
                service.const_get(:Collections).module_eval <<-EOS, __FILE__, __LINE__
         
     | 
| 
      
 13 
     | 
    
         
            +
                  def #{plural_name}(attributes={})
         
     | 
| 
      
 14 
     | 
    
         
            +
                  #{klass.name}.new(attributes.merge(service: self))
         
     | 
| 
      
 15 
     | 
    
         
            +
                  end
         
     | 
| 
      
 16 
     | 
    
         
            +
                EOS
         
     | 
| 
      
 17 
     | 
    
         
            +
              end
         
     | 
| 
      
 18 
     | 
    
         
            +
             
     | 
| 
      
 19 
     | 
    
         
            +
              attr_accessor :records, :loaded, :service
         
     | 
| 
      
 20 
     | 
    
         
            +
             
     | 
| 
      
 21 
     | 
    
         
            +
              module ClassMethods
         
     | 
| 
      
 22 
     | 
    
         
            +
                def model(new_model=nil)
         
     | 
| 
      
 23 
     | 
    
         
            +
                  @model ||= new_model
         
     | 
| 
       18 
24 
     | 
    
         
             
                end
         
     | 
| 
       19 
25 
     | 
    
         
             
              end
         
     | 
| 
       20 
26 
     | 
    
         | 
| 
         @@ -73,7 +79,7 @@ class Cistern::Collection 
     | 
|
| 
       73 
79 
     | 
    
         
             
                model.new(
         
     | 
| 
       74 
80 
     | 
    
         
             
                  {
         
     | 
| 
       75 
81 
     | 
    
         
             
                    :collection => self,
         
     | 
| 
       76 
     | 
    
         
            -
                    : 
     | 
| 
      
 82 
     | 
    
         
            +
                    :service    => service,
         
     | 
| 
       77 
83 
     | 
    
         
             
                  }.merge(attributes)
         
     | 
| 
       78 
84 
     | 
    
         
             
                )
         
     | 
| 
       79 
85 
     | 
    
         
             
              end
         
     | 
    
        data/lib/cistern/model.rb
    CHANGED
    
    | 
         @@ -1,8 +1,12 @@ 
     | 
|
| 
       1 
     | 
    
         
            -
             
     | 
| 
       2 
     | 
    
         
            -
              extend Cistern::Attributes::ClassMethods
         
     | 
| 
      
 1 
     | 
    
         
            +
            module Cistern::Model
         
     | 
| 
       3 
2 
     | 
    
         
             
              include Cistern::Attributes::InstanceMethods
         
     | 
| 
       4 
3 
     | 
    
         | 
| 
       5 
     | 
    
         
            -
               
     | 
| 
      
 4 
     | 
    
         
            +
              def self.included(klass)
         
     | 
| 
      
 5 
     | 
    
         
            +
                klass.send(:extend, Cistern::Attributes::ClassMethods)
         
     | 
| 
      
 6 
     | 
    
         
            +
                klass.send(:include, Cistern::Attributes::InstanceMethods)
         
     | 
| 
      
 7 
     | 
    
         
            +
              end
         
     | 
| 
      
 8 
     | 
    
         
            +
             
     | 
| 
      
 9 
     | 
    
         
            +
              attr_accessor :collection, :service
         
     | 
| 
       6 
10 
     | 
    
         | 
| 
       7 
11 
     | 
    
         
             
              def inspect
         
     | 
| 
       8 
12 
     | 
    
         
             
                if Cistern.formatter
         
     | 
| 
         @@ -52,15 +56,15 @@ class Cistern::Model 
     | 
|
| 
       52 
56 
     | 
    
         
             
                end
         
     | 
| 
       53 
57 
     | 
    
         
             
              end
         
     | 
| 
       54 
58 
     | 
    
         | 
| 
       55 
     | 
    
         
            -
              def  
     | 
| 
       56 
     | 
    
         
            -
                 
     | 
| 
      
 59 
     | 
    
         
            +
              def wait_for(timeout = self.service_class.timeout, interval = self.service_class.poll_interval, &block)
         
     | 
| 
      
 60 
     | 
    
         
            +
                service_class.wait_for(timeout, interval) { reload && block.call(self) }
         
     | 
| 
       57 
61 
     | 
    
         
             
              end
         
     | 
| 
       58 
62 
     | 
    
         | 
| 
       59 
     | 
    
         
            -
              def wait_for(timeout = self. 
     | 
| 
       60 
     | 
    
         
            -
                 
     | 
| 
      
 63 
     | 
    
         
            +
              def wait_for!(timeout = self.service_class.timeout, interval = self.service_class.poll_interval, &block)
         
     | 
| 
      
 64 
     | 
    
         
            +
                service_class.wait_for!(timeout, interval) { reload && block.call(self) }
         
     | 
| 
       61 
65 
     | 
    
         
             
              end
         
     | 
| 
       62 
66 
     | 
    
         | 
| 
       63 
     | 
    
         
            -
              def  
     | 
| 
       64 
     | 
    
         
            -
                service 
     | 
| 
      
 67 
     | 
    
         
            +
              def service_class
         
     | 
| 
      
 68 
     | 
    
         
            +
                self.service ? self.service.class : Cistern
         
     | 
| 
       65 
69 
     | 
    
         
             
              end
         
     | 
| 
       66 
70 
     | 
    
         
             
            end
         
     | 
| 
         @@ -0,0 +1,28 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            module Cistern::Request
         
     | 
| 
      
 2 
     | 
    
         
            +
              def self.service_request(service, klass)
         
     | 
| 
      
 3 
     | 
    
         
            +
                request = klass.request_name || Cistern::String.camelize(klass.name)
         
     | 
| 
      
 4 
     | 
    
         
            +
             
     | 
| 
      
 5 
     | 
    
         
            +
                service::Mock.module_eval <<-EOS, __FILE__, __LINE__
         
     | 
| 
      
 6 
     | 
    
         
            +
                  def #{request}(*args)
         
     | 
| 
      
 7 
     | 
    
         
            +
                    #{klass}.new(self).mock(*args)
         
     | 
| 
      
 8 
     | 
    
         
            +
                  end
         
     | 
| 
      
 9 
     | 
    
         
            +
                EOS
         
     | 
| 
      
 10 
     | 
    
         
            +
             
     | 
| 
      
 11 
     | 
    
         
            +
                service::Real.module_eval <<-EOS, __FILE__, __LINE__
         
     | 
| 
      
 12 
     | 
    
         
            +
                  def #{request}(*args)
         
     | 
| 
      
 13 
     | 
    
         
            +
                    #{klass}.new(self).real(*args)
         
     | 
| 
      
 14 
     | 
    
         
            +
                  end
         
     | 
| 
      
 15 
     | 
    
         
            +
                EOS
         
     | 
| 
      
 16 
     | 
    
         
            +
              end
         
     | 
| 
      
 17 
     | 
    
         
            +
             
     | 
| 
      
 18 
     | 
    
         
            +
              attr_reader :service
         
     | 
| 
      
 19 
     | 
    
         
            +
             
     | 
| 
      
 20 
     | 
    
         
            +
              def initialize(service)
         
     | 
| 
      
 21 
     | 
    
         
            +
                @service = service
         
     | 
| 
      
 22 
     | 
    
         
            +
              end
         
     | 
| 
      
 23 
     | 
    
         
            +
             
     | 
| 
      
 24 
     | 
    
         
            +
              module ClassMethods
         
     | 
| 
      
 25 
     | 
    
         
            +
                def request_name
         
     | 
| 
      
 26 
     | 
    
         
            +
                end
         
     | 
| 
      
 27 
     | 
    
         
            +
              end
         
     | 
| 
      
 28 
     | 
    
         
            +
            end
         
     | 
    
        data/lib/cistern/service.rb
    CHANGED
    
    | 
         @@ -42,6 +42,44 @@ class Cistern::Service 
     | 
|
| 
       42 
42 
     | 
    
         
             
                      def initialize(options={})
         
     | 
| 
       43 
43 
     | 
    
         
             
                      end
         
     | 
| 
       44 
44 
     | 
    
         
             
                    end
         
     | 
| 
      
 45 
     | 
    
         
            +
             
     | 
| 
      
 46 
     | 
    
         
            +
                    class Model
         
     | 
| 
      
 47 
     | 
    
         
            +
                      include Cistern::Model
         
     | 
| 
      
 48 
     | 
    
         
            +
             
     | 
| 
      
 49 
     | 
    
         
            +
                      def self.service
         
     | 
| 
      
 50 
     | 
    
         
            +
                        #{klass.name}
         
     | 
| 
      
 51 
     | 
    
         
            +
                      end
         
     | 
| 
      
 52 
     | 
    
         
            +
                    end
         
     | 
| 
      
 53 
     | 
    
         
            +
             
     | 
| 
      
 54 
     | 
    
         
            +
                    class Collection
         
     | 
| 
      
 55 
     | 
    
         
            +
                      include Cistern::Collection
         
     | 
| 
      
 56 
     | 
    
         
            +
             
     | 
| 
      
 57 
     | 
    
         
            +
                      def self.inherited(klass)
         
     | 
| 
      
 58 
     | 
    
         
            +
                        klass.extend(Cistern::Attributes::ClassMethods)
         
     | 
| 
      
 59 
     | 
    
         
            +
                        klass.extend(Cistern::Collection::ClassMethods)
         
     | 
| 
      
 60 
     | 
    
         
            +
                        klass.include(Cistern::Attributes::InstanceMethods)
         
     | 
| 
      
 61 
     | 
    
         
            +
             
     | 
| 
      
 62 
     | 
    
         
            +
                        Cistern::Collection.service_collection(service, klass)
         
     | 
| 
      
 63 
     | 
    
         
            +
                      end
         
     | 
| 
      
 64 
     | 
    
         
            +
             
     | 
| 
      
 65 
     | 
    
         
            +
                      def self.service
         
     | 
| 
      
 66 
     | 
    
         
            +
                        #{klass.name}
         
     | 
| 
      
 67 
     | 
    
         
            +
                      end
         
     | 
| 
      
 68 
     | 
    
         
            +
                    end
         
     | 
| 
      
 69 
     | 
    
         
            +
             
     | 
| 
      
 70 
     | 
    
         
            +
                    class Request
         
     | 
| 
      
 71 
     | 
    
         
            +
                      include Cistern::Request
         
     | 
| 
      
 72 
     | 
    
         
            +
             
     | 
| 
      
 73 
     | 
    
         
            +
                      def self.inherited(klass)
         
     | 
| 
      
 74 
     | 
    
         
            +
                        klass.extend(Cistern::Request::ClassMethods)
         
     | 
| 
      
 75 
     | 
    
         
            +
             
     | 
| 
      
 76 
     | 
    
         
            +
                        Cistern::Request.service_request(service, klass)
         
     | 
| 
      
 77 
     | 
    
         
            +
                      end
         
     | 
| 
      
 78 
     | 
    
         
            +
             
     | 
| 
      
 79 
     | 
    
         
            +
                      def self.service
         
     | 
| 
      
 80 
     | 
    
         
            +
                        #{klass.name}
         
     | 
| 
      
 81 
     | 
    
         
            +
                      end
         
     | 
| 
      
 82 
     | 
    
         
            +
                    end
         
     | 
| 
       45 
83 
     | 
    
         
             
                  EOS
         
     | 
| 
       46 
84 
     | 
    
         | 
| 
       47 
85 
     | 
    
         
             
                  klass.send(:const_set, :Timeout, Class.new(Cistern::Error))
         
     | 
| 
         @@ -57,30 +95,6 @@ class Cistern::Service 
     | 
|
| 
       57 
95 
     | 
    
         
             
                  klass::Real.timeout_error = klass::Timeout
         
     | 
| 
       58 
96 
     | 
    
         
             
                end
         
     | 
| 
       59 
97 
     | 
    
         | 
| 
       60 
     | 
    
         
            -
                def collection_path(collection_path = nil)
         
     | 
| 
       61 
     | 
    
         
            -
                  if collection_path
         
     | 
| 
       62 
     | 
    
         
            -
                    @collection_path = collection_path
         
     | 
| 
       63 
     | 
    
         
            -
                  else
         
     | 
| 
       64 
     | 
    
         
            -
                    @collection_path
         
     | 
| 
       65 
     | 
    
         
            -
                  end
         
     | 
| 
       66 
     | 
    
         
            -
                end
         
     | 
| 
       67 
     | 
    
         
            -
             
     | 
| 
       68 
     | 
    
         
            -
                def model_path(model_path = nil)
         
     | 
| 
       69 
     | 
    
         
            -
                  if model_path
         
     | 
| 
       70 
     | 
    
         
            -
                    @model_path = model_path
         
     | 
| 
       71 
     | 
    
         
            -
                  else
         
     | 
| 
       72 
     | 
    
         
            -
                    @model_path
         
     | 
| 
       73 
     | 
    
         
            -
                  end
         
     | 
| 
       74 
     | 
    
         
            -
                end
         
     | 
| 
       75 
     | 
    
         
            -
             
     | 
| 
       76 
     | 
    
         
            -
                def request_path(request_path = nil)
         
     | 
| 
       77 
     | 
    
         
            -
                  if request_path
         
     | 
| 
       78 
     | 
    
         
            -
                    @request_path = request_path
         
     | 
| 
       79 
     | 
    
         
            -
                  else
         
     | 
| 
       80 
     | 
    
         
            -
                    @request_path
         
     | 
| 
       81 
     | 
    
         
            -
                  end
         
     | 
| 
       82 
     | 
    
         
            -
                end
         
     | 
| 
       83 
     | 
    
         
            -
             
     | 
| 
       84 
98 
     | 
    
         
             
                def collections
         
     | 
| 
       85 
99 
     | 
    
         
             
                  @collections ||= []
         
     | 
| 
       86 
100 
     | 
    
         
             
                end
         
     | 
| 
         @@ -109,22 +123,10 @@ class Cistern::Service 
     | 
|
| 
       109 
123 
     | 
    
         
             
                  self.recognized_arguments.concat(args)
         
     | 
| 
       110 
124 
     | 
    
         
             
                end
         
     | 
| 
       111 
125 
     | 
    
         | 
| 
       112 
     | 
    
         
            -
                def model(model_name, options={})
         
     | 
| 
       113 
     | 
    
         
            -
                  models << [model_name, options]
         
     | 
| 
       114 
     | 
    
         
            -
                end
         
     | 
| 
       115 
     | 
    
         
            -
             
     | 
| 
       116 
126 
     | 
    
         
             
                def mocked_requests
         
     | 
| 
       117 
127 
     | 
    
         
             
                  @mocked_requests ||= []
         
     | 
| 
       118 
128 
     | 
    
         
             
                end
         
     | 
| 
       119 
129 
     | 
    
         | 
| 
       120 
     | 
    
         
            -
                def request(request_name, options={})
         
     | 
| 
       121 
     | 
    
         
            -
                  requests << [request_name, options]
         
     | 
| 
       122 
     | 
    
         
            -
                end
         
     | 
| 
       123 
     | 
    
         
            -
             
     | 
| 
       124 
     | 
    
         
            -
                def collection(collection_name, options={})
         
     | 
| 
       125 
     | 
    
         
            -
                  collections << [collection_name, options]
         
     | 
| 
       126 
     | 
    
         
            -
                end
         
     | 
| 
       127 
     | 
    
         
            -
             
     | 
| 
       128 
130 
     | 
    
         
             
                def validate_options(options={})
         
     | 
| 
       129 
131 
     | 
    
         
             
                  required_options = Cistern::Hash.slice(options, *required_arguments)
         
     | 
| 
       130 
132 
     | 
    
         | 
| 
         @@ -141,66 +143,8 @@ class Cistern::Service 
     | 
|
| 
       141 
143 
     | 
    
         
             
                  end
         
     | 
| 
       142 
144 
     | 
    
         
             
                end
         
     | 
| 
       143 
145 
     | 
    
         | 
| 
       144 
     | 
    
         
            -
                def setup_requirements
         
     | 
| 
       145 
     | 
    
         
            -
                  @required ||= false
         
     | 
| 
       146 
     | 
    
         
            -
                  unless @required
         
     | 
| 
       147 
     | 
    
         
            -
             
     | 
| 
       148 
     | 
    
         
            -
                    # setup models
         
     | 
| 
       149 
     | 
    
         
            -
                    models.each do |model, options|
         
     | 
| 
       150 
     | 
    
         
            -
                      unless options[:require] == false
         
     | 
| 
       151 
     | 
    
         
            -
                        require(options[:require] || File.join(@model_path, model.to_s))
         
     | 
| 
       152 
     | 
    
         
            -
                      end
         
     | 
| 
       153 
     | 
    
         
            -
             
     | 
| 
       154 
     | 
    
         
            -
                      class_name    = options[:class] || model.to_s.split("_").map(&:capitalize).join
         
     | 
| 
       155 
     | 
    
         
            -
                      singular_name = options[:model] || model.to_s.gsub("/", "_")
         
     | 
| 
       156 
     | 
    
         
            -
             
     | 
| 
       157 
     | 
    
         
            -
                      self.const_get(:Collections).module_eval <<-EOS, __FILE__, __LINE__
         
     | 
| 
       158 
     | 
    
         
            -
                        def #{singular_name}(attributes={})
         
     | 
| 
       159 
     | 
    
         
            -
                          #{service}::#{class_name}.new({connection: self}.merge(attributes))
         
     | 
| 
       160 
     | 
    
         
            -
                        end
         
     | 
| 
       161 
     | 
    
         
            -
                      EOS
         
     | 
| 
       162 
     | 
    
         
            -
                    end
         
     | 
| 
       163 
     | 
    
         
            -
             
     | 
| 
       164 
     | 
    
         
            -
                    # setup requests
         
     | 
| 
       165 
     | 
    
         
            -
                    requests.each do |request, options|
         
     | 
| 
       166 
     | 
    
         
            -
                      unless options[:require] == false || service::Real.method_defined?(request.to_s)
         
     | 
| 
       167 
     | 
    
         
            -
                        require(options[:require] || File.join(@request_path, request.to_s))
         
     | 
| 
       168 
     | 
    
         
            -
                      end
         
     | 
| 
       169 
     | 
    
         
            -
             
     | 
| 
       170 
     | 
    
         
            -
                      if service::Mock.method_defined?(request)
         
     | 
| 
       171 
     | 
    
         
            -
                        mocked_requests << request
         
     | 
| 
       172 
     | 
    
         
            -
                      else
         
     | 
| 
       173 
     | 
    
         
            -
                        service::Mock.module_eval <<-EOS, __FILE__, __LINE__
         
     | 
| 
       174 
     | 
    
         
            -
                          def #{request}(*args)
         
     | 
| 
       175 
     | 
    
         
            -
                            Cistern::Mock.not_implemented(request)
         
     | 
| 
       176 
     | 
    
         
            -
                          end
         
     | 
| 
       177 
     | 
    
         
            -
                        EOS
         
     | 
| 
       178 
     | 
    
         
            -
                      end
         
     | 
| 
       179 
     | 
    
         
            -
                    end
         
     | 
| 
       180 
     | 
    
         
            -
             
     | 
| 
       181 
     | 
    
         
            -
                    # setup collections
         
     | 
| 
       182 
     | 
    
         
            -
                    collections.each do |collection, options|
         
     | 
| 
       183 
     | 
    
         
            -
                      unless options[:require] == false
         
     | 
| 
       184 
     | 
    
         
            -
                        require(options[:require] || File.join(@collection_path || @model_path, collection.to_s))
         
     | 
| 
       185 
     | 
    
         
            -
                      end
         
     | 
| 
       186 
     | 
    
         
            -
             
     | 
| 
       187 
     | 
    
         
            -
                      class_name = collection.to_s.split("/").map(&:capitalize).join("::").split("_").map { |s| "#{s[0].upcase}#{s[1..-1]}" }.join
         
     | 
| 
       188 
     | 
    
         
            -
                      plural_name = options[:collection] || collection.to_s.gsub("/", "_")
         
     | 
| 
       189 
     | 
    
         
            -
             
     | 
| 
       190 
     | 
    
         
            -
                      self.const_get(:Collections).module_eval <<-EOS, __FILE__, __LINE__
         
     | 
| 
       191 
     | 
    
         
            -
                        def #{plural_name}(attributes={})
         
     | 
| 
       192 
     | 
    
         
            -
                          #{service}::#{class_name}.new({connection: self}.merge(attributes))
         
     | 
| 
       193 
     | 
    
         
            -
                        end
         
     | 
| 
       194 
     | 
    
         
            -
                      EOS
         
     | 
| 
       195 
     | 
    
         
            -
                    end
         
     | 
| 
       196 
     | 
    
         
            -
             
     | 
| 
       197 
     | 
    
         
            -
                    @required = true
         
     | 
| 
       198 
     | 
    
         
            -
                  end
         
     | 
| 
       199 
     | 
    
         
            -
                end
         
     | 
| 
       200 
     | 
    
         
            -
             
     | 
| 
       201 
146 
     | 
    
         
             
                def new(options={})
         
     | 
| 
       202 
147 
     | 
    
         
             
                  validate_options(options)
         
     | 
| 
       203 
     | 
    
         
            -
                  setup_requirements
         
     | 
| 
       204 
148 
     | 
    
         | 
| 
       205 
149 
     | 
    
         
             
                  self.const_get(self.mocking? ? :Mock : :Real).new(options)
         
     | 
| 
       206 
150 
     | 
    
         
             
                end
         
     | 
    
        data/lib/cistern/singular.rb
    CHANGED
    
    
| 
         @@ -0,0 +1,31 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            class Cistern::String
         
     | 
| 
      
 2 
     | 
    
         
            +
              def self.camelize(string)
         
     | 
| 
      
 3 
     | 
    
         
            +
                string.gsub(/[A-Z]+/) { |w| "_#{w.downcase}" }.gsub(/^_/, "")
         
     | 
| 
      
 4 
     | 
    
         
            +
              end
         
     | 
| 
      
 5 
     | 
    
         
            +
             
     | 
| 
      
 6 
     | 
    
         
            +
              # File activesupport/lib/active_support/inflector/methods.rb, line 90
         
     | 
| 
      
 7 
     | 
    
         
            +
              def self.underscore(camel_cased_word)
         
     | 
| 
      
 8 
     | 
    
         
            +
                word = camel_cased_word.to_s.gsub('::', '/')
         
     | 
| 
      
 9 
     | 
    
         
            +
                #word.gsub!(/(?:([A-Za-z\d])|^)(#{inflections.acronym_regex})(?=\b|[^a-z])/) { "#{$1}#{$1 && '_'}#{$2.downcase}" }
         
     | 
| 
      
 10 
     | 
    
         
            +
                word.gsub!(/([A-Z\d]+)([A-Z][a-z])/,'\1_\2')
         
     | 
| 
      
 11 
     | 
    
         
            +
                word.gsub!(/([a-z\d])([A-Z])/,'\1_\2')
         
     | 
| 
      
 12 
     | 
    
         
            +
                word.tr!("-", "_")
         
     | 
| 
      
 13 
     | 
    
         
            +
                word.downcase!
         
     | 
| 
      
 14 
     | 
    
         
            +
                word
         
     | 
| 
      
 15 
     | 
    
         
            +
              end
         
     | 
| 
      
 16 
     | 
    
         
            +
             
     | 
| 
      
 17 
     | 
    
         
            +
              # File activesupport/lib/active_support/inflector/methods.rb, line 168
         
     | 
| 
      
 18 
     | 
    
         
            +
              def self.demodulize(path)
         
     | 
| 
      
 19 
     | 
    
         
            +
                path = path.to_s
         
     | 
| 
      
 20 
     | 
    
         
            +
                if i = path.rindex('::')
         
     | 
| 
      
 21 
     | 
    
         
            +
                  path[(i+2)..-1]
         
     | 
| 
      
 22 
     | 
    
         
            +
                else
         
     | 
| 
      
 23 
     | 
    
         
            +
                  path
         
     | 
| 
      
 24 
     | 
    
         
            +
                end
         
     | 
| 
      
 25 
     | 
    
         
            +
              end
         
     | 
| 
      
 26 
     | 
    
         
            +
             
     | 
| 
      
 27 
     | 
    
         
            +
              # @todo omg so bad
         
     | 
| 
      
 28 
     | 
    
         
            +
              def self.pluralize(string)
         
     | 
| 
      
 29 
     | 
    
         
            +
                "#{string}s"
         
     | 
| 
      
 30 
     | 
    
         
            +
              end
         
     | 
| 
      
 31 
     | 
    
         
            +
            end
         
     | 
    
        data/lib/cistern/version.rb
    CHANGED
    
    
    
        data/spec/collection_spec.rb
    CHANGED
    
    | 
         @@ -1,13 +1,12 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            require 'spec_helper'
         
     | 
| 
       2 
2 
     | 
    
         | 
| 
       3 
3 
     | 
    
         
             
            describe "Cistern::Collection" do
         
     | 
| 
       4 
     | 
    
         
            -
             
     | 
| 
       5 
     | 
    
         
            -
              class SampleCollectionModel < Cistern::Model
         
     | 
| 
      
 4 
     | 
    
         
            +
              class SampleCollectionModel < Sample::Model
         
     | 
| 
       6 
5 
     | 
    
         
             
                identity :id
         
     | 
| 
       7 
6 
     | 
    
         
             
                attribute :name
         
     | 
| 
       8 
7 
     | 
    
         
             
              end
         
     | 
| 
       9 
8 
     | 
    
         | 
| 
       10 
     | 
    
         
            -
              class SampleCollection <  
     | 
| 
      
 9 
     | 
    
         
            +
              class SampleCollection < Sample::Collection
         
     | 
| 
       11 
10 
     | 
    
         
             
                model SampleCollectionModel
         
     | 
| 
       12 
11 
     | 
    
         | 
| 
       13 
12 
     | 
    
         
             
                def all
         
     | 
    
        data/spec/dirty_spec.rb
    CHANGED
    
    
    
        data/spec/formatter_spec.rb
    CHANGED
    
    | 
         @@ -1,13 +1,12 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            require 'spec_helper'
         
     | 
| 
       2 
2 
     | 
    
         | 
| 
       3 
3 
     | 
    
         
             
            describe "#inspect" do
         
     | 
| 
       4 
     | 
    
         
            -
              class Inspector <  
     | 
| 
      
 4 
     | 
    
         
            +
              class Inspector < Sample::Model
         
     | 
| 
       5 
5 
     | 
    
         
             
                identity :id
         
     | 
| 
       6 
6 
     | 
    
         
             
                attribute :name
         
     | 
| 
       7 
7 
     | 
    
         
             
              end
         
     | 
| 
       8 
8 
     | 
    
         | 
| 
       9 
     | 
    
         
            -
              class Inspectors <  
     | 
| 
       10 
     | 
    
         
            -
             
     | 
| 
      
 9 
     | 
    
         
            +
              class Inspectors < Sample::Collection
         
     | 
| 
       11 
10 
     | 
    
         
             
                model Inspector
         
     | 
| 
       12 
11 
     | 
    
         | 
| 
       13 
12 
     | 
    
         
             
                def all(options={})
         
     | 
    
        data/spec/mock_data_spec.rb
    CHANGED
    
    | 
         @@ -1,37 +1,31 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            require 'spec_helper'
         
     | 
| 
       2 
2 
     | 
    
         | 
| 
       3 
3 
     | 
    
         
             
            describe 'mock data' do
         
     | 
| 
       4 
     | 
    
         
            -
              class  
     | 
| 
       5 
     | 
    
         
            -
                 
     | 
| 
       6 
     | 
    
         
            -
                 
     | 
| 
       7 
     | 
    
         
            -
             
     | 
| 
       8 
     | 
    
         
            -
                class Real
         
     | 
| 
       9 
     | 
    
         
            -
                  def diagnosis(options={})
         
     | 
| 
       10 
     | 
    
         
            -
                  end
         
     | 
| 
      
 4 
     | 
    
         
            +
              class Diagnosis < Sample::Request
         
     | 
| 
      
 5 
     | 
    
         
            +
                def real(diagnosis)
         
     | 
| 
      
 6 
     | 
    
         
            +
                end
         
     | 
| 
       11 
7 
     | 
    
         | 
| 
       12 
     | 
    
         
            -
             
     | 
| 
       13 
     | 
    
         
            -
                   
     | 
| 
      
 8 
     | 
    
         
            +
                def mock(diagnosis)
         
     | 
| 
      
 9 
     | 
    
         
            +
                  service.data.store(:diagnosis, service.data.fetch(:diagnosis) + [diagnosis])
         
     | 
| 
       14 
10 
     | 
    
         
             
                end
         
     | 
| 
      
 11 
     | 
    
         
            +
              end
         
     | 
| 
       15 
12 
     | 
    
         | 
| 
       16 
     | 
    
         
            -
             
     | 
| 
       17 
     | 
    
         
            -
             
     | 
| 
       18 
     | 
    
         
            -
             
     | 
| 
       19 
     | 
    
         
            -
                    self.data.store(:diagnosis, self.data.fetch(:diagnosis) + [diagnosis])
         
     | 
| 
       20 
     | 
    
         
            -
                  end
         
     | 
| 
      
 13 
     | 
    
         
            +
              class Treat < Sample::Request
         
     | 
| 
      
 14 
     | 
    
         
            +
                def real(treatment)
         
     | 
| 
      
 15 
     | 
    
         
            +
                end
         
     | 
| 
       21 
16 
     | 
    
         | 
| 
       22 
     | 
    
         
            -
             
     | 
| 
       23 
     | 
    
         
            -
             
     | 
| 
       24 
     | 
    
         
            -
                  end
         
     | 
| 
      
 17 
     | 
    
         
            +
                def mock(treatment)
         
     | 
| 
      
 18 
     | 
    
         
            +
                  service.data[:treatments] += [treatment]
         
     | 
| 
       25 
19 
     | 
    
         
             
                end
         
     | 
| 
       26 
20 
     | 
    
         
             
              end
         
     | 
| 
       27 
21 
     | 
    
         | 
| 
       28 
22 
     | 
    
         
             
              shared_examples "mock_data#backend" do |backend, options|
         
     | 
| 
       29 
23 
     | 
    
         
             
                it "should store mock data" do
         
     | 
| 
       30 
     | 
    
         
            -
                   
     | 
| 
       31 
     | 
    
         
            -
                   
     | 
| 
       32 
     | 
    
         
            -
                   
     | 
| 
      
 24 
     | 
    
         
            +
                  Sample.mock!
         
     | 
| 
      
 25 
     | 
    
         
            +
                  Sample::Mock.store_in(backend, options)
         
     | 
| 
      
 26 
     | 
    
         
            +
                  Sample.reset!
         
     | 
| 
       33 
27 
     | 
    
         | 
| 
       34 
     | 
    
         
            -
                  p =  
     | 
| 
      
 28 
     | 
    
         
            +
                  p = Sample.new
         
     | 
| 
       35 
29 
     | 
    
         
             
                  p.diagnosis("sick")
         
     | 
| 
       36 
30 
     | 
    
         
             
                  expect(p.data[:diagnosis]).to eq(["sick"])
         
     | 
| 
       37 
31 
     | 
    
         | 
| 
         @@ -42,7 +36,7 @@ describe 'mock data' do 
     | 
|
| 
       42 
36 
     | 
    
         
             
                  p.treat("healthy")
         
     | 
| 
       43 
37 
     | 
    
         
             
                  expect(p.data[:treatments]).to eq(["healthy"])
         
     | 
| 
       44 
38 
     | 
    
         | 
| 
       45 
     | 
    
         
            -
                   
     | 
| 
      
 39 
     | 
    
         
            +
                  Sample.reset!
         
     | 
| 
       46 
40 
     | 
    
         | 
| 
       47 
41 
     | 
    
         
             
                  expect(p.data[:treatments]).to eq([])
         
     | 
| 
       48 
42 
     | 
    
         
             
                end
         
     | 
    
        data/spec/model_spec.rb
    CHANGED
    
    | 
         @@ -2,7 +2,7 @@ require 'spec_helper' 
     | 
|
| 
       2 
2 
     | 
    
         | 
| 
       3 
3 
     | 
    
         
             
            describe "Cistern::Model" do
         
     | 
| 
       4 
4 
     | 
    
         
             
              describe "#update" do
         
     | 
| 
       5 
     | 
    
         
            -
                class UpdateSpec <  
     | 
| 
      
 5 
     | 
    
         
            +
                class UpdateSpec < Sample::Model
         
     | 
| 
       6 
6 
     | 
    
         
             
                  identity :id
         
     | 
| 
       7 
7 
     | 
    
         
             
                  attribute :name
         
     | 
| 
       8 
8 
     | 
    
         
             
                  attribute :properties
         
     | 
| 
         @@ -21,7 +21,7 @@ describe "Cistern::Model" do 
     | 
|
| 
       21 
21 
     | 
    
         
             
              end
         
     | 
| 
       22 
22 
     | 
    
         | 
| 
       23 
23 
     | 
    
         
             
              it "should duplicate a model" do
         
     | 
| 
       24 
     | 
    
         
            -
                class DupSpec <  
     | 
| 
      
 24 
     | 
    
         
            +
                class DupSpec < Sample::Model
         
     | 
| 
       25 
25 
     | 
    
         
             
                  identity :id
         
     | 
| 
       26 
26 
     | 
    
         
             
                  attribute :name
         
     | 
| 
       27 
27 
     | 
    
         
             
                  attribute :properties
         
     | 
| 
         @@ -38,7 +38,7 @@ describe "Cistern::Model" do 
     | 
|
| 
       38 
38 
     | 
    
         
             
              end
         
     | 
| 
       39 
39 
     | 
    
         | 
| 
       40 
40 
     | 
    
         
             
              context "attribute parsing" do
         
     | 
| 
       41 
     | 
    
         
            -
                class TypeSpec <  
     | 
| 
      
 41 
     | 
    
         
            +
                class TypeSpec < Sample::Model
         
     | 
| 
       42 
42 
     | 
    
         
             
                  identity :id
         
     | 
| 
       43 
43 
     | 
    
         
             
                  attribute :name, type: :string
         
     | 
| 
       44 
44 
     | 
    
         
             
                  attribute :created_at, type: :time
         
     | 
| 
         @@ -155,17 +155,17 @@ describe "Cistern::Model" do 
     | 
|
| 
       155 
155 
     | 
    
         | 
| 
       156 
156 
     | 
    
         
             
                describe "#requires" do
         
     | 
| 
       157 
157 
     | 
    
         
             
                  it "should raise if attribute not provided" do
         
     | 
| 
       158 
     | 
    
         
            -
                    expect { TypeSpec.new({" 
     | 
| 
      
 158 
     | 
    
         
            +
                    expect { TypeSpec.new({"service" => "fake", "something" => {"id" => "12"}}).save }.to raise_exception(ArgumentError)
         
     | 
| 
       159 
159 
     | 
    
         
             
                  end
         
     | 
| 
       160 
160 
     | 
    
         | 
| 
       161 
161 
     | 
    
         
             
                  it "should raise if attribute is provided and is nil" do
         
     | 
| 
       162 
     | 
    
         
            -
                    expect { TypeSpec.new({" 
     | 
| 
      
 162 
     | 
    
         
            +
                    expect { TypeSpec.new({"service" => "fake", "custom" => nil}).save }.to raise_exception(ArgumentError)
         
     | 
| 
       163 
163 
     | 
    
         
             
                  end
         
     | 
| 
       164 
164 
     | 
    
         
             
                end
         
     | 
| 
       165 
165 
     | 
    
         
             
              end
         
     | 
| 
       166 
166 
     | 
    
         | 
| 
       167 
167 
     | 
    
         
             
              context "attribute coverage info collecting", :coverage do
         
     | 
| 
       168 
     | 
    
         
            -
                class CoverageSpec <  
     | 
| 
      
 168 
     | 
    
         
            +
                class CoverageSpec < Sample::Model
         
     | 
| 
       169 
169 
     | 
    
         
             
                  identity :id
         
     | 
| 
       170 
170 
     | 
    
         | 
| 
       171 
171 
     | 
    
         
             
                  attribute :used, type: :string
         
     | 
| 
         @@ -0,0 +1,37 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            require 'spec_helper'
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
      
 3 
     | 
    
         
            +
            describe "Cistern::Request" do
         
     | 
| 
      
 4 
     | 
    
         
            +
              class SampleService < Cistern::Service
         
     | 
| 
      
 5 
     | 
    
         
            +
                recognizes :key
         
     | 
| 
      
 6 
     | 
    
         
            +
             
     | 
| 
      
 7 
     | 
    
         
            +
                class Real
         
     | 
| 
      
 8 
     | 
    
         
            +
                  attr_reader :service_args
         
     | 
| 
      
 9 
     | 
    
         
            +
             
     | 
| 
      
 10 
     | 
    
         
            +
                  def initialize(*args)
         
     | 
| 
      
 11 
     | 
    
         
            +
                    @service_args = args
         
     | 
| 
      
 12 
     | 
    
         
            +
                  end
         
     | 
| 
      
 13 
     | 
    
         
            +
                end
         
     | 
| 
      
 14 
     | 
    
         
            +
              end
         
     | 
| 
      
 15 
     | 
    
         
            +
             
     | 
| 
      
 16 
     | 
    
         
            +
              # @todo Sample::Service.request
         
     | 
| 
      
 17 
     | 
    
         
            +
              class ListSamples < SampleService::Request
         
     | 
| 
      
 18 
     | 
    
         
            +
                # @todo name
         
     | 
| 
      
 19 
     | 
    
         
            +
                # name :list_all_samples
         
     | 
| 
      
 20 
     | 
    
         
            +
                def real(*args)
         
     | 
| 
      
 21 
     | 
    
         
            +
                  service.service_args + args + ["real"]
         
     | 
| 
      
 22 
     | 
    
         
            +
                end
         
     | 
| 
      
 23 
     | 
    
         
            +
             
     | 
| 
      
 24 
     | 
    
         
            +
                def mock(*args)
         
     | 
| 
      
 25 
     | 
    
         
            +
                  args + ["mock"]
         
     | 
| 
      
 26 
     | 
    
         
            +
                end
         
     | 
| 
      
 27 
     | 
    
         
            +
              end
         
     | 
| 
      
 28 
     | 
    
         
            +
             
     | 
| 
      
 29 
     | 
    
         
            +
              it "should execute a new-style request" do
         
     | 
| 
      
 30 
     | 
    
         
            +
                expect(SampleService.new.list_samples("sample1")).to eq([{}, "sample1", "real"])
         
     | 
| 
      
 31 
     | 
    
         
            +
                expect(SampleService::Real.new.list_samples("sample2")).to eq(["sample2", "real"])
         
     | 
| 
      
 32 
     | 
    
         
            +
                expect(SampleService::Mock.new.list_samples("sample3")).to eq(["sample3", "mock"])
         
     | 
| 
      
 33 
     | 
    
         
            +
             
     | 
| 
      
 34 
     | 
    
         
            +
                # service access
         
     | 
| 
      
 35 
     | 
    
         
            +
                expect(SampleService.new(:key => "value").list_samples("stat")).to eq([{:key => "value"}, "stat", "real"])
         
     | 
| 
      
 36 
     | 
    
         
            +
              end
         
     | 
| 
      
 37 
     | 
    
         
            +
            end
         
     | 
| 
         
            File without changes
         
     | 
    
        data/spec/singular_spec.rb
    CHANGED
    
    | 
         @@ -6,8 +6,8 @@ describe "Cistern::Singular" do 
     | 
|
| 
       6 
6 
     | 
    
         
             
                attribute :count, type: :number
         
     | 
| 
       7 
7 
     | 
    
         | 
| 
       8 
8 
     | 
    
         
             
                def fetch_attributes
         
     | 
| 
       9 
     | 
    
         
            -
                  #test that initialize waits for  
     | 
| 
       10 
     | 
    
         
            -
                  raise "missing  
     | 
| 
      
 9 
     | 
    
         
            +
                  #test that initialize waits for service to be defined
         
     | 
| 
      
 10 
     | 
    
         
            +
                  raise "missing service" unless service
         
     | 
| 
       11 
11 
     | 
    
         | 
| 
       12 
12 
     | 
    
         
             
                  @counter ||= 0
         
     | 
| 
       13 
13 
     | 
    
         
             
                  @counter += 1
         
     | 
| 
         @@ -16,11 +16,11 @@ describe "Cistern::Singular" do 
     | 
|
| 
       16 
16 
     | 
    
         
             
              end
         
     | 
| 
       17 
17 
     | 
    
         | 
| 
       18 
18 
     | 
    
         
             
              it "should work" do
         
     | 
| 
       19 
     | 
    
         
            -
                expect(SampleSingular.new( 
     | 
| 
      
 19 
     | 
    
         
            +
                expect(SampleSingular.new(service: :fake).name).to eq("amazing")
         
     | 
| 
       20 
20 
     | 
    
         
             
              end
         
     | 
| 
       21 
21 
     | 
    
         | 
| 
       22 
22 
     | 
    
         
             
              it "should reload" do
         
     | 
| 
       23 
     | 
    
         
            -
                singular = SampleSingular.new( 
     | 
| 
      
 23 
     | 
    
         
            +
                singular = SampleSingular.new(service: :fake)
         
     | 
| 
       24 
24 
     | 
    
         
             
                old_count = singular.count
         
     | 
| 
       25 
25 
     | 
    
         
             
                expect(singular.count).to eq(old_count)
         
     | 
| 
       26 
26 
     | 
    
         
             
                expect(singular.reload.count).to be > old_count
         
     | 
    
        data/spec/spec_helper.rb
    CHANGED
    
    
| 
         @@ -0,0 +1 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            class Sample < Cistern::Service; end
         
     | 
    
        data/spec/wait_for_spec.rb
    CHANGED
    
    | 
         @@ -1,23 +1,13 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            require 'spec_helper'
         
     | 
| 
       2 
2 
     | 
    
         | 
| 
       3 
     | 
    
         
            -
            class  
     | 
| 
       4 
     | 
    
         
            -
              model :wait_for_model, require: false
         
     | 
| 
       5 
     | 
    
         
            -
              collection :wait_for_models, require: false
         
     | 
| 
       6 
     | 
    
         
            -
             
     | 
| 
       7 
     | 
    
         
            -
              class Real
         
     | 
| 
       8 
     | 
    
         
            -
                def initialize(*args)
         
     | 
| 
       9 
     | 
    
         
            -
                end
         
     | 
| 
       10 
     | 
    
         
            -
              end
         
     | 
| 
       11 
     | 
    
         
            -
            end
         
     | 
| 
       12 
     | 
    
         
            -
             
     | 
| 
       13 
     | 
    
         
            -
            class WaitForService::WaitForModel < Cistern::Model
         
     | 
| 
      
 3 
     | 
    
         
            +
            class WaitForModel < Sample::Model
         
     | 
| 
       14 
4 
     | 
    
         
             
              identity :id
         
     | 
| 
       15 
5 
     | 
    
         | 
| 
       16 
6 
     | 
    
         
             
              attribute :name
         
     | 
| 
       17 
7 
     | 
    
         
             
            end
         
     | 
| 
       18 
8 
     | 
    
         | 
| 
       19 
     | 
    
         
            -
            class  
     | 
| 
       20 
     | 
    
         
            -
              model  
     | 
| 
      
 9 
     | 
    
         
            +
            class WaitForModels < Sample::Collection
         
     | 
| 
      
 10 
     | 
    
         
            +
              model WaitForModel
         
     | 
| 
       21 
11 
     | 
    
         | 
| 
       22 
12 
     | 
    
         
             
              def get(identity)
         
     | 
| 
       23 
13 
     | 
    
         
             
                self
         
     | 
| 
         @@ -37,17 +27,17 @@ describe 'Cistern#wait_for!' do 
     | 
|
| 
       37 
27 
     | 
    
         
             
            end
         
     | 
| 
       38 
28 
     | 
    
         | 
| 
       39 
29 
     | 
    
         
             
            describe 'Cistern::Model#wait_for!' do
         
     | 
| 
       40 
     | 
    
         
            -
              let(:service) {  
     | 
| 
      
 30 
     | 
    
         
            +
              let(:service) { Sample.new }
         
     | 
| 
       41 
31 
     | 
    
         
             
              let(:model)   { service.wait_for_models.new(identity: 1) }
         
     | 
| 
       42 
32 
     | 
    
         | 
| 
       43 
33 
     | 
    
         
             
              it "should raise if timeout exceeded" do
         
     | 
| 
       44 
     | 
    
         
            -
                expect { model.wait_for!(0, 0) { false } }.to raise_exception( 
     | 
| 
      
 34 
     | 
    
         
            +
                expect { model.wait_for!(0, 0) { false } }.to raise_exception(Sample::Timeout)
         
     | 
| 
       45 
35 
     | 
    
         
             
              end
         
     | 
| 
       46 
36 
     | 
    
         
             
            end
         
     | 
| 
       47 
37 
     | 
    
         | 
| 
       48 
38 
     | 
    
         | 
| 
       49 
39 
     | 
    
         
             
            describe "WaitForModel#timeout" do
         
     | 
| 
       50 
     | 
    
         
            -
              let(:service) {  
     | 
| 
      
 40 
     | 
    
         
            +
              let(:service) { Sample.new }
         
     | 
| 
       51 
41 
     | 
    
         
             
              let(:model)   { service.wait_for_models.new(identity: 1) }
         
     | 
| 
       52 
42 
     | 
    
         | 
| 
       53 
43 
     | 
    
         
             
              it "should use service-specific timeout in #wait_for" do
         
     | 
| 
         @@ -59,7 +49,7 @@ describe "WaitForModel#timeout" do 
     | 
|
| 
       59 
49 
     | 
    
         
             
                timeout(2) do
         
     | 
| 
       60 
50 
     | 
    
         
             
                  expect do
         
     | 
| 
       61 
51 
     | 
    
         
             
                    model.wait_for! { sleep(0.2); elapsed += 0.2; elapsed > 0.2 }
         
     | 
| 
       62 
     | 
    
         
            -
                  end.to raise_exception( 
     | 
| 
      
 52 
     | 
    
         
            +
                  end.to raise_exception(Sample::Timeout)
         
     | 
| 
       63 
53 
     | 
    
         
             
                end
         
     | 
| 
       64 
54 
     | 
    
         
             
              end
         
     | 
| 
       65 
55 
     | 
    
         | 
| 
         @@ -72,7 +62,7 @@ describe "WaitForModel#timeout" do 
     | 
|
| 
       72 
62 
     | 
    
         
             
                timeout(2) do
         
     | 
| 
       73 
63 
     | 
    
         
             
                  expect do
         
     | 
| 
       74 
64 
     | 
    
         
             
                    model.wait_for!(0.1) { sleep(0.2); elapsed += 0.2; elapsed > 0.2 }
         
     | 
| 
       75 
     | 
    
         
            -
                  end.to raise_exception( 
     | 
| 
      
 65 
     | 
    
         
            +
                  end.to raise_exception(Sample::Timeout)
         
     | 
| 
       76 
66 
     | 
    
         
             
                end
         
     | 
| 
       77 
67 
     | 
    
         
             
              end
         
     | 
| 
       78 
68 
     | 
    
         
             
            end
         
     | 
    
        metadata
    CHANGED
    
    | 
         @@ -1,14 +1,14 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            --- !ruby/object:Gem::Specification
         
     | 
| 
       2 
2 
     | 
    
         
             
            name: cistern
         
     | 
| 
       3 
3 
     | 
    
         
             
            version: !ruby/object:Gem::Version
         
     | 
| 
       4 
     | 
    
         
            -
              version: 0.11. 
     | 
| 
      
 4 
     | 
    
         
            +
              version: 0.11.2.pre2
         
     | 
| 
       5 
5 
     | 
    
         
             
            platform: ruby
         
     | 
| 
       6 
6 
     | 
    
         
             
            authors:
         
     | 
| 
       7 
7 
     | 
    
         
             
            - Josh Lane
         
     | 
| 
       8 
8 
     | 
    
         
             
            autorequire: 
         
     | 
| 
       9 
9 
     | 
    
         
             
            bindir: bin
         
     | 
| 
       10 
10 
     | 
    
         
             
            cert_chain: []
         
     | 
| 
       11 
     | 
    
         
            -
            date: 2014-10- 
     | 
| 
      
 11 
     | 
    
         
            +
            date: 2014-10-21 00:00:00.000000000 Z
         
     | 
| 
       12 
12 
     | 
    
         
             
            dependencies: []
         
     | 
| 
       13 
13 
     | 
    
         
             
            description: API client framework extracted from Fog
         
     | 
| 
       14 
14 
     | 
    
         
             
            email:
         
     | 
| 
         @@ -39,8 +39,10 @@ files: 
     | 
|
| 
       39 
39 
     | 
    
         
             
            - lib/cistern/hash.rb
         
     | 
| 
       40 
40 
     | 
    
         
             
            - lib/cistern/mock.rb
         
     | 
| 
       41 
41 
     | 
    
         
             
            - lib/cistern/model.rb
         
     | 
| 
      
 42 
     | 
    
         
            +
            - lib/cistern/request.rb
         
     | 
| 
       42 
43 
     | 
    
         
             
            - lib/cistern/service.rb
         
     | 
| 
       43 
44 
     | 
    
         
             
            - lib/cistern/singular.rb
         
     | 
| 
      
 45 
     | 
    
         
            +
            - lib/cistern/string.rb
         
     | 
| 
       44 
46 
     | 
    
         
             
            - lib/cistern/timeout.rb
         
     | 
| 
       45 
47 
     | 
    
         
             
            - lib/cistern/version.rb
         
     | 
| 
       46 
48 
     | 
    
         
             
            - lib/cistern/wait_for.rb
         
     | 
| 
         @@ -50,8 +52,11 @@ files: 
     | 
|
| 
       50 
52 
     | 
    
         
             
            - spec/hash_spec.rb
         
     | 
| 
       51 
53 
     | 
    
         
             
            - spec/mock_data_spec.rb
         
     | 
| 
       52 
54 
     | 
    
         
             
            - spec/model_spec.rb
         
     | 
| 
      
 55 
     | 
    
         
            +
            - spec/request_spec.rb
         
     | 
| 
      
 56 
     | 
    
         
            +
            - spec/service_spec.rb
         
     | 
| 
       53 
57 
     | 
    
         
             
            - spec/singular_spec.rb
         
     | 
| 
       54 
58 
     | 
    
         
             
            - spec/spec_helper.rb
         
     | 
| 
      
 59 
     | 
    
         
            +
            - spec/support/service.rb
         
     | 
| 
       55 
60 
     | 
    
         
             
            - spec/wait_for_spec.rb
         
     | 
| 
       56 
61 
     | 
    
         
             
            homepage: http://joshualane.com/cistern
         
     | 
| 
       57 
62 
     | 
    
         
             
            licenses:
         
     | 
| 
         @@ -68,9 +73,9 @@ required_ruby_version: !ruby/object:Gem::Requirement 
     | 
|
| 
       68 
73 
     | 
    
         
             
                  version: '0'
         
     | 
| 
       69 
74 
     | 
    
         
             
            required_rubygems_version: !ruby/object:Gem::Requirement
         
     | 
| 
       70 
75 
     | 
    
         
             
              requirements:
         
     | 
| 
       71 
     | 
    
         
            -
              - - " 
     | 
| 
      
 76 
     | 
    
         
            +
              - - ">"
         
     | 
| 
       72 
77 
     | 
    
         
             
                - !ruby/object:Gem::Version
         
     | 
| 
       73 
     | 
    
         
            -
                  version:  
     | 
| 
      
 78 
     | 
    
         
            +
                  version: 1.3.1
         
     | 
| 
       74 
79 
     | 
    
         
             
            requirements: []
         
     | 
| 
       75 
80 
     | 
    
         
             
            rubyforge_project: 
         
     | 
| 
       76 
81 
     | 
    
         
             
            rubygems_version: 2.2.2
         
     | 
| 
         @@ -84,7 +89,10 @@ test_files: 
     | 
|
| 
       84 
89 
     | 
    
         
             
            - spec/hash_spec.rb
         
     | 
| 
       85 
90 
     | 
    
         
             
            - spec/mock_data_spec.rb
         
     | 
| 
       86 
91 
     | 
    
         
             
            - spec/model_spec.rb
         
     | 
| 
      
 92 
     | 
    
         
            +
            - spec/request_spec.rb
         
     | 
| 
      
 93 
     | 
    
         
            +
            - spec/service_spec.rb
         
     | 
| 
       87 
94 
     | 
    
         
             
            - spec/singular_spec.rb
         
     | 
| 
       88 
95 
     | 
    
         
             
            - spec/spec_helper.rb
         
     | 
| 
      
 96 
     | 
    
         
            +
            - spec/support/service.rb
         
     | 
| 
       89 
97 
     | 
    
         
             
            - spec/wait_for_spec.rb
         
     | 
| 
       90 
98 
     | 
    
         
             
            has_rdoc: 
         
     |