cheeky-dreams 0.0.5 → 0.0.6

Sign up to get free protection for your applications and to get access to all the features.
data/README.rdoc CHANGED
@@ -2,6 +2,10 @@
2
2
 
3
3
  Description goes here.
4
4
 
5
+
6
+ # http://www.krazydad.com/makecolors.php
7
+
8
+
5
9
  == Contributing to cheeky-dreams
6
10
 
7
11
  * Check out the latest master to make sure the feature hasn't been implemented or the bug hasn't been fixed yet
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.0.5
1
+ 0.0.6
@@ -5,7 +5,7 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = "cheeky-dreams"
8
- s.version = "0.0.5"
8
+ s.version = "0.0.6"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["simon"]
@@ -27,9 +27,9 @@ Gem::Specification.new do |s|
27
27
  "VERSION",
28
28
  "cheeky-dreams.gemspec",
29
29
  "lib/cheeky-dreams.rb",
30
+ "samples/fade-to-throb.rb",
30
31
  "spec/cheeky-dreams_spec.rb",
31
32
  "spec/off.rb",
32
- "spec/small-test.rb",
33
33
  "spec/spec_helper.rb",
34
34
  "spec/support/collecting_auditor.rb",
35
35
  "spec/support/stub_driver.rb",
data/lib/cheeky-dreams.rb CHANGED
@@ -1,4 +1,5 @@
1
1
  require 'thread'
2
+ require 'set'
2
3
 
3
4
  module CheekyDreams
4
5
 
@@ -47,13 +48,13 @@ module CheekyDreams
47
48
  end
48
49
  end
49
50
 
50
- class FilteringAuditor
51
- def initialize auditor, including
52
- @auditor, @including = auditor, Set.new(including)
51
+ class ForwardingAuditor
52
+ def initialize rules
53
+ @rules = rules
53
54
  end
54
55
 
55
56
  def audit type, message
56
- @auditor.audit(type, message) if @including.include?(type)
57
+ @rules[type].audit(type, message) if @rules.has_key?(type)
57
58
  end
58
59
  end
59
60
 
@@ -72,8 +73,28 @@ module CheekyDreams
72
73
  end
73
74
  end
74
75
 
75
- def filtering including, auditor
76
- FilteringAuditor.new auditor, including
76
+ AuditEvent = Struct.new(:type, :message)
77
+
78
+ class SuppressDuplicatesAuditor
79
+ def initialize auditor
80
+ @auditor, @audits = auditor, Set.new
81
+ end
82
+
83
+ def audit type, message
84
+ event = AuditEvent.new type, message
85
+ unless @audits.include?(event)
86
+ @auditor.audit(type, message)
87
+ @audits << event
88
+ end
89
+ end
90
+ end
91
+
92
+ def suppress_duplicates auditor
93
+ SuppressDuplicatesAuditor.new auditor
94
+ end
95
+
96
+ def forward rules
97
+ ForwardingAuditor.new rules
77
98
  end
78
99
 
79
100
  def audit_to *auditors
@@ -136,17 +157,30 @@ module CheekyDreams
136
157
  Effects::FadeTo.new to, steps, freq
137
158
  end
138
159
 
139
- def func freq = 1, &block
140
- Effects::Func.new freq, &block
160
+ def func &block
161
+ Effects::Func.new &block
141
162
  end
142
163
 
143
164
  def throb freq, from, to
144
165
  Effects::Throb.new freq, from, to
145
166
  end
146
167
 
147
- def crazy freq = 1, new_effect_freq = 2
168
+ def throbbing colour, freq = 10
169
+ rgb_colour = rgb(colour)
170
+ Effects::Throb.new freq, rgb_colour, [max(rgb_colour[0] - 200, 0), max(rgb_colour[1] - 200, 0), max(rgb_colour[2] - 200, 0)]
171
+ end
172
+
173
+ def max a, b
174
+ a > b ? a : b
175
+ end
176
+
177
+ def crazy freq = 10, new_effect_freq = 10
148
178
  Effects::Crazy.new(freq, new_effect_freq)
149
179
  end
180
+
181
+ def light_show *effects
182
+ Effects::LightShow.new effects
183
+ end
150
184
 
151
185
  module Dev
152
186
  class Null
@@ -190,24 +224,36 @@ module CheekyDreams
190
224
  class Effect
191
225
  include CheekyDreams
192
226
  include Math
227
+ end
228
+
229
+ class LightShow < Effect
230
+ def initialize effects
231
+ @effects, @current, @last_freq = effects, nil, nil
232
+ end
193
233
 
194
- attr_reader :freq
195
-
196
- def initialize freq
197
- @freq = freq
234
+ def next current_colour = nil
235
+ @current = @effects.delete_at(0) unless @current
236
+ colour, freq = @current.next current_colour
237
+ if (freq == 0 && !@effects.empty?)
238
+ @current = @effects.delete_at(0)
239
+ elsif (freq == 0 && @effects.empty?)
240
+ @last_freq = 0
241
+ else
242
+ @last_freq = freq
243
+ end
244
+ [colour, @last_freq]
198
245
  end
199
246
  end
200
247
 
201
248
  class Throb2 < Effect
202
249
  def initialize freq, amplitude, centre
203
- super freq
204
- @amplitude, @centre, @count = amplitude, centre, 1
250
+ @freq, @amplitude, @centre, @count = freq, amplitude, centre, 1
205
251
  end
206
252
 
207
253
  def next current_colour
208
- x = freq * (@count += 1)
254
+ x = @freq * (@count += 1)
209
255
  v = sin(x) * @amplitude + @centre
210
- [v, 0, 0]
256
+ [[v, 0, 0], @freq]
211
257
  end
212
258
  end
213
259
 
@@ -215,7 +261,7 @@ module CheekyDreams
215
261
  attr_reader :r_amp, :r_centre, :g_amp, :g_centre, :b_amp, :b_centre
216
262
 
217
263
  def initialize freq, from, to
218
- super freq
264
+ @freq = freq
219
265
  @r_centre, @r_amp = centre_and_amp from[0], to[0]
220
266
  @g_centre, @g_amp = centre_and_amp from[1], to[1]
221
267
  @b_centre, @b_amp = centre_and_amp from[2], to[2]
@@ -233,7 +279,7 @@ module CheekyDreams
233
279
  # [v, 0, 0]
234
280
 
235
281
  @count += 1
236
- [r.floor, g.floor, b.floor]
282
+ [[r.floor, g.floor, b.floor], @freq]
237
283
  end
238
284
 
239
285
  private
@@ -242,65 +288,57 @@ module CheekyDreams
242
288
  centre = max(from, to) - amp
243
289
  [centre, amp]
244
290
  end
245
-
246
- def max a, b
247
- a > b ? a : b
248
- end
249
291
  end
250
292
 
251
293
  class Crazy < Effect
252
294
  def initialize freq, new_effect_freq
253
- super freq
254
- @new_effect_freq = new_effect_freq
255
- @count, @effect = 0, nil
295
+ @freq, @new_effect_freq = freq, new_effect_freq
296
+ @count, @fade = 0, nil
256
297
  end
257
298
 
258
299
  def next current_colour
259
300
  if @count % @new_effect_freq == 0
260
- @effect = FadeTo.new([rand(255), rand(255), rand(255)], @new_effect_freq, freq)
301
+ @fade = FadeTo.new([rand(255), rand(255), rand(255)], @new_effect_freq, @freq)
261
302
  end
262
303
  @count += 1
263
- @effect.next current_colour
304
+ [@fade.next(current_colour)[0], @freq]
264
305
  end
265
306
  end
266
307
 
267
308
  class Func < Effect
268
- def initialize freq, &block
269
- super freq
309
+ def initialize &block
270
310
  @block = block
271
311
  end
272
312
 
273
313
  def next current_colour = nil
274
- rgb(@block.yield(current_colour))
314
+ colour, freq = @block.yield(current_colour)
315
+ [rgb(colour), freq]
275
316
  end
276
317
  end
277
318
 
278
319
  class Solid < Effect
279
320
  def initialize colour
280
- super 0.1
281
321
  @rgb = rgb(colour)
282
322
  end
283
323
 
284
324
  def next current_colour = nil
285
- @rgb
325
+ [@rgb, 0]
286
326
  end
287
327
  end
288
328
 
289
329
  class Cycle < Effect
290
330
  def initialize colours, freq
