vedeu 0.2.12 → 0.3.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/.ruby-version +1 -1
- data/Guardfile +13 -0
- data/README.md +11 -9
- data/Rakefile +10 -1
- data/bin/vedeu_test +14 -0
- data/config/cucumber.yml +8 -0
- data/docs/api.md +45 -16
- data/docs/events.md +21 -9
- data/docs/getting_started.md +16 -0
- data/docs/views.md +158 -0
- data/examples/borders_app.rb +236 -110
- data/examples/colour_support.sh +98 -0
- data/examples/colours_app.rb +41 -0
- data/examples/configuration_app.rb +11 -6
- data/examples/cursor_app.rb +60 -61
- data/examples/focus_app.rb +72 -34
- data/examples/hello_world.rb +13 -8
- data/examples/lines_app.rb +37 -28
- data/features/start_stop.feature +27 -0
- data/features/support/env.rb +14 -0
- data/lib/vedeu/all.rb +29 -0
- data/lib/vedeu/api.rb +39 -0
- data/lib/vedeu/application.rb +15 -7
- data/lib/vedeu/bindings.rb +121 -0
- data/lib/vedeu/buffers/all.rb +10 -0
- data/lib/vedeu/{repositories/models → buffers}/buffer.rb +47 -64
- data/lib/vedeu/buffers/display_buffer.rb +118 -0
- data/lib/vedeu/configuration/all.rb +6 -0
- data/lib/vedeu/configuration/api.rb +3 -1
- data/lib/vedeu/configuration/cli.rb +3 -1
- data/lib/vedeu/configuration/configuration.rb +23 -2
- data/lib/vedeu/cursor/all.rb +23 -0
- data/lib/vedeu/cursor/cursor.rb +116 -0
- data/lib/vedeu/cursor/move_cursor.rb +137 -0
- data/lib/vedeu/cursor/toggle_cursor.rb +53 -0
- data/lib/vedeu/dsl/all.rb +28 -0
- data/lib/vedeu/dsl/components/all.rb +7 -0
- data/lib/vedeu/dsl/components/border.rb +104 -0
- data/lib/vedeu/dsl/components/geometry.rb +153 -0
- data/lib/vedeu/dsl/components/keymap.rb +93 -0
- data/lib/vedeu/dsl/components/menu.rb +82 -0
- data/lib/vedeu/dsl/composition.rb +72 -0
- data/lib/vedeu/dsl/interface.rb +210 -0
- data/lib/vedeu/dsl/line.rb +135 -0
- data/lib/vedeu/dsl/shared/all.rb +7 -0
- data/lib/vedeu/dsl/shared/colour.rb +85 -0
- data/lib/vedeu/dsl/shared/style.rb +38 -0
- data/lib/vedeu/dsl/shared/text.rb +102 -0
- data/lib/vedeu/dsl/shared/use.rb +47 -0
- data/lib/vedeu/dsl/stream.rb +49 -0
- data/lib/vedeu/dsl/view.rb +136 -0
- data/lib/vedeu/events/all.rb +10 -0
- data/lib/vedeu/{repositories/models → events}/event.rb +97 -8
- data/lib/vedeu/events/trigger.rb +58 -0
- data/lib/vedeu/exceptions.rb +34 -0
- data/lib/vedeu/input/all.rb +29 -0
- data/lib/vedeu/input/input.rb +26 -0
- data/lib/vedeu/{models → input}/key.rb +21 -11
- data/lib/vedeu/input/keymap.rb +130 -0
- data/lib/vedeu/input/keys.rb +8 -0
- data/lib/vedeu/input/mapper.rb +112 -0
- data/lib/vedeu/launcher.rb +7 -4
- data/lib/vedeu/models/all.rb +12 -0
- data/lib/vedeu/models/collection.rb +71 -0
- data/lib/vedeu/{repositories → models}/focus.rb +63 -21
- data/lib/vedeu/models/geometry.rb +100 -259
- data/lib/vedeu/{repositories/models → models}/group.rb +16 -14
- data/lib/vedeu/{repositories/models → models}/menu.rb +85 -22
- data/lib/vedeu/models/model.rb +51 -0
- data/lib/vedeu/models/view/all.rb +12 -0
- data/lib/vedeu/models/view/char.rb +84 -0
- data/lib/vedeu/models/view/chars.rb +8 -0
- data/lib/vedeu/models/view/composition.rb +101 -0
- data/lib/vedeu/models/view/interface.rb +215 -0
- data/lib/vedeu/models/view/interfaces.rb +8 -0
- data/lib/vedeu/models/view/line.rb +134 -0
- data/lib/vedeu/models/view/lines.rb +8 -0
- data/lib/vedeu/models/view/stream.rb +144 -0
- data/lib/vedeu/models/view/streams.rb +8 -0
- data/lib/vedeu/output/all.rb +8 -0
- data/lib/vedeu/output/border.rb +387 -0
- data/lib/vedeu/output/compositor.rb +41 -30
- data/lib/vedeu/output/output.rb +6 -13
- data/lib/vedeu/output/viewport.rb +78 -94
- data/lib/vedeu/output/writer.rb +29 -0
- data/lib/vedeu/presentation/all.rb +9 -0
- data/lib/vedeu/{colours → presentation}/background.rb +1 -9
- data/lib/vedeu/{colours → presentation}/colour.rb +21 -8
- data/lib/vedeu/{colours → presentation}/foreground.rb +5 -9
- data/lib/vedeu/presentation/presentation.rb +91 -0
- data/lib/vedeu/presentation/style.rb +47 -0
- data/lib/vedeu/{colours → presentation}/translator.rb +11 -5
- data/lib/vedeu/repositories/all.rb +5 -0
- data/lib/vedeu/repositories/menus.rb +5 -42
- data/lib/vedeu/{support → repositories}/repository.rb +78 -41
- data/lib/vedeu/support/all.rb +22 -0
- data/lib/vedeu/support/bounding_area.rb +2 -1
- data/lib/vedeu/support/coercions.rb +18 -1
- data/lib/vedeu/support/console.rb +73 -0
- data/lib/vedeu/support/content_geometry.rb +69 -0
- data/lib/vedeu/support/coordinate.rb +246 -0
- data/lib/vedeu/support/esc.rb +29 -2
- data/lib/vedeu/support/log.rb +36 -2
- data/lib/vedeu/support/node.rb +61 -0
- data/lib/vedeu/support/position.rb +28 -13
- data/lib/vedeu/support/position_validator.rb +79 -0
- data/lib/vedeu/support/read.rb +65 -0
- data/lib/vedeu/support/refresh.rb +8 -32
- data/lib/vedeu/support/terminal.rb +34 -4
- data/lib/vedeu/support/text.rb +104 -0
- data/lib/vedeu/support/trace.rb +11 -23
- data/lib/vedeu/support/visible.rb +75 -0
- data/lib/vedeu/support/write.rb +85 -0
- data/lib/vedeu/traps.rb +18 -0
- data/lib/vedeu.rb +41 -101
- data/test/integration/dsl/compositions_test.rb +27 -0
- data/test/integration/dsl/interfaces_test.rb +261 -0
- data/test/integration/dsl/keymaps_test.rb +42 -0
- data/test/integration/dsl/lines_test.rb +146 -0
- data/test/integration/dsl/menus_test.rb +59 -0
- data/test/integration/dsl/streams_test.rb +129 -0
- data/test/integration/dsl/views_test.rb +63 -0
- data/test/lib/vedeu/api_test.rb +163 -0
- data/test/lib/vedeu/application_test.rb +19 -10
- data/test/lib/vedeu/bindings_test.rb +54 -0
- data/test/lib/vedeu/buffers/all_test.rb +11 -0
- data/test/lib/vedeu/buffers/buffer_test.rb +196 -0
- data/test/lib/vedeu/buffers/display_buffer_test.rb +58 -0
- data/test/lib/vedeu/configuration/api_test.rb +42 -58
- data/test/lib/vedeu/configuration/cli_test.rb +4 -4
- data/test/lib/vedeu/configuration/configuration_test.rb +11 -29
- data/test/lib/vedeu/cursor/all_test.rb +33 -0
- data/test/lib/vedeu/cursor/cursor_test.rb +85 -0
- data/test/lib/vedeu/cursor/move_cursor_test.rb +212 -0
- data/test/lib/vedeu/cursor/toggle_cursor_test.rb +63 -0
- data/test/lib/vedeu/dsl/components/border_test.rb +414 -0
- data/test/lib/vedeu/dsl/components/geometry_test.rb +231 -0
- data/test/lib/vedeu/dsl/components/keymap_test.rb +80 -0
- data/test/lib/vedeu/dsl/components/menu_test.rb +115 -0
- data/test/lib/vedeu/dsl/composition_test.rb +41 -0
- data/test/lib/vedeu/dsl/interface_test.rb +470 -0
- data/test/lib/vedeu/dsl/line_test.rb +60 -0
- data/test/lib/vedeu/dsl/shared/colour_test.rb +100 -0
- data/test/lib/vedeu/dsl/shared/style_test.rb +22 -0
- data/test/lib/vedeu/dsl/shared/text_test.rb +15 -0
- data/test/lib/vedeu/dsl/shared/use_test.rb +27 -0
- data/test/lib/vedeu/dsl/stream_test.rb +26 -0
- data/test/lib/vedeu/dsl/view_test.rb +73 -0
- data/test/lib/vedeu/events/all_test.rb +11 -0
- data/test/lib/vedeu/events/event_test.rb +109 -0
- data/test/lib/vedeu/events/trigger_test.rb +60 -0
- data/test/lib/vedeu/input/all_test.rb +11 -0
- data/test/lib/vedeu/input/input_test.rb +7 -3
- data/test/lib/vedeu/input/key_test.rb +72 -0
- data/test/lib/vedeu/input/keymap_test.rb +89 -0
- data/test/lib/vedeu/input/mapper_test.rb +94 -0
- data/test/lib/vedeu/launcher_test.rb +19 -20
- data/test/lib/vedeu/models/collection_test.rb +114 -0
- data/test/lib/vedeu/{repositories → models}/focus_test.rb +46 -13
- data/test/lib/vedeu/models/geometry_test.rb +35 -39
- data/test/lib/vedeu/models/group_test.rb +100 -0
- data/test/lib/vedeu/models/menu_test.rb +288 -0
- data/test/lib/vedeu/models/model_test.rb +31 -0
- data/test/lib/vedeu/models/view/char_test.rb +166 -0
- data/test/lib/vedeu/models/view/chars_test.rb +18 -0
- data/test/lib/vedeu/models/view/composition_test.rb +41 -0
- data/test/lib/vedeu/models/view/interface_test.rb +128 -0
- data/test/lib/vedeu/models/view/interfaces_test.rb +18 -0
- data/test/lib/vedeu/models/view/line_test.rb +214 -0
- data/test/lib/vedeu/models/view/lines_test.rb +18 -0
- data/test/lib/vedeu/models/view/stream_test.rb +106 -0
- data/test/lib/vedeu/models/view/streams_test.rb +18 -0
- data/test/lib/vedeu/output/border_test.rb +357 -0
- data/test/lib/vedeu/output/compositor_test.rb +61 -15
- data/test/lib/vedeu/output/output_test.rb +25 -84
- data/test/lib/vedeu/output/viewport_test.rb +171 -45
- data/test/lib/vedeu/output/writer_test.rb +45 -0
- data/test/lib/vedeu/{colours → presentation}/background_test.rb +0 -0
- data/test/lib/vedeu/{colours → presentation}/colour_test.rb +5 -5
- data/test/lib/vedeu/{colours → presentation}/foreground_test.rb +0 -0
- data/test/lib/vedeu/presentation/presentation_test.rb +56 -0
- data/test/lib/vedeu/presentation/style_test.rb +69 -0
- data/test/lib/vedeu/presentation/translator_test.rb +63 -0
- data/test/lib/vedeu/repositories/all_test.rb +7 -0
- data/test/lib/vedeu/repositories/menus_test.rb +3 -156
- data/test/lib/vedeu/repositories/repository_test.rb +271 -0
- data/test/lib/vedeu/support/bounding_area_test.rb +3 -3
- data/test/lib/vedeu/support/coercions_test.rb +39 -0
- data/test/lib/vedeu/support/common_test.rb +31 -16
- data/test/lib/vedeu/support/console_test.rb +85 -0
- data/test/lib/vedeu/support/content_geometry_test.rb +107 -0
- data/test/lib/vedeu/support/coordinate_test.rb +190 -0
- data/test/lib/vedeu/support/esc_test.rb +18 -0
- data/test/lib/vedeu/support/grid_test.rb +15 -10
- data/test/lib/vedeu/support/log_test.rb +3 -0
- data/test/lib/vedeu/support/position_test.rb +22 -2
- data/test/lib/vedeu/support/position_validator_test.rb +11 -0
- data/test/lib/vedeu/support/read_test.rb +88 -0
- data/test/lib/vedeu/support/refresh_test.rb +44 -12
- data/test/lib/vedeu/support/sentence_test.rb +6 -4
- data/test/lib/vedeu/support/terminal_test.rb +81 -70
- data/test/lib/vedeu/support/text_test.rb +93 -0
- data/test/lib/vedeu/support/trace_test.rb +21 -9
- data/test/lib/vedeu/support/visible_test.rb +148 -0
- data/test/lib/vedeu/support/write_test.rb +136 -0
- data/test/lib/vedeu/traps_test.rb +11 -0
- data/test/lib/vedeu_test.rb +2 -0
- data/test/support/helpers/all.rb +7 -0
- data/test/support/helpers/dsl_model_test_class.rb +25 -0
- data/test/support/{test_classes → helpers}/helpers.rb +0 -2
- data/test/support/helpers/misc.rb +15 -0
- data/test/support/helpers/model_test_class.rb +34 -0
- data/test/support/{test_classes → helpers}/presentation.rb +0 -0
- data/test/support/{test_classes → helpers}/repositories.rb +3 -3
- data/test/support/{test_modules/repository.rb → helpers/repository_test_module.rb} +5 -1
- data/test/test_helper.rb +19 -22
- data/vedeu.gemspec +11 -6
- metadata +322 -181
- data/lib/vedeu/api/api.rb +0 -239
- data/lib/vedeu/api/composition.rb +0 -38
- data/lib/vedeu/api/defined.rb +0 -52
- data/lib/vedeu/api/helpers.rb +0 -161
- data/lib/vedeu/api/interface.rb +0 -287
- data/lib/vedeu/api/keymap.rb +0 -75
- data/lib/vedeu/api/line.rb +0 -107
- data/lib/vedeu/api/menu.rb +0 -111
- data/lib/vedeu/api/stream.rb +0 -96
- data/lib/vedeu/models/border.rb +0 -238
- data/lib/vedeu/models/char.rb +0 -43
- data/lib/vedeu/models/composition.rb +0 -72
- data/lib/vedeu/models/line.rb +0 -100
- data/lib/vedeu/models/stream.rb +0 -130
- data/lib/vedeu/models/style.rb +0 -52
- data/lib/vedeu/repositories/buffers.rb +0 -52
- data/lib/vedeu/repositories/cursors.rb +0 -64
- data/lib/vedeu/repositories/events.rb +0 -147
- data/lib/vedeu/repositories/groups.rb +0 -47
- data/lib/vedeu/repositories/interfaces.rb +0 -78
- data/lib/vedeu/repositories/keymaps.rb +0 -196
- data/lib/vedeu/repositories/models/cursor.rb +0 -209
- data/lib/vedeu/repositories/models/interface.rb +0 -163
- data/lib/vedeu/repositories/models/keymap.rb +0 -111
- data/lib/vedeu/repositories/models/offset.rb +0 -91
- data/lib/vedeu/repositories/offsets.rb +0 -69
- data/lib/vedeu/support/exceptions.rb +0 -34
- data/lib/vedeu/support/keymap_validator.rb +0 -100
- data/lib/vedeu/support/model.rb +0 -14
- data/lib/vedeu/support/presentation.rb +0 -86
- data/lib/vedeu/support/registrar.rb +0 -53
- data/test/integration/api/api_test.rb +0 -97
- data/test/integration/api_dsl/dsl_api_test.rb +0 -4
- data/test/integration/api_dsl/dsl_composition_test.rb +0 -4
- data/test/integration/api_dsl/dsl_defined_test.rb +0 -4
- data/test/integration/api_dsl/dsl_helpers_test.rb +0 -4
- data/test/integration/api_dsl/dsl_interface_test.rb +0 -4
- data/test/integration/api_dsl/dsl_keymap.rb +0 -4
- data/test/integration/api_dsl/dsl_line_test.rb +0 -4
- data/test/integration/api_dsl/dsl_menu_test.rb +0 -4
- data/test/integration/api_dsl/dsl_stream_test.rb +0 -138
- data/test/integration/cursors_test.rb +0 -9
- data/test/integration/defining_interfaces_test.rb +0 -26
- data/test/integration/run_once_test.rb +0 -26
- data/test/integration/views/basic_view_test.rb +0 -807
- data/test/lib/vedeu/api/api_test.rb +0 -204
- data/test/lib/vedeu/api/composition_test.rb +0 -31
- data/test/lib/vedeu/api/defined_test.rb +0 -79
- data/test/lib/vedeu/api/helpers_test.rb +0 -111
- data/test/lib/vedeu/api/interface_test.rb +0 -410
- data/test/lib/vedeu/api/keymap_test.rb +0 -65
- data/test/lib/vedeu/api/line_test.rb +0 -83
- data/test/lib/vedeu/api/menu_test.rb +0 -85
- data/test/lib/vedeu/api/stream_test.rb +0 -59
- data/test/lib/vedeu/colours/translator_test.rb +0 -22
- data/test/lib/vedeu/models/border_test.rb +0 -197
- data/test/lib/vedeu/models/char_test.rb +0 -52
- data/test/lib/vedeu/models/composition_test.rb +0 -45
- data/test/lib/vedeu/models/key_test.rb +0 -43
- data/test/lib/vedeu/models/line_test.rb +0 -123
- data/test/lib/vedeu/models/stream_test.rb +0 -233
- data/test/lib/vedeu/models/style_test.rb +0 -59
- data/test/lib/vedeu/repositories/buffers_test.rb +0 -37
- data/test/lib/vedeu/repositories/cursors_test.rb +0 -62
- data/test/lib/vedeu/repositories/events_test.rb +0 -57
- data/test/lib/vedeu/repositories/groups_test.rb +0 -28
- data/test/lib/vedeu/repositories/interfaces_test.rb +0 -51
- data/test/lib/vedeu/repositories/keymaps_test.rb +0 -223
- data/test/lib/vedeu/repositories/models/buffer_test.rb +0 -174
- data/test/lib/vedeu/repositories/models/cursor_test.rb +0 -158
- data/test/lib/vedeu/repositories/models/event_test.rb +0 -53
- data/test/lib/vedeu/repositories/models/group_test.rb +0 -98
- data/test/lib/vedeu/repositories/models/interface_test.rb +0 -130
- data/test/lib/vedeu/repositories/models/keymap_test.rb +0 -27
- data/test/lib/vedeu/repositories/models/menu_test.rb +0 -246
- data/test/lib/vedeu/repositories/models/offset_test.rb +0 -128
- data/test/lib/vedeu/repositories/offsets_test.rb +0 -39
- data/test/lib/vedeu/support/keymap_validator_test.rb +0 -62
- data/test/lib/vedeu/support/model_test.rb +0 -23
- data/test/lib/vedeu/support/presentation_test.rb +0 -53
- data/test/lib/vedeu/support/registrar_test.rb +0 -94
- data/test/lib/vedeu/support/repository_test.rb +0 -208
- data/test/support/test_classes/all.rb +0 -5
- data/test/support/test_classes/coercions.rb +0 -16
- data/test/support/test_classes/model.rb +0 -23
- data/test/support/test_modules/all.rb +0 -1
data/lib/vedeu/support/log.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
require 'vedeu/configuration/configuration'
|
2
|
+
|
1
3
|
module Vedeu
|
2
4
|
|
3
5
|
# Provides the ability to log anything to the Vedeu log file.
|
@@ -7,17 +9,49 @@ module Vedeu
|
|
7
9
|
|
8
10
|
class << self
|
9
11
|
|
12
|
+
# Write a message to the Vedeu log file.
|
13
|
+
#
|
14
|
+
# @param message [String] The message you wish to emit to the log
|
15
|
+
# file, useful for debugging.
|
16
|
+
# @param force [Boolean] When evaluates to true will attempt to
|
17
|
+
# write to the log file regardless of the Configuration setting.
|
18
|
+
#
|
19
|
+
# @example
|
20
|
+
# Vedeu.log('A useful debugging message: Error!')
|
21
|
+
#
|
22
|
+
# @return [TrueClass]
|
23
|
+
def log(message, force = false)
|
24
|
+
colour = [:red, :green, :yellow, :blue, :magenta, :cyan, :white].sample
|
25
|
+
|
26
|
+
logger.debug(Esc.send(colour) { message }) if enabled? || force
|
27
|
+
end
|
28
|
+
|
10
29
|
# @return [TrueClass]
|
11
30
|
def logger
|
12
|
-
Logger.new(
|
31
|
+
Logger.new(log_file).tap do |log|
|
13
32
|
log.formatter = proc do |_, time, _, message|
|
14
|
-
|
33
|
+
formatted_message(message, time)
|
15
34
|
end
|
16
35
|
end
|
17
36
|
end
|
18
37
|
|
19
38
|
private
|
20
39
|
|
40
|
+
# @return [String]
|
41
|
+
def formatted_message(message, time = Time.now)
|
42
|
+
[timestamp(time.utc.iso8601), message, "\n"].join
|
43
|
+
end
|
44
|
+
|
45
|
+
# @return [Boolean]
|
46
|
+
def enabled?
|
47
|
+
Vedeu::Configuration.debug?
|
48
|
+
end
|
49
|
+
|
50
|
+
# @return [String]
|
51
|
+
def log_file
|
52
|
+
Vedeu::Configuration.log
|
53
|
+
end
|
54
|
+
|
21
55
|
# Returns a formatted (red, underlined) UTC timestamp,
|
22
56
|
# eg. 2014-10-24T12:34:56Z
|
23
57
|
#
|
@@ -0,0 +1,61 @@
|
|
1
|
+
module Vedeu
|
2
|
+
|
3
|
+
class Node
|
4
|
+
|
5
|
+
attr_accessor :name,
|
6
|
+
:parent
|
7
|
+
|
8
|
+
attr_reader :children
|
9
|
+
|
10
|
+
def initialize(name)
|
11
|
+
@name = name
|
12
|
+
@children = []
|
13
|
+
end
|
14
|
+
|
15
|
+
def add_child(node)
|
16
|
+
children << node
|
17
|
+
|
18
|
+
node.parent = self
|
19
|
+
end
|
20
|
+
alias :<< :add_child
|
21
|
+
|
22
|
+
def remove_child(node)
|
23
|
+
children.delete(node)
|
24
|
+
end
|
25
|
+
|
26
|
+
def [](index)
|
27
|
+
children[index]
|
28
|
+
end
|
29
|
+
|
30
|
+
def []=(index, node)
|
31
|
+
replaced_child = @children[index]
|
32
|
+
children[index] = node
|
33
|
+
replaced_child.parent = nil
|
34
|
+
node.parent = self
|
35
|
+
end
|
36
|
+
|
37
|
+
def leaf?
|
38
|
+
children.empty?
|
39
|
+
end
|
40
|
+
|
41
|
+
end # Node
|
42
|
+
|
43
|
+
class Task < Node
|
44
|
+
|
45
|
+
def initialize(name, time_required = nil)
|
46
|
+
super(name)
|
47
|
+
@time_required = time_required
|
48
|
+
end
|
49
|
+
def time_required
|
50
|
+
if leaf?
|
51
|
+
@time_required
|
52
|
+
else
|
53
|
+
time = 0.0
|
54
|
+
children.each { |child_task| time += child_task.time_required }
|
55
|
+
time
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
end # Task
|
60
|
+
|
61
|
+
end # Vedeu
|
@@ -1,18 +1,24 @@
|
|
1
1
|
module Vedeu
|
2
2
|
|
3
3
|
# Change coordinates into an escape sequence to set the cursor position.
|
4
|
-
# Also used as the basis of an Offset.
|
5
4
|
#
|
6
5
|
# @api private
|
7
|
-
class Position
|
6
|
+
class Position
|
7
|
+
|
8
|
+
attr_reader :y,
|
9
|
+
:x
|
10
|
+
|
11
|
+
alias_method :first, :y
|
12
|
+
alias_method :last, :x
|
8
13
|
|
9
14
|
# Initializes a new instance of Position.
|
10
15
|
#
|
11
16
|
# @param y [Fixnum]
|
12
17
|
# @param x [Fixnum]
|
13
18
|
# @return [Position]
|
14
|
-
def initialize(y =
|
15
|
-
|
19
|
+
def initialize(y = 1, x = 1)
|
20
|
+
@y = y
|
21
|
+
@x = x
|
16
22
|
end
|
17
23
|
|
18
24
|
# Returns an escape sequence to position the cursor. When passed a block,
|
@@ -33,28 +39,37 @@ module Vedeu
|
|
33
39
|
private
|
34
40
|
|
35
41
|
# Returns the escape sequence to reposition the cursors at the coordinates
|
36
|
-
# specified by x and y.
|
37
|
-
# as ANSI terminals do not have a 0, 0 coordinate.
|
42
|
+
# specified by x and y.
|
38
43
|
#
|
39
44
|
# @return [String]
|
40
45
|
def sequence
|
41
|
-
["\e[",
|
46
|
+
["\e[", y, ';', x, 'H'].join
|
42
47
|
end
|
43
48
|
|
44
|
-
# Returns the y coordinate.
|
45
|
-
# Offset.
|
49
|
+
# Returns the y coordinate.
|
46
50
|
#
|
47
51
|
# @return [Fixnum]
|
48
52
|
def y
|
49
|
-
|
53
|
+
if @y < 1 || @y.nil?
|
54
|
+
1
|
55
|
+
|
56
|
+
else
|
57
|
+
@y
|
58
|
+
|
59
|
+
end
|
50
60
|
end
|
51
61
|
|
52
|
-
# Returns the x coordinate.
|
53
|
-
# Offset.
|
62
|
+
# Returns the x coordinate.
|
54
63
|
#
|
55
64
|
# @return [Fixnum]
|
56
65
|
def x
|
57
|
-
|
66
|
+
if @x < 1 || @x.nil?
|
67
|
+
1
|
68
|
+
|
69
|
+
else
|
70
|
+
@x
|
71
|
+
|
72
|
+
end
|
58
73
|
end
|
59
74
|
|
60
75
|
end # Position
|
@@ -0,0 +1,79 @@
|
|
1
|
+
module Vedeu
|
2
|
+
|
3
|
+
class PositionValidator
|
4
|
+
|
5
|
+
extend Forwardable
|
6
|
+
|
7
|
+
def_delegators Vedeu::Terminal,
|
8
|
+
:tx,
|
9
|
+
:ty,
|
10
|
+
:txn,
|
11
|
+
:tyn
|
12
|
+
|
13
|
+
def_delegators :interface,
|
14
|
+
:border?,
|
15
|
+
:border,
|
16
|
+
:geometry
|
17
|
+
|
18
|
+
def_delegators :border,
|
19
|
+
:left?,
|
20
|
+
:right?,
|
21
|
+
:top?,
|
22
|
+
:bottom?
|
23
|
+
|
24
|
+
def_delegators :geometry,
|
25
|
+
:left,
|
26
|
+
:right,
|
27
|
+
:top,
|
28
|
+
:bottom
|
29
|
+
|
30
|
+
attr_accessor :x, :y
|
31
|
+
|
32
|
+
def self.validate(interface, x, y)
|
33
|
+
new(interface, x, y).validate
|
34
|
+
end
|
35
|
+
|
36
|
+
def initialize(interface, x, y)
|
37
|
+
@interface = interface
|
38
|
+
@x = x
|
39
|
+
@y = y
|
40
|
+
end
|
41
|
+
|
42
|
+
def validate
|
43
|
+
terminal_validation
|
44
|
+
interface_validation
|
45
|
+
border_validation
|
46
|
+
|
47
|
+
self
|
48
|
+
end
|
49
|
+
|
50
|
+
private
|
51
|
+
|
52
|
+
attr_reader :interface
|
53
|
+
|
54
|
+
def terminal_validation
|
55
|
+
@x = tx if x < tx
|
56
|
+
@x = txn if x > txn
|
57
|
+
@y = ty if y < ty
|
58
|
+
@y = tyn if y > tyn
|
59
|
+
end
|
60
|
+
|
61
|
+
def interface_validation
|
62
|
+
@x = left if x < left
|
63
|
+
@x = right if x > right
|
64
|
+
@y = top if y < top
|
65
|
+
@y = bottom if y > bottom
|
66
|
+
end
|
67
|
+
|
68
|
+
def border_validation
|
69
|
+
if border?
|
70
|
+
@x = left + 1 if left? && x < (left + 1)
|
71
|
+
@x = right - 2 if right? && x > (right - 1)
|
72
|
+
@y = top + 1 if top? && y < (top + 1)
|
73
|
+
@y = bottom - 2 if bottom? && y > (bottom - 1)
|
74
|
+
end
|
75
|
+
end
|
76
|
+
|
77
|
+
end # PositionValidator
|
78
|
+
|
79
|
+
end # Vedeu
|
@@ -0,0 +1,65 @@
|
|
1
|
+
module Vedeu
|
2
|
+
|
3
|
+
# The basis of a fake input device.
|
4
|
+
class Read
|
5
|
+
|
6
|
+
# @param console []
|
7
|
+
# @param data [String|NilClass]
|
8
|
+
# @return [String]
|
9
|
+
def self.from(console, data = nil)
|
10
|
+
new(console, data).read
|
11
|
+
end
|
12
|
+
|
13
|
+
# @param console []
|
14
|
+
# @param data [String|NilClass]
|
15
|
+
# @return [Vedeu::Read]
|
16
|
+
def initialize(console, data = nil)
|
17
|
+
@console = console
|
18
|
+
@data = data
|
19
|
+
end
|
20
|
+
|
21
|
+
# Provides IO.console emulation of #getch.
|
22
|
+
#
|
23
|
+
# @return [String]
|
24
|
+
def getch(string = nil)
|
25
|
+
@data = string[0] unless string.nil?
|
26
|
+
|
27
|
+
read
|
28
|
+
end
|
29
|
+
|
30
|
+
# Provides IO.console emulation of #gets.
|
31
|
+
#
|
32
|
+
# @return [String]
|
33
|
+
def gets(string = nil)
|
34
|
+
@data = string.chomp unless string.nil?
|
35
|
+
|
36
|
+
read
|
37
|
+
end
|
38
|
+
|
39
|
+
# Provides IO.console emulation of #read_nonblock.
|
40
|
+
#
|
41
|
+
# @return [String]
|
42
|
+
def read_nonblock(bytes = 1, string = nil)
|
43
|
+
@data = string unless string.nil?
|
44
|
+
|
45
|
+
read
|
46
|
+
end
|
47
|
+
|
48
|
+
# @return [String]
|
49
|
+
def read
|
50
|
+
if data
|
51
|
+
data
|
52
|
+
|
53
|
+
else
|
54
|
+
''
|
55
|
+
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
private
|
60
|
+
|
61
|
+
attr_reader :console, :data
|
62
|
+
|
63
|
+
end # Read
|
64
|
+
|
65
|
+
end # Vedeu
|
@@ -5,21 +5,20 @@ module Vedeu
|
|
5
5
|
# @api private
|
6
6
|
module Refresh
|
7
7
|
|
8
|
-
include Common
|
9
8
|
extend self
|
10
9
|
|
11
10
|
# Refresh all registered interfaces.
|
12
11
|
#
|
13
12
|
# @return [Array]
|
14
13
|
def all
|
15
|
-
Vedeu
|
14
|
+
Vedeu.interfaces.registered.each { |name| by_name(name) }
|
16
15
|
end
|
17
16
|
|
18
17
|
# Refresh the interface which is currently focussed.
|
19
18
|
#
|
20
|
-
# @return [|
|
19
|
+
# @return [|NilClass]
|
21
20
|
def by_focus
|
22
|
-
by_name(
|
21
|
+
by_name(Vedeu.focus) if Vedeu.focus
|
23
22
|
end
|
24
23
|
|
25
24
|
# Refresh an interface, or collection of interfaces belonging to a group.
|
@@ -28,7 +27,9 @@ module Vedeu
|
|
28
27
|
# @return [Array|ModelNotFound] A collection of the names of interfaces
|
29
28
|
# refreshed, or an exception if the group was not found.
|
30
29
|
def by_group(group_name)
|
31
|
-
|
30
|
+
Vedeu.log("Refreshing group: '#{group_name}'")
|
31
|
+
|
32
|
+
Vedeu.groups.find(group_name).members.each { |name| by_name(name) }
|
32
33
|
end
|
33
34
|
|
34
35
|
# Refresh an interface by name.
|
@@ -37,34 +38,9 @@ module Vedeu
|
|
37
38
|
# named buffer.
|
38
39
|
# @return [Array|ModelNotFound]
|
39
40
|
def by_name(name)
|
40
|
-
interface
|
41
|
-
buffer = Buffers.find(name)
|
42
|
-
|
43
|
-
Compositor.compose(interface, buffer)
|
44
|
-
end
|
45
|
-
|
46
|
-
# Register a refresh event for an interface or group of interfaces by name.
|
47
|
-
# When the event is called, the interface, or all interfaces belonging to
|
48
|
-
# the group with this name will be refreshed.
|
49
|
-
#
|
50
|
-
# @param type [Symbol]
|
51
|
-
# @param name [String]
|
52
|
-
# @param delay [Float]
|
53
|
-
# @return [Boolean]
|
54
|
-
def register_event(type, name, delay = 0.0)
|
55
|
-
event = if type == :by_group
|
56
|
-
"_refresh_group_#{name}_".to_sym
|
57
|
-
|
58
|
-
else
|
59
|
-
"_refresh_#{name}_".to_sym
|
60
|
-
|
61
|
-
end
|
62
|
-
|
63
|
-
return false if Events.registered?(event)
|
64
|
-
|
65
|
-
Events.add(event, { delay: delay }) { Refresh.send(type, name) }
|
41
|
+
Vedeu.log("Refreshing interface: '#{name}'")
|
66
42
|
|
67
|
-
|
43
|
+
Vedeu::Compositor.compose(name)
|
68
44
|
end
|
69
45
|
|
70
46
|
end # Refresh
|
@@ -1,3 +1,8 @@
|
|
1
|
+
require 'vedeu/configuration/configuration'
|
2
|
+
require 'vedeu/support/common'
|
3
|
+
require 'vedeu/support/esc'
|
4
|
+
require 'vedeu/support/log'
|
5
|
+
|
1
6
|
module Vedeu
|
2
7
|
|
3
8
|
# This module is the direct interface between Vedeu and your terminal/
|
@@ -6,16 +11,17 @@ module Vedeu
|
|
6
11
|
# @api private
|
7
12
|
module Terminal
|
8
13
|
|
14
|
+
include Vedeu::Common
|
9
15
|
extend self
|
10
16
|
|
11
17
|
# Opens a terminal screen in either `raw` or `cooked` mode. On exit,
|
12
18
|
# attempts to restore the screen. See {Vedeu::Terminal#restore_screen}.
|
13
19
|
#
|
14
20
|
# @param block [Proc]
|
15
|
-
# @raise [InvalidSyntax]
|
21
|
+
# @raise [InvalidSyntax] The required block was not given.
|
16
22
|
# @return [Array]
|
17
23
|
def open(&block)
|
18
|
-
fail InvalidSyntax, '
|
24
|
+
fail InvalidSyntax, 'block not given' unless block_given?
|
19
25
|
|
20
26
|
if raw_mode?
|
21
27
|
Vedeu.log("Terminal entering 'raw' mode")
|
@@ -58,10 +64,30 @@ module Vedeu
|
|
58
64
|
# @param streams [String|Array]
|
59
65
|
# @return [Array]
|
60
66
|
def output(*streams)
|
61
|
-
streams.each
|
67
|
+
streams.each do |stream|
|
68
|
+
# Vedeu.log(Esc.escape(stream))
|
69
|
+
|
70
|
+
console.print(stream)
|
71
|
+
|
72
|
+
# Vedeu::Console.write(stream)
|
73
|
+
end
|
62
74
|
|
63
75
|
streams
|
64
76
|
end
|
77
|
+
alias_method :write, :output
|
78
|
+
|
79
|
+
# When the terminal emit the 'SIGWINCH' signal, Vedeu can intercept this
|
80
|
+
# and attempt to redraw the current interface with varying degrees of
|
81
|
+
# success. Can also be used to simulate a terminal resize.
|
82
|
+
#
|
83
|
+
# @return [TrueClass]
|
84
|
+
def resize
|
85
|
+
Vedeu.trigger(:_clear_)
|
86
|
+
|
87
|
+
Vedeu.trigger(:_refresh_)
|
88
|
+
|
89
|
+
true
|
90
|
+
end
|
65
91
|
|
66
92
|
# @param block [Proc]
|
67
93
|
# @return []
|
@@ -74,7 +100,7 @@ module Vedeu
|
|
74
100
|
# Clears the entire terminal space.
|
75
101
|
#
|
76
102
|
# @return [String]
|
77
|
-
def
|
103
|
+
def clear
|
78
104
|
output(Esc.string('clear'))
|
79
105
|
end
|
80
106
|
|
@@ -180,6 +206,8 @@ module Vedeu
|
|
180
206
|
end
|
181
207
|
alias_method :x, :origin
|
182
208
|
alias_method :y, :origin
|
209
|
+
alias_method :tx, :origin
|
210
|
+
alias_method :ty, :origin
|
183
211
|
|
184
212
|
# Returns the total width (number of columns/characters) of the current
|
185
213
|
# terminal.
|
@@ -192,6 +220,7 @@ module Vedeu
|
|
192
220
|
size.last
|
193
221
|
end
|
194
222
|
alias_method :xn, :width
|
223
|
+
alias_method :txn, :width
|
195
224
|
|
196
225
|
# Returns the total height (number of rows/lines) of the current terminal.
|
197
226
|
#
|
@@ -203,6 +232,7 @@ module Vedeu
|
|
203
232
|
size.first
|
204
233
|
end
|
205
234
|
alias_method :yn, :height
|
235
|
+
alias_method :tyn, :height
|
206
236
|
|
207
237
|
# Returns a tuple containing the height and width of the current terminal.
|
208
238
|
#
|
@@ -0,0 +1,104 @@
|
|
1
|
+
module Vedeu
|
2
|
+
|
3
|
+
# Present a string (or object responding to `to_s`).
|
4
|
+
#
|
5
|
+
class Text
|
6
|
+
|
7
|
+
# @see Vedeu::DSL::Text#text
|
8
|
+
def self.with(value = '', options = {})
|
9
|
+
new(value, options).aligned
|
10
|
+
end
|
11
|
+
|
12
|
+
# Returns a new instance of Text.
|
13
|
+
#
|
14
|
+
# @param value [String]
|
15
|
+
# @param options [Hash]
|
16
|
+
# @option options width [Integer]
|
17
|
+
# @option options anchor [Symbol] See {Text#anchor}
|
18
|
+
# @option options pad [String]
|
19
|
+
# @return [Text]
|
20
|
+
def initialize(value = '', options = {})
|
21
|
+
@value = value
|
22
|
+
@options = defaults.merge(options)
|
23
|
+
end
|
24
|
+
|
25
|
+
# Aligns the value.
|
26
|
+
#
|
27
|
+
# @return [String]
|
28
|
+
def aligned
|
29
|
+
return string unless width
|
30
|
+
|
31
|
+
return truncated if truncate?
|
32
|
+
|
33
|
+
case anchor
|
34
|
+
when :align, :left, :text then left
|
35
|
+
when :centre, :center then centre
|
36
|
+
when :right then right
|
37
|
+
else
|
38
|
+
left
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
private
|
43
|
+
|
44
|
+
attr_reader :value, :options
|
45
|
+
|
46
|
+
# @return [Symbol] One of :align, :centre, :center, :left, :right, :text
|
47
|
+
def anchor
|
48
|
+
options[:anchor]
|
49
|
+
end
|
50
|
+
|
51
|
+
# @return [String]
|
52
|
+
def centre
|
53
|
+
string.center(width, pad)
|
54
|
+
end
|
55
|
+
|
56
|
+
# The default values for a new instance of this class.
|
57
|
+
#
|
58
|
+
# @return [Hash]
|
59
|
+
def defaults
|
60
|
+
{
|
61
|
+
anchor: :left,
|
62
|
+
pad: ' ',
|
63
|
+
width: nil,
|
64
|
+
}
|
65
|
+
end
|
66
|
+
|
67
|
+
# @return [String]
|
68
|
+
def left
|
69
|
+
string.ljust(width, pad)
|
70
|
+
end
|
71
|
+
|
72
|
+
# @return [String]
|
73
|
+
def pad
|
74
|
+
options[:pad]
|
75
|
+
end
|
76
|
+
|
77
|
+
# @return [String]
|
78
|
+
def right
|
79
|
+
string.rjust(width, pad)
|
80
|
+
end
|
81
|
+
|
82
|
+
# @return [String]
|
83
|
+
def string
|
84
|
+
value.to_s
|
85
|
+
end
|
86
|
+
|
87
|
+
# @return [Boolean]
|
88
|
+
def truncate?
|
89
|
+
string.size > width
|
90
|
+
end
|
91
|
+
|
92
|
+
# @return [String]
|
93
|
+
def truncated
|
94
|
+
string.slice(0, width)
|
95
|
+
end
|
96
|
+
|
97
|
+
# @return [Fixnum]
|
98
|
+
def width
|
99
|
+
options[:width]
|
100
|
+
end
|
101
|
+
|
102
|
+
end # Align
|
103
|
+
|
104
|
+
end # Vedeu
|
data/lib/vedeu/support/trace.rb
CHANGED
@@ -1,3 +1,7 @@
|
|
1
|
+
require 'vedeu/configuration/configuration'
|
2
|
+
require 'vedeu/support/esc'
|
3
|
+
require 'vedeu/support/log'
|
4
|
+
|
1
5
|
module Vedeu
|
2
6
|
|
3
7
|
# This class currently provides the means to trace each method call which
|
@@ -28,7 +32,7 @@ module Vedeu
|
|
28
32
|
#
|
29
33
|
# @todo Deprecate, and use TracePoint instead.
|
30
34
|
#
|
31
|
-
# @return []
|
35
|
+
# @return [NilClass|String]
|
32
36
|
def trace
|
33
37
|
set_trace_func proc { |event, _file, _line, id, binding, classname|
|
34
38
|
if event == watched && id != :log && classes.include?(classname.to_s)
|
@@ -52,9 +56,11 @@ module Vedeu
|
|
52
56
|
# Writes the message to the log file.
|
53
57
|
#
|
54
58
|
# @param message [String]
|
55
|
-
# @return [
|
59
|
+
# @return [String]
|
56
60
|
def log_this(message)
|
57
61
|
Vedeu::Log.logger.debug(message)
|
62
|
+
|
63
|
+
message
|
58
64
|
end
|
59
65
|
|
60
66
|
# Provides inspection of the local variables set within the method being
|
@@ -96,6 +102,8 @@ module Vedeu
|
|
96
102
|
defaults.merge(@options)
|
97
103
|
end
|
98
104
|
|
105
|
+
# The default values for a new instance of this class.
|
106
|
+
#
|
99
107
|
# @return [Hash]
|
100
108
|
def defaults
|
101
109
|
{
|
@@ -145,16 +153,7 @@ module Vedeu
|
|
145
153
|
#
|
146
154
|
# @return [Set]
|
147
155
|
def vedeu_exceptions
|
148
|
-
|
149
|
-
'Vedeu::ModelNotFound',
|
150
|
-
'Vedeu::InvalidSyntax',
|
151
|
-
'Vedeu::KeyInUse',
|
152
|
-
'Vedeu::MissingRequired',
|
153
|
-
'Vedeu::ModeSwitch',
|
154
|
-
'Vedeu::NoInterfacesDefined',
|
155
|
-
'Vedeu::NotImplemented',
|
156
|
-
'Vedeu::OutOfRange',
|
157
|
-
]
|
156
|
+
Vedeu::Exceptions.to_set
|
158
157
|
end
|
159
158
|
|
160
159
|
# Returns a set of classes to ignore during tracing.
|
@@ -167,8 +166,6 @@ module Vedeu
|
|
167
166
|
# 'Vedeu::API',
|
168
167
|
# 'Vedeu::Application',
|
169
168
|
# 'Vedeu::Background',
|
170
|
-
# 'Vedeu::Buffers',
|
171
|
-
# 'Vedeu::Clear',
|
172
169
|
'Vedeu::Coercions',
|
173
170
|
'Vedeu::Colour',
|
174
171
|
'Vedeu::Translator',
|
@@ -180,30 +177,21 @@ module Vedeu
|
|
180
177
|
# 'Vedeu::Cursors',
|
181
178
|
'Vedeu::Esc',
|
182
179
|
'Vedeu::Event',
|
183
|
-
# 'Vedeu::Events',
|
184
180
|
# 'Vedeu::Focus',
|
185
181
|
# 'Vedeu::Foreground',
|
186
182
|
'Vedeu::Geometry',
|
187
183
|
# 'Vedeu::Grid',
|
188
|
-
# 'Vedeu::Groups',
|
189
184
|
# 'Vedeu::Input',
|
190
185
|
# 'Vedeu::Interface',
|
191
|
-
# 'Vedeu::Interfaces',
|
192
186
|
# 'Vedeu::Keymap',
|
193
|
-
# 'Vedeu::Keymaps',
|
194
|
-
# 'Vedeu::KeymapValidator',
|
195
187
|
# 'Vedeu::Launcher',
|
196
188
|
# 'Vedeu::Line',
|
197
189
|
'Vedeu::Log',
|
198
190
|
# 'Vedeu::Menu',
|
199
191
|
# 'Vedeu::Menus',
|
200
|
-
'Vedeu::MonoLogger',
|
201
|
-
# 'Vedeu::Offset',
|
202
|
-
# 'Vedeu::Offsets',
|
203
192
|
'Vedeu::Position',
|
204
193
|
'Vedeu::Presentation',
|
205
194
|
# 'Vedeu::Refresh',
|
206
|
-
# 'Vedeu::Registrar',
|
207
195
|
# 'Vedeu::Render',
|
208
196
|
'Vedeu::Repository',
|
209
197
|
'Vedeu::Stream',
|