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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 7e1b859a5c5879bc2165e48baaf00b3a15448111
4
- data.tar.gz: dd4db5330f731e8f171c38c3c3f22bd6331b5356
3
+ metadata.gz: 7229836cd42c82c006486c2f7ed0022ec046d221
4
+ data.tar.gz: 1ae9b7c3569417d567f5f0efef7ad3122ed4002f
5
5
  SHA512:
6
- metadata.gz: 54b2f06a47ded5480ada1597206145f678390d23897656060724a263b37a68fdecc139a2f3393fb6ab6b97b47aca0d1e1cba762e62dc2df4b4c44a36ba25b59a
7
- data.tar.gz: 29b42c9a6fb03431f8b4c45688edb6f30c7df68b434933406cc81e8eb69dc29614c8244762d622b59119034d5c8918ae1f8209d7e9640197182be2dd5e3e628e
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 |t|
7
- t.libs.push 'lib'
8
- t.libs.push 'test'
9
- t.pattern = 'test/**/*_test.rb'
10
- t.verbose = false
11
- t.warning = false # set to true for Ruby warnings (ruby -w)
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 |t|
15
- t.files = [
14
+ YARD::Rake::YardocTask.new(:yard) do |task|
15
+ task.files = [
16
16
  'lib/**/*.rb',
17
17
  '-',
18
18
  'docs/api.md',
@@ -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}
@@ -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}
@@ -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
@@ -29,6 +29,9 @@ See {file:docs/events/menu.md}
29
29
  ### Movement Events
30
30
  See {file:docs/events/movement.md}
31
31
 
32
+ ### View Events
33
+ See {file:docs/events/view.md}
34
+
32
35
  ### Visibility Events
33
36
  See {file:docs/events/visibility.md}
34
37
 
@@ -8,7 +8,7 @@ module Vedeu
8
8
  #
9
9
  module ClassMethods
10
10
 
11
- attr_accessor :controller_name
11
+ attr_writer :controller_name
12
12
 
13
13
  # Specifying the controller name in your controller provides
14
14
  # Vedeu with the means to route requests to different parts of
@@ -28,5 +28,6 @@ require 'vedeu/bindings/movement'
28
28
  require 'vedeu/bindings/focus'
29
29
  require 'vedeu/bindings/refresh'
30
30
  require 'vedeu/bindings/system'
31
+ require 'vedeu/bindings/view'
31
32
  require 'vedeu/bindings/visibility'
32
33
  require 'vedeu/bindings/bindings'
@@ -19,6 +19,7 @@ module Vedeu
19
19
  Vedeu::Bindings::Focus.setup!
20
20
  Vedeu::Bindings::Refresh.setup!
21
21
  Vedeu::Bindings::System.setup!
22
+ Vedeu::Bindings::View.setup!
22
23
 
23
24
  true
24
25
  end
@@ -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|
@@ -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::Output::Output.render(clear)
111
+ Vedeu.trigger(:_clear_, name)
119
112
  end
120
113
 
121
114
  # Return the content for this buffer.
@@ -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
- @attributes = new_attributes(coordinate.y_position, x, oy, ox)
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
- @attributes = new_attributes(y, coordinate.x_position, oy, ox)
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
- @attributes = attributes.merge!(x: bx, y: by, ox: 0, oy: 0)
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
- @attributes = new_attributes(y, coordinate.x_position, oy, ox)
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
- @attributes = new_attributes(coordinate.y_position, x, oy, ox)
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
- @attributes = new_attributes(coordinate.y_position,
140
- coordinate.x_position,
141
- new_oy,
142
- new_ox)
148
+ @oy = new_oy
149
+ @ox = new_ox
143
150
 
144
- Vedeu::Cursors::Cursor.new(@attributes).store
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
@@ -38,7 +38,7 @@ module Vedeu
38
38
 
39
39
  Vedeu.trigger(:_refresh_, name) if refresh_view?
40
40
 
41
- Vedeu::Terminal.output(cursor.to_s)
41
+ cursor.render
42
42
  end
43
43
 
44
44
  protected
@@ -33,11 +33,11 @@ module Vedeu
33
33
 
34
34
  # @!attribute [rw] x
35
35
  # @return [Fixnum]
36
- attr_accessor :x
36
+ attr_writer :x
37
37
 
38
38
  # @!attribute [rw] y
39
39
  # @return [Fixnum]
40
- attr_accessor :y
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
- @attributes = attributes.merge(
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
- @attributes = attributes.merge(
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
- @attributes = attributes.merge(
172
- centred: false,
173
- maximised: false,
174
- x: 1,
175
- xn: xn - x + 1,
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
- @attributes = attributes.merge(
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
- @attributes = attributes.merge(
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 => Fixnum, Boolean>]
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]
@@ -12,6 +12,7 @@ module Vedeu
12
12
  # (typically STDOUT, STDERR or an open file).
13
13
  # @return [Vedeu::Logging::MonoLogger]
14
14
  def initialize(logdev)
15
+ @progname = 'Vedeu'
15
16
  @level = Logger::DEBUG
16
17
  @default_formatter = Logger::Formatter.new
17
18
  @formatter = nil
@@ -80,8 +80,9 @@ module Vedeu
80
80
  def render
81
81
  return [] unless visible?
82
82
 
83
+ Vedeu.trigger(:_clear_, name)
84
+
83
85
  output = [
84
- Vedeu::Clear::NamedInterface.render(name),
85
86
  Vedeu::Output::Viewport.render(self),
86
87
  Vedeu.borders.by_name(name).render,
87
88
  ]
@@ -36,7 +36,7 @@ module Vedeu
36
36
 
37
37
  # @return [Array<Array<Vedeu::Views::Char>>]
38
38
  def render
39
- output
39
+ Vedeu::Output::Output.render(output)
40
40
  end
41
41
 
42
42
  protected
data/lib/vedeu/version.rb CHANGED
@@ -1,6 +1,6 @@
1
1
  module Vedeu
2
2
 
3
3
  # The current version of Vedeu.
4
- VERSION = '0.6.14'
4
+ VERSION = '0.6.15'
5
5
 
6
6
  end
@@ -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
@@ -7,6 +7,7 @@ module Vedeu
7
7
  describe Visibility do
8
8
 
9
9
  context 'the visibility events are defined' do
10
+ it { Vedeu.bound?(:_clear_).must_equal(true) }
10
11
  it { Vedeu.bound?(:_clear_group_).must_equal(true) }
11
12
 
12
13
  it { Vedeu.bound?(:_cursor_hide_).must_equal(true) }
@@ -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::Output::Output.stubs(:render) }
105
+ before { Vedeu.stubs(:trigger) }
124
106
 
125
107
  subject { instance.hide }
126
108
 
127
109
  it {
128
- Vedeu::Output::Output.expects(:render)
110
+ Vedeu.expects(:trigger).with(:_clear_, _name)
129
111
  subject
130
112
  }
131
113
  end
132
114
 
133
115
  describe '#show' do
134
- before { Vedeu::Output::Output.stubs(:render) }
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(8) }
228
- it { subject.y.must_equal(7) }
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
- # require 'minitest/reporters'
93
- # require 'support/average_duration_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
- # )
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.0'
27
- spec.add_development_dependency 'minitest-reporters', '1.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.14
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-23 00:00:00.000000000 Z
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.0
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.0
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.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.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