291
- super freq
292
- @cycle = colours.cycle
331
+ @freq, @cycle = freq, colours.cycle
293
332
  end
294
333
 
295
334
  def next current_colour = nil
296
- rgb(@cycle.next)
335
+ [rgb(@cycle.next), @freq]
297
336
  end
298
337
  end
299
338
 
300
339
  class Fade < Effect
301
340
  def initialize from, to, steps, freq
302
- super freq
303
- @rgb_from, @rgb_to = rgb(from), rgb(to)
341
+ @freq, @rgb_from, @rgb_to = freq, rgb(from), rgb(to)
304
342
  @fade = [@rgb_from]
305
343
  (1..(steps-1)).each { |i| @fade << rgb_between(@rgb_from, @rgb_to, i / steps.to_f) }
306
344
  @fade << @rgb_to
@@ -308,23 +346,22 @@ module CheekyDreams
308
346
  end
309
347
 
310
348
  def next current_colour = nil
311
- return @rgb_to if @index >= @fade.length
349
+ return [@rgb_to, 0] if @index >= @fade.length
312
350
  next_colour = @fade[@index]
313
351
  @index += 1
314
- next_colour
352
+ [next_colour, next_colour == @rgb_to ? 0 : @freq]
315
353
  end
316
354
  end
317
355
 
318
356
  class FadeTo < Effect
319
357
  def initialize to, steps, freq
320
- super freq
321
- @to, @steps = to, steps
358
+ @freq, @to, @steps = freq, to, steps
322
359
  @fade = nil
323
360
  end
324
361
 
325
362
  def next current_colour
326
- @fade = Fade.new(current_colour, @to, @steps, freq) unless @fade
327
- @fade.next current_colour
363
+ @fade = Fade.new(current_colour, @to, @steps, @freq) unless @fade
364
+ @fade.next(current_colour)
328
365
  end
329
366
  end
330
367
  end
@@ -365,21 +402,25 @@ class Light
365
402
 
366
403
  private
367
404
  def turn_on
368
- @on, current_effect = true, nil
405
+ @on = true
369
406
  @run_thread = Thread.new do
370
- last_colour = COLOURS[:off]
407
+ last_colour, current_effect, freq = COLOURS[:off], nil, nil
371
408
  while @on
372
409
  start = Time.now
373
410
  @lock.synchronize { current_effect = @effect }
374
411
  begin
375
- new_colour = current_effect.next last_colour
412
+ new_colour, freq = current_effect.next last_colour
376
413
  @driver.go new_colour
377
414
  @auditor.audit :colour_change, new_colour.to_s
378
415
  last_colour = new_colour
379
416
  rescue => e
380
- auditor.audit :error, e.message
417
+ auditor.audit :error, "#{e.message}"
418
+ end
419
+ if freq > 0
420
+ sleep_until (start + (1 / freq.to_f))
421
+ else
422
+ sleep
381
423
  end
382
- sleep_until (start + (1 / current_effect.freq.to_f))
383
424
  end
384
425
  end
385
426
  end
@@ -1,16 +1,13 @@
1
1
  $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
2
2
  $LOAD_PATH.unshift(File.dirname(__FILE__))
3
- require 'rspec'
4
3
  require 'cheeky-dreams'
5
4
 
6
- require 'rainbow'
7
- # http://www.krazydad.com/makecolors.php
8
5
  include CheekyDreams
9
6
 
10
7
  light = Light.new ansi_driver
11
- # light.auditor = stdio_audit
12
- light.go :purple
13
- light.go throb 10, [100,0,0], [255,0,0]
14
-
8
+ light.auditor = forward(:error => suppress_duplicates(stdio_audit))
9
+ light.go crazy
10
+ sleep 10
11
+ light.go(light_show(fade_to(:red), throbbing(:red)))
15
12
  sleep 100
16
13
 
@@ -117,9 +117,9 @@ describe CheekyDreams do
117
117
  end
118
118
 
119
119
  it "should return [0,0,0] every time called" do
120
- @off.next.should == COLOURS[:off]
121
- @off.next.should == COLOURS[:off]
122
- @off.next.should == COLOURS[:off]
120
+ @off.next.should == [COLOURS[:off], 0]
121
+ @off.next.should == [COLOURS[:off], 0]
122
+ @off.next.should == [COLOURS[:off], 0]
123
123
  end
