vedeu 0.7.4 → 0.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (277) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +3 -0
  3. data/docs/api.md +5 -1
  4. data/docs/borders.md +2 -26
  5. data/docs/dsl.md +4 -4
  6. data/docs/dsl_elements.md +100 -0
  7. data/docs/events/by_name/action.md +3 -0
  8. data/docs/events/by_name/cursor_hide.md +3 -0
  9. data/docs/events/by_name/cursor_reset.md +3 -0
  10. data/docs/events/by_name/cursor_show.md +3 -0
  11. data/docs/events/by_name/geometry_down.md +3 -0
  12. data/docs/events/by_name/geometry_left.md +3 -0
  13. data/docs/events/by_name/geometry_right.md +3 -0
  14. data/docs/events/by_name/geometry_up.md +3 -0
  15. data/docs/events/by_name/hide_view.md +3 -0
  16. data/docs/events/by_name/set_border_caption.md +13 -0
  17. data/docs/events/by_name/set_border_title.md +13 -0
  18. data/docs/events/by_name/show_view.md +3 -0
  19. data/docs/events/by_name/standalone.md +3 -0
  20. data/docs/events/by_name/toggle_view.md +3 -0
  21. data/docs/events/by_name/view_down.md +4 -0
  22. data/docs/events/by_name/view_left.md +4 -0
  23. data/docs/events/by_name/view_right.md +4 -0
  24. data/docs/events/by_name/view_up.md +4 -0
  25. data/examples/views/empty_template.rb +46 -0
  26. data/examples/views/expected/line.out +1 -0
  27. data/examples/views/expected/lines.out +1 -0
  28. data/examples/views/expected/lines_alignment.out +1 -0
  29. data/examples/views/line.rb +220 -0
  30. data/examples/views/lines.rb +281 -0
  31. data/examples/views/lines_alignment.rb +231 -0
  32. data/examples/views/lines_line_stream.rb +99 -0
  33. data/examples/views/lines_line_streams.rb +73 -0
  34. data/examples/views/lines_line_streams_stream.rb +83 -0
  35. data/examples/views/lines_line_streams_stream_stream.rb +53 -0
  36. data/examples/views/lines_streams.rb +50 -0
  37. data/examples/views/lines_streams_stream.rb +51 -0
  38. data/examples/views/runner.sh +27 -0
  39. data/lib/vedeu/all.rb +6 -2
  40. data/lib/vedeu/application/controller.rb +1 -1
  41. data/lib/vedeu/boolean.rb +35 -0
  42. data/lib/vedeu/borders/border.rb +3 -3
  43. data/lib/vedeu/borders/caption.rb +1 -1
  44. data/lib/vedeu/borders/dsl.rb +1 -20
  45. data/lib/vedeu/borders/title.rb +6 -8
  46. data/lib/vedeu/buffers/buffer.rb +2 -2
  47. data/lib/vedeu/buffers/refresh.rb +1 -1
  48. data/lib/vedeu/cells/border.rb +0 -11
  49. data/lib/vedeu/cells/empty.rb +4 -4
  50. data/lib/vedeu/{geometries/alignment → coercers}/alignment.rb +50 -53
  51. data/lib/vedeu/coercers/all.rb +16 -0
  52. data/lib/vedeu/coercers/colour.rb +78 -0
  53. data/lib/vedeu/coercers/colour_attributes.rb +122 -0
  54. data/lib/vedeu/coercers/horizontal_alignment.rb +28 -0
  55. data/lib/vedeu/coercers/vertical_alignment.rb +27 -0
  56. data/lib/vedeu/colours/all.rb +1 -0
  57. data/lib/vedeu/colours/background.rb +13 -2
  58. data/lib/vedeu/colours/colour.rb +16 -31
  59. data/lib/vedeu/colours/foreground.rb +13 -2
  60. data/lib/vedeu/colours/translator.rb +21 -59
  61. data/lib/vedeu/colours/validator.rb +84 -0
  62. data/lib/vedeu/common.rb +52 -0
  63. data/lib/vedeu/configuration/api.rb +4 -10
  64. data/lib/vedeu/configuration/configuration.rb +4 -4
  65. data/lib/vedeu/cursors/coordinate.rb +1 -1
  66. data/lib/vedeu/cursors/cursor.rb +1 -1
  67. data/lib/vedeu/cursors/dsl.rb +1 -28
  68. data/lib/vedeu/dsl/all.rb +7 -7
  69. data/lib/vedeu/dsl/attributes.rb +224 -0
  70. data/lib/vedeu/dsl/border.rb +127 -0
  71. data/lib/vedeu/dsl/cursors.rb +44 -0
  72. data/lib/vedeu/dsl/dsl.rb +9 -0
  73. data/lib/vedeu/dsl/elements.rb +335 -0
  74. data/lib/vedeu/dsl/geometry.rb +113 -0
  75. data/lib/vedeu/dsl/string/align.rb +127 -0
  76. data/lib/vedeu/dsl/string/all.rb +14 -0
  77. data/lib/vedeu/dsl/string/text.rb +107 -0
  78. data/lib/vedeu/dsl/string/truncate.rb +111 -0
  79. data/lib/vedeu/{output → dsl/string}/wordwrap.rb +10 -6
  80. data/lib/vedeu/dsl/view.rb +124 -248
  81. data/lib/vedeu/dsl/views.rb +244 -0
  82. data/lib/vedeu/editor/cursor.rb +1 -1
  83. data/lib/vedeu/editor/delete.rb +3 -1
  84. data/lib/vedeu/editor/insert.rb +22 -6
  85. data/lib/vedeu/editor/line.rb +15 -9
  86. data/lib/vedeu/editor/lines.rb +27 -18
  87. data/lib/vedeu/esc/actions.rb +73 -26
  88. data/lib/vedeu/esc/all.rb +2 -0
  89. data/lib/vedeu/esc/background.rb +219 -0
  90. data/lib/vedeu/esc/borders.rb +72 -26
  91. data/lib/vedeu/esc/colours.rb +26 -27
  92. data/lib/vedeu/esc/esc.rb +4 -4
  93. data/lib/vedeu/esc/foreground.rb +219 -0
  94. data/lib/vedeu/esc/mouse.rb +16 -13
  95. data/lib/vedeu/events/aliases.rb +2 -2
  96. data/lib/vedeu/events/event.rb +1 -1
  97. data/lib/vedeu/geometries/all.rb +0 -1
  98. data/lib/vedeu/geometries/area/dimension.rb +2 -2
  99. data/lib/vedeu/geometries/dsl/dsl.rb +3 -51
  100. data/lib/vedeu/geometries/dsl/validator.rb +4 -4
  101. data/lib/vedeu/geometries/geometry.rb +10 -10
  102. data/lib/vedeu/geometries/move.rb +4 -4
  103. data/lib/vedeu/groups/dsl.rb +1 -0
  104. data/lib/vedeu/groups/group.rb +1 -1
  105. data/lib/vedeu/input/all.rb +1 -0
  106. data/lib/vedeu/input/capture.rb +14 -10
  107. data/lib/vedeu/input/dsl.rb +20 -26
  108. data/lib/vedeu/input/key.rb +0 -6
  109. data/lib/vedeu/input/keymap.rb +4 -9
  110. data/lib/vedeu/input/keys.rb +13 -0
  111. data/lib/vedeu/input/mapper.rb +29 -14
  112. data/lib/vedeu/input/read.rb +4 -2
  113. data/lib/vedeu/interfaces/dsl.rb +23 -22
  114. data/lib/vedeu/interfaces/interface.rb +2 -2
  115. data/lib/vedeu/logging/debug.rb +33 -0
  116. data/lib/vedeu/logging/log.rb +42 -33
  117. data/lib/vedeu/menus/dsl.rb +7 -18
  118. data/lib/vedeu/menus/menu.rb +1 -1
  119. data/lib/vedeu/models/focus.rb +1 -1
  120. data/lib/vedeu/models/toggleable.rb +4 -4
  121. data/lib/vedeu/null/generic.rb +2 -2
  122. data/lib/vedeu/output/all.rb +0 -2
  123. data/lib/vedeu/output/compressor_cache.rb +1 -1
  124. data/lib/vedeu/output/output.rb +5 -20
  125. data/lib/vedeu/presentation/colour.rb +39 -7
  126. data/lib/vedeu/presentation/style.rb +25 -11
  127. data/lib/vedeu/renderers/html.rb +11 -11
  128. data/lib/vedeu/repositories/assemblage.rb +9 -0
  129. data/lib/vedeu/repositories/collection.rb +1 -0
  130. data/lib/vedeu/repositories/defaults.rb +4 -1
  131. data/lib/vedeu/repositories/model.rb +7 -37
  132. data/lib/vedeu/repositories/parent.rb +6 -6
  133. data/lib/vedeu/repositories/registerable.rb +16 -2
  134. data/lib/vedeu/repositories/repositories.rb +1 -1
  135. data/lib/vedeu/repositories/repository.rb +2 -12
  136. data/lib/vedeu/runtime/flags.rb +1 -1
  137. data/lib/vedeu/terminal/terminal.rb +7 -2
  138. data/lib/vedeu/version.rb +1 -1
  139. data/lib/vedeu/views/all.rb +4 -1
  140. data/lib/vedeu/views/char.rb +5 -4
  141. data/lib/vedeu/views/chars.rb +42 -0
  142. data/lib/vedeu/views/composition.rb +15 -30
  143. data/lib/vedeu/views/default_attributes.rb +74 -0
  144. data/lib/vedeu/views/html_char.rb +2 -2
  145. data/lib/vedeu/views/line.rb +27 -53
  146. data/lib/vedeu/views/lines.rb +31 -0
  147. data/lib/vedeu/views/stream.rb +31 -78
  148. data/lib/vedeu/views/streams.rb +42 -0
  149. data/lib/vedeu/views/value.rb +150 -0
  150. data/lib/vedeu/views/view.rb +32 -36
  151. data/lib/vedeu/views/{view_collection.rb → views.rb} +2 -2
  152. data/test/lib/vedeu/application/application_controller_test.rb +5 -0
  153. data/test/lib/vedeu/application/controller_test.rb +22 -28
  154. data/test/lib/vedeu/boolean_test.rb +57 -0
  155. data/test/lib/vedeu/borders/border_test.rb +130 -36
  156. data/test/lib/vedeu/borders/dsl_test.rb +63 -10
  157. data/test/lib/vedeu/borders/title_test.rb +16 -5
  158. data/test/lib/vedeu/buffers/buffer_test.rb +26 -10
  159. data/test/lib/vedeu/buffers/empty_test.rb +1 -1
  160. data/test/lib/vedeu/cells/border_test.rb +0 -6
  161. data/test/lib/vedeu/cells/clear_test.rb +2 -0
  162. data/test/lib/vedeu/cells/empty_test.rb +12 -2
  163. data/test/lib/vedeu/cells/escape_test.rb +7 -2
  164. data/test/lib/vedeu/{geometries/alignment → coercers}/alignment_test.rb +44 -19
  165. data/test/lib/vedeu/coercers/colour_attributes_test.rb +168 -0
  166. data/test/lib/vedeu/coercers/colour_test.rb +75 -0
  167. data/test/lib/vedeu/{geometries/alignment → coercers}/horizontal_alignment_test.rb +6 -6
  168. data/test/lib/vedeu/{geometries/alignment → coercers}/vertical_alignment_test.rb +6 -6
  169. data/test/lib/vedeu/colours/background_test.rb +17 -1
  170. data/test/lib/vedeu/colours/colour_test.rb +74 -2
  171. data/test/lib/vedeu/colours/foreground_test.rb +17 -1
  172. data/test/lib/vedeu/colours/repository_test.rb +1 -1
  173. data/test/lib/vedeu/colours/translator_test.rb +8 -1
  174. data/test/lib/vedeu/colours/validator_test.rb +60 -0
  175. data/test/lib/vedeu/common_test.rb +138 -0
  176. data/test/lib/vedeu/configuration/api_test.rb +96 -51
  177. data/test/lib/vedeu/cursors/coordinate_test.rb +58 -117
  178. data/test/lib/vedeu/cursors/cursor_test.rb +46 -17
  179. data/test/lib/vedeu/cursors/dsl_test.rb +19 -5
  180. data/test/lib/vedeu/distributed/client_test.rb +8 -3
  181. data/test/lib/vedeu/distributed/server_test.rb +8 -0
  182. data/test/lib/vedeu/distributed/test_application_test.rb +62 -19
  183. data/test/lib/vedeu/distributed/uri_test.rb +4 -2
  184. data/test/lib/vedeu/dsl/attributes_test.rb +212 -0
  185. data/test/lib/vedeu/dsl/border_test.rb +51 -0
  186. data/test/lib/vedeu/dsl/{lines_test.rb → cursors_test.rb} +2 -2
  187. data/test/lib/vedeu/dsl/dsl_test.rb +44 -0
  188. data/test/lib/vedeu/dsl/elements_test.rb +118 -0
  189. data/test/lib/vedeu/dsl/geometry_test.rb +35 -0
  190. data/test/lib/vedeu/dsl/presentation_test.rb +52 -11
  191. data/test/lib/vedeu/dsl/string/align_test.rb +147 -0
  192. data/test/lib/vedeu/dsl/string/text_test.rb +213 -0
  193. data/test/lib/vedeu/dsl/string/truncate_test.rb +97 -0
  194. data/test/lib/vedeu/{output → dsl/string}/wordwrap_test.rb +3 -3
  195. data/test/lib/vedeu/dsl/view_test.rb +30 -42
  196. data/test/lib/vedeu/dsl/views_test.rb +61 -0
  197. data/test/lib/vedeu/editor/cursor_test.rb +30 -12
  198. data/test/lib/vedeu/editor/document_test.rb +18 -10
  199. data/test/lib/vedeu/editor/line_test.rb +4 -1
  200. data/test/lib/vedeu/editor/lines_test.rb +11 -3
  201. data/test/lib/vedeu/esc/actions_test.rb +42 -4
  202. data/test/lib/vedeu/esc/background_test.rb +185 -0
  203. data/test/lib/vedeu/esc/borders_test.rb +37 -9
  204. data/test/lib/vedeu/esc/colours_test.rb +0 -59
  205. data/test/lib/vedeu/esc/foreground_test.rb +185 -0
  206. data/test/lib/vedeu/esc/mouse_test.rb +9 -4
  207. data/test/lib/vedeu/geometries/area/area_test.rb +34 -11
  208. data/test/lib/vedeu/geometries/dsl/dsl_test.rb +52 -61
  209. data/test/lib/vedeu/geometries/geometry_test.rb +62 -18
  210. data/test/lib/vedeu/geometries/position_test.rb +14 -7
  211. data/test/lib/vedeu/groups/dsl_test.rb +24 -15
  212. data/test/lib/vedeu/groups/group_test.rb +18 -8
  213. data/test/lib/vedeu/input/dsl_test.rb +33 -16
  214. data/test/lib/vedeu/input/key_test.rb +8 -1
  215. data/test/lib/vedeu/input/keymap_test.rb +4 -1
  216. data/test/lib/vedeu/input/keys_test.rb +16 -0
  217. data/test/lib/vedeu/interfaces/dsl_test.rb +24 -30
  218. data/test/lib/vedeu/interfaces/interface_test.rb +79 -24
  219. data/test/lib/vedeu/logging/ips_test.rb +10 -1
  220. data/test/lib/vedeu/menus/dsl_test.rb +24 -23
  221. data/test/lib/vedeu/menus/menu_test.rb +18 -8
  222. data/test/lib/vedeu/models/page_test.rb +5 -1
  223. data/test/lib/vedeu/models/row_test.rb +4 -0
  224. data/test/lib/vedeu/models/toggleable_test.rb +10 -6
  225. data/test/lib/vedeu/null/generic_test.rb +90 -1
  226. data/test/lib/vedeu/output/viewport_test.rb +11 -10
  227. data/test/lib/vedeu/plugins/plugin_test.rb +22 -9
  228. data/test/lib/vedeu/presentation/colour_test.rb +2 -1
  229. data/test/lib/vedeu/presentation/presentation_test.rb +13 -8
  230. data/test/lib/vedeu/presentation/style_test.rb +28 -13
  231. data/test/lib/vedeu/renderers/file_test.rb +4 -2
  232. data/test/lib/vedeu/renderers/options_test.rb +1 -1
  233. data/test/lib/vedeu/repositories/assemblage_test.rb +18 -0
  234. data/test/lib/vedeu/repositories/collection_test.rb +34 -10
  235. data/test/lib/vedeu/repositories/defaults_test.rb +6 -0
  236. data/test/lib/vedeu/repositories/model_test.rb +4 -13
  237. data/test/lib/vedeu/repositories/repository_test.rb +12 -5
  238. data/test/lib/vedeu/repositories/store_test.rb +9 -0
  239. data/test/lib/vedeu/runtime/flags_test.rb +6 -4
  240. data/test/lib/vedeu/runtime/launcher_test.rb +1 -1
  241. data/test/lib/vedeu/templating/helpers_test.rb +93 -65
  242. data/test/lib/vedeu/templating/view_template_test.rb +26 -26
  243. data/test/lib/vedeu/views/char_test.rb +36 -11
  244. data/test/lib/vedeu/views/chars_test.rb +71 -0
  245. data/test/lib/vedeu/views/composition_test.rb +17 -16
  246. data/test/lib/vedeu/views/default_attributes_test.rb +97 -0
  247. data/test/lib/vedeu/views/line_test.rb +20 -75
  248. data/test/lib/vedeu/views/lines_test.rb +47 -0
  249. data/test/lib/vedeu/views/stream_test.rb +38 -63
  250. data/test/lib/vedeu/views/streams_test.rb +9 -0
  251. data/test/lib/vedeu/views/value_test.rb +112 -0
  252. data/test/lib/vedeu/views/view_test.rb +67 -45
  253. data/test/lib/vedeu/views/views_test.rb +22 -0
  254. data/test/support/examples/material_colours_app.rb +2 -2
  255. data/test/support/helpers/model_test_class.rb +1 -0
  256. data/test/test_helper.rb +3 -1
  257. data/vedeu.gemspec +2 -2
  258. metadata +124 -58
  259. data/lib/vedeu/dsl/composition.rb +0 -150
  260. data/lib/vedeu/dsl/line.rb +0 -119
  261. data/lib/vedeu/dsl/lines.rb +0 -23
  262. data/lib/vedeu/dsl/shared.rb +0 -85
  263. data/lib/vedeu/dsl/stream.rb +0 -40
  264. data/lib/vedeu/dsl/streams.rb +0 -23
  265. data/lib/vedeu/dsl/text.rb +0 -98
  266. data/lib/vedeu/geometries/alignment/all.rb +0 -11
  267. data/lib/vedeu/geometries/alignment/horizontal_alignment.rb +0 -27
  268. data/lib/vedeu/geometries/alignment/vertical_alignment.rb +0 -27
  269. data/lib/vedeu/output/text.rb +0 -275
  270. data/test/lib/vedeu/dsl/composition_test.rb +0 -67
  271. data/test/lib/vedeu/dsl/line_test.rb +0 -85
  272. data/test/lib/vedeu/dsl/shared_test.rb +0 -66
  273. data/test/lib/vedeu/dsl/stream_test.rb +0 -30
  274. data/test/lib/vedeu/dsl/streams_test.rb +0 -13
  275. data/test/lib/vedeu/dsl/text_test.rb +0 -122
  276. data/test/lib/vedeu/output/text_test.rb +0 -156
  277. data/test/lib/vedeu/views/view_collection_test.rb +0 -13
