pulse_meter_visualizer 0.4.11
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +19 -0
- data/.rbenv-version +1 -0
- data/.rspec +1 -0
- data/.rvmrc +1 -0
- data/.travis.yml +8 -0
- data/Gemfile +4 -0
- data/LICENSE +22 -0
- data/Procfile +3 -0
- data/README.md +40 -0
- data/Rakefile +72 -0
- data/examples/basic.ru +145 -0
- data/examples/basic_sensor_data.rb +96 -0
- data/lib/pulse_meter/visualize/app.rb +78 -0
- data/lib/pulse_meter/visualize/base.rb +15 -0
- data/lib/pulse_meter/visualize/coffee/application.coffee +40 -0
- data/lib/pulse_meter/visualize/coffee/collections/page_info_list.coffee +17 -0
- data/lib/pulse_meter/visualize/coffee/collections/sensor_info_list.coffee +4 -0
- data/lib/pulse_meter/visualize/coffee/collections/widget_list.coffee +14 -0
- data/lib/pulse_meter/visualize/coffee/extensions.coffee +26 -0
- data/lib/pulse_meter/visualize/coffee/models/dinamic_widget.coffee +34 -0
- data/lib/pulse_meter/visualize/coffee/models/page_info.coffee +2 -0
- data/lib/pulse_meter/visualize/coffee/models/sensor_info.coffee +2 -0
- data/lib/pulse_meter/visualize/coffee/models/widget.coffee +54 -0
- data/lib/pulse_meter/visualize/coffee/presenters/area.coffee +2 -0
- data/lib/pulse_meter/visualize/coffee/presenters/gauge.coffee +11 -0
- data/lib/pulse_meter/visualize/coffee/presenters/line.coffee +2 -0
- data/lib/pulse_meter/visualize/coffee/presenters/pie.coffee +20 -0
- data/lib/pulse_meter/visualize/coffee/presenters/series.coffee +44 -0
- data/lib/pulse_meter/visualize/coffee/presenters/table.coffee +10 -0
- data/lib/pulse_meter/visualize/coffee/presenters/timeline.coffee +13 -0
- data/lib/pulse_meter/visualize/coffee/presenters/widget.coffee +65 -0
- data/lib/pulse_meter/visualize/coffee/router.coffee +21 -0
- data/lib/pulse_meter/visualize/coffee/views/dynamic_chart.coffee +91 -0
- data/lib/pulse_meter/visualize/coffee/views/dynamic_widget.coffee +58 -0
- data/lib/pulse_meter/visualize/coffee/views/page_title.coffee +17 -0
- data/lib/pulse_meter/visualize/coffee/views/page_titles.coffee +15 -0
- data/lib/pulse_meter/visualize/coffee/views/sensor_info_list.coffee +19 -0
- data/lib/pulse_meter/visualize/coffee/views/widget.coffee +99 -0
- data/lib/pulse_meter/visualize/coffee/views/widget_chart.coffee +13 -0
- data/lib/pulse_meter/visualize/coffee/views/widget_list.coffee +15 -0
- data/lib/pulse_meter/visualize/dsl/base.rb +131 -0
- data/lib/pulse_meter/visualize/dsl/errors.rb +40 -0
- data/lib/pulse_meter/visualize/dsl/layout.rb +27 -0
- data/lib/pulse_meter/visualize/dsl/page.rb +33 -0
- data/lib/pulse_meter/visualize/dsl/sensor.rb +20 -0
- data/lib/pulse_meter/visualize/dsl/widget.rb +37 -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 +79 -0
- data/lib/pulse_meter/visualize/page.rb +25 -0
- data/lib/pulse_meter/visualize/public/css/application.css +56 -0
- data/lib/pulse_meter/visualize/public/css/bootstrap.css +4883 -0
- data/lib/pulse_meter/visualize/public/css/bootstrap.min.css +729 -0
- data/lib/pulse_meter/visualize/public/css/images/ui-bg_flat_0_aaaaaa_40x100.png +0 -0
- data/lib/pulse_meter/visualize/public/css/images/ui-bg_glass_55_fbf9ee_1x400.png +0 -0
- data/lib/pulse_meter/visualize/public/css/images/ui-bg_glass_65_ffffff_1x400.png +0 -0
- data/lib/pulse_meter/visualize/public/css/images/ui-bg_glass_75_dadada_1x400.png +0 -0
- data/lib/pulse_meter/visualize/public/css/images/ui-bg_glass_75_e6e6e6_1x400.png +0 -0
- data/lib/pulse_meter/visualize/public/css/images/ui-bg_glass_75_ffffff_1x400.png +0 -0
- data/lib/pulse_meter/visualize/public/css/images/ui-bg_highlight-soft_75_cccccc_1x100.png +0 -0
- data/lib/pulse_meter/visualize/public/css/images/ui-bg_inset-soft_95_fef1ec_1x100.png +0 -0
- data/lib/pulse_meter/visualize/public/css/images/ui-icons_222222_256x240.png +0 -0
- data/lib/pulse_meter/visualize/public/css/images/ui-icons_2e83ff_256x240.png +0 -0
- data/lib/pulse_meter/visualize/public/css/images/ui-icons_454545_256x240.png +0 -0
- data/lib/pulse_meter/visualize/public/css/images/ui-icons_888888_256x240.png +0 -0
- data/lib/pulse_meter/visualize/public/css/images/ui-icons_cd0a0a_256x240.png +0 -0
- data/lib/pulse_meter/visualize/public/css/images/ui-icons_f6cf3b_256x240.png +0 -0
- data/lib/pulse_meter/visualize/public/css/jquery-ui-1.8.16.bootstrap.css +1320 -0
- data/lib/pulse_meter/visualize/public/favicon.ico +208 -0
- data/lib/pulse_meter/visualize/public/img/glyphicons-halflings-white.png +0 -0
- data/lib/pulse_meter/visualize/public/img/glyphicons-halflings.png +0 -0
- data/lib/pulse_meter/visualize/public/js/application.js +973 -0
- data/lib/pulse_meter/visualize/public/js/backbone-min.js +38 -0
- data/lib/pulse_meter/visualize/public/js/bootstrap.js +1835 -0
- data/lib/pulse_meter/visualize/public/js/jquery-1.7.2.min.js +4 -0
- data/lib/pulse_meter/visualize/public/js/jquery-ui-1.8.16.bootstrap.min.js +791 -0
- data/lib/pulse_meter/visualize/public/js/jquery-ui-1.8.23.custom.min.js +21 -0
- data/lib/pulse_meter/visualize/public/js/jquery-ui-timepicker-addon.js +1687 -0
- data/lib/pulse_meter/visualize/public/js/json2.js +487 -0
- data/lib/pulse_meter/visualize/public/js/underscore-min.js +32 -0
- data/lib/pulse_meter/visualize/sensor.rb +63 -0
- data/lib/pulse_meter/visualize/series_extractor.rb +107 -0
- data/lib/pulse_meter/visualize/views/main.haml +30 -0
- data/lib/pulse_meter/visualize/views/sensors.haml +76 -0
- data/lib/pulse_meter/visualize/views/widgets/area.haml +53 -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 +54 -0
- data/lib/pulse_meter/visualize/views/widgets/pie.haml +13 -0
- data/lib/pulse_meter/visualize/views/widgets/table.haml +45 -0
- data/lib/pulse_meter/visualize/widget.rb +38 -0
- 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 +114 -0
- data/lib/pulse_meter/visualizer.rb +38 -0
- data/lib/pulse_meter_visualizer.rb +2 -0
- data/pulse_meter_visualizer.gemspec +41 -0
- data/spec/pulse_meter/visualize/app_spec.rb +27 -0
- data/spec/pulse_meter/visualize/dsl/layout_spec.rb +64 -0
- data/spec/pulse_meter/visualize/dsl/page_spec.rb +62 -0
- data/spec/pulse_meter/visualize/dsl/sensor_spec.rb +30 -0
- data/spec/pulse_meter/visualize/dsl/widget_spec.rb +6 -0
- 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 +54 -0
- data/spec/pulse_meter/visualize/page_spec.rb +153 -0
- data/spec/pulse_meter/visualize/sensor_spec.rb +120 -0
- data/spec/pulse_meter/visualize/series_extractor_spec.rb +80 -0
- data/spec/pulse_meter/visualize/widgets/area_spec.rb +6 -0
- data/spec/pulse_meter/visualize/widgets/gauge_spec.rb +63 -0
- data/spec/pulse_meter/visualize/widgets/line_spec.rb +6 -0
- data/spec/pulse_meter/visualize/widgets/pie_spec.rb +73 -0
- data/spec/pulse_meter/visualize/widgets/table_spec.rb +6 -0
- data/spec/pulse_meter/visualizer_spec.rb +42 -0
- data/spec/shared_examples/dsl_widget.rb +106 -0
- data/spec/shared_examples/widget.rb +97 -0
- data/spec/spec_helper.rb +36 -0
- metadata +518 -0
@@ -0,0 +1,62 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe PulseMeter::Visualize::DSL::Page do
|
4
|
+
let(:interval){ 100 }
|
5
|
+
let(:sensor_name) { "some_sensor" }
|
6
|
+
let!(:sensor){ PulseMeter::Sensor::Timelined::Max.new(sensor_name, :ttl => 1000, :interval => interval) }
|
7
|
+
let(:title) { "page title" }
|
8
|
+
let(:page){ PulseMeter::Visualize::DSL::Page.new(title) }
|
9
|
+
|
10
|
+
describe '.new' do
|
11
|
+
it "should initialize title and widgets" do
|
12
|
+
p = page.to_data
|
13
|
+
p.title.should == title
|
14
|
+
p.widgets.should == []
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
[:area, :line, :table, :pie, :gauge].each do |widget_type|
|
19
|
+
|
20
|
+
describe "##{widget_type}" do
|
21
|
+
it "should add #{widget_type} widget initialized by args to widgets" do
|
22
|
+
page.send(widget_type, :some_widget_name, sensor: sensor_name, width: 7)
|
23
|
+
w = page.to_data.widgets.first
|
24
|
+
w.width.should == 7
|
25
|
+
w.title.should == "some_widget_name"
|
26
|
+
w.sensors.first.name.should == sensor_name
|
27
|
+
end
|
28
|
+
|
29
|
+
it "should add #{widget_type} widget initialized by block" do
|
30
|
+
page.send(widget_type, :some_widget_name) do |w|
|
31
|
+
w.sensor(sensor_name)
|
32
|
+
w.sensor(sensor_name)
|
33
|
+
w.title "foo_widget"
|
34
|
+
w.width 7
|
35
|
+
end
|
36
|
+
w = page.to_data.widgets.first
|
37
|
+
w.type.should == widget_type.to_s
|
38
|
+
w.width.should == 7
|
39
|
+
w.title.should == "foo_widget"
|
40
|
+
w.sensors.size.should == 2
|
41
|
+
w.sensors.first.name.should == sensor_name
|
42
|
+
w.sensors.last.name.should == sensor_name
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
end
|
47
|
+
|
48
|
+
describe "#title" do
|
49
|
+
it "should set page title" do
|
50
|
+
page.title "Foo Title"
|
51
|
+
page.to_data.title.should == 'Foo Title'
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
describe "#to_data" do
|
56
|
+
it "should convert DSL data to Visualize::Page" do
|
57
|
+
page.to_data.should be_kind_of(PulseMeter::Visualize::Page)
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
end
|
62
|
+
|
@@ -0,0 +1,30 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe PulseMeter::Visualize::DSL::Sensor do
|
4
|
+
let(:interval){ 100 }
|
5
|
+
let(:name) { "some_sensor" }
|
6
|
+
let!(:sensor){ PulseMeter::Sensor::Timelined::Max.new(name, :ttl => 1000, :interval => interval) }
|
7
|
+
|
8
|
+
describe '.new' do
|
9
|
+
it "should save passed name and create Visualize::Sensor with it" do
|
10
|
+
described_class.new(name).to_data.name.to_s.should == name
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
describe '#process_args' do
|
15
|
+
it "should pass args transparently to Visualize::Sensor" do
|
16
|
+
s = described_class.new(name)
|
17
|
+
s.process_args color: :red
|
18
|
+
s.to_data.color.to_s.should == 'red'
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
describe '#to_data' do
|
23
|
+
# actually tested above
|
24
|
+
it "should convert dsl data to sensor" do
|
25
|
+
described_class.new(name).to_data.should be_kind_of(PulseMeter::Visualize::Sensor)
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
end
|
30
|
+
|
@@ -0,0 +1,44 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe PulseMeter::Visualize::DSL::Widgets::Area 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::Area)
|
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
|
+
describe "#timespan" do
|
34
|
+
it "should set timespan" do
|
35
|
+
w.timespan 5
|
36
|
+
w.to_data.timespan.should == 5
|
37
|
+
end
|
38
|
+
it "should raise exception if timespan is negative" do
|
39
|
+
expect{ w.timespan(-1) }.to raise_exception(PulseMeter::Visualize::DSL::BadWidgetTimeSpan)
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
end
|
44
|
+
|
@@ -0,0 +1,22 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe PulseMeter::Visualize::DSL::Widgets::Gauge 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::Gauge class" do
|
15
|
+
w.to_data.should be_kind_of(PulseMeter::Visualize::Widgets::Gauge)
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
end
|
20
|
+
|
21
|
+
|
22
|
+
|
@@ -0,0 +1,44 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe PulseMeter::Visualize::DSL::Widgets::Line 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::Line)
|
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
|
+
describe "#timespan" do
|
34
|
+
it "should set timespan" do
|
35
|
+
w.timespan 5
|
36
|
+
w.to_data.timespan.should == 5
|
37
|
+
end
|
38
|
+
it "should raise exception if timespan is negative" do
|
39
|
+
expect{ w.timespan(-1) }.to raise_exception(PulseMeter::Visualize::DSL::BadWidgetTimeSpan)
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
end
|
44
|
+
|
@@ -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
|
+
|
@@ -0,0 +1,54 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
|
3
|
+
describe PulseMeter::Visualize::Layout do
|
4
|
+
let(:layout) do
|
5
|
+
l = PulseMeter::Visualize::DSL::Layout.new
|
6
|
+
l.page "page1" do |p|
|
7
|
+
p.line "w1"
|
8
|
+
p.line "w2"
|
9
|
+
p.gchart_options({a: 1})
|
10
|
+
end
|
11
|
+
l.page "page2" do |p|
|
12
|
+
p.line "w3"
|
13
|
+
p.line "w4"
|
14
|
+
end
|
15
|
+
l.to_data
|
16
|
+
end
|
17
|
+
|
18
|
+
describe "#page_infos" do
|
19
|
+
it "should return list of page infos with ids" do
|
20
|
+
layout.page_infos.should == [
|
21
|
+
{title: "page1", id: 1, gchart_options: {a: 1}},
|
22
|
+
{title: "page2", id: 2, gchart_options: {}}
|
23
|
+
]
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
describe "#options" do
|
28
|
+
it "should return layout options" do
|
29
|
+
ldsl = PulseMeter::Visualize::DSL::Layout.new
|
30
|
+
ldsl.use_utc true
|
31
|
+
ldsl.gchart_options({a: 1})
|
32
|
+
l = ldsl.to_data
|
33
|
+
l.options.should == {use_utc: true, gchart_options: {a: 1}}
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
describe "#widget" do
|
38
|
+
it "should return data for correct widget" do
|
39
|
+
w = layout.widget(1, 0)
|
40
|
+
w.should include(id: 1, title: "w3")
|
41
|
+
w = layout.widget(0, 1, timespan: 123)
|
42
|
+
w.should include(id: 2, title: "w2")
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
describe "#widgets" do
|
47
|
+
it "should return data for correct widgets of a page" do
|
48
|
+
datas = layout.widgets(1)
|
49
|
+
datas[0].should include(id: 1, title: "w3")
|
50
|
+
datas[1].should include(id: 2, title: "w4")
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
end
|
@@ -0,0 +1,153 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
|
3
|
+
describe PulseMeter::Visualize::Page 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(:type) { :some_type }
|
9
|
+
let(:widget_name){ "some_widget" }
|
10
|
+
|
11
|
+
let(:redraw_interval){5}
|
12
|
+
let(:values_label){'xxxx'}
|
13
|
+
let(:width){6}
|
14
|
+
let(:show_last_point){false}
|
15
|
+
let(:timespan){interval * 2}
|
16
|
+
let(:a_color){'#FF0000'}
|
17
|
+
let(:b_color){'#FFFF00'}
|
18
|
+
|
19
|
+
let(:interval_start){ Time.at((Time.now.to_i / interval) * interval) }
|
20
|
+
let(:page_title){"Dashboard"}
|
21
|
+
|
22
|
+
|
23
|
+
let(:page) do
|
24
|
+
p = PulseMeter::Visualize::DSL::Page.new(page_title)
|
25
|
+
p.pie(widget_name) do |w|
|
26
|
+
w.redraw_interval redraw_interval
|
27
|
+
w.values_label values_label
|
28
|
+
w.width width
|
29
|
+
w.show_last_point show_last_point
|
30
|
+
w.timespan timespan
|
31
|
+
|
32
|
+
w.sensor :a_sensor, color: a_color
|
33
|
+
w.sensor :b_sensor, color: b_color
|
34
|
+
end
|
35
|
+
p.line(widget_name) do |w|
|
36
|
+
w.redraw_interval redraw_interval
|
37
|
+
w.values_label values_label
|
38
|
+
w.width width
|
39
|
+
w.show_last_point show_last_point
|
40
|
+
w.timespan timespan
|
41
|
+
|
42
|
+
w.sensor :a_sensor, color: a_color
|
43
|
+
w.sensor :b_sensor, color: b_color
|
44
|
+
end
|
45
|
+
p.to_data
|
46
|
+
end
|
47
|
+
|
48
|
+
before(:each) do
|
49
|
+
Timecop.freeze(interval_start + 1) do
|
50
|
+
a_sensor.event(12)
|
51
|
+
b_sensor.event(33)
|
52
|
+
end
|
53
|
+
Timecop.freeze(interval_start + interval + 1) do
|
54
|
+
a_sensor.event(111)
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
describe "#widget_data" do
|
59
|
+
|
60
|
+
it "should generate correct data of single widget" do
|
61
|
+
Timecop.freeze(interval_start + 2 * interval - 1) do
|
62
|
+
page.widget_data(0)[:id].should == 1
|
63
|
+
page.widget_data(1)[:id].should == 2
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
it "should generate correct data of single widget" do
|
68
|
+
Timecop.freeze(interval_start + 2 * interval - 1) do
|
69
|
+
page.widget_data(0)[:series].should ==
|
70
|
+
{
|
71
|
+
data: [
|
72
|
+
[a_sensor.annotation, 12],
|
73
|
+
[b_sensor.annotation, 33]
|
74
|
+
],
|
75
|
+
options: [
|
76
|
+
{color: a_color},
|
77
|
+
{color: b_color}
|
78
|
+
]
|
79
|
+
}
|
80
|
+
page.widget_data(1)[:series].should ==
|
81
|
+
{
|
82
|
+
titles: [a_sensor.annotation, b_sensor.annotation],
|
83
|
+
rows: [[interval_start.to_i * 1000, 12, 33]],
|
84
|
+
options: [
|
85
|
+
{color: a_color},
|
86
|
+
{color: b_color}
|
87
|
+
]
|
88
|
+
}
|
89
|
+
end
|
90
|
+
|
91
|
+
Timecop.freeze(interval_start + 2 * interval - 1) do
|
92
|
+
page.widget_data(0, timespan: 0)[:series].should ==
|
93
|
+
{
|
94
|
+
data: [
|
95
|
+
[a_sensor.annotation, 12],
|
96
|
+
[b_sensor.annotation, 33]
|
97
|
+
],
|
98
|
+
options: [
|
99
|
+
{color: a_color},
|
100
|
+
{color: b_color}
|
101
|
+
]
|
102
|
+
}
|
103
|
+
page.widget_data(1, timespan: 1)[:series].should ==
|
104
|
+
{
|
105
|
+
titles: [a_sensor.annotation, b_sensor.annotation],
|
106
|
+
rows: [],
|
107
|
+
options: [
|
108
|
+
{color: a_color},
|
109
|
+
{color: b_color}
|
110
|
+
]
|
111
|
+
}
|
112
|
+
|
113
|
+
end
|
114
|
+
|
115
|
+
|
116
|
+
end
|
117
|
+
end
|
118
|
+
|
119
|
+
describe "#widget_datas" do
|
120
|
+
it "should generate correct ids for all widgets" do
|
121
|
+
Timecop.freeze(interval_start + 2 * interval - 1) do
|
122
|
+
page.widget_datas.map{|h| h[:id]}.should == [1,2]
|
123
|
+
end
|
124
|
+
end
|
125
|
+
|
126
|
+
it "should generate correct series data of all widgets" do
|
127
|
+
Timecop.freeze(interval_start + 2 * interval - 1) do
|
128
|
+
|
129
|
+
page.widget_datas.map{|h| h[:series]}.should == [
|
130
|
+
{
|
131
|
+
data: [
|
132
|
+
[a_sensor.annotation, 12],
|
133
|
+
[b_sensor.annotation, 33]
|
134
|
+
],
|
135
|
+
options: [
|
136
|
+
{color: a_color},
|
137
|
+
{color: b_color}
|
138
|
+
]
|
139
|
+
},
|
140
|
+
{
|
141
|
+
titles: [a_sensor.annotation, b_sensor.annotation],
|
142
|
+
rows: [[interval_start.to_i * 1000, 12, 33]],
|
143
|
+
options: [
|
144
|
+
{color: a_color},
|
145
|
+
{color: b_color}
|
146
|
+
]
|
147
|
+
}
|
148
|
+
]
|
149
|
+
end
|
150
|
+
|
151
|
+
end
|
152
|
+
end
|
153
|
+
end
|