vedeu 0.2.12 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (305) hide show
  1. checksums.yaml +4 -4
  2. data/.ruby-version +1 -1
  3. data/Guardfile +13 -0
  4. data/README.md +11 -9
  5. data/Rakefile +10 -1
  6. data/bin/vedeu_test +14 -0
  7. data/config/cucumber.yml +8 -0
  8. data/docs/api.md +45 -16
  9. data/docs/events.md +21 -9
  10. data/docs/getting_started.md +16 -0
  11. data/docs/views.md +158 -0
  12. data/examples/borders_app.rb +236 -110
  13. data/examples/colour_support.sh +98 -0
  14. data/examples/colours_app.rb +41 -0
  15. data/examples/configuration_app.rb +11 -6
  16. data/examples/cursor_app.rb +60 -61
  17. data/examples/focus_app.rb +72 -34
  18. data/examples/hello_world.rb +13 -8
  19. data/examples/lines_app.rb +37 -28
  20. data/features/start_stop.feature +27 -0
  21. data/features/support/env.rb +14 -0
  22. data/lib/vedeu/all.rb +29 -0
  23. data/lib/vedeu/api.rb +39 -0
  24. data/lib/vedeu/application.rb +15 -7
  25. data/lib/vedeu/bindings.rb +121 -0
  26. data/lib/vedeu/buffers/all.rb +10 -0
  27. data/lib/vedeu/{repositories/models → buffers}/buffer.rb +47 -64
  28. data/lib/vedeu/buffers/display_buffer.rb +118 -0
  29. data/lib/vedeu/configuration/all.rb +6 -0
  30. data/lib/vedeu/configuration/api.rb +3 -1
  31. data/lib/vedeu/configuration/cli.rb +3 -1
  32. data/lib/vedeu/configuration/configuration.rb +23 -2
  33. data/lib/vedeu/cursor/all.rb +23 -0
  34. data/lib/vedeu/cursor/cursor.rb +116 -0
  35. data/lib/vedeu/cursor/move_cursor.rb +137 -0
  36. data/lib/vedeu/cursor/toggle_cursor.rb +53 -0
  37. data/lib/vedeu/dsl/all.rb +28 -0
  38. data/lib/vedeu/dsl/components/all.rb +7 -0
  39. data/lib/vedeu/dsl/components/border.rb +104 -0
  40. data/lib/vedeu/dsl/components/geometry.rb +153 -0
  41. data/lib/vedeu/dsl/components/keymap.rb +93 -0
  42. data/lib/vedeu/dsl/components/menu.rb +82 -0
  43. data/lib/vedeu/dsl/composition.rb +72 -0
  44. data/lib/vedeu/dsl/interface.rb +210 -0
  45. data/lib/vedeu/dsl/line.rb +135 -0
  46. data/lib/vedeu/dsl/shared/all.rb +7 -0
  47. data/lib/vedeu/dsl/shared/colour.rb +85 -0
  48. data/lib/vedeu/dsl/shared/style.rb +38 -0
  49. data/lib/vedeu/dsl/shared/text.rb +102 -0
  50. data/lib/vedeu/dsl/shared/use.rb +47 -0
  51. data/lib/vedeu/dsl/stream.rb +49 -0
  52. data/lib/vedeu/dsl/view.rb +136 -0
  53. data/lib/vedeu/events/all.rb +10 -0
  54. data/lib/vedeu/{repositories/models → events}/event.rb +97 -8
  55. data/lib/vedeu/events/trigger.rb +58 -0
  56. data/lib/vedeu/exceptions.rb +34 -0
  57. data/lib/vedeu/input/all.rb +29 -0
  58. data/lib/vedeu/input/input.rb +26 -0
  59. data/lib/vedeu/{models → input}/key.rb +21 -11
  60. data/lib/vedeu/input/keymap.rb +130 -0
  61. data/lib/vedeu/input/keys.rb +8 -0
  62. data/lib/vedeu/input/mapper.rb +112 -0
  63. data/lib/vedeu/launcher.rb +7 -4
  64. data/lib/vedeu/models/all.rb +12 -0
  65. data/lib/vedeu/models/collection.rb +71 -0
  66. data/lib/vedeu/{repositories → models}/focus.rb +63 -21
  67. data/lib/vedeu/models/geometry.rb +100 -259
  68. data/lib/vedeu/{repositories/models → models}/group.rb +16 -14
  69. data/lib/vedeu/{repositories/models → models}/menu.rb +85 -22
  70. data/lib/vedeu/models/model.rb +51 -0
  71. data/lib/vedeu/models/view/all.rb +12 -0
  72. data/lib/vedeu/models/view/char.rb +84 -0
  73. data/lib/vedeu/models/view/chars.rb +8 -0
  74. data/lib/vedeu/models/view/composition.rb +101 -0
  75. data/lib/vedeu/models/view/interface.rb +215 -0
  76. data/lib/vedeu/models/view/interfaces.rb +8 -0
  77. data/lib/vedeu/models/view/line.rb +134 -0
  78. data/lib/vedeu/models/view/lines.rb +8 -0
  79. data/lib/vedeu/models/view/stream.rb +144 -0
  80. data/lib/vedeu/models/view/streams.rb +8 -0
  81. data/lib/vedeu/output/all.rb +8 -0
  82. data/lib/vedeu/output/border.rb +387 -0
  83. data/lib/vedeu/output/compositor.rb +41 -30
  84. data/lib/vedeu/output/output.rb +6 -13
  85. data/lib/vedeu/output/viewport.rb +78 -94
  86. data/lib/vedeu/output/writer.rb +29 -0
  87. data/lib/vedeu/presentation/all.rb +9 -0
  88. data/lib/vedeu/{colours → presentation}/background.rb +1 -9
  89. data/lib/vedeu/{colours → presentation}/colour.rb +21 -8
  90. data/lib/vedeu/{colours → presentation}/foreground.rb +5 -9
  91. data/lib/vedeu/presentation/presentation.rb +91 -0
  92. data/lib/vedeu/presentation/style.rb +47 -0
  93. data/lib/vedeu/{colours → presentation}/translator.rb +11 -5
  94. data/lib/vedeu/repositories/all.rb +5 -0
  95. data/lib/vedeu/repositories/menus.rb +5 -42
  96. data/lib/vedeu/{support → repositories}/repository.rb +78 -41
  97. data/lib/vedeu/support/all.rb +22 -0
  98. data/lib/vedeu/support/bounding_area.rb +2 -1
  99. data/lib/vedeu/support/coercions.rb +18 -1
  100. data/lib/vedeu/support/console.rb +73 -0
  101. data/lib/vedeu/support/content_geometry.rb +69 -0
  102. data/lib/vedeu/support/coordinate.rb +246 -0
  103. data/lib/vedeu/support/esc.rb +29 -2
  104. data/lib/vedeu/support/log.rb +36 -2
  105. data/lib/vedeu/support/node.rb +61 -0
  106. data/lib/vedeu/support/position.rb +28 -13
  107. data/lib/vedeu/support/position_validator.rb +79 -0
  108. data/lib/vedeu/support/read.rb +65 -0
  109. data/lib/vedeu/support/refresh.rb +8 -32
  110. data/lib/vedeu/support/terminal.rb +34 -4
  111. data/lib/vedeu/support/text.rb +104 -0
  112. data/lib/vedeu/support/trace.rb +11 -23
  113. data/lib/vedeu/support/visible.rb +75 -0
  114. data/lib/vedeu/support/write.rb +85 -0
  115. data/lib/vedeu/traps.rb +18 -0
  116. data/lib/vedeu.rb +41 -101
  117. data/test/integration/dsl/compositions_test.rb +27 -0
  118. data/test/integration/dsl/interfaces_test.rb +261 -0
  119. data/test/integration/dsl/keymaps_test.rb +42 -0
  120. data/test/integration/dsl/lines_test.rb +146 -0
  121. data/test/integration/dsl/menus_test.rb +59 -0
  122. data/test/integration/dsl/streams_test.rb +129 -0
  123. data/test/integration/dsl/views_test.rb +63 -0
  124. data/test/lib/vedeu/api_test.rb +163 -0
  125. data/test/lib/vedeu/application_test.rb +19 -10
  126. data/test/lib/vedeu/bindings_test.rb +54 -0
  127. data/test/lib/vedeu/buffers/all_test.rb +11 -0
  128. data/test/lib/vedeu/buffers/buffer_test.rb +196 -0
  129. data/test/lib/vedeu/buffers/display_buffer_test.rb +58 -0
  130. data/test/lib/vedeu/configuration/api_test.rb +42 -58
  131. data/test/lib/vedeu/configuration/cli_test.rb +4 -4
  132. data/test/lib/vedeu/configuration/configuration_test.rb +11 -29
  133. data/test/lib/vedeu/cursor/all_test.rb +33 -0
  134. data/test/lib/vedeu/cursor/cursor_test.rb +85 -0
  135. data/test/lib/vedeu/cursor/move_cursor_test.rb +212 -0
  136. data/test/lib/vedeu/cursor/toggle_cursor_test.rb +63 -0
  137. data/test/lib/vedeu/dsl/components/border_test.rb +414 -0
  138. data/test/lib/vedeu/dsl/components/geometry_test.rb +231 -0
  139. data/test/lib/vedeu/dsl/components/keymap_test.rb +80 -0
  140. data/test/lib/vedeu/dsl/components/menu_test.rb +115 -0
  141. data/test/lib/vedeu/dsl/composition_test.rb +41 -0
  142. data/test/lib/vedeu/dsl/interface_test.rb +470 -0
  143. data/test/lib/vedeu/dsl/line_test.rb +60 -0
  144. data/test/lib/vedeu/dsl/shared/colour_test.rb +100 -0
  145. data/test/lib/vedeu/dsl/shared/style_test.rb +22 -0
  146. data/test/lib/vedeu/dsl/shared/text_test.rb +15 -0
  147. data/test/lib/vedeu/dsl/shared/use_test.rb +27 -0
  148. data/test/lib/vedeu/dsl/stream_test.rb +26 -0
  149. data/test/lib/vedeu/dsl/view_test.rb +73 -0
  150. data/test/lib/vedeu/events/all_test.rb +11 -0
  151. data/test/lib/vedeu/events/event_test.rb +109 -0
  152. data/test/lib/vedeu/events/trigger_test.rb +60 -0
  153. data/test/lib/vedeu/input/all_test.rb +11 -0
  154. data/test/lib/vedeu/input/input_test.rb +7 -3
  155. data/test/lib/vedeu/input/key_test.rb +72 -0
  156. data/test/lib/vedeu/input/keymap_test.rb +89 -0
  157. data/test/lib/vedeu/input/mapper_test.rb +94 -0
  158. data/test/lib/vedeu/launcher_test.rb +19 -20
  159. data/test/lib/vedeu/models/collection_test.rb +114 -0
  160. data/test/lib/vedeu/{repositories → models}/focus_test.rb +46 -13
  161. data/test/lib/vedeu/models/geometry_test.rb +35 -39
  162. data/test/lib/vedeu/models/group_test.rb +100 -0
  163. data/test/lib/vedeu/models/menu_test.rb +288 -0
  164. data/test/lib/vedeu/models/model_test.rb +31 -0
  165. data/test/lib/vedeu/models/view/char_test.rb +166 -0
  166. data/test/lib/vedeu/models/view/chars_test.rb +18 -0
  167. data/test/lib/vedeu/models/view/composition_test.rb +41 -0
  168. data/test/lib/vedeu/models/view/interface_test.rb +128 -0
  169. data/test/lib/vedeu/models/view/interfaces_test.rb +18 -0
  170. data/test/lib/vedeu/models/view/line_test.rb +214 -0
  171. data/test/lib/vedeu/models/view/lines_test.rb +18 -0
  172. data/test/lib/vedeu/models/view/stream_test.rb +106 -0
  173. data/test/lib/vedeu/models/view/streams_test.rb +18 -0
  174. data/test/lib/vedeu/output/border_test.rb +357 -0
  175. data/test/lib/vedeu/output/compositor_test.rb +61 -15
  176. data/test/lib/vedeu/output/output_test.rb +25 -84
  177. data/test/lib/vedeu/output/viewport_test.rb +171 -45
  178. data/test/lib/vedeu/output/writer_test.rb +45 -0
  179. data/test/lib/vedeu/{colours → presentation}/background_test.rb +0 -0
  180. data/test/lib/vedeu/{colours → presentation}/colour_test.rb +5 -5
  181. data/test/lib/vedeu/{colours → presentation}/foreground_test.rb +0 -0
  182. data/test/lib/vedeu/presentation/presentation_test.rb +56 -0
  183. data/test/lib/vedeu/presentation/style_test.rb +69 -0
  184. data/test/lib/vedeu/presentation/translator_test.rb +63 -0
  185. data/test/lib/vedeu/repositories/all_test.rb +7 -0
  186. data/test/lib/vedeu/repositories/menus_test.rb +3 -156
  187. data/test/lib/vedeu/repositories/repository_test.rb +271 -0
  188. data/test/lib/vedeu/support/bounding_area_test.rb +3 -3
  189. data/test/lib/vedeu/support/coercions_test.rb +39 -0
  190. data/test/lib/vedeu/support/common_test.rb +31 -16
  191. data/test/lib/vedeu/support/console_test.rb +85 -0
  192. data/test/lib/vedeu/support/content_geometry_test.rb +107 -0
  193. data/test/lib/vedeu/support/coordinate_test.rb +190 -0
  194. data/test/lib/vedeu/support/esc_test.rb +18 -0
  195. data/test/lib/vedeu/support/grid_test.rb +15 -10
  196. data/test/lib/vedeu/support/log_test.rb +3 -0
  197. data/test/lib/vedeu/support/position_test.rb +22 -2
  198. data/test/lib/vedeu/support/position_validator_test.rb +11 -0
  199. data/test/lib/vedeu/support/read_test.rb +88 -0
  200. data/test/lib/vedeu/support/refresh_test.rb +44 -12
  201. data/test/lib/vedeu/support/sentence_test.rb +6 -4
  202. data/test/lib/vedeu/support/terminal_test.rb +81 -70
  203. data/test/lib/vedeu/support/text_test.rb +93 -0
  204. data/test/lib/vedeu/support/trace_test.rb +21 -9
  205. data/test/lib/vedeu/support/visible_test.rb +148 -0
  206. data/test/lib/vedeu/support/write_test.rb +136 -0
  207. data/test/lib/vedeu/traps_test.rb +11 -0
  208. data/test/lib/vedeu_test.rb +2 -0
  209. data/test/support/helpers/all.rb +7 -0
  210. data/test/support/helpers/dsl_model_test_class.rb +25 -0
  211. data/test/support/{test_classes → helpers}/helpers.rb +0 -2
  212. data/test/support/helpers/misc.rb +15 -0
  213. data/test/support/helpers/model_test_class.rb +34 -0
  214. data/test/support/{test_classes → helpers}/presentation.rb +0 -0
  215. data/test/support/{test_classes → helpers}/repositories.rb +3 -3
  216. data/test/support/{test_modules/repository.rb → helpers/repository_test_module.rb} +5 -1
  217. data/test/test_helper.rb +19 -22
  218. data/vedeu.gemspec +11 -6
  219. metadata +322 -181
  220. data/lib/vedeu/api/api.rb +0 -239
  221. data/lib/vedeu/api/composition.rb +0 -38
  222. data/lib/vedeu/api/defined.rb +0 -52
  223. data/lib/vedeu/api/helpers.rb +0 -161
  224. data/lib/vedeu/api/interface.rb +0 -287
  225. data/lib/vedeu/api/keymap.rb +0 -75
  226. data/lib/vedeu/api/line.rb +0 -107
  227. data/lib/vedeu/api/menu.rb +0 -111
  228. data/lib/vedeu/api/stream.rb +0 -96
  229. data/lib/vedeu/models/border.rb +0 -238
  230. data/lib/vedeu/models/char.rb +0 -43
  231. data/lib/vedeu/models/composition.rb +0 -72
  232. data/lib/vedeu/models/line.rb +0 -100
  233. data/lib/vedeu/models/stream.rb +0 -130
  234. data/lib/vedeu/models/style.rb +0 -52
  235. data/lib/vedeu/repositories/buffers.rb +0 -52
  236. data/lib/vedeu/repositories/cursors.rb +0 -64
  237. data/lib/vedeu/repositories/events.rb +0 -147
  238. data/lib/vedeu/repositories/groups.rb +0 -47
  239. data/lib/vedeu/repositories/interfaces.rb +0 -78
  240. data/lib/vedeu/repositories/keymaps.rb +0 -196
  241. data/lib/vedeu/repositories/models/cursor.rb +0 -209
  242. data/lib/vedeu/repositories/models/interface.rb +0 -163
  243. data/lib/vedeu/repositories/models/keymap.rb +0 -111
  244. data/lib/vedeu/repositories/models/offset.rb +0 -91
  245. data/lib/vedeu/repositories/offsets.rb +0 -69
  246. data/lib/vedeu/support/exceptions.rb +0 -34
  247. data/lib/vedeu/support/keymap_validator.rb +0 -100
  248. data/lib/vedeu/support/model.rb +0 -14
  249. data/lib/vedeu/support/presentation.rb +0 -86
  250. data/lib/vedeu/support/registrar.rb +0 -53
  251. data/test/integration/api/api_test.rb +0 -97
  252. data/test/integration/api_dsl/dsl_api_test.rb +0 -4
  253. data/test/integration/api_dsl/dsl_composition_test.rb +0 -4
  254. data/test/integration/api_dsl/dsl_defined_test.rb +0 -4
  255. data/test/integration/api_dsl/dsl_helpers_test.rb +0 -4
  256. data/test/integration/api_dsl/dsl_interface_test.rb +0 -4
  257. data/test/integration/api_dsl/dsl_keymap.rb +0 -4
  258. data/test/integration/api_dsl/dsl_line_test.rb +0 -4
  259. data/test/integration/api_dsl/dsl_menu_test.rb +0 -4
  260. data/test/integration/api_dsl/dsl_stream_test.rb +0 -138
  261. data/test/integration/cursors_test.rb +0 -9
  262. data/test/integration/defining_interfaces_test.rb +0 -26
  263. data/test/integration/run_once_test.rb +0 -26
  264. data/test/integration/views/basic_view_test.rb +0 -807
  265. data/test/lib/vedeu/api/api_test.rb +0 -204
  266. data/test/lib/vedeu/api/composition_test.rb +0 -31
  267. data/test/lib/vedeu/api/defined_test.rb +0 -79
  268. data/test/lib/vedeu/api/helpers_test.rb +0 -111
  269. data/test/lib/vedeu/api/interface_test.rb +0 -410
  270. data/test/lib/vedeu/api/keymap_test.rb +0 -65
  271. data/test/lib/vedeu/api/line_test.rb +0 -83
  272. data/test/lib/vedeu/api/menu_test.rb +0 -85
  273. data/test/lib/vedeu/api/stream_test.rb +0 -59
  274. data/test/lib/vedeu/colours/translator_test.rb +0 -22
  275. data/test/lib/vedeu/models/border_test.rb +0 -197
  276. data/test/lib/vedeu/models/char_test.rb +0 -52
  277. data/test/lib/vedeu/models/composition_test.rb +0 -45
  278. data/test/lib/vedeu/models/key_test.rb +0 -43
  279. data/test/lib/vedeu/models/line_test.rb +0 -123
  280. data/test/lib/vedeu/models/stream_test.rb +0 -233
  281. data/test/lib/vedeu/models/style_test.rb +0 -59
  282. data/test/lib/vedeu/repositories/buffers_test.rb +0 -37
  283. data/test/lib/vedeu/repositories/cursors_test.rb +0 -62
  284. data/test/lib/vedeu/repositories/events_test.rb +0 -57
  285. data/test/lib/vedeu/repositories/groups_test.rb +0 -28
  286. data/test/lib/vedeu/repositories/interfaces_test.rb +0 -51
  287. data/test/lib/vedeu/repositories/keymaps_test.rb +0 -223
  288. data/test/lib/vedeu/repositories/models/buffer_test.rb +0 -174
  289. data/test/lib/vedeu/repositories/models/cursor_test.rb +0 -158
  290. data/test/lib/vedeu/repositories/models/event_test.rb +0 -53
  291. data/test/lib/vedeu/repositories/models/group_test.rb +0 -98
  292. data/test/lib/vedeu/repositories/models/interface_test.rb +0 -130
  293. data/test/lib/vedeu/repositories/models/keymap_test.rb +0 -27
  294. data/test/lib/vedeu/repositories/models/menu_test.rb +0 -246
  295. data/test/lib/vedeu/repositories/models/offset_test.rb +0 -128
  296. data/test/lib/vedeu/repositories/offsets_test.rb +0 -39
  297. data/test/lib/vedeu/support/keymap_validator_test.rb +0 -62
  298. data/test/lib/vedeu/support/model_test.rb +0 -23
  299. data/test/lib/vedeu/support/presentation_test.rb +0 -53
  300. data/test/lib/vedeu/support/registrar_test.rb +0 -94
  301. data/test/lib/vedeu/support/repository_test.rb +0 -208
  302. data/test/support/test_classes/all.rb +0 -5
  303. data/test/support/test_classes/coercions.rb +0 -16
  304. data/test/support/test_classes/model.rb +0 -23
  305. data/test/support/test_modules/all.rb +0 -1
