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,97 +12,17 @@ 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
|
||||
@@ -129,6 +129,29 @@ class Aviator::Test
|
||||
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
|
||||
|
||||
it 'sets the service\'s 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