tmuxinator 3.3.4 → 3.3.6
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/completion/tmuxinator.fish +13 -18
- data/lib/tmuxinator/cli.rb +111 -27
- data/lib/tmuxinator/config.rb +16 -4
- data/lib/tmuxinator/project.rb +44 -42
- data/lib/tmuxinator/tmux_version.rb +1 -0
- data/lib/tmuxinator/util.rb +4 -0
- data/lib/tmuxinator/version.rb +1 -1
- data/lib/tmuxinator/window.rb +2 -2
- data/lib/tmuxinator.rb +0 -1
- data/spec/lib/tmuxinator/cli_spec.rb +122 -17
- data/spec/lib/tmuxinator/config_spec.rb +6 -5
- data/spec/lib/tmuxinator/project_spec.rb +5 -1
- data/spec/lib/tmuxinator/wemux_support_spec.rb +1 -1
- data/spec/spec_helper.rb +2 -3
- metadata +23 -57
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 1674129e2d3d0001468bb6ab7e8b304d758d8b1f41fd109f8373de858858e0bc
|
|
4
|
+
data.tar.gz: f2c815caabc1a64161cb0afad01d6347c51826af3882f2ec26661ba48340bf3e
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: b8959a219874dc1bf4717880a83e529601fb5641327c70b89736cef1192328394df9320167d922540b71b96a1d31d7034e473ed4d61fdabd2a36dbd12b6f4407
|
|
7
|
+
data.tar.gz: 5ed4a6024b65078227ee4bcabe33042f9e26bc612daf27e81dbdbf77188ad1ba3d0817e8da3655e1dfb303b334f46507cf82f087e0cd4216176ef8292f71cad9
|
data/completion/tmuxinator.fish
CHANGED
|
@@ -1,22 +1,17 @@
|
|
|
1
1
|
function __fish_tmuxinator_using_command
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
2
|
+
set cmd (commandline -opc)
|
|
3
|
+
if [ (count $cmd) -gt 1 ]
|
|
4
|
+
if [ $argv[1] = $cmd[2] ]
|
|
5
|
+
return 0
|
|
6
|
+
end
|
|
6
7
|
end
|
|
7
|
-
|
|
8
|
-
return 1
|
|
8
|
+
return 1
|
|
9
9
|
end
|
|
10
10
|
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
complete -
|
|
18
|
-
complete -f -c $__fish_tmuxinator_program_cmd -n '__fish_use_subcommand' -x -a "(__fish_tmuxinator_program commands)"
|
|
19
|
-
complete -f -c $__fish_tmuxinator_program_cmd -n '__fish_tmuxinator_using_command start' -a "(__fish_tmuxinator_program completions start)"
|
|
20
|
-
complete -f -c $__fish_tmuxinator_program_cmd -n '__fish_tmuxinator_using_command open' -a "(__fish_tmuxinator_program completions open)"
|
|
21
|
-
complete -f -c $__fish_tmuxinator_program_cmd -n '__fish_tmuxinator_using_command copy' -a "(__fish_tmuxinator_program completions copy)"
|
|
22
|
-
complete -f -c $__fish_tmuxinator_program_cmd -n '__fish_tmuxinator_using_command delete' -a "(__fish_tmuxinator_program completions delete)"
|
|
11
|
+
complete --no-files --command tmuxinator --condition __fish_use_subcommand --exclusive --argument "(tmuxinator commands)"
|
|
12
|
+
complete --no-files --command tmuxinator --condition '__fish_tmuxinator_using_command start' --argument "(tmuxinator completions start)"
|
|
13
|
+
complete --no-files --command tmuxinator --condition '__fish_tmuxinator_using_command open' --argument "(tmuxinator completions open)"
|
|
14
|
+
complete --no-files --command tmuxinator --condition '__fish_tmuxinator_using_command edit' --argument "(tmuxinator completions open)"
|
|
15
|
+
complete --no-files --command tmuxinator --condition '__fish_tmuxinator_using_command copy' --argument "(tmuxinator completions copy)"
|
|
16
|
+
complete --no-files --command tmuxinator --condition '__fish_tmuxinator_using_command delete' --argument "(tmuxinator completions delete)"
|
|
17
|
+
complete --no-files --command tmuxinator --condition '__fish_tmuxinator_using_command debug' --argument "(tmuxinator completions start)"
|
data/lib/tmuxinator/cli.rb
CHANGED
|
@@ -15,25 +15,27 @@ module Tmuxinator
|
|
|
15
15
|
COMMANDS = {
|
|
16
16
|
commands: "Lists commands available in tmuxinator",
|
|
17
17
|
completions: "Used for shell completion",
|
|
18
|
-
|
|
18
|
+
copy: %w{
|
|
19
|
+
Copy an existing project to a new project and
|
|
20
|
+
open it in your editor
|
|
21
|
+
}.join(" "),
|
|
22
|
+
debug: "Output the shell commands that are generated by tmuxinator",
|
|
23
|
+
delete: "Deletes given project",
|
|
24
|
+
doctor: "Look for problems in your configuration",
|
|
19
25
|
edit: "Alias of new",
|
|
26
|
+
help: "Shows help for a specific command",
|
|
27
|
+
implode: "Deletes all tmuxinator projects",
|
|
28
|
+
local: "Start a tmux session using ./.tmuxinator.y[a]ml",
|
|
29
|
+
list: "Lists all tmuxinator projects",
|
|
30
|
+
new: "Create a new project file and open it in your editor",
|
|
20
31
|
open: "Alias of new",
|
|
21
32
|
start: %w{
|
|
22
33
|
Start a tmux session using a project's name (with an optional [ALIAS]
|
|
23
34
|
for project reuse) or a path to a project config file (via the -p flag)
|
|
24
35
|
}.join(" "),
|
|
25
36
|
stop: "Stop a tmux session using a project's tmuxinator config",
|
|
26
|
-
|
|
27
|
-
debug: "Output the shell commands that are generated by tmuxinator",
|
|
28
|
-
copy: %w{
|
|
29
|
-
Copy an existing project to a new project and
|
|
30
|
-
open it in your editor
|
|
31
|
-
}.join(" "),
|
|
32
|
-
delete: "Deletes given project",
|
|
33
|
-
implode: "Deletes all tmuxinator projects",
|
|
37
|
+
stop_all: "Stop all tmux sessions which are using tmuxinator projects",
|
|
34
38
|
version: "Display installed tmuxinator version",
|
|
35
|
-
doctor: "Look for problems in your configuration",
|
|
36
|
-
list: "Lists all tmuxinator projects"
|
|
37
39
|
}.freeze
|
|
38
40
|
|
|
39
41
|
# For future reference: due to how tmuxinator currently consumes
|
|
@@ -82,8 +84,16 @@ module Tmuxinator
|
|
|
82
84
|
method_option :local, type: :boolean,
|
|
83
85
|
aliases: ["-l"],
|
|
84
86
|
desc: "Create local project file at ./.tmuxinator.yml"
|
|
87
|
+
method_option :help, type: :boolean,
|
|
88
|
+
aliases: ["-h"],
|
|
89
|
+
desc: "Display usage information"
|
|
90
|
+
|
|
91
|
+
def new(name = nil, session = nil)
|
|
92
|
+
if options[:help] || name.nil?
|
|
93
|
+
invoke :help, ["new"]
|
|
94
|
+
return
|
|
95
|
+
end
|
|
85
96
|
|
|
86
|
-
def new(name, session = nil)
|
|
87
97
|
if session
|
|
88
98
|
new_project_with_session(name, session)
|
|
89
99
|
else
|
|
@@ -93,7 +103,7 @@ module Tmuxinator
|
|
|
93
103
|
|
|
94
104
|
no_commands do
|
|
95
105
|
def new_project(name)
|
|
96
|
-
project_file = find_project_file(name, options[:local])
|
|
106
|
+
project_file = find_project_file(name, local: options[:local])
|
|
97
107
|
Kernel.system("$EDITOR #{project_file}") || doctor
|
|
98
108
|
end
|
|
99
109
|
|
|
@@ -145,14 +155,14 @@ module Tmuxinator
|
|
|
145
155
|
end
|
|
146
156
|
}
|
|
147
157
|
|
|
148
|
-
path = config_path(name, options[:local])
|
|
158
|
+
path = config_path(name, local: options[:local])
|
|
149
159
|
File.open(path, "w") do |f|
|
|
150
160
|
f.write(YAML.dump(yaml))
|
|
151
161
|
end
|
|
152
162
|
end
|
|
153
163
|
|
|
154
|
-
def find_project_file(name, local
|
|
155
|
-
path = config_path(name, local)
|
|
164
|
+
def find_project_file(name, local: false)
|
|
165
|
+
path = config_path(name, local: local)
|
|
156
166
|
if File.exist?(path)
|
|
157
167
|
path
|
|
158
168
|
else
|
|
@@ -160,7 +170,7 @@ module Tmuxinator
|
|
|
160
170
|
end
|
|
161
171
|
end
|
|
162
172
|
|
|
163
|
-
def config_path(name, local
|
|
173
|
+
def config_path(name, local: false)
|
|
164
174
|
if local
|
|
165
175
|
Tmuxinator::Config::LOCAL_DEFAULTS[0]
|
|
166
176
|
else
|
|
@@ -215,7 +225,7 @@ module Tmuxinator
|
|
|
215
225
|
def show_continuation_prompt
|
|
216
226
|
say
|
|
217
227
|
print "Press ENTER to continue."
|
|
218
|
-
|
|
228
|
+
$stdin.getc
|
|
219
229
|
end
|
|
220
230
|
|
|
221
231
|
def kill_project(project)
|
|
@@ -258,7 +268,15 @@ module Tmuxinator
|
|
|
258
268
|
"the current session"
|
|
259
269
|
method_option "no-pre-window", type: :boolean, default: false,
|
|
260
270
|
desc: "Skip pre_window commands"
|
|
271
|
+
method_option :help, type: :boolean,
|
|
272
|
+
aliases: "-h",
|
|
273
|
+
desc: "Display usage information"
|
|
261
274
|
def start(name = nil, *args)
|
|
275
|
+
if options[:help]
|
|
276
|
+
invoke :help, ["start"]
|
|
277
|
+
return
|
|
278
|
+
end
|
|
279
|
+
|
|
262
280
|
params = start_params(name, *args)
|
|
263
281
|
|
|
264
282
|
show_version_warning if version_warning?(
|
|
@@ -275,8 +293,16 @@ module Tmuxinator
|
|
|
275
293
|
desc: "Path to project config file"
|
|
276
294
|
method_option "suppress-tmux-version-warning",
|
|
277
295
|
desc: "Don't show a warning for unsupported tmux versions"
|
|
296
|
+
method_option :help, type: :boolean,
|
|
297
|
+
aliases: "-h",
|
|
298
|
+
desc: "Display usage information"
|
|
278
299
|
|
|
279
300
|
def stop(name = nil)
|
|
301
|
+
if options[:help]
|
|
302
|
+
invoke :help, ["stop"]
|
|
303
|
+
return
|
|
304
|
+
end
|
|
305
|
+
|
|
280
306
|
# project-config takes precedence over a named project in the case that
|
|
281
307
|
# both are provided.
|
|
282
308
|
if options["project-config"]
|
|
@@ -295,6 +321,26 @@ module Tmuxinator
|
|
|
295
321
|
kill_project(project)
|
|
296
322
|
end
|
|
297
323
|
|
|
324
|
+
desc "stop-all", COMMANDS[:stop_all]
|
|
325
|
+
method_option :noconfirm, type: :boolean,
|
|
326
|
+
default: false,
|
|
327
|
+
aliases: "-y",
|
|
328
|
+
desc: "Skip confirmation"
|
|
329
|
+
def stop_all
|
|
330
|
+
# We only need to stop active projects
|
|
331
|
+
configs = Tmuxinator::Config.configs(active: true)
|
|
332
|
+
|
|
333
|
+
unless options[:noconfirm]
|
|
334
|
+
say "Stop all active projects:\n\n", :yellow
|
|
335
|
+
say configs.join("\n")
|
|
336
|
+
say "\n"
|
|
337
|
+
|
|
338
|
+
return unless yes?("Are you sure? (n/y)")
|
|
339
|
+
end
|
|
340
|
+
|
|
341
|
+
Project.stop_all
|
|
342
|
+
end
|
|
343
|
+
|
|
298
344
|
desc "local", COMMANDS[:local]
|
|
299
345
|
map "." => :local
|
|
300
346
|
method_option "suppress-tmux-version-warning",
|
|
@@ -321,7 +367,15 @@ module Tmuxinator
|
|
|
321
367
|
"the current session"
|
|
322
368
|
method_option "no-pre-window", type: :boolean, default: false,
|
|
323
369
|
desc: "Skip pre_window commands"
|
|
370
|
+
method_option :help, type: :boolean,
|
|
371
|
+
aliases: "-h",
|
|
372
|
+
desc: "Display usage information"
|
|
324
373
|
def debug(name = nil, *args)
|
|
374
|
+
if options[:help]
|
|
375
|
+
invoke :help, ["debug"]
|
|
376
|
+
return
|
|
377
|
+
end
|
|
378
|
+
|
|
325
379
|
params = start_params(name, *args)
|
|
326
380
|
|
|
327
381
|
project = create_project(params)
|
|
@@ -332,8 +386,16 @@ module Tmuxinator
|
|
|
332
386
|
desc "copy [EXISTING] [NEW]", COMMANDS[:copy]
|
|
333
387
|
map "c" => :copy
|
|
334
388
|
map "cp" => :copy
|
|
389
|
+
method_option :help, type: :boolean,
|
|
390
|
+
aliases: "-h",
|
|
391
|
+
desc: "Display usage information"
|
|
392
|
+
|
|
393
|
+
def copy(existing = nil, new = nil)
|
|
394
|
+
if options[:help] || existing.nil? || new.nil?
|
|
395
|
+
invoke :help, ["copy"]
|
|
396
|
+
return
|
|
397
|
+
end
|
|
335
398
|
|
|
336
|
-
def copy(existing, new)
|
|
337
399
|
existing_config_path = Tmuxinator::Config.project(existing)
|
|
338
400
|
new_config_path = Tmuxinator::Config.project(new)
|
|
339
401
|
|
|
@@ -353,18 +415,32 @@ module Tmuxinator
|
|
|
353
415
|
desc "delete [PROJECT1] [PROJECT2] ...", COMMANDS[:delete]
|
|
354
416
|
map "d" => :delete
|
|
355
417
|
map "rm" => :delete
|
|
418
|
+
method_option :help, type: :boolean,
|
|
419
|
+
aliases: "-h",
|
|
420
|
+
desc: "Display usage information"
|
|
356
421
|
|
|
357
422
|
def delete(*projects)
|
|
358
|
-
projects.
|
|
359
|
-
|
|
360
|
-
|
|
423
|
+
if options[:help] || projects.empty?
|
|
424
|
+
invoke :help, ["delete"]
|
|
425
|
+
return
|
|
426
|
+
end
|
|
427
|
+
|
|
428
|
+
delete_projects(*projects)
|
|
429
|
+
end
|
|
361
430
|
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
431
|
+
no_commands do
|
|
432
|
+
def delete_projects(*projects)
|
|
433
|
+
projects.each do |project|
|
|
434
|
+
if Tmuxinator::Config.exist?(name: project)
|
|
435
|
+
config = Tmuxinator::Config.project(project)
|
|
436
|
+
|
|
437
|
+
if yes?("Are you sure you want to delete #{project}?(y/n)", :red)
|
|
438
|
+
FileUtils.rm(config)
|
|
439
|
+
say "Deleted #{project}"
|
|
440
|
+
end
|
|
441
|
+
else
|
|
442
|
+
say "#{project} does not exist!"
|
|
365
443
|
end
|
|
366
|
-
else
|
|
367
|
-
say "#{project} does not exist!"
|
|
368
444
|
end
|
|
369
445
|
end
|
|
370
446
|
end
|
|
@@ -390,8 +466,16 @@ module Tmuxinator
|
|
|
390
466
|
method_option :active, type: :boolean,
|
|
391
467
|
aliases: ["-a"],
|
|
392
468
|
desc: "Filter output by active project sessions."
|
|
469
|
+
method_option :help, type: :boolean,
|
|
470
|
+
aliases: ["-h"],
|
|
471
|
+
desc: "Display usage information"
|
|
393
472
|
|
|
394
473
|
def list
|
|
474
|
+
if options[:help]
|
|
475
|
+
invoke :help, ["list"]
|
|
476
|
+
return
|
|
477
|
+
end
|
|
478
|
+
|
|
395
479
|
say "tmuxinator projects:"
|
|
396
480
|
configs = Tmuxinator::Config.configs(active: options[:active])
|
|
397
481
|
if options[:newline]
|
data/lib/tmuxinator/config.rb
CHANGED
|
@@ -20,7 +20,7 @@ module Tmuxinator
|
|
|
20
20
|
end
|
|
21
21
|
|
|
22
22
|
def home
|
|
23
|
-
ENV[
|
|
23
|
+
"#{ENV['HOME']}/.tmuxinator"
|
|
24
24
|
end
|
|
25
25
|
|
|
26
26
|
def home?
|
|
@@ -31,7 +31,9 @@ module Tmuxinator
|
|
|
31
31
|
# a custom value. (e.g. if $XDG_CONFIG_HOME is set to ~/my-config, the
|
|
32
32
|
# return value will be ~/my-config/tmuxinator)
|
|
33
33
|
def xdg
|
|
34
|
-
|
|
34
|
+
xdg_config_directory = ENV.fetch("XDG_CONFIG_HOME", "~/.config")
|
|
35
|
+
config_home = File.expand_path(xdg_config_directory)
|
|
36
|
+
File.join(config_home, "tmuxinator")
|
|
35
37
|
end
|
|
36
38
|
|
|
37
39
|
def xdg?
|
|
@@ -131,7 +133,7 @@ module Tmuxinator
|
|
|
131
133
|
`tmux list-sessions -F "#S"`.split("\n")
|
|
132
134
|
end
|
|
133
135
|
|
|
134
|
-
# Sorted list of all project
|
|
136
|
+
# Sorted list of all project file basenames, including duplicates.
|
|
135
137
|
#
|
|
136
138
|
# @param active filter configs by active project sessions
|
|
137
139
|
# @return [Array<String>] list of project names
|
|
@@ -147,6 +149,16 @@ module Tmuxinator
|
|
|
147
149
|
configs
|
|
148
150
|
end
|
|
149
151
|
|
|
152
|
+
# List the names of all config files relative to the config directory.
|
|
153
|
+
#
|
|
154
|
+
# If sub-folders are used, those are part of the name too.
|
|
155
|
+
#
|
|
156
|
+
# Example:
|
|
157
|
+
# $CONFIG_DIR/project.yml -> project
|
|
158
|
+
# $CONFIG_DIR/sub/project.yml -> sub/project
|
|
159
|
+
# $HOME_CONFIG_DIR/project.yml -> project
|
|
160
|
+
#
|
|
161
|
+
# @return [Array<String] a list of config file names
|
|
150
162
|
def config_file_basenames
|
|
151
163
|
directories.flat_map do |directory|
|
|
152
164
|
Dir["#{directory}/**/*.yml"].map do |path|
|
|
@@ -193,7 +205,7 @@ module Tmuxinator
|
|
|
193
205
|
name = options[:name]
|
|
194
206
|
options[:force_attach] ||= false
|
|
195
207
|
options[:force_detach] ||= false
|
|
196
|
-
project_config = options.fetch(:project_config
|
|
208
|
+
project_config = options.fetch(:project_config, false)
|
|
197
209
|
project_file = if valid_project_config?(project_config)
|
|
198
210
|
project_config
|
|
199
211
|
elsif valid_local_project?(name)
|
data/lib/tmuxinator/project.rb
CHANGED
|
@@ -36,37 +36,49 @@ module Tmuxinator
|
|
|
36
36
|
`on_project_exit`) and will be removed in a future release.
|
|
37
37
|
M
|
|
38
38
|
|
|
39
|
-
attr_reader :yaml
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
39
|
+
attr_reader :yaml, :force_attach, :force_detach, :custom_name,
|
|
40
|
+
:no_pre_window
|
|
41
|
+
|
|
42
|
+
class << self
|
|
43
|
+
include Tmuxinator::Util
|
|
44
|
+
|
|
45
|
+
def load(path, options = {})
|
|
46
|
+
yaml = begin
|
|
47
|
+
args = options[:args] || []
|
|
48
|
+
@settings = parse_settings(args)
|
|
49
|
+
@args = args
|
|
50
|
+
|
|
51
|
+
content = render_template(path, binding)
|
|
52
|
+
YAML.safe_load(content, aliases: true)
|
|
53
|
+
rescue SyntaxError, StandardError => e
|
|
54
|
+
raise "Failed to parse config file: #{e.message}"
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
new(yaml, options)
|
|
55
58
|
end
|
|
56
59
|
|
|
57
|
-
|
|
58
|
-
|
|
60
|
+
def parse_settings(args)
|
|
61
|
+
settings = args.select { |x| x.match(/.*=.*/) }
|
|
62
|
+
args.reject! { |x| x.match(/.*=.*/) }
|
|
59
63
|
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
64
|
+
settings.map! do |setting|
|
|
65
|
+
parts = setting.split("=", 2)
|
|
66
|
+
[parts[0], parts[1]]
|
|
67
|
+
end
|
|
63
68
|
|
|
64
|
-
|
|
65
|
-
parts = setting.split("=")
|
|
66
|
-
[parts[0], parts[1]]
|
|
69
|
+
Hash[settings]
|
|
67
70
|
end
|
|
68
71
|
|
|
69
|
-
|
|
72
|
+
def active
|
|
73
|
+
Tmuxinator::Config.configs(active: true).
|
|
74
|
+
map { |config| Config.validate(name: config) }
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
def stop_all
|
|
78
|
+
active.
|
|
79
|
+
sort_by { |project| project.name == current_session_name ? 1 : 0 }.
|
|
80
|
+
each { |project| Kernel.system(project.kill) }
|
|
81
|
+
end
|
|
70
82
|
end
|
|
71
83
|
|
|
72
84
|
def validate!
|
|
@@ -135,10 +147,6 @@ module Tmuxinator
|
|
|
135
147
|
blank?(root) ? nil : File.expand_path(root).shellescape
|
|
136
148
|
end
|
|
137
149
|
|
|
138
|
-
def current_session_name
|
|
139
|
-
`[[ -n "${TMUX+set}" ]] && tmux display-message -p "#S"`.strip
|
|
140
|
-
end
|
|
141
|
-
|
|
142
150
|
def name
|
|
143
151
|
name =
|
|
144
152
|
if append?
|
|
@@ -160,13 +168,8 @@ module Tmuxinator
|
|
|
160
168
|
end
|
|
161
169
|
|
|
162
170
|
def attach?
|
|
163
|
-
yaml_attach =
|
|
164
|
-
|
|
165
|
-
else
|
|
166
|
-
yaml["attach"]
|
|
167
|
-
end
|
|
168
|
-
attach = force_attach || !force_detach && yaml_attach
|
|
169
|
-
attach
|
|
171
|
+
yaml_attach = yaml["attach"].nil? || yaml["attach"]
|
|
172
|
+
force_attach || !force_detach && yaml_attach
|
|
170
173
|
end
|
|
171
174
|
|
|
172
175
|
def pre_window
|
|
@@ -402,17 +405,16 @@ module Tmuxinator
|
|
|
402
405
|
|
|
403
406
|
def pane_title_position_not_valid_warning
|
|
404
407
|
print_warning(
|
|
405
|
-
"The specified pane title position "
|
|
406
|
-
"
|
|
407
|
-
"Please choose one of: top, bottom, or off."
|
|
408
|
+
"The specified pane title position '#{yaml['pane_title_position']}' " \
|
|
409
|
+
"is not valid. Please choose one of: top, bottom, or off."
|
|
408
410
|
)
|
|
409
411
|
end
|
|
410
412
|
|
|
411
413
|
def pane_titles_not_supported_warning
|
|
412
414
|
print_warning(
|
|
413
|
-
"You have enabled pane titles in your configuration, "
|
|
414
|
-
"
|
|
415
|
-
"
|
|
415
|
+
"You have enabled pane titles in your configuration, but the " \
|
|
416
|
+
"feature is not supported by your version of tmux.\nPlease consider " \
|
|
417
|
+
"upgrading to a version that supports it (tmux >=2.6)."
|
|
416
418
|
)
|
|
417
419
|
end
|
|
418
420
|
|
data/lib/tmuxinator/util.rb
CHANGED
data/lib/tmuxinator/version.rb
CHANGED
data/lib/tmuxinator/window.rb
CHANGED
|
@@ -29,7 +29,7 @@ module Tmuxinator
|
|
|
29
29
|
end
|
|
30
30
|
|
|
31
31
|
def layout
|
|
32
|
-
yaml["layout"]
|
|
32
|
+
yaml["layout"]&.shellescape
|
|
33
33
|
end
|
|
34
34
|
|
|
35
35
|
def synchronize
|
|
@@ -139,7 +139,7 @@ module Tmuxinator
|
|
|
139
139
|
end
|
|
140
140
|
|
|
141
141
|
def synchronize_before?
|
|
142
|
-
|
|
142
|
+
[true, "before"].include?(synchronize)
|
|
143
143
|
end
|
|
144
144
|
|
|
145
145
|
def synchronize_after?
|
data/lib/tmuxinator.rb
CHANGED
|
@@ -198,21 +198,25 @@ describe Tmuxinator::Cli do
|
|
|
198
198
|
|
|
199
199
|
it "lists the commands" do
|
|
200
200
|
out, _err = capture_io { cli.start }
|
|
201
|
-
expected = %w(
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
201
|
+
expected = %w(
|
|
202
|
+
commands
|
|
203
|
+
completions
|
|
204
|
+
copy
|
|
205
|
+
debug
|
|
206
|
+
delete
|
|
207
|
+
doctor
|
|
208
|
+
edit
|
|
209
|
+
help
|
|
210
|
+
implode
|
|
211
|
+
local
|
|
212
|
+
list
|
|
213
|
+
new
|
|
214
|
+
open
|
|
215
|
+
start
|
|
216
|
+
stop
|
|
217
|
+
stop_all
|
|
218
|
+
version
|
|
219
|
+
)
|
|
216
220
|
expect(out).to eq "#{expected.join("\n")}\n"
|
|
217
221
|
end
|
|
218
222
|
end
|
|
@@ -294,6 +298,24 @@ describe Tmuxinator::Cli do
|
|
|
294
298
|
end
|
|
295
299
|
end
|
|
296
300
|
|
|
301
|
+
context "with --help flag" do
|
|
302
|
+
it "shows help instead of starting project" do
|
|
303
|
+
ARGV.replace(["start", "--help"])
|
|
304
|
+
expect(Kernel).not_to receive(:exec)
|
|
305
|
+
out, _err = capture_io { cli.start }
|
|
306
|
+
expect(out).to include("start [PROJECT] [ARGS]")
|
|
307
|
+
expect(out).to include("Options:")
|
|
308
|
+
end
|
|
309
|
+
|
|
310
|
+
it "shows help with -h flag" do
|
|
311
|
+
ARGV.replace(["start", "-h"])
|
|
312
|
+
expect(Kernel).not_to receive(:exec)
|
|
313
|
+
out, _err = capture_io { cli.start }
|
|
314
|
+
expect(out).to include("start [PROJECT] [ARGS]")
|
|
315
|
+
expect(out).to include("Options:")
|
|
316
|
+
end
|
|
317
|
+
end
|
|
318
|
+
|
|
297
319
|
context "deprecations" do
|
|
298
320
|
before do
|
|
299
321
|
allow($stdin).to receive_messages(getc: "y")
|
|
@@ -337,6 +359,16 @@ describe Tmuxinator::Cli do
|
|
|
337
359
|
end
|
|
338
360
|
end
|
|
339
361
|
|
|
362
|
+
context "with --help flag" do
|
|
363
|
+
it "shows help instead of stopping project" do
|
|
364
|
+
ARGV.replace(["stop", "--help"])
|
|
365
|
+
expect(Kernel).not_to receive(:exec)
|
|
366
|
+
out, _err = capture_io { cli.start }
|
|
367
|
+
expect(out).to include("stop [PROJECT]")
|
|
368
|
+
expect(out).to include("Options:")
|
|
369
|
+
end
|
|
370
|
+
end
|
|
371
|
+
|
|
340
372
|
include_examples :unsupported_version_message, :stop, :foo
|
|
341
373
|
end
|
|
342
374
|
|
|
@@ -379,6 +411,20 @@ describe Tmuxinator::Cli do
|
|
|
379
411
|
end
|
|
380
412
|
end
|
|
381
413
|
|
|
414
|
+
describe "#stop_all" do
|
|
415
|
+
before do
|
|
416
|
+
allow(Tmuxinator::Config).to receive_messages(validate: project)
|
|
417
|
+
allow(Tmuxinator::Config).to receive_messages(version: 1.9)
|
|
418
|
+
end
|
|
419
|
+
|
|
420
|
+
it "stops all projects" do
|
|
421
|
+
ARGV.replace(["stop-all", "--noconfirm"])
|
|
422
|
+
out, err = capture_io { cli.start }
|
|
423
|
+
expect(err).to eq ""
|
|
424
|
+
expect(out).to eq ""
|
|
425
|
+
end
|
|
426
|
+
end
|
|
427
|
+
|
|
382
428
|
describe "#local" do
|
|
383
429
|
before do
|
|
384
430
|
allow(Tmuxinator::Config).to receive_messages(validate: project)
|
|
@@ -509,6 +555,15 @@ describe Tmuxinator::Cli do
|
|
|
509
555
|
allow(File).to receive(:open) { |&block| block.yield file }
|
|
510
556
|
end
|
|
511
557
|
|
|
558
|
+
context "with --help flag" do
|
|
559
|
+
it "shows help instead of creating project" do
|
|
560
|
+
ARGV.replace(["new", "--help"])
|
|
561
|
+
out, _err = capture_io { cli.start }
|
|
562
|
+
expect(out).to include("new [PROJECT]")
|
|
563
|
+
expect(out).to include("Options:")
|
|
564
|
+
end
|
|
565
|
+
end
|
|
566
|
+
|
|
512
567
|
context "without the --local option" do
|
|
513
568
|
before do
|
|
514
569
|
ARGV.replace(["new", name])
|
|
@@ -634,6 +689,31 @@ describe Tmuxinator::Cli do
|
|
|
634
689
|
allow(Tmuxinator::Config).to receive(:exist?) { true }
|
|
635
690
|
end
|
|
636
691
|
|
|
692
|
+
context "with --help flag" do
|
|
693
|
+
it "shows help instead of copying project" do
|
|
694
|
+
ARGV.replace(["copy", "--help"])
|
|
695
|
+
expect(FileUtils).not_to receive(:copy_file)
|
|
696
|
+
out, _err = capture_io { cli.start }
|
|
697
|
+
expect(out).to include("copy [EXISTING] [NEW]")
|
|
698
|
+
expect(out).to include("Options:")
|
|
699
|
+
end
|
|
700
|
+
|
|
701
|
+
it "shows help with -h flag" do
|
|
702
|
+
ARGV.replace(["copy", "-h"])
|
|
703
|
+
expect(FileUtils).not_to receive(:copy_file)
|
|
704
|
+
out, _err = capture_io { cli.start }
|
|
705
|
+
expect(out).to include("copy [EXISTING] [NEW]")
|
|
706
|
+
expect(out).to include("Options:")
|
|
707
|
+
end
|
|
708
|
+
|
|
709
|
+
it "shows help when only one argument provided" do
|
|
710
|
+
ARGV.replace(["copy", "foo"])
|
|
711
|
+
expect(FileUtils).not_to receive(:copy_file)
|
|
712
|
+
out, _err = capture_io { cli.start }
|
|
713
|
+
expect(out).to include("copy [EXISTING] [NEW]")
|
|
714
|
+
end
|
|
715
|
+
end
|
|
716
|
+
|
|
637
717
|
context "new project already exists" do
|
|
638
718
|
before do
|
|
639
719
|
allow(Thor::LineEditor).to receive_messages(readline: "y")
|
|
@@ -715,6 +795,31 @@ describe Tmuxinator::Cli do
|
|
|
715
795
|
end
|
|
716
796
|
|
|
717
797
|
describe "#delete" do
|
|
798
|
+
context "with --help flag" do
|
|
799
|
+
it "shows help instead of deleting project" do
|
|
800
|
+
ARGV.replace(["delete", "--help"])
|
|
801
|
+
expect(FileUtils).not_to receive(:rm)
|
|
802
|
+
out, _err = capture_io { cli.start }
|
|
803
|
+
expect(out).to include("delete [PROJECT1] [PROJECT2]")
|
|
804
|
+
expect(out).to include("Options:")
|
|
805
|
+
end
|
|
806
|
+
|
|
807
|
+
it "shows help with -h flag" do
|
|
808
|
+
ARGV.replace(["delete", "-h"])
|
|
809
|
+
expect(FileUtils).not_to receive(:rm)
|
|
810
|
+
out, _err = capture_io { cli.start }
|
|
811
|
+
expect(out).to include("delete [PROJECT1] [PROJECT2]")
|
|
812
|
+
expect(out).to include("Options:")
|
|
813
|
+
end
|
|
814
|
+
|
|
815
|
+
it "shows help when no arguments provided" do
|
|
816
|
+
ARGV.replace(["delete"])
|
|
817
|
+
expect(FileUtils).not_to receive(:rm)
|
|
818
|
+
out, _err = capture_io { cli.start }
|
|
819
|
+
expect(out).to include("delete [PROJECT1] [PROJECT2]")
|
|
820
|
+
end
|
|
821
|
+
end
|
|
822
|
+
|
|
718
823
|
context "with a single argument" do
|
|
719
824
|
before do
|
|
720
825
|
ARGV.replace(["delete", "foo"])
|
|
@@ -907,7 +1012,7 @@ describe Tmuxinator::Cli do
|
|
|
907
1012
|
end
|
|
908
1013
|
|
|
909
1014
|
it "should generate a project file" do
|
|
910
|
-
new_path = described_class.new.find_project_file(name, false)
|
|
1015
|
+
new_path = described_class.new.find_project_file(name, local: false)
|
|
911
1016
|
expect(new_path).to eq path
|
|
912
1017
|
expect(File).to exist new_path
|
|
913
1018
|
end
|
|
@@ -929,7 +1034,7 @@ describe Tmuxinator::Cli do
|
|
|
929
1034
|
end
|
|
930
1035
|
|
|
931
1036
|
it "should _not_ generate a new project file" do
|
|
932
|
-
new_path = described_class.new.find_project_file(name, false)
|
|
1037
|
+
new_path = described_class.new.find_project_file(name, local: false)
|
|
933
1038
|
expect(new_path).to eq path
|
|
934
1039
|
expect(File).to exist new_path
|
|
935
1040
|
expect(File.read(new_path)).to match %r{#{extra}}
|
|
@@ -55,7 +55,8 @@ describe Tmuxinator::Config do
|
|
|
55
55
|
|
|
56
56
|
Dir.mktmpdir do |dir|
|
|
57
57
|
config_parent = "#{dir}/non_existent_parent/s"
|
|
58
|
-
allow(
|
|
58
|
+
allow(ENV).to receive(:fetch).with("XDG_CONFIG_HOME", "~/.config").
|
|
59
|
+
and_return config_parent
|
|
59
60
|
expect(described_class.directory).
|
|
60
61
|
to eq "#{config_parent}/tmuxinator"
|
|
61
62
|
expect(File.directory?("#{config_parent}/tmuxinator")).to be true
|
|
@@ -69,7 +70,6 @@ describe Tmuxinator::Config do
|
|
|
69
70
|
it "is $TMUXINATOR_CONFIG" do
|
|
70
71
|
allow(ENV).to receive(:[]).with("TMUXINATOR_CONFIG").
|
|
71
72
|
and_return "expected"
|
|
72
|
-
# allow(XDG).to receive(:[]).with("CONFIG").and_return "expected"
|
|
73
73
|
allow(File).to receive(:directory?).and_return true
|
|
74
74
|
expect(described_class.environment).to eq "expected"
|
|
75
75
|
end
|
|
@@ -87,7 +87,6 @@ describe Tmuxinator::Config do
|
|
|
87
87
|
|
|
88
88
|
context "environment variable $TMUXINATOR_CONFIG is set and empty" do
|
|
89
89
|
it "is an empty string" do
|
|
90
|
-
allow(XDG).to receive(:[]).with("CONFIG").and_return ""
|
|
91
90
|
allow(ENV).to receive(:[]).with("TMUXINATOR_CONFIG").and_return ""
|
|
92
91
|
expect(described_class.environment).to eq ""
|
|
93
92
|
end
|
|
@@ -136,7 +135,7 @@ describe Tmuxinator::Config do
|
|
|
136
135
|
|
|
137
136
|
describe "#xdg" do
|
|
138
137
|
it "is $XDG_CONFIG_HOME/tmuxinator" do
|
|
139
|
-
expect(described_class.xdg).to eq "
|
|
138
|
+
expect(described_class.xdg).to eq File.expand_path("~/.config/tmuxinator")
|
|
140
139
|
end
|
|
141
140
|
end
|
|
142
141
|
|
|
@@ -181,7 +180,8 @@ describe Tmuxinator::Config do
|
|
|
181
180
|
|
|
182
181
|
before do
|
|
183
182
|
expect(Tmuxinator::Doctor).to receive(:installed?).and_return(true)
|
|
184
|
-
allow_any_instance_of(Kernel).to receive(:`).
|
|
183
|
+
allow_any_instance_of(Kernel).to receive(:`).
|
|
184
|
+
with(/tmux\s-V/).
|
|
185
185
|
and_return("tmux #{version}")
|
|
186
186
|
end
|
|
187
187
|
|
|
@@ -203,6 +203,7 @@ describe Tmuxinator::Config do
|
|
|
203
203
|
"!@#^%" => 0.0,
|
|
204
204
|
"2.9ä" => 2.9,
|
|
205
205
|
"v3.5" => 3.5,
|
|
206
|
+
"v3.6" => 3.6,
|
|
206
207
|
"v3.12.0" => 3.12,
|
|
207
208
|
"v3.12.5" => 3.12
|
|
208
209
|
}.freeze
|
|
@@ -665,7 +665,7 @@ describe Tmuxinator::Project do
|
|
|
665
665
|
end
|
|
666
666
|
|
|
667
667
|
describe "::parse_settings" do
|
|
668
|
-
let(:args) { ["one", "two=three"] }
|
|
668
|
+
let(:args) { ["one", "two=three", "four=five=six"] }
|
|
669
669
|
|
|
670
670
|
it "returns settings in a hash" do
|
|
671
671
|
expect(described_class.parse_settings(args)["two"]).to eq("three")
|
|
@@ -675,6 +675,10 @@ describe Tmuxinator::Project do
|
|
|
675
675
|
described_class.parse_settings(args)
|
|
676
676
|
expect(args).to eq(["one"])
|
|
677
677
|
end
|
|
678
|
+
|
|
679
|
+
it "handles equals signs in values" do
|
|
680
|
+
expect(described_class.parse_settings(args)["four"]).to eq("five=six")
|
|
681
|
+
end
|
|
678
682
|
end
|
|
679
683
|
|
|
680
684
|
describe "#validate!" do
|
|
@@ -12,7 +12,7 @@ describe Tmuxinator::WemuxSupport do
|
|
|
12
12
|
it "renders the template" do
|
|
13
13
|
expect(File).to receive(:read).at_least(:once) { "wemux ls 2>/dev/null" }
|
|
14
14
|
|
|
15
|
-
expect(instance.render).to match %r{wemux.ls.2
|
|
15
|
+
expect(instance.render).to match %r{wemux.ls.2>/dev/null}
|
|
16
16
|
end
|
|
17
17
|
end
|
|
18
18
|
|
data/spec/spec_helper.rb
CHANGED
|
@@ -2,7 +2,6 @@
|
|
|
2
2
|
|
|
3
3
|
require "pry"
|
|
4
4
|
require "simplecov"
|
|
5
|
-
require "xdg"
|
|
6
5
|
|
|
7
6
|
SimpleCov.start do
|
|
8
7
|
if ENV["CI"]
|
|
@@ -59,11 +58,11 @@ def tmux_config(options = {})
|
|
|
59
58
|
"bell-on-alert off",
|
|
60
59
|
]
|
|
61
60
|
|
|
62
|
-
if base_index = options.fetch(:base_index
|
|
61
|
+
if base_index = options.fetch(:base_index, 1)
|
|
63
62
|
standard_options << "base-index #{base_index}"
|
|
64
63
|
end
|
|
65
64
|
|
|
66
|
-
if pane_base_index = options.fetch(:pane_base_index
|
|
65
|
+
if pane_base_index = options.fetch(:pane_base_index, 1)
|
|
67
66
|
standard_options << "pane-base-index #{pane_base_index}"
|
|
68
67
|
end
|
|
69
68
|
|
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: 3.3.
|
|
4
|
+
version: 3.3.6
|
|
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: 2025-
|
|
12
|
+
date: 2025-11-26 00:00:00.000000000 Z
|
|
13
13
|
dependencies:
|
|
14
14
|
- !ruby/object:Gem::Dependency
|
|
15
15
|
name: erubi
|
|
@@ -17,62 +17,42 @@ dependencies:
|
|
|
17
17
|
requirements:
|
|
18
18
|
- - "~>"
|
|
19
19
|
- !ruby/object:Gem::Version
|
|
20
|
-
version: '1.
|
|
20
|
+
version: '1.13'
|
|
21
21
|
type: :runtime
|
|
22
22
|
prerelease: false
|
|
23
23
|
version_requirements: !ruby/object:Gem::Requirement
|
|
24
24
|
requirements:
|
|
25
25
|
- - "~>"
|
|
26
26
|
- !ruby/object:Gem::Version
|
|
27
|
-
version: '1.
|
|
27
|
+
version: '1.13'
|
|
28
28
|
- !ruby/object:Gem::Dependency
|
|
29
29
|
name: thor
|
|
30
30
|
requirement: !ruby/object:Gem::Requirement
|
|
31
31
|
requirements:
|
|
32
32
|
- - "~>"
|
|
33
33
|
- !ruby/object:Gem::Version
|
|
34
|
-
version: 1.
|
|
34
|
+
version: 1.4.0
|
|
35
35
|
type: :runtime
|
|
36
36
|
prerelease: false
|
|
37
37
|
version_requirements: !ruby/object:Gem::Requirement
|
|
38
38
|
requirements:
|
|
39
39
|
- - "~>"
|
|
40
40
|
- !ruby/object:Gem::Version
|
|
41
|
-
version: 1.
|
|
41
|
+
version: 1.4.0
|
|
42
42
|
- !ruby/object:Gem::Dependency
|
|
43
|
-
name:
|
|
43
|
+
name: amazing_print
|
|
44
44
|
requirement: !ruby/object:Gem::Requirement
|
|
45
45
|
requirements:
|
|
46
46
|
- - "~>"
|
|
47
47
|
- !ruby/object:Gem::Version
|
|
48
|
-
version: '
|
|
49
|
-
- - ">="
|
|
50
|
-
- !ruby/object:Gem::Version
|
|
51
|
-
version: 2.2.5
|
|
52
|
-
type: :runtime
|
|
53
|
-
prerelease: false
|
|
54
|
-
version_requirements: !ruby/object:Gem::Requirement
|
|
55
|
-
requirements:
|
|
56
|
-
- - "~>"
|
|
57
|
-
- !ruby/object:Gem::Version
|
|
58
|
-
version: '2.2'
|
|
59
|
-
- - ">="
|
|
60
|
-
- !ruby/object:Gem::Version
|
|
61
|
-
version: 2.2.5
|
|
62
|
-
- !ruby/object:Gem::Dependency
|
|
63
|
-
name: awesome_print
|
|
64
|
-
requirement: !ruby/object:Gem::Requirement
|
|
65
|
-
requirements:
|
|
66
|
-
- - "~>"
|
|
67
|
-
- !ruby/object:Gem::Version
|
|
68
|
-
version: '1.2'
|
|
48
|
+
version: '1.8'
|
|
69
49
|
type: :development
|
|
70
50
|
prerelease: false
|
|
71
51
|
version_requirements: !ruby/object:Gem::Requirement
|
|
72
52
|
requirements:
|
|
73
53
|
- - "~>"
|
|
74
54
|
- !ruby/object:Gem::Version
|
|
75
|
-
version: '1.
|
|
55
|
+
version: '1.8'
|
|
76
56
|
- !ruby/object:Gem::Dependency
|
|
77
57
|
name: bundler
|
|
78
58
|
requirement: !ruby/object:Gem::Requirement
|
|
@@ -93,98 +73,84 @@ dependencies:
|
|
|
93
73
|
requirements:
|
|
94
74
|
- - "~>"
|
|
95
75
|
- !ruby/object:Gem::Version
|
|
96
|
-
version: '
|
|
76
|
+
version: '6.5'
|
|
97
77
|
type: :development
|
|
98
78
|
prerelease: false
|
|
99
79
|
version_requirements: !ruby/object:Gem::Requirement
|
|
100
80
|
requirements:
|
|
101
81
|
- - "~>"
|
|
102
82
|
- !ruby/object:Gem::Version
|
|
103
|
-
version: '
|
|
83
|
+
version: '6.5'
|
|
104
84
|
- !ruby/object:Gem::Dependency
|
|
105
85
|
name: pry
|
|
106
86
|
requirement: !ruby/object:Gem::Requirement
|
|
107
87
|
requirements:
|
|
108
88
|
- - "~>"
|
|
109
89
|
- !ruby/object:Gem::Version
|
|
110
|
-
version: '0.
|
|
90
|
+
version: '0.15'
|
|
111
91
|
type: :development
|
|
112
92
|
prerelease: false
|
|
113
93
|
version_requirements: !ruby/object:Gem::Requirement
|
|
114
94
|
requirements:
|
|
115
95
|
- - "~>"
|
|
116
96
|
- !ruby/object:Gem::Version
|
|
117
|
-
version: '0.
|
|
97
|
+
version: '0.15'
|
|
118
98
|
- !ruby/object:Gem::Dependency
|
|
119
99
|
name: rake
|
|
120
100
|
requirement: !ruby/object:Gem::Requirement
|
|
121
101
|
requirements:
|
|
122
102
|
- - "~>"
|
|
123
103
|
- !ruby/object:Gem::Version
|
|
124
|
-
version:
|
|
104
|
+
version: '13.3'
|
|
125
105
|
type: :development
|
|
126
106
|
prerelease: false
|
|
127
107
|
version_requirements: !ruby/object:Gem::Requirement
|
|
128
108
|
requirements:
|
|
129
109
|
- - "~>"
|
|
130
110
|
- !ruby/object:Gem::Version
|
|
131
|
-
version:
|
|
111
|
+
version: '13.3'
|
|
132
112
|
- !ruby/object:Gem::Dependency
|
|
133
113
|
name: rspec
|
|
134
114
|
requirement: !ruby/object:Gem::Requirement
|
|
135
115
|
requirements:
|
|
136
116
|
- - "~>"
|
|
137
117
|
- !ruby/object:Gem::Version
|
|
138
|
-
version: '3.
|
|
118
|
+
version: '3.13'
|
|
139
119
|
type: :development
|
|
140
120
|
prerelease: false
|
|
141
121
|
version_requirements: !ruby/object:Gem::Requirement
|
|
142
122
|
requirements:
|
|
143
123
|
- - "~>"
|
|
144
124
|
- !ruby/object:Gem::Version
|
|
145
|
-
version: '3.
|
|
125
|
+
version: '3.13'
|
|
146
126
|
- !ruby/object:Gem::Dependency
|
|
147
127
|
name: rubocop
|
|
148
128
|
requirement: !ruby/object:Gem::Requirement
|
|
149
129
|
requirements:
|
|
150
130
|
- - "~>"
|
|
151
131
|
- !ruby/object:Gem::Version
|
|
152
|
-
version:
|
|
132
|
+
version: '1.79'
|
|
153
133
|
type: :development
|
|
154
134
|
prerelease: false
|
|
155
135
|
version_requirements: !ruby/object:Gem::Requirement
|
|
156
136
|
requirements:
|
|
157
137
|
- - "~>"
|
|
158
138
|
- !ruby/object:Gem::Version
|
|
159
|
-
version:
|
|
139
|
+
version: '1.79'
|
|
160
140
|
- !ruby/object:Gem::Dependency
|
|
161
141
|
name: simplecov
|
|
162
142
|
requirement: !ruby/object:Gem::Requirement
|
|
163
143
|
requirements:
|
|
164
144
|
- - "~>"
|
|
165
145
|
- !ruby/object:Gem::Version
|
|
166
|
-
version: '0.
|
|
167
|
-
type: :development
|
|
168
|
-
prerelease: false
|
|
169
|
-
version_requirements: !ruby/object:Gem::Requirement
|
|
170
|
-
requirements:
|
|
171
|
-
- - "~>"
|
|
172
|
-
- !ruby/object:Gem::Version
|
|
173
|
-
version: '0.16'
|
|
174
|
-
- !ruby/object:Gem::Dependency
|
|
175
|
-
name: unicode-display_width
|
|
176
|
-
requirement: !ruby/object:Gem::Requirement
|
|
177
|
-
requirements:
|
|
178
|
-
- - "~>"
|
|
179
|
-
- !ruby/object:Gem::Version
|
|
180
|
-
version: '1.3'
|
|
146
|
+
version: '0.22'
|
|
181
147
|
type: :development
|
|
182
148
|
prerelease: false
|
|
183
149
|
version_requirements: !ruby/object:Gem::Requirement
|
|
184
150
|
requirements:
|
|
185
151
|
- - "~>"
|
|
186
152
|
- !ruby/object:Gem::Version
|
|
187
|
-
version: '
|
|
153
|
+
version: '0.22'
|
|
188
154
|
description: Create and manage complex tmux sessions easily.
|
|
189
155
|
email:
|
|
190
156
|
- allen.bargi@gmail.com
|
|
@@ -267,12 +233,12 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
|
267
233
|
requirements:
|
|
268
234
|
- - ">="
|
|
269
235
|
- !ruby/object:Gem::Version
|
|
270
|
-
version: 2.
|
|
236
|
+
version: '2.7'
|
|
271
237
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
|
272
238
|
requirements:
|
|
273
239
|
- - ">="
|
|
274
240
|
- !ruby/object:Gem::Version
|
|
275
|
-
version:
|
|
241
|
+
version: '2.7'
|
|
276
242
|
requirements: []
|
|
277
243
|
rubygems_version: 3.5.22
|
|
278
244
|
signing_key:
|