]> git.donarmstrong.com Git - dsa-puppet.git/blob - 3rdparty/modules/aviator/feature/aviator/core/cli/describer.rb
add aimonb/aviator to 3rdparty
[dsa-puppet.git] / 3rdparty / modules / aviator / feature / aviator / core / cli / describer.rb
1 module Aviator
2
3   class Describer
4
5     def self.describe_aviator
6       str = "Available providers:\n"
7
8       provider_names.each do |provider_name|
9         str << "  #{ provider_name }\n"
10       end
11
12       str
13     end
14
15
16     def self.describe_provider(provider_name)
17       str = "Available services for #{ provider_name }:\n"
18
19       service_names(provider_name).each do |service_name|
20         str << "  #{ service_name }\n"
21       end
22
23       str
24     end
25
26
27     def self.describe_request(provider_name, service_name, api_version, endpoint_type, request_name)
28       service = Aviator::Service.new :provider => provider_name, :service => service_name
29       request_class = "Aviator::#{ provider_name.camelize }::#{ service_name.camelize }::"\
30                       "#{ api_version.camelize }::#{ endpoint_type.camelize }::#{ request_name.camelize }".constantize
31
32       display = ":Request => #{ request_name }\n"
33
34
35       # Build the parameters
36       params = request_class.optional_params.map{|p| [p, false]} +
37                request_class.required_params.map{|p| [p, true]}
38
39       aliases = request_class.param_aliases
40
41       if params.length > 0
42         display << "\n"
43
44         headings = ['NAME', 'REQUIRED?']
45
46         headings << 'ALIAS' if aliases.length > 0
47
48         rows = []
49         params.sort{|a,b| a[0].to_s <=> b[0].to_s }.each do |param|
50           row = [ param[0], param[1] ? 'Y' : 'N' ]
51
52           if aliases.length > 0
53             row << (aliases.find{|a,p| p == param[0] } || [''])[0]
54           end
55
56           rows << row
57         end
58
59         widths = [
60           rows.map{|row| row[0].to_s.length }.max,
61           rows.map{|row| row[1].to_s.length }.max
62         ]
63
64         widths << rows.map{|row| row[2].to_s.length }.max if aliases.length > 0
65
66         table = Terminal::Table.new(:headings => headings, :rows => rows)
67
68         table.align_column(1, :center)
69
70         display << "Parameters:\n"
71         display << " " + table.to_s.split("\n").join("\n ")
72         display << "\n"
73       end
74
75
76       # Build the sample code
77       display << "\nSample Code:\n"
78
79       display << "  session.#{ service_name }_service.request(:#{ request_name })"
80
81       if params && params.length > 0
82         display << " do |params|\n"
83         params.each do |pair|
84           display << "    params.#{ (aliases.find{|a,p| p == pair[0] } || pair)[0] } = value\n"
85         end
86         display << "  end"
87       end
88
89       display << "\n"
90
91
92       # Build the links
93       if request_class.links && request_class.links.length > 0
94         display << "\nLinks:\n"
95
96         request_class.links.each do |link|
97           display << "  #{ link[:rel] }:\n"
98           display << "    #{ link[:href] }\n"
99         end
100       end
101
102       display
103     end
104
105
106     def self.describe_service(provider_name, service_name)
107       str = "Available requests for #{ provider_name } #{ service_name }_service:\n"
108
109       request_classes(provider_name, service_name).each do |klass|
110         str << "  #{ klass.api_version } #{ klass.endpoint_type } #{ klass.name.split('::').last.underscore }\n"
111       end
112
113       str
114     end
115
116
117     class <<self
118       private
119
120       def provider_names
121         Pathname.new(__FILE__) \
122           .join('..', '..', '..') \
123           .children \
124           .select{|c| c.directory? && c.basename.to_s != 'core' } \
125           .map{|c| c.basename.to_s }
126       end
127
128
129       def request_classes(provider_name, service_name)
130         service = Aviator::Service.new(:provider => provider_name, :service => service_name)
131         service.request_classes
132       end
133
134
135       def service_names(provider_name)
136         Pathname.new(__FILE__) \
137           .join('..', '..', '..', provider_name) \
138           .children \
139           .select{|c| c.directory? } \
140           .map{|c| c.basename.to_s }
141       end
142     end
143
144   end
145
146 end