vedeu 0.6.14 → 0.6.15
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.
- 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
|