af 0.3.18.12 → 0.3.19.beta.1

Sign up to get free protection for your applications and to get access to all the features.
data/README.md CHANGED
@@ -58,6 +58,7 @@ MIT license, please see the LICENSE file. All rights reserved._
58
58
  map <appname> <url> Register the application to the url
59
59
  unmap <appname> <url> Unregister the application from the url
60
60
  instances <appname> <num|delta> Scale the application instances up or down
61
+ rename <curname> <newname> Change the application's name
61
62
 
62
63
  Application Information
63
64
  crashes <appname> List recent application crashes
@@ -23,7 +23,7 @@ module VMC::Cli::Command
23
23
 
24
24
  display "\n"
25
25
  return display "No Applications" if apps.nil? || apps.empty?
26
-
26
+
27
27
  infra_supported = !apps.detect { |a| a[:infra] }.nil?
28
28
 
29
29
  apps_table = table do |t|
@@ -34,7 +34,7 @@ module VMC::Cli::Command
34
34
  if infra_supported
35
35
  a << ( app[:infra] ? app[:infra][:provider] : " " )
36
36
  end
37
- t << a
37
+ t << a
38
38
  end
39
39
  end
40
40
  display apps_table
@@ -58,7 +58,7 @@ module VMC::Cli::Command
58
58
  def console(appname, interactive=true)
59
59
 
60
60
  app = client.app_info(appname)
61
- infra_name = app[:infra] ? app[:infra][:name] : 'aws' # FIXME
61
+ infra_name = app[:infra] ? app[:infra][:name] : 'aws' # FIXME
62
62
 
63
63
  unless defined? Caldecott
64
64
  display "To use `vmc rails-console', you must first install Caldecott:"
@@ -213,28 +213,28 @@ module VMC::Cli::Command
213
213
  def download(appname, path=nil)
214
214
  path = File.expand_path(path || "#{appname}.zip" )
215
215
  banner = "Downloading last pushed source code to #{path}: "
216
- display banner, false
216
+ display banner, false
217
217
  client.app_download(appname, path)
218
218
  display 'OK'.green
219
219
  end
220
-
220
+
221
221
  def pull(appname, path=nil)
222
222
  path = File.expand_path(path || appname)
223
223
  banner = "Pulling last pushed source code: "
224
- display banner, false
224
+ display banner, false
225
225
  client.app_pull(appname, path)
226
226
  display 'OK'.green
227
227
  end
228
-
228
+
229
229
  def clone(src_appname, dest_appname, dest_infra=nil)
230
-
230
+
231
231
  # FIXME need to ask for dest_appname if nil
232
-
232
+
233
233
  err "Application '#{dest_appname}' already exists" if app_exists?(dest_appname)
234
234
 
235
235
  app = client.app_info(src_appname)
236
236
 
237
- if client.infra_supported?
237
+ if client.infra_supported?
238
238
  dest_infra = @options[:infra] || client.infra_name_for_description(
239
239
  ask("Select Infrastructure",:indexed => true, :choices => client.infra_descriptions))
240
240
  client.infra = dest_infra
@@ -251,7 +251,7 @@ module VMC::Cli::Command
251
251
  pull(src_appname,zip_path)
252
252
 
253
253
  display "Cloning '#{src_appname}' to '#{dest_appname}': "
254
-
254
+
255
255
  manifest = {
256
256
  :name => "#{dest_appname}",
257
257
  :staging => app[:staging],
@@ -261,9 +261,9 @@ module VMC::Cli::Command
261
261
  }
262
262
  manifest[:staging][:command] = app[:staging][:command] if app[:staging][:command]
263
263
  manifest[:infra] = { :provider => dest_infra } if dest_infra
264
-
265
- client.create_app(dest_appname, manifest)
266
-
264
+
265
+ client.create_app(dest_appname, manifest)
266
+
267
267
  # Stage and upload the app bits.
268
268
  upload_app_bits(dest_appname, zip_path, dest_infra)
269
269
 
@@ -289,15 +289,15 @@ module VMC::Cli::Command
289
289
  display 'OK'.green
290
290
  else
291
291
  err "Import data into '#{service}' failed"
292
- end
292
+ end
293
293
  end
294
-
294
+
295
295
  no_start = @options[:nostart]
296
- start(dest_appname, true) unless no_start
297
-
296
+ start(dest_appname, true) unless no_start
297
+
298
298
  end
299
299
  end
300
-
300
+
301
301
  def logs(appname)
302
302
  # Check if we have an app before progressing further
303
303
  client.app_info(appname)
@@ -524,7 +524,7 @@ module VMC::Cli::Command
524
524
  check_unreachable_links(path,afi.included_files(files))
525
525
 
