vedeu 0.2.12 → 0.3.0

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