vedeu 0.6.4 → 0.6.5

Sign up to get free protection for your applications and to get access to all the features.
Files changed (118) hide show
  1. checksums.yaml +4 -4
  2. data/.codeclimate.yml +40 -0
  3. data/README.md +1 -0
  4. data/docs/dsl.md +24 -24
  5. data/lib/vedeu/all.rb +21 -44
  6. data/lib/vedeu/api.rb +13 -13
  7. data/lib/vedeu/application/application_controller.rb +2 -0
  8. data/lib/vedeu/bindings/movement.rb +53 -18
  9. data/lib/vedeu/bindings/refresh.rb +1 -1
  10. data/lib/vedeu/bindings/system.rb +2 -2
  11. data/lib/vedeu/bindings/visibility.rb +3 -3
  12. data/lib/vedeu/borders/all.rb +13 -0
  13. data/lib/vedeu/borders/border.rb +209 -202
  14. data/lib/vedeu/{dsl/border.rb → borders/dsl.rb} +15 -15
  15. data/lib/vedeu/{null/border.rb → borders/null.rb} +9 -9
  16. data/lib/vedeu/borders/render.rb +347 -0
  17. data/lib/vedeu/borders/repository.rb +19 -0
  18. data/lib/vedeu/buffers/all.rb +13 -0
  19. data/lib/vedeu/buffers/buffer.rb +182 -176
  20. data/lib/vedeu/{null/buffer.rb → buffers/null.rb} +8 -8
  21. data/lib/vedeu/buffers/repository.rb +24 -0
  22. data/lib/vedeu/buffers/virtual_buffer.rb +2 -2
  23. data/lib/vedeu/cursors/all.rb +11 -0
  24. data/lib/vedeu/cursors/cursor.rb +276 -0
  25. data/lib/vedeu/cursors/refresh.rb +84 -0
  26. data/lib/vedeu/cursors/repository.rb +34 -0
  27. data/lib/vedeu/dsl/interface.rb +9 -9
  28. data/lib/vedeu/dsl/shared.rb +11 -11
  29. data/lib/vedeu/{exceptions.rb → error.rb} +2 -2
  30. data/lib/vedeu/esc/esc.rb +1 -1
  31. data/lib/vedeu/geometry/all.rb +18 -0
  32. data/lib/vedeu/geometry/area.rb +170 -160
  33. data/lib/vedeu/geometry/coordinate.rb +61 -39
  34. data/lib/vedeu/geometry/dimension.rb +139 -132
  35. data/lib/vedeu/{dsl/geometry.rb → geometry/dsl.rb} +11 -11
  36. data/lib/vedeu/geometry/generic_coordinate.rb +159 -153
  37. data/lib/vedeu/geometry/geometry.rb +310 -212
  38. data/lib/vedeu/geometry/grid.rb +73 -69
  39. data/lib/vedeu/{null/geometry.rb → geometry/null.rb} +10 -10
  40. data/lib/vedeu/geometry/position.rb +124 -120
  41. data/lib/vedeu/geometry/repository.rb +19 -0
  42. data/lib/vedeu/input/editor/document.rb +2 -2
  43. data/lib/vedeu/internal_api.rb +8 -8
  44. data/lib/vedeu/models/escape.rb +2 -2
  45. data/lib/vedeu/models/interface.rb +1 -1
  46. data/lib/vedeu/models/page.rb +89 -0
  47. data/lib/vedeu/models/row.rb +66 -0
  48. data/lib/vedeu/models/toggleable.rb +1 -1
  49. data/lib/vedeu/models/views/char.rb +7 -6
  50. data/lib/vedeu/models/views/line.rb +1 -1
  51. data/lib/vedeu/models/views/view.rb +2 -2
  52. data/lib/vedeu/options.rb +19 -0
  53. data/lib/vedeu/output/clear/named_interface.rb +1 -1
  54. data/lib/vedeu/output/direct.rb +1 -1
  55. data/lib/vedeu/output/presentation.rb +2 -1
  56. data/lib/vedeu/output/viewport.rb +3 -3
  57. data/lib/vedeu/repositories/model.rb +9 -1
  58. data/lib/vedeu/repositories/repository.rb +5 -0
  59. data/lib/vedeu/terminal/terminal.rb +3 -3
  60. data/lib/vedeu/version.rb +1 -1
  61. data/test/lib/vedeu/borders/border_test.rb +299 -291
  62. data/test/lib/vedeu/{dsl/border_test.rb → borders/dsl_test.rb} +6 -6
  63. data/test/lib/vedeu/{null/border_test.rb → borders/null_test.rb} +6 -6
  64. data/test/lib/vedeu/borders/render_test.rb +125 -0
  65. data/test/lib/vedeu/borders/repository_test.rb +17 -0
  66. data/test/lib/vedeu/buffers/buffer_test.rb +116 -112
  67. data/test/lib/vedeu/{null/buffer_test.rb → buffers/null_test.rb} +5 -5
  68. data/test/lib/vedeu/buffers/repository_test.rb +18 -0
  69. data/test/lib/vedeu/cursors/cursor_test.rb +370 -0
  70. data/test/lib/vedeu/cursors/refresh_test.rb +69 -0
  71. data/test/lib/vedeu/cursors/repository_test.rb +41 -0
  72. data/test/lib/vedeu/dsl/interface_test.rb +5 -5
  73. data/test/lib/vedeu/{exceptions_test.rb → error_test.rb} +0 -0
  74. data/test/lib/vedeu/geometry/area_test.rb +141 -137
  75. data/test/lib/vedeu/geometry/coordinate_test.rb +93 -89
  76. data/test/lib/vedeu/geometry/dimension_test.rb +137 -133
  77. data/test/lib/vedeu/{dsl/geometry_test.rb → geometry/dsl_test.rb} +17 -17
  78. data/test/lib/vedeu/geometry/generic_coordinate_test.rb +32 -28
  79. data/test/lib/vedeu/geometry/geometry_test.rb +282 -157
  80. data/test/lib/vedeu/geometry/grid_test.rb +35 -31
  81. data/test/lib/vedeu/{null/geometry_test.rb → geometry/null_test.rb} +5 -5
  82. data/test/lib/vedeu/geometry/position_test.rb +146 -142
  83. data/test/lib/vedeu/geometry/repository_test.rb +19 -0
  84. data/test/lib/vedeu/input/editor/document_test.rb +1 -1
  85. data/test/lib/vedeu/models/escape_test.rb +1 -1
  86. data/test/lib/vedeu/models/interface_test.rb +2 -2
  87. data/test/lib/vedeu/models/page_test.rb +235 -0
  88. data/test/lib/vedeu/models/row_test.rb +111 -0
  89. data/test/lib/vedeu/models/views/char_test.rb +3 -3
  90. data/test/lib/vedeu/options_test.rb +57 -0
  91. data/test/lib/vedeu/output/clear/named_interface_test.rb +1 -1
  92. data/test/lib/vedeu/output/renderers/json_test.rb +1 -1
  93. data/test/lib/vedeu/output/viewport_test.rb +15 -9
  94. data/test/lib/vedeu/refresh/refresh_buffer_test.rb +12 -12
  95. data/test/lib/vedeu/repositories/repositories_test.rb +1 -1
  96. data/test/lib/vedeu/repositories/repository_test.rb +7 -0
  97. data/test/lib/vedeu/terminal/terminal_test.rb +1 -1
  98. data/test/test_helper.rb +1 -1
  99. data/vedeu.gemspec +2 -2
  100. metadata +57 -63
  101. data/lib/vedeu/borders/borders.rb +0 -15
  102. data/lib/vedeu/borders/render_border.rb +0 -331
  103. data/lib/vedeu/buffers/buffers.rb +0 -20
  104. data/lib/vedeu/cursor/cursor.rb +0 -174
  105. data/lib/vedeu/cursor/cursors.rb +0 -30
  106. data/lib/vedeu/cursor/move.rb +0 -239
  107. data/lib/vedeu/cursor/reposition.rb +0 -78
  108. data/lib/vedeu/geometry/geometries.rb +0 -15
  109. data/lib/vedeu/refresh/refresh_cursor.rb +0 -92
  110. data/test/lib/vedeu/borders/borders_test.rb +0 -13
  111. data/test/lib/vedeu/borders/render_border_test.rb +0 -121
  112. data/test/lib/vedeu/buffers/buffers_test.rb +0 -14
  113. data/test/lib/vedeu/cursor/cursor_test.rb +0 -246
  114. data/test/lib/vedeu/cursor/cursors_test.rb +0 -37
  115. data/test/lib/vedeu/cursor/move_test.rb +0 -301
  116. data/test/lib/vedeu/cursor/reposition_test.rb +0 -63
  117. data/test/lib/vedeu/geometry/geometries_test.rb +0 -15
  118. data/test/lib/vedeu/refresh/refresh_cursor_test.rb +0 -65
