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
@@ -1,37 +1,116 @@
1
+ require 'vedeu/dsl/components/geometry'
2
+ require 'vedeu/models/model'
3
+ require 'vedeu/support/esc'
4
+ require 'vedeu/support/terminal'
5
+
1
6
  module Vedeu
2
7
 
8
+ # @todo Consider storing the Terminal size at the time of first creation,
9
+ # this allows us to return the interface to its original dimensions if
10
+ # the terminal resizes back to normal size.
11
+
3
12
  # Calculates and provides interface geometry determined by both the client's
4
13
  # requirements and the terminal's current viewing area.
5
14
  #
6
15
  # Geometry for Vedeu, as the same for ANSI terminals, has the origin at
7
16
  # top-left, y = 1, x = 1. The 'y' coordinate is deliberately first.
8
17
  #
18
+ # x north xn # north: y - 1
19
+ # y +--------------+ # top: y
20
+ # | top | # west: x - 1
21
+ # | | # left: x
22
+ # west | left right | east # right: xn
23
+ # | | # east: xn + 1
24
+ # | bottom | # bottom: yn
25
+ # yn +--------------+ # south: yn + 1
26
+ # south
27
+ #
9
28
  # @api private
10
29
  class Geometry
11
30
 
12
- attr_reader :attributes, :centred
31
+ include Vedeu::Model
32
+
33
+ attr_accessor :centred, :height, :name, :width
34
+ attr_reader :attributes
35
+ attr_writer :x, :y
36
+
37
+ class << self
38
+
39
+ # Build models using a simple DSL when a block is given, otherwise returns
40
+ # a new instance of the class including this module.
41
+ #
42
+ # @see Vedeu::Geometry#initialize
43
+ def build(attributes = {}, &block)
44
+ attributes = defaults.merge(attributes)
45
+
46
+ model = new(attributes)
47
+ model.deputy(attributes[:client]).instance_eval(&block) if block_given?
48
+ model
49
+ end
50
+
51
+ private
52
+
53
+ # The default values for a new instance of this class.
54
+ #
55
+ # @return [Hash]
56
+ def defaults
57
+ {
58
+ client: nil
59
+ }
60
+ end
61
+
62
+ end
13
63
 
14
64
  # Returns a new instance of Geometry.
15
65
  #
16
66
  # @param attributes [Hash]
67
+ # @option attributes centred [Boolean]
68
+ # @option attributes height [Fixnum]
69
+ # @option attributes name [String]
70
+ # @option attributes width [Fixnum]
71
+ # @option attributes x [Fixnum]
72
+ # @option attributes xn [Fixnum]
73
+ # @option attributes y [Fixnum]
74
+ # @option attributes yn [Fixnum]
17
75
  # @return [Geometry]
18
76
  def initialize(attributes = {})
19
77
  @attributes = defaults.merge(attributes)
20
78
 
21
79
  @centred = @attributes[:centred]
22
80
  @height = @attributes[:height]
81
+ @name = @attributes[:name]
23
82
  @width = @attributes[:width]
83
+ @x = @attributes[:x]
84
+ @xn = @attributes[:xn]
85
+ @y = @attributes[:y]
86
+ @yn = @attributes[:yn]
87
+ @repository = Vedeu.geometries
88
+ end
89
+
90
+ # Returns log friendly output.
91
+ #
92
+ # @note
93
+ # The attribute format is (specified/calculated).
94
+ #
95
+ # @return [String]
96
+ def inspect
97
+ "<#{self.class.name} (height:(#{@height}/#{height}) " \
98
+ "width:(#{@width}/#{width}) " \
99
+ "top:#{top} " \
100
+ "bottom:#{bottom} " \
101
+ "left:#{left} " \
102
+ "right:#{right})>"
24
103
  end
25
104
 
26
105
  # Returns the row/line start position for the interface.
27
106
  #
28
107
  # @return [Fixnum]
29
108
  def y
30
- if attributes[:y].is_a?(Proc)
31
- attributes[:y].call
109
+ if @y.is_a?(Proc)
110
+ @y.call
32
111
 
33
112
  else
34
- attributes[:y]
113
+ @y
35
114
 
36
115
  end
37
116
  end
@@ -40,11 +119,11 @@ module Vedeu
40
119
  #
