shelly 0.0.7 → 0.0.8

Sign up to get free protection for your applications and to get access to all the features.
data/lib/shelly/app.rb CHANGED
@@ -4,20 +4,43 @@ require 'launchy'
4
4
  module Shelly
5
5
  class App < Base
6
6
  DATABASE_KINDS = %w(postgresql mongodb redis none)
7
- attr_accessor :purpose, :code_name, :databases
7
+ attr_accessor :purpose, :code_name, :databases, :ruby_version, :environment
8
+
9
+ def initialize
10
+ @ruby_version = "MRI-1.9.2"
11
+ end
8
12
 
9
13
  def add_git_remote
10
- system("git remote add #{purpose} git@git.shellycloud.com:#{code_name}.git")
14
+ system("git remote add #{purpose} #{git_url}")
15
+ end
16
+
17
+ def git_url
18
+ "git@git.shellycloud.com:#{code_name}.git"
11
19
  end
12
20
 
13
21
  def generate_cloudfile
14
22
  @email = current_user.email
15
23
  @databases = databases
16
- template = File.read("lib/shelly/templates/Cloudfile.erb")
24
+ template = File.read(cloudfile_template_path)
17
25
  cloudfile = ERB.new(template, 0, "%<>-")
18
26
  cloudfile.result(binding)
19
27
  end
20
28
 
29
+ def cloudfile_template_path
30
+ File.join(File.dirname(__FILE__), "templates", "Cloudfile.erb")
31
+ end
32
+
33
+ def create
34
+ attributes = {
35
+ :name => code_name,
36
+ :code_name => code_name,
37
+ :environment => purpose,
38
+ :ruby_version => ruby_version,
39
+ :domain_name => "#{code_name}.shellycloud.com"
40
+ }
41
+ shelly.create_app(attributes)
42
+ end
43
+
21
44
  def create_cloudfile
22
45
  content = generate_cloudfile
23
46
  File.open(cloudfile_path, "a+") { |f| f << content }
@@ -3,6 +3,7 @@ require "shelly/app"
3
3
  module Shelly
4
4
  module CLI
5
5
  class Apps < Thor
6
+ include Helpers
6
7
  namespace :apps
7
8
 
8
9
  desc "add", "Adds new application to Shelly Cloud"
@@ -11,19 +12,23 @@ module Shelly
11
12
  @app.purpose = ask_for_purpose
12
13
  @app.code_name = ask_for_code_name
13
14
  @app.databases = ask_for_databases
15
+ @app.create
16
+ say "Adding remote #{@app.purpose} #{@app.git_url}", :green
14
17
  @app.add_git_remote
18
+ say "Creating Cloudfile", :green
15
19
  @app.create_cloudfile
16
- open_billing_page
20
+ say "Provide billing details. Opening browser...", :green
21
+ @app.open_billing_page
17
22
  info_adding_cloudfile_to_repository
18
23
  info_deploying_to_shellycloud
24
+ rescue Client::APIError => e
25
+ if e.message == "Validation Failed"
26
+ e.errors.each { |error| say "#{error.first} #{error.last}" }
27
+ exit 1
28
+ end
19
29
  end
20
30
 
21
31
  no_tasks do
22
- def open_billing_page
23
- say "Provide billing details. Opening browser..."
24
- @app.open_billing_page
25
- end
26
-
27
32
  def ask_for_purpose
28
33
  purpose = ask("How will you use this system (production - default,staging):")
29
34
  purpose.blank? ? "production" : purpose
@@ -49,18 +54,21 @@ module Shelly
49
54
  end
50
55
 
51
56
  def info_adding_cloudfile_to_repository
52
- say("Project is now configured for use with Shell Cloud:")
53
- say("You can review changes using")
54
- say(" git diff")
57
+ say_new_line
58
+ say "Project is now configured for use with Shell Cloud:", :green
59
+ say "You can review changes using", :green
60
+ say " git diff"
55
61
  end
56
62
 
57
63
  def info_deploying_to_shellycloud
58
- say("When you make sure all settings are correct please issue following commands:")
59
- say(" git add .")
60
- say(' git commit -m "Application added to Shelly Cloud"')
61
- say(" git push")
62
- say("Deploy to #{@app.purpose} using:")
63
- say(" git push #{@app.purpose} master")
64
+ say_new_line
65
+ say "When you make sure all settings are correct please issue following commands:", :green
66
+ say " git add ."
67
+ say ' git commit -m "Application added to Shelly Cloud"'
68
+ say " git push"
69
+ say_new_line
70
+ say "Deploy to #{@app.purpose} using:", :green
71
+ say " git push #{@app.purpose} master"
64
72
  end