@@ -0,0 +1,49 @@
1
+ require 'vedeu/dsl/shared/all'
2
+ require 'vedeu/support/common'
3
+
4
+ module Vedeu
5
+
6
+ module DSL
7
+
8
+ # Provides methods to be used to define views.
9
+ #
10
+ # @api public
11
+ class Stream
12
+
13
+ include Vedeu::Common
14
+ include Vedeu::DSL
15
+ include Vedeu::DSL::Colour
16
+ include Vedeu::DSL::Style
17
+ include Vedeu::DSL::Text
18
+
19
+ # Returns an instance of DSL::Stream.
20
+ #
21
+ # @param model [Vedeu::Stream]
22
+ def initialize(model, client = nil)
23
+ @model = model
24
+ @client = client
25
+ end
26
+
27
+ def stream(&block)
28
+ fail InvalidSyntax, 'block not given' unless block_given?
29
+
30
+ model.add(model.class.build(attributes, &block))
31
+ end
32
+
33
+ private
34
+
35
+ attr_reader :client, :model
36
+
37
+ # @return [Hash]
38
+ def attributes
39
+ {
40
+ client: client,
41
+ parent: model.parent,
42
+ }
43
+ end
44
+
45
+ end # Stream
46
+
47
+ end # DSL
48
+
49
+ end # Vedeu
@@ -0,0 +1,136 @@
1
+ require 'vedeu/models/view/composition'
2
+
3
+ module Vedeu
4
+
5
+ module DSL
6
+
7
+ # DSL for creating views.
8
+ #
9
+ # @api public
10
+ class View
11
+
12
+ class << self
13
+
14
+ # Register an interface by name which will display output from a event
15
+ # or command. This provides the means for you to define your the views
16
+ # of your application without their content.
17
+ #
18
+ # @todo More documentation required.
19
+ #
20
+ # @param name [String] The name of the interface. Used to reference the
21
+ # interface throughout your application's execution lifetime.
22
+ # @param block [Proc] A set of attributes which define the features of
23
+ # the interface.
24
+ #
25
+ # @example
26
+ # Vedeu.interface 'my_interface' do
27
+ # # ...
28
+ #
29
+ # Vedeu.interface do
30
+ # name 'interfaces_must_have_a_name'
31
+ # # ...
32
+ #
33
+ # @raise [InvalidSyntax] The required block was not given.
34
+ # @return [Interface]
35
+ def interface(name = '', &block)
36
+ fail InvalidSyntax, 'block not given' unless block_given?
37
+
38
+ attributes = { client: client(&block), name: name }
39
+
40
+ Vedeu::Interface.build(attributes, &block).store
41
+ end
42
+
43
+ # Immediate render
44
+ #
45
+ # Directly write a view buffer to the terminal. Using this method means
46
+ # that the refresh event does not need to be triggered after creating
47
+ # the views, though can be later triggered if needed.
48
+ #
49
+ # @param block [Proc] The directives you wish to send to render.
50
+ # Typically includes `view` with associated sub-directives.
51
+ #
52
+ # @example
53
+ # Vedeu.renders do
54
+ # view 'my_interface' do
55
+ # # ...
56
+ #
57
+ # @raise [InvalidSyntax] The required block was not given.
58
+ # @return [Array<Interface>]
59
+ def renders(&block)
60
+ fail InvalidSyntax, 'block not given' unless block_given?
61
+
62
+ store(:store_immediate, &block)
63
+ end
64
+
65
+ # Deferred view
66
+ #
67
+ # Define a view (content) for an interface.
68
+ #
69
+ # @note The views declared within this block are stored in their
70
+ # respective interface back buffers until a refresh event occurs. When
71
+ # the refresh event is triggered, the back buffers are swapped into the
72
+ # front buffers and the content here will be rendered to
73
+ # {Vedeu::Terminal.output}.
74
+ #
75
+ # @param block [Proc] The directives you wish to send to render. Typically
76
+ # includes `view` with associated sub-directives.
77
+ #
78
+ # @example
79
+ # Vedeu.views do
80
+ # view 'my_interface' do
81
+ # # ... some attributes ...
82
+ # end
83
+ # view 'my_other_interface' do
84
+ # # ... some other attributes ...
85
+ # end
86
+ # ...
87
+ #
88
+ # @raise [InvalidSyntax] The required block was not given.
89
+ # @return [Array<Interface>]
90
+ def views(&block)
91
+ fail InvalidSyntax, 'block not given' unless block_given?
92
+
93
+ store(:store_deferred, &block)
94
+ end
95
+
96
+ private
97
+
98
+ # Returns the client object which called the DSL method.
99
+ #
100
+ # @param block [Proc]
101
+ # @return [Object]
102
+ def client(&block)
103
+ eval('self', block.binding)
104
+ end
105
+
106
+ # Creates a new Composition which may contain one or more views
107
+ # (Interface objects).
108
+ #
109
+ # @param client [Object]
110
+ # @param block [Proc]
111
+ # @return [Vedeu::Composition]
112
+ def composition(client, &block)
113
+ Vedeu::Composition.build({ client: client }, &block)
114
+ end
115
+
116
+ # Stores each of the views defined in their respective buffers ready to
117
+ # be rendered on next refresh.
118
+ #
119
+ # @param method [Symbol] An instruction; `:store_immediate` or
120
+ # `:store_deferred` which determines whether the view will be shown
121
+ # immediately or later respectively.
122
+ # @param block [Proc]
123
+ # @return [Array]
124
+ def store(method, &block)
125
+ composition(client(&block), &block).interfaces.map do |interface|
126
+ interface.public_send(method)
127
+ end
128
+ end
129
+
130
+ end
131
+
132
+ end # View
133
+
134
+ end # DSL
135
+
136
+ end # Vedeu
@@ -0,0 +1,10 @@
1
+ require 'vedeu/events/event'
2
+ require 'vedeu/events/trigger'
3
+
4
+ module Vedeu
5
+
6
+ def self.events
7
+ @_events ||= Vedeu::Repository.new(Vedeu::Model::Collection)
8
+ end
9
+
10
+ end # Vedeu
@@ -1,3 +1,7 @@
1
+ require 'vedeu/models/model'
2
+ require 'vedeu/repositories/repository'
3
+ require 'vedeu/events/trigger'
4
+
1
5
  module Vedeu
