engineyard 1.4.21 → 1.4.22

Sign up to get free protection for your applications and to get access to all the features.
Files changed (38) hide show
  1. data/README.rdoc +19 -0
  2. data/lib/engineyard.rb +3 -0
  3. data/lib/engineyard/cli.rb +1 -1
  4. data/lib/engineyard/model/instance.rb +4 -2
  5. data/lib/engineyard/thor.rb +10 -0
  6. data/lib/engineyard/version.rb +1 -1
  7. data/lib/vendor/thor/LICENSE.md +20 -0
  8. data/lib/vendor/thor/README.md +26 -0
  9. data/lib/vendor/thor/lib/thor.rb +379 -0
  10. data/lib/vendor/thor/lib/thor/actions.rb +318 -0
  11. data/lib/vendor/thor/lib/thor/actions/create_file.rb +105 -0
  12. data/lib/vendor/thor/lib/thor/actions/create_link.rb +57 -0
  13. data/lib/vendor/thor/lib/thor/actions/directory.rb +97 -0
  14. data/lib/vendor/thor/lib/thor/actions/empty_directory.rb +153 -0
  15. data/lib/vendor/thor/lib/thor/actions/file_manipulation.rb +308 -0
  16. data/lib/vendor/thor/lib/thor/actions/inject_into_file.rb +109 -0
  17. data/lib/vendor/thor/lib/thor/base.rb +611 -0
  18. data/lib/vendor/thor/lib/thor/core_ext/file_binary_read.rb +9 -0
  19. data/lib/vendor/thor/lib/thor/core_ext/hash_with_indifferent_access.rb +75 -0
  20. data/lib/vendor/thor/lib/thor/core_ext/ordered_hash.rb +100 -0
  21. data/lib/vendor/thor/lib/thor/error.rb +35 -0
  22. data/lib/vendor/thor/lib/thor/group.rb +285 -0
  23. data/lib/vendor/thor/lib/thor/invocation.rb +170 -0
  24. data/lib/vendor/thor/lib/thor/parser.rb +4 -0
  25. data/lib/vendor/thor/lib/thor/parser/argument.rb +67 -0
  26. data/lib/vendor/thor/lib/thor/parser/arguments.rb +165 -0
  27. data/lib/vendor/thor/lib/thor/parser/option.rb +121 -0
  28. data/lib/vendor/thor/lib/thor/parser/options.rb +181 -0
  29. data/lib/vendor/thor/lib/thor/rake_compat.rb +71 -0
  30. data/lib/vendor/thor/lib/thor/runner.rb +321 -0
  31. data/lib/vendor/thor/lib/thor/shell.rb +88 -0
  32. data/lib/vendor/thor/lib/thor/shell/basic.rb +331 -0
  33. data/lib/vendor/thor/lib/thor/shell/color.rb +108 -0
  34. data/lib/vendor/thor/lib/thor/shell/html.rb +121 -0
  35. data/lib/vendor/thor/lib/thor/task.rb +132 -0
  36. data/lib/vendor/thor/lib/thor/util.rb +248 -0
  37. data/lib/vendor/thor/lib/thor/version.rb +3 -0
  38. metadata +67 -52
@@ -23,6 +23,7 @@ The ey.yml file allows options to be saved for each environment to which an appl
23
23
  migrate: false
24
24
  migration_command: rake fancy:migrate
25
25
  branch: deploy
26
+ default: true # make this environment default
26
27
 
27
28
  This ey.yml file will turn off default migrations, set the default command to "rake fancy:migrate" and set the default deploy branch to "deploy".
28
29
 
@@ -189,3 +190,21 @@ Command:
189
190
 
190
191
  Description:
191
192
  Open the application in a browser.
193
+
194
+ Command:
195
+ ey whoami
196
+
197
+ Description:
198
+ Who am I logged in as?
199
+
200
+ Command:
201
+ ey login
202
+
203
+ Description:
204
+ Log in and verify access to EY Cloud. Use logout first if you need to switch user accounts.
205
+
206
+ Command:
207
+ ey logout
208
+
209
+ Description:
210
+ Remove the current API key from ~/.eyrc or env variable $EYRC
@@ -1,3 +1,6 @@
1
+ thor_lib = File.expand_path(File.join(File.dirname(__FILE__), 'vendor', 'thor', 'lib'))
2
+ $:.unshift thor_lib
3
+
1
4
  module EY
