shelly 0.0.55.pre → 0.0.55

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/lib/shelly/app.rb CHANGED
@@ -25,6 +25,14 @@ module Shelly
25
25
  IO.popen("git remote").read.include?(code_name)
26
26
  end
27
27
 
28
+ def git_fetch_remote
29
+ system("git fetch #{code_name} > /dev/null 2>&1")
30
+ end
31
+
32
+ def git_add_tracking_branch
33
+ system("git checkout -b #{code_name} --track #{code_name}/master > /dev/null 2>&1")
34
+ end
35
+
28
36
  def remove_git_remote
29
37
  system("git remote rm #{code_name} > /dev/null 2>&1")
30
38
  end
@@ -16,9 +16,9 @@ module Shelly
16
16
  check_unknown_options!(:except => :rake)
17
17
 
18
18
  # FIXME: it should be possible to pass single symbol, instead of one element array
19
- before_hook :logged_in?, :only => [:add, :status, :list, :start, :stop, :logs, :delete, :ip, :logout, :execute, :rake]
20
- before_hook :inside_git_repository?, :only => [:add]
21
- before_hook :cloudfile_present?, :only => [:logs, :stop, :start, :ip, :execute, :rake]
19
+ before_hook :logged_in?, :only => [:add, :status, :list, :start, :stop, :logs, :delete, :ip, :logout, :execute, :rake, :setup]
20
+ before_hook :inside_git_repository?, :only => [:add, :setup]
21
+ before_hook :cloudfile_present?, :only => [:logs, :stop, :start, :ip, :execute, :rake, :setup]
22
22
 
23
23
  map %w(-v --version) => :version
24
24
  desc "version", "Display shelly version"
@@ -32,6 +32,7 @@ module Shelly
32
32
  say "Registering with email: #{email}" if email
33
33
  user.email = (email || ask_for_email)
34
34
  user.password = ask_for_password
35
+ ask_for_acceptance_of_terms
35
36
  user.register
36
37
  if user.ssh_key_exists?
37
38
  say "Uploading your public SSH key from #{user.ssh_key_path}"
@@ -81,8 +82,7 @@ module Shelly
81
82
  @app.databases = options["databases"] || ask_for_databases
82
83
  @app.create
83
84
 
84
- git_remote = @app.git_remote_exist?
85
- if !git_remote or (git_remote and yes?("Git remote #{@app} exists, overwrite (yes/no): "))
85
+ if overwrite_remote?(@app)
86
86
  say "Adding remote #{@app} #{@app.git_url}", :green
87
87
  @app.add_git_remote
88
88
  else
@@ -117,10 +117,14 @@ module Shelly
117
117
  apps = user.apps
118
118
  unless apps.empty?
119
119
  say "You have following clouds available:", :green
120
- print_table(apps.map do |app|
121
- state = app["state"] == "deploy_failed" ? " (Support has been notified)" : ""
122
- [app["code_name"], "| #{app["state"].gsub("_", " ")}#{state}"]
123
- end, :ident => 2)
120
+ apps_table = apps.map do |app|
121
+ state = app["state"]
122
+ msg = if state == "deploy_failed" || state == "configuration_failed"
123
+ " (deployment log: `shelly deploys show last -c #{app["code_name"]}`)"
124
+ end
125
+ [app["code_name"], "| #{state.gsub("_", " ")}#{msg}"]
126
+ end
127
+ print_table(apps_table, :ident => 2)
124
128
  else
125
129
  say "You have no clouds yet", :green
126
130
  end
@@ -150,30 +154,30 @@ module Shelly
150
154
  multiple_clouds(options[:cloud], "start")
151
155
  @app.start
152
156
  say "Starting cloud #{@app}.", :green
157
+ say "This can take up to 10 minutes."
153
158
  say "Check status with: `shelly list`"
154
159
  rescue Client::ConflictException => e
155
160
  case e[:state]
156
161
  when "running"
157
- say_error "Not starting: cloud '#{@app}' is already running", :with_exit => false
162
+ say_error "Not starting: cloud '#{@app}' is already running"
158
163
  when "deploying", "configuring"
159
- say_error "Not starting: cloud '#{@app}' is currently deploying", :with_exit => false
164
+ say_error "Not starting: cloud '#{@app}' is currently deploying"
160
165
  when "no_code"
161
166
  say_error "Not starting: no source code provided", :with_exit => false
162
167
  say_error "Push source code using:", :with_exit => false
163
- say_error " git push production master", :with_exit => false
168
+ say " git push production master"
164
169
  when "deploy_failed", "configuration_failed"
165
170
  say_error "Not starting: deployment failed", :with_exit => false
166
171
  say_error "Support has been notified", :with_exit => false
