multish 0.3.0 → 0.4.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: d26fbeace3df038252b8a4b39319c07593ddede65c892542aa3bdbee2f3a8c8e
4
- data.tar.gz: 9457c3ef496f10d3f23fad25f85c5d46a297bf5ed554676431b14ba8fee3a771
3
+ metadata.gz: a664e0a48f48c32e9cce30421292ccd18b37516f19bdbbdbf7477a0f0bfc6a42
4
+ data.tar.gz: 1c9bbd3ba226cd35d4d282ea474dff9ec82359360d175e9fcbab57a6f4bcb565
5
5
  SHA512:
6
- metadata.gz: dda0a8d05902b289522d4e5a563554529018870c6120ab5706e1094e7d4a6fdfdabdd709f7de61b67fc58a5c04d96d8848607456426fdd6fa9f4a6e4e99737f3
7
- data.tar.gz: cd86199b25f754b2762e7ae7be758128e2cd8929abdb553036b825ef15d35235cef012c47f5d0f6ca41db8127b2028b97a16403d53bfa3b7a813bc3afd9181c5
6
+ metadata.gz: d5357d9dd1aa1c1199eb2af648e82454e6aa59c46583c494e70996f5665f20383dc91ce01c1c6409a926016ea359c6e04d2ef2402ab8d992bf46d5c120d6475e
7
+ data.tar.gz: dd03f7e31853a5401ace96228ac76fd90e709260d561281e1615c55cdb06d4592b58f3e9bb4ad65a375aa2906d8bc0cdd0488c159505de28d6560e2af0f7e47c
data/.rubocop.yml CHANGED
@@ -202,3 +202,6 @@ Style/RedundantArgument: # (new in 1.4)
202
202
  Enabled: true
203
203
  Style/SwapValues: # (new in 1.1)
204
204
  Enabled: true
205
+
206
+ Naming/MethodParameterName:
207
+ Enabled: false
data/lib/multish.rb CHANGED
@@ -6,6 +6,110 @@ require 'colorize'
6
6
 
7
7
  BRIGHT_WHITE = 15
8
8
 
9
+ $log = []
10
+
11
+ class Window
12
+ def initialize(height, width, top, left)
13
+ @window = Curses::Window.new(height, width, top, left)
14
+ @fgcolor = :black
15
+ @bgcolor = :bright_white
16
+ reset!
17
+ end
18
+
19
+ def self.screen_width
20
+ Curses.cols
21
+ end
22
+
23
+ def self.screen_height
24
+ Curses.lines
25
+ end
26
+
27
+ def setpos(x, y)
28
+ @window.setpos(x, y)
29
+ end
30
+
31
+ def bold=(value)
32
+ if value
33
+ @window.attron(Curses::A_BOLD)
34
+ else
35
+ @window.attroff(Curses::A_BOLD)
36
+ end
37
+ end
38
+
39
+ def fgcolor=(value)
40
+ @fgcolor = value
41
+ update_color!
42
+ end
43
+
44
+ def bgcolor=(value)
45
+ @bgcolor = value
46
+ update_color!
47
+ end
48
+
49
+ def update_color!
50
+ fgcode = get_code(@fgcolor)
51
+ bgcode = get_code(@bgcolor)
52
+ code = Window.create_color_pair(fgcode, bgcode)
53
+ @window.attron(Curses.color_pair(code))
54
+ end
55
+
56
+ def get_code(color)
57
+ case color
58
+ when :black
59
+ Curses::COLOR_BLACK
60
+ when :red
61
+ Curses::COLOR_RED
62
+ when :green
63
+ Curses::COLOR_GREEN
64
+ when :yellow
65
+ Curses::COLOR_YELLOW
66
+ when :blue
67
+ Curses::COLOR_BLUE
68
+ when :magenta
69
+ Curses::COLOR_MAGENTA
70
+ when :cyan
71
+ Curses::COLOR_CYAN
72
+ when :white
73
+ Curses::COLOR_WHITE
74
+ when :bright_white
75
+ Window.create_color(:bright_white, 1000, 1000, 1000)
76
+ end
77
+ end
78
+
79
+ def self.create_color(code, r, g, b)
80
+ @colors ||= {}
81
+ new_index = 15 + @colors.count
82
+ @colors[code] ||= [new_index, Curses.init_color(new_index, r, g, b)]
83
+ @colors[code][0]
84
+ end
85
+
86
+ def self.create_color_pair(fg, bg)
87
+ index = "#{fg}/#{bg}"
88
+ @pairs ||= {}
89
+ new_index = 100 + @pairs.count
90
+ @pairs[index] ||= [new_index, Curses.init_pair(new_index, fg, bg)]
91
+ @pairs[index][0]
92
+ end
93
+
94
+ def <<(str)
95
+ @window.addstr(str)
96
+ end
97
+
98
+ def scrollok(value)
99
+ @window.scrollok(value)
100
+ end
101
+
102
+ def refresh!
103
+ @window.refresh
104
+ end
105
+
106
+ def reset!
107
+ self.fgcolor = :black
108
+ self.bgcolor = :bright_white
109
+ self.bold = false
110
+ end
111
+ end
112
+
9
113
  class MultishItem