@@ -1,6 +1,6 @@
1
1
  module Vedeu
2
2
 
3
- module DSL
3
+ module Borders
4
4
 
5
5
  # Borders are defined by name for each of the client application's
6
6
  # interfaces or views. They can be enabled or disabled (which controls
@@ -26,7 +26,7 @@ module Vedeu
26
26
  # # ...
27
27
  # end
28
28
  #
29
- class Border
29
+ class DSL
30
30
 
31
31
  include Vedeu::DSL
32
32
  include Vedeu::DSL::Presentation
@@ -43,18 +43,18 @@ module Vedeu
43
43
  # @param block [Proc]
44
44
  # @raise [Vedeu::Error::InvalidSyntax]
45
45
  # The required block was not given.
46
- # @return [Vedeu::Border]
46
+ # @return [Vedeu::Borders::Border]
47
47
  def self.border(name, &block)
48
48
  fail Vedeu::Error::InvalidSyntax, 'block not given' unless block_given?
49
49
 
50
- Vedeu::Border.build(enabled: true, name: name, &block).store
50
+ Vedeu::Borders::Border.build(enabled: true, name: name, &block).store
51
51
  end
52
52
 
53
- # Returns an instance of DSL::Border.
53
+ # Returns an instance of Borders::DSL.
54
54
  #