167
- say_error "Check `shelly deploys show last --cloud #{@app}` for reasons of failure", :with_exit => false
172
+ say_error "Check `shelly deploys show last --cloud #{@app}` for reasons of failure"
168
173
  when "not_enough_resources"
169
174
  say_error %{Sorry, There are no resources for your servers.
170
- We have been notified about it. We will be adding new resources shortly}, :with_exit => false
171
- end
172
- if !e[:can_be_started] and e[:state] == "turned_off"
173
- url = "#{@app.shelly.shellyapp_url}/apps/#{@app.code_name}/billing"
174
- say_error "Not starting.", :with_exit => false
175
- say_error "For more details please visit:", :with_exit => false
176
- say_error url
175
+ We have been notified about it. We will be adding new resources shortly}
176
+ when "no_billing"
177
+ say_error "Please fill in billing details to start #{@app}.", :with_exit => false
178
+ say_error "Visit: #{@app.edit_billing_url}", :with_exit => false
179
+ when "payment_declined"
180
+ say_error "Not starting. Invoice for cloud '#{@app}' was declined."
177
181
  end
178
182
  exit 1
179
183
  rescue Client::NotFoundException => e
@@ -181,6 +185,39 @@ We have been notified about it. We will be adding new resources shortly}, :with_
181
185
  say_error "You have no access to '#{@app}' cloud defined in Cloudfile"
182
186
  end
183
187
 
188
+ desc "setup", "Set up clouds"
189
+ def setup
190
+ say "Investigating Cloudfile"
191
+ cloudfile = Cloudfile.new
192
+ cloudfile.clouds.each do |cloud|
193
+ begin
194
+ app = App.new(cloud)
195
+ say "Adding #{app} cloud", :green
196
+ app.git_url = app.attributes["git_info"]["repository_url"]
197
+ if overwrite_remote?(app)
198
+ say "git remote add #{app} #{app.git_url}"
199
+ app.add_git_remote
200
+ say "git fetch production"
201
+ app.git_fetch_remote
202
+ say "git checkout -b #{app} --track #{app}/master"
203
+ app.git_add_tracking_branch
204
+ else
205
+ say "You have to manually add remote:"
206
+ say "`git remote add #{app} #{app.git_url}`"
207
+ say "`git fetch production`"
208
+ say "`git checkout -b #{app} --track #{app}/master`"
209
+ end
210
+
211
+ say_new_line
212
+ rescue Client::NotFoundException => e
213
+ raise unless e.resource == :cloud
214
+ say_error "You have no access to '#{app}' cloud defined in Cloudfile"
215
+ end
216
+ end
217
+
218
+ say "Your application is set up.", :green
219
+ end
220
+
184
221
  desc "stop", "Stop the cloud"
185
222
  method_option :cloud, :type => :string, :aliases => "-c", :desc => "Specify cloud"
186
223
  def stop
@@ -286,7 +323,7 @@ We have been notified about it. We will be adding new resources shortly}, :with_
286
323
  case e[:state]
287
324
  when "deploying", "configuring"
288
325
  say_error "Your application is being redeployed at the moment"
289
- when "no_code", "turned_off"
326
+ when "no_code", "no_billing", "turned_off"
290
327
  say_error "Cloud #{@app} is not running", :with_exit => false
291
328
  say "Start your cloud with `shelly start --cloud #{@app}`"
292
329
  exit 1
@@ -331,6 +368,11 @@ We have been notified about it. We will be adding new resources shortly}, :with_
331
368
  databases.all? { |kind| kinds.include?(kind) }
332
369
  end
333
370
 
371
+ def overwrite_remote?(app)
372
+ git_remote = app.git_remote_exist?
373
+ !git_remote or (git_remote and yes?("Git remote #{app} exists, overwrite (yes/no): "))
374
+ end
375
+
334
376
  def ask_for_password(options = {})
335
377
  options = {:with_confirmation => true}.merge(options)
336
378
  loop do
@@ -45,6 +45,14 @@ module Shelly
45
45
  exit 1 unless delete_application == "yes"
46
46
  end
47
47
 
48
+ def ask_for_acceptance_of_terms
49
+ acceptance_question = "Do you accept the Terms of Service of Shelly Cloud (https://shellycloud.com/terms_of_service) (yes/no)"
50
+ acceptance = ask(acceptance_question)
51
+ unless acceptance == "yes"
52
+ say_error "You must accept the Terms of Service to use Shelly Cloud"
53
+ end
54
+ end
55
+
48
56
  def inside_git_repository?
49
57
  say_error "Must be run inside your project git repository" unless App.inside_git_repository?
50
58
  end
@@ -1,5 +1,5 @@
1
1
  <%= @code_name %>:
