pulse-meter 0.2.1 → 0.2.2
Sign up to get free protection for your applications and to get access to all the features.
- data/.travis.yml +4 -0
- data/examples/basic.ru +23 -5
- data/examples/basic_sensor_data.rb +15 -2
- data/examples/full/server.ru +2 -3
- data/examples/minimal/server.ru +3 -2
- data/lib/pulse-meter/sensor.rb +2 -1
- data/lib/pulse-meter/sensor/configuration.rb +3 -1
- data/lib/pulse-meter/sensor/hashed_indicator.rb +22 -0
- data/lib/pulse-meter/sensor/timeline.rb +13 -1
- data/lib/pulse-meter/version.rb +1 -1
- data/lib/pulse-meter/visualize/app.rb +6 -2
- data/lib/pulse-meter/visualize/base.rb +15 -0
- data/lib/pulse-meter/visualize/dsl/base.rb +131 -0
- data/lib/pulse-meter/visualize/dsl/errors.rb +0 -6
- data/lib/pulse-meter/visualize/dsl/layout.rb +12 -41
- data/lib/pulse-meter/visualize/dsl/page.rb +15 -41
- data/lib/pulse-meter/visualize/dsl/sensor.rb +9 -10
- data/lib/pulse-meter/visualize/dsl/widget.rb +18 -65
- data/lib/pulse-meter/visualize/dsl/widget_old.rb +95 -0
- data/lib/pulse-meter/visualize/dsl/widgets/area.rb +20 -0
- data/lib/pulse-meter/visualize/dsl/widgets/gauge.rb +12 -0
- data/lib/pulse-meter/visualize/dsl/widgets/line.rb +21 -0
- data/lib/pulse-meter/visualize/dsl/widgets/pie.rb +16 -0
- data/lib/pulse-meter/visualize/dsl/widgets/table.rb +19 -0
- data/lib/pulse-meter/visualize/layout.rb +7 -16
- data/lib/pulse-meter/visualize/page.rb +5 -10
- data/lib/pulse-meter/visualize/public/favicon.ico +0 -0
- data/lib/pulse-meter/visualize/public/js/application.coffee +156 -107
- data/lib/pulse-meter/visualize/public/js/application.js +283 -122
- data/lib/pulse-meter/visualize/sensor.rb +7 -13
- data/lib/pulse-meter/visualize/views/main.haml +8 -52
- data/lib/pulse-meter/visualize/views/widgets/area.haml +31 -0
- data/lib/pulse-meter/visualize/views/widgets/extend_options.haml +11 -0
- data/lib/pulse-meter/visualize/views/widgets/gauge.haml +13 -0
- data/lib/pulse-meter/visualize/views/widgets/line.haml +31 -0
- data/lib/pulse-meter/visualize/views/widgets/pie.haml +13 -0
- data/lib/pulse-meter/visualize/views/widgets/table.haml +23 -0
- data/lib/pulse-meter/visualize/widget.rb +17 -87
- data/lib/pulse-meter/visualize/widgets/gauge.rb +47 -0
- data/lib/pulse-meter/visualize/widgets/pie.rb +36 -0
- data/lib/pulse-meter/visualize/widgets/timeline.rb +90 -0
- data/lib/pulse-meter/visualizer.rb +18 -8
- data/perl/PulseMeter/Sensor/Base.pm +42 -0
- data/perl/PulseMeter/Sensor/Counter.pm +19 -0
- data/perl/PulseMeter/Sensor/HashedIndicator.pm +12 -0
- data/perl/PulseMeter/Sensor/Indicator.pm +17 -0
- data/perl/PulseMeter/Sensor/Timeline.pm +51 -0
- data/perl/PulseMeter/Sensor/Timelined/Average.pm +13 -0
- data/perl/PulseMeter/Sensor/Timelined/Counter.pm +12 -0
- data/perl/PulseMeter/Sensor/Timelined/HashedCounter.pm +12 -0
- data/perl/PulseMeter/Sensor/Timelined/Max.pm +18 -0
- data/perl/PulseMeter/Sensor/Timelined/Median.pm +8 -0
- data/perl/PulseMeter/Sensor/Timelined/Min.pm +18 -0
- data/perl/PulseMeter/Sensor/Timelined/Percentile.pm +17 -0
- data/perl/PulseMeter/Sensor/Timelined/UniqCounter.pm +13 -0
- data/perl/PulseMeter/Sensor/UniqCounter.pm +12 -0
- data/pulse-meter.gemspec +1 -0
- data/spec/pulse_meter/sensor/configuration_spec.rb +10 -2
- data/spec/pulse_meter/sensor/hashed_indicator_spec.rb +39 -0
- data/spec/pulse_meter/visualize/dsl/layout_spec.rb +8 -8
- data/spec/pulse_meter/visualize/dsl/page_spec.rb +29 -42
- data/spec/pulse_meter/visualize/dsl/sensor_spec.rb +5 -5
- data/spec/pulse_meter/visualize/dsl/widget_spec.rb +1 -122
- data/spec/pulse_meter/visualize/dsl/widgets/area_spec.rb +44 -0
- data/spec/pulse_meter/visualize/dsl/widgets/gauge_spec.rb +22 -0
- data/spec/pulse_meter/visualize/dsl/widgets/line_spec.rb +44 -0
- data/spec/pulse_meter/visualize/dsl/widgets/pie_spec.rb +35 -0
- data/spec/pulse_meter/visualize/dsl/widgets/table_spec.rb +36 -0
- data/spec/pulse_meter/visualize/layout_spec.rb +3 -3
- data/spec/pulse_meter/visualize/page_spec.rb +2 -2
- data/spec/pulse_meter/visualize/sensor_spec.rb +4 -4
- data/spec/pulse_meter/visualize/series_extractor_spec.rb +3 -3
- data/spec/pulse_meter/visualize/widgets/area_spec.rb +78 -0
- data/spec/pulse_meter/visualize/widgets/gauge_spec.rb +63 -0
- data/spec/pulse_meter/visualize/widgets/line_spec.rb +77 -0
- data/spec/pulse_meter/visualize/widgets/pie_spec.rb +73 -0
- data/spec/pulse_meter/visualize/widgets/table_spec.rb +78 -0
- data/spec/shared_examples/dsl_widget.rb +106 -0
- data/spec/shared_examples/timeline_sensor.rb +32 -2
- metadata +75 -6
- data/lib/pulse-meter/visualize/dsl.rb +0 -0
- data/spec/pulse_meter/visualize/widget_spec.rb +0 -122
@@ -0,0 +1,35 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe PulseMeter::Visualize::DSL::Widgets::Pie do
|
4
|
+
it_should_behave_like "dsl widget"
|
5
|
+
|
6
|
+
let(:interval){ 100 }
|
7
|
+
let(:name) { "some_sensor" }
|
8
|
+
let!(:sensor){ PulseMeter::Sensor::Timelined::Max.new(name, :ttl => 1000, :interval => interval) }
|
9
|
+
|
10
|
+
let(:widget_name){ "some_widget" }
|
11
|
+
let(:w){ described_class.new(widget_name) }
|
12
|
+
|
13
|
+
describe "#to_data" do
|
14
|
+
it "should produce PulseMeter::Visualize::Widgets::Pie class" do
|
15
|
+
w.to_data.should be_kind_of(PulseMeter::Visualize::Widgets::Pie)
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
describe "#values_label" do
|
20
|
+
it "should set values_label" do
|
21
|
+
w.values_label "some y-axis legend"
|
22
|
+
w.to_data.values_label.should == "some y-axis legend"
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
describe "#show_last_point" do
|
27
|
+
it "should set show_last_point" do
|
28
|
+
w.show_last_point true
|
29
|
+
w.to_data.show_last_point.should be_true
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
end
|
34
|
+
|
35
|
+
|
@@ -0,0 +1,36 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe PulseMeter::Visualize::DSL::Widgets::Table do
|
4
|
+
it_should_behave_like "dsl widget"
|
5
|
+
|
6
|
+
let(:interval){ 100 }
|
7
|
+
let(:name) { "some_sensor" }
|
8
|
+
let!(:sensor){ PulseMeter::Sensor::Timelined::Max.new(name, :ttl => 1000, :interval => interval) }
|
9
|
+
|
10
|
+
let(:widget_name){ "some_widget" }
|
11
|
+
let(:w){ described_class.new(widget_name) }
|
12
|
+
|
13
|
+
describe "#to_data" do
|
14
|
+
it "should produce PulseMeter::Visualize::Widgets::Area class" do
|
15
|
+
w.to_data.should be_kind_of(PulseMeter::Visualize::Widgets::Table)
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
describe "#show_last_point" do
|
20
|
+
it "should set show_last_point" do
|
21
|
+
w.show_last_point true
|
22
|
+
w.to_data.show_last_point.should be_true
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
describe "#timespan" do
|
27
|
+
it "should set timespan" do
|
28
|
+
w.timespan 5
|
29
|
+
w.to_data.timespan.should == 5
|
30
|
+
end
|
31
|
+
it "should raise exception if timespan is negative" do
|
32
|
+
expect{ w.timespan(-1) }.to raise_exception(PulseMeter::Visualize::DSL::BadWidgetTimeSpan)
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
@@ -12,7 +12,7 @@ describe PulseMeter::Visualize::Layout do
|
|
12
12
|
p.line "w3"
|
13
13
|
p.line "w4"
|
14
14
|
end
|
15
|
-
l.
|
15
|
+
l.to_data
|
16
16
|
end
|
17
17
|
|
18
18
|
describe "#page_infos" do
|
@@ -29,7 +29,7 @@ describe PulseMeter::Visualize::Layout do
|
|
29
29
|
ldsl = PulseMeter::Visualize::DSL::Layout.new
|
30
30
|
ldsl.use_utc true
|
31
31
|
ldsl.gchart_options({a: 1})
|
32
|
-
l = ldsl.
|
32
|
+
l = ldsl.to_data
|
33
33
|
l.options.should == {use_utc: true, gchart_options: {a: 1}}
|
34
34
|
end
|
35
35
|
end
|
@@ -51,4 +51,4 @@ describe PulseMeter::Visualize::Layout do
|
|
51
51
|
end
|
52
52
|
end
|
53
53
|
|
54
|
-
end
|
54
|
+
end
|
@@ -42,7 +42,7 @@ describe PulseMeter::Visualize::Page do
|
|
42
42
|
w.sensor :a_sensor, color: a_color
|
43
43
|
w.sensor :b_sensor, color: b_color
|
44
44
|
end
|
45
|
-
p.
|
45
|
+
p.to_data
|
46
46
|
end
|
47
47
|
|
48
48
|
before(:each) do
|
@@ -150,4 +150,4 @@ describe PulseMeter::Visualize::Page do
|
|
150
150
|
|
151
151
|
end
|
152
152
|
end
|
153
|
-
end
|
153
|
+
end
|
@@ -5,12 +5,12 @@ describe PulseMeter::Visualize::Sensor do
|
|
5
5
|
let(:name) { "some_sensor" }
|
6
6
|
let(:annotation) { 'sensor descr' }
|
7
7
|
let!(:real_sensor){ PulseMeter::Sensor::Timelined::Counter.new(name, ttl: 1000, interval: interval, annotation: annotation) }
|
8
|
-
let(:sensor) { described_class.new(
|
8
|
+
let(:sensor) { described_class.new(name: name) }
|
9
9
|
|
10
10
|
let(:color){ '#ABCDEF' }
|
11
|
-
let(:sensor_with_color) { described_class.new(
|
11
|
+
let(:sensor_with_color) { described_class.new(name: name, color: color) }
|
12
12
|
|
13
|
-
let(:bad_sensor) { described_class.new(
|
13
|
+
let(:bad_sensor) { described_class.new(name: "bad_sensor_name") }
|
14
14
|
let(:interval_start){ Time.at((Time.now.to_i / interval) * interval) }
|
15
15
|
|
16
16
|
describe '#last_value' do
|
@@ -117,4 +117,4 @@ describe PulseMeter::Visualize::Sensor do
|
|
117
117
|
end
|
118
118
|
end
|
119
119
|
|
120
|
-
end
|
120
|
+
end
|
@@ -13,8 +13,8 @@ describe PulseMeter::Visualize::SeriesExtractor do
|
|
13
13
|
annotation: 'hashed sensor'
|
14
14
|
) }
|
15
15
|
|
16
|
-
let!(:simple_sensor){PulseMeter::Visualize::Sensor.new(
|
17
|
-
let!(:hashed_sensor){PulseMeter::Visualize::Sensor.new(
|
16
|
+
let!(:simple_sensor){PulseMeter::Visualize::Sensor.new(name: :simple_sensor)}
|
17
|
+
let!(:hashed_sensor){PulseMeter::Visualize::Sensor.new(name: :hashed_sensor)}
|
18
18
|
|
19
19
|
describe "simple extractor" do
|
20
20
|
|
@@ -77,4 +77,4 @@ describe PulseMeter::Visualize::SeriesExtractor do
|
|
77
77
|
end
|
78
78
|
end
|
79
79
|
|
80
|
-
end
|
80
|
+
end
|
@@ -0,0 +1,78 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
|
3
|
+
describe PulseMeter::Visualize::Widgets::Area do
|
4
|
+
let(:interval){ 100 }
|
5
|
+
let!(:a_sensor){ PulseMeter::Sensor::Timelined::Counter.new(:a_sensor, :ttl => 1000, :interval => interval, annotation: 'A') }
|
6
|
+
let!(:b_sensor){ PulseMeter::Sensor::Timelined::Counter.new(:b_sensor, :ttl => 1000, :interval => interval, annotation: 'B') }
|
7
|
+
|
8
|
+
let(:widget_name){ "some_widget" }
|
9
|
+
|
10
|
+
let(:redraw_interval){5}
|
11
|
+
let(:values_label){'xxxx'}
|
12
|
+
let(:width){6}
|
13
|
+
let(:timespan){interval * 2}
|
14
|
+
let(:a_color){'#FF0000'}
|
15
|
+
let(:b_color){'#FFFF00'}
|
16
|
+
|
17
|
+
let(:interval_start){ Time.at((Time.now.to_i / interval) * interval) }
|
18
|
+
|
19
|
+
let(:widget) do
|
20
|
+
w = PulseMeter::Visualize::DSL::Widgets::Area.new(widget_name)
|
21
|
+
w.redraw_interval redraw_interval
|
22
|
+
w.width width
|
23
|
+
w.sensor :a_sensor, color: a_color
|
24
|
+
w.sensor :b_sensor, color: b_color
|
25
|
+
w.gchart_options a: 1
|
26
|
+
w.timespan timespan
|
27
|
+
w.to_data
|
28
|
+
end
|
29
|
+
|
30
|
+
describe "#data" do
|
31
|
+
it "should contain type, title, redraw_interval, width, gchart_options, timespan attriutes" do
|
32
|
+
wdata = widget.data
|
33
|
+
wdata[:type].should == 'area'
|
34
|
+
wdata[:title].should == widget_name
|
35
|
+
wdata[:redraw_interval].should == redraw_interval
|
36
|
+
wdata[:width].should == width
|
37
|
+
wdata[:gchart_options].should == {a: 1}
|
38
|
+
wdata[:timespan].should == timespan
|
39
|
+
end
|
40
|
+
|
41
|
+
describe "series attribute" do
|
42
|
+
before(:each) do
|
43
|
+
Timecop.freeze(interval_start + 1) do
|
44
|
+
a_sensor.event(12)
|
45
|
+
b_sensor.event(33)
|
46
|
+
end
|
47
|
+
Timecop.freeze(interval_start + interval + 1) do
|
48
|
+
a_sensor.event(111)
|
49
|
+
end
|
50
|
+
@current_time = interval_start + 2 * interval - 1
|
51
|
+
end
|
52
|
+
|
53
|
+
it "should contain valid series" do
|
54
|
+
Timecop.freeze(@current_time) do
|
55
|
+
widget.data[:series].should ==
|
56
|
+
{
|
57
|
+
titles: [a_sensor.annotation, b_sensor.annotation],
|
58
|
+
rows: [[interval_start.to_i * 1000, 12, 33]],
|
59
|
+
options: [
|
60
|
+
{color: a_color},
|
61
|
+
{color: b_color}
|
62
|
+
]
|
63
|
+
}
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
it "should accept custom timespan" do
|
68
|
+
Timecop.freeze(@current_time + interval) do
|
69
|
+
widget.data(timespan: timespan)[:series][:rows].size.should == 1
|
70
|
+
widget.data(timespan: timespan + interval)[:series][:rows].size.should == 2
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
end
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
|
@@ -0,0 +1,63 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
|
3
|
+
describe PulseMeter::Visualize::Widgets::Gauge do
|
4
|
+
let(:interval){ 100 }
|
5
|
+
let!(:a_sensor){PulseMeter::Sensor::Indicator.new(:a_sensor, annotation: 'A')}
|
6
|
+
let!(:b_sensor){PulseMeter::Sensor::Indicator.new(:b_sensor, annotation: 'B')}
|
7
|
+
let!(:c_sensor){PulseMeter::Sensor::HashedIndicator.new(:c_sensor, annotation: 'C')}
|
8
|
+
|
9
|
+
|
10
|
+
let(:widget_name){ "some_widget" }
|
11
|
+
|
12
|
+
let(:redraw_interval){5}
|
13
|
+
let(:width){6}
|
14
|
+
|
15
|
+
let(:interval_start){ Time.at((Time.now.to_i / interval) * interval) }
|
16
|
+
|
17
|
+
let(:widget) do
|
18
|
+
w = PulseMeter::Visualize::DSL::Widgets::Gauge.new(widget_name)
|
19
|
+
w.redraw_interval redraw_interval
|
20
|
+
w.width width
|
21
|
+
w.sensor :a_sensor
|
22
|
+
w.sensor :b_sensor
|
23
|
+
w.sensor :c_sensor
|
24
|
+
w.gchart_options a: 1
|
25
|
+
w.to_data
|
26
|
+
end
|
27
|
+
|
28
|
+
describe "#data" do
|
29
|
+
it "should contain type, title, redraw_interval, width, gchart_options attriutes" do
|
30
|
+
wdata = widget.data
|
31
|
+
wdata[:type].should == 'gauge'
|
32
|
+
wdata[:title].should == widget_name
|
33
|
+
wdata[:redraw_interval].should == redraw_interval
|
34
|
+
wdata[:width].should == width
|
35
|
+
wdata[:gchart_options].should == {a: 1}
|
36
|
+
end
|
37
|
+
|
38
|
+
describe "series attribute" do
|
39
|
+
before(:each) do
|
40
|
+
a_sensor.event(12)
|
41
|
+
b_sensor.event(33)
|
42
|
+
c_sensor.event(:a => 44)
|
43
|
+
c_sensor.event(:b => 55)
|
44
|
+
end
|
45
|
+
|
46
|
+
it "should contain valid gauge slices" do
|
47
|
+
|
48
|
+
widget.data[:series].sort.should == [
|
49
|
+
['A', 12],
|
50
|
+
['B', 33],
|
51
|
+
["C: a", 44],
|
52
|
+
["C: b", 55]
|
53
|
+
].sort
|
54
|
+
|
55
|
+
end
|
56
|
+
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
|
62
|
+
|
63
|
+
|
@@ -0,0 +1,77 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
|
3
|
+
describe PulseMeter::Visualize::Widgets::Line do
|
4
|
+
let(:interval){ 100 }
|
5
|
+
let!(:a_sensor){ PulseMeter::Sensor::Timelined::Counter.new(:a_sensor, :ttl => 1000, :interval => interval, annotation: 'A') }
|
6
|
+
let!(:b_sensor){ PulseMeter::Sensor::Timelined::Counter.new(:b_sensor, :ttl => 1000, :interval => interval, annotation: 'B') }
|
7
|
+
|
8
|
+
let(:widget_name){ "some_widget" }
|
9
|
+
|
10
|
+
let(:redraw_interval){5}
|
11
|
+
let(:values_label){'xxxx'}
|
12
|
+
let(:width){6}
|
13
|
+
let(:timespan){interval * 2}
|
14
|
+
let(:a_color){'#FF0000'}
|
15
|
+
let(:b_color){'#FFFF00'}
|
16
|
+
|
17
|
+
let(:interval_start){ Time.at((Time.now.to_i / interval) * interval) }
|
18
|
+
|
19
|
+
let(:widget) do
|
20
|
+
w = PulseMeter::Visualize::DSL::Widgets::Line.new(widget_name)
|
21
|
+
w.redraw_interval redraw_interval
|
22
|
+
w.width width
|
23
|
+
w.sensor :a_sensor, color: a_color
|
24
|
+
w.sensor :b_sensor, color: b_color
|
25
|
+
w.gchart_options a: 1
|
26
|
+
w.timespan timespan
|
27
|
+
w.to_data
|
28
|
+
end
|
29
|
+
|
30
|
+
describe "#data" do
|
31
|
+
it "should contain type, title, redraw_interval, width, gchart_options, timespan attriutes" do
|
32
|
+
wdata = widget.data
|
33
|
+
wdata[:type].should == 'line'
|
34
|
+
wdata[:title].should == widget_name
|
35
|
+
wdata[:redraw_interval].should == redraw_interval
|
36
|
+
wdata[:width].should == width
|
37
|
+
wdata[:gchart_options].should == {a: 1}
|
38
|
+
wdata[:timespan].should == timespan
|
39
|
+
end
|
40
|
+
|
41
|
+
describe "series attribute" do
|
42
|
+
before(:each) do
|
43
|
+
Timecop.freeze(interval_start + 1) do
|
44
|
+
a_sensor.event(12)
|
45
|
+
b_sensor.event(33)
|
46
|
+
end
|
47
|
+
Timecop.freeze(interval_start + interval + 1) do
|
48
|
+
a_sensor.event(111)
|
49
|
+
end
|
50
|
+
@current_time = interval_start + 2 * interval - 1
|
51
|
+
end
|
52
|
+
|
53
|
+
it "should contain valid series" do
|
54
|
+
Timecop.freeze(@current_time) do
|
55
|
+
widget.data[:series].should ==
|
56
|
+
{
|
57
|
+
titles: [a_sensor.annotation, b_sensor.annotation],
|
58
|
+
rows: [[interval_start.to_i * 1000, 12, 33]],
|
59
|
+
options: [
|
60
|
+
{color: a_color},
|
61
|
+
{color: b_color}
|
62
|
+
]
|
63
|
+
}
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
it "should accept custom timespan" do
|
68
|
+
Timecop.freeze(@current_time + interval) do
|
69
|
+
widget.data(timespan: timespan)[:series][:rows].size.should == 1
|
70
|
+
widget.data(timespan: timespan + interval)[:series][:rows].size.should == 2
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
end
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
@@ -0,0 +1,73 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
|
3
|
+
describe PulseMeter::Visualize::Widgets::Pie do
|
4
|
+
let(:interval){ 100 }
|
5
|
+
let!(:a_sensor){ PulseMeter::Sensor::Timelined::Counter.new(:a_sensor, :ttl => 1000, :interval => interval, annotation: 'A') }
|
6
|
+
let!(:b_sensor){ PulseMeter::Sensor::Timelined::Counter.new(:b_sensor, :ttl => 1000, :interval => interval, annotation: 'B') }
|
7
|
+
|
8
|
+
let(:widget_name){ "some_widget" }
|
9
|
+
|
10
|
+
let(:redraw_interval){5}
|
11
|
+
let(:values_label){'xxxx'}
|
12
|
+
let(:width){6}
|
13
|
+
let(:a_color){'#FF0000'}
|
14
|
+
let(:b_color){'#FFFF00'}
|
15
|
+
|
16
|
+
let(:interval_start){ Time.at((Time.now.to_i / interval) * interval) }
|
17
|
+
|
18
|
+
let(:widget) do
|
19
|
+
w = PulseMeter::Visualize::DSL::Widgets::Pie.new(widget_name)
|
20
|
+
w.redraw_interval redraw_interval
|
21
|
+
w.width width
|
22
|
+
w.sensor :a_sensor, color: a_color
|
23
|
+
w.sensor :b_sensor, color: b_color
|
24
|
+
w.gchart_options a: 1
|
25
|
+
w.to_data
|
26
|
+
end
|
27
|
+
|
28
|
+
describe "#data" do
|
29
|
+
it "should contain type, title, redraw_interval, width, gchart_options attriutes" do
|
30
|
+
wdata = widget.data
|
31
|
+
wdata[:type].should == 'pie'
|
32
|
+
wdata[:title].should == widget_name
|
33
|
+
wdata[:redraw_interval].should == redraw_interval
|
34
|
+
wdata[:width].should == width
|
35
|
+
wdata[:gchart_options].should == {a: 1}
|
36
|
+
end
|
37
|
+
|
38
|
+
describe "series attribute" do
|
39
|
+
before(:each) do
|
40
|
+
Timecop.freeze(interval_start + 1) do
|
41
|
+
a_sensor.event(12)
|
42
|
+
b_sensor.event(33)
|
43
|
+
end
|
44
|
+
Timecop.freeze(interval_start + interval + 1) do
|
45
|
+
a_sensor.event(111)
|
46
|
+
end
|
47
|
+
@current_time = interval_start + 2 * interval - 1
|
48
|
+
end
|
49
|
+
|
50
|
+
it "should contain valid pie slices" do
|
51
|
+
|
52
|
+
Timecop.freeze(@current_time) do
|
53
|
+
widget.data[:series].should ==
|
54
|
+
{
|
55
|
+
data: [
|
56
|
+
[a_sensor.annotation, 12],
|
57
|
+
[b_sensor.annotation, 33]
|
58
|
+
],
|
59
|
+
options: [
|
60
|
+
{color: a_color},
|
61
|
+
{color: b_color}
|
62
|
+
]
|
63
|
+
}
|
64
|
+
end
|
65
|
+
|
66
|
+
end
|
67
|
+
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
|
73
|
+
|