vedeu 0.5.13 → 0.6.0
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/.rubocop.yml +6 -0
- data/bin/vedeu_drb_server +1 -0
- data/config/rubocop_enabled.yml +2 -2
- data/docs/events.md +2 -0
- data/docs/getting_started.md +1 -1
- data/examples/drb_app.rb +1 -0
- data/examples/editor_app.rb +76 -0
- data/lib/vedeu/all.rb +13 -7
- data/lib/vedeu/{bindings.rb → bindings/bindings.rb} +2 -0
- data/lib/vedeu/bindings/focus.rb +66 -0
- data/lib/vedeu/bindings/refresh.rb +77 -0
- data/lib/vedeu/bindings/system.rb +19 -88
- data/lib/vedeu/buffers/buffer.rb +8 -8
- data/lib/vedeu/configuration/api.rb +32 -11
- data/lib/vedeu/configuration/cli.rb +8 -0
- data/lib/vedeu/cursor/move.rb +1 -0
- data/lib/vedeu/distributed/templates/default_configuration.vedeu +1 -0
- data/lib/vedeu/{dsl.rb → dsl/dsl.rb} +0 -0
- data/lib/vedeu/exceptions.rb +1 -1
- data/lib/vedeu/geometry/position.rb +28 -0
- data/lib/vedeu/input/capture.rb +76 -0
- data/lib/vedeu/input/editor/all.rb +19 -0
- data/lib/vedeu/input/editor/cropper.rb +74 -0
- data/lib/vedeu/input/editor/document.rb +254 -0
- data/lib/vedeu/input/editor/documents.rb +18 -0
- data/lib/vedeu/input/editor/editor.rb +100 -0
- data/lib/vedeu/input/editor/line.rb +143 -0
- data/lib/vedeu/input/editor/lines.rb +199 -0
- data/lib/vedeu/input/editor/virtual_cursor.rb +167 -0
- data/lib/vedeu/input/input.rb +9 -93
- data/lib/vedeu/input/input_translator.rb +155 -0
- data/lib/vedeu/internal_api.rb +9 -0
- data/lib/vedeu/log/lockless_log_device.rb +1 -1
- data/lib/vedeu/models/escape.rb +7 -8
- data/lib/vedeu/output/direct.rb +59 -0
- data/lib/vedeu/output/renderers/terminal.rb +8 -0
- data/lib/vedeu/output/viewport.rb +2 -3
- data/lib/vedeu/{plugins.rb → plugins/plugins.rb} +0 -0
- data/lib/vedeu/refresh/refresh_cursor.rb +1 -0
- data/lib/vedeu/{repositories.rb → repositories/repositories.rb} +0 -0
- data/lib/vedeu/terminal/content.rb +88 -0
- data/lib/vedeu/terminal/mode.rb +79 -0
- data/lib/vedeu/{terminal.rb → terminal/terminal.rb} +9 -25
- data/lib/vedeu/version.rb +1 -1
- data/test/lib/vedeu/{bindings_test.rb → bindings/bindings_test.rb} +0 -0
- data/test/lib/vedeu/bindings/focus_test.rb +19 -0
- data/test/lib/vedeu/bindings/refresh_test.rb +19 -0
- data/test/lib/vedeu/bindings/system_test.rb +1 -6
- data/test/lib/vedeu/borders/render_border_test.rb +43 -10
- data/test/lib/vedeu/buffers/buffer_test.rb +18 -0
- data/test/lib/vedeu/buffers/virtual_buffer_test.rb +15 -0
- data/test/lib/vedeu/configuration/api_test.rb +18 -2
- data/test/lib/vedeu/configuration/cli_test.rb +5 -0
- data/test/lib/vedeu/cursor/move_test.rb +1 -1
- data/test/lib/vedeu/dsl/dsl_test.rb +8 -0
- data/test/lib/vedeu/dsl/shared_test.rb +12 -0
- data/test/lib/vedeu/{output → esc}/esc_test.rb +0 -0
- data/test/lib/vedeu/geometry/position_test.rb +56 -0
- data/test/lib/vedeu/input/capture_test.rb +63 -0
- data/test/lib/vedeu/input/editor/cropper_test.rb +82 -0
- data/test/lib/vedeu/input/editor/document_test.rb +190 -0
- data/test/lib/vedeu/input/editor/documents_test.rb +17 -0
- data/test/lib/vedeu/input/editor/editor_test.rb +170 -0
- data/test/lib/vedeu/input/editor/line_test.rb +333 -0
- data/test/lib/vedeu/input/editor/lines_test.rb +561 -0
- data/test/lib/vedeu/input/editor/virtual_cursor_test.rb +184 -0
- data/test/lib/vedeu/input/input_test.rb +20 -4
- data/test/lib/vedeu/input/input_translator_test.rb +32 -0
- data/test/lib/vedeu/internal_api_test.rb +1 -0
- data/test/lib/vedeu/models/escape_test.rb +6 -6
- data/test/lib/vedeu/models/views/view_test.rb +15 -2
- data/test/lib/vedeu/null/null_test.rb +8 -0
- data/test/lib/vedeu/output/direct_test.rb +70 -0
- data/test/lib/vedeu/{plugins_test.rb → plugins/plugins_test.rb} +0 -0
- data/test/lib/vedeu/{repositories_test.rb → repositories/repositories_test.rb} +0 -0
- data/test/lib/vedeu/terminal/content_test.rb +100 -0
- data/test/lib/vedeu/terminal/mode_test.rb +95 -0
- data/test/lib/vedeu/{terminal_test.rb → terminal/terminal_test.rb} +23 -23
- data/test/test_helper.rb +1 -0
- metadata +67 -20
- data/lib/vedeu/terminal_mode.rb +0 -59
- data/test/lib/vedeu/terminal_mode_test.rb +0 -72
data/lib/vedeu/models/escape.rb
CHANGED
@@ -20,10 +20,14 @@ module Vedeu
|
|
20
20
|
@attributes.each { |key, value| instance_variable_set("@#{key}", value) }
|
21
21
|
end
|
22
22
|
|
23
|
-
# @return [
|
24
|
-
def
|
25
|
-
|
23
|
+
# @return [NilClass]
|
24
|
+
def null
|
25
|
+
nil
|
26
26
|
end
|
27
|
+
alias_method :background, :null
|
28
|
+
alias_method :colour, :null
|
29
|
+
alias_method :foreground, :null
|
30
|
+
alias_method :style, :null
|
27
31
|
|
28
32
|
# An object is equal when its values are the same.
|
29
33
|
#
|
@@ -39,11 +43,6 @@ module Vedeu
|
|
39
43
|
Vedeu::Position.coerce(@position)
|
40
44
|
end
|
41
45
|
|
42
|
-
# @return [String]
|
43
|
-
def style
|
44
|
-
''
|
45
|
-
end
|
46
|
-
|
47
46
|
# @return [String]
|
48
47
|
def to_s
|
49
48
|
"#{position}#{value}"
|
@@ -0,0 +1,59 @@
|
|
1
|
+
module Vedeu
|
2
|
+
|
3
|
+
# Write a string directly to the terminal at defined coordinates.
|
4
|
+
#
|
5
|
+
class Direct
|
6
|
+
|
7
|
+
# @param value [String]
|
8
|
+
# @param x [Fixnum]
|
9
|
+
# @param y [Fixnum]
|
10
|
+
# @return [void]
|
11
|
+
def self.write(value:, x:, y:)
|
12
|
+
new(value: value, x: x, y: y).write
|
13
|
+
end
|
14
|
+
|
15
|
+
# @param value [String]
|
16
|
+
# @param x [Fixnum]
|
17
|
+
# @param y [Fixnum]
|
18
|
+
def initialize(value:, x:, y:)
|
19
|
+
@value = value || ''
|
20
|
+
@x = x || 1
|
21
|
+
@y = y || 1
|
22
|
+
end
|
23
|
+
|
24
|
+
# @return [void]
|
25
|
+
def write
|
26
|
+
Vedeu::Terminal.output(output)
|
27
|
+
|
28
|
+
output
|
29
|
+
end
|
30
|
+
|
31
|
+
protected
|
32
|
+
|
33
|
+
# @attribute [r] value
|
34
|
+
# @return [String]
|
35
|
+
attr_reader :value
|
36
|
+
|
37
|
+
# @attribute [r] x
|
38
|
+
# @return [Fixnum]
|
39
|
+
attr_reader :x
|
40
|
+
|
41
|
+
# @attribute [r] y
|
42
|
+
# @return [Fixnum]
|
43
|
+
attr_reader :y
|
44
|
+
|
45
|
+
private
|
46
|
+
|
47
|
+
# @return [String]
|
48
|
+
def output
|
49
|
+
(Array(position) + Array(value)).join
|
50
|
+
end
|
51
|
+
|
52
|
+
# @return [String]
|
53
|
+
def position
|
54
|
+
Vedeu::Position.new(y, x).to_s
|
55
|
+
end
|
56
|
+
|
57
|
+
end # Direct
|
58
|
+
|
59
|
+
end # Vedeu
|
@@ -28,11 +28,19 @@ module Vedeu
|
|
28
28
|
# @param output [Array<Array<Vedeu::Views::Char>>]
|
29
29
|
# @return [Array<Array<Vedeu::Views::Char>>]
|
30
30
|
def parsed(output)
|
31
|
+
store!(output)
|
32
|
+
|
31
33
|
Vedeu.timer('Compression') do
|
32
34
|
Vedeu::Compressor.render(output)
|
33
35
|
end
|
34
36
|
end
|
35
37
|
|
38
|
+
# @param output [Array<Array<Vedeu::Views::Char>>]
|
39
|
+
# @return [Array<Vedeu::Views::Char>]
|
40
|
+
def store!(output)
|
41
|
+
Vedeu::Terminal::Content.stores(output)
|
42
|
+
end
|
43
|
+
|
36
44
|
end # Terminal
|
37
45
|
|
38
46
|
end # Renderers
|
@@ -155,9 +155,8 @@ module Vedeu
|
|
155
155
|
@by ||= border.by
|
156
156
|
end
|
157
157
|
|
158
|
-
#
|
159
|
-
#
|
160
|
-
# @return (see Vedeu::Cursors#by_name)
|
158
|
+
# @return [Vedeu::Cursor]
|
159
|
+
# @see Vedeu::Cursors#by_name
|
161
160
|
def cursor
|
162
161
|
@cursor ||= Vedeu.cursors.by_name(name)
|
163
162
|
end
|
File without changes
|
File without changes
|
@@ -0,0 +1,88 @@
|
|
1
|
+
module Vedeu
|
2
|
+
|
3
|
+
module Terminal
|
4
|
+
|
5
|
+
# A permanent copy of the terminal output.
|
6
|
+
#
|
7
|
+
module Content
|
8
|
+
|
9
|
+
include Vedeu::Common
|
10
|
+
extend self
|
11
|
+
|
12
|
+
# @param char [Vedeu::Views::Char]
|
13
|
+
# @return [Boolean]
|
14
|
+
def valid?(char)
|
15
|
+
char.respond_to?(:position) &&
|
16
|
+
present?(char.position.y) &&
|
17
|
+
present?(char.position.x)
|
18
|
+
end
|
19
|
+
|
20
|
+
# @param char [Vedeu::Views::Char]
|
21
|
+
# @return [Vedeu::Views::Char]
|
22
|
+
def store(char)
|
23
|
+
# value = {}
|
24
|
+
# value[:background] = char.background.to_s if char.background
|
25
|
+
# value[:foreground] = char.foreground.to_s if char.foreground
|
26
|
+
# value[:style] = char.style.to_s if char.style
|
27
|
+
# value[:value] = char.value if char.value
|
28
|
+
# value[:x] = char.position.x if char.position.x
|
29
|
+
# value[:y] = char.position.y if char.position.y
|
30
|
+
|
31
|
+
storage[char.position.y][char.position.x] = char.value if valid?(char)
|
32
|
+
|
33
|
+
char
|
34
|
+
end
|
35
|
+
|
36
|
+
# @param chars [Array<Vedeu::Views::Char>]
|
37
|
+
# @return [Array<Vedeu::Views::Char>]
|
38
|
+
def stores(chars)
|
39
|
+
Array(chars).flatten.map { |char| store(char) }
|
40
|
+
end
|
41
|
+
|
42
|
+
# @return [Hash<String => String>|NilClass]
|
43
|
+
def write
|
44
|
+
filename = "/tmp/vedeu/content_#{Time.now.to_f}"
|
45
|
+
|
46
|
+
File.write(filename, storage.inspect) if Vedeu::Configuration.log?
|
47
|
+
end
|
48
|
+
|
49
|
+
# @return [Array<String>]
|
50
|
+
def reprocess
|
51
|
+
out = []
|
52
|
+
storage.each do |y, line|
|
53
|
+
line.each do |x, value|
|
54
|
+
out << Vedeu::Views::Char.new(position: [y, x], value: value).to_s
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
Vedeu::Terminal.clear
|
59
|
+
|
60
|
+
Vedeu::Terminal.output(out.join)
|
61
|
+
end
|
62
|
+
|
63
|
+
# @return [Hash]
|
64
|
+
def reset
|
65
|
+
@storage = in_memory
|
66
|
+
end
|
67
|
+
|
68
|
+
private
|
69
|
+
|
70
|
+
# Returns an empty collection ready for the storing terminal content.
|
71
|
+
#
|
72
|
+
# @return [Hash]
|
73
|
+
def in_memory
|
74
|
+
Hash.new { |h, k| h[k] = {} }
|
75
|
+
end
|
76
|
+
|
77
|
+
# Access to the storage for this repository.
|
78
|
+
#
|
79
|
+
# @return [Array]
|
80
|
+
def storage
|
81
|
+
@storage ||= in_memory
|
82
|
+
end
|
83
|
+
|
84
|
+
end # Content
|
85
|
+
|
86
|
+
end # Terminal
|
87
|
+
|
88
|
+
end # Vedeu
|
@@ -0,0 +1,79 @@
|
|
1
|
+
module Vedeu
|
2
|
+
|
3
|
+
module Terminal
|
4
|
+
|
5
|
+
# Store the current mode of the terminal.
|
6
|
+
#
|
7
|
+
module Mode
|
8
|
+
|
9
|
+
extend self
|
10
|
+
|
11
|
+
# Returns a boolean indicating whether the terminal is currently in
|
12
|
+
# `cooked` mode.
|
13
|
+
#
|
14
|
+
# @return [Boolean]
|
15
|
+
def cooked_mode?
|
16
|
+
mode == :cooked
|
17
|
+
end
|
18
|
+
|
19
|
+
# Sets the terminal in to `cooked` mode.
|
20
|
+
#
|
21
|
+
# @return [Symbol]
|
22
|
+
def cooked_mode!
|
23
|
+
@mode = :cooked
|
24
|
+
end
|
25
|
+
|
26
|
+
# Returns a boolean indicating whether the terminal is currently in `fake`
|
27
|
+
# mode.
|
28
|
+
#
|
29
|
+
# @return [Boolean]
|
30
|
+
def fake_mode?
|
31
|
+
mode == :fake
|
32
|
+
end
|
33
|
+
|
34
|
+
# Sets the terminal in to `fake` mode.
|
35
|
+
#
|
36
|
+
# @return [Symbol]
|
37
|
+
def fake_mode!
|
38
|
+
@mode = :fake
|
39
|
+
end
|
40
|
+
|
41
|
+
# Returns a boolean indicating whether the terminal is currently in `raw`
|
42
|
+
# mode.
|
43
|
+
#
|
44
|
+
# @return [Boolean]
|
45
|
+
def raw_mode?
|
46
|
+
mode == :raw
|
47
|
+
end
|
48
|
+
|
49
|
+
# Sets the terminal in to `raw` mode.
|
50
|
+
#
|
51
|
+
# @return [Symbol]
|
52
|
+
def raw_mode!
|
53
|
+
@mode = :raw
|
54
|
+
end
|
55
|
+
|
56
|
+
# Toggles the terminal's mode between `cooked`, `fake` and `raw`,
|
57
|
+
# depending on its current mode.
|
58
|
+
#
|
59
|
+
# @return [Symbol]
|
60
|
+
def switch_mode!
|
61
|
+
return fake_mode! if raw_mode?
|
62
|
+
return cooked_mode! if fake_mode?
|
63
|
+
|
64
|
+
raw_mode!
|
65
|
+
end
|
66
|
+
|
67
|
+
# Returns the mode of the terminal, either `:cooked`, `:fake` or `:raw`.
|
68
|
+
# Can change throughout the lifespan of the client application.
|
69
|
+
#
|
70
|
+
# @return [Symbol]
|
71
|
+
def mode
|
72
|
+
@mode ||= Vedeu::Configuration.terminal_mode
|
73
|
+
end
|
74
|
+
|
75
|
+
end # Mode
|
76
|
+
|
77
|
+
end # Terminal
|
78
|
+
|
79
|
+
end # Vedeu
|
@@ -5,7 +5,7 @@ module Vedeu
|
|
5
5
|
#
|
6
6
|
module Terminal
|
7
7
|
|
8
|
-
include Vedeu::
|
8
|
+
include Vedeu::Terminal::Mode
|
9
9
|
extend self
|
10
10
|
|
11
11
|
# Opens a terminal screen in either `raw` or `cooked` mode. On exit,
|
@@ -16,7 +16,7 @@ module Vedeu
|
|
16
16
|
def open
|
17
17
|
fail Vedeu::InvalidSyntax, 'block not given' unless block_given?
|
18
18
|
|
19
|
-
if raw_mode?
|
19
|
+
if raw_mode? || fake_mode?
|
20
20
|
console.raw { initialize_screen(mode) { yield } }
|
21
21
|
|
22
22
|
else
|
@@ -34,29 +34,13 @@ module Vedeu
|
|
34
34
|
def input
|
35
35
|
Vedeu.log(type: :input, message: 'Waiting for user input...')
|
36
36
|
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
nil
|
45
|
-
end
|
46
|
-
begin
|
47
|
-
keys << console.read_nonblock(4)
|
48
|
-
rescue
|
49
|
-
nil
|
50
|
-
end
|
51
|
-
end
|
52
|
-
keys
|
53
|
-
|
54
|
-
else
|
55
|
-
console.gets.chomp
|
56
|
-
|
57
|
-
end
|
58
|
-
|
59
|
-
keys_or_cmd
|
37
|
+
if raw_mode? || fake_mode?
|
38
|
+
Vedeu::Editor::Capture.read(console)
|
39
|
+
|
40
|
+
else
|
41
|
+
console.gets.chomp
|
42
|
+
|
43
|
+
end
|
60
44
|
end
|
61
45
|
alias_method :read, :input
|
62
46
|
|
data/lib/vedeu/version.rb
CHANGED
File without changes
|
@@ -0,0 +1,19 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
module Vedeu
|
4
|
+
|
5
|
+
module Bindings
|
6
|
+
|
7
|
+
describe Focus do
|
8
|
+
|
9
|
+
context 'the system events needed by Vedeu to run are defined' do
|
10
|
+
it { Vedeu.bound?(:_focus_by_name_).must_equal(true) }
|
11
|
+
it { Vedeu.bound?(:_focus_next_).must_equal(true) }
|
12
|
+
it { Vedeu.bound?(:_focus_prev_).must_equal(true) }
|
13
|
+
end
|
14
|
+
|
15
|
+
end # Focus
|
16
|
+
|
17
|
+
end # Bindings
|
18
|
+
|
19
|
+
end # Vedeu
|
@@ -0,0 +1,19 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
module Vedeu
|
4
|
+
|
5
|
+
module Bindings
|
6
|
+
|
7
|
+
describe Refresh do
|
8
|
+
|
9
|
+
context 'the system events needed by Vedeu to run are defined' do
|
10
|
+
it { Vedeu.bound?(:_refresh_).must_equal(true) }
|
11
|
+
it { Vedeu.bound?(:_refresh_cursor_).must_equal(true) }
|
12
|
+
it { Vedeu.bound?(:_refresh_group_).must_equal(true) }
|
13
|
+
end
|
14
|
+
|
15
|
+
end # Refresh
|
16
|
+
|
17
|
+
end # Bindings
|
18
|
+
|
19
|
+
end # Vedeu
|
@@ -10,18 +10,13 @@ module Vedeu
|
|
10
10
|
it { Vedeu.bound?(:_cleanup_).must_equal(true) }
|
11
11
|
it { Vedeu.bound?(:_clear_).must_equal(true) }
|
12
12
|
it { Vedeu.bound?(:_command_).must_equal(true) }
|
13
|
+
it { Vedeu.bound?(:_editor_).must_equal(true) }
|
13
14
|
it { Vedeu.bound?(:_exit_).must_equal(true) }
|
14
|
-
it { Vedeu.bound?(:_focus_by_name_).must_equal(true) }
|
15
|
-
it { Vedeu.bound?(:_focus_next_).must_equal(true) }
|
16
|
-
it { Vedeu.bound?(:_focus_prev_).must_equal(true) }
|
17
15
|
it { Vedeu.bound?(:_initialize_).must_equal(true) }
|
18
16
|
it { Vedeu.bound?(:_keypress_).must_equal(true) }
|
19
17
|
it { Vedeu.bound?(:_log_).must_equal(true) }
|
20
18
|
it { Vedeu.bound?(:_maximise_).must_equal(true) }
|
21
19
|
it { Vedeu.bound?(:_mode_switch_).must_equal(true) }
|
22
|
-
it { Vedeu.bound?(:_refresh_).must_equal(true) }
|
23
|
-
it { Vedeu.bound?(:_refresh_cursor_).must_equal(true) }
|
24
|
-
it { Vedeu.bound?(:_refresh_group_).must_equal(true) }
|
25
20
|
it { Vedeu.bound?(:_resize_).must_equal(true) }
|
26
21
|
it { Vedeu.bound?(:_unmaximise_).must_equal(true) }
|
27
22
|
end
|