2
- ruby_version: 1.9.2 # 1.9.2 or ree-1.8.7
2
+ ruby_version: 1.9.3 # 1.9.3, 1.9.2 or ree-1.8.7
3
3
  environment: production # RAILS_ENV
4
4
  monitoring_email: <%= @email %>
5
5
  domains:
@@ -1,3 +1,3 @@
1
1
  module Shelly
2
- VERSION = "0.0.55.pre"
2
+ VERSION = "0.0.55"
3
3
  end
@@ -67,6 +67,21 @@ describe Shelly::App do
67
67
  end
68
68
  end
69
69
 
70
+ describe "git_fetch_remote" do
71
+ it "should try to remove existing git remote" do
72
+ @app.should_receive(:system).with("git fetch foo-staging > /dev/null 2>&1")
73
+ @app.git_fetch_remote
74
+ end
75
+ end
76
+
77
+ describe "git_add_tracking_branch" do
78
+ it "should try to remove existing git remote" do
79
+ @app.should_receive(:system).with("git checkout -b foo-staging --track foo-staging/master > /dev/null 2>&1")
80
+ @app.git_add_tracking_branch
81
+ end
82
+ end
83
+
84
+
70
85
  describe "git_remote_exist" do
71
86
  it "should return true if git remote exist" do
72
87
  io = mock(:read => "origin\nfoo-staging")
@@ -150,7 +165,7 @@ describe Shelly::App do
150
165
  FakeFS.deactivate!
151
166
  expected = <<-config
152
167
  foo-staging:
153
- ruby_version: 1.9.2 # 1.9.2 or ree-1.8.7
168
+ ruby_version: 1.9.3 # 1.9.3, 1.9.2 or ree-1.8.7
154
169
  environment: production # RAILS_ENV
155
170
  monitoring_email: bob@example.com
156
171
  domains:
@@ -39,6 +39,7 @@ Tasks:
39
39
  shelly rake TASK # Run rake task
40
40
  shelly redeploy # Redeploy application
41
41
  shelly register [EMAIL] # Register new account
42
+ shelly setup # Set up clouds
42
43
  shelly start # Start the cloud
43
44
  shelly stop # Stop the cloud
44
45
  shelly user <command> # Manage collaborators
@@ -83,7 +84,7 @@ OUT
83
84
  File.exists?(@key_path).should be_false
84
85
  $stdout.should_receive(:puts).with(red "No such file or directory - #{@key_path}")
85
86
  $stdout.should_receive(:puts).with(red "Use ssh-keygen to generate ssh key pair, after that use: `shelly login`")
86
- fake_stdin(["better@example.com", "secret", "secret"]) do
87
+ fake_stdin(["better@example.com", "secret", "secret", "yes"]) do
87
88
  invoke(@main, :register)
88
89
  end
89
90
  end
@@ -92,7 +93,7 @@ OUT
92
93
  $stdout.should_receive(:print).with("Email: ")
93
94
  $stdout.should_receive(:print).with("Password: ")
94
95
  $stdout.should_receive(:print).with("Password confirmation: ")
95
- fake_stdin(["better@example.com", "secret", "secret"]) do
96
+ fake_stdin(["better@example.com", "secret", "secret", "yes"]) do
96
97
  invoke(@main, :register)
97
98
  end
98
99
  end
@@ -101,21 +102,21 @@ OUT
101
102
  Shelly::User.stub(:guess_email).and_return("kate@example.com")
102
103
  $stdout.should_receive(:print).with("Email (kate@example.com - default): ")
103
104
  @client.should_receive(:register_user).with("kate@example.com", "secret", "ssh-key AAbbcc")
104
- fake_stdin(["", "secret", "secret"]) do
105
+ fake_stdin(["", "secret", "secret", "yes"]) do
105
106
  invoke(@main, :register)
106
107
  end
107
108
  end
108
109
 
109
110
  it "should use email provided by user" do
110
111
  @client.should_receive(:register_user).with("better@example.com", "secret", "ssh-key AAbbcc")
111
- fake_stdin(["better@example.com", "secret", "secret"]) do
112
+ fake_stdin(["better@example.com", "secret", "secret", "yes"]) do
112
113
  invoke(@main, :register)
113
114
  end
114
115
  end
115
116
 
116
117
  it "should not ask about email if it's provided as argument" do
117
118
  $stdout.should_receive(:puts).with("Registering with email: kate@example.com")
118
- fake_stdin(["secret", "secret"]) do
119
+ fake_stdin(["secret", "secret", "yes"]) do
119
120
  invoke(@main, :register, "kate@example.com")
120
121
  end
121
122
  end
@@ -125,7 +126,7 @@ OUT
125
126
  Shelly::User.stub(:guess_email).and_return("")
126
127
  $stdout.should_receive(:puts).with("\e[31mEmail can't be blank, please try again\e[0m")