2
5
  require 'engineyard/ruby_ext'
3
6
  require 'engineyard/version'
@@ -362,7 +362,7 @@ module EY
362
362
  whoami
363
363
  end
364
364
 
365
- desc "logout", "Remove the current API key from ~/.eyrc or env $EYRC"
365
+ desc "logout", "Remove the current API key from ~/.eyrc or env variable $EYRC"
366
366
  def logout
367
367
  eyrc = EYRC.load
368
368
  if eyrc.delete_api_token
@@ -31,8 +31,10 @@ module EY
31
31
 
32
32
  successful = invoke(deploy_command) { |chunk| output << chunk }
33
33
  rescue Interrupt
34
- EY.ui.info "Interrupted. Exiting..."
35
- output << "Interrupted.\n"
34
+ output << "Interrupted. Deployment halted.\n"
35
+ EY.ui.warn "Interrupted."
36
+ EY.ui.warn "Recording canceled deployment and exiting..."
37
+ EY.ui.warn "WARNING: Interrupting again may result in a never-finished deployment in the deployment history on EY Cloud."
36
38
  raise
37
39
  rescue StandardError => e
38
40
  EY.ui.info "Error encountered during deploy."
@@ -99,4 +99,14 @@ module EY
99
99
  end
100
100
 
101
101
  end
102
+
103
+ # patch handle_no_method_error? to work with rubinius' error text.
104
+ class ::Thor::Task
105
+ def handle_no_method_error?(instance, error, caller)
106
+ not_debugging?(instance) && (
107
+ error.message =~ /^undefined method `#{name}' for #{Regexp.escape(instance.to_s)}$/ ||
108
+ error.message =~ /undefined method `#{name}' on an instance of #{Regexp.escape(instance.class.name)}/
109
+ )
110
+ end
111
+ end
102
112
  end
@@ -1,3 +1,3 @@
1
1
  module EY
2
- VERSION = '1.4.21'
2
+ VERSION = '1.4.22'
3
3
  end
