vedeu 0.6.21 → 0.6.22

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 (52) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +1 -0
  3. data/bin/vedeu_drb_server +1 -0
  4. data/docs/configuration.md +3 -0
  5. data/docs/events/refresh.md +5 -0
  6. data/docs/events/visibility.md +6 -0
  7. data/examples/hello_worlds.rb +79 -0
  8. data/lib/vedeu/all.rb +2 -2
  9. data/lib/vedeu/bindings/refresh.rb +8 -0
  10. data/lib/vedeu/bindings/visibility.rb +8 -0
  11. data/lib/vedeu/borders/border.rb +1 -1
  12. data/lib/vedeu/borders/render.rb +13 -10
  13. data/lib/vedeu/buffers/buffer.rb +5 -49
  14. data/lib/vedeu/buffers/refresh.rb +33 -15
  15. data/lib/vedeu/configuration/api.rb +32 -3
  16. data/lib/vedeu/configuration/configuration.rb +16 -2
  17. data/lib/vedeu/cursors/refresh.rb +1 -1
  18. data/lib/vedeu/distributed/templates/default_configuration.vedeu +1 -0
  19. data/lib/vedeu/editor/document.rb +1 -3
  20. data/lib/vedeu/logging/debug.rb +11 -8
  21. data/lib/vedeu/logging/timer.rb +18 -4
  22. data/lib/vedeu/models/interface.rb +18 -6
  23. data/lib/vedeu/models/views/view.rb +2 -9
  24. data/lib/vedeu/output/clear/interface.rb +93 -9
  25. data/lib/vedeu/output/direct.rb +0 -2
  26. data/lib/vedeu/output/viewport.rb +18 -16
  27. data/lib/vedeu/runtime/launcher.rb +25 -26
  28. data/lib/vedeu/version.rb +1 -1
  29. data/test/lib/vedeu/bindings/refresh_test.rb +1 -0
  30. data/test/lib/vedeu/bindings/visibility_test.rb +1 -0
  31. data/test/lib/vedeu/borders/border_test.rb +2 -2
  32. data/test/lib/vedeu/borders/render_test.rb +12 -69
  33. data/test/lib/vedeu/buffers/buffer_test.rb +0 -31
  34. data/test/lib/vedeu/buffers/refresh_test.rb +2 -10
  35. data/test/lib/vedeu/cursors/refresh_test.rb +2 -2
  36. data/test/lib/vedeu/editor/document_test.rb +3 -3
  37. data/test/lib/vedeu/logging/debug_test.rb +3 -3
  38. data/test/lib/vedeu/logging/timer_test.rb +24 -6
  39. data/test/lib/vedeu/models/interface_test.rb +4 -8
  40. data/test/lib/vedeu/models/views/view_test.rb +12 -22
  41. data/test/lib/vedeu/output/clear/interface_test.rb +7 -1
  42. data/test/lib/vedeu/output/viewport_test.rb +11 -190
  43. data/test/lib/vedeu/runtime/launcher_test.rb +2 -1
  44. data/test/lib/vedeu_test.rb +18 -19
  45. data/test/support/examples/borders_app.rb +4 -3
  46. data/test/support/examples/drb_app.rb +4 -3
  47. data/test/support/examples/editor_app.rb +3 -7
  48. data/test/support/examples/focus_app.rb +4 -4
  49. data/test/support/examples/hello_world.rb +5 -2
  50. data/test/support/examples/material_colours_app.rb +3 -42
  51. data/test/test_helper.rb +1 -0
  52. metadata +2 -1
@@ -89,8 +89,8 @@ module Vedeu
89
89
  end
90
90
 
91
91
  # Returns whether debugging is enabled or disabled. Default is
92
- # false; meaning nothing apart from warnings are written to the
93
- # log file.
92
+ # false; meaning only the top line of a backtrace from an
93
+ # exception is shown to the user of the client application.
94
94
  #
95
95
  # @return [Boolean]
96
96
  def debug?
@@ -183,6 +183,15 @@ module Vedeu
183
183
  end
184
184
  alias_method :once, :once?
185
185
 
186
+ # Returns a boolean indicating whether profiling has been
187
+ # enabled.
188
+ #
189
+ # @return [Boolean]
190
+ def profile?
191
+ instance.options[:profile]
192
+ end
193
+ alias_method :profile, :profile?
194
+
186
195
  # Returns the renderers which should receive output.
187
196
  #
188
197
  # @return [Array<Class>]
@@ -304,6 +313,7 @@ module Vedeu
304
313
  log: nil,
305
314
  log_only: [],
306
315
  once: false,
316
+ profile: false,
307
317
  renderers: [Vedeu::Renderers::Terminal.new],
308
318
  root: nil,
309
319
  stdin: nil,
@@ -335,6 +345,10 @@ module Vedeu
335
345
 
