vedeu 0.3.4 → 0.3.5

Sign up to get free protection for your applications and to get access to all the features.
Files changed (164) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +1 -1
  3. data/Rakefile +6 -0
  4. data/bin/vedeu_drb_client +8 -3
  5. data/bin/vedeu_drb_server +113 -0
  6. data/bin/vedeu_test +1 -1
  7. data/docs/events.md +0 -127
  8. data/examples/borders_app.rb +17 -7
  9. data/examples/configuration_app.rb +1 -1
  10. data/examples/cursor_app.rb +4 -2
  11. data/examples/drb_app.rb +113 -0
  12. data/examples/focus_app.rb +1 -1
  13. data/examples/geometry_app.rb +1 -1
  14. data/examples/hello_world.rb +1 -1
  15. data/examples/lines_app.rb +1 -1
  16. data/features/start_stop.feature +1 -1
  17. data/inch.yml +5 -0
  18. data/lib/vedeu/all.rb +2 -0
  19. data/lib/vedeu/api.rb +1 -0
  20. data/lib/vedeu/application.rb +17 -36
  21. data/lib/vedeu/bindings.rb +134 -27
  22. data/lib/vedeu/buffers/display_buffer.rb +1 -4
  23. data/lib/vedeu/configuration/api.rb +15 -14
  24. data/lib/vedeu/configuration/cli.rb +17 -16
  25. data/lib/vedeu/configuration/configuration.rb +3 -1
  26. data/lib/vedeu/cursor/cursor.rb +6 -8
  27. data/lib/vedeu/cursor/move_cursor.rb +1 -0
  28. data/lib/vedeu/cursor/toggle_cursor.rb +1 -0
  29. data/lib/vedeu/debug.rb +23 -0
  30. data/lib/vedeu/distributed/all.rb +1 -1
  31. data/lib/vedeu/distributed/client.rb +55 -13
  32. data/lib/vedeu/distributed/server.rb +207 -0
  33. data/lib/vedeu/distributed/subprocess.rb +22 -21
  34. data/lib/vedeu/distributed/templates/default_application.vedeu +3 -1
  35. data/lib/vedeu/distributed/test_application.rb +2 -1
  36. data/lib/vedeu/distributed/uri.rb +1 -0
  37. data/lib/vedeu/dsl/all.rb +4 -2
  38. data/lib/vedeu/dsl/components/border.rb +11 -10
  39. data/lib/vedeu/dsl/components/geometry.rb +1 -0
  40. data/lib/vedeu/dsl/components/keymap.rb +1 -0
  41. data/lib/vedeu/dsl/components/menu.rb +1 -0
  42. data/lib/vedeu/dsl/interface.rb +1 -0
  43. data/lib/vedeu/dsl/line.rb +3 -1
  44. data/lib/vedeu/dsl/shared/colour.rb +1 -0
  45. data/lib/vedeu/dsl/shared/style.rb +1 -0
  46. data/lib/vedeu/dsl/shared/text.rb +2 -0
  47. data/lib/vedeu/dsl/shared/use.rb +3 -0
  48. data/lib/vedeu/dsl/stream.rb +3 -1
  49. data/lib/vedeu/dsl/view.rb +1 -0
  50. data/lib/vedeu/events/event.rb +9 -6
  51. data/lib/vedeu/events/trigger.rb +18 -7
  52. data/lib/vedeu/exceptions.rb +4 -1
  53. data/lib/vedeu/input/input.rb +1 -0
  54. data/lib/vedeu/input/key.rb +0 -1
  55. data/lib/vedeu/input/keymap.rb +5 -3
  56. data/lib/vedeu/input/keys.rb +1 -0
  57. data/lib/vedeu/input/mapper.rb +1 -0
  58. data/lib/vedeu/launcher.rb +35 -12
  59. data/lib/vedeu/main_loop.rb +53 -0
  60. data/lib/vedeu/models/collection.rb +11 -3
  61. data/lib/vedeu/models/focus.rb +3 -3
  62. data/lib/vedeu/models/geometry.rb +8 -16
  63. data/lib/vedeu/models/group.rb +1 -0
  64. data/lib/vedeu/models/menu.rb +2 -1
  65. data/lib/vedeu/models/model.rb +7 -1
  66. data/lib/vedeu/models/view/char.rb +52 -44
  67. data/lib/vedeu/models/view/chars.rb +1 -0
  68. data/lib/vedeu/models/view/composition.rb +2 -1
  69. data/lib/vedeu/models/view/interface.rb +5 -3
  70. data/lib/vedeu/models/view/interfaces.rb +1 -0
  71. data/lib/vedeu/models/view/line.rb +2 -1
  72. data/lib/vedeu/models/view/stream.rb +2 -1
  73. data/lib/vedeu/models/view/streams.rb +1 -0
  74. data/lib/vedeu/output/all.rb +4 -0
  75. data/lib/vedeu/output/border.rb +75 -206
  76. data/lib/vedeu/output/compositor.rb +1 -0
  77. data/lib/vedeu/output/html_char.rb +119 -0
  78. data/lib/vedeu/output/html_renderer.rb +89 -0
  79. data/lib/vedeu/output/output.rb +48 -44
  80. data/lib/vedeu/output/position_index.rb +12 -1
  81. data/lib/vedeu/output/renderer.rb +28 -0
  82. data/lib/vedeu/output/viewport.rb +14 -14
  83. data/lib/vedeu/output/virtual_buffer.rb +56 -0
  84. data/lib/vedeu/output/virtual_terminal.rb +42 -34
  85. data/lib/vedeu/output/wordwrap.rb +3 -0
  86. data/lib/vedeu/output/writer.rb +13 -1
  87. data/lib/vedeu/presentation/background.rb +1 -0
  88. data/lib/vedeu/presentation/colour.rb +8 -7
  89. data/lib/vedeu/presentation/foreground.rb +1 -0
  90. data/lib/vedeu/presentation/presentation.rb +43 -7
  91. data/lib/vedeu/presentation/translator.rb +12 -0
  92. data/lib/vedeu/repositories/repository.rb +8 -8
  93. data/lib/vedeu/support/bounding_area.rb +2 -0
  94. data/lib/vedeu/support/coercions.rb +2 -1
  95. data/lib/vedeu/support/common.rb +1 -0
  96. data/lib/vedeu/support/console.rb +17 -23
  97. data/lib/vedeu/support/content_geometry.rb +2 -0
  98. data/lib/vedeu/support/coordinate.rb +1 -0
  99. data/lib/vedeu/support/esc.rb +58 -29
  100. data/lib/vedeu/support/grid.rb +1 -0
  101. data/lib/vedeu/support/limit.rb +9 -0
  102. data/lib/vedeu/support/log.rb +31 -9
  103. data/lib/vedeu/support/node.rb +8 -18
  104. data/lib/vedeu/support/position.rb +13 -34
  105. data/lib/vedeu/support/position_validator.rb +3 -0
  106. data/lib/vedeu/support/read.rb +1 -0
  107. data/lib/vedeu/support/refresh.rb +3 -2
  108. data/lib/vedeu/support/terminal.rb +11 -5
  109. data/lib/vedeu/support/trace.rb +16 -1
  110. data/lib/vedeu/support/visible.rb +2 -0
  111. data/lib/vedeu/support/write.rb +1 -0
  112. data/lib/vedeu/traps.rb +1 -0
  113. data/lib/vedeu.rb +2 -0
  114. data/test/integration/distributed_test.rb +10 -8
  115. data/test/lib/vedeu/api_test.rb +3 -7
  116. data/test/lib/vedeu/application_test.rb +2 -5
  117. data/test/lib/vedeu/configuration/api_test.rb +12 -0
  118. data/test/lib/vedeu/cursor/cursor_test.rb +2 -0
  119. data/test/lib/vedeu/distributed/client_test.rb +17 -7
  120. data/test/lib/vedeu/distributed/server_test.rb +56 -0
  121. data/test/lib/vedeu/distributed/test_application_test.rb +7 -3
  122. data/test/lib/vedeu/dsl/components/border_test.rb +10 -2
  123. data/test/lib/vedeu/dsl/interface_test.rb +6 -0
  124. data/test/lib/vedeu/dsl/line_test.rb +19 -0
  125. data/test/lib/vedeu/dsl/shared/colour_test.rb +4 -26
  126. data/test/lib/vedeu/dsl/shared/text_test.rb +8 -1
  127. data/test/lib/vedeu/dsl/stream_test.rb +13 -1
  128. data/test/lib/vedeu/input/input_test.rb +1 -1
  129. data/test/lib/vedeu/input/key_test.rb +3 -16
  130. data/test/lib/vedeu/launcher_test.rb +11 -1
  131. data/test/lib/vedeu/main_loop_test.rb +41 -0
  132. data/test/lib/vedeu/models/geometry_test.rb +15 -34
  133. data/test/lib/vedeu/models/view/char_test.rb +44 -45
  134. data/test/lib/vedeu/models/view/interface_test.rb +6 -0
  135. data/test/lib/vedeu/models/view/line_test.rb +1 -1
  136. data/test/lib/vedeu/models/view/stream_test.rb +1 -1
  137. data/test/lib/vedeu/output/border_test.rb +6 -5
  138. data/test/lib/vedeu/output/compositor_test.rb +2 -20
  139. data/test/lib/vedeu/output/html_char_test.rb +85 -0
  140. data/test/lib/vedeu/output/html_renderer_test.rb +37 -0
  141. data/test/lib/vedeu/output/position_index_test.rb +2 -10
  142. data/test/lib/vedeu/output/renderer_test.rb +24 -0
  143. data/test/lib/vedeu/output/virtual_buffer_test.rb +53 -0
  144. data/test/lib/vedeu/output/virtual_terminal_test.rb +32 -2
  145. data/test/lib/vedeu/presentation/background_test.rb +41 -1
  146. data/test/lib/vedeu/presentation/colour_test.rb +10 -6
  147. data/test/lib/vedeu/presentation/foreground_test.rb +46 -6
  148. data/test/lib/vedeu/presentation/presentation_test.rb +44 -1
  149. data/test/lib/vedeu/presentation/translator_test.rb +34 -0
  150. data/test/lib/vedeu/repositories/repository_test.rb +1 -1
  151. data/test/lib/vedeu/support/bounding_area_test.rb +4 -12
  152. data/test/lib/vedeu/support/console_test.rb +9 -50
  153. data/test/lib/vedeu/support/esc_test.rb +7 -7
  154. data/test/lib/vedeu/support/position_test.rb +42 -0
  155. data/test/lib/vedeu/support/terminal_test.rb +5 -20
  156. data/test/lib/vedeu/support/write_test.rb +42 -18
  157. data/test/support/helpers/all.rb +0 -1
  158. data/test/support/helpers/repository_test_module.rb +1 -0
  159. data/test/test_helper.rb +5 -2
  160. data/vedeu.gemspec +7 -5
  161. metadata +60 -14
  162. data/lib/vedeu/distributed/application.rb +0 -91
  163. data/test/lib/vedeu/distributed/application_test.rb +0 -24
  164. data/test/support/helpers/presentation.rb +0 -16
