shelly 0.0.25 → 0.0.26

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
@@ -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