526
526
  copy_files( path, ignore_sockets( afi.included_files(files)), explode_dir )
527
-
527
+
528
528
  end
529
529
  end
530
530
  end
@@ -735,9 +735,17 @@ module VMC::Cli::Command
735
735
  health = format("%.3f", healthy_instances.to_f / expected_instance).to_f
736
736
  end
737
737
 
738
- return 'RUNNING' if health && health == 1.0
739
- return "#{(health * 100).round}%" if health
740
- return 'N/A'
738
+ if health
739
+ if health == 1.0
740
+ return "RUNNING"
741
+ else
742
+ return "#{(health * 100).round}%"
743
+ end
744
+ elsif d[:state] == "STARTED"
745
+ return 'N/A' # unstarted instances
746
+ else
747
+ return d[:state]
748
+ end
741
749
  end
742
750
 
743
751
  def app_started_properly(appname, error_on_health)
@@ -1111,12 +1119,12 @@ module VMC::Cli::Command
1111
1119
  }
1112
1120
  manifest[:staging][:command] = command if command
1113
1121
  manifest[:infra] = { :provider => infra } if infra
1114
-
1122
+
1115
1123
  # Send the manifest to the cloud controller
1116
1124
  client.create_app(appname, manifest)
1117
1125
  display 'OK'.green
1118
1126
 
1119
-
1127
+
1120
1128
  existing = Set.new(client.services.collect { |s| s[:name] })
1121
1129
 
1122
1130
  if @app_info && services = @app_info["services"]
@@ -27,7 +27,7 @@ module VMC::Cli
27
27
 
28
28
  load_manifest manifest_file if manifest_file
29
29
  end
30
-
30
+
31
31
  def manifest_file
32
32
  return @options[:manifest] if @options[:manifest]
33
33
  return @manifest_file if @manifest_file
@@ -83,9 +83,16 @@ module VMC::Cli::Command
83
83
  def infras
84
84
  infras_info = client.infras
85
85
  return display "Multiple infras not supported" if infras_info.empty?
86
- itable = table do |t|
87
- t.headings = [ 'Name','Description' ]
88
- infras_info.each { |i| t << [i[:infra], i[:description]] }
86
+ if infras_info.detect {|i| i.has_key?(:available) && i[:available] == false } # If one or more infras is unavailable
87
+ itable = table do |t|
88
+ t.headings = [ 'Name','Description','Message' ]
89
+ infras_info.each { |i| t << [i[:infra], i[:description], i[:available] ? '' : 'Unavailable - ' + i[:unavail_message]] }
90
+ end
91
+ else # All infras are available
92
+ itable = table do |t|
93
+ t.headings = [ 'Name','Description' ]
94
+ infras_info.each { |i| t << [i[:infra], i[:description]] }
95
+ end
89
96
  end
90
97
  display "\n"
91
98
  display itable
@@ -47,7 +47,7 @@ module VMC::Cli::Command
47
47
  :indexed => true, :choices => client.infra_descriptions))
48
48
  end
49
49
  end
50
-
50
+
51
51
  create_service_banner(service, name, picked_name, @options[:infra])
52
52
  appname = @options[:bind] unless appname
53
53
  bind_service_banner(name, appname) if appname
@@ -93,9 +93,9 @@ module VMC::Cli::Command
93
93
  services.each { |service| bind_service_banner(service, dest_app, false) }
94
94
  check_app_for_restart(dest_app)
95
95
  end
96
-
96
+
97
97
  def export_service(service)
98
- display "Exporting data from '#{service}': ", false
98
+ display "Exporting data from '#{service}': ", false
99
99
  export_info = client.export_service(service)
100
100
  if export_info
101
101
  display 'OK'.green
@@ -104,7 +104,7 @@ module VMC::Cli::Command
104
104
  err "Export data from '#{service}': failed"
105
105
  end
106
106
  end
107
-
107
+
108
108
  def import_service(service,url)
109
109
  display "Importing data into '#{service}': ", false
110
110
  import_info = client.import_service(service,url)
@@ -114,7 +114,7 @@ module VMC::Cli::Command
114
114
  err "Import data into '#{service}' failed"
115
115
  end
116
116
  end
117
-
117
+
118
118
  def tunnel(service=nil, client_name=nil)
119
119
  unless defined? Caldecott
120
120
  display "To use `af tunnel', you must first install Caldecott:"
@@ -154,7 +154,7 @@ module VMC::Cli::Command
154
154
  infra_name = info[:infra] ? info[:infra][:name] : default_infra
155
155
  err "Infra '#{infra_name}' is not valid" unless client.infra_valid?(infra_name)
156
156
  end
157
-
157
+
158
158
  if not tunnel_pushed?(infra_name)