@@ -8,6 +8,37 @@ module Vedeu
8
8
  #
9
9
  class Lines < Vedeu::Repositories::Collection
10
10
 
11
+ # @param (see Vedeu::Repositories::Collection#initialize)
12
+ # @raise [Vedeu::Error::InvalidSyntax] When the collection
13
+ # cannot be coerced since it is unrecognised or unsupported.
14
+ # @return [Vedeu::Views::Lines]
15
+ def self.coerce(collection = [], parent = nil, name = nil)
16
+ if collection.is_a?(Vedeu::Views::Lines)
17
+ collection
18
+
19
+ elsif collection.is_a?(Array)
20
+ return new(collection, parent, name) if collection.empty?
21
+
22
+ coerced_collection = []
23
+ collection.each do |element|
24
+ coerced_collection << element if element.is_a?(Vedeu::Views::Line)
25
+ end
26
+
27
+ new(coerced_collection, parent, name)
28
+
29
+ elsif collection.is_a?(Vedeu::Views::Line)
30
+ new([collection], parent, name)
31
+
32
+ else
33
+ fail Vedeu::Error::InvalidSyntax,
34
+ 'Cannot coerce for Vedeu::View::Lines, as collection ' \
35
+ 'unrecognised.'.freeze
36
+
37
+ end
38
+ end
39
+
40
+ alias_method :lines, :value
41
+
11
42
  end # Lines