124
124
  end
125
125
 
@@ -130,9 +130,9 @@ describe CheekyDreams do
130
130
  end
131
131
 
132
132
  it "should return rgb every time called" do
133
- @solid.next.should == COLOURS[:purple]
134
- @solid.next.should == COLOURS[:purple]
135
- @solid.next.should == COLOURS[:purple]
133
+ @solid.next.should == [COLOURS[:purple], 0]
134
+ @solid.next.should == [COLOURS[:purple], 0]
135
+ @solid.next.should == [COLOURS[:purple], 0]
136
136
  end
137
137
  end
138
138
 
@@ -142,9 +142,9 @@ describe CheekyDreams do
142
142
  end
143
143
 
144
144
  it "should return rgb every time called" do
145
- @solid.next.should == [123, 123, 123]
146
- @solid.next.should == [123, 123, 123]
147
- @solid.next.should == [123, 123, 123]
145
+ @solid.next.should == [[123, 123, 123], 0]
146
+ @solid.next.should == [[123, 123, 123], 0]
147
+ @solid.next.should == [[123, 123, 123], 0]
148
148
  end
149
149
  end
150
150
  end
@@ -154,22 +154,18 @@ describe CheekyDreams do
154
154
  @cycle = cycle [:red, :blue, [211, 192, 101]], 22
155
155
  end
156
156
 
157
- it "should have a frequency" do
158
- @cycle.freq.should == 22
159
- end
160
-
161
157
  it "should cycle through the colours as rgb" do
162
- @cycle.next.should == [255, 0, 0]
163
- @cycle.next.should == [ 0, 0, 255]
164
- @cycle.next.should == [211, 192, 101]
158
+ @cycle.next.should == [[255, 0, 0], 22]
159
+ @cycle.next.should == [[ 0, 0, 255], 22]
160
+ @cycle.next.should == [[211, 192, 101], 22]
165
161
 
166
- @cycle.next.should == [255, 0, 0]
167
- @cycle.next.should == [ 0, 0, 255]
168
- @cycle.next.should == [211, 192, 101]
162
+ @cycle.next.should == [[255, 0, 0], 22]
163
+ @cycle.next.should == [[ 0, 0, 255], 22]
164
+ @cycle.next.should == [[211, 192, 101], 22]
169
165
 
170
- @cycle.next.should == [255, 0, 0]
171
- @cycle.next.should == [ 0, 0, 255]
172
- @cycle.next.should == [211, 192, 101]
166
+ @cycle.next.should == [[255, 0, 0], 22]
167
+ @cycle.next.should == [[ 0, 0, 255], 22]
168
+ @cycle.next.should == [[211, 192, 101], 22]
173
169
  end
174
170
  end
175
171
 
@@ -179,15 +175,11 @@ describe CheekyDreams do
179
175
  @fade = fade :blue, :green, 1, 5
180
176
  end
181
177
 
182
- it "should have a freq of 2" do
183
- @fade.freq.should == 5
184
- end
185
-
186
- it "should be able to provide the steps when asked" do
187
- @fade.next.should == [ 0, 0, 255]
188
- @fade.next.should == [ 0, 255, 0]
189
- @fade.next.should == [ 0, 255, 0]
190
- @fade.next.should == [ 0, 255, 0]
178
+ it "should be able to fade to green and then have no frequency" do
179
+ @fade.next.should == [[ 0, 0, 255], 5]
180
+ @fade.next.should == [[ 0, 255, 0], 0]
181
+ @fade.next.should == [[ 0, 255, 0], 0]
182
+ @fade.next.should == [[ 0, 255, 0], 0]
191
183
  end
192
184
  end
193
185
 
@@ -196,25 +188,21 @@ describe CheekyDreams do
196
188
  @fade = fade [100, 100, 100], [110, 90, 0], 10, 2
197
189
  end
198
190
 
