shelly 0.0.25 → 0.0.26

Sign up to get free protection for your applications and to get access to all the features.
data/lib/shelly/app.rb CHANGED
@@ -4,12 +4,9 @@ require 'launchy'
4
4
  module Shelly
5
5
  class App < Model
6
6
  DATABASE_KINDS = %w(postgresql mongodb redis none)
7
- attr_accessor :code_name, :databases, :ruby_version, :environment, :git_url, :domains
8
7
 
9
- def initialize
10
- @ruby_version = "MRI-1.9.2"
11
- @environment = "production"
12
- end
8
+ attr_accessor :code_name, :databases, :ruby_version, :environment,
9
+ :git_url, :domains
13
10
 
14
11
  def add_git_remote
15
12
  system("git remote rm production > /dev/null 2>&1")
@@ -18,8 +15,6 @@ module Shelly
18
15
 
19
16
  def generate_cloudfile
20
17
  @email = current_user.email
21
- @databases = databases
22
- @domains = domains
23
18
  template = File.read(cloudfile_template_path)
24
19
  cloudfile = ERB.new(template, 0, "%<>-")
25
20
  cloudfile.result(binding)
@@ -30,16 +25,12 @@ module Shelly
30
25
  end
31
26
 
32
27
  def create
33
- attributes = {
34
- :name => code_name,
35
- :code_name => code_name,
36
- :environment => environment,
37
- :ruby_version => ruby_version,
38
- :domain_name => domains ? domains.join(" ") : nil
39
- }
28
+ attributes = {:name => code_name, :code_name => code_name, :domains => domains}
40
29
  response = shelly.create_app(attributes)
41
30
  self.git_url = response["git_url"]
42
- self.domains = response["domain_name"].split if domains.nil?
31
+ self.domains = response["domains"]
32
+ self.ruby_version = response["ruby_version"]
33
+ self.environment = response["environment"]
43
34
  end
44
35
 
45
36
  def create_cloudfile
@@ -53,10 +53,7 @@ module Shelly
53
53
  conflict = true
54
54
  end
55
55
  say "Uploading your public SSH key" if conflict == false
56
- say "You have following clouds available:", :green
57
- user.apps.each do |app|
58
- say " #{app["code_name"]}"
59
- end
56
+ invoke :list
60
57
  rescue Client::APIError => e
61
58
  if e.validation?
62
59
  e.each_error { |error| say_error "#{error}", :with_exit => false }
@@ -108,6 +105,27 @@ module Shelly
108
105
  end
109
106
  end
110
107
 
108
+ desc "list", "Lists all your clouds"
109
+ def list
110
+ user = Shelly::User.new
111
+ user.token
112
+ apps = user.apps
113
+ unless apps.empty?
114
+ say "You have following clouds available:", :green
115
+ print_table(apps.map do |app|
116
+ state = app["state"] == "deploy_failed" ? " (Support has been notified)" : ""
117
+ [app["code_name"], "| #{app["state"].gsub("_", " ")}#{state}"]
118
+ end, :ident => 2)
119
+ else
120
+ say "You have no clouds yet", :green
121
+ end
122
+ rescue Client::APIError => e
123
+ if e.unauthorized?
124
+ say_error "You are not logged in, use `shelly login`"
125
+ end
126
+ end
127
+ map "status" => :list
128
+
111
129
  # FIXME: move to helpers
112
130
  no_tasks do
113
131
  def check_options(options)
@@ -41,7 +41,7 @@ module Shelly
41
41
  response = shelly.apps_users(clouds)
42
42
  response.inject({}) do |result, app|
43
43
  result[app['code_name']] = app['users'].map do |user|
44
- user['name'] ? "#{user['email']} (#{user['name']})" : user['email']
44
+ user['email']
45
45
  end
46
46
  result
47
47
  end
@@ -1,5 +1,5 @@
1
1
  <%= @code_name %>:
2
- ruby: 1.9.2 # 1.9.2 or ree
2
+ ruby_version: 1.9.2 # 1.9.2 or ree
3
3
  environment: production # RAILS_ENV
4
4
  monitoring_email:
5
5
  - <%= @email %>
