vedeu 0.1.10 → 0.1.12
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/lib/vedeu.rb +2 -10
- data/lib/vedeu/api/api.rb +29 -1
- data/lib/vedeu/api/events.rb +1 -26
- data/lib/vedeu/api/{base.rb → helpers.rb} +1 -18
- data/lib/vedeu/api/interface.rb +16 -3
- data/lib/vedeu/api/line.rb +29 -4
- data/lib/vedeu/api/log.rb +13 -1
- data/lib/vedeu/api/store.rb +0 -4
- data/lib/vedeu/api/stream.rb +29 -2
- data/lib/vedeu/api/view.rb +4 -2
- data/lib/vedeu/models/attributes/attributes.rb +25 -0
- data/lib/vedeu/models/attributes/colour_translator.rb +0 -10
- data/lib/vedeu/models/colour.rb +23 -3
- data/lib/vedeu/models/composition.rb +32 -2
- data/lib/vedeu/models/geometry.rb +38 -22
- data/lib/vedeu/models/interface.rb +57 -12
- data/lib/vedeu/models/line.rb +28 -4
- data/lib/vedeu/models/stream.rb +36 -6
- data/lib/vedeu/output/buffers.rb +8 -4
- data/lib/vedeu/output/clear.rb +1 -3
- data/lib/vedeu/output/render.rb +12 -4
- data/lib/vedeu/support/esc.rb +12 -2
- data/lib/vedeu/support/menu.rb +10 -10
- data/test/lib/vedeu/api/events_test.rb +4 -4
- data/test/lib/vedeu/api/interface_test.rb +9 -9
- data/test/lib/vedeu/api/view_test.rb +1 -1
- data/test/lib/vedeu/models/attributes/{collection_test.rb → attributes_test.rb} +7 -7
- data/test/lib/vedeu/models/geometry_test.rb +0 -65
- data/test/lib/vedeu/models/line_test.rb +29 -4
- data/test/lib/vedeu/models/stream_test.rb +56 -11
- data/test/lib/vedeu/output/render_test.rb +1 -0
- data/vedeu.gemspec +1 -3
- metadata +6 -38
- data/lib/vedeu/models/attributes/background.rb +0 -7
- data/lib/vedeu/models/attributes/collection.rb +0 -11
- data/lib/vedeu/models/attributes/foreground.rb +0 -7
- data/lib/vedeu/models/attributes/interface_collection.rb +0 -13
- data/lib/vedeu/models/attributes/line_collection.rb +0 -9
- data/lib/vedeu/models/attributes/stream_collection.rb +0 -9
- data/lib/vedeu/models/style.rb +0 -15
- data/test/lib/vedeu/models/attributes/interface_collection_test.rb +0 -40
- data/test/lib/vedeu/models/attributes/line_collection_test.rb +0 -25
- data/test/lib/vedeu/models/attributes/stream_collection_test.rb +0 -23
- data/test/lib/vedeu/models/style_test.rb +0 -48
- data/test/support/bench.rb +0 -34
- data/test/support/colours.rb +0 -39
@@ -1,15 +1,35 @@
|
|
1
1
|
module Vedeu
|
2
2
|
class Geometry
|
3
|
-
|
3
|
+
def initialize(attributes = {})
|
4
|
+
@attributes = attributes
|
5
|
+
end
|
6
|
+
|
7
|
+
def attributes
|
8
|
+
defaults.merge!(@attributes)
|
9
|
+
end
|
10
|
+
|
11
|
+
def y
|
12
|
+
@y ||= attributes[:y]
|
13
|
+
end
|
14
|
+
|
15
|
+
def x
|
16
|
+
@x ||= attributes[:x]
|
17
|
+
end
|
18
|
+
|
19
|
+
def width
|
20
|
+
@width ||= attributes[:width]
|
21
|
+
end
|
22
|
+
|
23
|
+
def height
|
24
|
+
@height ||= attributes[:height]
|
25
|
+
end
|
4
26
|
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
attribute :height, Integer, default: Terminal.height
|
9
|
-
attribute :centred, Boolean, default: false
|
27
|
+
def centred
|
28
|
+
@centred ||= attributes[:centred]
|
29
|
+
end
|
10
30
|
|
11
|
-
def origin(index = 0)
|
12
|
-
Esc.set_position(virtual_y[index], left)
|
31
|
+
def origin(index = 0, &block)
|
32
|
+
Esc.set_position(virtual_y[index], left, &block)
|
13
33
|
end
|
14
34
|
|
15
35
|
def top
|
@@ -52,20 +72,6 @@ module Vedeu
|
|
52
72
|
right + value
|
53
73
|
end
|
54
74
|
|
55
|
-
def position
|
56
|
-
{
|
57
|
-
y: top,
|
58
|
-
x: left,
|
59
|
-
height: height,
|
60
|
-
width: width,
|
61
|
-
centred: centred,
|
62
|
-
top: top,
|
63
|
-
bottom: bottom,
|
64
|
-
left: left,
|
65
|
-
right: right,
|
66
|
-
}
|
67
|
-
end
|
68
|
-
|
69
75
|
private
|
70
76
|
|
71
77
|
def centre
|
@@ -83,5 +89,15 @@ module Vedeu
|
|
83
89
|
def virtual_y
|
84
90
|
@_virtual_y ||= (top..bottom).to_a
|
85
91
|
end
|
92
|
+
|
93
|
+
def defaults
|
94
|
+
{
|
95
|
+
y: 1,
|
96
|
+
x: 1,
|
97
|
+
width: Terminal.width,
|
98
|
+
height: Terminal.height,
|
99
|
+
centred: false,
|
100
|
+
}
|
101
|
+
end
|
86
102
|
end
|
87
103
|
end
|
@@ -1,23 +1,68 @@
|
|
1
1
|
module Vedeu
|
2
2
|
class Interface
|
3
3
|
extend Forwardable
|
4
|
-
include Virtus.model
|
5
4
|
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
attribute :colour, Colour, default: Colour.new
|
10
|
-
attribute :style, Style, default: ''
|
11
|
-
attribute :geometry, Geometry, default: Geometry.new
|
12
|
-
attribute :cursor, Boolean, default: true
|
13
|
-
attribute :delay, Float, default: 0
|
5
|
+
def_delegators :geometry, :north, :east, :south, :west,
|
6
|
+
:top, :right, :bottom, :left,
|
7
|
+
:width, :height, :origin
|
14
8
|
|
15
|
-
|
16
|
-
|
17
|
-
|
9
|
+
def initialize(attributes = {})
|
10
|
+
@attributes = attributes
|
11
|
+
end
|
12
|
+
|
13
|
+
def attributes
|
14
|
+
defaults.merge!(@attributes)
|
15
|
+
end
|
16
|
+
|
17
|
+
def name
|
18
|
+
@name ||= attributes[:name]
|
19
|
+
end
|
20
|
+
|
21
|
+
def group
|
22
|
+
@group ||= attributes[:group]
|
23
|
+
end
|
24
|
+
|
25
|
+
def lines
|
26
|
+
@lines ||= Attributes.coercer(attributes[:lines], Line, :streams)
|
27
|
+
end
|
28
|
+
|
29
|
+
def colour
|
30
|
+
@colour ||= Colour.new(attributes[:colour])
|
31
|
+
end
|
32
|
+
|
33
|
+
def style
|
34
|
+
@style ||= Attributes.coerce_styles(attributes[:style])
|
35
|
+
end
|
36
|
+
|
37
|
+
def geometry
|
38
|
+
@geometry ||= Geometry.new(attributes[:geometry])
|
39
|
+
end
|
40
|
+
|
41
|
+
def cursor
|
42
|
+
@cursor ||= attributes[:cursor]
|
43
|
+
end
|
44
|
+
|
45
|
+
def delay
|
46
|
+
@delay || attributes[:delay]
|
47
|
+
end
|
18
48
|
|
19
49
|
def to_s
|
20
50
|
Render.call(self)
|
21
51
|
end
|
52
|
+
|
53
|
+
private
|
54
|
+
|
55
|
+
def defaults
|
56
|
+
{
|
57
|
+
name: '',
|
58
|
+
group: '',
|
59
|
+
lines: [],
|
60
|
+
colour: {},
|
61
|
+
style: '',
|
62
|
+
geometry: {},
|
63
|
+
cursor: true,
|
64
|
+
delay: 0.0
|
65
|
+
}
|
66
|
+
end
|
22
67
|
end
|
23
68
|
end
|
data/lib/vedeu/models/line.rb
CHANGED
@@ -1,13 +1,37 @@
|
|
1
1
|
module Vedeu
|
2
2
|
class Line
|
3
|
-
|
3
|
+
def initialize(attributes = {})
|
4
|
+
@attributes = attributes
|
5
|
+
end
|
6
|
+
|
7
|
+
def attributes
|
8
|
+
defaults.merge!(@attributes)
|
9
|
+
end
|
4
10
|
|
5
|
-
|
6
|
-
|
7
|
-
|
11
|
+
def colour
|
12
|
+
@colour ||= Colour.new(attributes[:colour])
|
13
|
+
end
|
14
|
+
|
15
|
+
def streams
|
16
|
+
@streams ||= Attributes.coercer(attributes[:streams], Stream, :text)
|
17
|
+
end
|
18
|
+
|
19
|
+
def style
|
20
|
+
@style ||= Attributes.coerce_styles(attributes[:style])
|
21
|
+
end
|
8
22
|
|
9
23
|
def to_s
|
10
24
|
[ colour, style, streams ].join
|
11
25
|
end
|
26
|
+
|
27
|
+
private
|
28
|
+
|
29
|
+
def defaults
|
30
|
+
{
|
31
|
+
colour: {},
|
32
|
+
streams: [],
|
33
|
+
style: ''
|
34
|
+
}
|
35
|
+
end
|
12
36
|
end
|
13
37
|
end
|
data/lib/vedeu/models/stream.rb
CHANGED
@@ -1,12 +1,32 @@
|
|
1
1
|
module Vedeu
|
2
2
|
class Stream
|
3
|
-
|
3
|
+
def initialize(attributes = {})
|
4
|
+
@attributes = attributes
|
5
|
+
end
|
6
|
+
|
7
|
+
def attributes
|
8
|
+
defaults.merge!(@attributes)
|
9
|
+
end
|
10
|
+
|
11
|
+
def colour
|
12
|
+
@colour ||= Colour.new(attributes[:colour])
|
13
|
+
end
|
14
|
+
|
15
|
+
def style
|
16
|
+
@style ||= Attributes.coerce_styles(attributes[:style])
|
17
|
+
end
|
4
18
|
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
19
|
+
def text
|
20
|
+
@text ||= attributes[:text]
|
21
|
+
end
|
22
|
+
|
23
|
+
def width
|
24
|
+
@width ||= attributes[:width]
|
25
|
+
end
|
26
|
+
|
27
|
+
def align
|
28
|
+
@align ||= attributes[:align]
|
29
|
+
end
|
10
30
|
|
11
31
|
def to_s
|
12
32
|
[ colour, style, data ].join
|
@@ -29,5 +49,15 @@ module Vedeu
|
|
29
49
|
def width?
|
30
50
|
!!width
|
31
51
|
end
|
52
|
+
|
53
|
+
def defaults
|
54
|
+
{
|
55
|
+
colour: {},
|
56
|
+
style: '',
|
57
|
+
text: '',
|
58
|
+
width: nil,
|
59
|
+
align: :left
|
60
|
+
}
|
61
|
+
end
|
32
62
|
end
|
33
63
|
end
|
data/lib/vedeu/output/buffers.rb
CHANGED
@@ -7,13 +7,13 @@ module Vedeu
|
|
7
7
|
def create(interface)
|
8
8
|
buffers[interface.name][:clear] = Clear.call(interface)
|
9
9
|
|
10
|
-
Vedeu.events.
|
10
|
+
Vedeu.events.event("_refresh_#{interface.name}_".to_sym, interface.delay) do
|
11
11
|
refresh(interface.name)
|
12
12
|
end
|
13
13
|
|
14
14
|
# TODO: cannot refresh group since no logic to fetch group from buffer
|
15
15
|
# unless interface.group.nil? || interface.group.empty?
|
16
|
-
# Vedeu.events.
|
16
|
+
# Vedeu.events.event("_refresh_#{interface.group}_".to_sym, interface.delay) do
|
17
17
|
# refresh_group(interface.group)
|
18
18
|
# end
|
19
19
|
# end
|
@@ -23,10 +23,14 @@ module Vedeu
|
|
23
23
|
buffers[name][:next].unshift(sequence)
|
24
24
|
end
|
25
25
|
|
26
|
-
def
|
27
|
-
|
26
|
+
def query(name)
|
27
|
+
buffers.fetch(name) do
|
28
28
|
fail RefreshFailed, 'Cannot refresh non-existent interface.'
|
29
29
|
end
|
30
|
+
end
|
31
|
+
|
32
|
+
def refresh(name)
|
33
|
+
data = query(name)
|
30
34
|
|
31
35
|
sequence = if data[:next].any?
|
32
36
|
data[:current] = data[:next].pop
|
data/lib/vedeu/output/clear.rb
CHANGED
@@ -10,9 +10,7 @@ module Vedeu
|
|
10
10
|
|
11
11
|
def clear
|
12
12
|
interface_lines.inject([colours]) do |line, index|
|
13
|
-
line << interface.origin(index)
|
14
|
-
line << ' ' * interface.width
|
15
|
-
line << interface.origin(index)
|
13
|
+
line << interface.origin(index) { ' ' * interface.width }
|
16
14
|
end.join
|
17
15
|
end
|
18
16
|
|
data/lib/vedeu/output/render.rb
CHANGED
@@ -39,9 +39,11 @@ module Vedeu
|
|
39
39
|
if (line_length += stream.text.size) >= width
|
40
40
|
remainder = width - line_length
|
41
41
|
|
42
|
-
processed << Stream.new(
|
43
|
-
|
44
|
-
|
42
|
+
processed << Stream.new({
|
43
|
+
colour: stream.colour.attributes,
|
44
|
+
style: stream.style,
|
45
|
+
text: truncate(stream.text, remainder),
|
46
|
+
})
|
45
47
|
|
46
48
|
else
|
47
49
|
processed << stream
|
@@ -49,9 +51,15 @@ module Vedeu
|
|
49
51
|
end
|
50
52
|
end
|
51
53
|
|
52
|
-
Line.new(
|
54
|
+
Line.new({
|
55
|
+
colour: line.colour.attributes,
|
56
|
+
streams: processed,
|
57
|
+
style: line.style,
|
58
|
+
})
|
59
|
+
|
53
60
|
else
|
54
61
|
line
|
62
|
+
|
55
63
|
end
|
56
64
|
end
|
57
65
|
end
|
data/lib/vedeu/support/esc.rb
CHANGED
@@ -2,11 +2,21 @@ module Vedeu
|
|
2
2
|
module Esc
|
3
3
|
extend self
|
4
4
|
|
5
|
-
def set_position(y = 1, x = 1)
|
5
|
+
def set_position(y = 1, x = 1, &block)
|
6
6
|
row = (y == 0 || y == nil) ? 1 : y
|
7
7
|
column = (x == 0 || x == nil) ? 1 : x
|
8
8
|
|
9
|
-
|
9
|
+
if block_given?
|
10
|
+
out = []
|
11
|
+
out << ["\e[", row, ';', column, 'H'].join
|
12
|
+
out << yield
|
13
|
+
out << ["\e[", row, ';', column, 'H'].join
|
14
|
+
out
|
15
|
+
|
16
|
+
else
|
17
|
+
["\e[", row, ';', column, 'H'].join
|
18
|
+
|
19
|
+
end
|
10
20
|
end
|
11
21
|
|
12
22
|
def string(value = '')
|
data/lib/vedeu/support/menu.rb
CHANGED
@@ -9,16 +9,16 @@ module Vedeu
|
|
9
9
|
|
10
10
|
def events
|
11
11
|
@_events ||= Vedeu.events.add(self) do
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
12
|
+
event(:menu_next) { next_item }
|
13
|
+
event(:menu_prev) { prev_item }
|
14
|
+
event(:menu_top) { top_item }
|
15
|
+
event(:menu_bottom) { bottom_item }
|
16
|
+
event(:menu_select) { select_item }
|
17
|
+
event(:menu_deselect) { deselect_item }
|
18
|
+
|
19
|
+
event(:menu_selected) { selected_item }
|
20
|
+
event(:menu_current) { current_item }
|
21
|
+
event(:menu_items) { items }
|
22
22
|
end
|
23
23
|
end
|
24
24
|
|
@@ -3,17 +3,17 @@ require 'test_helper'
|
|
3
3
|
module Vedeu
|
4
4
|
module API
|
5
5
|
describe Events do
|
6
|
-
describe '#
|
6
|
+
describe '#event' do
|
7
7
|
it 'adds the event block to the handlers' do
|
8
8
|
skip
|
9
9
|
events = Events.new
|
10
|
-
events.
|
10
|
+
events.event(:some_event) { proc { |x| x } }
|
11
11
|
end
|
12
12
|
|
13
13
|
it 'adds the specified throttle to the throttles' do
|
14
14
|
skip
|
15
15
|
events = Events.new
|
16
|
-
events.
|
16
|
+
events.event(:some_event, 250) { proc { |x| x } }
|
17
17
|
end
|
18
18
|
end
|
19
19
|
|
@@ -21,7 +21,7 @@ module Vedeu
|
|
21
21
|
it 'returns a collection containing the event when the event is ' \
|
22
22
|
'pre-registered' do
|
23
23
|
events = Events.new do
|
24
|
-
|
24
|
+
event(:_exit_) { fail StopIteration }
|
25
25
|
end
|
26
26
|
proc { events.trigger(:_exit_) }.must_raise(StopIteration)
|
27
27
|
end
|
@@ -8,7 +8,7 @@ module Vedeu
|
|
8
8
|
interface = Interface.new('widget')
|
9
9
|
|
10
10
|
it 'creates and stores a new interface' do
|
11
|
-
interface.
|
11
|
+
interface.create.must_be_instance_of(Vedeu::Interface)
|
12
12
|
end
|
13
13
|
|
14
14
|
it 'allows interfaces to share behaviour' do
|
@@ -38,35 +38,35 @@ module Vedeu
|
|
38
38
|
end
|
39
39
|
|
40
40
|
it 'raises an exception when the value is out of bounds' do
|
41
|
-
proc { interface.
|
41
|
+
proc { interface.create { x 0 } }.must_raise(XOutOfBounds)
|
42
42
|
end
|
43
43
|
|
44
44
|
it 'raises an exception when the value is out of bounds' do
|
45
|
-
proc { interface.
|
45
|
+
proc { interface.create { x 999 } }.must_raise(XOutOfBounds)
|
46
46
|
end
|
47
47
|
|
48
48
|
it 'raises an exception when the value is out of bounds' do
|
49
|
-
proc { interface.
|
49
|
+
proc { interface.create { y 0 } }.must_raise(YOutOfBounds)
|
50
50
|
end
|
51
51
|
|
52
52
|
it 'raises an exception when the value is out of bounds' do
|
53
|
-
proc { interface.
|
53
|
+
proc { interface.create { y 999 } }.must_raise(YOutOfBounds)
|
54
54
|
end
|
55
55
|
|
56
56
|
it 'raises an exception when the value is out of bounds' do
|
57
|
-
proc { interface.
|
57
|
+
proc { interface.create { width 0 } }.must_raise(InvalidWidth)
|
58
58
|
end
|
59
59
|
|
60
60
|
it 'raises an exception when the value is out of bounds' do
|
61
|
-
proc { interface.
|
61
|
+
proc { interface.create { width 999 } }.must_raise(InvalidWidth)
|
62
62
|
end
|
63
63
|
|
64
64
|
it 'raises an exception when the value is out of bounds' do
|
65
|
-
proc { interface.
|
65
|
+
proc { interface.create { height 0 } }.must_raise(InvalidHeight)
|
66
66
|
end
|
67
67
|
|
68
68
|
it 'raises an exception when the value is out of bounds' do
|
69
|
-
proc { interface.
|
69
|
+
proc { interface.create { height 999 } }.must_raise(InvalidHeight)
|
70
70
|
end
|
71
71
|
end
|
72
72
|
end
|