55
- # @param model [Border]
55
+ # @param model [Vedeu::Borders::Border]
56
56
  # @param client [Object]
57
- # @return [Vedeu::DSL::Border]
57
+ # @return [Vedeu::Borders::DSL]
58
58
  def initialize(model, client = nil)
59
59
  @model = model
60
60
  @client = client
@@ -169,14 +169,14 @@ module Vedeu
169
169
 
170
170
  # Disable the bottom border.
171
171
  #
172
- # @see Vedeu::DSL::Border#bottom
172
+ # @see Vedeu::Borders::DSL#bottom
173
173
  def hide_bottom!
174
174
  bottom(false)
175
175
  end
176
176
 
177
177
  # Enable the bottom border.
178
178
  #
179
- # @see Vedeu::DSL::Border#bottom
179
+ # @see Vedeu::Borders::DSL#bottom
180
180
  def show_bottom!
181
181
  bottom(true)
182
182
  end
@@ -204,14 +204,14 @@ module Vedeu
204
204
 
205
205
  # Disable the left border.
206
206
  #
207
- # @see Vedeu::DSL::Border#left
207
+ # @see Vedeu::Borders::DSL#left
208
208
  def hide_left!
209
209
  left(false)
210
210
  end
211
211
 
212
212
  # Enable the left border.
213
213
  #
214
- # @see Vedeu::DSL::Border#left
214
+ # @see Vedeu::Borders::DSL#left
215
215
  def show_left!
216
216
  left(true)
217
217
  end
@@ -239,14 +239,14 @@ module Vedeu
239
239
 
240
240
  # Disable the right border.
241
241
  #
242
- # @see Vedeu::DSL::Border#right
242
+ # @see Vedeu::Borders::DSL#right
243
243
  def hide_right!
244
244
  right(false)
245
245
  end
246
246
 
247
247
  # Enable the right border.
248
248
  #
249
- # @see Vedeu::DSL::Border#right
249
+ # @see Vedeu::Borders::DSL#right
250
250
  def show_right!
251
251
  right(true)
252
252
  end
@@ -310,14 +310,14 @@ module Vedeu
310
310
 
311
311
  # Disable the top border.
312
312
  #
313
- # @see Vedeu::DSL::Border#top
313
+ # @see Vedeu::Borders::DSL#top
314
314
  def hide_top!