336
346
  end # Configuration
337
347
 
348
+ require 'vedeu/output/renderers/all'
349
+
350
+ Vedeu::Configuration.configure({})
351
+
338
352
  # @!method configure
339
353
  # @see Vedeu::Configuration.configure
340
354
  # @!method configuration
@@ -36,7 +36,7 @@ module Vedeu
36
36
  def by_name
37
37
  Vedeu.log(type: :info, message: "Refreshing cursor: '#{name}'")
38
38
 
39
- Vedeu.trigger(:_refresh_view_, name) if refresh_view?
39
+ Vedeu.trigger(:_refresh_view_content_, name) if refresh_view?
40
40
 
41
41
  cursor.render
42
42
  end
@@ -2,6 +2,7 @@ Vedeu.configure do
2
2
  # compression false
3
3
  # log '/tmp/your_app.log'
4
4
  # debug!
5
+ # profile!
5
6
  # drb!
6
7
  # drb_host 'localhost'
7
8
  # drb_port 21420
@@ -58,7 +58,7 @@ module Vedeu
58
58
  #
59
59
  # @return [void]
60
60
  def clear
61
- Vedeu.trigger(:_clear_view_, name)
61
+ Vedeu.trigger(:_clear_view_content_, name)
62
62
  end
63
63
 
64
64
  # Deletes the character from the line where the cursor is
@@ -249,8 +249,6 @@ module Vedeu
249
249
  end
250
250
  end
251
251
 
252
- out << border.render
253
-
254
252
  cursor.store
255
253
 
256
254
  out.flatten
@@ -10,16 +10,19 @@ module Vedeu
10
10
  extend self
11
11
 
12
12
  # :nocov:
13
- # Helps to debug a running application by providing a stack
13
+ # Helps to profile a running application by providing a stack
14
14
  # trace of its execution upon exiting.
15
15
  #
16
16
  # @example
17
- # Vedeu.debug
17
+ # Vedeu.profile('some_file.html') do
18
+ # # ... code to profile ...
19
+ # end
18
20
  #
19
- # @param filename [String]
21
+ # @param filename [String] Optional, and defaults to being
22
+ # written to the /tmp directory.
20
23
  # @return [void]
21
- # @yieldreturn [void] The section of the application to debug.
22
- def self.debug(filename = 'profile.html')
24
+ # @yieldreturn [void] The section of the application to profile.
25
+ def self.profile(filename = 'profile.html')
23
26
  return nil unless block_given?
24
27
 
25
28
  require 'ruby-prof'
@@ -88,10 +91,10 @@ module Vedeu
88
91
  # ruby-prof.
89
92
  #
90
93
  # @example
91
- # Vedeu.debug
94
+ # Vedeu.profile
92
95
  #
93
- # @!method debug
96
+ # @!method profile
94
97
  # @return [Vedeu::Logging::Debug]
95
- def_delegators Vedeu::Logging::Debug, :debug
98
+ def_delegators Vedeu::Logging::Debug, :profile
96
99
 
97
100
  end # Vedeu
@@ -3,18 +3,23 @@ module Vedeu
3
3
  module Logging
4
4
 
5
5
  # Measure the duration. Used for debugging.
6
+ # The configuration option 'debug' must be set to true to enable
7
+ # this functionality.
6
8
  #
7
9
  class Timer
8
10
 
9
11
  class << self
10
12
 
11
13
  # Measure the execution time of the code in the given block.
14
+ # The message provided will have ' took <time>ms.' appended.
12
15
  #
13
16
  # @example
14
- # Vedeu.timer 'message' do
17
+ # Vedeu.timer 'Really complex code' do
15
18
  # # ... code to be measured
16
19
  # end
17
20
  #
21
+ # # => 'Really complex code took 0.234ms.'
22
+ #
18
23
  # @param message [String]
19
24
  # @param block [Proc]
20
25
  # @return [void] The return value of the executed block.
@@ -36,13 +41,22 @@ module Vedeu
36
41
  # Write an entry to the log file stating how long a section of
37
42
  # code took in milliseconds. Useful for debugging performance.
38
43
  #
44
+ # @raise [Vedeu::Error::RequiresBlock]
39
45
  # @return [void] The return value of the executed block.
40
46
  def measure
41
- work = yield
47
+ fail Vedeu::Error::RequiresBlock unless block_given?
48
+
49
+ if Vedeu::Configuration.debug?
50
+ work = yield
51
+
52
+ Vedeu.log(type: :timer, message: "#{message} took #{elapsed}ms.")
42
53
 
43
- Vedeu.log(type: :timer, message: "#{message} took #{elapsed}ms.")
54
+ work
44
55
 
45
- work
56
+ else
57
+ yield
58
+
59
+ end
46
60
  end
47
61
 
48
62
  protected
