shelly 0.0.36 → 0.0.37

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
@@ -75,6 +75,10 @@ module Shelly
75
75
  Shelly::Backup.new(attributes.merge("code_name" => code_name))
76
76
  end
77
77
 
78
+ def request_backup(kind)
79
+ shelly.request_backup(code_name, kind)
80
+ end
81
+
78
82
  def logs
79
83
  shelly.cloud_logs(code_name)
80
84
  end
@@ -13,7 +13,6 @@ module Shelly
13
13
  :desc => "Specify which cloud to list backups for"
14
14
  def list
15
15
  logged_in?
16
- say_error "Must be run inside your project git repository" unless App.inside_git_repository?
17
16
  say_error "No Cloudfile found" unless Cloudfile.present?
18
17
  multiple_clouds(options[:cloud], "backup list", "Select cloud to view database backups for using:")
19
18
  backups = @app.database_backups
@@ -56,6 +55,23 @@ module Shelly
56
55
  raise e
57
56
  end
58
57
  end
58
+
59
+ desc "create [KIND]", "Creates current snapshot of given database. Default: all databases."
60
+ method_option :cloud, :type => :string, :aliases => "-c",
61
+ :desc => "Specify which cloud to create database snapshot for"
62
+ def create(kind = nil)
63
+ logged_in?
64
+ multiple_clouds(options[:cloud], "backup create", "Select cloud to create snapshot of database")
65
+ @app.request_backup(kind)
66
+ say "Backup requested. It can take up to several minutes for" +
67
+ "the backup process to finish and the backup to show up in backups list.", :green
68
+ rescue Client::APIError => e
69
+ if e.unauthorized?
70
+ say_error "You have no access to '#{@app.code_name}' cloud defined in Cloudfile"
71
+ else
72
+ say_error e.message
73
+ end
74
+ end
59
75
  end
60
76
  end
61
77
  end
data/lib/shelly/client.rb CHANGED
@@ -136,8 +136,12 @@ module Shelly
136
136
  get("/apps/#{code_name}/database_backups/#{handler}")
137
137
  end
138
138
 
139
+ def request_backup(code_name, kind = nil)
140
+ post("/apps/#{code_name}/database_backups", :kind => kind)
141
+ end
142
+
139
143
  def ssh_key_available?(ssh_key)
140
- get("/users/new", :ssh_key => ssh_key)
144
+ get("/users/new", :ssh_key => ssh_key)
141
145
  end
142
146
 
143
147
  def app_users(cloud)
@@ -1,3 +1,3 @@
1
1
  module Shelly
2
- VERSION = "0.0.36"
2
+ VERSION = "0.0.37"
3
3
  end
@@ -14,6 +14,12 @@ describe Shelly::CLI::Backup do
14
14
  end
15
15
 
16
16
  describe "#list" do
17
+ before do
18
+ FileUtils.mkdir_p("/projects/foo")
19
+ Dir.chdir("/projects/foo")
20
+ File.open("Cloudfile", 'w') {|f| f.write("foo-staging:\n") }
21
+ end
22
+
17
23
  it "should exit with message if there is no Cloudfile" do
18
24
  File.delete("Cloudfile")
19
25
  $stdout.should_receive(:puts).with("\e[31mNo Cloudfile found\e[0m")
@@ -55,7 +61,7 @@ describe Shelly::CLI::Backup do
55
61
  @backup.list
56
62
  end
57
63
  end
58
-
64
+
59
65
  describe "#get" do
60
66
  before do
61
67
  @client.stub(:download_backup)
@@ -64,35 +70,35 @@ describe Shelly::CLI::Backup do
64
70
  @client.stub(:database_backup).and_return({"filename" => "better.tar.gz", "size" => 12345})
65
71
  $stdout.stub(:puts)
66
72
  end
67
-
73
+
68
74
  it "should make sure that cloud is choosen" do
69
75
  @client.should_receive(:database_backup).with("foo-staging", "last")
70
76
  @backup.get
71
-
77
+
72
78
  @backup.options = {:cloud => "other"}
73
79
  @client.should_receive(:database_backup).with("other", "last")