12
43
 
13
44
  end # Views
@@ -1,3 +1,5 @@
1
+ require 'vedeu/dsl/all'
2
+
1
3
  module Vedeu
2
4
 
3
5
  module Views
@@ -8,30 +10,50 @@ module Vedeu
8
10
  #
9
11
  class Stream
10
12
 
13
+ # Provides DSL methods for Vedeu::Views::Stream objects.
14
+ #
15
+ # @api public
16
+ #
17
+ class DSL
18
+
19
+ include Vedeu::DSL
20
+ include Vedeu::DSL::Elements
21
+
22
+ end # DSL
23
+
24
+ extend Forwardable
25
+ include Vedeu::Views::DefaultAttributes
11
26
  include Vedeu::Repositories::Model
12
27
  include Vedeu::Repositories::Parent
13
28
  include Vedeu::Presentation
14
29
 
30
+ include Vedeu::Views::Value
15
31
  collection Vedeu::Views::Chars
16
- member Vedeu::Views::Char
32
+ deputy Vedeu::Views::Stream::DSL
33
+ entity Vedeu::Views::Char
34
+ parent Vedeu::Views::Streams
17
35
 
18
- # @!attribute [rw] parent
19
- # @return [Vedeu::Views::Line]
20
- attr_accessor :parent
36
+ def_delegators :value,
37
+ :chars,
38
+ :size
21
39
 
