tmuxinator 0.9.0 → 0.10.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/bin/tmuxinator +1 -1
- data/lib/tmuxinator.rb +6 -7
- data/lib/tmuxinator/assets/sample.yml +13 -1
- data/lib/tmuxinator/assets/template-stop.erb +11 -0
- data/lib/tmuxinator/assets/template.erb +15 -1
- data/lib/tmuxinator/cli.rb +85 -15
- data/lib/tmuxinator/config.rb +74 -30
- data/lib/tmuxinator/deprecations.rb +8 -0
- data/lib/tmuxinator/doctor.rb +17 -0
- data/lib/tmuxinator/hooks.rb +14 -0
- data/lib/tmuxinator/hooks/project.rb +42 -0
- data/lib/tmuxinator/pane.rb +26 -18
- data/lib/tmuxinator/project.rb +113 -48
- data/lib/tmuxinator/version.rb +1 -1
- data/lib/tmuxinator/wemux_support.rb +18 -9
- data/lib/tmuxinator/window.rb +42 -26
- data/spec/fixtures/TMUXINATOR_CONFIG/TMUXINATOR_CONFIG.yml +0 -0
- data/spec/fixtures/dot-tmuxinator/both.yml +0 -0
- data/spec/fixtures/dot-tmuxinator/dup/local-dup.yml +0 -0
- data/spec/fixtures/dot-tmuxinator/home.yml +0 -0
- data/spec/fixtures/dot-tmuxinator/local-dup.yml +0 -0
- data/spec/fixtures/sample.yml +0 -1
- data/spec/fixtures/xdg-tmuxinator/both.yml +0 -0
- data/spec/fixtures/xdg-tmuxinator/xdg.yml +0 -0
- data/spec/lib/tmuxinator/cli_spec.rb +87 -13
- data/spec/lib/tmuxinator/config_spec.rb +163 -91
- data/spec/lib/tmuxinator/doctor_spec.rb +69 -0
- data/spec/lib/tmuxinator/hooks/project_spec.rb +63 -0
- data/spec/lib/tmuxinator/hooks_spec.rb +31 -0
- data/spec/lib/tmuxinator/pane_spec.rb +24 -1
- data/spec/lib/tmuxinator/project_spec.rb +58 -23
- data/spec/lib/tmuxinator/window_spec.rb +8 -6
- data/spec/spec_helper.rb +2 -1
- metadata +177 -7
data/lib/tmuxinator/window.rb
CHANGED
@@ -2,39 +2,53 @@ module Tmuxinator
|
|
2
2
|
class Window
|
3
3
|
include Tmuxinator::Util
|
4
4
|
|
5
|
-
attr_reader :
|
5
|
+
attr_reader :commands, :index, :name, :project
|
6
6
|
|
7
7
|
def initialize(window_yaml, index, project)
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
@
|
12
|
-
@panes = []
|
13
|
-
@synchronize = false
|
14
|
-
@layout = nil
|
15
|
-
@pre = nil
|
8
|
+
first_key = window_yaml.keys.first
|
9
|
+
|
10
|
+
@name = first_key.to_s.shellescape unless first_key.nil?
|
11
|
+
@yaml = window_yaml.values.first
|
16
12
|
@project = project
|
17
13
|
@index = index
|
14
|
+
@commands = build_commands(tmux_window_command_prefix, @yaml)
|
15
|
+
end
|
16
|
+
|
17
|
+
def panes
|
18
|
+
build_panes(yaml["panes"]) || []
|
19
|
+
end
|
18
20
|
|
19
|
-
|
21
|
+
def _hashed?
|
22
|
+
@yaml.is_a?(Hash)
|
23
|
+
end
|
20
24
|
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
@pre = value["pre"] if value["pre"]
|
25
|
-
@root = if value["root"]
|
26
|
-
File.expand_path(value["root"]).shellescape
|
27
|
-
elsif project.root?
|
28
|
-
project.root
|
29
|
-
end
|
25
|
+
def yaml
|
26
|
+
_hashed? ? @yaml : {}
|
27
|
+
end
|
30
28
|
|
31
|
-
|
32
|
-
|
29
|
+
def layout
|
30
|
+
yaml["layout"] ? yaml["layout"].shellescape : nil
|
31
|
+
end
|
33
32
|
|
34
|
-
|
33
|
+
def synchronize
|
34
|
+
yaml["synchronize"] || false
|
35
|
+
end
|
36
|
+
|
37
|
+
def root
|
38
|
+
_yaml_root || _project_root
|
39
|
+
end
|
40
|
+
|
41
|
+
def _yaml_root
|
42
|
+
File.expand_path(yaml["root"]).shellescape if yaml["root"]
|
43
|
+
end
|
44
|
+
|
45
|
+
def _project_root
|
46
|
+
project.root if project.root?
|
35
47
|
end
|
36
48
|
|
37
49
|
def build_panes(panes_yml)
|
50
|
+
return if panes_yml.nil?
|
51
|
+
|
38
52
|
Array(panes_yml).map.with_index do |pane_yml, index|
|
39
53
|
commands = case pane_yml
|
40
54
|
when Hash
|
@@ -62,10 +76,12 @@ module Tmuxinator
|
|
62
76
|
end
|
63
77
|
|
64
78
|
def pre
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
79
|
+
_pre = yaml["pre"]
|
80
|
+
|
81
|
+
if _pre.is_a?(Array)
|
82
|
+
_pre.join(" && ")
|
83
|
+
elsif _pre.is_a?(String)
|
84
|
+
_pre
|
69
85
|
end
|
70
86
|
end
|
71
87
|
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
data/spec/fixtures/sample.yml
CHANGED
@@ -4,7 +4,6 @@
|
|
4
4
|
name: sample
|
5
5
|
root: ~/test
|
6
6
|
socket_name: foo # Remove to use default socket
|
7
|
-
pre: sudo /etc/rc.d/mysqld start # Runs before everything
|
8
7
|
pre_window: rbenv shell 2.0.0-p247 # Runs in each tab and pane
|
9
8
|
tmux_options: -f ~/.tmux.mac.conf # Pass arguments to tmux
|
10
9
|
tmux_detached: false
|
File without changes
|
File without changes
|
@@ -1,4 +1,5 @@
|
|
1
1
|
require "spec_helper"
|
2
|
+
|
2
3
|
describe Tmuxinator::Cli do
|
3
4
|
let(:cli) { Tmuxinator::Cli }
|
4
5
|
|
@@ -73,7 +74,7 @@ describe Tmuxinator::Cli do
|
|
73
74
|
end
|
74
75
|
|
75
76
|
it "accepts a flag for alternate name" do
|
76
|
-
ARGV.replace(["start", "foo" "--name=bar"])
|
77
|
+
ARGV.replace(["start", "foo", "--name=bar"])
|
77
78
|
|
78
79
|
expect(Kernel).to receive(:exec)
|
79
80
|
capture_io { cli.start }
|
@@ -231,16 +232,16 @@ describe Tmuxinator::Cli do
|
|
231
232
|
end
|
232
233
|
end
|
233
234
|
|
234
|
-
context "
|
235
|
-
let(:
|
235
|
+
context "file exists" do
|
236
|
+
let(:project_path) { Tmuxinator::Config.project(name).to_s }
|
236
237
|
|
237
238
|
before do
|
238
239
|
allow(File).to receive(:exist?).with(anything).and_return(false)
|
239
|
-
expect(File).to receive(:exist?).with(
|
240
|
+
expect(File).to receive(:exist?).with(project_path).and_return(true)
|
240
241
|
end
|
241
242
|
|
242
243
|
it "just opens the file" do
|
243
|
-
expect(Kernel).to receive(:system).with(%r{#{
|
244
|
+
expect(Kernel).to receive(:system).with(%r{#{project_path}})
|
244
245
|
capture_io { cli.start }
|
245
246
|
end
|
246
247
|
end
|
@@ -264,7 +265,7 @@ describe Tmuxinator::Cli do
|
|
264
265
|
end
|
265
266
|
end
|
266
267
|
|
267
|
-
context "
|
268
|
+
context "file exists" do
|
268
269
|
let(:path) { Tmuxinator::Config::LOCAL_DEFAULT }
|
269
270
|
before do
|
270
271
|
expect(File).to receive(:exist?).with(path) { true }
|
@@ -276,6 +277,62 @@ describe Tmuxinator::Cli do
|
|
276
277
|
end
|
277
278
|
end
|
278
279
|
end
|
280
|
+
|
281
|
+
# this command variant only works for tmux version 1.6 and up.
|
282
|
+
context "from a session" do
|
283
|
+
context "with tmux >= 1.6", if: Tmuxinator::Config.version >= 1.6 do
|
284
|
+
before do
|
285
|
+
# Necessary to make `Doctor.installed?` work in specs
|
286
|
+
allow(Tmuxinator::Doctor).to receive(:installed?).and_return(true)
|
287
|
+
end
|
288
|
+
|
289
|
+
context "session exists" do
|
290
|
+
before(:all) do
|
291
|
+
# Can't add variables through `let` in `before :all`.
|
292
|
+
@session = "for-testing-tmuxinator"
|
293
|
+
# Pass the -d option, so that the session is not attached.
|
294
|
+
Kernel.system "tmux new-session -d -s #{@session}"
|
295
|
+
end
|
296
|
+
|
297
|
+
before do
|
298
|
+
ARGV.replace ["new", name, @session]
|
299
|
+
end
|
300
|
+
|
301
|
+
after(:all) do
|
302
|
+
puts @session
|
303
|
+
Kernel.system "tmux kill-session -t #{@session}"
|
304
|
+
end
|
305
|
+
|
306
|
+
it "creates a project file" do
|
307
|
+
capture_io { cli.start }
|
308
|
+
expect(file.string).to_not be_empty
|
309
|
+
# make sure the output is valid YAML
|
310
|
+
expect { YAML.parse file.string }.to_not raise_error
|
311
|
+
end
|
312
|
+
end
|
313
|
+
|
314
|
+
context "session doesn't exist" do
|
315
|
+
before do
|
316
|
+
ARGV.replace ["new", name, "sessiondoesnotexist"]
|
317
|
+
end
|
318
|
+
|
319
|
+
it "fails" do
|
320
|
+
expect { cli.start }.to raise_error RuntimeError
|
321
|
+
end
|
322
|
+
end
|
323
|
+
end
|
324
|
+
|
325
|
+
context "with tmux < 1.6" do
|
326
|
+
before do
|
327
|
+
ARGV.replace ["new", name, "sessionname"]
|
328
|
+
allow(Tmuxinator::Config).to receive(:version).and_return(1.5)
|
329
|
+
end
|
330
|
+
|
331
|
+
it "is unsupported" do
|
332
|
+
expect { cli.start }.to raise_error RuntimeError
|
333
|
+
end
|
334
|
+
end
|
335
|
+
end
|
279
336
|
end
|
280
337
|
|
281
338
|
describe "#copy" do
|
@@ -295,7 +352,7 @@ describe Tmuxinator::Cli do
|
|
295
352
|
end
|
296
353
|
end
|
297
354
|
|
298
|
-
context "existing project
|
355
|
+
context "existing project doesn't exist" do
|
299
356
|
before do
|
300
357
|
allow(Tmuxinator::Config).to receive(:exists?) { false }
|
301
358
|
end
|
@@ -444,10 +501,27 @@ describe Tmuxinator::Cli do
|
|
444
501
|
capture_io { cli.start }
|
445
502
|
end
|
446
503
|
|
447
|
-
it "deletes
|
448
|
-
|
504
|
+
it "deletes the configuration directory(s)" do
|
505
|
+
allow(Tmuxinator::Config).to receive(:directories) \
|
506
|
+
{ [Tmuxinator::Config.xdg, Tmuxinator::Config.home] }
|
507
|
+
expect(FileUtils).to receive(:remove_dir).once.
|
508
|
+
with(Tmuxinator::Config.xdg)
|
509
|
+
expect(FileUtils).to receive(:remove_dir).once.
|
510
|
+
with(Tmuxinator::Config.home)
|
511
|
+
expect(FileUtils).to receive(:remove_dir).never
|
449
512
|
capture_io { cli.start }
|
450
513
|
end
|
514
|
+
|
515
|
+
context "$TMUXINATOR_CONFIG specified" do
|
516
|
+
it "only deletes projects in that directory" do
|
517
|
+
allow(ENV).to receive(:[]).and_call_original
|
518
|
+
allow(ENV).to receive(:[]).with("TMUXINATOR_CONFIG").and_return "dir"
|
519
|
+
allow(File).to receive(:directory?).with("dir").and_return true
|
520
|
+
expect(FileUtils).to receive(:remove_dir).once.with("dir")
|
521
|
+
expect(FileUtils).to receive(:remove_dir).never
|
522
|
+
capture_io { cli.start }
|
523
|
+
end
|
524
|
+
end
|
451
525
|
end
|
452
526
|
|
453
527
|
describe "#list" do
|
@@ -478,9 +552,9 @@ describe Tmuxinator::Cli do
|
|
478
552
|
end
|
479
553
|
|
480
554
|
it "checks requirements" do
|
481
|
-
expect(Tmuxinator::
|
482
|
-
expect(Tmuxinator::
|
483
|
-
expect(Tmuxinator::
|
555
|
+
expect(Tmuxinator::Doctor).to receive(:installed?)
|
556
|
+
expect(Tmuxinator::Doctor).to receive(:editor?)
|
557
|
+
expect(Tmuxinator::Doctor).to receive(:shell?)
|
484
558
|
capture_io { cli.start }
|
485
559
|
end
|
486
560
|
end
|
@@ -571,7 +645,7 @@ describe Tmuxinator::Cli do
|
|
571
645
|
subject { described_class.new.create_project(params) }
|
572
646
|
|
573
647
|
before do
|
574
|
-
allow(Tmuxinator::Config).to receive_messages(
|
648
|
+
allow(Tmuxinator::Config).to receive_messages(directory: path)
|
575
649
|
end
|
576
650
|
|
577
651
|
it_should_behave_like :a_proper_project
|
@@ -1,9 +1,133 @@
|
|
1
1
|
require "spec_helper"
|
2
2
|
|
3
3
|
describe Tmuxinator::Config do
|
4
|
-
|
5
|
-
|
6
|
-
|
4
|
+
let(:fixtures_dir) { File.expand_path("../../../fixtures/", __FILE__) }
|
5
|
+
let(:xdg_config_dir) { "#{fixtures_dir}/xdg-tmuxinator" }
|
6
|
+
let(:home_config_dir) { "#{fixtures_dir}/dot-tmuxinator" }
|
7
|
+
|
8
|
+
describe "#directory" do
|
9
|
+
context "environment variable $TMUXINATOR_CONFIG non-blank" do
|
10
|
+
it "is $TMUXINATOR_CONFIG" do
|
11
|
+
allow(ENV).to receive(:[]).with("TMUXINATOR_CONFIG").
|
12
|
+
and_return "expected"
|
13
|
+
allow(File).to receive(:directory?).and_return true
|
14
|
+
expect(Tmuxinator::Config.directory).to eq "expected"
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
context "only ~/.tmuxinator exists" do
|
19
|
+
it "is ~/.tmuxinator" do
|
20
|
+
allow(File).to receive(:directory?).
|
21
|
+
with(Tmuxinator::Config.environment).and_return false
|
22
|
+
allow(File).to receive(:directory?).
|
23
|
+
with(Tmuxinator::Config.xdg).and_return false
|
24
|
+
allow(File).to receive(:directory?).
|
25
|
+
with(Tmuxinator::Config.home).and_return true
|
26
|
+
expect(Tmuxinator::Config.directory).to eq Tmuxinator::Config.home
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
context "only $XDG_CONFIG_HOME/tmuxinator exists" do
|
31
|
+
it "is #xdg" do
|
32
|
+
allow(File).to receive(:directory?).
|
33
|
+
with(Tmuxinator::Config.environment).and_return false
|
34
|
+
allow(File).to receive(:directory?).
|
35
|
+
with(Tmuxinator::Config.xdg).and_return true
|
36
|
+
allow(File).to receive(:directory?).
|
37
|
+
with(Tmuxinator::Config.home).and_return false
|
38
|
+
expect(Tmuxinator::Config.directory).to eq Tmuxinator::Config.xdg
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
context "both $XDG_CONFIG_HOME/tmuxinator and ~/.tmuxinator exist" do
|
43
|
+
it "is #xdg" do
|
44
|
+
allow(File).to receive(:directory?).
|
45
|
+
with(Tmuxinator::Config.environment).and_return false
|
46
|
+
allow(File).to receive(:directory?).
|
47
|
+
with(Tmuxinator::Config.xdg).and_return true
|
48
|
+
allow(File).to receive(:directory?).
|
49
|
+
with(Tmuxinator::Config.home).and_return true
|
50
|
+
expect(Tmuxinator::Config.directory).to eq Tmuxinator::Config.xdg
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
context "parent directory(s) do not exist" do
|
55
|
+
it "creates parent directories if required" do
|
56
|
+
allow(File).to receive(:directory?).and_call_original
|
57
|
+
allow(File).to receive(:directory?).with(Tmuxinator::Config.home).
|
58
|
+
and_return false
|
59
|
+
Dir.mktmpdir do |dir|
|
60
|
+
config_parent = "#{dir}/non_existant_parent/s"
|
61
|
+
allow(XDG).to receive(:[]).with("CONFIG").and_return config_parent
|
62
|
+
expect(Tmuxinator::Config.directory).
|
63
|
+
to eq "#{config_parent}/tmuxinator"
|
64
|
+
expect(File.directory?("#{config_parent}/tmuxinator")).to be true
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
describe "#enviroment" do
|
71
|
+
context "environment variable $TMUXINATOR_CONFIG is not empty" do
|
72
|
+
it "is $TMUXINATOR_CONFIG" do
|
73
|
+
allow(ENV).to receive(:[]).with("TMUXINATOR_CONFIG").
|
74
|
+
and_return "expected"
|
75
|
+
# allow(XDG).to receive(:[]).with("CONFIG").and_return "expected"
|
76
|
+
allow(File).to receive(:directory?).and_return true
|
77
|
+
expect(Tmuxinator::Config.environment).to eq "expected"
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
81
|
+
context "environment variable $TMUXINATOR_CONFIG is nil" do
|
82
|
+
it "is an empty string" do
|
83
|
+
allow(ENV).to receive(:[]).with("TMUXINATOR_CONFIG").
|
84
|
+
and_return nil
|
85
|
+
# allow(XDG).to receive(:[]).with("CONFIG").and_return nil
|
86
|
+
allow(File).to receive(:directory?).and_return true
|
87
|
+
expect(Tmuxinator::Config.environment).to eq ""
|
88
|
+
end
|
89
|
+
end
|
90
|
+
|
91
|
+
context "environment variable $TMUXINATOR_CONFIG is set and empty" do
|
92
|
+
it "is an empty string" do
|
93
|
+
allow(XDG).to receive(:[]).with("CONFIG").and_return ""
|
94
|
+
expect(Tmuxinator::Config.environment).to eq ""
|
95
|
+
end
|
96
|
+
end
|
97
|
+
end
|
98
|
+
|
99
|
+
describe "#directories" do
|
100
|
+
it "is empty if no configuration directories exist" do
|
101
|
+
allow(File).to receive(:directory?).and_return false
|
102
|
+
expect(Tmuxinator::Config.directories).to eq []
|
103
|
+
end
|
104
|
+
|
105
|
+
it "is only [$TMUXINATOR_CONFIG] if set" do
|
106
|
+
allow(ENV).to receive(:[]).with("TMUXINATOR_CONFIG").
|
107
|
+
and_return "expected"
|
108
|
+
allow(File).to receive(:directory?).and_return true
|
109
|
+
expect(Tmuxinator::Config.directories).to eq ["expected"]
|
110
|
+
end
|
111
|
+
|
112
|
+
it "contains #xdg before #home" do
|
113
|
+
allow(File).to receive(:directory?).with(Tmuxinator::Config.xdg).
|
114
|
+
and_return true
|
115
|
+
allow(File).to receive(:directory?).with(Tmuxinator::Config.home).
|
116
|
+
and_return true
|
117
|
+
expect(Tmuxinator::Config.directories).to eq \
|
118
|
+
[Tmuxinator::Config.xdg, Tmuxinator::Config.home]
|
119
|
+
end
|
120
|
+
end
|
121
|
+
|
122
|
+
describe "#home" do
|
123
|
+
it "is ~/.tmuxinator" do
|
124
|
+
expect(Tmuxinator::Config.home).to eq "#{ENV['HOME']}/.tmuxinator"
|
125
|
+
end
|
126
|
+
end
|
127
|
+
|
128
|
+
describe "#xdg" do
|
129
|
+
it "is $XDG_CONFIG_HOME/tmuxinator" do
|
130
|
+
expect(Tmuxinator::Config.xdg).to eq "#{XDG['CONFIG_HOME']}/tmuxinator"
|
7
131
|
end
|
8
132
|
end
|
9
133
|
|
@@ -42,7 +166,7 @@ describe Tmuxinator::Config do
|
|
42
166
|
end
|
43
167
|
|
44
168
|
describe "#default?" do
|
45
|
-
let(:
|
169
|
+
let(:directory) { Tmuxinator::Config.directory }
|
46
170
|
let(:local_default) { Tmuxinator::Config::LOCAL_DEFAULT }
|
47
171
|
let(:proj_default) { Tmuxinator::Config.default }
|
48
172
|
|
@@ -71,77 +195,19 @@ describe Tmuxinator::Config do
|
|
71
195
|
|
72
196
|
describe "#configs" do
|
73
197
|
before do
|
74
|
-
allow(
|
75
|
-
|
76
|
-
|
77
|
-
it "gets a list of all projects" do
|
78
|
-
expect(Tmuxinator::Config.configs).to include("test")
|
79
|
-
end
|
80
|
-
end
|
81
|
-
|
82
|
-
describe "#installed?" do
|
83
|
-
context "tmux is installed" do
|
84
|
-
before do
|
85
|
-
allow(Kernel).to receive(:system) { true }
|
86
|
-
end
|
87
|
-
|
88
|
-
it "returns true" do
|
89
|
-
expect(Tmuxinator::Config.installed?).to be_truthy
|
90
|
-
end
|
91
|
-
end
|
92
|
-
|
93
|
-
context "tmux is not installed" do
|
94
|
-
before do
|
95
|
-
allow(Kernel).to receive(:system) { false }
|
96
|
-
end
|
97
|
-
|
98
|
-
it "returns true" do
|
99
|
-
expect(Tmuxinator::Config.installed?).to be_falsey
|
100
|
-
end
|
101
|
-
end
|
102
|
-
end
|
103
|
-
|
104
|
-
describe "#editor?" do
|
105
|
-
context "$EDITOR is set" do
|
106
|
-
before do
|
107
|
-
allow(ENV).to receive(:[]).with("EDITOR") { "vim" }
|
108
|
-
end
|
109
|
-
|
110
|
-
it "returns true" do
|
111
|
-
expect(Tmuxinator::Config.editor?).to be_truthy
|
112
|
-
end
|
113
|
-
end
|
114
|
-
|
115
|
-
context "$EDITOR is not set" do
|
116
|
-
before do
|
117
|
-
allow(ENV).to receive(:[]).with("EDITOR") { nil }
|
118
|
-
end
|
119
|
-
|
120
|
-
it "returns false" do
|
121
|
-
expect(Tmuxinator::Config.editor?).to be_falsey
|
122
|
-
end
|
198
|
+
allow(Tmuxinator::Config).to receive_messages(xdg: xdg_config_dir)
|
199
|
+
allow(Tmuxinator::Config).to receive_messages(home: home_config_dir)
|
123
200
|
end
|
124
|
-
end
|
125
|
-
|
126
|
-
describe "#shell?" do
|
127
|
-
context "$SHELL is set" do
|
128
|
-
before do
|
129
|
-
allow(ENV).to receive(:[]).with("SHELL") { "vim" }
|
130
|
-
end
|
131
201
|
|
132
|
-
|
133
|
-
|
134
|
-
|
202
|
+
it "gets a sorted list of all projects" do
|
203
|
+
expect(Tmuxinator::Config.configs).
|
204
|
+
to eq ["both", "both", "dup/local-dup", "home", "local-dup", "xdg"]
|
135
205
|
end
|
136
206
|
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
it "returns false" do
|
143
|
-
expect(Tmuxinator::Config.shell?).to be_falsey
|
144
|
-
end
|
207
|
+
it "lists only projects in $TMUXINATOR_CONFIG when set" do
|
208
|
+
allow(ENV).to receive(:[]).with("TMUXINATOR_CONFIG").
|
209
|
+
and_return "#{fixtures_dir}/TMUXINATOR_CONFIG"
|
210
|
+
expect(Tmuxinator::Config.configs).to eq ["TMUXINATOR_CONFIG"]
|
145
211
|
end
|
146
212
|
end
|
147
213
|
|
@@ -156,24 +222,31 @@ describe Tmuxinator::Config do
|
|
156
222
|
end
|
157
223
|
end
|
158
224
|
|
159
|
-
describe "#
|
160
|
-
let(:
|
161
|
-
let(:base) { "#{
|
225
|
+
describe "#global_project" do
|
226
|
+
let(:directory) { Tmuxinator::Config.directory }
|
227
|
+
let(:base) { "#{directory}/sample.yml" }
|
228
|
+
let(:first_dup) { "#{home_config_dir}/dup/local-dup.yml" }
|
162
229
|
|
163
230
|
before do
|
164
|
-
|
165
|
-
allow(Tmuxinator::Config).to receive_messages(
|
231
|
+
allow(Tmuxinator::Config).to receive_messages(xdg: fixtures_dir)
|
232
|
+
allow(Tmuxinator::Config).to receive_messages(home: fixtures_dir)
|
166
233
|
end
|
167
234
|
|
168
235
|
context "with project yml" do
|
169
236
|
it "gets the project as path to the yml file" do
|
170
|
-
expect(Tmuxinator::Config.
|
237
|
+
expect(Tmuxinator::Config.global_project("sample")).to eq base
|
171
238
|
end
|
172
239
|
end
|
173
240
|
|
174
241
|
context "without project yml" do
|
175
242
|
it "gets the project as path to the yml file" do
|
176
|
-
expect(Tmuxinator::Config.
|
243
|
+
expect(Tmuxinator::Config.global_project("new-project")).to be_nil
|
244
|
+
end
|
245
|
+
end
|
246
|
+
|
247
|
+
context "with duplicate project files" do
|
248
|
+
it "is the first .yml file found" do
|
249
|
+
expect(Tmuxinator::Config.global_project("local-dup")).to eq first_dup
|
177
250
|
end
|
178
251
|
end
|
179
252
|
end
|
@@ -186,39 +259,39 @@ describe Tmuxinator::Config do
|
|
186
259
|
end
|
187
260
|
end
|
188
261
|
|
189
|
-
describe "#
|
262
|
+
describe "#local_project" do
|
190
263
|
let(:default) { Tmuxinator::Config::LOCAL_DEFAULT }
|
191
264
|
|
192
265
|
context "with a project yml" do
|
193
266
|
it "gets the project as path to the yml file" do
|
194
267
|
expect(File).to receive(:exist?).with(default) { true }
|
195
|
-
expect(Tmuxinator::Config.
|
268
|
+
expect(Tmuxinator::Config.local_project).to eq default
|
196
269
|
end
|
197
270
|
end
|
198
271
|
|
199
272
|
context "without project yml" do
|
200
273
|
it "gets the project as path to the yml file" do
|
201
|
-
expect(Tmuxinator::Config.
|
274
|
+
expect(Tmuxinator::Config.local_project).to be_nil
|
202
275
|
end
|
203
276
|
end
|
204
277
|
end
|
205
278
|
|
206
279
|
describe "#project" do
|
207
|
-
let(:
|
208
|
-
let(:path) { File.expand_path("../../../fixtures/", __FILE__) }
|
280
|
+
let(:directory) { Tmuxinator::Config.directory }
|
209
281
|
let(:default) { Tmuxinator::Config::LOCAL_DEFAULT }
|
210
282
|
|
211
|
-
context "with project yml
|
283
|
+
context "with an non-local project yml" do
|
212
284
|
before do
|
213
|
-
allow(Tmuxinator::Config).to receive_messages(
|
285
|
+
allow(Tmuxinator::Config).to receive_messages(directory: fixtures_dir)
|
214
286
|
end
|
215
287
|
|
216
288
|
it "gets the project as path to the yml file" do
|
217
|
-
expect(Tmuxinator::Config.project("sample")).
|
289
|
+
expect(Tmuxinator::Config.project("sample")).
|
290
|
+
to eq "#{directory}/sample.yml"
|
218
291
|
end
|
219
292
|
end
|
220
293
|
|
221
|
-
context "with a local project, but no project
|
294
|
+
context "with a local project, but no global project" do
|
222
295
|
it "gets the project as path to the yml file" do
|
223
296
|
expect(File).to receive(:exist?).with(default) { true }
|
224
297
|
expect(Tmuxinator::Config.project("sample")).to eq "./.tmuxinator.yml"
|
@@ -226,7 +299,7 @@ describe Tmuxinator::Config do
|
|
226
299
|
end
|
227
300
|
|
228
301
|
context "without project yml" do
|
229
|
-
let(:expected) { "#{
|
302
|
+
let(:expected) { "#{directory}/new-project.yml" }
|
230
303
|
it "gets the project as path to the yml file" do
|
231
304
|
expect(Tmuxinator::Config.project("new-project")).to eq expected
|
232
305
|
end
|
@@ -234,7 +307,6 @@ describe Tmuxinator::Config do
|
|
234
307
|
end
|
235
308
|
|
236
309
|
describe "#validate" do
|
237
|
-
let(:path) { File.expand_path("../../../fixtures", __FILE__) }
|
238
310
|
let(:default) { Tmuxinator::Config::LOCAL_DEFAULT }
|
239
311
|
|
240
312
|
context "when a project name is provided" do
|
@@ -245,7 +317,7 @@ describe Tmuxinator::Config do
|
|
245
317
|
end
|
246
318
|
|
247
319
|
it "should load and validate the project" do
|
248
|
-
expect(Tmuxinator::Config).to receive_messages(
|
320
|
+
expect(Tmuxinator::Config).to receive_messages(directory: fixtures_dir)
|
249
321
|
expect(Tmuxinator::Config.validate(name: "sample")).to \
|
250
322
|
be_a Tmuxinator::Project
|
251
323
|
end
|
@@ -260,7 +332,7 @@ describe Tmuxinator::Config do
|
|
260
332
|
end
|
261
333
|
|
262
334
|
it "should load and validate the project" do
|
263
|
-
content = File.read(File.join(
|
335
|
+
content = File.read(File.join(fixtures_dir, "sample.yml"))
|
264
336
|
|
265
337
|
expect(File).to receive(:exist?).with(default).at_least(:once) { true }
|
266
338
|
expect(File).to receive(:read).with(default).and_return(content)
|