1
0
Fork 0
mirror of https://github.com/fog/fog.git synced 2022-11-09 13:51:43 -05:00
fog--fog/lib/fog/core/service.rb

197 lines
4.5 KiB
Ruby
Raw Normal View History

module Fog
def self.services
@services ||= {}
end
class Service
class Error < Fog::Errors::Error; end
class NotFound < Fog::Errors::NotFound; end
module Collections
def collections
service.collections
end
2011-02-09 19:22:32 -05:00
def mocked_requests
service.mocked_requests
end
def requests
service.requests
end
end
class << self
def inherited(child)
child.class_eval <<-EOS, __FILE__, __LINE__
class Error < Fog::Service::Error; end
class NotFound < Fog::Service::NotFound; end
module Collections
include Fog::Service::Collections
def service
#{child}
end
end
def self.service
#{child}
end
EOS
end
def new(options={})
# attempt to load credentials from config file
begin
default_credentials = Fog.credentials.reject {|key, value| !(recognized | requirements).include?(key)}
options = default_credentials.merge(options)
rescue LoadError
# if there are no configured credentials, do nothing
end
validate_options(options)
2011-09-06 14:38:03 -04:00
coerce_options(options)
setup_requirements
if Fog.mocking?
service::Mock.send(:include, service::Collections)
service::Mock.new(options)
else
service::Real.send(:include, service::Collections)
service::Real.new(options)
end
end
def setup_requirements
if superclass.respond_to?(:setup_requirements)
superclass.setup_requirements
end
2010-10-12 19:22:12 -04:00
@required ||= false
unless @required
for collection in collections
require [@model_path, collection].join('/')
constant = collection.to_s.split('_').map {|characters| characters[0...1].upcase << characters[1..-1]}.join('')
service::Collections.module_eval <<-EOS, __FILE__, __LINE__
def #{collection}(attributes = {})
#{service}::#{constant}.new({:connection => self}.merge(attributes))
end
EOS
end
for model in models
require [@model_path, model].join('/')
end
for request in requests
require [@request_path, request].join('/')
2011-02-09 19:22:32 -05:00
if service::Mock.method_defined?(request)
mocked_requests << request
else
service::Mock.module_eval <<-EOS, __FILE__, __LINE__
def #{request}(*args)
Fog::Mock.not_implemented
end
EOS
end
end
@required = true
end
end
def model_path(new_path)
@model_path = new_path
end
def collection(new_collection)
collections << new_collection
end
def collections
@collections ||= []
end
2011-09-06 14:38:03 -04:00
def coerce_options(options)
options.each do |key, value|
value_string = value.to_s.downcase
if value.nil?
options.delete(key)
elsif value == value_string.to_i.to_s
2011-09-06 14:38:03 -04:00
options[key] = value.to_i
else
options[key] = case value_string
when 'false'
false
when 'true'
true
else
value
end
end
end
end
2011-02-09 19:22:32 -05:00
def mocked_requests
@mocked_requests ||= []
end
def model(new_model)
models << new_model
end
def models
@models ||= []
end
def request_path(new_path)
@request_path = new_path
end
def request(new_request)
requests << new_request
end
def requests
@requests ||= []
end
def requires(*args)
requirements.concat(args)
end
def requirements
@requirements ||= []
end
def recognizes(*args)
recognized.concat(args)
end
def recognized
@recognized ||= []
end
def validate_options(options)
missing = requirements - options.keys
unless missing.empty?
raise ArgumentError, "Missing required arguments: #{missing.join(', ')}"
end
unless recognizes.empty?
unrecognized = options.keys - requirements - recognized
unless unrecognized.empty?
raise ArgumentError, "Unrecognized arguments: #{unrecognized.join(', ')}"
end
end
end
end
end
end