hrk 0.0.8 → 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: e8df14c2ca4330a91a5cf758825844724e93a4b6
4
- data.tar.gz: 4cf32f72933c72821c09b662ed07fbb62525e3bf
3
+ metadata.gz: 6dfbf2f64a50461372620e5d7aa9bcc4295de6d5
4
+ data.tar.gz: ab1f2fe43247946ce291faadadaeb4e10f7fcb2a
5
5
  SHA512:
6
- metadata.gz: fbaf173a98a54834352a8bd0122d21561760f4a6d8f77922b44aac0a2d702b7ecac4a72ac51cdb4fd93c2669693b8a270c6bc91cb99a5940adf3a0f47e67032a
7
- data.tar.gz: 98edc74b9c2f69ca20be31d9d3b84319da03046a02aff5bf55bb94d17c47103159482daa6f1ccc122b2e0291cfa7fe269780aa5c899de6eb272f63b971e61e3b
6
+ metadata.gz: 9cbe4f176099d1f231cc492ec591e6307255ee5e46bb051cd984854576065305dac3c17dcf959199725522978703eb6a1c69a2f82a95fa99e5216be9e650e28a
7
+ data.tar.gz: 905d3bb4978f67bdbfd55a3e67897e7559a88254a59d8f1bc45d33fa9759f272603de513972195a8f54f46ef364b1ddad7cf416140cf6db1129a282e3038af94
data/README.md CHANGED
@@ -1,6 +1,9 @@
1
1
  # Hrk