159
159
  display "Deploying tunnel application '#{tunnel_appname(infra_name)}'."
160
160
  auth = UUIDTools::UUID.random_create.to_s
@@ -2,6 +2,9 @@ module VMC::Cli::Command
2
2
 
3
3
  class User < Base
4
4
 
5
+ # Errors
6
+ class InvalidLogin < VMC::Client::TargetError; end
7
+
5
8
  def info
6
9
  info = client_info
7
10
  username = info[:user] || 'N/A'
@@ -10,27 +13,28 @@ module VMC::Cli::Command
10
13
  end
11
14
 
12
15
  def login(email=nil)
13
- email = @options[:email] unless email
14
- password = @options[:password]
15
- tries ||= 0
16
+ display "Attempting login to [#{target_url}]" if target_url
17
+ begin
18
+ email = @options[:email] unless email
19
+ password = @options[:password]
20
+ tries ||= 0
16
21
 
17
- unless no_prompt
18
- display "Attempting login to [#{target_url}]" if target_url
19
- email ||= ask("Email")
20
- password ||= ask("Password", :echo => "*")
21
- end
22
+ unless no_prompt
23
+ email ||= ask("Email")
24
+ password ||= ask("Password", :echo => "*")
25
+ end
22
26
 
23
- err "Need a valid email" unless email
24
- err "Need a password" unless password
25
- login_and_save_token(email, password)
26
- say "Successfully logged into [#{target_url}]".green
27
- rescue VMC::Client::TargetError
28
- display "Problem with login, invalid account or password when attempting to login to '#{target_url}'".red
29
- retry if (tries += 1) < 3 && prompt_ok && !@options[:password]
30
- exit 1
31
- rescue => e
32
- display "Problem with login to '#{target_url}', #{e}, try again or register for an account.".red
33
- exit 1
27
+ err "Need a valid email" unless email
28
+ err "Need a password" unless password
29
+ login_and_save_token(email, password)
30
+ say "Successfully logged into [#{target_url}]".green
31
+ rescue VMC::Client::TargetError
32
+ if (tries += 1) < 3 && prompt_ok && !@options[:password]
33
+ display "Problem with login, invalid account or password when attempting to login to '#{target_url}'".red
34
+ retry
35
+ end
36
+ raise InvalidLogin, "Problem with login, invalid account or password when attempting to login to '#{target_url}'"
37
+ end
34
38
  end
35
39
 
36
40
  def logout
@@ -15,6 +15,7 @@ module VMC::Cli
15
15
  ALIASES_FILE = '~/.af_aliases'
16
16
  CLIENTS_FILE = '~/.af_clients'
17
17
  MICRO_FILE = '~/.af_micro'
18
+ CRASH_FILE = '~/.af_crash'
18
19
 
19
20
  STOCK_CLIENTS = File.expand_path("../../../config/clients.yml", __FILE__)
20
21
 
@@ -47,6 +48,11 @@ module VMC::Cli
47
48
  lock_and_write(target_file, target_host)
48
49
  end
49
50
 
51
+ def store_crash(log)
52
+ crash_file = File.expand_path(CRASH_FILE)
53
+ lock_and_write(crash_file, log)
54
+ end
55
+
50
56
  def all_tokens(token_file_path=nil)
51
57
  token_file = File.expand_path(token_file_path || TOKEN_FILE)
52
58
  return nil unless File.exists? token_file
@@ -18,7 +18,7 @@ module VMC::Cli
18
18
  'Erlang/OTP Rebar' => ['otp_rebar', { :mem => '64M', :description => 'Erlang/OTP Rebar Application'}],
19
19
  'WSGI' => ['wsgi', { :mem => '64M', :description => 'Python WSGI Application'}],
20
20
  'Django' => ['django', { :mem => '128M', :description => 'Python Django Application'}],
21
- 'dotNet' => ['dotNet', { :mem => '128M', :description => '.Net Web Application'}],
21
+ 'aspdotnet' => ['aspdotnet', { :mem => '128M', :description => 'ASP.NET Application'}],
22
22
  'Rack' => ['rack', { :mem => '128M', :description => 'Rack Application'}],
23
23
  'Play' => ['play', { :mem => '256M', :description => 'Play Framework Application'}]
24
24
  }
@@ -114,8 +114,8 @@ module VMC::Cli
114
114
  return Framework.lookup('WSGI')
115
115
 
116
116
  # .Net
117
- elsif !Dir.glob('web.config').empty?
118
- return Framework.lookup('dotNet')
117
+ elsif !Dir.glob('web.config', File::FNM_CASEFOLD).empty?
118
+ return Framework.lookup('aspdotnet')
119
119
 
120
120
  # Node.js
