Merge branch 'fix/4' into develop
This commit is contained in:
		
							
								
								
									
										92
									
								
								bin/aviator
									
									
									
									
									
								
							
							
						
						
									
										92
									
								
								bin/aviator
									
									
									
									
									
								
							@@ -1,8 +1,8 @@
 | 
			
		||||
#!/usr/bin/env ruby
 | 
			
		||||
 | 
			
		||||
require 'bundler/setup'
 | 
			
		||||
require 'thor'
 | 
			
		||||
require 'aviator/core'
 | 
			
		||||
require 'aviator'
 | 
			
		||||
require 'aviator/core/cli'
 | 
			
		||||
 | 
			
		||||
module Aviator
 | 
			
		||||
module CLI
 | 
			
		||||
@@ -12,98 +12,18 @@ module CLI
 | 
			
		||||
    desc 'describe [PROVIDER] [SERVICE] [API_VERSION ENDPOINT_TYPE REQUEST_NAME]', 'Describes various parts of Aviator.'
 | 
			
		||||
    def describe(provider=nil, service=nil, api_version=nil, endpoint_type=nil, request=nil)
 | 
			
		||||
      if request
 | 
			
		||||
        describe_request provider, service, api_version, endpoint_type, request
 | 
			
		||||
        puts Aviator::Describer.describe_request(provider, service, api_version, endpoint_type, request)
 | 
			
		||||
      elsif service
 | 
			
		||||
        describe_service provider, service
 | 
			
		||||
        puts Aviator::Describer.describe_service(provider, service)
 | 
			
		||||
      elsif provider
 | 
			
		||||
        describe_provider provider
 | 
			
		||||
        puts Aviator::Describer.describe_provider(provider)
 | 
			
		||||
      else
 | 
			
		||||
        list_providers
 | 
			
		||||
        puts Aviator::Describer.describe_aviator
 | 
			
		||||
      end
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    private
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    def describe_provider(provider)
 | 
			
		||||
      puts "Available services from #{ provider }"
 | 
			
		||||
      
 | 
			
		||||
      Dir[Pathname.new(__FILE__).join('..', '..', 'lib', 'aviator', provider, '**')].each do |d|
 | 
			
		||||
        puts "  #{ Pathname.new(d).basename }"
 | 
			
		||||
      end
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    def describe_request(provider, service, api_version, endpoint_type, request_name)
 | 
			
		||||
      endpoints = Service.new(provider: provider, service: service).requests[api_version.to_sym]
 | 
			
		||||
      raise "Invalid API version #{ api_version }" unless endpoints
 | 
			
		||||
      
 | 
			
		||||
      requests = endpoints[endpoint_type.to_sym]
 | 
			
		||||
      raise "Invalid endpoint type #{ endpoint_type }" unless requests
 | 
			
		||||
      
 | 
			
		||||
      request = requests[request_name.to_sym]
 | 
			
		||||
      raise "Could not find request named #{ request_name }. Try a different api version or endpoint" unless request
 | 
			
		||||
      
 | 
			
		||||
      puts "Request: #{ request_name }"
 | 
			
		||||
      
 | 
			
		||||
      params = []
 | 
			
		||||
      
 | 
			
		||||
      request.optional_params.each do |param|
 | 
			
		||||
        params << [param, :optional]
 | 
			
		||||
      end
 | 
			
		||||
      
 | 
			
		||||
      request.required_params.each do |param|
 | 
			
		||||
        params << [param, :required]
 | 
			
		||||
      end
 | 
			
		||||
 | 
			
		||||
      params.sort! { |a,b| a[0].to_s <=> b[0].to_s }
 | 
			
		||||
      
 | 
			
		||||
      puts "\nParameters:"
 | 
			
		||||
      params.each do |param_desc|
 | 
			
		||||
        puts "  (#{ param_desc[1] }) #{ param_desc[0] }"
 | 
			
		||||
      end
 | 
			
		||||
      
 | 
			
		||||
      puts "\nSample Code:"
 | 
			
		||||
      print "  session.#{ service }_service.request(:#{ request_name }, endpoint_type: '#{ endpoint_type }')"
 | 
			
		||||
      if params
 | 
			
		||||
        puts " do |params|"
 | 
			
		||||
        params.each do |pair|
 | 
			
		||||
          puts "    params['#{ pair[0] }'] = val"
 | 
			
		||||
        end
 | 
			
		||||
        puts "  end"
 | 
			
		||||
      end
 | 
			
		||||
      
 | 
			
		||||
      puts "\nLinks:"
 | 
			
		||||
      request.links.each do |link|
 | 
			
		||||
        puts "  #{ link[:rel] }:"
 | 
			
		||||
        puts "    #{ link[:href] }\n"
 | 
			
		||||
      end
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    def describe_service(provider, service)
 | 
			
		||||
      puts "Available requests for #{ provider } #{ service }:"
 | 
			
		||||
      
 | 
			
		||||
      Service.new(provider: provider, service: service).requests.each do |api_version, endpoints|
 | 
			
		||||
        endpoints.each do |endpoint_type, requests|
 | 
			
		||||
          requests.each do |request_name, request_obj|
 | 
			
		||||
            puts "  #{ api_version} #{ endpoint_type } #{ request_name }"
 | 
			
		||||
          end
 | 
			
		||||
          puts ""
 | 
			
		||||
        end
 | 
			
		||||
      end
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    def list_providers
 | 
			
		||||
      puts "Available providers:"
 | 
			
		||||
      puts "  openstack"
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
end
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -1,5 +1,6 @@
 | 
			
		||||
