multish 0.2.0 → 0.3.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/multish.rb +94 -4
- data/lib/multish/version.rb +1 -1
- metadata +1 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: d26fbeace3df038252b8a4b39319c07593ddede65c892542aa3bdbee2f3a8c8e
|
4
|
+
data.tar.gz: 9457c3ef496f10d3f23fad25f85c5d46a297bf5ed554676431b14ba8fee3a771
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: dda0a8d05902b289522d4e5a563554529018870c6120ab5706e1094e7d4a6fdfdabdd709f7de61b67fc58a5c04d96d8848607456426fdd6fa9f4a6e4e99737f3
|
7
|
+
data.tar.gz: cd86199b25f754b2762e7ae7be758128e2cd8929abdb553036b825ef15d35235cef012c47f5d0f6ca41db8127b2028b97a16403d53bfa3b7a813bc3afd9181c5
|
data/lib/multish.rb
CHANGED
@@ -4,6 +4,8 @@ require 'curses'
|
|
4
4
|
require 'open3'
|
5
5
|
require 'colorize'
|
6
6
|
|
7
|
+
BRIGHT_WHITE = 15
|
8
|
+
|
7
9
|
class MultishItem
|
8
10
|
attr_reader :command
|
9
11
|
|
@@ -80,10 +82,94 @@ class MultishItem
|
|
80
82
|
|
81
83
|
def print(text)
|
82
84
|
@output << text
|
83
|
-
@window
|
85
|
+
color_print(@window, text)
|
84
86
|
@window.refresh
|
85
87
|
end
|
86
88
|
|
89
|
+
def color_print(window, input)
|
90
|
+
parse_commands(input) do |op, arg|
|
91
|
+
case op
|
92
|
+
when :string
|
93
|
+
window.addstr(arg)
|
94
|
+
when :reset
|
95
|
+
window.attroff(Curses.color_pair(10) | Curses::A_BOLD)
|
96
|
+
when :bold
|
97
|
+
window.attron(Curses::A_BOLD)
|
98
|
+
when :color
|
99
|
+
Curses.init_pair(10, arg, BRIGHT_WHITE)
|
100
|
+
window.attron(Curses.color_pair(10))
|
101
|
+
when :error
|
102
|
+
raise "ERROR: #{arg}"
|
103
|
+
end
|
104
|
+
end
|
105
|
+
end
|
106
|
+
|
107
|
+
def parse_commands(string)
|
108
|
+
parse_string(string) do |op, arg|
|
109
|
+
case op
|
110
|
+
when :string
|
111
|
+
yield [:string, arg]
|
112
|
+
when :escape
|
113
|
+
if arg == '[m'
|
114
|
+
yield [:reset]
|
115
|
+
elsif arg[/^\[(\d+;)+(\d+)m$/]
|
116
|
+
args = ($1 + $2).split(';')
|
117
|
+
args.each do |subarg|
|
118
|
+
subarg = subarg.to_i
|
119
|
+
case subarg
|
120
|
+
when 1
|
121
|
+
yield [:bold]
|
122
|
+
when 30..37
|
123
|
+
color = Curses::COLOR_BLACK + subarg - 30
|
124
|
+
yield [:color, color]
|
125
|
+
end
|
126
|
+
end
|
127
|
+
end
|
128
|
+
when :error
|
129
|
+
yield [:error, arg]
|
130
|
+
end
|
131
|
+
end
|
132
|
+
end
|
133
|
+
|
134
|
+
def parse_string(string)
|
135
|
+
len = string.length
|
136
|
+
i = 0
|
137
|
+
chars = ''
|
138
|
+
while i < len
|
139
|
+
char = string[i]
|
140
|
+
if char == "\e"
|
141
|
+
yield [:string, chars] if !chars.empty? && block_given?
|
142
|
+
chars = ''
|
143
|
+
escape = ''
|
144
|
+
i += 1
|
145
|
+
if string[i] == '['
|
146
|
+
escape << string[i]
|
147
|
+
i += 1
|
148
|
+
else
|
149
|
+
return yield [:error, string]
|
150
|
+
end
|
151
|
+
while string[i] =~ /[\x30-\x3f]/
|
152
|
+
escape << string[i]
|
153
|
+
i += 1
|
154
|
+
end
|
155
|
+
while string[i] =~ /[\x20–\x2f]/
|
156
|
+
escape << string[i]
|
157
|
+
i += 1
|
158
|
+
end
|
159
|
+
if string[i] =~ /[\x40-\x7e]/
|
160
|
+
escape << string[i]
|
161
|
+
else
|
162
|
+
return yield [:error, string]
|
163
|
+
end
|
164
|
+
yield [:escape, escape] if block_given?
|
165
|
+
else
|
166
|
+
chars << char
|
167
|
+
end
|
168
|
+
i += 1
|
169
|
+
end
|
170
|
+
yield [:string, chars] if !chars.empty? && block_given?
|
171
|
+
end
|
172
|
+
|
87
173
|
def finished?
|
88
174
|
return false unless @wait_thr
|
89
175
|
|
@@ -117,6 +203,7 @@ class Multish
|
|
117
203
|
Curses.init_pair(2, Curses::COLOR_WHITE, Curses::COLOR_GREEN)
|
118
204
|
Curses.init_pair(3, Curses::COLOR_WHITE, Curses::COLOR_RED)
|
119
205
|
Curses.init_pair(4, Curses::COLOR_WHITE, Curses::COLOR_BLACK)
|
206
|
+
Curses.init_color(BRIGHT_WHITE, 1000, 1000, 1000)
|
120
207
|
Curses.use_default_colors
|
121
208
|
Curses.cbreak
|
122
209
|
@commands.each(&:create_window!)
|
@@ -134,14 +221,17 @@ class Multish
|
|
134
221
|
@commands.each(&:update_title!)
|
135
222
|
break if @commands.all?(&:finished?)
|
136
223
|
end
|
224
|
+
rescue StandardError => e
|
225
|
+
Curses.close_screen
|
226
|
+
warn 'INTERNAL ERROR'.red
|
227
|
+
warn e.message
|
228
|
+
warn e.backtrace
|
137
229
|
ensure
|
138
230
|
Curses.curs_set(1)
|
139
231
|
Curses.close_screen
|
140
232
|
if errored?
|
141
233
|
warn 'At least one of the commands exited with error.'
|
142
|
-
@commands.select(&:errored?).each
|
143
|
-
command.print_output!
|
144
|
-
end
|
234
|
+
@commands.select(&:errored?).each(&:print_output!)
|
145
235
|
exit 1
|
146
236
|
else
|
147
237
|
exit 0
|
data/lib/multish/version.rb
CHANGED