af 0.3.18.12 → 0.3.19.beta.1

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.
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
+