127
128
  lambda {
128
- fake_stdin(["", "bob@example.com", "only-pass", "only-pass"]) do
129
+ fake_stdin(["", "bob@example.com", "only-pass", "only-pass", "yes"]) do
129
130
  invoke(@main, :register)
130
131
  end
131
132
  }.should raise_error(SystemExit)
@@ -137,7 +138,7 @@ OUT
137
138
  FileUtils.mkdir_p("~/.ssh")
138
139
  File.open(@key_path, "w") { |f| f << "key" }
139
140
  $stdout.should_receive(:puts).with("Uploading your public SSH key from #{@key_path}")
140
- fake_stdin(["kate@example.com", "secret", "secret"]) do
141
+ fake_stdin(["kate@example.com", "secret", "secret", "yes"]) do
141
142
  invoke(@main, :register)
142
143
  end
143
144
  end
@@ -148,7 +149,7 @@ OUT
148
149
  @user.stub(:ssh_key_registered?)
149
150
  FileUtils.rm_rf(@key_path)
150
151
  $stdout.should_not_receive(:puts).with("Uploading your public SSH key from #{@key_path}")
151
- fake_stdin(["kate@example.com", "secret", "secret"]) do
152
+ fake_stdin(["kate@example.com", "secret", "secret", "yes"]) do
152
153
  invoke(@main, :register)
153
154
  end
154
155
  end
@@ -159,7 +160,7 @@ OUT
159
160
  @client.stub(:register_user).and_return(true)
160
161
  $stdout.should_receive(:puts).with("Successfully registered!")
161
162
  $stdout.should_receive(:puts).with("Check you mailbox for email address confirmation")
162
- fake_stdin(["kate@example.com", "pass", "pass"]) do
163
+ fake_stdin(["kate@example.com", "pass", "pass", "yes"]) do
163
164
  invoke(@main, :register)
164
165
  end
165
166
  end
@@ -172,7 +173,18 @@ OUT
172
173
  @client.stub(:register_user).and_raise(exception)
173
174
  $stdout.should_receive(:puts).with("\e[31mEmail has been already taken\e[0m")
174
175
  lambda {
175
- fake_stdin(["kate@example.com", "pass", "pass"]) do
176
+ fake_stdin(["kate@example.com", "pass", "pass", "yes"]) do
177
+ invoke(@main, :register)
178
+ end
179
+ }.should raise_error(SystemExit)
180
+ end
181
+ end
182
+
183
+ context "on rejected Terms of Service" do
184
+ it "should display error and exit with 1" do
185
+ $stdout.should_receive(:puts).with("\e[31mYou must accept the Terms of Service to use Shelly Cloud\e[0m")
186
+ lambda {
187
+ fake_stdin(["kate@example.com", "pass", "pass", "no"]) do
176
188
  invoke(@main, :register)
177
189
  end
178
190
  }.should raise_error(SystemExit)
@@ -494,8 +506,11 @@ OUT
494
506
  before do
495
507
  @user = Shelly::User.new
496
508
  @client.stub(:token).and_return("abc")
497
- @client.stub(:apps).and_return([{"code_name" => "abc", "state" => "running"},
498
- {"code_name" => "fooo", "state" => "deploy_failed"}])
509
+ @client.stub(:apps).and_return([
510
+ {"code_name" => "abc", "state" => "running"},
511
+ {"code_name" => "fooo", "state" => "deploy_failed"},
512
+ {"code_name" => "bar", "state" => "configuration_failed"}
513
+ ])
499
514
  Shelly::User.stub(:new).and_return(@user)
500
515
  end
501
516
 
@@ -506,7 +521,8 @@ OUT
506
521
  it "should display user's clouds" do
507
522
  $stdout.should_receive(:puts).with("\e[32mYou have following clouds available:\e[0m")
508
523
  $stdout.should_receive(:puts).with(/abc\s+\| running/)
509
- $stdout.should_receive(:puts).with(/fooo\s+\| deploy failed \(Support has been notified\)/)
524
+ $stdout.should_receive(:puts).with(/fooo\s+\| deploy failed \(deployment log: `shelly deploys show last -c fooo`\)/)
525
+ $stdout.should_receive(:puts).with(/bar\s+\| configuration failed \(deployment log: `shelly deploys show last -c bar`\)/)
510
526
  invoke(@main, :list)
511
527
  end
512
528
 
@@ -566,6 +582,7 @@ OUT
566
582
  it "should start the cloud" do
567
583
  @client.stub(:start_cloud)
568
584
  $stdout.should_receive(:puts).with(green "Starting cloud foo-production.")
585
+ $stdout.should_receive(:puts).with("This can take up to 10 minutes.")
569
586
  $stdout.should_receive(:puts).with("Check status with: `shelly list`")
