shelly 0.1.24 → 0.1.25

Sign up to get free protection for your applications and to get access to all the features.
data/CHANGELOG.md CHANGED
@@ -1,3 +1,8 @@
1
+ ## 0.1.25 / 2012-09-11
2
+
3
+ * [feature] `shelly check` checks gems based on Cloudfile
4
+ * [bug] Show 10 recent backups in `backup list` command, instead of the oldest
5
+
1
6
  ## 0.1.24 / 2012-09-10
2
7
 
3
8
  * [feature] Support for the extended deploys API
data/lib/shelly/app.rb CHANGED
@@ -9,10 +9,12 @@ module Shelly
9
9
  SERVER_SIZES = %w(small large)
10
10
 
11
11
  attr_accessor :code_name, :databases, :ruby_version, :environment,
12
- :git_url, :domains, :web_server_ip, :size, :thin, :redeem_code
12
+ :git_url, :domains, :web_server_ip, :size, :thin, :redeem_code,
13
+ :content
13
14
 
14
- def initialize(code_name = nil)
15
+ def initialize(code_name = nil, content = nil)
15
16
  self.code_name = code_name
17
+ self.content = content
16
18
  end
17
19
 
18
20
  def databases=(dbs)
@@ -117,7 +119,7 @@ module Shelly
117
119
  guessed = nil
118
120
  cloudfile = Cloudfile.new
119
121
  if cloudfile.present?
120
- clouds = cloudfile.clouds
122
+ clouds = cloudfile.clouds.map(&:code_name)
121
123
  if clouds.grep(/staging/).present?
122
124
  guessed = "production"
123
125
  production_clouds = clouds.grep(/production/)
@@ -236,8 +238,39 @@ module Shelly
236
238
  rsync(source, destination)
237
239
  end
238
240
 
241
+ # Public: Return databases for given Cloud in Cloudfile
242
+ # Returns Array of databases
243
+ def cloud_databases
244
+ content["servers"].map do |server, settings|
245
+ settings["databases"]
246
+ end.flatten.uniq
247
+ end
248
+
249
+ # Public: Delayed job enabled?
250
+ # Returns true if delayed job is present
251
+ def delayed_job?
252
+ option?("delayed_job")
253
+ end
254
+
255
+ # Public: Whenever enabled?
256
+ # Returns true if whenever is present
257
+ def whenever?
258
+ option?("whenever")
259
+ end
260
+
261
+ # Public: Return databases to backup for given Cloud in Cloudfile
262
+ # Returns Array of databases, except redis db
263
+ def backup_databases
264
+ cloud_databases - ['redis']
265
+ end
266
+
239
267
  private
240
268
 
269
+ # Internal: Checks if specified option is present in Cloudfile
270
+ def option?(option)
271
+ content["servers"].any? {|_, settings| settings.has_key?(option)}
272
+ end
273
+
241
274
  def ssh
242
275
  @ssh ||= shelly.console(code_name)
243
276
  end
@@ -1,6 +1,7 @@
1
1
  require "shelly/cli/command"
2
2
  require "shelly/backup"
3
3
  require "shelly/download_progress_bar"
4
+ require 'launchy'
4
5
 
5
6
  module Shelly
6
7
  module CLI
@@ -19,14 +20,14 @@ module Shelly
19
20
  app = multiple_clouds(options[:cloud], "backup list")
20
21
  backups = app.database_backups
21
22
  if backups.present?
22
- limit = -1
23
+ limit = 0
23
24
  unless options[:all] || backups.count < (Shelly::Backup::LIMIT + 1)
24
25
  limit = Shelly::Backup::LIMIT - 1
25
26
  say "Limiting the number of backups to #{Shelly::Backup::LIMIT}."
26
27
  say "Use --all or -a option to list all backups."
27
28
  end
28
29
  to_display = [["Filename", "| Size", "| State"]]
29
- backups[0..limit].each do |backup|
30
+ backups[-limit..-1].each do |backup|
30
31
  to_display << [backup.filename, "| #{backup.human_size}", "| #{backup.state.humanize}"]
31
32
  end
32
33
 
