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,3 +1,5 @@
1
+ require 'vedeu/configuration/configuration'
2
+
1
3
  module Vedeu
2
4
 
3
5
  # Provides the ability to log anything to the Vedeu log file.
@@ -7,17 +9,49 @@ module Vedeu
7
9
 
8
10
  class << self
9
11
 
12
+ # Write a message to the Vedeu log file.
13
+ #
14
+ # @param message [String] The message you wish to emit to the log
15
+ # file, useful for debugging.
16
+ # @param force [Boolean] When evaluates to true will attempt to
17
+ # write to the log file regardless of the Configuration setting.
18
+ #
19
+ # @example
20
+ # Vedeu.log('A useful debugging message: Error!')
21
+ #
22
+ # @return [TrueClass]
23
+ def log(message, force = false)
24
+ colour = [:red, :green, :yellow, :blue, :magenta, :cyan, :white].sample
25
+
26
+ logger.debug(Esc.send(colour) { message }) if enabled? || force
27
+ end
28
+
10
29
  # @return [TrueClass]
11
30
  def logger
12
- Logger.new(Configuration.log).tap do |log|
31
+ Logger.new(log_file).tap do |log|
13
32
  log.formatter = proc do |_, time, _, message|
14
- [timestamp(time.utc.iso8601), message, "\n"].join
33
+ formatted_message(message, time)
15
34
  end
16
35
  end
17
36
  end
18
37
 
19
38
  private
20
39
 
40
+ # @return [String]
41
+ def formatted_message(message, time = Time.now)
42
+ [timestamp(time.utc.iso8601), message, "\n"].join
43
+ end
44
+
45
+ # @return [Boolean]
46
+ def enabled?
47
+ Vedeu::Configuration.debug?
48
+ end
49
+
50
+ # @return [String]
51
+ def log_file
52
+ Vedeu::Configuration.log
53
+ end
54
+
21
55
  # Returns a formatted (red, underlined) UTC timestamp,
22
56
  # eg. 2014-10-24T12:34:56Z
23
57
  #
@@ -0,0 +1,61 @@
1
+ module Vedeu
2
+
3
+ class Node
4
+
5
+ attr_accessor :name,
6
+ :parent
7
+
8
+ attr_reader :children
9
+
10
+ def initialize(name)
11
+ @name = name
12
+ @children = []
13
+ end
14
+
15
+ def add_child(node)
16
+ children << node
17
+
18
+ node.parent = self
19
+ end
20
+ alias :<< :add_child
21
+
22
+ def remove_child(node)
23
+ children.delete(node)
24
+ end
25
+
26
+ def [](index)
27
+ children[index]
28
+ end
29
+
30
+ def []=(index, node)
31
+ replaced_child = @children[index]
32
+ children[index] = node
33
+ replaced_child.parent = nil
34
+ node.parent = self
35
+ end
36
+
37
+ def leaf?
38
+ children.empty?
39
+ end
40
+
41
+ end # Node
42
+
43
+ class Task < Node
44
+
45
+ def initialize(name, time_required = nil)
46
+ super(name)
47
+ @time_required = time_required
48
+ end
49
+ def time_required
50
+ if leaf?
51
+ @time_required
52
+ else
53
+ time = 0.0
54
+ children.each { |child_task| time += child_task.time_required }
55
+ time
56
+ end
57
+ end
58
+
59
+ end # Task
60
+
61
+ end # Vedeu
@@ -1,18 +1,24 @@
1
1
  module Vedeu
2
2
 
3
3
  # Change coordinates into an escape sequence to set the cursor position.
4
- # Also used as the basis of an Offset.
5
4
  #
6
5
  # @api private
7
- class Position < Array
6
+ class Position
7
+
8
+ attr_reader :y,
9
+ :x
10
+
11
+ alias_method :first, :y
12
+ alias_method :last, :x
8
13
 
9
14
  # Initializes a new instance of Position.
10
15
  #
11
16
  # @param y [Fixnum]
12
17
  # @param x [Fixnum]
13
18
  # @return [Position]
14
- def initialize(y = 0, x = 0)
15
- super([y, x])
19
+ def initialize(y = 1, x = 1)
20
+ @y = y
21
+ @x = x
16
22
  end
17
23
 
18
24
  # Returns an escape sequence to position the cursor. When passed a block,
@@ -33,28 +39,37 @@ module Vedeu
33
39
  private
34
40
 