121
121
  elsif !Dir.glob('*.js').empty?
@@ -48,6 +48,7 @@ class VMC::Cli::Runner
48
48
  # generic tracing and debugging
49
49
  opts.on('-t [TKEY]') { |tkey| @options[:trace] = tkey || true }
50
50
  opts.on('--trace [TKEY]') { |tkey| @options[:trace] = tkey || true }
51
+ opts.on('--crash') { @options[:crash] = true }
51
52
 
52
53
  # start application in debug mode
53
54
  opts.on('-d [MODE]') { |mode| @options[:debug] = mode || "run" }
@@ -98,7 +99,7 @@ class VMC::Cli::Runner
98
99
 
99
100
  # Proxying for another user, requires admin privileges
100
101
  opts.on('-u PROXY') { |proxy| @options[:proxy] = proxy }
101
-
102
+
102
103
  # Select infrastructure
103
104
  opts.on('--infra INFRA') { |infra| @options[:infra] = infra }
104
105
 
@@ -285,7 +286,7 @@ class VMC::Cli::Runner
285
286
  else
286
287
  set_cmd(:apps, :files, 2)
287
288
  end
288
-
289
+
289
290
  when 'download'
290
291
  usage('af download <appname> [path]')
291
292
  if @args.size == 1
@@ -293,7 +294,7 @@ class VMC::Cli::Runner
293
294
  else
294
295
  set_cmd(:apps, :download, 2)
295
296
  end
296
-
297
+
297
298
  when 'pull'
298
299
  usage('af pull <appname> [path]')
299
300
  if @args.size == 1
@@ -389,16 +390,16 @@ class VMC::Cli::Runner
389
390
  when 'export-service'
390
391
  usage('af export-service <service-name>')
391
392
  set_cmd(:services, :export_service, 1)
392
-
393
+
393
394
  when 'import-service'
394
395
  usage('af import-service <service-name> <url>')
395
396
  set_cmd(:services, :import_service, 2)
396
-
397
+
397
398
  when 'clone'
398
399
  usage('af clone <src-app> <dest-app> [<infra>]')
399
400
  set_cmd(:apps, :clone, 2) if @args.size == 2
400
401
  set_cmd(:apps, :clone, 3) if @args.size == 3
401
-
402
+
402
403
  when 'aliases'
403
404
  usage('af aliases')
404
405
  set_cmd(:misc, :aliases)
@@ -484,7 +485,45 @@ class VMC::Cli::Runner
484
485
  @usage_error
485
486
  end
486
487
 
488
+ def crash_log(e, message = nil)
489
+ @finish_time = Time.now
490
+ diff = @finish_time - @start_time
491
+
492
+ if message != nil
493
+ message = "#{message} (#{e.message})"
494
+ else
495
+ message = e.message
496
+ end
497
+
498
+ say message.red
499
+
500
+ @options[:password] = "".rjust(@options[:password].length, '*') if @options[:password]
501
+
502
+ log = ""
503
+ log += "Action: #{@action}\n"
504
+ log += "Arguments: #{@args.join(' ')}\n" if "#{@action}" != 'environment_add'
505
+ log += "Options: #{@options.to_json}\n"
506
+ log += "Execution Time: %.2fs\n" % diff
507
+ log += "Target: #{VMC::Cli::Config.target_url}\n"
508
+ log += "Client: v#{VMC::Cli::VERSION}\n"
509
+ log += "Platform: #{RUBY_PLATFORM} - Ruby:#{RUBY_VERSION}-#{RUBY_PATCHLEVEL}\n"
510
+ log += "Type: #{e.class}\n"
511
+ log += "Message: #{e.message}\n"
512
+ log += "Stack Trace:\n"
513
+ e.backtrace.each do |trace|
514
+ log += " #{trace}\n"
515
+ end
516
+
517
+ if @options[:crash] == true
518
+ say "--- #{File.expand_path(VMC::Cli::Config::CRASH_FILE)} ---"
519
+ say log
520
+ end
521
+
522
+ VMC::Cli::Config.store_crash(log)
523
+ end
524
+
487
525
  def run
526
+ @start_time = Time.now
488
527
 
489
528
  trap('TERM') { print "\nTerminated\n"; exit(false)}
490
529
 
@@ -512,15 +551,21 @@ class VMC::Cli::Runner
512
551
  end
513
552
 
514
553
  rescue OptionParser::InvalidOption => e
515
- puts(e.message.red)
554
+ crash_log(e)
516
555
  puts("\n")
517
556
  puts(basic_usage)
518
557
  @exit_status = false
519
558
  rescue OptionParser::AmbiguousOption => e
520
- puts(e.message.red)
559
+ crash_log(e)
521
560
  puts("\n")
