peas-cli 0.2.1 → 0.3.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Gemfile +1 -0
- data/Gemfile.lock +1 -0
- data/VERSION +1 -1
- data/lib/peas/api.rb +1 -0
- data/lib/peas/commands/app.rb +16 -13
- data/lib/peas/commands/config.rb +11 -7
- data/lib/peas/commands/logs.rb +7 -2
- data/lib/peas/git.rb +17 -4
- data/peas-cli.gemspec +6 -3
- data/spec/cli_spec.rb +32 -24
- data/spec/spec_helper.rb +1 -1
- metadata +16 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: ce1aa06662fc854dd4a33701bc818feb65fbb628
|
4
|
+
data.tar.gz: 7b31388468f79007654454249a62048977af84d8
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f8b5831ae013078332b0ec19d28d829b16936108d8b929b5082f2be7a1dcd1480a27b86abf6f2438c1afb6da26d867c431ed5d0a86a8b5f63d00f47764254b16
|
7
|
+
data.tar.gz: 4ebd57e18fcc038e098d26e36bc6fbc189f15df0093fa77b3958af764e4b7296929f6656213ac0d24102356b7aac602ed7e2d1642d605b9d7103ead0bf26ff9e
|
data/Gemfile
CHANGED
data/Gemfile.lock
CHANGED
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.
|
1
|
+
0.3.0
|
data/lib/peas/api.rb
CHANGED
data/lib/peas/commands/app.rb
CHANGED
@@ -7,12 +7,21 @@ end
|
|
7
7
|
|
8
8
|
desc 'Create an app'
|
9
9
|
command :create do |c|
|
10
|
+
public_key_path = "#{ENV['HOME']}/.ssh/id_rsa.pub"
|
10
11
|
c.action do |_global_options, _options, _args|
|
11
|
-
|
12
|
+
unless Git.remote('peas').empty?
|
13
|
+
exit_now! "This repo already has an app (#{Git.name_from_remote}) associated with it.", 1
|
14
|
+
end
|
15
|
+
unless File.exist? public_key_path
|
16
|
+
exit_now! "Couldn't find an SSH public key", 1
|
17
|
+
end
|
18
|
+
response = @api.request(
|
12
19
|
:post,
|
13
|
-
|
14
|
-
|
20
|
+
'/app',
|
21
|
+
muse: Git.name_from_remote(Git.remote('origin')),
|
22
|
+
public_key: File.open(public_key_path).read
|
15
23
|
)
|
24
|
+
Git.add_remote response['remote_uri']
|
16
25
|
end
|
17
26
|
end
|
18
27
|
|
@@ -21,15 +30,9 @@ command :destroy do |c|
|
|
21
30
|
c.action do |_global_options, _options, _args|
|
22
31
|
@api.request(
|
23
32
|
:delete,
|
24
|
-
"/app/#{Git.
|
33
|
+
"/app/#{Git.name_from_remote}"
|
25
34
|
)
|
26
|
-
|
27
|
-
end
|
28
|
-
|
29
|
-
desc 'Deploy an app'
|
30
|
-
command :deploy do |c|
|
31
|
-
c.action do |_global_options, _options, _args|
|
32
|
-
@api.request :get, "/app/#{Git.first_sha}/deploy"
|
35
|
+
Git.remove_remote
|
33
36
|
end
|
34
37
|
end
|
35
38
|
|
@@ -40,7 +43,7 @@ EOF
|
|
40
43
|
command :scale do |c|
|
41
44
|
c.action do |_global_options, _options, args|
|
42
45
|
if args.length == 0
|
43
|
-
exit_now! "Please provide scaling arguments in the form: web=3 worker=2"
|
46
|
+
exit_now! "Please provide scaling arguments in the form: web=3 worker=2", 1
|
44
47
|
end
|
45
48
|
scaling_hash = {}
|
46
49
|
args.each do |arg|
|
@@ -51,7 +54,7 @@ command :scale do |c|
|
|
51
54
|
end
|
52
55
|
@api.request(
|
53
56
|
:put,
|
54
|
-
"/app/#{Git.
|
57
|
+
"/app/#{Git.name_from_remote}/scale",
|
55
58
|
scaling_hash: scaling_hash.to_json
|
56
59
|
)
|
57
60
|
end
|
data/lib/peas/commands/config.rb
CHANGED
@@ -2,15 +2,17 @@ desc 'Add, remove and list config for an app'
|
|
2
2
|
command :config do |c|
|
3
3
|
c.default_desc 'List all config'
|
4
4
|
c.action do |_global_options, _options, _args|
|
5
|
-
@api.request :get, "/app/#{Git.
|
5
|
+
@api.request :get, "/app/#{Git.name_from_remote}/config"
|
6
6
|
end
|
7
7
|
|
8
8
|
c.desc 'Delete config by keys'
|
9
9
|
c.command :rm do |sc|
|
10
10
|
sc.action do |_global_options, _options, args|
|
11
|
-
@api.request
|
12
|
-
|
13
|
-
|
11
|
+
@api.request(
|
12
|
+
:delete,
|
13
|
+
"/app/#{Git.name_from_remote}/config",
|
14
|
+
keys: args.to_json
|
15
|
+
)
|
14
16
|
end
|
15
17
|
end
|
16
18
|
|
@@ -27,9 +29,11 @@ command :config do |c|
|
|
27
29
|
value = parts[1]
|
28
30
|
vars[key] = value
|
29
31
|
end
|
30
|
-
@api.request
|
31
|
-
|
32
|
-
|
32
|
+
@api.request(
|
33
|
+
:put,
|
34
|
+
"/app/#{Git.name_from_remote}/config",
|
35
|
+
vars: vars.to_json
|
36
|
+
)
|
33
37
|
end
|
34
38
|
end
|
35
39
|
end
|
data/lib/peas/commands/logs.rb
CHANGED
@@ -1,6 +1,11 @@
|
|
1
1
|
desc 'Show logs for an app'
|
2
2
|
command :logs do |c|
|
3
|
-
|
4
|
-
|
3
|
+
|
4
|
+
c.desc "Follow logs as new lines are created"
|
5
|
+
c.switch [:f, :follow]
|
6
|
+
|
7
|
+
c.action do |_global_options, options, _args|
|
8
|
+
follow = options[:follow] ? 'follow' : ''
|
9
|
+
API.stream_output "stream_logs.#{Git.name_from_remote} #{follow}"
|
5
10
|
end
|
6
11
|
end
|
data/lib/peas/git.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
require "addressable/uri"
|
2
|
+
|
1
3
|
class Git
|
2
4
|
def self.sh(cmd)
|
3
5
|
`#{cmd}`.strip
|
@@ -7,11 +9,22 @@ class Git
|
|
7
9
|
sh 'git rev-parse --show-toplevel'
|
8
10
|
end
|
9
11
|
|
10
|
-
def self.remote
|
11
|
-
sh
|
12
|
+
def self.remote(remote = 'peas')
|
13
|
+
sh "git config --get remote.#{remote}.url"
|
14
|
+
end
|
15
|
+
|
16
|
+
def self.add_remote(remote)
|
17
|
+
sh "git remote add peas #{remote}"
|
18
|
+
end
|
19
|
+
|
20
|
+
def self.remove_remote(remote = 'peas')
|
21
|
+
sh "git remote rm #{remote}"
|
12
22
|
end
|
13
23
|
|
14
|
-
def self.
|
15
|
-
|
24
|
+
def self.name_from_remote(remote_uri = nil)
|
25
|
+
remote_uri = remote unless remote_uri
|
26
|
+
exit_now! "No Peas remote. I can't figure out what app this is.", 1 if remote_uri == ''
|
27
|
+
parts = Addressable::URI.parse remote_uri
|
28
|
+
parts.path.split('/').last.gsub('.git', '')
|
16
29
|
end
|
17
30
|
end
|
data/peas-cli.gemspec
CHANGED
@@ -2,16 +2,16 @@
|
|
2
2
|
# DO NOT EDIT THIS FILE DIRECTLY
|
3
3
|
# Instead, edit Jeweler::Tasks in Rakefile, and run 'rake gemspec'
|
4
4
|
# -*- encoding: utf-8 -*-
|
5
|
-
# stub: peas-cli 0.
|
5
|
+
# stub: peas-cli 0.3.0 ruby lib
|
6
6
|
|
7
7
|
Gem::Specification.new do |s|
|
8
8
|
s.name = "peas-cli"
|
9
|
-
s.version = "0.
|
9
|
+
s.version = "0.3.0"
|
10
10
|
|
11
11
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
12
12
|
s.require_paths = ["lib"]
|
13
13
|
s.authors = ["Tom Buckley-Houston"]
|
14
|
-
s.date = "2014-08-
|
14
|
+
s.date = "2014-08-23"
|
15
15
|
s.description = "Peas is an open source Heroku-style PaaS written in Ruby and using Docker"
|
16
16
|
s.email = "tom@tombh.co.uk"
|
17
17
|
s.executables = ["peas"]
|
@@ -51,17 +51,20 @@ Gem::Specification.new do |s|
|
|
51
51
|
s.add_runtime_dependency(%q<gli>, [">= 0"])
|
52
52
|
s.add_runtime_dependency(%q<httparty>, [">= 0"])
|
53
53
|
s.add_runtime_dependency(%q<rainbow>, [">= 0"])
|
54
|
+
s.add_runtime_dependency(%q<addressable>, [">= 0"])
|
54
55
|
s.add_development_dependency(%q<jeweler>, [">= 0"])
|
55
56
|
else
|
56
57
|
s.add_dependency(%q<gli>, [">= 0"])
|
57
58
|
s.add_dependency(%q<httparty>, [">= 0"])
|
58
59
|
s.add_dependency(%q<rainbow>, [">= 0"])
|
60
|
+
s.add_dependency(%q<addressable>, [">= 0"])
|
59
61
|
s.add_dependency(%q<jeweler>, [">= 0"])
|
60
62
|
end
|
61
63
|
else
|
62
64
|
s.add_dependency(%q<gli>, [">= 0"])
|
63
65
|
s.add_dependency(%q<httparty>, [">= 0"])
|
64
66
|
s.add_dependency(%q<rainbow>, [">= 0"])
|
67
|
+
s.add_dependency(%q<addressable>, [">= 0"])
|
65
68
|
s.add_dependency(%q<jeweler>, [">= 0"])
|
66
69
|
end
|
67
70
|
end
|
data/spec/cli_spec.rb
CHANGED
@@ -3,13 +3,19 @@ require 'spec_helper'
|
|
3
3
|
describe 'Peas CLI' do
|
4
4
|
before :each do
|
5
5
|
allow(Git).to receive(:sh).and_return(nil)
|
6
|
-
allow(Git).to receive(:remote).and_return('git@github.com:test
|
7
|
-
allow(Git).to receive(:first_sha).and_return('fakesha')
|
6
|
+
allow(Git).to receive(:remote).and_return('git@github.com:test-test.git')
|
8
7
|
allow_any_instance_of(API).to receive(:sleep).and_return(nil)
|
9
8
|
allow(Peas).to receive(:config_file).and_return('/tmp/.peas')
|
10
9
|
File.delete '/tmp/.peas' if File.exist? '/tmp/.peas'
|
11
10
|
end
|
12
11
|
|
12
|
+
describe 'App name' do
|
13
|
+
it 'should get the app name from a remote URI' do
|
14
|
+
allow(Git).to receive(:remote).and_return('git@github.com:tombh-peas.git')
|
15
|
+
expect(Git.name_from_remote).to eq 'tombh-peas'
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
13
19
|
describe 'Settings' do
|
14
20
|
it 'should set and use the domain setting' do
|
15
21
|
stub_request(:put, 'http://new-domain.com:4000/admin/settings?peas.domain=new-domain.com:4000')
|
@@ -43,36 +49,38 @@ describe 'Peas CLI' do
|
|
43
49
|
expect(output).to eq "coolapp\n"
|
44
50
|
end
|
45
51
|
|
46
|
-
it 'should create an app' do
|
47
|
-
|
48
|
-
|
52
|
+
it 'should create an app and its remote' do
|
53
|
+
public_key_path = "#{ENV['HOME']}/.ssh/id_rsa.pub"
|
54
|
+
allow(File).to receive(:open).and_call_original
|
55
|
+
expect(File).to receive(:exist?).with(public_key_path) { true }
|
56
|
+
expect(File).to receive(:open).with(public_key_path) { double(read: 'apublickey') }
|
57
|
+
stub_request(:post, TEST_DOMAIN + '/app?muse=test-test&public_key=apublickey')
|
58
|
+
.to_return(
|
59
|
+
body: {
|
60
|
+
version: Peas::VERSION,
|
61
|
+
message: "App 'test-test' successfully created",
|
62
|
+
remote_uri: 'git@peas.io:test-test.git'
|
63
|
+
}.to_json
|
64
|
+
)
|
65
|
+
allow(Git).to receive(:remote).with('peas').and_return('')
|
66
|
+
allow(Git).to receive(:remote).with('origin').and_return('git@github.com:test-test.git')
|
67
|
+
expect(Git).to receive(:add_remote).with('git@peas.io:test-test.git')
|
49
68
|
output = cli ['create']
|
50
|
-
expect(output).to eq "App 'test' successfully created\n"
|
69
|
+
expect(output).to eq "App 'test-test' successfully created\n"
|
51
70
|
end
|
52
71
|
|
53
72
|
it 'should destroy an app' do
|
54
|
-
stub_request(:delete, TEST_DOMAIN + '/app/
|
73
|
+
stub_request(:delete, TEST_DOMAIN + '/app/test-test')
|
55
74
|
.to_return(body: response_mock("App 'test' successfully destroyed"))
|
75
|
+
expect(Git).to receive(:remove_remote)
|
56
76
|
output = cli ['destroy']
|
57
77
|
expect(output).to eq "App 'test' successfully destroyed\n"
|
58
78
|
end
|
59
79
|
|
60
|
-
it 'should deploy an app', :with_socket do
|
61
|
-
stub_request(:get, /deploy/).to_return(body: '{"job": "123"}')
|
62
|
-
allow(@socket).to receive(:gets).and_return(
|
63
|
-
'{"body":"doing"}',
|
64
|
-
'{"body":"something"}',
|
65
|
-
'{"body":"done"}',
|
66
|
-
'{"status":"complete"}'
|
67
|
-
)
|
68
|
-
output = cli %w(deploy)
|
69
|
-
expect(output).to eq "doing\nsomething\ndone\n"
|
70
|
-
end
|
71
|
-
|
72
80
|
it 'should scale an app', :with_socket do
|
73
81
|
stub_request(
|
74
82
|
:put,
|
75
|
-
TEST_DOMAIN + '/app/
|
83
|
+
TEST_DOMAIN + '/app/test-test/scale?scaling_hash=%7B%22web%22:%223%22,%22worker%22:%222%22%7D'
|
76
84
|
).to_return(body: '{"job": "123"}')
|
77
85
|
allow(@socket).to receive(:gets).and_return(
|
78
86
|
'{"body":"scaling"}',
|
@@ -84,21 +92,21 @@ describe 'Peas CLI' do
|
|
84
92
|
|
85
93
|
describe 'Config ENV vars' do
|
86
94
|
it 'should set config for an app' do
|
87
|
-
stub_request(:put, TEST_DOMAIN + '/app/
|
95
|
+
stub_request(:put, TEST_DOMAIN + '/app/test-test/config?vars=%7B%22FOO%22:%22BAR%22%7D')
|
88
96
|
.to_return(body: response_mock("{'FOO' => 'BAR'}"))
|
89
97
|
output = cli %w(config set FOO=BAR)
|
90
98
|
expect(output).to eq "{'FOO' => 'BAR'}\n"
|
91
99
|
end
|
92
100
|
|
93
101
|
it 'delete config for an app' do
|
94
|
-
stub_request(:delete, TEST_DOMAIN + '/app/
|
102
|
+
stub_request(:delete, TEST_DOMAIN + '/app/test-test/config?keys=%5B%22FOO%22%5D')
|
95
103
|
.to_return(body: response_mock(nil))
|
96
104
|
output = cli %w(config rm FOO)
|
97
105
|
expect(output).to eq "\n"
|
98
106
|
end
|
99
107
|
|
100
108
|
it 'should list all config for an app' do
|
101
|
-
stub_request(:get, TEST_DOMAIN + '/app/
|
109
|
+
stub_request(:get, TEST_DOMAIN + '/app/test-test/config')
|
102
110
|
.to_return(body: response_mock("{'FOO' => 'BAR'}\n{'MOO' => 'CAR'}"))
|
103
111
|
output = cli %w(config)
|
104
112
|
expect(output).to eq "{'FOO' => 'BAR'}\n{'MOO' => 'CAR'}\n"
|
@@ -129,7 +137,7 @@ describe 'Peas CLI' do
|
|
129
137
|
end
|
130
138
|
|
131
139
|
it 'should show a warning when there is a version mismatch' do
|
132
|
-
stub_request(:get, TEST_DOMAIN + '/app/
|
140
|
+
stub_request(:get, TEST_DOMAIN + '/app/test-test/config')
|
133
141
|
.to_return(body: '{"version": "100000.1000000.100000"}')
|
134
142
|
output = cli %w(config)
|
135
143
|
expect(output).to include 'Your version of the CLI client is out of date'
|
data/spec/spec_helper.rb
CHANGED
@@ -9,7 +9,7 @@ ENV['GLI_ENV'] = 'test'
|
|
9
9
|
ROOT = File.join(File.expand_path(File.dirname(__FILE__)), '..')
|
10
10
|
$LOAD_PATH.unshift(File.join(ROOT, 'lib'))
|
11
11
|
TEST_DOMAIN = 'http://vcap.me:4000'
|
12
|
-
SWITCHBOARD_TEST_PORT =
|
12
|
+
SWITCHBOARD_TEST_PORT = 79345
|
13
13
|
|
14
14
|
RSpec.configure do |config|
|
15
15
|
config.mock_with :rspec
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: peas-cli
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Tom Buckley-Houston
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-08-
|
11
|
+
date: 2014-08-23 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: gli
|
@@ -52,6 +52,20 @@ dependencies:
|
|
52
52
|
- - ">="
|
53
53
|
- !ruby/object:Gem::Version
|
54
54
|
version: '0'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: addressable
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - ">="
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
62
|
+
type: :runtime
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - ">="
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '0'
|
55
69
|
- !ruby/object:Gem::Dependency
|
56
70
|
name: jeweler
|
57
71
|
requirement: !ruby/object:Gem::Requirement
|