@@ -1,3 +1,3 @@
1
1
  module Shelly
2
- VERSION = "0.0.25"
2
+ VERSION = "0.0.26"
3
3
  end
data/shelly.gemspec CHANGED
@@ -25,7 +25,7 @@ Gem::Specification.new do |s|
25
25
  s.add_runtime_dependency "wijet-thor", "~> 0.14.7"
26
26
  s.add_runtime_dependency "rest-client"
27
27
  s.add_runtime_dependency "json"
28
- s.add_runtime_dependency "launchy"
28
+ s.add_runtime_dependency "wijet-launchy"
29
29
 
30
30
  s.files = `git ls-files`.split("\n")
31
31
  s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
@@ -11,16 +11,6 @@ describe Shelly::App do
11
11
  @app.code_name = "foo-staging"
12
12
  end
13
13
 
14
- describe "being initialized" do
15
- it "should have default ruby_version: MRI-1.9.2" do
16
- @app.ruby_version.should == "MRI-1.9.2"
17
- end
18
-
19
- it "should have default environment: production" do
20
- @app.environment.should == "production"
21
- end
22
- end
23
-
24
14
  describe ".guess_code_name" do
25
15
  it "should return name of current working directory" do
26
16
  Shelly::App.guess_code_name.should == "foo"
@@ -60,7 +50,7 @@ describe Shelly::App do
60
50
  FakeFS.deactivate!
61
51
  expected = <<-config
62
52
  foo-staging:
63
- ruby: 1.9.2 # 1.9.2 or ree
53
+ ruby_version: 1.9.2 # 1.9.2 or ree
64
54
  environment: production # RAILS_ENV
65
55
  monitoring_email:
66
56
  - bob@example.com
@@ -127,21 +117,21 @@ config
127
117
  attributes = {
128
118
  :code_name => "fooo",
129
119
  :name => "fooo",
130
- :environment => "production",
131
- :ruby_version => "MRI-1.9.2",
132
- :domain_name => nil
120
+ :domains => nil
133
121
  }
134
122
  @client.should_receive(:create_app).with(attributes).and_return("git_url" => "git@git.shellycloud.com:fooo.git",
135
- "domain_name" => "fooo.shellyapp.com")
123
+ "domains" => %w(fooo.shellyapp.com))
136
124
  @app.create
137
125
  end
138
126
 
139
- it "should assign returned git_url and domain" do
127
+ it "should assign returned git_url, domains, ruby_version and environment" do
140
128
  @client.stub(:create_app).and_return("git_url" => "git@git.example.com:fooo.git",
141
- "domain_name" => "fooo.shellyapp.com")
129
+ "domains" => ["fooo.shellyapp.com"], "ruby_version" => "1.9.2", "environment" => "production")
142
130
  @app.create
143
131
  @app.git_url.should == "git@git.example.com:fooo.git"
144
132
  @app.domains.should == ["fooo.shellyapp.com"]
133
+ @app.ruby_version.should == "1.9.2"
134
+ @app.environment.should == "production"
145
135
  end
146
136
  end
147
137
 
@@ -152,20 +142,18 @@ config
152
142
  attributes = {
153
143
  :code_name => "boo",
154
144
  :name => "boo",
155
- :environment => "production",
156
- :ruby_version => "MRI-1.9.2",
157
- :domain_name => "boo.shellyapp.com boo.example.com"
145
+ :domains => %w(boo.shellyapp.com boo.example.com)
158
146
  }
159
147
  @client.should_receive(:create_app).with(attributes).and_return("git_url" => "git@git.shellycloud.com:fooo.git",
160
- "domain_name" => "boo.shellyapp.com boo.example.com")
148
+ "domains" => %w(boo.shellyapp.com boo.example.com))
161
149
  @app.create
162
150
  end
163
151
 
164
152
  it "should assign returned git_url and domain" do
165
153
  @client.stub(:create_app).and_return("git_url" => "git@git.example.com:fooo.git",
166
- "domain_name" => "boo.shellyapp.com boo.example.com")
154
+ "domains" => %w(boo.shellyapp.com boo.example.com))
167
155
  @app.create
