tmuxinator 0.11.2 → 0.11.3

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 0cdcb7955b473280b53c285478cc53101e1879c2aae780b38b06a920662a98e2
4
- data.tar.gz: 2a9a7c13e4c62a53bdda0424287091f41e32066e5fc12e830b13a6e5fa6c5ca5
3
+ metadata.gz: 67d2add167813b344a5424b97ac84bb6b726165d52a071bacc1864ddbbd06eae
4
+ data.tar.gz: 8c48ba6566bf06b8168b83b87144fb47c7b879d88f419cd45bb113a4231c7615
5
5
  SHA512:
6
- metadata.gz: cd0d3a92543c61cc04aefb49fa51b7d4b9134db4f9a5f48d2654b5a5807d35cec8db3506243fa1608706e3266e6a9db0067a791c54969621bc2ebabad6926a45
7
- data.tar.gz: 373b41ba0664625cb2f1f36d483068bb959b1c71a6411d731358b153f8dc79dbc918b44dcb23b6511bd1c9957544fd19587c035b3319a2a956465cf5f7e0d054
6
+ metadata.gz: 9440f1aad417be22cb857a9b5854fec445bd46b4ef9540bb70b70550ff43f335ecef26b4b9ffb6d126124790589df5a39b676fcc41d43ffa229c68d0e3f6122c
7
+ data.tar.gz: 6150cea906e82d4f7038cb5ec383930c5e1d293801c92e807c97b0f2468448849fa451c988d32880ecec2812062581bf0306711b56ed9fecd7743c88bc615e80
@@ -4,13 +4,4 @@ $:.unshift File.expand_path("../../lib/", __FILE__)
4
4
  require "thor"
5
5
  require "tmuxinator"
6
6
 
7
- name = ARGV[0] || nil
8
-
9
- if ARGV.empty? && Tmuxinator::Config.local?
10
- Tmuxinator::Cli.new.local
11
- elsif name && !Tmuxinator::Cli::COMMANDS.keys.include?(name.to_sym) &&
12
- Tmuxinator::Config.exists?(name: name)
13
- Tmuxinator::Cli.new.start(name, *ARGV.drop(1))
14
- else
15
- Tmuxinator::Cli.start
16
- end
7
+ Tmuxinator::Cli.bootstrap ARGV
@@ -1,4 +1,4 @@
1
- # ~/.tmuxinator/<%= name %>.yml
1
+ # <%= path %>
2
2
 
3
3
  name: <%= name %>
4
4
  root: ~/
@@ -34,6 +34,17 @@ module Tmuxinator
34
34
  list: "Lists all tmuxinator projects"
35
35
  }.freeze
36
36
 
37
+ # For future reference: due to how tmuxinator currently consumes
38
+ # command-line arguments (see ::bootstrap, below), invocations of Thor's
39
+ # base commands (i.e. 'help', etc) can be instead routed to #start (rather
40
+ # than to ::start). In order to prevent this, the THOR_COMMANDS and
41
+ # RESERVED_COMMANDS constants have been introduced. The former enumerates
42
+ # any/all Thor commands we want to insure get passed through to Thor.start.
43
+ # The latter is the superset of the Thor commands and any tmuxinator
44
+ # commands, defined in COMMANDS, above.
45
+ THOR_COMMANDS = %w[-v help].freeze
46
+ RESERVED_COMMANDS = (COMMANDS.keys + THOR_COMMANDS).map(&:to_s).freeze
47
+
37
48
  package_name "tmuxinator" \
38
49
  unless Gem::Version.create(Thor::VERSION) < Gem::Version.create("0.18")
39
50
 
@@ -344,5 +355,25 @@ module Tmuxinator
344
355
  say "Checking if $SHELL is set ==> "
345
356
  yes_no Tmuxinator::Doctor.shell?
346
357
  end
