tmuxinator 0.9.0 → 0.10.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/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)
|