vedeu 0.6.12 → 0.6.13

Sign up to get free protection for your applications and to get access to all the features.
Files changed (67) hide show
  1. checksums.yaml +4 -4
  2. data/lib/vedeu/bindings/application.rb +4 -0
  3. data/lib/vedeu/bindings/document.rb +4 -0
  4. data/lib/vedeu/bindings/focus.rb +4 -0
  5. data/lib/vedeu/bindings/menus.rb +4 -0
  6. data/lib/vedeu/bindings/movement.rb +4 -0
  7. data/lib/vedeu/bindings/refresh.rb +4 -0
  8. data/lib/vedeu/bindings/system.rb +4 -0
  9. data/lib/vedeu/bindings/visibility.rb +4 -0
  10. data/lib/vedeu/borders/dsl.rb +2 -3
  11. data/lib/vedeu/configuration/api.rb +26 -0
  12. data/lib/vedeu/configuration/configuration.rb +16 -0
  13. data/lib/vedeu/dsl/composition.rb +2 -3
  14. data/lib/vedeu/dsl/group.rb +2 -3
  15. data/lib/vedeu/dsl/interface.rb +2 -4
  16. data/lib/vedeu/dsl/keymap.rb +24 -21
  17. data/lib/vedeu/dsl/line.rb +4 -6
  18. data/lib/vedeu/dsl/presentation.rb +16 -12
  19. data/lib/vedeu/dsl/shared.rb +18 -14
  20. data/lib/vedeu/dsl/stream.rb +2 -3
  21. data/lib/vedeu/dsl/text.rb +6 -4
  22. data/lib/vedeu/dsl/view.rb +6 -8
  23. data/lib/vedeu/error.rb +12 -0
  24. data/lib/vedeu/geometry/area.rb +4 -2
  25. data/lib/vedeu/geometry/coordinate.rb +4 -4
  26. data/lib/vedeu/geometry/dimension.rb +6 -4
  27. data/lib/vedeu/geometry/dsl.rb +55 -43
  28. data/lib/vedeu/geometry/generic_coordinate.rb +4 -3
  29. data/lib/vedeu/geometry/geometry.rb +13 -11
  30. data/lib/vedeu/geometry/grid.rb +6 -5
  31. data/lib/vedeu/geometry/position.rb +12 -10
  32. data/lib/vedeu/input/key.rb +2 -3
  33. data/lib/vedeu/logging/log.rb +1 -1
  34. data/lib/vedeu/menus/menu.rb +2 -3
  35. data/lib/vedeu/models/views/view.rb +0 -2
  36. data/lib/vedeu/output/output.rb +10 -1
  37. data/lib/vedeu/output/renderers/file.rb +3 -3
  38. data/lib/vedeu/output/renderers/json.rb +2 -0
  39. data/lib/vedeu/runtime/main_loop.rb +4 -0
  40. data/lib/vedeu/templating/helpers.rb +4 -7
  41. data/lib/vedeu/terminal/buffer.rb +1 -2
  42. data/lib/vedeu/terminal/terminal.rb +4 -2
  43. data/lib/vedeu/version.rb +1 -1
  44. data/test/lib/vedeu/api/external_test.rb +14 -2
  45. data/test/lib/vedeu/bindings/visibility_test.rb +15 -0
  46. data/test/lib/vedeu/dsl/composition_test.rb +1 -1
  47. data/test/lib/vedeu/dsl/group_test.rb +1 -1
  48. data/test/lib/vedeu/dsl/interface_test.rb +3 -3
  49. data/test/lib/vedeu/dsl/line_test.rb +2 -2
  50. data/test/lib/vedeu/dsl/stream_test.rb +1 -1
  51. data/test/lib/vedeu/dsl/view_test.rb +3 -3
  52. data/test/lib/vedeu/error_test.rb +13 -0
  53. data/test/lib/vedeu/input/key_test.rb +1 -1
  54. data/test/lib/vedeu/menus/menu_test.rb +1 -1
  55. data/test/lib/vedeu/models/interface_test.rb +26 -0
  56. data/test/lib/vedeu/output/renderers/escape_sequence_test.rb +7 -0
  57. data/test/lib/vedeu/output/renderers/file_test.rb +7 -0
  58. data/test/lib/vedeu/output/renderers/html_test.rb +7 -0
  59. data/test/lib/vedeu/output/renderers/json_test.rb +7 -0
  60. data/test/lib/vedeu/output/renderers/null_test.rb +7 -0
  61. data/test/lib/vedeu/output/renderers/terminal_test.rb +11 -0
  62. data/test/lib/vedeu/output/renderers/text_test.rb +7 -0
  63. data/test/lib/vedeu/terminal/buffer_test.rb +31 -12
  64. data/test/lib/vedeu/terminal/terminal_test.rb +24 -21
  65. data/test/support/examples/material_colours_app.rb +2 -0
  66. data/test/test_helper.rb +2 -2
  67. metadata +2 -2
