vedeu 0.6.12 → 0.6.13

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 (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