522
561
  puts(basic_usage)
523
562
  @exit_status = false
563
+ rescue VMC::Cli::Command::User::InvalidLogin => e
564
+ crash_log(e)
565
+ @exit_status = false
566
+ rescue VMC::Client::BadTarget => e
567
+ crash_log(e, "Problem with login to '#{VMC::Cli::Config.target_url}', try again or register for an account.")
568
+ @exit_status = false
524
569
  rescue VMC::Client::AuthError => e
525
570
  if VMC::Cli::Config.auth_token.nil?
526
571
  puts "Login Required".red
@@ -529,31 +574,29 @@ class VMC::Cli::Runner
529
574
  end
530
575
  @exit_status = false
531
576
  rescue VMC::Client::TargetError, VMC::Client::NotFound, VMC::Client::BadTarget => e
532
- puts e.message.red
577
+ crash_log(e)
533
578
  @exit_status = false
534
579
  rescue VMC::Client::HTTPException => e
535
- puts e.message.red
580
+ crash_log(e, "There was a problem connecting to the target. Please try again in a few moments.")
536
581
  @exit_status = false
537
582
  rescue VMC::Cli::GracefulExit => e
538
583
  # Redirected commands end up generating this exception (kind of goto)
539
584
  rescue VMC::Cli::CliExit => e
540
- puts e.message.red
585
+ crash_log(e)
541
586
  @exit_status = false
542
587
  rescue VMC::Cli::CliError => e
543
- say("Error #{e.error_code}: #{e.message}".red)
588
+ crash_log(e, "Error #{e.error_code}: #{e.message}")
544
589
  @exit_status = false
545
590
  rescue SystemExit => e
546
591
  @exit_status = e.success?
547
592
  rescue SyntaxError => e
548
- puts e.message.red
549
- puts e.backtrace
593
+ crash_log(e)
550
594
  @exit_status = false
551
595
  rescue Interrupt => e
552
- say("\nInterrupted".red)
596
+ crash_log(e, "Interrupted")
553
597
  @exit_status = false
554
598
  rescue Exception => e
555
- puts e.message.red
556
- puts e.backtrace
599
+ crash_log(e)
557
600
  @exit_status = false
558
601
  ensure
559
602
  say("\n")
@@ -2,6 +2,6 @@ module VMC
2
2
  module Cli
3
3
  # This version number is used as the RubyGem release version.
4
4
  # The internal VMC version number is VMC::VERSION.
5
- VERSION = '0.3.18.12'
5
+ VERSION = '0.3.19.beta.1'
6
6
  end
7
7
  end
@@ -28,7 +28,7 @@ class VMC::Client
28
28
  VMC_HTTP_ERROR_CODES = [ 400, 500 ]
29
29
 
30
30
  HTTP_TIMEOUT = ENV['TIMEOUT'] ? ENV['TIMEOUT'].to_i : 10*60
31
-
31
+
32
32
  # Errors
33
33
  class BadTarget < RuntimeError; end
34
34
  class AuthError < RuntimeError; end
@@ -158,7 +158,7 @@ class VMC::Client
158
158
  _, body, headers = http_get(url)
159
159
  body
160
160
  end
161
-
161
+
162
162
  def app_download(name,path)
163
163
  check_login_status
164
164
  url = path(VMC::APPS_PATH, name, "application")
@@ -167,7 +167,7 @@ class VMC::Client
167
167
  file.write(body)
168
168
  file.close
169
169
  end
170
-
170
+
171
171
  def app_pull(name, dir)
172
172
  check_login_status
173
173
  url = path(VMC::APPS_PATH, name, "application")
@@ -247,11 +247,11 @@ class VMC::Client
247
247
  app[:services] = services
248
248
  update_app(appname, app)
249
249
  end
250
-
250
+
251
251
  def export_service(service)
252
252
  json_get(path(VMC::SERVICE_EXPORT_PATH, service))
253
253
  end
254
-
254
+
255
255
  def import_service(service,uri)
256
256
  json_post(path(VMC::SERVICE_IMPORT_PATH, service),{:uri => uri})
257
257
  end
@@ -390,16 +390,16 @@ class VMC::Client
390
390
  "aws.af.cm"
391
391
  end
392
392
  end
393
-
394
- def infra_valid?(name)
393
+
394
+ def infra_valid?(name)
395
395
  infras.detect { |i| i[:infra] == name }
396
396
  end
397
397
 
398
398
  def infra_descriptions
399
- infras.map { |i| i[:description] }
399
+ infras.select{|i| !i.has_key?(:available) || i[:available] == true}.map { |i| i[:description] }
400
400
  end
