From be1d3c59b386ddd5b43013bb639afd43e6c95331 Mon Sep 17 00:00:00 2001 From: Mark Maglana Date: Fri, 30 Aug 2013 09:18:16 -0700 Subject: [PATCH 01/12] Be even more permissive with activesupport versions --- aviator.gemspec | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/aviator.gemspec b/aviator.gemspec index 7926940..664dc6f 100644 --- a/aviator.gemspec +++ b/aviator.gemspec @@ -19,7 +19,7 @@ Gem::Specification.new do |spec| spec.require_paths = ["lib"] spec.add_dependency 'faraday', '~> 0.8.0' - spec.add_dependency 'activesupport', '>= 3.2.8', '<= 4.0.0' + spec.add_dependency 'activesupport', '>= 3.2.8' spec.add_dependency 'thor', '~> 0.18.1' spec.add_development_dependency "bundler", "~> 1.3" From cc590092daa7ca17bca2706c26a4678ba4d9e228 Mon Sep 17 00:00:00 2001 From: Mark Maglana Date: Fri, 30 Aug 2013 09:22:26 -0700 Subject: [PATCH 02/12] Fix namespacing of test reporter --- test/support/test_reporter.rb | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/test/support/test_reporter.rb b/test/support/test_reporter.rb index b49a200..0e99ee0 100644 --- a/test/support/test_reporter.rb +++ b/test/support/test_reporter.rb @@ -1,6 +1,7 @@ require "minitest/reporters" -module MiniTest::Reporters::RedStack +module Aviator +class Test class SpecReporter < MiniTest::Reporters::SpecReporter @@ -41,5 +42,6 @@ module MiniTest::Reporters::RedStack end end +end -MiniTest::Reporters.use! MiniTest::Reporters::RedStack::ProgressReporter.new \ No newline at end of file +MiniTest::Reporters.use! Aviator::Test::ProgressReporter.new \ No newline at end of file From aca729aba0f5500387e0453c994dad841905703c Mon Sep 17 00:00:00 2001 From: Mark Maglana Date: Fri, 30 Aug 2013 17:13:20 -0700 Subject: [PATCH 03/12] Initial work for #1 This changes how Service loads and finds the requests. Kernel::load was a good idea after all. The only drawback is that I have to change define_request to Aviator.define_request to avoid polluting the global namespace with the Aviator DSL. That's not a big deal though compared to the benefits it brings. Running the Service tests now allows SimpleCov to detect the request definition code. More to come in the next few commits. --- lib/aviator/core.rb | 1 + lib/aviator/core/dsl.rb | 37 +++++ lib/aviator/core/request.rb | 18 ++ lib/aviator/core/service.rb | 72 ++++---- .../compute/v2/public/list_images.rb | 7 +- .../identity/v2/admin/create_tenant.rb | 7 +- .../identity/v2/admin/list_tenants.rb | 7 +- .../identity/v2/public/create_token.rb | 7 +- .../identity/v2/public/list_tenants.rb | 7 +- test.rb | 83 ++++++++++ test/aviator/core/service_test.rb | 2 +- .../compute/v2/public/list_images_test.rb | 156 +++++++++--------- 12 files changed, 279 insertions(+), 125 deletions(-) create mode 100644 lib/aviator/core/dsl.rb create mode 100644 test.rb diff --git a/lib/aviator/core.rb b/lib/aviator/core.rb index 7c4138b..c8522ae 100644 --- a/lib/aviator/core.rb +++ b/lib/aviator/core.rb @@ -3,6 +3,7 @@ require 'active_support/inflector' require 'faraday' require "aviator/version" +require "aviator/core/dsl" require "aviator/core/request" require "aviator/core/response" require "aviator/core/service" diff --git a/lib/aviator/core/dsl.rb b/lib/aviator/core/dsl.rb new file mode 100644 index 0000000..96e08db --- /dev/null +++ b/lib/aviator/core/dsl.rb @@ -0,0 +1,37 @@ +module Aviator + + class << self + + def define_request(request_name, &block) + class_obj = Class.new(Request, &block) + + build_or_get_request_class( + Aviator, + class_obj, + + class_obj.provider, + class_obj.service, + class_obj.api_version, + class_obj.endpoint_type, + request_name + ) + end + + + private + + def build_or_get_request_class(base, obj, *hierarchy) + const_name = hierarchy.shift.to_s.camelize + + const = if base.const_defined?(const_name) + base.const_get(const_name) + else + base.const_set(const_name, (hierarchy.empty? ? obj : Module.new)) + end + + hierarchy.empty? ? const : build_or_get_request_class(const, obj, *hierarchy) + end + + end # class << self + +end # module Aviator \ No newline at end of file diff --git a/lib/aviator/core/request.rb b/lib/aviator/core/request.rb index 3a9ebf7..bf5e8bc 100644 --- a/lib/aviator/core/request.rb +++ b/lib/aviator/core/request.rb @@ -191,6 +191,15 @@ module Aviator end + def provider(value=nil) + if value + @provider = value + else + @provider + end + end + + def optional_params @optional_params ||= [] end @@ -206,6 +215,15 @@ module Aviator end + def service(value=nil) + if value + @service = value + else + @service + end + end + + def url? instance_methods.include? :url end diff --git a/lib/aviator/core/service.rb b/lib/aviator/core/service.rb index f55e70f..eb20617 100644 --- a/lib/aviator/core/service.rb +++ b/lib/aviator/core/service.rb @@ -49,25 +49,25 @@ module Aviator # request is initialized it doesn't get polluted by instance variables and methods # of the containing class. This builder class makes that happen by being a # scope gate for the file. See Metaprogramming Ruby, specifically on blocks and scope - class RequestBuilder - - # This method gets called by the request file eval'd in self.build below - def define_request(request_name, &block) - klass = Class.new(Aviator::Request, &block) - return klass, request_name - end - - - def self.build(path_to_request_file) - clean_room = new - clean_room.instance_eval(File.read(path_to_request_file)) - end - - - private_class_method :new - - end - + # class RequestBuilder + # + # # This method gets called by the request file eval'd in self.build below + # def define_request(request_name, &block) + # klass = Class.new(Aviator::Request, &block) + # return klass, request_name + # end + # + # + # def self.build(path_to_request_file) + # # clean_room = new + # # clean_room.instance_eval(File.read(path_to_request_file)) + # Kernel.load(path_to_request_file, true) + # end + # + # + # private_class_method :new + # + # end attr_accessor :default_session_data @@ -134,19 +134,27 @@ module Aviator # Candidate for extraction to aviator/openstack def find_request(name, session_data, endpoint_type=nil) endpoint_types = if endpoint_type - [endpoint_type.to_sym] + [endpoint_type.to_s.camelize] else - [:public, :admin] + ['Public', 'Admin'] end - version = infer_version(session_data) + namespace = Aviator.const_get(provider.camelize) + .const_get(service.camelize) - return nil unless version && requests[version] + version = infer_version(session_data).to_s.camelize + + return nil unless version && namespace.const_defined?(version) + + namespace = namespace.const_get(version) endpoint_types.each do |endpoint_type| - next unless requests[version][endpoint_type] - pair = requests[version][endpoint_type].find{ |k, v| k == name } - return pair[1] unless pair.nil? + name = name.to_s.camelize + + next unless namespace.const_defined?(endpoint_type) + next unless namespace.const_get(endpoint_type).const_defined?(name) + + return namespace.const_get(endpoint_type).const_get(name) end nil @@ -182,22 +190,14 @@ module Aviator ).expand_path ) - @requests ||= {} - - request_file_paths.each do |path_to_file| - klass, request_name = RequestBuilder.build(path_to_file) - - api_version = @requests[klass.api_version] ||= {} - endpoint_type = api_version[klass.endpoint_type] ||= {} - endpoint_type[request_name] = klass - end + request_file_paths.each{ |path| Kernel.load(path, true) } end def log_file @log_file end - + end end \ No newline at end of file diff --git a/lib/aviator/openstack/compute/v2/public/list_images.rb b/lib/aviator/openstack/compute/v2/public/list_images.rb index f0042b5..a79497a 100644 --- a/lib/aviator/openstack/compute/v2/public/list_images.rb +++ b/lib/aviator/openstack/compute/v2/public/list_images.rb @@ -1,7 +1,10 @@ -define_request :list_images do +Aviator.define_request :list_images do - endpoint_type :public + provider :openstack + service :compute api_version :v2 + endpoint_type :public + http_method :get link_to 'documentation', diff --git a/lib/aviator/openstack/identity/v2/admin/create_tenant.rb b/lib/aviator/openstack/identity/v2/admin/create_tenant.rb index 37c591d..ab14e9b 100644 --- a/lib/aviator/openstack/identity/v2/admin/create_tenant.rb +++ b/lib/aviator/openstack/identity/v2/admin/create_tenant.rb @@ -1,7 +1,10 @@ -define_request :create_tenant do +Aviator.define_request :create_tenant do - endpoint_type :admin + provider :openstack + service :identity api_version :v2 + endpoint_type :admin + http_method :post link_to 'documentation', diff --git a/lib/aviator/openstack/identity/v2/admin/list_tenants.rb b/lib/aviator/openstack/identity/v2/admin/list_tenants.rb index cac9664..ecf7a6c 100644 --- a/lib/aviator/openstack/identity/v2/admin/list_tenants.rb +++ b/lib/aviator/openstack/identity/v2/admin/list_tenants.rb @@ -1,7 +1,10 @@ -define_request :list_tenants do +Aviator.define_request :list_tenants do - endpoint_type :admin + provider :openstack + service :identity api_version :v2 + endpoint_type :admin + http_method :get link_to 'documentation', diff --git a/lib/aviator/openstack/identity/v2/public/create_token.rb b/lib/aviator/openstack/identity/v2/public/create_token.rb index ccd029e..0dd78a2 100644 --- a/lib/aviator/openstack/identity/v2/public/create_token.rb +++ b/lib/aviator/openstack/identity/v2/public/create_token.rb @@ -1,9 +1,12 @@ -define_request :create_token do +Aviator.define_request :create_token do anonymous - endpoint_type :public + provider :openstack + service :identity api_version :v2 + endpoint_type :public + http_method :post link_to 'documentation', diff --git a/lib/aviator/openstack/identity/v2/public/list_tenants.rb b/lib/aviator/openstack/identity/v2/public/list_tenants.rb index b8a6bc4..a647d04 100644 --- a/lib/aviator/openstack/identity/v2/public/list_tenants.rb +++ b/lib/aviator/openstack/identity/v2/public/list_tenants.rb @@ -1,7 +1,10 @@ -define_request :list_tenants do +Aviator.define_request :list_tenants do - endpoint_type :public + provider :openstack + service :identity api_version :v2 + endpoint_type :public + http_method :get link_to 'documentation', diff --git a/test.rb b/test.rb new file mode 100644 index 0000000..d7325a0 --- /dev/null +++ b/test.rb @@ -0,0 +1,83 @@ +require 'pry' +require 'active_support/inflector' + +module Aviator + + class << self + + def define_request(request_name, &block) + class_obj = Class.new(Object, &block) + + build_or_get_request_class( + Aviator, + class_obj, + + class_obj.provider, + class_obj.service, + class_obj.api_version, + class_obj.endpoint_type, + request_name + ) + end + + + private + + def build_or_get_request_class(base, obj, *hierarchy) + const_name = hierarchy.shift.to_s.classify + + const = if base.const_defined?(const_name) + base.const_get(const_name) + else + base.const_set(const_name, (hierarchy.empty? ? obj : Module.new)) + end + + hierarchy.empty? ? const : build_or_get_request_class(const, obj, *hierarchy) + end + + end # class << self + +end # module Aviator + +test1 = Aviator.define_request :test1 do + + def self.provider + :openstack + end + + def self.service + :identity + end + + def self.api_version + :v2 + end + + def self.endpoint_type + :admin + end + +end + + +test2 = Aviator.define_request :test2 do + + def self.provider + :openstack + end + + def self.service + :identity + end + + def self.api_version + :v3 + end + + def self.endpoint_type + :admin + end + +end + +binding.pry \ No newline at end of file diff --git a/test/aviator/core/service_test.rb b/test/aviator/core/service_test.rb index 3c61138..c7f91bb 100644 --- a/test/aviator/core/service_test.rb +++ b/test/aviator/core/service_test.rb @@ -119,7 +119,7 @@ class Aviator::Test it 'accepts an endpoint type option for selecting a specific request' do default_session_data = do_auth_request.body s = service(default_session_data) - + response1 = s.request :list_tenants, endpoint_type: 'admin' response2 = s.request :list_tenants, endpoint_type: 'public' diff --git a/test/aviator/openstack/compute/v2/public/list_images_test.rb b/test/aviator/openstack/compute/v2/public/list_images_test.rb index 4138e96..ce41606 100644 --- a/test/aviator/openstack/compute/v2/public/list_images_test.rb +++ b/test/aviator/openstack/compute/v2/public/list_images_test.rb @@ -33,7 +33,7 @@ class Aviator::Test def klass path = helper.request_path('compute', 'v2', 'public', 'list_images.rb') - klass, request_name = Aviator::Service::RequestBuilder.build(path) + klass, request_name = Aviator::Service.load_request(path) klass end @@ -94,85 +94,85 @@ class Aviator::Test end - validate :url do - session_data = new_session_data - service_spec = session_data[:access][:serviceCatalog].find{|s| s[:type] == 'compute' } - url = "#{ service_spec[:endpoints][0][:publicURL] }/images" - - params = [ - [ :details, true ], - [ :name, 'cirros-0.3.1-x86_64-uec-ramdisk' ], - [ :status, 'ACTIVE' ], - [ :type, 'application/vnd.openstack.image' ] - ] - - url += "/detail" if params.first[1] - - filters = [] - - params[1, params.length-1].each { |pair| filters << "#{ pair[0] }=#{ pair[1] }" } - - url += "?#{ filters.join('&') }" unless filters.empty? - - request = klass.new(session_data) do |p| - params.each { |pair| p[pair[0]] = pair[1] } - end - - - request.url.must_equal url - end + # validate :url do + # session_data = new_session_data + # service_spec = session_data[:access][:serviceCatalog].find{|s| s[:type] == 'compute' } + # url = "#{ service_spec[:endpoints][0][:publicURL] }/images" + # + # params = [ + # [ :details, true ], + # [ :name, 'cirros-0.3.1-x86_64-uec-ramdisk' ], + # [ :status, 'ACTIVE' ], + # [ :type, 'application/vnd.openstack.image' ] + # ] + # + # url += "/detail" if params.first[1] + # + # filters = [] + # + # params[1, params.length-1].each { |pair| filters << "#{ pair[0] }=#{ pair[1] }" } + # + # url += "?#{ filters.join('&') }" unless filters.empty? + # + # request = klass.new(session_data) do |p| + # params.each { |pair| p[pair[0]] = pair[1] } + # end + # + # + # request.url.must_equal url + # end - validate_response 'no parameters are provided' do - service = Aviator::Service.new( - provider: 'openstack', - service: 'compute', - default_session_data: new_session_data - ) - - response = service.request :list_images - - response.status.must_equal 200 - response.body.wont_be_nil - response.headers.wont_be_nil - end - - - validate_response 'parameters are invalid' do - service = Aviator::Service.new( - provider: 'openstack', - service: 'compute', - default_session_data: new_session_data - ) - - response = service.request :list_images do |params| - params[:name] = "nonexistentimagenameherpderp" - end - - response.status.must_equal 200 - response.body.wont_be_nil - response.body[:images].length.must_equal 0 - response.headers.wont_be_nil - end - - - validate_response 'parameters are valid' do - service = Aviator::Service.new( - provider: 'openstack', - service: 'compute', - default_session_data: new_session_data - ) - - response = service.request :list_images do |params| - params[:details] = true - params[:name] = "cirros-0.3.1-x86_64-uec-ramdisk" - end - - response.status.must_equal 200 - response.body.wont_be_nil - response.body[:images].length.must_equal 1 - response.headers.wont_be_nil - end + # validate_response 'no parameters are provided' do + # service = Aviator::Service.new( + # provider: 'openstack', + # service: 'compute', + # default_session_data: new_session_data + # ) + # + # response = service.request :list_images + # + # response.status.must_equal 200 + # response.body.wont_be_nil + # response.headers.wont_be_nil + # end + # + # + # validate_response 'parameters are invalid' do + # service = Aviator::Service.new( + # provider: 'openstack', + # service: 'compute', + # default_session_data: new_session_data + # ) + # + # response = service.request :list_images do |params| + # params[:name] = "nonexistentimagenameherpderp" + # end + # + # response.status.must_equal 200 + # response.body.wont_be_nil + # response.body[:images].length.must_equal 0 + # response.headers.wont_be_nil + # end + # + # + # validate_response 'parameters are valid' do + # service = Aviator::Service.new( + # provider: 'openstack', + # service: 'compute', + # default_session_data: new_session_data + # ) + # + # response = service.request :list_images do |params| + # params[:details] = true + # params[:name] = "cirros-0.3.1-x86_64-uec-ramdisk" + # end + # + # response.status.must_equal 200 + # response.body.wont_be_nil + # response.body[:images].length.must_equal 1 + # response.headers.wont_be_nil + # end end From 3523beb99af83a54992c341dbd8ed2a249b18cb8 Mon Sep 17 00:00:00 2001 From: Mark Maglana Date: Fri, 30 Aug 2013 22:13:32 -0700 Subject: [PATCH 04/12] Load request files at exit --- test/test_helper.rb | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/test/test_helper.rb b/test/test_helper.rb index 2476939..449ca9a 100644 --- a/test/test_helper.rb +++ b/test/test_helper.rb @@ -33,3 +33,20 @@ Dir[Pathname.new(__FILE__).join('..', 'support', '*.rb')].each do |f| end require 'aviator/core' + +at_exit do + # Load all requests so that they are reported by SimpleCov + request_file_paths = Dir.glob(Pathname.new(__FILE__).join( + '..', '..', 'lib', 'aviator', + 'openstack', '**', '*.rb' + ).expand_path + ) + + request_file_paths.each do |path| + # Ignore the load errors since all we want is for + # SimpleCov to detect the request file. + begin + Kernel.load(path, true) + rescue e; end + end +end \ No newline at end of file From fde23a143e7e6a808ee76a88e7c0701901fc53c6 Mon Sep 17 00:00:00 2001 From: Mark Maglana Date: Fri, 30 Aug 2013 22:13:51 -0700 Subject: [PATCH 05/12] Group together files in SimpleCov --- test/test_helper.rb | 3 +++ 1 file changed, 3 insertions(+) diff --git a/test/test_helper.rb b/test/test_helper.rb index 449ca9a..1021cea 100644 --- a/test/test_helper.rb +++ b/test/test_helper.rb @@ -12,6 +12,9 @@ SimpleCov.formatter = SimpleCov::Formatter::MultiFormatter[ ] SimpleCov.start do add_filter '/test/' + + add_group 'Core', 'lib/aviator/core' + add_group 'OpenStack', 'lib/aviator/openstack' end require 'minitest/autorun' From 03b7880d9b28939813447be792f3b99905cab93f Mon Sep 17 00:00:00 2001 From: Mark Maglana Date: Fri, 30 Aug 2013 22:55:38 -0700 Subject: [PATCH 06/12] Rename request test helper and add class loader --- ...quest_test_helper.rb => request_helper.rb} | 23 +++++++++++++++++-- 1 file changed, 21 insertions(+), 2 deletions(-) rename test/support/{openstack_request_test_helper.rb => request_helper.rb} (85%) diff --git a/test/support/openstack_request_test_helper.rb b/test/support/request_helper.rb similarity index 85% rename from test/support/openstack_request_test_helper.rb rename to test/support/request_helper.rb index 968e33f..723b6f6 100644 --- a/test/support/openstack_request_test_helper.rb +++ b/test/support/request_helper.rb @@ -44,12 +44,31 @@ class Test auth_service: Environment.openstack_admin[:auth_service] } end + + + def get_request_class(parent, *path) + const_name = path.shift.to_s.camelize.gsub(/\.rb$/, '') + + const = if parent.const_defined?(const_name) + parent.const_get(const_name) + else + raise "Could not find constant #{ base.name }::#{ const_name }" + end + + path.empty? ? const : get_request_class(const, *path) + end + + + def load_request(*path) + Kernel.load(request_path(*path), true) + get_request_class(Aviator, *path) + end def request_path(*path) - Pathname.new(__FILE__).join('..', '..', '..', 'lib', 'aviator', 'openstack').expand_path.join(*path) + Pathname.new(__FILE__).join('..', '..', '..', 'lib', 'aviator').expand_path.join(*path) end - + end end From b46dbe5c8ac58fd654071556ad4ac188d804c6f5 Mon Sep 17 00:00:00 2001 From: Mark Maglana Date: Fri, 30 Aug 2013 22:56:02 -0700 Subject: [PATCH 07/12] Update klass methods in request tests --- test/aviator/openstack/compute/v2/public/list_images_test.rb | 4 +--- .../aviator/openstack/identity/v2/admin/create_tenant_test.rb | 4 +--- .../aviator/openstack/identity/v2/public/create_token_test.rb | 4 +--- 3 files changed, 3 insertions(+), 9 deletions(-) diff --git a/test/aviator/openstack/compute/v2/public/list_images_test.rb b/test/aviator/openstack/compute/v2/public/list_images_test.rb index ce41606..fb7a440 100644 --- a/test/aviator/openstack/compute/v2/public/list_images_test.rb +++ b/test/aviator/openstack/compute/v2/public/list_images_test.rb @@ -32,9 +32,7 @@ class Aviator::Test def klass - path = helper.request_path('compute', 'v2', 'public', 'list_images.rb') - klass, request_name = Aviator::Service.load_request(path) - klass + @klass ||= helper.load_request('openstack', 'compute', 'v2', 'public', 'list_images.rb') end diff --git a/test/aviator/openstack/identity/v2/admin/create_tenant_test.rb b/test/aviator/openstack/identity/v2/admin/create_tenant_test.rb index 8dc60d1..7139e74 100644 --- a/test/aviator/openstack/identity/v2/admin/create_tenant_test.rb +++ b/test/aviator/openstack/identity/v2/admin/create_tenant_test.rb @@ -36,9 +36,7 @@ class Aviator::Test def klass - path = helper.request_path('identity', 'v2', 'admin', 'create_tenant.rb') - klass, request_name = Aviator::Service::RequestBuilder.build(path) - klass + @klass ||= helper.load_request('openstack', 'identity', 'v2', 'admin', 'create_tenant.rb') end diff --git a/test/aviator/openstack/identity/v2/public/create_token_test.rb b/test/aviator/openstack/identity/v2/public/create_token_test.rb index 62fe94d..37767e0 100644 --- a/test/aviator/openstack/identity/v2/public/create_token_test.rb +++ b/test/aviator/openstack/identity/v2/public/create_token_test.rb @@ -18,9 +18,7 @@ class Aviator::Test def klass - path = helper.request_path('identity', 'v2', 'public', 'create_token.rb') - klass, request_name = Aviator::Service::RequestBuilder.build(path) - klass + @klass ||= helper.load_request('openstack', 'identity', 'v2', 'public', 'create_token.rb') end From daa42f592b25e56419e9bc58fedc90d2fc5b30f4 Mon Sep 17 00:00:00 2001 From: Mark Maglana Date: Fri, 30 Aug 2013 23:23:38 -0700 Subject: [PATCH 08/12] Be more efficient in loading/finding the request class for testing --- test/support/request_helper.rb | 16 +++++++++++++--- test/test_helper.rb | 17 ----------------- 2 files changed, 13 insertions(+), 20 deletions(-) diff --git a/test/support/request_helper.rb b/test/support/request_helper.rb index 723b6f6..2aa9e19 100644 --- a/test/support/request_helper.rb +++ b/test/support/request_helper.rb @@ -52,7 +52,7 @@ class Test const = if parent.const_defined?(const_name) parent.const_get(const_name) else - raise "Could not find constant #{ base.name }::#{ const_name }" + raise "Constant #{ const_name } could not be found." end path.empty? ? const : get_request_class(const, *path) @@ -60,8 +60,18 @@ class Test def load_request(*path) - Kernel.load(request_path(*path), true) - get_request_class(Aviator, *path) + request_class = nil + + begin + request_class = get_request_class(Aviator, *path) + rescue; end + + if request_class + request_class + else + Kernel.load(request_path(*path), true) + get_request_class(Aviator, *path) || raise("Request class for #{ path.join('/') } couldn't be found. Is it defined properly?") + end end diff --git a/test/test_helper.rb b/test/test_helper.rb index 1021cea..3c51e84 100644 --- a/test/test_helper.rb +++ b/test/test_helper.rb @@ -36,20 +36,3 @@ Dir[Pathname.new(__FILE__).join('..', 'support', '*.rb')].each do |f| end require 'aviator/core' - -at_exit do - # Load all requests so that they are reported by SimpleCov - request_file_paths = Dir.glob(Pathname.new(__FILE__).join( - '..', '..', 'lib', 'aviator', - 'openstack', '**', '*.rb' - ).expand_path - ) - - request_file_paths.each do |path| - # Ignore the load errors since all we want is for - # SimpleCov to detect the request file. - begin - Kernel.load(path, true) - rescue e; end - end -end \ No newline at end of file From f2212eb52ab9cda50a447246492fe9d127650673 Mon Sep 17 00:00:00 2001 From: Mark Maglana Date: Fri, 30 Aug 2013 23:23:56 -0700 Subject: [PATCH 09/12] Uncomment the previously commented-out tests --- .../compute/v2/public/list_images_test.rb | 154 +++++++++--------- 1 file changed, 77 insertions(+), 77 deletions(-) diff --git a/test/aviator/openstack/compute/v2/public/list_images_test.rb b/test/aviator/openstack/compute/v2/public/list_images_test.rb index fb7a440..20b156d 100644 --- a/test/aviator/openstack/compute/v2/public/list_images_test.rb +++ b/test/aviator/openstack/compute/v2/public/list_images_test.rb @@ -92,85 +92,85 @@ class Aviator::Test end - # validate :url do - # session_data = new_session_data - # service_spec = session_data[:access][:serviceCatalog].find{|s| s[:type] == 'compute' } - # url = "#{ service_spec[:endpoints][0][:publicURL] }/images" - # - # params = [ - # [ :details, true ], - # [ :name, 'cirros-0.3.1-x86_64-uec-ramdisk' ], - # [ :status, 'ACTIVE' ], - # [ :type, 'application/vnd.openstack.image' ] - # ] - # - # url += "/detail" if params.first[1] - # - # filters = [] - # - # params[1, params.length-1].each { |pair| filters << "#{ pair[0] }=#{ pair[1] }" } - # - # url += "?#{ filters.join('&') }" unless filters.empty? - # - # request = klass.new(session_data) do |p| - # params.each { |pair| p[pair[0]] = pair[1] } - # end - # - # - # request.url.must_equal url - # end + validate :url do + session_data = new_session_data + service_spec = session_data[:access][:serviceCatalog].find{|s| s[:type] == 'compute' } + url = "#{ service_spec[:endpoints][0][:publicURL] }/images" + + params = [ + [ :details, true ], + [ :name, 'cirros-0.3.1-x86_64-uec-ramdisk' ], + [ :status, 'ACTIVE' ], + [ :type, 'application/vnd.openstack.image' ] + ] + + url += "/detail" if params.first[1] + + filters = [] + + params[1, params.length-1].each { |pair| filters << "#{ pair[0] }=#{ pair[1] }" } + + url += "?#{ filters.join('&') }" unless filters.empty? + + request = klass.new(session_data) do |p| + params.each { |pair| p[pair[0]] = pair[1] } + end + + + request.url.must_equal url + end - # validate_response 'no parameters are provided' do - # service = Aviator::Service.new( - # provider: 'openstack', - # service: 'compute', - # default_session_data: new_session_data - # ) - # - # response = service.request :list_images - # - # response.status.must_equal 200 - # response.body.wont_be_nil - # response.headers.wont_be_nil - # end - # - # - # validate_response 'parameters are invalid' do - # service = Aviator::Service.new( - # provider: 'openstack', - # service: 'compute', - # default_session_data: new_session_data - # ) - # - # response = service.request :list_images do |params| - # params[:name] = "nonexistentimagenameherpderp" - # end - # - # response.status.must_equal 200 - # response.body.wont_be_nil - # response.body[:images].length.must_equal 0 - # response.headers.wont_be_nil - # end - # - # - # validate_response 'parameters are valid' do - # service = Aviator::Service.new( - # provider: 'openstack', - # service: 'compute', - # default_session_data: new_session_data - # ) - # - # response = service.request :list_images do |params| - # params[:details] = true - # params[:name] = "cirros-0.3.1-x86_64-uec-ramdisk" - # end - # - # response.status.must_equal 200 - # response.body.wont_be_nil - # response.body[:images].length.must_equal 1 - # response.headers.wont_be_nil - # end + validate_response 'no parameters are provided' do + service = Aviator::Service.new( + provider: 'openstack', + service: 'compute', + default_session_data: new_session_data + ) + + response = service.request :list_images + + response.status.must_equal 200 + response.body.wont_be_nil + response.headers.wont_be_nil + end + + + validate_response 'parameters are invalid' do + service = Aviator::Service.new( + provider: 'openstack', + service: 'compute', + default_session_data: new_session_data + ) + + response = service.request :list_images do |params| + params[:name] = "nonexistentimagenameherpderp" + end + + response.status.must_equal 200 + response.body.wont_be_nil + response.body[:images].length.must_equal 0 + response.headers.wont_be_nil + end + + + validate_response 'parameters are valid' do + service = Aviator::Service.new( + provider: 'openstack', + service: 'compute', + default_session_data: new_session_data + ) + + response = service.request :list_images do |params| + params[:details] = true + params[:name] = "cirros-0.3.1-x86_64-uec-ramdisk" + end + + response.status.must_equal 200 + response.body.wont_be_nil + response.body[:images].length.must_equal 1 + response.headers.wont_be_nil + end end From 6c5036826f1c70b8be7fff85c6d9af57810532de Mon Sep 17 00:00:00 2001 From: Mark Maglana Date: Sat, 31 Aug 2013 12:36:44 -0700 Subject: [PATCH 10/12] Use require instead of Kernel.load to fix #1 --- lib/aviator/core/service.rb | 2 +- test/aviator/core/service_test.rb | 54 +++++++++++++++---------------- test/support/request_helper.rb | 2 +- 3 files changed, 29 insertions(+), 29 deletions(-) diff --git a/lib/aviator/core/service.rb b/lib/aviator/core/service.rb index eb20617..ceb5c7f 100644 --- a/lib/aviator/core/service.rb +++ b/lib/aviator/core/service.rb @@ -190,7 +190,7 @@ module Aviator ).expand_path ) - request_file_paths.each{ |path| Kernel.load(path, true) } + request_file_paths.each{ |path| require path } end diff --git a/test/aviator/core/service_test.rb b/test/aviator/core/service_test.rb index c7f91bb..280d512 100644 --- a/test/aviator/core/service_test.rb +++ b/test/aviator/core/service_test.rb @@ -22,21 +22,21 @@ class Aviator::Test end end end - - + + def klass Aviator::Service end - + def service(default_session_data=nil) options = { provider: config[:provider], service: config[:auth_service][:name] } - + options[:default_session_data] = default_session_data unless default_session_data.nil? - + klass.new(options) end @@ -45,7 +45,7 @@ class Aviator::Test it 'can find the correct request based on bootstrapped session data' do response = do_auth_request - + response.must_be_instance_of Aviator::Response response.request.api_version.must_equal config[:auth_service][:api_version].to_sym end @@ -67,26 +67,26 @@ class Aviator::Test params[k] = v end end - + response.must_be_instance_of Aviator::Response response.request.api_version.must_equal :v2 response.status.must_equal 200 end - - + + it 'can find the correct request based on non-bootstrapped session data' do session_data = do_auth_request.body - + response = service.request :create_tenant, session_data: session_data do |params| params.name = 'Test Project' params.description = 'This is a test' params.enabled = true end - + response.status.must_equal 200 end - - + + it 'uses the default session data if session data is not provided' do default_session_data = do_auth_request.body s = service(default_session_data) @@ -96,11 +96,11 @@ class Aviator::Test params.description = 'This is a test' params.enabled = true end - + response.status.must_equal 200 end - - + + it 'raises a SessionDataNotProvidedError if there is no session data' do the_method = lambda do service.request :create_tenant do |params| @@ -109,28 +109,28 @@ class Aviator::Test params.enabled = true end end - + the_method.must_raise Aviator::Service::SessionDataNotProvidedError error = the_method.call rescue $! error.message.wont_be_nil end - - + + it 'accepts an endpoint type option for selecting a specific request' do default_session_data = do_auth_request.body s = service(default_session_data) response1 = s.request :list_tenants, endpoint_type: 'admin' response2 = s.request :list_tenants, endpoint_type: 'public' - + response1.request.url.wont_equal response2.request.url end end - - + + describe '#default_session_data=' do - + it 'sets the service\'s default session data' do bootstrap = { auth_service: { @@ -139,18 +139,18 @@ class Aviator::Test request: 'create_token' } } - + svc = service(bootstrap) session_data_1 = svc.default_session_data session_data_2 = do_auth_request.body - + svc.default_session_data = session_data_2 - + svc.default_session_data.wont_equal session_data_1 svc.default_session_data.must_equal session_data_2 end - + end end diff --git a/test/support/request_helper.rb b/test/support/request_helper.rb index 2aa9e19..e31709a 100644 --- a/test/support/request_helper.rb +++ b/test/support/request_helper.rb @@ -69,7 +69,7 @@ class Test if request_class request_class else - Kernel.load(request_path(*path), true) + require request_path(*path) get_request_class(Aviator, *path) || raise("Request class for #{ path.join('/') } couldn't be found. Is it defined properly?") end end From 095ad9591b5150a4f17ab4459e55d695f863fadd Mon Sep 17 00:00:00 2001 From: Mark Maglana Date: Sun, 1 Sep 2013 00:41:18 -0700 Subject: [PATCH 11/12] Remove extraneous code. --- lib/aviator/core/service.rb | 23 ----------------------- test/support/request_helper.rb | 14 ++------------ 2 files changed, 2 insertions(+), 35 deletions(-) diff --git a/lib/aviator/core/service.rb b/lib/aviator/core/service.rb index ceb5c7f..15f934e 100644 --- a/lib/aviator/core/service.rb +++ b/lib/aviator/core/service.rb @@ -45,29 +45,6 @@ module Aviator end end - # Because we define requests in a flattened scope, we want to make sure that when each - # request is initialized it doesn't get polluted by instance variables and methods - # of the containing class. This builder class makes that happen by being a - # scope gate for the file. See Metaprogramming Ruby, specifically on blocks and scope - # class RequestBuilder - # - # # This method gets called by the request file eval'd in self.build below - # def define_request(request_name, &block) - # klass = Class.new(Aviator::Request, &block) - # return klass, request_name - # end - # - # - # def self.build(path_to_request_file) - # # clean_room = new - # # clean_room.instance_eval(File.read(path_to_request_file)) - # Kernel.load(path_to_request_file, true) - # end - # - # - # private_class_method :new - # - # end attr_accessor :default_session_data diff --git a/test/support/request_helper.rb b/test/support/request_helper.rb index e31709a..28889c7 100644 --- a/test/support/request_helper.rb +++ b/test/support/request_helper.rb @@ -60,18 +60,8 @@ class Test def load_request(*path) - request_class = nil - - begin - request_class = get_request_class(Aviator, *path) - rescue; end - - if request_class - request_class - else - require request_path(*path) - get_request_class(Aviator, *path) || raise("Request class for #{ path.join('/') } couldn't be found. Is it defined properly?") - end + require request_path(*path) + get_request_class(Aviator, *path) end From d6eb993abde31354029bcb6c04792eca11f6930d Mon Sep 17 00:00:00 2001 From: Mark Maglana Date: Sun, 1 Sep 2013 09:27:00 -0700 Subject: [PATCH 12/12] Allow `require aviator` as an alternative to `aviator/core` --- lib/aviator.rb | 1 + test/test_helper.rb | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) create mode 100644 lib/aviator.rb diff --git a/lib/aviator.rb b/lib/aviator.rb new file mode 100644 index 0000000..d9c6cc4 --- /dev/null +++ b/lib/aviator.rb @@ -0,0 +1 @@ +require 'aviator/core' diff --git a/test/test_helper.rb b/test/test_helper.rb index 3c51e84..8964cd3 100644 --- a/test/test_helper.rb +++ b/test/test_helper.rb @@ -35,4 +35,4 @@ Dir[Pathname.new(__FILE__).join('..', 'support', '*.rb')].each do |f| require f end -require 'aviator/core' +require 'aviator'