65
73
  end
66
74
  end
data/lib/shelly/client.rb CHANGED
@@ -37,6 +37,10 @@ module Shelly
37
37
  get("/token")
38
38
  end
39
39
 
40
+ def create_app(attributes)
41
+ post("/apps", :app => attributes)
42
+ end
43
+
40
44
  def post(path, params = {})
41
45
  request(path, :post, params)
42
46
  end
@@ -59,7 +63,7 @@ module Shelly
59
63
  end
60
64
 
61
65
  def http_basic_auth_options
62
- @email ? {:username => @email, :password => @password} : {}
66
+ @email ? {:user => @email, :password => @password} : {}
63
67
  end
64
68
 
65
69
  def request_parameters(path, method, params = {})
@@ -1,3 +1,3 @@
1
1
  module Shelly
2
- VERSION = "0.0.7"
2
+ VERSION = "0.0.8"
3
3
  end
@@ -5,6 +5,8 @@ describe Shelly::App do
5
5
  before do
6
6
  FileUtils.mkdir_p("/projects/foo")
7
7
  Dir.chdir("/projects/foo")
8
+ @client = mock(:api_url => "https://api.example.com")
9
+ Shelly::Client.stub(:new).and_return(@client)
8
10
  @app = Shelly::App.new
9
11
  @app.purpose = "staging"
10
12
  @app.code_name = "foo-staging"
@@ -89,4 +91,25 @@ config
89
91
  @app.open_billing_page
90
92
  end
91
93
  end
94
+
95
+ describe "#git_url" do
96
+ it "should return URL to git repository on shelly" do
97
+ @app.git_url.should == "git@git.shellycloud.com:foo-staging.git"
98
+ end
99
+ end
100
+
101
+ describe "#create" do
102
+ it "should create the app on shelly cloud via API client" do
103
+ @app.purpose = "dev"
104
+ @app.code_name = "fooo"
105
+ @client.should_receive(:create_app).with({
106
+ :code_name => "fooo",
107
+ :name => "fooo",
108
+ :environment => "dev",
109
+ :ruby_version => "MRI-1.9.2",
110
+ :domain_name => "fooo.shellycloud.com"
111
+ })
112
+ @app.create
113
+ end
114
+ end
92
115
  end
@@ -14,6 +14,7 @@ describe Shelly::CLI::Apps do
14
14
  Dir.chdir("/projects/foo")
15
15
  @app = Shelly::App.new
16
16
  @app.stub(:add_git_remote)
17
+ @app.stub(:create)
17
18
  @app.stub(:generate_cloudfile).and_return("Example Cloudfile")
18
19
  @app.stub(:open_billing_page)
19
20
  Shelly::App.stub(:new).and_return(@app)
@@ -64,7 +65,7 @@ describe Shelly::CLI::Apps do
64
65
  end
65
66
  end
66
67
 
67
- it "should validate databases" do
68
+ it "should ask again for databases if unsupported kind typed" do
68
69
  $stdout.should_receive(:print).with("Which database do you want to use postgresql, mongodb, redis, none (postgresql - default): ")
69
70
  $stdout.should_receive(:print).with("Unknown database kind. Supported are: postgresql, mongodb, redis, none: ")
70
71
  fake_stdin(["staging", "", "postgresql,doesnt-exist", "none"]) do
@@ -81,6 +82,25 @@ describe Shelly::CLI::Apps do
81
82
  end
82
83
  end
83
84
 
85
+ it "should create the app on shelly cloud" do
86
+ @app.should_receive(:create)
87
+ fake_stdin(["", "", ""]) do
88
+ @apps.add
89
+ end
90
+ end
91
+
92
+ it "should display validation errors if they are any" do
93
+ response = {"message" => "Validation Failed", "errors" => [["code_name", "has been already taken"]]}
94
+ exception = Shelly::Client::APIError.new(response)
95
+ @app.should_receive(:create).and_raise(exception)
96
+ $stdout.should_receive(:puts).with("code_name has been already taken")
97
+ lambda {
98
+ fake_stdin(["", "", ""]) do
99
+ @apps.add
100
+ end
101
+ }.should raise_error(SystemExit)
102
+ end
103
+
84
104
  it "should add git remote" do
