vedeu 0.5.3 → 0.5.4
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +5 -5
- data/docs/events.md +4 -0
- data/examples/borders_app.rb +43 -39
- data/examples/focus_app.rb +4 -0
- data/examples/hello_world.rb +10 -3
- data/lib/vedeu/all.rb +1 -2
- data/lib/vedeu/api.rb +4 -1
- data/lib/vedeu/application/application_controller.rb +24 -0
- data/lib/vedeu/application/application_view.rb +9 -9
- data/lib/vedeu/bindings.rb +2 -0
- data/lib/vedeu/bindings/movement.rb +9 -9
- data/lib/vedeu/bindings/system.rb +3 -3
- data/lib/vedeu/buffers/buffer.rb +4 -9
- data/lib/vedeu/buffers/display_buffer.rb +2 -48
- data/lib/vedeu/cli/generator/application.rb +6 -0
- data/lib/vedeu/cli/generator/templates/application/.ruby-version +1 -0
- data/lib/vedeu/cli/generator/templates/application/app/controllers/name.erb +2 -11
- data/lib/vedeu/configuration/api.rb +6 -0
- data/lib/vedeu/configuration/configuration.rb +6 -0
- data/lib/vedeu/cursor/cursor.rb +49 -15
- data/lib/vedeu/cursor/move.rb +2 -2
- data/lib/vedeu/cursor/refresh_cursor.rb +2 -7
- data/lib/vedeu/distributed/server.rb +7 -21
- data/lib/vedeu/dsl/view.rb +31 -6
- data/lib/vedeu/internal_api.rb +7 -0
- data/lib/vedeu/log/log.rb +5 -2
- data/lib/vedeu/models/escape.rb +24 -6
- data/lib/vedeu/models/interface.rb +2 -14
- data/lib/vedeu/null/buffer.rb +7 -21
- data/lib/vedeu/null/generic.rb +5 -16
- data/lib/vedeu/null/interface.rb +6 -18
- data/lib/vedeu/runtime/bootstrap.rb +1 -1
- data/lib/vedeu/runtime/flags.rb +57 -0
- data/lib/vedeu/runtime/router.rb +2 -2
- data/lib/vedeu/version.rb +2 -1
- data/test/lib/vedeu/api_test.rb +1 -0
- data/test/lib/vedeu/application/application_controller_test.rb +26 -2
- data/test/lib/vedeu/application/application_view_test.rb +9 -4
- data/test/lib/vedeu/bindings_test.rb +9 -0
- data/test/lib/vedeu/borders/border_test.rb +25 -42
- data/test/lib/vedeu/buffers/display_buffer_test.rb +0 -10
- data/test/lib/vedeu/configuration/api_test.rb +7 -1
- data/test/lib/vedeu/configuration/cli_test.rb +0 -1
- data/test/lib/vedeu/configuration/configuration_test.rb +16 -0
- data/test/lib/vedeu/cursor/cursor_test.rb +122 -4
- data/test/lib/vedeu/dsl/view_test.rb +2 -2
- data/test/lib/vedeu/internal_api_test.rb +2 -0
- data/test/lib/vedeu/models/escape_test.rb +16 -6
- data/test/lib/vedeu/models/focus_test.rb +2 -1
- data/test/lib/vedeu/models/interface_test.rb +9 -5
- data/test/lib/vedeu/null/buffer_test.rb +7 -25
- data/test/lib/vedeu/null/generic_test.rb +6 -20
- data/test/lib/vedeu/null/interface_test.rb +8 -14
- data/test/lib/vedeu/output/compressor_test.rb +4 -4
- data/test/lib/vedeu/output/renderers_test.rb +1 -1
- data/test/lib/vedeu/runtime/flags_test.rb +47 -0
- data/test/lib/vedeu/runtime/router_test.rb +4 -4
- data/test/test_helper.rb +2 -0
- metadata +6 -10
- data/examples/geometry_app.rb +0 -147
- data/examples/panel_app.rb +0 -71
- data/lib/vedeu/geometry/index_position.rb +0 -85
- data/lib/vedeu/geometry/position_validator.rb +0 -69
- data/test/lib/vedeu/geometry/index_position_test.rb +0 -130
- data/test/lib/vedeu/geometry/position_validator_test.rb +0 -149
data/examples/geometry_app.rb
DELETED
@@ -1,147 +0,0 @@
|
|
1
|
-
#!/usr/bin/env ruby
|
2
|
-
|
3
|
-
lib_dir = File.dirname(__FILE__) + '/../lib'
|
4
|
-
$LOAD_PATH.unshift(lib_dir) unless $LOAD_PATH.include?(lib_dir)
|
5
|
-
|
6
|
-
require 'vedeu'
|
7
|
-
|
8
|
-
# An example application to demonstrate geometry.
|
9
|
-
# If you have cloned this repository from GitHub, you can run this example:
|
10
|
-
#
|
11
|
-
# ./examples/geometry_app.rb
|
12
|
-
#
|
13
|
-
class VedeuGeometryApp
|
14
|
-
|
15
|
-
# Be aware that running an application with debugging enabled will affect
|
16
|
-
# performance.
|
17
|
-
Vedeu.configure do
|
18
|
-
# debug!
|
19
|
-
log '/tmp/vedeu_geometry_app.log'
|
20
|
-
end
|
21
|
-
|
22
|
-
Vedeu.interface 'main_interface' do
|
23
|
-
colour foreground: '#ff0000', background: '#000000'
|
24
|
-
cursor!
|
25
|
-
|
26
|
-
# Geometry can be defined within the interface.
|
27
|
-
geometry do
|
28
|
-
height rows(4)
|
29
|
-
width 8
|
30
|
-
x 2
|
31
|
-
y 2
|
32
|
-
end
|
33
|
-
end
|
34
|
-
|
35
|
-
Vedeu.interface 'second' do
|
36
|
-
colour foreground: '#0000ff', background: '#000000'
|
37
|
-
cursor!
|
38
|
-
end
|
39
|
-
|
40
|
-
# Geometry can be defined either before or after the interface.
|
41
|
-
Vedeu.geometry 'second' do
|
42
|
-
height 8
|
43
|
-
width columns(1)
|
44
|
-
x 12
|
45
|
-
y 2
|
46
|
-
end
|
47
|
-
|
48
|
-
Vedeu.keymap('_global_') do
|
49
|
-
key(:up, 'k') { Vedeu.trigger(:_cursor_up_) }
|
50
|
-
key(:right, 'l') { Vedeu.trigger(:_cursor_right_) }
|
51
|
-
key(:down, 'j') { Vedeu.trigger(:_cursor_down_) }
|
52
|
-
key(:left, 'h') { Vedeu.trigger(:_cursor_left_) }
|
53
|
-
|
54
|
-
key('q') { Vedeu.trigger(:_exit_) }
|
55
|
-
key(:escape) { Vedeu.trigger(:_mode_switch_) }
|
56
|
-
key(:shift_tab) { Vedeu.trigger(:_focus_prev_) }
|
57
|
-
key(:tab) { Vedeu.trigger(:_focus_next_) }
|
58
|
-
end
|
59
|
-
|
60
|
-
Vedeu.renders do
|
61
|
-
view 'second' do
|
62
|
-
border!
|
63
|
-
lines do
|
64
|
-
line 'A.987654321'
|
65
|
-
line 'B.987654321'
|
66
|
-
line 'C.987654321'
|
67
|
-
line 'D.987654321'
|
68
|
-
line 'E.987654321'
|
69
|
-
line 'F.987654321'
|
70
|
-
line 'G.987654321'
|
71
|
-
line 'H.987654321'
|
72
|
-
end
|
73
|
-
end
|
74
|
-
view 'main_interface' do
|
75
|
-
border!
|
76
|
-
lines do
|
77
|
-
streams do
|
78
|
-
text 'A.3456789 '
|
79
|
-
end
|
80
|
-
streams do
|
81
|
-
background '#550000'
|
82
|
-
foreground '#ffff00'
|
83
|
-
text 'hydrogen'
|
84
|
-
end
|
85
|
-
streams do
|
86
|
-
text ' helium'
|
87
|
-
end
|
88
|
-
end
|
89
|
-
lines do
|
90
|
-
streams do
|
91
|
-
text 'B.3456789 lithium beryllium boron nitrogen'
|
92
|
-
end
|
93
|
-
end
|
94
|
-
lines do
|
95
|
-
streams do
|
96
|
-
text 'C.3456789'
|
97
|
-
text ' carbon oxygen '
|
98
|
-
end
|
99
|
-
streams do
|
100
|
-
background '#aadd00'
|
101
|
-
foreground '#000000'
|
102
|
-
text 'fluorine'
|
103
|
-
end
|
104
|
-
end
|
105
|
-
lines do
|
106
|
-
streams do
|
107
|
-
text 'D.3456789'
|
108
|
-
end
|
109
|
-
end
|
110
|
-
lines do
|
111
|
-
streams do
|
112
|
-
text 'E.3456789 neon sodium'
|
113
|
-
end
|
114
|
-
end
|
115
|
-
lines do
|
116
|
-
streams do
|
117
|
-
text 'F.3456789 magnesium '
|
118
|
-
end
|
119
|
-
streams do
|
120
|
-
foreground '#00aaff'
|
121
|
-
text 'aluminium'
|
122
|
-
end
|
123
|
-
end
|
124
|
-
lines do
|
125
|
-
streams do
|
126
|
-
text 'G.3456789 silicon'
|
127
|
-
end
|
128
|
-
end
|
129
|
-
lines do
|
130
|
-
streams do
|
131
|
-
background '#550000'
|
132
|
-
foreground '#ff00ff'
|
133
|
-
text 'H.34'
|
134
|
-
end
|
135
|
-
end
|
136
|
-
end
|
137
|
-
end
|
138
|
-
|
139
|
-
Vedeu.focus_by_name 'main_interface'
|
140
|
-
|
141
|
-
def self.start(argv = ARGV)
|
142
|
-
Vedeu::Launcher.execute!(argv)
|
143
|
-
end
|
144
|
-
|
145
|
-
end # VedeuGeometryApp
|
146
|
-
|
147
|
-
VedeuGeometryApp.start(ARGV)
|
data/examples/panel_app.rb
DELETED
@@ -1,71 +0,0 @@
|
|
1
|
-
#!/usr/bin/env ruby
|
2
|
-
|
3
|
-
lib_dir = File.dirname(__FILE__) + '/../lib'
|
4
|
-
$LOAD_PATH.unshift(lib_dir) unless $LOAD_PATH.include?(lib_dir)
|
5
|
-
|
6
|
-
require 'vedeu'
|
7
|
-
|
8
|
-
# An example application to demonstrate colours, cursor and interface movement,
|
9
|
-
# maximising/unmaximising of interfaces and toggling of cursors and interfaces.
|
10
|
-
#
|
11
|
-
# If you have cloned this repository from GitHub, you can run this example:
|
12
|
-
#
|
13
|
-
# ./examples/panel_app.rb
|
14
|
-
#
|
15
|
-
class VedeuPanelApp
|
16
|
-
|
17
|
-
# Be aware that running an application with debugging enabled will affect
|
18
|
-
# performance.
|
19
|
-
Vedeu.configure do
|
20
|
-
# debug!
|
21
|
-
log '/tmp/vedeu_panel_app.log'
|
22
|
-
# renderers Vedeu::Renderers::File.new
|
23
|
-
end
|
24
|
-
|
25
|
-
# line { centre 'Blue', width: 20, background: '#2196f3' }
|
26
|
-
Vedeu.interface 'main_interface' do
|
27
|
-
border 'main_interface' do
|
28
|
-
colour foreground: '#000000', background: '#cddc39' # lime
|
29
|
-
title 'Panel: Yes/No'
|
30
|
-
end
|
31
|
-
colour foreground: '#000000', background: '#cddc39'
|
32
|
-
cursor!
|
33
|
-
geometry 'main_interface' do
|
34
|
-
centred!
|
35
|
-
width columns(10)
|
36
|
-
height 9
|
37
|
-
end
|
38
|
-
end
|
39
|
-
|
40
|
-
Vedeu.keymap('_global_') do
|
41
|
-
key(:up) { Vedeu.trigger(:_cursor_up_) }
|
42
|
-
key(:right) { Vedeu.trigger(:_cursor_right_) }
|
43
|
-
key(:down) { Vedeu.trigger(:_cursor_down_) }
|
44
|
-
key(:left) { Vedeu.trigger(:_cursor_left_) }
|
45
|
-
|
46
|
-
key('q') { Vedeu.trigger(:_exit_) }
|
47
|
-
key(:escape) { Vedeu.trigger(:_mode_switch_) }
|
48
|
-
key(:shift_tab) { Vedeu.trigger(:_focus_prev_) }
|
49
|
-
key(:tab) { Vedeu.trigger(:_focus_next_) }
|
50
|
-
end
|
51
|
-
|
52
|
-
Vedeu.renders do
|
53
|
-
view 'main_interface' do
|
54
|
-
lines do
|
55
|
-
line ' '
|
56
|
-
line 'This is an example panel. It should be used for Yes/No questions.'
|
57
|
-
line 'Do you like it?'
|
58
|
-
end
|
59
|
-
button('Yes!', :confirm, true)
|
60
|
-
end
|
61
|
-
end
|
62
|
-
|
63
|
-
Vedeu.focus_by_name 'main_interface'
|
64
|
-
|
65
|
-
def self.start(argv = ARGV)
|
66
|
-
Vedeu::Launcher.execute!(argv)
|
67
|
-
end
|
68
|
-
|
69
|
-
end # VedeuPanelApp
|
70
|
-
|
71
|
-
VedeuPanelApp.start(ARGV)
|
@@ -1,85 +0,0 @@
|
|
1
|
-
module Vedeu
|
2
|
-
|
3
|
-
# Converts an index into a position for the terminal.
|
4
|
-
#
|
5
|
-
# When the optional offset `oy` and `ox` params are given, the they are used
|
6
|
-
# for the starting position.
|
7
|
-
#
|
8
|
-
class IndexPosition
|
9
|
-
|
10
|
-
# @param (see #initialize)
|
11
|
-
# @return [Vedeu::Position]
|
12
|
-
def self.[](iy, ix, oy = 1, ox = 1)
|
13
|
-
new(iy, ix, oy, ox).[]
|
14
|
-
end
|
15
|
-
|
16
|
-
# Returns a new instance of Vedeu::IndexPosition.
|
17
|
-
#
|
18
|
-
# @param iy [Fixnum]
|
19
|
-
# @param ix [Fixnum]
|
20
|
-
# @param oy [Fixnum]
|
21
|
-
# @param ox [Fixnum]
|
22
|
-
# @return [Vedeu::IndexPosition]
|
23
|
-
def initialize(iy, ix, oy = 1, ox = 1)
|
24
|
-
@iy = iy
|
25
|
-
@ix = ix
|
26
|
-
@oy = oy
|
27
|
-
@ox = ox
|
28
|
-
end
|
29
|
-
|
30
|
-
# @return [Vedeu::Position]
|
31
|
-
def []
|
32
|
-
Vedeu::Position[y, x]
|
33
|
-
end
|
34
|
-
alias_method :to_position, :[]
|
35
|
-
|
36
|
-
# An object is equal when its values are the same.
|
37
|
-
#
|
38
|
-
# @param other [Vedeu::IndexPosition]
|
39
|
-
# @return [Boolean]
|
40
|
-
def eql?(other)
|
41
|
-
self.class == other.class && (x == other.x && y == other.y)
|
42
|
-
end
|
43
|
-
alias_method :==, :eql?
|
44
|
-
|
45
|
-
# Returns the y coordinate.
|
46
|
-
#
|
47
|
-
# @return [Fixnum]
|
48
|
-
def y
|
49
|
-
(iy <= 0) ? oy : (iy + oy)
|
50
|
-
end
|
51
|
-
alias_method :first, :y
|
52
|
-
|
53
|
-
# Returns the x coordinate.
|
54
|
-
#
|
55
|
-
# @return [Fixnum]
|
56
|
-
def x
|
57
|
-
(ix <= 0) ? ox : (ix + ox)
|
58
|
-
end
|
59
|
-
alias_method :last, :x
|
60
|
-
|
61
|
-
private
|
62
|
-
|
63
|
-
# @return [Fixnum]
|
64
|
-
def iy
|
65
|
-
@_iy ||= (@iy <= 0) ? 0 : @iy
|
66
|
-
end
|
67
|
-
|
68
|
-
# @return [Fixnum]
|
69
|
-
def ix
|
70
|
-
@_ix ||= (@ix <= 0) ? 0 : @ix
|
71
|
-
end
|
72
|
-
|
73
|
-
# @return [Fixnum]
|
74
|
-
def oy
|
75
|
-
@_oy ||= (@oy <= 1) ? 1 : @oy
|
76
|
-
end
|
77
|
-
|
78
|
-
# @return [Fixnum]
|
79
|
-
def ox
|
80
|
-
@_ox ||= (@ox <= 1) ? 1 : @ox
|
81
|
-
end
|
82
|
-
|
83
|
-
end # IndexPosition
|
84
|
-
|
85
|
-
end # Vedeu
|
@@ -1,69 +0,0 @@
|
|
1
|
-
module Vedeu
|
2
|
-
|
3
|
-
# Validates that the provided coordinates are within the terminal and
|
4
|
-
# interface's geometry (with or without a border).
|
5
|
-
#
|
6
|
-
class PositionValidator
|
7
|
-
|
8
|
-
extend Forwardable
|
9
|
-
|
10
|
-
def_delegators :border,
|
11
|
-
:bx,
|
12
|
-
:bxn,
|
13
|
-
:by,
|
14
|
-
:byn
|
15
|
-
|
16
|
-
# @!attribute [rw] x
|
17
|
-
# @return [Fixnum]
|
18
|
-
attr_accessor :x
|
19
|
-
|
20
|
-
# @!attribute [rw] x
|
21
|
-
# @return [Fixnum]
|
22
|
-
attr_accessor :y
|
23
|
-
|
24
|
-
# @param (see #initialize)
|
25
|
-
def self.validate(name, x, y)
|
26
|
-
new(name, x, y).validate
|
27
|
-
end
|
28
|
-
|
29
|
-
# Returns a new instance of Vedeu::PositionValidator.
|
30
|
-
#
|
31
|
-
# @param name [String]
|
32
|
-
# @param y [Fixnum] The row/line coordinate.
|
33
|
-
# @param x [Fixnum] The column/character coordinate.
|
34
|
-
# @return [Vedeu::PositionValidator]
|
35
|
-
def initialize(name, x, y)
|
36
|
-
@name = name
|
37
|
-
@x = x
|
38
|
-
@y = y
|
39
|
-
end
|
40
|
-
|
41
|
-
# Ensures the coordinates provided are within the terminal, interface and
|
42
|
-
# when applicable, bordered interface area.
|
43
|
-
#
|
44
|
-
# @return [PositionValidator]
|
45
|
-
def validate
|
46
|
-
@x = bx if x < bx
|
47
|
-
@x = bxn if x > bxn
|
48
|
-
@y = by if y < by
|
49
|
-
@y = byn if y > byn
|
50
|
-
|
51
|
-
self
|
52
|
-
end
|
53
|
-
|
54
|
-
protected
|
55
|
-
|
56
|
-
# @!attribute [r] name
|
57
|
-
# @return [String]
|
58
|
-
attr_reader :name
|
59
|
-
|
60
|
-
private
|
61
|
-
|
62
|
-
# @see Vedeu::Borders#by_name
|
63
|
-
def border
|
64
|
-
@border ||= Vedeu.borders.by_name(name)
|
65
|
-
end
|
66
|
-
|
67
|
-
end # PositionValidator
|
68
|
-
|
69
|
-
end # Vedeu
|
@@ -1,130 +0,0 @@
|
|
1
|
-
require 'test_helper'
|
2
|
-
|
3
|
-
module Vedeu
|
4
|
-
|
5
|
-
describe IndexPosition do
|
6
|
-
|
7
|
-
let(:described) { Vedeu::IndexPosition }
|
8
|
-
let(:instance) { described.new(iy, ix, oy, ox) }
|
9
|
-
let(:iy) { 6 }
|
10
|
-
let(:ix) { 17 }
|
11
|
-
let(:oy) { 3 }
|
12
|
-
let(:ox) { 5 }
|
13
|
-
|
14
|
-
describe '#initialize' do
|
15
|
-
it { instance.must_be_instance_of(described) }
|
16
|
-
it { instance.instance_variable_get('@oy').must_equal(3) }
|
17
|
-
it { instance.instance_variable_get('@ox').must_equal(5) }
|
18
|
-
it { instance.instance_variable_get('@iy').must_equal(6) }
|
19
|
-
it { instance.instance_variable_get('@ix').must_equal(17) }
|
20
|
-
end
|
21
|
-
|
22
|
-
describe '.[]' do
|
23
|
-
subject { described[iy, ix] }
|
24
|
-
|
25
|
-
it { subject.must_be_instance_of(Vedeu::Position) }
|
26
|
-
end
|
27
|
-
|
28
|
-
describe '#[]' do
|
29
|
-
subject { instance.[] }
|
30
|
-
|
31
|
-
it { instance.must_respond_to(:to_position) }
|
32
|
-
|
33
|
-
it { subject.must_be_instance_of(Vedeu::Position) }
|
34
|
-
it { subject.y.must_equal(9) }
|
35
|
-
it { subject.x.must_equal(22) }
|
36
|
-
end
|
37
|
-
|
38
|
-
describe '#eql?' do
|
39
|
-
let(:other) { described.new(8, 21) }
|
40
|
-
|
41
|
-
subject { instance.eql?(other) }
|
42
|
-
|
43
|
-
it { subject.must_equal(true) }
|
44
|
-
|
45
|
-
context 'when different to other' do
|
46
|
-
let(:other) { described.new(2, 9) }
|
47
|
-
|
48
|
-
it { subject.must_equal(false) }
|
49
|
-
end
|
50
|
-
end
|
51
|
-
|
52
|
-
describe '#y' do
|
53
|
-
subject { instance.y }
|
54
|
-
|
55
|
-
it { instance.must_respond_to(:first) }
|
56
|
-
|
57
|
-
context 'when iy is <= 0' do
|
58
|
-
let(:iy) { -2 }
|
59
|
-
|
60
|
-
context 'and oy is <= 1' do
|
61
|
-
let(:oy) { -6 }
|
62
|
-
|
63
|
-
it { subject.must_equal(1) }
|
64
|
-
end
|
65
|
-
|
66
|
-
context 'and oy is > 1' do
|
67
|
-
let(:oy) { 4 }
|
68
|
-
|
69
|
-
it { subject.must_equal(4) }
|
70
|
-
end
|
71
|
-
end
|
72
|
-
|
73
|
-
context 'when iy is > 0' do
|
74
|
-
let(:iy) { 3 }
|
75
|
-
|
76
|
-
context 'and oy is <= 1' do
|
77
|
-
let(:oy) { -7 }
|
78
|
-
|
79
|
-
it { subject.must_equal(4) }
|
80
|
-
end
|
81
|
-
|
82
|
-
context 'and oy is > 1' do
|
83
|
-
let(:oy) { 5 }
|
84
|
-
|
85
|
-
it { subject.must_equal(8) }
|
86
|
-
end
|
87
|
-
end
|
88
|
-
end
|
89
|
-
|
90
|
-
describe '#x' do
|
91
|
-
subject { instance.x }
|
92
|
-
|
93
|
-
it { instance.must_respond_to(:last) }
|
94
|
-
|
95
|
-
context 'when ix is <= 0' do
|
96
|
-
let(:ix) { -2 }
|
97
|
-
|
98
|
-
context 'and ox is <= 1' do
|
99
|
-
let(:ox) { -6 }
|
100
|
-
|
101
|
-
it { subject.must_equal(1) }
|
102
|
-
end
|
103
|
-
|
104
|
-
context 'and ox is > 1' do
|
105
|
-
let(:ox) { 4 }
|
106
|
-
|
107
|
-
it { subject.must_equal(4) }
|
108
|
-
end
|
109
|
-
end
|
110
|
-
|
111
|
-
context 'when ix is > 0' do
|
112
|
-
let(:ix) { 3 }
|
113
|
-
|
114
|
-
context 'and ox is <= 1' do
|
115
|
-
let(:ox) { -7 }
|
116
|
-
|
117
|
-
it { subject.must_equal(4) }
|
118
|
-
end
|
119
|
-
|
120
|
-
context 'and ox is > 1' do
|
121
|
-
let(:ox) { 5 }
|
122
|
-
|
123
|
-
it { subject.must_equal(8) }
|
124
|
-
end
|
125
|
-
end
|
126
|
-
end
|
127
|
-
|
128
|
-
end # IndexPosition
|
129
|
-
|
130
|
-
end # Vedeu
|