2
6
 
3
7
  # Contains all the logic of an event. Handles debouncing and throttling.
@@ -5,7 +9,81 @@ module Vedeu
5
9
  # @api private
6
10
  class Event
7
11
 
8
- include Model
12
+ include Vedeu::Model
13
+
14
+ class << self
15
+
16
+ # Register an event by name with optional delay (throttling) which when
17
+ # triggered will execute the code contained within the passed block.
18
+ #
19
+ # @param name [Symbol] The name of the event which will be triggered later.
20
+ # @param [Hash] options The options to register the event with.
21
+ # @option options :delay [Fixnum|Float] Limits the execution of the
22
+ # triggered event to only execute when first triggered, with subsequent
23
+ # triggering being ignored until the delay has expired.
24
+ # @option options :debounce [Fixnum|Float] Limits the execution of the
25
+ # triggered event to only execute once the debounce has expired.
26
+ # Subsequent triggers before debounce expiry are ignored.
27
+ # @param block [Proc] The event to be executed when triggered. This block
28
+ # could be a method call, or the triggering of another event, or sequence
29
+ # of either/both.
30
+ #
31
+ # @example
32
+ # Vedeu.bind :my_event do |some, args|
33
+ # ... some code here ...
34
+ #
35
+ # Vedeu.trigger(:my_other_event)
36
+ # end
37
+ #
38
+ # T = Triggered, X = Executed, i = Ignored.
39
+ #
40
+ # 0.0.....0.2.....0.4.....0.6.....0.8.....1.0.....1.2.....1.4.....1.6...
41
+ # .T...T...T...T...T...T...T...T...T...T...T...T...T...T...T...T...T...T
42
+ # .X...i...i...i...i...X...i...i...i...i...X...i...i...i...i...i...i...i
43
+ #
44
+ # Vedeu.bind(:my_delayed_event, { delay: 0.5 })
45
+ # ... some code here ...
46
+ # end
47
+ #
48
+ # T = Triggered, X = Executed, i = Ignored.
49
+ #
50
+ # 0.0.....0.2.....0.4.....0.6.....0.8.....1.0.....1.2.....1.4.....1.6...
51
+ # .T...T...T...T...T...T...T...T...T...T...T...T...T...T...T...T...T...T
52
+ # .i...i...i...i...i...i...i...X...i...i...i...i...i...i...X...i...i...i
53
+ #
54
+ # Vedeu.bind(:my_debounced_event, { debounce: 0.7 })
55
+ # ... some code here ...
56
+ # end
57
+ #
58
+ # @return [TrueClass]
59
+ def bind(name, options = {}, &block)
60
+ Vedeu.log("Binding event: '#{name}'")
61
+
62
+ new(name, options, block).bind
63
+ end
64
+ alias_method :event, :bind
65
+ alias_method :register, :bind
66
+
67
+ # @see Vedeu::Trigger.trigger
68
+ def trigger(name, *args)
69
+ Vedeu::Trigger.trigger(name, *args)
70
+ end
71
+
72
+ # Unbind events from a named handler.
73
+ #
74
+ # @param name [String]
75
+ # @return [Boolean]
76
+ def unbind(name)
77
+ return false unless Vedeu.events.registered?(name)
78
+
79
+ Vedeu.log("Unbinding event: '#{name}")
80
+
81
+ Vedeu.events.remove(name)
82
+ true
83
+ end
84
+ alias_method :unevent, :unbind
85
+
86
+ end
9
87
 
