vedeu 0.2.10 → 0.2.11

Sign up to get free protection for your applications and to get access to all the features.
Files changed (105) hide show
  1. checksums.yaml +4 -4
  2. data/docs/events.md +6 -0
  3. data/examples/{cursor_app/cursor_app.rb → cursor_app.rb} +1 -1
  4. data/examples/{lines_app/lines_app.rb → lines_app.rb} +1 -1
  5. data/lib/vedeu.rb +48 -28
  6. data/lib/vedeu/api/api.rb +8 -95
  7. data/lib/vedeu/application.rb +6 -2
  8. data/lib/vedeu/{models → colours}/background.rb +1 -1
  9. data/lib/vedeu/{models → colours}/colour.rb +0 -0
  10. data/lib/vedeu/{models → colours}/foreground.rb +2 -2
  11. data/lib/vedeu/{support/colour_translator.rb → colours/translator.rb} +7 -7
  12. data/lib/vedeu/input/input.rb +13 -5
  13. data/lib/vedeu/models/geometry.rb +30 -2
  14. data/lib/vedeu/models/key.rb +39 -0
  15. data/lib/vedeu/output/compositor.rb +30 -76
  16. data/lib/vedeu/output/output.rb +74 -0
  17. data/lib/vedeu/output/viewport.rb +36 -44
  18. data/lib/vedeu/repositories/buffers.rb +5 -18
  19. data/lib/vedeu/repositories/cursors.rb +16 -8
  20. data/lib/vedeu/repositories/events.rb +96 -9
  21. data/lib/vedeu/repositories/focus.rb +21 -20
  22. data/lib/vedeu/repositories/groups.rb +3 -11
  23. data/lib/vedeu/repositories/interfaces.rb +6 -9
  24. data/lib/vedeu/repositories/keymaps.rb +8 -3
  25. data/lib/vedeu/repositories/menus.rb +6 -21
  26. data/lib/vedeu/{models → repositories/models}/buffer.rb +62 -28
  27. data/lib/vedeu/{models → repositories/models}/cursor.rb +8 -2
  28. data/lib/vedeu/{models → repositories/models}/event.rb +7 -0
  29. data/lib/vedeu/repositories/models/group.rb +56 -0
  30. data/lib/vedeu/{models → repositories/models}/interface.rb +6 -0
  31. data/lib/vedeu/{models → repositories/models}/keymap.rb +7 -1
  32. data/lib/vedeu/{models → repositories/models}/menu.rb +9 -0
  33. data/lib/vedeu/{models → repositories/models}/offset.rb +8 -1
  34. data/lib/vedeu/repositories/offsets.rb +17 -12
  35. data/lib/vedeu/support/bounding_area.rb +127 -0
  36. data/lib/vedeu/support/common.rb +8 -0
  37. data/lib/vedeu/support/exceptions.rb +2 -12
  38. data/lib/vedeu/support/model.rb +14 -0
  39. data/lib/vedeu/support/refresh.rb +8 -7
  40. data/lib/vedeu/support/registrar.rb +7 -1
  41. data/lib/vedeu/support/repository.rb +31 -10
  42. data/lib/vedeu/support/sentence.rb +67 -0
  43. data/lib/vedeu/support/terminal.rb +19 -0
  44. data/lib/vedeu/support/trace.rb +2 -5
  45. data/test/integration/api/api_test.rb +97 -0
  46. data/test/integration/api_dsl/dsl_api_test.rb +4 -0
  47. data/test/integration/api_dsl/dsl_composition_test.rb +4 -0
  48. data/test/integration/api_dsl/dsl_defined_test.rb +4 -0
  49. data/test/integration/api_dsl/dsl_helpers_test.rb +4 -0
  50. data/test/integration/api_dsl/dsl_interface_test.rb +4 -0
  51. data/test/integration/api_dsl/dsl_keymap.rb +4 -0
  52. data/test/integration/api_dsl/dsl_line_test.rb +4 -0
  53. data/test/integration/api_dsl/dsl_menu_test.rb +4 -0
  54. data/test/integration/api_dsl/dsl_stream_test.rb +138 -0
  55. data/test/lib/vedeu/api/api_test.rb +1 -25
  56. data/test/lib/vedeu/api/helpers_test.rb +0 -10
  57. data/test/lib/vedeu/{models → colours}/background_test.rb +0 -0
  58. data/test/lib/vedeu/{models → colours}/colour_test.rb +0 -0
  59. data/test/lib/vedeu/{models → colours}/foreground_test.rb +0 -0
  60. data/test/lib/vedeu/{support/colour_translator_test.rb → colours/translator_test.rb} +3 -3
  61. data/test/lib/vedeu/input/input_test.rb +16 -47
  62. data/test/lib/vedeu/models/geometry_test.rb +46 -0
  63. data/test/lib/vedeu/models/group_test.rb +99 -0
  64. data/test/lib/vedeu/models/key_test.rb +41 -0
  65. data/test/lib/vedeu/output/compositor_test.rb +25 -101
  66. data/test/lib/vedeu/output/output_test.rb +108 -0
  67. data/test/lib/vedeu/repositories/buffers_test.rb +0 -8
  68. data/test/lib/vedeu/repositories/cursors_test.rb +34 -0
  69. data/test/lib/vedeu/repositories/focus_test.rb +37 -28
  70. data/test/lib/vedeu/repositories/interfaces_test.rb +1 -1
  71. data/test/lib/vedeu/repositories/keymaps_test.rb +6 -20
  72. data/test/lib/vedeu/repositories/menus_test.rb +0 -6
  73. data/test/lib/vedeu/{models → repositories/models}/buffer_test.rb +24 -27
  74. data/test/lib/vedeu/{models → repositories/models}/cursor_test.rb +0 -0
  75. data/test/lib/vedeu/{models → repositories/models}/event_test.rb +0 -0
  76. data/test/lib/vedeu/{models → repositories/models}/interface_test.rb +0 -0
  77. data/test/lib/vedeu/{models → repositories/models}/keymap_test.rb +0 -0
  78. data/test/lib/vedeu/{models → repositories/models}/menu_test.rb +0 -0
  79. data/test/lib/vedeu/{models → repositories/models}/offset_test.rb +0 -0
  80. data/test/lib/vedeu/support/bounding_area_test.rb +139 -0
  81. data/test/lib/vedeu/support/coercions_test.rb +6 -17
  82. data/test/lib/vedeu/support/grid_test.rb +1 -1
  83. data/test/lib/vedeu/support/model_test.rb +23 -0
  84. data/test/lib/vedeu/support/presentation_test.rb +0 -10
  85. data/test/lib/vedeu/support/refresh_test.rb +2 -2
  86. data/test/lib/vedeu/support/repository_test.rb +63 -64
  87. data/test/lib/vedeu/support/sentence_test.rb +48 -0
  88. data/test/lib/vedeu/support/terminal_test.rb +86 -6
  89. data/test/support/test_classes/all.rb +5 -0
  90. data/test/support/test_classes/coercions.rb +16 -0
  91. data/test/support/test_classes/helpers.rb +19 -0
  92. data/test/support/test_classes/model.rb +23 -0
  93. data/test/support/test_classes/presentation.rb +16 -0
  94. data/test/support/test_classes/repositories.rb +26 -0
  95. data/test/support/test_modules/all.rb +1 -0
  96. data/test/support/test_modules/repository.rb +16 -0
  97. data/test/test_helper.rb +4 -0
  98. data/vedeu.gemspec +3 -3
  99. metadata +95 -50
  100. data/lib/vedeu/output/clear.rb +0 -88
  101. data/lib/vedeu/output/render.rb +0 -50
  102. data/lib/vedeu/repositories/positional.rb +0 -23
  103. data/test/lib/vedeu/output/clear_test.rb +0 -56
  104. data/test/lib/vedeu/output/render_test.rb +0 -100
  105. data/test/lib/vedeu/repositories/positional_test.rb +0 -50
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: bff39cd80bb0bca7448d6cf083f2115665e55054
4
- data.tar.gz: 93bc4d77d71b14632868a4389f150c7a48b15e31
3
+ metadata.gz: f2e18e1de7f428b1890aacc71abffae0ea935431
4
+ data.tar.gz: 3c32f191ff6dfead712551de9c4375261d46dc54
5
5
  SHA512:
