lib/cistern/service.rb in cistern-0.11.2.pre2 vs lib/cistern/service.rb in cistern-0.11.2
- old
+ new
@@ -40,48 +40,10 @@
class Mock
def initialize(options={})
end
end
-
- class Model
- include Cistern::Model
-
- def self.service
- #{klass.name}
- end
- end
-
- class Collection
- include Cistern::Collection
-
- def self.inherited(klass)
- klass.extend(Cistern::Attributes::ClassMethods)
- klass.extend(Cistern::Collection::ClassMethods)
- klass.include(Cistern::Attributes::InstanceMethods)
-
- Cistern::Collection.service_collection(service, klass)
- end
-
- def self.service
- #{klass.name}
- end
- end
-
- class Request
- include Cistern::Request
-
- def self.inherited(klass)
- klass.extend(Cistern::Request::ClassMethods)
-
- Cistern::Request.service_request(service, klass)
- end
-
- def self.service
- #{klass.name}
- end
- end
EOS
klass.send(:const_set, :Timeout, Class.new(Cistern::Error))
klass::Mock.send(:include, klass::Collections)
@@ -93,10 +55,34 @@
klass::Real.send(:include, klass::Collections)
klass::Real.send(:extend, Cistern::WaitFor)
klass::Real.timeout_error = klass::Timeout
end
+ def collection_path(collection_path = nil)
+ if collection_path
+ @collection_path = collection_path
+ else
+ @collection_path
+ end
+ end
+
+ def model_path(model_path = nil)
+ if model_path
+ @model_path = model_path
+ else
+ @model_path
+ end
+ end
+
+ def request_path(request_path = nil)
+ if request_path
+ @request_path = request_path
+ else
+ @request_path
+ end
+ end
+
def collections
@collections ||= []
end
def models
@@ -121,14 +107,26 @@
def recognizes(*args)
self.recognized_arguments.concat(args)
end
+ def model(model_name, options={})
+ models << [model_name, options]
+ end
+
def mocked_requests
@mocked_requests ||= []
end
+ def request(request_name, options={})
+ requests << [request_name, options]
+ end
+
+ def collection(collection_name, options={})
+ collections << [collection_name, options]
+ end
+
def validate_options(options={})
required_options = Cistern::Hash.slice(options, *required_arguments)
missing_required_options = required_arguments - required_options.keys
@@ -141,11 +139,69 @@
unless unrecognized_options.empty?
raise "Unrecognized options: #{unrecognized_options.inspect}"
end
end
+ def setup_requirements
+ @required ||= false
+ unless @required
+
+ # setup models
+ models.each do |model, options|
+ unless options[:require] == false
+ require(options[:require] || File.join(@model_path, model.to_s))
+ end
+
+ class_name = options[:class] || model.to_s.split("_").map(&:capitalize).join
+ singular_name = options[:model] || model.to_s.gsub("/", "_")
+
+ self.const_get(:Collections).module_eval <<-EOS, __FILE__, __LINE__
+ def #{singular_name}(attributes={})
+ #{service}::#{class_name}.new({connection: self}.merge(attributes))
+ end
+ EOS
+ end
+
+ # setup requests
+ requests.each do |request, options|
+ unless options[:require] == false || service::Real.method_defined?(request.to_s)
+ require(options[:require] || File.join(@request_path, request.to_s))
+ end
+
+ if service::Mock.method_defined?(request)
+ mocked_requests << request
+ else
+ service::Mock.module_eval <<-EOS, __FILE__, __LINE__
+ def #{request}(*args)
+ Cistern::Mock.not_implemented(request)
+ end
+ EOS
+ end
+ end
+
+ # setup collections
+ collections.each do |collection, options|
+ unless options[:require] == false
+ require(options[:require] || File.join(@collection_path || @model_path, collection.to_s))
+ end
+
+ class_name = collection.to_s.split("/").map(&:capitalize).join("::").split("_").map { |s| "#{s[0].upcase}#{s[1..-1]}" }.join
+ plural_name = options[:collection] || collection.to_s.gsub("/", "_")
+
+ self.const_get(:Collections).module_eval <<-EOS, __FILE__, __LINE__
+ def #{plural_name}(attributes={})
+ #{service}::#{class_name}.new({connection: self}.merge(attributes))
+ end
+ EOS
+ end
+
+ @required = true
+ end
+ end
+
def new(options={})
validate_options(options)
+ setup_requirements
self.const_get(self.mocking? ? :Mock : :Real).new(options)
end
def reset!