10
88
  # Returns a new instance of Event.
11
89
  #
@@ -20,10 +98,26 @@ module Vedeu
20
98
  @deadline = 0
21
99
  @executed_at = 0
22
100
  @now = 0
101
+ @repository = Vedeu.events
102
+ end
103
+
104
+ def bind
105
+ if repository.registered?(name)
106
+ collection = repository.find(name)
107
+ new_collection = collection.add(self)
108
+
109
+ else
110
+ new_collection = Vedeu::Model::Collection.new([self], nil, name)
111
+
112
+ end
113
+
114
+ repository.store(new_collection)
115
+
116
+ true
23
117
  end
24
118
 
25
119
  # Triggers the event based on debouncing and throttling conditions.
26
- #
120
+
27
121
  # @param args [Array]
28
122
  # @return []
29
123
  def trigger(*args)
@@ -39,11 +133,6 @@ module Vedeu
39
133
  attr_reader :closure, :name
40
134
  attr_accessor :deadline, :executed_at, :now
41
135
 
42
- # @return [Class] The repository class for this model.
43
- def repository
44
- Vedeu::Events
45
- end
46
-
47
136
  # Execute the code stored in the event closure.
48
137
  #
49
138
  # @param args []
@@ -162,7 +251,7 @@ module Vedeu
162
251
  defaults.merge(@options)