@@ -61,30 +61,42 @@ module Vedeu
61
61
  end
62
62
  end
63
63
 
64
- # Hide a named interface buffer, or without a name, the buffer
65
- # of the currently focussed interface.
64
+ # Hide the named interface.
65
+ #
66
+ # Will hide the named interface. If the interface is currently
67
+ # visible, it will be cleared- rendered blank. To show the
68
+ # interface, the ':_show_interface_' event should be triggered.
69
+ # Triggering the ':_hide_group_' event to which this named
70
+ # interface belongs will also hide the interface.
66
71
  #
67
72
  # @example
73
+ # Vedeu.trigger(:_hide_interface_, name)
68
74
  # Vedeu.hide_interface(name)
69
75
  #
70
76
  # @return [void]
71
77
  def hide
72
78
  super
73
79
 
74
- Vedeu.buffers.by_name(name).hide
80
+ Vedeu.trigger(:_clear_view_, name)
75
81
  end
76
82
 
77
- # Show the named interface buffer, or without a name, the buffer
78
- # of the currently focussed interface.
83
+ # Show the named interface.
84
+ #
85
+ # Will hide the named interface. If the interface is currently
86
+ # visible, it will be cleared- rendered blank. To show the
87
+ # interface, the ':_show_interface_' event should be triggered.
88
+ # Triggering the ':_hide_group_' event to which this named
89
+ # interface belongs will also hide the interface.
79
90
  #
80
91
  # @example
92
+ # Vedeu.trigger(:_show_interface_, name)
81
93
  # Vedeu.show_interface(name)
82
94
  #
83
95
  # @return [void]
84
96
  def show
85
97
  super
86
98
 
87
- Vedeu.buffers.by_name(name).show
99
+ Vedeu.trigger(:_refresh_view_, name)
88
100
  end
89
101
 
90
102
  private
@@ -78,16 +78,9 @@ module Vedeu
78
78
 
79
79
  # @return [Array<Array<Vedeu::Views::Char>>]
80
80
  def render
81
- return [] unless visible?
81
+ Vedeu.trigger(:_clear_view_content_, name)
82
82
 
83
- Vedeu.trigger(:_clear_view_, name)
84
-
85
- output = [
86
- Vedeu::Output::Viewport.render(self),
87
- Vedeu.borders.by_name(name).render,
88
- ]
89
-
90
- output
83
+ Vedeu::Output::Viewport.render(self)
91
84
  end
92
85
 
93
86
  # Store the view and immediately refresh it; causing to be
@@ -11,6 +11,7 @@ module Vedeu
11
11
  # Clear the interface with the given name.
12
12
  #
13
13
  # @example
14
+ # Vedeu.trigger(:_clear_view_, name)
14
15
  # Vedeu.clear_by_name(name)
15
16
  #
16
17
  # @return [Array<Array<Vedeu::Views::Char>>]
@@ -21,14 +22,31 @@ module Vedeu
21
22
  alias_method :clear_by_name, :render
22
23
  alias_method :by_name, :render
23
24
 
25
+ # Clear the content of the interface with the given name.
26
+ #
27
+ # @example
28
+ # Vedeu.trigger(:_clear_view_content_, name)
29
+ # Vedeu.clear_content_by_name(name)
30
+ #
31
+ # @return [Array<Array<Vedeu::Views::Char>>]
32
+ # @see #initialize
33
+ def clear_content_by_name(name)
34
+ new(name, content_only: true).render
35
+ end
36
+
24
37
  end # Eigenclass
25
38
 
26
39
  # Return a new instance of Vedeu::Clear::Interface.
27
40
  #
28
- # @param name [String|Symbol] The name of the interface to clear.
41
+ # @param name [String|Symbol] The name of the interface to
42
+ # clear.
43
+ # @param options [Hash]
44
+ # @option options content_only [Boolean] Only clear the content
45
+ # not the border as well. Defaults to false.
29
46
  # @return [Vedeu::Clear::Interface]
30
- def initialize(name)
31
- @name = name
47
+ def initialize(name, options = {})
48
+ @name = name
49
+ @options = options
32
50
  end
33
51
 
34
52
  # @return [Array<Array<Vedeu::Views::Char>>]
@@ -44,16 +62,50 @@ module Vedeu
44
62
 
45
63
  private
46
64
 
65
+ # @see Vedeu::Borders::Repository#by_name
66
+ def border
67
+ @border ||= Vedeu.borders.by_name(name)
68
+ end
69
+
70
+ # @return [Vedeu::Colours::Colour]
71
+ def colour
72
+ interface.colour
73
+ end
74
+
75
+ # @return [Boolean]
76
+ def content_only?
77
+ options[:content_only]
78
+ end
79
+
80
+ # @return [Hash<Symbol => Boolean>]
81
+ def defaults
82
+ {
83
+ content_only: false,
84
+ }
85
+ end
86
+
47
87
  # @see Vedeu::Geometry::Repository#by_name