@@ -70,7 +71,7 @@ module Shelly
70
71
  say_error "Cloudfile must be present in current working directory or specify database kind with:", :with_exit => false
71
72
  say_error "`shelly backup create DB_KIND`"
72
73
  end
73
- app.request_backup(kind || cloudfile.backup_databases(app))
74
+ app.request_backup(kind || app.backup_databases)
74
75
  say "Backup requested. It can take up to several minutes for " +
75
76
  "the backup process to finish.", :green
76
77
  rescue Client::ValidationException => e
@@ -384,6 +384,10 @@ We have been notified about it. We will be adding new resources shortly}
384
384
  "Gemfile.lock is missing in git repository",
385
385
  :show_fulfilled => verbose)
386
386
 
387
+ print_check(structure.config_ru?, "File config.ru is present",
388
+ "File config.ru is missing",
389
+ :show_fulfilled => verbose)
390
+
387
391
  print_check(structure.gem?("shelly-dependencies"),
388
392
  "Gem 'shelly-dependencies' is present",
389
393
  "Gem 'shelly-dependencies' is missing, we recommend to install it\n See more at https://shellycloud.com/documentation/requirements#shelly-dependencies",
@@ -395,9 +399,35 @@ We have been notified about it. We will be adding new resources shortly}
395
399
  print_check(structure.gem?("rake"), "Gem 'rake' is present",
396
400
  "Gem 'rake' is missing in the Gemfile", :show_fulfilled => verbose)
397
401
 
398
- print_check(structure.config_ru?, "File config.ru is present",
399
- "File config.ru is missing",
400
- :show_fulfilled => verbose)
402
+
403
+ print_check(structure.gem?("rake"), "Gem 'rake' is present",
404
+ "Gem 'rake' is missing in the Gemfile", :show_fulfilled => verbose)
405
+
406
+ cloudfile = Cloudfile.new
407
+ if cloudfile.present?
408
+ cloudfile.clouds.each do |cloud|
409
+ if cloud.databases.include?('postgresql')
410
+ print_check(structure.gem?("pg") || structure.gem?("postgres"),
411
+ "Postgresql driver is present for '#{cloud}' cloud",
412
+ "Postgresql driver is missing in the Gemfile for '#{cloud}' cloud,\n we recommend adding 'pg' gem to Gemfile",
413
+ :show_fulfilled => verbose)
414
+ end
415
+
416
+ if cloud.delayed_job?
417
+ print_check(structure.gem?("delayed_job"),
418
+ "Gem 'delayed_job' is present for '#{cloud}' cloud",
419
+ "Gem 'delayed_job' is missing in the Gemfile for '#{cloud}' cloud",
420
+ :show_fulfilled => verbose)
421
+ end
422
+
423
+ if cloud.whenever?
424
+ print_check(structure.gem?("whenever"),
425
+ "Gem 'whenever' is present for '#{cloud}' cloud",
426
+ "Gem 'whenever' is missing in the Gemfile for '#{cloud}' cloud",
427
+ :show_fulfilled => verbose)
428
+ end
429
+ end
430
+ end
401
431
 
