peas-cli 0.2.1 → 0.3.0
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.
- 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
|