bbcloud 0.11.2 → 0.12.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (198) hide show
  1. data/.gitignore +3 -2
  2. data/Gemfile +3 -0
  3. data/README +11 -1
  4. data/README.rdoc +11 -1
  5. data/Rakefile +12 -0
  6. data/bbcloud.gemspec +10 -10
  7. data/bin/brightbox-accounts +7 -2
  8. data/bin/brightbox-cloudips +7 -2
  9. data/bin/brightbox-config +7 -2
  10. data/bin/brightbox-images +7 -2
  11. data/bin/brightbox-lbs +7 -2
  12. data/bin/brightbox-servers +7 -2
  13. data/bin/brightbox-types +7 -2
  14. data/bin/brightbox-users +7 -2
  15. data/bin/brightbox-zones +7 -2
  16. data/lib/bbcloud.rb +43 -0
  17. data/lib/bbcloud/accounts.rb +5 -3
  18. data/lib/bbcloud/command_generator.rb +50 -0
  19. data/lib/bbcloud/commands/accounts-list.rb +13 -11
  20. data/lib/bbcloud/commands/accounts-reset-ftp-password.rb +26 -23
  21. data/lib/bbcloud/commands/accounts-show.rb +20 -16
  22. data/lib/bbcloud/commands/cloudips-create.rb +16 -14
  23. data/lib/bbcloud/commands/cloudips-destroy.rb +29 -26
  24. data/lib/bbcloud/commands/cloudips-list.rb +13 -11
  25. data/lib/bbcloud/commands/cloudips-map.rb +48 -46
  26. data/lib/bbcloud/commands/cloudips-show.rb +15 -12
  27. data/lib/bbcloud/commands/cloudips-unmap.rb +28 -25
  28. data/lib/bbcloud/commands/config-client-add.rb +33 -31
  29. data/lib/bbcloud/commands/config-client-default.rb +18 -16
  30. data/lib/bbcloud/commands/config-client-list.rb +19 -16
  31. data/lib/bbcloud/commands/config-client-remove.rb +18 -16
  32. data/lib/bbcloud/commands/images-destroy.rb +18 -16
  33. data/lib/bbcloud/commands/images-list.rb +20 -18
  34. data/lib/bbcloud/commands/images-register.rb +21 -19
  35. data/lib/bbcloud/commands/images-show.rb +17 -15
  36. data/lib/bbcloud/commands/lbs-add-nodes.rb +15 -13
  37. data/lib/bbcloud/commands/lbs-create.rb +65 -63
  38. data/lib/bbcloud/commands/lbs-destroy.rb +13 -11
  39. data/lib/bbcloud/commands/lbs-list.rb +13 -11
  40. data/lib/bbcloud/commands/lbs-remove-nodes.rb +15 -13
  41. data/lib/bbcloud/commands/lbs-show.rb +15 -13
  42. data/lib/bbcloud/commands/lbs-update.rb +59 -57
  43. data/lib/bbcloud/commands/servers-activate-cloud.rb +18 -16
  44. data/lib/bbcloud/commands/servers-create.rb +80 -77
  45. data/lib/bbcloud/commands/servers-destroy.rb +17 -15
  46. data/lib/bbcloud/commands/servers-list.rb +14 -14
  47. data/lib/bbcloud/commands/servers-show.rb +39 -37
  48. data/lib/bbcloud/commands/servers-shutdown.rb +14 -12
  49. data/lib/bbcloud/commands/servers-snapshot.rb +14 -12
  50. data/lib/bbcloud/commands/servers-start.rb +15 -13
  51. data/lib/bbcloud/commands/servers-stop.rb +14 -12
  52. data/lib/bbcloud/commands/types-list.rb +13 -11
  53. data/lib/bbcloud/commands/types-show.rb +18 -16
  54. data/lib/bbcloud/commands/users-list.rb +13 -11
  55. data/lib/bbcloud/commands/users-show.rb +17 -15
  56. data/lib/bbcloud/commands/users-update.rb +27 -25
  57. data/lib/bbcloud/commands/zones-list.rb +13 -11
  58. data/lib/bbcloud/config.rb +125 -111
  59. data/lib/bbcloud/error_parser.rb +34 -0
  60. data/lib/bbcloud/fog_extensions.rb +19 -0
  61. data/lib/bbcloud/gli_global_hooks.rb +56 -0
  62. data/lib/bbcloud/logging.rb +40 -0
  63. data/lib/bbcloud/ruby_core_ext.rb +9 -0
  64. data/lib/bbcloud/servers.rb +7 -2
  65. data/lib/bbcloud/tables.rb +78 -73
  66. data/lib/bbcloud/vendor/gli/.gitignore +10 -0
  67. data/lib/bbcloud/vendor/gli/.rvmrc +1 -0
  68. data/lib/bbcloud/vendor/gli/Gemfile +5 -0
  69. data/lib/bbcloud/vendor/gli/LICENSE.txt +201 -0
  70. data/lib/bbcloud/vendor/gli/README.rdoc +54 -0
  71. data/lib/bbcloud/vendor/gli/Rakefile +84 -0
  72. data/lib/bbcloud/vendor/gli/bin/gli +72 -0
  73. data/lib/bbcloud/vendor/gli/bin/report_on_rake_results +10 -0
  74. data/lib/bbcloud/vendor/gli/bin/test_all_rubies.sh +2 -0
  75. data/lib/bbcloud/vendor/gli/features/gli_executable.feature +88 -0
  76. data/lib/bbcloud/vendor/gli/features/gli_init.feature +122 -0
  77. data/lib/bbcloud/vendor/gli/features/step_definitions/gli_executable_steps.rb +12 -0
  78. data/lib/bbcloud/vendor/gli/features/step_definitions/gli_init_steps.rb +4 -0
  79. data/lib/bbcloud/vendor/gli/features/support/env.rb +21 -0
  80. data/lib/bbcloud/vendor/gli/gli.cheat +80 -0
  81. data/lib/bbcloud/vendor/gli/gli.gemspec +46 -0
  82. data/lib/bbcloud/vendor/gli/gli.rdoc +51 -0
  83. data/lib/bbcloud/vendor/gli/lib/gli.rb +560 -0
  84. data/lib/bbcloud/vendor/gli/lib/gli/command.rb +124 -0
  85. data/lib/bbcloud/vendor/gli/lib/gli/command_line_token.rb +58 -0
  86. data/lib/bbcloud/vendor/gli/lib/gli/copy_options_to_aliases.rb +33 -0
  87. data/lib/bbcloud/vendor/gli/lib/gli/exceptions.rb +45 -0
  88. data/lib/bbcloud/vendor/gli/lib/gli/flag.rb +67 -0
  89. data/lib/bbcloud/vendor/gli/lib/gli/options.rb +19 -0
  90. data/lib/bbcloud/vendor/gli/lib/gli/switch.rb +63 -0
  91. data/lib/bbcloud/vendor/gli/lib/gli/terminal.rb +79 -0
  92. data/lib/bbcloud/vendor/gli/lib/gli_version.rb +3 -0
  93. data/lib/bbcloud/vendor/gli/lib/support/help.rb +180 -0
  94. data/lib/bbcloud/vendor/gli/lib/support/initconfig.rb +34 -0
  95. data/lib/bbcloud/vendor/gli/lib/support/rdoc.rb +119 -0
  96. data/lib/bbcloud/vendor/gli/lib/support/scaffold.rb +284 -0
  97. data/lib/bbcloud/vendor/gli/test/config.yaml +9 -0
  98. data/lib/bbcloud/vendor/gli/test/gli.reek +116 -0
  99. data/lib/bbcloud/vendor/gli/test/roodi.yaml +9 -0
  100. data/lib/bbcloud/vendor/gli/test/tc_command.rb +329 -0
  101. data/lib/bbcloud/vendor/gli/test/tc_flag.rb +67 -0
  102. data/lib/bbcloud/vendor/gli/test/tc_gli.rb +429 -0
  103. data/lib/bbcloud/vendor/gli/test/tc_options.rb +31 -0
  104. data/lib/bbcloud/vendor/gli/test/tc_parsing.rb +279 -0
  105. data/lib/bbcloud/vendor/gli/test/tc_switch.rb +80 -0
  106. data/lib/bbcloud/vendor/gli/test/tc_terminal.rb +91 -0
  107. data/lib/bbcloud/version.rb +1 -1
  108. data/pkg/bbcloud-0.12.0.gem +0 -0
  109. data/spec/fixtures/vcr_cassettes/server_list.yml +117 -0
  110. data/spec/servers_spec.rb +36 -0
  111. data/spec/spec_helper.rb +24 -0
  112. data/spec/support/common_helpers.rb +47 -0
  113. metadata +129 -135
  114. data/lib/bbcloud/cli.rb +0 -160
  115. data/lib/bbcloud/vendor/fog/lib/fog.rb +0 -14
  116. data/lib/bbcloud/vendor/fog/lib/fog/compute.rb +0 -43
  117. data/lib/bbcloud/vendor/fog/lib/fog/compute/brightbox.rb +0 -162
  118. data/lib/bbcloud/vendor/fog/lib/fog/compute/models/brightbox/account.rb +0 -51
  119. data/lib/bbcloud/vendor/fog/lib/fog/compute/models/brightbox/cloud_ip.rb +0 -47
  120. data/lib/bbcloud/vendor/fog/lib/fog/compute/models/brightbox/cloud_ips.rb +0 -34
  121. data/lib/bbcloud/vendor/fog/lib/fog/compute/models/brightbox/flavor.rb +0 -33
  122. data/lib/bbcloud/vendor/fog/lib/fog/compute/models/brightbox/flavors.rb +0 -28
  123. data/lib/bbcloud/vendor/fog/lib/fog/compute/models/brightbox/image.rb +0 -56
  124. data/lib/bbcloud/vendor/fog/lib/fog/compute/models/brightbox/images.rb +0 -28
  125. data/lib/bbcloud/vendor/fog/lib/fog/compute/models/brightbox/load_balancer.rb +0 -50
  126. data/lib/bbcloud/vendor/fog/lib/fog/compute/models/brightbox/load_balancers.rb +0 -28
  127. data/lib/bbcloud/vendor/fog/lib/fog/compute/models/brightbox/server.rb +0 -108
  128. data/lib/bbcloud/vendor/fog/lib/fog/compute/models/brightbox/servers.rb +0 -29
  129. data/lib/bbcloud/vendor/fog/lib/fog/compute/models/brightbox/user.rb +0 -39
  130. data/lib/bbcloud/vendor/fog/lib/fog/compute/models/brightbox/users.rb +0 -29
  131. data/lib/bbcloud/vendor/fog/lib/fog/compute/models/brightbox/zone.rb +0 -21
  132. data/lib/bbcloud/vendor/fog/lib/fog/compute/models/brightbox/zones.rb +0 -29
  133. data/lib/bbcloud/vendor/fog/lib/fog/compute/requests/brightbox/activate_console_server.rb +0 -20
  134. data/lib/bbcloud/vendor/fog/lib/fog/compute/requests/brightbox/add_listeners_load_balancer.rb +0 -20
  135. data/lib/bbcloud/vendor/fog/lib/fog/compute/requests/brightbox/add_nodes_load_balancer.rb +0 -20
  136. data/lib/bbcloud/vendor/fog/lib/fog/compute/requests/brightbox/create_api_client.rb +0 -19
  137. data/lib/bbcloud/vendor/fog/lib/fog/compute/requests/brightbox/create_cloud_ip.rb +0 -19
  138. data/lib/bbcloud/vendor/fog/lib/fog/compute/requests/brightbox/create_image.rb +0 -19
  139. data/lib/bbcloud/vendor/fog/lib/fog/compute/requests/brightbox/create_load_balancer.rb +0 -19
  140. data/lib/bbcloud/vendor/fog/lib/fog/compute/requests/brightbox/create_server.rb +0 -19
  141. data/lib/bbcloud/vendor/fog/lib/fog/compute/requests/brightbox/destroy_api_client.rb +0 -20
  142. data/lib/bbcloud/vendor/fog/lib/fog/compute/requests/brightbox/destroy_cloud_ip.rb +0 -20
  143. data/lib/bbcloud/vendor/fog/lib/fog/compute/requests/brightbox/destroy_image.rb +0 -20
  144. data/lib/bbcloud/vendor/fog/lib/fog/compute/requests/brightbox/destroy_load_balancer.rb +0 -20
  145. data/lib/bbcloud/vendor/fog/lib/fog/compute/requests/brightbox/destroy_server.rb +0 -20
  146. data/lib/bbcloud/vendor/fog/lib/fog/compute/requests/brightbox/get_account.rb +0 -19
  147. data/lib/bbcloud/vendor/fog/lib/fog/compute/requests/brightbox/get_api_client.rb +0 -20
  148. data/lib/bbcloud/vendor/fog/lib/fog/compute/requests/brightbox/get_cloud_ip.rb +0 -20
  149. data/lib/bbcloud/vendor/fog/lib/fog/compute/requests/brightbox/get_image.rb +0 -20
  150. data/lib/bbcloud/vendor/fog/lib/fog/compute/requests/brightbox/get_interface.rb +0 -20
  151. data/lib/bbcloud/vendor/fog/lib/fog/compute/requests/brightbox/get_load_balancer.rb +0 -20
  152. data/lib/bbcloud/vendor/fog/lib/fog/compute/requests/brightbox/get_server.rb +0 -20
  153. data/lib/bbcloud/vendor/fog/lib/fog/compute/requests/brightbox/get_server_type.rb +0 -20
  154. data/lib/bbcloud/vendor/fog/lib/fog/compute/requests/brightbox/get_user.rb +0 -20
  155. data/lib/bbcloud/vendor/fog/lib/fog/compute/requests/brightbox/get_zone.rb +0 -20
  156. data/lib/bbcloud/vendor/fog/lib/fog/compute/requests/brightbox/list_api_clients.rb +0 -19
  157. data/lib/bbcloud/vendor/fog/lib/fog/compute/requests/brightbox/list_cloud_ips.rb +0 -19
  158. data/lib/bbcloud/vendor/fog/lib/fog/compute/requests/brightbox/list_images.rb +0 -19
  159. data/lib/bbcloud/vendor/fog/lib/fog/compute/requests/brightbox/list_load_balancers.rb +0 -19
  160. data/lib/bbcloud/vendor/fog/lib/fog/compute/requests/brightbox/list_server_types.rb +0 -19
  161. data/lib/bbcloud/vendor/fog/lib/fog/compute/requests/brightbox/list_servers.rb +0 -19
  162. data/lib/bbcloud/vendor/fog/lib/fog/compute/requests/brightbox/list_users.rb +0 -19
  163. data/lib/bbcloud/vendor/fog/lib/fog/compute/requests/brightbox/list_zones.rb +0 -19
  164. data/lib/bbcloud/vendor/fog/lib/fog/compute/requests/brightbox/map_cloud_ip.rb +0 -20
  165. data/lib/bbcloud/vendor/fog/lib/fog/compute/requests/brightbox/remove_listeners_load_balancer.rb +0 -20
  166. data/lib/bbcloud/vendor/fog/lib/fog/compute/requests/brightbox/remove_nodes_load_balancer.rb +0 -20
  167. data/lib/bbcloud/vendor/fog/lib/fog/compute/requests/brightbox/reset_ftp_password_account.rb +0 -19
  168. data/lib/bbcloud/vendor/fog/lib/fog/compute/requests/brightbox/resize_server.rb +0 -19
  169. data/lib/bbcloud/vendor/fog/lib/fog/compute/requests/brightbox/shutdown_server.rb +0 -20
  170. data/lib/bbcloud/vendor/fog/lib/fog/compute/requests/brightbox/snapshot_server.rb +0 -20
  171. data/lib/bbcloud/vendor/fog/lib/fog/compute/requests/brightbox/start_server.rb +0 -20
  172. data/lib/bbcloud/vendor/fog/lib/fog/compute/requests/brightbox/stop_server.rb +0 -20
  173. data/lib/bbcloud/vendor/fog/lib/fog/compute/requests/brightbox/unmap_cloud_ip.rb +0 -20
  174. data/lib/bbcloud/vendor/fog/lib/fog/compute/requests/brightbox/update_account.rb +0 -20
  175. data/lib/bbcloud/vendor/fog/lib/fog/compute/requests/brightbox/update_api_client.rb +0 -21
  176. data/lib/bbcloud/vendor/fog/lib/fog/compute/requests/brightbox/update_image.rb +0 -21
  177. data/lib/bbcloud/vendor/fog/lib/fog/compute/requests/brightbox/update_load_balancer.rb +0 -21
  178. data/lib/bbcloud/vendor/fog/lib/fog/compute/requests/brightbox/update_server.rb +0 -21
  179. data/lib/bbcloud/vendor/fog/lib/fog/compute/requests/brightbox/update_user.rb +0 -21
  180. data/lib/bbcloud/vendor/fog/lib/fog/core.rb +0 -32
  181. data/lib/bbcloud/vendor/fog/lib/fog/core/attributes.rb +0 -178
  182. data/lib/bbcloud/vendor/fog/lib/fog/core/collection.rb +0 -127
  183. data/lib/bbcloud/vendor/fog/lib/fog/core/connection.rb +0 -35
  184. data/lib/bbcloud/vendor/fog/lib/fog/core/credentials.rb +0 -92
  185. data/lib/bbcloud/vendor/fog/lib/fog/core/deprecation.rb +0 -23
  186. data/lib/bbcloud/vendor/fog/lib/fog/core/errors.rb +0 -20
  187. data/lib/bbcloud/vendor/fog/lib/fog/core/hmac.rb +0 -48
  188. data/lib/bbcloud/vendor/fog/lib/fog/core/mock.rb +0 -68
  189. data/lib/bbcloud/vendor/fog/lib/fog/core/model.rb +0 -57
  190. data/lib/bbcloud/vendor/fog/lib/fog/core/parser.rb +0 -99
  191. data/lib/bbcloud/vendor/fog/lib/fog/core/provider.rb +0 -18
  192. data/lib/bbcloud/vendor/fog/lib/fog/core/scp.rb +0 -67
  193. data/lib/bbcloud/vendor/fog/lib/fog/core/service.rb +0 -175
  194. data/lib/bbcloud/vendor/fog/lib/fog/core/ssh.rb +0 -120
  195. data/lib/bbcloud/vendor/fog/lib/fog/core/time.rb +0 -27
  196. data/lib/bbcloud/vendor/fog/lib/fog/core/wait_for.rb +0 -17
  197. data/lib/bbcloud/vendor/fog/lib/fog/providers.rb +0 -9
  198. data/lib/bbcloud/vendor/fog/lib/fog/providers/brightbox.rb +0 -9