@@ -2,12 +2,13 @@ module Vedeu
2
2
 
3
3
  module Geometry
4
4
 
5
- # @todo Consider storing the Terminal size at the time of first creation,
6
- # this allows us to return the interface to its original dimensions if
7
- # the terminal resizes back to normal size.
5
+ # @todo Consider storing the Terminal size at the time of first
6
+ # creation, this allows us to return the interface to its original
7
+ # dimensions if the terminal resizes back to normal size.
8
8
  #
9
- # Calculates and provides interface geometry determined by both the client's
10
- # requirements and the terminal's current viewing area.
9
+ # Calculates and provides interface geometry determined by both
10
+ # the client's requirements and the terminal's current viewing
11
+ # area.
11
12
  #
12
13
  class Geometry
13
14
 
@@ -93,8 +94,8 @@ module Vedeu
93
94
  end
94
95
  end
95
96
 
96
- # Will maximise the named interface geometry. This means it will occupy
97
- # all of the available space on the terminal window.
97
+ # Will maximise the named interface geometry. This means it will
98
+ # occupy all of the available space on the terminal window.
98
99
  #
99
100
  # @example
100
101
  # Vedeu.trigger(:_maximise_, name)
@@ -226,10 +227,11 @@ module Vedeu
226
227
  Vedeu::Geometry::Geometry.new(@attributes).store
227
228
  end
228
229
 
229
- # Will unmaximise the named interface geometry. Previously, when a
230
- # geometry was maximised, then triggering the unmaximise event will return
231
- # it to its usual defined size (terminal size permitting: when the
232
- # terminal has been resized, then the new geometry size should adapt).
230
+ # Will unmaximise the named interface geometry. Previously, when
231
+ # a geometry was maximised, then triggering the unmaximise event
232
+ # will return it to its usual defined size (terminal size
233
+ # permitting: when the terminal has been resized, then the new
234
+ # geometry size should adapt).
233
235
  #
234
236
  # @example
235
237
  # Vedeu.trigger(:_unmaximise_, name)
@@ -2,10 +2,10 @@ module Vedeu
2
2
 
3
3
  module Geometry
4
4
 
5
- # The grid system splits the terminal height and width into 12 equal parts,
6
- # by dividing the available height and width by 12. If the terminal height
7
- # or width is not a multiple of 12, then Grid chooses the maximum value
8
- # which will fit.
5
+ # The grid system splits the terminal height and width into 12
6
+ # equal parts, by dividing the available height and width by 12.
7
+ # If the terminal height or width is not a multiple of 12, then
8
+ # Grid chooses the maximum value which will fit.
9
9
  #
10
10
  class Grid
11
11
 
@@ -58,7 +58,8 @@ module Vedeu
58
58
  Vedeu.height / 12
59
59
  end
60
60
 