6
- metadata.gz: 8c51486199b28763e4fee45eb2dcf7404bc4cd35c308237ad475dbd051d2ddbe826b8d3201e2abe5716eb24149cb14ffcde30512f0732c89e4c10d604d49146b
7
- data.tar.gz: 1b4d18498d51ed6653501b017ecefd09e42daaaffd797c3e5a6f66ee204784938de563df224700624ffd22a786396c81c65e62c27365680f77eadec734383e2b
6
+ metadata.gz: 5b2dc0ebd0bfa591774ead8d58fdd090ca80152619545226230a02d72c2b9a0f991aa0813eec3bffeee38070091cedfce8a0e6df2648a8a740ffe6589bfe6c18
7
+ data.tar.gz: a785503d6086eaa2b8a4d1c4aa882f99d03ff4a791c42828fef352e053d0f146b67b4b6fa0e6bb2f9f87b46be82d8e1c42100e4d64c6d059263cff3cd9d9c01a
data/docs/events.md CHANGED
@@ -156,6 +156,12 @@ applications can listen for this event and perform some action(s), like render
156
156
  the first screen, interface or make a sound. When Vedeu triggers this event,
157
157
  the :_refresh_ event is also triggered automatically.
158
158
 
159
+ ### `:_tick_`
160
+
161
+ Each time Vedeu completes one cycle in the application loop
162
+ (Application#run_many), it triggers the `:_tick_` event. This can be used by the
163
+ client application for timing amongst other things.
164
+
159
165
  #### How to define user events
160
166
 
161
167
  ```ruby
@@ -1,6 +1,6 @@
1
1
  #!/usr/bin/env ruby
2
2
 
3
- lib_dir = File.dirname(__FILE__) + '/../../lib'
3
+ lib_dir = File.dirname(__FILE__) + '/../lib'
4
4
  $LOAD_PATH.unshift(lib_dir) unless $LOAD_PATH.include?(lib_dir)
5
5
 
6
6
  -> { its -> { a } }
@@ -1,6 +1,6 @@
1
1
  #!/usr/bin/env ruby
2
2
 
3
- lib_dir = File.dirname(__FILE__) + '/../../lib'
3
+ lib_dir = File.dirname(__FILE__) + '/../lib'
4
4
  $LOAD_PATH.unshift(lib_dir) unless $LOAD_PATH.include?(lib_dir)
5
5
 
6
6
  -> { its -> { a } }
data/lib/vedeu.rb CHANGED
@@ -15,6 +15,21 @@ module Vedeu
15
15
  receiver.extend(API)
16
16
  end
17
17
 
18
+ # Write a message to the Vedeu log file.
19
+ #
20
+ # @param message [String] The message you wish to emit to the log
21
+ # file, useful for debugging.
22
+ # @param force [Boolean] When evaluates to true will attempt to
23
+ # write to the log file regardless of the Configuration setting.
24
+ #
25
+ # @example
26
+ # Vedeu.log('A useful debugging message: Error!')
27
+ #
28
+ # @return [TrueClass]
29
+ def self.log(message, force = false)
30
+ Vedeu::Log.logger.debug(message) if Configuration.debug? || force
31
+ end
32
+
18
33
  end # Vedeu
19
34
 
20
35
  $LIB_DIR = File.dirname(__FILE__) + '/../lib'
@@ -29,8 +44,10 @@ require 'set'
29
44
  require 'singleton'
30
45
  require 'time'
31
46
 
32
- require 'vedeu/support/exceptions'
33
47
  require 'vedeu/support/common'
48
+ require 'vedeu/support/exceptions'
49
+ require 'vedeu/support/model'
50
+
34
51
  require 'vedeu/configuration/cli'
35
52
  require 'vedeu/configuration/api'
36
53
  require 'vedeu/configuration/configuration'
@@ -38,36 +55,36 @@ require 'vedeu/configuration/configuration'
38
55
  require 'vedeu/support/log'
39
56
  require 'vedeu/support/trace'
40
57
 
41
- require 'vedeu/models/keymap'
58
+ require 'vedeu/support/repository'
59
+ require 'vedeu/repositories/models/event'
60
+ require 'vedeu/repositories/events'
61
+ require 'vedeu/repositories/keymaps'
62
+ require 'vedeu/repositories/models/keymap'
42
63
  require 'vedeu/api/keymap'
43
64
  require 'vedeu/api/api'
44
65
 
45
- require 'vedeu/support/coercions'
46
- require 'vedeu/support/colour_translator'
47
- require 'vedeu/models/background'
48
- require 'vedeu/models/foreground'
49
- require 'vedeu/support/presentation'
50
- require 'vedeu/models/composition'
66
+ require 'vedeu/colours/translator'
67
+ require 'vedeu/colours/background'
68
+ require 'vedeu/colours/foreground'
69
+ require 'vedeu/colours/colour'
51
70
 
52
- require 'vedeu/support/repository'
53
- require 'vedeu/support/position'
71
+ require 'vedeu/support/coercions'
54
72
  require 'vedeu/support/esc'
73
+ require 'vedeu/support/position'
74
+ require 'vedeu/support/presentation'
75
+ require 'vedeu/support/sentence'
55
76
  require 'vedeu/support/terminal'
56
77
 
57
- require 'vedeu/models/buffer'
58
78
  require 'vedeu/models/char'
59
- require 'vedeu/models/colour'
60
- require 'vedeu/models/cursor'
61
- require 'vedeu/models/event'
79
+ require 'vedeu/models/composition'
62
80
  require 'vedeu/models/geometry'
63
- require 'vedeu/models/interface'
81
+ require 'vedeu/models/key'
64
82
  require 'vedeu/models/line'
65
- require 'vedeu/models/menu'
66
- require 'vedeu/models/offset'
67
83
  require 'vedeu/models/stream'
68
84
  require 'vedeu/models/style'
69
85
 
70
- require 'vedeu/repositories/events'
86
+ require 'vedeu/repositories/models/interface'
87
+ require 'vedeu/repositories/interfaces'
71
88
 
72
89
  require 'vedeu/api/defined'
73
90
  require 'vedeu/api/composition'
@@ -77,27 +94,30 @@ require 'vedeu/api/line'
77
94
  require 'vedeu/api/menu'
78
95
  require 'vedeu/api/stream'
79
96
 
97
+ require 'vedeu/repositories/models/buffer'
98
+ require 'vedeu/repositories/models/cursor'
99
+ require 'vedeu/repositories/models/group'
100
+ require 'vedeu/repositories/models/menu'
101
+ require 'vedeu/repositories/models/offset'
102
+
80
103
  require 'vedeu/support/keymap_validator'
81
- require 'vedeu/repositories/positional'
82
- require 'vedeu/repositories/offsets'
83
- require 'vedeu/repositories/menus'
84
- require 'vedeu/repositories/keymaps'
85
- require 'vedeu/repositories/interfaces'
86
- require 'vedeu/repositories/groups'
87
- require 'vedeu/repositories/focus'
88
- require 'vedeu/repositories/events'
104
+
89
105
  require 'vedeu/repositories/buffers'
90
106
  require 'vedeu/repositories/cursors'
107
+ require 'vedeu/repositories/focus'
108
+ require 'vedeu/repositories/groups'
109
+ require 'vedeu/repositories/menus'
110
+ require 'vedeu/repositories/offsets'
91
111
 
92
112
  require 'vedeu/support/registrar'
93
113
  require 'vedeu/support/refresh'
94
114
 
95
- require 'vedeu/output/clear'
96
115
  require 'vedeu/output/compositor'
97
- require 'vedeu/output/render'
116
+ require 'vedeu/output/output'
98
117
  require 'vedeu/output/view'
99
118
  require 'vedeu/output/viewport'
100
119
 
120
+ require 'vedeu/support/bounding_area'
101
121
  require 'vedeu/support/grid'
102
122
 
103
123
  require 'vedeu/input/input'
data/lib/vedeu/api/api.rb CHANGED
@@ -1,3 +1,5 @@
1
+ require 'vedeu/support/terminal'
2
+
1
3
  module Vedeu
2
4
 
3
5
  # Provides the API to Vedeu. Methods therein, and classes belonging to this
@@ -8,7 +10,11 @@ module Vedeu
8
10
 
9
11
  extend Forwardable
10
12
 
11
- def_delegators Keymap, :keys
13
+ # @see Vedeu::Events#add
14
+ def_delegators Events, :event
15
+ def_delegators Keymap, :keys
16
+ def_delegators Keymaps, :keypress
17
+ def_delegators Vedeu::Terminal, :height, :width
12
18
 
13
19
  # Configure Vedeu using a simple configuration DSL.
14
20
  #
@@ -31,72 +37,16 @@ module Vedeu
31
37
  Vedeu::API::Defined
32
38
  end
33
39
 
34
- # Register an event by name with optional delay (throttling) which when
35
- # triggered will execute the code contained within the passed block.
36
- #
37
- # @param name [Symbol] The name of the event which will be triggered later.
38
- # @param [Hash] opts The options to register the event with.
39
- # @option opts :delay [Fixnum|Float] Limits the execution of the
40
- # triggered event to only execute when first triggered, with subsequent
41
- # triggering being ignored until the delay has expired.
42
- # @option opts :debounce [Fixnum|Float] Limits the execution of the
43
- # triggered event to only execute once the debounce has expired.
44
- # Subsequent triggers before debounce expiry are ignored.
45
- # @param block [Proc] The event to be executed when triggered. This block
46
- # could be a method call, or the triggering of another event, or sequence
47
- # of either/both.
48
- #
49
- # @example
50
- # Vedeu.event :my_event do |some, args|
51
- # ... some code here ...
52
- #
53
- # Vedeu.trigger(:my_other_event)
54
- # end
55
- #
56
- # T = Triggered, X = Executed, i = Ignored.
57
- #
58
- # 0.0.....0.2.....0.4.....0.6.....0.8.....1.0.....1.2.....1.4.....1.6...
59
- # .T...T...T...T...T...T...T...T...T...T...T...T...T...T...T...T...T...T
60
- # .X...i...i...i...i...X...i...i...i...i...X...i...i...i...i...i...i...i
61
- #
62
- # Vedeu.event(:my_delayed_event, { delay: 0.5 })
63
- # ... some code here ...
64
- # end
65
- #
66
- # T = Triggered, X = Executed, i = Ignored.
67
- #
68
- # 0.0.....0.2.....0.4.....0.6.....0.8.....1.0.....1.2.....1.4.....1.6...
69
- # .T...T...T...T...T...T...T...T...T...T...T...T...T...T...T...T...T...T
70
- # .i...i...i...i...i...i...i...X...i...i...i...i...i...i...X...i...i...i
71
- #
72
- # Vedeu.event(:my_debounced_event, { debounce: 0.7 })
73
- # ... some code here ...
74
- # end
75
- #
76
- # @return [Hash]
77
- def event(name, opts = {}, &block)
78
- Events.add(name, opts, &block)
79
- end
80
-
81
40
  # Used after defining an interface or interfaces to set the initially
82
41
  # focussed interface.
83
42
  #
84
43
  # @param name [String] The interface to focus; must be defined.
85
44
  # @return [String] The name of the interface now in focus.
86
- # @raise [InterfaceNotFound] When the interface cannot be found.
45
+ # @raise [ModelNotFound] When the interface cannot be found.
87
46
  def focus(name)
88
47
  Vedeu.trigger(:_focus_by_name_, name)
89
48
  end
90
49
 
91
- # Find out how many lines the current terminal is able to display.
92
- #
93
- # @example
94
- # Vedeu.height
95
- #
96
- # @return [Fixnum] The total height of the current terminal.
97
- def height
98
- Terminal.height
99
- end
100
50
 
101
51
  # Register an interface by name which will display output from a event or
102
52
  # command. This provides the means for you to define your application's
@@ -121,33 +71,6 @@ module Vedeu
121
71
  API::Interface.define({ name: name }, &block)
122
72
  end
123
73
 
124
- # Simulate a keypress.
125
- #
126
- # @todo Replace with: def_delegators Keymaps, :keypress
127
- #
128
- # @example
129
- # Vedeu.keypress('s')
130
- #
131
- # @see Vedeu::Keymaps.use
132
- def keypress(key)
133
- Vedeu::Keymaps.use(key)
134
- end
135
-
136
- # Write a message to the Vedeu log file.
137
- #
138
- # @param message [String] The message you wish to emit to the log
139
- # file, useful for debugging.
140
- # @param force [Boolean] When evaluates to true will attempt to
141
- # write to the log file regardless of the Configuration setting.
142
- #
143
- # @example
144
- # Vedeu.log('A useful debugging message: Error!')
145
- #
146
- # @return [TrueClass]
147
- def log(message, force = false)
148
- Vedeu::Log.logger.debug(message) if Configuration.debug? || force
149
- end
150
-
151
74
  # Register a menu by name which will display a collection of items for your
152
75
  # users to select; and provide interactivity within your application.
153
76
  #
@@ -307,16 +230,6 @@ module Vedeu
307
230
  end
308
231
  alias_method :composition, :views
309
232
 
310
- # Find out how many columns the current terminal is able to display.
311
- #
312
- # @example
313
- # Vedeu.width
314
- #
315
- # @return [Fixnum] The total width of the current terminal.
316
- def width
317
- Terminal.width
318
- end
319
-
320
233
  end # API
321
234
 
322
235
  extend API
@@ -80,7 +80,7 @@ module Vedeu
80
80
  # @return []
81
81
  def main_sequence
82
82
  if Configuration.interactive?
83
- Input.capture
83
+ Input.capture(Terminal)
84
84
 
85
85
  else
86
86
  Vedeu.trigger(:_standalone_)
@@ -94,7 +94,11 @@ module Vedeu
94
94
  #
95
95
  # @return []
96
96
  def run_many
97
- loop { yield }
97
+ loop do
98
+ Vedeu.trigger(:_tick_)
99
+ yield
100
+
101
+ end
98
102
 
99
103
  rescue ModeSwitch
100
104
  Terminal.switch_mode!
@@ -4,7 +4,7 @@ module Vedeu
4
4
  # {Vedeu::Foreground}) of a terminal colour escape sequence.
5
5
  #
6
6
  # @api private
7
- class Background < ColourTranslator
7
+ class Background < Translator
8
8
 
9
9
  private
10
10
 
File without changes
@@ -4,7 +4,7 @@ module Vedeu
4
4
  # {Vedeu::Background}) of a terminal colour escape sequence.
5
5
  #
6
6
  # @api private
7
- class Foreground < ColourTranslator
7
+ class Foreground < Translator
8
8
 
9
9
  private
10
10
 
@@ -39,7 +39,7 @@ module Vedeu
39
39
  end
40
40
 
41
41
  # Produces the foreground named colour escape sequence hash from
42
- # {Vedeu::ColourTranslator#codes}
42
+ # {Vedeu::Translator#codes}
43
43
  #
44
44
  # @return [Hash]
45
45
  def foreground_codes
@@ -20,26 +20,26 @@ module Vedeu
20
20
  #
21
21
  # @todo More documentation required (create a fancy chart!)
22
22
  # @api private
23
- class ColourTranslator
23
+ class Translator
24
24
 
25
25
  # Convert a CSS/HTML colour string into a terminal escape sequence.
26
26
  #
27
- # @param colour [String]
27
+ # @param colour [Fixnum|String|Symbol]
28
28
  # @return [String]
29
29
  def self.escape_sequence(colour = '')
30
30
  new(colour).escape_sequence
31
31
  end
32
32
 
33
- # Return a new instance of ColourTranslator.
33
+ # Return a new instance of Translator.
34
34
  #
35
- # @param colour [String]
36
- # @return [ColourTranslator]
35
+ # @param colour [Fixnum|String|Symbol]
36
+ # @return [Translator]
37
37
  def initialize(colour = '')
38
38
  @colour = colour
39
39
  end
40
40
 
41
41
  # @return [String]
42
- # @see Vedeu::ColourTranslator
42
+ # @see Vedeu::Translator
43
43
  def escape_sequence
44
44
  if no_colour?
45
45
  ''
@@ -183,6 +183,6 @@ module Vedeu
183
183
  (css_to_rgb[2] / 51) * 1
184
184
  end
185
185
 
186
- end # ColourTranslator
186
+ end # Translator
187
187
 
188
188
  end # Vedeu
@@ -8,30 +8,38 @@ module Vedeu
8
8
 
9
9
  # Instantiate Input and capture keypress(es).
10
10
  #
11
+ # @param reader [IO] An object that responds to `#read`. Typically, this is
12
+ # Vedeu::Terminal.
11
13
  # @return [String|Symbol]
12
- def self.capture
13
- new.capture
14
+ def self.capture(reader)
15
+ new(reader).capture
14
16
  end
15
17
 
16
18
  # Returns a new instance of Input.
17
19
  #
20
+ # @param reader [IO] An object that responds to `#read`. Typically, this is
21
+ # Vedeu::Terminal.
18
22
  # @return [Input]
19
- def initialize; end
23
+ def initialize(reader)
24
+ @reader = reader
25
+ end
20
26
 
21
27
  # Triggers the keypress event with the key(s) pressed.
22
28
  #
23
- # @return []
29
+ # @return [Array|String|Symbol]
24
30
  def capture
25
31
  Vedeu.trigger(:_keypress_, keypress)
26
32
  end
27
33
 
28
34
  private
29
35
 
36
+ attr_reader :reader
37
+
30
38
  # Returns the input from the terminal.
31
39
  #
32
40
  # @return [String]
33
41
  def input
34
- @_input ||= Terminal.input
42
+ @_input ||= reader.read
35
43
  end
36
44
 
37
45
  # Returns the translated (if possible) keypress(es) as either a String or a