vedeu 0.8.3 → 0.8.4

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 (82) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +1 -0
  3. data/integrations/342_streams.rb +74 -0
  4. data/integrations/dsl_app_001.rb +58 -0
  5. data/integrations/dsl_app_002.rb +59 -0
  6. data/integrations/dsl_app_003.rb +58 -0
  7. data/integrations/dsl_app_004.rb +63 -0
  8. data/integrations/dsl_app_005.rb +62 -0
  9. data/integrations/dsl_app_006.rb +57 -0
  10. data/integrations/dsl_app_007.rb +63 -0
  11. data/integrations/dsl_app_008.rb +65 -0
  12. data/integrations/dsl_app_009.rb +70 -0
  13. data/integrations/dsl_app_010.rb +71 -0
  14. data/integrations/dsl_app_011.rb +61 -0
  15. data/integrations/dsl_app_012.rb +59 -0
  16. data/integrations/dsl_app_013.rb +60 -0
  17. data/integrations/dsl_app_014.rb +60 -0
  18. data/integrations/dsl_app_015.rb +60 -0
  19. data/integrations/dsl_app_016.rb +64 -0
  20. data/integrations/dsl_app_017.rb +56 -0
  21. data/integrations/dsl_app_018.rb +56 -0
  22. data/integrations/dsl_app_019.rb +56 -0
  23. data/integrations/dsl_app_020.rb +56 -0
  24. data/integrations/expected/342_streams.out +1 -0
  25. data/integrations/expected/dsl_app_001.out +1 -0
  26. data/integrations/expected/dsl_app_002.out +1 -0
  27. data/integrations/expected/dsl_app_003.out +1 -0
  28. data/integrations/expected/dsl_app_004.out +1 -0
  29. data/integrations/expected/dsl_app_005.out +1 -0
  30. data/integrations/expected/dsl_app_006.out +1 -0
  31. data/integrations/expected/dsl_app_007.out +1 -0
  32. data/integrations/expected/dsl_app_008.out +1 -0
  33. data/integrations/expected/dsl_app_009.out +1 -0
  34. data/integrations/expected/dsl_app_010.out +1 -0
  35. data/integrations/expected/dsl_app_011.out +1 -0
  36. data/integrations/expected/dsl_app_012.out +1 -0
  37. data/integrations/expected/dsl_app_013.out +1 -0
  38. data/integrations/expected/dsl_app_014.out +1 -0
  39. data/integrations/expected/dsl_app_015.out +1 -0
  40. data/integrations/expected/dsl_app_016.out +1 -0
  41. data/integrations/support/test_interface.rb +13 -0
  42. data/integrations/test_runner.sh +32 -0
  43. data/lib/vedeu/cells/empty.rb +14 -0
  44. data/lib/vedeu/colours/background.rb +13 -0
  45. data/lib/vedeu/colours/colour.rb +11 -4
  46. data/lib/vedeu/colours/foreground.rb +13 -0
  47. data/lib/vedeu/common.rb +42 -0
  48. data/lib/vedeu/dsl/attributes.rb +1 -1
  49. data/lib/vedeu/dsl/elements.rb +57 -23
  50. data/lib/vedeu/dsl/string/align.rb +17 -2
  51. data/lib/vedeu/geometries/position.rb +5 -0
  52. data/lib/vedeu/geometries/positionable.rb +2 -2
  53. data/lib/vedeu/presentation/style.rb +5 -0
  54. data/lib/vedeu/renderers/all.rb +1 -0
  55. data/lib/vedeu/renderers/escape.rb +96 -0
  56. data/lib/vedeu/repositories/defaults.rb +14 -6
  57. data/lib/vedeu/runtime/launcher.rb +5 -1
  58. data/lib/vedeu/version.rb +1 -1
  59. data/lib/vedeu/views/lines.rb +5 -0
  60. data/lib/vedeu/views/stream.rb +8 -1
  61. data/lib/vedeu/views/streams.rb +6 -1
  62. data/lib/vedeu/views/value.rb +2 -8
  63. data/lib/vedeu/views/view.rb +1 -1
  64. data/test/lib/vedeu/colours/colour_test.rb +0 -8
  65. data/test/lib/vedeu/common_test.rb +72 -0
  66. data/test/lib/vedeu/dsl/string/align_test.rb +1 -1
  67. metadata +43 -17
  68. data/examples/284_slow_rendering.rb +0 -108
  69. data/examples/views/expected/vedeu_line.html +0 -140
  70. data/examples/views/expected/vedeu_line.json +0 -96050
  71. data/examples/views/expected/vedeu_line.out +0 -1
  72. data/examples/views/expected/vedeu_line.txt +0 -58
  73. data/examples/views/expected/vedeu_lines.html +0 -140
  74. data/examples/views/expected/vedeu_lines.json +0 -96050
  75. data/examples/views/expected/vedeu_lines.out +0 -1
  76. data/examples/views/expected/vedeu_lines_alignment.html +0 -80
  77. data/examples/views/expected/vedeu_lines_alignment.json +0 -46370
  78. data/examples/views/expected/vedeu_lines_alignment.out +0 -1
  79. data/examples/views/line.rb +0 -128
  80. data/examples/views/lines.rb +0 -165
  81. data/examples/views/lines_alignment.rb +0 -126
  82. data/examples/views/runner.sh +0 -73