@@ -0,0 +1,3 @@
1
+ module GLI
2
+ VERSION = '1.3.0'
3
+ end
@@ -0,0 +1,180 @@
1
+ require 'gli'
2
+ require 'gli/command'
3
+ require 'gli/terminal'
4
+
5
+ module GLI
6
+ class DefaultHelpCommand < Command #:nodoc:
7
+ @@output = $stdout
8
+ @@skips_pre = true
9
+ @@skips_post = true
10
+
11
+ # Exposed for testing
12
+ def self.output_device=(o); @@output = o; end
13
+
14
+ # To override the default behavior of the help command, which is
15
+ # to NOT run the pre block, use this.
16
+ def self.skips_pre=(skips_pre)
17
+ @@skips_pre = skips_pre
18
+ end
19
+
20
+ # To override the default behavior of the help command, which is
21
+ # to NOT run the post block, use this.
22
+ def self.skips_post=(skips_post)
23
+ @@skips_post = skips_post
24
+ end
25
+
26
+ def initialize(version,*omit_from_list)
27
+ @omit_from_list = omit_from_list
28
+ @version = version
29
+ super(:help,
30
+ 'Shows list of commands or help for one command',
31
+ '[command]',
32
+ 'Gets help for the application or its commands. Can also list the commands in a way helpful to creating a bash-style completion function')
33
+ self.desc 'List all commands one line at a time, for use with shell completion ([command] argument is partial command to match)'
34
+ self.switch [:c,:completion]
35
+ end
36
+
37
+ def skips_pre; @@skips_pre; end
38
+ def skips_post; @@skips_post; end
39
+
40
+ def execute(global_options,options,arguments)
41
+ if options[:c]
42
+ names = commands_to_show.reduce([]) do |memo,obj|
43
+ memo << obj[0]
44
+ memo << obj[1].aliases
45
+ memo = memo.flatten
46
+ end
47
+ names.map! { |name| name.to_s }
48
+ if arguments && arguments.size > 0
49
+ names = names.select { |name| name =~ /^#{arguments[0]}/ }
50
+ end
51
+ names.sort.each do |command|
52
+ next if command.empty?
53
+ @@output.puts command
54
+ end
55
+ else
56
+ if arguments.empty?
57
+ list_global_flags
58
+ list_commands
59
+ else
60
+ list_one_command_help(arguments[0])
61
+ end
62
+ end
63
+ end
64
+
65
+ private
66
+
67
+ def list_global_flags
68
+ if GLI.program_desc
69
+ @@output.puts wrap(GLI.program_desc,0)
70
+ @@output.puts
71
+ end
72
+ usage = "usage: #{GLI.program_name} "
73
+ all_options = GLI.switches.merge(GLI.flags)
74
+ if !all_options.empty?
75
+ usage += "[global options] "
76
+ end
77
+ usage += "command"
78
+ usage += ' [command options]'
79
+ @@output.puts usage
80
+ @@output.puts
81
+ if @version
82
+ @@output.puts "Version: #{@version}"
83
+ @@output.puts
84
+ end
85
+ @@output.puts 'Global Options:' if !all_options.empty?
86
+ output_command_tokens_for_help(all_options)
87
+ @@output.puts if !all_options.empty?
88
+ end
89
+
90
+ def list_commands
91
+ @@output.puts 'Commands:'
92
+ output_command_tokens_for_help(commands_to_show,:names)
93
+ end
94
+
95
+ def commands_to_show
96
+ GLI.commands.reject{ |name,c| @omit_from_list.include?(c) }
97
+ end
98
+
99
+ def list_one_command_help(command_name)
100
+ command = GLI.find_command(command_name)
101
+ if command
102
+ @@output.puts command.usage
103
+ description = wrap(command.description,4)
104
+ @@output.puts " #{description}"
105
+ if command.long_description
106
+ @@output.puts
107
+ @@output.puts " #{wrap(command.long_description,4)}"
108
+ end
109
+ all_options = command.switches.merge(command.flags)
110
+ if !all_options.empty?
111
+ @@output.puts
112
+ @@output.puts "Command Options:"
113
+ output_command_tokens_for_help(all_options)
114
+ end
115
+ else
116
+ @@output.puts "No such command #{command_name}"
117
+ end
118
+ end
119
+
120
+ def output_command_tokens_for_help(tokens,usage_name=:usage)
121
+ max = 0
122
+ tokens.values.each do |token|
123
+ len = token.send(usage_name).length
124
+ if len > max
125
+ max = len
126
+ end
127
+ end
128
+ names = tokens.keys.sort { |x,y| x.to_s <=> y.to_s }
129
+ names.each do |name|
130
+ token = tokens[name]
131
+ description = token.description || ''
132
+ if token.kind_of? Flag
133
+ description += " (default: #{token.default_value})" if token.default_value
134
+ end
135
+ description = wrap(description,max+7)
136
+ string = sprintf " %-#{max}s - %s",token.send(usage_name),description
137
+ @@output.puts string
138
+ end
139
+ end
140
+ end
141
+
142
+ private
143
+
144
+ # Wraps the line at the given column length, using the given line padding.
145
+ # Assumes that the first line doesn't need the padding, as its filled
146
+ # up with other stuff
147
+ def wrap(line,pad_length=0,line_length=nil)
148
+ if line_length.nil?
149
+ line_length = Terminal.instance.size[0]
150
+ end
151
+ line_padding = sprintf("%#{pad_length}s",'')
152
+ words = line.split(/\s+/)
153
+ return line if !words || words.empty?
154
+ wrapped = ''
155
+ while wrapped.length + line_padding.length < line_length
156
+ wrapped += ' ' if wrapped.length > 0
157
+ word = words.shift
158
+ if (wrapped.length + line_padding.length + word.length > line_length)
159
+ words.unshift word
160
+ break;
161
+ end
162
+ wrapped += word
163
+ return wrapped if words.empty?
164
+ end
165
+ wrapped += "\n"
166
+ this_line = line_padding
167
+ words.each do |word|
168
+ if this_line.length + word.length > line_length
169
+ wrapped += this_line
170
+ wrapped += "\n"
171
+ this_line = line_padding + word
172
+ else
173
+ this_line += ' ' if this_line.length > line_padding.length
174
+ this_line += word
175
+ end
176
+ end
177
+ wrapped.chomp!
178
+ wrapped + "\n" + this_line
179
+ end
180
+ end
@@ -0,0 +1,34 @@
1
+ require 'gli'
2
+ require 'gli/command'
3
+ require 'yaml'
4
+
5
+ module GLI
6
+ class InitConfig < Command # :nodoc:
7
+ COMMANDS_KEY = 'commands'
8
+
9
+ def initialize(config_file_name)
10
+ @filename = config_file_name
11
+ super(:initconfig,"Initialize the config file using current global options",nil,'Initializes a configuration file where you can set default options for command line flags, both globally and on a per-command basis. These defaults override the built-in defaults and allow you to omit commonly-used command line flags when invoking this program')
12
+
13
+ self.desc 'force overwrite of existing config file'
14
+ self.switch :force
15
+ end
16
+
17
+ def execute(global_options,options,arguments)
18
+ if options[:force] || !File.exist?(@filename)
19
+ config = global_options
20
+ config[COMMANDS_KEY] = {}
21
+ GLI.commands.each do |name,command|
22
+ if (command != self) && (name != :rdoc) && (name != :help)
23
+ config[COMMANDS_KEY][name.to_sym] = {} if command != self
24
+ end
25
+ end
26
+ File.open(@filename,'w') do |file|
27
+ YAML.dump(config,file)
28
+ end
29
+ else
30
+ raise "Not overwriting existing config file #{@filename}, use --force to override"
31
+ end
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,119 @@
1
+ require 'gli'
2
+ require 'fileutils'
3
+
4
+ module GLI
5
+ class RDocCommand < Command # :nodoc:
6
+
7
+ def initialize
8
+ super(:rdoc,'Generates RDoc (and other types of documentation) for your command line interface')
9
+ self.desc 'Create a very basic scaffold for a cheat-style cheatsheet, in addition to rdoc'
10
+ self.switch 'cheatsheet'
11
+ self.desc 'Include a manapage suitable for gem man, in addition to rdoc'
12
+ self.switch 'manpage'
13
+ self.desc 'Do not create rdoc'
14
+ self.switch 'no-rdoc'
15
+ end
16
+
17
+ def execute(g,options,a)
18
+ create_rdoc unless options[:'no-rdoc']
19
+ create_manpage if options[:manpage]
20
+ create_cheatsheet if options[:cheatsheet]
21
+ end
22
+
23
+ def create_cheatsheet
24
+ File.open("#{GLI.program_name}.cheat",'w') do |file|
25
+ file << GLI.program_name
26
+ file << "\n"
27
+ file << GLI.program_name.length.times.inject("") { |a,x| a + "=" }
28
+ file << "\n"
29
+ file << "\n"
30
+ file << "Installation:\n"
31
+ file << "$ gem install #{GLI.program_name}\n\n"
32
+ GLI.commands.values.sort.each do |command|
33
+ next if command == self
34
+ file << command.description
35
+ file << "\n"
36
+ [command.name,command.aliases].flatten.each do |name|
37
+ next unless name
38
+ file << "$ #{GLI.program_name} #{name} #{command.arguments_description}\n"
39
+ end
40
+ file << "\n"
41
+ end
42
+ end
43
+ end
44
+
45
+ def create_manpage
46
+ end
47
+
48
+ def create_rdoc
49
+ File.open("#{GLI.program_name}.rdoc",'w') do |file|
50
+ file << "= <tt>#{GLI.program_name}</tt>\n\n"
51
+ if GLI.program_desc
52
+ file << GLI.program_desc
53
+ file << "\n\n"
54
+ end
55
+ file << " "
56
+ file << GLI.program_name
57
+ file << " "
58
+ global_options = GLI.switches.merge(GLI.flags)
59
+ if (global_options && global_options.length > 0)
60
+ file << "[global options] "
61
+ end
62
+ file << "command_name"
63
+ file << " [command-specific options]"
64
+ file << " [--] arguments...\n\n"
65
+ file << "* Use the command +help+ to get a summary of commands\n"
66
+ file << "* Use the command <tt>help command_name</tt> to get a help for +command_name+\n"
67
+ file << "* Use <tt>--</tt> to stop command line argument processing; useful if your arguments have dashes in them\n"
68
+ file << "\n"
69
+ if (global_options && global_options.length > 0)
70
+ file << "== Global Options\n"
71
+ file << "These options are available for any command and are specified before the name of the command\n\n"
72
+ output_flags(file,global_options)
73
+ end
74
+ file << "== Commands\n"
75
+ GLI.commands.values.sort.each do |command|
76
+ next if command == self
77
+ file << "[<tt>#{command.name}</tt>] #{command.description}\n"
78
+ end
79
+ file << "\n"
80
+
81
+ GLI.commands.values.sort.each do |command|
82
+ next if command == self
83
+ file << "=== <tt>#{command.name} #{command.arguments_description}</tt>\n\n"
84
+ file << "#{command.description}\n\n"
85
+ if command.aliases
86
+ file << "*Aliases*\n"
87
+ command.aliases.each do |al|
88
+ file << "* <tt><b>#{al}</b></tt>\n"
89
+ end
90
+ file << "\n"
91
+ end
92
+ all_options = command.switches.merge(command.flags)
93
+ file << "#{command.long_description}\n\n" if command.long_description
94
+ if (all_options && all_options.length > 0)
95
+ file << "==== Options\n"
96
+ file << "These options are specified *after* the command.\n\n"
97
+ output_flags(file,all_options)
98
+ end
99
+ end
100
+ end
101
+ end
102
+
103
+ def output_flags(file,flags)
104
+ flags.values.sort.each do |flag|
105
+ file << "[<tt>#{flag.usage}</tt>] #{flag.description}"
106
+ if flag.kind_of? Flag
107
+ file << " <i>( default: <tt>#{flag.default_value}</tt>)</i>" if flag.default_value
108
+ end
109
+ file << "\n"
110
+ if flag.long_description
111
+ file << "\n"
112
+ # 12 is: 4 for tt, 5 for /tt, 2 for the brackets and 1 for spacing
113
+ (flag.usage.length + 12).times { file << " " }
114
+ file << "#{flag.long_description}\n\n"
115
+ end
116
+ end
117
+ end
118
+ end
119
+ end
@@ -0,0 +1,284 @@
1
+ require 'gli'
2
+ require 'fileutils'
3
+
4
+ module GLI
5
+ class Scaffold #:nodoc:
6
+
7
+ def self.create_scaffold(root_dir,create_test_dir,create_ext_dir,project_name,commands,force=false,dry_run=false)
8
+ dirs = [File.join(root_dir,project_name,'lib')]
9
+ dirs << File.join(root_dir,project_name,'bin')
10
+ dirs << File.join(root_dir,project_name,'test') if create_test_dir
11
+ dirs << File.join(root_dir,project_name,'ext') if create_ext_dir
12
+
13
+ if mkdirs(dirs,force,dry_run)
14
+ mk_binfile(root_dir,create_ext_dir,force,dry_run,project_name,commands)
15
+ mk_readme(root_dir,dry_run,project_name)
16
+ mk_gemspec(root_dir,dry_run,project_name)
17
+ mk_rakefile(root_dir,dry_run,project_name,create_test_dir)
18
+ mk_version(root_dir,dry_run,project_name)
19
+ end
20
+ end
21
+
22
+ def self.mk_readme(root_dir,dry_run,project_name)
23
+ return if dry_run
24
+ File.open("#{root_dir}/#{project_name}/README.rdoc",'w') do |file|
25
+ file << "= #{project_name}\n\n"
26
+ file << "Describe your project here\n\n"
27
+ file << ":include:#{project_name}.rdoc\n\n"
28
+ end
29
+ puts "Created #{root_dir}/#{project_name}/README.rdoc"
30
+ File.open("#{root_dir}/#{project_name}/#{project_name}.rdoc",'w') do |file|
31
+ file << "= #{project_name}\n\n"
32
+ file << "Generate this with\n #{project_name} rdoc\nAfter you have described your command line interface"
33
+ end
34
+ puts "Created #{root_dir}/#{project_name}/#{project_name}.rdoc"
35
+ end
36
+
37
+ def self.mk_gemspec(root_dir,dry_run,project_name)
38
+ return if dry_run
39
+ File.open("#{root_dir}/#{project_name}/#{project_name}.gemspec",'w') do |file|
40
+ file.puts <<EOS
41
+ # Ensure we require the local version and not one we might have installed already
42
+ require File.join([File.dirname(__FILE__),'lib','#{project_name}_version.rb'])
43
+ spec = Gem::Specification.new do |s|
44
+ s.name = '#{project_name}'
45
+ s.version = #{project_name_as_module_name(project_name)}::VERSION
46
+ s.author = 'Your Name Here'
47
+ s.email = 'your@email.address.com'
48
+ s.homepage = 'http://your.website.com'
49
+ s.platform = Gem::Platform::RUBY
50
+ s.summary = 'A description of your project'
51
+ # Add your other files here if you make them
52
+ s.files = %w(
53
+ bin/#{project_name}
54
+ )
55
+ s.require_paths << 'lib'
56
+ s.has_rdoc = true
57
+ s.extra_rdoc_files = ['README.rdoc','#{project_name}.rdoc']
58
+ s.rdoc_options << '--title' << '#{project_name}' << '--main' << 'README.rdoc' << '-ri'
59
+ s.bindir = 'bin'
60
+ s.executables << '#{project_name}'
61
+ s.add_development_dependency('rake')
62
+ s.add_development_dependency('rdoc')
63
+ end
64
+ EOS
65
+ end
66
+ puts "Created #{root_dir}/#{project_name}/#{project_name}.gemspec"
67
+ end
68
+
69
+ def self.project_name_as_module_name(project_name)
70
+ project_name.split(/_/).map { |part| part[0..0].upcase + part[1..-1] }.join('')
71
+ end
72
+
73
+ def self.mk_version(root_dir,dry_run,project_name)
74
+ return if dry_run
75
+ File.open("#{root_dir}/#{project_name}/lib/#{project_name}_version.rb",'w') do |file|
76
+ file.puts <<EOS
77
+ module #{project_name_as_module_name(project_name)}
78
+ VERSION = '0.0.1'
79
+ end
80
+ EOS
81
+ end
82
+ puts "Created #{root_dir}/#{project_name}/lib/#{project_name}_version.rb"
83
+ end
84
+ def self.mk_rakefile(root_dir,dry_run,project_name,create_test_dir)
85
+ return if dry_run
86
+ File.open("#{root_dir}/#{project_name}/Rakefile",'w') do |file|
87
+ file.puts <<EOS
88
+ require 'rake/clean'
89
+ require 'rubygems'
90
+ require 'rake/gempackagetask'
91
+ require 'rake/rdoctask'
92
+
93
+ Rake::RDocTask.new do |rd|
94
+ rd.main = "README.rdoc"
95
+ rd.rdoc_files.include("README.rdoc","lib/**/*.rb","bin/**/*")
96
+ rd.title = 'Your application title'
97
+ end
98
+
99
+ spec = eval(File.read('#{project_name}.gemspec'))
100
+
101
+ Rake::GemPackageTask.new(spec) do |pkg|
102
+ end
103
+
104
+ EOS
105
+ if create_test_dir
106
+ file.puts <<EOS
107
+ require 'rake/testtask'
108
+ Rake::TestTask.new do |t|
109
+ t.libs << "test"
110
+ t.test_files = FileList['test/tc_*.rb']
111
+ end
112
+
113
+ task :default => :test
114
+ EOS
115
+ File.open("#{root_dir}/#{project_name}/test/tc_nothing.rb",'w') do |test_file|
116
+ test_file.puts <<EOS
117
+ require 'test/unit'
118
+
119
+ class TC_testNothing < Test::Unit::TestCase
120
+
121
+ def setup
122
+ end
123
+
124
+ def teardown
125
+ end
126
+
127
+ def test_the_truth
128
+ assert true
129
+ end
130
+ end
131
+ EOS
132
+ end
133
+ puts "Created #{root_dir}/#{project_name}/test/tc_nothing.rb"
134
+ else
135
+ file.puts "task :default => :package\n"
136
+ end
137
+ end
138
+ puts "Created #{root_dir}/#{project_name}/Rakefile"
139
+ File.open("#{root_dir}/#{project_name}/Gemfile",'w') do |bundler_file|
140
+ bundler_file.puts "source :rubygems"
141
+ bundler_file.puts "gemspec"
142
+ end
143
+ puts "Created #{root_dir}/#{project_name}/Gemfile"
144
+ end
145
+
146
+ def self.mk_binfile(root_dir,create_ext_dir,force,dry_run,project_name,commands)
147
+ bin_file = File.join(root_dir,project_name,'bin',project_name)
148
+ if !File.exist?(bin_file) || force
149
+ if !dry_run
150
+ File.open(bin_file,'w') do |file|
151
+ file.chmod(0755)
152
+ file.puts '#!/usr/bin/env ruby'
153
+ file.puts <<EOS
154
+ # 1.9 adds realpath to resolve symlinks; 1.8 doesn't
155
+ # have this method, so we add it so we get resolved symlinks
156
+ # and compatibility
157
+ unless File.respond_to? :realpath
158
+ class File #:nodoc:
159
+ def self.realpath path
160
+ return realpath(File.readlink(path)) if symlink?(path)
161
+ path
162
+ end
163
+ end
164
+ end
165
+ EOS
166
+ file.puts '$: << File.expand_path(File.dirname(File.realpath(__FILE__)) + \'/../lib\')'
167
+ file.puts '$: << File.expand_path(File.dirname(File.realpath(__FILE__)) + \'/../ext\')' if create_ext_dir
168
+ file.puts <<EOS
169
+ require 'rubygems'
170
+ require 'gli'
171
+ require '#{project_name}_version'
172
+
173
+ include GLI
174
+
175
+ program_desc 'Describe your application here'
176
+
177
+ version #{project_name_as_module_name(project_name)}::VERSION
178
+
179
+ desc 'Describe some switch here'
180
+ switch [:s,:switch]
181
+
182
+ desc 'Describe some flag here'
183
+ default_value 'the default'
184
+ arg_name 'The name of the argument'
185
+ flag [:f,:flagname]
186
+ EOS
187
+ first = true
188
+ commands.each do |command|
189
+ file.puts <<EOS
190
+
191
+ desc 'Describe #{command} here'
192
+ arg_name 'Describe arguments to #{command} here'
193
+ EOS
194
+ if first
195
+ file.puts <<EOS
196
+ command :#{command} do |c|
197
+ c.desc 'Describe a switch to #{command}'
198
+ c.switch :s
199
+
200
+ c.desc 'Describe a flag to #{command}'
201
+ c.default_value 'default'
202
+ c.flag :f
203
+ c.action do |global_options,options,args|
204
+
205
+ # Your command logic here
206
+
207
+ # If you have any errors, just raise them
208
+ # raise "that command made no sense"
209
+ end
210
+ end
211
+ EOS
212
+ else
213
+ file.puts <<EOS
214
+ command :#{command} do |c|
215
+ c.action do |global_options,options,args|
216
+ end
217
+ end
218
+ EOS
219
+ end
220
+ first = false
221
+ end
222
+ file.puts <<EOS
223
+
224
+ pre do |global,command,options,args|
225
+ # Pre logic here
226
+ # Return true to proceed; false to abourt and not call the
227
+ # chosen command
228
+ # Use skips_pre before a command to skip this block
229
+ # on that command only
230
+ true
231
+ end
232
+
233
+ post do |global,command,options,args|
234
+ # Post logic here
235
+ # Use skips_post before a command to skip this
236
+ # block on that command only
237
+ end
238
+
239
+ on_error do |exception|
240
+ # Error logic here
241
+ # return false to skip default error handling
242
+ true
243
+ end
244
+
245
+ exit GLI.run(ARGV)
246
+ EOS
247
+ puts "Created #{bin_file}"
248
+ end
249
+ end
250
+ else
251
+ puts bin_file + " exists; use --force to override"
252
+ return false
253
+ end
254
+ true
255
+ end
256
+
257
+ def self.mkdirs(dirs,force,dry_run)
258
+ exists = false
259
+ if !force
260
+ dirs.each do |dir|
261
+ if File.exist? dir
262
+ raise "#{dir} exists; use --force to override"
263
+ exists = true
264
+ end
265
+ end
266
+ end
267
+ if !exists
268
+ dirs.each do |dir|
269
+ puts "Creating dir #{dir}..."
270
+ if dry_run
271
+ puts "dry-run; #{dir} not created"
272
+ else
273
+ FileUtils.mkdir_p dir
274
+ end
275
+ end
276
+ else
277
+ puts "Exiting..."
278
+ return false
279
+ end
280
+ true
281
+ end
282
+
283
+ end
284
+ end