vedeu 0.4.22 → 0.4.23
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/Rakefile +5 -5
- data/examples/geometry_app.rb +2 -2
- data/lib/vedeu/bindings.rb +2 -15
- data/lib/vedeu/buffers/buffer.rb +2 -6
- data/lib/vedeu/configuration/cli.rb +4 -4
- data/lib/vedeu/dsl/components/border.rb +24 -8
- data/lib/vedeu/dsl/components/geometry.rb +10 -0
- data/lib/vedeu/events/event.rb +1 -2
- data/lib/vedeu/geometry/area.rb +4 -1
- data/lib/vedeu/geometry/geometry.rb +51 -18
- data/lib/vedeu/geometry/grid.rb +4 -28
- data/lib/vedeu/launcher.rb +6 -2
- data/lib/vedeu/models/line.rb +1 -1
- data/lib/vedeu/output/clear.rb +8 -8
- data/lib/vedeu/output/compressor.rb +1 -0
- data/lib/vedeu/output/esc.rb +29 -101
- data/lib/vedeu/output/html_char.rb +9 -9
- data/lib/vedeu/output/refresh.rb +17 -5
- data/lib/vedeu/output/renderers/all.rb +1 -9
- data/lib/vedeu/output/translator.rb +1 -1
- data/lib/vedeu/output/viewport.rb +1 -1
- data/lib/vedeu/repositories/repositories/colours.rb +6 -3
- data/lib/vedeu/support/all.rb +1 -0
- data/lib/vedeu/support/template.rb +2 -1
- data/lib/vedeu/support/terminal.rb +2 -0
- data/lib/vedeu/support/timer.rb +44 -0
- data/test/lib/vedeu/buffers/buffer_test.rb +1 -7
- data/test/lib/vedeu/configuration/cli_test.rb +28 -0
- data/test/lib/vedeu/dsl/components/geometry_test.rb +12 -0
- data/test/lib/vedeu/geometry/geometry_test.rb +8 -0
- data/test/lib/vedeu/geometry/grid_test.rb +0 -20
- data/test/lib/vedeu/geometry/position_test.rb +6 -0
- data/test/lib/vedeu/null/border_test.rb +6 -0
- data/test/lib/vedeu/output/clear_test.rb +12 -6
- data/test/lib/vedeu/output/compressor_test.rb +29 -0
- data/test/lib/vedeu/output/esc_test.rb +26 -26
- data/test/lib/vedeu/output/presentation_test.rb +22 -0
- data/test/lib/vedeu/output/translator_test.rb +18 -16
- data/test/lib/vedeu/output/viewport_test.rb +163 -97
- data/test/lib/vedeu/output/virtual_terminal_test.rb +6 -0
- data/test/lib/vedeu/repositories/repositories/colours_test.rb +29 -4
- data/test/lib/vedeu/repositories/repository_test.rb +6 -0
- data/vedeu.gemspec +4 -4
- metadata +3 -44
data/lib/vedeu/models/line.rb
CHANGED
data/lib/vedeu/output/clear.rb
CHANGED
@@ -65,7 +65,7 @@ module Vedeu
|
|
65
65
|
Vedeu::Char.new(value: ' ',
|
66
66
|
colour: clear_colour,
|
67
67
|
style: style,
|
68
|
-
position:
|
68
|
+
position: Vedeu::IndexPosition[iy, ix, *position])
|
69
69
|
end
|
70
70
|
end
|
71
71
|
else
|
@@ -105,9 +105,9 @@ module Vedeu
|
|
105
105
|
# @return [Vedeu::Colour] The default background and foreground colours for
|
106
106
|
# the terminal, or the colours of the interface.
|
107
107
|
def clear_colour
|
108
|
-
if use_terminal_colours?
|
109
|
-
|
110
|
-
|
108
|
+
@colour ||= if use_terminal_colours?
|
109
|
+
Vedeu::Colour.new(background: :default,
|
110
|
+
foreground: :default)
|
111
111
|
|
112
112
|
else
|
113
113
|
colour
|
@@ -149,12 +149,12 @@ module Vedeu
|
|
149
149
|
# @param iy [Fixnum]
|
150
150
|
# @param ix [Fixnum]
|
151
151
|
# @return [Vedeu::IndexPosition]
|
152
|
-
def position
|
153
|
-
if clear_border?
|
154
|
-
|
152
|
+
def position
|
153
|
+
@position ||= if clear_border?
|
154
|
+
[y, x]
|
155
155
|
|
156
156
|
else
|
157
|
-
|
157
|
+
[by, bx]
|
158
158
|
|
159
159
|
end
|
160
160
|
end
|
data/lib/vedeu/output/esc.rb
CHANGED
@@ -22,23 +22,9 @@ module Vedeu
|
|
22
22
|
# Esc.on_blue { 'some text' } # => "\e[44msome text\e[49m"
|
23
23
|
#
|
24
24
|
# # Valid names:
|
25
|
-
# :black
|
26
|
-
# :
|
27
|
-
# :
|
28
|
-
# :yellow
|
29
|
-
# :blue
|
30
|
-
# :magenta
|
31
|
-
# :cyan
|
32
|
-
# :light_grey
|
33
|
-
# :default
|
34
|
-
# :dark_grey
|
35
|
-
# :light_red
|
36
|
-
# :light_green
|
37
|
-
# :light_yellow
|
38
|
-
# :light_blue
|
39
|
-
# :light_magenta
|
40
|
-
# :light_cyan
|
41
|
-
# :white
|
25
|
+
# :black, :red, :green, :yellow, :blue, :magenta, :cyan, :light_grey,
|
26
|
+
# :default, :dark_grey, :light_red, :light_green, :light_yellow,
|
27
|
+
# :light_blue, :light_magenta, :light_cyan, :white
|
42
28
|
#
|
43
29
|
# @return [Hash<Symbol => Fixnum>]
|
44
30
|
def codes
|
@@ -88,6 +74,32 @@ module Vedeu
|
|
88
74
|
end
|
89
75
|
end
|
90
76
|
|
77
|
+
# @return [Hash<Symbol => String>]
|
78
|
+
def actions
|
79
|
+
{
|
80
|
+
hide_cursor: "\e[?25l",
|
81
|
+
show_cursor: "\e[?25h",
|
82
|
+
bg_reset: "\e[49m",
|
83
|
+
blink: "\e[5m",
|
84
|
+
blink_off: "\e[25m",
|
85
|
+
bold: "\e[1m",
|
86
|
+
bold_off: "\e[22m",
|
87
|
+
border_on: "\e(0",
|
88
|
+
border_off: "\e(B",
|
89
|
+
dim: "\e[2m",
|
90
|
+
fg_reset: "\e[39m",
|
91
|
+
negative: "\e[7m",
|
92
|
+
positive: "\e[27m",
|
93
|
+
reset: "\e[0m",
|
94
|
+
underline: "\e[4m",
|
95
|
+
underline_off: "\e[24m",
|
96
|
+
}
|
97
|
+
end
|
98
|
+
|
99
|
+
actions.each do |key, code|
|
100
|
+
define_method(key) { code }
|
101
|
+
end
|
102
|
+
|
91
103
|
# Return the stream with the escape sequences escaped so that they can be
|
92
104
|
# printed to the terminal instead of being interpreted by the terminal which
|
93
105
|
# will render them. This way we can see what escape sequences are being sent
|
@@ -101,16 +113,6 @@ module Vedeu
|
|
101
113
|
stream.gsub(/\e/, '\\e')
|
102
114
|
end
|
103
115
|
|
104
|
-
# @return [String]
|
105
|
-
def hide_cursor
|
106
|
-
"\e[?25l"
|
107
|
-
end
|
108
|
-
|
109
|
-
# @return [String]
|
110
|
-
def show_cursor
|
111
|
-
"\e[?25h"
|
112
|
-
end
|
113
|
-
|
114
116
|
# Return the escape sequence string from the list of recognised sequence
|
115
117
|
# 'commands', or an empty string if the 'command' cannot be found.
|
116
118
|
#
|
@@ -140,45 +142,6 @@ module Vedeu
|
|
140
142
|
|
141
143
|
private
|
142
144
|
|
143
|
-
# @return [String]
|
144
|
-
def bg_reset
|
145
|
-
"\e[49m"
|
146
|
-
end
|
147
|
-
|
148
|
-
# @return [String]
|
149
|
-
def blink
|
150
|
-
"\e[5m"
|
151
|
-
end
|
152
|
-
|
153
|
-
# @return [String]
|
154
|
-
def blink_off
|
155
|
-
"\e[25m"
|
156
|
-
end
|
157
|
-
|
158
|
-
# @return [String]
|
159
|
-
def bold
|
160
|
-
"\e[1m"
|
161
|
-
end
|
162
|
-
|
163
|
-
# @return [String]
|
164
|
-
def bold_off
|
165
|
-
"\e[22m"
|
166
|
-
end
|
167
|
-
|
168
|
-
# Returns the escape sequence to start a border.
|
169
|
-
#
|
170
|
-
# @return [String]
|
171
|
-
def border_on
|
172
|
-
"\e(0"
|
173
|
-
end
|
174
|
-
|
175
|
-
# Returns the escape sequence to end a border.
|
176
|
-
#
|
177
|
-
# @return [String]
|
178
|
-
def border_off
|
179
|
-
"\e(B"
|
180
|
-
end
|
181
|
-
|
182
145
|
# @return [String]
|
183
146
|
def clear
|
184
147
|
[colour_reset, "\e[2J"].join
|
@@ -199,36 +162,11 @@ module Vedeu
|
|
199
162
|
[fg_reset, bg_reset].join
|
200
163
|
end
|
201
164
|
|
202
|
-
# @return [String]
|
203
|
-
def dim
|
204
|
-
"\e[2m"
|
205
|
-
end
|
206
|
-
|
207
|
-
# @return [String]
|
208
|
-
def fg_reset
|
209
|
-
"\e[39m"
|
210
|
-
end
|
211
|
-
|
212
|
-
# @return [String]
|
213
|
-
def negative
|
214
|
-
"\e[7m"
|
215
|
-
end
|
216
|
-
|
217
165
|
# @return [String]
|
218
166
|
def normal
|
219
167
|
[underline_off, bold_off, positive].join
|
220
168
|
end
|
221
169
|
|
222
|
-
# @return [String]
|
223
|
-
def positive
|
224
|
-
"\e[27m"
|
225
|
-
end
|
226
|
-
|
227
|
-
# @return [String]
|
228
|
-
def reset
|
229
|
-
"\e[0m"
|
230
|
-
end
|
231
|
-
|
232
170
|
# @return [String]
|
233
171
|
def screen_init
|
234
172
|
[reset, clear, hide_cursor].join
|
@@ -239,16 +177,6 @@ module Vedeu
|
|
239
177
|
[show_cursor, colour_reset, reset].join
|
240
178
|
end
|
241
179
|
|
242
|
-
# @return [String]
|
243
|
-
def underline
|
244
|
-
"\e[4m"
|
245
|
-
end
|
246
|
-
|
247
|
-
# @return [String]
|
248
|
-
def underline_off
|
249
|
-
"\e[24m"
|
250
|
-
end
|
251
|
-
|
252
180
|
end # Esc
|
253
181
|
|
254
182
|
end # Vedeu
|
@@ -55,21 +55,21 @@ module Vedeu
|
|
55
55
|
# @return [String]
|
56
56
|
def border_style
|
57
57
|
case border
|
58
|
-
when :top_horizontal then
|
59
|
-
when :left_vertical then
|
60
|
-
when :right_vertical then
|
61
|
-
when :bottom_horizontal then
|
62
|
-
when :top_left then [
|
63
|
-
when :top_right then [
|
64
|
-
when :bottom_left then [
|
65
|
-
when :bottom_right then [
|
58
|
+
when :top_horizontal then css('top')
|
59
|
+
when :left_vertical then css('left')
|
60
|
+
when :right_vertical then css('right')
|
61
|
+
when :bottom_horizontal then css('bottom')
|
62
|
+
when :top_left then [css('top'), css('left')].join
|
63
|
+
when :top_right then [css('top'), css('right')].join
|
64
|
+
when :bottom_left then [css('bottom'), css('left')].join
|
65
|
+
when :bottom_right then [css('bottom'), css('right')].join
|
66
66
|
else
|
67
67
|
''
|
68
68
|
end
|
69
69
|
end
|
70
70
|
|
71
71
|
# @return [String]
|
72
|
-
def
|
72
|
+
def css(direction = '')
|
73
73
|
"border-#{direction}:1px #{fg} solid;"
|
74
74
|
end
|
75
75
|
|
data/lib/vedeu/output/refresh.rb
CHANGED
@@ -10,7 +10,13 @@ module Vedeu
|
|
10
10
|
#
|
11
11
|
# @return [Array]
|
12
12
|
def all
|
13
|
-
|
13
|
+
message = "Refreshing all interfaces"
|
14
|
+
|
15
|
+
Vedeu.log(type: :info, message: message)
|
16
|
+
|
17
|
+
Vedeu::Timer.for(message) do
|
18
|
+
Vedeu.interfaces.registered.each { |name| by_name(name) }
|
19
|
+
end
|
14
20
|
end
|
15
21
|
|
16
22
|
# Refresh the interface which is currently focussed.
|
@@ -26,9 +32,13 @@ module Vedeu
|
|
26
32
|
# @return [Array|ModelNotFound] A collection of the names of interfaces
|
27
33
|
# refreshed, or an exception if the group was not found.
|
28
34
|
def by_group(group_name)
|
29
|
-
|
35
|
+
message = "Refreshing group: '#{group_name}'"
|
30
36
|
|
31
|
-
Vedeu.
|
37
|
+
Vedeu.log(type: :info, message: message)
|
38
|
+
|
39
|
+
Vedeu::Timer.for(message) do
|
40
|
+
Vedeu.groups.find!(group_name).members.each { |name| by_name(name) }
|
41
|
+
end
|
32
42
|
end
|
33
43
|
|
34
44
|
# Refresh an interface by name.
|
@@ -37,9 +47,11 @@ module Vedeu
|
|
37
47
|
# named buffer.
|
38
48
|
# @return [Array|ModelNotFound]
|
39
49
|
def by_name(name)
|
40
|
-
|
50
|
+
message = "Refreshing interface: '#{name}'"
|
51
|
+
|
52
|
+
Vedeu.log(type: :info, message: message)
|
41
53
|
|
42
|
-
Vedeu.buffers.by_name(name).render
|
54
|
+
Vedeu::Timer.for(message) { Vedeu.buffers.by_name(name).render }
|
43
55
|
end
|
44
56
|
|
45
57
|
end # Refresh
|
@@ -23,24 +23,16 @@ module Vedeu
|
|
23
23
|
|
24
24
|
# @return [Array<void>]
|
25
25
|
def render(*args)
|
26
|
-
# acc = []
|
27
26
|
threads = storage.map do |renderer|
|
28
27
|
Thread.new(renderer) do
|
29
28
|
mutex.synchronize do
|
30
29
|
Vedeu.log(type: :debug,
|
31
|
-
|
32
|
-
# acc << renderer.render(*args)
|
30
|
+
message: "Rendering with: '#{renderer}' (#{storage.size} defined)")
|
33
31
|
renderer.render(*args)
|
34
32
|
end
|
35
33
|
end
|
36
34
|
end
|
37
35
|
threads.each(&:join)
|
38
|
-
# acc
|
39
|
-
|
40
|
-
# storage.inject([]) do |acc, renderer|
|
41
|
-
# acc << renderer.render(*args)
|
42
|
-
# acc
|
43
|
-
# end
|
44
36
|
end
|
45
37
|
|
46
38
|
# Adds the given renderer class(es) to the list of renderers.
|
@@ -57,7 +57,7 @@ module Vedeu
|
|
57
57
|
out = []
|
58
58
|
show[0...height].each_with_index do |line, iy|
|
59
59
|
line[0...width].each_with_index do |column, ix|
|
60
|
-
column.position = IndexPosition[iy, ix, by, bx]
|
60
|
+
column.position = Vedeu::IndexPosition[iy, ix, by, bx]
|
61
61
|
out << column
|
62
62
|
end
|
63
63
|
end
|
@@ -24,8 +24,11 @@ module Vedeu
|
|
24
24
|
|
25
25
|
# Returns a boolean indicating whether the colour has been registered.
|
26
26
|
#
|
27
|
+
# @param colour [String]
|
27
28
|
# @return [Boolean]
|
28
29
|
def registered?(colour)
|
30
|
+
return false unless colour
|
31
|
+
|
29
32
|
storage.key?(colour)
|
30
33
|
end
|
31
34
|
|
@@ -36,15 +39,15 @@ module Vedeu
|
|
36
39
|
storage.clear
|
37
40
|
end
|
38
41
|
|
39
|
-
# Retrieves a registered colour.
|
42
|
+
# Retrieves the escape sequence of a registered colour.
|
40
43
|
#
|
41
44
|
# @return [String]
|
42
45
|
def retrieve(colour)
|
43
46
|
storage.fetch(colour, '')
|
44
47
|
end
|
45
48
|
|
46
|
-
# Retrieves a registered colour, or registers the
|
47
|
-
# escape sequence.
|
49
|
+
# Retrieves the escape sequence of a registered colour, or registers the
|
50
|
+
# colour with its respective escape sequence.
|
48
51
|
#
|
49
52
|
# @return [String]
|
50
53
|
def retrieve_or_register(colour, escape_sequence)
|
data/lib/vedeu/support/all.rb
CHANGED
@@ -0,0 +1,44 @@
|
|
1
|
+
module Vedeu
|
2
|
+
|
3
|
+
# Measure the duration. Used for debugging.
|
4
|
+
class Timer
|
5
|
+
|
6
|
+
# @param message [String]
|
7
|
+
# @param block [Proc]
|
8
|
+
# @return [void]
|
9
|
+
def self.for(message = '', &block)
|
10
|
+
new(message).measure(&block)
|
11
|
+
end
|
12
|
+
|
13
|
+
# @param message [String]
|
14
|
+
# @return [Vedeu::Timer]
|
15
|
+
def initialize(message = '')
|
16
|
+
@message = message
|
17
|
+
@started = Time.now.to_f
|
18
|
+
end
|
19
|
+
|
20
|
+
# @param block [Proc]
|
21
|
+
# @return [void]
|
22
|
+
def measure(&block)
|
23
|
+
work = yield
|
24
|
+
|
25
|
+
elapsed = ((Time.now.to_f - started) * 1000).to_i
|
26
|
+
|
27
|
+
Vedeu.log(type: :debug, message: "#{message} took #{elapsed}ms.")
|
28
|
+
|
29
|
+
work
|
30
|
+
end
|
31
|
+
|
32
|
+
protected
|
33
|
+
|
34
|
+
# @!attribute [r] started
|
35
|
+
# @return [Time]
|
36
|
+
attr_reader :started
|
37
|
+
|
38
|
+
# @!attribute [r] message
|
39
|
+
# @return [String]
|
40
|
+
attr_reader :message
|
41
|
+
|
42
|
+
end # Timer
|
43
|
+
|
44
|
+
end # Vedeu
|