22
- # @!attribute [rw] value
23
- # @return [String]
24
- attr_accessor :value
25
40
  alias_method :content, :value
26
41
  alias_method :text, :value
42
+ alias_method :chars=, :value=
43
+ alias_method :chars?, :value?
44
+
45
+ # @!attribute [w] value
46
+ # @return [String]
47
+ attr_writer :value
27
48
 
28
49
  # Returns a new instance of Vedeu::Views::Stream.
29
50
  #
30
51
  # @param attributes [Hash]
31
52
  # @option attributes client [void]
32
53
  # @option attributes colour [Vedeu::Colours::Colour]
33
- # @option attributes style [Vedeu::Presentation::Style]
54
+ # @option attributes name [String|Symbol]
34
55
  # @option attributes parent [Vedeu::Views::Line]
56
+ # @option attributes style [Vedeu::Presentation::Style]
35
57
  # @option attributes value [String]
36
58
  # @return [Vedeu::Views::Stream]
37
59
  def initialize(attributes = {})
@@ -47,84 +69,15 @@ module Vedeu
47
69
  end
48
70
  alias_method :<<, :add
49
71
 
50
- # @return [Hash<Symbol => void>]
51
- def attributes
52
- {
53
- client: @client,
54
- colour: colour,
55
- name: name,
56
- parent: parent,
57
- style: style,
58
- value: value,
59
- }
60
- end
61
-
62
- # Returns an array of characters, each element is the escape
63
- # sequences of colours and styles for this stream, the character
64
- # itself, and the escape sequences of colours and styles for the
65
- # parent of the stream ({Vedeu::Views::Line}).
66
- #
67
- # @return [Array]
68
- def chars
69
- return [] if value.empty?
70
-
71
- @chars ||= value.chars.map do |char|
72
- member.new(value: char,
73
- name: name,
74
- parent: parent,
75
- colour: colour,
76
- style: style,
77
- position: nil)
78
- end
79
- end
80
-
81
- # Returns a DSL instance responsible for defining the DSL
82
- # methods of this model.
83
- #
84
- # @param client [Object|NilClass] The client binding represents
85
- # the client application object that is currently invoking a
86
- # DSL method. It is required so that we can send messages to
87
- # the client application object should we need to.
88
- # @return [Vedeu::DSL::Stream] The DSL instance for this model.
89
- def deputy(client = nil)
90
- Vedeu::DSL::Stream.new(self, client)
91
- end
92
-
93
72
  # An object is equal when its values are the same.
