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.
Files changed (83) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +6 -0
  3. data/bin/vedeu_drb_server +1 -0
  4. data/config/rubocop_enabled.yml +2 -2
  5. data/docs/events.md +2 -0
  6. data/docs/getting_started.md +1 -1
  7. data/examples/drb_app.rb +1 -0
  8. data/examples/editor_app.rb +76 -0
  9. data/lib/vedeu/all.rb +13 -7
  10. data/lib/vedeu/{bindings.rb → bindings/bindings.rb} +2 -0
  11. data/lib/vedeu/bindings/focus.rb +66 -0
  12. data/lib/vedeu/bindings/refresh.rb +77 -0
  13. data/lib/vedeu/bindings/system.rb +19 -88
  14. data/lib/vedeu/buffers/buffer.rb +8 -8
  15. data/lib/vedeu/configuration/api.rb +32 -11
  16. data/lib/vedeu/configuration/cli.rb +8 -0
  17. data/lib/vedeu/cursor/move.rb +1 -0
  18. data/lib/vedeu/distributed/templates/default_configuration.vedeu +1 -0
  19. data/lib/vedeu/{dsl.rb → dsl/dsl.rb} +0 -0
  20. data/lib/vedeu/exceptions.rb +1 -1
  21. data/lib/vedeu/geometry/position.rb +28 -0
  22. data/lib/vedeu/input/capture.rb +76 -0
  23. data/lib/vedeu/input/editor/all.rb +19 -0
  24. data/lib/vedeu/input/editor/cropper.rb +74 -0
  25. data/lib/vedeu/input/editor/document.rb +254 -0
  26. data/lib/vedeu/input/editor/documents.rb +18 -0
  27. data/lib/vedeu/input/editor/editor.rb +100 -0
  28. data/lib/vedeu/input/editor/line.rb +143 -0
  29. data/lib/vedeu/input/editor/lines.rb +199 -0
  30. data/lib/vedeu/input/editor/virtual_cursor.rb +167 -0
  31. data/lib/vedeu/input/input.rb +9 -93
  32. data/lib/vedeu/input/input_translator.rb +155 -0
  33. data/lib/vedeu/internal_api.rb +9 -0
  34. data/lib/vedeu/log/lockless_log_device.rb +1 -1
  35. data/lib/vedeu/models/escape.rb +7 -8
  36. data/lib/vedeu/output/direct.rb +59 -0
  37. data/lib/vedeu/output/renderers/terminal.rb +8 -0
  38. data/lib/vedeu/output/viewport.rb +2 -3
  39. data/lib/vedeu/{plugins.rb → plugins/plugins.rb} +0 -0
  40. data/lib/vedeu/refresh/refresh_cursor.rb +1 -0
  41. data/lib/vedeu/{repositories.rb → repositories/repositories.rb} +0 -0
  42. data/lib/vedeu/terminal/content.rb +88 -0
  43. data/lib/vedeu/terminal/mode.rb +79 -0
  44. data/lib/vedeu/{terminal.rb → terminal/terminal.rb} +9 -25
  45. data/lib/vedeu/version.rb +1 -1
  46. data/test/lib/vedeu/{bindings_test.rb → bindings/bindings_test.rb} +0 -0
  47. data/test/lib/vedeu/bindings/focus_test.rb +19 -0
  48. data/test/lib/vedeu/bindings/refresh_test.rb +19 -0
  49. data/test/lib/vedeu/bindings/system_test.rb +1 -6
  50. data/test/lib/vedeu/borders/render_border_test.rb +43 -10
  51. data/test/lib/vedeu/buffers/buffer_test.rb +18 -0
  52. data/test/lib/vedeu/buffers/virtual_buffer_test.rb +15 -0
  53. data/test/lib/vedeu/configuration/api_test.rb +18 -2
  54. data/test/lib/vedeu/configuration/cli_test.rb +5 -0
  55. data/test/lib/vedeu/cursor/move_test.rb +1 -1
  56. data/test/lib/vedeu/dsl/dsl_test.rb +8 -0
  57. data/test/lib/vedeu/dsl/shared_test.rb +12 -0
  58. data/test/lib/vedeu/{output → esc}/esc_test.rb +0 -0
  59. data/test/lib/vedeu/geometry/position_test.rb +56 -0
  60. data/test/lib/vedeu/input/capture_test.rb +63 -0
  61. data/test/lib/vedeu/input/editor/cropper_test.rb +82 -0
  62. data/test/lib/vedeu/input/editor/document_test.rb +190 -0
  63. data/test/lib/vedeu/input/editor/documents_test.rb +17 -0
  64. data/test/lib/vedeu/input/editor/editor_test.rb +170 -0
  65. data/test/lib/vedeu/input/editor/line_test.rb +333 -0
  66. data/test/lib/vedeu/input/editor/lines_test.rb +561 -0
  67. data/test/lib/vedeu/input/editor/virtual_cursor_test.rb +184 -0
  68. data/test/lib/vedeu/input/input_test.rb +20 -4
  69. data/test/lib/vedeu/input/input_translator_test.rb +32 -0
  70. data/test/lib/vedeu/internal_api_test.rb +1 -0
  71. data/test/lib/vedeu/models/escape_test.rb +6 -6
  72. data/test/lib/vedeu/models/views/view_test.rb +15 -2
  73. data/test/lib/vedeu/null/null_test.rb +8 -0
  74. data/test/lib/vedeu/output/direct_test.rb +70 -0
  75. data/test/lib/vedeu/{plugins_test.rb → plugins/plugins_test.rb} +0 -0
  76. data/test/lib/vedeu/{repositories_test.rb → repositories/repositories_test.rb} +0 -0
  77. data/test/lib/vedeu/terminal/content_test.rb +100 -0
  78. data/test/lib/vedeu/terminal/mode_test.rb +95 -0
  79. data/test/lib/vedeu/{terminal_test.rb → terminal/terminal_test.rb} +23 -23
  80. data/test/test_helper.rb +1 -0
  81. metadata +67 -20
  82. data/lib/vedeu/terminal_mode.rb +0 -59
  83. data/test/lib/vedeu/terminal_mode_test.rb +0 -72
