shelly 0.3.4 → 0.3.5.pre
Sign up to get free protection for your applications and to get access to all the features.
- data/lib/shelly/app.rb +12 -8
- data/lib/shelly/cli/database.rb +17 -1
- data/lib/shelly/cli/deploy.rb +26 -21
- data/lib/shelly/client.rb +1 -0
- data/lib/shelly/client/apps.rb +0 -8
- data/lib/shelly/client/tunnels.rb +10 -0
- data/lib/shelly/version.rb +1 -1
- data/spec/shelly/app_spec.rb +12 -5
- data/spec/shelly/cli/database_spec.rb +32 -0
- data/spec/shelly/cli/deploy_spec.rb +9 -0
- data/spec/shelly/cli/file_spec.rb +5 -5
- data/spec/shelly/cli/main_spec.rb +2 -2
- data/spec/shelly/client_spec.rb +3 -3
- metadata +75 -25
data/lib/shelly/app.rb
CHANGED
@@ -269,7 +269,7 @@ module Shelly
|
|
269
269
|
end
|
270
270
|
|
271
271
|
def upload(source)
|
272
|
-
|
272
|
+
tunnel_connection.tap do |conn|
|
273
273
|
rsync(source, "#{conn['host']}:#{persistent_disk}", conn)
|
274
274
|
end
|
275
275
|
end
|
@@ -281,7 +281,7 @@ module Shelly
|
|
281
281
|
end
|
282
282
|
|
283
283
|
def download(relative_source, destination)
|
284
|
-
|
284
|
+
tunnel_connection.tap do |conn|
|
285
285
|
source = File.join("#{conn['host']}:#{persistent_disk}", relative_source)
|
286
286
|
rsync(source, destination, conn)
|
287
287
|
end
|
@@ -291,6 +291,10 @@ module Shelly
|
|
291
291
|
ssh(:command => "delete_file #{remote_path}")
|
292
292
|
end
|
293
293
|
|
294
|
+
def setup_tunnel(conn, local_port)
|
295
|
+
system "ssh #{ssh_options(conn)} -N -L #{local_port}:localhost:#{conn['service']['port']} #{conn['host']}"
|
296
|
+
end
|
297
|
+
|
294
298
|
# Public: Return databases for given Cloud in Cloudfile
|
295
299
|
# Returns Array of databases
|
296
300
|
def cloud_databases
|
@@ -351,6 +355,11 @@ module Shelly
|
|
351
355
|
IO.popen(%Q{git log --no-merges --oneline --pretty=format:"#{format}" #{range}}).read.strip
|
352
356
|
end
|
353
357
|
|
358
|
+
# Returns first at least configured virtual server
|
359
|
+
def tunnel_connection(service = "ssh", server = nil)
|
360
|
+
shelly.tunnel(code_name, service, server)
|
361
|
+
end
|
362
|
+
|
354
363
|
private
|
355
364
|
|
356
365
|
def assign_attributes(response)
|
@@ -373,18 +382,13 @@ module Shelly
|
|
373
382
|
content["servers"].any? {|_, settings| settings.has_key?(option)}
|
374
383
|
end
|
375
384
|
|
376
|
-
# Returns first at least configured virtual server
|
377
|
-
def console_connection(server = nil)
|
378
|
-
shelly.console(code_name, server)
|
379
|
-
end
|
380
|
-
|
381
385
|
# Returns first at least configured virtual server if databases are configured
|
382
386
|
def configured_db_server_connection(server = nil)
|
383
387
|
shelly.configured_db_server(code_name, server)
|
384
388
|
end
|
385
389
|
|
386
390
|
def ssh(options = {})
|
387
|
-
conn =
|
391
|
+
conn = tunnel_connection("ssh", options[:server])
|
388
392
|
system "ssh #{ssh_options(conn)} -t #{conn['host']} #{options[:command]}"
|
389
393
|
end
|
390
394
|
|
data/lib/shelly/cli/database.rb
CHANGED
@@ -6,7 +6,7 @@ module Shelly
|
|
6
6
|
class Database < Command
|
7
7
|
namespace :database
|
8
8
|
include Helpers
|
9
|
-
before_hook :logged_in?, :only => [:reset]
|
9
|
+
before_hook :logged_in?, :only => [:reset, :tunnel]
|
10
10
|
class_option :cloud, :type => :string, :aliases => "-c", :desc => "Specify cloud"
|
11
11
|
|
12
12
|
desc "reset KIND", "Reset database"
|
@@ -23,6 +23,22 @@ module Shelly
|
|
23
23
|
rescue Client::ConflictException
|
24
24
|
say_error "Cloud #{app} wasn't deployed properly. Cannot reset database."
|
25
25
|
end
|
26
|
+
|
27
|
+
desc "tunnel KIND", "Setup tunnel to given database"
|
28
|
+
method_option :port, :type => :string, :aliases => "-p",
|
29
|
+
:desc => "Local port on which tunnel will be set up"
|
30
|
+
def tunnel(kind)
|
31
|
+
app = multiple_clouds(options[:cloud], "database tunnel")
|
32
|
+
local_port = options[:port] || 9900
|
33
|
+
conn = app.tunnel_connection(kind)
|
34
|
+
say "Connection details", :green
|
35
|
+
say "host: localhost"
|
36
|
+
say "port: #{local_port}"
|
37
|
+
say "database: #{conn['service']['database_name']}"
|
38
|
+
say "username: #{conn['service']['username']}"
|
39
|
+
say "password: #{conn['service']['password']}"
|
40
|
+
app.setup_tunnel(conn, local_port)
|
41
|
+
end
|
26
42
|
end
|
27
43
|
end
|
28
44
|
end
|
data/lib/shelly/cli/deploy.rb
CHANGED
@@ -38,27 +38,32 @@ module Shelly
|
|
38
38
|
specify_log(log)
|
39
39
|
app = multiple_clouds(options[:cloud], "deploy show #{log}")
|
40
40
|
content = app.deploy_log(log)
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
41
|
+
unless content.empty?
|
42
|
+
say "Log for deploy done on #{content["created_at"]}", :green
|
43
|
+
if content["bundle_install"]
|
44
|
+
say("Starting bundle install", :green); say(content["bundle_install"])
|
45
|
+
end
|
46
|
+
if content["whenever"]
|
47
|
+
say("Starting whenever", :green); say(content["whenever"])
|
48
|
+
end
|
49
|
+
if content["callbacks"]
|
50
|
+
say("Starting callbacks", :green); say(content["callbacks"])
|
51
|
+
end
|
52
|
+
if content["delayed_job"]
|
53
|
+
say("Starting delayed job", :green); say(content["delayed_job"])
|
54
|
+
end
|
55
|
+
if content["sidekiq"]
|
56
|
+
say("Starting sidekiq", :green); say(content["sidekiq"])
|
57
|
+
end
|
58
|
+
if content["thin_restart"]
|
59
|
+
say("Starting thin", :green); say(content["thin_restart"])
|
60
|
+
end
|
61
|
+
if content["puma_restart"]
|
62
|
+
say("Starting puma", :green); say(content["puma_restart"])
|
63
|
+
end
|
64
|
+
else
|
65
|
+
say_error("There was an error and log is not available", :with_exit => false)
|
66
|
+
say_error("Please contact our support https://shellycloud.com/support")
|
62
67
|
end
|
63
68
|
rescue Client::NotFoundException => e
|
64
69
|
raise unless e.resource == :log
|
data/lib/shelly/client.rb
CHANGED
data/lib/shelly/client/apps.rb
CHANGED
@@ -33,12 +33,4 @@ class Shelly::Client
|
|
33
33
|
def command(cloud, body, type)
|
34
34
|
post("/apps/#{cloud}/command", {:body => body, :type => type})
|
35
35
|
end
|
36
|
-
|
37
|
-
def console(code_name, server = nil)
|
38
|
-
get("/apps/#{code_name}/console", {:server => server})
|
39
|
-
end
|
40
|
-
|
41
|
-
def configured_db_server(code_name, server = nil)
|
42
|
-
get("/apps/#{code_name}/configured_db_server", {:server => server})
|
43
|
-
end
|
44
36
|
end
|
@@ -0,0 +1,10 @@
|
|
1
|
+
class Shelly::Client
|
2
|
+
def tunnel(code_name, service, server = nil)
|
3
|
+
post("/apps/#{code_name}/tunnels", {:server => server, :service => service})
|
4
|
+
end
|
5
|
+
|
6
|
+
def configured_db_server(code_name, server = nil)
|
7
|
+
get("/apps/#{code_name}/configured_db_server",
|
8
|
+
{:server => server, :service => "ssh"})
|
9
|
+
end
|
10
|
+
end
|
data/lib/shelly/version.rb
CHANGED
data/spec/shelly/app_spec.rb
CHANGED
@@ -291,7 +291,7 @@ describe Shelly::App do
|
|
291
291
|
|
292
292
|
describe "#rake" do
|
293
293
|
it "should return result of rake task" do
|
294
|
-
@client.stub(:
|
294
|
+
@client.stub(:tunnel).and_return(
|
295
295
|
{"host" => "console.example.com", "port" => "40010", "user" => "foo"})
|
296
296
|
@app.should_receive(:system).with("ssh -o StrictHostKeyChecking=no -p 40010 -l foo -t console.example.com rake_runner \"test\"")
|
297
297
|
@app.rake("test")
|
@@ -349,7 +349,7 @@ describe Shelly::App do
|
|
349
349
|
|
350
350
|
describe "#console" do
|
351
351
|
it "should run ssh with all parameters" do
|
352
|
-
@client.stub(:
|
352
|
+
@client.stub(:tunnel).and_return(
|
353
353
|
{"host" => "console.example.com", "port" => "40010", "user" => "foo"})
|
354
354
|
@app.should_receive(:system).with("ssh -o StrictHostKeyChecking=no -p 40010 -l foo -t console.example.com ")
|
355
355
|
@app.console
|
@@ -357,7 +357,7 @@ describe Shelly::App do
|
|
357
357
|
|
358
358
|
context "when server passed" do
|
359
359
|
it "should request console on given server" do
|
360
|
-
@client.should_receive(:
|
360
|
+
@client.should_receive(:tunnel).with("foo-staging", "ssh", "app1").and_return({})
|
361
361
|
@app.stub(:system)
|
362
362
|
@app.console("app1")
|
363
363
|
end
|
@@ -373,7 +373,7 @@ describe Shelly::App do
|
|
373
373
|
|
374
374
|
describe "#upload" do
|
375
375
|
it "should run rsync with proper parameters" do
|
376
|
-
@client.stub(:
|
376
|
+
@client.stub(:tunnel).and_return(
|
377
377
|
{"host" => "console.example.com", "port" => "40010", "user" => "foo"})
|
378
378
|
@app.should_receive(:system).with("rsync -avz -e 'ssh -o StrictHostKeyChecking=no -p 40010 -l foo' --progress /path console.example.com:/home/foo-staging/disk")
|
379
379
|
@app.upload("/path")
|
@@ -382,7 +382,7 @@ describe Shelly::App do
|
|
382
382
|
|
383
383
|
describe "#download" do
|
384
384
|
it "should run rsync with proper parameters" do
|
385
|
-
@client.stub(:
|
385
|
+
@client.stub(:tunnel).and_return(
|
386
386
|
{"host" => "console.example.com", "port" => "40010", "user" => "foo"})
|
387
387
|
@app.should_receive(:system).with("rsync -avz -e 'ssh -o StrictHostKeyChecking=no -p 40010 -l foo' --progress console.example.com:/home/foo-staging/disk/. /tmp")
|
388
388
|
@app.download(".", "/tmp")
|
@@ -545,4 +545,11 @@ describe Shelly::App do
|
|
545
545
|
@app.pending_commits.should == "c10c5f6 Some changes"
|
546
546
|
end
|
547
547
|
end
|
548
|
+
|
549
|
+
describe "#setup_tunnel" do
|
550
|
+
it "should setup tunnel with given options" do
|
551
|
+
@app.should_receive(:system).with("ssh -o StrictHostKeyChecking=no -p 43000 -l foo -N -L 9999:localhost:5432 console.example.com")
|
552
|
+
@app.setup_tunnel({"service" => {"port" => "5432"}, "host" => "console.example.com", "port" => 43000, "user" => "foo"}, 9999)
|
553
|
+
end
|
554
|
+
end
|
548
555
|
end
|
@@ -30,4 +30,36 @@ describe Shelly::CLI::Database do
|
|
30
30
|
end
|
31
31
|
end
|
32
32
|
end
|
33
|
+
|
34
|
+
describe "#tunnel" do
|
35
|
+
it "should ensure user has logged in" do
|
36
|
+
hooks(@database, :tunnel).should include(:logged_in?)
|
37
|
+
end
|
38
|
+
|
39
|
+
it "should show tunnel's details" do
|
40
|
+
@app.stub(:setup_tunnel)
|
41
|
+
conn = {
|
42
|
+
'service' => {
|
43
|
+
'database_name' => 'foo',
|
44
|
+
'username' => 'foo',
|
45
|
+
'password' => 'secret'
|
46
|
+
}
|
47
|
+
}
|
48
|
+
@app.should_receive(:tunnel_connection).and_return(conn)
|
49
|
+
$stdout.should_receive(:puts).with("host: localhost")
|
50
|
+
$stdout.should_receive(:puts).with("port: 9900")
|
51
|
+
$stdout.should_receive(:puts).with("database: foo")
|
52
|
+
$stdout.should_receive(:puts).with("username: foo")
|
53
|
+
$stdout.should_receive(:puts).with("password: secret")
|
54
|
+
invoke(@database, :tunnel, "mongodb")
|
55
|
+
end
|
56
|
+
|
57
|
+
it "should setup tunnel" do
|
58
|
+
conn = {"host" => "localhost", "service" => {"port" => "27010"}}
|
59
|
+
@app.should_receive(:tunnel_connection).and_return(conn)
|
60
|
+
@app.should_receive(:setup_tunnel).with(conn, 10103)
|
61
|
+
@database.options = {:port => 10103}
|
62
|
+
invoke(@database, :tunnel, "mongodb")
|
63
|
+
end
|
64
|
+
end
|
33
65
|
end
|
@@ -86,6 +86,15 @@ describe Shelly::CLI::Deploy do
|
|
86
86
|
end
|
87
87
|
end
|
88
88
|
|
89
|
+
context "log is missing" do
|
90
|
+
it "should show error about contact support" do
|
91
|
+
@client.should_receive(:deploy_log).with("foo-staging", "last").and_return({})
|
92
|
+
$stdout.should_receive(:puts).with(red "There was an error and log is not available")
|
93
|
+
$stdout.should_receive(:puts).with(red "Please contact our support https://shellycloud.com/support")
|
94
|
+
lambda { invoke(@deploys, :show, "last") }.should raise_error(SystemExit)
|
95
|
+
end
|
96
|
+
end
|
97
|
+
|
89
98
|
def expected_output
|
90
99
|
$stdout.should_receive(:puts).with(green "Log for deploy done on 2011-12-12 at 14:14:59")
|
91
100
|
$stdout.should_receive(:puts).with(green "Starting bundle install")
|
@@ -28,7 +28,7 @@ describe Shelly::CLI::File do
|
|
28
28
|
|
29
29
|
context "cloud is not running" do
|
30
30
|
it "should display error" do
|
31
|
-
@client.stub(:
|
31
|
+
@client.stub(:tunnel).and_raise(Shelly::Client::ConflictException)
|
32
32
|
$stdout.should_receive(:puts).with(red "Cloud foo-production wasn't deployed properly. Cannot list files.")
|
33
33
|
lambda {
|
34
34
|
invoke(@cli_files, :list, "some/path")
|
@@ -45,7 +45,7 @@ describe Shelly::CLI::File do
|
|
45
45
|
|
46
46
|
it "should upload files" do
|
47
47
|
expected = {"host" => "console.example.com", "port" => "40010", "user" => "foo"}
|
48
|
-
@client.stub(:
|
48
|
+
@client.stub(:tunnel).and_return(expected)
|
49
49
|
@app.should_receive(:upload).with("some/path")
|
50
50
|
invoke(@cli_files, :upload, "some/path")
|
51
51
|
end
|
@@ -59,7 +59,7 @@ describe Shelly::CLI::File do
|
|
59
59
|
|
60
60
|
context "cloud is not running" do
|
61
61
|
it "should display error" do
|
62
|
-
@client.stub(:
|
62
|
+
@client.stub(:tunnel).and_raise(Shelly::Client::ConflictException)
|
63
63
|
$stdout.should_receive(:puts).with(red "Cloud foo-production wasn't deployed properly. Cannot upload files.")
|
64
64
|
lambda {
|
65
65
|
invoke(@cli_files, :upload, "some/path")
|
@@ -81,14 +81,14 @@ describe Shelly::CLI::File do
|
|
81
81
|
|
82
82
|
it "should download files" do
|
83
83
|
expected = {"host" => "console.example.com", "port" => "40010", "user" => "foo"}
|
84
|
-
@client.stub(:
|
84
|
+
@client.stub(:tunnel).and_return(expected)
|
85
85
|
@app.should_receive(:download).with("some/path", "/destination")
|
86
86
|
invoke(@cli_files, :download, "some/path", "/destination")
|
87
87
|
end
|
88
88
|
|
89
89
|
context "cloud is not running" do
|
90
90
|
it "should display error" do
|
91
|
-
@client.stub(:
|
91
|
+
@client.stub(:tunnel).and_raise(Shelly::Client::ConflictException)
|
92
92
|
$stdout.should_receive(:puts).with(red "Cloud foo-production wasn't deployed properly. Cannot download files.")
|
93
93
|
lambda {
|
94
94
|
invoke(@cli_files, :download, "some/path")
|
@@ -1379,7 +1379,7 @@ Wait until cloud is in 'turned off' state and try again.")
|
|
1379
1379
|
|
1380
1380
|
context "virtual servers are not running" do
|
1381
1381
|
it "should display error" do
|
1382
|
-
@client.stub(:
|
1382
|
+
@client.stub(:tunnel).and_raise(Shelly::Client::ConflictException)
|
1383
1383
|
$stdout.should_receive(:puts).with(red "Cloud foo-production is not running. Cannot run console.")
|
1384
1384
|
lambda {
|
1385
1385
|
invoke(@main, :console)
|
@@ -1390,7 +1390,7 @@ Wait until cloud is in 'turned off' state and try again.")
|
|
1390
1390
|
context "virtual server not found" do
|
1391
1391
|
it "should display error" do
|
1392
1392
|
ex = Shelly::Client::NotFoundException.new("resource" => "virtual_server")
|
1393
|
-
@client.stub(:
|
1393
|
+
@client.stub(:tunnel).and_raise(ex)
|
1394
1394
|
@main.options = {:server => "foobar"}
|
1395
1395
|
$stdout.should_receive(:puts).with(red "Virtual Server 'foobar' not found")
|
1396
1396
|
lambda {
|
data/spec/shelly/client_spec.rb
CHANGED
@@ -250,12 +250,12 @@ describe Shelly::Client do
|
|
250
250
|
end
|
251
251
|
end
|
252
252
|
|
253
|
-
describe "#
|
253
|
+
describe "#tunnel" do
|
254
254
|
it "should fetch virtual server data from API" do
|
255
255
|
body = {:port => "40010", :host => "console.example.com", :user => "foo-production"}
|
256
|
-
FakeWeb.register_uri(:
|
256
|
+
FakeWeb.register_uri(:post, api_url("apps/staging-foo/tunnels"),
|
257
257
|
:body => body.to_json)
|
258
|
-
response = @client.
|
258
|
+
response = @client.tunnel("staging-foo", "ssh")
|
259
259
|
response.should == {"port" => "40010", "host" => "console.example.com", "user"=>"foo-production"}
|
260
260
|
end
|
261
261
|
end
|
metadata
CHANGED
@@ -1,25 +1,25 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: shelly
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
|
5
|
-
|
4
|
+
prerelease: 6
|
5
|
+
version: 0.3.5.pre
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
8
8
|
- Shelly Cloud team
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2013-07-
|
12
|
+
date: 2013-07-16 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: rspec
|
16
|
+
type: :development
|
16
17
|
requirement: !ruby/object:Gem::Requirement
|
17
18
|
none: false
|
18
19
|
requirements:
|
19
20
|
- - ~>
|
20
21
|
- !ruby/object:Gem::Version
|
21
22
|
version: 2.11.0
|
22
|
-
type: :development
|
23
23
|
prerelease: false
|
24
24
|
version_requirements: !ruby/object:Gem::Requirement
|
25
25
|
none: false
|
@@ -29,13 +29,13 @@ dependencies:
|
|
29
29
|
version: 2.11.0
|
30
30
|
- !ruby/object:Gem::Dependency
|
31
31
|
name: rake
|
32
|
+
type: :development
|
32
33
|
requirement: !ruby/object:Gem::Requirement
|
33
34
|
none: false
|
34
35
|
requirements:
|
35
36
|
- - ! '>='
|
36
37
|
- !ruby/object:Gem::Version
|
37
38
|
version: '0'
|
38
|
-
type: :development
|
39
39
|
prerelease: false
|
40
40
|
version_requirements: !ruby/object:Gem::Requirement
|
41
41
|
none: false
|
@@ -45,13 +45,13 @@ dependencies:
|
|
45
45
|
version: '0'
|
46
46
|
- !ruby/object:Gem::Dependency
|
47
47
|
name: guard
|
48
|
+
type: :development
|
48
49
|
requirement: !ruby/object:Gem::Requirement
|
49
50
|
none: false
|
50
51
|
requirements:
|
51
52
|
- - ! '>='
|
52
53
|
- !ruby/object:Gem::Version
|
53
54
|
version: '0'
|
54
|
-
type: :development
|
55
55
|
prerelease: false
|
56
56
|
version_requirements: !ruby/object:Gem::Requirement
|
57
57
|
none: false
|
@@ -61,13 +61,13 @@ dependencies:
|
|
61
61
|
version: '0'
|
62
62
|
- !ruby/object:Gem::Dependency
|
63
63
|
name: guard-rspec
|
64
|
+
type: :development
|
64
65
|
requirement: !ruby/object:Gem::Requirement
|
65
66
|
none: false
|
66
67
|
requirements:
|
67
68
|
- - ! '>='
|
68
69
|
- !ruby/object:Gem::Version
|
69
70
|
version: '0'
|
70
|
-
type: :development
|
71
71
|
prerelease: false
|
72
72
|
version_requirements: !ruby/object:Gem::Requirement
|
73
73
|
none: false
|
@@ -77,13 +77,45 @@ dependencies:
|
|
77
77
|
version: '0'
|
78
78
|
- !ruby/object:Gem::Dependency
|
79
79
|
name: simplecov
|
80
|
+
type: :development
|
81
|
+
requirement: !ruby/object:Gem::Requirement
|
82
|
+
none: false
|
83
|
+
requirements:
|
84
|
+
- - ! '>='
|
85
|
+
- !ruby/object:Gem::Version
|
86
|
+
version: '0'
|
87
|
+
prerelease: false
|
88
|
+
version_requirements: !ruby/object:Gem::Requirement
|
89
|
+
none: false
|
90
|
+
requirements:
|
91
|
+
- - ! '>='
|
92
|
+
- !ruby/object:Gem::Version
|
93
|
+
version: '0'
|
94
|
+
- !ruby/object:Gem::Dependency
|
95
|
+
name: ruby_gntp
|
96
|
+
type: :development
|
80
97
|
requirement: !ruby/object:Gem::Requirement
|
81
98
|
none: false
|
82
99
|
requirements:
|
83
100
|
- - ! '>='
|
84
101
|
- !ruby/object:Gem::Version
|
85
102
|
version: '0'
|
103
|
+
prerelease: false
|
104
|
+
version_requirements: !ruby/object:Gem::Requirement
|
105
|
+
none: false
|
106
|
+
requirements:
|
107
|
+
- - ! '>='
|
108
|
+
- !ruby/object:Gem::Version
|
109
|
+
version: '0'
|
110
|
+
- !ruby/object:Gem::Dependency
|
111
|
+
name: rb-fsevent
|
86
112
|
type: :development
|
113
|
+
requirement: !ruby/object:Gem::Requirement
|
114
|
+
none: false
|
115
|
+
requirements:
|
116
|
+
- - ! '>='
|
117
|
+
- !ruby/object:Gem::Version
|
118
|
+
version: '0'
|
87
119
|
prerelease: false
|
88
120
|
version_requirements: !ruby/object:Gem::Requirement
|
89
121
|
none: false
|
@@ -93,13 +125,13 @@ dependencies:
|
|
93
125
|
version: '0'
|
94
126
|
- !ruby/object:Gem::Dependency
|
95
127
|
name: fakefs
|
128
|
+
type: :development
|
96
129
|
requirement: !ruby/object:Gem::Requirement
|
97
130
|
none: false
|
98
131
|
requirements:
|
99
132
|
- - ! '>='
|
100
133
|
- !ruby/object:Gem::Version
|
101
134
|
version: '0'
|
102
|
-
type: :development
|
103
135
|
prerelease: false
|
104
136
|
version_requirements: !ruby/object:Gem::Requirement
|
105
137
|
none: false
|
@@ -109,13 +141,13 @@ dependencies:
|
|
109
141
|
version: '0'
|
110
142
|
- !ruby/object:Gem::Dependency
|
111
143
|
name: fakeweb
|
144
|
+
type: :development
|
112
145
|
requirement: !ruby/object:Gem::Requirement
|
113
146
|
none: false
|
114
147
|
requirements:
|
115
148
|
- - ! '>='
|
116
149
|
- !ruby/object:Gem::Version
|
117
150
|
version: '0'
|
118
|
-
type: :development
|
119
151
|
prerelease: false
|
120
152
|
version_requirements: !ruby/object:Gem::Requirement
|
121
153
|
none: false
|
@@ -125,13 +157,13 @@ dependencies:
|
|
125
157
|
version: '0'
|
126
158
|
- !ruby/object:Gem::Dependency
|
127
159
|
name: wijet-thor
|
160
|
+
type: :runtime
|
128
161
|
requirement: !ruby/object:Gem::Requirement
|
129
162
|
none: false
|
130
163
|
requirements:
|
131
164
|
- - ~>
|
132
165
|
- !ruby/object:Gem::Version
|
133
166
|
version: 0.14.9
|
134
|
-
type: :runtime
|
135
167
|
prerelease: false
|
136
168
|
version_requirements: !ruby/object:Gem::Requirement
|
137
169
|
none: false
|
@@ -141,13 +173,13 @@ dependencies:
|
|
141
173
|
version: 0.14.9
|
142
174
|
- !ruby/object:Gem::Dependency
|
143
175
|
name: rest-client
|
176
|
+
type: :runtime
|
144
177
|
requirement: !ruby/object:Gem::Requirement
|
145
178
|
none: false
|
146
179
|
requirements:
|
147
180
|
- - ! '>='
|
148
181
|
- !ruby/object:Gem::Version
|
149
182
|
version: '0'
|
150
|
-
type: :runtime
|
151
183
|
prerelease: false
|
152
184
|
version_requirements: !ruby/object:Gem::Requirement
|
153
185
|
none: false
|
@@ -157,13 +189,13 @@ dependencies:
|
|
157
189
|
version: '0'
|
158
190
|
- !ruby/object:Gem::Dependency
|
159
191
|
name: json
|
192
|
+
type: :runtime
|
160
193
|
requirement: !ruby/object:Gem::Requirement
|
161
194
|
none: false
|
162
195
|
requirements:
|
163
196
|
- - ! '>='
|
164
197
|
- !ruby/object:Gem::Version
|
165
198
|
version: '0'
|
166
|
-
type: :runtime
|
167
199
|
prerelease: false
|
168
200
|
version_requirements: !ruby/object:Gem::Requirement
|
169
201
|
none: false
|
@@ -173,13 +205,13 @@ dependencies:
|
|
173
205
|
version: '0'
|
174
206
|
- !ruby/object:Gem::Dependency
|
175
207
|
name: progressbar
|
208
|
+
type: :runtime
|
176
209
|
requirement: !ruby/object:Gem::Requirement
|
177
210
|
none: false
|
178
211
|
requirements:
|
179
212
|
- - ! '>='
|
180
213
|
- !ruby/object:Gem::Version
|
181
214
|
version: '0'
|
182
|
-
type: :runtime
|
183
215
|
prerelease: false
|
184
216
|
version_requirements: !ruby/object:Gem::Requirement
|
185
217
|
none: false
|
@@ -189,13 +221,13 @@ dependencies:
|
|
189
221
|
version: '0'
|
190
222
|
- !ruby/object:Gem::Dependency
|
191
223
|
name: launchy
|
224
|
+
type: :runtime
|
192
225
|
requirement: !ruby/object:Gem::Requirement
|
193
226
|
none: false
|
194
227
|
requirements:
|
195
228
|
- - ! '>='
|
196
229
|
- !ruby/object:Gem::Version
|
197
230
|
version: '0'
|
198
|
-
type: :runtime
|
199
231
|
prerelease: false
|
200
232
|
version_requirements: !ruby/object:Gem::Requirement
|
201
233
|
none: false
|
@@ -205,13 +237,13 @@ dependencies:
|
|
205
237
|
version: '0'
|
206
238
|
- !ruby/object:Gem::Dependency
|
207
239
|
name: netrc
|
240
|
+
type: :runtime
|
208
241
|
requirement: !ruby/object:Gem::Requirement
|
209
242
|
none: false
|
210
243
|
requirements:
|
211
244
|
- - ! '>='
|
212
245
|
- !ruby/object:Gem::Version
|
213
246
|
version: '0'
|
214
|
-
type: :runtime
|
215
247
|
prerelease: false
|
216
248
|
version_requirements: !ruby/object:Gem::Requirement
|
217
249
|
none: false
|
@@ -264,6 +296,7 @@ files:
|
|
264
296
|
- lib/shelly/client/organizations.rb
|
265
297
|
- lib/shelly/client/shellyapp.rb
|
266
298
|
- lib/shelly/client/ssh_keys.rb
|
299
|
+
- lib/shelly/client/tunnels.rb
|
267
300
|
- lib/shelly/client/users.rb
|
268
301
|
- lib/shelly/cloudfile.rb
|
269
302
|
- lib/shelly/download_progress_bar.rb
|
@@ -315,22 +348,39 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
315
348
|
- - ! '>='
|
316
349
|
- !ruby/object:Gem::Version
|
317
350
|
version: '0'
|
318
|
-
segments:
|
319
|
-
- 0
|
320
|
-
hash: 3404836754866729086
|
321
351
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
322
352
|
none: false
|
323
353
|
requirements:
|
324
|
-
- - ! '
|
354
|
+
- - ! '>'
|
325
355
|
- !ruby/object:Gem::Version
|
326
|
-
version:
|
327
|
-
segments:
|
328
|
-
- 0
|
329
|
-
hash: 3404836754866729086
|
356
|
+
version: 1.3.1
|
330
357
|
requirements: []
|
331
358
|
rubyforge_project: shelly
|
332
|
-
rubygems_version: 1.8.
|
359
|
+
rubygems_version: 1.8.23
|
333
360
|
signing_key:
|
334
361
|
specification_version: 3
|
335
362
|
summary: Shelly Cloud command line tool
|
336
|
-
test_files:
|
363
|
+
test_files:
|
364
|
+
- spec/helpers.rb
|
365
|
+
- spec/input_faker.rb
|
366
|
+
- spec/shelly/app_spec.rb
|
367
|
+
- spec/shelly/backup_spec.rb
|
368
|
+
- spec/shelly/cli/backup_spec.rb
|
369
|
+
- spec/shelly/cli/config_spec.rb
|
370
|
+
- spec/shelly/cli/database_spec.rb
|
371
|
+
- spec/shelly/cli/deploy_spec.rb
|
372
|
+
- spec/shelly/cli/file_spec.rb
|
373
|
+
- spec/shelly/cli/logs_spec.rb
|
374
|
+
- spec/shelly/cli/main_spec.rb
|
375
|
+
- spec/shelly/cli/organization_spec.rb
|
376
|
+
- spec/shelly/cli/runner_spec.rb
|
377
|
+
- spec/shelly/cli/user_spec.rb
|
378
|
+
- spec/shelly/client_spec.rb
|
379
|
+
- spec/shelly/cloudfile_spec.rb
|
380
|
+
- spec/shelly/download_progress_bar_spec.rb
|
381
|
+
- spec/shelly/model_spec.rb
|
382
|
+
- spec/shelly/organization_spec.rb
|
383
|
+
- spec/shelly/structure_validator_spec.rb
|
384
|
+
- spec/shelly/user_spec.rb
|
385
|
+
- spec/spec_helper.rb
|
386
|
+
- spec/thor/options_spec.rb
|