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,84 @@
1
+ require 'vedeu/presentation/presentation'
2
+
3
+ module Vedeu
4
+
5
+ # A Char represents a single character of the terminal. It is a container for
6
+ # the a single character in a {Vedeu::Stream}.
7
+ #
8
+ # Though a multi-character String can be passed as a value, only the first
9
+ # character is returned in the escape sequence.
10
+ #
11
+ # @api private
12
+ class Char
13
+
14
+ include Vedeu::Presentation
15
+
16
+ attr_accessor :parent
17
+ attr_reader :position
18
+
19
+ class << self
20
+ def coerce(value = nil, parent = nil, colour = nil, style = nil, position = nil)
21
+ if value.is_a?(self)
22
+ value
23
+
24
+ elsif value.is_a?(Array)
25
+ if value.first.is_a?(self)
26
+ value
27
+
28
+ elsif value.first.is_a?(String)
29
+ value.map { |char| new(char, parent, colour, style, position) }
30
+
31
+ else
32
+ # ...
33
+
34
+ end
35
+ else
36
+ # ...
37
+
38
+ end
39
+ end
40
+ end
41
+
42
+ # Returns a new instance of Char.
43
+ #
44
+ # @param value [String]
45
+ # @param parent [Line]
46
+ # @param colour [Colour]
47
+ # @param style [Style]
48
+ # @param position [Position]
49
+ # @return [Char]
50
+ def initialize(value = nil, parent = nil, colour = nil, style = nil, position = nil)
51
+ @value = value
52
+ @parent = parent
53
+ @colour = colour
54
+ @style = style
55
+ @position = position
56
+ end
57
+
58
+ # Returns log friendly output.
59
+ #
60
+ # @return [String]
61
+ def inspect
62
+ "<#{self.class.name} (value:#{@value})>"
63
+ end
64
+
65
+ # @return [Boolean]
66
+ def ==(other)
67
+ eql?(other)
68
+ end
69
+
70
+ # @return [Boolean]
71
+ def eql?(other)
72
+ self.class == other.class && value == other.value
73
+ end
74
+
75
+ # @return [String] The character.
76
+ def value
77
+ return '' unless @value
78
+
79
+ @value[0]
80
+ end
81
+
82
+ end # Char
83
+
84
+ end # Vedeu
@@ -0,0 +1,8 @@
1
+ require 'vedeu/models/collection'
2
+
3
+ module Vedeu
4
+
5
+ class Chars < Vedeu::Model::Collection
6
+ end
7
+
8
+ end
@@ -0,0 +1,101 @@
1
+ require 'vedeu/dsl/composition'
2
+ require 'vedeu/models/collection'
3
+ require 'vedeu/presentation/presentation'
4
+ require 'vedeu/support/common'
5
+
6
+ require 'vedeu/models/view/interfaces'
7
+ require 'vedeu/models/view/interface'
8
+
9
+ module Vedeu
10
+
11
+ # A composition is a collection of interfaces.
12
+ #
13
+ # @api private
14
+ class Composition
15
+
16
+ include Vedeu::Presentation
17
+ include Vedeu::Model
18
+
19
+ attr_reader :interfaces
20
+ alias_method :value, :interfaces
21
+
22
+ class << self
23
+
24
+ # @param attributes [Hash]
25
+ # @option attributes client []
26
+ # @option attributes colour []
27
+ # @option attributes interfaces []
28
+ # @option attributes style []
29
+ # @param block [Proc]
30
+ # @return [Class]
31
+ def build(attributes = {}, &block)
32
+ attrs = defaults.merge(attributes)
33
+
34
+ model = new(attrs[:interfaces], attrs[:colour], attrs[:style])
35
+ model.deputy(attributes[:client]).instance_eval(&block) if block_given?
36
+ model
37
+ end
38
+
39
+ private
40
+
41
+ # The default values for a new instance of this class.
42
+ #
43
+ # @return [Hash]
44
+ def defaults
45
+ {
46
+ client: nil,
47
+ colour: nil,
48
+ interfaces: [],
49
+ style: nil,
50
+ }
51
+ end
52
+
53
+ end
54
+
55
+ # Returns a new instance of Composition.
56
+ #
57
+ # @param interfaces [Interfaces]
58
+ # @return [Composition]
59
+ def initialize(interfaces = [], colour = nil, style = nil)
60
+ @interfaces = interfaces
61
+ @colour = colour
62
+ @style = style
63
+ end
64
+
65
+ # @param child []
66
+ # @return []
67
+ def add(child)
68
+ @interfaces = interfaces.add(child)
69
+ end
70
+
71
+ # Returns log friendly output.
72
+ #
73
+ # @return [String]
74
+ def inspect
75
+ "<#{self.class.name} (interfaces:#{interfaces.size})>"
76
+ end
77
+
78
+ # @return [Vedeu::Interfaces]
79
+ def interfaces
80
+ children.coerce(@interfaces, self)
81
+ end
82
+
83
+ private
84
+
85
+ # Return the class name for the children on this model.
86
+ #
87
+ # @return [Class]
88
+ def child
89
+ Vedeu::Interface
90
+ end
91
+
92
+ # Return the class name for the children on this model.
93
+ #
94
+ # @return [Class]
95
+ def children
96
+ Vedeu::Interfaces
97
+ end
98
+
99
+ end # Composition
100
+
101
+ end # Vedeu
@@ -0,0 +1,215 @@
1
+ require 'vedeu/support/common'
2
+ require 'vedeu/support/content_geometry'
3
+ require 'vedeu/models/model'
4
+ require 'vedeu/presentation/presentation'
5
+ require 'vedeu/buffers/display_buffer'
6
+ require 'vedeu/buffers/buffer'
7
+
8
+ require 'vedeu/models/view/lines'
9
+
10
+ module Vedeu
11
+
12
+ # An Interface represents a portion of the terminal defined by
13
+ # {Vedeu::Geometry}. It is a container for {Vedeu::Line} and {Vedeu::Stream}
14
+ # objects.
15
+ #
16
+ # @api private
17
+ class Interface
18
+
19
+ extend Forwardable
20
+
21
+ include Vedeu::Common
22
+ include Vedeu::Model
23
+ include Vedeu::Presentation
24
+ include Vedeu::DisplayBuffer
25
+
26
+ attr_accessor :border,
27
+ :colour,
28
+ :delay,
29
+ :geometry,
30
+ :group,
31
+ :name,
32
+ :parent,
33
+ :style
34
+
35
+ attr_writer :lines
36
+
37
+ def_delegators :geometry,
38
+ :north,
39
+ :east,
40
+ :south,
41
+ :west,
42
+ :top,
43
+ :right,
44
+ :bottom,
45
+ :left,
46
+ :width,
47
+ :height,
48
+ :origin
49
+
50
+ class << self
51
+
52
+ # Build interfaces using a simple DSL.
53
+ # If a name is provided as part of the attributes, we check the repository
54
+ # for an interface of the same name and update it from the new attributes
55
+ # provided, or if a block is given, new parameters set via the DSL.
56
+ #
57
+ # @param attributes [Hash]
58
+ # @option attributes client []
59
+ # @option attributes colour []
60
+ # @option attributes lines []
61
+ # @option attributes name []
62
+ # @option attributes parent []
63
+ # @option attributes style []
64
+ # @param block [Proc]
65
+ # @return [Class]
66
+ def build(attributes = {}, &block)
67
+ attributes = defaults.merge(attributes)
68
+ model = new(attributes[:name],
69
+ attributes[:lines],
70
+ attributes[:parent],
71
+ attributes[:colour],
72
+ attributes[:style])
73
+ model.deputy(attributes[:client]).instance_eval(&block) if block_given?
74
+ model
75
+ end
76
+
77
+ private
78
+
79
+ # The default values for a new instance of this class.
80
+ #
81
+ # @return [Hash]
82
+ def defaults
83
+ {
84
+ client: nil,
85
+ colour: nil,
86
+ lines: [],
87
+ name: '',
88
+ parent: nil,
89
+ style: nil,
90
+ }
91
+ end
92
+ end
93
+
94
+ # Return a new instance of Interface.
95
+ #
96
+ # @param name [String]
97
+ # @param lines [Vedeu::Lines]
98
+ # @param parent [Vedeu::Composition]
99
+ # @param colour [Vedeu::Colour]
100
+ # @param style [Vedeu::Style]
101
+ # @return [Interface]
102
+ def initialize(name = '', lines = [], parent = nil, colour = nil, style = nil)
103
+ @name = name
104
+ @lines = lines
105
+ @parent = parent
106
+ @colour = colour
107
+ @style = style
108
+
109
+ @border = nil
110
+ @delay = 0.0
111
+ @geometry = nil
112
+ @group = ''
113
+
114
+ @repository = Vedeu.interfaces
115
+ end
116
+
117
+ # @param child []
118
+ # @return []
119
+ def add(child)
120
+ @lines = lines.add(child)
121
+ end
122
+
123
+ # @return [Hash]
124
+ def attributes
125
+ {
126
+ border: border,
127
+ colour: colour,
128
+ delay: delay,
129
+ geometry: geometry,
130
+ group: group,
131
+ name: name,
132
+ parent: parent,
133
+ style: style,
134
+ }
135
+ end
136
+
137
+ # Returns a boolean indicating whether the interface has a border.
138
+ #
139
+ # @return [Boolean]
140
+ def border?
141
+ !!(border)
142
+ end
143
+
144
+ # @return [Vedeu::Cursor]
145
+ def cursor
146
+ Vedeu.cursors.by_name(name)
147
+ end
148
+
149
+ # Returns log friendly output.
150
+ #
151
+ # @return [String]
152
+ def inspect
153
+ "<#{self.class.name} (lines:#{lines.size})>"
154
+ end
155
+
156
+ # @return [Vedeu::Lines]
157
+ def lines
158
+ children.coerce(@lines, self)
159
+ end
160
+ alias_method :content, :lines
161
+ alias_method :value, :lines
162
+
163
+ # Returns a boolean indicating whether the interface has content.
164
+ #
165
+ # @return [Boolean]
166
+ def lines?
167
+ lines.any?
168
+ end
169
+
170
+ # @return []
171
+ def render
172
+ if border
173
+ border.render
174
+
175
+ else
176
+ viewport
177
+
178
+ end
179
+ end
180
+
181
+ # @return [Interface]
182
+ def store
183
+ super
184
+
185
+ store_new_buffer
186
+ store_refresh_events
187
+ store_focusable
188
+ store_cursor
189
+ store_group
190
+ end
191
+
192
+ # return [Array]
193
+ def viewport
194
+ Vedeu::Viewport.show(self)
195
+ end
196
+
197
+ private
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
+ # Return the class name for the children on this model.
207
+ #
208
+ # @return [Class]
209
+ def children
210
+ Vedeu::Lines
211
+ end
212
+
213
+ end # Interface
214
+
215
+ end # Vedeu
@@ -0,0 +1,8 @@
1
+ require 'vedeu/models/collection'
2
+
3
+ module Vedeu
4
+
5
+ class Interfaces < Vedeu::Model::Collection
6
+ end
7
+
8
+ end
@@ -0,0 +1,134 @@
1
+ require 'vedeu/presentation/presentation'
2
+
3
+ require 'vedeu/models/view/streams'
4
+ require 'vedeu/models/view/stream'
5
+
6
+ module Vedeu
7
+
8
+ # A Line represents a single row of the terminal. It is a container for
9
+ # {Vedeu::Stream} objects. A line's width is determined by the
10
+ # {Vedeu::Interface} it belongs to.
11
+ #
12
+ # @api private
13
+ class Line
14
+
15
+ include Vedeu::Model
16
+ include Vedeu::Presentation
17
+
18
+ attr_accessor :parent,
19
+ :streams
20
+
21
+ alias_method :value, :streams
22
+
23
+ class << self
24
+
25
+ # @option attributes streams []
26
+ # @option attributes parent []
27
+ # @option attributes colour []
28
+ # @option attributes style []
29
+ # @option attributes client []
30
+ def build(attributes = {}, &block)
31
+ attributes = defaults.merge(attributes)
32
+
33
+ model = new(attributes[:streams],
34
+ attributes[:parent],
35
+ attributes[:colour],
36
+ attributes[:style])
37
+ model.deputy(attributes[:client]).instance_eval(&block) if block_given?
38
+ model
39
+ end
40
+
41
+ private
42
+
43
+ # The default values for a new instance of this class.
44
+ #
45
+ # @return [Hash]
46
+ def defaults
47
+ {
48
+ client: nil,
49
+ colour: nil,
50
+ parent: nil,
51
+ streams: [],
52
+ style: nil,
53
+ }
54
+ end
55
+ end
56
+
57
+ # Returns a new instance of Line.
58
+ #
59
+ # @return [Line]
60
+ def initialize(streams = [], parent = nil, colour = nil, style = nil)
61
+ @colour = colour
62
+ @parent = parent
63
+ @streams = streams
64
+ @style = style
65
+ end
66
+
67
+ # @param child []
68
+ # @return []
69
+ def add(child)
70
+ @streams = streams.add(child)
71
+ end
72
+
73
+ # Returns an array of all the characters with formatting for this line.
74
+ #
75
+ # @return [Array]
76
+ # @see Vedeu::Stream
77
+ def chars
78
+ return [] if empty?
79
+
80
+ streams.map(&:chars).flatten
81
+ end
82
+
83
+ # Returns a boolean indicating whether the line has content.
84
+ #
85
+ # @return [Boolean]
86
+ def empty?
87
+ streams.empty?
88
+ end
89
+
90
+ # Returns log friendly output.
91
+ #
92
+ # @return [String]
93
+ def inspect
94
+ "<#{self.class.name} (streams:#{streams.size})>"
95
+ end
96
+
97
+ # Returns the size of the content in characters without formatting.
98
+ #
99
+ # @return [Fixnum]
100
+ def size
101
+ streams.map(&:size).inject(0, :+) { |sum, x| sum += x }
102
+ end
103
+
104
+ # @return [Vedeu::Streams]
105
+ def streams
106
+ children.coerce(@streams, self)
107
+ end
108
+
109
+ # Delegate to Vedeu::Interface#width if available.
110
+ #
111
+ # @return [Fixnum]
112
+ def width
113
+ parent.width if parent
114
+ end
115
+
116
+ private
117
+
118
+ # Return the class name for the children on this model.
119
+ #
120
+ # @return [Class]
121
+ def child
122
+ Vedeu::Stream
123
+ end
124
+
125
+ # Return the class name for the children on this model.
126
+ #
127
+ # @return [Class]
128
+ def children
129
+ Vedeu::Streams
130
+ end
131
+
132
+ end # Line
133
+
134
+ end # Vedeu
@@ -0,0 +1,8 @@
1
+ require 'vedeu/models/collection'
2
+
3
+ module Vedeu
4
+
5
+ class Lines < Vedeu::Model::Collection
6
+ end
7
+
8
+ end
@@ -0,0 +1,144 @@
1
+ require 'vedeu/presentation/presentation'
2
+ require 'vedeu/models/view/char'
3
+
4
+ module Vedeu
5
+
6
+ # A Stream can represent a character or collection of characters as part of a
7
+ # {Vedeu::Line} which you wish to colour and style independently of the other
8
+ # characters in that line.
9
+ #
10
+ # @api private
11
+ class Stream
12
+
13
+ include Vedeu::Model
14
+ include Vedeu::Presentation
15
+
16
+ attr_accessor :parent,
17
+ :value
18
+
19
+ alias_method :content, :value
20
+ alias_method :data, :value
21
+ alias_method :text, :value
22
+
23
+ class << self
24
+
25
+ # @option attributes value []
26
+ # @option attributes parent []
27
+ # @option attributes colour []
28
+ # @option attributes style []
29
+ # @option attributes client []
30
+ def build(attributes = {}, &block)
31
+ attributes = defaults.merge(attributes)
32
+
33
+ model = new(attributes[:value],
34
+ attributes[:parent],
35
+ attributes[:colour],
36
+ attributes[:style])
37
+ model.deputy(attributes[:client]).instance_eval(&block) if block_given?
38
+ model
39
+ end
40
+
41
+ private
42
+
43
+ # The default values for a new instance of this class.
44
+ #
45
+ # @return [Hash]
46
+ def defaults
47
+ {
48
+ client: nil,
49
+ colour: nil,
50
+ parent: nil,
51
+ style: nil,
52
+ value: '',
53
+ }
54
+ end
55
+
56
+ end
57
+
58
+ # Returns a new instance of Stream.
59
+ #
60
+ # @param value [String]
61
+ # @param parent [Vedeu::Line]
62
+ # @param colour [Vedeu::Colour]
63
+ # @param style [Vedeu::Style]
64
+ # @return [Vedeu::Stream]
65
+ def initialize(value = '', parent = nil, colour = nil, style = nil)
66
+ @value = value
67
+ @parent = parent
68
+ @colour = colour
69
+ @style = style
70
+ end
71
+
72
+ # @param child [Vedeu::Stream]
73
+ # @return [Vedeu::Line]
74
+ def add(child)
75
+ parent.add(child)
76
+ end
77
+
78
+ # Returns an array of characters, each element is the escape sequences of
79
+ # colours and styles for this stream, the character itself, and the escape
80
+ # sequences of colours and styles for the parent of the stream
81
+ # ({Vedeu::Line}).
82
+ #
83
+ # @return [Array]
84
+ def chars
85
+ return [] if value.empty?
86
+
87
+ value.chars.map do |char|
88
+ child.new(char, parent, colour, style, nil).to_s
89
+ end
90
+ end
91
+
92
+ # Returns a boolean indicating whether the stream has content.
93
+ #
94
+ # @return [Boolean]
95
+ def empty?
96
+ value.empty?
97
+ end
98
+
99
+ # Returns log friendly output.
100
+ #
101
+ # @return [String]
102
+ def inspect
103
+ "<#{self.class.name} (value:#{value}, size:#{size})>"
104
+ end
105
+
106
+ # Returns the size of the content in characters without formatting.
107
+ #
108
+ # @return [Fixnum]
109
+ def size
110
+ value.size
111
+ end
112
+
113
+ # @return [String]
114
+ def value
115
+ # Vedeu::Char.coerce(@value, parent, colour, style)
116
+ @value
117
+ end
118
+
119
+ # Delegate to Vedeu::Line#width if available.
120
+ #
121
+ # @return [Fixnum]
122
+ def width
123
+ parent.width if parent
124
+ end
125
+
126
+ private
127
+
128
+ # Return the class name for the children on this model.
129
+ #
130
+ # @return [Class]
131
+ def child
132
+ Vedeu::Char
133
+ end
134
+
135
+ # Return the class name for the collection of children on this model.
136
+ #
137
+ # @return [Class]
138
+ def children
139
+ Vedeu::Chars
140
+ end
141
+
142
+ end # Stream
143
+
144
+ end # Vedeu
@@ -0,0 +1,8 @@
1
+ require 'vedeu/models/collection'
2
+
3
+ module Vedeu
4
+
5
+ class Streams < Vedeu::Model::Collection
6
+ end
7
+
8
+ end