shelly 0.0.26 → 0.0.27

Sign up to get free protection for your applications and to get access to all the features.
data/README.md CHANGED
@@ -12,7 +12,7 @@
12
12
 
13
13
  ## Running tests
14
14
 
15
- rake spec
15
+ bundle exec rake
16
16
 
17
17
  or
18
18
 
@@ -126,6 +126,26 @@ module Shelly
126
126
  end
127
127
  map "status" => :list
128
128
 
129
+ desc "ip", "Lists clouds IP's"
130
+ def ip
131
+ say_error "Must be run inside your project git repository" unless App.inside_git_repository?
132
+ say_error "No Cloudfile found" unless Cloudfile.present?
133
+ @cloudfile = check_clouds.first
134
+ @cloudfile.fetch_ips.each do |server|
135
+ say "Cloud #{server['code_name']}:"
136
+ say "Web server IP : #{server['web_server_ip']}"
137
+ say "Mail server IP: #{server['mail_server_ip']}"
138
+ end
139
+ rescue Client::APIError => e
140
+ if e.unauthorized?
141
+ e.errors.each { |error| say_error error, :with_exit => false}
142
+ exit 1
143
+ else
144
+ say_error e.message
145
+ end
146
+ end
147
+
148
+
129
149
  # FIXME: move to helpers
130
150
  no_tasks do
131
151
  def check_options(options)
@@ -50,23 +50,6 @@ module Shelly
50
50
  exit 1
51
51
  end
52
52
  end
53
-
54
- no_tasks do
55
- def check_clouds
56
- @cloudfile = Shelly::Cloudfile.new
57
- @user = Shelly::User.new
58
- user_apps = @user.apps.map { |cloud| cloud['code_name'] }
59
- unless @cloudfile.clouds.all? { |cloud| user_apps.include?(cloud) }
60
- errors = (@cloudfile.clouds - user_apps).map do |cloud|
61
- "You have no access to '#{cloud}' cloud defined in Cloudfile"
62
- end
63
- raise Shelly::Client::APIError.new({:message => "Unauthorized",
64
- :errors => errors}.to_json)
65
- end
66
- [@cloudfile, @user]
67
- end
68
-
69
- end
70
53
  end
71
54
  end
72
55
  end
@@ -82,6 +82,12 @@ module Shelly
82
82
  end
83
83
  end
84
84
 
85
+ def apps_ips(apps)
86
+ apps.map do |app|
87
+ get("/apps/#{app}/ips")
88
+ end
89
+ end
90
+
85
91
  def post(path, params = {})
86
92
  request(path, :post, params)
87
93
  end
@@ -46,6 +46,13 @@ module Shelly
46
46
  result
47
47
  end
48
48
  end
49
+
50
+ def fetch_ips
51
+ response = shelly.apps_ips(clouds)
52
+ response.each do |result|
53
+ result
54
+ end
55
+ end
49
56
  end
50
57
  end
51
58
 
@@ -27,6 +27,19 @@ module Shelly
27
27
  say_error "Email can't be blank, please try again"
28
28
  end
29
29
 
30
+ def check_clouds
31
+ @cloudfile = Shelly::Cloudfile.new
32
+ @user = Shelly::User.new
33
+ user_apps = @user.apps.map { |cloud| cloud['code_name'] }
34
+ unless @cloudfile.clouds.all? { |cloud| user_apps.include?(cloud) }
35
+ errors = (@cloudfile.clouds - user_apps).map do |cloud|
36
+ "You have no access to '#{cloud}' cloud defined in Cloudfile"
37
+ end
38
+ raise Shelly::Client::APIError.new({:message => "Unauthorized",
39
+ :errors => errors}.to_json)
40
+ end
41
+ [@cloudfile, @user]
42
+ end
30
43
  end
31
44
  end
32
45
 
@@ -1,3 +1,3 @@
1
1
  module Shelly
2
- VERSION = "0.0.26"
2
+ VERSION = "0.0.27"
3
3
  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 ip # Lists clouds IP's
28
29
  shelly list # Lists all your clouds
29
30
  shelly login [EMAIL] # Logs user in to Shelly Cloud
30
31
  shelly register [EMAIL] # Registers new user account on Shelly Cloud
@@ -440,5 +441,58 @@ OUT
440
441
  end
441
442
 
442
443
  end
444
+
445
+ describe "#ips" do
446
+ before do
447
+ File.open("Cloudfile", 'w') {|f| f.write("foo-staging:\nfoo-production:\n") }
448
+ Shelly::App.stub(:inside_git_repository?).and_return(true)
449
+ end
450
+
451
+ it "should exit with message if command run outside git repository" do
452
+ Shelly::App.stub(:inside_git_repository?).and_return(false)
453
+ $stdout.should_receive(:puts).with("\e[31mMust be run inside your project git repository\e[0m")
454
+ lambda {
455
+ @main.ip
456
+ }.should raise_error(SystemExit)
457
+ end
458
+
459
+ it "should exit with message if there is no Cloudfile" do
460
+ File.delete("Cloudfile")
461
+ $stdout.should_receive(:puts).with("\e[31mNo Cloudfile found\e[0m")
462
+ lambda {
463
+ @main.ip
464
+ }.should raise_error(SystemExit)
465
+ end
466
+
467
+ context "on success" do
468
+ it "should display mail and web server ip's" do
469
+ @client.should_receive(:apps).and_return([{"code_name" => "foo-production"},{"code_name" => "foo-staging"}])
470
+ @client.stub(:apps_ips).and_return(response)
471
+ $stdout.should_receive(:puts).with("Cloud foo-production:")
472
+ $stdout.should_receive(:puts).with("Web server IP : 22.22.22.22")
473
+ $stdout.should_receive(:puts).with("Mail server IP: 11.11.11.11")
474
+ @main.ip
475
+ end
476
+ end
477
+
478
+ def response
479
+ [{'code_name' => 'foo-production', 'mail_server_ip' => '11.11.11.11', 'web_server_ip' => '22.22.22.22'}]
480
+ end
481
+
482
+ context "on failure" do
483
+ it "should raise an error if user is not in git repository" do
484
+ Shelly::App.stub(:inside_git_repository?).and_return(false)
485
+ $stdout.should_receive(:puts).with("\e[31mMust be run inside your project git repository\e[0m")
486
+ lambda { @main.ip }.should raise_error(SystemExit)
487
+ end
488
+
489
+ it "should raise an error if user does not have access to cloud" do
490
+ @client.should_receive(:apps).and_return([{"code_name" => "foo-production"}])
491
+ @client.stub(:apps_users).and_return(response)
492
+ $stdout.should_receive(:puts).with("\e[31mYou have no access to 'foo-staging' cloud defined in Cloudfile\e[0m")
493
+ lambda { @main.ip }.should raise_error(SystemExit)
494
+ end
495
+ end
496
+ end
443
497
  end
