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,72 @@
1
+ module Vedeu
2
+
3
+ module DSL
4
+
5
+ # DSL for creating collections of interfaces.
6
+ #
7
+ class Composition
8
+
9
+ include Vedeu::DSL
10
+
11
+ # Returns an instance of DSL::Composition.
12
+ #
13
+ # @param model [Composition]
14
+ def initialize(model, client = nil)
15
+ @model = model
16
+ @client = client
17
+ end
18
+
19
+ # Define a view.
20
+ #
21
+ # A view is just an Interface object.
22
+ #
23
+ # @todo More documentation required.
24
+ # @param name [String] The name of the interface you are targetting for
25
+ # this view.
26
+ # @param block [Proc] The directives you wish to send to this interface.
27
+ #
28
+ # @example
29
+ # view 'my_interface' do
30
+ # ...
31
+ #
32
+ # @raise [InvalidSyntax] The required block was not given.
33
+ # @return [Vedeu::Model::Collection<Vedeu::Interface>]
34
+ def view(name = '', &block)
35
+ fail InvalidSyntax, 'block not given' unless block_given?
36
+
37
+ child_model = if Vedeu.interfaces.registered?(name)
38
+ interface = Vedeu.interfaces.find(name)
39
+ child.build(attributes.merge(interface.attributes), &block)
40
+
41
+ else
42
+ child.build(attributes.merge({ name: name }), &block)
43
+
44
+ end
45
+
46
+ model.add(child_model)
47
+ end
48
+
49
+ private
50
+
51
+ attr_reader :client, :model
52
+
53
+ # @return [Hash]
54
+ def attributes
55
+ {
56
+ client: client,
57
+ parent: model,
58
+ }
59
+ end
60
+
61
+ # Return the class name for the children on this model.
62
+ #
63
+ # @return [Class]
64
+ def child
65
+ Vedeu::Interface
66
+ end
67
+
68
+ end # Composition
69
+
70
+ end # DSL
71
+
72
+ end # Vedeu
@@ -0,0 +1,210 @@
1
+ require 'vedeu/support/common'
2
+
3
+ module Vedeu
4
+
5
+ module DSL
6
+
7
+ # DSL for creating interfaces.
8
+ class Interface
9
+
10
+ include Vedeu::Common
11
+ include Vedeu::DSL
12
+ include Vedeu::DSL::Colour
13
+ include Vedeu::DSL::Style
14
+ include Vedeu::DSL::Text
15
+ include Vedeu::DSL::Use
16
+
17
+ # Returns an instance of Vedeu::DSL::Interface.
18
+ #
19
+ # @param model [Vedeu::DSL::Interface]
20
+ # @param client [Object]
21
+ # @return [Vedeu::DSL::Interface]
22
+ def initialize(model, client = nil)
23
+ @model = model
24
+ @client = client
25
+ end
26
+
27
+ # Allows the setting of a border for the interface.
28
+ #
29
+ # @param block [Proc]
30
+ # @raise [InvalidSyntax] The required block was not given.
31
+ # @return [Hash]
32
+ def border(&block)
33
+ fail InvalidSyntax, 'block not given' unless block_given?
34
+
35
+ border_attrs = attributes.merge({ enabled: true, interface: model })
36
+
37
+ model.border = Vedeu::Border.build(border_attrs, &block)
38
+ end
39
+
40
+ # Set the cursor visibility on an interface.
41
+ #
42
+ # @param value [Boolean] Any value other than nil or false will evaluate
43
+ # to true.
44
+ #
45
+ # @example
46
+ # interface 'my_interface' do
47
+ # cursor true # => show the cursor for this interface
48
+ # cursor :show # => both of these are equivalent to line above
49
+ # cursor! #
50
+ # # ...
51
+ #
52
+ # cursor false # => hide the cursor for this interface
53
+ # cursor :hide # => both of these are equivalent to line above
54
+ # cursor nil #
55
+ # # ...
56
+ #
57
+ # view 'my_interface' do
58
+ # cursor true
59
+ # # ...
60
+ #
61
+ # @return [Cursor]
62
+ def cursor(value = true)
63
+ Vedeu::Cursor.new({ name: model.name, state: value }).store
64
+ end
65
+
66
+ def cursor!
67
+ cursor(true)
68
+ end
69
+
70
+ # To maintain performance interfaces can be delayed from refreshing too
71
+ # often, the reduces artefacts particularly when resizing the terminal
72
+ # screen.
73
+ #
74
+ # @param value [Fixnum|Float]
75
+ #
76
+ # @example
77
+ # interface 'my_interface' do
78
+ # delay 0.5 # interface will not update more often than every 500ms.
79
+ # # ...
80
+ #
81
+ # @return [Fixnum|Float]
82
+ def delay(value)
83
+ model.delay = value
84
+ end
85
+
86
+ # Specify this interface as being in focus when the application starts.
87
+ #
88
+ # @note If multiple interfaces are defined, and this is included in each,
89
+ # then the last defined will be the interface in focus.
90
+ #
91
+ # @return [String] The name of the interface in focus.
92
+ def focus!
93
+ Vedeu::Focus.add(model.name, true) if defined_value?(model.name)
94
+ end
95
+
96
+ # Define the geometry for an interface.
97
+ #
98
+ # @param block [Proc]
99
+ #
100
+ # @example
101
+ # interface 'my_interface' do
102
+ # geometry do
103
+ # # ...
104
+ #
105
+ # @raise [InvalidSyntax] The required block was not given.
106
+ # @return [Geometry]
107
+ # @see Vedeu::DSL::Geometry
108
+ def geometry(&block)
109
+ fail InvalidSyntax, 'block not given' unless block_given?
110
+
111
+ model.geometry = Vedeu::Geometry.build(attributes, &block)
112
+ end
113
+
114
+ # Specify a group for an interface. Interfaces of the same group can be
115
+ # targetted together; for example you may want to refresh multiple
116
+ # interfaces at once.
117
+ #
118
+ # @param value [String] The name for the group of interfaces.
119
+ #
120
+ # @example
121
+ # interface 'my_interface' do
122
+ # group 'main_screen'
123
+ # # ...
124
+ #
125
+ # @return [String]
126
+ def group(value)
127
+ if defined_value?(model.name)
128
+ if Vedeu.groups.registered?(value)
129
+ Vedeu.groups.find(value).add(model.name)
130
+
131
+ else
132
+ Vedeu::Group.new(value, model.name).store
133
+
134
+ end
135
+ end
136
+
137
+ model.group = value
138
+ end
139
+
140
+ # @see Vedeu::Keymap.keymap
141
+ def keymap(name = model.name, &block)
142
+ Vedeu.keymap(name, &block)
143
+ end
144
+ alias_method :keys, :keymap
145
+
146
+ # Specify multiple lines in a view.
147
+ #
148
+ # @param block [Proc]
149
+ #
150
+ # @example
151
+ # view 'my_interface' do
152
+ # lines do
153
+ # # ... see {Vedeu::DSL::Line} and {Vedeu::DSL::Stream}
154
+ # end
155
+ # end
156
+ #
157
+ # view 'my_interface' do
158
+ # line do
159
+ # # ... see {Vedeu::DSL::Line} and {Vedeu::DSL::Stream}
160
+ # end
161
+ # end
162
+ #
163
+ # @raise [InvalidSyntax] The required block was not given.
164
+ # @return [Line]
165
+ def lines(&block)
166
+ fail InvalidSyntax, 'block not given' unless block_given?
167
+
168
+ model.add(child.build(attributes, &block))
169
+ end
170
+ alias_method :line, :lines
171
+
172
+ # The name of the interface. Used to reference the interface throughout
173
+ # your application's execution lifetime.
174
+ #
175
+ # @param value [String]
176
+ #
177
+ # @example
178
+ # interface do
179
+ # name 'my_interface'
180
+ # # ...
181
+ #
182
+ # @return [String]
183
+ def name(value)
184
+ model.name = value
185
+ end
186
+
187
+ private
188
+
189
+ attr_reader :client, :model
190
+
191
+ # @return [Hash]
192
+ def attributes
193
+ {
194
+ client: client,
195
+ parent: model,
196
+ }
197
+ end
198
+
199
+ # Return the class name for the children on this model.
200
+ #
201
+ # @return [Class]
202
+ def child
203
+ Vedeu::Line
204
+ end
205
+
206
+ end # Interface
207
+
208
+ end # DSL
209
+
210
+ end # Vedeu
@@ -0,0 +1,135 @@
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
+ # @example
11
+ # Vedeu.renders do
12
+ # view 'my_interface' do
13
+ # lines do
14
+ # background '#000000'
15
+ # foreground '#ffffff'
16
+ # line 'This is white text on a black background.'
17
+ # line 'Next is a blank line:'
18
+ # line ''
19
+ #
20
+ # streams { stream 'We can define ' }
21
+ #
22
+ # streams do
23
+ # foreground '#ff0000'
24
+ # stream 'parts of a line '
25
+ # end
26
+ #
27
+ # streams { stream 'independently using ' }
28
+ #
29
+ # streams do
30
+ # foreground '#00ff00'
31
+ # stream 'streams.'
32
+ # end
33
+ # end
34
+ # end
35
+ # end
36
+ #
37
+ # @api public
38
+ class Line
39
+
40
+ include Vedeu::Common
41
+ include Vedeu::DSL
42
+ include Vedeu::DSL::Colour
43
+ include Vedeu::DSL::Style
44
+ include Vedeu::DSL::Text
45
+
46
+ # Returns an instance of DSL::Line.
47
+ #
48
+ # @param model [Vedeu::Line]
49
+ def initialize(model, client = nil)
50
+ @model = model
51
+ @client = client
52
+ end
53
+
54
+ # Specify a single line in a view.
55
+ #
56
+ # @example
57
+ # Vedeu.renders do
58
+ # view 'my_interface' do
59
+ # line 'some text...'
60
+ # # ...
61
+ #
62
+ # line do
63
+ # # ...
64
+ #
65
+ # @return [Vedeu::Line]
66
+ def line(value = '', &block)
67
+ content = if block_given?
68
+ Vedeu::Line.build({ client: client,
69
+ parent: model.parent }, &block)
70
+
71
+ elsif value
72
+ stream = Vedeu::Stream.build({ client: client,
73
+ parent: model,
74
+ value: value })
75
+ Vedeu::Line.build({ client: client,
76
+ parent: model.parent,
77
+ streams: [stream] })
78
+
79
+ else
80
+ fail InvalidSyntax, 'block not given'
81
+
82
+ end
83
+
84
+ model.parent.add(content)
85
+ end
86
+
87
+ # Define multiple streams (a stream is a subset of a line).
88
+ # Uses {Vedeu::DSL::Stream} for all directives within the required block.
89
+ #
90
+ # @param block [Proc]
91
+ #
92
+ # @example
93
+ # Vedeu.renders do
94
+ # view 'my_interface' do
95
+ # line do
96
+ # streams do
97
+ # # ...
98
+ #
99
+ # stream do
100
+ # # ...
101
+ #
102
+ # @raise [InvalidSyntax] The required block was not given.
103
+ # @return [Vedeu::Streams<Vedeu::Stream>]
104
+ # @see Vedeu::DSL::Stream for subdirectives.
105
+ def streams(&block)
106
+ fail InvalidSyntax, 'block not given' unless block_given?
107
+
108
+ model.add(child.build(attributes, &block))
109
+ end
110
+ alias_method :stream, :streams
111
+
112
+ private
113
+
114
+ attr_reader :client, :model
115
+
116
+ # @return [Hash]
117
+ def attributes
118
+ {
119
+ client: client,
120
+ parent: model,
121
+ }
122
+ end
123
+
124
+ # Return the class name for the children on this model.
125
+ #
126
+ # @return [Class]
127
+ def child
128
+ Vedeu::Stream
129
+ end
130
+
131
+ end # Line
132
+
133
+ end # DSL
134
+
135
+ end # Vedeu
@@ -0,0 +1,7 @@
1
+ require 'vedeu/dsl/shared/text'
2
+ require 'vedeu/dsl/shared/colour'
3
+ require 'vedeu/dsl/shared/style'
4
+ require 'vedeu/dsl/shared/use'
5
+
6
+ module Vedeu
7
+ end # Vedeu
@@ -0,0 +1,85 @@
1
+ module Vedeu
2
+
3
+ module DSL
4
+
5
+ # Provides colour helpers for use in the {Vedeu::DSL::Interface},
6
+ # {Vedeu::DSL::Line} and {Vedeu::DSL::Stream} classes.
7
+ #
8
+ # @api public
9
+ module Colour
10
+
11
+ # Define the background colour for an interface, line, or a stream. When
12
+ # called with a block, will create a new stream with the background colour
13
+ # specified. When the block terminates, the background will return to that
14
+ # of the parent.
15
+ #
16
+ # @note The last defined background colour for a particular interface,
17
+ # line or stream overrides previously defined entries in the same block.
18
+ #
19
+ # @param value [String]
20
+ #
21
+ # @example
22
+ # interface 'my_interface' do
23
+ # background '#0022ff' # /or/ (blue)
24
+ # bgcolor '#22ff00' # /or/ (blue is overridden to green)
25
+ # bg '#ff0022' # (green is overridden to red)
26
+ # # ...
27
+ #
28
+ # lines do
29
+ # background '#2200ff'
30
+ # # ...
31
+ #
32
+ # stream do
33
+ # background '#22ff00'
34
+ # # ...
35
+ #
36
+ # @return [String]
37
+ def background(value = '')
38
+ colour({ background: value })
39
+ end
40
+ alias_method :bg, :background
41
+ alias_method :bgcolor, :background
42
+
43
+ # @see Vedeu::DSL::Colour#background
44
+ def foreground(value = '')
45
+ colour({ foreground: value })
46
+ end
47
+ alias_method :fg, :foreground
48
+ alias_method :fgcolor, :foreground
49
+
50
+ # Define either or both foreground and background colours for an
51
+ # interface, line or a stream. At least one attribute is required.
52
+ #
53
+ # @note Rejects invalid keys and empty/nil attributes. Also, the last
54
+ # defined colour for a particular interface, line or stream overrides
55
+ # previously defined entries in the same block.
56
+ #
57
+ # @param attributes [Hash] See {Vedeu::Colour}
58
+ #
59
+ # @example
60
+ # interface 'my_interface' do
61
+ # colour background: '#ff00ff', foreground: '#ffff00'
62
+ # # ...
63
+ #
64
+ # lines do
65
+ # colour background: '#000000', foreground: '#ffffff'
66
+ # # ...
67
+ #
68
+ # stream do
69
+ # colour background: '#000000', foreground: '#ffffff'
70
+ # # ...
71
+ #
72
+ # @return [Hash]
73
+ def colour(attributes = {})
74
+ attributes.delete_if do |k, v|
75
+ [:background, :foreground].include?(k) == false || v.nil? || v.empty?
76
+ end
77
+
78
+ model.colour = Vedeu::Colour.new(attributes)
79
+ end
80
+
81
+ end # Colour
82
+
83
+ end # DSL
84
+
85
+ end # Vedeu
@@ -0,0 +1,38 @@
1
+ module Vedeu
2
+
3
+ module DSL
4
+
5
+ # Provides a style helper for use in the {DSL::Interface}, {DSL::Line} and
6
+ # {DSL::Stream} classes.
7
+ #
8
+ # @api public
9
+ module Style
10
+
11
+ # Define a style or styles for an interface, line or a stream.
12
+ #
13
+ # @param value [Array|Symbol|String]
14
+ #
15
+ # @example
16
+ # interface 'my_interface' do
17
+ # style 'normal'
18
+ # ...
19
+ #
20
+ # lines do
21
+ # style ['bold', 'underline']
22
+ # ...
23
+ #
24
+ # stream do
25
+ # style 'blink'
26
+ # ...
27
+ #
28
+ # @return [Vedeu::Style]
29
+ def style(value)
30
+ model.style = Vedeu::Style.coerce(value)
31
+ end
32
+ alias_method :styles, :style
33
+
34
+ end # Style
35
+
36
+ end # DSL
37
+
38
+ end # Vedeu
@@ -0,0 +1,102 @@
1
+ require 'vedeu/support/text'
2
+
3
+ module Vedeu
4
+
5
+ module DSL
6
+
7
+ module Text
8
+
9
+ # Specify the content for a view. Provides the means to align a string
10
+ # (or object responding to `to_s`), and add it as a Line or to the Stream.
11
+ #
12
+ # @note If using the convenience methods; {left}, {centre}, {center} or
13
+ # {right}, then a specified anchor will be ignored.
14
+ #
15
+ # @example
16
+ # lines do
17
+ # centre '...'
18
+ #
19
+ # line do
20
+ # right '...'
21
+ #
22
+ # left 'This will be left aligned.', width: 35
23
+ # # => 'This will be left aligned. '
24
+ #
25
+ # centre 'This will be aligned centrally.', width: 35
26
+ # # => ' This will be aligned centrally. '
27
+ # # centre is also aliased to center
28
+ #
29
+ # right 'This will be right aligned.', width: 35
30
+ # # => ' This will be right aligned.'
31
+
32
+ # right 'This will be right aligned.', width: 35, anchor: centre
33
+ # # => ' This will be right aligned.'
34
+ #
35
+ # text 'This will be truncated here. More text here.', width: 28
36
+ # # => 'This will be truncated here.'
37
+ #
38
+ # text 'Padded with hyphens.', width: 25, pad: '-', anchor: :right
39
+ # # => '-----Padded with hyphens.'
40
+ #
41
+ # @param value [String|Object] A string or object that responds to `to_s`.
42
+ # @param options [Hash] Text options.
43
+ # @option options :anchor [Symbol] One of `:left`, `:centre`/`:center`, or
44
+ # `:right`.
45
+ # @option options :width [Integer|NilClass] The width of the text stream
46
+ # to add. If the `string` provided is longer than this value, the string
47
+ # will be truncated. If no width is provided in the context of 'lines',
48
+ # then the interface width is used. If no width is provided in the
49
+ # context of a 'stream', then no alignment will occur.
50
+ # @option options :pad [String] The character to use to pad the width, by
51
+ # default uses an empty space (0x20). Only when the string is shorter
52
+ # than the specified width.
53
+ # @return [String]
54
+ def text(value = '', options = {})
55
+ output = Vedeu::Text.with(value, options.merge({ anchor: __callee__ }))
56
+
57
+ content = if model.is_a?(Vedeu::Interface)
58
+ stream = stream_builder({ value: output })
59
+ Vedeu::Line.build({ streams: [stream], parent: model })
60
+
61
+ elsif model.is_a?(Vedeu::Line)
62
+ stream_builder({ value: output })
63
+
64
+ elsif model.is_a?(Vedeu::Stream)
65
+ stream_builder({ value: output, parent: model.parent })
66
+
67
+ else
68
+ # should never get here
69
+
70
+ end
71
+
72
+ model.add(content)
73
+ end
74
+ alias_method :align, :text
75
+ alias_method :center, :text
76
+ alias_method :centre, :text
77
+ alias_method :left, :text
78
+ alias_method :right, :text
79
+
80
+ private
81
+
82
+ # @param attrs [Hash]
83
+ # @return [Vedeu::Stream]
84
+ def stream_builder(attrs)
85
+ Vedeu::Stream.build(stream_attributes(attrs))
86
+ end
87
+
88
+ # @param attrs [Hash]
89
+ # @return [Hash]
90
+ def stream_attributes(attrs)
91
+ {
92
+ colour: model.colour,
93
+ parent: model,
94
+ style: model.style,
95
+ }.merge(attrs)
96
+ end
97
+
98
+ end # Text
99
+
100
+ end # DSL
101
+
102
+ end # Vedeu
@@ -0,0 +1,47 @@
1
+ module Vedeu
2
+
3
+ module DSL
4
+
5
+ module Use
6
+
7
+ extend self
8
+
9
+ # Use the specified interface; useful for sharing attributes with other
10
+ # interfaces. Any public method of {Vedeu::Interface} is available.
11
+ #
12
+ # @example
13
+ # Vedeu.interface 'my_interface' do
14
+ # # use the delay of another interface
15
+ # delay Vedeu.use('my_other_interface').delay
16
+ # # ...
17
+ # end
18
+ #
19
+ # Vedeu.interface 'my_interface' do
20
+ # geometry do
21
+ # # use the width of another interface
22
+ # width Vedeu.use('my_other_interface').width
23
+ # # ...
24
+ # end
25
+ # end
26
+ #
27
+ # Vedeu.use('my_other_interface').width # can be used in your code to
28
+ # # get this value
29
+ #
30
+ # @param value [String] The name of the interface you wish to use.
31
+ # Typically used when defining interfaces to share geometry.
32
+ # @return [Vedeu::Interface]
33
+ def use(value)
34
+ if Vedeu.interfaces.registered?(value) == false
35
+ fail ModelNotFound, "The properties of this interface (#{value}) " \
36
+ "cannot be used, since the interface has not " \
37
+ "been defined."
38
+ end
39
+
40
+ Vedeu.interfaces.find(value)
41
+ end
42
+
43
+ end # Use
44
+
45
+ end # DSL
46
+
47
+ end # Vedeu