@@ -75,6 +75,11 @@ module Vedeu
75
75
  end
76
76
  alias_method :==, :eql?
77
77
 
78
+ # @return [String]
79
+ def to_ast
80
+ ':s'
81
+ end
82
+
78
83
  # Return the terminal escape sequences after converting the
79
84
  # style or styles.
80
85
  #
@@ -132,6 +132,7 @@ end # Vedeu
132
132
 
133
133
  require 'vedeu/renderers/options'
134
134
  require 'vedeu/renderers/file'
135
+ require 'vedeu/renderers/escape'
135
136
  require 'vedeu/renderers/html'
136
137
  require 'vedeu/renderers/json'
137
138
  require 'vedeu/renderers/terminal'
@@ -0,0 +1,96 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Vedeu
4
+
5
+ module Renderers
6
+
7
+ # Converts a grid of {Vedeu::Cells} objects or
8
+ # {Vedeu::Cells::Char} objects into a stream of characters without
9
+ # escape sequences.
10
+ #
11
+ class Escape < Vedeu::Renderers::File
12
+
13
+ include Vedeu::Renderers::Options
14
+
15
+ # Render a cleared output.
16
+ #
17
+ # @return [String]
18
+ def clear
19
+ render('[[:clear]]')
20
+ end
21
+
22
+ private
23
+
24
+ # Combine all characters in a row to produce a line, then all
25
+ # lines should be terminated with `\n`. Convert to an array of
26
+ # UTF8 codepoints, and any codepoint above 255 should be
27
+ # converted to a space.
28
+ #
29
+ # @return [String]
30
+ def content
31
+ return '[[:empty]]' if string?(output) || absent?(output)
32
+
33
+ buffer.map { |row| row.join("\n") }.join("\n\n")
34
+ end
35
+
36
+ # @return [Array<String>]
37
+ def buffer
38
+ empty = Array.new(Vedeu.height) { Array.new(Vedeu.width) { '[:cell]' } }
39
+
40
+ output.each do |row|
41
+ row.each do |char|
42
+ next unless renderable?(char) &&
43
+ positionable?(char) &&
44
+ escapable?(char)
45
+
46
+ empty[char.position.y - 1][char.position.x - 1] = char.to_ast
47
+ end
48
+ end
49
+
50
+ empty
51
+ end
52
+
53
+ # @return [Boolean]
54
+ def positionable?(char)
55
+ char.respond_to?(:position) &&
56
+ char.position.is_a?(Vedeu::Geometries::Position)
57
+ end
58
+
59
+ # @return [Array<Class>]
60
+ def renderables
61
+ [
62
+ Vedeu::Cells::Border,
63
+ Vedeu::Cells::BottomHorizontal,
64
+ Vedeu::Cells::BottomLeft,
65
+ Vedeu::Cells::BottomRight,
66
+ Vedeu::Cells::Corner,
67
+ Vedeu::Cells::Char,
68
+ Vedeu::Cells::Clear,
69
+ Vedeu::Cells::Cursor,
70
+ Vedeu::Cells::Empty,
71
+ Vedeu::Cells::Escape,
72
+ Vedeu::Cells::Horizontal,
73
+ Vedeu::Cells::LeftVertical,
74
+ Vedeu::Cells::RightVertical,
75
+ Vedeu::Cells::TopHorizontal,
76
+ Vedeu::Cells::TopLeft,
77
+ Vedeu::Cells::TopRight,
78
+ Vedeu::Cells::Vertical,
79
+ ]
80
+ end
81
+
82
+ # @return [Boolean]
83
+ def renderable?(char)
84
+ renderables.include?(char.class)
85
+ end
86
+
87
+ # @return [Boolean]
88
+ def escapable?(char)
89
+ char.respond_to?(:to_ast)
90
+ end
91
+
92
+ end # Escape
93
+
94
+ end # Renderers
95
+
96
+ end # Vedeu
@@ -12,6 +12,8 @@ module Vedeu
12
12
  #