401
-
402
- def infra_name_for_description(desc)
401
+
402
+ def infra_name_for_description(desc)
403
403
  info = infras.detect { |i| i[:description] == desc }
404
404
  info ? info[:infra] : ""
405
405
  end
@@ -559,5 +559,5 @@ class VMC::Client
559
559
  def infras_match?(o1,o2)
560
560
  o1 && o2 && ( o1[:infra] == o2[:infra])
561
561
  end
562
-
562
+
563
563
  end
metadata CHANGED
@@ -1,213 +1,225 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: af
3
- version: !ruby/object:Gem::Version
4
- version: 0.3.18.12
5
- prerelease:
3
+ version: !ruby/object:Gem::Version
4
+ hash: 62196233
5
+ prerelease: 7
6
+ segments:
7
+ - 0
8
+ - 3
9
+ - 19
10
+ - beta
11
+ - 1
12
+ version: 0.3.19.beta.1
6
13
  platform: ruby
7
- authors:
14
+ authors:
8
15
  - AppFog
9
16
  autorequire:
10
17
  bindir: bin
11
18
  cert_chain: []
12
- date: 2013-01-28 00:00:00.000000000 Z
13
- dependencies:
14
- - !ruby/object:Gem::Dependency
19
+
20
+ date: 2013-09-18 00:00:00 -07:00
21
+ default_executable:
22
+ dependencies:
23
+ - !ruby/object:Gem::Dependency
15
24
  name: json_pure
16
- requirement: !ruby/object:Gem::Requirement
17
- none: false
18
- requirements:
19
- - - ! '>='
20
- - !ruby/object:Gem::Version
21
- version: 1.5.1
22
- - - <
23
- - !ruby/object:Gem::Version
24
- version: 1.7.0
25
- type: :runtime
26
25
  prerelease: false
27
- version_requirements: !ruby/object:Gem::Requirement
26
+ requirement: &id001 !ruby/object:Gem::Requirement
28
27
  none: false
29
- requirements:
30
- - - ! '>='
31
- - !ruby/object:Gem::Version
28
+ requirements:
29
+ - - ">="
30
+ - !ruby/object:Gem::Version
31
+ hash: 1
32
+ segments:
33
+ - 1
34
+ - 5
35
+ - 1
32
36
  version: 1.5.1
33
37
  - - <
34
- - !ruby/object:Gem::Version
38
+ - !ruby/object:Gem::Version
39
+ hash: 11
40
+ segments:
41
+ - 1
42
+ - 7
43
+ - 0
35
44
  version: 1.7.0
36
- - !ruby/object:Gem::Dependency
37
- name: rubyzip
38
- requirement: !ruby/object:Gem::Requirement
39
- none: false
40
- requirements:
41
- - - ~>
42
- - !ruby/object:Gem::Version
43
- version: 0.9.4
44
45
  type: :runtime
46
+ version_requirements: *id001
47
+ - !ruby/object:Gem::Dependency
48
+ name: rubyzip
45
49
  prerelease: false
46
- version_requirements: !ruby/object:Gem::Requirement
50
+ requirement: &id002 !ruby/object:Gem::Requirement
47
51
  none: false
48
- requirements:
52
+ requirements:
49
53
  - - ~>
50
- - !ruby/object:Gem::Version
54
+ - !ruby/object:Gem::Version
55
+ hash: 51
56
+ segments:
57
+ - 0
58
+ - 9
59
+ - 4
51
60
  version: 0.9.4
52
- - !ruby/object:Gem::Dependency
53
- name: rest-client
54
- requirement: !ruby/object:Gem::Requirement
55
- none: false
56
- requirements:
57
- - - ! '>='
58
- - !ruby/object:Gem::Version
59
- version: 1.6.1
60
- - - <
61
- - !ruby/object:Gem::Version
62
- version: 1.7.0
63
61
  type: :runtime
62
+ version_requirements: *id002
63
+ - !ruby/object:Gem::Dependency
64
+ name: rest-client
64
65
  prerelease: false
65
- version_requirements: !ruby/object:Gem::Requirement
66
+ requirement: &id003 !ruby/object:Gem::Requirement
66
67
  none: false
67
- requirements:
68
- - - ! '>='
69
- - !ruby/object:Gem::Version
68
+ requirements:
69
+ - - ">="
70
+ - !ruby/object:Gem::Version
71
+ hash: 13
72
+ segments:
73
+ - 1
74
+ - 6
75
+ - 1
70
76
  version: 1.6.1
71
77
  - - <
72
- - !ruby/object:Gem::Version
78
+ - !ruby/object:Gem::Version
79
+ hash: 11
80
+ segments:
81
+ - 1
82
+ - 7
83
+ - 0
73
84
  version: 1.7.0