570
587
  invoke(@main, :start)
571
588
  end
@@ -613,7 +630,7 @@ OUT
613
630
  raise_conflict("state" => "no_code")
614
631
  $stdout.should_receive(:puts).with(red "Not starting: no source code provided")
615
632
  $stdout.should_receive(:puts).with(red "Push source code using:")
616
- $stdout.should_receive(:puts).with(red " git push production master")
633
+ $stdout.should_receive(:puts).with(" git push production master")
617
634
  lambda { invoke(@main, :start) }.should raise_error(SystemExit)
618
635
  end
619
636
 
@@ -635,17 +652,23 @@ We have been notified about it. We will be adding new resources shortly")
635
652
  lambda { invoke(@main, :start) }.should raise_error(SystemExit)
636
653
  end
637
654
 
638
- it "should show link to billing" do
655
+ it "should show messages about billing" do
656
+ raise_conflict("state" => "no_billing")
657
+ @app.stub(:edit_billing_url).and_return("http://example.com/billing/edit")
658
+ $stdout.should_receive(:puts).with(red "Please fill in billing details to start foo-production.")
659
+ $stdout.should_receive(:puts).with(red "Visit: http://example.com/billing/edit")
639
660
  @client.stub(:shellyapp_url).and_return("http://example.com")
640
- raise_conflict("state" => "turned_off", "can_be_started" => false)
641
- $stdout.should_receive(:puts).with(red "Not starting.")
642
- $stdout.should_receive(:puts).with(red "For more details please visit:")
643
- $stdout.should_receive(:puts).with(red "http://example.com/apps/foo-production/billing")
661
+ lambda { invoke(@main, :start) }.should raise_error(SystemExit)
662
+ end
663
+
664
+ it "should show messge about payment declined" do
665
+ raise_conflict("state" => "payment_declined")
666
+ $stdout.should_receive(:puts).with(red "Not starting. Invoice for cloud 'foo-production' was declined.")
644
667
  lambda { invoke(@main, :start) }.should raise_error(SystemExit)
645
668
  end
646
669
 
647
670
  def raise_conflict(options = {})
648
- body = {"state" => "no_code", "can_be_started" => true}.merge(options)
671
+ body = {"state" => "no_code"}.merge(options)
649
672
  exception = Shelly::Client::ConflictException.new(body)
650
673
  @client.stub(:start_cloud).and_raise(exception)
651
674
  end
@@ -748,6 +771,85 @@ We have been notified about it. We will be adding new resources shortly")
748
771
  end
749
772
  end
750
773
 
774
+ describe "#setup" do
775
+ before do
776
+ Shelly::App.stub(:inside_git_repository?).and_return(true)
777
+ @client.stub(:token).and_return("abc")
778
+ @client.stub(:app).and_return("git_info" => {"repository_url" => "git_url"})
779
+ @app = Shelly::App.new("foo-staging")
780
+ @app.stub(:git_remote_exist?).and_return(false)
781
+ @app.stub(:system)
782
+ Shelly::App.stub(:new).and_return(@app)
783
+ File.open("Cloudfile", 'w') {|f| f.write("foo-staging:\n") }
784
+ end
785
+
786
+ it "should ensure user has logged in" do
787
+ hooks(@main, :setup).should include(:logged_in?)
788
+ end
789
+
790
+ it "should ensure that user is inside git repo" do
791
+ hooks(@main, :setup).should include(:inside_git_repository?)
792
+ end
793
+
794
+ it "should ensure that cloudfile is present" do
795
+ hooks(@main, :setup).should include(:cloudfile_present?)
796
+ end
797
+
798
+ it "should show info about adding remote and branch" do
799
+ $stdout.should_receive(:puts).with("Investigating Cloudfile")
800
+ $stdout.should_receive(:puts).with(green "Adding foo-staging cloud")
801
+ $stdout.should_receive(:puts).with("git remote add foo-staging git_url")
802
+ $stdout.should_receive(:puts).with("git fetch production")
803
+ $stdout.should_receive(:puts).with("git checkout -b foo-staging --track foo-staging/master")
804
+ $stdout.should_receive(:puts).with(green "Your application is set up.")
805
+ invoke(@main, :setup)
806
+ end
807
+
808
+ it "should add git remote" do
809
+ @app.should_receive(:add_git_remote)
810
+ invoke(@main, :setup)
811
+ end
812
+
813
+ it "should fetch remote" do
814
+ @app.should_receive(:git_fetch_remote)
815
+ invoke(@main, :setup)
816
+ end
817
+
818
+ it "should add tracking branch" do
819
+ @app.should_receive(:git_add_tracking_branch)
820
+ invoke(@main, :setup)
821
+ end
822
+
823
+ context "when remote exists" do
824
+ before do
825
+ @app.stub(:git_remote_exist?).and_return(true)
826
+ end
827
+
828
+ context "and user answers yes" do
829
+ it "should overwrite remote" do
830
+ @app.should_receive(:add_git_remote)
831
+ @app.should_receive(:git_fetch_remote)
832
+ @app.should_receive(:git_add_tracking_branch)
833
+ fake_stdin(["yes"]) do
834
+ invoke(@main, :setup)
835
+ end
836
+ end
837
+ end
838
+
839
+ context "and user answers no" do
840
+ it "should display commands to perform manually " do
841
+ @app.should_not_receive(:add_git_remote)
842
+ @app.should_not_receive(:git_fetch_remote)
843
+ @app.should_not_receive(:git_add_tracking_branch)
844
+ fake_stdin(["no"]) do
845
+ invoke(@main, :setup)
846
+ end
847
+ end
848
+ end
849
+
850
+ end
851
+ end
852
+
751
853
  describe "#delete" do
752
854
  before do
753
855
  Shelly::App.stub(:inside_git_repository?).and_return(true)
@@ -1172,7 +1274,7 @@ We have been notified about it. We will be adding new resources shortly")
1172
1274
  end
1173
1275
  end
1174
1276
 
1175
- %w(no_code turned_off).each do |state|
1277
+ %w(no_code no_billing turned_off).each do |state|
1176
1278
  context "when application is in #{state} state" do
1177
1279
  it "should display error that cloud is not running" do
1178
1280
  exception = Shelly::Client::ConflictException.new("state" => state)
metadata CHANGED
@@ -1,191 +1,167 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: shelly
3
- version: !ruby/object:Gem::Version
4
- hash: 961916056
5
- prerelease: 7
6
- segments:
7
- - 0
8
- - 0
9
- - 55
10
- - pre
11
- version: 0.0.55.pre
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.55
5
+ prerelease:
12
6
  platform: ruby
13
- authors:
7
+ authors:
14
8
  - Shelly Cloud team
15
9
  autorequire:
16
10
  bindir: bin
17
11
  cert_chain: []
18
-
19
- date: 2012-03-13 00:00:00 Z
20
- dependencies:
21
- - !ruby/object:Gem::Dependency
22
- version_requirements: &id001 !ruby/object:Gem::Requirement
12
+ date: 2012-03-19 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: rspec
16
+ requirement: &70362431758420 !ruby/object:Gem::Requirement
23
17
  none: false
24
- requirements:
18
+ requirements:
25
19
  - - ~>
26
- - !ruby/object:Gem::Version
27
- hash: 47
28
- segments:
29
- - 2
30
- - 8
31
- - 0
20
+ - !ruby/object:Gem::Version
32
21
  version: 2.8.0
33
- requirement: *id001
34
- prerelease: false
35
22
  type: :development
36
- name: rspec
37
- - !ruby/object:Gem::Dependency
38
- version_requirements: &id002 !ruby/object:Gem::Requirement
39
- none: false
40
- requirements:
41
- - - ">="
42
- - !ruby/object:Gem::Version
43
- hash: 3
44
- segments:
45
- - 0
46
- version: "0"
47
- requirement: *id002
48
23
  prerelease: false
49
- type: :development
24
+ version_requirements: *70362431758420
25
+ - !ruby/object:Gem::Dependency
50
26
  name: rake
51
- - !ruby/object:Gem::Dependency
52
- version_requirements: &id003 !ruby/object:Gem::Requirement
27
+ requirement: &70362431757980 !ruby/object:Gem::Requirement
53
28
  none: false
54
- requirements:
55
- - - ">="
56
- - !ruby/object:Gem::Version
57
- hash: 3
58
- segments:
59
- - 0
60
- version: "0"
61
- requirement: *id003
62
- prerelease: false
29
+ requirements:
30
+ - - ! '>='
31
+ - !ruby/object:Gem::Version
32
+ version: '0'
63
33
  type: :development
34
+ prerelease: false
35
+ version_requirements: *70362431757980
36
+ - !ruby/object:Gem::Dependency
64
37
  name: guard
65
- - !ruby/object:Gem::Dependency
66
- version_requirements: &id004 !ruby/object:Gem::Requirement
38
+ requirement: &70362431757520 !ruby/object:Gem::Requirement
67
39
  none: false
68
- requirements:
69
- - - ">="
70
- - !ruby/object:Gem::Version
71
- hash: 3
72
- segments:
73
- - 0
74
- version: "0"
75
- requirement: *id004
76
- prerelease: false
40
+ requirements:
41
+ - - ! '>='
42
+ - !ruby/object:Gem::Version
43
+ version: '0'
77
44
  type: :development
45
+ prerelease: false
46
+ version_requirements: *70362431757520
47
+ - !ruby/object:Gem::Dependency
78
48
  name: guard-rspec