41
120
  # @return [Fixnum]
42
121
  def yn
43
- if attributes[:yn].is_a?(Proc)
44
- attributes[:yn].call
122
+ if @yn.is_a?(Proc)
123
+ @yn.call
45
124
 
46
125
  else
47
- attributes[:yn]
126
+ @yn
48
127
 
49
128
  end
50
129
  end
@@ -53,11 +132,11 @@ module Vedeu
53
132
  #
54
133
  # @return [Fixnum]
55
134
  def x
56
- if attributes[:x].is_a?(Proc)
57
- attributes[:x].call
135
+ if @x.is_a?(Proc)
136
+ @x.call
58
137
 
59
138
  else
60
- attributes[:x]
139
+ @x
61
140
 
62
141
  end
63
142
  end
@@ -66,11 +145,11 @@ module Vedeu
66
145
  #
67
146
  # @return [Fixnum]
68
147
  def xn
69
- if attributes[:xn].is_a?(Proc)
70
- attributes[:xn].call
148
+ if @xn.is_a?(Proc)
149
+ @xn.call
71
150
 
72
151
  else
73
- attributes[:xn]
152
+ @xn
74
153
 
75
154
  end
76
155
  end
@@ -141,7 +220,6 @@ module Vedeu
141
220
 
142
221
  end
143
222
  end
144
- alias_method :y_min, :top
145
223
 
146
224
  # Returns the row above the top by default.
147
225
  #
@@ -171,7 +249,6 @@ module Vedeu
171
249
 
172
250
  end
173
251
  end
174
- alias_method :x_min, :left
175
252
 
176
253
  # Returns the column before left by default.
177
254
  #
@@ -258,257 +335,21 @@ module Vedeu
258
335
  (left...right).to_a
259
336
  end
260
337
 
261
- # Returns the actual position of y for a given index. Crudely corrects out
262
- # of range values.
263
- #
264
- # @example
265
- # # y_range = [7, 8, 9, 10, 11]
266
- # y_position # => 7
267
- # y_position(-2) # => 7
268
- # y_position(2) # => 9
269
- # y_position(7) # => 11
270
- #
271
- # @param index [Fixnum]
272
- # @return [Fixnum]
273
- def y_position(index = 0)
274
- if index <= 0
275
- y_min
276
-
277
- elsif index >= y_max_index
278
- y_max
279
-
280
- else
281
- y_range[index]
282
-
283
- end
284
- end
285
-
286
- # Returns the actual position of x for a given index. Crudely corrects out
287
- # of range values.
288
- #
289
- # @example
290
- # # x_range = [4, 5, 6, 7, 8, 9, 10, 11, 12, 13]
291
- # x_position # => 4
292
- # x_position(-2) # => 4
293
- # x_position(2) # => 6
294
- # x_position(15) # => 13
295
- #
296
- # @param index [Fixnum]
297
- # @return [Fixnum]
298
- def x_position(index = 0)
299
- if index <= 0
300
- x_min
301
-
302
- elsif index >= x_max_index
303
- x_max
304
-
305
- else
306
- x_range[index]
307
-
308
- end
309
- end
310
-
311
- # Provides all the geometry in a convenient hash.
312
- #
313
- # @return [Hash]
314
- def to_h
315
- {
316
- centred: centred,
317
- height: height,
318
- width: width,
319
- x: x,
320
- y: y,
321
- top: top,
322
- right: right,
323
- bottom: bottom,
324
- left: left,
325
- north: north,
326
- east: east,
327
- south: south,
328
- west: west,
329
- virtual_x: virtual_x,
330
- virtual_y: virtual_y,
331
- }
332
- end
333
-
334
338
  private
335
339
 