74
80
  @backup.get
75
81
  end
76
-
82
+
77
83
  it "should fetch backup size and initialize download progress bar" do
78
84
  @client.stub(:database_backup).and_return({"filename" => "backup.postgres.tar.gz", "size" => 333})
79
85
  Shelly::DownloadProgressBar.should_receive(:new).with(333).and_return(@bar)
80
-
86
+
81
87
  @backup.get
82
88
  end
83
-
89
+
84
90
  it "should fetch given backup file itself" do
85
91
  @client.should_receive(:download_backup).with("foo-staging", "better.tar.gz", @bar.progress_callback)
86
92
  @backup.get("better.tar.gz")
87
93
  end
88
-
94
+
89
95
  it "should show info where file has been saved" do
90
96
  $stdout.should_receive(:puts)
91
97
  $stdout.should_receive(:puts).with(green "Backup file saved to better.tar.gz")
92
98
  @client.should_receive(:download_backup).with("foo-staging", "better.tar.gz", @bar.progress_callback)
93
99
  @backup.get("last")
94
100
  end
95
-
101
+
96
102
  context "on backup not found" do
97
103
  it "it should display error message" do
98
104
  exception = Shelly::Client::APIError.new({}.to_json, 404)
@@ -102,18 +108,49 @@ describe Shelly::CLI::Backup do
102
108
  @backup.get("better.tar.gz")
103
109
  end
104
110
  end
105
-
111
+
106
112
  context "on unsupported exception" do
107
113
  it "should re-raise it" do
108
114
  exception = Shelly::Client::APIError.new({}.to_json, 500)
109
115
  @client.stub(:database_backup).and_raise(exception)
110
116
  $stdout.should_not_receive(:puts).with(red "Backup not found")
111
117
  $stdout.should_not_receive(:puts).with("You can list available backups with 'shelly backup list' command")
