vedeu 0.4.43 → 0.4.44
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/Dockerfile +1 -1
- data/bin/vedeu +19 -0
- data/lib/vedeu.rb +0 -34
- data/lib/vedeu/all.rb +4 -1
- data/lib/vedeu/application/application_view.rb +9 -9
- data/lib/vedeu/application/controller.rb +6 -5
- data/lib/vedeu/application/helper.rb +3 -16
- data/lib/vedeu/application/view.rb +3 -16
- data/lib/vedeu/bindings/all.rb +5 -0
- data/lib/vedeu/bindings/bindings.rb +115 -0
- data/lib/vedeu/bindings/drb.rb +45 -0
- data/lib/vedeu/bindings/menus.rb +53 -0
- data/lib/vedeu/bindings/movement.rb +76 -0
- data/lib/vedeu/bindings/visibility.rb +53 -0
- data/lib/vedeu/buffers/buffer.rb +2 -0
- data/lib/vedeu/cli/generator/templates/application/app/controllers/name.erb +2 -2
- data/lib/vedeu/cli/generator/templates/application/app/helpers/name.erb +2 -0
- data/lib/vedeu/cli/generator/templates/application/config/configuration.erb +3 -0
- data/lib/vedeu/cli/generator/view.rb +0 -5
- data/lib/vedeu/cli/main.rb +12 -0
- data/lib/vedeu/cursor/reposition.rb +4 -4
- data/lib/vedeu/dsl/interface.rb +0 -27
- data/lib/vedeu/exceptions.rb +65 -0
- data/lib/vedeu/geometry/geometry.rb +2 -2
- data/lib/vedeu/geometry/grid.rb +2 -2
- data/lib/vedeu/input/input.rb +34 -28
- data/lib/vedeu/null/geometry.rb +2 -2
- data/lib/vedeu/output/colour.rb +0 -2
- data/lib/vedeu/output/esc.rb +7 -1
- data/lib/vedeu/output/render_border.rb +5 -0
- data/lib/vedeu/output/renderers/json.rb +7 -2
- data/lib/vedeu/support/terminal.rb +1 -1
- data/lib/vedeu/version.rb +1 -1
- data/test/lib/vedeu/application/controller_test.rb +0 -4
- data/test/lib/vedeu/application/helper_test.rb +0 -8
- data/test/lib/vedeu/application/view_test.rb +0 -8
- data/test/lib/vedeu/bindings/bindings_test.rb +43 -0
- data/test/lib/vedeu/bindings/drb_test.rb +23 -0
- data/test/lib/vedeu/bindings/menus_test.rb +26 -0
- data/test/lib/vedeu/bindings/movement_test.rb +28 -0
- data/test/lib/vedeu/bindings/visibility_test.rb +27 -0
- data/test/lib/vedeu/buffers/buffer_test.rb +73 -38
- data/test/lib/vedeu/cli/main_test.rb +47 -0
- data/test/lib/vedeu/dsl/interface_test.rb +4 -7
- data/test/lib/vedeu/exceptions_test.rb +5 -0
- data/test/lib/vedeu/input/input_test.rb +9 -0
- data/test/lib/vedeu/output/esc_test.rb +4 -1
- metadata +21 -5
- data/lib/vedeu/bindings.rb +0 -275
- data/test/lib/vedeu/bindings_test.rb +0 -88
@@ -0,0 +1,76 @@
|
|
1
|
+
module Vedeu
|
2
|
+
|
3
|
+
module Bindings
|
4
|
+
|
5
|
+
# System events relating to movement of cursors or interfaces.
|
6
|
+
#
|
7
|
+
# @api public
|
8
|
+
module Movement
|
9
|
+
|
10
|
+
# @see {Vedeu::Move}
|
11
|
+
Vedeu.bind(:_cursor_down_) do |name|
|
12
|
+
Vedeu::Move.by_name(Vedeu::Cursor, :down, name)
|
13
|
+
end
|
14
|
+
|
15
|
+
# @see {Vedeu::Move}
|
16
|
+
Vedeu.bind(:_cursor_left_) do |name|
|
17
|
+
Vedeu::Move.by_name(Vedeu::Cursor, :left, name)
|
18
|
+
end
|
19
|
+
|
20
|
+
# @see {Vedeu::Move}
|
21
|
+
Vedeu.bind(:_cursor_origin_) do |name|
|
22
|
+
Vedeu::Move.by_name(Vedeu::Cursor, :origin, name)
|
23
|
+
end
|
24
|
+
|
25
|
+
# Move the cursor to a relative position inside the interface.
|
26
|
+
#
|
27
|
+
# @todo
|
28
|
+
# - The content of the interface needs to be a consideration.
|
29
|
+
# - If the screen size changes, what should happen to the cursor.
|
30
|
+
# - How do we represent cursors which are deliberately positioned
|
31
|
+
# outside of the viewable area?
|
32
|
+
#
|
33
|
+
Vedeu.bind(:_cursor_reposition_) do |name, y, x|
|
34
|
+
Vedeu::Reposition.to(Vedeu::Cursor, name, y, x)
|
35
|
+
end
|
36
|
+
|
37
|
+
# @see {Vedeu::Move}
|
38
|
+
Vedeu.bind(:_cursor_reset_) do |name|
|
39
|
+
Vedeu.trigger(:_cursor_origin_, name)
|
40
|
+
end
|
41
|
+
|
42
|
+
# @see {Vedeu::Move}
|
43
|
+
Vedeu.bind(:_cursor_right_) do |name|
|
44
|
+
Vedeu::Move.by_name(Vedeu::Cursor, :right, name)
|
45
|
+
end
|
46
|
+
|
47
|
+
# @see {Vedeu::Move}
|
48
|
+
Vedeu.bind(:_cursor_up_) do |name|
|
49
|
+
Vedeu::Move.by_name(Vedeu::Cursor, :up, name)
|
50
|
+
end
|
51
|
+
|
52
|
+
# @see {Vedeu::Move}
|
53
|
+
Vedeu.bind(:_geometry_down_) do |name|
|
54
|
+
Vedeu::Move.by_name(Vedeu::Geometry, :down, name)
|
55
|
+
end
|
56
|
+
|
57
|
+
# @see {Vedeu::Move}
|
58
|
+
Vedeu.bind(:_geometry_left_) do |name|
|
59
|
+
Vedeu::Move.by_name(Vedeu::Geometry, :left, name)
|
60
|
+
end
|
61
|
+
|
62
|
+
# @see {Vedeu::Move}
|
63
|
+
Vedeu.bind(:_geometry_right_) do |name|
|
64
|
+
Vedeu::Move.by_name(Vedeu::Geometry, :right, name)
|
65
|
+
end
|
66
|
+
|
67
|
+
# @see {Vedeu::Move}
|
68
|
+
Vedeu.bind(:_geometry_up_) do |name|
|
69
|
+
Vedeu::Move.by_name(Vedeu::Geometry, :up, name)
|
70
|
+
end
|
71
|
+
|
72
|
+
end # Movement
|
73
|
+
|
74
|
+
end # Bindings
|
75
|
+
|
76
|
+
end # Vedeu
|
@@ -0,0 +1,53 @@
|
|
1
|
+
module Vedeu
|
2
|
+
|
3
|
+
module Bindings
|
4
|
+
|
5
|
+
# System events relating to the visibility of cursors or interfaces.
|
6
|
+
#
|
7
|
+
# @api public
|
8
|
+
module Visibility
|
9
|
+
|
10
|
+
# Hide the cursor of the named interface or interface currently in focus.
|
11
|
+
Vedeu.bind(:_hide_cursor_) do |name|
|
12
|
+
Vedeu::Visibility.for_cursor(name).hide
|
13
|
+
end
|
14
|
+
Vedeu.bind(:_cursor_hide_) { |name| Vedeu.trigger(:_hide_cursor_, name) }
|
15
|
+
|
16
|
+
# Will hide all of the interfaces belonging to the named group. Useful for
|
17
|
+
# hiding part of that which is currently displaying in the terminal.
|
18
|
+
#
|
19
|
+
# @note
|
20
|
+
# This may be rarely used, since the action of showing a group using
|
21
|
+
# `Vedeu.trigger(:_show_group_, group_name)` will effectively clear the
|
22
|
+
# terminal and show the new group.}
|
23
|
+
Vedeu.bind(:_hide_group_) { |name| Vedeu.trigger(:_clear_group_, name) }
|
24
|
+
|
25
|
+
# @see Vedeu::Buffer#hide
|
26
|
+
Vedeu.bind(:_hide_interface_) { |name| Vedeu.buffers.by_name(name).hide }
|
27
|
+
|
28
|
+
# Show the cursor of the named interface or interface currently in focus.
|
29
|
+
Vedeu.bind(:_show_cursor_) do |name|
|
30
|
+
Vedeu::Visibility.for_cursor(name).show
|
31
|
+
end
|
32
|
+
Vedeu.bind(:_cursor_show_) { |name| Vedeu.trigger(:_show_cursor_, name) }
|
33
|
+
|
34
|
+
# Will clear the terminal and then show all of the interfaces belonging to
|
35
|
+
# the named group.
|
36
|
+
Vedeu.bind(:_show_group_) do |name|
|
37
|
+
Vedeu.trigger(:_clear_)
|
38
|
+
Vedeu.trigger(:_refresh_group_, name)
|
39
|
+
end
|
40
|
+
|
41
|
+
# @see Vedeu::Buffer#show
|
42
|
+
Vedeu.bind(:_show_interface_) { |name| Vedeu.buffers.by_name(name).show }
|
43
|
+
|
44
|
+
# @see Vedeu::Buffer#toggle
|
45
|
+
Vedeu.bind(:_toggle_interface_) do |name|
|
46
|
+
Vedeu.buffers.by_name(name).toggle
|
47
|
+
end
|
48
|
+
|
49
|
+
end # Visibility
|
50
|
+
|
51
|
+
end # Bindings
|
52
|
+
|
53
|
+
end # Vedeu
|
data/lib/vedeu/buffers/buffer.rb
CHANGED
@@ -120,6 +120,7 @@ module Vedeu
|
|
120
120
|
return nil unless visible?
|
121
121
|
|
122
122
|
Vedeu::Visibility.hide(interface)
|
123
|
+
|
123
124
|
clear
|
124
125
|
end
|
125
126
|
|
@@ -156,6 +157,7 @@ module Vedeu
|
|
156
157
|
return nil if visible?
|
157
158
|
|
158
159
|
Vedeu::Visibility.show(interface)
|
160
|
+
|
159
161
|
render
|
160
162
|
end
|
161
163
|
|
@@ -5,10 +5,10 @@ module <%= object.app_name %>
|
|
5
5
|
|
6
6
|
class <%= object.name_as_class %>Controller < <%= object.app_name -%>::ApplicationController
|
7
7
|
|
8
|
-
controller_name
|
8
|
+
controller_name :<%= object.name %>
|
9
9
|
|
10
10
|
def initialize
|
11
|
-
<%= object.app_name %>::<%= object.name_as_class %>View.render(
|
11
|
+
<%= object.app_name %>::<%= object.name_as_class %>View.render(*args)
|
12
12
|
end
|
13
13
|
|
14
14
|
private
|
data/lib/vedeu/cli/main.rb
CHANGED
@@ -1,23 +1,35 @@
|
|
1
1
|
module Vedeu
|
2
2
|
|
3
|
+
# Provide a command line interface to Vedeu.
|
4
|
+
#
|
5
|
+
# @api public
|
3
6
|
module CLI
|
4
7
|
|
8
|
+
# The main command line interface commands.
|
9
|
+
#
|
10
|
+
# @api public
|
5
11
|
class Main < Thor
|
6
12
|
|
7
13
|
desc 'new <name>', 'Create a skeleton Vedeu client application.'
|
14
|
+
# @param name [String]
|
15
|
+
# @return [String]
|
8
16
|
def new(name)
|
9
17
|
say Vedeu::Generator::Application.generate(name)
|
10
18
|
end
|
11
19
|
|
12
20
|
# 'Specify the interface name lowercase snakecase; e.g. main_interface'
|
21
|
+
|
13
22
|
desc 'view <name>',
|
14
23
|
'Create a new interface within the client application.'
|
24
|
+
# @param name [String]
|
25
|
+
# @return [String]
|
15
26
|
def view(name)
|
16
27
|
Vedeu::Generator::View.generate(name)
|
17
28
|
end
|
18
29
|
|
19
30
|
desc 'version',
|
20
31
|
'Print the version.'
|
32
|
+
# @return [String]
|
21
33
|
def version
|
22
34
|
say "vedeu #{Vedeu::VERSION}"
|
23
35
|
end
|
@@ -28,10 +28,10 @@ module Vedeu
|
|
28
28
|
# @return [Vedeu::Cursor]
|
29
29
|
def to
|
30
30
|
result = entity.new(name: name,
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
31
|
+
y: y_position,
|
32
|
+
x: x_position,
|
33
|
+
oy: y,
|
34
|
+
ox: x).store
|
35
35
|
|
36
36
|
Vedeu.trigger(:_clear_, name)
|
37
37
|
Vedeu.trigger(:_refresh_, name)
|
data/lib/vedeu/dsl/interface.rb
CHANGED
@@ -308,33 +308,6 @@ module Vedeu
|
|
308
308
|
alias_method :z_index, :zindex
|
309
309
|
alias_method :z, :zindex
|
310
310
|
|
311
|
-
# @param label [String]
|
312
|
-
# @param name [String|Symbol]
|
313
|
-
# @param value [Boolean|void]
|
314
|
-
# @return [void]
|
315
|
-
def button(label, name, value = true)
|
316
|
-
button_name = "button_#{model.name}_#{name}"
|
317
|
-
button_label = " #{label} "
|
318
|
-
button_height = 3
|
319
|
-
button_width = button_label.size + 2
|
320
|
-
|
321
|
-
Vedeu.interface button_name do
|
322
|
-
border {}
|
323
|
-
cursor
|
324
|
-
geometry do
|
325
|
-
height(button_height)
|
326
|
-
width(button_width)
|
327
|
-
end
|
328
|
-
end
|
329
|
-
Vedeu.renders do
|
330
|
-
view button_name do
|
331
|
-
lines do
|
332
|
-
line button_label
|
333
|
-
end
|
334
|
-
end
|
335
|
-
end
|
336
|
-
end
|
337
|
-
|
338
311
|
protected
|
339
312
|
|
340
313
|
# @!attribute [r] client
|
@@ -0,0 +1,65 @@
|
|
1
|
+
module Vedeu
|
2
|
+
|
3
|
+
# Raised with Vedeu attempts to access a named model that does not exist.
|
4
|
+
#
|
5
|
+
# @api private
|
6
|
+
class ModelNotFound < StandardError
|
7
|
+
|
8
|
+
end # ModeSwitch
|
9
|
+
|
10
|
+
# Raised when Vedeu attempts to parse a {Vedeu.view} or {Vedeu.interface} and
|
11
|
+
# encounters a problem.
|
12
|
+
#
|
13
|
+
# @api private
|
14
|
+
class InvalidSyntax < StandardError
|
15
|
+
|
16
|
+
end # InvalidSyntax
|
17
|
+
|
18
|
+
# Raised when a name is not provided for a model when attempting to store it
|
19
|
+
# in a repository.
|
20
|
+
#
|
21
|
+
# @api private
|
22
|
+
class MissingRequired < StandardError
|
23
|
+
|
24
|
+
end # MissingRequired
|
25
|
+
|
26
|
+
# Raised intentionally when the client application wishes to switch between
|
27
|
+
# cooked and raw (or vice versa) terminal modes.
|
28
|
+
#
|
29
|
+
# @see Vedeu::Application
|
30
|
+
#
|
31
|
+
# @api private
|
32
|
+
class ModeSwitch < StandardError
|
33
|
+
|
34
|
+
end # ModeSwitch
|
35
|
+
|
36
|
+
# Raised to remind me (or client application developers) that the subclass
|
37
|
+
# implements the functionality sought.
|
38
|
+
#
|
39
|
+
# @see Vedeu::Translator
|
40
|
+
#
|
41
|
+
# @api private
|
42
|
+
class NotImplemented < StandardError
|
43
|
+
|
44
|
+
end # NotImplemented
|
45
|
+
|
46
|
+
# Raised when trying to access an interface column less than 1 or greater
|
47
|
+
# than 12. Vedeu is hard-wired to a 12-column layout for the time being.
|
48
|
+
#
|
49
|
+
# @see Vedeu::Grid
|
50
|
+
#
|
51
|
+
# @api private
|
52
|
+
class OutOfRange < StandardError
|
53
|
+
|
54
|
+
end # OutOfRange
|
55
|
+
|
56
|
+
# Raised when Vedeu wishes to exit.
|
57
|
+
#
|
58
|
+
# @see Vedeu::MainLoop
|
59
|
+
#
|
60
|
+
# @api private
|
61
|
+
class VedeuInterrupt < StandardError
|
62
|
+
|
63
|
+
end # VedeuInterrupt
|
64
|
+
|
65
|
+
end # Vedeu
|
@@ -153,11 +153,11 @@ module Vedeu
|
|
153
153
|
y: _y,
|
154
154
|
yn: _yn,
|
155
155
|
y_yn: @height,
|
156
|
-
y_default: Vedeu
|
156
|
+
y_default: Vedeu.height,
|
157
157
|
x: _x,
|
158
158
|
xn: _xn,
|
159
159
|
x_xn: @width,
|
160
|
-
x_default: Vedeu
|
160
|
+
x_default: Vedeu.width,
|
161
161
|
options: dimension_options,
|
162
162
|
)
|
163
163
|
end
|
data/lib/vedeu/geometry/grid.rb
CHANGED
data/lib/vedeu/input/input.rb
CHANGED
@@ -82,34 +82,6 @@ module Vedeu
|
|
82
82
|
"\e[3~" => :delete,
|
83
83
|
"\e[F" => :end,
|
84
84
|
"\e[Z" => :shift_tab,
|
85
|
-
"\eOP" => :f1,
|
86
|
-
"\eOQ" => :f2,
|
87
|
-
"\eOR" => :f3,
|
88
|
-
"\eOS" => :f4,
|
89
|
-
"\e[15~" => :f5,
|
90
|
-
"\e[15;2~" => :shift_f5,
|
91
|
-
"\e[15;5~" => :ctrl_f5,
|
92
|
-
"\e[17~" => :f6,
|
93
|
-
"\e[17;2~" => :shift_f6,
|
94
|
-
"\e[17;5~" => :ctrl_f6,
|
95
|
-
"\e[18~" => :f7,
|
96
|
-
"\e[18;2~" => :shift_f7,
|
97
|
-
"\e[18;5~" => :ctrl_f6,
|
98
|
-
"\e[19~" => :f8,
|
99
|
-
"\e[19;2~" => :shift_f8,
|
100
|
-
"\e[19;5~" => :ctrl_f6,
|
101
|
-
"\e[20~" => :f9,
|
102
|
-
"\e[20;2~" => :shift_f9,
|
103
|
-
"\e[20;5~" => :ctrl_f6,
|
104
|
-
"\e[21~" => :f10,
|
105
|
-
"\e[21;2~" => :shift_f10,
|
106
|
-
"\e[21;5~" => :ctrl_f6,
|
107
|
-
"\e[23~" => :f11,
|
108
|
-
"\e[23;2~" => :shift_f11,
|
109
|
-
"\e[23;5~" => :ctrl_f6,
|
110
|
-
"\e[24~" => :f12,
|
111
|
-
"\e[24;2~" => :shift_f12,
|
112
|
-
"\e[24;5~" => :ctrl_f6,
|
113
85
|
"\e[1;2P" => :print_screen,
|
114
86
|
"\e[1;2Q" => :scroll_lock,
|
115
87
|
"\e[1;2R" => :pause_break,
|
@@ -140,6 +112,40 @@ module Vedeu
|
|
140
112
|
"\u0024" => :ctrl_x,
|
141
113
|
"\u0025" => :ctrl_y,
|
142
114
|
"\u0026" => :ctrl_z,
|
115
|
+
}.merge(f_keys)
|
116
|
+
end
|
117
|
+
|
118
|
+
# @return [Hash<String => Symbol]
|
119
|
+
def f_keys
|
120
|
+
{
|
121
|
+
"\eOP" => :f1,
|
122
|
+
"\eOQ" => :f2,
|
123
|
+
"\eOR" => :f3,
|
124
|
+
"\eOS" => :f4,
|
125
|
+
"\e[15~" => :f5,
|
126
|
+
"\e[15;2~" => :shift_f5,
|
127
|
+
"\e[15;5~" => :ctrl_f5,
|
128
|
+
"\e[17~" => :f6,
|
129
|
+
"\e[17;2~" => :shift_f6,
|
130
|
+
"\e[17;5~" => :ctrl_f6,
|
131
|
+
"\e[18~" => :f7,
|
132
|
+
"\e[18;2~" => :shift_f7,
|
133
|
+
"\e[18;5~" => :ctrl_f7,
|
134
|
+
"\e[19~" => :f8,
|
135
|
+
"\e[19;2~" => :shift_f8,
|
136
|
+
"\e[19;5~" => :ctrl_f8,
|
137
|
+
"\e[20~" => :f9,
|
138
|
+
"\e[20;2~" => :shift_f9,
|
139
|
+
"\e[20;5~" => :ctrl_f9,
|
140
|
+
"\e[21~" => :f10,
|
141
|
+
"\e[21;2~" => :shift_f10,
|
142
|
+
"\e[21;5~" => :ctrl_f10,
|
143
|
+
"\e[23~" => :f11,
|
144
|
+
"\e[23;2~" => :shift_f11,
|
145
|
+
"\e[23;5~" => :ctrl_f11,
|
146
|
+
"\e[24~" => :f12,
|
147
|
+
"\e[24;2~" => :shift_f12,
|
148
|
+
"\e[24;5~" => :ctrl_f12,
|
143
149
|
}
|
144
150
|
end
|
145
151
|
|