hrk 0.0.2 → 0.0.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/bin/hrk +7 -1
- data/lib/hrk.rb +4 -0
- data/lib/hrk/execute.rb +15 -0
- data/lib/hrk/execute/command.rb +12 -0
- data/lib/hrk/execute/help.rb +36 -0
- data/lib/hrk/heroku.rb +21 -0
- data/spec/hrk/execute/command_spec.rb +29 -0
- data/spec/hrk/execute/help_spec.rb +57 -0
- data/spec/hrk/execute_spec.rb +19 -0
- data/spec/hrk/heroku_spec.rb +51 -0
- data/spec/spec_helper.rb +26 -0
- metadata +55 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 67b379c0812c173de1d738d526b6b350947acf9c
|
4
|
+
data.tar.gz: 30708b927366d6842771652f86fcd73b6a962593
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f74f6a0f912eb4baa1b6d02c202f71c9791b375c0d34b7e4a54598fb67c16a0ec1e262ce37414e672c0c459fc9b0d01b0727eb99847c939572a1a5d9b0748876
|
7
|
+
data.tar.gz: 6b029a0c02a97c3f4632a90c4f157928e28e9a1cb7c28f085b944285d936933d917c4226cc03fd91a9a4dff4ea316b3d28af623f6fa96e1caebc9a4a15c05dce
|
data/bin/hrk
CHANGED
@@ -1,3 +1,9 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
2
|
|
3
|
-
|
3
|
+
begin
|
4
|
+
$:.unshift(File.expand_path(File.dirname(__FILE__) + '/../lib'))
|
5
|
+
require 'hrk'
|
6
|
+
rescue IOError
|
7
|
+
end
|
8
|
+
|
9
|
+
exit (if Hrk::Execute.(*ARGV) then 0 else 1 end)
|
data/lib/hrk.rb
ADDED
data/lib/hrk/execute.rb
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
module Hrk
|
2
|
+
module Execute
|
3
|
+
autoload :Command, 'hrk/execute/command'
|
4
|
+
autoload :Help, 'hrk/execute/help'
|
5
|
+
|
6
|
+
def self.call *args
|
7
|
+
executer.call *args
|
8
|
+
end
|
9
|
+
|
10
|
+
def self.executer
|
11
|
+
Hrk::Execute::Help.new \
|
12
|
+
Hrk::Execute::Command.new
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,12 @@
|
|
1
|
+
module Hrk
|
2
|
+
module Execute
|
3
|
+
class Command
|
4
|
+
REMOTE_MATCHER = %r{\A(.+):\Z}
|
5
|
+
|
6
|
+
def call remote, *args
|
7
|
+
raise ArgumentError.new("#{remote.inspect} isn't a proper remote marker") unless remote =~ REMOTE_MATCHER
|
8
|
+
Hrk::Heroku.new(remote[REMOTE_MATCHER, 1]).call(args.join(' '))
|
9
|
+
end
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
module Hrk
|
2
|
+
module Execute
|
3
|
+
class Help
|
4
|
+
def initialize fallback = nil
|
5
|
+
@fallback = fallback
|
6
|
+
end
|
7
|
+
|
8
|
+
def call *args
|
9
|
+
if args.empty? || args.first =~ %r(\A(?:(?:(?:-)?h)|(?:(?:--)?help))\Z)
|
10
|
+
display || true
|
11
|
+
else
|
12
|
+
fallback *args
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
def display
|
17
|
+
puts <<-eos
|
18
|
+
Usage:
|
19
|
+
hrk remote: command..."
|
20
|
+
hrk [h | help | -h | --help]"
|
21
|
+
|
22
|
+
Options:
|
23
|
+
-h --help Display this screen.
|
24
|
+
eos
|
25
|
+
end
|
26
|
+
|
27
|
+
def fallback *args
|
28
|
+
if @fallback
|
29
|
+
@fallback.call *args
|
30
|
+
else
|
31
|
+
raise ArgumentError.new
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
data/lib/hrk/heroku.rb
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
module Hrk
|
2
|
+
class Heroku
|
3
|
+
def initialize remote_name
|
4
|
+
@remote_name = remote_name
|
5
|
+
end
|
6
|
+
|
7
|
+
def call command
|
8
|
+
validate! command
|
9
|
+
system %Q(heroku #{command} -r #{@remote_name})
|
10
|
+
end
|
11
|
+
|
12
|
+
private
|
13
|
+
|
14
|
+
def validate! command
|
15
|
+
raise ExplicitApplicationError.new, "You're calling a command on remote #{@remote_name} yet the command explicitely references #{command[%r{-[ar]\s+\S+}]}" if command =~ %r{ -[ra]\b}
|
16
|
+
end
|
17
|
+
|
18
|
+
class ExplicitApplicationError < Exception
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
RSpec.describe Hrk::Execute::Command do
|
4
|
+
describe '#call' do
|
5
|
+
subject(:command) { Hrk::Execute::Command.new }
|
6
|
+
|
7
|
+
describe 'standard case (a remote, a command)' do
|
8
|
+
let(:remote) { "remote-#{rand(1..9)}" }
|
9
|
+
let(:args) { %w(whatever that:may -b) }
|
10
|
+
|
11
|
+
let(:heroku) { double("Hrk::Heroku") }
|
12
|
+
before { allow(heroku).to receive(:call) }
|
13
|
+
before { allow(Hrk::Heroku).to receive(:new).and_return(heroku) }
|
14
|
+
|
15
|
+
before { command.call "#{remote}:", *args }
|
16
|
+
|
17
|
+
it { expect(Hrk::Heroku).to have_received(:new).with(remote) }
|
18
|
+
it { expect(heroku).to have_received(:call).with("whatever that:may -b") }
|
19
|
+
end
|
20
|
+
|
21
|
+
describe 'edge cases (no remote or improper remote)' do
|
22
|
+
let(:other_args) { %w(something or-another) }
|
23
|
+
it { expect { command.call }.to raise_error ArgumentError }
|
24
|
+
it { expect { command.call "bad-remote", *other_args }.to raise_error ArgumentError }
|
25
|
+
it { expect { command.call ":misplaced-marker", *other_args }.to raise_error ArgumentError }
|
26
|
+
it { expect { command.call ":", *other_args }.to raise_error ArgumentError }
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
@@ -0,0 +1,57 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
RSpec.describe Hrk::Execute::Help do
|
4
|
+
describe '#call' do
|
5
|
+
subject(:help) { Hrk::Execute::Help.new }
|
6
|
+
|
7
|
+
describe 'with the right arguments' do
|
8
|
+
before { expect(help).to receive :display }
|
9
|
+
|
10
|
+
it { expect(help.call).to eq true }
|
11
|
+
it { expect(help.call('h')).to eq true }
|
12
|
+
it { expect(help.call('-h')).to eq true }
|
13
|
+
it { expect(help.call('help')).to eq true }
|
14
|
+
it { expect(help.call('--help')).to eq true }
|
15
|
+
end
|
16
|
+
|
17
|
+
describe 'with wrong arguments' do
|
18
|
+
[
|
19
|
+
%w(run rake db:migrate),
|
20
|
+
%w(helpe),
|
21
|
+
%w(ahelp)
|
22
|
+
].each do |args|
|
23
|
+
before { allow(help).to receive(:fallback).with(*args).and_return :fallouts }
|
24
|
+
|
25
|
+
it { expect(help.call(*args)).to eq :fallouts}
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
describe '#display' do
|
31
|
+
subject(:help) { Hrk::Execute::Help.new }
|
32
|
+
|
33
|
+
before { allow(help).to receive :puts }
|
34
|
+
before { help.display }
|
35
|
+
|
36
|
+
it { expect(help).to have_received(:puts).at_least(1).times }
|
37
|
+
end
|
38
|
+
|
39
|
+
describe '#fallback' do
|
40
|
+
describe 'without a fallback command' do
|
41
|
+
subject(:help) { Hrk::Execute::Help.new }
|
42
|
+
|
43
|
+
it { expect { help.fallback(*%w(whatever arguments it received)) }.to raise_error ArgumentError }
|
44
|
+
end
|
45
|
+
|
46
|
+
describe 'with a fallback command' do
|
47
|
+
let(:fallback) { double }
|
48
|
+
before { allow(fallback).to receive :call }
|
49
|
+
|
50
|
+
subject(:help) { Hrk::Execute::Help.new fallback }
|
51
|
+
|
52
|
+
before { expect(fallback).to receive(:call).with(*%w(whatever arguments it received)).and_return(:some_result) }
|
53
|
+
|
54
|
+
it { expect(help.fallback(*%w(whatever arguments it received))).to eq :some_result }
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
require 'hrk/execute'
|
2
|
+
|
3
|
+
RSpec.describe Hrk::Execute do
|
4
|
+
describe '.call' do
|
5
|
+
let(:executer) { double }
|
6
|
+
let(:args) { %w(run rake db:migrate) }
|
7
|
+
|
8
|
+
before { allow(Hrk::Execute).to receive(:executer).and_return(executer) }
|
9
|
+
before { expect(executer).to receive(:call).with(*args).and_return(return_value) }
|
10
|
+
|
11
|
+
[true, false].each do |value|
|
12
|
+
describe "the executer returns #{value}" do
|
13
|
+
let(:return_value) { value }
|
14
|
+
|
15
|
+
it { expect(Hrk::Execute.call(*args)).to eq return_value }
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,51 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
RSpec.describe Hrk::Heroku do
|
4
|
+
describe '#call' do
|
5
|
+
describe 'the system command ran' do
|
6
|
+
def self.calling command, on_remote: 'whatever-app', starts: ''
|
7
|
+
describe "calling '#{command}' on remote '#{on_remote}', system" do
|
8
|
+
subject(:heroku) { Hrk::Heroku.new(on_remote) }
|
9
|
+
|
10
|
+
before { heroku.call command }
|
11
|
+
|
12
|
+
it { expect(heroku).to have_received(:system).with(starts) }
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
before { allow(heroku).to receive(:system) }
|
17
|
+
|
18
|
+
describe '(standard case)' do
|
19
|
+
calling 'call rake db:rollback', on_remote: 'demo', starts: 'heroku call rake db:rollback -r demo'
|
20
|
+
calling 'call rake db:migrate', on_remote: 'prod', starts: 'heroku call rake db:migrate -r prod'
|
21
|
+
calling 'call console', on_remote: 'staging', starts: 'heroku call console -r staging'
|
22
|
+
calling 'logs -t', on_remote: 'prod', starts: 'heroku logs -t -r prod'
|
23
|
+
calling 'pgbackups:capture', on_remote: 'demo', starts: 'heroku pgbackups:capture -r demo'
|
24
|
+
end
|
25
|
+
|
26
|
+
describe '(edge case)' do
|
27
|
+
subject(:heroku) { Hrk::Heroku.new('some-remote') }
|
28
|
+
|
29
|
+
it { expect { heroku.call('run rake rake:db:migrate -r some-other-remote') }.to raise_exception(Hrk::Heroku::ExplicitApplicationError) }
|
30
|
+
it { expect { heroku.call('run rake rake:db:migrate -a different-app') }.to raise_exception(Hrk::Heroku::ExplicitApplicationError) }
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
describe 'the result of the command' do
|
35
|
+
subject(:heroku) { Hrk::Heroku.new('some-remote') }
|
36
|
+
before { allow(heroku).to receive(:system).with('heroku some command -r some-remote').and_return(system_returns) }
|
37
|
+
|
38
|
+
context 'the command result is truthy' do
|
39
|
+
let(:system_returns) { true }
|
40
|
+
|
41
|
+
it { expect(heroku.call('some command')).to be_truthy }
|
42
|
+
end
|
43
|
+
|
44
|
+
context 'the command result is falsy' do
|
45
|
+
let(:system_returns) { false }
|
46
|
+
|
47
|
+
it { expect(heroku.call('some command')).to be_falsy }
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,26 @@
|
|
1
|
+
require 'hrk'
|
2
|
+
|
3
|
+
RSpec.configure do |config|
|
4
|
+
config.expect_with :rspec do |expectations|
|
5
|
+
expectations.include_chain_clauses_in_custom_matcher_descriptions = true
|
6
|
+
end
|
7
|
+
|
8
|
+
config.mock_with :rspec do |mocks|
|
9
|
+
mocks.verify_partial_doubles = true
|
10
|
+
end
|
11
|
+
|
12
|
+
config.filter_run :focus
|
13
|
+
config.run_all_when_everything_filtered = true
|
14
|
+
config.disable_monkey_patching!
|
15
|
+
config.warnings = true
|
16
|
+
config.default_formatter =
|
17
|
+
if config.files_to_run.one?
|
18
|
+
'doc'
|
19
|
+
else
|
20
|
+
'NyanCatFormatter'
|
21
|
+
end
|
22
|
+
|
23
|
+
config.order = :random
|
24
|
+
|
25
|
+
Kernel.srand config.seed
|
26
|
+
end
|
metadata
CHANGED
@@ -1,15 +1,57 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: hrk
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Michel Belleville
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
12
|
-
dependencies:
|
11
|
+
date: 2015-01-04 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: rspec
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ">="
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '0'
|
20
|
+
type: :development
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ">="
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '0'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: nyan-cat-formatter
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ">="
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0'
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - ">="
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: guard-rspec
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - ">="
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '0'
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - ">="
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0'
|
13
55
|
description: Hrk 2 swim like a dolphin in a sea of heroku commands
|
14
56
|
email: michel.belleville@gmail.com
|
15
57
|
executables:
|
@@ -19,6 +61,16 @@ extra_rdoc_files: []
|
|
19
61
|
files:
|
20
62
|
- README.md
|
21
63
|
- bin/hrk
|
64
|
+
- lib/hrk.rb
|
65
|
+
- lib/hrk/execute.rb
|
66
|
+
- lib/hrk/execute/command.rb
|
67
|
+
- lib/hrk/execute/help.rb
|
68
|
+
- lib/hrk/heroku.rb
|
69
|
+
- spec/hrk/execute/command_spec.rb
|
70
|
+
- spec/hrk/execute/help_spec.rb
|
71
|
+
- spec/hrk/execute_spec.rb
|
72
|
+
- spec/hrk/heroku_spec.rb
|
73
|
+
- spec/spec_helper.rb
|
22
74
|
homepage: http://github.com/Bastes/hrk
|
23
75
|
licenses:
|
24
76
|
- GPL-3
|