@@ -34,6 +34,7 @@ module Vedeu
34
34
  # end
35
35
  #
36
36
  # @api public
37
+ #
37
38
  class Line
38
39
 
39
40
  include Vedeu::DSL
@@ -60,7 +61,8 @@ module Vedeu
60
61
  # line do
61
62
  # # ...
62
63
  #
63
- # @return [Vedeu::Line]
64
+ # @raise [InvalidSyntax] When no block or value is provided.
65
+ # @return [Vedeu::Lines]
64
66
  def line(value = '', &block)
65
67
  content = if block_given?
66
68
  Vedeu::Line.build({ client: client,
@@ -6,6 +6,7 @@ module Vedeu
6
6
  # {Vedeu::DSL::Line} and {Vedeu::DSL::Stream} classes.
7
7
  #
8
8
  # @api public
9
+ #
9
10
  module Colour
10
11
 
11
12
  # Define the background colour for an interface, line, or a stream. When
@@ -6,6 +6,7 @@ module Vedeu
6
6
  # {DSL::Stream} classes.
7
7
  #
8
8
  # @api public
9
+ #
9
10
  module Style
10
11
 
11
12
  # Define a style or styles for an interface, line or a stream.
@@ -4,6 +4,8 @@ module Vedeu
4
4
 
5
5
  module DSL
6
6
 
7
+ # Provides helper methods for building views.
8
+ #
7
9
  module Text
8
10
 
9
11
  # Specify the content for a view. Provides the means to align a string
@@ -2,6 +2,8 @@ module Vedeu
2
2
 
3
3
  module DSL
4
4
 
5
+ # Provides helper methods for building views.
6
+ #
5
7
  module Use
6
8
 
7
9
  extend self
@@ -29,6 +31,7 @@ module Vedeu
29
31
  #
30
32
  # @param value [String] The name of the interface you wish to use.
31
33
  # Typically used when defining interfaces to share geometry.
34
+ # @raise [ModelNotFound] The interface has not yet been defined.
32
35
  # @return [Vedeu::Interface]
33
36
  def use(value)
34
37
  if Vedeu.interfaces.registered?(value) == false
@@ -7,6 +7,7 @@ module Vedeu
7
7
  # Provides methods to be used to define views.
8
8
  #
9
9
  # @api public
10
+ #
10
11
  class Stream
11
12
 
12
13
  include Vedeu::DSL
@@ -23,7 +24,8 @@ module Vedeu
23
24
  end
24
25
 
25
26
  # @param block [Proc]
26
- # @return []
27
+ # @raise [InvalidSyntax] The required block was not given.
28
+ # @return [void]
27
29
  def stream(&block)
28
30
  fail InvalidSyntax, 'block not given' unless block_given?
29
31
 
@@ -7,6 +7,7 @@ module Vedeu
7
7
  # DSL for creating views.
8
8
  #
9
9
  # @api public
10
+ #
10
11
  class View
11
12
 
12
13
  class << self
@@ -7,6 +7,7 @@ module Vedeu
7
7
  # Contains all the logic of an event. Handles debouncing and throttling.
8
8
  #
9
9
  # @api private
10
+ #
10
11
  class Event
11
12
 
12
13
  include Vedeu::Model
@@ -57,7 +58,7 @@ module Vedeu
57
58
  #
58
59
  # @return [TrueClass]
59
60
  def bind(name, options = {}, &block)
60
- Vedeu.log("Binding event: '#{name}'")
61
+ Vedeu.log(type: :event, message: "Binding: '#{name}'")
61
62
 
62
63
  new(name, options, block).bind
63
64
  end
@@ -76,7 +77,7 @@ module Vedeu
76
77
  def unbind(name)
77
78
  return false unless Vedeu.events.registered?(name)
78
79
 
79
- Vedeu.log("Unbinding event: '#{name}")
80
+ Vedeu.log(type: :event, message: "Unbinding: '#{name}")
80
81
 
81
82
  Vedeu.events.remove(name)
82
83
  true
@@ -120,7 +121,7 @@ module Vedeu
120
121
  # Triggers the event based on debouncing and throttling conditions.
121
122
  #
122
123
  # @param args [Array]
123
- # @return []
124
+ # @return [void]
124
125
  def trigger(*args)
125
126
  return execute(*args) unless debouncing? || throttling?
126
127
 
@@ -137,7 +138,7 @@ module Vedeu
137
138
  # Execute the code stored in the event closure.
138
139
  #
139
140
  # @param args []
140
- # @return []
141
+ # @return [void]
141
142
  def execute(*args)
142
143
  reset_deadline
143
144
 
@@ -145,6 +146,8 @@ module Vedeu
145
146
 
146
147
  reset_time
147
148
 
149
+ Vedeu.log(type: :event, message: "Triggering: '#{name}'")
150
+
148
151
  closure.call(*args)
149
152
  end
150
153
 
@@ -165,7 +168,7 @@ module Vedeu
165
168
  def throttle_expired?
166
169
  return true if elapsed_time > delay
167
170
 
168
- Vedeu.log("Throttling event '#{name}'")
171
+ Vedeu.log(type: :event, message: "Throttling: '#{name}'")
169
172
 
170
173
  false
171
174
  end
@@ -189,7 +192,7 @@ module Vedeu
189
192
  def debounce_expired?
190
193
  return true if set_executed > deadline
191
194
 
192
- Vedeu.log("Debouncing event '#{name}'")
195
+ Vedeu.log(type: :event, message: "Debouncing: '#{name}'")
193
196
 
194
197
  false
195
198
  end
@@ -9,6 +9,7 @@ module Vedeu
9
9
  # Vedeu.trigger(:my_event, :oxidize, 'nitrogen')
10
10
  #
11
11
  # @api private
12
+ #
12
13
  class Trigger
13
14
 
14
15
  class << self
@@ -34,15 +35,13 @@ module Vedeu
34
35
  # @see Vedeu::Trigger.trigger
35
36
  # @return [Array]
36
37
  def trigger
37
- return [] unless repository.registered?(name)
38
-
39
- collection = repository.find(name)
38
+ if results.one?
39
+ results.first
40
40
 
41
- results = collection.map { |event| event.trigger(*args) }
41
+ else
42
+ results
42
43
 
43
- return results.first if results.one?
44
-
45
- results
44
+ end
46
45
  end
47
46
 
48
47
  private
@@ -51,6 +50,18 @@ module Vedeu
51
50
  :args,
52
51
  :repository
53
52
 
53
+ # @return [Array<void>|void]
54
+ def results
55
+ @results ||= registered_events.map { |event| event.trigger(*args) }
56
+ end
57
+
58
+ # @return [Array|Array<Vedeu::Event>]
59
+ def registered_events
60
+ return [] unless repository.registered?(name)
61
+
62
+ repository.find(name)
63
+ end
64
+
54
65
  end # Trigger
55
66
 
56
67
  end # Vedeu
@@ -20,7 +20,9 @@ module Vedeu
20
20
  # OutOfRange: Raised when trying to access an interface column less than 1 or
21
21
  # greater than 12. Vedeu is hard-wired to a 12-column layout for the time
22
22
  # being.
23
-
23
+ #
24
+ # VedeuInterrupt: Raised when Vedeu wishes to exit.
25
+ #
24
26
  Exceptions = %w[
25
27
  ModelNotFound
26
28
  InvalidSyntax
@@ -28,6 +30,7 @@ module Vedeu
28
30
  ModeSwitch
29
31
  NotImplemented
30
32
  OutOfRange
33
+ VedeuInterrupt
31
34
  ]
32
35
  Exceptions.each { |e| const_set(e, Class.new(StandardError)) }
33
36
 
@@ -4,6 +4,7 @@ module Vedeu
4
4
  # special characters into symbols.
5
5
  #
6
6
  # @api private
7
+ #
7
8
  class Input
8
9
 
9
10
  # Instantiate Input and capture keypress(es).
@@ -1,6 +1,5 @@
1
1
  module Vedeu
2
2
 
3
- #
4
3
  # A single keypress or combination of keypresses bound to a specific action.
5
4
  #
6
5
  class Key
@@ -5,6 +5,7 @@ require 'vedeu/dsl/components/keymap'
5
5
  module Vedeu
6
6
 
7
7
  # A container class for keys associated with a particular interface.
8
+ #
8
9
  class Keymap
9
10
 
10
11
  include Vedeu::Model
@@ -22,6 +23,7 @@ module Vedeu
22
23
  # @option attributes keys []
23
24
  # @option attributes name [String]
24
25
  # @option attributes repository [Vedeu::Repository]
26
+ # @raise [InvalidSyntax] The required block was not given.
25
27
  # @return [Vedeu::Keymap]
26
28
  def build(attributes = {}, &block)
27
29
  fail InvalidSyntax, 'block not given' unless block_given?
@@ -61,7 +63,7 @@ module Vedeu
61
63
  end
62
64
 
63
65
  # @param key [Key]
64
- # @return []
66
+ # @return [void]
65
67
  def add(key)
66
68
  return false unless valid?(key)
67
69
 
@@ -88,7 +90,7 @@ module Vedeu
88
90
  def use(input)
89
91
  return false unless key_defined?(input)
90
92
 
91
- Vedeu.log("Key pressed: '#{input}'")
93
+ Vedeu.log(type: :input, message: "Key pressed: '#{input}'")
92
94
 
93
95
  Vedeu.trigger(:key, input)
94
96
 
@@ -104,7 +106,7 @@ module Vedeu
104
106
  def valid?(key)
105
107
  return true unless key_defined?(key.input)
106
108
 
107
- Vedeu.log("Keymap '#{name}' already defines '#{key.input}'.")
109
+ Vedeu.log(type: :debug, message: "Keymap '#{name}' already defines '#{key.input}'.")
108
110
 
109
111
  false
110
112
  end
@@ -3,6 +3,7 @@ require 'vedeu/models/collection'
3
3
  module Vedeu
4
4
 
5
5
  # A collection of {Vedeu::Key} instances.
6
+ #
6
7
  class Keys < Vedeu::Model::Collection
7
8
  end # Keys
8
9
 
@@ -1,6 +1,7 @@
1
1
  module Vedeu
2
2
 
3
3
  # Maps keys to keymaps.
4
+ #
4
5
  class Mapper
5
6
 
6
7
  # Takes a key as a keypress and sends it to registered keymaps. If found,
@@ -6,6 +6,7 @@ module Vedeu
6
6
  # finally the exiting of the application with the correct exit code.
7
7
  #
8
8
  # @api public
9
+ #
9
10
  class Launcher
10
11
 
11
12
  attr_reader :exit_code
@@ -20,14 +21,14 @@ module Vedeu
20
21
  stdin = STDIN,
21
22
  stdout = STDOUT,
22
23
  stderr = STDERR,
23
- kernel = Kernel).execute!
24
+ kernel = Kernel).debug_execute!
24
25
  end
