Skip to content
This repository has been archived by the owner on Aug 29, 2023. It is now read-only.

Commit

Permalink
Merge branch 'fix/4' into develop
Browse files Browse the repository at this point in the history
  • Loading branch information
relaxdiego committed Sep 3, 2013
2 parents 96e785f + 090f98b commit 515a807
Show file tree
Hide file tree
Showing 8 changed files with 277 additions and 88 deletions.
92 changes: 6 additions & 86 deletions bin/aviator
Original file line number Diff line number Diff line change
@@ -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
Expand All @@ -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
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]
puts Aviator::Describer.describe_aviator
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

Expand Down
1 change: 1 addition & 0 deletions lib/aviator/core.rb
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
require 'json'
require 'active_support/inflector'
require 'active_support/core_ext/hash/indifferent_access'
require 'faraday'

require "aviator/version"
Expand Down
1 change: 1 addition & 0 deletions lib/aviator/core/cli.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
require "aviator/core/cli/describer"
95 changes: 95 additions & 0 deletions lib/aviator/core/cli/describer.rb
Original file line number Diff line number Diff line change
@@ -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
12 changes: 10 additions & 2 deletions lib/aviator/core/service.rb
Original file line number Diff line number Diff line change
Expand Up @@ -85,8 +85,8 @@ def request(request_name, options={}, &params)
end


def requests
@requests
def request_classes
@request_classes
end


Expand Down Expand Up @@ -168,6 +168,14 @@ def load_requests
)

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


Expand Down
140 changes: 140 additions & 0 deletions test/aviator/core/cli/describer_test.rb
Original file line number Diff line number Diff line change
@@ -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
Loading

0 comments on commit 515a807

Please sign in to comment.