require 'json'
 | 
			
		||||
require 'active_support/inflector'
 | 
			
		||||
require 'active_support/core_ext/hash/indifferent_access'
 | 
			
		||||
require 'faraday'
 | 
			
		||||
 | 
			
		||||
require "aviator/version"
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										1
									
								
								lib/aviator/core/cli.rb
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								lib/aviator/core/cli.rb
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1 @@
 | 
			
		||||
require "aviator/core/cli/describer"
 | 
			
		||||
							
								
								
									
										95
									
								
								lib/aviator/core/cli/describer.rb
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										95
									
								
								lib/aviator/core/cli/describer.rb
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,95 @@
 | 
			
		||||
module Aviator
 | 
			
		||||
  
 | 
			
		||||
  module Describer
 | 
			
		||||
 | 
			
		||||
    def self.describe_aviator
 | 
			
		||||
      provider_names = Pathname.new(__FILE__)
 | 
			
		||||
                        .join('..', '..', '..')
 | 
			
		||||
                        .children
 | 
			
		||||
                        .select{|c| c.directory? && c.basename.to_s != 'core' }
 | 
			
		||||
                        .map{|c| c.basename.to_s }
 | 
			
		||||
 | 
			
		||||
      str = "Available providers:\n"
 | 
			
		||||
 | 
			
		||||
      provider_names.each do |provider_name|
 | 
			
		||||
        str << "  #{ provider_name }\n"
 | 
			
		||||
      end
 | 
			
		||||
      
 | 
			
		||||
      str
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    def self.describe_provider(provider_name)
 | 
			
		||||
      service_names = Pathname.new(__FILE__)
 | 
			
		||||
                        .join('..', '..', '..', provider_name)
 | 
			
		||||
                        .children
 | 
			
		||||
                        .select{|c| c.directory? }
 | 
			
		||||
                        .map{|c| c.basename.to_s }
 | 
			
		||||
 | 
			
		||||
      str = "Available services for #{ provider_name }:\n"
 | 
			
		||||
 | 
			
		||||
      service_names.each do |service_name|
 | 
			
		||||
        str << "  #{ service_name }\n"
 | 
			
		||||
      end
 | 
			
		||||
      
 | 
			
		||||
      str
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    def self.describe_request(provider_name, service_name, api_version, endpoint_type, request_name)
 | 
			
		||||
      service = Aviator::Service.new provider: provider_name, service: service_name
 | 
			
		||||
      request_class = "Aviator::#{ provider_name.camelize }::#{ service_name.camelize }::"\
 | 
			
		||||
                      "#{ api_version.camelize }::#{ endpoint_type.camelize }::#{ request_name.camelize }".constantize
 | 
			
		||||
                      
 | 
			
		||||
      str = "Request: #{ request_name }\n\n"
 | 
			
		||||
      
 | 
			
		||||
      str << "Parameters:\n"
 | 
			
		||||
 | 
			
		||||
      params = request_class.optional_params.map{|p| [p, :required]} + 
 | 
			
		||||
               request_class.required_params.map{|p| [p, :optional]}
 | 
			
		||||
      
 | 
			
		||||
      params.sort{|a,b| a[0].to_s <=> b[0].to_s }.each do |param|
 | 
			
		||||
        str << "  (#{ param[1].to_s }) #{ param[0] }\n"
 | 
			
		||||
      end
 | 
			
		||||
      
 | 
			
		||||
      str << "\nSample Code:\n"
 | 
			
		||||
 | 
			
		||||
      str << "  session.#{ service_name }_service.request(:#{ request_name }, endpoint_type: '#{ request_class.endpoint_type }')"
 | 
			
		||||
      if params
 | 
			
		||||
        str << " do |params|\n"
 | 
			
		||||
        params.each do |pair|
 | 
			
		||||
          str << "     params['#{ pair[0] }'] = value\n"
 | 
			
		||||
        end
 | 
			
		||||
        str << "  end\n"
 | 
			
		||||
      end
 | 
			
		||||
      
 | 
			
		||||
      if request_class.links
 | 
			
		||||
        str << "\nLinks:\n"
 | 
			
		||||
        
 | 
			
		||||
        request_class.links.each do |link|
 | 
			
		||||
          str << "  #{ link[:rel] }:\n"
 | 
			
		||||
          str << "    #{ link[:href] }\n"
 | 
			
		||||
        end
 | 
			
		||||
      end
 | 
			
		||||
      
 | 
			
		||||
      str
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    def self.describe_service(provider_name, service_name)
 | 
			
		||||
      service = Aviator::Service.new(provider: provider_name, service: service_name)
 | 
			
		||||
      klasses = service.request_classes
 | 
			
		||||
      
 | 
			
		||||
      str = "Available requests for #{ provider_name } #{ service_name }_service:\n"
 | 
			
		||||
 | 
			
		||||
      klasses.each do |klass|
 | 
			
		||||
        str << "  #{ klass.api_version } #{ klass.endpoint_type } #{ klass.name.split('::').last.underscore }\n"
 | 
			
		||||
      end
 | 
			
		||||
      
 | 
			
		||||
      str
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
  end
 | 
			
		||||
  
 | 
			
		||||