336
- # Returns the y coordinate as an offset index in the area's y range. When a
337
- # value is provided, the y coordinate is overridden. Crudely corrects out of
338
- # range values.
339
- #
340
- # @example
341
- # # y_range = [7, 8, 9, 10]
342
- # # y = 8
343
- # y_index # => 1
344
- # y_index(10) # => 3
345
- # y_index(5) # => 0
346
- # y_index(15) # => 3
347
- #
348
- # @param value [Fixnum]
349
- # @return [Fixnum]
350
- def y_index(value = y)
351
- if height <= 0 || value <= y_min
352
- 0
353
-
354
- elsif value >= y_max
355
- y_max_index
356
-
357
- else
358
- y_range.index(value)
359
-
360
- end
361
- end
362
-
363
- # Returns the x coordinate as an offset index in the area's x range. When a
364
- # value is provided, the x coordinate is overridden. Crudely corrects out of
365
- # range values.
366
- #
367
- # @example
368
- # # x_range = [4, 5, 6, 7, 8, 9, 10, 11, 12, 13]
369
- # # x = 8
370
- # x_index # => 4
371
- # x_index(11) # => 7
372
- # x_index(2) # => 0
373
- # x_index(15) # => 9
374
- #
375
- # @param value [Fixnum]
376
- # @return [Fixnum]
377
- def x_index(value = x)
378
- if width <= 0 || value <= x_min
379
- 0
380
-
381
- elsif value >= x_max
382
- x_max_index
383
-
384
- else
385
- x_range.index(value)
386
-
387
- end
388
- end
389
-
390
- # Returns the maximum y index for an area.
391
- #
392
- # @example
393
- # # height = 3
394
- # y_max_index # => 2
395
- #
396
- # @return [Fixnum]
397
- def y_max_index
398
- return 0 if y_indices.empty?
399
-
400
- y_indices.last
401
- end
402
-
403
- # Returns the maximum x index for an area.
404
- #
405
- # @example
406
- # # width = 6
407
- # x_max_index # => 5
408
- #
409
- # @return [Fixnum]
410
- def x_max_index
411
- return 0 if x_indices.empty?
412
-
413
- x_indices.last
414
- end
415
-
416
- # Returns the same as #y_range, except as indices of an array.
417
- #
418
- # @example
419
- # # height = 4
420
- # y_indices # => [0, 1, 2, 3]
421
- #
422
- # @return [Array]
423
- def y_indices
424
- (0...height).to_a
425
- end
426
-
427
- # Returns the same as #x_range, except as indices of an array.
428
- #
429
- # @example
430
- # # width = 10
431
- # x_indices # => [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
432
- #
433
- # @return [Array]
434
- def x_indices
435
- (0...width).to_a
436
- end
437
-
438
- # Returns an array with all coordinates from x to x_max.
439
- #
440
- # @example
441
- # # width = 10
442
- # # x_min = 4
443
- # # x_max = 14
444
- # x_range # => [4, 5, 6, 7, 8, 9, 10, 11, 12, 13]
445
- #
446
- # @return [Array]
447
- def x_range
448
- (x_min...x_max).to_a
449
- end
450
-
451
- # Returns an array with all coordinates from y to y_max.
452
- #
453
- # @example
454
- # # height = 4
455
- # # y_min = 7
456
- # # y_max = 11
457
- # y_range # => [7, 8, 9, 10]
458
- #
459
- # @return [Array]
460
- def y_range
461
- (y_min...y_max).to_a
462
- end
463
-
464
- # Returns the maximum y coordinate for an area.
465
- #
466
- # @example
467
- # # y_min = 2
468
- # # height = 4
469
- # y_max # => 6
470
- #
471
- # @return [Fixnum]
472
- def y_max
473
- if height <= 0
474
- 0
475
-
476
- else
477
- y_min + height
478
-
479
- end
480
- end
481
-
482
- # Returns the maximum x coordinate for an area.
483
- #
484
- # @example
485
- # # x_min = 5
486
- # # width = 20
487
- # x_max # => 25
488
- #
489
- # @return [Fixnum]
490
- def x_max
491
- if width <= 0
492
- 0
493
-
494
- else
495
- x_min + width
496
-
497
- end
498
- end
499
-
500
- # The default geometry of an interface- full screen.
340
+ # The default values for a new instance of this class.
501
341
  #
502
342
  # @return [Hash]
503
343
  def defaults
504
344
  {
505
- y: 1,
506
- x: 1,
507
- width: Terminal.width,
508
- height: Terminal.height,
509
345
  centred: false,
510
- yn: nil,
511
- xn: nil,
346
+ height: Terminal.height,
347
+ name: '',
348
+ width: Terminal.width,
349
+ x: 1,
350
+ xn: Terminal.width,
351
+ y: 1,
352
+ yn: Terminal.height,
512
353
  }