35
41
  # Returns the escape sequence to reposition the cursors at the coordinates
36
- # specified by x and y. If either of these values are 0, then we use 1,
37
- # as ANSI terminals do not have a 0, 0 coordinate.
42
+ # specified by x and y.
38
43
  #
39
44
  # @return [String]
40
45
  def sequence
41
- ["\e[", (y == 0 ? 1 : y), ';', (x == 0 ? 1 : x), 'H'].join
46
+ ["\e[", y, ';', x, 'H'].join
42
47
  end
43
48
 
44
- # Returns the y coordinate. Can be 0 as this class may also be used as an
45
- # Offset.
49
+ # Returns the y coordinate.
46
50
  #
47
51
  # @return [Fixnum]
48
52
  def y
49
- (first == nil) ? 0 : first
53
+ if @y < 1 || @y.nil?
54
+ 1
55
+
56
+ else
57
+ @y
58
+
59
+ end
50
60
  end
51
61
 
52
- # Returns the x coordinate. Can be 0 as this class may also be used as an
53
- # Offset.
62
+ # Returns the x coordinate.
54
63
  #
55
64
  # @return [Fixnum]
56
65
  def x
57
- (last == nil) ? 0 : last
66
+ if @x < 1 || @x.nil?
67
+ 1
68
+
69
+ else
70
+ @x
71
+
72
+ end
58
73
  end
59
74
 
60
75
  end # Position
@@ -0,0 +1,79 @@
1
+ module Vedeu
2
+
3
+ class PositionValidator
4
+
5
+ extend Forwardable
6
+
7
+ def_delegators Vedeu::Terminal,
8
+ :tx,
9
+ :ty,
10
+ :txn,
11
+ :tyn
12
+
13
+ def_delegators :interface,
14
+ :border?,
15
+ :border,
16
+ :geometry
17
+
18
+ def_delegators :border,
19
+ :left?,
20
+ :right?,
21
+ :top?,
22
+ :bottom?
23
+
24
+ def_delegators :geometry,
25
+ :left,
26
+ :right,
27
+ :top,
28
+ :bottom
29
+
30
+ attr_accessor :x, :y
31
+
32
+ def self.validate(interface, x, y)
33
+ new(interface, x, y).validate
34
+ end
35
+
36
+ def initialize(interface, x, y)
37
+ @interface = interface
38
+ @x = x
39
+ @y = y
40
+ end
41
+
42
+ def validate
43
+ terminal_validation
44
+ interface_validation
45
+ border_validation
46
+
47
+ self
48
+ end
49
+
50
+ private
51
+
52
+ attr_reader :interface
53
+
54
+ def terminal_validation
55
+ @x = tx if x < tx
56
+ @x = txn if x > txn
57
+ @y = ty if y < ty
58
+ @y = tyn if y > tyn
59
+ end
60
+
61
+ def interface_validation
62
+ @x = left if x < left
63
+ @x = right if x > right
64
+ @y = top if y < top
65
+ @y = bottom if y > bottom
66
+ end
67
+
68
+ def border_validation
69
+ if border?
70
+ @x = left + 1 if left? && x < (left + 1)
71
+ @x = right - 2 if right? && x > (right - 1)
72
+ @y = top + 1 if top? && y < (top + 1)
73
+ @y = bottom - 2 if bottom? && y > (bottom - 1)
74
+ end
75
+ end
76
+
77
+ end # PositionValidator
78
+
79
+ end # Vedeu
@@ -0,0 +1,65 @@
1
+ module Vedeu
2
+
3
+ # The basis of a fake input device.
4
+ class Read
5
+
6
+ # @param console []
7
+ # @param data [String|NilClass]
8
+ # @return [String]
9
+ def self.from(console, data = nil)
10
+ new(console, data).read
11
+ end
12
+
13
+ # @param console []
14
+ # @param data [String|NilClass]
15
+ # @return [Vedeu::Read]
16
+ def initialize(console, data = nil)
17
+ @console = console
18
+ @data = data
19
+ end
20
+
21
+ # Provides IO.console emulation of #getch.
22
+ #
23
+ # @return [String]
24
+ def getch(string = nil)
25
+ @data = string[0] unless string.nil?
26
+
27
+ read
28
+ end
29
+
30
+ # Provides IO.console emulation of #gets.
31
+ #
32
+ # @return [String]
33
+ def gets(string = nil)
34
+ @data = string.chomp unless string.nil?
35
+
36
+ read
37
+ end
38
+
39
+ # Provides IO.console emulation of #read_nonblock.
40
+ #
41
+ # @return [String]
42
+ def read_nonblock(bytes = 1, string = nil)
43
+ @data = string unless string.nil?
44
+
45
+ read
46
+ end
47
+
48
+ # @return [String]
49
+ def read
50
+ if data
51
+ data
52
+
53
+ else
54
+ ''
55
+
56
+ end
57
+ end
58
+
59
+ private
60
+
61
+ attr_reader :console, :data
62
+
63
+ end # Read
64
+
65
+ end # Vedeu
@@ -5,21 +5,20 @@ module Vedeu
5
5
  # @api private