94
73
  #
95
74
  # @param other [Vedeu::Views::Char]
96
75
  # @return [Boolean]
97
76
  def eql?(other)
98
- self.class == other.class && value == other.value &&
99
- colour == other.colour && style == other.style &&
100
- parent == other.parent
77
+ self.class == other.class && value == other.value
101
78
  end
102
79
  alias_method :==, :eql?
103
80
 
104
- # Returns the size of the content in characters without
105
- # formatting.
106
- #
107
- # @return [Fixnum]
108
- def size
109
- value.size
110
- end
111
-
112
- private
113
-
114
- # The default values for a new instance of this class.
115
- #
116
- # @return [Hash]
117
- def defaults
118
- {
119
- client: nil,
120
- colour: nil,
121
- name: nil,
122
- parent: nil,
123
- style: nil,
124
- value: '',
125
- }
126
- end
127
-
128
81
  end # Stream
129
82
 
130
83
  end # Views
@@ -8,6 +8,48 @@ module Vedeu
8
8
  #
9
9
  class Streams < Vedeu::Repositories::Collection
10
10
 
11
+ # @param (see Vedeu::Repositories::Collection#initialize)
12
+ # @raise [Vedeu::Error::InvalidSyntax] When the collection
13
+ # cannot be coerced since it is unrecognised or unsupported.
14
+ # @return [Vedeu::Views::Streams]
15
+ def self.coerce(collection = [], parent = nil, name = nil)
16
+ if collection.is_a?(Vedeu::Views::Streams)
17
+ collection
18
+
19
+ elsif collection.is_a?(Array)
20
+ return new(collection, parent, name) if collection.empty?
21
+
22
+ coerced_collection = []
23
+ collection.each do |element|
24
+ if element.is_a?(Vedeu::Views::Stream)
25
+ coerced_collection << element
26
+
27
+ elsif element.is_a?(String)
28
+ coerced_collection << Vedeu::Views::Stream.new(value: element)
29
+
30
+ end
31
+ end
32
+
33
+ new(coerced_collection, parent, name)
34
+
35
+ elsif collection.is_a?(Vedeu::Views::Stream)
36
+ new([collection], parent, name)
37
+
38
+ elsif collection.is_a?(String)
39
+ return new([], parent, name) if collection.empty?
40
+
41
+ new([Vedeu::Views::Stream.new(value: collection)], parent, name)
42
+
43
+ else
44
+ fail Vedeu::Error::InvalidSyntax,
45
+ 'Cannot coerce for Vedeu::View::Streams, as collection ' \
46
+ 'unrecognised.'.freeze
47
+
48
+ end
49
+ end
50
+
51
+ alias_method :streams, :value
52
+
11
53
  end # Streams