79
- - !ruby/object:Gem::Dependency
80
- version_requirements: &id005 !ruby/object:Gem::Requirement
49
+ requirement: &70362431757100 !ruby/object:Gem::Requirement
81
50
  none: false
82
- requirements:
83
- - - ">="
84
- - !ruby/object:Gem::Version
85
- hash: 3
86
- segments:
87
- - 0
88
- version: "0"
89
- requirement: *id005
90
- prerelease: false
51
+ requirements:
52
+ - - ! '>='
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
91
55
  type: :development
56
+ prerelease: false
57
+ version_requirements: *70362431757100
58
+ - !ruby/object:Gem::Dependency
92
59
  name: simplecov
93
- - !ruby/object:Gem::Dependency
94
- version_requirements: &id006 !ruby/object:Gem::Requirement
60
+ requirement: &70362431756680 !ruby/object:Gem::Requirement
61
+ none: false
62
+ requirements:
63
+ - - ! '>='
64
+ - !ruby/object:Gem::Version
65
+ version: '0'
66
+ type: :development
67
+ prerelease: false
68
+ version_requirements: *70362431756680
69
+ - !ruby/object:Gem::Dependency
70
+ name: ruby_gntp
71
+ requirement: &70362431756220 !ruby/object:Gem::Requirement
95
72
  none: false
96
- requirements:
97
- - - ">="
98
- - !ruby/object:Gem::Version
99
- hash: 3
100
- segments:
101
- - 0
102
- version: "0"
103
- requirement: *id006
73
+ requirements:
74
+ - - ! '>='
75
+ - !ruby/object:Gem::Version
76
+ version: '0'
77
+ type: :development
104
78
  prerelease: false
79
+ version_requirements: *70362431756220
80
+ - !ruby/object:Gem::Dependency
81
+ name: rb-fsevent
82
+ requirement: &70362431755800 !ruby/object:Gem::Requirement
83
+ none: false
84
+ requirements:
85
+ - - ! '>='
86
+ - !ruby/object:Gem::Version
87
+ version: '0'
105
88
  type: :development
89
+ prerelease: false
90
+ version_requirements: *70362431755800
91
+ - !ruby/object:Gem::Dependency
106
92
  name: fakefs
107
- - !ruby/object:Gem::Dependency
108
- version_requirements: &id007 !ruby/object:Gem::Requirement
93
+ requirement: &70362431755380 !ruby/object:Gem::Requirement
109
94
  none: false
110
- requirements:
111
- - - ">="
112
- - !ruby/object:Gem::Version
113
- hash: 3
114
- segments:
115
- - 0
116
- version: "0"
117
- requirement: *id007
118
- prerelease: false
95
+ requirements:
96
+ - - ! '>='
97
+ - !ruby/object:Gem::Version
98
+ version: '0'
119
99
  type: :development
100
+ prerelease: false
101
+ version_requirements: *70362431755380
102
+ - !ruby/object:Gem::Dependency
120
103
  name: fakeweb
121
- - !ruby/object:Gem::Dependency
122
- version_requirements: &id008 !ruby/object:Gem::Requirement
104
+ requirement: &70362431754960 !ruby/object:Gem::Requirement
123
105
  none: false
124
- requirements:
125
- - - ~>
126
- - !ruby/object:Gem::Version
127
- hash: 41
128
- segments:
129
- - 0
130
- - 14
131
- - 7
132
- version: 0.14.7
133
- requirement: *id008
106
+ requirements:
107
+ - - ! '>='
108
+ - !ruby/object:Gem::Version
109
+ version: '0'
110
+ type: :development
134
111
  prerelease: false
135
- type: :runtime
112
+ version_requirements: *70362431754960
113
+ - !ruby/object:Gem::Dependency
136
114
  name: wijet-thor
137
- - !ruby/object:Gem::Dependency
138
- version_requirements: &id009 !ruby/object:Gem::Requirement
115
+ requirement: &70362431754460 !ruby/object:Gem::Requirement
139
116
  none: false
140
- requirements:
141
- - - ">="
142
- - !ruby/object:Gem::Version
143
- hash: 3
144
- segments:
145
- - 0
146
- version: "0"
147
- requirement: *id009
148
- prerelease: false
117
+ requirements:
118
+ - - ~>
119
+ - !ruby/object:Gem::Version
120
+ version: 0.14.7
149
121
  type: :runtime
122
+ prerelease: false
123
+ version_requirements: *70362431754460
124
+ - !ruby/object:Gem::Dependency
150
125
  name: rest-client
151
- - !ruby/object:Gem::Dependency
152
- version_requirements: &id010 !ruby/object:Gem::Requirement
126
+ requirement: &70362431754040 !ruby/object:Gem::Requirement
153
127
  none: false
