vedeu 0.3.4 → 0.3.5

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