12
54
 
13
55
  end # Views
@@ -0,0 +1,150 @@
1
+ module Vedeu
2
+
3
+ module Views
4
+
5
+ # Provides view model methods for Vedeu::Views.
6
+ #
7
+ # @api private
8
+ #
9
+ module Value
10
+
11
+ # Provides view model class methods for Vedeu::Views.
12
+ #
13
+ # @api private
14
+ #
15
+ module ClassMethods
16
+
17
+ # @!attribute [w] collection_klass
18
+ # @return [void]
19
+ attr_reader :collection_klass
20
+
21
+ # @!attribute [w] deputy_klass
22
+ # @return [void]
23
+ attr_reader :deputy_klass
24
+
25
+ # @!attribute [w] entity_klass
26
+ # @return [void]
27
+ attr_reader :entity_klass
28
+
29
+ # @!attribute [w] parent_klass
30
+ # @return [void]
31
+ attr_reader :parent_klass
32
+
33
+ # @param model [void]
34
+ # @return [void]
35
+ def collection(model)
36
+ @collection_klass = model
37
+ end
38
+
39
+ # @param model [void]
40
+ # @return [void]
41
+ def deputy(model)
42
+ @deputy_klass = model
43
+ end
44
+
45
+ # @param model [void]
46
+ # @return [void]
47
+ def entity(model)
48
+ @entity_klass = model
49
+ end
50
+
51
+ # @param model [void]
52
+ # @return [void]
53
+ def parent(model)
54
+ @parent_klass = model
55
+ end
56
+
57
+ end # ClassMethods
58
+
59
+ # Provides view model instance methods for Vedeu::Views.
60
+ #
61
+ # @api private
62
+ #
63
+ module InstanceMethods
64
+
65
+ include Vedeu::Common
66
+
67
+ # The client binding represents the client application object
68
+ # that is currently invoking a DSL method. It is required so
69
+ # that we can send messages to the client application object
70
+ # should we need to.
71
+ #
72
+ # @!attribute [rw] client
73
+ # @return [void]
74
+ attr_accessor :client
75
+
76
+ # @!attribute [rw] parent
77
+ # @return [void]
78
+ attr_accessor :parent
79
+
80
+ # @return [Boolean]
81
+ def client?
82
+ present?(client)
83
+ end
84
+
85
+ # @return [void]
86
+ def collection
87
+ self.class.collection_klass
88
+ end
89
+
90
+ # Returns a DSL instance responsible for defining the DSL
91
+ # methods of this model.
92
+ #
93
+ # @return [void]
94
+ def deputy
95
+ self.class.deputy_klass.new(self, client)
96
+ end
97
+
98
+ # @return [void]
99
+ def entity
100
+ self.class.entity_klass
101
+ end
102
+
103
+ # @return [Boolean]
104
+ def parent?
105
+ present?(parent)
106
+ end
107
+
108
+ # @return [void]
109
+ def value
110
+ @_value ||= if present?(@value)
111
+ collection.coerce(@value, self)
112
+
113
+ else
114
+ collection.coerce([], self)
115
+
116
+ end
117
+ end
118
+
119
+ # @param value [void]
120
+ # @return [void]
121
+ def value=(value)
122
+ @_value = @value = collection.coerce(value, self)
123
+ end
124
+
125
+ # Returns a boolean indicating whether this model has a
126
+ # non-empty value.
127
+ #
128
+ # @return [Boolean]
129
+ def value?
130
+ value.any?
131
+ end
132
+
133
+ end # InstanceMethods
134
+
135
+ # When this module is included in a class, provide ClassMethods
136
+ # as class methods and InstanceMethods as instance methods for
137
+ # the given class.
138
+ #
139
+ # @param klass [Class]
140
+ # @return [void]
141
+ def self.included(klass)
142
+ klass.extend(Vedeu::Views::Value::ClassMethods)
143
+ klass.include(Vedeu::Views::Value::InstanceMethods)
144
+ end
145
+
146
+ end # Value
147
+
148
+ end # Views
149
+
150
+ end # Vedeu
@@ -1,3 +1,5 @@
1
+ require 'vedeu/dsl/all'
2
+
1
3
  module Vedeu