154
- requirements:
155
- - - ">="
156
- - !ruby/object:Gem::Version
157
- hash: 3
158
- segments:
159
- - 0
160
- version: "0"
161
- requirement: *id010
162
- prerelease: false
128
+ requirements:
129
+ - - ! '>='
130
+ - !ruby/object:Gem::Version
131
+ version: '0'
163
132
  type: :runtime
133
+ prerelease: false
134
+ version_requirements: *70362431754040
135
+ - !ruby/object:Gem::Dependency
164
136
  name: json
165
- - !ruby/object:Gem::Dependency
166
- version_requirements: &id011 !ruby/object:Gem::Requirement
137
+ requirement: &70362431753580 !ruby/object:Gem::Requirement
167
138
  none: false
168
- requirements:
169
- - - ">="
170
- - !ruby/object:Gem::Version
171
- hash: 3
172
- segments:
173
- - 0
174
- version: "0"
175
- requirement: *id011
176
- prerelease: false
139
+ requirements:
140
+ - - ! '>='
141
+ - !ruby/object:Gem::Version
142
+ version: '0'
177
143
  type: :runtime
144
+ prerelease: false
145
+ version_requirements: *70362431753580
146
+ - !ruby/object:Gem::Dependency
178
147
  name: progressbar
148
+ requirement: &70362431753160 !ruby/object:Gem::Requirement
149
+ none: false
150
+ requirements:
151
+ - - ! '>='
152
+ - !ruby/object:Gem::Version
153
+ version: '0'
154
+ type: :runtime
155
+ prerelease: false
156
+ version_requirements: *70362431753160
179
157
  description: Tool for managing applications and clouds at shellycloud.com
180
- email:
158
+ email:
181
159
  - support@shellycloud.com
182
- executables:
160
+ executables:
183
161
  - shelly
184
162
  extensions: []
185
-
186
163
  extra_rdoc_files: []
187
-
188
- files:
164
+ files:
189
165
  - .gitignore
190
166
  - .travis.yml
191
167
  - Gemfile
@@ -237,38 +213,49 @@ files:
237
213
  - spec/thor/options_spec.rb
238
214
  homepage: http://shellycloud.com
239
215
  licenses: []
240
-
241
216
  post_install_message:
242
217
  rdoc_options: []
243
-
244
- require_paths:
218
+ require_paths:
245
219
  - lib
246
- required_ruby_version: !ruby/object:Gem::Requirement
220
+ required_ruby_version: !ruby/object:Gem::Requirement
247
221
  none: false
248
- requirements:
249
- - - ">="
250
- - !ruby/object:Gem::Version
251
- hash: 3
252
- segments:
222
+ requirements:
223
+ - - ! '>='
224
+ - !ruby/object:Gem::Version
225
+ version: '0'
226
+ segments:
253
227
  - 0
254
- version: "0"
255
- required_rubygems_version: !ruby/object:Gem::Requirement
228
+ hash: -3746119301699962948
229
+ required_rubygems_version: !ruby/object:Gem::Requirement
256
230
  none: false
257
- requirements:
258
- - - ">"
259
- - !ruby/object:Gem::Version
260
- hash: 25
261
- segments:
262
- - 1
263
- - 3
264
- - 1
265
- version: 1.3.1
231
+ requirements:
232
+ - - ! '>='
233
+ - !ruby/object:Gem::Version
234
+ version: '0'
235
+ segments:
236
+ - 0
237
+ hash: -3746119301699962948
266
238
  requirements: []
267
-
268
239
  rubyforge_project: shelly
269
- rubygems_version: 1.8.10
240
+ rubygems_version: 1.8.16
270
241
  signing_key:
271
242
  specification_version: 3
272
243
  summary: Shelly Cloud command line tool
273
- test_files: []
274
-
244
+ test_files:
245
+ - spec/helpers.rb
246
+ - spec/input_faker.rb
247
+ - spec/shelly/app_spec.rb
248
+ - spec/shelly/backup_spec.rb
249
+ - spec/shelly/cli/backup_spec.rb
250
+ - spec/shelly/cli/config_spec.rb
251
+ - spec/shelly/cli/deploys_spec.rb
252
+ - spec/shelly/cli/main_spec.rb
253
+ - spec/shelly/cli/runner_spec.rb
254
+ - spec/shelly/cli/user_spec.rb
255
+ - spec/shelly/client_spec.rb
256
+ - spec/shelly/cloudfile_spec.rb
257
+ - spec/shelly/download_progress_bar_spec.rb
258
+ - spec/shelly/model_spec.rb
259
+ - spec/shelly/user_spec.rb
260
+ - spec/spec_helper.rb
261
+ - spec/thor/options_spec.rb