vedeu 0.7.4 → 0.8.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 (277) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +3 -0
  3. data/docs/api.md +5 -1
  4. data/docs/borders.md +2 -26
  5. data/docs/dsl.md +4 -4
  6. data/docs/dsl_elements.md +100 -0
  7. data/docs/events/by_name/action.md +3 -0
  8. data/docs/events/by_name/cursor_hide.md +3 -0
  9. data/docs/events/by_name/cursor_reset.md +3 -0
  10. data/docs/events/by_name/cursor_show.md +3 -0
  11. data/docs/events/by_name/geometry_down.md +3 -0
  12. data/docs/events/by_name/geometry_left.md +3 -0
  13. data/docs/events/by_name/geometry_right.md +3 -0
  14. data/docs/events/by_name/geometry_up.md +3 -0
  15. data/docs/events/by_name/hide_view.md +3 -0
  16. data/docs/events/by_name/set_border_caption.md +13 -0
  17. data/docs/events/by_name/set_border_title.md +13 -0
  18. data/docs/events/by_name/show_view.md +3 -0
  19. data/docs/events/by_name/standalone.md +3 -0
  20. data/docs/events/by_name/toggle_view.md +3 -0
  21. data/docs/events/by_name/view_down.md +4 -0
  22. data/docs/events/by_name/view_left.md +4 -0
  23. data/docs/events/by_name/view_right.md +4 -0
  24. data/docs/events/by_name/view_up.md +4 -0
  25. data/examples/views/empty_template.rb +46 -0
  26. data/examples/views/expected/line.out +1 -0
  27. data/examples/views/expected/lines.out +1 -0
  28. data/examples/views/expected/lines_alignment.out +1 -0
  29. data/examples/views/line.rb +220 -0
  30. data/examples/views/lines.rb +281 -0
  31. data/examples/views/lines_alignment.rb +231 -0
  32. data/examples/views/lines_line_stream.rb +99 -0
  33. data/examples/views/lines_line_streams.rb +73 -0
  34. data/examples/views/lines_line_streams_stream.rb +83 -0
  35. data/examples/views/lines_line_streams_stream_stream.rb +53 -0
  36. data/examples/views/lines_streams.rb +50 -0
  37. data/examples/views/lines_streams_stream.rb +51 -0
  38. data/examples/views/runner.sh +27 -0
  39. data/lib/vedeu/all.rb +6 -2
  40. data/lib/vedeu/application/controller.rb +1 -1
  41. data/lib/vedeu/boolean.rb +35 -0
  42. data/lib/vedeu/borders/border.rb +3 -3
  43. data/lib/vedeu/borders/caption.rb +1 -1
  44. data/lib/vedeu/borders/dsl.rb +1 -20
  45. data/lib/vedeu/borders/title.rb +6 -8
  46. data/lib/vedeu/buffers/buffer.rb +2 -2
  47. data/lib/vedeu/buffers/refresh.rb +1 -1
  48. data/lib/vedeu/cells/border.rb +0 -11
  49. data/lib/vedeu/cells/empty.rb +4 -4
  50. data/lib/vedeu/{geometries/alignment → coercers}/alignment.rb +50 -53
  51. data/lib/vedeu/coercers/all.rb +16 -0
  52. data/lib/vedeu/coercers/colour.rb +78 -0
  53. data/lib/vedeu/coercers/colour_attributes.rb +122 -0
  54. data/lib/vedeu/coercers/horizontal_alignment.rb +28 -0
  55. data/lib/vedeu/coercers/vertical_alignment.rb +27 -0
  56. data/lib/vedeu/colours/all.rb +1 -0
  57. data/lib/vedeu/colours/background.rb +13 -2
  58. data/lib/vedeu/colours/colour.rb +16 -31
  59. data/lib/vedeu/colours/foreground.rb +13 -2
  60. data/lib/vedeu/colours/translator.rb +21 -59
  61. data/lib/vedeu/colours/validator.rb +84 -0
  62. data/lib/vedeu/common.rb +52 -0
  63. data/lib/vedeu/configuration/api.rb +4 -10
  64. data/lib/vedeu/configuration/configuration.rb +4 -4
  65. data/lib/vedeu/cursors/coordinate.rb +1 -1
  66. data/lib/vedeu/cursors/cursor.rb +1 -1
  67. data/lib/vedeu/cursors/dsl.rb +1 -28
  68. data/lib/vedeu/dsl/all.rb +7 -7
  69. data/lib/vedeu/dsl/attributes.rb +224 -0
  70. data/lib/vedeu/dsl/border.rb +127 -0
  71. data/lib/vedeu/dsl/cursors.rb +44 -0
  72. data/lib/vedeu/dsl/dsl.rb +9 -0
  73. data/lib/vedeu/dsl/elements.rb +335 -0
  74. data/lib/vedeu/dsl/geometry.rb +113 -0
  75. data/lib/vedeu/dsl/string/align.rb +127 -0
  76. data/lib/vedeu/dsl/string/all.rb +14 -0
  77. data/lib/vedeu/dsl/string/text.rb +107 -0
  78. data/lib/vedeu/dsl/string/truncate.rb +111 -0
  79. data/lib/vedeu/{output → dsl/string}/wordwrap.rb +10 -6
  80. data/lib/vedeu/dsl/view.rb +124 -248
  81. data/lib/vedeu/dsl/views.rb +244 -0
  82. data/lib/vedeu/editor/cursor.rb +1 -1
  83. data/lib/vedeu/editor/delete.rb +3 -1
  84. data/lib/vedeu/editor/insert.rb +22 -6
  85. data/lib/vedeu/editor/line.rb +15 -9
  86. data/lib/vedeu/editor/lines.rb +27 -18
  87. data/lib/vedeu/esc/actions.rb +73 -26
  88. data/lib/vedeu/esc/all.rb +2 -0
  89. data/lib/vedeu/esc/background.rb +219 -0
  90. data/lib/vedeu/esc/borders.rb +72 -26
  91. data/lib/vedeu/esc/colours.rb +26 -27
  92. data/lib/vedeu/esc/esc.rb +4 -4
  93. data/lib/vedeu/esc/foreground.rb +219 -0
  94. data/lib/vedeu/esc/mouse.rb +16 -13
  95. data/lib/vedeu/events/aliases.rb +2 -2
  96. data/lib/vedeu/events/event.rb +1 -1
  97. data/lib/vedeu/geometries/all.rb +0 -1
  98. data/lib/vedeu/geometries/area/dimension.rb +2 -2
  99. data/lib/vedeu/geometries/dsl/dsl.rb +3 -51
  100. data/lib/vedeu/geometries/dsl/validator.rb +4 -4
  101. data/lib/vedeu/geometries/geometry.rb +10 -10
  102. data/lib/vedeu/geometries/move.rb +4 -4
  103. data/lib/vedeu/groups/dsl.rb +1 -0
  104. data/lib/vedeu/groups/group.rb +1 -1
  105. data/lib/vedeu/input/all.rb +1 -0
  106. data/lib/vedeu/input/capture.rb +14 -10
  107. data/lib/vedeu/input/dsl.rb +20 -26
  108. data/lib/vedeu/input/key.rb +0 -6
  109. data/lib/vedeu/input/keymap.rb +4 -9
  110. data/lib/vedeu/input/keys.rb +13 -0
  111. data/lib/vedeu/input/mapper.rb +29 -14
  112. data/lib/vedeu/input/read.rb +4 -2
  113. data/lib/vedeu/interfaces/dsl.rb +23 -22
  114. data/lib/vedeu/interfaces/interface.rb +2 -2
  115. data/lib/vedeu/logging/debug.rb +33 -0
  116. data/lib/vedeu/logging/log.rb +42 -33
  117. data/lib/vedeu/menus/dsl.rb +7 -18
  118. data/lib/vedeu/menus/menu.rb +1 -1
  119. data/lib/vedeu/models/focus.rb +1 -1
  120. data/lib/vedeu/models/toggleable.rb +4 -4
  121. data/lib/vedeu/null/generic.rb +2 -2
  122. data/lib/vedeu/output/all.rb +0 -2
  123. data/lib/vedeu/output/compressor_cache.rb +1 -1
  124. data/lib/vedeu/output/output.rb +5 -20
  125. data/lib/vedeu/presentation/colour.rb +39 -7
  126. data/lib/vedeu/presentation/style.rb +25 -11
  127. data/lib/vedeu/renderers/html.rb +11 -11
  128. data/lib/vedeu/repositories/assemblage.rb +9 -0
  129. data/lib/vedeu/repositories/collection.rb +1 -0
  130. data/lib/vedeu/repositories/defaults.rb +4 -1
  131. data/lib/vedeu/repositories/model.rb +7 -37
  132. data/lib/vedeu/repositories/parent.rb +6 -6
  133. data/lib/vedeu/repositories/registerable.rb +16 -2
  134. data/lib/vedeu/repositories/repositories.rb +1 -1
  135. data/lib/vedeu/repositories/repository.rb +2 -12
  136. data/lib/vedeu/runtime/flags.rb +1 -1
  137. data/lib/vedeu/terminal/terminal.rb +7 -2
  138. data/lib/vedeu/version.rb +1 -1
  139. data/lib/vedeu/views/all.rb +4 -1
  140. data/lib/vedeu/views/char.rb +5 -4
  141. data/lib/vedeu/views/chars.rb +42 -0
  142. data/lib/vedeu/views/composition.rb +15 -30
  143. data/lib/vedeu/views/default_attributes.rb +74 -0
  144. data/lib/vedeu/views/html_char.rb +2 -2
  145. data/lib/vedeu/views/line.rb +27 -53
  146. data/lib/vedeu/views/lines.rb +31 -0
  147. data/lib/vedeu/views/stream.rb +31 -78
  148. data/lib/vedeu/views/streams.rb +42 -0
  149. data/lib/vedeu/views/value.rb +150 -0
  150. data/lib/vedeu/views/view.rb +32 -36
  151. data/lib/vedeu/views/{view_collection.rb → views.rb} +2 -2
  152. data/test/lib/vedeu/application/application_controller_test.rb +5 -0
  153. data/test/lib/vedeu/application/controller_test.rb +22 -28
  154. data/test/lib/vedeu/boolean_test.rb +57 -0
  155. data/test/lib/vedeu/borders/border_test.rb +130 -36
  156. data/test/lib/vedeu/borders/dsl_test.rb +63 -10
  157. data/test/lib/vedeu/borders/title_test.rb +16 -5
  158. data/test/lib/vedeu/buffers/buffer_test.rb +26 -10
  159. data/test/lib/vedeu/buffers/empty_test.rb +1 -1
  160. data/test/lib/vedeu/cells/border_test.rb +0 -6
  161. data/test/lib/vedeu/cells/clear_test.rb +2 -0
  162. data/test/lib/vedeu/cells/empty_test.rb +12 -2
  163. data/test/lib/vedeu/cells/escape_test.rb +7 -2
  164. data/test/lib/vedeu/{geometries/alignment → coercers}/alignment_test.rb +44 -19
  165. data/test/lib/vedeu/coercers/colour_attributes_test.rb +168 -0
  166. data/test/lib/vedeu/coercers/colour_test.rb +75 -0
  167. data/test/lib/vedeu/{geometries/alignment → coercers}/horizontal_alignment_test.rb +6 -6
  168. data/test/lib/vedeu/{geometries/alignment → coercers}/vertical_alignment_test.rb +6 -6
  169. data/test/lib/vedeu/colours/background_test.rb +17 -1
  170. data/test/lib/vedeu/colours/colour_test.rb +74 -2
  171. data/test/lib/vedeu/colours/foreground_test.rb +17 -1
  172. data/test/lib/vedeu/colours/repository_test.rb +1 -1
  173. data/test/lib/vedeu/colours/translator_test.rb +8 -1
  174. data/test/lib/vedeu/colours/validator_test.rb +60 -0
  175. data/test/lib/vedeu/common_test.rb +138 -0
  176. data/test/lib/vedeu/configuration/api_test.rb +96 -51
  177. data/test/lib/vedeu/cursors/coordinate_test.rb +58 -117
  178. data/test/lib/vedeu/cursors/cursor_test.rb +46 -17
  179. data/test/lib/vedeu/cursors/dsl_test.rb +19 -5
  180. data/test/lib/vedeu/distributed/client_test.rb +8 -3
  181. data/test/lib/vedeu/distributed/server_test.rb +8 -0
  182. data/test/lib/vedeu/distributed/test_application_test.rb +62 -19
  183. data/test/lib/vedeu/distributed/uri_test.rb +4 -2
  184. data/test/lib/vedeu/dsl/attributes_test.rb +212 -0
  185. data/test/lib/vedeu/dsl/border_test.rb +51 -0
  186. data/test/lib/vedeu/dsl/{lines_test.rb → cursors_test.rb} +2 -2
  187. data/test/lib/vedeu/dsl/dsl_test.rb +44 -0
  188. data/test/lib/vedeu/dsl/elements_test.rb +118 -0
  189. data/test/lib/vedeu/dsl/geometry_test.rb +35 -0
  190. data/test/lib/vedeu/dsl/presentation_test.rb +52 -11
  191. data/test/lib/vedeu/dsl/string/align_test.rb +147 -0
  192. data/test/lib/vedeu/dsl/string/text_test.rb +213 -0
  193. data/test/lib/vedeu/dsl/string/truncate_test.rb +97 -0
  194. data/test/lib/vedeu/{output → dsl/string}/wordwrap_test.rb +3 -3
  195. data/test/lib/vedeu/dsl/view_test.rb +30 -42
  196. data/test/lib/vedeu/dsl/views_test.rb +61 -0
  197. data/test/lib/vedeu/editor/cursor_test.rb +30 -12
  198. data/test/lib/vedeu/editor/document_test.rb +18 -10
  199. data/test/lib/vedeu/editor/line_test.rb +4 -1
  200. data/test/lib/vedeu/editor/lines_test.rb +11 -3
  201. data/test/lib/vedeu/esc/actions_test.rb +42 -4
  202. data/test/lib/vedeu/esc/background_test.rb +185 -0
  203. data/test/lib/vedeu/esc/borders_test.rb +37 -9
  204. data/test/lib/vedeu/esc/colours_test.rb +0 -59
  205. data/test/lib/vedeu/esc/foreground_test.rb +185 -0
  206. data/test/lib/vedeu/esc/mouse_test.rb +9 -4
  207. data/test/lib/vedeu/geometries/area/area_test.rb +34 -11
  208. data/test/lib/vedeu/geometries/dsl/dsl_test.rb +52 -61
  209. data/test/lib/vedeu/geometries/geometry_test.rb +62 -18
  210. data/test/lib/vedeu/geometries/position_test.rb +14 -7
  211. data/test/lib/vedeu/groups/dsl_test.rb +24 -15
  212. data/test/lib/vedeu/groups/group_test.rb +18 -8
  213. data/test/lib/vedeu/input/dsl_test.rb +33 -16
  214. data/test/lib/vedeu/input/key_test.rb +8 -1
  215. data/test/lib/vedeu/input/keymap_test.rb +4 -1
  216. data/test/lib/vedeu/input/keys_test.rb +16 -0
  217. data/test/lib/vedeu/interfaces/dsl_test.rb +24 -30
  218. data/test/lib/vedeu/interfaces/interface_test.rb +79 -24
  219. data/test/lib/vedeu/logging/ips_test.rb +10 -1
  220. data/test/lib/vedeu/menus/dsl_test.rb +24 -23
  221. data/test/lib/vedeu/menus/menu_test.rb +18 -8
  222. data/test/lib/vedeu/models/page_test.rb +5 -1
  223. data/test/lib/vedeu/models/row_test.rb +4 -0
  224. data/test/lib/vedeu/models/toggleable_test.rb +10 -6
  225. data/test/lib/vedeu/null/generic_test.rb +90 -1
  226. data/test/lib/vedeu/output/viewport_test.rb +11 -10
  227. data/test/lib/vedeu/plugins/plugin_test.rb +22 -9
  228. data/test/lib/vedeu/presentation/colour_test.rb +2 -1
  229. data/test/lib/vedeu/presentation/presentation_test.rb +13 -8
  230. data/test/lib/vedeu/presentation/style_test.rb +28 -13
  231. data/test/lib/vedeu/renderers/file_test.rb +4 -2
  232. data/test/lib/vedeu/renderers/options_test.rb +1 -1
  233. data/test/lib/vedeu/repositories/assemblage_test.rb +18 -0
  234. data/test/lib/vedeu/repositories/collection_test.rb +34 -10
  235. data/test/lib/vedeu/repositories/defaults_test.rb +6 -0
  236. data/test/lib/vedeu/repositories/model_test.rb +4 -13
  237. data/test/lib/vedeu/repositories/repository_test.rb +12 -5
  238. data/test/lib/vedeu/repositories/store_test.rb +9 -0
  239. data/test/lib/vedeu/runtime/flags_test.rb +6 -4
  240. data/test/lib/vedeu/runtime/launcher_test.rb +1 -1
  241. data/test/lib/vedeu/templating/helpers_test.rb +93 -65
  242. data/test/lib/vedeu/templating/view_template_test.rb +26 -26
  243. data/test/lib/vedeu/views/char_test.rb +36 -11
  244. data/test/lib/vedeu/views/chars_test.rb +71 -0
  245. data/test/lib/vedeu/views/composition_test.rb +17 -16
  246. data/test/lib/vedeu/views/default_attributes_test.rb +97 -0
  247. data/test/lib/vedeu/views/line_test.rb +20 -75
  248. data/test/lib/vedeu/views/lines_test.rb +47 -0
  249. data/test/lib/vedeu/views/stream_test.rb +38 -63
  250. data/test/lib/vedeu/views/streams_test.rb +9 -0
  251. data/test/lib/vedeu/views/value_test.rb +112 -0
  252. data/test/lib/vedeu/views/view_test.rb +67 -45
  253. data/test/lib/vedeu/views/views_test.rb +22 -0
  254. data/test/support/examples/material_colours_app.rb +2 -2
  255. data/test/support/helpers/model_test_class.rb +1 -0
  256. data/test/test_helper.rb +3 -1
  257. data/vedeu.gemspec +2 -2
  258. metadata +124 -58
  259. data/lib/vedeu/dsl/composition.rb +0 -150
  260. data/lib/vedeu/dsl/line.rb +0 -119
  261. data/lib/vedeu/dsl/lines.rb +0 -23
  262. data/lib/vedeu/dsl/shared.rb +0 -85
  263. data/lib/vedeu/dsl/stream.rb +0 -40
  264. data/lib/vedeu/dsl/streams.rb +0 -23
  265. data/lib/vedeu/dsl/text.rb +0 -98
  266. data/lib/vedeu/geometries/alignment/all.rb +0 -11
  267. data/lib/vedeu/geometries/alignment/horizontal_alignment.rb +0 -27
  268. data/lib/vedeu/geometries/alignment/vertical_alignment.rb +0 -27
  269. data/lib/vedeu/output/text.rb +0 -275
  270. data/test/lib/vedeu/dsl/composition_test.rb +0 -67
  271. data/test/lib/vedeu/dsl/line_test.rb +0 -85
  272. data/test/lib/vedeu/dsl/shared_test.rb +0 -66
  273. data/test/lib/vedeu/dsl/stream_test.rb +0 -30
  274. data/test/lib/vedeu/dsl/streams_test.rb +0 -13
  275. data/test/lib/vedeu/dsl/text_test.rb +0 -122
  276. data/test/lib/vedeu/output/text_test.rb +0 -156
  277. data/test/lib/vedeu/views/view_collection_test.rb +0 -13