2
4
 
3
5
  module Views
@@ -7,16 +9,36 @@ module Vedeu
7
9
  #
8
10
  class View
9
11
 
12
+ # Provides DSL methods for Vedeu::Views::View objects.
13
+ #
14
+ # @api public
15
+ #
16
+ class DSL
17
+
18
+ include Vedeu::DSL
19
+ include Vedeu::DSL::Border
20
+ include Vedeu::DSL::Cursors
21
+ include Vedeu::DSL::Elements
22
+ include Vedeu::DSL::Geometry
23
+ include Vedeu::DSL::Use
24
+
25
+ end # DSL
26
+
27
+ extend Forwardable
10
28
  include Vedeu::Repositories::Model
11
29
  include Vedeu::Repositories::Parent
12
30
  include Vedeu::Presentation
31
+ include Vedeu::Views::Value
13
32
 
14
33
  collection Vedeu::Views::Lines
15
- member Vedeu::Views::Line
34
+ deputy Vedeu::Views::View::DSL
35
+ entity Vedeu::Views::Line
16
36
 
17
- # @!attribute [rw] client
18
- # @return [Fixnum|Float]
19
- attr_accessor :client
37
+ def_delegators :value,
38
+ :lines
39
+
40
+ alias_method :lines=, :value=
41
+ alias_method :lines?, :value?
20
42
 