112
- lambda {
113
- @backup.get("better.tar.gz")
118
+ lambda {
119
+ @backup.get("better.tar.gz")
114
120
  }.should raise_error(Shelly::Client::APIError)
115
121
  end
116
122
  end
117
123
  end
118
124
  end
125
+
126
+ describe "create" do
127
+ before do
128
+ FileUtils.mkdir_p("/projects/foo")
129
+ Dir.chdir("/projects/foo")
130
+ File.open("Cloudfile", 'w') {|f| f.write("foo-staging:\n") }
131
+ end
132
+
133
+ it "should exit if user doesn't have access to cloud in Cloudfile" do
134
+ response = {"message" => "Cloud foo-staging not found"}
135
+ exception = Shelly::Client::APIError.new(response.to_json, 404)
136
+ @client.stub(:request_backup).and_raise(exception)
137
+ $stdout.should_receive(:puts).with(red "You have no access to 'foo-staging' cloud defined in Cloudfile")
138
+ lambda { @backup.create }.should raise_error(SystemExit)
139
+ end
140
+
141
+ it "should display errors and exit 1 when kind is not valid" do
142
+ response = {"message" => "Wrong KIND argument. User one of following: postgresql, mongodb, redis"}
143
+ exception = Shelly::Client::APIError.new(response.to_json, 404)
144
+ @client.should_receive(:request_backup).and_raise(exception)
145
+ $stdout.should_receive(:puts).with(red response["message"])
146
+ lambda { @backup.create }.should raise_error(SystemExit)
147
+ end
148
+
149
+ it "should display information about request backup" do
150
+ @client.stub(:request_backup)
151
+ $stdout.should_receive(:puts).with(green "Backup requested. It can take up to several minutes for" +
152
+ "the backup process to finish and the backup to show up in backups list.")
153
+ @backup.create
154
+ end
155
+ end
119
156
  end
metadata CHANGED
@@ -1,167 +1,188 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: shelly
3
- version: !ruby/object:Gem::Version
4
- version: 0.0.36
3
+ version: !ruby/object:Gem::Version
4
+ hash: 85
5
5
  prerelease:
6
+ segments:
7
+ - 0
8
+ - 0
9
+ - 37
10
+ version: 0.0.37
6
11
  platform: ruby
7
- authors:
12
+ authors:
8
13
  - Shelly Cloud team
9
14
  autorequire:
10
15
  bindir: bin
11
16
  cert_chain: []
12
- date: 2011-12-27 00:00:00.000000000Z
13
- dependencies:
14
- - !ruby/object:Gem::Dependency
17
+
18
+ date: 2011-12-27 00:00:00 Z
19
+ dependencies:
20
+ - !ruby/object:Gem::Dependency
15
21
  name: rspec
16
- requirement: &70232388827320 !ruby/object:Gem::Requirement
17
- none: false
18
- requirements:
19
- - - ! '>='
20
- - !ruby/object:Gem::Version
21
- version: '0'
22
- type: :development
23
22
  prerelease: false
24
- version_requirements: *70232388827320
25
- - !ruby/object:Gem::Dependency
26
- name: rake
27
- requirement: &70232388826900 !ruby/object:Gem::Requirement
23
+ requirement: &id001 !ruby/object:Gem::Requirement
28
24
  none: false
29
- requirements:
30
- - - ! '>='
31
- - !ruby/object:Gem::Version
32
- version: '0'
33
- type: :development
34
- prerelease: false
35
- version_requirements: *70232388826900
36
- - !ruby/object:Gem::Dependency
37
- name: guard
38
- requirement: &70232388826480 !ruby/object:Gem::Requirement
39
- none: false
40
- requirements:
41
- - - ! '>='
42
- - !ruby/object:Gem::Version
43
- version: '0'
25
+ requirements:
26
+ - - ">="
27
+ - !ruby/object:Gem::Version
28
+ hash: 3
29
+ segments:
30
+ - 0
31
+ version: "0"
44
32
  type: :development
33
+ version_requirements: *id001
34
+ - !ruby/object:Gem::Dependency
35
+ name: rake
45
36
  prerelease: false
46
- version_requirements: *70232388826480
47
- - !ruby/object:Gem::Dependency
48
- name: guard-rspec
49
- requirement: &70232388826060 !ruby/object:Gem::Requirement
37
+ requirement: &id002 !ruby/object:Gem::Requirement
50
38
  none: false
51
- requirements:
52
- - - ! '>='
53
- - !ruby/object:Gem::Version
54
- version: '0'
39
+ requirements:
40
+ - - ">="
41
+ - !ruby/object:Gem::Version
42
+ hash: 3
43
+ segments:
44
+ - 0
45
+ version: "0"
55
46
  type: :development
47
+ version_requirements: *id002
48
+ - !ruby/object:Gem::Dependency
49
+ name: guard
56
50
  prerelease: false
57
- version_requirements: *70232388826060
58
- - !ruby/object:Gem::Dependency
59
- name: growl_notify
60
- requirement: &70232388825540 !ruby/object:Gem::Requirement
51
+ requirement: &id003 !ruby/object:Gem::Requirement
61
52
  none: false
62
- requirements:
63
- - - ! '>='
64
- - !ruby/object:Gem::Version
65
- version: '0'
53
+ requirements:
54
+ - - ">="
55
+ - !ruby/object:Gem::Version
56
+ hash: 3
57
+ segments:
58
+ - 0
59
+ version: "0"
66
60
  type: :development
61
+ version_requirements: *id003
62
+ - !ruby/object:Gem::Dependency
63
+ name: guard-rspec
67
64
  prerelease: false
68
- version_requirements: *70232388825540
69
- - !ruby/object:Gem::Dependency
70
- name: rb-fsevent
71
- requirement: &70232388825120 !ruby/object:Gem::Requirement
65
+ requirement: &id004 !ruby/object:Gem::Requirement
72
66
  none: false
73
- requirements:
74
- - - ! '>='
75
- - !ruby/object:Gem::Version
76
- version: '0'
67
+ requirements:
68
+ - - ">="
69
+ - !ruby/object:Gem::Version
70
+ hash: 3
71
+ segments:
72
+ - 0
73
+ version: "0"
77
74
  type: :development
78
- prerelease: false
79
- version_requirements: *70232388825120
80
- - !ruby/object:Gem::Dependency
75
+ version_requirements: *id004
76
+ - !ruby/object:Gem::Dependency
81
77
  name: fakefs
82
- requirement: &70232388824600 !ruby/object:Gem::Requirement
78
+ prerelease: false
79
+ requirement: &id005 !ruby/object:Gem::Requirement
83
80
  none: false
84
- requirements:
85
- - - ! '>='
86
- - !ruby/object:Gem::Version
87
- version: '0'
81
+ requirements:
82
+ - - ">="
83
+ - !ruby/object:Gem::Version
84
+ hash: 3
85
+ segments:
86
+ - 0
87
+ version: "0"
88
88
  type: :development
89
- prerelease: false
90
- version_requirements: *70232388824600
91
- - !ruby/object:Gem::Dependency
89
+ version_requirements: *id005
90
+ - !ruby/object:Gem::Dependency
92
91
  name: fakeweb
93
- requirement: &70232388824140 !ruby/object:Gem::Requirement
92
+ prerelease: false
93
+ requirement: &id006 !ruby/object:Gem::Requirement
94
94
  none: false
95
- requirements:
96
- - - ! '>='
97
- - !ruby/object:Gem::Version
98
- version: '0'
95
+ requirements:
96
+ - - ">="
97
+ - !ruby/object:Gem::Version
98
+ hash: 3
99
+ segments:
100
+ - 0
101
+ version: "0"
99
102
  type: :development
100
- prerelease: false
101
- version_requirements: *70232388824140
102
- - !ruby/object:Gem::Dependency
103
+ version_requirements: *id006
104
+ - !ruby/object:Gem::Dependency
103
105
  name: wijet-thor
104
- requirement: &70232388823400 !ruby/object:Gem::Requirement
106
+ prerelease: false
107
+ requirement: &id007 !ruby/object:Gem::Requirement
105
108
  none: false
106
- requirements:
109
+ requirements:
107
110
  - - ~>
108
- - !ruby/object:Gem::Version
111
+ - !ruby/object:Gem::Version
112
+ hash: 41
113
+ segments:
114
+ - 0
115
+ - 14
116
+ - 7
109
117
  version: 0.14.7
110
118
  type: :runtime
111
- prerelease: false
112
- version_requirements: *70232388823400
113
- - !ruby/object:Gem::Dependency
119
+ version_requirements: *id007
120
+ - !ruby/object:Gem::Dependency
114
121
  name: rest-client
115
- requirement: &70232388821260 !ruby/object:Gem::Requirement
122
+ prerelease: false
123
+ requirement: &id008 !ruby/object:Gem::Requirement
116
124
  none: false
117
- requirements:
118
- - - ! '>='
119
- - !ruby/object:Gem::Version
120
- version: '0'
125
+ requirements:
126
+ - - ">="
127
+ - !ruby/object:Gem::Version
128
+ hash: 3
129
+ segments:
130
+ - 0
131
+ version: "0"
121
132
  type: :runtime
122
- prerelease: false
123
- version_requirements: *70232388821260
124
- - !ruby/object:Gem::Dependency
133
+ version_requirements: *id008
134
+ - !ruby/object:Gem::Dependency
125
135
  name: json
126
- requirement: &70232388820800 !ruby/object:Gem::Requirement
136
+ prerelease: false
137
+ requirement: &id009 !ruby/object:Gem::Requirement
127
138
  none: false
128
- requirements:
129
- - - ! '>='
130
- - !ruby/object:Gem::Version
131
- version: '0'
139
+ requirements:
140
+ - - ">="
141
+ - !ruby/object:Gem::Version
142
+ hash: 3
143
+ segments:
144
+ - 0
145
+ version: "0"
132
146
  type: :runtime
133
- prerelease: false
134
- version_requirements: *70232388820800
135
- - !ruby/object:Gem::Dependency
147
+ version_requirements: *id009
148
+ - !ruby/object:Gem::Dependency
136
149
  name: wijet-launchy
137
- requirement: &70232388820380 !ruby/object:Gem::Requirement
150
+ prerelease: false
151
+ requirement: &id010 !ruby/object:Gem::Requirement
138
152
  none: false
139
- requirements:
140
- - - ! '>='
141
- - !ruby/object:Gem::Version
142
- version: '0'
153
+ requirements:
154
+ - - ">="
155
+ - !ruby/object:Gem::Version
156
+ hash: 3
157
+ segments:
158
+ - 0
159
+ version: "0"
143
160
  type: :runtime
144
- prerelease: false
145
- version_requirements: *70232388820380
146
- - !ruby/object:Gem::Dependency
161
+ version_requirements: *id010
162
+ - !ruby/object:Gem::Dependency
147
163
  name: progressbar
148
- requirement: &70232388808000 !ruby/object:Gem::Requirement
164
+ prerelease: false
165
+ requirement: &id011 !ruby/object:Gem::Requirement
149
166
  none: false
150
- requirements:
151
- - - ! '>='
152
- - !ruby/object:Gem::Version
153
- version: '0'
167
+ requirements:
168
+ - - ">="
169
+ - !ruby/object:Gem::Version
170
+ hash: 3
171
+ segments:
172
+ - 0
173
+ version: "0"
154
174
  type: :runtime
155
- prerelease: false
156
- version_requirements: *70232388808000
175
+ version_requirements: *id011
157
176
  description: Tool for managing applications and clouds at shellycloud.com
158
- email:
177
+ email:
159
178
  - support@shellycloud.com
160
- executables:
179
+ executables:
161
180
  - shelly
162
181
  extensions: []
182
+
163
183
  extra_rdoc_files: []
164
- files:
184
+
185
+ files:
165
186
  - .gitignore
166
187
  - .travis.yml
167
188
  - Gemfile
@@ -212,43 +233,36 @@ files:
212
233
  - spec/thor/options_spec.rb
213
234
  homepage: http://shellycloud.com
214
235
  licenses: []
236
+
215
237
  post_install_message:
216
238
  rdoc_options: []
217
- require_paths:
239
+
240
+ require_paths:
218
241
  - lib
219
- required_ruby_version: !ruby/object:Gem::Requirement
242
+ required_ruby_version: !ruby/object:Gem::Requirement
220
243
  none: false
221
- requirements:
222
- - - ! '>='
223
- - !ruby/object:Gem::Version
224
- version: '0'
225
- required_rubygems_version: !ruby/object:Gem::Requirement
244
+ requirements:
245
+ - - ">="
246
+ - !ruby/object:Gem::Version
247
+ hash: 3
248
+ segments:
249
+ - 0
250
+ version: "0"
251
+ required_rubygems_version: !ruby/object:Gem::Requirement
226
252
  none: false
227
- requirements:
228
- - - ! '>='
229
- - !ruby/object:Gem::Version
230
- version: '0'
253
+ requirements:
254
+ - - ">="
255
+ - !ruby/object:Gem::Version
256
+ hash: 3
257
+ segments:
258
+ - 0
259
+ version: "0"
231
260
  requirements: []
261
+
232
262
  rubyforge_project: shelly
233
263
  rubygems_version: 1.8.10
234
264
  signing_key:
235
265
  specification_version: 3
236
266
  summary: Shelly Cloud command line tool
237
- test_files:
238
- - spec/helpers.rb
239
- - spec/input_faker.rb
240
- - spec/shelly/app_spec.rb
241
- - spec/shelly/backup_spec.rb
242
- - spec/shelly/cli/backup_spec.rb
243
- - spec/shelly/cli/config_spec.rb
244
- - spec/shelly/cli/deploys_spec.rb
245
- - spec/shelly/cli/main_spec.rb
246
- - spec/shelly/cli/runner_spec.rb
247
- - spec/shelly/cli/user_spec.rb
248
- - spec/shelly/client_spec.rb
249
- - spec/shelly/cloudfile_spec.rb
250
- - spec/shelly/download_progress_bar_spec.rb
251
- - spec/shelly/model_spec.rb
252
- - spec/shelly/user_spec.rb
253
- - spec/spec_helper.rb
254
- - spec/thor/options_spec.rb
267
+ test_files: []
268
+