25
26
 
26
27
  # @param argv [Array]
27
- # @param stdin []
28
- # @param stdout []
29
- # @param stderr []
30
- # @param kernel []
28
+ # @param stdin [IO]
29
+ # @param stdout [IO]
30
+ # @param stderr [IO]
31
+ # @param kernel [Kernel]
31
32
  # @return [Launcher]
32
33
  def initialize(argv = [],
33
34
  stdin = STDIN,
@@ -42,29 +43,51 @@ module Vedeu
42
43
  @exit_code = 1
43
44
  end
44
45
 
45
- # @return []
46
+ # @return [void]
47
+ def debug_execute!
48
+ if configuration.debug?
49
+ Vedeu.debug { execute! }
50
+
51
+ else
52
+ execute!
53
+
54
+ end
55
+
56
+ terminate!
57
+ end
58
+
59
+ # @return [void]
46
60
  def execute!
47
61
  $stdin, $stdout, $stderr = @stdin, @stdout, @stderr
48
62
 
49
63
  Application.start(configuration)
50
64
 
51
65
  @exit_code = 0
66
+
52
67
  rescue StandardError => uncaught_exception
53
68
  puts uncaught_exception.message
54
69
  puts uncaught_exception.backtrace.join("\n") if configuration.debug?
55
70
 
56
- ensure
57
- Vedeu.log("Exiting gracefully.")
58
-
59
- $stdin, $stdout, $stderr = STDIN, STDOUT, STDERR
60
- @kernel.exit(exit_code)
61
71
  end
62
72
 
63
73
  private
64
74
 
75
+ # @!attribute [r] argv
76
+ # @return [Array<String>] The command line arguments provided.
65
77
  attr_reader :argv
66
78
 
67
- # @return []
79
+ # Terminates the application after resetting $stdin, $stdout and $stderr.
80
+ #
81
+ # @return [void]
82
+ def terminate!
83
+ Vedeu.log(type: :info, message: "Exiting gracefully.")
84
+
85
+ $stdin, $stdout, $stderr = STDIN, STDOUT, STDERR
86
+
87
+ @kernel.exit(exit_code)
88
+ end
89
+
90
+ # @return [Vedeu::Configuration]
68
91
  def configuration
69
92
  Vedeu::Configuration.configure(argv)
70
93
 
@@ -0,0 +1,53 @@
1
+ module Vedeu
2
+
3
+ # Provides the main loop for a Vedeu application.
4
+ #
5
+ class MainLoop
6
+
7
+ trap('SIGTERM') { stop! }
8
+ trap('TERM') { stop! }
9
+ trap('INT') { stop! }
10
+
11
+ # Start the main loop.
12
+ #
13
+ # @param block [Proc]
14
+ # @return [void]
15
+ def self.start!(&block)
16
+ @started = true
17
+ @loop = true
18
+
19
+ while(@loop) do
20
+ Vedeu.trigger(:_tick_)
21
+
22
+ yield
23
+
24
+ safe_exit_point!
25
+ end
26
+ rescue VedeuInterrupt
27
+
28
+ end
29
+
30
+ # Signal that we wish to terminate the running application.
31
+ #
32
+ # @return [void]
33
+ def self.stop!
34
+ @loop = false
35
+ end
36
+
37
+ # Check the application has started and we wish to continue running.
38
+ #
39
+ # @raise [VedeuInterrupt] When we wish to terminate the running application.
40
+ # @return [void]
41
+ def self.safe_exit_point!
42
+ if @started && !@loop
43
+ fail VedeuInterrupt
44
+
45
+ else
46
+ Vedeu.trigger(:_tock_)
47
+
48
+ end
49
+ end
50
+
51
+ end # MainLoop
52
+
53
+ end # Vedeu
@@ -6,26 +6,30 @@ module Vedeu
6
6
  # is being used.
7
7
  #
8
8
  # @private
9
+ #
9
10
  class Collection
10
11
 
11
12
  include Enumerable
12
13
 
13
14
  attr_accessor :parent, :name
14
15
 
16
+ # @param collection [Array|Vedeu::Model::Collection]
17
+ # @param parent []
18
+ # @param name [String|NilClass]
15
19
  # @return [Vedeu::Model::Collection]
16
20
  def self.coerce(collection = [], parent = nil, name = nil)
17
21
  if collection.kind_of?(Vedeu::Model::Collection)
18
22
  collection
19
23
 
20
- elsif collection.is_a?(Array)
21
- new(collection, parent, name)
22
-
23
24
  else
24
25
  new(Array(collection), parent, name)
25
26
 
26
27
  end
27
28
  end
28
29
 
30
+ # @param collection []
31
+ # @param parent []
32
+ # @param name []
29
33
  # @return [Vedeu::Model::Collection]
30
34
  def initialize(collection = [], parent = nil, name = nil)
31
35
  @collection = collection
@@ -33,10 +37,13 @@ module Vedeu
33
37
  @name = name
34
38
  end
35
39
 
40
+ # @param value [Fixnum]
41
+ # @return [void]
36
42
  def [](value)
37
43
  @collection[value]
38
44
  end
39
45
 
46
+ # @param other [Vedeu::Model::Collection]
40
47
  # @return [Vedeu::Model::Collection]
41
48
  def add(*other)
42
49
  self.class.new(@collection += other, parent, name)
@@ -48,6 +55,7 @@ module Vedeu
48
55
  @collection
49
56
  end
50
57
 
58
+ # @param block [Proc]
51
59
  # @return [Enumerator]
52
60
  def each(&block)
53
61
  @collection.each(&block)
@@ -23,7 +23,7 @@ module Vedeu
23
23
  storage
24
24
 
25
25
  else
26
- Vedeu.log("Storing focus entry: '#{name}'")
26
+ Vedeu.log(type: :store, message: "Storing focus entry: '#{name}'")
27
27
 
28
28
  if focus
29
29
  storage.unshift(name)
@@ -140,7 +140,7 @@ module Vedeu
140
140
  def update
141
141
  return false if empty?
142
142
 
143
- Vedeu.log("Interface in focus: '#{current}'")
143
+ Vedeu.log(type: :info, message: "Interface in focus: '#{current}'")
144
144
 
145
145
  refresh
146
146
 
@@ -149,7 +149,7 @@ module Vedeu
149
149
 
150
150
  # Access to the storage for this repository.
151
151
  #
152
- # @return [Hash]
152
+ # @return [Array]
153
153
  def storage
154
154
  @_storage ||= in_memory
155
155
  end
@@ -26,6 +26,7 @@ module Vedeu
26
26
  # south
27
27
  #
28
28
  # @api private
29
+ #
29
30
  class Geometry
30
31
 
31
32
  include Vedeu::Model
@@ -146,23 +147,14 @@ module Vedeu
146
147
  Vedeu::Limit.apply(y, @height, Terminal.height, Terminal.origin)
147
148
  end
148
149
 
149
- # Returns an escape sequence to position the cursor at the top-left
150
- # coordinate, relative to the interface's position.
151
- #
152
- # @param index [Fixnum]
153
- # @param block [Proc]
154
- # @return [String]
155
- def origin(index = 0, &block)
156
- Esc.set_position(*raw_origin(index), &block)
157
- end
158
-
159
- # Returns a tuple which positions the cursor at the top-left coordinate,
160
- # relative to the interface's position.
150
+ # Returns the position of the cursor at the top-left coordinate, relative to
151
+ # the interface's position.
161
152
  #
162
- # @param index [Fixnum]
163
- # @return [Array<Fixnum>]
164
- def raw_origin(index = 0)
165
- [virtual_y[index], left]
153
+ # @param y_index [Fixnum]
154
+ # @param x_index [Fixnum]
155
+ # @return [Vedeu::Position]
156
+ def origin(y_index = 0, x_index = 0)
157
+ Vedeu::Position.new(virtual_y[y_index], virtual_x[x_index])
166
158
  end
167
159
 
168
160
  # Returns the top coordinate of the interface, a fixed or dynamic value
@@ -4,6 +4,7 @@ module Vedeu
4
4
  # Group. A Group is a collection of interface names.
5
5
  #
6
6
  # @api private
7
+ #
7
8
  class Group
8
9
 
9
10
  include Vedeu::Model
@@ -6,6 +6,7 @@ module Vedeu
6
6
  # navigated using the instance methods or events provided.
7
7
  #
8
8
  # @api private
9
+ #
9
10
  class Menu
10
11
 
11
12
  include Vedeu::Model
@@ -74,7 +75,7 @@ module Vedeu
74
75
  # Returns the item from the collection which shares the same index as the
75
76
  # value of {Vedeu::Menu#current}.
76
77
  #
77
- # @return []
78
+ # @return [void]
78
79
  def current_item
79
80
  @collection[@current]
80
81
  end
@@ -4,10 +4,14 @@ module Vedeu
4
4
  # repository for later retrieval.
5
5
  #
6
6
  # @api private
7
+ #
7
8
  module Model
8
9
 
9
10
  attr_reader :repository
10
11
 
12
+ # When {Vedeu::Model} is included in a class, the methods within this module
13
+ # are included as class methods on that class.
14
+ #
11
15
  module ClassMethods
12
16
 
13
17
  # Build models using a simple DSL when a block is given, otherwise returns
@@ -29,7 +33,7 @@ module Vedeu
29
33
  #
30
34
  # @param klass [Class] The member (singular) or collection (multiple)
31
35
  # class name for the respective model.
32
- # @return []
36
+ # @return [void]
33
37
  def child(klass)
34
38
  send(:define_method, __callee__) { klass }
35
39
  end
@@ -54,6 +58,7 @@ module Vedeu
54
58
  # methods for the class.
55
59
  #
56
60
  # @param klass [Class]
61
+ # @return [void]
57
62
  def self.included(klass)
58
63
  klass.send :extend, ClassMethods
59
64
  end
@@ -84,6 +89,7 @@ module Vedeu
84
89
  # demodulize('Vedeu::DSL::Interface') # => "Interface"
85
90
  #
86
91
  # @param klass [Class|String]
92
+ # @return [void]
87
93
  def demodulize(klass)
88
94
  klass = klass.to_s
89
95