74
- - !ruby/object:Gem::Dependency
75
- name: terminal-table
76
- requirement: !ruby/object:Gem::Requirement
77
- none: false
78
- requirements:
79
- - - ~>
80
- - !ruby/object:Gem::Version
81
- version: 1.4.2
82
85
  type: :runtime
86
+ version_requirements: *id003
87
+ - !ruby/object:Gem::Dependency
88
+ name: terminal-table
83
89
  prerelease: false
84
- version_requirements: !ruby/object:Gem::Requirement
90
+ requirement: &id004 !ruby/object:Gem::Requirement
85
91
  none: false
86
- requirements:
92
+ requirements:
87
93
  - - ~>
88
- - !ruby/object:Gem::Version
94
+ - !ruby/object:Gem::Version
95
+ hash: 3
96
+ segments:
97
+ - 1
98
+ - 4
99
+ - 2
89
100
  version: 1.4.2
90
- - !ruby/object:Gem::Dependency
91
- name: interact
92
- requirement: !ruby/object:Gem::Requirement
93
- none: false
94
- requirements:
95
- - - ~>
96
- - !ruby/object:Gem::Version
97
- version: 0.4.0
98
101
  type: :runtime
102
+ version_requirements: *id004
103
+ - !ruby/object:Gem::Dependency
104
+ name: interact
99
105
  prerelease: false
100
- version_requirements: !ruby/object:Gem::Requirement
106
+ requirement: &id005 !ruby/object:Gem::Requirement
101
107
  none: false
102
- requirements:
108
+ requirements:
103
109
  - - ~>
104
- - !ruby/object:Gem::Version
110
+ - !ruby/object:Gem::Version
111
+ hash: 15
112
+ segments:
113
+ - 0
114
+ - 4
115
+ - 0
105
116
  version: 0.4.0
106
- - !ruby/object:Gem::Dependency
107
- name: addressable
108
- requirement: !ruby/object:Gem::Requirement
109
- none: false
110
- requirements:
111
- - - ~>
112
- - !ruby/object:Gem::Version
113
- version: 2.2.6
114
117
  type: :runtime
118
+ version_requirements: *id005
119
+ - !ruby/object:Gem::Dependency
120
+ name: addressable
115
121
  prerelease: false
116
- version_requirements: !ruby/object:Gem::Requirement
122
+ requirement: &id006 !ruby/object:Gem::Requirement
117
123
  none: false
118
- requirements:
124
+ requirements:
119
125
  - - ~>
120
- - !ruby/object:Gem::Version
126
+ - !ruby/object:Gem::Version
127
+ hash: 11
128
+ segments:
129
+ - 2
130
+ - 2
131
+ - 6
121
132
  version: 2.2.6
122
- - !ruby/object:Gem::Dependency
123
- name: uuidtools
124
- requirement: !ruby/object:Gem::Requirement
125
- none: false
126
- requirements:
127
- - - ~>
128
- - !ruby/object:Gem::Version
129
- version: 2.1.0
130
133
  type: :runtime
134
+ version_requirements: *id006
135
+ - !ruby/object:Gem::Dependency
136
+ name: uuidtools
131
137
  prerelease: false
132
- version_requirements: !ruby/object:Gem::Requirement
138
+ requirement: &id007 !ruby/object:Gem::Requirement
133
139
  none: false
134
- requirements:
140
+ requirements:
135
141
  - - ~>
136
- - !ruby/object:Gem::Version
142
+ - !ruby/object:Gem::Version
143
+ hash: 11
144
+ segments:
145
+ - 2
146
+ - 1
147
+ - 0
137
148
  version: 2.1.0
138
- - !ruby/object:Gem::Dependency
139
- name: rb-readline
140
- requirement: !ruby/object:Gem::Requirement
141
- none: false
142
- requirements:
143
- - - ~>
144
- - !ruby/object:Gem::Version
145
- version: 0.4.2
146
149
  type: :runtime
150
+ version_requirements: *id007
151
+ - !ruby/object:Gem::Dependency
152
+ name: rb-readline
147
153
  prerelease: false
148
- version_requirements: !ruby/object:Gem::Requirement
154
+ requirement: &id008 !ruby/object:Gem::Requirement
149
155
  none: false
150
- requirements:
156
+ requirements:
151
157
  - - ~>
152
- - !ruby/object:Gem::Version
158
+ - !ruby/object:Gem::Version
159
+ hash: 11
160
+ segments:
161
+ - 0
162
+ - 4
163
+ - 2
153
164
  version: 0.4.2
154
- - !ruby/object:Gem::Dependency
165
+ type: :runtime
166
+ version_requirements: *id008
167
+ - !ruby/object:Gem::Dependency
155
168
  name: rake