199
- it "should have a freq of 2" do
200
- @fade.freq.should == 2
201
- end
202
-
203
- it "should be able to provide the steps when asked" do
204
- @fade.next.should == [100, 100, 100]
205
- @fade.next.should == [101, 99, 90]
206
- @fade.next.should == [102, 98, 80]
207
- @fade.next.should == [103, 97, 70]
208
- @fade.next.should == [104, 96, 60]
209
- @fade.next.should == [105, 95, 50]
210
- @fade.next.should == [106, 94, 40]
211
- @fade.next.should == [107, 93, 30]
212
- @fade.next.should == [108, 92, 20]
213
- @fade.next.should == [109, 91, 10]
214
- @fade.next.should == [110, 90, 0]
191
+ it "should be able to fade to 110,90,0 and then have no frequency" do
192
+ @fade.next.should == [[100, 100, 100], 2]
193
+ @fade.next.should == [[101, 99, 90], 2]
194
+ @fade.next.should == [[102, 98, 80], 2]
195
+ @fade.next.should == [[103, 97, 70], 2]
196
+ @fade.next.should == [[104, 96, 60], 2]
197
+ @fade.next.should == [[105, 95, 50], 2]
198
+ @fade.next.should == [[106, 94, 40], 2]
199
+ @fade.next.should == [[107, 93, 30], 2]
200
+ @fade.next.should == [[108, 92, 20], 2]
201
+ @fade.next.should == [[109, 91, 10], 2]
202
+ @fade.next.should == [[110, 90, 0], 0]
215
203
  # and then continue to provide the same colour
216
- @fade.next.should == [110, 90, 0]
217
- @fade.next.should == [110, 90, 0]
204
+ @fade.next.should == [[110, 90, 0], 0]
205
+ @fade.next.should == [[110, 90, 0], 0]
218
206
  end
219
207
  end
220
208
  end
@@ -225,23 +213,20 @@ describe CheekyDreams do
225
213
  @fade_to = fade_to :green, 11, 2
226
214
  end
227
215
 
228
- it "should have a freq of 2" do
229
- @fade_to.freq.should == 2
230
- end
231
-
232
- it "should be able to gradually go to colour when asked" do
233
- @fade_to.next([0, 145, 0]).should == [0, 145, 0]
234
- @fade_to.next([0, 155, 0]).should == [0, 155, 0]
235
- @fade_to.next([0, 165, 0]).should == [0, 165, 0]
236
- @fade_to.next([0, 165, 0]).should == [0, 175, 0]
237
- @fade_to.next([0, 175, 0]).should == [0, 185, 0]
238
- @fade_to.next([0, 185, 0]).should == [0, 195, 0]
239
- @fade_to.next([0, 195, 0]).should == [0, 205, 0]
240
- @fade_to.next([0, 205, 0]).should == [0, 215, 0]
241
- @fade_to.next([0, 215, 0]).should == [0, 225, 0]
242
- @fade_to.next([0, 225, 0]).should == [0, 235, 0]
243
- @fade_to.next([0, 235, 0]).should == [0, 245, 0]
244
- @fade_to.next([0, 245, 0]).should == [0, 255, 0]
216
+ it "should be able to fade to :green and then have no frequency" do
217
+ @fade_to.next([0, 145, 0]).should == [[0, 145, 0], 2]
218
+ @fade_to.next([0, 155, 0]).should == [[0, 155, 0], 2]
219
+ @fade_to.next([0, 165, 0]).should == [[0, 165, 0], 2]
220
+ @fade_to.next([0, 165, 0]).should == [[0, 175, 0], 2]
221
+ @fade_to.next([0, 175, 0]).should == [[0, 185, 0], 2]
222
+ @fade_to.next([0, 185, 0]).should == [[0, 195, 0], 2]
223
+ @fade_to.next([0, 195, 0]).should == [[0, 205, 0], 2]
224
+ @fade_to.next([0, 205, 0]).should == [[0, 215, 0], 2]
225
+ @fade_to.next([0, 215, 0]).should == [[0, 225, 0], 2]
226
+ @fade_to.next([0, 225, 0]).should == [[0, 235, 0], 2]
227
+ @fade_to.next([0, 235, 0]).should == [[0, 245, 0], 2]
228
+ @fade_to.next([0, 245, 0]).should == [[0, 255, 0], 0]
229
+ @fade_to.next([0, 255, 0]).should == [[0, 255, 0], 0]
245
230
  end
246
231
  end
247
232
 
@@ -250,15 +235,11 @@ describe CheekyDreams do
250
235
  @fade_to = fade_to [130, 80, 170], 3, 20
