shelly 0.0.19 → 0.0.20.pre
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 +6 -16
- data/lib/shelly/cli/main.rb +1 -1
- data/lib/shelly/cli/user.rb +34 -13
- data/lib/shelly/client.rb +3 -5
- data/lib/shelly/cloudfile.rb +1 -1
- data/lib/shelly/templates/Cloudfile.erb +1 -1
- data/lib/shelly/user.rb +2 -2
- data/lib/shelly/version.rb +1 -1
- data/spec/shelly/app_spec.rb +11 -23
- data/spec/shelly/cli/main_spec.rb +1 -1
- data/spec/shelly/cli/user_spec.rb +37 -30
- data/spec/shelly/client_spec.rb +4 -5
- data/spec/shelly/cloudfile_spec.rb +2 -2
- data/spec/shelly/user_spec.rb +2 -2
- data/spec/spec_helper.rb +1 -0
- data/spec/thor/options_spec.rb +24 -0
- metadata +120 -171
data/lib/shelly/app.rb
CHANGED
@@ -4,12 +4,8 @@ require 'launchy'
|
|
4
4
|
module Shelly
|
5
5
|
class App < Base
|
6
6
|
DATABASE_KINDS = %w(postgresql mongodb redis none)
|
7
|
-
attr_accessor :code_name, :databases, :ruby_version, :environment,
|
8
|
-
|
9
|
-
def initialize
|
10
|
-
@ruby_version = "MRI-1.9.2"
|
11
|
-
@environment = "production"
|
12
|
-
end
|
7
|
+
attr_accessor :code_name, :databases, :ruby_version, :environment,
|
8
|
+
:git_url, :domains
|
13
9
|
|
14
10
|
def add_git_remote
|
15
11
|
system("git remote rm production > /dev/null 2>&1")
|
@@ -18,8 +14,6 @@ module Shelly
|
|
18
14
|
|
19
15
|
def generate_cloudfile
|
20
16
|
@email = current_user.email
|
21
|
-
@databases = databases
|
22
|
-
@domains = domains
|
23
17
|
template = File.read(cloudfile_template_path)
|
24
18
|
cloudfile = ERB.new(template, 0, "%<>-")
|
25
19
|
cloudfile.result(binding)
|
@@ -30,16 +24,12 @@ module Shelly
|
|
30
24
|
end
|
31
25
|
|
32
26
|
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
|
-
}
|
27
|
+
attributes = {:name => code_name, :code_name => code_name, :domains => domains}
|
40
28
|
response = shelly.create_app(attributes)
|
41
29
|
self.git_url = response["git_url"]
|
42
|
-
self.domains = response["
|
30
|
+
self.domains = response["domains"]
|
31
|
+
self.ruby_version = response["ruby_version"]
|
32
|
+
self.environment = response["environment"]
|
43
33
|
end
|
44
34
|
|
45
35
|
def create_cloudfile
|
data/lib/shelly/cli/main.rb
CHANGED
@@ -43,7 +43,7 @@ module Shelly
|
|
43
43
|
say_error "Use ssh-keygen to generate ssh key pair"
|
44
44
|
end
|
45
45
|
|
46
|
-
desc "login [EMAIL]", "
|
46
|
+
desc "login [EMAIL]", "Logs user in to Shelly Cloud"
|
47
47
|
def login(email = nil)
|
48
48
|
user = Shelly::User.new(email || ask_for_email, ask_for_password(:with_confirmation => false))
|
49
49
|
user.login
|
data/lib/shelly/cli/user.rb
CHANGED
@@ -5,40 +5,61 @@ require "shelly/cloudfile"
|
|
5
5
|
module Shelly
|
6
6
|
module CLI
|
7
7
|
class User < Thor
|
8
|
-
namespace :
|
8
|
+
namespace :user
|
9
9
|
include Helpers
|
10
10
|
|
11
|
-
desc "list", "List users
|
11
|
+
desc "list", "List users with access to clouds defined in Cloudfile"
|
12
12
|
def list
|
13
13
|
say_error "Must be run inside your project git repository" unless App.inside_git_repository?
|
14
14
|
say_error "No Cloudfile found" unless Cloudfile.present?
|
15
|
-
@cloudfile =
|
16
|
-
@cloudfile.fetch_users.each do |
|
17
|
-
say "Cloud #{
|
15
|
+
@cloudfile = check_clouds.first
|
16
|
+
@cloudfile.fetch_users.each do |cloud, users|
|
17
|
+
say "Cloud #{cloud}:"
|
18
18
|
users.each { |user| say " #{user}" }
|
19
19
|
end
|
20
20
|
rescue Client::APIError => e
|
21
|
-
|
22
|
-
|
21
|
+
if e.unauthorized?
|
22
|
+
e.errors.each { |error| say_error error, :with_exit => false}
|
23
|
+
exit 1
|
24
|
+
else
|
25
|
+
say_error e.message
|
26
|
+
end
|
23
27
|
end
|
24
28
|
|
25
|
-
desc "add [EMAIL]", "Add new developer to
|
29
|
+
desc "add [EMAIL]", "Add new developer to clouds defined in Cloudfile"
|
26
30
|
def add(email = nil)
|
27
31
|
say_error "Must be run inside your project git repository" unless App.inside_git_repository?
|
28
32
|
say_error "No Cloudfile found" unless Cloudfile.present?
|
33
|
+
@cloudfile, @user = check_clouds
|
29
34
|
user_email = email || ask_for_email({:guess_email => false})
|
30
|
-
@cloudfile
|
31
|
-
|
32
|
-
|
33
|
-
|
35
|
+
@cloudfile.clouds.each do |cloud|
|
36
|
+
@user.send_invitation(cloud, user_email)
|
37
|
+
say "Sending invitation to #{user_email} to work on #{cloud}", :green
|
38
|
+
end
|
34
39
|
rescue Client::APIError => e
|
35
40
|
if e.validation?
|
36
41
|
e.each_error { |error| say_error error =~ /already in the project/ ? error.gsub("Email", "User") : error, :with_exit => false }
|
37
42
|
exit 1
|
43
|
+
elsif e.unauthorized?
|
44
|
+
e.errors.each { |error| say_error error, :with_exit => false}
|
45
|
+
exit 1
|
38
46
|
end
|
39
47
|
end
|
40
48
|
|
49
|
+
no_tasks do
|
50
|
+
def check_clouds
|
51
|
+
@cloudfile = Shelly::Cloudfile.new
|
52
|
+
@user = Shelly::User.new
|
53
|
+
user_apps = @user.apps.map { |cloud| cloud['code_name'] }
|
54
|
+
unless @cloudfile.clouds.all? { |cloud| user_apps.include?(cloud) }
|
55
|
+
errors = (@cloudfile.clouds - user_apps).map { |cloud| "You have no access to '#{cloud}' cloud defined in Cloudfile" }
|
56
|
+
raise Shelly::Client::APIError.new({:message => "Unauthorized",
|
57
|
+
:errors => errors}.to_json)
|
58
|
+
end
|
59
|
+
[@cloudfile, @user]
|
60
|
+
end
|
61
|
+
|
62
|
+
end
|
41
63
|
end
|
42
64
|
end
|
43
65
|
end
|
44
|
-
|
data/lib/shelly/client.rb
CHANGED
@@ -56,10 +56,8 @@ module Shelly
|
|
56
56
|
get("/token")
|
57
57
|
end
|
58
58
|
|
59
|
-
def send_invitation(
|
60
|
-
apps
|
61
|
-
post("/apps/#{app}/collaborations", :email => email)
|
62
|
-
end
|
59
|
+
def send_invitation(cloud, email)
|
60
|
+
post("/apps/#{cloud}/collaborations", :email => email)
|
63
61
|
end
|
64
62
|
|
65
63
|
def create_app(attributes)
|
@@ -78,7 +76,7 @@ module Shelly
|
|
78
76
|
get("/users/new", :ssh_key => ssh_key)
|
79
77
|
end
|
80
78
|
|
81
|
-
def
|
79
|
+
def apps_users(apps)
|
82
80
|
apps.map do |app|
|
83
81
|
get("/apps/#{app}/users")
|
84
82
|
end
|
data/lib/shelly/cloudfile.rb
CHANGED
data/lib/shelly/user.rb
CHANGED
data/lib/shelly/version.rb
CHANGED
data/spec/shelly/app_spec.rb
CHANGED
@@ -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
|
-
|
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
|
-
:
|
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
|
-
"
|
123
|
+
"domains" => %w(fooo.shellyapp.com))
|
136
124
|
@app.create
|
137
125
|
end
|
138
126
|
|
139
|
-
it "should assign returned git_url and
|
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
|
-
"
|
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
|
-
:
|
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
|
-
"
|
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
|
-
"
|
154
|
+
"domains" => %w(boo.shellyapp.com boo.example.com))
|
167
155
|
@app.create
|
168
|
-
@app.domains.should ==
|
156
|
+
@app.domains.should == %w(boo.shellyapp.com boo.example.com)
|
169
157
|
end
|
170
158
|
end
|
171
159
|
end
|
@@ -25,7 +25,7 @@ describe Shelly::CLI::Main do
|
|
25
25
|
Tasks:
|
26
26
|
shelly add # Adds new application to Shelly Cloud
|
27
27
|
shelly help [TASK] # Describe available tasks or one specific task
|
28
|
-
shelly login [EMAIL] #
|
28
|
+
shelly login [EMAIL] # Logs user in to Shelly Cloud
|
29
29
|
shelly register [EMAIL] # Registers new user account on Shelly Cloud
|
30
30
|
shelly user <command> # Manages users using this app
|
31
31
|
shelly version # Displays shelly version
|
@@ -4,7 +4,7 @@ require "shelly/cli/user"
|
|
4
4
|
describe Shelly::CLI::User do
|
5
5
|
before do
|
6
6
|
FileUtils.stub(:chmod)
|
7
|
-
@
|
7
|
+
@cli_user = Shelly::CLI::User.new
|
8
8
|
@client = mock
|
9
9
|
Shelly::Client.stub(:new).and_return(@client)
|
10
10
|
Shelly::User.stub(:guess_email).and_return("")
|
@@ -15,9 +15,9 @@ describe Shelly::CLI::User do
|
|
15
15
|
describe "#help" do
|
16
16
|
it "should show help" do
|
17
17
|
$stdout.should_receive(:puts).with("Tasks:")
|
18
|
-
$stdout.should_receive(:puts).with(/add \[EMAIL\]\s+# Add new developer to
|
19
|
-
$stdout.should_receive(:puts).with(/list\s+# List users
|
20
|
-
@
|
18
|
+
$stdout.should_receive(:puts).with(/add \[EMAIL\]\s+# Add new developer to clouds defined in Cloudfile/)
|
19
|
+
$stdout.should_receive(:puts).with(/list\s+# List users with access to clouds defined in Cloudfile/)
|
20
|
+
@cli_user.help
|
21
21
|
end
|
22
22
|
end
|
23
23
|
|
@@ -33,7 +33,7 @@ describe Shelly::CLI::User do
|
|
33
33
|
Shelly::App.stub(:inside_git_repository?).and_return(false)
|
34
34
|
$stdout.should_receive(:puts).with("\e[31mMust be run inside your project git repository\e[0m")
|
35
35
|
lambda {
|
36
|
-
@
|
36
|
+
@cli_user.list
|
37
37
|
}.should raise_error(SystemExit)
|
38
38
|
end
|
39
39
|
|
@@ -41,39 +41,39 @@ describe Shelly::CLI::User do
|
|
41
41
|
File.delete("Cloudfile")
|
42
42
|
$stdout.should_receive(:puts).with("\e[31mNo Cloudfile found\e[0m")
|
43
43
|
lambda {
|
44
|
-
@
|
44
|
+
@cli_user.list
|
45
45
|
}.should raise_error(SystemExit)
|
46
46
|
end
|
47
47
|
|
48
48
|
context "on success" do
|
49
49
|
it "should receive clouds from the Cloudfile" do
|
50
|
-
@client.should_receive(:
|
51
|
-
|
52
|
-
@
|
50
|
+
@client.should_receive(:apps).and_return([{"code_name" => "foo-production"}, {"code_name" => "foo-staging"}])
|
51
|
+
@client.should_receive(:apps_users).and_return(response)
|
52
|
+
@cli_user.list
|
53
53
|
end
|
54
54
|
|
55
55
|
it "should display clouds and users" do
|
56
|
-
@client.
|
57
|
-
|
58
|
-
$stdout.should_receive(:puts).with(" user@example.com (username)")
|
56
|
+
@client.should_receive(:apps).and_return([{"code_name" => "foo-production"}, {"code_name" => "foo-staging"}])
|
57
|
+
@client.stub(:apps_users).and_return(response)
|
59
58
|
$stdout.should_receive(:puts).with("Cloud foo-production:")
|
59
|
+
$stdout.should_receive(:puts).with(" user@example.com (username)")
|
60
|
+
$stdout.should_receive(:puts).with("Cloud foo-staging:")
|
60
61
|
$stdout.should_receive(:puts).with(" user2@example.com (username2)")
|
61
|
-
@
|
62
|
+
@cli_user.list
|
62
63
|
end
|
63
64
|
end
|
64
65
|
|
65
66
|
def response
|
66
|
-
[{'code_name' => 'foo-
|
67
|
-
{'code_name' => 'foo-
|
67
|
+
[{'code_name' => 'foo-production', 'users' => [{'name' => 'username','email' => 'user@example.com'}]},
|
68
|
+
{'code_name' => 'foo-staging', 'users' => [{'name' => 'username2','email' => 'user2@example.com'}]}]
|
68
69
|
end
|
69
70
|
|
70
71
|
context "on failure" do
|
71
|
-
it "should raise an error if user does not have access to
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
lambda { @users.list }.should raise_error(SystemExit)
|
72
|
+
it "should raise an error if user does not have access to cloud" do
|
73
|
+
@client.should_receive(:apps).and_return([{"code_name" => "foo-production"}])
|
74
|
+
@client.stub(:apps_users).and_return(response)
|
75
|
+
$stdout.should_receive(:puts).with("\e[31mYou have no access to 'foo-staging' cloud defined in Cloudfile\e[0m")
|
76
|
+
lambda { @cli_user.list }.should raise_error(SystemExit)
|
77
77
|
end
|
78
78
|
end
|
79
79
|
end
|
@@ -94,7 +94,7 @@ describe Shelly::CLI::User do
|
|
94
94
|
File.delete("Cloudfile")
|
95
95
|
$stdout.should_receive(:puts).with("\e[31mNo Cloudfile found\e[0m")
|
96
96
|
lambda {
|
97
|
-
@
|
97
|
+
@cli_user.list
|
98
98
|
}.should raise_error(SystemExit)
|
99
99
|
end
|
100
100
|
|
@@ -102,32 +102,39 @@ describe Shelly::CLI::User do
|
|
102
102
|
Shelly::App.stub(:inside_git_repository?).and_return(false)
|
103
103
|
$stdout.should_receive(:puts).with("\e[31mMust be run inside your project git repository\e[0m")
|
104
104
|
lambda {
|
105
|
-
@
|
105
|
+
@cli_user.add
|
106
106
|
}.should raise_error(SystemExit)
|
107
107
|
end
|
108
108
|
|
109
109
|
context "on success" do
|
110
110
|
before do
|
111
|
-
@client.should_receive(:send_invitation).with(
|
111
|
+
@client.should_receive(:send_invitation).with("foo-production", "megan@example.com")
|
112
|
+
@client.should_receive(:send_invitation).with("foo-staging", "megan@example.com")
|
113
|
+
@client.should_receive(:apps).and_return([{"code_name" => "foo-production"}, {"code_name" => "foo-staging"}])
|
112
114
|
end
|
113
115
|
|
114
116
|
it "should ask about email" do
|
115
117
|
fake_stdin(["megan@example.com"]) do
|
116
|
-
@
|
118
|
+
@cli_user.add
|
117
119
|
end
|
118
120
|
end
|
119
121
|
|
120
122
|
it "should receive clouds from the Cloudfile" do
|
121
|
-
@
|
123
|
+
@cli_user.add("megan@example.com")
|
122
124
|
end
|
123
125
|
|
124
126
|
it "should receive clouds from the Cloudfile" do
|
125
|
-
$stdout.should_receive(:puts).with("
|
126
|
-
@
|
127
|
+
$stdout.should_receive(:puts).with("\e[32mSending invitation to megan@example.com to work on foo-production\e[0m")
|
128
|
+
@cli_user.add("megan@example.com")
|
127
129
|
end
|
128
130
|
end
|
129
131
|
|
132
|
+
context "on failure" do
|
133
|
+
it "should raise error if user doesnt have access to cloud" do
|
134
|
+
@client.should_receive(:apps).and_return([{"code_name" => "foo-production"}])
|
135
|
+
$stdout.should_receive(:puts).with("\e[31mYou have no access to 'foo-staging' cloud defined in Cloudfile\e[0m")
|
136
|
+
lambda { @cli_user.add("megan@example.com") }.should raise_error(SystemExit)
|
137
|
+
end
|
138
|
+
end
|
130
139
|
end
|
131
|
-
|
132
140
|
end
|
133
|
-
|
data/spec/shelly/client_spec.rb
CHANGED
@@ -111,9 +111,8 @@ describe Shelly::Client do
|
|
111
111
|
it "should send post with app code_names" do
|
112
112
|
FakeWeb.register_uri(:get, @url + "/apps/staging-foo/users", :body => {:code_name => "staging-foo"}.to_json)
|
113
113
|
FakeWeb.register_uri(:get, @url + "/apps/production-foo/users", :body => {:code_name => "production-foo"}.to_json)
|
114
|
-
response = @client.
|
115
|
-
response.should == [{"code_name" => "staging-foo"},
|
116
|
-
{"code_name" => "production-foo"}]
|
114
|
+
response = @client.apps_users(["staging-foo", "production-foo"])
|
115
|
+
response.should == [{"code_name" => "staging-foo"}, {"code_name" => "production-foo"}]
|
117
116
|
end
|
118
117
|
end
|
119
118
|
|
@@ -121,8 +120,8 @@ describe Shelly::Client do
|
|
121
120
|
it "should send post with developer's email" do
|
122
121
|
FakeWeb.register_uri(:post, @url + "/apps/staging-foo/collaborations", :body => {}.to_json)
|
123
122
|
FakeWeb.register_uri(:post, @url + "/apps/production-foo/collaborations", :body => {}.to_json)
|
124
|
-
response = @client.send_invitation(
|
125
|
-
response.should ==
|
123
|
+
response = @client.send_invitation("staging-foo", "megan@example.com")
|
124
|
+
response.should == {}
|
126
125
|
end
|
127
126
|
end
|
128
127
|
|
@@ -16,7 +16,7 @@ describe Shelly::Cloudfile do
|
|
16
16
|
@cloudfile.yaml(@hash).should == "code_name:\n code: test"
|
17
17
|
end
|
18
18
|
|
19
|
-
it "should
|
19
|
+
it "should convert a hash to yaml format" do
|
20
20
|
@cloudfile.write(@hash)
|
21
21
|
@cloudfile.open.should == {"code_name" => {"code" => "test"}}
|
22
22
|
end
|
@@ -25,7 +25,7 @@ describe Shelly::Cloudfile do
|
|
25
25
|
describe "#fetch_users" do
|
26
26
|
it "should return array to display with clouds and users" do
|
27
27
|
@cloudfile.write(@hash)
|
28
|
-
@client.should_receive(:
|
28
|
+
@client.should_receive(:apps_users).and_return(response)
|
29
29
|
response = @cloudfile.fetch_users
|
30
30
|
response.should == {"foo-staging" => ["user@example.com (username)"]}
|
31
31
|
end
|
data/spec/shelly/user_spec.rb
CHANGED
@@ -94,8 +94,8 @@ describe Shelly::User do
|
|
94
94
|
|
95
95
|
describe "#send_invitation" do
|
96
96
|
it "should send invitation" do
|
97
|
-
@client.should_receive(:send_invitation).with(
|
98
|
-
@user.send_invitation(
|
97
|
+
@client.should_receive(:send_invitation).with("foo-staging", "megan@example.com")
|
98
|
+
@user.send_invitation("foo-staging", "megan@example.com")
|
99
99
|
end
|
100
100
|
end
|
101
101
|
|
data/spec/spec_helper.rb
CHANGED
@@ -0,0 +1,24 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'thor/parser'
|
3
|
+
|
4
|
+
describe Thor::Options do
|
5
|
+
def create(opts, defaults={})
|
6
|
+
opts.each do |key, value|
|
7
|
+
opts[key] = Thor::Option.parse(key, value) unless value.is_a?(Thor::Option)
|
8
|
+
end
|
9
|
+
@opt = Thor::Options.new(opts, defaults)
|
10
|
+
end
|
11
|
+
|
12
|
+
def parse(*args)
|
13
|
+
@opt.parse(args.flatten)
|
14
|
+
end
|
15
|
+
|
16
|
+
describe "#parse" do
|
17
|
+
describe "with :array type" do
|
18
|
+
it "accepts a switch=<value> assignment, where value is a set of paramters split by comma or spaces" do
|
19
|
+
create "--attributes" => :array
|
20
|
+
parse("--attributes=a,b", "c, d", "e , f")["attributes"].should == ["a", "b", "c", "d", "e", "f"]
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
metadata
CHANGED
@@ -1,200 +1,156 @@
|
|
1
|
-
--- !ruby/object:Gem::Specification
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
2
|
name: shelly
|
3
|
-
version: !ruby/object:Gem::Version
|
4
|
-
|
5
|
-
prerelease:
|
6
|
-
segments:
|
7
|
-
- 0
|
8
|
-
- 0
|
9
|
-
- 19
|
10
|
-
version: 0.0.19
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.20.pre
|
5
|
+
prerelease: 7
|
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
|
-
|
19
|
-
|
20
|
-
- !ruby/object:Gem::Dependency
|
12
|
+
date: 2011-11-16 00:00:00.000000000Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
21
15
|
name: rspec
|
22
|
-
|
23
|
-
requirement: &id001 !ruby/object:Gem::Requirement
|
16
|
+
requirement: &2155914700 !ruby/object:Gem::Requirement
|
24
17
|
none: false
|
25
|
-
requirements:
|
26
|
-
- -
|
27
|
-
- !ruby/object:Gem::Version
|
28
|
-
|
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
|
-
|
24
|
+
version_requirements: *2155914700
|
25
|
+
- !ruby/object:Gem::Dependency
|
26
|
+
name: rake
|
27
|
+
requirement: &2155914060 !ruby/object:Gem::Requirement
|
38
28
|
none: false
|
39
|
-
requirements:
|
40
|
-
- -
|
41
|
-
- !ruby/object:Gem::Version
|
42
|
-
|
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
|
-
|
35
|
+
version_requirements: *2155914060
|
36
|
+
- !ruby/object:Gem::Dependency
|
37
|
+
name: guard
|
38
|
+
requirement: &2155913200 !ruby/object:Gem::Requirement
|
52
39
|
none: false
|
53
|
-
requirements:
|
54
|
-
- -
|
55
|
-
- !ruby/object:Gem::Version
|
56
|
-
|
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
|
63
|
-
name: guard-rspec
|
64
45
|
prerelease: false
|
65
|
-
|
46
|
+
version_requirements: *2155913200
|
47
|
+
- !ruby/object:Gem::Dependency
|
48
|
+
name: guard-rspec
|
49
|
+
requirement: &2155912580 !ruby/object:Gem::Requirement
|
66
50
|
none: false
|
67
|
-
requirements:
|
68
|
-
- -
|
69
|
-
- !ruby/object:Gem::Version
|
70
|
-
|
71
|
-
segments:
|
72
|
-
- 0
|
73
|
-
version: "0"
|
51
|
+
requirements:
|
52
|
+
- - ! '>='
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0'
|
74
55
|
type: :development
|
75
|
-
version_requirements: *id004
|
76
|
-
- !ruby/object:Gem::Dependency
|
77
|
-
name: growl_notify
|
78
56
|
prerelease: false
|
79
|
-
|
57
|
+
version_requirements: *2155912580
|
58
|
+
- !ruby/object:Gem::Dependency
|
59
|
+
name: growl_notify
|
60
|
+
requirement: &2155911840 !ruby/object:Gem::Requirement
|
80
61
|
none: false
|
81
|
-
requirements:
|
82
|
-
- -
|
83
|
-
- !ruby/object:Gem::Version
|
84
|
-
|
85
|
-
segments:
|
86
|
-
- 0
|
87
|
-
version: "0"
|
62
|
+
requirements:
|
63
|
+
- - ! '>='
|
64
|
+
- !ruby/object:Gem::Version
|
65
|
+
version: '0'
|
88
66
|
type: :development
|
89
|
-
version_requirements: *id005
|
90
|
-
- !ruby/object:Gem::Dependency
|
91
|
-
name: rb-fsevent
|
92
67
|
prerelease: false
|
93
|
-
|
68
|
+
version_requirements: *2155911840
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: rb-fsevent
|
71
|
+
requirement: &2155911160 !ruby/object:Gem::Requirement
|
94
72
|
none: false
|
95
|
-
requirements:
|
96
|
-
- -
|
97
|
-
- !ruby/object:Gem::Version
|
98
|
-
|
99
|
-
segments:
|
100
|
-
- 0
|
101
|
-
version: "0"
|
73
|
+
requirements:
|
74
|
+
- - ! '>='
|
75
|
+
- !ruby/object:Gem::Version
|
76
|
+
version: '0'
|
102
77
|
type: :development
|
103
|
-
version_requirements: *id006
|
104
|
-
- !ruby/object:Gem::Dependency
|
105
|
-
name: fakefs
|
106
78
|
prerelease: false
|
107
|
-
|
79
|
+
version_requirements: *2155911160
|
80
|
+
- !ruby/object:Gem::Dependency
|
81
|
+
name: fakefs
|
82
|
+
requirement: &2155910340 !ruby/object:Gem::Requirement
|
108
83
|
none: false
|
109
|
-
requirements:
|
110
|
-
- -
|
111
|
-
- !ruby/object:Gem::Version
|
112
|
-
|
113
|
-
segments:
|
114
|
-
- 0
|
115
|
-
version: "0"
|
84
|
+
requirements:
|
85
|
+
- - ! '>='
|
86
|
+
- !ruby/object:Gem::Version
|
87
|
+
version: '0'
|
116
88
|
type: :development
|
117
|
-
version_requirements: *id007
|
118
|
-
- !ruby/object:Gem::Dependency
|
119
|
-
name: fakeweb
|
120
89
|
prerelease: false
|
121
|
-
|
90
|
+
version_requirements: *2155910340
|
91
|
+
- !ruby/object:Gem::Dependency
|
92
|
+
name: fakeweb
|
93
|
+
requirement: &2155909460 !ruby/object:Gem::Requirement
|
122
94
|
none: false
|
123
|
-
requirements:
|
124
|
-
- -
|
125
|
-
- !ruby/object:Gem::Version
|
126
|
-
|
127
|
-
segments:
|
128
|
-
- 0
|
129
|
-
version: "0"
|
95
|
+
requirements:
|
96
|
+
- - ! '>='
|
97
|
+
- !ruby/object:Gem::Version
|
98
|
+
version: '0'
|
130
99
|
type: :development
|
131
|
-
version_requirements: *id008
|
132
|
-
- !ruby/object:Gem::Dependency
|
133
|
-
name: thor
|
134
100
|
prerelease: false
|
135
|
-
|
101
|
+
version_requirements: *2155909460
|
102
|
+
- !ruby/object:Gem::Dependency
|
103
|
+
name: thor
|
104
|
+
requirement: &2155894380 !ruby/object:Gem::Requirement
|
136
105
|
none: false
|
137
|
-
requirements:
|
138
|
-
- -
|
139
|
-
- !ruby/object:Gem::Version
|
140
|
-
|
141
|
-
segments:
|
142
|
-
- 0
|
143
|
-
version: "0"
|
106
|
+
requirements:
|
107
|
+
- - ! '>='
|
108
|
+
- !ruby/object:Gem::Version
|
109
|
+
version: '0'
|
144
110
|
type: :runtime
|
145
|
-
version_requirements: *id009
|
146
|
-
- !ruby/object:Gem::Dependency
|
147
|
-
name: rest-client
|
148
111
|
prerelease: false
|
149
|
-
|
112
|
+
version_requirements: *2155894380
|
113
|
+
- !ruby/object:Gem::Dependency
|
114
|
+
name: rest-client
|
115
|
+
requirement: &2155893340 !ruby/object:Gem::Requirement
|
150
116
|
none: false
|
151
|
-
requirements:
|
152
|
-
- -
|
153
|
-
- !ruby/object:Gem::Version
|
154
|
-
|
155
|
-
segments:
|
156
|
-
- 0
|
157
|
-
version: "0"
|
117
|
+
requirements:
|
118
|
+
- - ! '>='
|
119
|
+
- !ruby/object:Gem::Version
|
120
|
+
version: '0'
|
158
121
|
type: :runtime
|
159
|
-
version_requirements: *id010
|
160
|
-
- !ruby/object:Gem::Dependency
|
161
|
-
name: json
|
162
122
|
prerelease: false
|
163
|
-
|
123
|
+
version_requirements: *2155893340
|
124
|
+
- !ruby/object:Gem::Dependency
|
125
|
+
name: json
|
126
|
+
requirement: &2155892380 !ruby/object:Gem::Requirement
|
164
127
|
none: false
|
165
|
-
requirements:
|
166
|
-
- -
|
167
|
-
- !ruby/object:Gem::Version
|
168
|
-
|
169
|
-
segments:
|
170
|
-
- 0
|
171
|
-
version: "0"
|
128
|
+
requirements:
|
129
|
+
- - ! '>='
|
130
|
+
- !ruby/object:Gem::Version
|
131
|
+
version: '0'
|
172
132
|
type: :runtime
|
173
|
-
version_requirements: *id011
|
174
|
-
- !ruby/object:Gem::Dependency
|
175
|
-
name: launchy
|
176
133
|
prerelease: false
|
177
|
-
|
134
|
+
version_requirements: *2155892380
|
135
|
+
- !ruby/object:Gem::Dependency
|
136
|
+
name: launchy
|
137
|
+
requirement: &2155891620 !ruby/object:Gem::Requirement
|
178
138
|
none: false
|
179
|
-
requirements:
|
180
|
-
- -
|
181
|
-
- !ruby/object:Gem::Version
|
182
|
-
|
183
|
-
segments:
|
184
|
-
- 0
|
185
|
-
version: "0"
|
139
|
+
requirements:
|
140
|
+
- - ! '>='
|
141
|
+
- !ruby/object:Gem::Version
|
142
|
+
version: '0'
|
186
143
|
type: :runtime
|
187
|
-
|
144
|
+
prerelease: false
|
145
|
+
version_requirements: *2155891620
|
188
146
|
description: Tool for managing applications and clouds at shellycloud.com
|
189
|
-
email:
|
147
|
+
email:
|
190
148
|
- support@shellycloud.com
|
191
|
-
executables:
|
149
|
+
executables:
|
192
150
|
- shelly
|
193
151
|
extensions: []
|
194
|
-
|
195
152
|
extra_rdoc_files: []
|
196
|
-
|
197
|
-
files:
|
153
|
+
files:
|
198
154
|
- .gitignore
|
199
155
|
- .travis.yml
|
200
156
|
- Gemfile
|
@@ -228,40 +184,32 @@ files:
|
|
228
184
|
- spec/shelly/cloudfile_spec.rb
|
229
185
|
- spec/shelly/user_spec.rb
|
230
186
|
- spec/spec_helper.rb
|
187
|
+
- spec/thor/options_spec.rb
|
231
188
|
homepage: http://shellycloud.com
|
232
189
|
licenses: []
|
233
|
-
|
234
190
|
post_install_message:
|
235
191
|
rdoc_options: []
|
236
|
-
|
237
|
-
require_paths:
|
192
|
+
require_paths:
|
238
193
|
- lib
|
239
|
-
required_ruby_version: !ruby/object:Gem::Requirement
|
194
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
240
195
|
none: false
|
241
|
-
requirements:
|
242
|
-
- -
|
243
|
-
- !ruby/object:Gem::Version
|
244
|
-
|
245
|
-
|
246
|
-
- 0
|
247
|
-
version: "0"
|
248
|
-
required_rubygems_version: !ruby/object:Gem::Requirement
|
196
|
+
requirements:
|
197
|
+
- - ! '>='
|
198
|
+
- !ruby/object:Gem::Version
|
199
|
+
version: '0'
|
200
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
249
201
|
none: false
|
250
|
-
requirements:
|
251
|
-
- -
|
252
|
-
- !ruby/object:Gem::Version
|
253
|
-
|
254
|
-
segments:
|
255
|
-
- 0
|
256
|
-
version: "0"
|
202
|
+
requirements:
|
203
|
+
- - ! '>'
|
204
|
+
- !ruby/object:Gem::Version
|
205
|
+
version: 1.3.1
|
257
206
|
requirements: []
|
258
|
-
|
259
207
|
rubyforge_project: shelly
|
260
208
|
rubygems_version: 1.8.10
|
261
209
|
signing_key:
|
262
210
|
specification_version: 3
|
263
211
|
summary: Shelly Cloud command line tool
|
264
|
-
test_files:
|
212
|
+
test_files:
|
265
213
|
- spec/helpers.rb
|
266
214
|
- spec/input_faker.rb
|
267
215
|
- spec/shelly/app_spec.rb
|
@@ -272,3 +220,4 @@ test_files:
|
|
272
220
|
- spec/shelly/cloudfile_spec.rb
|
273
221
|
- spec/shelly/user_spec.rb
|
274
222
|
- spec/spec_helper.rb
|
223
|
+
- spec/thor/options_spec.rb
|