156
- requirement: !ruby/object:Gem::Requirement
157
- none: false
158
- requirements:
159
- - - ! '>='
160
- - !ruby/object:Gem::Version
161
- version: '0'
162
- type: :development
163
169
  prerelease: false
164
- version_requirements: !ruby/object:Gem::Requirement
165
- none: false
166
- requirements:
167
- - - ! '>='
168
- - !ruby/object:Gem::Version
169
- version: '0'
170
- - !ruby/object:Gem::Dependency
171
- name: rspec
172
- requirement: !ruby/object:Gem::Requirement
170
+ requirement: &id009 !ruby/object:Gem::Requirement
173
171
  none: false
174
- requirements:
175
- - - ~>
176
- - !ruby/object:Gem::Version
177
- version: 1.3.0
172
+ requirements:
173
+ - - ">="
174
+ - !ruby/object:Gem::Version
175
+ hash: 3
176
+ segments:
177
+ - 0
178
+ version: "0"
178
179
  type: :development
180
+ version_requirements: *id009
181
+ - !ruby/object:Gem::Dependency
182
+ name: rspec
179
183
  prerelease: false
180
- version_requirements: !ruby/object:Gem::Requirement
184
+ requirement: &id010 !ruby/object:Gem::Requirement
181
185
  none: false
182
- requirements:
186
+ requirements:
183
187
  - - ~>
184
- - !ruby/object:Gem::Version
188
+ - !ruby/object:Gem::Version
189
+ hash: 27
190
+ segments:
191
+ - 1
192
+ - 3
193
+ - 0
185
194
  version: 1.3.0
186
- - !ruby/object:Gem::Dependency
187
- name: webmock
188
- requirement: !ruby/object:Gem::Requirement
189
- none: false
190
- requirements:
191
- - - ~>
192
- - !ruby/object:Gem::Version
193
- version: 1.5.0
194
195
  type: :development
196
+ version_requirements: *id010
197
+ - !ruby/object:Gem::Dependency
198
+ name: webmock
195
199
  prerelease: false
196
- version_requirements: !ruby/object:Gem::Requirement
200
+ requirement: &id011 !ruby/object:Gem::Requirement
197
201
  none: false
198
- requirements:
202
+ requirements:
199
203
  - - ~>
200
- - !ruby/object:Gem::Version
204
+ - !ruby/object:Gem::Version
205
+ hash: 3
206
+ segments:
207
+ - 1
208
+ - 5
209
+ - 0
201
210
  version: 1.5.0
211
+ type: :development
212
+ version_requirements: *id011
202
213
  description: AppFog.com CLI
203
214
  email: support@appfog.com
204
- executables:
215
+ executables:
205
216
  - af
206
217
  extensions: []
207
- extra_rdoc_files:
218
+
219
+ extra_rdoc_files:
208
220
  - README.md
209
221
  - LICENSE
210
- files:
222
+ files:
211
223
  - LICENSE
212
224
  - README.md
213
225
  - Rakefile
@@ -251,28 +263,41 @@ files:
251
263
  - caldecott_helper/Gemfile.lock
252
264
  - caldecott_helper/server.rb
253
265
  - bin/af
266
+ has_rdoc: true
254
267
  homepage: http://appfog.com
255
268
  licenses: []
269
+
256
270
  post_install_message:
257
271
  rdoc_options: []
258
- require_paths:
272
+
273
+ require_paths:
259
274
  - lib
260
- required_ruby_version: !ruby/object:Gem::Requirement
275
+ required_ruby_version: !ruby/object:Gem::Requirement
261
276
  none: false
262
- requirements:
263
- - - ! '>='
264
- - !ruby/object:Gem::Version
265
- version: '0'
266
- required_rubygems_version: !ruby/object:Gem::Requirement
277
+ requirements:
278
+ - - ">="
279
+ - !ruby/object:Gem::Version
280
+ hash: 3
281
+ segments:
282
+ - 0
283
+ version: "0"
284
+ required_rubygems_version: !ruby/object:Gem::Requirement
267
285
  none: false
268
- requirements:
269
- - - ! '>='
270
- - !ruby/object:Gem::Version
271
- version: '0'
286
+ requirements:
287
+ - - ">"
288
+ - !ruby/object:Gem::Version
289
+ hash: 25
290
+ segments:
291
+ - 1
292
+ - 3
293
+ - 1
294
+ version: 1.3.1
272
295
  requirements: []
296
+
273
297
  rubyforge_project:
274
- rubygems_version: 1.8.24
298
+ rubygems_version: 1.6.2
275
299
  signing_key:
276
300
  specification_version: 3
277
301
  summary: AppFog.com CLI
278
302
  test_files: []
303
+