168
- @app.domains.should == ["boo.shellyapp.com", "boo.example.com"]
156
+ @app.domains.should == %w(boo.shellyapp.com boo.example.com)
169
157
  end
170
158
  end
171
159
  end
@@ -25,6 +25,7 @@ describe Shelly::CLI::Main do
25
25
  Tasks:
26
26
  shelly add # Adds new cloud to Shelly Cloud
27
27
  shelly help [TASK] # Describe available tasks or one specific task
28
+ shelly list # Lists all your clouds
28
29
  shelly login [EMAIL] # Logs user in to Shelly Cloud
29
30
  shelly register [EMAIL] # Registers new user account on Shelly Cloud
30
31
  shelly user <command> # Manages users using this cloud
@@ -165,7 +166,8 @@ OUT
165
166
  @user = Shelly::User.new
166
167
  @user.stub(:upload_ssh_key)
167
168
  @client.stub(:token).and_return("abc")
168
- @client.stub(:apps).and_return([{"code_name" => "abc"}, {"code_name" => "fooo"}])
169
+ @client.stub(:apps).and_return([{"code_name" => "abc", "state" => "running"},
170
+ {"code_name" => "fooo", "state" => "no_code"},])
169
171
  Shelly::User.stub(:new).and_return(@user)
170
172
  end
171
173
 
@@ -201,8 +203,8 @@ OUT
201
203
 
202
204
  it "should display list of applications to which user has access" do
203
205
  $stdout.should_receive(:puts).with("\e[32mYou have following clouds available:\e[0m")
204
- $stdout.should_receive(:puts).with(" abc")
205
- $stdout.should_receive(:puts).with(" fooo")
206
+ $stdout.should_receive(:puts).with(/ abc\s+\| running/)
207
+ $stdout.should_receive(:puts).with(/ fooo\s+\| no code/)
206
208
  fake_stdin(["megan@example.com", "secret"]) do
207
209
  @main.login
208
210
  end
@@ -396,5 +398,47 @@ OUT
396
398
  end
397
399
  end
398
400
  end
401
+
402
+ describe "#list" do
403
+ before do
404
+ @user = Shelly::User.new
405
+ @client.stub(:token).and_return("abc")
406
+ @client.stub(:apps).and_return([{"code_name" => "abc", "state" => "running"},
407
+ {"code_name" => "fooo", "state" => "deploy_failed"}])
408
+ Shelly::User.stub(:new).and_return(@user)
409
+ end
410
+
411
+ it "should display user's clouds" do
412
+ $stdout.should_receive(:puts).with("\e[32mYou have following clouds available:\e[0m")
413
+ $stdout.should_receive(:puts).with(/abc\s+\| running/)
414
+ $stdout.should_receive(:puts).with(/fooo\s+\| deploy failed \(Support has been notified\)/)
415
+ @main.list
416
+ end
417
+
418
+ it "should display info that user has no clouds" do
419
+ @client.stub(:apps).and_return([])
420
+ $stdout.should_receive(:puts).with("\e[32mYou have no clouds yet\e[0m")
421
+ @main.list
422
+ end
423
+
424
+ it "should have a 'status' alias" do
425
+ @client.stub(:apps).and_return([])
426
+ $stdout.should_receive(:puts).with("\e[32mYou have no clouds yet\e[0m")
427
+ Shelly::CLI::Main.start(["status"])
428
+ end
429
+
430
+ context "on failure" do
431
+ it "should display info that user is not logged in" do
432
+ body = {"message" => "Unauthorized"}
433
+ error = Shelly::Client::APIError.new(body.to_json)
434
+ @client.stub(:token).and_raise(error)
435
+ $stdout.should_receive(:puts).with("\e[31mYou are not logged in, use `shelly login`\e[0m")
436
+ lambda {
437
+ @main.list
438
+ }.should raise_error(SystemExit)
439
+ end
440
+ end
441
+
442
+ end
399
443
  end
400
444
 
@@ -58,7 +58,7 @@ describe Shelly::CLI::User do
58
58
  $stdout.should_receive(:puts).with("Cloud foo-production:")