251
236
  end
252
237
 
253
- it "should have a freq of 20" do
254
- @fade_to.freq.should == 20
255
- end
256
-
257
238
  it "should be able to gradually go to colour when asked" do
258
- @fade_to.next([190, 77, 140]).should == [190, 77, 140]
259
- @fade_to.next([190, 77, 140]).should == [170, 78, 150]
260
- @fade_to.next([170, 78, 150]).should == [150, 79, 160]
261
- @fade_to.next([150, 79, 160]).should == [130, 80, 170]
239
+ @fade_to.next([190, 77, 140]).should == [[190, 77, 140], 20]
240
+ @fade_to.next([190, 77, 140]).should == [[170, 78, 150], 20]
241
+ @fade_to.next([170, 78, 150]).should == [[150, 79, 160], 20]
242
+ @fade_to.next([150, 79, 160]).should == [[130, 80, 170], 0]
262
243
  end
263
244
  end
264
245
  end
@@ -266,25 +247,21 @@ describe CheekyDreams do
266
247
  describe CheekyDreams::Effects::Func do
267
248
  describe "when the block return rgb values" do
268
249
  before :each do
269
- @func = func(22) { |current_colour| [current_colour[0] + 1, current_colour[1] + 1, current_colour[2] + 1] }
270
- end
271
-
272
- it "should have a freq of 22" do
273
- @func.freq.should == 22
250
+ @func = func { |current_colour| [[current_colour[0] + 1, current_colour[1] + 1, current_colour[2] + 1], 191] }
274
251
  end
275
252
 
276
253
  it "should return the given rgb plus 1 to each of r, g, and b" do
277
- @func.next([2, 5, 6]).should == [3, 6, 7]
254
+ @func.next([2, 5, 6]).should == [[3, 6, 7], 191]
278
255
  end
279
256
  end
280
257
 
281
- describe "when the block return symbol" do
258
+ describe "when the block returns symbol" do
282
259
  before :each do
283
- @func = func(22) { |current_colour| :purple }
260
+ @func = func { |current_colour| [:purple, 246] }
284
261
  end
285
262
 
286
263
  it "should return the rgb for the symbol" do
287
- @func.next([2, 5, 6]).should == COLOURS[:purple]
264
+ @func.next([2, 5, 6]).should == [COLOURS[:purple], 246]
288
265
  end
289
266
  end
290
267
  end
@@ -318,24 +295,63 @@ describe CheekyDreams do
318
295
  @throb.b_centre.should == 50
319
296
  end
320
297
  end
298
+
299
+ describe CheekyDreams::Effects::LightShow do
300
+ before :each do
301
+ @effect1 = PreStuffedEffect.new([[1, 1, 1], 11], [[2, 2, 2], 0])
302
+ @effect2 = PreStuffedEffect.new([[3, 3, 3], 0])
303
+ @effect3 = PreStuffedEffect.new([[4, 4, 4], 12], [[5, 5, 5], 0])
304
+ @light_show = light_show @effect1, @effect2, @effect3
305
+ end
306
+
307
+ it 'should go through effects' do
308
+ @light_show.next.should == [[1, 1, 1], 11]
309
+ @light_show.next.should == [[2, 2, 2], 11]
310
+ @light_show.next.should == [[3, 3, 3], 11]
311
+ @light_show.next.should == [[4, 4, 4], 12]
312
+ @light_show.next.should == [[5, 5, 5], 0]
313
+ end
314
+ end
321
315
  end
322
316
  end
323
317
 
324
318
  module CheekyDreams
325
- describe FilteringAuditor do
319
+ describe SuppressDuplicatesAuditor do
326
320
  before :each do
327
321
  @delegate = mock('delegate auditor')
