bbcloud 0.11.2 → 0.12.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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