6
6
  module Refresh
7
7
 
8
- include Common
9
8
  extend self
10
9
 
11
10
  # Refresh all registered interfaces.
12
11
  #
13
12
  # @return [Array]
14
13
  def all
15
- Vedeu::Interfaces.registered.each { |name| by_name(name) }
14
+ Vedeu.interfaces.registered.each { |name| by_name(name) }
16
15
  end
17
16
 
18
17
  # Refresh the interface which is currently focussed.
19
18
  #
20
- # @return [|NoInterfacesDefined]
19
+ # @return [|NilClass]
21
20
  def by_focus
22
- by_name(Focus.current)
21
+ by_name(Vedeu.focus) if Vedeu.focus
23
22
  end
24
23
 
25
24
  # Refresh an interface, or collection of interfaces belonging to a group.
@@ -28,7 +27,9 @@ module Vedeu
28
27
  # @return [Array|ModelNotFound] A collection of the names of interfaces
29
28
  # refreshed, or an exception if the group was not found.
30
29
  def by_group(group_name)
31
- Groups.find(group_name).each { |name| by_name(name) }
30
+ Vedeu.log("Refreshing group: '#{group_name}'")
31
+
32
+ Vedeu.groups.find(group_name).members.each { |name| by_name(name) }
32
33
  end
33
34
 
34
35
  # Refresh an interface by name.
@@ -37,34 +38,9 @@ module Vedeu
37
38
  # named buffer.
38
39
  # @return [Array|ModelNotFound]
39
40
  def by_name(name)
40
- interface = Interfaces.find(name)
41
- buffer = Buffers.find(name)
42
-
43
- Compositor.compose(interface, buffer)
44
- end
45
-
46
- # Register a refresh event for an interface or group of interfaces by name.
47
- # When the event is called, the interface, or all interfaces belonging to
48
- # the group with this name will be refreshed.
49
- #
50
- # @param type [Symbol]
51
- # @param name [String]
52
- # @param delay [Float]
53
- # @return [Boolean]
54
- def register_event(type, name, delay = 0.0)
55
- event = if type == :by_group
56
- "_refresh_group_#{name}_".to_sym
57
-
58
- else
59
- "_refresh_#{name}_".to_sym
60
-
61
- end
62
-
63
- return false if Events.registered?(event)
64
-
65
- Events.add(event, { delay: delay }) { Refresh.send(type, name) }
41
+ Vedeu.log("Refreshing interface: '#{name}'")
66
42
 
67
- true
43
+ Vedeu::Compositor.compose(name)
68
44
  end
69
45
 
70
46
  end # Refresh
@@ -1,3 +1,8 @@
1
+ require 'vedeu/configuration/configuration'
2
+ require 'vedeu/support/common'
3
+ require 'vedeu/support/esc'
4
+ require 'vedeu/support/log'
5
+
1
6
  module Vedeu
2
7
 
3
8
  # This module is the direct interface between Vedeu and your terminal/
@@ -6,16 +11,17 @@ module Vedeu
6
11
  # @api private
7
12
  module Terminal
8
13
 
14
+ include Vedeu::Common
9
15
  extend self
10
16
 
11
17
  # Opens a terminal screen in either `raw` or `cooked` mode. On exit,
12
18
  # attempts to restore the screen. See {Vedeu::Terminal#restore_screen}.
13
19
  #
14
20
  # @param block [Proc]
15
- # @raise [InvalidSyntax] When the required block is not given.
21
+ # @raise [InvalidSyntax] The required block was not given.
16
22
  # @return [Array]
17
23
  def open(&block)
18
- fail InvalidSyntax, '`open` requires a block.' unless block_given?
24
+ fail InvalidSyntax, 'block not given' unless block_given?
19
25
 