61
- # Returns a boolean indicating whether the value is out of range.
61
+ # Returns a boolean indicating whether the value is out of
62
+ # range.
62
63
  #
63
64
  # @return [Boolean]
64
65
  def out_of_range?
@@ -2,7 +2,8 @@ module Vedeu
2
2
 
3
3
  module Geometry
4
4
 
5
- # Change coordinates into an escape sequence to set the cursor position.
5
+ # Change coordinates into an escape sequence to set the cursor
6
+ # position.
6
7
  #
7
8
  class Position
8
9
 
@@ -48,8 +49,8 @@ module Vedeu
48
49
  @x = (x.nil? || x < 1) ? 1 : x
49
50
  end
50
51
 
51
- # Converts a position into an index for the terminal. An index is the
52
- # position minus 1.
52
+ # Converts a position into an index for the terminal. An index
53
+ # is the position minus 1.
53
54
  #
54
55
  # @return [Array<Fixnum>]
55
56
  def as_indices
@@ -92,13 +93,14 @@ module Vedeu
92
93
  self
93
94
  end
94
95
 
95
- # Return the escape sequence required to position the cursor at a
96
- # particular point on the screen. When passed a block, will do the
97
- # aforementioned, call the block and then reposition to this location.
96
+ # Return the escape sequence required to position the cursor at
97
+ # a particular point on the screen. When passed a block, will do
98
+ # the aforementioned, call the block and then reposition to this
99
+ # location.
98
100
  #
99
101
  # @return [String]
100
- # @yieldreturn [String] Returns the block wrapped in position escape
101
- # sequences.
102
+ # @yieldreturn [String] Returns the block wrapped in position
103
+ # escape sequences.
102
104
  def to_s
103
105
  return "#{sequence}#{yield}" if block_given?
104
106
 
@@ -136,8 +138,8 @@ module Vedeu
136
138
 
137
139
  private
138
140
 
139
- # Returns the escape sequence to reposition the cursors at the coordinates
140
- # specified by x and y.
141
+ # Returns the escape sequence to reposition the cursors at the
142
+ # coordinates specified by x and y.
141
143
  #
142
144
  # @return [String]
143
145
  def sequence
@@ -16,11 +16,10 @@ module Vedeu
16
16
  #
17
17
  # @param input [String|Symbol]
18
18
  # @param block [Proc]
19
- # @raise [Vedeu::Error::InvalidSyntax] The required block was
20
- # not given.
19
+ # @raise [Vedeu::Error::RequiresBlock]
21
20
  # @return [Vedeu::Input::Key]
22
21
  def initialize(input = nil, &block)
23
- fail Vedeu::Error::InvalidSyntax, 'block not given' unless block_given?
22
+ fail Vedeu::Error::RequiresBlock unless block_given?
24
23
 
25
24
  @input = input
26
25
  @output = block
@@ -145,7 +145,7 @@ module Vedeu
145
145
  drb: [:light_blue, :blue],
146
146
  event: [:light_magenta, :magenta],
147
147
  info: [:white, :default],
148
- input: [:light_yellow, :yellow],
148
+ input: [:light_red, :red],
149
149
  output: [:light_green, :green],
150
150
  reset: [:light_cyan, :cyan],
151
151
  store: [:light_cyan, :cyan],
@@ -55,11 +55,10 @@ module Vedeu
55
55
  # # ...
56
56
  # end
57
57
  #
58
- # @raise [Vedeu::Error::InvalidSyntax] The required block was
59
- # not given.
58
+ # @raise [Vedeu::Error::RequiresBlock]
60
59
  # @return [API::Menu]
61
60
  def self.menu(name = '', &block)
62
- fail Vedeu::Error::InvalidSyntax, 'block not given' unless block_given?
61
+ fail Vedeu::Error::RequiresBlock unless block_given?
63
62
 
64
63
  build(name: name, &block).store
65
64
  end
