pulse_meter_core 0.5.3 → 0.5.4

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.
@@ -21,14 +21,14 @@ shared_examples_for "timeline sensor" do |extra_init_values, default_event|
21
21
  before(:each) do
22
22
  @now = Time.now
23
23
  tc = PulseMeter::TimeConverter.new(timezone)
24
-
24
+
25
25
  @redis_now = tc.to_redis(@now).to_i
26
26
 
27
27
  @interval_id = (@redis_now / interval) * interval
28
28
  @prev_interval_id = (@redis_now / interval) * interval - interval
29
29
 
30
30
  @raw_data_key = sensor.raw_data_key(@interval_id)
31
-
31
+
32
32
  @prev_raw_data_key = sensor.raw_data_key(@prev_interval_id)
33
33
 
34
34
  @next_raw_data_key = sensor.raw_data_key(@interval_id + interval)
@@ -38,7 +38,7 @@ shared_examples_for "timeline sensor" do |extra_init_values, default_event|
38
38
  end
39
39
 
40
40
  describe "#dump" do
41
- it "should be dumped succesfully" do
41
+ it "is dumped succesfully" do
42
42
  expect {sensor.dump!}.not_to raise_exception
43
43
  end
44
44
  end
@@ -50,35 +50,35 @@ shared_examples_for "timeline sensor" do |extra_init_values, default_event|
50
50
  @restored = base_class.restore(sensor.name)
51
51
  end
52
52
 
53
- it "should restore #{described_class} instance" do
54
- @restored.should be_instance_of(described_class)
53
+ it "restores #{described_class} instance" do
54
+ expect(@restored).to be_instance_of(described_class)
55
55
  end
56
56
 
57
- it "should restore object with the same data" do
57
+ it "restores object with the same data" do
58
58
  def inner_data(obj)
59
59
  obj.instance_variables.sort.map {|v| obj.instance_variable_get(v)}
60
60
  end
61
61
 
62
- inner_data(sensor).should == inner_data(@restored)
62
+ expect(inner_data(sensor)).to eq(inner_data(@restored))
63
63
  end
64
64
  end
65
65
 
66
66
  describe "#event" do
67
- it "should write events to redis" do
67
+ it "writes events to redis" do
68
68
  expect{
69
69
  sensor.event(sample_event)
70
70
  }.to change{ redis.keys('*').count }.by(1)
71
71
  end
72
72
 
73
- it "should write data so that it totally expires after :raw_data_ttl" do
73
+ it "writes data so that it totally expires after :raw_data_ttl" do
74
74
  key_count = redis.keys('*').count
75
75
  sensor.event(sample_event)
76
76
  Timecop.freeze(@now + raw_data_ttl + 1) do
77
- redis.keys('*').count.should == key_count
77
+ expect(redis.keys('*').count).to eq(key_count)
78
78
  end
79
79
  end
80
80
 