85
105
  @app.should_receive(:add_git_remote)
86
106
  fake_stdin(["staging", "foooo", ""]) do
@@ -97,7 +117,7 @@ describe Shelly::CLI::Apps do
97
117
  end
98
118
 
99
119
  it "should browser window with link to edit billing information" do
100
- $stdout.should_receive(:puts).with("Provide billing details. Opening browser...")
120
+ $stdout.should_receive(:puts).with("\e[32mProvide billing details. Opening browser...\e[0m")
101
121
  @app.should_receive(:open_billing_page)
102
122
  fake_stdin(["staging", "foooo", ""]) do
103
123
  @apps.add
@@ -105,8 +125,8 @@ describe Shelly::CLI::Apps do
105
125
  end
106
126
 
107
127
  it "should display info about adding Cloudfile to repository" do
108
- $stdout.should_receive(:puts).with("Project is now configured for use with Shell Cloud:")
109
- $stdout.should_receive(:puts).with("You can review changes using")
128
+ $stdout.should_receive(:puts).with("\e[32mProject is now configured for use with Shell Cloud:\e[0m")
129
+ $stdout.should_receive(:puts).with("\e[32mYou can review changes using\e[0m")
110
130
  $stdout.should_receive(:puts).with(" git diff")
111
131
  fake_stdin(["staging", "foooo", "none"]) do
112
132
  @apps.add
@@ -114,11 +134,11 @@ describe Shelly::CLI::Apps do
114
134
  end
115
135
 
116
136
  it "should display info on how to deploy to ShellyCloud" do
117
- $stdout.should_receive(:puts).with("When you make sure all settings are correct please issue following commands:")
137
+ $stdout.should_receive(:puts).with("\e[32mWhen you make sure all settings are correct please issue following commands:\e[0m")
118
138
  $stdout.should_receive(:puts).with(" git add .")
119
139
  $stdout.should_receive(:puts).with(' git commit -m "Application added to Shelly Cloud"')
120
140
  $stdout.should_receive(:puts).with(" git push")
121
- $stdout.should_receive(:puts).with("Deploy to staging using:")
141
+ $stdout.should_receive(:puts).with("\e[32mDeploy to staging using:\e[0m")
122
142
  $stdout.should_receive(:puts).with(" git push staging master")
123
143
  fake_stdin(["staging", "foooo", "none"]) do
124
144
  @apps.add
@@ -45,14 +45,21 @@ describe Shelly::Client do
45
45
  end
46
46
  end
47
47
 
48
+ describe "#create_app" do
49
+ it "should send post with app's attributes" do
50
+ @client.should_receive(:post).with("/apps", :app => {:code_name => "foo", :ruby_version => "1.9.2"})
51
+ @client.create_app(:code_name => "foo", :ruby_version => "1.9.2")
52
+ end
53
+ end
54
+
48
55
  describe "#request_parameters" do
49
56
  it "should return hash of resquest parameters" do
50
57
  expected = {
51
- :method => :post,
52
- :url => "#{@client.api_url}/account",
53
- :headers => @client.headers,
54
- :payload => {:name => "bob"}.to_json,
55
- :username => "bob@example.com",
58
+ :method => :post,
59
+ :url => "#{@client.api_url}/account",
60
+ :headers => @client.headers,
61
+ :payload => {:name => "bob"}.to_json,
62
+ :user => "bob@example.com",
56
63
  :password => "secret"
57
64
  }
58
65
  @client.request_parameters("/account", :post, :name => "bob").should == expected
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: shelly
3
3
  version: !ruby/object:Gem::Version
4
- hash: 17
4
+ hash: 15
5
5
  prerelease: false
6
6
  segments:
7
7
  - 0
8
8
  - 0
9
- - 7
10
- version: 0.0.7
9
+ - 8
10
+ version: 0.0.8
11
11
  platform: ruby
12
12
  authors:
13
13
  - Shelly Cloud team
@@ -15,7 +15,7 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2011-10-03 00:00:00 +02:00
18
+ date: 2011-10-04 00:00:00 +02:00
19
19
  default_executable:
20
20
  dependencies:
21
21
  - !ruby/object:Gem::Dependency