59
59
  $stdout.should_receive(:puts).with(" user@example.com")
60
60
  $stdout.should_receive(:puts).with("Cloud foo-staging:")
61
- $stdout.should_receive(:puts).with(" user2@example.com (username2)")
61
+ $stdout.should_receive(:puts).with(" user2@example.com")
62
62
  @cli_user.list
63
63
  end
64
64
  end
@@ -27,11 +27,11 @@ describe Shelly::Cloudfile do
27
27
  @cloudfile.write(@hash)
28
28
  @client.should_receive(:apps_users).and_return(response)
29
29
  response = @cloudfile.fetch_users
30
- response.should == {"foo-staging" => ["user@example.com (username)"]}
30
+ response.should == {"foo-staging" => ["user@example.com"]}
31
31
  end
32
32
 
33
33
  def response
34
- [{'code_name' => 'foo-staging','users' => [{'name' => 'username','email' => 'user@example.com'}]}]
34
+ [{'code_name' => 'foo-staging','users' => [{'email' => 'user@example.com'}]}]
35
35
  end
36
36
  end
37
37
 
metadata CHANGED
@@ -1,174 +1,156 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: shelly
3
- version: !ruby/object:Gem::Version
4
- hash: 45
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.26
5
5
  prerelease:
6
- segments:
7
- - 0
8
- - 0
9
- - 25
10
- version: 0.0.25
11
6
  platform: ruby
12
- authors:
7
+ authors:
13
8
  - Shelly Cloud team
14
9
  autorequire:
15
10
  bindir: bin
16
11
  cert_chain: []
17
-
18
- date: 2011-11-25 00:00:00 Z
19
- dependencies:
20
- - !ruby/object:Gem::Dependency
12
+ date: 2011-12-01 00:00:00.000000000Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
21
15
  name: rspec
22
- prerelease: false
23
- requirement: &id001 !ruby/object:Gem::Requirement
16
+ requirement: &2156723600 !ruby/object:Gem::Requirement
24
17
  none: false
25
- requirements:
26
- - - ">="
27
- - !ruby/object:Gem::Version
28
- hash: 3
29
- segments:
30
- - 0
31
- version: "0"
18
+ requirements:
19
+ - - ! '>='
20
+ - !ruby/object:Gem::Version
21
+ version: '0'
32
22
  type: :development
33
- version_requirements: *id001
34
- - !ruby/object:Gem::Dependency
35
- name: rake
36
23
  prerelease: false
37
- requirement: &id002 !ruby/object:Gem::Requirement
24
+ version_requirements: *2156723600
25
+ - !ruby/object:Gem::Dependency
26
+ name: rake
27
+ requirement: &2156723140 !ruby/object:Gem::Requirement
38
28
  none: false
39
- requirements:
40
- - - ">="
41
- - !ruby/object:Gem::Version
42
- hash: 3
43
- segments:
44
- - 0
45
- version: "0"
29
+ requirements:
30
+ - - ! '>='
31
+ - !ruby/object:Gem::Version
32
+ version: '0'
46
33
  type: :development
47
- version_requirements: *id002
48
- - !ruby/object:Gem::Dependency
49
- name: guard
50
34
  prerelease: false
51
- requirement: &id003 !ruby/object:Gem::Requirement
35
+ version_requirements: *2156723140
36
+ - !ruby/object:Gem::Dependency
37
+ name: guard
38
+ requirement: &2156722620 !ruby/object:Gem::Requirement
52
39
  none: false
53
- requirements:
54
- - - ">="
55
- - !ruby/object:Gem::Version
56
- hash: 3
57
- segments:
58
- - 0
59
- version: "0"
40
+ requirements:
41
+ - - ! '>='
42
+ - !ruby/object:Gem::Version
43
+ version: '0'
60
44
  type: :development
61
- version_requirements: *id003
62
- - !ruby/object:Gem::Dependency
45
+ prerelease: false
46
+ version_requirements: *2156722620
47
+ - !ruby/object:Gem::Dependency
63
48
  name: guard-rspec
49
+ requirement: &2156722100 !ruby/object:Gem::Requirement
50
+ none: false
51
+ requirements:
52
+ - - ! '>='
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ type: :development
64
56
  prerelease: false