20
26
  if raw_mode?
21
27
  Vedeu.log("Terminal entering 'raw' mode")
@@ -58,10 +64,30 @@ module Vedeu
58
64
  # @param streams [String|Array]
59
65
  # @return [Array]
60
66
  def output(*streams)
61
- streams.each { |stream| console.print(stream) }
67
+ streams.each do |stream|
68
+ # Vedeu.log(Esc.escape(stream))
69
+
70
+ console.print(stream)
71
+
72
+ # Vedeu::Console.write(stream)
73
+ end
62
74
 
63
75
  streams
64
76
  end
77
+ alias_method :write, :output
78
+
79
+ # When the terminal emit the 'SIGWINCH' signal, Vedeu can intercept this
80
+ # and attempt to redraw the current interface with varying degrees of
81
+ # success. Can also be used to simulate a terminal resize.
82
+ #
83
+ # @return [TrueClass]
84
+ def resize
85
+ Vedeu.trigger(:_clear_)
86
+
87
+ Vedeu.trigger(:_refresh_)
88
+
89
+ true
90
+ end
65
91
 
66
92
  # @param block [Proc]
67
93
  # @return []
@@ -74,7 +100,7 @@ module Vedeu
74
100
  # Clears the entire terminal space.
75
101
  #
76
102
  # @return [String]
77
- def clear_screen
103
+ def clear
78
104
  output(Esc.string('clear'))
79
105
  end
80
106
 
@@ -180,6 +206,8 @@ module Vedeu
180
206
  end
181
207
  alias_method :x, :origin
182
208
  alias_method :y, :origin
209
+ alias_method :tx, :origin
210
+ alias_method :ty, :origin
183
211
 
184
212
  # Returns the total width (number of columns/characters) of the current
185
213
  # terminal.
@@ -192,6 +220,7 @@ module Vedeu
192
220
  size.last
193
221
  end
194
222
  alias_method :xn, :width
223
+ alias_method :txn, :width
195
224
 
196
225
  # Returns the total height (number of rows/lines) of the current terminal.
197
226
  #
@@ -203,6 +232,7 @@ module Vedeu
203
232
  size.first
204
233
  end
205
234
  alias_method :yn, :height
235
+ alias_method :tyn, :height
206
236
 
207
237
  # Returns a tuple containing the height and width of the current terminal.
208
238
  #
@@ -0,0 +1,104 @@
1
+ module Vedeu
2
+
3
+ # Present a string (or object responding to `to_s`).
4
+ #
5
+ class Text
6
+
7
+ # @see Vedeu::DSL::Text#text
8
+ def self.with(value = '', options = {})
9
+ new(value, options).aligned
10
+ end
11
+
12
+ # Returns a new instance of Text.
13
+ #
14
+ # @param value [String]
15
+ # @param options [Hash]
16
+ # @option options width [Integer]
17
+ # @option options anchor [Symbol] See {Text#anchor}
18
+ # @option options pad [String]
19
+ # @return [Text]
20
+ def initialize(value = '', options = {})
21
+ @value = value
22
+ @options = defaults.merge(options)
23
+ end
24
+
25
+ # Aligns the value.
26
+ #
27
+ # @return [String]
28
+ def aligned
29
+ return string unless width
30
+
31
+ return truncated if truncate?
32
+
33
+ case anchor
34
+ when :align, :left, :text then left
35
+ when :centre, :center then centre
36
+ when :right then right
37
+ else
38
+ left
39
+ end
40
+ end
41
+
42
+ private
43
+
44
+ attr_reader :value, :options
45
+
46
+ # @return [Symbol] One of :align, :centre, :center, :left, :right, :text
47
+ def anchor
48
+ options[:anchor]
49
+ end
50
+
51
+ # @return [String]
52
+ def centre
53
+ string.center(width, pad)
54
+ end
55
+
56
+ # The default values for a new instance of this class.
57
+ #
58
+ # @return [Hash]
59
+ def defaults
60
+ {
61
+ anchor: :left,
62
+ pad: ' ',
63
+ width: nil,
64
+ }
65
+ end
66
+
67
+ # @return [String]
68
+ def left
69
+ string.ljust(width, pad)
70
+ end
71
+
72
+ # @return [String]
73
+ def pad
74
+ options[:pad]
75
+ end
76
+
77
+ # @return [String]
78
+ def right
79
+ string.rjust(width, pad)
80
+ end
81
+
82
+ # @return [String]
83
+ def string
84
+ value.to_s
85
+ end
86
+
87
+ # @return [Boolean]
88
+ def truncate?
89
+ string.size > width
90
+ end
91
+
92
+ # @return [String]
93
+ def truncated
94
+ string.slice(0, width)
95
+ end
96
+
97
+ # @return [Fixnum]
98
+ def width
99
+ options[:width]
100
+ end
101
+
102
+ end # Align
103
+
104
+ end # Vedeu
@@ -1,3 +1,7 @@
1
+ require 'vedeu/configuration/configuration'
2
+ require 'vedeu/support/esc'
3
+ require 'vedeu/support/log'
4
+
1
5
  module Vedeu