@@ -0,0 +1,18 @@
1
+ module Vedeu
2
+
3
+ module Editor
4
+
5
+ # Allows the storing of documents.
6
+ #
7
+ class Documents < Vedeu::Repository
8
+
9
+ singleton_class.send(:alias_method, :documents, :repository)
10
+
11
+ real Vedeu::Editor::Document
12
+ null Vedeu::Editor::Document
13
+
14
+ end # Documents
15
+
16
+ end # Editor
17
+
18
+ end # Vedeu
@@ -0,0 +1,100 @@
1
+ module Vedeu
2
+
3
+ module Editor
4
+
5
+ # Handles keypresses for a named document whilst the terminal is in fake
6
+ # mode.
7
+ #
8
+ class Editor
9
+
10
+ include Vedeu::Common
11
+ extend Forwardable
12
+
13
+ def_delegators :document,
14
+ :clear,
15
+ :delete_character,
16
+ :down,
17
+ :insert_character,
18
+ :insert_line,
19
+ :left,
20
+ :render,
21
+ :reset!,
22
+ :retrieve,
23
+ :right,
24
+ :up
25
+
26
+ # @param name [String]
27
+ # @param input [String|Symbol]
28
+ # @return [void]
29
+ def self.keypress(input:, name:)
30
+ new(input: input, name: name).keypress
31
+ end
32
+
33
+ # Returns a new instance of Vedeu::Editor::Editor.
34
+ #
35
+ # @param name [String]
36
+ # @param input [String|Symbol]
37
+ # @return [Vedeu::Editor::Editor]
38
+ def initialize(input:, name:)
39
+ @input = input
40
+ @name = name
41
+ end
42
+
43
+ # @return [String|Symbol]
44
+ def keypress
45
+ return input unless document
46
+
47
+ case input
48
+ when :backspace then delete_character
49
+ when :ctrl_c then Vedeu.trigger(:_exit_)
50
+ when :down then down
51
+ when :enter then insert_line
52
+ when :escape then Vedeu.trigger(:_mode_switch_)
53
+ when :left then left
54
+ when :right then right
55
+ when :tab then command
56
+ when :up then up
57
+ # when '' then delete_line
58
+ else
59
+ insert_character(input)
60
+ end
61
+
62
+ render unless input == :enter
63
+ end
64
+
65
+ protected
66
+
67
+ # @!attribute [r] input
68
+ # @return [Symbol|String]
69
+ attr_reader :input
70
+
71
+ # @!attribute [r] name
72
+ # @return [String]
73
+ attr_reader :name
74
+
75
+ private
76
+
77
+ #
78
+ # @return []
79
+ def command
80
+ command = retrieve
81
+
82
+ reset!
83
+
84
+ clear
85
+
86
+ Vedeu.trigger(:_command_, command)
87
+ end
88
+
89
+ # Return the document by name from the documents repository.
90
+ #
91
+ # @return [Vedeu::Editor::Document]
92
+ def document
93
+ @document ||= Vedeu.documents.by_name(name)
94
+ end
95
+
96
+ end # Editor
97
+
98
+ end # Editor
99
+
100
+ end # Vedeu
@@ -0,0 +1,143 @@
1
+ module Vedeu
2
+
3
+ module Editor
4
+
5
+ # Manipulate a single line of an Vedeu::Editor::Document.
6
+ #
7
+ class Line
8
+
9
+ # @!attribute [rw] line
10
+ # @return [String]
11
+ attr_accessor :line
12
+ alias_method :to_s, :line
13
+
14
+ # Coerce a line into a new instance of Vedeu::Editor::Line.
15
+ #
16
+ # @param line [String|Vedeu::Editor::Line]
17
+ # @return [Vedeu::Editor::Line]
18
+ def self.coerce(line)
19
+ return line if line.is_a?(self)
20
+
21
+ if line.is_a?(String)
22
+ new(line)
23
+
24
+ else
25
+ new
26
+
27
+ end
28
+ end
29
+
30
+ # Returns a new instance of Vedeu::Editor::Line.
31
+ #
32
+ # @param line [String|NilClass]
33
+ # @return [Vedeu::Editor::Line]
34
+ def initialize(line = nil)
35
+ @line = line || ''
36
+ end
37
+
38
+ # Return a character or collection of characters (if index is a Range).
39
+ #
40
+ # @param index [Fixnum|Range]
41
+ # @return [String]
42
+ def [](index)
43
+ line[index]
44
+ end
45
+
46
+ # Return the character from the line positioned at the given index.
47
+ #
48
+ # @param index [Fixnum|NilClass]
49
+ # @return [String|NilClass]
50
+ def character(index = nil)
51
+ return '' if line && line.empty?
52
+ return line[-1] unless index
53
+
54
+ if index <= 0
55
+ line[0]
56
+
57
+ elsif index && index <= size
58
+ line[index]
59
+
60
+ else
61
+ line[-1]
62
+
63
+ end
64
+ end
65
+
66
+ # Delete the character from the line positioned at the given index.
67
+ #
68
+ # @param index [Fixnum|NilClass]
69
+ # @return [String]
70
+ def delete_character(index = nil)
71
+ return self if line.empty? || (index && index <= 0)
72
+
73
+ new_line = if index && index <= size
74
+ line.dup.tap { |line| line.slice!(index) }
75
+
76
+ else
77
+ line.chop
78
+
79
+ end
80
+
81
+ Vedeu::Editor::Line.coerce(new_line)
82
+ end
83
+
84
+ # Returns a boolean indicating whether there are characters on this line.
85
+ #
86
+ # @return [Boolean]
87
+ def empty?
88
+ size == 0
89
+ end
90
+
91
+ # An object is equal when its values are the same.
92
+ #
93
+ # @param other [Vedeu::Editor::Line]
94
+ # @return [Boolean]
95
+ def eql?(other)
96
+ self.class == other.class && line == other.line
97
+ end
98
+ alias_method :==, :eql?
99
+
100
+ # Insert the character on the line positioned at the given index.
101
+ #
102
+ # @param character [String]
103
+ # @param index [Fixnum|NilClass]
104
+ # @return [String]
105
+ def insert_character(character, index = nil)
106
+ new_line = if index
107
+ if index <= 0
108
+ line.insert(0, character)
109
+
110
+ elsif index >= size
111
+ line << character
112
+
113
+ else
114
+ line.insert(index, character)
115
+
116
+ end
117
+ else
118
+ line + character
119
+
120
+ end
121
+
122
+ Vedeu::Editor::Line.coerce(new_line)
123
+ end
124
+
125
+ # Return the size of the line in characters.
126
+ #
127
+ # @return [Fixnum]
128
+ def size
129
+ line.size
130
+ end
131
+
132
+ # Return the line as a collection of Vedeu::Views::Char objects.
133
+ #
134
+ # @return [Array<Vedeu::Views::Char>]
135
+ def to_chars
136
+ line.chars.map { |char| Vedeu::Views::Char.new(value: char) }
137
+ end
138
+
139
+ end # Line
140
+
141
+ end # Editor
142
+
143
+ end # Vedeu
@@ -0,0 +1,199 @@
1
+ module Vedeu
2
+
3
+ module Editor
4
+
5
+ # Manipulate the lines of an Vedeu::Editor::Document.
6
+ #
7
+ class Lines
8
+
9
+ include Enumerable
10
+
11
+ # @!attribute [rw] lines
12
+ # @return [String]
13
+ attr_accessor :lines
14
+
15
+ # Coerce a document into a new instance of Vedeu::Editor::Lines.
16
+ #
17
+ # @param document [Array<String>|Vedeu::Editor::Lines]
18
+ # @return [Vedeu::Editor::Lines]
19
+ def self.coerce(document)
20
+ if document.is_a?(self)
21
+ new(document.lines)
22
+
23
+ elsif document.is_a?(Array)
24
+ lines = document.map do |line|
25
+ if line.is_a?(Vedeu::Editor::Line)
26
+ line
27
+
28
+ elsif line.is_a?(String)
29
+ Vedeu::Editor::Line.coerce(line)
30
+
31
+ else
32
+ Vedeu::Editor::Line.new
33
+
34
+ end
35
+ end
36
+
37
+ new(lines)
38
+
39
+ elsif document.is_a?(String)
40
+ lines = document.lines.map(&:chomp).map do |line|
41
+ Vedeu::Editor::Line.coerce(line)
42
+ end
43
+
44
+ new(lines)
45
+
46
+ else
47
+ new
48
+
49
+ end
50
+ end
51
+
52
+ # Returns a new instance of Vedeu::Editor::Lines.
53
+ #
54
+ # @param lines [Array<String>|NilClass]
55
+ # @return [Vedeu::Editor::Lines]
56
+ def initialize(lines = nil)
57
+ @lines = lines || []
58
+ end
59
+
60
+ # Return a line or collection of lines (if index is a Range).
61
+ #
62
+ # @param index [Fixnum|Range]
63
+ # @return [Vedeu::Editor::Line]
64
+ def [](index)
65
+ lines[index]
66
+ end
67
+
68
+ # Deletes the character from the line where the cursor is currently
69
+ # positioned.
70
+ #
71
+ # @param y [Fixnum]
72
+ # @param x [Fixnum]
73
+ # @return [Vedeu::Editor::Lines]
74
+ def delete_character(y, x)
75
+ lines[y] = line(y).delete_character(x)
76
+ Vedeu::Editor::Lines.coerce(lines)
77
+ end
78
+
79
+ # Delete the line from the lines positioned at the given index.
80
+ #
81
+ # @param index [Fixnum|NilClass]
82
+ # @return [String]
83
+ def delete_line(index = nil)
84
+ return self if lines.empty? || (index && index <= 0)
85
+
86
+ new_lines = if index && index <= size
87
+ lines.dup.tap { |lines| lines.slice!(index) }
88
+
89
+ else
90
+ lines.dup.tap(&:pop)
91
+
92
+ end
93
+
94
+ Vedeu::Editor::Lines.coerce(new_lines)
95
+ end
96
+
97
+ # Provides iteration over the collection.
98
+ #
99
+ # @param block [Proc]
100
+ # @return [Enumerator]
101
+ def each(&block)
102
+ lines.each(&block)
103
+ end
104
+
105
+ # Returns a boolean indicating whether there are lines.
106
+ #
107
+ # @return [Boolean]
108
+ def empty?
109
+ size == 0
110
+ end
111
+
112
+ # An object is equal when its values are the same.
113
+ #
114
+ # @param other [Vedeu::Editor::Lines]
115
+ # @return [Boolean]
116
+ def eql?(other)
117
+ self.class == other.class && lines == other.lines
118
+ end
119
+ alias_method :==, :eql?
120
+
121
+ # Insert a character in to a line.
122
+ #
123
+ # @param character [String]
124
+ # @param y [Fixnum]
125
+ # @param x [Fixnum]
126
+ # @return [Vedeu::Editor::Lines]
127
+ def insert_character(character, y, x)
128
+ lines[y] = line(y).insert_character(character, x)
129
+ Vedeu::Editor::Lines.coerce(lines)
130
+ end
131
+
132
+ # Insert the line on the line below the given index.
133
+ #
134
+ # @param line [String]
135
+ # @param index [Fixnum|NilClass]
136
+ # @return [Vedeu::Editor::Lines]
137
+ def insert_line(line, index = nil)
138
+ return self unless line
139
+
140
+ new_lines = if index
141
+ if index <= 0
142
+ lines.insert(0, line)
143
+
144
+ elsif index >= size
145
+ lines << line
146
+
147
+ else
148
+ lines.insert(index, line)
149
+
150
+ end
151
+ else
152
+ lines << line
153
+
154
+ end
155
+
156
+ Vedeu::Editor::Lines.coerce(new_lines)
157
+ end
158
+
159
+ # Returns the line at the given index.
160
+ #
161
+ # @param index [Fixnum|NilClass]
162
+ # @return [Vedeu::Editor::Line]
163
+ def line(index = nil)
164
+ return Vedeu::Editor::Line.new unless lines
165
+ return Vedeu::Editor::Line.coerce(lines.last) unless index
166
+
167
+ indexed = if index <= 0
168
+ lines.first
169
+
170
+ elsif index && index <= size
171
+ lines[index]
172
+
173
+ else
174
+ lines.last
175
+
176
+ end
177
+
178
+ Vedeu::Editor::Line.coerce(indexed)
179
+ end
180
+
181
+ # Return the number of lines.
182
+ #
183
+ # @return [Fixnum]
184
+ def size
185
+ lines.size
186
+ end
187
+
188
+ # Return the lines as a string.
189
+ #
190
+ # @return [String]
191
+ def to_s
192
+ lines.map(&:to_s).join
193
+ end
194
+
195
+ end # Line
196
+
197
+ end # Editor
198
+
199
+ end # Vedeu