513
354
  end
514
355
 
@@ -3,18 +3,22 @@ module Vedeu
3
3
  # Interfaces can be associated with one another by being members of the same
4
4
  # Group. A Group is a collection of interface names.
5
5
  #
6
+ # @api private
6
7
  class Group
7
8
 
9
+ include Vedeu::Model
10
+
8
11
  attr_reader :name
9
12
 
10
13
  # Return a new instance of Group.
11
14
  #
12
15
  # @param name [String] The name of the group.
13
- # @param members [String]
16
+ # @param members [Array]
14
17
  # @return [Group]
15
- def initialize(name, *members)
16
- @name = name
17
- @members = members.to_set
18
+ def initialize(name, members = [])
19
+ @name = name
20
+ @members = Array(members)
21
+ @repository = Vedeu.groups
18
22
  end
19
23
 
20
24
  # Add a member to the group by name.
@@ -22,16 +26,14 @@ module Vedeu
22
26
  # @param member [String]
23
27
  # @return [Group]
24
28
  def add(member)
25
- new_members = @members.add(member)
26
-
27
- Group.new(name, *new_members)
29
+ Group.new(name, members.add(member)).store
28
30
  end
29
31
 
30
- # Returns the members as a collection.
32
+ # Return the members as a Set.
31
33
  #
32
- # @return [Array]
34
+ # @return [Set]
33
35
  def members
34
- @members.to_a
36
+ @members.to_set
35
37
  end
36
38
 
37
39
  # Remove a member from the group by name.
@@ -39,18 +41,18 @@ module Vedeu
39
41
  # @param member [String]
40
42
  # @return [Group]
41
43
  def remove(member)
42
- new_members = @members.delete(member)
43
-
44
- Group.new(name, *new_members)
44
+ Group.new(name, members.delete(member)).store
45
45
  end
46
46
 
47
47
  # Remove all members from the group.
48
48
  #
49
49
  # @return [Group]
50
50
  def reset
51
- Group.new(name)
51
+ Group.new(name).store
52
52
  end
53
53
 
54
+ private
55
+
54
56
  end # Group
55
57
 
56
58
  end # Vedeu
@@ -1,3 +1,6 @@
1
+ require 'vedeu/models/model'
2
+ require 'vedeu/support/common'
3
+
1
4
  module Vedeu
2
5
 
3
6
  # Converts the collection passed into a list of menu items which can be
@@ -6,32 +9,97 @@ module Vedeu
6
9
  # @api private
7
10
  class Menu
8
11
 
9
- include Model
12
+ include Vedeu::Common
13
+ include Vedeu::Model
10
14
 
11
- # Returns a new instance of Menu.
12
- #
13
- # @param collection [Array]
14
- # @param name [String]
15
- # @return [Menu]
16
- def initialize(collection, name = '')
17
- @collection = collection
18
- @name = name
19
- @current = 0
20
- @selected = nil
21
- end
15
+ attr_accessor :collection
22
16
 
23
17
  # Returns the index of the value in the collection which is current.
24
18
  #
25
19
  # @return [Fixnum]
26
- def current
27
- @current
28
- end
20
+ attr_accessor :current
21
+
22
+ attr_accessor :name
29
23
 
30
24
  # Returns the index of the value in the collection which is selected.
31
25
  #
32
26
  # @return [Fixnum]