2
6
 
3
7
  # This class currently provides the means to trace each method call which
@@ -28,7 +32,7 @@ module Vedeu
28
32
  #
29
33
  # @todo Deprecate, and use TracePoint instead.
30
34
  #
31
- # @return []
35
+ # @return [NilClass|String]
32
36
  def trace
33
37
  set_trace_func proc { |event, _file, _line, id, binding, classname|
34
38
  if event == watched && id != :log && classes.include?(classname.to_s)
@@ -52,9 +56,11 @@ module Vedeu
52
56
  # Writes the message to the log file.
53
57
  #
54
58
  # @param message [String]
55
- # @return [Boolean]
59
+ # @return [String]
56
60
  def log_this(message)
57
61
  Vedeu::Log.logger.debug(message)
62
+
63
+ message
58
64
  end
59
65
 
60
66
  # Provides inspection of the local variables set within the method being
@@ -96,6 +102,8 @@ module Vedeu
96
102
  defaults.merge(@options)
97
103
  end
98
104
 
105
+ # The default values for a new instance of this class.
106
+ #
99
107
  # @return [Hash]
100
108
  def defaults
101
109
  {
@@ -145,16 +153,7 @@ module Vedeu
145
153
  #
146
154
  # @return [Set]
147
155
  def vedeu_exceptions
148
- Set.new [
149
- 'Vedeu::ModelNotFound',
150
- 'Vedeu::InvalidSyntax',
151
- 'Vedeu::KeyInUse',
152
- 'Vedeu::MissingRequired',
153
- 'Vedeu::ModeSwitch',
154
- 'Vedeu::NoInterfacesDefined',
155
- 'Vedeu::NotImplemented',
156
- 'Vedeu::OutOfRange',
157
- ]
156
+ Vedeu::Exceptions.to_set
158
157
  end
159
158
 
160
159
  # Returns a set of classes to ignore during tracing.
@@ -167,8 +166,6 @@ module Vedeu
167
166
  # 'Vedeu::API',
168
167
  # 'Vedeu::Application',
169
168
  # 'Vedeu::Background',
170
- # 'Vedeu::Buffers',
171
- # 'Vedeu::Clear',
172
169
  'Vedeu::Coercions',
173
170
  'Vedeu::Colour',
174
171
  'Vedeu::Translator',
@@ -180,30 +177,21 @@ module Vedeu
180
177
  # 'Vedeu::Cursors',
181
178
  'Vedeu::Esc',
182
179
  'Vedeu::Event',
183
- # 'Vedeu::Events',
184
180
  # 'Vedeu::Focus',
185
181
  # 'Vedeu::Foreground',
186
182
  'Vedeu::Geometry',
187
183
  # 'Vedeu::Grid',
188
- # 'Vedeu::Groups',
189
184
  # 'Vedeu::Input',
190
185
  # 'Vedeu::Interface',
191
- # 'Vedeu::Interfaces',
192
186
  # 'Vedeu::Keymap',
193
- # 'Vedeu::Keymaps',
194
- # 'Vedeu::KeymapValidator',
195
187
  # 'Vedeu::Launcher',
196
188
  # 'Vedeu::Line',
197
189
  'Vedeu::Log',
198
190
  # 'Vedeu::Menu',
199
191
  # 'Vedeu::Menus',
200
- 'Vedeu::MonoLogger',
201
- # 'Vedeu::Offset',
202
- # 'Vedeu::Offsets',
203
192
  'Vedeu::Position',
204
193
  'Vedeu::Presentation',
205
194
  # 'Vedeu::Refresh',
206
- # 'Vedeu::Registrar',
207
195
  # 'Vedeu::Render',
208
196
  'Vedeu::Repository',
209
197
  'Vedeu::Stream',