vedeu 0.2.10 → 0.2.11

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 (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