33
- def selected
34
- @selected
27
+ attr_accessor :selected
28
+
29
+ class << self
30
+
31
+ # @option attributes collection []
32
+ # @option attributes client []
33
+ # @option attributes name []
34
+ # @option attributes current []
35
+ # @option attributes selected []
36
+ def build(attributes = {}, &block)
37
+ attributes = defaults.merge(attributes)
38
+
39
+ model = new(attributes[:collection],
40
+ attributes[:name],
41
+ attributes[:current],
42
+ attributes[:selected])
43
+ model.deputy(attributes[:client]).instance_eval(&block) if block_given?
44
+ model
45
+ end
46
+
47
+ # Register a menu by name which will display a collection of items for
48
+ # your users to select; and provide interactivity within your application.
49
+ #
50
+ # @param name [String] The name of the menu. Used to reference the
51
+ # menu throughout your application's execution lifetime.
52
+ # @param block [Proc] A set of attributes which define the features of the
53
+ # menu. See {Vedeu::DSL::Menu#items} and {Vedeu::DSL::Menu#name}.
54
+ #
55
+ # @example
56
+ # Vedeu.menu 'my_interface' do
57
+ # items [:item_1, :item_2, :item_3]
58
+ # ...
59
+ #
60
+ # Vedeu.menu do
61
+ # name 'menus_must_have_a_name'
62
+ # items Track.all_my_favourites
63
+ # ...
64
+ #
65
+ # @raise [InvalidSyntax] The required block was not given.
66
+ # @return [API::Menu]
67
+ def menu(name = '', &block)
68
+ fail InvalidSyntax, 'block not given' unless block_given?
69
+
70
+ build({ name: name }, &block).store
71
+ end
72
+
73
+ private
74
+
75
+ # The default values for a new instance of this class.
76
+ #
77
+ # @return [Hash]
78
+ def defaults
79
+ {
80
+ client: nil,
81
+ collection: [],
82
+ current: 0,
83
+ name: '',
84
+ selected: nil,
85
+ }
86
+ end
87
+
88
+ end
89
+
90
+ # Returns a new instance of Menu.
91
+ #
92
+ # @param collection [Array]
93
+ # @param name [String]
94
+ # @param current [Fixnum]
95
+ # @param selected [Fixnum|NilClass]
96
+ # @return [Menu]
97
+ def initialize(collection = [], name = '', current = 0, selected = nil)
98
+ @collection = collection
99
+ @name = name
100
+ @current = current
101
+ @selected = selected
102
+ @repository = Vedeu.menus
35
103
  end
36
104
 
37
105
  # Returns the item from the collection which shares the same index as the
@@ -161,11 +229,6 @@ module Vedeu
161
229
 
162
230
  private
163
231
 
164
- # @return [Class] The repository class for this model.
165
- def repository
166
- Vedeu::Menus
167
- end
168
-
169
232
  end # Menu
170
233
 
171
234
  end # Vedeu
@@ -0,0 +1,51 @@
1
+ module Vedeu
2
+
3
+ # When included into a class, provides the mechanism to store the class in a
4
+ # repository for later retrieval.
5
+ #
6
+ # @api private
7
+ module Model
8
+
9
+ attr_reader :repository
10
+
11
+ # Returns a DSL instance responsible for defining the DSL methods of this
12
+ # model.
13
+ #
14
+ # @param client [Object|NilClass] The client binding represents
15
+ # the client application object that is currently invoking a DSL method.
16
+ # It is required so that we can send messages to the client application
17
+ # object should we need to.
18
+ # @return [void] The DSL instance for this model.
19
+ def deputy(client = nil)
20
+ Object.const_get(dsl_class).new(self, client)
21
+ end
22
+
23
+ # @return [void] The model instance stored in the repository.
24
+ def store
25
+ repository.store(self) # if valid?
26
+ end
27
+
28
+ private
29
+
30
+ # Removes the module part from the expression in the string.
31
+ #
32
+ # @example
33
+ # demodulize('Vedeu::DSL::Interface') # => "Interface"
34
+ #
35
+ # @param klass [Class|String]
36
+ def demodulize(klass)
37
+ klass = klass.to_s
38
+
39
+ klass[(klass.rindex('::') + 2)..-1]
40
+ end
41
+
42
+ # Returns the DSL class name responsible for this model.
43
+ #
44
+ # @return [String]
45
+ def dsl_class
46
+ 'Vedeu::DSL::' + demodulize(self.class.name)
47
+ end
48
+
49
+ end # Model
50
+
51
+ end # Vedeu
@@ -0,0 +1,12 @@
1
+ require 'vedeu/models/view/chars'
2
+ require 'vedeu/models/view/char'
3
+ require 'vedeu/models/view/composition'
4
+ require 'vedeu/models/view/interfaces'
5
+ require 'vedeu/models/view/interface'
6
+ require 'vedeu/models/view/lines'
7
+ require 'vedeu/models/view/line'
8
+ require 'vedeu/models/view/streams'
9
+ require 'vedeu/models/view/stream'
10
+
11
+ module Vedeu
12
+ end # Vedeu