163
252
  end
164
253
 
165
- # The default values for a new instance of Event.
254
+ # The default values for a new instance of this class.
166
255
  #
167
256
  # @return [Hash]
168
257
  def defaults
@@ -0,0 +1,58 @@
1
+ module Vedeu
2
+
3
+ # Trigger a registered or system event by name with arguments. If the
4
+ # event stored returns a value, that is returned. If multiple events are
5
+ # registered for a name, then the result of each event will be returned as
6
+ # part of a collection.
7
+ #
8
+ # @example
9
+ # Vedeu.trigger(:my_event, :oxidize, 'nitrogen')
10
+ #
11
+ # @api private
12
+ class Trigger
13
+
14
+ class << self
15
+
16
+ # @param name [Symbol] The name of the event you wish to trigger. The event
17
+ # does not have to exist.
18
+ # @param args [Array] Any arguments the event needs to execute correctly.
19
+ # @return [Array]
20
+ def trigger(name, *args)
21
+ new(name, *args).trigger
22
+ end
23
+
24
+ end
25
+
26
+ # @see Vedeu::Trigger.trigger
27
+ # @return [Trigger]
28
+ def initialize(name, *args)
29
+ @name = name
30
+ @args = args
31
+ @repository = Vedeu.events
32
+ end
33
+
34
+ # @see Vedeu::Trigger.trigger
35
+ # @return [Array]
36
+ def trigger
37
+ return [] unless repository.registered?(name)
38
+
39
+ collection = repository.find(name)
40
+
41
+ results = collection.map do |event|
42
+ event.trigger(*args)
43
+ end
44
+
45
+ return results.first if results.one?
46
+
47
+ results
48
+ end
49
+
50
+ private
51
+
52
+ attr_reader :name,
53
+ :args,
54
+ :repository
55
+
56
+ end # Trigger
57
+
58
+ end # Vedeu
@@ -0,0 +1,34 @@
1
+ module Vedeu
2
+
3
+ # ModelNotFound: Raised with Vedeu attempts to access a named model that does
4
+ # not exist.
5
+ #
6
+ # InvalidSyntax: Raised when Vedeu attempts to parse a {Vedeu.view} or
7
+ # {Vedeu.interface} and encounters a problem.
8
+ #
9
+ # MissingRequired: Raised when a name is not provided for a model when
10
+ # attempting to store it in a repository.
11
+ #
12
+ # ModeSwitch: Raised intentionally when the client application wishes to
13
+ # switch between cooked and raw (or vice versa) terminal modes. Vedeu is
14
+ # hard-wired to use the `Escape` key to trigger this change for the time
15
+ # being.
16
+ #
17
+ # NotImplemented: Raised to remind me (or client application developers) that
18
+ # the subclass implements the functionality sought.
19
+ #
20
+ # OutOfRange: Raised when trying to access an interface column less than 1 or
21
+ # greater than 12. Vedeu is hard-wired to a 12-column layout for the time
22
+ # being.
23
+
24
+ Exceptions = %w[
25
+ ModelNotFound
26
+ InvalidSyntax
27
+ MissingRequired
28
+ ModeSwitch
29
+ NotImplemented
30
+ OutOfRange
31
+ ]
32
+ Exceptions.each { |e| const_set(e, Class.new(StandardError)) }
33
+
34
+ end # Vedeu
@@ -0,0 +1,29 @@
1
+ require 'vedeu/repositories/repository'
2
+ require 'vedeu/input/mapper'
3
+ require 'vedeu/input/keys'
4
+ require 'vedeu/input/key'
5
+ require 'vedeu/input/input'
6
+ require 'vedeu/input/keymap'
7
+
8
+ module Vedeu
9
+
10
+ extend self
11
+
12
+ def keymaps
13
+ @_keymaps ||= Vedeu::Repository.new(Vedeu::Keymap)
14
+ end
15
+
16
+ def_delegators Vedeu::Keymap, :keymap
17
+ def_delegators Vedeu::Keymap, :keypress
18
+
19
+ Vedeu.keymap('_system_') do |keymap|
20
+ Vedeu::Configuration.system_keys.each do |label, keypress|
21
+ keymap.key(keypress) { Vedeu.trigger(("_" + label.to_s + "_").to_sym) }
22
+ end
23
+ end
24
+
25
+ Vedeu.keymap('_global_') do
26
+
27
+ end
28
+
29
+ end # Vedeu
@@ -87,6 +87,32 @@ module Vedeu
87
87
  "\e[1;2Q" => :scroll_lock,