328
- @auditor = FilteringAuditor.new @delegate, [:error]
322
+ @auditor = SuppressDuplicatesAuditor.new @delegate
323
+ end
324
+
325
+ it 'should not send duplicate messages through to delegate' do
326
+ @delegate.should_receive(:audit).with(:type1, 'message1')
327
+ @delegate.should_receive(:audit).with(:type2, 'message2')
328
+ @delegate.should_receive(:audit).with(:type3, 'message3')
329
+ @auditor.audit :type1, 'message1'
330
+ @auditor.audit :type2, 'message2'
331
+ @auditor.audit :type1, 'message1'
332
+ @auditor.audit :type3, 'message3'
333
+ end
334
+ end
335
+
336
+ describe ForwardingAuditor do
337
+ before :each do
338
+ @errors, @blahs = mock('errors auditor'), mock('blahs auditor')
339
+ @auditor = ForwardingAuditor.new :error => @errors, :blah => @blahs
340
+ end
341
+
342
+ it 'should forward audits of type :error' do
343
+ @errors.should_receive(:audit).with(:error, 'errors here')
344
+ @auditor.audit :error, 'errors here'
329
345
  end
330
346
 
331
- it 'should allow through audits of type :error' do
332
- @delegate.should_receive(:audit).with(:error, 'here')
333
- @auditor.audit :error, 'here'
347
+ it 'should forward audits of type :blah' do
348
+ @blahs.should_receive(:audit).with(:blah, 'blahs here')
349
+ @auditor.audit :blah, 'blahs here'
334
350
  end
335
351
 
336
352
  it 'should not allow through other random audits' do
337
- @auditor.audit :error1, 'here'
338
- @auditor.audit :error2, 'here'
353
+ @auditor.audit :error1, 'oh'
354
+ @auditor.audit :blah2, 'no'
339
355
  end
340
356
  end
341
357
 
@@ -478,7 +494,7 @@ describe Light do
478
494
  @driver = StubDriver.new
479
495
  @light = Light.new @driver
480
496
  @collecting_auditor = CollectingAuditor.new
481
- @audit_errors = filtering([:error], stdio_audit)
497
+ @audit_errors = forward(:error => stdio_audit)
482
498
  @light.auditor = audit_to @audit_errors, @collecting_auditor
483
499
  end
484
500
 
@@ -490,7 +506,7 @@ describe Light do
490
506
  before :each do
491
507
  @error_message = "On purpose error"
492
508
  @error = RuntimeError.new @error_message
493
- @effect = StubEffect.new(20) { raise @error }
509
+ @effect = StubEffect.new { raise @error }
494
510
  @light.auditor = @collecting_auditor
495
511
  end
496
512
 
@@ -503,7 +519,7 @@ describe Light do
503
519
  describe "frequency of effect" do
504
520
  describe 'when frequency is 1' do
505
521
  before :each do
506
- @effect = StubEffect.new 1
522
+ @effect = StubEffect.new { [[0, 0, 0], 1] }
507
523
  end
508
524
 
509
525
  it 'should call the effect almost immediately, and then about 1 second later' do
@@ -517,7 +533,7 @@ describe Light do
517
533
 
518
534
  describe 'when frequency is 10' do
519
535
  before :each do
520
- @effect = StubEffect.new 10
536
+ @effect = StubEffect.new { [[0,0,0], 10] }
521
537
  end
522
538
 
523
539
  it 'should call the effect between 9 and 11 times in the next second' do
@@ -531,7 +547,7 @@ describe Light do
531
547
 
532
548
  describe 'when frequency is 5' do
533
549
  before :each do
534
- @effect = StubEffect.new 5
550
+ @effect = StubEffect.new { [[0, 0, 0], 5] }
535
551
  end
536
552
 
537
553
  it 'should call the effect 5 times in the next second' do
@@ -622,7 +638,7 @@ describe Light do
622
638
 
623
639
  it "should be able to go different colours based on a function" do
624
640
  cycle = [:blue, :red, :green, :purple, :grey, :aqua].cycle
625
- @light.go func(10) { cycle.next }
641
+ @light.go func { [cycle.next, 10] }
626
642
  @driver.should_become :blue
627
643
  @driver.should_become :red
628
644
  @driver.should_become :green
@@ -1,4 +1,3 @@
1
- AuditEvent = Struct.new(:type, :message)
2
1
 
3
2
  class CollectingAuditor
4
3
 
@@ -9,10 +8,10 @@ class CollectingAuditor
9
8
  end
10
9
 
11
10
  def audit type, message
12
- @events << AuditEvent.new(type, message)
11
+ @events << CheekyDreams::AuditEvent.new(type, message)
13
12
  end
14
13
 
15
14
  def has_received? type, message