13
13
  module Defaults
14
14
 
15
+ include Vedeu::Common
16
+
15
17
  # Returns a new instance of the class including this module.
16
18
  #
17
19
  # @note
@@ -23,12 +25,7 @@ module Vedeu
23
25
  # @return [void] A new instance of the class including this
24
26
  # module.
25
27
  def initialize(attributes = {})
26
- fail Vedeu::Error::InvalidSyntax,
27
- 'Argument :attributes is not a Hash.' unless attributes.is_a?(Hash)
28
-
29
- attrs = attributes.keep_if { |key, _| defaults.key?(key) }
30
-
31
- defaults.merge!(attrs).each do |key, value|
28
+ defaults.merge!(validate(attributes)).each do |key, value|
32
29
  instance_variable_set("@#{key}", value || defaults.fetch(key))
33
30
  end
34
31
  end
@@ -40,6 +37,17 @@ module Vedeu
40
37
  {}
41
38
  end
42
39
 
40
+ # @param attributes [Hash]
41
+ # @raise [Vedeu::Error::InvalidSyntax] When the :attributes
42
+ # param is not a Hash.
43
+ # @return [Hash]
44
+ def validate(attributes)
45
+ fail Vedeu::Error::InvalidSyntax,
46
+ 'Argument :attributes is not a Hash.' unless hash?(attributes)
47
+
48
+ attributes.keep_if { |key, _| defaults.key?(key) }
49
+ end
50
+
43
51
  end # Defaults
44
52
 
45
53
  end # Repositories
@@ -112,7 +112,11 @@ module Vedeu
112
112
  $stdout = STDOUT
113
113
  $stderr = STDERR
114
114
 
115
- @kernel.exit(exit_code)
115
+ # Commenting out this line means Vedeu can be run as a module within an
116
+ # application. Specifically, this allows me to run some very basic
117
+ # integration tests.
118
+ #
119
+ # @kernel.exit(exit_code)
116
120
  end
117
121
  # :nocov:
118
122
 
data/lib/vedeu/version.rb CHANGED
@@ -3,6 +3,6 @@
3
3
  module Vedeu
4
4
 
5
5
  # The current version of Vedeu.
6
- VERSION = '0.8.3'
6
+ VERSION = '0.8.4'
7
7
 
8
8
  end
@@ -18,6 +18,11 @@ module Vedeu
18
18
  if collection.is_a?(Vedeu::Views::Lines)
19
19
  collection
20
20
 
21
+ elsif collection.is_a?(Vedeu::Views::Streams)
22
+ if collection.empty?
23
+ # @todo Investigate whether this is being used.
24
+ end
25
+
21
26
  elsif collection.is_a?(Array)
22
27
  return new(collection, parent, name) if collection.empty?
23
28
 
@@ -68,7 +68,14 @@ module Vedeu
68
68
  # @param child [Vedeu::Views::Stream]
69
69
  # @return [Vedeu::Views::Streams]
70
70
  def add(child)
71
- parent.add(child)
71
+ if defined?(parent) && present?(parent)
72
+ parent.add(child)
73
+
74
+ else
75
+ @value = child
76
+
77
+ self
78
+ end
72
79
  end
73
80
  alias_method :<<, :add
74
81
 
@@ -37,6 +37,11 @@ module Vedeu
37
37
  elsif collection.is_a?(Vedeu::Views::Stream)
38
38
  new([collection], parent, name)
39
39
 
40
+ elsif collection.is_a?(Vedeu::Views::Chars)
41
+ return new([], parent, name) if collection.empty?
42
+
43
+ new([Vedeu::Views::Stream.new(value: collection)], parent, name)
44
+
40
45
  elsif collection.is_a?(String)
41
46
  return new([], parent, name) if collection.empty?
42
47
 
@@ -45,7 +50,7 @@ module Vedeu
45
50
  else
46
51
  fail Vedeu::Error::InvalidSyntax,
47
52
  'Cannot coerce for Vedeu::View::Streams, as collection ' \
48
- 'unrecognised.'
53
+ "unrecognised. (#{collection.class.name})"
49
54
 
50
55
  end
51
56
  end
