vedeu 0.4.6 → 0.4.7
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/examples/typed_commands/command.erb +1 -0
- data/examples/typed_commands/output.erb +1 -0
- data/examples/typed_commands/status.erb +1 -0
- data/examples/typed_commands/typed_commands_app.rb +88 -0
- data/lib/vedeu/bindings.rb +15 -3
- data/lib/vedeu/cursor/all.rb +1 -0
- data/lib/vedeu/cursor/cursor.rb +5 -0
- data/lib/vedeu/cursor/move_cursor.rb +5 -4
- data/lib/vedeu/cursor/refresh_cursor.rb +89 -0
- data/lib/vedeu/distributed/server.rb +6 -6
- data/lib/vedeu/dsl/interface.rb +6 -9
- data/lib/vedeu/input/input.rb +10 -2
- data/lib/vedeu/models/char.rb +7 -7
- data/lib/vedeu/output/output.rb +1 -1
- data/lib/vedeu/output/refresh.rb +11 -0
- data/lib/vedeu/output/wordwrap.rb +0 -10
- data/lib/vedeu/support/visible.rb +5 -0
- data/test/lib/vedeu/cursor/cursor_test.rb +7 -0
- data/test/lib/vedeu/cursor/move_cursor_test.rb +4 -1
- data/test/lib/vedeu/cursor/refresh_cursor_test.rb +22 -0
- data/test/lib/vedeu/dsl/interface_test.rb +21 -1
- data/test/lib/vedeu/input/input_test.rb +33 -10
- data/test/lib/vedeu/models/char_test.rb +19 -0
- data/test/lib/vedeu/models/interface_test.rb +13 -0
- data/test/lib/vedeu/output/html_char_test.rb +23 -0
- data/test/lib/vedeu/output/refresh_test.rb +25 -4
- data/test/lib/vedeu/support/visible_test.rb +16 -0
- data/test/test_helper.rb +0 -2
- data/vedeu.gemspec +2 -3
- metadata +11 -18
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 80640072b141fef605a79c9713e7e0b389fe7ef6
|
4
|
+
data.tar.gz: ff600f46a10489bd1369e7c3af9389d5265bf802
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a28c6ab1df05e903f03820ca75492ef060253f3122f4336e7bdf164db91571afbfd6c2f8c3a8983825eba2b2d3139badd88a2012ce5a3689e994132b9a1b6dde
|
7
|
+
data.tar.gz: 3968b584c4ad1161164dbc7b163f9f850fe5883255ccfa899fa3a1a3374d9d9cddace5f42e506c01c9f4d68fbfbb6d6eb306107e33d31a9eb006b880647765a4
|
@@ -0,0 +1 @@
|
|
1
|
+
command
|
@@ -0,0 +1 @@
|
|
1
|
+
output
|
@@ -0,0 +1 @@
|
|
1
|
+
status
|
@@ -0,0 +1,88 @@
|
|
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
|
+
class VedeuTypedCommands
|
9
|
+
include Vedeu
|
10
|
+
|
11
|
+
configure do
|
12
|
+
colour_mode 16777216
|
13
|
+
debug!
|
14
|
+
log '/tmp/vedeu_typed_commands_app.log'
|
15
|
+
end
|
16
|
+
|
17
|
+
bind(:_initialize_) { Vedeu.trigger(:_refresh_) }
|
18
|
+
|
19
|
+
interface 'output' do
|
20
|
+
colour foreground: '#ff0000', background: '#000022'
|
21
|
+
cursor!
|
22
|
+
end
|
23
|
+
|
24
|
+
interface 'status' do
|
25
|
+
colour foreground: '#00ff00', background: '#003300'
|
26
|
+
cursor!
|
27
|
+
end
|
28
|
+
|
29
|
+
interface 'command' do
|
30
|
+
colour foreground: '#ffff00', background: '#111111'
|
31
|
+
cursor!
|
32
|
+
end
|
33
|
+
|
34
|
+
keymap('_global_') do
|
35
|
+
key(:up, 'k') { Vedeu.trigger(:_cursor_up_) }
|
36
|
+
key(:right, 'l') { Vedeu.trigger(:_cursor_right_) }
|
37
|
+
key(:down, 'j') { Vedeu.trigger(:_cursor_down_) }
|
38
|
+
key(:left, 'h') { Vedeu.trigger(:_cursor_left_) }
|
39
|
+
end
|
40
|
+
|
41
|
+
border('output') do
|
42
|
+
colour foreground: '#aadd00', background: '#000022'
|
43
|
+
hide_bottom!
|
44
|
+
end
|
45
|
+
border('status') do
|
46
|
+
colour foreground: '#aadd00', background: '#003300'
|
47
|
+
hide_top!
|
48
|
+
hide_bottom!
|
49
|
+
end
|
50
|
+
border('command') do
|
51
|
+
colour foreground: '#aadd00', background: '#111111'
|
52
|
+
hide_top!
|
53
|
+
end
|
54
|
+
|
55
|
+
geometry 'output' do
|
56
|
+
centred!
|
57
|
+
height 7
|
58
|
+
width 40
|
59
|
+
end
|
60
|
+
|
61
|
+
geometry('status') do
|
62
|
+
height 1
|
63
|
+
width 40
|
64
|
+
x Vedeu.use('output').left
|
65
|
+
y Vedeu.use('output').south(0)
|
66
|
+
end
|
67
|
+
|
68
|
+
geometry 'command' do
|
69
|
+
height 3
|
70
|
+
width 40
|
71
|
+
x Vedeu.use('status').left
|
72
|
+
y Vedeu.use('status').south(0)
|
73
|
+
end
|
74
|
+
|
75
|
+
focus_by_name 'command'
|
76
|
+
|
77
|
+
renders do
|
78
|
+
template_for('output', (File.dirname(__FILE__) + '/output.erb'), nil)
|
79
|
+
template_for('status', (File.dirname(__FILE__) + '/status.erb'), nil)
|
80
|
+
template_for('command', (File.dirname(__FILE__) + '/command.erb'), nil)
|
81
|
+
end
|
82
|
+
|
83
|
+
def self.start(argv = ARGV)
|
84
|
+
Vedeu::Launcher.execute!(argv)
|
85
|
+
end
|
86
|
+
end
|
87
|
+
|
88
|
+
VedeuTypedCommands.start(ARGV)
|
data/lib/vedeu/bindings.rb
CHANGED
@@ -22,9 +22,13 @@ module Vedeu
|
|
22
22
|
Vedeu.trigger(:cleanup)
|
23
23
|
end
|
24
24
|
|
25
|
-
Vedeu.bind(:_drb_input_) do |data|
|
26
|
-
Vedeu.log(type: :drb, message:
|
27
|
-
|
25
|
+
Vedeu.bind(:_drb_input_) do |data, type|
|
26
|
+
Vedeu.log(type: :drb, message: "Sending input (#{type})")
|
27
|
+
|
28
|
+
case type
|
29
|
+
when :command then Vedeu.trigger(:_command_, data)
|
30
|
+
else Vedeu.trigger(:_keypress_, data)
|
31
|
+
end
|
28
32
|
end
|
29
33
|
|
30
34
|
Vedeu.bind(:_drb_retrieve_output_) do
|
@@ -62,6 +66,10 @@ module Vedeu
|
|
62
66
|
Vedeu.keypress(key)
|
63
67
|
end
|
64
68
|
|
69
|
+
# Will cause the triggering of the `:command` event; which you should define
|
70
|
+
# to 'do things'.
|
71
|
+
Vedeu.bind(:_command_) { |command| Vedeu.trigger(:command, command) }
|
72
|
+
|
65
73
|
# When triggered with a message will cause Vedeu to log the message if
|
66
74
|
# logging is enabled in the configuration.
|
67
75
|
Vedeu.bind(:_log_) { |msg| Vedeu.log(type: :debug, message: msg) }
|
@@ -182,6 +190,10 @@ module Vedeu
|
|
182
190
|
name ? Vedeu::Refresh.by_name(name) : Vedeu::Refresh.all
|
183
191
|
end
|
184
192
|
|
193
|
+
# Will cause the named cursor to refresh, or the cursor of the interface
|
194
|
+
# which is currently in focus.
|
195
|
+
Vedeu.bind(:_refresh_cursor_) { |name| Vedeu::Refresh.cursor(name) }
|
196
|
+
|
185
197
|
# Will cause all interfaces in the named group to refresh.
|
186
198
|
Vedeu.bind(:_refresh_group_) { |name| Vedeu::Refresh.by_group(name) }
|
187
199
|
|
data/lib/vedeu/cursor/all.rb
CHANGED
data/lib/vedeu/cursor/cursor.rb
CHANGED
@@ -77,6 +77,11 @@ module Vedeu
|
|
77
77
|
@position = Vedeu::Position.new(@y, @x)
|
78
78
|
end
|
79
79
|
|
80
|
+
# @return [String]
|
81
|
+
def inspect
|
82
|
+
"<Vedeu::Cursor (#{name}, #{state}, x:#{x}, y:#{y}, ox:#{ox}, oy:#{oy})>"
|
83
|
+
end
|
84
|
+
|
80
85
|
# Returns an escape sequence to position the cursor and set its visibility.
|
81
86
|
# When passed a block, will position the cursor, yield and return the
|
82
87
|
# original position.
|
@@ -74,16 +74,17 @@ module Vedeu
|
|
74
74
|
if name
|
75
75
|
cursor = Vedeu.cursors.by_name(name)
|
76
76
|
interface = Vedeu.interfaces.find(name)
|
77
|
-
new_cursor = Vedeu::MoveCursor.send(direction, cursor, interface)
|
78
|
-
Vedeu::Refresh.by_name(name)
|
79
77
|
|
80
78
|
else
|
81
79
|
cursor = Vedeu.cursor
|
82
80
|
interface = Vedeu.interfaces.current
|
83
|
-
new_cursor = Vedeu::MoveCursor.send(direction, cursor, interface)
|
84
|
-
Vedeu::Refresh.by_focus
|
85
81
|
|
86
82
|
end
|
83
|
+
|
84
|
+
new_cursor = Vedeu::MoveCursor.send(direction, cursor, interface)
|
85
|
+
|
86
|
+
Vedeu.trigger(:_refresh_cursor_, new_cursor.name)
|
87
|
+
|
87
88
|
new_cursor
|
88
89
|
end
|
89
90
|
|
@@ -0,0 +1,89 @@
|
|
1
|
+
module Vedeu
|
2
|
+
|
3
|
+
class RefreshCursor
|
4
|
+
|
5
|
+
# @param name [String] The name of the cursor.
|
6
|
+
# @return [Array]
|
7
|
+
def self.render(name)
|
8
|
+
new(name).render
|
9
|
+
end
|
10
|
+
|
11
|
+
# @param name [String] The name of the cursor.
|
12
|
+
# @return [Vedeu::RefreshCursor]
|
13
|
+
def initialize(name)
|
14
|
+
@name = name
|
15
|
+
end
|
16
|
+
|
17
|
+
# @return [Array]
|
18
|
+
def render
|
19
|
+
Vedeu::Refresh.by_name(name) if refresh_view?
|
20
|
+
|
21
|
+
Vedeu::Terminal.output(new_cursor.to_s)
|
22
|
+
end
|
23
|
+
|
24
|
+
private
|
25
|
+
|
26
|
+
# @!attribute [r] name
|
27
|
+
# @return [String]
|
28
|
+
attr_reader :name
|
29
|
+
|
30
|
+
# @return [Boolean]
|
31
|
+
def refresh_view?
|
32
|
+
new_cursor.ox >= interface_width || new_cursor.oy >= interface_height
|
33
|
+
end
|
34
|
+
|
35
|
+
# @return [Vedeu::Cursor]
|
36
|
+
def new_cursor
|
37
|
+
@new_cursor ||= Vedeu::Cursor.new(cursor.attributes.merge(position))
|
38
|
+
end
|
39
|
+
|
40
|
+
# @return [Hash]
|
41
|
+
def position
|
42
|
+
{
|
43
|
+
x: validated_position.x,
|
44
|
+
y: validated_position.y,
|
45
|
+
}
|
46
|
+
end
|
47
|
+
|
48
|
+
# @return [Vedeu::PositionValidator]
|
49
|
+
def validated_position
|
50
|
+
@position ||= Vedeu::PositionValidator.validate(interface,
|
51
|
+
cursor.x,
|
52
|
+
cursor.y)
|
53
|
+
end
|
54
|
+
|
55
|
+
# @return [Vedeu::Cursor]
|
56
|
+
def cursor
|
57
|
+
@cursor ||= Vedeu.cursors.find(name)
|
58
|
+
end
|
59
|
+
|
60
|
+
# @return [Fixnum]
|
61
|
+
def interface_height
|
62
|
+
if interface.border?
|
63
|
+
interface.border.height
|
64
|
+
|
65
|
+
else
|
66
|
+
interface.height
|
67
|
+
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
# @return [Fixnum]
|
72
|
+
def interface_width
|
73
|
+
if interface.border?
|
74
|
+
interface.border.width
|
75
|
+
|
76
|
+
else
|
77
|
+
interface.width
|
78
|
+
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
82
|
+
# @return [Vedeu::Interface]
|
83
|
+
def interface
|
84
|
+
@interface ||= Vedeu.interfaces.find(name)
|
85
|
+
end
|
86
|
+
|
87
|
+
end # RefreshCursor
|
88
|
+
|
89
|
+
end # Vedeu
|
@@ -13,10 +13,9 @@ module Vedeu
|
|
13
13
|
|
14
14
|
include Singleton
|
15
15
|
|
16
|
-
# @
|
17
|
-
|
18
|
-
|
19
|
-
instance.input(data)
|
16
|
+
# @see Vedeu::Distributed::Server#input
|
17
|
+
def self.input(data, type = :key)
|
18
|
+
instance.input(data, type)
|
20
19
|
end
|
21
20
|
|
22
21
|
# @return [void]
|
@@ -50,9 +49,10 @@ module Vedeu
|
|
50
49
|
end
|
51
50
|
|
52
51
|
# @param data [String|Symbol]
|
52
|
+
# @param type [Symbol] Either :keypress or :command.
|
53
53
|
# @return [void]
|
54
|
-
def input(data)
|
55
|
-
Vedeu.trigger(:_drb_input_, data)
|
54
|
+
def input(data, type = :keypress)
|
55
|
+
Vedeu.trigger(:_drb_input_, data, type)
|
56
56
|
end
|
57
57
|
alias_method :read, :input
|
58
58
|
|
data/lib/vedeu/dsl/interface.rb
CHANGED
@@ -145,19 +145,16 @@ module Vedeu
|
|
145
145
|
# @return [String]
|
146
146
|
def group(name)
|
147
147
|
return false unless defined_value?(name)
|
148
|
+
model.group = name
|
148
149
|
|
149
|
-
if
|
150
|
-
|
151
|
-
Vedeu.groups.find(name).add(model.name)
|
150
|
+
if Vedeu.groups.registered?(name)
|
151
|
+
Vedeu.groups.find(name).add(model.name)
|
152
152
|
|
153
|
-
|
154
|
-
|
155
|
-
|
153
|
+
else
|
154
|
+
new_group = Vedeu::Group.new({ name: name })
|
155
|
+
new_group.add(model.name)
|
156
156
|
|
157
|
-
end
|
158
157
|
end
|
159
|
-
|
160
|
-
model.group = name
|
161
158
|
end
|
162
159
|
|
163
160
|
# @see Vedeu::DSL::Keymap.keymap
|
data/lib/vedeu/input/input.rb
CHANGED
@@ -23,11 +23,18 @@ module Vedeu
|
|
23
23
|
@reader = reader
|
24
24
|
end
|
25
25
|
|
26
|
-
# Triggers
|
26
|
+
# Triggers either a ':_command_' event with the command if the reader is in
|
27
|
+
# cooked mode, or if raw mode, the keypress event with the key(s) pressed.
|
27
28
|
#
|
28
29
|
# @return [Array|String|Symbol]
|
29
30
|
def capture
|
30
|
-
|
31
|
+
if reader.raw_mode?
|
32
|
+
Vedeu.trigger(:_keypress_, keypress)
|
33
|
+
|
34
|
+
else
|
35
|
+
Vedeu.trigger(:_command_, command)
|
36
|
+
|
37
|
+
end
|
31
38
|
end
|
32
39
|
|
33
40
|
private
|
@@ -42,6 +49,7 @@ module Vedeu
|
|
42
49
|
def input
|
43
50
|
@input ||= reader.read
|
44
51
|
end
|
52
|
+
alias_method :command, :input
|
45
53
|
|
46
54
|
# Returns the translated (if possible) keypress(es) as either a String or a
|
47
55
|
# Symbol.
|
data/lib/vedeu/models/char.rb
CHANGED
@@ -113,14 +113,14 @@ module Vedeu
|
|
113
113
|
def to_hash
|
114
114
|
{
|
115
115
|
parent: {
|
116
|
-
background: parent_background,
|
117
|
-
foreground: parent_foreground,
|
118
|
-
style: parent_style,
|
116
|
+
background: parent_background.to_s,
|
117
|
+
foreground: parent_foreground.to_s,
|
118
|
+
style: parent_style.to_s,
|
119
119
|
},
|
120
|
-
background:
|
121
|
-
border:
|
122
|
-
foreground:
|
123
|
-
style:
|
120
|
+
background: background.to_s,
|
121
|
+
border: border.to_s,
|
122
|
+
foreground: foreground.to_s,
|
123
|
+
style: style.to_s,
|
124
124
|
value: value,
|
125
125
|
x: x,
|
126
126
|
y: y,
|
data/lib/vedeu/output/output.rb
CHANGED
data/lib/vedeu/output/refresh.rb
CHANGED
@@ -42,6 +42,17 @@ module Vedeu
|
|
42
42
|
Vedeu::Compositor.compose(name)
|
43
43
|
end
|
44
44
|
|
45
|
+
# Refresh a cursor by name.
|
46
|
+
#
|
47
|
+
# @param name [String]
|
48
|
+
# @return [Array]
|
49
|
+
def cursor(name = Vedeu.focus)
|
50
|
+
if name
|
51
|
+
Vedeu.log(type: :info, message: "Refreshing cursor: '#{name}'")
|
52
|
+
Vedeu::RefreshCursor.render(name)
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
45
56
|
end # Refresh
|
46
57
|
|
47
58
|
end # Vedeu
|
@@ -104,16 +104,6 @@ module Vedeu
|
|
104
104
|
text.split(/\n/)
|
105
105
|
end
|
106
106
|
|
107
|
-
# @note
|
108
|
-
# This may be unused. (GL 2015-02-20)
|
109
|
-
#
|
110
|
-
# @return [String]
|
111
|
-
def output
|
112
|
-
processed.reduce([]) do |output, line|
|
113
|
-
output << line.join(' ')
|
114
|
-
end.join("\n")
|
115
|
-
end
|
116
|
-
|
117
107
|
# @param string [String]
|
118
108
|
# @return [String]
|
119
109
|
def ellipsis_string(string)
|
@@ -39,6 +39,13 @@ module Vedeu
|
|
39
39
|
it { instance.instance_variable_get('@position').must_be_instance_of(Vedeu::Position) }
|
40
40
|
end
|
41
41
|
|
42
|
+
describe '#inspect' do
|
43
|
+
subject { instance.inspect }
|
44
|
+
|
45
|
+
it { subject.must_be_instance_of(String) }
|
46
|
+
it { subject.must_equal("<Vedeu::Cursor (silver, visible, x:19, y:8, ox:3, oy:2)>") }
|
47
|
+
end
|
48
|
+
|
42
49
|
describe '#to_s' do
|
43
50
|
let(:state) { true }
|
44
51
|
|
@@ -53,7 +53,10 @@ module Vedeu
|
|
53
53
|
let(:dy) { 0 }
|
54
54
|
let(:dx) { 0 }
|
55
55
|
|
56
|
-
before
|
56
|
+
before do
|
57
|
+
IO.console.stubs(:winsize).returns([25, 80])
|
58
|
+
IO.console.stubs(:print)
|
59
|
+
end
|
57
60
|
|
58
61
|
describe '#initialize' do
|
59
62
|
it { instance.must_be_instance_of(Vedeu::MoveCursor) }
|
@@ -0,0 +1,22 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
module Vedeu
|
4
|
+
|
5
|
+
describe RefreshCursor do
|
6
|
+
|
7
|
+
let(:described) { Vedeu::RefreshCursor }
|
8
|
+
let(:instance) { described.new(_name) }
|
9
|
+
let(:_name) { 'refresh_cursor' }
|
10
|
+
|
11
|
+
before do
|
12
|
+
Vedeu::Terminal.stubs(:output)
|
13
|
+
end
|
14
|
+
|
15
|
+
describe '#initialize' do
|
16
|
+
it { instance.must_be_instance_of(Vedeu::RefreshCursor) }
|
17
|
+
it { instance.instance_variable_get('@name').must_equal(_name) }
|
18
|
+
end
|
19
|
+
|
20
|
+
end # RefreshCursor
|
21
|
+
|
22
|
+
end # Vedeu
|
@@ -171,15 +171,35 @@ module Vedeu
|
|
171
171
|
describe '#group' do
|
172
172
|
let(:value) { 'elements' }
|
173
173
|
|
174
|
+
before { Vedeu.groups.reset }
|
175
|
+
|
174
176
|
subject { instance.group(value) }
|
175
177
|
|
176
|
-
it { subject.must_be_instance_of(
|
178
|
+
it { subject.must_be_instance_of(Vedeu::Group) }
|
177
179
|
|
178
180
|
context 'when the value is empty or nil' do
|
179
181
|
let(:value) { '' }
|
180
182
|
|
181
183
|
it { subject.must_equal(false) }
|
182
184
|
end
|
185
|
+
|
186
|
+
context 'when the named group exists' do
|
187
|
+
before do
|
188
|
+
Vedeu::Group.new({ name: 'elements', members: ['lanthanum'] }).store
|
189
|
+
end
|
190
|
+
|
191
|
+
it {
|
192
|
+
subject
|
193
|
+
Vedeu.groups.find('elements').members.must_equal(Set['actinium', 'lanthanum'])
|
194
|
+
}
|
195
|
+
end
|
196
|
+
|
197
|
+
context 'when the named group does not exist' do
|
198
|
+
it {
|
199
|
+
subject
|
200
|
+
Vedeu.groups.find('elements').members.must_equal(Set['actinium'])
|
201
|
+
}
|
202
|
+
end
|
183
203
|
end
|
184
204
|
|
185
205
|
describe '#keymap' do
|
@@ -8,8 +8,12 @@ module Vedeu
|
|
8
8
|
let(:keypress) { 'a' }
|
9
9
|
let(:described) { Vedeu::Input }
|
10
10
|
let(:instance) { described.new(reader) }
|
11
|
+
let(:raw_mode) { true }
|
11
12
|
|
12
|
-
before
|
13
|
+
before do
|
14
|
+
reader.stubs(:raw_mode?).returns(raw_mode)
|
15
|
+
Vedeu.stubs(:trigger).returns([false])
|
16
|
+
end
|
13
17
|
|
14
18
|
describe '#initialize' do
|
15
19
|
it { instance.must_be_instance_of(Input) }
|
@@ -17,21 +21,40 @@ module Vedeu
|
|
17
21
|
end
|
18
22
|
|
19
23
|
describe '.capture' do
|
20
|
-
|
21
|
-
|
24
|
+
subject { instance.capture }
|
25
|
+
|
26
|
+
context 'when in cooked mode' do
|
27
|
+
let(:raw_mode) { false }
|
28
|
+
let(:command) { 'help' }
|
29
|
+
|
30
|
+
before { reader.stubs(:read).returns(command) }
|
22
31
|
|
23
|
-
it 'triggers an event
|
24
|
-
|
32
|
+
it 'triggers an event with the command' do
|
33
|
+
Vedeu.expects(:trigger).with(:_command_, command)
|
34
|
+
subject
|
25
35
|
end
|
26
36
|
end
|
27
37
|
|
28
|
-
context 'when
|
29
|
-
let(:
|
38
|
+
context 'when in raw mode' do
|
39
|
+
let(:raw_mode) { true }
|
40
|
+
let(:keypress) { 'a' }
|
41
|
+
|
42
|
+
before { reader.stubs(:read).returns(keypress) }
|
43
|
+
|
44
|
+
context 'when the key is not special' do
|
45
|
+
it 'triggers an event with the keypress' do
|
46
|
+
Vedeu.expects(:trigger).with(:_keypress_, keypress)
|
47
|
+
subject
|
48
|
+
end
|
49
|
+
end
|
30
50
|
|
31
|
-
|
51
|
+
context 'when the key is special' do
|
52
|
+
let(:keypress) { "\e[A" }
|
32
53
|
|
33
|
-
|
34
|
-
|
54
|
+
it 'triggers an event with the keypress' do
|
55
|
+
Vedeu.expects(:trigger).with(:_keypress_, :up)
|
56
|
+
subject
|
57
|
+
end
|
35
58
|
end
|
36
59
|
end
|
37
60
|
end
|
@@ -57,6 +57,25 @@ module Vedeu
|
|
57
57
|
) }
|
58
58
|
end
|
59
59
|
|
60
|
+
describe '#to_hash' do
|
61
|
+
subject { instance.to_hash }
|
62
|
+
|
63
|
+
it { subject.must_be_instance_of(Hash) }
|
64
|
+
|
65
|
+
it { subject.must_equal({ parent: {
|
66
|
+
background: '',
|
67
|
+
foreground: '',
|
68
|
+
style: '',
|
69
|
+
},
|
70
|
+
background: '',
|
71
|
+
border: '',
|
72
|
+
foreground: '',
|
73
|
+
style: '',
|
74
|
+
value: value,
|
75
|
+
x: nil,
|
76
|
+
y: nil }) }
|
77
|
+
end
|
78
|
+
|
60
79
|
describe '#to_html' do
|
61
80
|
subject { instance.to_html }
|
62
81
|
|
@@ -34,6 +34,19 @@ module Vedeu
|
|
34
34
|
it { instance.instance_variable_get('@repository').must_equal(Vedeu.interfaces) }
|
35
35
|
end
|
36
36
|
|
37
|
+
describe '#attributes' do
|
38
|
+
subject { instance.attributes }
|
39
|
+
|
40
|
+
it { subject.must_be_instance_of(Hash) }
|
41
|
+
|
42
|
+
it { subject.must_equal({ colour: nil,
|
43
|
+
delay: 0.0,
|
44
|
+
group: '',
|
45
|
+
name: 'hydrogen',
|
46
|
+
parent: nil,
|
47
|
+
style: nil }) }
|
48
|
+
end
|
49
|
+
|
37
50
|
describe '#border?' do
|
38
51
|
subject { instance.border? }
|
39
52
|
|
@@ -59,6 +59,29 @@ module Vedeu
|
|
59
59
|
end
|
60
60
|
end
|
61
61
|
|
62
|
+
{
|
63
|
+
top_horizontal: "border-top:1px #222 solid;",
|
64
|
+
left_vertical: "border-left:1px #222 solid;",
|
65
|
+
right_vertical: "border-right:1px #222 solid;",
|
66
|
+
bottom_horizontal: "border-bottom:1px #222 solid;",
|
67
|
+
top_left: "border-top:1px #222 solid;border-left:1px #222 solid;",
|
68
|
+
top_right: "border-top:1px #222 solid;border-right:1px #222 solid;",
|
69
|
+
bottom_left: "border-bottom:1px #222 solid;border-left:1px #222 solid;",
|
70
|
+
bottom_right: "border-bottom:1px #222 solid;border-right:1px #222 solid;",
|
71
|
+
horizontal: '',
|
72
|
+
vertical: ''
|
73
|
+
}.each do |border_style, result|
|
74
|
+
context "when there is a border (#{border_style.inspect})" do
|
75
|
+
let(:border) { border_style }
|
76
|
+
|
77
|
+
it { subject.must_equal(
|
78
|
+
"<td style='background:#000;color:#222;border:1px #000 solid;" +
|
79
|
+
result +
|
80
|
+
"'> </td>"
|
81
|
+
) }
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
62
85
|
context 'when there is no border' do
|
63
86
|
context 'when there is no value' do
|
64
87
|
it { subject.must_equal("<td> </td>") }
|
@@ -24,7 +24,7 @@ module Vedeu
|
|
24
24
|
context 'when there are no registered interfaces' do
|
25
25
|
before { Vedeu.focusable.reset }
|
26
26
|
|
27
|
-
it {
|
27
|
+
it { described.by_focus.must_equal(nil) }
|
28
28
|
end
|
29
29
|
|
30
30
|
context 'when there are registered interfaces' do
|
@@ -35,7 +35,7 @@ module Vedeu
|
|
35
35
|
context 'when there are no registered groups' do
|
36
36
|
before { Vedeu.groups.reset }
|
37
37
|
|
38
|
-
it { proc {
|
38
|
+
it { proc { described.by_group('') }.must_raise(ModelNotFound) }
|
39
39
|
end
|
40
40
|
|
41
41
|
context 'when there are registered groups' do
|
@@ -45,18 +45,39 @@ module Vedeu
|
|
45
45
|
describe '.by_name' do
|
46
46
|
let(:interface_name) { 'aluminium' }
|
47
47
|
|
48
|
-
subject {
|
48
|
+
subject { described.by_name(interface_name) }
|
49
49
|
|
50
50
|
context 'when the interface or buffer is not found' do
|
51
51
|
let(:interface_name) { '' }
|
52
52
|
|
53
|
-
it { proc {
|
53
|
+
it { proc { described.by_name('') }.must_raise(ModelNotFound) }
|
54
54
|
end
|
55
55
|
|
56
56
|
context 'when the interface or buffer is found' do
|
57
57
|
end
|
58
58
|
end
|
59
59
|
|
60
|
+
describe '.cursor' do
|
61
|
+
let(:_name) {}
|
62
|
+
|
63
|
+
subject { described.cursor(_name) }
|
64
|
+
|
65
|
+
before { Vedeu::RefreshCursor.stubs(:render) }
|
66
|
+
|
67
|
+
context 'when there is a name' do
|
68
|
+
let(:_name) { 'refresh_cursor' }
|
69
|
+
|
70
|
+
it {
|
71
|
+
Vedeu::RefreshCursor.expects(:render).with(_name)
|
72
|
+
subject
|
73
|
+
}
|
74
|
+
end
|
75
|
+
|
76
|
+
context 'when there is no name' do
|
77
|
+
it { subject.must_equal(nil) }
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
60
81
|
end # Refresh
|
61
82
|
|
62
83
|
end # Vedeu
|
@@ -62,6 +62,22 @@ module Vedeu
|
|
62
62
|
end
|
63
63
|
end
|
64
64
|
|
65
|
+
describe '#to_s' do
|
66
|
+
subject { instance.to_s }
|
67
|
+
|
68
|
+
it { subject.must_be_instance_of(String) }
|
69
|
+
|
70
|
+
context 'when visible' do
|
71
|
+
it { subject.must_equal('visible') }
|
72
|
+
end
|
73
|
+
|
74
|
+
context 'when not visible' do
|
75
|
+
let(:visible) { false }
|
76
|
+
|
77
|
+
it { subject.must_equal('invisible') }
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
65
81
|
describe '#cursor' do
|
66
82
|
subject { instance.cursor }
|
67
83
|
|
data/test/test_helper.rb
CHANGED
@@ -1,5 +1,4 @@
|
|
1
1
|
require 'simplecov'
|
2
|
-
require 'simplecov-console'
|
3
2
|
require 'pry'
|
4
3
|
require 'minitest/autorun'
|
5
4
|
require 'minitest/pride' unless ENV['NO_COLOR']
|
@@ -8,7 +7,6 @@ require 'minitest/hell'
|
|
8
7
|
# GC.disable # uncomment to remove ~20ms from test run speed
|
9
8
|
|
10
9
|
SimpleCov.start do
|
11
|
-
formatter SimpleCov::Formatter::Console
|
12
10
|
command_name 'MiniTest::Spec'
|
13
11
|
add_filter '/test/'
|
14
12
|
add_group 'api', 'vedeu/api'
|
data/vedeu.gemspec
CHANGED
@@ -4,7 +4,7 @@ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
|
4
4
|
|
5
5
|
Gem::Specification.new do |spec|
|
6
6
|
spec.name = 'vedeu'
|
7
|
-
spec.version = '0.4.
|
7
|
+
spec.version = '0.4.7'
|
8
8
|
spec.authors = ['Gavin Laking']
|
9
9
|
spec.email = ['gavinlaking@gmail.com']
|
10
10
|
spec.summary = %q{A terminal case of wonderland.}
|
@@ -22,7 +22,7 @@ Gem::Specification.new do |spec|
|
|
22
22
|
spec.add_development_dependency 'cucumber', '1.3.19'
|
23
23
|
spec.add_development_dependency 'guard', '2.12.4'
|
24
24
|
spec.add_development_dependency 'guard-bundler', '2.1.0'
|
25
|
-
spec.add_development_dependency 'guard-cucumber', '1.5.
|
25
|
+
spec.add_development_dependency 'guard-cucumber', '1.5.4'
|
26
26
|
spec.add_development_dependency 'guard-minitest', '2.4.4'
|
27
27
|
spec.add_development_dependency 'inch', '0.5.10'
|
28
28
|
spec.add_development_dependency 'minitest', '5.5.1'
|
@@ -33,6 +33,5 @@ Gem::Specification.new do |spec|
|
|
33
33
|
spec.add_development_dependency 'rake', '10.4.2'
|
34
34
|
spec.add_development_dependency 'ruby-prof', '0.15.6'
|
35
35
|
spec.add_development_dependency 'simplecov', '0.9.2'
|
36
|
-
spec.add_development_dependency 'simplecov-console', '0.2.0'
|
37
36
|
spec.add_development_dependency 'yard', '0.8.7.6'
|
38
37
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: vedeu
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.4.
|
4
|
+
version: 0.4.7
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Gavin Laking
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-03-
|
11
|
+
date: 2015-03-12 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: aruba
|
@@ -86,14 +86,14 @@ dependencies:
|
|
86
86
|
requirements:
|
87
87
|
- - '='
|
88
88
|
- !ruby/object:Gem::Version
|
89
|
-
version: 1.5.
|
89
|
+
version: 1.5.4
|
90
90
|
type: :development
|
91
91
|
prerelease: false
|
92
92
|
version_requirements: !ruby/object:Gem::Requirement
|
93
93
|
requirements:
|
94
94
|
- - '='
|
95
95
|
- !ruby/object:Gem::Version
|
96
|
-
version: 1.5.
|
96
|
+
version: 1.5.4
|
97
97
|
- !ruby/object:Gem::Dependency
|
98
98
|
name: guard-minitest
|
99
99
|
requirement: !ruby/object:Gem::Requirement
|
@@ -234,20 +234,6 @@ dependencies:
|
|
234
234
|
- - '='
|
235
235
|
- !ruby/object:Gem::Version
|
236
236
|
version: 0.9.2
|
237
|
-
- !ruby/object:Gem::Dependency
|
238
|
-
name: simplecov-console
|
239
|
-
requirement: !ruby/object:Gem::Requirement
|
240
|
-
requirements:
|
241
|
-
- - '='
|
242
|
-
- !ruby/object:Gem::Version
|
243
|
-
version: 0.2.0
|
244
|
-
type: :development
|
245
|
-
prerelease: false
|
246
|
-
version_requirements: !ruby/object:Gem::Requirement
|
247
|
-
requirements:
|
248
|
-
- - '='
|
249
|
-
- !ruby/object:Gem::Version
|
250
|
-
version: 0.2.0
|
251
237
|
- !ruby/object:Gem::Dependency
|
252
238
|
name: yard
|
253
239
|
requirement: !ruby/object:Gem::Requirement
|
@@ -301,6 +287,10 @@ files:
|
|
301
287
|
- examples/geometry_app.rb
|
302
288
|
- examples/hello_world.rb
|
303
289
|
- examples/lines_app.rb
|
290
|
+
- examples/typed_commands/command.erb
|
291
|
+
- examples/typed_commands/output.erb
|
292
|
+
- examples/typed_commands/status.erb
|
293
|
+
- examples/typed_commands/typed_commands_app.rb
|
304
294
|
- examples/view_templates_app/template.erb
|
305
295
|
- examples/view_templates_app/view_templates_app.rb
|
306
296
|
- features/start_stop.feature
|
@@ -321,6 +311,7 @@ files:
|
|
321
311
|
- lib/vedeu/cursor/all.rb
|
322
312
|
- lib/vedeu/cursor/cursor.rb
|
323
313
|
- lib/vedeu/cursor/move_cursor.rb
|
314
|
+
- lib/vedeu/cursor/refresh_cursor.rb
|
324
315
|
- lib/vedeu/cursor/toggle_cursor.rb
|
325
316
|
- lib/vedeu/debug.rb
|
326
317
|
- lib/vedeu/distributed/all.rb
|
@@ -435,6 +426,7 @@ files:
|
|
435
426
|
- test/lib/vedeu/configuration/configuration_test.rb
|
436
427
|
- test/lib/vedeu/cursor/cursor_test.rb
|
437
428
|
- test/lib/vedeu/cursor/move_cursor_test.rb
|
429
|
+
- test/lib/vedeu/cursor/refresh_cursor_test.rb
|
438
430
|
- test/lib/vedeu/cursor/toggle_cursor_test.rb
|
439
431
|
- test/lib/vedeu/distributed/client_test.rb
|
440
432
|
- test/lib/vedeu/distributed/server_test.rb
|
@@ -564,6 +556,7 @@ test_files:
|
|
564
556
|
- test/lib/vedeu/configuration/configuration_test.rb
|
565
557
|
- test/lib/vedeu/cursor/cursor_test.rb
|
566
558
|
- test/lib/vedeu/cursor/move_cursor_test.rb
|
559
|
+
- test/lib/vedeu/cursor/refresh_cursor_test.rb
|
567
560
|
- test/lib/vedeu/cursor/toggle_cursor_test.rb
|
568
561
|
- test/lib/vedeu/distributed/client_test.rb
|
569
562
|
- test/lib/vedeu/distributed/server_test.rb
|