fog--fog/lib/fog/service.rb

130 lines
2.9 KiB
Ruby

module Fog
class Service
class Error < Fog::Errors::Error; end
class NotFound < Fog::Errors::NotFound; end
module Collections
def collections
service.collections
end
def requests
service.requests
end
end
class << self
def inherited(child)
child.class_eval <<-EOS, __FILE__, __LINE__
module Collections
include Fog::Service::Collections
def service
#{child}
end
end
def self.service
#{child}
end
EOS
end
def new(options={})
if Fog.bin
default_credentials = Fog.credentials.reject {|key, value| !requirements.include?(key)}
options = default_credentials.merge(options)
end
missing = []
for requirement in requirements
missing << requirement unless options[requirement]
end
unless missing.empty?
if missing.length == 1
raise(ArgumentError, [missing.first, "is required for this service"].join(' '))
else
raise(ArgumentError, [missing[0...-1].join(", "), 'and', missing[-1], 'are required for this service'].join(' '))
end
end
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('/')
end
@required = true
end
if Fog.mocking?
service::Mock.new(options)
else
service::Real.new(options)
end
end
def model_path(new_path)
@model_path = new_path
end
def collection(new_collection)
collections << new_collection
end
def collections
@collections ||= []
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 reset_data(keys=Mock.data.keys)
Mock.reset_data(keys)
end
end
end
end