315
315
  top(false)
316
316
  end
317
317
 
318
318
  # Enable the top border.
319
319
  #
320
- # @see Vedeu::DSL::Border#top
320
+ # @see Vedeu::Borders::DSL#top
321
321
  def show_top!
322
322
  top(true)
323
323
  end
@@ -1,21 +1,21 @@
1
1
  module Vedeu
2
2
 
3
- module Null
3
+ module Borders
4
4
 
5
- # Provides a non-existent Vedeu::Border that acts like the real thing, but
6
- # does nothing.
5
+ # Provides a non-existent Vedeu::Borders::Border that acts like the real
6
+ # thing, but does nothing.
7
7
  #
8
- class Border
8
+ class Null
9
9
 
10
10
  # @!attribute [r] name
11
11
  # @return [String|NilClass]
12
12
  attr_reader :name
13
13
 
14
- # Returns a new instance of Vedeu::Null::Border.
14
+ # Returns a new instance of Vedeu::Borders::Null.
15
15
  #
16
16
  # @param attributes [Hash<Symbol => void>]
17
17
  # @option attributes name [String|NilClass]
18
- # @return [Vedeu::Null::Border]
18
+ # @return [Vedeu::Borders::Null]
19
19
  def initialize(attributes = {})
20
20
  @attributes = attributes
21
21
  @name = @attributes[:name]
@@ -77,13 +77,13 @@ module Vedeu
77
77
 
78
78
  # Returns the geometry for the interface.
79
79
  #
80
- # @return (see Vedeu::Geometries#by_name)
80
+ # @return (see Vedeu::Geometry::Repository#by_name)
81
81
  def geometry
82
82
  @geometry ||= Vedeu.geometries.by_name(name)
83
83
  end
84
84
 
85
- end # Border
85
+ end # Null
86
86
 
87
- end # Null
87
+ end # Borders
88
88
 
89
89
  end # Vedeu