48
88
  def geometry
49
89
  @geometry ||= Vedeu.geometries.by_name(name)
50
90
  end
51
91
 
92
+ # @return [Fixnum]
93
+ def height
94
+ return border.height if content_only?
95
+
96
+ geometry.height
97
+ end
98
+
52
99
  # @see Vedeu::Models::Interfaces#by_name
53
100
  def interface
54
101
  @interface ||= Vedeu.interfaces.by_name(name)
55
102
  end
56
103
 
104
+ # @return [Hash<Symbol => Boolean>]
105
+ def options
106
+ defaults.merge!(@options)
107
+ end
108
+
57
109
  # For each visible line of the interface, set the foreground and
58
110
  # background colours to those specified when the interface was
59
111
  # defined, then starting write space characters over the area
@@ -61,12 +113,12 @@ module Vedeu
61
113
  #
62
114
  # @return [Array<Array<Vedeu::Views::Char>>]
63
115
  def output
64
- Vedeu.timer("Clearing: '#{name}'") do
65
- @y = geometry.y
66
- @x = geometry.x
67
- @width = geometry.width
68
- @height = geometry.height
69
- @colour = interface.colour
116
+ Vedeu.timer("Clearing #{clearing}: '#{name}'") do
117
+ @y = y
118
+ @x = x
119
+ @width = width
120
+ @height = height
121
+ @colour = colour
70
122
 
71
123
  @clear ||= Array.new(@height) do |iy|
72
124
  Array.new(@width) do |ix|
@@ -78,6 +130,34 @@ module Vedeu
78
130
  end
79
131
  end
80
132
 
133
+ # @return [String]
134
+ def clearing
135
+ return '(content only)' if content_only?
136
+
137
+ '(all)'
138
+ end
139
+
140
+ # @return [Fixnum]
141
+ def width
142
+ return border.width if content_only?
143
+
144
+ geometry.width
145
+ end
146
+
147
+ # @return [Fixnum]
148
+ def y
149
+ return border.by if content_only?
150
+
151
+ geometry.y
152
+ end
153
+
154
+ # @return [Fixnum]
155
+ def x
156
+ return border.bx if content_only?
157
+
158
+ geometry.x
159
+ end
160
+
81
161
  end # Interface
82
162
 
83
163
  end # Clear
@@ -86,4 +166,8 @@ module Vedeu
86
166
  # @see Vedeu::Clear::Interface.render
87
167
  def_delegators Vedeu::Clear::Interface, :clear_by_name
88
168
 
169
+ # @!method clear_content_by_name
170
+ # @see Vedeu::Clear::Interface.clear_content_by_name
171
+ def_delegators Vedeu::Clear::Interface, :clear_content_by_name
172
+
89
173
  end # Vedeu
@@ -26,8 +26,6 @@ module Vedeu
26
26
 
27
27
  # @return [String]
28
28
  def write
29
- Vedeu.log(type: :output,
30
- message: 'Directly writing output to terminal.')
31
29
  Vedeu::Terminal.output(output)
32
30
 
33
31
  output
@@ -42,29 +42,16 @@ module Vedeu
42
42
 
43
43
  # Returns the content for the view.
44
44
  #
45
- # @return [Array<Array<String>>]
45
+ # @return [Array<Array<String>>|NilClass]
46
46
  def render
47
- return [] unless visible?
48
-
49
- Vedeu.timer("Rendering: '#{name}'") do
50
- out = []
51
-
52
- show.each_with_index do |line, iy|
53
- line.each_with_index do |column, ix|
54
- column.position = [by + iy, bx + ix]
55
- out << column
56
- end
57
- end
58
-
59
- out
60
- end
47
+ Vedeu::Output::Output.render(output) if visible?
61
48
  end
62
49
 
63
50
  # Returns a string representation of the viewport.
64
51
  #
65
52
  # @return [String]
66
53
  def to_s
67
- render.map(&:to_s).join("\n")
54
+ Array(render).map(&:to_s).join("\n")
68
55
  end
69
56
  alias_method :to_str, :to_s
70
57
 
@@ -76,6 +63,21 @@ module Vedeu
76
63
 
77
64
  private
78
65
 
66
+ def output
67
+ Vedeu.timer("Rendering: '#{name}'") do
68
+ out = []
69
+
70
+ show.each_with_index do |line, iy|
71
+ line.each_with_index do |column, ix|
72
+ column.position = [by + iy, bx + ix]
73
+ out << column
74
+ end
75
+ end
76
+
77
+ out
78
+ end
79
+ end
80
+
79
81
  # Returns the visible content for the view.
80
82
  #
81
83
  # @note If there are no lines of content, we return an empty