65
- requirement: &id004 !ruby/object:Gem::Requirement
57
+ version_requirements: *2156722100
58
+ - !ruby/object:Gem::Dependency
59
+ name: growl_notify
60
+ requirement: &2156721580 !ruby/object:Gem::Requirement
66
61
  none: false
67
- requirements:
68
- - - ">="
69
- - !ruby/object:Gem::Version
70
- hash: 3
71
- segments:
72
- - 0
73
- version: "0"
62
+ requirements:
63
+ - - ! '>='
64
+ - !ruby/object:Gem::Version
65
+ version: '0'
74
66
  type: :development
75
- version_requirements: *id004
76
- - !ruby/object:Gem::Dependency
77
- name: fakefs
78
67
  prerelease: false
79
- requirement: &id005 !ruby/object:Gem::Requirement
68
+ version_requirements: *2156721580
69
+ - !ruby/object:Gem::Dependency
70
+ name: rb-fsevent
71
+ requirement: &2156721160 !ruby/object:Gem::Requirement
80
72
  none: false
81
- requirements:
82
- - - ">="
83
- - !ruby/object:Gem::Version
84
- hash: 3
85
- segments:
86
- - 0
87
- version: "0"
73
+ requirements:
74
+ - - ! '>='
75
+ - !ruby/object:Gem::Version
76
+ version: '0'
88
77
  type: :development
89
- version_requirements: *id005
90
- - !ruby/object:Gem::Dependency
91
- name: fakeweb
92
78
  prerelease: false
93
- requirement: &id006 !ruby/object:Gem::Requirement
79
+ version_requirements: *2156721160
80
+ - !ruby/object:Gem::Dependency
81
+ name: fakefs
82
+ requirement: &2156720740 !ruby/object:Gem::Requirement
94
83
  none: false
95
- requirements:
96
- - - ">="
97
- - !ruby/object:Gem::Version
98
- hash: 3
99
- segments:
100
- - 0
101
- version: "0"
84
+ requirements:
85
+ - - ! '>='
86
+ - !ruby/object:Gem::Version
87
+ version: '0'
88
+ type: :development
89
+ prerelease: false
90
+ version_requirements: *2156720740
91
+ - !ruby/object:Gem::Dependency
92
+ name: fakeweb
93
+ requirement: &2156720060 !ruby/object:Gem::Requirement
94
+ none: false
95
+ requirements:
96
+ - - ! '>='
97
+ - !ruby/object:Gem::Version
98
+ version: '0'
102
99
  type: :development
103
- version_requirements: *id006
104
- - !ruby/object:Gem::Dependency
105
- name: wijet-thor
106
100
  prerelease: false
107
- requirement: &id007 !ruby/object:Gem::Requirement
101
+ version_requirements: *2156720060
102
+ - !ruby/object:Gem::Dependency
103
+ name: wijet-thor
104
+ requirement: &2156719300 !ruby/object:Gem::Requirement
108
105
  none: false
109
- requirements:
106
+ requirements:
110
107
  - - ~>
111
- - !ruby/object:Gem::Version
112
- hash: 41
113
- segments:
114
- - 0
115
- - 14
116
- - 7
108
+ - !ruby/object:Gem::Version
117
109
  version: 0.14.7
118
110
  type: :runtime
119
- version_requirements: *id007
120
- - !ruby/object:Gem::Dependency
121
- name: rest-client
122
111
  prerelease: false
123
- requirement: &id008 !ruby/object:Gem::Requirement
112
+ version_requirements: *2156719300
113
+ - !ruby/object:Gem::Dependency
114
+ name: rest-client
115
+ requirement: &2156718880 !ruby/object:Gem::Requirement
124
116
  none: false
125
- requirements:
126
- - - ">="
127
- - !ruby/object:Gem::Version
128
- hash: 3
129
- segments:
130
- - 0
131
- version: "0"
117
+ requirements:
118
+ - - ! '>='
119
+ - !ruby/object:Gem::Version
120
+ version: '0'
132
121
  type: :runtime
