vedeu 0.8.3 → 0.8.4

Sign up to get free protection for your applications and to get access to all the features.
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