402
432
  print_check(!structure.gem?("mysql") && !structure.gem?("mysql2"),"",
403
433
  "mysql driver present in the Gemfile (not supported on Shelly Cloud)",
@@ -23,7 +23,7 @@ module Shelly
23
23
  say_error "You are not logged in. To log in use: `shelly login`"
24
24
  rescue Client::NotFoundException => e
25
25
  raise if debug? or e.resource != :cloud
26
- say_error "You have no access to '#{e.id}' cloud defined in Cloudfile"
26
+ say_error "You have no access to '#{e.id}' cloud"
27
27
  rescue Client::GemVersionException => e
28
28
  raise if debug?
29
29
  say "Required shelly gem version: #{e.body["required_version"]}"
@@ -16,7 +16,9 @@ module Shelly
16
16
  # Returns Array of clouds names from Cloudfile
17
17
  # nil if there is no cloudfile
18
18
  def clouds
19
- content.keys.sort if content
19
+ content.keys.sort.map do |code_name|
20
+ Shelly::App.new(code_name, content[code_name.to_s])
21
+ end if content
20
22
  end
21
23
 
22
24
  # Public: Generate example Cloudfile based on object attributes
@@ -35,22 +37,6 @@ module Shelly
35
37
  File.open(path, "a+") { |f| f << generate }
36
38
  end
37
39
 
38
- # Public: Return databases for given Cloud in Cloudfile
39
- # Returns Array of databases
40
- def databases(cloud)
41
- content[cloud.to_s]["servers"].map do |server, settings|
42
- settings["databases"]
43
- end.flatten.uniq
44
- end
45
-
46
- # Public: Return databases to backup for given Cloud in Cloudfile
47
- # Returns Array of databases, except redis db
48
- def backup_databases(cloud)
49
- databases(cloud) - ['redis']
50
- end
51
-
52
- private
53
-
54
40
  # Internal: Load and parse Cloudfile
55
41
  def content
56
42
  return unless present?
@@ -115,9 +115,7 @@ More info at http://git-scm.com/book/en/Git-Basics-Getting-a-Git-Repository}
115
115
  exit 1
116
116
  end
117
117
 
118
- app = Shelly::App.new
119
- app.code_name = cloud || clouds.first
120
- app
118
+ cloud ? Shelly::App.new(cloud) : clouds.first
121
119
  end
122
120
 
123
121
  def print_logs(logs)
@@ -1,3 +1,3 @@
1
1
  module Shelly
2
- VERSION = "0.1.24"
2
+ VERSION = "0.1.25"
3
3
  end
@@ -7,8 +7,7 @@ describe Shelly::App do
7
7
  Dir.chdir("/projects/foo")
8
8
  @client = mock(:api_url => "https://api.example.com", :shellyapp_url => "http://shellyapp.example.com")
9
9
  Shelly::Client.stub(:new).and_return(@client)
10
- @app = Shelly::App.new
11
- @app.code_name = "foo-staging"
10
+ @app = Shelly::App.new('foo-staging')
12
11
  end
13
12
 
14
13
  describe ".guess_code_name" do
@@ -394,4 +393,48 @@ describe Shelly::App do
394
393
  @app.create_cloudfile
395
394
  end
396
395
  end
396
+
397
+ describe "#databases" do
398
+ before do
399
+ content = {"servers" => {"app1" => {"databases" => ["postgresql", "redis"]},
400
+ "app2" => {"databases" => ["mongodb"]}}}
401
+ @app.stub(:content).and_return(content)
402
+ end
403
+
404
+ it "should return databases in cloudfile" do
405
+ @app.cloud_databases.should =~ ['redis', 'mongodb', 'postgresql']
406
+ end
407
+
408
+ it "should return databases except for redis" do
409
+ @app.backup_databases.should =~ ['postgresql', 'mongodb']
410
+ end
411
+ end
412
+
413
+ describe "#delayed_job?" do
414
+ it "should return true if present" do
415
+ content = {"servers" => {"app1" => {"delayed_job" => 1}}}
416
+ @app.stub(:content).and_return(content)
417
+ @app.delayed_job?.should be_true
418
+ end
419
+
420
+ it "should retrun false if not present" do
421
+ content = {"servers" => {"app1" => {"size" => "small"}}}
422
+ @app.stub(:content).and_return(content)
423
+ @app.delayed_job?.should be_false
424
+ end
425
+ end
426
+
427
+ describe "#whenever?" do
428
+ it "should return true if present" do
429
+ content = {"servers" => {"app1" => {"whenever" => true}}}
430
+ @app.stub(:content).and_return(content)
431
+ @app.whenever?.should be_true
432
+ end
433
+
434
+ it "should return false if not present" do
435
+ content = {"servers" => {"app1" => {"size" => "small"}}}
436
+ @app.stub(:content).and_return(content)
437
+ @app.whenever?.should be_false
438
+ end
439
+ end
397
440
  end
@@ -135,7 +135,9 @@ describe Shelly::CLI::Backup do
135
135
  FileUtils.mkdir_p("/projects/foo")
136
136
  Dir.chdir("/projects/foo")
137
137
  $stdout.stub(:puts)
138
- @cloudfile = mock(:backup_databases => ['postgresql', 'mongodb'], :clouds => ['foo-staging'])
138
+ @app = mock(:backup_databases => ['postgresql', 'mongodb'], :code_name => "foo-staging")
139
+ Shelly::App.stub(:new).and_return(@app)
140
+ @cloudfile = mock(:present? => true, :clouds => [@app])
139
141
  Shelly::Cloudfile.stub(:new).and_return(@cloudfile)
140
142
  end
141
143
 
@@ -145,7 +147,7 @@ describe Shelly::CLI::Backup do
145
147
 
146
148
  # multiple_clouds is tested in main_spec.rb in describe "#start" block
147
149
  it "should ensure multiple_clouds check" do
148
- @client.stub(:request_backup)
150
+ @app.stub(:request_backup)
149
151
  @backup.should_receive(:multiple_clouds).and_return(@app)
150
152
  invoke(@backup, :create)
151
153
  end
@@ -153,7 +155,7 @@ describe Shelly::CLI::Backup do
153
155
  it "should display errors and exit 1 when kind is not valid" do
154
156
  response = {"errors" => [["kind", "is invalid"]]}
155
157
  exception = Shelly::Client::ValidationException.new(response)
156
- @client.should_receive(:request_backup).and_raise(exception)
158
+ @app.should_receive(:request_backup).and_raise(exception)
157
159
  $stdout.should_receive(:puts).with(red "Kind is invalid")
158
160
  lambda { invoke(@backup, :create) }.should raise_error(SystemExit)
159
161
  end
@@ -169,7 +171,7 @@ describe Shelly::CLI::Backup do
169
171
  end
170
172
 
171
173
  it "should display information about request backup" do
172
- @client.stub(:request_backup)
174
+ @app.stub(:request_backup)
173
175
  $stdout.should_receive(:puts).with(green "Backup requested. It can take up to several minutes for " +
174
176
  "the backup process to finish.")
175
177
  invoke(@backup, :create)
@@ -10,7 +10,7 @@ describe Shelly::CLI::Files do
10
10
  @client.stub(:token).and_return("abc")
11
11
  FileUtils.mkdir_p("/projects/foo")
12
12
  Dir.chdir("/projects/foo")
13
- @app = Shelly::App.new("foo-staging")
13
+ @app = Shelly::App.new("foo-production")
14
14
  Shelly::App.stub(:new).and_return(@app)
15
15
  File.open("Cloudfile", 'w') { |f| f.write("foo-production:\n") }
16
16
  end
@@ -615,7 +615,9 @@ More info at http://git-scm.com/book/en/Git-Basics-Getting-a-Git-Repository\e[0m
615
615
  # this tests multiple_clouds method used in majority of tasks
616
616
  context "multiple clouds in Cloudfile" do
617
617
  before do
618
- File.open("Cloudfile", 'w') {|f| f.write("foo-staging:\nfoo-production:\n") }
618
+ Shelly::App.unstub(:new)
619
+ File.open("Cloudfile", 'w') {|f|
620
+ f.write("foo-staging:\nfoo-production:\n") }
619
621
  end
620
622
 
621
623
  it "should show information to start specific cloud and exit" do
@@ -709,7 +711,7 @@ We have been notified about it. We will be adding new resources shortly")
709
711
  File.open("Cloudfile", 'w') {|f| f.write("foo-production:\n") }
710
712
  Shelly::User.stub(:new).and_return(@user)
711
713
  @client.stub(:apps).and_return([{"code_name" => "foo-production"}, {"code_name" => "foo-staging"}])
712
- @app = Shelly::App.new
714
+ @app = Shelly::App.new("foo-production")
713
715
  Shelly::App.stub(:new).and_return(@app)
714
716
  end
715
717
 
@@ -942,7 +944,7 @@ We have been notified about it. We will be adding new resources shortly")
942
944
  before do
943
945
  Shelly::App.stub(:inside_git_repository?).and_return(true)
944
946
  @user = Shelly::User.new
945
- @app = Shelly::App.new
947
+ @app = Shelly::App.new('foo-staging')
946
948
  @client.stub(:token).and_return("abc")
947
949
  @app.stub(:delete)
948
950
  Shelly::User.stub(:new).and_return(@user)
@@ -1275,7 +1277,7 @@ We have been notified about it. We will be adding new resources shortly")
1275
1277
  before do
1276
1278
  Shelly::App.stub(:inside_git_repository?).and_return(true)
1277
1279
  Bundler::Definition.stub_chain(:build, :specs, :map) \
1278
- .and_return(["thin"])
1280
+ .and_return(["thin", "pg", "delayed_job", "whenever"])
1279
1281
  Shelly::StructureValidator.any_instance.stub(:repo_paths) \
1280
1282
  .and_return(["config.ru", "Gemfile", "Gemfile.lock"])
1281
1283
  end
@@ -1344,6 +1346,62 @@ We have been notified about it. We will be adding new resources shortly")
1344
1346
  end
1345
1347
  end
1346
1348
 
1349
+ context "cloudfile" do
1350
+ before do
1351
+ cloud = mock(:code_name => "foo-staging", :databases => ["postgresql"],
1352
+ :whenever? => true, :delayed_job? => true, :to_s => "foo-staging")
1353
+ cloudfile = mock(:clouds => [cloud])
1354
+
1355
+ Shelly::Cloudfile.stub(:new).and_return(cloudfile)
1356
+ end
1357
+
1358
+ context "whenever is enabled" do
1359
+ it "should show that necessary gem doesn't exist" do
1360
+ Bundler::Definition.stub_chain(:build, :specs, :map).and_return([])
1361
+ $stdout.should_receive(:puts).with(" #{red("✗")} Gem 'whenever' is missing in the Gemfile for 'foo-staging' cloud")
1362
+ invoke(@main, :check)
1363
+ end
1364
+
1365
+ it "should show that necessary gem exists" do
1366
+ $stdout.should_receive(:puts).with(" #{green("✓")} Gem 'whenever' is present for 'foo-staging' cloud")
1367
+ invoke(@main, :check)
1368
+ end
1369
+ end
1370
+
1371
+ context "delayed_job is enabled" do
1372
+ it "should show that necessary gem doesn't exist" do
1373
+ Bundler::Definition.stub_chain(:build, :specs, :map).and_return([])
1374
+ $stdout.should_receive(:puts).with(" #{red("✗")} Gem 'delayed_job' is missing in the Gemfile for 'foo-staging' cloud")
1375
+ invoke(@main, :check)
1376
+ end
1377
+
1378
+ it "should show that necessary gem exists" do
1379
+ $stdout.should_receive(:puts).with(" #{green("✓")} Gem 'delayed_job' is present for 'foo-staging' cloud")
1380
+ invoke(@main, :check)
1381
+ end
1382
+ end
1383
+
1384
+ context "postgresql is enabled" do
1385
+ it "should show that necessary gem doesn't exist" do
1386
+ Bundler::Definition.stub_chain(:build, :specs, :map).and_return([])
1387
+ $stdout.should_receive(:puts).with(" #{red("✗")} Postgresql driver is missing in the Gemfile for 'foo-staging' cloud,\n we recommend adding 'pg' gem to Gemfile")
1388
+ invoke(@main, :check)
1389
+ end
1390
+
1391
+ it "should show that necessary gem exists - postgres" do
1392
+ Bundler::Definition.stub_chain(:build, :specs, :map).and_return(["postgres"])
1393
+ $stdout.should_receive(:puts).with(" #{green("✓")} Postgresql driver is present for 'foo-staging' cloud")
1394
+ invoke(@main, :check)
1395
+ end
1396
+
1397
+ it "should show that necessary gem exists - pg" do
1398
+ Bundler::Definition.stub_chain(:build, :specs, :map).and_return(["pg"])
1399
+ $stdout.should_receive(:puts).with(" #{green("✓")} Postgresql driver is present for 'foo-staging' cloud")
1400
+ invoke(@main, :check)
1401
+ end
1402
+ end
1403
+ end
1404
+
1347
1405
  context "when mysql gem exists" do
1348
1406
  it "should show that mysql gem is not supported by Shelly Cloud" do
1349
1407
  Bundler::Definition.stub_chain(:build, :specs, :map).and_return(["mysql"])
@@ -84,7 +84,7 @@ describe Shelly::CLI::Runner do
84
84
  it "should rescue not found exception for cloud" do
85
85
  exception = Shelly::Client::NotFoundException.new({"resource" => "cloud", "id" => "foooo"}, 404)
86
86
  @client.stub(:apps).and_raise(exception)
87
- $stdout.should_receive(:puts).with("You have no access to 'foooo' cloud defined in Cloudfile")
87
+ $stdout.should_receive(:puts).with("You have no access to 'foooo' cloud")
88
88
  lambda {
89
89
  @runner.start
90
90
  }.should raise_error(SystemExit)
@@ -8,7 +8,6 @@ describe Shelly::CLI::User do
8
8
  Shelly::CLI::User.stub(:new).and_return(@cli_user)
9
9
  @client = mock
10
10
  Shelly::Client.stub(:new).and_return(@client)
11
- Shelly::User.stub(:guess_email).and_return("")
12
11
  $stdout.stub(:puts)
13
12
  $stdout.stub(:print)
14
13
  @client.stub(:token).and_return("abc")
@@ -5,7 +5,6 @@ describe Shelly::Cloudfile do
5
5
  before do
6
6
  FileUtils.mkdir_p("/projects/foo")
7
7
  Dir.chdir("/projects/foo")
8
- @hash = {:code_name => {:code => "test"}}
9
8
  @client = mock
10
9
  Shelly::Client.stub(:new).and_return(@client)
11
10
  @cloudfile = Shelly::Cloudfile.new
@@ -22,6 +21,68 @@ describe Shelly::Cloudfile do
22
21
  yaml.should == {"domains" => ["*.example.com", "example.com"]}
23
22
  end
24
23
 
24
+ describe "#content" do
25
+ it "should fetch and parse file content" do
26
+ content = <<-config
27
+ foo-staging:
28
+ ruby_version: 1.9.3
29
+ environment: production
30
+ monitoring_email: bob@example.com
31
+ domains:
32
+ - foo-staging.winniecloud.com
33
+ servers:
34
+ app1:
35
+ size: small
36
+ thin: 2
37
+ whenever: on
38
+ delayed_job: 1
39
+ databases:
40
+ - postgresql
41
+ config
42
+ File.open("/projects/foo/Cloudfile", "w") { |f| f << content }
43
+ @cloudfile.content.should == {"foo-staging" => {
44
+ "ruby_version" => "1.9.3",
45
+ "environment" => "production",
46
+ "monitoring_email" => "bob@example.com",
47
+ "domains" => ["foo-staging.winniecloud.com"],
48
+ "servers" => { "app1" =>
49
+ {"size" => "small",
50
+ "thin" => 2,
51
+ "whenever" => true,
52
+ "delayed_job" => 1,
53
+ "databases" => ["postgresql"]}
54
+ }
55
+ }
56
+ }
57
+ end
58
+ end
59
+
60
+ describe "#clouds" do
61
+ it "should create Cloud objects" do
62
+ content = <<-config
63
+ foo-staging:
64
+ ruby_version: 1.9.3
65
+ servers:
66
+ app1:
67
+ size: small
68
+ foo-production:
69
+ environment: production
70
+ servers:
71
+ app1:
72
+ thin: 2
73
+ config
74
+ File.open("/projects/foo/Cloudfile", "w") { |f| f << content }
75
+ cloud1 = Shelly::App.should_receive(:new).with("foo-staging",
76
+ {"ruby_version"=>"1.9.3",
77
+ "servers"=>{"app1"=>{"size"=>"small"}}})
78
+ cloud2 = Shelly::App.should_receive(:new).with("foo-production",
79
+ {"environment"=>"production",
80
+ "servers"=>{"app1"=>{"thin"=>2}}})
81
+
82
+ @cloudfile.clouds
83
+ end
84
+ end
85
+
25
86
  describe "#generate" do
26
87
  before do
27
88
  @cloudfile.code_name = "foo-staging"
@@ -88,31 +149,6 @@ config
88
149
  end
89
150
  end
90
151
 
91
- describe "#databases" do
92
- before do
93
- content = <<-config
94
- foo-staging:
95
- servers:
96
- app1:
97
- databases:
98
- - postgresql
99
- - redis
100
- app2:
101
- databases:
102
- - mongodb
103
- config
104
- File.open("Cloudfile", 'w') {|f| f.write(content) }
105
- end
106
-
107
- it "should return databases in cloudfile" do
108
- @cloudfile.databases("foo-staging").should =~ ['redis', 'mongodb', 'postgresql']
109
- end
110
-
111
- it "should return databases except for redis" do
112
- @cloudfile.backup_databases("foo-staging").should =~ ['postgresql', 'mongodb']
113
- end
114
- end
115
-
116
152
  describe "#create" do
117
153
  before do
118
154
  @cloudfile.stub(:generate).and_return("foo-staging:")
data/spec/spec_helper.rb CHANGED
@@ -9,6 +9,7 @@ require "helpers"
9
9
  require "input_faker"
10
10
  require "fakefs/spec_helpers"
11
11
  require "fakeweb"
12
+ require "launchy"
12
13
 
13
14
  ENV['THOR_COLUMNS'] = "180"
14
15
  FakeWeb.allow_net_connect = false
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: shelly
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.24
4
+ version: 0.1.25
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-09-10 00:00:00.000000000 Z
12
+ date: 2012-09-11 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rspec
@@ -59,6 +59,38 @@ dependencies:
59
59
  - - ! '>='
60
60
  - !ruby/object:Gem::Version
61
61
  version: '0'
62
+ - !ruby/object:Gem::Dependency
63
+ name: ruby_gntp
64
+ requirement: !ruby/object:Gem::Requirement
65
+ none: false
66
+ requirements:
67
+ - - ! '>='
68
+ - !ruby/object:Gem::Version
69
+ version: '0'
70
+ type: :development
71
+ prerelease: false
72
+ version_requirements: !ruby/object:Gem::Requirement
73
+ none: false
74
+ requirements:
75
+ - - ! '>='
76
+ - !ruby/object:Gem::Version
77
+ version: '0'
78
+ - !ruby/object:Gem::Dependency
79
+ name: rb-fsevent
80
+ requirement: !ruby/object:Gem::Requirement
81
+ none: false
82
+ requirements:
83
+ - - ! '>='
84
+ - !ruby/object:Gem::Version
85
+ version: '0'
86
+ type: :development
87
+ prerelease: false
88
+ version_requirements: !ruby/object:Gem::Requirement
89
+ none: false
90
+ requirements:
91
+ - - ! '>='
92
+ - !ruby/object:Gem::Version
93
+ version: '0'
62
94
  - !ruby/object:Gem::Dependency
63
95
  name: fakefs
64
96
  requirement: !ruby/object:Gem::Requirement
@@ -289,4 +321,23 @@ rubygems_version: 1.8.24
289
321
  signing_key:
290
322
  specification_version: 3
291
323
  summary: Shelly Cloud command line tool
292
- test_files: []
324
+ test_files:
325
+ - spec/helpers.rb
326
+ - spec/input_faker.rb
327
+ - spec/shelly/app_spec.rb
328
+ - spec/shelly/backup_spec.rb
329
+ - spec/shelly/cli/backup_spec.rb
330
+ - spec/shelly/cli/config_spec.rb
331
+ - spec/shelly/cli/deploys_spec.rb
332
+ - spec/shelly/cli/files_spec.rb
333
+ - spec/shelly/cli/main_spec.rb
334
+ - spec/shelly/cli/runner_spec.rb
335
+ - spec/shelly/cli/user_spec.rb
336
+ - spec/shelly/client_spec.rb
337
+ - spec/shelly/cloudfile_spec.rb
338
+ - spec/shelly/download_progress_bar_spec.rb
339
+ - spec/shelly/model_spec.rb
340
+ - spec/shelly/structure_validator_spec.rb
341
+ - spec/shelly/user_spec.rb
342
+ - spec/spec_helper.rb
343
+ - spec/thor/options_spec.rb