10
114
  attr_reader :command
11
115
 
@@ -17,11 +121,11 @@ class MultishItem
17
121
  end
18
122
 
19
123
  def width
20
- (Curses.cols / @count).floor
124
+ (Window.screen_width / @count).floor
21
125
  end
22
126
 
23
127
  def height
24
- Curses.lines
128
+ Window.screen_height
25
129
  end
26
130
 
27
131
  def left
@@ -33,19 +137,19 @@ class MultishItem
33
137
  end
34
138
 
35
139
  def create_window!
36
- @nav_window = Curses::Window.new(1, width - 1, top, left)
37
- @window = Curses::Window.new(height - 1, width - 1, top + 1, left)
140
+ @nav_window = Window.new(1, width - 1, top, left)
141
+ @window = Window.new(height - 1, width - 1, top + 1, left)
38
142
  @window.scrollok(true)
39
143
  update_title!
40
144
  end
41
145
 
42
146
  def color_code
43
147
  if !@wait_thr
44
- 4
148
+ :yellow
45
149
  elsif finished?
46
- errored? ? 3 : 2
150
+ errored? ? :red : :green
47
151
  else # rubocop:disable Lint/DuplicateBranch
48
- 4
152
+ :yellow
49
153
  end
50
154
  end
51
155
 
@@ -55,9 +159,11 @@ class MultishItem
55
159
 
56
160
  def update_title!
57
161
  @nav_window.setpos(0, 0)
58
- @nav_window.attron(Curses.color_pair(color_code) | Curses::A_REVERSE | Curses::A_BOLD)
59
- @nav_window.addstr(window_title.ljust(width - 1))
60
- @nav_window.refresh
162
+ @nav_window.fgcolor = color_code
163
+ @nav_window.bgcolor = :black
164
+ @nav_window.bold = true
165
+ @nav_window << window_title.ljust(width - 1)
166
+ @nav_window.refresh!
61
167
  end
62
168
 
63
169
  def window_title
@@ -73,7 +179,7 @@ class MultishItem
73
179
  [@stdout, @stderr]
74
180
  end
75
181
 
76
- def try_update(fd) # rubocop:disable Naming/MethodParameterName
182
+ def try_update(fd)
77
183
  return unless [@stdout, @stderr].include?(fd)
78
184
 
79
185
  line = fd.gets
@@ -83,27 +189,28 @@ class MultishItem
83
189
  def print(text)
84
190
  @output << text
85
191
  color_print(@window, text)
86
- @window.refresh
192
+ @window.refresh!
87
193
  end
88
194
 
89
195
  def color_print(window, input)
90
196
  parse_commands(input) do |op, arg|
91
197
  case op
92
198
  when :string
93
- window.addstr(arg)
199
+ window << arg
94
200
  when :reset
95
- window.attroff(Curses.color_pair(10) | Curses::A_BOLD)
201
+ window.reset!
96
202
  when :bold
97
- window.attron(Curses::A_BOLD)
203
+ window.bold = true
98
204
  when :color
99
- Curses.init_pair(10, arg, BRIGHT_WHITE)
100
- window.attron(Curses.color_pair(10))
205
+ window.fgcolor = arg
101
206
  when :error
102
207
  raise "ERROR: #{arg}"
103
208
  end
104
209
  end
105
210
  end
106
211
 
212
+ COLORS = %i[black red green yellow blue magenta cyan white].freeze
213
+
107
214
  def parse_commands(string)
108
215
  parse_string(string) do |op, arg|
109
216
  case op
@@ -120,7 +227,7 @@ class MultishItem
120
227
  when 1
121
228
  yield [:bold]
122
229
  when 30..37
123
- color = Curses::COLOR_BLACK + subarg - 30
230
+ color = COLORS[subarg - 30]
124
231
  yield [:color, color]
125
232
  end
126
233
  end
@@ -200,10 +307,6 @@ class Multish
200
307
  Curses.init_screen
201
308
  Curses.start_color
202
309
  Curses.curs_set(0)
203
- Curses.init_pair(2, Curses::COLOR_WHITE, Curses::COLOR_GREEN)
204
- Curses.init_pair(3, Curses::COLOR_WHITE, Curses::COLOR_RED)
205
- Curses.init_pair(4, Curses::COLOR_WHITE, Curses::COLOR_BLACK)
206
- Curses.init_color(BRIGHT_WHITE, 1000, 1000, 1000)
207
310
  Curses.use_default_colors
208
311
  Curses.cbreak
209
312
  @commands.each(&:create_window!)
@@ -229,6 +332,7 @@ class Multish
229
332
  ensure
230
333
  Curses.curs_set(1)
231
334
  Curses.close_screen
335
+ warn $log.join("\n").blue
232
336
  if errored?
233
337
  warn 'At least one of the commands exited with error.'
234
338
  @commands.select(&:errored?).each(&:print_output!)
@@ -1,3 +1,3 @@
1
1
  class Multish
2
- VERSION = '0.3.0'.freeze
2
+ VERSION = '0.4.0'.freeze
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: multish
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.0
4
+ version: 0.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Tomasz Dąbrowski
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2021-02-23 00:00:00.000000000 Z
11
+ date: 2021-02-24 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler