pulse-meter 0.2.1 → 0.2.2

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.
Files changed (82) hide show
  1. data/.travis.yml +4 -0
  2. data/examples/basic.ru +23 -5
  3. data/examples/basic_sensor_data.rb +15 -2
  4. data/examples/full/server.ru +2 -3
  5. data/examples/minimal/server.ru +3 -2
  6. data/lib/pulse-meter/sensor.rb +2 -1
  7. data/lib/pulse-meter/sensor/configuration.rb +3 -1
  8. data/lib/pulse-meter/sensor/hashed_indicator.rb +22 -0
  9. data/lib/pulse-meter/sensor/timeline.rb +13 -1
  10. data/lib/pulse-meter/version.rb +1 -1
  11. data/lib/pulse-meter/visualize/app.rb +6 -2
  12. data/lib/pulse-meter/visualize/base.rb +15 -0
  13. data/lib/pulse-meter/visualize/dsl/base.rb +131 -0
  14. data/lib/pulse-meter/visualize/dsl/errors.rb +0 -6
  15. data/lib/pulse-meter/visualize/dsl/layout.rb +12 -41
  16. data/lib/pulse-meter/visualize/dsl/page.rb +15 -41
  17. data/lib/pulse-meter/visualize/dsl/sensor.rb +9 -10
  18. data/lib/pulse-meter/visualize/dsl/widget.rb +18 -65
  19. data/lib/pulse-meter/visualize/dsl/widget_old.rb +95 -0
  20. data/lib/pulse-meter/visualize/dsl/widgets/area.rb +20 -0
  21. data/lib/pulse-meter/visualize/dsl/widgets/gauge.rb +12 -0
  22. data/lib/pulse-meter/visualize/dsl/widgets/line.rb +21 -0
  23. data/lib/pulse-meter/visualize/dsl/widgets/pie.rb +16 -0
  24. data/lib/pulse-meter/visualize/dsl/widgets/table.rb +19 -0
  25. data/lib/pulse-meter/visualize/layout.rb +7 -16
  26. data/lib/pulse-meter/visualize/page.rb +5 -10
  27. data/lib/pulse-meter/visualize/public/favicon.ico +0 -0
  28. data/lib/pulse-meter/visualize/public/js/application.coffee +156 -107
  29. data/lib/pulse-meter/visualize/public/js/application.js +283 -122
  30. data/lib/pulse-meter/visualize/sensor.rb +7 -13
  31. data/lib/pulse-meter/visualize/views/main.haml +8 -52
  32. data/lib/pulse-meter/visualize/views/widgets/area.haml +31 -0
  33. data/lib/pulse-meter/visualize/views/widgets/extend_options.haml +11 -0
  34. data/lib/pulse-meter/visualize/views/widgets/gauge.haml +13 -0
  35. data/lib/pulse-meter/visualize/views/widgets/line.haml +31 -0
  36. data/lib/pulse-meter/visualize/views/widgets/pie.haml +13 -0
  37. data/lib/pulse-meter/visualize/views/widgets/table.haml +23 -0
  38. data/lib/pulse-meter/visualize/widget.rb +17 -87
  39. data/lib/pulse-meter/visualize/widgets/gauge.rb +47 -0
  40. data/lib/pulse-meter/visualize/widgets/pie.rb +36 -0
  41. data/lib/pulse-meter/visualize/widgets/timeline.rb +90 -0
  42. data/lib/pulse-meter/visualizer.rb +18 -8
  43. data/perl/PulseMeter/Sensor/Base.pm +42 -0
  44. data/perl/PulseMeter/Sensor/Counter.pm +19 -0
  45. data/perl/PulseMeter/Sensor/HashedIndicator.pm +12 -0
  46. data/perl/PulseMeter/Sensor/Indicator.pm +17 -0
  47. data/perl/PulseMeter/Sensor/Timeline.pm +51 -0
  48. data/perl/PulseMeter/Sensor/Timelined/Average.pm +13 -0
  49. data/perl/PulseMeter/Sensor/Timelined/Counter.pm +12 -0
  50. data/perl/PulseMeter/Sensor/Timelined/HashedCounter.pm +12 -0
  51. data/perl/PulseMeter/Sensor/Timelined/Max.pm +18 -0
  52. data/perl/PulseMeter/Sensor/Timelined/Median.pm +8 -0
  53. data/perl/PulseMeter/Sensor/Timelined/Min.pm +18 -0
  54. data/perl/PulseMeter/Sensor/Timelined/Percentile.pm +17 -0
  55. data/perl/PulseMeter/Sensor/Timelined/UniqCounter.pm +13 -0
  56. data/perl/PulseMeter/Sensor/UniqCounter.pm +12 -0
  57. data/pulse-meter.gemspec +1 -0
  58. data/spec/pulse_meter/sensor/configuration_spec.rb +10 -2
  59. data/spec/pulse_meter/sensor/hashed_indicator_spec.rb +39 -0
  60. data/spec/pulse_meter/visualize/dsl/layout_spec.rb +8 -8
  61. data/spec/pulse_meter/visualize/dsl/page_spec.rb +29 -42
  62. data/spec/pulse_meter/visualize/dsl/sensor_spec.rb +5 -5
  63. data/spec/pulse_meter/visualize/dsl/widget_spec.rb +1 -122
  64. data/spec/pulse_meter/visualize/dsl/widgets/area_spec.rb +44 -0
  65. data/spec/pulse_meter/visualize/dsl/widgets/gauge_spec.rb +22 -0
  66. data/spec/pulse_meter/visualize/dsl/widgets/line_spec.rb +44 -0
  67. data/spec/pulse_meter/visualize/dsl/widgets/pie_spec.rb +35 -0
  68. data/spec/pulse_meter/visualize/dsl/widgets/table_spec.rb +36 -0
  69. data/spec/pulse_meter/visualize/layout_spec.rb +3 -3
  70. data/spec/pulse_meter/visualize/page_spec.rb +2 -2
  71. data/spec/pulse_meter/visualize/sensor_spec.rb +4 -4
  72. data/spec/pulse_meter/visualize/series_extractor_spec.rb +3 -3
  73. data/spec/pulse_meter/visualize/widgets/area_spec.rb +78 -0
  74. data/spec/pulse_meter/visualize/widgets/gauge_spec.rb +63 -0
  75. data/spec/pulse_meter/visualize/widgets/line_spec.rb +77 -0
  76. data/spec/pulse_meter/visualize/widgets/pie_spec.rb +73 -0
  77. data/spec/pulse_meter/visualize/widgets/table_spec.rb +78 -0
  78. data/spec/shared_examples/dsl_widget.rb +106 -0
  79. data/spec/shared_examples/timeline_sensor.rb +32 -2
  80. metadata +75 -6
  81. data/lib/pulse-meter/visualize/dsl.rb +0 -0
  82. 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.to_layout
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.to_layout
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.to_page
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(sensor: name) }
8
+ let(:sensor) { described_class.new(name: name) }
9
9
 
10
10
  let(:color){ '#ABCDEF' }
11
- let(:sensor_with_color) { described_class.new(sensor: name, color: color) }
11
+ let(:sensor_with_color) { described_class.new(name: name, color: color) }
12
12
 
13
- let(:bad_sensor) { described_class.new(sensor: "bad_sensor_name") }
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(sensor: :simple_sensor)}
17
- let!(:hashed_sensor){PulseMeter::Visualize::Sensor.new(sensor: :hashed_sensor)}
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
+