16
- @events.include? AuditEvent.new(type, message)
15
+ @events.include? CheekyDreams::AuditEvent.new(type, message)
17
16
  end
18
17
  end
@@ -1,18 +1,29 @@
1
+ class PreStuffedEffect < CheekyDreams::Effects::Effect
2
+ def initialize *results
3
+ @results = results
4
+ end
5
+
6
+ def next last_colour = nil
7
+ result = @results.delete_at 0
8
+ raise 'no more results in the prestuff effect!' unless result
9
+ result
10
+ end
11
+ end
1
12
 
2
13
  class StubEffect < CheekyDreams::Effects::Effect
3
14
 
4
- attr_reader :freq, :asked_for_colour_count
15
+ attr_reader :asked_for_colour_count
5
16
 
6
- def initialize freq, &block
7
- @freq, @asked_for_colour_count = freq, 0
17
+ def initialize &block
18
+ @asked_for_colour_count = 0
8
19
  if block
9
20
  @block = block
10
21
  else
11
- @block = proc { [0,0,0] }
22
+ @block = proc { [[0,0,0], 1] }
12
23
  end
13
24
  end
14
25
 
15
- def next last_colour
26
+ def next last_colour = nil
16
27
  @asked_for_colour_count += 1
17
28
  @block.yield
18
29
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: cheeky-dreams
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.5
4
+ version: 0.0.6
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -13,7 +13,7 @@ date: 2011-11-17 00:00:00.000000000Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rspec
16
- requirement: &2169112540 !ruby/object:Gem::Requirement
16
+ requirement: &2168537340 !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ! '>='
@@ -21,10 +21,10 @@ dependencies:
21
21
  version: 2.3.0
22
22
  type: :development
23
23
  prerelease: false
24
- version_requirements: *2169112540
24
+ version_requirements: *2168537340
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: bundler
27
- requirement: &2169112060 !ruby/object:Gem::Requirement
27
+ requirement: &2168536860 !ruby/object:Gem::Requirement
28
28
  none: false
29
29
  requirements:
30
30
  - - ~>
@@ -32,10 +32,10 @@ dependencies:
32
32
  version: 1.0.0
33
33
  type: :development
34
34
  prerelease: false
35
- version_requirements: *2169112060
35
+ version_requirements: *2168536860
36
36
  - !ruby/object:Gem::Dependency
37
37
  name: jeweler
38
- requirement: &2169111580 !ruby/object:Gem::Requirement
38
+ requirement: &2168536380 !ruby/object:Gem::Requirement
39
39
  none: false
40
40
  requirements:
41
41
  - - ~>
@@ -43,10 +43,10 @@ dependencies:
43
43
  version: 1.6.4
44
44
  type: :development
45
45
  prerelease: false
46
- version_requirements: *2169111580
46
+ version_requirements: *2168536380
47
47
  - !ruby/object:Gem::Dependency
48
48
  name: rcov
49
- requirement: &2169111080 !ruby/object:Gem::Requirement
49
+ requirement: &2168535900 !ruby/object:Gem::Requirement
50
50
  none: false
51
51
  requirements:
52
52
  - - ! '>='
@@ -54,7 +54,7 @@ dependencies:
54
54
  version: '0'
55
55
  type: :development
56
56
  prerelease: false
57
- version_requirements: *2169111080
57
+ version_requirements: *2168535900
58
58
  description: For controlling dream cheeky usb light
59
59
  email: simojenki@gmail.com
60
60
  executables: []
@@ -73,9 +73,9 @@ files:
73
73
  - VERSION
74
74
  - cheeky-dreams.gemspec
75
75
  - lib/cheeky-dreams.rb
76
+ - samples/fade-to-throb.rb
76
77
  - spec/cheeky-dreams_spec.rb
77
78
  - spec/off.rb
78
- - spec/small-test.rb
79
79
  - spec/spec_helper.rb
80
80
  - spec/support/collecting_auditor.rb
81
81
  - spec/support/stub_driver.rb
@@ -97,7 +97,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
97
97
  version: '0'
98
98
  segments:
99
99
  - 0
100
- hash: -1379354147847009735
100
+ hash: 3090143854865430648
101
101
  required_rubygems_version: !ruby/object:Gem::Requirement
102
102
  none: false
103
103
  requirements: