heytmux 0.2.0 → 0.3.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: fe3e03ac69a2016e30bea5cd11e8bb8dd367ea4acc7e9a6402185201f5a66e7c
4
- data.tar.gz: 170eca1fda547fdd1b13b2a0e684903a5cea2f9812f993e6a9418e694e8f66f9
3
+ metadata.gz: 2416296679429973f3324dee4b41204cf0414cba0296028c2856215370dc2627
4
+ data.tar.gz: 6b5b41223076adf68875297d9e2c5fc8959b07250a37e9df71e435baa03bed6a
5
5
  SHA512:
6
- metadata.gz: f0287d21b34ced56d79fe24fa96dcf6efbc8985469df7ddd6a83103b9823e0911c000257af71c3f7148365bff15384884fb0bfb78bfa6ffdd20253a6b5ba7ea4
7
- data.tar.gz: 8a73271ceb4baf815354603ec4edbe45a5ec43ab272ecba00c5559acfbec6b71f066fb81e6bd4e1fb82c4be5250a0bcc9e8fc2ae4e4f9a15e43d5e6a49c44533
6
+ metadata.gz: 579bf7e26c4e2c91870303e608c6e5a9bfe9d9368b1d610550fa6d0e185e4cfc62aaf4c364f12ef5679e5a263548b5c44720074e8675e0759059701e0b587b7b
7
+ data.tar.gz: fcb6ae512001bb29b3af8c2aeb8f124dbb2fe66b018769ca6bd7af9804b3dbc82058dcbc96a4cf7951cff939ed635f7085dc7fed95ffdd33c9a4f3b3ec87e453
data/Gemfile CHANGED
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  source 'https://rubygems.org'
2
4
 
3
5
  # Specify your gem's dependencies in heytmux.gemspec
data/README.md CHANGED
@@ -1,7 +1,7 @@
1
1
  Hey tmux!
2
2
  =========
3
3
 
4
- [![travis-ci](https://travis-ci.org/junegunn/heytmux.svg?branch=master)](https://travis-ci.org/junegunn/heytmux)
4
+ [![GitHub Actions Status](https://github.com/junegunn/heytmux/actions/workflows/ubuntu.yml/badge.svg)](https://github.com/junegunn/heytmux/actions)
5
5
  [![Coverage Status](https://coveralls.io/repos/github/junegunn/heytmux/badge.svg?branch=master)](https://coveralls.io/github/junegunn/heytmux?branch=master)
6
6
  [![Gem](https://img.shields.io/gem/v/heytmux.svg)](https://rubygems.org/gems/heytmux)
7
7
 
data/Rakefile CHANGED
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'bundler/gem_tasks'
2
4
  require 'rake/testtask'
3
5
 
data/exe/heytmux CHANGED
@@ -23,7 +23,7 @@ strings = [ARGV.any? || $stdin.tty? ? nil : ['standard input', $stdin.read],
23
23
  specs = strings.map do |name, str|
24
24
  begin
25
25
  str = Heytmux.replace_env_vars(str)
26
- YAML.respond_to?(:safe_load) ? YAML.safe_load(str) : YAML.load(str)
26
+ YAML.safe_load(str)
27
27
  rescue StandardError => e
28
28
  abort("Failed to parse #{name}: #{e}")
29
29
  end
data/heytmux.gemspec CHANGED
@@ -26,5 +26,5 @@ Gem::Specification.new do |spec|
26
26
  spec.add_development_dependency 'coveralls_reborn'
27
27
  spec.add_development_dependency 'minitest'
28
28
  spec.add_development_dependency 'pry'
29
- spec.add_development_dependency 'rake', '~> 12.0'
29
+ spec.add_development_dependency 'rake'
30
30
  end
data/lib/heytmux/core.rb CHANGED
@@ -77,7 +77,11 @@ module Heytmux
77
77
  label, body = command.is_a?(Hash) ? command.first : [:paste, command]
78
78
  PaneAction.for(label).process(window_index, pane_index, body) do |source|
79
79
  string = source.to_s
80
- item ? string.gsub(ITEM_PAT, item).gsub(ITEM_INDEX_PAT, item_index.to_s) : string
80
+ if item
81
+ string.gsub(ITEM_PAT, item).gsub(ITEM_INDEX_PAT, item_index.to_s)
82
+ else
83
+ string
84
+ end
81
85
  end
82
86
  end
83
87
  end
@@ -85,9 +89,8 @@ module Heytmux
85
89
  # Groups entities by the group key and extracts unique, sorted indexes and
86
90
  # returns stateful indexer that issues index number for the given group key
87
91
  def indexer(entities, group_key, index_key)
88
- indexes =
89
- Hash[entities.group_by { |e| e[group_key] }
90
- .map { |g, es| [g, es.map { |e| e[index_key] }.sort.uniq] }]
92
+ indexes = entities.group_by { |e| e[group_key] }
93
+ .transform_values { |es| es.map { |e| e[index_key] }.sort.uniq }
91
94
  ->(group) { indexes.fetch(group, []).shift }
92
95
  end
93
96
  private_class_method :indexer
@@ -141,10 +144,17 @@ module Heytmux
141
144
  end
142
145
 
143
146
  def interpret_and_expand_pane_spec(pane, items, pane_indexer)
147
+ pane_items = pane[ITEMS_KEY]
148
+ if pane_items && pane.length > 1
149
+ pane = pane.except(ITEMS_KEY)
150
+ items = pane_items || items
151
+ end
152
+
144
153
  title, command = pane.is_a?(Hash) ? pane.first : [pane.tr("\n", ' '), pane]
145
154
  if title =~ ITEM_PAT || title =~ ITEM_INDEX_PAT
146
155
  items.map.with_index do |item, item_idx|
147
- title_sub = title.gsub(ITEM_PAT, item.to_s).gsub(ITEM_INDEX_PAT, item_idx.to_s)
156
+ title_sub = title.gsub(ITEM_PAT, item.to_s)
157
+ .gsub(ITEM_INDEX_PAT, item_idx.to_s)
148
158
  { title: title_sub, command: command,
149
159
  item: item.to_s, item_index: item_idx,
150
160
  index: pane_indexer[title_sub] }
@@ -156,9 +166,9 @@ module Heytmux
156
166
 
157
167
  # Checks if there are entities without the required_field and creates them
158
168
  # with the given block. Returns two arrays of found and created entities.
159
- def create_if_missing(entities, required_field)
169
+ def create_if_missing(entities, required_field, &block)
160
170
  found, missing = entities.partition { |e| e[required_field] }
161
- [found, missing.map { |e| yield e }]
171
+ [found, missing.map(&block)]
162
172
  end
163
173
  private_class_method :create_if_missing
164
174
 
@@ -25,7 +25,7 @@ module Heytmux
25
25
  def register(*labels, klass)
26
26
  instance = klass.new
27
27
  (@actions ||= {}).merge!(
28
- Hash[labels.map { |label| [label, instance] }]
28
+ labels.to_h { |label| [label, instance] }
29
29
  )
30
30
  end
31
31
 
@@ -17,6 +17,7 @@ module Heytmux
17
17
  wait_until do
18
18
  content = Tmux.capture(window_index, pane_index)
19
19
  raise 'Failed to capture pane content' unless $CHILD_STATUS.success?
20
+
20
21
  content =~ regex
21
22
  end
22
23
  end
data/lib/heytmux/tmux.rb CHANGED
@@ -23,7 +23,7 @@ module Heytmux
23
23
  list = tmux(%w[list-panes -s -F],
24
24
  labels.map { |label| "\#{#{label}}" }.join(delimiter))
25
25
  list.each_line.map do |line|
26
- Hash[labels.zip(line.chomp.split(delimiter))].tap do |h|
26
+ labels.zip(line.chomp.split(delimiter)).to_h.tap do |h|
27
27
  h[:window_index] = h[:window_index].to_i
28
28
  h[:pane_index] = h[:pane_index].to_i
29
29
  end
@@ -12,15 +12,15 @@ module Heytmux
12
12
  unless spec.key?(WINDOWS_KEY)
13
13
  raise(ArgumentError, 'windows key is not found')
14
14
  end
15
+
15
16
  spec[WINDOWS_KEY]
16
17
  when Array then spec
17
18
  else
18
19
  raise ArgumentError, "Not a valid spec: #{spec}"
19
20
  end
20
21
 
21
- unless windows.is_a?(Array)
22
- raise ArgumentError, 'windows must be given as a list'
23
- end
22
+ raise ArgumentError, 'windows must be given as a list' unless windows.is_a?(Array)
23
+
24
24
  windows.each { |window| validate_window(window) }
25
25
  nil
26
26
  end
@@ -33,9 +33,8 @@ module Heytmux
33
33
  message = "Not a valid window spec: #{window_spec.inspect}"
34
34
  case window_spec
35
35
  when Hash
36
- unless single_spec?(window_spec, Hash, Array)
37
- raise ArgumentError, message
38
- end
36
+ raise ArgumentError, message unless single_spec?(window_spec, Hash, Array)
37
+
39
38
  spec = window_spec.first.last
40
39
  spec = { PANES_KEY => spec } if spec.is_a?(Array)
41
40
  spec.fetch(PANES_KEY, []).each do |pane|
@@ -55,6 +54,17 @@ module Heytmux
55
54
  message = "Not a valid pane spec: #{pane_spec.inspect}"
56
55
  case pane_spec
57
56
  when Hash
57
+ # Is 'items' present?
58
+ has_items = pane_spec.key?(ITEMS_KEY)
59
+ if has_items && pane_spec.except(ITEMS_KEY).any?
60
+ items = pane_spec[ITEMS_KEY]
61
+ if !items.is_a?(Array) || items.empty?
62
+ raise ArgumentError, "'items' must be a non-empty array"
63
+ end
64
+
65
+ pane_spec = pane_spec.except(ITEMS_KEY)
66
+ end
67
+
58
68
  unless single_spec?(pane_spec)
59
69
  if unquoted_pane_title?(pane_spec)
60
70
  message = 'Invalid pane title. ' \
@@ -62,6 +72,15 @@ module Heytmux
62
72
  end
63
73
  raise ArgumentError, message
64
74
  end
75
+
76
+ if has_items
77
+ title = pane_spec.first.first
78
+ unless title =~ ITEM_PAT || title =~ ITEM_INDEX_PAT
79
+ raise ArgumentError,
80
+ 'Pane title must contain {{ item }} or {{ item.index }} ' \
81
+ "when 'items' is given"
82
+ end
83
+ end
65
84
  validate_commands(pane_spec.first.last)
66
85
  else
67
86
  raise ArgumentError, message unless valid_name?(pane_spec)
@@ -77,6 +96,7 @@ module Heytmux
77
96
  case command
78
97
  when Hash
79
98
  raise ArgumentError, message unless single_spec?(command)
99
+
80
100
  label, body = command.first
81
101
  validate_action(label, body)
82
102
  else
@@ -90,6 +110,7 @@ module Heytmux
90
110
  def validate_action(label, body)
91
111
  action = PaneAction.for(label)
92
112
  raise ArgumentError, "Unsupported action: #{label}" unless action
113
+
93
114
  action.validate(body)
94
115
  end
95
116
 
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Heytmux
4
- VERSION = '0.2.0'
4
+ VERSION = '0.3.0'
5
5
  end
data/lib/heytmux.rb CHANGED
@@ -6,9 +6,9 @@ require 'set'
6
6
  module Heytmux
7
7
  DEFAULT_LAYOUT = ->(num_panes) { num_panes <= 3 ? 'even-vertical' : 'tiled' }
8
8
  DEFAULT_OPTIONS = {
9
- 'automatic-rename' => 'off',
10
- 'allow-rename' => 'off',
11
- 'pane-base-index' => 0,
9
+ 'automatic-rename' => 'off',
10
+ 'allow-rename' => 'off',
11
+ 'pane-base-index' => 0,
12
12
  'pane-border-status' => 'bottom',
13
13
  'pane-border-format' => '#{pane_title}'
14
14
  }.freeze
@@ -17,9 +17,9 @@ module Heytmux
17
17
  LAYOUT_KEY = 'layout'
18
18
  PANES_KEY = 'panes'
19
19
  ITEMS_KEY = 'items'
20
- ITEM_PAT = /{{ *item *}}/i
21
- ITEM_INDEX_PAT = /{{ *item\.index *}}/i
22
- ENV_PAT = /{{ *\$([a-z0-9_]+) *(?:\| *(.*?) *)?}}/i
20
+ ITEM_PAT = /{{ *item *}}/i.freeze
21
+ ITEM_INDEX_PAT = /{{ *item\.index *}}/i.freeze
22
+ ENV_PAT = /{{ *\$([a-z0-9_]+) *(?:\| *(.*?) *)?}}/i.freeze
23
23
 
24
24
  EXPECT_SLEEP_INTERVAL = 0.5
25
25
  EXPECT_TIMEOUT = 60
metadata CHANGED
@@ -1,14 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: heytmux
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.0
4
+ version: 0.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Junegunn Choi
8
- autorequire:
9
8
  bindir: exe
10
9
  cert_chain: []
11
- date: 2021-04-30 00:00:00.000000000 Z
10
+ date: 2025-05-20 00:00:00.000000000 Z
12
11
  dependencies:
13
12
  - !ruby/object:Gem::Dependency
14
13
  name: bundler
@@ -70,16 +69,16 @@ dependencies:
70
69
  name: rake
71
70
  requirement: !ruby/object:Gem::Requirement
72
71
  requirements:
73
- - - "~>"
72
+ - - ">="
74
73
  - !ruby/object:Gem::Version
75
- version: '12.0'
74
+ version: '0'
76
75
  type: :development
77
76
  prerelease: false
78
77
  version_requirements: !ruby/object:Gem::Requirement
79
78
  requirements:
80
- - - "~>"
79
+ - - ">="
81
80
  - !ruby/object:Gem::Version
82
- version: '12.0'
81
+ version: '0'
83
82
  description: Tmux scripting made easy
84
83
  email:
85
84
  - junegunn.c@gmail.com
@@ -107,7 +106,6 @@ files:
107
106
  homepage: https://github.com/junegunn/heytmux
108
107
  licenses: []
109
108
  metadata: {}
110
- post_install_message:
111
109
  rdoc_options: []
112
110
  require_paths:
113
111
  - lib
@@ -122,8 +120,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
122
120
  - !ruby/object:Gem::Version
123
121
  version: '0'
124
122
  requirements: []
125
- rubygems_version: 3.2.15
126
- signing_key:
123
+ rubygems_version: 3.6.2
127
124
  specification_version: 4
128
125
  summary: Hey tmux!
129
126
  test_files: []