81
- it "should write data to bucket indicated by truncated timestamp" do
81
+ it "writes data to bucket indicated by truncated timestamp" do
82
82
  expect{
83
83
  Timecop.freeze(@start_of_interval) do
84
84
  sensor.event(sample_event)
@@ -87,32 +87,32 @@ shared_examples_for "timeline sensor" do |extra_init_values, default_event|
87
87
  end
88
88
 
89
89
  it "returns true if event processed correctly" do
90
- sensor.event(sample_event).should be
90
+ expect(sensor.event(sample_event)).to be
91
91
  end
92
92
 
93
93
  it "catches StandardErrors and returns false" do
94
- sensor.stub(:aggregate_event) {raise StandardError}
95
- sensor.event(sample_event).should_not be
94
+ allow(sensor).to receive(:aggregate_event) {raise StandardError}
95
+ expect(sensor.event(sample_event)).not_to be
96
96
  end
97
97
  end
98
98
 
99
99
  describe "#event_at" do
100
100
  let(:now) {@now}
101
- it "should write events to redis" do
101
+ it "writes events to redis" do
102
102
  expect{
103
103
  sensor.event_at(now, sample_event)
104
104
  }.to change{ redis.keys('*').count }.by(1)
105
105
  end
106
106
 
107
- it "should write data so that it totally expires after :raw_data_ttl" do
107
+ it "writes data so that it totally expires after :raw_data_ttl" do
108
108
  key_count = redis.keys('*').count
109
109
  sensor.event_at(now, sample_event)
110
110
  Timecop.freeze(now + raw_data_ttl + 1) do
111
- redis.keys('*').count.should == key_count
111
+ expect(redis.keys('*').count).to eq(key_count)
112
112
  end
113
113
  end
114
114
 
115
- it "should write data to bucket indicated by passed time" do
115
+ it "writes data to bucket indicated by passed time" do
116
116
  expect{
117
117
  Timecop.freeze(@start_of_interval) do
118
118
  sensor.event_at(@start_of_prev_interval, sample_event)
@@ -122,65 +122,65 @@ shared_examples_for "timeline sensor" do |extra_init_values, default_event|
122
122
  end
123
123
 
124
124
  describe "#summarize" do
125
- it "should convert data stored by raw_data_key to a value defined only by stored data" do
125
+ it "converts data stored by raw_data_key to a value defined only by stored data" do
126
126
  Timecop.freeze(@start_of_interval) do
127
127
  sensor.event(sample_event)
128
128
  end
129
129
  Timecop.freeze(@start_of_interval + interval) do
130
130
  sensor.event(sample_event)
131
131
  end
132
- sensor.summarize(@raw_data_key).should == sensor.summarize(@next_raw_data_key)
133
- sensor.summarize(@raw_data_key).should_not be_nil
132
+ expect(sensor.summarize(@raw_data_key)).to eq(sensor.summarize(@next_raw_data_key))
133
+ expect(sensor.summarize(@raw_data_key)).not_to be_nil
134
134
  end
135
135
  end
136
136
 
137
137
  describe "#reduce" do
138
- it "should store summarized value into data_key" do
138
+ it "stores summarized value into data_key" do
139
139
  Timecop.freeze(@start_of_interval){ sensor.event(sample_event) }
140
140
  val = sensor.summarize(@raw_data_key)
141
- val.should_not be_nil
141
+ expect(val).not_to be_nil
142
142
  sensor.reduce(@interval_id)
143
- redis.get(sensor.data_key(@interval_id)).should == val.to_s
143
+ expect(redis.get(sensor.data_key(@interval_id))).to eq(val.to_s)
144
144
  end
145
145
 
146
- it "should remove original raw_data_key" do
146
+ it "removes original raw_data_key" do
147
147
  Timecop.freeze(@start_of_interval){ sensor.event(sample_event) }
148
148
  expect{
149
149
  sensor.reduce(@interval_id)
150
150
  }.to change{ redis.keys(sensor.raw_data_key(@interval_id)).count }.from(1).to(0)
151
151
  end
152
152
 
153
- it "should expire stored summarized data" do
153
+ it "expires stored summarized data" do
154
154
  Timecop.freeze(@start_of_interval) do
155
155
  sensor.event(sample_event)
156
156
  sensor.reduce(@interval_id)
157
- redis.keys(sensor.data_key(@interval_id)).count.should == 1
157
+ expect(redis.keys(sensor.data_key(@interval_id)).count).to eq(1)
158
158
  end
159
159
  Timecop.freeze(@start_of_interval + ttl + 1) do
160
- redis.keys(sensor.data_key(@interval_id)).count.should == 0
160
+ expect(redis.keys(sensor.data_key(@interval_id)).count).to eq(0)
161
161
  end
162
162
  end
163
163
 
164
- it "should not store data if there is no corresponding raw data" do
164
+ it "does not store data if there is no corresponding raw data" do
165
165
  Timecop.freeze(@start_of_interval) do
166
166
  sensor.reduce(@interval_id)
167
- redis.keys(sensor.data_key(@interval_id)).count.should == 0
167
+ expect(redis.keys(sensor.data_key(@interval_id)).count).to eq(0)
168
168
  end
169
169
  end
170
170
 
171
- it "should not store summarized data if it already exists" do
171
+ it "does not store summarized data if it already exists" do
172
172
  data_key = sensor.data_key(@interval_id)
173
173
  redis.set(data_key, :dummy)
174
174
  Timecop.freeze(@start_of_interval) do
175
175
  sensor.event(sample_event)
176
176
  sensor.reduce(@interval_id)
177
- redis.get(data_key).should == "dummy"
177
+ expect(redis.get(data_key)).to eq("dummy")
178
178
  end
179
179
  end
180
180
  end
181
181
 
182
182
  describe "#reduce_all_raw" do
183
- it "should reduce all data older than reduce_delay" do
183
+ it "reduces all data older than reduce_delay" do
184
184
  Timecop.freeze(@start_of_interval){ sensor.event(sample_event) }
185
185
  val0 = sensor.summarize(@raw_data_key)
186
186
  Timecop.freeze(@start_of_interval + interval){ sensor.event(sample_event) }
@@ -191,8 +191,8 @@ shared_examples_for "timeline sensor" do |extra_init_values, default_event|
191
191
  end
192
192
  }.to change{ redis.keys(sensor.raw_data_key('*')).count }.from(2).to(0)
193
193
 
194
- redis.get(sensor.data_key(@interval_id)).should == val0.to_s
195
- redis.get(sensor.data_key(@interval_id + interval)).should == val1.to_s
194
+ expect(redis.get(sensor.data_key(@interval_id))).to eq(val0.to_s)
195
+ expect(redis.get(sensor.data_key(@interval_id + interval))).to eq(val1.to_s)
196
196
  end
197
197
 
198
198
  it "creates up to MAX_INTERVALS compresed data pieces from previously uncompressed data" do
@@ -209,7 +209,7 @@ shared_examples_for "timeline sensor" do |extra_init_values, default_event|
209
209
  end
210
210
  end
211
211
 
212
- it "should not reduce fresh data" do
212
+ it "does not reduce fresh data" do
213
213
  Timecop.freeze(@start_of_interval){ sensor.event(sample_event) }
214
214
 
215
215
  expect{
@@ -223,181 +223,181 @@ shared_examples_for "timeline sensor" do |extra_init_values, default_event|
223
223
  end
224
224
 
225
225
  describe ".reduce_all_raw" do
226
- it "should silently skip objects without reduce logic" do
226
+ it "silently skips objects without reduce logic" do
227
227
  dummy.dump!
228
228
  expect {described_class.reduce_all_raw}.not_to raise_exception
229
229
  end
230
230
 
231
- it "should send reduce_all_raw to all dumped objects" do
232
- described_class.any_instance.should_receive(:reduce_all_raw)
231
+ it "sends reduce_all_raw to all dumped objects" do
232
+ expect_any_instance_of(described_class).to receive(:reduce_all_raw)
233
233
  described_class.reduce_all_raw
234
234
  end
235
235
  end
236
236
 
237
237
  describe "#timeline_within" do
238
- it "should raise exception unless both arguments are Time objects" do
238
+ it "raises exception unless both arguments are Time objects" do
239
239
  [:q, nil, -1].each do |bad_value|
240
240
  expect{ sensor.timeline_within(@now, bad_value) }.to raise_exception(ArgumentError)
241
241
  expect{ sensor.timeline_within(bad_value, @now) }.to raise_exception(ArgumentError)
242
242
  end
243
243
  end
244
244
 
245
- it "should return an array of SensorData objects corresponding to stored data for passed interval" do
245
+ it "returns an array of SensorData objects corresponding to stored data for passed interval" do
246
246
  sensor.event(sample_event)
247
247
  now = @now
248
248
  timeline = sensor.timeline_within(now - 1, now)
249
- timeline.should be_kind_of(Array)
250
- timeline.each{|i| i.should be_kind_of(SensorData) }
249
+ expect(timeline).to be_kind_of(Array)
250
+ timeline.each{|i| expect(i).to be_kind_of(SensorData) }
251
251
  end
252
252
 
253
- it "should return array of results containing as many results as there are sensor interval beginnings in the passed interval" do
253
+ it "returns array of results containing as many results as there are sensor interval beginnings in the passed interval" do
254
254
  Timecop.freeze(@start_of_interval){ sensor.event(sample_event) }
255
255
  Timecop.freeze(@start_of_interval + interval){ sensor.event(sample_event) }
256
256
 
257
257
  future = @start_of_interval + 3600
258
258
  Timecop.freeze(future) do
259
- sensor.timeline_within(
259
+ expect(sensor.timeline_within(
260
260
  Time.at(@start_of_interval + interval - 1),
261
261
  Time.at(@start_of_interval + interval + 1)
262
- ).size.should == 1
262
+ ).size).to eq(1)
263
263
 
264
- sensor.timeline_within(
264
+ expect(sensor.timeline_within(
265
265
  Time.at(@start_of_interval - 1),
266
266
  Time.at(@start_of_interval + interval + 1)
267
- ).size.should == 2
267
+ ).size).to eq(2)
268
268
  end
269
269
 
270
270
  Timecop.freeze(@start_of_interval + interval + 2) do
271
- sensor.timeline_within(
271
+ expect(sensor.timeline_within(
272
272
  Time.at(@start_of_interval + interval + 1),
273
273
  Time.at(@start_of_interval + interval + 2)
274
- ).size.should == 0
274
+ ).size).to eq(0)
275
275
  end
276
276
  end
277
277
 
278
278
  context "to avoid getting to much data" do
279
279
  let(:max) {PulseMeter::Sensor::Timeline::MAX_TIMESPAN_POINTS}
280
280
 
281
- it "should skip some points not to exceed MAX_TIMESPAN_POINTS" do
281
+ it "skips some points not to exceed MAX_TIMESPAN_POINTS" do
282
282
  count = max * 2
283
- sensor.timeline_within(
283
+ expect(sensor.timeline_within(
284
284
  Time.at(@start_of_interval - 1),
285
285
  Time.at(@start_of_interval + count * interval)
286
- ).size.should < max
286
+ ).size).to be < max
287
287
  end
288
288
 
289
- it "should not skip any points when timeline orginal size is less then MAX_TIMESPAN_POINTS" do
289
+ it "does not skip any points when timeline orginal size is less then MAX_TIMESPAN_POINTS" do
290
290
  count = max - 1
291
- sensor.timeline_within(
291
+ expect(sensor.timeline_within(
292
292
  Time.at(@start_of_interval - 1),
293
293
  Time.at(@start_of_interval + count * interval)
294
- ).size.should == count
294
+ ).size).to eq(count)
295
295
  end
296
296
 
297
- it "should give full data in case skip_optimization parameter set to true" do
297
+ it "does give full data in case skip_optimization parameter set to true" do
298
298
  count = max * 2
299
- sensor.timeline_within(
299
+ expect(sensor.timeline_within(
300
300
  Time.at(@start_of_interval - 1),
301
301
  Time.at(@start_of_interval + count * interval),
302
302
  true
303
- ).size.should == count
303
+ ).size).to eq(count)
304
304
  end
305
305
  end
306
306
  end
307
307
 
308
308
  describe "#timeline" do
309
- it "should raise exception if passed interval is not a positive integer" do
309
+ it "raises exception if passed interval is not a positive integer" do
310
310
  [:q, nil, -1].each do |bad_interval|
311
311
  expect{ sensor.timeline(bad_interval) }.to raise_exception(ArgumentError)
312
312
  end
313
313
  end
314
314
 
315
- it "should request timeline within interval from given number of seconds ago till now" do
315
+ it "requests timeline within interval from given number of seconds ago till now" do
316
316
  Timecop.freeze(@now) do
317
317
  now = @now
318
318
  ago = interval * 100
319
- sensor.timeline(ago).should == sensor.timeline_within(now - ago, now)
319
+ expect(sensor.timeline(ago)).to eq(sensor.timeline_within(now - ago, now))
320
320
  end
321
321
  end
322
322
 
323
- it "should return array of results containing as many results as there are sensor interval beginnings in the passed interval" do
323
+ it "returns array of results containing as many results as there are sensor interval beginnings in the passed interval" do
324
324
  Timecop.freeze(@start_of_interval){ sensor.event(sample_event) }
325
325
  Timecop.freeze(@start_of_interval + interval){ sensor.event(sample_event) }
326
326
 
327
327
  Timecop.freeze(@start_of_interval + interval + 1) do
328
- sensor.timeline(2).size.should == 1
328
+ expect(sensor.timeline(2).size).to eq(1)
329
329
  end
330
330
  Timecop.freeze(@start_of_interval + interval + 2) do
331
- sensor.timeline(1).size.should == 0
331
+ expect(sensor.timeline(1).size).to eq(0)
332
332
  end
333
333
  Timecop.freeze(@start_of_interval + interval + 1) do
334
- sensor.timeline(2 + interval).size.should == 2
334
+ expect(sensor.timeline(2 + interval).size).to eq(2)
335
335
  end
336
336
  end
337
337
  end
338
338
 
339
339
  describe "#drop_within" do
340
- it "should raise exception unless both arguments are Time objects" do
340
+ it "raises exception unless both arguments are Time objects" do
341
341
  [:q, nil, -1].each do |bad_value|
342
342
  expect{ sensor.drop_within(@now, bad_value) }.to raise_exception(ArgumentError)
343
343
  expect{ sensor.drop_within(bad_value, @now) }.to raise_exception(ArgumentError)
344
344
  end
345
345
  end
346
346
 
347
- it "should drop as many raw results as there are sensor interval beginnings in the passed interval" do
347
+ it "drops as many raw results as there are sensor interval beginnings in the passed interval" do
348
348
  Timecop.freeze(@start_of_interval){ sensor.event(sample_event) }
349
349
  Timecop.freeze(@start_of_interval + interval){ sensor.event(sample_event) }
350
350
 
351
351
  future = @start_of_interval + interval * 3
352
352
  Timecop.freeze(future) do
353
- sensor.drop_within(
353
+ expect(sensor.drop_within(
354
354
  Time.at(@start_of_interval + interval - 1),
355
355
  Time.at(@start_of_interval + interval + 1)
356
- ).should == 1
356
+ )).to eq(1)
357
357
 
358
358
  data = sensor.timeline_within(
359
359
  Time.at(@start_of_interval + interval - 1),
360
360
  Time.at(@start_of_interval + interval + 1)
361
361
  )
362
- data.size.should == 1
363
- data.first.value.should be_nil # since data is dropped
362
+ expect(data.size).to eq(1)
363
+ expect(data.first.value).to be_nil # since data is dropped
364
364
 
365
365
  end
366
366
 
367
367
  Timecop.freeze(@start_of_interval + interval + 2) do
368
- sensor.drop_within(
368
+ expect(sensor.drop_within(
369
369
  Time.at(@start_of_interval + interval + 1),
370
370
  Time.at(@start_of_interval + interval + 2)
371
- ).should == 0
371
+ )).to eq(0)
372
372
  end
373
373
  end
374
374
 
375
- it "should drop as many reduced results as there are sensor interval beginnings in the passed interval" do
375
+ it "drops as many reduced results as there are sensor interval beginnings in the passed interval" do
376
376
  Timecop.freeze(@start_of_interval){ sensor.event(sample_event) }
377
377
  Timecop.freeze(@start_of_interval + interval){ sensor.event(sample_event) }
378
378
 
379
379
  future = @start_of_interval
380
380
  Timecop.freeze(future) do
381
381
  sensor.reduce_all_raw
382
- sensor.drop_within(
382
+ expect(sensor.drop_within(
383
383
  Time.at(@start_of_interval + interval - 1),
384
384
  Time.at(@start_of_interval + interval + 1)
385
- ).should == 1
385
+ )).to eq(1)
386
386
 
387
387
  data = sensor.timeline_within(
388
388
  Time.at(@start_of_interval + interval - 1),
389
389
  Time.at(@start_of_interval + interval + 1)
390
390
  )
391
- data.size.should == 1
392
- data.first.value.should be_nil # since data is dropped
391
+ expect(data.size).to eq(1)
392
+ expect(data.first.value).to be_nil # since data is dropped
393
393
 
394
394
  end
395
395
 
396
396
  Timecop.freeze(@start_of_interval + interval + 2) do
397
- sensor.drop_within(
397
+ expect(sensor.drop_within(
398
398
  Time.at(@start_of_interval + interval + 1),
399
399
  Time.at(@start_of_interval + interval + 2)
400
- ).should == 0
400
+ )).to eq(0)
401
401
  end
402
402
  end
403
403
  end
@@ -405,11 +405,11 @@ shared_examples_for "timeline sensor" do |extra_init_values, default_event|
405
405
  describe "SensorData value for an interval" do
406
406
  def check_sensor_data(sensor, value)
407
407
  data = sensor.timeline(2).first
408
- data.value.should be_generally_equal(sensor.deflate_safe(value))
409
- data.start_time.to_i.should == @start_of_interval.to_i
408
+ expect(data.value).to be_generally_equal(sensor.deflate_safe(value))
409
+ expect(data.start_time.to_i).to eq(@start_of_interval.to_i)
410
410
  end
411
411
 
412
- it "should contain summarized value stored by data_key for reduced intervals" do
412
+ it "contains summarized value stored by data_key for reduced intervals" do
413
413
  Timecop.freeze(@start_of_interval){ sensor.event(sample_event) }
414
414
  sensor.reduce(@interval_id)
415
415
  Timecop.freeze(@start_of_interval + 1){
@@ -417,14 +417,14 @@ shared_examples_for "timeline sensor" do |extra_init_values, default_event|
417
417
  }
418
418
  end
419
419
 
420
- it "should contain summarized value based on raw data for intervals not yet reduced" do
420
+ it "contains summarized value based on raw data for intervals not yet reduced" do
421
421
  Timecop.freeze(@start_of_interval){ sensor.event(sample_event) }
422
422
  Timecop.freeze(@start_of_interval + 1){
423
423
  check_sensor_data(sensor, sensor.summarize(@raw_data_key))
424
424
  }
425
425
  end
426
426
 
427
- it "should contain nil for intervals without any data" do
427
+ it "contains nil for intervals without any data" do
428
428
  Timecop.freeze(@start_of_interval + 1) {
429
429
  check_sensor_data(sensor, nil)
430
430
  }
@@ -432,14 +432,14 @@ shared_examples_for "timeline sensor" do |extra_init_values, default_event|
432
432
  end
433
433
 
434
434
  describe "#cleanup" do
435
- it "should remove all sensor data (raw data, reduced data, annotations) from redis" do
435
+ it "removes all sensor data (raw data, reduced data, annotations) from redis" do
436
436
  Timecop.freeze(@start_of_interval){ sensor.event(sample_event) }
437
437
  sensor.reduce(@interval_id)
438
438
  Timecop.freeze(@start_of_interval + interval){ sensor.event(sample_event) }
439
439
  sensor.annotate("Fooo sensor")
440
440
 
441
441
  sensor.cleanup
442
- redis.keys('*').should be_empty
442
+ expect(redis.keys('*')).to be_empty
443
443
  end
444
444
  end
445
445