@@ -74,11 +74,9 @@ module Vedeu
74
74
  return [] unless visible?
75
75
 
76
76
  output = [
77
- Vedeu::Cursors::Cursor.hide_cursor(name),
78
77
  Vedeu::Clear::NamedInterface.render(name),
79
78
  Vedeu::Output::Viewport.render(self),
80
79
  Vedeu.borders.by_name(name).render,
81
- Vedeu::Cursors::Cursor.show_cursor(name),
82
80
  ]
83
81
 
84
82
  output
@@ -29,13 +29,22 @@ module Vedeu
29
29
  #
30
30
  # @return [Array]
31
31
  def render
32
- Vedeu::Terminal::Buffer.write(output).render
32
+ return render_terminal_buffer unless output.is_a?(Vedeu::Models::Escape)
33
+
34
+ Vedeu::Output::Direct.write(value: output.value,
35
+ x: output.position.x,
36
+ y: output.position.y)
33
37
  end
34
38
 
35
39
  # @!attribute [r] output
36
40
  # @return [Array<Array<Vedeu::Views::Char>>]
37
41
  attr_reader :output
38
42
 
43
+ # @return [Array]
44
+ def render_terminal_buffer
45
+ Vedeu::Terminal::Buffer.write(output).render
46
+ end
47
+
39
48
  end # Output
40
49
 
41
50
  end # Output
@@ -25,10 +25,10 @@ module Vedeu
25
25
  # Render a cleared output.
26
26
  #
27
27
  # @return [String]
28
- def clear
29
- ::File.write(filename, '') if write_file?
28
+ def clear(output = '')
29
+ ::File.write(filename, output) if write_file?
30
30
 
31
- ''
31
+ output
32
32
  end
33
33
 
34
34
  # @param output [Vedeu::Models::Page]
@@ -46,6 +46,8 @@ module Vedeu
46
46
  # @param output [Vedeu::Models::Page]
47
47
  # @return [Array]
48
48
  def as_hash(output)
49
+ return output if output.is_a?(Hash)
50
+
49
51
  output.content.map(&:to_hash)
50
52
  end
51
53
 
@@ -24,8 +24,12 @@ module Vedeu
24
24
  while @loop
25
25
  yield
26
26
 
27
+ Vedeu::Cursors::Cursor.hide_cursor
28
+
27
29
  Vedeu::Terminal::Buffer.render
28
30
 
31
+ Vedeu::Cursors::Cursor.show_cursor
32
+
29
33
  safe_exit_point!
30
34
  end
31
35
  rescue Vedeu::Error::Interrupt
@@ -8,9 +8,8 @@ module Vedeu
8
8
 
9
9
  # @param value [String] The HTML/CSS colour.
10
10
  # @param block [Proc]
11
+ # @raise [Vedeu::Error::RequiresBlock]
11
12
  # @return [Vedeu::Views::Stream]
12
- # @raise [Vedeu::Error::InvalidSyntax] The required block was
13
- # not given.
14
13
  def background(value, &block)
15
14
  define_stream(background: value, &block)
16
15
  end
@@ -22,18 +21,16 @@ module Vedeu
22
21
  # @option attributes background [String] The HTML/CSS background
23
22
  # colour.
24
23
  # @param block [Proc]
24
+ # @raise [Vedeu::Error::RequiresBlock]
25
25
  # @return [Vedeu::Views::Stream]
26
- # @raise [Vedeu::Error::InvalidSyntax] The required block was
27
- # not given.
28
26
  def colour(attributes = {}, &block)
29
27
  define_stream(attributes, &block)
30
28
  end
31
29
 
32
30
  # @param value [String] The HTML/CSS colour.
33
31
  # @param block [Proc]
32
+ # @raise [Vedeu::Error::RequiresBlock]
34
33
  # @return [Vedeu::Views::Stream]
