From 3ea111c7f82f35a85d8bb205cdb7f070e979e27d Mon Sep 17 00:00:00 2001 From: geemus Date: Thu, 16 Dec 2010 15:31:24 -0800 Subject: [PATCH] [core] fix/cleanup requires/recognizes for service closes #113 --- fog.gemspec | 1 - lib/fog/aws/cdn.rb | 4 +-- lib/fog/aws/compute.rb | 4 +-- lib/fog/aws/elb.rb | 4 +-- lib/fog/aws/iam.rb | 4 +-- lib/fog/aws/simpledb.rb | 4 +-- lib/fog/aws/storage.rb | 4 +-- lib/fog/bluebox/compute.rb | 4 +-- lib/fog/brightbox/compute.rb | 4 +-- lib/fog/core.rb | 1 - lib/fog/core/service.rb | 61 ++++++++++++++++++++-------------- lib/fog/go_grid/compute.rb | 4 +-- lib/fog/google/storage.rb | 4 +-- lib/fog/linode/compute.rb | 4 +-- lib/fog/local/storage.rb | 2 +- lib/fog/new_servers/compute.rb | 4 +-- lib/fog/rackspace/cdn.rb | 4 +-- lib/fog/rackspace/compute.rb | 4 +-- lib/fog/rackspace/storage.rb | 4 +-- lib/fog/slicehost/compute.rb | 4 +-- lib/fog/terremark/ecloud.rb | 6 ++-- lib/fog/vcloud.rb | 4 +-- lib/fog/zerigo/compute.rb | 4 +-- 23 files changed, 75 insertions(+), 68 deletions(-) diff --git a/fog.gemspec b/fog.gemspec index 303be8bcf..e8a1aa2aa 100644 --- a/fog.gemspec +++ b/fog.gemspec @@ -47,7 +47,6 @@ Gem::Specification.new do |s| s.add_dependency('formatador', '>=0.0.16') s.add_dependency('json') s.add_dependency('mime-types') - s.add_dependency('named-parameters', '>=0.0.17') s.add_dependency('net-ssh', '>=2.0.23') s.add_dependency('nokogiri', '>=1.4.4') s.add_dependency('ruby-hmac') diff --git a/lib/fog/aws/cdn.rb b/lib/fog/aws/cdn.rb index a1b4211dc..f07ce3308 100644 --- a/lib/fog/aws/cdn.rb +++ b/lib/fog/aws/cdn.rb @@ -2,8 +2,8 @@ module Fog module AWS class CDN < Fog::Service - requires :aws_access_key_id, :aws_secret_access_key, &inject_parameter_specs - recognizes :host, :path, :port, :scheme, :version, :persistent, &inject_parameter_specs + requires :aws_access_key_id, :aws_secret_access_key + recognizes :host, :path, :port, :scheme, :version, :persistent model_path 'fog/aws/models/cdn' diff --git a/lib/fog/aws/compute.rb b/lib/fog/aws/compute.rb index 2884ad5d0..b0610361c 100644 --- a/lib/fog/aws/compute.rb +++ b/lib/fog/aws/compute.rb @@ -2,8 +2,8 @@ module Fog module AWS class Compute < Fog::Service - requires :aws_access_key_id, :aws_secret_access_key, &inject_parameter_specs - recognizes :endpoint, :region, :host, :path, :port, :scheme, :persistent, &inject_parameter_specs + requires :aws_access_key_id, :aws_secret_access_key + recognizes :endpoint, :region, :host, :path, :port, :scheme, :persistent model_path 'fog/aws/models/compute' model :address diff --git a/lib/fog/aws/elb.rb b/lib/fog/aws/elb.rb index 6caada1fd..e28b8f17f 100644 --- a/lib/fog/aws/elb.rb +++ b/lib/fog/aws/elb.rb @@ -2,8 +2,8 @@ module Fog module AWS class ELB < Fog::Service - requires :aws_access_key_id, :aws_secret_access_key, &inject_parameter_specs - recognizes :region, :host, :path, :port, :scheme, :persistent, &inject_parameter_specs + requires :aws_access_key_id, :aws_secret_access_key + recognizes :region, :host, :path, :port, :scheme, :persistent request_path 'fog/aws/requests/elb' request :create_load_balancer diff --git a/lib/fog/aws/iam.rb b/lib/fog/aws/iam.rb index 29610c74f..5ae5d43c3 100644 --- a/lib/fog/aws/iam.rb +++ b/lib/fog/aws/iam.rb @@ -2,8 +2,8 @@ module Fog module AWS class IAM < Fog::Service - requires :aws_access_key_id, :aws_secret_access_key, &inject_parameter_specs - recognizes :host, :path, :port, :scheme, :persistent, &inject_parameter_specs + requires :aws_access_key_id, :aws_secret_access_key + recognizes :host, :path, :port, :scheme, :persistent request_path 'fog/aws/requests/iam' request :add_user_to_group diff --git a/lib/fog/aws/simpledb.rb b/lib/fog/aws/simpledb.rb index aef73230c..13018d8e6 100644 --- a/lib/fog/aws/simpledb.rb +++ b/lib/fog/aws/simpledb.rb @@ -2,8 +2,8 @@ module Fog module AWS class SimpleDB < Fog::Service - requires :aws_access_key_id, :aws_secret_access_key, &inject_parameter_specs - recognizes :host, :nil_string, :path, :port, :scheme, :persistent, &inject_parameter_specs + requires :aws_access_key_id, :aws_secret_access_key + recognizes :host, :nil_string, :path, :port, :scheme, :persistent request_path 'fog/aws/requests/simpledb' request :batch_put_attributes diff --git a/lib/fog/aws/storage.rb b/lib/fog/aws/storage.rb index 3cd734018..c916c258b 100644 --- a/lib/fog/aws/storage.rb +++ b/lib/fog/aws/storage.rb @@ -2,8 +2,8 @@ module Fog module AWS class Storage < Fog::Service - requires :aws_access_key_id, :aws_secret_access_key, &inject_parameter_specs - recognizes :endpoint, :region, :host, :path, :port, :scheme, :persistent, &inject_parameter_specs + requires :aws_access_key_id, :aws_secret_access_key + recognizes :endpoint, :region, :host, :path, :port, :scheme, :persistent model_path 'fog/aws/models/storage' collection :directories diff --git a/lib/fog/bluebox/compute.rb b/lib/fog/bluebox/compute.rb index bcc84e4de..d543e9fc3 100644 --- a/lib/fog/bluebox/compute.rb +++ b/lib/fog/bluebox/compute.rb @@ -2,8 +2,8 @@ module Fog module Bluebox class Compute < Fog::Service - requires :bluebox_api_key, :bluebox_customer_id, &inject_parameter_specs - recognizes :bluebox_host, :bluebox_port, :bluebox_scheme, :persistent, &inject_parameter_specs + requires :bluebox_api_key, :bluebox_customer_id + recognizes :bluebox_host, :bluebox_port, :bluebox_scheme, :persistent model_path 'fog/bluebox/models/compute' model :flavor diff --git a/lib/fog/brightbox/compute.rb b/lib/fog/brightbox/compute.rb index 0c79d93e5..c83046a1c 100644 --- a/lib/fog/brightbox/compute.rb +++ b/lib/fog/brightbox/compute.rb @@ -4,8 +4,8 @@ module Fog API_URL = "https://api.gb1.brightbox.com/" - requires :brightbox_client_id, :brightbox_secret, &inject_parameter_specs - recognizes :brightbox_auth_url, :brightbox_api_url, &inject_parameter_specs + requires :brightbox_client_id, :brightbox_secret + recognizes :brightbox_auth_url, :brightbox_api_url model_path 'fog/brightbox/models/compute' model :account # Singular resource, no collection diff --git a/lib/fog/core.rb b/lib/fog/core.rb index 5b71c63da..2031a5840 100644 --- a/lib/fog/core.rb +++ b/lib/fog/core.rb @@ -12,7 +12,6 @@ require 'excon' require 'formatador' require 'time' require 'timeout' -require 'named-parameters' # internal core dependencies require 'fog/core/attributes' diff --git a/lib/fog/core/service.rb b/lib/fog/core/service.rb index ace4c7b76..ad1e8d188 100644 --- a/lib/fog/core/service.rb +++ b/lib/fog/core/service.rb @@ -18,26 +18,6 @@ module Fog class << self - # this is to accomodate Real implementations of Service subclasses - # NOTE: it might be good to enforce parameter specs to Mock classes as well. - def inject_parameter_specs - lambda do |spec| - implementation = "Real" - self.const_set(implementation, Class.new) unless self.const_defined? implementation - realclass = self.const_get implementation - - if realclass.declared_parameters_for(:'self.new', :required).empty? - required = declared_parameters_for(:'self.new', :required) - realclass.send(:requires, *required) - end - - if realclass.declared_parameters_for(:'self.new', :optional).empty? - optional = declared_parameters_for(:'self.new', :optional) - realclass.send(:recognizes, *optional) - end - end - end - def inherited(child) child.class_eval <<-EOS, __FILE__, __LINE__ module Collections @@ -54,19 +34,16 @@ module Fog EOS end - def requirements - declared_parameters_for :'self.new', :required - end - def new(options={}) # attempt to load credentials from config file begin - default_credentials = filter_parameters(Fog.credentials) + 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) setup_requirements if Fog.mocking? @@ -136,10 +113,44 @@ module Fog @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 reset_data(keys=Mock.data.keys) Mock.reset_data(keys) end + def reset_data(keys=Mock.data.keys) + Mock.reset_data(keys) + 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 diff --git a/lib/fog/go_grid/compute.rb b/lib/fog/go_grid/compute.rb index b00dab4f8..f71b85b23 100644 --- a/lib/fog/go_grid/compute.rb +++ b/lib/fog/go_grid/compute.rb @@ -2,8 +2,8 @@ module Fog module GoGrid class Compute < Fog::Service - requires :go_grid_api_key, :go_grid_shared_secret, &inject_parameter_specs - recognizes :host, :path, :port, :scheme, :persistent, &inject_parameter_specs + requires :go_grid_api_key, :go_grid_shared_secret + recognizes :host, :path, :port, :scheme, :persistent model_path 'fog/go_grid/models/compute' model :image diff --git a/lib/fog/google/storage.rb b/lib/fog/google/storage.rb index d44ec3e4e..030408032 100644 --- a/lib/fog/google/storage.rb +++ b/lib/fog/google/storage.rb @@ -2,8 +2,8 @@ module Fog module Google class Storage < Fog::Service - requires :google_storage_access_key_id, :google_storage_secret_access_key, &inject_parameter_specs - recognizes :host, :port, :scheme, :persistent, &inject_parameter_specs + requires :google_storage_access_key_id, :google_storage_secret_access_key + recognizes :host, :port, :scheme, :persistent model_path 'fog/google/models/storage' collection :directories diff --git a/lib/fog/linode/compute.rb b/lib/fog/linode/compute.rb index e3f97dc45..df452d1b6 100644 --- a/lib/fog/linode/compute.rb +++ b/lib/fog/linode/compute.rb @@ -2,8 +2,8 @@ module Fog module Linode class Compute < Fog::Service - requires :linode_api_key, &inject_parameter_specs - recognizes :port, :scheme, :persistent, &inject_parameter_specs + requires :linode_api_key + recognizes :port, :scheme, :persistent model_path 'fog/linode/models/compute' diff --git a/lib/fog/local/storage.rb b/lib/fog/local/storage.rb index 7487fba73..13419b2ba 100644 --- a/lib/fog/local/storage.rb +++ b/lib/fog/local/storage.rb @@ -2,7 +2,7 @@ module Fog module Local class Storage < Fog::Service - requires :local_root, &inject_parameter_specs + requires :local_root model_path 'fog/local/models/storage' collection :directories diff --git a/lib/fog/new_servers/compute.rb b/lib/fog/new_servers/compute.rb index 9120fe670..70aafba6a 100644 --- a/lib/fog/new_servers/compute.rb +++ b/lib/fog/new_servers/compute.rb @@ -4,8 +4,8 @@ module Fog module NewServers class Compute < Fog::Service - requires :new_servers_password, :new_servers_username, &inject_parameter_specs - recognizes :host, :port, :scheme, :persistent, &inject_parameter_specs + requires :new_servers_password, :new_servers_username + recognizes :host, :port, :scheme, :persistent model_path 'fog/new_servers/models/compute' diff --git a/lib/fog/rackspace/cdn.rb b/lib/fog/rackspace/cdn.rb index 8a8130824..b3ed31101 100644 --- a/lib/fog/rackspace/cdn.rb +++ b/lib/fog/rackspace/cdn.rb @@ -2,8 +2,8 @@ module Fog module Rackspace class CDN < Fog::Service - requires :rackspace_api_key, :rackspace_username, &inject_parameter_specs - recognizes :rackspace_auth_url, :persistent, &inject_parameter_specs + requires :rackspace_api_key, :rackspace_username + recognizes :rackspace_auth_url, :persistent model_path 'fog/rackspace/models/cdn' diff --git a/lib/fog/rackspace/compute.rb b/lib/fog/rackspace/compute.rb index 562628a3d..a07d8a656 100644 --- a/lib/fog/rackspace/compute.rb +++ b/lib/fog/rackspace/compute.rb @@ -2,8 +2,8 @@ module Fog module Rackspace class Compute < Fog::Service - requires :rackspace_api_key, :rackspace_username, &inject_parameter_specs - recognizes :rackspace_auth_url, :persistent, &inject_parameter_specs + requires :rackspace_api_key, :rackspace_username + recognizes :rackspace_auth_url, :persistent model_path 'fog/rackspace/models/compute' model :flavor diff --git a/lib/fog/rackspace/storage.rb b/lib/fog/rackspace/storage.rb index 6d853f6e2..f700bf638 100644 --- a/lib/fog/rackspace/storage.rb +++ b/lib/fog/rackspace/storage.rb @@ -2,8 +2,8 @@ module Fog module Rackspace class Storage < Fog::Service - requires :rackspace_api_key, :rackspace_username, &inject_parameter_specs - recognizes :rackspace_auth_url, :persistent, &inject_parameter_specs + requires :rackspace_api_key, :rackspace_username + recognizes :rackspace_auth_url, :persistent model_path 'fog/rackspace/models/storage' model :directory diff --git a/lib/fog/slicehost/compute.rb b/lib/fog/slicehost/compute.rb index 88e62fa71..b0f46ff72 100644 --- a/lib/fog/slicehost/compute.rb +++ b/lib/fog/slicehost/compute.rb @@ -2,8 +2,8 @@ module Fog module Slicehost class Compute < Fog::Service - requires :slicehost_password, &inject_parameter_specs - recognizes :host, :port, :scheme, :persistent, &inject_parameter_specs + requires :slicehost_password + recognizes :host, :port, :scheme, :persistent model_path 'fog/slicehost/models/compute' model :flavor diff --git a/lib/fog/terremark/ecloud.rb b/lib/fog/terremark/ecloud.rb index fbe68ba8e..32d6fb3d4 100644 --- a/lib/fog/terremark/ecloud.rb +++ b/lib/fog/terremark/ecloud.rb @@ -32,10 +32,8 @@ module Fog end class Real - # NOTE: When this vbecomes a service, take care to pass the &inject_parameter_specs - # block on call to requires and recognizes - requires :terremark_ecloud_password, :terremark_ecloud_username - recognizes :host, :path, :port, :scheme, :persistent + # requires :terremark_ecloud_password, :terremark_ecloud_username + # recognizes :host, :path, :port, :scheme, :persistent include Fog::Terremark::Shared::Real include Fog::Terremark::Shared::Parser diff --git a/lib/fog/vcloud.rb b/lib/fog/vcloud.rb index 99626132b..461b6e1c7 100644 --- a/lib/fog/vcloud.rb +++ b/lib/fog/vcloud.rb @@ -21,8 +21,8 @@ end module Fog class Vcloud < Fog::Service - requires :username, :password, :module, :versions_uri, &inject_parameter_specs - recognizes :version, :persistent, &inject_parameter_specs + requires :username, :password, :module, :versions_uri + recognizes :version, :persistent model_path 'fog/vcloud/models' model :vdc diff --git a/lib/fog/zerigo/compute.rb b/lib/fog/zerigo/compute.rb index d6b09838f..8aedc8943 100644 --- a/lib/fog/zerigo/compute.rb +++ b/lib/fog/zerigo/compute.rb @@ -2,8 +2,8 @@ module Fog module Zerigo class Compute < Fog::Service - requires :zerigo_email, :zerigo_password, &inject_parameter_specs - recognizes :timeout, :persistent, &inject_parameter_specs + requires :zerigo_email, :zerigo_password + recognizes :timeout, :persistent # model_path 'fog/zerigo/models/compute' # model :server