@@ -109,19 +109,13 @@ module Vedeu
109
109
 
110
110
  # @return [void]
111
111
  def value
112
- @_value ||= if present?(@value)
113
- collection.coerce(@value, self)
114
-
115
- else
116
- collection.coerce([], self)
117
-
118
- end
112
+ collection.coerce(@value || [], self)
119
113
  end
120
114
 
121
115
  # @param value [void]
122
116
  # @return [void]
123
117
  def value=(value)
124
- @_value = @value = collection.coerce(value, self)
118
+ @value = collection.coerce(value, self)
125
119
  end
126
120
 
127
121
  # Returns a boolean indicating whether this model has a
@@ -76,7 +76,7 @@ module Vedeu
76
76
  # @param child [Vedeu::Views::Line]
77
77
  # @return [Vedeu::Views::Lines]
78
78
  def add(child)
79
- @_value = value.add(child)
79
+ @value = value.add(child)
80
80
  end
81
81
  alias_method :<<, :add
82
82
 
@@ -58,14 +58,6 @@ module Vedeu
58
58
  end
59
59
 
60
60
  describe '.coerce' do
61
- let(:attributes) {
62
- {
63
- background: background,
64
- foreground: foreground,
65
- }
66
- }
67
- let(:background) {}
68
- let(:foreground) {}
69
61
  let(:_value) {}
70
62
 
71
63
  subject { described.coerce(_value) }
@@ -167,6 +167,30 @@ module Vedeu
167
167
  end
168
168
  end
169
169
 
170
+ describe '#line_model?' do
171
+ subject { instance.line_model? }
172
+
173
+ context 'when a model method is available in the including class' do
174
+ let(:model) { Vedeu::Views::Line.new }
175
+
176
+ before { instance.stubs(:model).returns(model) }
177
+
178
+ context 'when the model is a line' do
179
+ it { subject.must_equal(true) }
180
+ end
181
+
182
+ context 'when the model is not a line' do
183
+ let(:model) { :invalid }
184
+
185
+ it { subject.must_equal(false) }
186
+ end
187
+ end
188
+
189
+ context 'when a model method is not available in the including class' do
190
+ it { subject.must_equal(false) }
191
+ end
192
+ end
193
+
170
194
  describe '#numeric?' do
171
195
  let(:_value) {}
172
196
 
@@ -252,6 +276,30 @@ module Vedeu
252
276
  end
253
277
  end
254
278
 
279
+ describe '#stream_model?' do
280
+ subject { instance.stream_model? }
281
+
282
+ context 'when a model method is available in the including class' do
283
+ let(:model) { Vedeu::Views::Stream.new }
284
+
285
+ before { instance.stubs(:model).returns(model) }
286
+
287
+ context 'when the model is a stream' do
288
+ it { subject.must_equal(true) }
289
+ end
290
+
291
+ context 'when the model is not a stream' do
292
+ let(:model) { :invalid }
293
+
294
+ it { subject.must_equal(false) }
295
+ end
296
+ end
297
+
298
+ context 'when a model method is not available in the including class' do
299
+ it { subject.must_equal(false) }
300
+ end
301
+ end
302
+
255
303
  describe '#string?' do
256
304
  let(:_value) {}
257
305
 
@@ -296,6 +344,30 @@ module Vedeu
296
344
  end
297
345
  end
298
346
 
347
+ describe '#view_model?' do
348
+ subject { instance.view_model? }
349
+
350
+ context 'when a model method is available in the including class' do
351
+ let(:model) { Vedeu::Views::View.new }
352
+
353
+ before { instance.stubs(:model).returns(model) }
354
+
355
+ context 'when the model is a view' do
356
+ it { subject.must_equal(true) }
357
+ end
358
+
359
+ context 'when the model is not a view' do
360
+ let(:model) { :invalid }
361
+
362
+ it { subject.must_equal(false) }
363
+ end
364
+ end
365
+
366
+ context 'when a model method is not available in the including class' do
367
+ it { subject.must_equal(false) }
368
+ end
369
+ end
370
+
299
371
  end # Common
300
372
 
301
373
  end # Vedeu
@@ -88,7 +88,7 @@ module Vedeu
88
88
 
89
89
  context 'when a width is not given' do
90
90
  let(:width) {}
91
- let(:expected) { 'Some text... ' }
91
+ let(:expected) { 'Some text...' }
92
92
 
93
93
  it 'uses the width of the named geometry' do
