diff --git a/aviator.gemspec b/aviator.gemspec index bf7718d..0ad3146 100644 --- a/aviator.gemspec +++ b/aviator.gemspec @@ -21,7 +21,8 @@ Gem::Specification.new do |spec| spec.add_dependency 'faraday', '~> 0.8.0' spec.add_dependency 'activesupport', '>= 3.2.8' spec.add_dependency 'thor', '~> 0.18.1' - + spec.add_dependency 'terminal-table', '>= 1.4.5' + spec.add_development_dependency "bundler", "~> 1.3" spec.add_development_dependency "rake" spec.add_development_dependency 'rb-fsevent', '~> 0.9.0' diff --git a/lib/aviator/core/cli.rb b/lib/aviator/core/cli.rb index 184ced1..cd937d0 100644 --- a/lib/aviator/core/cli.rb +++ b/lib/aviator/core/cli.rb @@ -1 +1,2 @@ +require "terminal-table" require "aviator/core/cli/describer" diff --git a/lib/aviator/core/cli/describer.rb b/lib/aviator/core/cli/describer.rb index cc29a5e..6d28099 100644 --- a/lib/aviator/core/cli/describer.rb +++ b/lib/aviator/core/cli/describer.rb @@ -1,37 +1,25 @@ module Aviator - - module Describer + + class 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| + service_names(provider_name).each do |service_name| str << " #{ service_name }\n" end - + str end @@ -40,56 +28,119 @@ module Aviator 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, :optional]} + - request_class.required_params.map{|p| [p, :required]} - - params.sort{|a,b| a[0].to_s <=> b[0].to_s }.each do |param| - str << " (#{ param[1].to_s }) #{ param[0] }\n" + display = "Request: #{ request_name }\n" + + + # Build the parameters + params = request_class.optional_params.map{|p| [p, false]} + + request_class.required_params.map{|p| [p, true]} + + aliases = request_class.param_aliases + + if params.length > 0 + display << "\n" + + headings = ['NAME', 'REQUIRED'] + + headings << 'ALIAS' if aliases.length > 0 + + rows = [] + params.sort{|a,b| a[0].to_s <=> b[0].to_s }.each do |param| + row = [ param[0], param[1] ? 'Y' : 'N' ] + + if aliases.length > 0 + row << (aliases.find{|a,p| p == param[0] } || [''])[0] + end + + rows << row + end + + widths = [ + rows.map{|row| row[0].length }.max, + rows.map{|row| row[1].length }.max + ] + + widths << rows.map{|row| row[2].length }.max if aliases.length > 0 + + table = Terminal::Table.new(headings: headings, rows: rows) + + table.align_column(1, :center) + + display << "Parameters:\n" + display << " " + table.to_s.split("\n").join("\n ") + display << "\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" + + # Build the sample code + display << "\nSample Code:\n" + + display << " session.#{ service_name }_service.request(:#{ request_name })" + + if params && params.length > 0 + display << " do |params|\n" params.each do |pair| - str << " params['#{ pair[0] }'] = value\n" + display << " params.#{ (aliases.find{|a,p| p == pair[0] } || pair)[0] } = value\n" end - str << " end\n" + display << " end" end - - if request_class.links - str << "\nLinks:\n" - + + display << "\n" + + + # Build the links + if request_class.links && request_class.links.length > 0 + display << "\nLinks:\n" + request_class.links.each do |link| - str << " #{ link[:rel] }:\n" - str << " #{ link[:href] }\n" + display << " #{ link[:rel] }:\n" + display << " #{ link[:href] }\n" end end - - str + + display 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| + request_classes(provider_name, service_name).each do |klass| str << " #{ klass.api_version } #{ klass.endpoint_type } #{ klass.name.split('::').last.underscore }\n" end - + str end + class < b[0].to_s }.each do |param| - display << " (#{ param[1].to_s }) #{ param[0] }\n" - end - - display << "\nSample Code:\n" + it 'shows the request name and sample code' do + provider = provider_names.first + service = service_names(provider).first + request_name = 'sample_request1' - 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 + request_class = build_request(provider, service, request_name) + + expected = <<-EOF +Request: #{ request_name } + +Sample Code: + session.#{ service }_service.request(:#{ request_name }) +EOF + + output = klass.describe_request( + provider, + service, + request_class.api_version.to_s, + request_class.endpoint_type.to_s, + request_name.to_s + ) + + output.must_equal expected end - - end # describe '::describe_request' - - + + + it "shows parameters when provided" do + provider = provider_names.first + service = service_names(provider).first + request_name = 'sample_request2' + + request_class = build_request(provider, service, request_name) do + param :theParam, required: true + param :another, required: false + end + + expected = <<-EOF +Request: #{ request_name } + +Parameters: + +----------+----------+ + | NAME | REQUIRED | + +----------+----------+ + | another | N | + | theParam | Y | + +----------+----------+ + +Sample Code: + session.#{ service }_service.request(:#{ request_name }) do |params| + params.another = value + params.theParam = value + end +EOF + + output = klass.describe_request( + provider, + service, + request_class.api_version.to_s, + request_class.endpoint_type.to_s, + request_name.to_s + ) + + output.must_equal expected + end + + + it "display aliases when available" do + provider = provider_names.first + service = service_names(provider).first + request_name = 'sample_request3' + + request_class = build_request(provider, service, request_name) do + param :theParam, required: true, alias: :the_param + param :anotherParam, required: false, alias: :another_param + end + + expected = <<-EOF +Request: #{ request_name } + +Parameters: + +--------------+----------+---------------+ + | NAME | REQUIRED | ALIAS | + +--------------+----------+---------------+ + | anotherParam | N | another_param | + | theParam | Y | the_param | + +--------------+----------+---------------+ + +Sample Code: + session.#{ service }_service.request(:#{ request_name }) do |params| + params.another_param = value + params.the_param = value + end +EOF + + output = klass.describe_request( + provider, + service, + request_class.api_version.to_s, + request_class.endpoint_type.to_s, + request_name.to_s + ) + + output.must_equal expected + end + + + it "display links when available" do + provider = provider_names.first + service = service_names(provider).first + request_name = 'sample_request4' + + request_class = build_request(provider, service, request_name) do + param :theParam, required: true, alias: :the_param + param :anotherParam, required: false, alias: :another_param + + link 'link1', 'http://www.link.com' + end + + expected = <<-EOF +Request: #{ request_name } + +Parameters: + +--------------+----------+---------------+ + | NAME | REQUIRED | ALIAS | + +--------------+----------+---------------+ + | anotherParam | N | another_param | + | theParam | Y | the_param | + +--------------+----------+---------------+ + +Sample Code: + session.#{ service }_service.request(:#{ request_name }) do |params| + params.another_param = value + params.the_param = value + end + +Links: + link1: + http://www.link.com +EOF + + output = klass.describe_request( + provider, + service, + request_class.api_version.to_s, + request_class.endpoint_type.to_s, + request_name.to_s + ) + + output.must_equal expected + end + + + end # describe '::describe_request' + + end # describe 'aviator/core/cli/describe' - + end # class Aviator::Test