88
88
  "\e[1;2R" => :pause_break,
89
89
  "\u007F" => :backspace,
90
+ "\u0001" => :ctrl_a,
91
+ "\u0002" => :ctrl_b,
92
+ "\u0003" => :ctrl_c,
93
+ "\u0004" => :ctrl_d,
94
+ "\u0005" => :ctrl_e,
95
+ "\u0006" => :ctrl_f,
96
+ "\u0007" => :ctrl_g,
97
+ "\u0008" => :ctrl_h,
98
+ # "\u0009" => :ctrl_i, # duplicates tab
99
+ "\u0010" => :ctrl_j,
100
+ "\u0011" => :ctrl_k,
101
+ "\u0012" => :ctrl_l,
102
+ "\u0013" => :ctrl_m,
103
+ "\u0014" => :ctrl_n,
104
+ "\u0015" => :ctrl_o,
105
+ "\u0016" => :ctrl_p,
106
+ "\u0017" => :ctrl_q,
107
+ "\u0018" => :ctrl_r,
108
+ "\u0019" => :ctrl_s,
109
+ # "\u0020" => :ctrl_t, # duplicates spacebar
110
+ "\u0021" => :ctrl_u,
111
+ "\u0022" => :ctrl_v,
112
+ "\u0023" => :ctrl_w,
113
+ "\u0024" => :ctrl_x,
114
+ "\u0025" => :ctrl_y,
115
+ "\u0026" => :ctrl_z,
90
116
  }
