vedeu 0.6.14 → 0.6.15
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Rakefile +8 -8
- data/docs/events/system.md +0 -27
- data/docs/events/view.md +23 -0
- data/docs/events/visibility.md +7 -0
- data/docs/events.md +3 -0
- data/lib/vedeu/application/controller.rb +1 -1
- data/lib/vedeu/bindings/all.rb +1 -0
- data/lib/vedeu/bindings/bindings.rb +1 -0
- data/lib/vedeu/bindings/system.rb +0 -36
- data/lib/vedeu/bindings/view.rb +50 -0
- data/lib/vedeu/bindings/visibility.rb +14 -0
- data/lib/vedeu/buffers/buffer.rb +1 -8
- data/lib/vedeu/cursors/cursor.rb +29 -21
- data/lib/vedeu/cursors/refresh.rb +1 -1
- data/lib/vedeu/editor/cursor.rb +2 -2
- data/lib/vedeu/geometry/geometry.rb +36 -46
- data/lib/vedeu/logging/mono_logger.rb +1 -0
- data/lib/vedeu/models/views/view.rb +2 -1
- data/lib/vedeu/output/clear/named_interface.rb +1 -1
- data/lib/vedeu/version.rb +1 -1
- data/test/lib/vedeu/bindings/system_test.rb +0 -4
- data/test/lib/vedeu/bindings/view_test.rb +19 -0
- data/test/lib/vedeu/bindings/visibility_test.rb +1 -0
- data/test/lib/vedeu/buffers/buffer_test.rb +6 -21
- data/test/lib/vedeu/cursors/cursor_test.rb +22 -2
- data/test/lib/vedeu/geometry/geometry_test.rb +20 -0
- data/test/lib/vedeu/output/clear/named_interface_test.rb +13 -8
- data/test/support/examples/material_colours_app.rb +62 -0
- data/test/test_helper.rb +11 -11
- data/vedeu.gemspec +2 -3
- metadata +10 -8
- data/test/support/average_duration_reporter.rb +0 -201
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 7229836cd42c82c006486c2f7ed0022ec046d221
|
4
|
+
data.tar.gz: 1ae9b7c3569417d567f5f0efef7ad3122ed4002f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 55f86239b851af40caea7a418f4c6d540a1646d9cf716334e36ee4efc01076af59cdc866a44524f09b98be3cad760ca00c0a410dd34a9b839651a964f803ecb8
|
7
|
+
data.tar.gz: 3b75c1b0e8e30de1ce8ea0d41b0aeee735b193a22aa2c53a73a2b8e214a06efe84a83ecf9385a31a896ad8958471700049cca651f9c35fa9b8990677e333fce4
|
data/Rakefile
CHANGED
@@ -3,16 +3,16 @@ require 'rake/testtask'
|
|
3
3
|
require 'yard'
|
4
4
|
require 'rubocop/rake_task'
|
5
5
|
|
6
|
-
Rake::TestTask.new(:test) do |
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
6
|
+
Rake::TestTask.new(:test) do |task|
|
7
|
+
task.libs.push 'lib'
|
8
|
+
task.libs.push 'test'
|
9
|
+
task.pattern = 'test/**/*_test.rb'
|
10
|
+
task.verbose = false
|
11
|
+
task.warning = true # set to true for Ruby warnings (ruby -w)
|
12
12
|
end
|
13
13
|
|
14
|
-
YARD::Rake::YardocTask.new(:yard) do |
|
15
|
-
|
14
|
+
YARD::Rake::YardocTask.new(:yard) do |task|
|
15
|
+
task.files = [
|
16
16
|
'lib/**/*.rb',
|
17
17
|
'-',
|
18
18
|
'docs/api.md',
|
data/docs/events/system.md
CHANGED
@@ -10,13 +10,6 @@ popular here.
|
|
10
10
|
|
11
11
|
Vedeu.trigger(:_exit_)
|
12
12
|
|
13
|
-
### :_clear_
|
14
|
-
Clears the whole terminal space, or when a name is given, the named
|
15
|
-
interface area will be cleared.
|
16
|
-
|
17
|
-
Vedeu.trigger(:_clear_)
|
18
|
-
Vedeu.clear_by_name(name)
|
19
|
-
|
20
13
|
### :_command_
|
21
14
|
Will cause the triggering of the `:command` event; which you should
|
22
15
|
define to 'do things'.
|
@@ -60,13 +53,6 @@ logging is enabled in the configuration.
|
|
60
53
|
|
61
54
|
Vedeu.trigger(:_log_, message)
|
62
55
|
|
63
|
-
### :_maximise_
|
64
|
-
Maximising an interface.
|
65
|
-
|
66
|
-
Vedeu.trigger(:_maximise_, name)
|
67
|
-
|
68
|
-
See {Vedeu::Geometry::Geometry#maximise}
|
69
|
-
|
70
56
|
### :_mode_switch_
|
71
57
|
When triggered (by default, after the user presses `escape`), Vedeu
|
72
58
|
switches between modes of the terminal. The idea here being
|
@@ -75,16 +61,3 @@ modes allow the user to enter more elaborate commands- such as commands
|
|
75
61
|
with arguments.
|
76
62
|
|
77
63
|
Vedeu.trigger(:_mode_switch_)
|
78
|
-
|
79
|
-
### :_resize_
|
80
|
-
When triggered will cause Vedeu to trigger the `:_clear_` and
|
81
|
-
`:_refresh_` events. Please see those events for their behaviour.
|
82
|
-
|
83
|
-
Vedeu.trigger(:_resize_)
|
84
|
-
|
85
|
-
### :_unmaximise_
|
86
|
-
Unmaximising an interface.
|
87
|
-
|
88
|
-
Vedeu.trigger(:_unmaximise_, name)
|
89
|
-
|
90
|
-
See {Vedeu::Geometry::Geometry#unmaximise}
|
data/docs/events/view.md
ADDED
@@ -0,0 +1,23 @@
|
|
1
|
+
# @title Vedeu View Events
|
2
|
+
|
3
|
+
## View Events
|
4
|
+
|
5
|
+
### :_maximise_
|
6
|
+
Maximising an interface.
|
7
|
+
|
8
|
+
Vedeu.trigger(:_maximise_, name)
|
9
|
+
|
10
|
+
See {Vedeu::Geometry::Geometry#maximise}
|
11
|
+
|
12
|
+
### :_resize_
|
13
|
+
When triggered will cause Vedeu to trigger the `:_clear_` and
|
14
|
+
`:_refresh_` events. Please see those events for their behaviour.
|
15
|
+
|
16
|
+
Vedeu.trigger(:_resize_)
|
17
|
+
|
18
|
+
### :_unmaximise_
|
19
|
+
Unmaximising an interface.
|
20
|
+
|
21
|
+
Vedeu.trigger(:_unmaximise_, name)
|
22
|
+
|
23
|
+
See {Vedeu::Geometry::Geometry#unmaximise}
|
data/docs/events/visibility.md
CHANGED
@@ -2,6 +2,13 @@
|
|
2
2
|
|
3
3
|
## Visibility Events
|
4
4
|
|
5
|
+
### :_clear_
|
6
|
+
Clears the whole terminal space, or when a name is given, the named
|
7
|
+
interface area will be cleared.
|
8
|
+
|
9
|
+
Vedeu.trigger(:_clear_)
|
10
|
+
Vedeu.clear_by_name(name)
|
11
|
+
|
5
12
|
### :_clear_group_
|
6
13
|
Clears the spaces occupied by the interfaces belonging to the named
|
7
14
|
group.
|
data/docs/events.md
CHANGED
data/lib/vedeu/bindings/all.rb
CHANGED
@@ -14,17 +14,13 @@ module Vedeu
|
|
14
14
|
# @return [TrueClass]
|
15
15
|
def setup!
|
16
16
|
cleanup!
|
17
|
-
clear!
|
18
17
|
command!
|
19
18
|
editor!
|
20
19
|
exit!
|
21
20
|
initialize!
|
22
21
|
keypress!
|
23
22
|
log!
|
24
|
-
maximise!
|
25
23
|
mode_switch!
|
26
|
-
resize!
|
27
|
-
unmaximise!
|
28
24
|
end
|
29
25
|
|
30
26
|
private
|
@@ -39,19 +35,6 @@ module Vedeu
|
|
39
35
|
end
|
40
36
|
end
|
41
37
|
|
42
|
-
# See {file:docs/events/system.md#\_cleanup_}
|
43
|
-
def clear!
|
44
|
-
Vedeu.bind(:_clear_) do |name|
|
45
|
-
if name
|
46
|
-
Vedeu::Clear::NamedInterface.render(name)
|
47
|
-
|
48
|
-
else
|
49
|
-
Vedeu::Terminal::Buffer.clear
|
50
|
-
|
51
|
-
end
|
52
|
-
end
|
53
|
-
end
|
54
|
-
|
55
38
|
# See {file:docs/events/system.md#\_command_}
|
56
39
|
def command!
|
57
40
|
Vedeu.bind(:_command_) { |command| Vedeu.trigger(:command, command) }
|
@@ -84,30 +67,11 @@ module Vedeu
|
|
84
67
|
Vedeu.bind(:_log_) { |msg| Vedeu.log(type: :debug, message: msg) }
|
85
68
|
end
|
86
69
|
|
87
|
-
# See {file:docs/events/system.md#\_maximise_}
|
88
|
-
def maximise!
|
89
|
-
Vedeu.bind(:_maximise_) do |name|
|
90
|
-
Vedeu.geometries.by_name(name).maximise
|
91
|
-
end
|
92
|
-
end
|
93
|
-
|
94
70
|
# See {file:docs/events/system.md#\_mode_switch_}
|
95
71
|
def mode_switch!
|
96
72
|
Vedeu.bind(:_mode_switch_) { fail Vedeu::Error::ModeSwitch }
|
97
73
|
end
|
98
74
|
|
99
|
-
# See {file:docs/events/system.md#\_resize_}
|
100
|
-
def resize!
|
101
|
-
Vedeu.bind(:_resize_, delay: 0.25) { Vedeu.resize }
|
102
|
-
end
|
103
|
-
|
104
|
-
# See {file:docs/events/system.md#\_unmaximise_}
|
105
|
-
def unmaximise!
|
106
|
-
Vedeu.bind(:_unmaximise_) do |name|
|
107
|
-
Vedeu.geometries.by_name(name).unmaximise
|
108
|
-
end
|
109
|
-
end
|
110
|
-
|
111
75
|
# :nocov:
|
112
76
|
|
113
77
|
end # System
|
@@ -0,0 +1,50 @@
|
|
1
|
+
module Vedeu
|
2
|
+
|
3
|
+
module Bindings
|
4
|
+
|
5
|
+
# System events relating to the view.
|
6
|
+
#
|
7
|
+
module View
|
8
|
+
|
9
|
+
extend self
|
10
|
+
|
11
|
+
# Setup events relating to client applications. This method is
|
12
|
+
# called by Vedeu.
|
13
|
+
#
|
14
|
+
# @return [TrueClass]
|
15
|
+
def setup!
|
16
|
+
maximise!
|
17
|
+
resize!
|
18
|
+
unmaximise!
|
19
|
+
end
|
20
|
+
|
21
|
+
private
|
22
|
+
|
23
|
+
# :nocov:
|
24
|
+
|
25
|
+
# See {file:docs/events/view.md#\_maximise_}
|
26
|
+
def maximise!
|
27
|
+
Vedeu.bind(:_maximise_) do |name|
|
28
|
+
Vedeu.geometries.by_name(name).maximise
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
# See {file:docs/events/view.md#\_resize_}
|
33
|
+
def resize!
|
34
|
+
Vedeu.bind(:_resize_, delay: 0.25) { Vedeu.resize }
|
35
|
+
end
|
36
|
+
|
37
|
+
# See {file:docs/events/view.md#\_unmaximise_}
|
38
|
+
def unmaximise!
|
39
|
+
Vedeu.bind(:_unmaximise_) do |name|
|
40
|
+
Vedeu.geometries.by_name(name).unmaximise
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
# :nocov:
|
45
|
+
|
46
|
+
end # View
|
47
|
+
|
48
|
+
end # Bindings
|
49
|
+
|
50
|
+
end # Vedeu
|
@@ -14,6 +14,7 @@ module Vedeu
|
|
14
14
|
#
|
15
15
|
# @return [TrueClass]
|
16
16
|
def setup!
|
17
|
+
clear!
|
17
18
|
clear_group!
|
18
19
|
hide_cursor!
|
19
20
|
hide_group!
|
@@ -30,6 +31,19 @@ module Vedeu
|
|
30
31
|
|
31
32
|
# :nocov:
|
32
33
|
|
34
|
+
# See {file:docs/events/system.md#\_cleanup_}
|
35
|
+
def clear!
|
36
|
+
Vedeu.bind(:_clear_) do |name|
|
37
|
+
if name
|
38
|
+
Vedeu::Clear::NamedInterface.render(name)
|
39
|
+
|
40
|
+
else
|
41
|
+
Vedeu::Terminal::Buffer.clear
|
42
|
+
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
33
47
|
# See {file:docs/events/visibility.md#\_clear_group_}
|
34
48
|
def clear_group!
|
35
49
|
Vedeu.bind(:_clear_group_) do |name|
|
data/lib/vedeu/buffers/buffer.rb
CHANGED
@@ -74,13 +74,6 @@ module Vedeu
|
|
74
74
|
true
|
75
75
|
end
|
76
76
|
|
77
|
-
# Clear the buffer.
|
78
|
-
#
|
79
|
-
# @return [Array<Array<Vedeu::Views::Char>>]
|
80
|
-
def clear
|
81
|
-
Vedeu::Output::Output.render(Vedeu::Clear::NamedInterface.render(name))
|
82
|
-
end
|
83
|
-
|
84
77
|
# Return a boolean indicating content presence on the buffer
|
85
78
|
# type.
|
86
79
|
#
|
@@ -115,7 +108,7 @@ module Vedeu
|
|
115
108
|
#
|
116
109
|
# @return [Array<Array<Array<Vedeu::Views::Char>>>]
|
117
110
|
def hide
|
118
|
-
Vedeu
|
111
|
+
Vedeu.trigger(:_clear_, name)
|
119
112
|
end
|
120
113
|
|
121
114
|
# Return the content for this buffer.
|
data/lib/vedeu/cursors/cursor.rb
CHANGED
@@ -45,6 +45,12 @@ module Vedeu
|
|
45
45
|
# @return [Fixnum]
|
46
46
|
attr_writer :y
|
47
47
|
|
48
|
+
# @param attributes [Hash] See #initialize
|
49
|
+
# @return [Vedeu::Cursors::Cursor]
|
50
|
+
def self.store(attributes)
|
51
|
+
new(attributes).store
|
52
|
+
end
|
53
|
+
|
48
54
|
# Returns a new instance of Vedeu::Cursors::Cursor.
|
49
55
|
#
|
50
56
|
# @param attributes [Hash]
|
@@ -60,7 +66,6 @@ module Vedeu
|
|
60
66
|
# the cursor.
|
61
67
|
# @option attributes y [Fixnum] The terminal y coordinate for
|
62
68
|
# the cursor.
|
63
|
-
#
|
64
69
|
# @return [Vedeu::Cursors::Cursor]
|
65
70
|
def initialize(attributes = {})
|
66
71
|
@attributes = defaults.merge!(attributes)
|
@@ -70,15 +75,23 @@ module Vedeu
|
|
70
75
|
end
|
71
76
|
end
|
72
77
|
|
78
|
+
# An object is equal when its values are the same.
|
79
|
+
#
|
80
|
+
# @param other [Vedeu::Cursors::Cursor]
|
81
|
+
# @return [Boolean]
|
82
|
+
def eql?(other)
|
83
|
+
self.class == other.class && name == other.name
|
84
|
+
end
|
85
|
+
alias_method :==, :eql?
|
86
|
+
|
73
87
|
# Moves the cursor down by one row.
|
74
88
|
#
|
75
89
|
# @return [Vedeu::Cursors::Cursor]
|
76
90
|
def move_down
|
77
91
|
@oy += 1
|
78
92
|
|
79
|
-
|
80
|
-
|
81
|
-
Vedeu::Cursors::Cursor.new(@attributes).store
|
93
|
+
Vedeu::Cursors::Cursor.store(
|
94
|
+
new_attributes(coordinate.y_position, x, oy, ox))
|
82
95
|
end
|
83
96
|
|
84
97
|
# Moves the cursor left by one column.
|
@@ -87,18 +100,16 @@ module Vedeu
|
|
87
100
|
def move_left
|
88
101
|
@ox -= 1
|
89
102
|
|
90
|
-
|
91
|
-
|
92
|
-
Vedeu::Cursors::Cursor.new(@attributes).store
|
103
|
+
Vedeu::Cursors::Cursor.store(
|
104
|
+
new_attributes(y, coordinate.x_position, oy, ox))
|
93
105
|
end
|
94
106
|
|
95
107
|
# Moves the cursor to the top left of the named interface.
|
96
108
|
#
|
97
109
|
# @return [Vedeu::Cursors::Cursor]
|
98
110
|
def move_origin
|
99
|
-
|
100
|
-
|
101
|
-
Vedeu::Cursors::Cursor.new(@attributes).store
|
111
|
+
Vedeu::Cursors::Cursor.store(
|
112
|
+
attributes.merge!(x: bx, y: by, ox: 0, oy: 0))
|
102
113
|
end
|
103
114
|
|
104
115
|
# Moves the cursor right by one column.
|
@@ -107,9 +118,8 @@ module Vedeu
|
|
107
118
|
def move_right
|
108
119
|
@ox += 1
|
109
120
|
|
110
|
-
|
111
|
-
|
112
|
-
Vedeu::Cursors::Cursor.new(@attributes).store
|
121
|
+
Vedeu::Cursors::Cursor.store(
|
122
|
+
new_attributes(y, coordinate.x_position, oy, ox))
|
113
123
|
end
|
114
124
|
|
115
125
|
# Moves the cursor up by one row.
|
@@ -118,9 +128,8 @@ module Vedeu
|
|
118
128
|
def move_up
|
119
129
|
@oy -= 1
|
120
130
|
|
121
|
-
|
122
|
-
|
123
|
-
Vedeu::Cursors::Cursor.new(@attributes).store
|
131
|
+
Vedeu::Cursors::Cursor.store(
|
132
|
+
new_attributes(coordinate.y_position, x, oy, ox))
|
124
133
|
end
|
125
134
|
|
126
135
|
# Renders the cursor.
|
@@ -136,12 +145,11 @@ module Vedeu
|
|
136
145
|
# @param new_ox [Fixnum] The column/character position.
|
137
146
|
# @return [Vedeu::Cursors::Cursor]
|
138
147
|
def reposition(new_oy, new_ox)
|
139
|
-
@
|
140
|
-
|
141
|
-
new_oy,
|
142
|
-
new_ox)
|
148
|
+
@oy = new_oy
|
149
|
+
@ox = new_ox
|
143
150
|
|
144
|
-
Vedeu::Cursors::Cursor.
|
151
|
+
Vedeu::Cursors::Cursor.store(
|
152
|
+
new_attributes(coordinate.y_position, coordinate.x_position, oy, ox))
|
145
153
|
end
|
146
154
|
|
147
155
|
# Returns an escape sequence to position the cursor and set its
|
data/lib/vedeu/editor/cursor.rb
CHANGED
@@ -33,11 +33,11 @@ module Vedeu
|
|
33
33
|
|
34
34
|
# @!attribute [rw] x
|
35
35
|
# @return [Fixnum]
|
36
|
-
|
36
|
+
attr_writer :x
|
37
37
|
|
38
38
|
# @!attribute [rw] y
|
39
39
|
# @return [Fixnum]
|
40
|
-
|
40
|
+
attr_writer :y
|
41
41
|
|
42
42
|
# Returns a new instance of Vedeu::Editor::Cursor.
|
43
43
|
#
|
@@ -72,6 +72,12 @@ module Vedeu
|
|
72
72
|
# @return [Fixnum]
|
73
73
|
attr_writer :yn
|
74
74
|
|
75
|
+
# @param attributes [Hash] See #initialize
|
76
|
+
# @return [Vedeu::Geometry::Geometry]
|
77
|
+
def self.store(attributes)
|
78
|
+
new(attributes).store
|
79
|
+
end
|
80
|
+
|
75
81
|
# Returns a new instance of Vedeu::Geometry::Geometry.
|
76
82
|
#
|
77
83
|
# @param attributes [Hash]
|
@@ -94,6 +100,15 @@ module Vedeu
|
|
94
100
|
end
|
95
101
|
end
|
96
102
|
|
103
|
+
# An object is equal when its values are the same.
|
104
|
+
#
|
105
|
+
# @param other [Vedeu::Geometry::Geometry]
|
106
|
+
# @return [Boolean]
|
107
|
+
def eql?(other)
|
108
|
+
self.class == other.class && name == other.name
|
109
|
+
end
|
110
|
+
alias_method :==, :eql?
|
111
|
+
|
97
112
|
# Will maximise the named interface geometry. This means it will
|
98
113
|
# occupy all of the available space on the terminal window.
|
99
114
|
#
|
@@ -128,15 +143,7 @@ module Vedeu
|
|
128
143
|
dyn = yn + 1
|
129
144
|
end
|
130
145
|
|
131
|
-
|
132
|
-
centred: false,
|
133
|
-
maximised: false,
|
134
|
-
x: x,
|
135
|
-
xn: xn,
|
136
|
-
y: dy,
|
137
|
-
yn: dyn,
|
138
|
-
)
|
139
|
-
Vedeu::Geometry::Geometry.new(@attributes).store
|
146
|
+
Vedeu::Geometry::Geometry.store(move_attributes.merge!(y: dy, yn: dyn))
|
140
147
|
end
|
141
148
|
|
142
149
|
# Moves the geometry left by one column.
|
@@ -152,15 +159,7 @@ module Vedeu
|
|
152
159
|
dxn = xn - 1
|
153
160
|
end
|
154
161
|
|
155
|
-
|
156
|
-
centred: false,
|
157
|
-
maximised: false,
|
158
|
-
x: dx,
|
159
|
-
xn: dxn,
|
160
|
-
y: y,
|
161
|
-
yn: yn,
|
162
|
-
)
|
163
|
-
Vedeu::Geometry::Geometry.new(@attributes).store
|
162
|
+
Vedeu::Geometry::Geometry.store(move_attributes.merge!(x: dx, xn: dxn))
|
164
163
|
end
|
165
164
|
|
166
165
|
# Moves the geometry to the top left of the terminal.
|
@@ -168,15 +167,11 @@ module Vedeu
|
|
168
167
|
# TODO: Move cursor also.
|
169
168
|
# @return [Vedeu::Geometry::Geometry]
|
170
169
|
def move_origin
|
171
|
-
|
172
|
-
|
173
|
-
|
174
|
-
|
175
|
-
|
176
|
-
y: 1,
|
177
|
-
yn: yn - y + 1,
|
178
|
-
)
|
179
|
-
Vedeu::Geometry::Geometry.new(@attributes).store
|
170
|
+
Vedeu::Geometry::Geometry.store(
|
171
|
+
move_attributes.merge!(x: 1,
|
172
|
+
xn: (xn - x + 1),
|
173
|
+
y: 1,
|
174
|
+
yn: (yn - y + 1)))
|
180
175
|
end
|
181
176
|
|
182
177
|
# Moves the geometry right by one column.
|
@@ -192,15 +187,7 @@ module Vedeu
|
|
192
187
|
dxn = xn + 1
|
193
188
|
end
|
194
189
|
|
195
|
-
|
196
|
-
centred: false,
|
197
|
-
maximised: false,
|
198
|
-
x: dx,
|
199
|
-
xn: dxn,
|
200
|
-
y: y,
|
201
|
-
yn: yn,
|
202
|
-
)
|
203
|
-
Vedeu::Geometry::Geometry.new(@attributes).store
|
190
|
+
Vedeu::Geometry::Geometry.store(move_attributes.merge!(x: dx, xn: dxn))
|
204
191
|
end
|
205
192
|
|
206
193
|
# Moves the geometry up by one column.
|
@@ -216,15 +203,7 @@ module Vedeu
|
|
216
203
|
dyn = yn - 1
|
217
204
|
end
|
218
205
|
|
219
|
-
|
220
|
-
centred: false,
|
221
|
-
maximised: false,
|
222
|
-
x: x,
|
223
|
-
xn: xn,
|
224
|
-
y: dy,
|
225
|
-
yn: dyn,
|
226
|
-
)
|
227
|
-
Vedeu::Geometry::Geometry.new(@attributes).store
|
206
|
+
Vedeu::Geometry::Geometry.store(move_attributes.merge!(y: dy, yn: dyn))
|
228
207
|
end
|
229
208
|
|
230
209
|
# Will unmaximise the named interface geometry. Previously, when
|
@@ -258,7 +237,7 @@ module Vedeu
|
|
258
237
|
@area = Vedeu::Geometry::Area.from_attributes(area_attributes)
|
259
238
|
end
|
260
239
|
|
261
|
-
# @return [Hash<Symbol =>
|
240
|
+
# @return [Hash<Symbol => Boolean, Fixnum>]
|
262
241
|
def area_attributes
|
263
242
|
{
|
264
243
|
y: _y,
|
@@ -274,6 +253,17 @@ module Vedeu
|
|
274
253
|
}
|
275
254
|
end
|
276
255
|
|
256
|
+
# @return [Hash<Symbol => Boolean, Fixnum>]
|
257
|
+
def move_attributes
|
258
|
+
@attributes.merge(
|
259
|
+
centred: false,
|
260
|
+
maximised: false,
|
261
|
+
x: x,
|
262
|
+
xn: xn,
|
263
|
+
y: y,
|
264
|
+
yn: yn)
|
265
|
+
end
|
266
|
+
|
277
267
|
# Returns the row/line start position for the interface.
|
278
268
|
#
|
279
269
|
# @return [Fixnum]
|
data/lib/vedeu/version.rb
CHANGED
@@ -8,17 +8,13 @@ module Vedeu
|
|
8
8
|
|
9
9
|
context 'the system events needed by Vedeu to run are defined' do
|
10
10
|
it { Vedeu.bound?(:_cleanup_).must_equal(true) }
|
11
|
-
it { Vedeu.bound?(:_clear_).must_equal(true) }
|
12
11
|
it { Vedeu.bound?(:_command_).must_equal(true) }
|
13
12
|
it { Vedeu.bound?(:_editor_).must_equal(true) }
|
14
13
|
it { Vedeu.bound?(:_exit_).must_equal(true) }
|
15
14
|
it { Vedeu.bound?(:_initialize_).must_equal(true) }
|
16
15
|
it { Vedeu.bound?(:_keypress_).must_equal(true) }
|
17
16
|
it { Vedeu.bound?(:_log_).must_equal(true) }
|
18
|
-
it { Vedeu.bound?(:_maximise_).must_equal(true) }
|
19
17
|
it { Vedeu.bound?(:_mode_switch_).must_equal(true) }
|
20
|
-
it { Vedeu.bound?(:_resize_).must_equal(true) }
|
21
|
-
it { Vedeu.bound?(:_unmaximise_).must_equal(true) }
|
22
18
|
end
|
23
19
|
|
24
20
|
end # System
|
@@ -0,0 +1,19 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
module Vedeu
|
4
|
+
|
5
|
+
module Bindings
|
6
|
+
|
7
|
+
describe View do
|
8
|
+
|
9
|
+
context 'the system events needed by Vedeu to run are defined' do
|
10
|
+
it { Vedeu.bound?(:_maximise_).must_equal(true) }
|
11
|
+
it { Vedeu.bound?(:_resize_).must_equal(true) }
|
12
|
+
it { Vedeu.bound?(:_unmaximise_).must_equal(true) }
|
13
|
+
end
|
14
|
+
|
15
|
+
end # View
|
16
|
+
|
17
|
+
end # Bindings
|
18
|
+
|
19
|
+
end # Vedeu
|
@@ -69,24 +69,6 @@ module Vedeu
|
|
69
69
|
end
|
70
70
|
end
|
71
71
|
|
72
|
-
describe '#clear' do
|
73
|
-
let(:emptiness) { mock }
|
74
|
-
|
75
|
-
before do
|
76
|
-
Vedeu::Clear::NamedInterface.stubs(:render).returns(emptiness)
|
77
|
-
Vedeu::Output::Output.stubs(:render).returns(emptiness)
|
78
|
-
end
|
79
|
-
|
80
|
-
subject { instance.clear }
|
81
|
-
|
82
|
-
it {
|
83
|
-
Vedeu::Clear::NamedInterface.expects(:render).with(_name).
|
84
|
-
returns(emptiness)
|
85
|
-
Vedeu::Output::Output.expects(:render).with(emptiness)
|
86
|
-
subject
|
87
|
-
}
|
88
|
-
end
|
89
|
-
|
90
72
|
describe '#front?' do
|
91
73
|
subject { instance.front? }
|
92
74
|
|
@@ -120,18 +102,21 @@ module Vedeu
|
|
120
102
|
end
|
121
103
|
|
122
104
|
describe '#hide' do
|
123
|
-
before { Vedeu
|
105
|
+
before { Vedeu.stubs(:trigger) }
|
124
106
|
|
125
107
|
subject { instance.hide }
|
126
108
|
|
127
109
|
it {
|
128
|
-
Vedeu
|
110
|
+
Vedeu.expects(:trigger).with(:_clear_, _name)
|
129
111
|
subject
|
130
112
|
}
|
131
113
|
end
|
132
114
|
|
133
115
|
describe '#show' do
|
134
|
-
before
|
116
|
+
before do
|
117
|
+
# Vedeu::Clear::NamedInterface.stubs(:render)
|
118
|
+
Vedeu::Output::Output.stubs(:render)
|
119
|
+
end
|
135
120
|
|
136
121
|
subject { instance.show }
|
137
122
|
|
@@ -72,6 +72,26 @@ module Vedeu
|
|
72
72
|
it { instance.must_respond_to(:y=) }
|
73
73
|
end
|
74
74
|
|
75
|
+
describe '.store' do
|
76
|
+
subject { described.store(attributes) }
|
77
|
+
|
78
|
+
it { subject.must_equal(instance) }
|
79
|
+
end
|
80
|
+
|
81
|
+
describe '#eql?' do
|
82
|
+
let(:other) { instance }
|
83
|
+
|
84
|
+
subject { instance.eql?(other) }
|
85
|
+
|
86
|
+
it { subject.must_equal(true) }
|
87
|
+
|
88
|
+
context 'when different to other' do
|
89
|
+
let(:other) { described.new(name: 'other_cursor') }
|
90
|
+
|
91
|
+
it { subject.must_equal(false) }
|
92
|
+
end
|
93
|
+
end
|
94
|
+
|
75
95
|
describe '#hide' do
|
76
96
|
let(:visible) { true }
|
77
97
|
let(:hide_cursor) {
|
@@ -224,8 +244,8 @@ module Vedeu
|
|
224
244
|
|
225
245
|
it { subject.must_be_instance_of(described) }
|
226
246
|
|
227
|
-
it { subject.x.must_equal(
|
228
|
-
it { subject.y.must_equal(
|
247
|
+
it { subject.x.must_equal(10) }
|
248
|
+
it { subject.y.must_equal(8) }
|
229
249
|
it { subject.ox.must_equal(5) }
|
230
250
|
it { subject.oy.must_equal(3) }
|
231
251
|
end
|
@@ -69,6 +69,26 @@ module Vedeu
|
|
69
69
|
it { instance.must_respond_to(:yn=) }
|
70
70
|
end
|
71
71
|
|
72
|
+
describe '.store' do
|
73
|
+
subject { described.store(attributes) }
|
74
|
+
|
75
|
+
it { subject.must_equal(instance) }
|
76
|
+
end
|
77
|
+
|
78
|
+
describe '#eql?' do
|
79
|
+
let(:other) { instance }
|
80
|
+
|
81
|
+
subject { instance.eql?(other) }
|
82
|
+
|
83
|
+
it { subject.must_equal(true) }
|
84
|
+
|
85
|
+
context 'when different to other' do
|
86
|
+
let(:other) { described.new(name: 'other_geometry') }
|
87
|
+
|
88
|
+
it { subject.must_equal(false) }
|
89
|
+
end
|
90
|
+
end
|
91
|
+
|
72
92
|
describe '#maximise' do
|
73
93
|
let(:attributes) {
|
74
94
|
{
|
@@ -29,14 +29,6 @@ module Vedeu
|
|
29
29
|
let(:geometry) {
|
30
30
|
Vedeu::Geometry::Geometry.new(name: _name, x: 1, y: 1, xn: 2, yn: 2)
|
31
31
|
}
|
32
|
-
|
33
|
-
before do
|
34
|
-
Vedeu.interfaces.stubs(:by_name).returns(interface)
|
35
|
-
Vedeu.geometries.stubs(:by_name).returns(geometry)
|
36
|
-
end
|
37
|
-
|
38
|
-
subject { instance.render }
|
39
|
-
|
40
32
|
let(:output) {
|
41
33
|
[
|
42
34
|
[
|
@@ -51,6 +43,19 @@ module Vedeu
|
|
51
43
|
]
|
52
44
|
}
|
53
45
|
|
46
|
+
before do
|
47
|
+
Vedeu.interfaces.stubs(:by_name).returns(interface)
|
48
|
+
Vedeu.geometries.stubs(:by_name).returns(geometry)
|
49
|
+
Vedeu::Output::Output.stubs(:render).returns(output)
|
50
|
+
end
|
51
|
+
|
52
|
+
subject { instance.render }
|
53
|
+
|
54
|
+
it { subject.must_be_instance_of(Array) }
|
55
|
+
it {
|
56
|
+
Vedeu::Output::Output.expects(:render).with(output)
|
57
|
+
subject
|
58
|
+
}
|
54
59
|
it { subject.must_equal(output) }
|
55
60
|
end
|
56
61
|
|
@@ -94,6 +94,18 @@ class VedeuMaterialColoursApp
|
|
94
94
|
zindex(1)
|
95
95
|
end
|
96
96
|
|
97
|
+
Vedeu.interface 'keys_interface' do
|
98
|
+
colour(foreground: '#ffffff', background: :default)
|
99
|
+
cursor!
|
100
|
+
geometry 'keys_interface' do
|
101
|
+
x(3)
|
102
|
+
xn(64)
|
103
|
+
y(15)
|
104
|
+
yn(28)
|
105
|
+
end
|
106
|
+
zindex(1)
|
107
|
+
end
|
108
|
+
|
97
109
|
Vedeu.keymap('_global_') do
|
98
110
|
key(:up) { Vedeu.trigger(:_cursor_up_) }
|
99
111
|
key(:right) { Vedeu.trigger(:_cursor_right_) }
|
@@ -177,6 +189,56 @@ class VedeuMaterialColoursApp
|
|
177
189
|
view 'empty_interface' do
|
178
190
|
line { line '' }
|
179
191
|
end
|
192
|
+
|
193
|
+
Vedeu.keymap('_global_') do
|
194
|
+
key(:up) { Vedeu.trigger(:_cursor_up_) }
|
195
|
+
key(:right) { Vedeu.trigger(:_cursor_right_) }
|
196
|
+
key(:down) { Vedeu.trigger(:_cursor_down_) }
|
197
|
+
key(:left) { Vedeu.trigger(:_cursor_left_) }
|
198
|
+
|
199
|
+
key('q') { Vedeu.trigger(:_exit_) }
|
200
|
+
key(:escape) { Vedeu.trigger(:_mode_switch_) }
|
201
|
+
key(:shift_tab) { Vedeu.trigger(:_focus_prev_) }
|
202
|
+
key(:tab) { Vedeu.trigger(:_focus_next_) }
|
203
|
+
|
204
|
+
key('a') { Vedeu.trigger(:_view_left_, 'main_interface') }
|
205
|
+
key('s') { Vedeu.trigger(:_view_down_, 'main_interface') }
|
206
|
+
key('d') { Vedeu.trigger(:_view_up_, 'main_interface') }
|
207
|
+
key('f') { Vedeu.trigger(:_view_right_, 'main_interface') }
|
208
|
+
|
209
|
+
key('h') { Vedeu.trigger(:_view_left_, 'other_interface') }
|
210
|
+
key('j') { Vedeu.trigger(:_view_down_, 'other_interface') }
|
211
|
+
key('k') { Vedeu.trigger(:_view_up_, 'other_interface') }
|
212
|
+
key('l') { Vedeu.trigger(:_view_right_, 'other_interface') }
|
213
|
+
|
214
|
+
key('t') do
|
215
|
+
Vedeu.trigger(:_toggle_interface_, 'main_interface')
|
216
|
+
Vedeu.trigger(:_toggle_interface_, 'other_interface')
|
217
|
+
end
|
218
|
+
key('1') { Vedeu.trigger(:_hide_interface_, 'main_interface') }
|
219
|
+
key('2') { Vedeu.trigger(:_show_interface_, 'main_interface') }
|
220
|
+
key('3') { Vedeu.trigger(:_hide_interface_, 'other_interface') }
|
221
|
+
key('4') { Vedeu.trigger(:_show_interface_, 'other_interface') }
|
222
|
+
key('m') { Vedeu.trigger(:_maximise_, 'main_interface') }
|
223
|
+
key('n') { Vedeu.trigger(:_unmaximise_, 'main_interface') }
|
224
|
+
key('b') { Vedeu.trigger(:_maximise_, 'other_interface') }
|
225
|
+
key('v') { Vedeu.trigger(:_unmaximise_, 'other_interface') }
|
226
|
+
end
|
227
|
+
|
228
|
+
view 'keys_interface' do
|
229
|
+
line { left 'left,down,up,right - Move cursor' }
|
230
|
+
line { left 'q - exit' }
|
231
|
+
line { left 'escape - mode switch'}
|
232
|
+
line { left 'shift+tab - focus previous'}
|
233
|
+
line { left 'tab - focus next'}
|
234
|
+
line { left 'a,s,d,f - Move Rainbow! left, down, up, right' }
|
235
|
+
line { left 'h,j,k,l - Move Wow! left, down, up, right' }
|
236
|
+
line { left 't - Toggle Rainbow!/Wow!' }
|
237
|
+
line { left '1,2 - Hide/Show Rainbow!'}
|
238
|
+
line { left '3,4 - Hide/Show Wow!'}
|
239
|
+
line { left 'm,n - Maximise/Unmaximise Rainbow!' }
|
240
|
+
line { left 'b,v - Maximise/Unmaximise Wow!' }
|
241
|
+
end
|
180
242
|
end
|
181
243
|
|
182
244
|
Vedeu.focus_by_name 'main_interface'
|
data/test/test_helper.rb
CHANGED
@@ -89,17 +89,17 @@ require 'mocha/setup'
|
|
89
89
|
require 'vedeu'
|
90
90
|
require 'support/helpers/model_test_class'
|
91
91
|
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
#
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
#
|
100
|
-
#
|
101
|
-
#
|
102
|
-
|
92
|
+
require 'minitest/reporters'
|
93
|
+
require 'minitest/reporters/mean_time_reporter'
|
94
|
+
Minitest::Reporters.use!(
|
95
|
+
# # commented out by default (makes tests slower)
|
96
|
+
Minitest::Reporters::MeanTimeReporter.new({
|
97
|
+
previous_runs_filename: "/tmp/durations",
|
98
|
+
report_filename: "/tmp/durations_results"})
|
99
|
+
# Minitest::Reporters::DefaultReporter.new({ color: true,
|
100
|
+
# slow_suite_count: 15 }),
|
101
|
+
# Minitest::Reporters::SpecReporter.new
|
102
|
+
)
|
103
103
|
|
104
104
|
def test_configuration
|
105
105
|
Vedeu::Configuration.reset!
|
data/vedeu.gemspec
CHANGED
@@ -23,12 +23,11 @@ Gem::Specification.new do |spec|
|
|
23
23
|
spec.add_development_dependency 'guard', '2.13.0'
|
24
24
|
spec.add_development_dependency 'guard-minitest', '2.4.4'
|
25
25
|
spec.add_development_dependency 'guard-rubocop', '1.2.0'
|
26
|
-
spec.add_development_dependency 'minitest', '5.8.
|
27
|
-
spec.add_development_dependency 'minitest-reporters', '1.1.
|
26
|
+
spec.add_development_dependency 'minitest', '5.8.1'
|
27
|
+
spec.add_development_dependency 'minitest-reporters', '1.1.2'
|
28
28
|
spec.add_development_dependency 'mocha', '1.1.0'
|
29
29
|
spec.add_development_dependency 'pry', '0.10.1'
|
30
30
|
spec.add_development_dependency 'rubocop', '0.34.2'
|
31
|
-
|
32
31
|
spec.add_development_dependency 'ruby-prof', '0.15.8'
|
33
32
|
spec.add_development_dependency 'simplecov', '0.10.0'
|
34
33
|
spec.add_development_dependency 'simplecov-console', '0.2.0'
|
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.6.
|
4
|
+
version: 0.6.15
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Gavin Laking
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-09-
|
11
|
+
date: 2015-09-24 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: guard
|
@@ -58,28 +58,28 @@ dependencies:
|
|
58
58
|
requirements:
|
59
59
|
- - '='
|
60
60
|
- !ruby/object:Gem::Version
|
61
|
-
version: 5.8.
|
61
|
+
version: 5.8.1
|
62
62
|
type: :development
|
63
63
|
prerelease: false
|
64
64
|
version_requirements: !ruby/object:Gem::Requirement
|
65
65
|
requirements:
|
66
66
|
- - '='
|
67
67
|
- !ruby/object:Gem::Version
|
68
|
-
version: 5.8.
|
68
|
+
version: 5.8.1
|
69
69
|
- !ruby/object:Gem::Dependency
|
70
70
|
name: minitest-reporters
|
71
71
|
requirement: !ruby/object:Gem::Requirement
|
72
72
|
requirements:
|
73
73
|
- - '='
|
74
74
|
- !ruby/object:Gem::Version
|
75
|
-
version: 1.1.
|
75
|
+
version: 1.1.2
|
76
76
|
type: :development
|
77
77
|
prerelease: false
|
78
78
|
version_requirements: !ruby/object:Gem::Requirement
|
79
79
|
requirements:
|
80
80
|
- - '='
|
81
81
|
- !ruby/object:Gem::Version
|
82
|
-
version: 1.1.
|
82
|
+
version: 1.1.2
|
83
83
|
- !ruby/object:Gem::Dependency
|
84
84
|
name: mocha
|
85
85
|
requirement: !ruby/object:Gem::Requirement
|
@@ -261,6 +261,7 @@ files:
|
|
261
261
|
- docs/events/movement.md
|
262
262
|
- docs/events/refresh.md
|
263
263
|
- docs/events/system.md
|
264
|
+
- docs/events/view.md
|
264
265
|
- docs/events/visibility.md
|
265
266
|
- docs/getting_started.md
|
266
267
|
- docs/object_graph.md
|
@@ -286,6 +287,7 @@ files:
|
|
286
287
|
- lib/vedeu/bindings/movement.rb
|
287
288
|
- lib/vedeu/bindings/refresh.rb
|
288
289
|
- lib/vedeu/bindings/system.rb
|
290
|
+
- lib/vedeu/bindings/view.rb
|
289
291
|
- lib/vedeu/bindings/visibility.rb
|
290
292
|
- lib/vedeu/borders/all.rb
|
291
293
|
- lib/vedeu/borders/border.rb
|
@@ -486,6 +488,7 @@ files:
|
|
486
488
|
- test/lib/vedeu/bindings/movement_test.rb
|
487
489
|
- test/lib/vedeu/bindings/refresh_test.rb
|
488
490
|
- test/lib/vedeu/bindings/system_test.rb
|
491
|
+
- test/lib/vedeu/bindings/view_test.rb
|
489
492
|
- test/lib/vedeu/bindings/visibility_test.rb
|
490
493
|
- test/lib/vedeu/borders/border_test.rb
|
491
494
|
- test/lib/vedeu/borders/dsl_test.rb
|
@@ -639,7 +642,6 @@ files:
|
|
639
642
|
- test/lib/vedeu/terminal/terminal_test.rb
|
640
643
|
- test/lib/vedeu_test.rb
|
641
644
|
- test/support/all_seeds.sh
|
642
|
-
- test/support/average_duration_reporter.rb
|
643
645
|
- test/support/colour_support.sh
|
644
646
|
- test/support/coverage.rb
|
645
647
|
- test/support/examples/borders_app.rb
|
@@ -704,6 +706,7 @@ test_files:
|
|
704
706
|
- test/lib/vedeu/bindings/movement_test.rb
|
705
707
|
- test/lib/vedeu/bindings/refresh_test.rb
|
706
708
|
- test/lib/vedeu/bindings/system_test.rb
|
709
|
+
- test/lib/vedeu/bindings/view_test.rb
|
707
710
|
- test/lib/vedeu/bindings/visibility_test.rb
|
708
711
|
- test/lib/vedeu/borders/border_test.rb
|
709
712
|
- test/lib/vedeu/borders/dsl_test.rb
|
@@ -857,7 +860,6 @@ test_files:
|
|
857
860
|
- test/lib/vedeu/terminal/terminal_test.rb
|
858
861
|
- test/lib/vedeu_test.rb
|
859
862
|
- test/support/all_seeds.sh
|
860
|
-
- test/support/average_duration_reporter.rb
|
861
863
|
- test/support/colour_support.sh
|
862
864
|
- test/support/coverage.rb
|
863
865
|
- test/support/examples/borders_app.rb
|
@@ -1,201 +0,0 @@
|
|
1
|
-
require 'yaml'
|
2
|
-
|
3
|
-
module Minitest
|
4
|
-
module Reporters
|
5
|
-
|
6
|
-
class MeanTimeReporter < DefaultReporter
|
7
|
-
|
8
|
-
# @param options [Hash]
|
9
|
-
# @option previous_runs_filename [String] Contains the times for each test
|
10
|
-
# by description. Defaults to '/tmp/minitest_reporters_previous_run'.
|
11
|
-
# @option report_filename [String] Contains the parsed results for the
|
12
|
-
# last test run. Defaults to '/tmp/minitest_reporters_report'.
|
13
|
-
# @return [Minitest::Reporters::MeanTimeReporter]
|
14
|
-
def initialize(options = {})
|
15
|
-
super
|
16
|
-
|
17
|
-
@all_suite_times = []
|
18
|
-
end
|
19
|
-
|
20
|
-
# Copies the suite times from the
|
21
|
-
# {Minitest::Reporters::DefaultReporter#after_suite} method, making them
|
22
|
-
# available to this class.
|
23
|
-
#
|
24
|
-
# @return [Hash<String => Float>]
|
25
|
-
def after_suite(suite)
|
26
|
-
super
|
27
|
-
|
28
|
-
@all_suite_times = @suite_times
|
29
|
-
end
|
30
|
-
|
31
|
-
# Runs the {Minitest::Reporters::DefaultReporter#report} method and then
|
32
|
-
# enhances it by storing the results to the 'previous_runs_filename' and
|
33
|
-
# outputs the parsed results to both the 'report_filename' and the
|
34
|
-
# terminal.
|
35
|
-
#
|
36
|
-
def report
|
37
|
-
super
|
38
|
-
|
39
|
-
create_or_update_previous_runs!
|
40
|
-
|
41
|
-
create_new_report!
|
42
|
-
end
|
43
|
-
|
44
|
-
protected
|
45
|
-
|
46
|
-
attr_accessor :all_suite_times
|
47
|
-
|
48
|
-
private
|
49
|
-
|
50
|
-
# @return [Hash<String => Float>]
|
51
|
-
def current_run
|
52
|
-
Hash[all_suite_times]
|
53
|
-
end
|
54
|
-
|
55
|
-
# @return [Hash] Sets default values for the filenames used by this class.
|
56
|
-
def defaults
|
57
|
-
{
|
58
|
-
previous_runs_filename: '/tmp/minitest_reporters_previous_run',
|
59
|
-
report_filename: '/tmp/minitest_reporters_report',
|
60
|
-
}
|
61
|
-
end
|
62
|
-
|
63
|
-
# Added to the top of the report file to be helpful.
|
64
|
-
#
|
65
|
-
# @return [String]
|
66
|
-
def report_header
|
67
|
-
"Samples: #{samples}\n\n"
|
68
|
-
end
|
69
|
-
|
70
|
-
# The report itself. Displays statistic about all runs, ideal for use with
|
71
|
-
# the Unix 'head' command. Listed in slowest average descending order.
|
72
|
-
#
|
73
|
-
# @return [String]
|
74
|
-
def report_body
|
75
|
-
previous_run.each_with_object([]) do |(description, timings), obj|
|
76
|
-
size = timings.size
|
77
|
-
sum = timings.inject { |total, x| total + x }
|
78
|
-
avg = (sum / size).round(9).to_s.ljust(12)
|
79
|
-
min = timings.min.to_s.ljust(12)
|
80
|
-
max = timings.max.to_s.ljust(12)
|
81
|
-
|
82
|
-
obj << "#{avg_label} #{avg} " \
|
83
|
-
"#{min_label} #{min} " \
|
84
|
-
"#{max_label} #{max} " \
|
85
|
-
"#{des_label} #{description}\n"
|
86
|
-
end.sort.reverse.join
|
87
|
-
end
|
88
|
-
|
89
|
-
# @return [Hash]
|
90
|
-
def options
|
91
|
-
defaults.merge!(@options)
|
92
|
-
end
|
93
|
-
|
94
|
-
# @return [Hash<String => Array<Float>]
|
95
|
-
def previous_run
|
96
|
-
@previous_run ||= YAML.load_file(previous_runs_filename)
|
97
|
-
end
|
98
|
-
|
99
|
-
# @return [String] The path to the file which contains all the durations
|
100
|
-
# for each test run. The previous runs file is in YAML format, using the
|
101
|
-
# test name for the key and an array containing the time taken to run
|
102
|
-
# this test for values.
|
103
|
-
#
|
104
|
-
# @return [String]
|
105
|
-
def previous_runs_filename
|
106
|
-
options[:previous_runs_filename]
|
107
|
-
end
|
108
|
-
|
109
|
-
# Returns a boolean indicating whether a previous runs file exists.
|
110
|
-
#
|
111
|
-
# @return [Boolean]
|
112
|
-
def previously_ran?
|
113
|
-
File.exist?(previous_runs_filename)
|
114
|
-
end
|
115
|
-
|
116
|
-
# @return [String] The path to the file which contains the parsed test
|
117
|
-
# results. The results file contains a line for each test with the
|
118
|
-
# average time of the test, the minimum time the test took to run,
|
119
|
-
# the maximum time the test took to run and a description of the test
|
120
|
-
# (which is the test name as emitted by Minitest).
|
121
|
-
def report_filename
|
122
|
-
options[:report_filename]
|
123
|
-
end
|
124
|
-
|
125
|
-
# A barbaric way to find out how many runs are in the previous runs file;
|
126
|
-
# this method takes the first test listed, and counts its samples
|
127
|
-
# trusting (naively) all runs to be the same number of samples. This will
|
128
|
-
# produce incorrect averages when new tests are added, so it is advised
|
129
|
-
# to restart the statistics by removing the 'previous runs' file.
|
130
|
-
#
|
131
|
-
# @return [Fixnum]
|
132
|
-
def samples
|
133
|
-
return 1 unless previous_run.first[1].is_a?(Array)
|
134
|
-
|
135
|
-
previous_run.first[1].size
|
136
|
-
end
|
137
|
-
|
138
|
-
# Creates a new 'previous runs' file, or updates the existing one with
|
139
|
-
# the latest timings.
|
140
|
-
#
|
141
|
-
# @return [void]
|
142
|
-
def create_or_update_previous_runs!
|
143
|
-
if previously_ran?
|
144
|
-
current_run.each do |description, elapsed|
|
145
|
-
new_times = if previous_run["#{description}"]
|
146
|
-
Array(previous_run["#{description}"]) << elapsed
|
147
|
-
|
148
|
-
else
|
149
|
-
Array(elapsed)
|
150
|
-
|
151
|
-
end
|
152
|
-
|
153
|
-
previous_run.store("#{description}", new_times)
|
154
|
-
end
|
155
|
-
|
156
|
-
File.write(previous_runs_filename, previous_run.to_yaml)
|
157
|
-
|
158
|
-
else
|
159
|
-
|
160
|
-
File.write(previous_runs_filename, current_run.to_yaml)
|
161
|
-
|
162
|
-
end
|
163
|
-
end
|
164
|
-
|
165
|
-
# Creates a new report file in the 'report_filename'. This file contains
|
166
|
-
# a line for each test of the following example format:
|
167
|
-
#
|
168
|
-
# Avg: 0.0555555 Min: 0.0498765 Max: 0.0612345 Description: The test name
|
169
|
-
#
|
170
|
-
# Note however the timings are to 9 decimal places, and padded to 12
|
171
|
-
# characters and each label is coloured, Avg (yellow), Min (green),
|
172
|
-
# Max (red) and Description (blue). It looks pretty!
|
173
|
-
#
|
174
|
-
# @return [void]
|
175
|
-
def create_new_report!
|
176
|
-
File.write(report_filename, report_header + report_body)
|
177
|
-
end
|
178
|
-
|
179
|
-
# @return [String] A yellow 'Avg:' label.
|
180
|
-
def avg_label
|
181
|
-
"\e[33mAvg:\e[39m"
|
182
|
-
end
|
183
|
-
|
184
|
-
# @return [String] A blue 'Description:' label.
|
185
|
-
def des_label
|
186
|
-
"\e[34mDescription:\e[39m"
|
187
|
-
end
|
188
|
-
|
189
|
-
# @return [String] A red 'Max:' label.
|
190
|
-
def max_label
|
191
|
-
"\e[31mMax:\e[39m"
|
192
|
-
end
|
193
|
-
|
194
|
-
# @return [String] A green 'Min:' label.
|
195
|
-
def min_label
|
196
|
-
"\e[32mMin:\e[39m"
|
197
|
-
end
|
198
|
-
|
199
|
-
end
|
200
|
-
end
|
201
|
-
end
|