@@ -0,0 +1,20 @@
1
+ Copyright (c) 2008 Yehuda Katz, Eric Hodel, et al.
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -0,0 +1,26 @@
1
+ Thor
2
+ ====
3
+
4
+ Description
5
+ -----------
6
+ Thor is a simple and efficient tool for building self-documenting command line
7
+ utilities. It removes the pain of parsing command line options, writing
8
+ "USAGE:" banners, and can also be used as an alternative to the [Rake][rake]
9
+ build tool. The syntax is Rake-like, so it should be familiar to most Rake
10
+ users.
11
+
12
+ [rake]: https://github.com/jimweirich/rake
13
+
14
+ Installation
15
+ ------------
16
+ gem install thor
17
+
18
+ Usage and documentation
19
+ -----------------------
20
+ Please see [the wiki](https://github.com/wycats/thor/wiki) for basic usage and other documentation on using Thor.
21
+
22
+ License
23
+ -------
24
+ Released under the MIT License. See the [LICENSE][license] file for further details.
25
+
26
+ [license]: https://github.com/wycats/thor/blob/master/LICENSE.md
@@ -0,0 +1,379 @@
1
+ require 'thor/base'
2
+
3
+ class Thor
4
+ class << self
5
+ # Sets the default task when thor is executed without an explicit task to be called.
6
+ #
7
+ # ==== Parameters
8
+ # meth<Symbol>:: name of the default task
9
+ #
10
+ def default_task(meth=nil)
11
+ case meth
12
+ when :none
13
+ @default_task = 'help'
14
+ when nil
15
+ @default_task ||= from_superclass(:default_task, 'help')
16
+ else
17
+ @default_task = meth.to_s
18
+ end
19
+ end
20
+
21
+ # Registers another Thor subclass as a command.
22
+ #
23
+ # ==== Parameters
24
+ # klass<Class>:: Thor subclass to register
25
+ # command<String>:: Subcommand name to use
26
+ # usage<String>:: Short usage for the subcommand
27
+ # description<String>:: Description for the subcommand
28
+ def register(klass, subcommand_name, usage, description, options={})
29
+ if klass <= Thor::Group
30
+ desc usage, description, options
31
+ define_method(subcommand_name) { |*args| invoke(klass, args) }
32
+ else
33
+ desc usage, description, options
34
+ subcommand subcommand_name, klass
35
+ end
36
+ end
37
+
38
+ # Defines the usage and the description of the next task.
39
+ #
40
+ # ==== Parameters
41
+ # usage<String>
42
+ # description<String>
43
+ # options<String>
44
+ #
45
+ def desc(usage, description, options={})
46
+ if options[:for]
47
+ task = find_and_refresh_task(options[:for])
48
+ task.usage = usage if usage
49
+ task.description = description if description
50
+ else
51
+ @usage, @desc, @hide = usage, description, options[:hide] || false
52
+ end
53
+ end
54
+
55
+ # Defines the long description of the next task.
56
+ #
57
+ # ==== Parameters
58
+ # long description<String>
59
+ #
60
+ def long_desc(long_description, options={})
61
+ if options[:for]
62
+ task = find_and_refresh_task(options[:for])
63
+ task.long_description = long_description if long_description
64
+ else
65
+ @long_desc = long_description
66
+ end
67
+ end
68
+
69
+ # Maps an input to a task. If you define:
70
+ #
71
+ # map "-T" => "list"
72
+ #
73
+ # Running:
74
+ #
75
+ # thor -T
76
+ #
77
+ # Will invoke the list task.
78
+ #
79
+ # ==== Parameters
80
+ # Hash[String|Array => Symbol]:: Maps the string or the strings in the array to the given task.
81
+ #
82
+ def map(mappings=nil)
83
+ @map ||= from_superclass(:map, {})
84
+
85
+ if mappings
86
+ mappings.each do |key, value|
87
+ if key.respond_to?(:each)
88
+ key.each {|subkey| @map[subkey] = value}
89
+ else
90
+ @map[key] = value
91
+ end
92
+ end
93
+ end
94
+
95
+ @map
96
+ end
97
+
98
+ # Declares the options for the next task to be declared.
99
+ #
100
+ # ==== Parameters
101
+ # Hash[Symbol => Object]:: The hash key is the name of the option and the value
102
+ # is the type of the option. Can be :string, :array, :hash, :boolean, :numeric
103
+ # or :required (string). If you give a value, the type of the value is used.
104
+ #
105
+ def method_options(options=nil)
106
+ @method_options ||= {}
107
+ build_options(options, @method_options) if options
108
+ @method_options
109
+ end
110
+
111
+ alias options method_options
112
+
113
+ # Adds an option to the set of method options. If :for is given as option,
114
+ # it allows you to change the options from a previous defined task.
115
+ #
116
+ # def previous_task
117
+ # # magic
118
+ # end
119
+ #
120
+ # method_option :foo => :bar, :for => :previous_task
121
+ #
122
+ # def next_task
123
+ # # magic
124
+ # end
125
+ #
126
+ # ==== Parameters
127
+ # name<Symbol>:: The name of the argument.
128
+ # options<Hash>:: Described below.
129
+ #
130
+ # ==== Options
131
+ # :desc - Description for the argument.
132
+ # :required - If the argument is required or not.
133
+ # :default - Default value for this argument. It cannot be required and have default values.
134
+ # :aliases - Aliases for this option.
135
+ # :type - The type of the argument, can be :string, :hash, :array, :numeric or :boolean.
136
+ # :banner - String to show on usage notes.
137
+ # :hide - If you want to hide this option from the help.
138
+ #
139
+ def method_option(name, options={})
140
+ scope = if options[:for]
141
+ find_and_refresh_task(options[:for]).options
142
+ else
143
+ method_options
144
+ end
145
+
146
+ build_option(name, options, scope)
147
+ end
148
+
149
+ alias option method_option
150
+
151
+ # Prints help information for the given task.
152
+ #
153
+ # ==== Parameters
154
+ # shell<Thor::Shell>
155
+ # task_name<String>
156
+ #
157
+ def task_help(shell, task_name)
158
+ meth = normalize_task_name(task_name)
159
+ task = all_tasks[meth]
160
+ handle_no_task_error(meth) unless task
161
+
162
+ shell.say "Usage:"
163
+ shell.say " #{banner(task)}"
164
+ shell.say
165
+ class_options_help(shell, nil => task.options.map { |_, o| o })
166
+ if task.long_description
167
+ shell.say "Description:"
168
+ shell.print_wrapped(task.long_description, :indent => 2)
169
+ else
170
+ shell.say task.description
171
+ end
172
+ end
173
+
174
+ # Prints help information for this class.
175
+ #
176
+ # ==== Parameters
177
+ # shell<Thor::Shell>
178
+ #
179
+ def help(shell, subcommand = false)
180
+ list = printable_tasks(true, subcommand)
181
+ Thor::Util.thor_classes_in(self).each do |klass|
182
+ list += klass.printable_tasks(false)
183
+ end
184
+ list.sort!{ |a,b| a[0] <=> b[0] }
185
+
186
+ shell.say "Tasks:"
187
+ shell.print_table(list, :indent => 2, :truncate => true)
188
+ shell.say
189
+ class_options_help(shell)
190
+ end
191
+
192
+ # Returns tasks ready to be printed.
193
+ def printable_tasks(all = true, subcommand = false)
194
+ (all ? all_tasks : tasks).map do |_, task|
195
+ next if task.hidden?
196
+ item = []
197
+ item << banner(task, false, subcommand)
198
+ item << (task.description ? "# #{task.description.gsub(/\s+/m,' ')}" : "")
199
+ item
200
+ end.compact
201
+ end
202
+
203
+ def subcommands
204
+ @subcommands ||= from_superclass(:subcommands, [])
205
+ end
206
+
207
+ def subcommand(subcommand, subcommand_class)
208
+ self.subcommands << subcommand.to_s
209
+ subcommand_class.subcommand_help subcommand
210
+
211
+ define_method(subcommand) do |*args|
212
+ args, opts = Thor::Arguments.split(args)
213
+ invoke subcommand_class, args, opts
214
+ end
215
+ end
216
+
217
+ # Extend check unknown options to accept a hash of conditions.
218
+ #
219
+ # === Parameters
220
+ # options<Hash>: A hash containing :only and/or :except keys
221
+ def check_unknown_options!(options={})
222
+ @check_unknown_options ||= Hash.new
223
+ options.each do |key, value|
224
+ if value
225
+ @check_unknown_options[key] = Array(value)
226
+ else
227
+ @check_unknown_options.delete(key)
228
+ end
229
+ end
230
+ @check_unknown_options
231
+ end
232
+
233
+ # Overwrite check_unknown_options? to take subcommands and options into account.
234
+ def check_unknown_options?(config) #:nodoc:
235
+ options = check_unknown_options
236
+ return false unless options
237
+
238
+ task = config[:current_task]
239
+ return true unless task
240
+
241
+ name = task.name
242
+
243
+ if subcommands.include?(name)
244
+ false
245
+ elsif options[:except]
246
+ !options[:except].include?(name.to_sym)
247
+ elsif options[:only]
248
+ options[:only].include?(name.to_sym)
249
+ else
250
+ true
251
+ end
252
+ end
253
+
254
+ protected
255
+
256
+ # The method responsible for dispatching given the args.
257
+ def dispatch(meth, given_args, given_opts, config) #:nodoc:
258
+ meth ||= retrieve_task_name(given_args)
259
+ task = all_tasks[normalize_task_name(meth)]
260
+
261
+ if task
262
+ args, opts = Thor::Options.split(given_args)
263
+ else
264
+ args, opts = given_args, nil
265
+ task = Thor::DynamicTask.new(meth)
266
+ end
267
+
268
+ opts = given_opts || opts || []
269
+ config.merge!(:current_task => task, :task_options => task.options)
270
+
271
+ instance = new(args, opts, config)
272
+ yield instance if block_given?
273
+ args = instance.args
274
+ trailing = args[Range.new(arguments.size, -1)]
275
+ instance.invoke_task(task, trailing || [])
276
+ end
277
+
278
+ # The banner for this class. You can customize it if you are invoking the
279
+ # thor class by another ways which is not the Thor::Runner. It receives
280
+ # the task that is going to be invoked and a boolean which indicates if
281
+ # the namespace should be displayed as arguments.
282
+ #
283
+ def banner(task, namespace = nil, subcommand = false)
284
+ "#{basename} #{task.formatted_usage(self, $thor_runner, subcommand)}"
285
+ end
286
+
287
+ def baseclass #:nodoc:
288
+ Thor
289
+ end
290
+
291
+ def create_task(meth) #:nodoc:
292
+ if @usage && @desc
293
+ base_class = @hide ? Thor::HiddenTask : Thor::Task
294
+ tasks[meth] = base_class.new(meth, @desc, @long_desc, @usage, method_options)
295
+ @usage, @desc, @long_desc, @method_options, @hide = nil
296
+ true
297
+ elsif self.all_tasks[meth] || meth == "method_missing"
298
+ true
299
+ else
300
+ puts "[WARNING] Attempted to create task #{meth.inspect} without usage or description. " <<
301
+ "Call desc if you want this method to be available as task or declare it inside a " <<
302
+ "no_tasks{} block. Invoked from #{caller[1].inspect}."
303
+ false
304
+ end
305
+ end
306
+
307
+ def initialize_added #:nodoc:
308
+ class_options.merge!(method_options)
309
+ @method_options = nil
310
+ end
311
+
312
+ # Retrieve the task name from given args.
313
+ def retrieve_task_name(args) #:nodoc:
314
+ meth = args.first.to_s unless args.empty?
315
+ if meth && (map[meth] || meth !~ /^\-/)
316
+ args.shift
317
+ else
318
+ nil
319
+ end
320
+ end
321
+
322
+ # receives a (possibly nil) task name and returns a name that is in
323
+ # the tasks hash. In addition to normalizing aliases, this logic
324
+ # will determine if a shortened command is an unambiguous prefix of
325
+ # a task or alias.
326
+ #
327
+ # +normalize_task_name+ also converts names like +animal-prison+
328
+ # into +animal_prison+.
329
+ def normalize_task_name(meth) #:nodoc:
330
+ return default_task.to_s.gsub('-', '_') unless meth
331
+
332
+ possibilities = find_task_possibilities(meth)
333
+ if possibilities.size > 1
334
+ raise ArgumentError, "Ambiguous task #{meth} matches [#{possibilities.join(', ')}]"
335
+ elsif possibilities.size < 1
336
+ meth = meth || default_task
337
+ elsif map[meth]
338
+ meth = map[meth]
339
+ else
340
+ meth = possibilities.first
341
+ end
342
+
343
+ meth.to_s.gsub('-','_') # treat foo-bar as foo_bar
344
+ end
345
+
346
+ # this is the logic that takes the task name passed in by the user
347
+ # and determines whether it is an unambiguous prefix of a task or
348
+ # alias name.
349
+ def find_task_possibilities(meth)
350
+ len = meth.to_s.length
351
+ possibilities = all_tasks.merge(map).keys.select { |n| meth == n[0, len] }.sort
352
+ unique_possibilities = possibilities.map { |k| map[k] || k }.uniq
353
+
354
+ if possibilities.include?(meth)
355
+ [meth]
356
+ elsif unique_possibilities.size == 1
357
+ unique_possibilities
358
+ else
359
+ possibilities
360
+ end
361
+ end
362
+
363
+ def subcommand_help(cmd)
364
+ desc "help [COMMAND]", "Describe subcommands or one specific subcommand"
365
+ class_eval <<-RUBY
366
+ def help(task = nil, subcommand = true); super; end
367
+ RUBY
368
+ end
369
+ end
370
+
371
+ include Thor::Base
372
+
373
+ map HELP_MAPPINGS => :help
374
+
375
+ desc "help [TASK]", "Describe available tasks or one specific task"
376
+ def help(task = nil, subcommand = false)
377
+ task ? self.class.task_help(shell, task) : self.class.help(shell, subcommand)
378
+ end
379
+ end