91
117
  end
92
118
 
@@ -1,16 +1,30 @@
1
1
  module Vedeu
2
2
 
3
+ #
3
4
  # A single keypress or combination of keypresses bound to a specific action.
5
+ #
4
6
  class Key
5
7
 
8
+ # Creates a new instance of Key.
9
+ #
10
+ # @see Vedeu::Key#initialize
11
+ def self.define(input = nil, &block)
12
+ fail InvalidSyntax, 'block not given' unless block_given?
13
+
14
+ new(input, &block)
15
+ end
16
+
6
17
  # Returns a new instance of Key.
7
18
  #
8
19
  # @param input [String|Symbol]
9
- # @param output [Proc]
20
+ # @param block [Proc]
21
+ # @raise [InvalidSyntax] The required block was not given.
10
22
  # @return [Key]
11
- def initialize(input, output)
23
+ def initialize(input = nil, &block)
24
+ fail InvalidSyntax, 'block not given' unless block_given?
25
+
12
26
  @input = input
13
- @output = output
27
+ @output = block
14
28
  end
15
29
 
16
30
  # Returns the key defined.
@@ -21,18 +35,14 @@ module Vedeu
21
35
  end
22
36
  alias_method :key, :input
23
37
 
24
- # The procedure to call when the key is pressed.
25
- def output
26
- @output
27
- end
28
- alias_method :action, :output
29
-
30
38
  # Pressing the key will call the procedure.