end
 | 
			
		||||
@@ -85,8 +85,8 @@ module Aviator
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    def requests
 | 
			
		||||
      @requests
 | 
			
		||||
    def request_classes
 | 
			
		||||
      @request_classes
 | 
			
		||||
    end
 | 
			
		||||
    
 | 
			
		||||
    
 | 
			
		||||
@@ -168,6 +168,14 @@ module Aviator
 | 
			
		||||
                           )
 | 
			
		||||
 | 
			
		||||
      request_file_paths.each{ |path| require path }
 | 
			
		||||
      
 | 
			
		||||
      constant_parts = request_file_paths
 | 
			
		||||
                        .map{|rf| rf.to_s.match(/#{provider}\/#{service}\/([\w\/]+)\.rb$/) }
 | 
			
		||||
                        .map{|rf| rf[1].split('/').map{|c| c.camelize }.join('::') }
 | 
			
		||||
      
 | 
			
		||||
      @request_classes = constant_parts.map do |cp| 
 | 
			
		||||
        "Aviator::#{provider.camelize}::#{service.camelize}::#{cp}".constantize
 | 
			
		||||
      end
 | 
			
		||||
    end
 | 
			
		||||
    
 | 
			
		||||
    
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										140
									
								
								test/aviator/core/cli/describer_test.rb
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										140
									
								
								test/aviator/core/cli/describer_test.rb
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,140 @@
 | 
			
		||||
require 'test_helper'
 | 
			
		||||
 | 
			
		||||
class Aviator::Test
 | 
			
		||||
  
 | 
			
		||||
  describe 'aviator/core/cli/describer' do
 | 
			
		||||
    
 | 
			
		||||
    def get_provider_names
 | 
			
		||||
      Pathname.new(__FILE__)
 | 
			
		||||
        .join('..', '..', '..', '..', '..', 'lib', 'aviator')
 | 
			
		||||
        .children
 | 
			
		||||
        .select{|c| c.directory? && c.basename.to_s != 'core' }
 | 
			
		||||
        .map{|c| c.basename.to_s }
 | 
			
		||||
    end
 | 
			
		||||
    
 | 
			
		||||
    
 | 
			
		||||
    def get_random_entry(array)
 | 
			
		||||
      array[rand(array.length)]
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    def get_request_classes(provider_name, service_name)
 | 
			
		||||
      service = Aviator::Service.new(provider: provider_name, service: service_name)
 | 
			
		||||
      service.request_classes
 | 
			
		||||
    end
 | 
			
		||||
    
 | 
			
		||||
    
 | 
			
		||||
    def get_service_names(provider_name)
 | 
			
		||||
      Pathname.new(__FILE__)
 | 
			
		||||
        .join('..', '..', '..', '..', '..', 'lib', 'aviator', provider_name)
 | 
			
		||||
        .children
 | 
			
		||||
        .select{|c| c.directory? }
 | 
			
		||||
        .map{|c| c.basename.to_s }
 | 
			
		||||
    end
 | 
			
		||||
    
 | 
			
		||||
 | 
			
		||||
    describe '::describe_aviator' do
 | 
			
		||||
      
 | 
			
		||||
      it 'describes the aviator gem' do
 | 
			
		||||
        provider_names = get_provider_names
 | 
			
		||||
        
 | 
			
		||||
        display = "Available providers:\n"
 | 
			
		||||
      
 | 
			
		||||
        provider_names.each do |provider_name|
 | 
			
		||||
          display << "  #{ provider_name }\n"
 | 
			
		||||
        end
 | 
			
		||||
 | 
			
		||||
        Aviator::Describer.describe_aviator.must_equal display
 | 
			
		||||
      end
 | 
			
		||||
      
 | 
			
		||||
    end # describe '::describe_aviator'
 | 
			
		||||
    
 | 
			
		||||
    
 | 
			
		||||
    describe '::describe_provider' do
 | 
			
		||||
      
 | 
			
		||||
      it 'describes the given provider' do
 | 
			
		||||
        provider_name = get_random_entry(get_provider_names)
 | 
			
		||||
        service_names = get_service_names(provider_name)
 | 
			
		||||
        
 | 
			
		||||
        display = "Available services for #{ provider_name }:\n"
 | 
			
		||||
      
 | 
			
		||||
        service_names.each do |service_name|
 | 
			
		||||
          display << "  #{ service_name }\n"
 | 
			
		||||
        end
 | 
			
		||||
 | 
			
		||||
        Aviator::Describer.describe_provider('openstack').must_equal display
 | 
			
		||||
      end
 | 
			
		||||
      
 | 
			
		||||
    end # describe '::describe_provider'
 | 
			
		||||
    
 | 
			
		||||
    
 | 
			
		||||
    describe '::describe_service' do
 | 
			
		||||
      
 | 
			
		||||
      it 'describes a given service for a given provider' do
 | 
			
		||||
        provider_name   = get_random_entry(get_provider_names)
 | 
			
		||||
        service_name    = get_random_entry(get_service_names(provider_name))
 | 
			
		||||
        request_classes = get_request_classes(provider_name, service_name)
 | 
			
		||||
                
 | 
			
		||||
        display = "Available requests for #{ provider_name } #{ service_name }_service:\n"
 | 
			
		||||
 | 
			
		||||
        request_classes.each do |klass|
 | 
			
		||||
          display << "  #{ klass.api_version } #{ klass.endpoint_type } #{ klass.name.split('::').last.underscore }\n"
 | 
			
		||||
        end
 | 
			
		||||
      
 | 
			
		||||
        Aviator::Describer.describe_service(provider_name, service_name).must_equal display
 | 
			
		||||
      end
 | 
			
		||||
      
 | 
			
		||||
    end # describe '::describe_service'    
 | 
			
		||||
    
 | 
			
		||||
    
 | 
			
		||||
    describe '::describe_request' do
 | 
			
		||||
      
 | 
			
		||||
      it 'describes a given request' do
 | 
			
		||||
        provider_name = get_random_entry(get_provider_names)
 | 
			
		||||
        service_name  = get_random_entry(get_service_names(provider_name))
 | 
			
		||||
        request_class = get_random_entry(get_request_classes(provider_name, service_name))
 | 
			
		||||
        request_name  = request_class.name.split('::').last.underscore
 | 
			
		||||
        
 | 
			
		||||
        display  = "Request: #{ request_name }\n\n"
 | 
			
		||||
        
 | 
			
		||||
        display << "Parameters:\n"
 | 
			
		||||
 | 
			
		||||
        params = request_class.optional_params.map{|p| [p, :required]} + 
 | 
			
		||||
                 request_class.required_params.map{|p| [p, :optional]}
 | 
			
		||||
        
 | 
			
		||||
        params.sort{|a,b| a[0].to_s <=> b[0].to_s }.each do |param|
 | 
			
		||||
          display << "  (#{ param[1].to_s }) #{ param[0] }\n"
 | 
			
		||||
        end
 | 
			
		||||
        
 | 
			
		||||
        display << "\nSample Code:\n"
 | 
			
		||||
 | 
			
		||||
        display << "  session.#{ service_name }_service.request(:#{ request_name }, endpoint_type: '#{ request_class.endpoint_type }')"
 | 
			
		||||
        if params
 | 
			
		||||
          display << " do |params|\n"
 | 
			
		||||
          params.each do |pair|
 | 
			
		||||
            display << "     params['#{ pair[0] }'] = value\n"
 | 
			
		||||
          end
 | 
			
		||||
          display << "  end\n"
 | 
			
		||||
        end
 | 
			
		||||
        
 | 
			
		||||
        if request_class.links
 | 
			
		||||
          display << "\nLinks:\n"
 | 
			
		||||
          
 | 
			
		||||
          request_class.links.each do |link|
 | 
			
		||||
            display << "  #{ link[:rel] }:\n"
 | 
			
		||||
            display << "    #{ link[:href] }\n"
 | 
			
		||||
          end
 | 
			
		||||
        end
 | 
			
		||||
              
 | 
			
		||||
        Aviator::Describer.describe_request(
 | 
			
		||||
          provider_name, service_name, request_class.api_version.to_s, 
 | 
			
		||||
          request_class.endpoint_type.to_s, request_name
 | 
			
		||||
        ).must_equal display
 | 
			
		||||
      end
 | 
			
		||||
      
 | 
			
		||||
    end # describe '::describe_request'    
 | 
			
		||||
    
 | 
			
		||||
    
 | 
			
		||||
  end # describe 'aviator/core/cli/describe'
 | 
			
		||||
  
 | 
			
		||||
end # class Aviator::Test
 | 
			
		||||
@@ -127,6 +127,29 @@ class Aviator::Test
 | 
			
		||||
      end
 | 
			
		||||
 | 
			
		||||
    end
 | 
			
		||||
    
 | 
			
		||||
    
 | 
			
		||||
    describe '#request_classes' do
 | 
			
		||||
      
 | 
			
		||||
      it 'returns an array of the request classes' do
 | 
			
		||||
        provider_name = config[:provider]
 | 
			
		||||
        service_name  = config[:auth_service][:name]
 | 
			
		||||
        service_path  = Pathname.new(__FILE__).join(
 | 
			
		||||
                          '..', '..', '..', '..', 'lib', 'aviator', provider_name, service_name
 | 
			
		||||
                        ).expand_path
 | 
			
		||||
                       
 | 
			
		||||
        request_files = Pathname.glob(service_path.join('**', '*.rb'))
 | 
			
		||||
                          .map{|rf| rf.to_s.match(/#{provider_name}\/#{service_name}\/([\w\/]+)\.rb$/) }
 | 
			
		||||
                          .map{|rf| rf[1].split('/').map{|c| c.camelize }.join('::') }
 | 
			
		||||
        
 | 
			
		||||
        classes = request_files.map do |rf| 
 | 
			
		||||
          "Aviator::#{provider_name.camelize}::#{service_name.camelize}::#{rf}".constantize
 | 
			
		||||
        end
 | 
			
		||||
        
 | 
			
		||||
        service.request_classes.must_equal classes
 | 
			
		||||
      end
 | 
			
		||||
      
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    describe '#default_session_data=' do
 | 
			
		||||
 
 | 
			
		||||
@@ -36,3 +36,4 @@ Dir[Pathname.new(__FILE__).join('..', 'support', '*.rb')].each do |f|
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
require 'aviator'
 | 
			
		||||
require 'aviator/core/cli'
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user