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