@@ -0,0 +1,347 @@
1
+ module Vedeu
2
+
3
+ module Borders
4
+
5
+ # Renders the provided border.
6
+ #
7
+ class Render
8
+
9
+ extend Forwardable
10
+ include Vedeu::Common
11
+
12
+ def_delegators :border,
13
+ :bottom?,
14
+ :bottom_left,
15
+ :bottom_right,
16
+ :bx,
17
+ :bxn,
18
+ :by,
19
+ :byn,
20
+ :caption,
21
+ :colour,
22
+ :enabled?,
23
+ :height,
24
+ :horizontal,
25
+ :left?,
26
+ :name,
27
+ :right?,
28
+ :style,
29
+ :title,
30
+ :top?,
31
+ :top_left,
32
+ :top_right,
33
+ :width,
34
+ :vertical
35
+
36
+ def_delegators :geometry,
37
+ :x,
38
+ :xn,
39
+ :y,
40
+ :yn
41
+
42
+ # @return [Array<Array<Vedeu::Views::Char>>]
43
+ # @see Vedeu::Borders::Render#initialize
44
+ def self.with(border)
45
+ new(border).render
46
+ end
47
+
48
+ # Returns a new instance of Vedeu::Borders::Render.
49
+ #
50
+ # @param border [Vedeu::Borders::Border]
51
+ # @return [Vedeu::Borders::Render]
52
+ def initialize(border)
53
+ @border = border
54
+ end
55
+
56
+ # @return [Array<Array<Vedeu::Views::Char>>]
57
+ def render
58
+ return [] unless enabled?
59
+
60
+ Vedeu.timer("Bordering: '#{name}'") do
61
+ out = [top, bottom]
62
+
63
+ height.times { |y| out << [left(y), right(y)] }
64
+
65
+ out.flatten
66
+ end
67
+ end
68
+
69
+ protected
70
+
71
+ # @!attribute [r] border
72
+ # @return [Vedeu::Borders::Border]
73
+ attr_reader :border
74
+
75
+ private
76
+
77
+ # @param value [String]
78
+ # @param type [Symbol|NilClass]
79
+ # @param iy [Fixnum]
80
+ # @param ix [Fixnum]
81
+ # @return [Vedeu::Views::Char]
82
+ def build(value, type = :border, iy = 0, ix = 0)
83
+ Vedeu::Views::Char.new(value: value,
84
+ parent: interface,
85
+ colour: colour,
86
+ style: style,
87
+ position: [iy, ix],
88
+ border: type)
89
+ end
90
+
91
+ # Creates the bottom left border character.
92
+ #
93
+ # @return [Vedeu::Views::Char]
94
+ def build_bottom_left
95
+ build(bottom_left, :bottom_left, yn, x) if left?
96
+ end
97
+
98
+ # Creates the bottom right border character.
99
+ #
100
+ # @return [Vedeu::Views::Char]
101
+ def build_bottom_right
102
+ build(bottom_right, :bottom_right, yn, xn) if right?
103
+ end
104
+
105
+ # Creates a top border character.
106
+ #
107
+ # @return [Array<Vedeu::Views::Char>]
108
+ def build_top
109
+ build_horizontal(:bottom_horizontal, y)
110
+ end
111
+
112
+ # Creates a bottom border character.
113
+ #
114
+ # @return [Array<Vedeu::Views::Char>]
115
+ def build_bottom
116
+ build_horizontal(:bottom_horizontal, yn)
117
+ end
118
+
119
+ # Creates the top left border character.
120
+ #
121
+ # @return [Vedeu::Views::Char]
122
+ def build_top_left
123
+ build(top_left, :top_left, y, x) if left?
124
+ end
125
+
126
+ # Creates the top right border character.
127
+ #
128
+ # @return [Vedeu::Views::Char]
129
+ def build_top_right
130
+ build(top_right, :top_right, y, xn) if right?
131
+ end
132
+
133
+ # Renders the bottom border for the interface.
134
+ #
135
+ # @note
136
+ # If a caption has been specified, then the bottom border will include
137
+ # this caption unless the size of the interface is smaller than the
138
+ # padded caption length.
139
+ #
140
+ # @return [String]
141
+ def bottom
142
+ return [] unless bottom?
143
+
144
+ [build_bottom_left, captionbar, build_bottom_right].compact
145
+ end
146
+
147
+ # @return [Vedeu::Geometry::Geometry]
148
+ def geometry
149
+ Vedeu.geometries.by_name(name)
150
+ end
151
+
152
+ # @param position [Symbol] Either :top_horizontal, or :bottom_horizontal.
153
+ # @param y_coordinate [Fixnum] The value of either y or yn.
154
+ # @return [Array<Vedeu::Views::Char>]
155
+ def build_horizontal(position, y_coordinate)
156
+ Array.new(width) do |ix|
157
+ build(horizontal, position, y_coordinate, (bx + ix))
158
+ end
159
+ end
160
+
161
+ # The parent of a border is always an interface.
162
+ #
163
+ # @return [Vedeu::Interface]
164
+ def interface
165
+ @interface ||= Vedeu.interfaces.by_name(name)
166
+ end
167
+ alias_method :parent, :interface
168
+
169
+ # Renders the left border for the interface.
170
+ #
171
+ # @param iy [Fixnum]
172
+ # @return [String]
173
+ def left(iy = 0)
174
+ return [] unless left?
175
+
176
+ build(vertical, :left_vertical, (by + iy), x)
177
+ end
178
+
179
+ # Renders the right border for the interface.
180
+ #
181
+ # @param iy [Fixnum]
182
+ # @return [String]
183
+ def right(iy = 0)
184
+ return [] unless right?
185
+
186
+ build(vertical, :right_vertical, (by + iy), xn)
187
+ end
188
+
189
+ # Renders the top border for the interface.
190
+ #
191
+ # @note
192
+ # If a title has been specified, then the top border will include this
193
+ # title unless the size of the interface is smaller than the padded
194
+ # title length.
195
+ #
196
+ # @return [String]
197
+ def top
198
+ return [] unless top?
199
+
200
+ [build_top_left, titlebar, build_top_right].compact
201
+ end
202
+
203
+ # Overwrite the border from {#build_horizontal} on the bottom border to
204
+ # include the caption if given.
205
+ #
206
+ # @return [Array<Vedeu::Views::Char>]
207
+ def captionbar
208
+ return build_bottom unless caption? && caption_fits?
209
+
210
+ caption_starts_at = (width - caption_characters.size) - 2
211
+
212
+ caption_char = 0
213
+ build_bottom.each_with_index do |char, index|
214
+ next if index <= caption_starts_at || index > (width - 2)
215
+
216
+ char.border = nil
217
+ char.value = caption_characters[caption_char]
218
+ caption_char += 1
219
+ end
220
+ end
221
+
222
+ # Overwrite the border from {#build_horizontal} on the top border to
223
+ # include the title if given.
224
+ #
225
+ # @return [Array<Vedeu::Views::Char>]
226
+ def titlebar
227
+ return build_top unless title? && title_fits?
228
+
229
+ build_top.each_with_index do |char, index|
230
+ next if index == 0 || index > title_characters.size
231
+
232
+ char.border = nil
233
+ char.value = title_characters[(index - 1)]
234
+ end
235
+ end
236
+
237
+ # Return boolean indicating whether this border has a non-empty title.
238
+ #
239
+ # @return [Boolean]
240
+ def title?
241
+ present?(title)
242
+ end
243
+
244
+ # Return boolean indicating whether this border has a non-empty caption.
245
+ #
246
+ # @return [Boolean]
247
+ def caption?
248
+ present?(caption)
249
+ end
250
+
251
+ # Return boolean indicating whether the title fits within the width of the
252
+ # top border.
253
+ #
254
+ # @return [Boolean]
255
+ def title_fits?
256
+ width > title_characters.size
257
+ end
258
+
259
+ # Return boolean indicating whether the caption fits within the width of
260
+ # the bottom border.
261
+ #
262
+ # @return [Boolean]
263
+ def caption_fits?
264
+ width > caption_characters.size
265
+ end
266
+
267
+ # @return [Array<String>]
268
+ def title_characters
269
+ @title_characters ||= title_padded.chars
270
+ end
271
+
272
+ # @return [Array<String>]
273
+ def caption_characters
274
+ @caption_characters ||= caption_padded.chars
275
+ end
276
+
277
+ # Pads the title with a single whitespace either side.
278
+ #
279
+ # @example
280
+ # title = 'Truncated!'
281
+ # width = 20
282
+ # # => ' Truncated! '
283
+ #
284
+ # width = 10
285
+ # # => ' Trunca '
286
+ #
287
+ # @return [String]
288
+ # @see #truncated_title
289
+ def title_padded
290
+ truncated_title.center(truncated_title.size + 2)
291
+ end
292
+
293
+ # Pads the caption with a single whitespace either side.
294
+ #
295
+ # @example
296
+ # caption = 'Truncated!'
297
+ # width = 20
298
+ # # => ' Truncated! '
299
+ #
300
+ # width = 10
301
+ # # => ' Trunca '
302
+ #
303
+ # @return [String]
304
+ # @see #truncated_caption
305
+ def caption_padded
306
+ truncated_caption.center(truncated_caption.size + 2)
307
+ end
308
+
309
+ # Truncates the title to the width of the interface, minus characters
310
+ # needed to ensure there is at least a single character of horizontal
311
+ # border and a whitespace on either side of the title.
312
+ #
313
+ # @example
314
+ # title = 'Truncated!'
315
+ # width = 20
316
+ # # => 'Truncated!'
317
+ #
318
+ # width = 10
319
+ # # => 'Trunca'
320
+ #
321
+ # @return [String]
322
+ def truncated_title
323
+ title.chomp.slice(0..(width - 5))
324
+ end
325
+
326
+ # Truncates the caption to the width of the interface, minus characters
327
+ # needed to ensure there is at least a single character of horizontal
328
+ # border and a whitespace on either side of the caption.
329
+ #
330
+ # @example
331
+ # caption = 'Truncated!'
332
+ # width = 20
333
+ # # => 'Truncated!'
334
+ #
335
+ # width = 10
336
+ # # => 'Trunca'
337
+ #
338
+ # @return [String]
339
+ def truncated_caption
340
+ caption.chomp.slice(0..(width - 5))
341
+ end
342
+
343
+ end # Render
344
+
345
+ end # Borders
346
+
347
+ end # Vedeu