35
- # @raise [Vedeu::Error::InvalidSyntax] The required block was
36
- # not given.
37
34
  def foreground(value, &block)
38
35
  define_stream(foreground: value, &block)
39
36
  end
@@ -50,7 +47,7 @@ module Vedeu
50
47
 
51
48
  # @see Vedeu::Templating::Helpers#colour
52
49
  def define_stream(attributes = {}, &block)
53
- fail Vedeu::Error::InvalidSyntax, 'block not given' unless block_given?
50
+ fail Vedeu::Error::RequiresBlock unless block_given?
54
51
 
55
52
  encode(
56
53
  Vedeu::Views::Stream.build(
@@ -130,8 +130,7 @@ module Vedeu
130
130
  # @param value [void]
131
131
  # @return [Boolean]
132
132
  def within_terminal_boundary?(value)
133
- value.position.y > 0 && value.position.y <= Vedeu.height &&
134
- value.position.x > 0 && value.position.x <= Vedeu.width
133
+ buffer[value.position.y] && buffer[value.position.y][value.position.x]
135
134
  end
136
135
 
137
136
  end # Buffer
@@ -12,11 +12,11 @@ module Vedeu
12
12
  # exit, attempts to restore the screen. See
13
13
  # {Vedeu::Terminal#restore_screen}.
14
14
  #
15
- # @raise [Vedeu::Error::InvalidSyntax] The required block was not
15
+ # @raise [Vedeu::Error::RequiresBlock] The required block was not
16
16
  # given.
17
17
  # @return [Array]
18
18
  def open
19
- fail Vedeu::Error::InvalidSyntax, 'block not given' unless block_given?
19
+ fail Vedeu::Error::RequiresBlock unless block_given?
20
20
 
21
21
  if raw_mode? || fake_mode?
22
22
  console.raw { initialize_screen(mode) { yield } }
@@ -155,6 +155,7 @@ module Vedeu
155
155
  # @return [Fixnum]
156
156
  def width
157
157
  return Vedeu::Configuration.drb_width if Vedeu::Configuration.drb?
158
+ return Vedeu::Configuration.width if Vedeu::Configuration.width
158
159
 
159
160
  size[-1]
160
161
  end
@@ -170,6 +171,7 @@ module Vedeu
170
171
  # @return [Fixnum]
171
172
  def height
172
173
  return Vedeu::Configuration.drb_height if Vedeu::Configuration.drb?
174
+ return Vedeu::Configuration.height if Vedeu::Configuration.height
173
175
 
174
176
  size.first
175
177
  end
data/lib/vedeu/version.rb CHANGED
@@ -1,6 +1,6 @@
1
1
  module Vedeu
2
2
 
3
3
  # The current version of Vedeu.
4
- VERSION = '0.6.12'
4
+ VERSION = '0.6.13'
5
5
 
6
6
  end
@@ -30,7 +30,14 @@ module Vedeu
30
30
  it { Vedeu.must_respond_to(:geometry) }
31
31
  it { Vedeu.must_respond_to(:goto) }
32
32
  it { Vedeu.must_respond_to(:group) }
33
- it { Vedeu.must_respond_to(:height) }
33
+
34
+ describe 'Vedeu.height' do
35
+ before { Terminal.stubs(:size).returns([25, 40]) }
36
+
37
+ it { Vedeu.must_respond_to(:height) }
38
+ it { Vedeu.height.must_equal(25) }
39
+ end
40
+
34
41
  it { Vedeu.must_respond_to(:hide_cursor) }
35
42
  it { Vedeu.must_respond_to(:hide_group) }
36
43
  it { Vedeu.must_respond_to(:hide_interface) }
@@ -53,8 +60,13 @@ module Vedeu
53
60
  it { Vedeu.must_respond_to(:unbind) }
54
61
  it { Vedeu.must_respond_to(:unbind_alias) }
55
62
  it { Vedeu.must_respond_to(:views) }
56
- it { Vedeu.must_respond_to(:width) }
57
63
 
64
+ describe 'Vedeu.width' do
65
+ before { Terminal.stubs(:size).returns([25, 40]) }
66
+
67
+ it { Vedeu.must_respond_to(:width) }
68
+ it { Vedeu.width.must_equal(40) }
69
+ end
58
70
  end # External
59
71
 
60
72
  end
@@ -24,6 +24,21 @@ module Vedeu
24
24
  it { Vedeu.bound?(:_toggle_interface_).must_equal(true) }
25
25
  end
26
26
 
27
+ # describe ':_some_event_' do
28
+ # let(:_name) { 'some_name' }
29
+ #
30
+ # before do
31
+ # # stub expectation
32
+ # end
33
+ #
34
+ # subject { Vedeu.trigger(:_some_event_, _name) }
35
+ #
36
+ # it {
37
+ # # expectation
38
+ # subject
39
+ # }
40
+ # end
41
+
27
42
  end # Visibility
28
43
 
29
44
  end # Bindings
@@ -28,7 +28,7 @@ module Vedeu
28
28
  it { subject[0].must_be_instance_of(Vedeu::Views::View) }
29
29
 
30
30
  context 'when the block is not given' do
31
- it { proc { instance.view }.must_raise(Vedeu::Error::InvalidSyntax) }
31
+ it { proc { instance.view }.must_raise(Vedeu::Error::RequiresBlock) }
32
32
  end
33
33
  end
34
34
 
@@ -31,7 +31,7 @@ module Vedeu
31
31
  context 'when the block is not given' do
32
32
  subject { described.group(group_name) }
33
33
 
34
- it { proc { subject }.must_raise(Vedeu::Error::InvalidSyntax) }
34
+ it { proc { subject }.must_raise(Vedeu::Error::RequiresBlock) }
35
35
  end
36
36
  end
37
37
 
@@ -34,7 +34,7 @@ module Vedeu
34
34
  context 'when the block is not given' do
35
35
  subject { described.interface('fluorine') }
36
36
 
37
- it { proc { subject }.must_raise(Vedeu::Error::InvalidSyntax) }
37
+ it { proc { subject }.must_raise(Vedeu::Error::RequiresBlock) }
38
38
  end
39
39
 
40
40
  context 'when the name is not given' do
@@ -54,7 +54,7 @@ module Vedeu
54
54
  context 'when the block is not given' do
55
55
  subject { instance.border }
56
56
 
57
- it { proc { subject }.must_raise(Vedeu::Error::InvalidSyntax) }
57
+ it { proc { subject }.must_raise(Vedeu::Error::RequiresBlock) }
58
58
  end
59
59
 
60
60
  context 'when the block is given' do
@@ -182,7 +182,7 @@ module Vedeu
182
182
  context 'when the required block is not provided' do
183
183
  subject { instance.geometry }
184
184
 
185
- it { proc { subject }.must_raise(Vedeu::Error::InvalidSyntax) }
185
+ it { proc { subject }.must_raise(Vedeu::Error::RequiresBlock) }
186
186
  end
187
187
 
188
188
  context 'when the block is given' do
@@ -57,7 +57,7 @@ module Vedeu
57
57
 
58
58
  subject { instance.line(_value) }
59
59
 
60
- it { proc { subject }.must_raise(Vedeu::Error::InvalidSyntax) }
60
+ it { proc { subject }.must_raise(Vedeu::Error::RequiresBlock) }
61
61
  end
62
62
  end
63
63
  end
@@ -76,7 +76,7 @@ module Vedeu
76
76
 
77
77
  context 'when the block is not given' do
78
78
  it {
79
- proc { instance.streams }.must_raise(Vedeu::Error::InvalidSyntax)
79
+ proc { instance.streams }.must_raise(Vedeu::Error::RequiresBlock)
80
80
  }
81
81
  end
82
82