vedeu 0.1.17 → 0.1.18
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/.yardopts +1 -0
- data/README.md +17 -3
- data/lib/vedeu.rb +12 -7
- data/lib/vedeu/api/api.rb +37 -13
- data/lib/vedeu/api/composition.rb +1 -6
- data/lib/vedeu/api/helpers.rb +2 -0
- data/lib/vedeu/api/interface.rb +47 -55
- data/lib/vedeu/api/line.rb +6 -0
- data/lib/vedeu/api/stream.rb +9 -1
- data/lib/vedeu/application.rb +38 -50
- data/lib/vedeu/configuration.rb +163 -44
- data/lib/vedeu/launcher.rb +3 -6
- data/lib/vedeu/models/attributes/background.rb +9 -1
- data/lib/vedeu/models/attributes/colour_translator.rb +40 -2
- data/lib/vedeu/models/attributes/foreground.rb +9 -1
- data/lib/vedeu/models/colour.rb +6 -0
- data/lib/vedeu/models/composition.rb +8 -1
- data/lib/vedeu/models/geometry.rb +27 -14
- data/lib/vedeu/models/interface.rb +59 -0
- data/lib/vedeu/models/line.rb +4 -0
- data/lib/vedeu/models/stream.rb +10 -0
- data/lib/vedeu/models/style.rb +2 -0
- data/lib/vedeu/support/buffer.rb +12 -1
- data/lib/vedeu/support/buffers.rb +10 -0
- data/lib/vedeu/support/clear.rb +4 -0
- data/lib/vedeu/support/esc.rb +26 -8
- data/lib/vedeu/support/event.rb +28 -0
- data/lib/vedeu/support/events.rb +2 -0
- data/lib/vedeu/support/focus.rb +14 -6
- data/lib/vedeu/support/grid.rb +6 -0
- data/lib/vedeu/support/groups.rb +13 -3
- data/lib/vedeu/support/input.rb +7 -2
- data/lib/vedeu/support/log.rb +7 -1
- data/lib/vedeu/support/position.rb +6 -0
- data/lib/vedeu/support/render.rb +38 -0
- data/lib/vedeu/support/terminal.rb +69 -15
- data/lib/vedeu/support/trace.rb +8 -0
- data/lib/vedeu/support/view.rb +6 -0
- data/test/integration/run_once_test.rb +26 -0
- data/test/lib/vedeu/api/api_test.rb +19 -6
- data/test/lib/vedeu/api/interface_test.rb +67 -1
- data/test/lib/vedeu/api/line_test.rb +10 -0
- data/test/lib/vedeu/api/stream_test.rb +8 -0
- data/test/lib/vedeu/configuration_test.rb +119 -12
- data/test/lib/vedeu/models/attributes/background_test.rb +1 -1
- data/test/lib/vedeu/models/attributes/foreground_test.rb +1 -1
- data/test/lib/vedeu/models/interface_test.rb +22 -0
- data/test/lib/vedeu/support/buffer_test.rb +44 -0
- data/test/lib/vedeu/support/events_test.rb +3 -9
- data/test/lib/vedeu/support/input_test.rb +1 -0
- data/test/lib/vedeu/support/terminal_test.rb +128 -5
- data/test/test_helper.rb +2 -2
- data/vedeu.gemspec +1 -1
- metadata +5 -2
data/lib/vedeu/models/stream.rb
CHANGED
@@ -35,10 +35,14 @@ module Vedeu
|
|
35
35
|
|
36
36
|
private
|
37
37
|
|
38
|
+
# @api private
|
39
|
+
# @return [String]
|
38
40
|
def data
|
39
41
|
width? ? aligned : text
|
40
42
|
end
|
41
43
|
|
44
|
+
# @api private
|
45
|
+
# @return [String]
|
42
46
|
def aligned
|
43
47
|
case align
|
44
48
|
when :right then text.rjust(width, ' ')
|
@@ -47,10 +51,14 @@ module Vedeu
|
|
47
51
|
end
|
48
52
|
end
|
49
53
|
|
54
|
+
# @api private
|
55
|
+
# @return [TrueClass|FalseClass]
|
50
56
|
def width?
|
51
57
|
!!width
|
52
58
|
end
|
53
59
|
|
60
|
+
# @api private
|
61
|
+
# @return [Hash]
|
54
62
|
def defaults
|
55
63
|
{
|
56
64
|
colour: {},
|
@@ -61,6 +69,8 @@ module Vedeu
|
|
61
69
|
}
|
62
70
|
end
|
63
71
|
|
72
|
+
# @api private
|
73
|
+
# @return []
|
64
74
|
def method_missing(method, *args, &block)
|
65
75
|
@self_before_instance_eval.send(method, *args, &block)
|
66
76
|
end
|
data/lib/vedeu/models/style.rb
CHANGED
data/lib/vedeu/support/buffer.rb
CHANGED
@@ -3,7 +3,11 @@ module Vedeu
|
|
3
3
|
|
4
4
|
attr_reader :back, :front, :interface
|
5
5
|
|
6
|
-
# @param
|
6
|
+
# @param [Hash] attributes The buffer attributes.
|
7
|
+
# @option attributes :back [Hash] The next view to be rendered.
|
8
|
+
# @option attributes :front [Hash] The view which is currently on screen.
|
9
|
+
# @option attributes :interface [Hash] An attribute form of the interface from
|
10
|
+
# which we can create a new front or back.
|
7
11
|
# @return [Buffer]
|
8
12
|
def initialize(attributes = {})
|
9
13
|
@attributes = attributes
|
@@ -42,14 +46,21 @@ module Vedeu
|
|
42
46
|
|
43
47
|
private
|
44
48
|
|
49
|
+
# @api private
|
50
|
+
# @param new_attributes [Hash]
|
51
|
+
# @return [Buffer]
|
45
52
|
def merge(new_attributes)
|
46
53
|
Buffer.new(@attributes.merge(new_attributes))
|
47
54
|
end
|
48
55
|
|
56
|
+
# @api private
|
57
|
+
# @return [TrueClass|FalseClass]
|
49
58
|
def content_available?
|
50
59
|
!!(back)
|
51
60
|
end
|
52
61
|
|
62
|
+
# @api private
|
63
|
+
# @return [TrueClass|FalseClass]
|
53
64
|
def no_content_available?
|
54
65
|
front.nil?
|
55
66
|
end
|
@@ -72,22 +72,32 @@ module Vedeu
|
|
72
72
|
|
73
73
|
private
|
74
74
|
|
75
|
+
# @api private
|
76
|
+
# @return []
|
75
77
|
def update(name, buffer)
|
76
78
|
buffers.store(name, buffer)
|
77
79
|
end
|
78
80
|
|
81
|
+
# @api private
|
82
|
+
# @return [Focus]
|
79
83
|
def focus
|
80
84
|
@_focus ||= Focus.new
|
81
85
|
end
|
82
86
|
|
87
|
+
# @api private
|
88
|
+
# @return [Groups]
|
83
89
|
def groups
|
84
90
|
@_groups ||= Groups.new
|
85
91
|
end
|
86
92
|
|
93
|
+
# @api private
|
94
|
+
# @return [Hash]
|
87
95
|
def buffers
|
88
96
|
@_buffers ||= {}
|
89
97
|
end
|
90
98
|
|
99
|
+
# @api private
|
100
|
+
# @return [Hash]
|
91
101
|
def storage
|
92
102
|
@_storage ||= {}
|
93
103
|
end
|
data/lib/vedeu/support/clear.rb
CHANGED
data/lib/vedeu/support/esc.rb
CHANGED
@@ -3,10 +3,14 @@ module Vedeu
|
|
3
3
|
|
4
4
|
extend self
|
5
5
|
|
6
|
-
#
|
7
|
-
#
|
6
|
+
# Return the escape sequence required to position the cursor at a particular
|
7
|
+
# point on the screen. When passed a block, will do the aforementioned,
|
8
|
+
# call the block and then reposition to this location.
|
9
|
+
#
|
10
|
+
# @param y [Fixnum] The row/line position.
|
11
|
+
# @param x [Fixnum] The column/character position.
|
8
12
|
# @param block [Proc]
|
9
|
-
# @return
|
13
|
+
# @return [String]
|
10
14
|
def set_position(y = 1, x = 1, &block)
|
11
15
|
Position.new(y, x).to_s(&block)
|
12
16
|
end
|
@@ -22,16 +26,30 @@ module Vedeu
|
|
22
26
|
when 'bold_off' then "\e[22m"
|
23
27
|
when 'clear' then "\e[38;2;39m\e[48;2;49m\e[2J"
|
24
28
|
when 'clear_line' then "\e[38;2;39m\e[48;2;49m\e[2K"
|
25
|
-
when 'colour_reset' then
|
29
|
+
when 'colour_reset' then
|
30
|
+
[ string('fg_reset'),
|
31
|
+
string('bg_reset') ].join
|
32
|
+
|
33
|
+
when 'dim' then "\e[2m"
|
26
34
|
when 'fg_reset' then "\e[38;2;39m"
|
27
35
|
when 'hide_cursor' then "\e[?25l"
|
28
|
-
when 'screen_init' then "\e[0m\e[38;2;39m\e[48;2;49m\e[2J\e[?25l"
|
29
|
-
when 'screen_exit' then "\e[?25h\e[38;2;39m\e[48;2;49m\e[0m"
|
30
36
|
when 'negative' then "\e[7m"
|
37
|
+
when 'normal' then
|
38
|
+
[ string('underline_off'),
|
39
|
+
string('bold_off'),
|
40
|
+
string('positive') ].join
|
41
|
+
|
31
42
|
when 'positive' then "\e[27m"
|
32
43
|
when 'reset' then "\e[0m"
|
33
|
-
when '
|
34
|
-
|
44
|
+
when 'screen_init' then
|
45
|
+
[ string('reset'),
|
46
|
+
string('clear'),
|
47
|
+
string('hide_cursor') ].join
|
48
|
+
|
49
|
+
when 'screen_exit' then
|
50
|
+
[ string('show_cursor'),
|
51
|
+
string('colour_reset'),
|
52
|
+
string('reset') ].join
|
35
53
|
when 'show_cursor' then "\e[?25h"
|
36
54
|
when 'underline' then "\e[4m"
|
37
55
|
when 'underline_off' then "\e[24m"
|
data/lib/vedeu/support/event.rb
CHANGED
@@ -27,6 +27,8 @@ module Vedeu
|
|
27
27
|
attr_reader :closure
|
28
28
|
attr_accessor :deadline, :executed_at, :now
|
29
29
|
|
30
|
+
# @api private
|
31
|
+
# @return []
|
30
32
|
def execute(*args)
|
31
33
|
reset_deadline
|
32
34
|
|
@@ -37,12 +39,16 @@ module Vedeu
|
|
37
39
|
closure.call(*args)
|
38
40
|
end
|
39
41
|
|
42
|
+
# @api private
|
43
|
+
# @return [TrueClass|FalseClass]
|
40
44
|
def throttling?
|
41
45
|
set_time
|
42
46
|
|
43
47
|
options[:delay] > 0
|
44
48
|
end
|
45
49
|
|
50
|
+
# @api private
|
51
|
+
# @return [TrueClass|FalseClass]
|
46
52
|
def debouncing?
|
47
53
|
set_time
|
48
54
|
|
@@ -51,48 +57,70 @@ module Vedeu
|
|
51
57
|
options[:debounce] > 0
|
52
58
|
end
|
53
59
|
|
60
|
+
# @api private
|
61
|
+
# @return [Float]
|
54
62
|
def elapsed_time
|
55
63
|
now - @executed_at
|
56
64
|
end
|
57
65
|
|
66
|
+
# @api private
|
67
|
+
# @return [Float]
|
58
68
|
def set_executed
|
59
69
|
@executed_at = now
|
60
70
|
end
|
61
71
|
|
72
|
+
# @api private
|
73
|
+
# @return [Float]
|
62
74
|
def set_time
|
63
75
|
@now = Time.now.to_f
|
64
76
|
end
|
65
77
|
|
78
|
+
# @api private
|
79
|
+
# @return [Fixnum]
|
66
80
|
def reset_time
|
67
81
|
@now = 0
|
68
82
|
end
|
69
83
|
|
84
|
+
# @api private
|
85
|
+
# @return [TrueClass|FalseClass]
|
70
86
|
def has_deadline?
|
71
87
|
@deadline > 0
|
72
88
|
end
|
73
89
|
|
90
|
+
# @api private
|
91
|
+
# @return [Fixnum]
|
74
92
|
def reset_deadline
|
75
93
|
@deadline = 0
|
76
94
|
end
|
77
95
|
|
96
|
+
# @api private
|
97
|
+
# @return [NilClass]
|
78
98
|
def set_deadline
|
79
99
|
@deadline = now + debounce
|
80
100
|
|
81
101
|
nil
|
82
102
|
end
|
83
103
|
|
104
|
+
# @api private
|
105
|
+
# @return [Fixnum|Float]
|
84
106
|
def debounce
|
85
107
|
options[:debounce]
|
86
108
|
end
|
87
109
|
|
110
|
+
# @api private
|
111
|
+
# @return [Fixnum|Float]
|
88
112
|
def delay
|
89
113
|
options[:delay]
|
90
114
|
end
|
91
115
|
|
116
|
+
# @api private
|
117
|
+
# @return [Hash]
|
92
118
|
def options
|
93
119
|
defaults.merge!(@options)
|
94
120
|
end
|
95
121
|
|
122
|
+
# @api private
|
123
|
+
# @return [Hash]
|
96
124
|
def defaults
|
97
125
|
{
|
98
126
|
delay: 0,
|
data/lib/vedeu/support/events.rb
CHANGED
data/lib/vedeu/support/focus.rb
CHANGED
@@ -3,6 +3,7 @@ module Vedeu
|
|
3
3
|
# Maintains which interface is current in focus.
|
4
4
|
class Focus
|
5
5
|
|
6
|
+
# @return [Focus]
|
6
7
|
def initialize
|
7
8
|
register_events
|
8
9
|
|
@@ -10,7 +11,7 @@ module Vedeu
|
|
10
11
|
end
|
11
12
|
|
12
13
|
# @param name [String]
|
13
|
-
# @return []
|
14
|
+
# @return [Array]
|
14
15
|
def add(name)
|
15
16
|
if registered?(name)
|
16
17
|
storage
|
@@ -22,7 +23,7 @@ module Vedeu
|
|
22
23
|
end
|
23
24
|
|
24
25
|
# @param name [String]
|
25
|
-
# @return []
|
26
|
+
# @return [String]
|
26
27
|
def by_name(name)
|
27
28
|
fail InterfaceNotFound unless storage.include?(name)
|
28
29
|
|
@@ -31,42 +32,49 @@ module Vedeu
|
|
31
32
|
current
|
32
33
|
end
|
33
34
|
|
34
|
-
# @return []
|
35
|
+
# @return [String]
|
35
36
|
def current
|
36
37
|
fail NoInterfacesDefined if storage.empty?
|
37
38
|
|
38
39
|
storage.first
|
39
40
|
end
|
40
41
|
|
41
|
-
# @return []
|
42
|
+
# @return [String]
|
42
43
|
def next_item
|
43
44
|
storage.rotate!
|
44
45
|
|
45
46
|
current
|
46
47
|
end
|
47
48
|
|
48
|
-
# @return []
|
49
|
+
# @return [String]
|
49
50
|
def prev_item
|
50
51
|
storage.rotate!(-1)
|
51
52
|
|
52
53
|
current
|
53
54
|
end
|
54
55
|
|
55
|
-
# @return []
|
56
|
+
# @return [TrueClass]
|
56
57
|
def register_events
|
57
58
|
Vedeu.event(:_focus_next_) { next_item }
|
58
59
|
Vedeu.event(:_focus_prev_) { prev_item }
|
59
60
|
Vedeu.event(:_focus_by_name_) { |name| by_name(name) }
|
61
|
+
Vedeu.event(:_focussed_) { current }
|
62
|
+
|
63
|
+
true
|
60
64
|
end
|
61
65
|
|
62
66
|
private
|
63
67
|
|
68
|
+
# @api private
|
69
|
+
# @return [TrueClass|FalseClass]
|
64
70
|
def registered?(name)
|
65
71
|
return false if storage.empty?
|
66
72
|
|
67
73
|
storage.include?(name)
|
68
74
|
end
|
69
75
|
|
76
|
+
# @api private
|
77
|
+
# @return [Array]
|
70
78
|
def storage
|
71
79
|
@storage ||= []
|
72
80
|
end
|
data/lib/vedeu/support/grid.rb
CHANGED
@@ -42,14 +42,20 @@ module Vedeu
|
|
42
42
|
|
43
43
|
attr_reader :value
|
44
44
|
|
45
|
+
# @api private
|
46
|
+
# @return [Fixnum]
|
45
47
|
def column
|
46
48
|
actual / 12
|
47
49
|
end
|
48
50
|
|
51
|
+
# @api private
|
52
|
+
# @return [Fixnum]
|
49
53
|
def actual
|
50
54
|
Terminal.width
|
51
55
|
end
|
52
56
|
|
57
|
+
# @api private
|
58
|
+
# @return [TrueClass|FalseClass]
|
53
59
|
def out_of_range?
|
54
60
|
value < 1 || value > 12
|
55
61
|
end
|
data/lib/vedeu/support/groups.rb
CHANGED
@@ -26,9 +26,7 @@ module Vedeu
|
|
26
26
|
|
27
27
|
storage[group] << name
|
28
28
|
|
29
|
-
|
30
|
-
Buffers.refresh_group(group)
|
31
|
-
end
|
29
|
+
register_group_refresh_event(group, delay)
|
32
30
|
|
33
31
|
self
|
34
32
|
end
|
@@ -40,10 +38,22 @@ module Vedeu
|
|
40
38
|
|
41
39
|
private
|
42
40
|
|
41
|
+
# @api private
|
42
|
+
# @return []
|
43
|
+
def register_group_refresh_event(group, delay = 0.0)
|
44
|
+
Vedeu.event("_refresh_group_#{group}_".to_sym, { delay: delay }) do
|
45
|
+
Buffers.refresh_group(group)
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
# @api private
|
50
|
+
# @return [Hash]
|
43
51
|
def storage
|
44
52
|
@_storage ||= in_memory
|
45
53
|
end
|
46
54
|
|
55
|
+
# @api private
|
56
|
+
# @return [Hash]
|
47
57
|
def in_memory
|
48
58
|
Hash.new { |hash, key| hash[key] = Set.new }
|
49
59
|
end
|
data/lib/vedeu/support/input.rb
CHANGED
@@ -1,12 +1,12 @@
|
|
1
1
|
module Vedeu
|
2
2
|
class Input
|
3
3
|
|
4
|
-
# @return []
|
4
|
+
# @return [String|Symbol]
|
5
5
|
def self.capture
|
6
6
|
new.capture
|
7
7
|
end
|
8
8
|
|
9
|
-
# @return []
|
9
|
+
# @return [Input]
|
10
10
|
def initialize; end
|
11
11
|
|
12
12
|
# @return []
|
@@ -16,10 +16,14 @@ module Vedeu
|
|
16
16
|
|
17
17
|
private
|
18
18
|
|
19
|
+
# @api private
|
20
|
+
# @return [String]
|
19
21
|
def input
|
20
22
|
@_input ||= Terminal.input
|
21
23
|
end
|
22
24
|
|
25
|
+
# @api private
|
26
|
+
# @return [String|Symbol]
|
23
27
|
def keypress
|
24
28
|
key = input
|
25
29
|
translated = case key
|
@@ -35,6 +39,7 @@ module Vedeu
|
|
35
39
|
when "\e[H" then :home
|
36
40
|
when "\e[3~" then :delete
|
37
41
|
when "\e[F" then :end
|
42
|
+
when "\e[Z" then :shift_tab
|
38
43
|
when "\eOP" then :f1
|
39
44
|
when "\eOQ" then :f2
|
40
45
|
when "\eOR" then :f3
|