94
94
  subject.must_equal(expected)
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: vedeu
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.8.3
4
+ version: 0.8.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Gavin Laking
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-01-03 00:00:00.000000000 Z
11
+ date: 2016-01-07 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: guard
@@ -460,7 +460,6 @@ files:
460
460
  - docs/streams.md
461
461
  - docs/template.md
462
462
  - docs/view.md
463
- - examples/284_slow_rendering.rb
464
463
  - examples/dsl_alignment.rb
465
464
  - examples/dsl_colours.rb
466
465
  - examples/dsl_demo_groups.rb
@@ -475,26 +474,52 @@ files:
475
474
  - examples/views/expected/vedeu_full_screen.json
476
475
  - examples/views/expected/vedeu_full_screen.out
477
476
  - examples/views/expected/vedeu_full_screen.txt
478
- - examples/views/expected/vedeu_line.html
479
- - examples/views/expected/vedeu_line.json
480
- - examples/views/expected/vedeu_line.out
481
- - examples/views/expected/vedeu_line.txt
482
- - examples/views/expected/vedeu_lines.html
483
- - examples/views/expected/vedeu_lines.json
484
- - examples/views/expected/vedeu_lines.out
485
- - examples/views/expected/vedeu_lines_alignment.html
486
- - examples/views/expected/vedeu_lines_alignment.json
487
- - examples/views/expected/vedeu_lines_alignment.out
488
477
  - examples/views/full_screen.rb
489
- - examples/views/line.rb
490
- - examples/views/lines.rb
491
- - examples/views/lines_alignment.rb
492
478
  - examples/views/lines_line_stream.rb
493
479
  - examples/views/lines_line_streams.rb
494
480
  - examples/views/lines_line_streams_stream.rb
495
481
  - examples/views/lines_line_streams_stream_stream.rb
496
482
  - examples/views/lines_streams.rb
497
- - examples/views/runner.sh
483
+ - integrations/342_streams.rb
484
+ - integrations/dsl_app_001.rb
485
+ - integrations/dsl_app_002.rb
486
+ - integrations/dsl_app_003.rb
487
+ - integrations/dsl_app_004.rb
488
+ - integrations/dsl_app_005.rb
489
+ - integrations/dsl_app_006.rb
490
+ - integrations/dsl_app_007.rb
491
+ - integrations/dsl_app_008.rb
492
+ - integrations/dsl_app_009.rb
493
+ - integrations/dsl_app_010.rb
494
+ - integrations/dsl_app_011.rb
495
+ - integrations/dsl_app_012.rb
496
+ - integrations/dsl_app_013.rb
497
+ - integrations/dsl_app_014.rb
498
+ - integrations/dsl_app_015.rb
499
+ - integrations/dsl_app_016.rb
500
+ - integrations/dsl_app_017.rb
501
+ - integrations/dsl_app_018.rb
502
+ - integrations/dsl_app_019.rb
503
+ - integrations/dsl_app_020.rb
504
+ - integrations/expected/342_streams.out
505
+ - integrations/expected/dsl_app_001.out
506
+ - integrations/expected/dsl_app_002.out
507
+ - integrations/expected/dsl_app_003.out
508
+ - integrations/expected/dsl_app_004.out
509
+ - integrations/expected/dsl_app_005.out
510
+ - integrations/expected/dsl_app_006.out
511
+ - integrations/expected/dsl_app_007.out
512
+ - integrations/expected/dsl_app_008.out
513
+ - integrations/expected/dsl_app_009.out
514
+ - integrations/expected/dsl_app_010.out
515
+ - integrations/expected/dsl_app_011.out
516
+ - integrations/expected/dsl_app_012.out
517
+ - integrations/expected/dsl_app_013.out
518
+ - integrations/expected/dsl_app_014.out
519
+ - integrations/expected/dsl_app_015.out
520
+ - integrations/expected/dsl_app_016.out
521
+ - integrations/support/test_interface.rb
522
+ - integrations/test_runner.sh
498
523
  - lib/vedeu.rb
499
524
  - lib/vedeu/all.rb
500
525
  - lib/vedeu/application/all.rb
@@ -704,6 +729,7 @@ files:
704
729
  - lib/vedeu/presentation/style.rb
705
730
  - lib/vedeu/presentation/styles.rb
706
731
  - lib/vedeu/renderers/all.rb
732
+ - lib/vedeu/renderers/escape.rb
707
733
  - lib/vedeu/renderers/file.rb
708
734
  - lib/vedeu/renderers/html.rb
709
735
  - lib/vedeu/renderers/json.rb