444
498
 
metadata CHANGED
@@ -1,156 +1,174 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: shelly
3
- version: !ruby/object:Gem::Version
4
- version: 0.0.26
3
+ version: !ruby/object:Gem::Version
4
+ hash: 41
5
5
  prerelease:
6
+ segments:
7
+ - 0
8
+ - 0
9
+ - 27
10
+ version: 0.0.27
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-01 00:00:00.000000000Z
13
- dependencies:
14
- - !ruby/object:Gem::Dependency
17
+
18
+ date: 2011-12-05 00:00:00 Z
19
+ dependencies:
20
+ - !ruby/object:Gem::Dependency
15
21
  name: rspec
16
- requirement: &2156723600 !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: *2156723600
25
- - !ruby/object:Gem::Dependency
26
- name: rake
27
- requirement: &2156723140 !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: *2156723140
36
- - !ruby/object:Gem::Dependency
37
- name: guard
38
- requirement: &2156722620 !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: *2156722620
47
- - !ruby/object:Gem::Dependency
48
- name: guard-rspec
49
- requirement: &2156722100 !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: *2156722100
58
- - !ruby/object:Gem::Dependency
59
- name: growl_notify
60
- requirement: &2156721580 !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: *2156721580
69
- - !ruby/object:Gem::Dependency
70
- name: rb-fsevent
71
- requirement: &2156721160 !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: *2156721160
80
- - !ruby/object:Gem::Dependency
75
+ version_requirements: *id004
76
+ - !ruby/object:Gem::Dependency
81
77
  name: fakefs
82
- requirement: &2156720740 !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: *2156720740
91
- - !ruby/object:Gem::Dependency
89
+ version_requirements: *id005
90
+ - !ruby/object:Gem::Dependency
92
91
  name: fakeweb
93
- requirement: &2156720060 !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: *2156720060
102
- - !ruby/object:Gem::Dependency
103
+ version_requirements: *id006
104
+ - !ruby/object:Gem::Dependency
103
105
  name: wijet-thor
104
- requirement: &2156719300 !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: *2156719300
113
- - !ruby/object:Gem::Dependency
119
+ version_requirements: *id007
120
+ - !ruby/object:Gem::Dependency
114
121
  name: rest-client
115
- requirement: &2156718880 !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: *2156718880
124
- - !ruby/object:Gem::Dependency
133
+ version_requirements: *id008
134
+ - !ruby/object:Gem::Dependency
125
135
  name: json
126
- requirement: &2156718420 !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: *2156718420
135
- - !ruby/object:Gem::Dependency
147
+ version_requirements: *id009
148
+ - !ruby/object:Gem::Dependency
136
149
  name: wijet-launchy
137
- requirement: &2156717980 !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: *2156717980
161
+ version_requirements: *id010
146
162
  description: Tool for managing applications and clouds at shellycloud.com
147
- email:
163
+ email:
148
164
  - support@shellycloud.com
149
- executables:
165
+ executables:
150
166
  - shelly
151
167
  extensions: []
168
+
152
169
  extra_rdoc_files: []
153
- files:
170
+
171
+ files:
154
172
  - .gitignore
155
173
  - .travis.yml
156
174
  - Gemfile
@@ -190,38 +208,36 @@ files:
190
208
  - spec/thor/options_spec.rb
191
209
  homepage: http://shellycloud.com
192
210
  licenses: []
211
+
193
212
  post_install_message:
194
213
  rdoc_options: []
195
- require_paths:
214
+
215
+ require_paths:
196
216
  - lib
197
- required_ruby_version: !ruby/object:Gem::Requirement
217
+ required_ruby_version: !ruby/object:Gem::Requirement
198
218
  none: false
199
- requirements:
200
- - - ! '>='
201
- - !ruby/object:Gem::Version
202
- version: '0'
203
- required_rubygems_version: !ruby/object:Gem::Requirement
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
204
227
  none: false
205
- requirements:
206
- - - ! '>='
207
- - !ruby/object:Gem::Version
208
- version: '0'
228
+ requirements:
229
+ - - ">="
230
+ - !ruby/object:Gem::Version
231
+ hash: 3
232
+ segments:
233
+ - 0
234
+ version: "0"
209
235
  requirements: []
236
+
210
237
  rubyforge_project: shelly
211
238
  rubygems_version: 1.8.10
212
239
  signing_key:
213
240
  specification_version: 3
214
241
  summary: Shelly Cloud command line tool
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
242
+ test_files: []
243
+