@@ -0,0 +1,127 @@
1
+ module Vedeu
2
+
3
+ module DSL
4
+
5
+ # Provides DSL methods for Vedeu::Borders::Border objects.
6
+ #
7
+ # @api public
8
+ #
9
+ module Border
10
+
11
+ # When {Vedeu::DSL::Border} is included in a class, the
12
+ # methods within this module are included as class methods on
13
+ # that class.
14
+ #
15
+ module ClassMethods
16
+
17
+ # Specify the border of an interface or view with a simple
18
+ # DSL.
19
+ #
20
+ # # Standalone (preferred):
21
+ # Vedeu.border :my_interface do
22
+ # # ... see {Vedeu::Borders::DSL}
23
+ # end
24
+ #
25
+ # @param name [String|Symbol] The name of the interface or
26
+ # view to which this border belongs.
27
+ # @param block [Proc]
28
+ # @raise [Vedeu::Error::MissingRequired|
29
+ # Vedeu::Error::RequiresBlock] When a name or block
30
+ # respectively are not given.
31
+ # @return [Vedeu::Borders::Border]
32
+ # @see Vedeu::Borders::DSL
33
+ def border(name, &block)
34
+ fail Vedeu::Error::MissingRequired unless name
35
+ fail Vedeu::Error::RequiresBlock unless block_given?
36
+
37
+ Vedeu::Borders::Border.build(enabled: true, name: name, &block).store
38
+ end
39
+
40
+ end # ClassMethods
41
+
42
+ # When {Vedeu::DSL::Border} is included in a class, the
43
+ # methods within this module are included as instance methods on
44
+ # that class.
45
+ #
46
+ module InstanceMethods
47
+
48
+ # Specify the border of an interface or view with a simple
49
+ # DSL.
50
+ #
51
+ # # As part of an interface:
52
+ # Vedeu.interface :my_interface do
53
+ # border do
54
+ # # ... see {Vedeu::Borders::DSL}
55
+ # end
56
+ # end
57
+ #
58
+ # # As part of a view:
59
+ # Vedeu.render do
60
+ # view :my_interface do
61
+ # border do
62
+ # # ... see {Vedeu::Borders::DSL}
63
+ # end
64
+ # end
65
+ # end
66
+ #
67
+ # @param name [String|Symbol] The name of the interface; this
68
+ # is already provided when we define the interface or view,
69
+ # setting it here is just mirroring functionality of
70
+ # {Vedeu::DSL::Border::ClassMethods.border}.
71
+ # @param block [Proc]
72
+ # @raise [Vedeu::Error::MissingRequired|
73
+ # Vedeu::Error::RequiresBlock] When a name or block
74
+ # respectively are not given.
75
+ # @return [Vedeu::Borders::Border]
76
+ # @see Vedeu::Borders::DSL
77
+ def border(name = nil, &block)
78
+ fail Vedeu::Error::RequiresBlock unless block_given?
79
+
80
+ model_name = name ? name : model.name
81
+
82
+ Vedeu::Borders::Border.build(enabled: true,
83
+ name: model_name, &block).store
84
+ end
85
+
86
+ # Applies the default border to the interface or view.
87
+ #
88
+ # # As part of an interface:
89
+ # Vedeu.interface :my_interface do
90
+ # border!
91
+ #
92
+ # # ... some code
93
+ # end
94
+ #
95
+ # # As part of a view:
96
+ # Vedeu.render do
97
+ # view :my_interface do
98
+ # border!
99
+ #
100
+ # # ... some code
101
+ # end
102
+ # end
103
+ #
104
+ # @return [Vedeu::Borders::Border]
105
+ def border!
106
+ border do
107
+ # adds default border
108
+ end
109
+ end
110
+
111
+ end # InstanceMethods
112
+
113
+ # When this module is included in a class, provide ClassMethods
114
+ # as class methods for the class.
115
+ #
116
+ # @param klass [Class]
117
+ # @return [void]
118
+ def self.included(klass)
119
+ klass.extend(Vedeu::DSL::Border::ClassMethods)
120
+ klass.include(Vedeu::DSL::Border::InstanceMethods)
121
+ end
122
+
123
+ end # Border
124
+
125
+ end # DSL
126
+
127
+ end # Vedeu
@@ -0,0 +1,44 @@
1
+ module Vedeu
2
+
3
+ module DSL
4
+
5
+ # Provides DSL methods for Vedeu::Cursors::Cursor objects.
6
+ #
7
+ # @api public
8
+ #
9
+ module Cursors
10
+
11
+ # Set the cursor visibility on an interface.
12
+ #
13
+ # @param value [Boolean] Any value other than nil or false will
14
+ # evaluate to true.
15
+ # @return [Vedeu::Cursors::Cursor]
16
+ def cursor(value = true)
17
+ boolean = value ? true : false
18
+
19
+ model.cursor_visible = boolean
20
+
21
+ Vedeu::Cursors::Cursor.store(name: name, visible: boolean)
22
+ end
23
+
24
+ # Set the cursor to visible for the interface or view.
25
+ #
26
+ # @return [Vedeu::Cursors::Cursor]
27
+ def cursor!
28
+ cursor(true)
29
+ end
30
+ alias_method :show_cursor!, :cursor!
31
+
32
+ # Set the cursor to invisible for the interface or view.
33
+ #
34
+ # @return [Vedeu::Cursors::Cursor]
35
+ def no_cursor!
36
+ cursor(false)
37
+ end
38
+ alias_method :hide_cursor!, :no_cursor!
39
+
40
+ end # Cursors
41
+
42
+ end # DSL
43
+
44
+ end # Vedeu
data/lib/vedeu/dsl/dsl.rb CHANGED
@@ -16,6 +16,15 @@ module Vedeu
16
16
  @client = client