21
43
  # @!attribute [rw] cursor_visible
22
44
  # @return [Boolean]
@@ -24,17 +46,9 @@ module Vedeu
24
46
  alias_method :cursor_visible?, :cursor_visible
25
47
 
26
48
  # @!attribute [rw] name
27
- # @return [String]
49
+ # @return [String|Symbol]
28
50
  attr_accessor :name
29
51
 
30
- # @!attribute [rw] parent
31
- # @return [Vedeu::Views::Composition]
32
- attr_accessor :parent
33
-
34
- # @!attribute [w] lines
35
- # @return [Array<Vedeu::Views::Line>]
36
- attr_writer :lines
37
-
38
52
  # @!attribute [rw] zindex
39
53
  # @return [Fixnum]
40
54
  attr_accessor :zindex
@@ -60,14 +74,14 @@ module Vedeu
60
74
  # @param child [Vedeu::Views::Line]
61
75
  # @return [Vedeu::Views::Lines]
62
76
  def add(child)
63
- @value = value.add(child)
77
+ @_value = value.add(child)
64
78
  end
65
79
  alias_method :<<, :add
66
80
 
67
81
  # @return [Hash]
68
82
  def attributes
69
83
  {
70
- client: @client,
84
+ client: client,
71
85
  colour: colour,
72
86
  cursor_visible: cursor_visible,
73
87
  name: name,
@@ -78,26 +92,8 @@ module Vedeu
78
92
  }
79
93
  end
80
94
 
81
- # Returns a DSL instance responsible for defining the DSL
82
- # methods of this model.
83
- #
84
- # @param client [Object|NilClass] The client binding represents
85
- # the client application object that is currently invoking a
86
- # DSL method. It is required so that we can send messages to
87
- # the client application object should we need to.
88
- # @return [Vedeu::DSL::View] The DSL instance for this model.
89
- def deputy(client = nil)
90
- Vedeu::DSL::View.new(self, client)
91
- end
92
-
93
- # @return [Vedeu::Views::Lines]
94
- def value
95
- collection.coerce(@value, self)
96
- end
97
- alias_method :lines, :value
98
-
99
95
  # Store the view and immediately refresh it; causing to be
100
- # pushed to the Terminal. Called by {Vedeu::DSL::View.renders}.
96
+ # pushed to the Terminal. Called by {Vedeu::DSL::Views.renders}.
101
97
  #
102
98
  # @return [Vedeu::Views::View]
103
99
  def store_immediate
@@ -110,7 +106,7 @@ module Vedeu
110
106
 
111
107
  # When a name is given, the view is stored with this name. This
112
108
  # view will be shown next time a refresh event is triggered with
113
- # this name. Called by {Vedeu::DSL::View.views}.
109
+ # this name. Called by {Vedeu::DSL::Views.views}.
114
110
  #
115
111
  # @raise [Vedeu::Error::InvalidSyntax] The name is not defined.
116
112
  # @return [Vedeu::Views::View]
@@ -146,7 +142,7 @@ module Vedeu
146
142
  client: nil,
147
143
  colour: Vedeu::Configuration.colour,
148
144
  cursor_visible: true,
149
- name: '',
145
+ name: ''.freeze,
150
146
  parent: nil,
151
147
  style: :normal,
152
148
  value: [],