133
- version_requirements: *id008
134
- - !ruby/object:Gem::Dependency
135
- name: json
136
122
  prerelease: false
137
- requirement: &id009 !ruby/object:Gem::Requirement
123
+ version_requirements: *2156718880
124
+ - !ruby/object:Gem::Dependency
125
+ name: json
126
+ requirement: &2156718420 !ruby/object:Gem::Requirement
138
127
  none: false
139
- requirements:
140
- - - ">="
141
- - !ruby/object:Gem::Version
142
- hash: 3
143
- segments:
144
- - 0
145
- version: "0"
128
+ requirements:
129
+ - - ! '>='
130
+ - !ruby/object:Gem::Version
131
+ version: '0'
146
132
  type: :runtime
147
- version_requirements: *id009
148
- - !ruby/object:Gem::Dependency
149
- name: launchy
150
133
  prerelease: false
151
- requirement: &id010 !ruby/object:Gem::Requirement
134
+ version_requirements: *2156718420
135
+ - !ruby/object:Gem::Dependency
136
+ name: wijet-launchy
137
+ requirement: &2156717980 !ruby/object:Gem::Requirement
152
138
  none: false
153
- requirements:
154
- - - ">="
155
- - !ruby/object:Gem::Version
156
- hash: 3
157
- segments:
158
- - 0
159
- version: "0"
139
+ requirements:
140
+ - - ! '>='
141
+ - !ruby/object:Gem::Version
142
+ version: '0'
160
143
  type: :runtime
161
- version_requirements: *id010
144
+ prerelease: false
145
+ version_requirements: *2156717980
162
146
  description: Tool for managing applications and clouds at shellycloud.com
163
- email:
147
+ email:
164
148
  - support@shellycloud.com
165
- executables:
149
+ executables:
166
150
  - shelly
167
151
  extensions: []
168
-
169
152
  extra_rdoc_files: []
170
-
171
- files:
153
+ files:
172
154
  - .gitignore
173
155
  - .travis.yml
174
156
  - Gemfile
@@ -208,36 +190,38 @@ files:
208
190
  - spec/thor/options_spec.rb
209
191
  homepage: http://shellycloud.com
210
192
  licenses: []
211
-
212
193
  post_install_message:
213
194
  rdoc_options: []
214
-
215
- require_paths:
195
+ require_paths:
216
196
  - lib
217
- required_ruby_version: !ruby/object:Gem::Requirement
197
+ required_ruby_version: !ruby/object:Gem::Requirement
218
198
  none: false
219
- requirements:
220
- - - ">="
221
- - !ruby/object:Gem::Version
222
- hash: 3
223
- segments:
224
- - 0
225
- version: "0"
226
- required_rubygems_version: !ruby/object:Gem::Requirement
199
+ requirements:
200
+ - - ! '>='
201
+ - !ruby/object:Gem::Version
202
+ version: '0'
203
+ required_rubygems_version: !ruby/object:Gem::Requirement
227
204
  none: false
228
- requirements:
229
- - - ">="
230
- - !ruby/object:Gem::Version
231
- hash: 3
232
- segments:
233
- - 0
234
- version: "0"
205
+ requirements:
206
+ - - ! '>='
207
+ - !ruby/object:Gem::Version
208
+ version: '0'
235
209
  requirements: []
236
-
237
210
  rubyforge_project: shelly
238
211
  rubygems_version: 1.8.10
239
212
  signing_key:
240
213
  specification_version: 3
241
214
  summary: Shelly Cloud command line tool
242
- test_files: []
243
-
215
+ test_files:
216
+ - spec/helpers.rb
217
+ - spec/input_faker.rb
218
+ - spec/shelly/app_spec.rb
219
+ - spec/shelly/cli/main_spec.rb
220
+ - spec/shelly/cli/runner_spec.rb
221
+ - spec/shelly/cli/user_spec.rb
222
+ - spec/shelly/client_spec.rb
223
+ - spec/shelly/cloudfile_spec.rb
224
+ - spec/shelly/model_spec.rb
225
+ - spec/shelly/user_spec.rb
226
+ - spec/spec_helper.rb
227
+ - spec/thor/options_spec.rb