31
39
  #
32
40
  # @return [|Symbol]
33
- def press
34
- output.is_a?(Proc) ? output.call : :noop
41
+ def output
42
+ @output.call
35
43
  end
44
+ alias_method :action, :output
45
+ alias_method :press, :output
36
46
 
37
47
  end # Key
38
48
 
@@ -0,0 +1,130 @@
1
+ require 'vedeu/exceptions'
2
+ require 'vedeu/support/common'
3
+ require 'vedeu/models/model'
4
+ require 'vedeu/dsl/components/keymap'
5
+
6
+ module Vedeu
7
+
8
+ class Keymap
9
+
10
+ include Vedeu::Common
11
+ include Vedeu::Model
12
+
13
+ attr_accessor :name
14
+ attr_reader :keys, :repository
15
+
16
+ class << self
17
+
18
+
19
+ # @option attributes client []
20
+ # @option attributes keys []
21
+ # @option attributes name []
22
+ # @option attributes repository []
23
+ def build(attributes = {}, &block)
24
+ fail InvalidSyntax, 'block not given' unless block_given?
25
+
26
+ attributes = defaults.merge(attributes)
27
+
28
+ model = new(attributes[:name],
29
+ attributes[:keys],
30
+ attributes[:repository])
31
+ model.deputy(attributes[:client]).instance_eval(&block)
32
+ model.store
33
+ end
34
+
35
+ # Define actions for keypresses for when specific interfaces are in focus.
36
+ # Unless an interface is specified, the key will be assumed to be global,
37
+ # meaning its action will happen regardless of the interface in focus.
38
+ #
39
+ # @note
40
+ # When defining an interface, there is no need to provide a name since
41
+ # this can be discerned from the interface itself, e.g:
42
+ #
43
+ # Vedeu.interface 'my_interface' do
44
+ # keymap do
45
+ # ...
46
+ #
47
+ # @param name [String] The name of the interface which this keymap relates
48
+ # to.
49
+ # @param block [Proc]
50
+ #
51
+ # @example
52
+ # keymap 'my_interface' do
53
+ # ...
54
+ #
55
+ # @raise [InvalidSyntax] The required block was not given.
56
+ # @return [Keymap]
57
+ def keymap(name, &block)
58
+ new(name).store
59
+
60
+ build({ name: name }, &block)
61
+ end
62
+
63
+ private
64
+
65
+ # The default values for a new instance of this class.
66
+ #
67
+ # @return [Hash]
68
+ def defaults
69
+ {
70
+ client: nil,
71
+ keys: [],
72
+ name: '',
73
+ repository: Vedeu.keymaps,
74
+ }
75
+ end
76
+
77
+ end
78
+
79
+ # @param name [String] The name of the keymap.
80
+ # @param keys [Vedeu::Model::Collection|Array] A collection of keys.
81
+ # @return [Vedeu::Keymap]
82
+ def initialize(name = '', keys = [], repository = nil)
83
+ @name = name
84
+ @keys = Vedeu::Model::Collection.coerce(keys)
85
+ @repository = repository || Vedeu.keymaps
86
+ end
87
+
88
+ # @param key [Key]
89
+ def add(key)
90
+ return false unless valid?(key)
91
+
92
+ @keys << key
93
+
94
+ # immutable Keymap version:
95
+ # self.new(name, @keys += [key]).store if valid?(key)
96
+ end
97
+
98
+ # @param input [String|Symbol]
99
+ # @return [Boolean] A boolean indicating the input provided is already in
100
+ # use for this keymap.
101
+ def key_defined?(input)
102
+ keys.any? { |key| key.input == input }
103
+ end
104
+
105
+ # @param input [String|Symbol]
106
+ # @return [Array|FalseClass]
107
+ def use(input)
108
+ return false unless key_defined?(input)
109
+
110
+ Vedeu.log("Key pressed: '#{input}'")
111
+
112
+ Vedeu.trigger(:key, input)
113
+
114
+ keys.select { |key| key.input == input }.map(&:press)
115
+ end
116
+
117
+ private
118
+
119
+ # @param key [Vedeu::Key]
120
+ def valid?(key)
121
+ return true unless key_defined?(key.input)
122
+
123
+ Vedeu.log("Keymap '#{name}' already defines '#{key.input}'.")
124
+
125
+ false
126
+ end
127
+
128
+ end # Keymap
129
+
130
+ end # Vedeu
@@ -0,0 +1,8 @@
1
+ require 'vedeu/models/collection'
2
+
3
+ module Vedeu
4
+
5
+ class Keys < Vedeu::Model::Collection
6
+ end # Keys
7
+
8
+ end # Vedeu