358
+
359
+ # This method was defined as something of a workaround... Previously
360
+ # the conditional contained within was in the executable (i.e.
361
+ # bin/tmuxinator). It has been moved here so as to be testable. A couple
362
+ # of notes:
363
+ # - ::start (defined in Thor::Base) expects the first argument to be an
364
+ # array or ARGV, not a varargs. Perhaps ::bootstrap should as well?
365
+ # - ::start has a different purpose from #start and hence a different
366
+ # signature
367
+ def self.bootstrap(args = [])
368
+ name = args[0] || nil
369
+ if args.empty? && Tmuxinator::Config.local?
370
+ Tmuxinator::Cli.new.local
371
+ elsif name && !Tmuxinator::Cli::RESERVED_COMMANDS.include?(name) &&
372
+ Tmuxinator::Config.exists?(name: name)
373
+ Tmuxinator::Cli.new.start(name, *args.drop(1))
374
+ else
375
+ Tmuxinator::Cli.start(args)
376
+ end
377
+ end
347
378
  end
348
379
  end
@@ -1,3 +1,3 @@
1
1
  module Tmuxinator
2
- VERSION = "0.11.2".freeze
2
+ VERSION = "0.11.3".freeze
3
3
  end
@@ -1,6 +1,28 @@
1
1
  require "spec_helper"
2
2
 
3
3
  describe Tmuxinator::Cli do
4
+ shared_context :local_project_setup do
5
+ let(:local_project_config) { ".tmuxinator.yml" }
6
+ let(:content_fixture) { "../../fixtures/sample.yml" }
7
+ let(:content_relpath) { File.join(File.dirname(__FILE__), content_fixture) }
8
+ let(:content_path) { File.expand_path(content_relpath) }
9
+ let(:content) { File.read(content_path) }
10
+ let(:working_dir) { FileUtils.pwd }
11
+ let(:local_project_relpath) { File.join(working_dir, local_project_config) }
12
+ let(:local_project_path) { File.expand_path(local_project_relpath) }
13
+
14
+ before do
15
+ File.new(local_project_path, "w").tap do |f|
16
+ f.write content
17
+ end.close
18
+ expect(File.exists?(local_project_path)).to be_truthy
19
+ expect(File.read(local_project_path)).to eq content
20
+ end
21
+
22
+ after do
23
+ File.delete(local_project_path)
24
+ end
25
+ end
4
26
  let(:cli) { Tmuxinator::Cli }
5
27
 
6
28
  before do
@@ -18,6 +40,128 @@ describe Tmuxinator::Cli do
18
40
  end
19
41
  end
20
42
 
43
+ context "base thor functionality" do
44
+ shared_examples_for :base_thor_functionality do
45
+ it "supports -v" do
46
+ out, err = capture_io { cli.bootstrap(["-v"]) }
47
+ expect(err).to eq ""
48
+ expect(out).to include(Tmuxinator::VERSION)
49
+ end
50
+
51
+ it "supports help" do
52
+ out, err = capture_io { cli.bootstrap(["help"]) }
53
+ expect(err).to eq ""
54
+ expect(out).to include("tmuxinator commands:")
55
+ end
56
+ end
57
+
58
+ it_should_behave_like :base_thor_functionality
59
+
60
+ context "with a local project config" do
61
+ include_context :local_project_setup
62
+
63
+ it_should_behave_like :base_thor_functionality
64
+ end
65
+ end
66
+
67
+ describe "::bootstrap" do
68
+ subject { cli.bootstrap(args) }
69
+ let(:args) { [] }
70
+
71
+ shared_examples_for :bootstrap_with_arguments do
72
+ let(:args) { [arg1] }
73
+
74
+ context "and the first arg is a tmuxinator command" do
75
+ let(:arg1) { "list" }
76
+
77
+ it "should call ::start" do
78
+ expect(cli).to receive(:start).with(args)
79
+ subject
80
+ end
81
+ end
82
+
83
+ context "and the first arg is" do
84
+ let(:arg1) { "sample" }
85
+
86
+ context "a tmuxinator project name" do
87
+ before do
88
+ expect(Tmuxinator::Config).to \
89
+ receive(:exists?).with(name: arg1) { true }
90
+ end
91
+
92
+ it "should call #start" do
93
+ instance = instance_double(cli)
94
+ expect(cli).to receive(:new).and_return(instance)
95
+ expect(instance).to receive(:start).with(*args)
96
+ subject
97
+ end
98
+ end
99
+
100
+ context "a thor command" do
101
+ context "(-v)" do
102
+ let(:arg1) { "-v" }
103
+
104
+ it "should call ::start" do
105
+ expect(cli).to receive(:start).with(args)
106
+ subject
107
+ end
108
+ end
109
+
110
+ context "(help)" do
111
+ let(:arg1) { "help" }
112
+
113
+ it "should call ::start" do
114
+ expect(cli).to receive(:start).with(args)
115
+ subject
116
+ end
117
+ end
118
+ end
119
+
120
+ context "something else" do
121
+ before do
122
+ expect(Tmuxinator::Config).to \
123
+ receive(:exists?).with(name: arg1) { false }
124
+ end
125
+
126
+ it "should call ::start" do
127
+ expect(cli).to receive(:start).with(args)
128
+ subject
129
+ end
130
+ end
131
+ end
132
+ end
133
+
134
+ context "and there is a local project config" do
135
+ include_context :local_project_setup
136
+
137
+ context "when no args are supplied" do
138
+ it "should call #local" do
139
+ instance = instance_double(cli)
140
+ expect(cli).to receive(:new).and_return(instance)
141
+ expect(instance).to receive(:local)
142
+ subject
143
+ end
144
+ end
145
+
146
+ context "when one or more args are supplied" do
147
+ it_should_behave_like :bootstrap_with_arguments
148
+ end
149
+ end
150
+
151
+ context "and there is no local project config" do
152
+ context "when no args are supplied" do
153
+ it "should call ::start" do
154
+ expect(cli).to receive(:start).with([])
155
+ subject
156
+ end
157
+ end
158
+
159
+ context "when one or more args are supplied" do
160
+ it_should_behave_like :bootstrap_with_arguments
161
+ end
162
+ end
163
+ end
164
+
21
165
  describe "#completions" do
22
166
  before do
23
167
  ARGV.replace(["completions", "start"])
@@ -638,21 +782,26 @@ describe Tmuxinator::Cli do
638
782
  end
639
783
 
640
784
  describe "#generate_project_file" do
641
- let(:name) { "foobar" }
642
- let(:path) { Tmuxinator::Config.default_project(name) }
785
+ let(:name) { "foobar-#{Time.now.to_i}" }
643
786
 
644
- before do
645
- expect(File).not_to exist(path), "expected file at #{path} not to exist"
646
- end
647
-
648
- after(:each) do
649
- FileUtils.remove_file(path) if File.exist?(path)
787
+ it "should always generate a project file" do
788
+ Dir.mktmpdir do |dir|
789
+ path = "#{dir}/#{name}.yml"
790
+ expect(File).not_to exist(path), "expected file at #{path} not to exist"
791
+ new_path = Tmuxinator::Cli.new.generate_project_file(name, path)
792
+ expect(new_path).to eq path
793
+ expect(File).to exist new_path
794
+ end
650
795
  end
651
796
 
652
- it "should always generate a project file" do
653
- new_path = Tmuxinator::Cli.new.generate_project_file(name, path)
654
- expect(new_path).to eq path
655
- expect(File).to exist new_path
797
+ it "should generate a project file using the correct project file path" do
798
+ file = StringIO.new
799
+ allow(File).to receive(:open) { |&block| block.yield file }
800
+ Dir.mktmpdir do |dir|
801
+ path = "#{dir}/#{name}.yml"
802
+ _ = Tmuxinator::Cli.new.generate_project_file(name, path)
803
+ expect(file.string).to match %r{\A# #{path}$}
804
+ end
656
805
  end
657
806
  end
658
807
 
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: tmuxinator
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.11.2
4
+ version: 0.11.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Allen Bargi
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2018-05-09 00:00:00.000000000 Z
12
+ date: 2018-06-11 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: erubis