17
17
  end
18
18
 
19
+ # Returns the model name if available.
20
+ #
21
+ # @return [NilClass|String|Symbol]
22
+ def name
23
+ return nil unless model
24
+
25
+ model.name
26
+ end
27
+
19
28
  protected
20
29
 
21
30
  # @!attribute [r] client
@@ -0,0 +1,335 @@
1
+ module Vedeu
2
+
3
+ module DSL
4
+
5
+ # Provides methods to be used to define views.
6
+ #
7
+ # Vedeu.renders do
8
+ # view :my_interface do
9
+ # lines do
10
+ # background '#000000'
11
+ # foreground '#ffffff'
12
+ # line 'This is white text on a black background.'
13
+ # line 'Next is a blank line:'
14
+ # line ''
15
+ #
16
+ # streams { stream 'We can define ' }
17
+ #
18
+ # streams do
19
+ # foreground '#ff0000'
20
+ # stream 'parts of a line '
21
+ # end
22
+ #
23
+ # streams { stream 'independently using ' }
24
+ #
25
+ # streams do
26
+ # foreground '#00ff00'
27
+ # stream 'streams.'
28
+ # end
29
+ # end
30
+ # end
31
+ # end
32
+ #
33
+ # @api public
34
+ #
35
+ module Elements
36
+
37
+ include Vedeu::Common
38
+ include Vedeu::DSL::Presentation
39
+
40
+ # @todo This documentation needs editing. (GL: 2015-12-17)
41
+ #
42
+ # Specify multiple lines in a view.
43
+ #
44
+ # @example
45
+ # Vedeu.view :my_interface do
46
+ # lines do
47
+ # # ... see {Vedeu::DSL::Line} and {Vedeu::DSL::Stream}
48
+ # end
49
+ # end
50
+ #
51
+ # Vedeu.view :my_interface do
52
+ # line do
53
+ # # ... see {Vedeu::DSL::Line} and {Vedeu::DSL::Stream}
54
+ # end
55
+ # end
56
+ #
57
+ # @param block [Proc]
58
+ # @raise [Vedeu::Error::RequiresBlock|Vedeu::Error::Fatal]
59
+ # @return [void]
60
+ def lines(&block)
61
+ requires_block!(&block)
62
+ requires_model!
63
+
64
+ attrs = Vedeu::DSL::Attributes.build(self, model, nil, {}, &block)
65
+
66
+ l = Vedeu::Views::View.build(attrs, &block)
67
+ model.value = l.value
68
+ end
69
+
70
+ # @todo This documentation needs editing. (GL: 2015-12-17)
71
+ #
72
+ # Specify a single line in a view.
73
+ #
74
+ # Vedeu.renders do
75
+ # view :my_interface do
76
+ # lines do
77
+ # line 'some text...'
78
+ # # ... some code
79
+ #
80
+ # line 'some more text...'
81
+ # # ... some code
82
+ # end
83
+ # end
84
+ # end
85
+ #
86
+ # @param value [String] The value for the line. Ignored when a
87
+ # block is given.
88
+ # @param opts [Hash]
89
+ # @option opts ... [void]
90
+ # @param block [Proc]
91
+ # @raise [Vedeu::Error::Fatal]
92
+ # @return [void]
93
+ def line(value = '', opts = {}, &block)
94
+ requires_model!
95
+
96
+ attrs = Vedeu::DSL::Attributes.build(self, model, value, opts, &block)
97
+
98
+ l = if block_given?
99
+ Vedeu::Views::Line.build(attrs, &block)
100
+
101
+ else
102
+ s = Vedeu::Views::Stream.new(attrs)
103
+ ss = Vedeu::Views::Streams.coerce([s])
104
+
105
+ Vedeu::Views::Line.new(attrs.merge!(value: ss))
106
+
107
+ end
108
+
109
+ if view_model? || line_model?
110
+ model.add(l)
111
+
112
+ else
113
+ fail Vedeu::Error::Fatal,
114
+ "Cannot add line to '#{model.class.name}' model.".freeze
115
+
116
+ end
117
+ end
118
+
119
+ # @todo This documentation needs editing. (GL: 2015-12-17)
120
+ #
121
+ # Define multiple streams (a stream is a subset of a line).
122
+ # Uses {Vedeu::DSL::Stream} for all directives within the
123
+ # required block.
124
+ #
125
+ # Vedeu.renders do
126
+ # view :my_interface do
127
+ # lines do
128
+ # line do
129
+ # streams do
130
+ # # ... some code
131
+ # end
132
+ #
133
+ # stream do
134
+ # # ... some code
135
+ # end
136
+ # end
137
+ # end
138
+ # end
139
+ # end
140
+ #
141
+ # @param block [Proc]
142
+ # @raise [Vedeu::Error::RequiresBlock|Vedeu::Error::Fatal]
143
+ # @return [void]
144
+ def streams(&block)
145
+ requires_block!(&block)
146
+ requires_model!
147
+
148
+ attrs = Vedeu::DSL::Attributes.build(self, model, nil, {}, &block)
149
+
150
+ l = Vedeu::Views::Line.build(attrs, &block)
151
+
152
+ if view_model?
153
+ model.add(l)
154
+
155
+ elsif line_model?
156
+ model.value = l.value
157
+
158
+ end
159
+ end
160
+
161
+ # @todo This documentation needs editing. (GL: 2015-12-17)
162
+ #
163
+ # @param value [String]
164
+ # @param opts [Hash]
165
+ # @option opts ... [void]
166
+ # @param block [Proc]
167
+ # @raise [Vedeu::Error::Fatal]
168
+ # @return [void]
169
+ def stream(value = '', opts = {}, &block)
170
+ requires_model!
171
+
172
+ attrs = Vedeu::DSL::Attributes.build(self, model, value, opts, &block)
173
+
174
+ l = if block_given?
175
+ Vedeu::Views::Line.build(attrs, &block)
176
+
177
+ else
178
+ s = Vedeu::Views::Stream.new(attrs)
179
+ ss = Vedeu::Views::Streams.coerce([s])
180
+
181
+ Vedeu::Views::Line.new(attrs.merge!(value: ss))
182
+
183
+ end
184
+
185
+ if view_model? || line_model?
186
+ model.add(l)
187
+
188
+ else
189
+ fail Vedeu::Error::Fatal,
190
+ "Cannot add line to '#{model.class.name}' model.".freeze
191
+
192
+ end
193
+ end
194
+
195
+ # @todo This documentation needs editing. (GL: 2015-12-17)
196
+ #
197
+ # Specify the content for a view. Provides the means to align a
198
+ # string (or object responding to `to_s`), and add it as a Line
199
+ # or to the Stream.
200
+ #
201
+ # @note If using the convenience methods; left, centre, center
202
+ # or right, then a specified align option will be ignored.
203
+ #
204
+ # @example
205
+ # lines do
206
+ # centre '...'
207
+ # end
208
+ #
209
+ # line do
210
+ # right '...'
211
+ # end
212
+ #
213
+ # line do
214
+ # stream do
215
+ # text '...'
216
+ # end
217
+ # end
218
+ #
219
+ # left 'This will be left aligned.', width: 35
220
+ # # => 'This will be left aligned. '
221
+ #
222
+ # centre 'This will be aligned centrally.', width: 35
223
+ # # => ' This will be aligned centrally. '
224
+ # # centre is also aliased to center
225
+ #
226
+ # right 'This will be right aligned.', width: 35
227
+ # # => ' This will be right aligned.'
228
+ #
229
+ # right 'This will be right aligned.', width: 35,
230
+ # align: centre
231
+ #
232
+ # text 'This will be truncated here. More text here.',
233
+ # width: 28 # => 'This will be truncated here.'
234
+ #
235
+ # text 'Padded with hyphens.', width: 25, pad: '-',
236
+ # align: :right # => '-----Padded with hyphens.'
237
+ #
238
+ # @param value [String|Object] A string or object that responds
239
+ # to `to_s`.
240
+ # @param opts [Hash<Symbol => void>] Text options.
241
+ # @option opts :align [Symbol] One of `:left`,
242
+ # `:centre`/`:center`, or `:right`.
243
+ # @option opts :width [Integer|NilClass] The width of the
244
+ # text stream to add. If the `string` provided is longer than
245
+ # this value, the string will be truncated. If no width is
246
+ # provided in the context of 'lines', then the interface width
247
+ # is used. If no width is provided in the context of a
248
+ # 'stream', then no alignment will occur.
249
+ # @option opts :pad [String] The character to use to pad the
250
+ # width, by default uses an empty space (0x20). Only when the
251
+ # string is shorter than the specified width.
252
+ # @raise [Vedeu::Error::Fatal]
253
+ # @return [void]
254
+ def text(value = '', opts = {})
255
+ requires_model!
256
+
257
+ if view_model? || line_model?
258
+ attrs = Vedeu::DSL::Attributes.build(self, model, value, opts)
259
+ s = Vedeu::Views::Stream.new(attrs)
260
+ ss = Vedeu::Views::Streams.coerce([s])
261
+ l = Vedeu::Views::Line.new(attrs.merge!(value: ss))
262
+
263
+ model.add(l)
264
+
265
+ else
266
+ fail Vedeu::Error::Fatal,
267
+ "Cannot add text to '#{model.class.name}' model.".freeze
268
+
269
+ end
270
+ end
271
+
272
+ # @param (see #text)
273
+ # @return (see #text)
274
+ def centre(value = '', opts = {})
275
+ opts.merge!(align: :centre)
276
+
277
+ text(value, opts)
278
+ end
279
+ alias_method :center, :centre
280
+
281
+ # @param (see #text)
282
+ # @return (see #text)
283
+ def left(value = '', opts = {})
284
+ opts.merge!(align: :left)
285
+
286
+ text(value, opts)
287
+ end
288
+
289
+ # @param (see #text)
290
+ # @return (see #text)
291
+ def right(value = '', opts = {})
292
+ opts.merge!(align: :right)
293
+
294
+ text(value, opts)
295
+ end
296
+
297
+ private
298
+
299
+ # Returns a boolean indicating the model is a
300
+ # {Vedeu::Views::Line}.
301
+ #
302
+ # @return [Boolean]
303
+ def line_model?
304
+ model.is_a?(Vedeu::Views::Line)
305
+ end
306
+
307
+ # @param block [Proc]
308
+ # @raise [Vedeu::Error::RequiresBlock] When the required block
309
+ # is not given.
310
+ # @return [NilClass]
311
+ def requires_block!(&block)
312
+ fail Vedeu::Error::RequiresBlock unless block_given?
313
+ end
314
+
315
+ # @raise [Vedeu::Error::Fatal] When the model cannot be
316
+ # determined.
317
+ # @return [NilClass]
318
+ def requires_model!
319
+ fail Vedeu::Error::Fatal,
320
+ 'No model, cannot continue.'.freeze unless present?(model)
321
+ end
322
+
323
+ # Returns a boolean indicating the model is a
324
+ # {Vedeu::Views::View}.
325
+ #
326
+ # @return [Boolean]
327
+ def view_model?
328
+ model.is_a?(Vedeu::Views::View)
329
+ end
330
+
331
+ end # Elements
332
+
333
+ end # DSL
334
+
335
+ end # Vedeu