2
+ [![Gem Version](https://badge.fury.io/rb/hrk.svg)](http://badge.fury.io/rb/hrk)
3
+ [![Build Status](https://travis-ci.org/Bastes/hrk.svg?branch=master)](https://travis-ci.org/Bastes/hrk)
4
+ [![Dependency Status](https://gemnasium.com/Bastes/hrk.svg)](https://gemnasium.com/Bastes/hrk)
2
5
 
3
- Hrk 2 swim like a dolphin in a sea of heroku commands
6
+ Hrk remembers your heroku remotes for you.
4
7
 
5
8
  ```
6
9
  ,|
@@ -21,17 +24,19 @@ Hrk 2 swim like a dolphin in a sea of heroku commands
21
24
  ``--'' `
22
25
  ```
23
26
 
27
+ Hrk 2 swim like a dolphin in a sea of heroku commands
28
+
24
29
  ## Getting started
25
30
 
26
31
  You can install the Hrk gem using the gem command:
27
32
 
28
- ```
33
+ ```bash
29
34
  $ gem install hrk
30
35
  ```
31
36
 
32
37
  Or through bundler:
33
38
 
34
- ```
39
+ ```ruby
35
40
  # in your Gemfile
36
41
  gem 'hrk', group: :development
37
42
 
@@ -39,7 +44,7 @@ $ bundle install
39
44
  ```
40
45
 
41
46
  And enjoy the hrk command awesome power:
42
- ```
47
+ ```bash
43
48
  $ hrk logs -r your-heroku-remote-name && hrk run console
44
49
  ```
45
50
 
@@ -50,7 +55,7 @@ It's a command that calls the heroku toolbelt command for you, remembers the
50
55
  name of the previous remote so you don't have to re-type it again and again
51
56
  and again each time you want to chain heroku commands.
52
57
 
53
- For example, let's say I've got an heroku app that's called:
58
+ For example, let's say I've got an heroku app which remote is called:
54
59
 
55
60
  > this-really-long-remote-name
56
61
 
@@ -75,13 +80,18 @@ And sometimes you mistype, and the chain breaks in the middle, and it sucks.
75
80
  **Wait, I can do something like that**
76
81
 
77
82
  ```bash
78
- $ export REMOTE_NAME=this-really-long-remote-name && \
79
- heroku run rake do:something:else -r $REMOTE_NAME && \
80
- heroku run rake other:thing -r $REMOTE_NAME && \
81
- heroku run rake yet:another:task -r $REMOTE_NAME
83
+ $ export HEROKU_APP=this-app-name-that-is-usually-even-longer-than-the-remote-name && \
84
+ heroku run rake do:something:else && \
85
+ heroku run rake other:thing && \
86
+ heroku run rake yet:another:task
82
87
  ```
83
88
 
84
- Yup. Now It doesn't look really that better now does it?
89
+ Yup, it works.
90
+ Still feels like one command too many.
91
+ Still have to remember the names of my apps for each project instead of using my
92
+ aptly, conventionnaly named remotes ('test', 'staging', 'prod'...).
93
+
94
+ Isn't there a better way?
85
95
 
86
96
  **Hrk to the rescue!**
87
97
 
@@ -157,10 +167,63 @@ $ hrk maintenance:on -a my-super-duper-app && \ # happens on my-super-duper-app
157
167
  hrk maintenance:off # aaand on my-super-duper-app
158
168
  ```
159
169
 
170
+ **...if I don't chain commands?**
171
+
172
+ Hrk has been designed to help when chaining commands, but it will remember your
173
+ last remote until you close your terminal. So this will work:
174
+
175
+ ```bash
176
+ $ hrk logs -r demo
177
+ ...
178
+ $ hrk console # happens on demo
179
+ ```
180
+
181
+ This also means you have to be a little careful not to forget on which remote
182
+ you are. We are currently planning on adding a little more security there, so
183
+ stay tuned.
184
+
185
+ ## Where will it run?
186
+
187
+ It should run on Linux and MacOSX, provided you've installed ruby.
188
+
189
+ It might run on Windows, although it hasn't been tested and relies on system
190
+ commands that might be different. If you're a windows user and would like to
191
+ give it a try, please do send us your issues and / or pull requests to make hrk
192
+ run there.
193
+
160
194
  ## Do I still need the heroku toolbelt?
161
195
 
162
196
  Yes. The hrk command calls the heroku command for you, it does not replace it.
163
197
 
198
+ ## How do I contribute?
199
+
200
+ In many ways:
201
+
202
+ **If you're having fun using hrk...**
203
+
204
+ ...you can of course give your feedback and ideas for improvements through
205
+ [github issues](https://github.com/Bastes/hrk/issues).
206
+
207
+ **If you'd like to tweak something...**
208
+
209
+ Fork the project on the [github page](https://github.com/Bastes/hrk/issues)
210
+ and do what you want with it, that's what free software (and github) is for.
211
+
212
+ If you added something awesome or killed a nasty bug and want everybody to
213
+ rejoice, you can send a pull request and it'll be merged (or you'll receive an
214
+ explaination why it won't as is).
215
+
216
+ Pull requests with specs improve their chances to be accepted, so don't shy away
217
+ from adding / changing / fixing the specs.
218
+
219
+ If you'd like to to help on current issues, feel also free to browse them and
220
+ attack the ones you'd like to get your hands on. Pull requests that fix issues
221
+ are always welcome.
222
+
223
+ And if you read the code and feel your eyes start to bleed, maybe you can
224
+ notify me (preferably after consulting a good eye doctor). Code reviews lead to
225
+ better code, and better code makes hrk happy.
226
+
164
227
  ## Very important warning!
165
228
 
166
229
  Hrk is pronounced like "a shark" because it's funny.
data/lib/hrk.rb CHANGED
@@ -1,6 +1,6 @@
1
- module Hrk
2
- VERSION = '0.0.8'
1
+ require 'hrk/version'
3
2
 
3
+ module Hrk
4
4
  autoload :Env, 'hrk/env'
5
5
  autoload :Heroku, 'hrk/heroku'
6
6
  autoload :Execute, 'hrk/execute'
@@ -5,30 +5,78 @@ require 'tmpdir'
5
5
 
6
6
  module Hrk
7
7
  class Env
8
- def remote= *args
9
- if args
10
- socket_path.write args.join(' ') unless remote == args
11
- else
12
- socket_path.delete if remote?
8
+ attr_reader :tty_digest
9
+
10
+ def initialize
11
+ @tty_digest = Digest::MD5.hexdigest(`tty`)
12
+ end
13
+
14
+ def schedule_cleanup!
15
+ unless cleanup_scheduled?
16
+ self.pid = fork do
17
+ at_exit { cleanup! }
18
+ while(true) do
19
+ `tty`
20
+ exit if $? != 0
21
+ sleep 1
22
+ end
23
+ end
13
24
  end
14
25
  end
15
26
 
27
+ def cleanup!
28
+ remote_path.delete if remote_path.exist?
29
+ pid_path.delete if pid_path.exist?
30
+ end
31
+
32
+ def remote= args
33
+ schedule_cleanup!
34
+ remote_path.write args.join(' ') unless remote == args
35
+ end
36
+
16
37
  def remote
17
- socket_path.read.split(' ', 2) if remote?
38
+ remote_path.read.split(' ', 2) if remote?
18
39
  end
19
40
 
20
41
  def remote?
21
- socket_path.exist?
42
+ remote_path.exist?
22
43
  end
23
44
 
24
45
  def tmp_path
25
- Pathname.
26
- new(File.join(ENV['XDG_RUNTIME_DIR'] || Dir.tmpdir, 'hrk')).
46
+ tmp_dir.join('hrk').
27
47
  tap { |path| FileUtils.mkdir_p(path) unless path.exist? }
28
48
  end
29
49
 
30
- def socket_path
31
- tmp_path.join Digest::MD5.hexdigest(`tty`)
50
+ def tmp_dir
51
+ Pathname.new(ENV['XDG_RUNTIME_DIR'] || Dir.tmpdir)
52
+ end
53
+
54
+ def remote_path
55
+ tmp_path.join tty_digest
56
+ end
57
+
58
+ def cleanup_scheduled?
59
+ begin
60
+ pid? && Process.kill(0, pid)
61
+ rescue Errno::ESRCH
62
+ false
63
+ end
64
+ end
65
+
66
+ def pid
67
+ pid_path.read.to_i if pid?
68
+ end
69
+
70
+ def pid?
71
+ pid_path.exist?
72
+ end
73
+
74
+ def pid= value
75
+ pid_path.write(value)
76
+ end
77
+
78
+ def pid_path
79
+ tmp_path.join "#{tty_digest}.pid"
32
80
  end
33
81
  end
34
82
  end
@@ -4,12 +4,11 @@ module Hrk
4
4
  autoload :Help, 'hrk/execute/help'
5
5
 
6
6
  def self.call *args
7
- executer.call *args
7
+ executer.call(*args)
8
8
  end
9
9
 
10
10
  def self.executer
11
- Hrk::Execute::Help.new \
12
- Hrk::Execute::Command.new
11
+ Help.new Command.new
13
12
  end
14
13
  end
15
14
  end
@@ -9,7 +9,7 @@ module Hrk
9
9
  if args.empty? || args.first =~ %r(\A(?:(?:(?:-)?h)|(?:(?:--)?help))\Z)
10
10
  display || true
11
11
  else
12
- fallback *args
12
+ fallback(*args)
13
13
  end
14
14
  end
15
15
 
@@ -40,7 +40,7 @@ https://github.com/Bastes/hrk
40
40
 
41
41
  def fallback *args
42
42
  if @fallback
43
- @fallback.call *args
43
+ @fallback.call(*args)
44
44
  else
45
45
  raise ArgumentError.new
46
46
  end
@@ -5,13 +5,13 @@ module Hrk
5
5
  end
6
6
 
7
7
  def call *command
8
- validate! *command
8
+ validate! command
9
9
  system 'heroku', *(command + @remote)
10
10
  end
11
11
 
12
12
  private
13
13
 
14
- def validate! *command
14
+ def validate! command
15
15
  remote = (command.each_cons(2).detect { |(parameter, _)| parameter =~ %r{\A-[ar]\Z} }.join ' ' rescue nil)
16
16
  raise ExplicitApplicationError.new, "You're calling a command on remote #{@remote.join " "} yet the command explicitly references #{remote}" if remote
17
17
  end
@@ -0,0 +1,3 @@
1
+ module Hrk
2
+ VERSION = '1.0.0'
3
+ end
@@ -0,0 +1,283 @@
1
+ require 'spec_helper'
2
+
3
+ RSpec.describe Hrk::Env do
4
+ subject(:env) { Hrk::Env.new }
5
+
6
+ shared_context 'fake remote_path' do
7
+ let(:remote_path) { double(Pathname) }
8
+
9
+ before { allow(remote_path).to receive(:delete) }
10
+ before { allow(remote_path).to receive(:write) }
11
+ before { allow(env).to receive(:remote_path).and_return remote_path }
12
+ end
13
+
14
+ shared_context 'fake pid_path' do
15
+ let(:pid_path) { double(Pathname) }
16
+
17
+ before { allow(pid_path).to receive(:write) }
18
+ before { allow(pid_path).to receive(:delete) }
19
+ before { allow(env).to receive(:pid_path).and_return pid_path }
20
+ end
21
+
22
+ shared_context 'fake tty' do
23
+ let(:tty) { "/dev/pts/#{rand(1..9)}" }
24
+
25
+ before { allow_any_instance_of(Hrk::Env).to receive(:`).and_return(tty) }
26
+ end
27
+
28
+ describe '#initialize' do
29
+ include_context 'fake tty'
30
+
31
+ subject!(:env) { Hrk::Env.new }
32
+
33
+ it { expect(env.tty_digest).to eq Digest::MD5.hexdigest(tty) }
34
+ end
35
+
36
+ describe '#cleanup!' do
37
+ include_context 'fake remote_path'
38
+ include_context 'fake pid_path'
39
+
40
+ let(:the_remote_pre_exist) { [true, false].sample }
41
+ let(:the_pid_pre_exist) { [true, false].sample }
42
+ before { allow(remote_path).to receive(:exist?).and_return the_remote_pre_exist }
43
+ before { allow(pid_path).to receive(:exist?).and_return the_pid_pre_exist }
44
+
45
+ before { env.cleanup! }
46
+
47
+ context 'the remote file pre-exists' do
48
+ let(:the_remote_pre_exist) { true }
49
+
50
+ it { expect(remote_path).to have_received(:delete) }
51
+ end
52
+
53
+ context 'the remote file does not pre-exists' do
54
+ let(:the_remote_pre_exist) { false }
55
+
56
+ it { expect(remote_path).not_to have_received(:delete) }
57
+ end
58
+
59
+ context 'the pid file pre-exists' do
60
+ let(:the_pid_pre_exist) { true }
61
+
62
+ it { expect(pid_path).to have_received(:delete) }
63
+ end
64
+
65
+ context 'the pid file does not pre-exists' do
66
+ let(:the_pid_pre_exist) { false }
67
+
68
+ it { expect(pid_path).not_to have_received(:delete) }
69
+ end
70
+ end
71
+
72
+ describe '#remote=' do
73
+ include_context 'fake remote_path'
74
+
75
+ let(:remote_arg) { "-#{%w(a r).sample}" }
76
+ let(:remote_name) { "remote##{rand(1..9)}" }
77
+
78
+ before { allow(env).to receive(:remote).and_return(previous_remote) }
79
+ before { allow(env).to receive(:schedule_cleanup!) }
80
+
81
+ before { env.remote = [remote_arg, remote_name] }
82
+
83
+ context 'no previous remote' do
84
+ let(:previous_remote) { nil }
85
+
86
+ it { expect(remote_path).to have_received(:write).with("#{remote_arg} #{remote_name}") }
87
+ end
88
+
89
+ context 'the previous remote is different' do
90
+ let(:previous_remote) { ['-r', 'previous'] }
91
+
92
+ it { expect(remote_path).to have_received(:write).with("#{remote_arg} #{remote_name}") }
93
+ it { expect(env).to have_received(:schedule_cleanup!) }
94
+ end
95
+
96
+ context 'the previous remote is identical' do
97
+ let(:previous_remote) { [remote_arg, remote_name] }
98
+
99
+ it { expect(remote_path).not_to have_received(:write) }
100
+ it { expect(env).to have_received(:schedule_cleanup!) }
101
+ end
102
+ end
103
+
104
+ describe '#remote' do
105
+ include_context 'fake remote_path'
106
+
107
+ before { allow(remote_path).to receive(:exist?).and_return it_pre_exist }
108
+ before { allow(remote_path).to receive(:read).and_return remote }
109
+
110
+ context 'no remote file exists' do
111
+ let(:it_pre_exist) { false }
112
+ let(:remote) { nil }
113
+
114
+ it { expect(env.remote).to eq nil }
115
+ end
116
+
117
+ context 'the remote file exists' do
118
+ let(:it_pre_exist) { true }
119
+ let(:remote_arg) { "-#{%w(a r).sample}" }
120
+ let(:remote_name) { "remote##{rand(1..9)}" }
121
+ let(:remote) { "#{remote_arg} #{remote_name}" }
122
+
123
+ it { expect(env.remote).to eq [remote_arg, remote_name] }
124
+ end
125
+ end
126
+
127
+ describe '#remote?' do
128
+ include_context 'fake remote_path'
129
+
130
+ before { allow(remote_path).to receive(:exist?).and_return it_pre_exist }
131
+
132
+ context 'the remote file exists' do
133
+ let(:it_pre_exist) { true }
134
+
135
+ it { expect(env.remote?).to eq true }
136
+ end
137
+
138
+ context 'the remote file does not exist' do
139
+ let(:it_pre_exist) { false }
140
+
141
+ it { expect(env.remote?).to eq false }
142
+ end
143
+ end
144
+
145
+ describe '#tmp_path' do
146
+ let(:some_dir) { Pathname.new "/some#{rand(1..9)}/fake/dir" }
147
+ before { allow(env).to receive(:tmp_dir).and_return(some_dir) }
148
+ before { allow_any_instance_of(Pathname).to receive(:exist?).and_return(it_pre_exist) }
149
+ before { allow(FileUtils).to receive(:mkdir_p) }
150
+
151
+ subject!(:path) { env.tmp_path }
152
+
153
+ context 'the path did not already exist' do
154
+ let(:it_pre_exist) { false }
155
+
156
+ it { expect(path).to eq Pathname.new("#{some_dir}/hrk") }
157
+ it { expect(FileUtils).to have_received(:mkdir_p).with(path) }
158
+ end
159
+
160
+ context 'the path did already exist' do
161
+ let(:it_pre_exist) { true }
162
+
163
+ it { expect(path).to eq Pathname.new("#{some_dir}/hrk") }
164
+ it { expect(FileUtils).not_to have_received(:mkdir_p) }
165
+ end
166
+ end
167
+
168
+ describe '#tmp_dir' do
169
+ let(:tmpdir) { "/another/silly/path#{rand(1..9)}" }
170
+ before { allow(Dir).to receive(:tmpdir).and_return(tmpdir) }
171
+ before { allow(ENV).to receive(:[]).with('XDG_RUNTIME_DIR').and_return(xdg_runtime_dir) }
172
+ context 'there is an XDG_RUNTIME_DIR in the ENV' do
173
+ let(:xdg_runtime_dir) { "/yet_again/a#{rand(1..9)}/folder" }
174
+
175
+ it { expect(env.tmp_dir).to eq Pathname.new(xdg_runtime_dir) }
176
+ end
177
+
178
+ context 'there is no XDG_RUNTIME_DIR in the ENV' do
179
+ let(:xdg_runtime_dir) { nil }
180
+
181
+ it { expect(env.tmp_dir).to eq Pathname.new(tmpdir) }
182
+ end
183
+ end
184
+
185
+ describe '#remote_path' do
186
+ include_context 'fake tty'
187
+
188
+ let(:some_dir) { Pathname.new "/and#{rand(1..9)}/another_/dir" }
189
+
190
+ before { allow(env).to receive(:tmp_path).and_return(Pathname.new(some_dir)) }
191
+
192
+ it { expect(env.remote_path).to eq Pathname.new("#{some_dir}/#{Digest::MD5.hexdigest(tty)}") }
193
+ end
194
+
195
+ describe '#cleanup_scheduled?' do
196
+ let(:pid) { rand(1000..99999) }
197
+ before { allow(env).to receive(:pid).and_return(pid) }
198
+ before { allow(env).to receive(:pid?).and_return(the_pid_exist) }
199
+
200
+ context 'there is no pid file' do
201
+ let(:the_pid_exist) { false }
202
+ let(:the_process_be_alive) { [false, true].sample }
203
+
204
+ it { expect(env.cleanup_scheduled?).to be_falsy }
205
+ end
206
+
207
+ context 'there is a pid file' do
208
+ let(:the_pid_exist) { true }
209
+
210
+ context 'the process is alived' do
211
+ let(:the_process_be_alive) { true }
212
+ before { allow(Process).to receive(:kill).with(0, pid).and_return(the_process_be_alive) }
213
+
214
+ it { expect(env.cleanup_scheduled?).to be_truthy }
215
+ end
216
+
217
+ context 'the process is dead' do
218
+ let(:the_process_be_alive) { false }
219
+ before { allow(Process).to receive(:kill).with(0, pid).and_raise(Errno::ESRCH) }
220
+
221
+ it { expect(env.cleanup_scheduled?).to be_falsy }
222
+ end
223
+ end
224
+ end
225
+
226
+ describe '#pid' do
227
+ include_context 'fake pid_path'
228
+
229
+ before { allow(pid_path).to receive(:exist?).and_return it_pre_exist }
230
+ before { allow(pid_path).to receive(:read).and_return pid }
231
+
232
+ context 'no pid file exists' do
233
+ let(:it_pre_exist) { false }
234
+ let(:pid) { nil }
235
+
236
+ it { expect(env.pid).to eq nil }
237
+ end
238
+
239
+ context 'the pid file exists' do
240
+ let(:it_pre_exist) { true }
241
+ let(:pid) { "#{rand(1000..99999)}" }
242
+
243
+ it { expect(env.pid).to eq pid.to_i }
244
+ end
245
+ end
246
+
247
+ describe '#pid?' do
248
+ include_context 'fake pid_path'
249
+
250
+ before { allow(pid_path).to receive(:exist?).and_return it_pre_exist }
251
+
252
+ context 'the pid file exists' do
253
+ let(:it_pre_exist) { true }
254
+
255
+ it { expect(env.pid?).to eq true }
256
+ end
257
+
258
+ context 'the pid file does not exist' do
259
+ let(:it_pre_exist) { false }
260
+
261
+ it { expect(env.pid?).to eq false }
262
+ end
263
+ end
264
+
265
+ describe '#pid=' do
266
+ let(:pid) { rand(1000..99999) }
267
+ include_context 'fake pid_path'
268
+
269
+ before { env.pid = pid }
270
+
271
+ it { expect(pid_path).to have_received(:write).with(pid) }
272
+ end
273
+
274
+ describe '#pid_path' do
275
+ include_context 'fake tty'
276
+
277
+ let(:some_dir) { Pathname.new "/and#{rand(1..9)}/another_/dir" }
278
+
279
+ before { allow(env).to receive(:tmp_path).and_return(Pathname.new(some_dir)) }
280
+
281
+ it { expect(env.pid_path).to eq Pathname.new("#{some_dir}/#{Digest::MD5.hexdigest(tty)}.pid") }
282
+ end
283
+ end
@@ -28,7 +28,7 @@ RSpec.describe Hrk::Execute::Command do
28
28
  end
29
29
 
30
30
  describe 'interactions' do
31
- before { command.call opt, remote, *args }
31
+ before { command.call(opt, remote, *args) }
32
32
 
33
33
  it { expect(Hrk::Heroku).to have_received(:new).with(opt, remote) }
34
34
  it { expect(heroku).to have_received(:call).with(*%w{whatever that:may -b}) }
@@ -46,9 +46,9 @@ RSpec.describe Hrk::Execute::Command do
46
46
 
47
47
  it { expect { command.call }.to raise_error ArgumentError }
48
48
  it { expect { command.call "parameterless-remote", *other_args }.to raise_error ArgumentError }
49
- it { expect { command.call *other_args }.to raise_error ArgumentError }
50
- it { expect { command.call *other_args, '-r' }.to raise_error ArgumentError }
51
- it { expect { command.call *other_args, '-a' }.to raise_error ArgumentError }
49
+ it { expect { command.call(*other_args) }.to raise_error ArgumentError }
50
+ it { expect { command.call(*other_args, '-r') }.to raise_error ArgumentError }
51
+ it { expect { command.call(*other_args, '-a') }.to raise_error ArgumentError }
52
52
  it { expect { command.call '-r', 'remote', *other_args, '-r', 'other-remote' }.to raise_error ArgumentError }
53
53
  it { expect { command.call '-r', 'remote', *other_args, '-a', 'app' }.to raise_error ArgumentError }
54
54
  it { expect { command.call '-a', 'app', *other_args, '-a', 'other-app' }.to raise_error ArgumentError }
@@ -94,7 +94,7 @@ RSpec.describe Hrk::Execute::Command do
94
94
  end
95
95
 
96
96
  describe 'interactions' do
97
- before { command.call *args }
97
+ before { command.call(*args) }
98
98
 
99
99
  it { expect(Hrk::Heroku).to have_received(:new).with('-r', previous_remote) }
100
100
  it { expect(heroku).to have_received(:call).with(*%w{whatever that:may -b}) }
@@ -107,12 +107,12 @@ RSpec.describe Hrk::Execute::Command do
107
107
  before { expect(heroku).not_to receive(:call) }
108
108
  before { expect(command.env).not_to receive(:remote=) }
109
109
 
110
- it { expect { command.call *other_args, '-r' }.to raise_error ArgumentError }
111
- it { expect { command.call *other_args, '-a' }.to raise_error ArgumentError }
112
- it { expect { command.call '-r', 'remote', *other_args, '-r', 'other-remote' }.to raise_error ArgumentError }
113
- it { expect { command.call '-r', 'remote', *other_args, '-a', 'app' }.to raise_error ArgumentError }
114
- it { expect { command.call '-a', 'app', *other_args, '-a', 'other-app' }.to raise_error ArgumentError }
115
- it { expect { command.call '-r', 'something', *other_args, '-a', 'something-else' }.to raise_error ArgumentError }
110
+ it { expect { command.call(*other_args, '-r') }.to raise_error ArgumentError }
111
+ it { expect { command.call(*other_args, '-a') }.to raise_error ArgumentError }
112
+ it { expect { command.call('-r', 'remote', *other_args, '-r', 'other-remote') }.to raise_error ArgumentError }
113
+ it { expect { command.call('-r', 'remote', *other_args, '-a', 'app') }.to raise_error ArgumentError }
114
+ it { expect { command.call('-a', 'app', *other_args, '-a', 'other-app') }.to raise_error ArgumentError }
115
+ it { expect { command.call('-r', 'something', *other_args, '-a', 'something-else') }.to raise_error ArgumentError }
116
116
  end
117
117
  end
118
118
  end
@@ -16,4 +16,13 @@ RSpec.describe Hrk::Execute do
16
16
  end
17
17
  end
18
18
  end
19
+
20
+ describe '.executer' do
21
+ let(:help) { double(Hrk::Execute::Help) }
22
+ let(:command) { double(Hrk::Execute::Command) }
23
+ before { allow(Hrk::Execute::Help).to receive(:new).with(command).and_return(help) }
24
+ before { allow(Hrk::Execute::Command).to receive(:new).and_return(command) }
25
+
26
+ it { expect(Hrk::Execute.executer).to eq help }
27
+ end
19
28
  end
@@ -7,7 +7,7 @@ RSpec.describe Hrk::Heroku do
7
7
  describe "calling '#{command.join ' '}' on remote '#{on_remote}', system" do
8
8
  subject(:heroku) { Hrk::Heroku.new(*on_remote) }
9
9
 
10
- before { heroku.call *command }
10
+ before { heroku.call(*command) }
11
11
 
12
12
  it { expect(heroku).to have_received(:system).with(*starts) }
13
13
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: hrk
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.8
4
+ version: 1.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Michel Belleville
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-01-07 00:00:00.000000000 Z
11
+ date: 2015-01-13 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rspec
@@ -128,6 +128,8 @@ files:
128
128
  - lib/hrk/execute/command.rb
129
129
  - lib/hrk/execute/help.rb
130
130
  - lib/hrk/heroku.rb
131
+ - lib/hrk/version.rb
132
+ - spec/hrk/env_spec.rb
131
133
  - spec/hrk/execute/command_spec.rb
132
134
  - spec/hrk/execute/help_spec.rb
133
135
  - spec/hrk/execute_spec.rb
@@ -156,5 +158,5 @@ rubyforge_project:
156
158
  rubygems_version: 2.2.2
157
159
  signing_key:
158
160
  specification_version: 4
159
- summary: Hrk remembers your heroku remotes
161
+ summary: Hrk remembers your heroku remotes for you.
160
162
  test_files: []