pulse-meter 0.2.11 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (79) hide show
  1. data/.rbenv-version +1 -1
  2. data/README.md +32 -16
  3. data/Rakefile +29 -10
  4. data/examples/basic.ru +1 -1
  5. data/examples/full/server.ru +1 -1
  6. data/examples/minimal/server.ru +1 -1
  7. data/lib/pulse-meter.rb +1 -0
  8. data/lib/pulse-meter/observer.rb +117 -0
  9. data/lib/pulse-meter/sensor.rb +1 -0
  10. data/lib/pulse-meter/sensor/timeline.rb +3 -2
  11. data/lib/pulse-meter/sensor/timelined/multi_percentile.rb +43 -0
  12. data/lib/pulse-meter/version.rb +1 -1
  13. data/lib/pulse-meter/visualize/app.rb +28 -12
  14. data/lib/pulse-meter/visualize/coffee/application.coffee +40 -0
  15. data/lib/pulse-meter/visualize/coffee/collections/page_info_list.coffee +17 -0
  16. data/lib/pulse-meter/visualize/coffee/collections/sensor_info_list.coffee +4 -0
  17. data/lib/pulse-meter/visualize/coffee/collections/widget_list.coffee +14 -0
  18. data/lib/pulse-meter/visualize/coffee/extensions.coffee +26 -0
  19. data/lib/pulse-meter/visualize/coffee/models/dinamic_widget.coffee +34 -0
  20. data/lib/pulse-meter/visualize/coffee/models/page_info.coffee +2 -0
  21. data/lib/pulse-meter/visualize/coffee/models/sensor_info.coffee +2 -0
  22. data/lib/pulse-meter/visualize/coffee/models/widget.coffee +54 -0
  23. data/lib/pulse-meter/visualize/coffee/presenters/area.coffee +2 -0
  24. data/lib/pulse-meter/visualize/coffee/presenters/gauge.coffee +11 -0
  25. data/lib/pulse-meter/visualize/coffee/presenters/line.coffee +2 -0
  26. data/lib/pulse-meter/visualize/coffee/presenters/pie.coffee +20 -0
  27. data/lib/pulse-meter/visualize/coffee/presenters/series.coffee +44 -0
  28. data/lib/pulse-meter/visualize/coffee/presenters/table.coffee +10 -0
  29. data/lib/pulse-meter/visualize/coffee/presenters/timeline.coffee +13 -0
  30. data/lib/pulse-meter/visualize/coffee/presenters/widget.coffee +65 -0
  31. data/lib/pulse-meter/visualize/coffee/router.coffee +21 -0
  32. data/lib/pulse-meter/visualize/coffee/views/dynamic_chart.coffee +91 -0
  33. data/lib/pulse-meter/visualize/coffee/views/dynamic_widget.coffee +58 -0
  34. data/lib/pulse-meter/visualize/coffee/views/page_title.coffee +17 -0
  35. data/lib/pulse-meter/visualize/coffee/views/page_titles.coffee +15 -0
  36. data/lib/pulse-meter/visualize/coffee/views/sensor_info_list.coffee +19 -0
  37. data/lib/pulse-meter/visualize/coffee/views/widget.coffee +99 -0
  38. data/lib/pulse-meter/visualize/coffee/views/widget_chart.coffee +13 -0
  39. data/lib/pulse-meter/visualize/coffee/views/widget_list.coffee +15 -0
  40. data/lib/pulse-meter/visualize/layout.rb +4 -4
  41. data/lib/pulse-meter/visualize/public/css/application.css +13 -4
  42. data/lib/pulse-meter/visualize/public/css/images/ui-bg_flat_0_aaaaaa_40x100.png +0 -0
  43. data/lib/pulse-meter/visualize/public/css/images/ui-bg_glass_55_fbf9ee_1x400.png +0 -0
  44. data/lib/pulse-meter/visualize/public/css/images/ui-bg_glass_65_ffffff_1x400.png +0 -0
  45. data/lib/pulse-meter/visualize/public/css/images/ui-bg_glass_75_dadada_1x400.png +0 -0
  46. data/lib/pulse-meter/visualize/public/css/images/ui-bg_glass_75_e6e6e6_1x400.png +0 -0
  47. data/lib/pulse-meter/visualize/public/css/images/ui-bg_glass_75_ffffff_1x400.png +0 -0
  48. data/lib/pulse-meter/visualize/public/css/images/ui-bg_highlight-soft_75_cccccc_1x100.png +0 -0
  49. data/lib/pulse-meter/visualize/public/css/images/ui-bg_inset-soft_95_fef1ec_1x100.png +0 -0
  50. data/lib/pulse-meter/visualize/public/css/images/ui-icons_222222_256x240.png +0 -0
  51. data/lib/pulse-meter/visualize/public/css/images/ui-icons_2e83ff_256x240.png +0 -0
  52. data/lib/pulse-meter/visualize/public/css/images/ui-icons_454545_256x240.png +0 -0
  53. data/lib/pulse-meter/visualize/public/css/images/ui-icons_888888_256x240.png +0 -0
  54. data/lib/pulse-meter/visualize/public/css/images/ui-icons_cd0a0a_256x240.png +0 -0
  55. data/lib/pulse-meter/visualize/public/css/images/ui-icons_f6cf3b_256x240.png +0 -0
  56. data/lib/pulse-meter/visualize/public/css/jquery-ui-1.8.16.bootstrap.css +1320 -0
  57. data/lib/pulse-meter/visualize/public/js/application.js +900 -691
  58. data/lib/pulse-meter/visualize/public/js/jquery-ui-1.8.16.bootstrap.min.js +791 -0
  59. data/lib/pulse-meter/visualize/public/js/jquery-ui-1.8.23.custom.min.js +21 -0
  60. data/lib/pulse-meter/visualize/public/js/jquery-ui-timepicker-addon.js +1687 -0
  61. data/lib/pulse-meter/visualize/sensor.rb +2 -2
  62. data/lib/pulse-meter/visualize/views/main.haml +2 -3
  63. data/lib/pulse-meter/visualize/views/sensors.haml +14 -1
  64. data/lib/pulse-meter/visualize/views/widgets/area.haml +46 -24
  65. data/lib/pulse-meter/visualize/views/widgets/line.haml +46 -23
  66. data/lib/pulse-meter/visualize/views/widgets/table.haml +37 -15
  67. data/lib/pulse-meter/visualize/widgets/timeline.rb +20 -5
  68. data/pulse-meter.gemspec +4 -0
  69. data/spec/pulse_meter/observer_spec.rb +252 -0
  70. data/spec/pulse_meter/sensor/timelined/multi_percentile_spec.rb +21 -0
  71. data/spec/pulse_meter/visualize/sensor_spec.rb +5 -5
  72. data/spec/pulse_meter/visualize/widgets/area_spec.rb +1 -74
  73. data/spec/pulse_meter/visualize/widgets/line_spec.rb +1 -73
  74. data/spec/pulse_meter/visualize/widgets/table_spec.rb +1 -73
  75. data/spec/shared_examples/timeline_sensor.rb +10 -0
  76. data/spec/shared_examples/widget.rb +97 -0
  77. data/spec/spec_helper.rb +1 -0
  78. metadata +120 -5
  79. data/lib/pulse-meter/visualize/public/js/application.coffee +0 -616
@@ -0,0 +1,21 @@
1
+ require 'spec_helper'
2
+
3
+ describe PulseMeter::Sensor::Timelined::MultiPercentile do
4
+ it_should_behave_like "timeline sensor", {:p => [0.8]}
5
+ it_should_behave_like "timelined subclass", [5, 4, 2, 2, 2, 2, 2, 2, 2, 1], {0.8 => 2, 0.5 => 2}.to_json, {:p => [0.8, 0.5]}
6
+ it_should_behave_like "timelined subclass", [1], {0.8 => 1}.to_json, {:p => [0.8]}
7
+
8
+ let(:init_values) {{:ttl => 1, :raw_data_ttl => 1, :interval => 1, :reduce_delay => 1}}
9
+ let(:name) {"percentile"}
10
+
11
+ it "should raise exception when extra parameter is not array of percentiles" do
12
+ expect {described_class.new(name, init_values.merge({:p => :bad}))}.to raise_exception(ArgumentError)
13
+ end
14
+
15
+ it "should raise exception when one of percentiles is not between 0 and 1" do
16
+ expect {described_class.new(name, init_values.merge({:p => [0.5, -1]}))}.to raise_exception(ArgumentError)
17
+ expect {described_class.new(name, init_values.merge({:p => [0.5, 1.1]}))}.to raise_exception(ArgumentError)
18
+ expect {described_class.new(name, init_values.merge({:p => [0.5, 0.1]}))}.not_to raise_exception(ArgumentError)
19
+ end
20
+
21
+ end
@@ -89,7 +89,7 @@ describe PulseMeter::Visualize::Sensor do
89
89
 
90
90
  context "when sensor does not exist" do
91
91
  it "should raise RestoreError" do
92
- expect{ bad_sensor.timeline_data(Time.now, interval) }.to raise_exception(PulseMeter::RestoreError)
92
+ expect{ bad_sensor.timeline_data(Time.now - interval, Time.now) }.to raise_exception(PulseMeter::RestoreError)
93
93
  end
94
94
  end
95
95
 
@@ -97,20 +97,20 @@ describe PulseMeter::Visualize::Sensor do
97
97
  describe "returned value" do
98
98
  it "should contain sensor annotation" do
99
99
  Timecop.freeze(interval_start + interval + 1) do
100
- sensor.timeline_data(Time.now, interval).first[:name].should == annotation
100
+ sensor.timeline_data(Time.now - interval, Time.now).first[:name].should == annotation
101
101
  end
102
102
  end
103
103
  it "should contain sensor color" do
104
104
  Timecop.freeze(interval_start + interval + 1) do
105
- sensor_with_color.timeline_data(Time.now, interval).first[:color].should == color
105
+ sensor_with_color.timeline_data(Time.now - interval, Time.now).first[:color].should == color
106
106
  end
107
107
  end
108
108
 
109
109
  it "should contain [interval_start, value] pairs for each interval" do
110
110
  Timecop.freeze(interval_start + interval + 1) do
111
- data = sensor.timeline_data(Time.now, interval * 2)
111
+ data = sensor.timeline_data(Time.now - interval * 2, Time.now)
112
112
  data.first[:data].should == [{x: interval_start.to_i * 1000, y: 101}]
113
- data = sensor.timeline_data(Time.now, interval * 2, true)
113
+ data = sensor.timeline_data(Time.now - interval * 2, Time.now, true)
114
114
  data.first[:data].should == [{x: interval_start.to_i * 1000, y: 101}, {x: (interval_start + interval).to_i * 1000, y: 55}]
115
115
  end
116
116
  end
@@ -1,79 +1,6 @@
1
1
  require "spec_helper"
2
2
 
3
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
- wdata[:interval].should == interval
40
- end
41
-
42
- describe "series attribute" do
43
- before(:each) do
44
- Timecop.freeze(interval_start + 1) do
45
- a_sensor.event(12)
46
- b_sensor.event(33)
47
- end
48
- Timecop.freeze(interval_start + interval + 1) do
49
- a_sensor.event(111)
50
- end
51
- @current_time = interval_start + 2 * interval - 1
52
- end
53
-
54
- it "should contain valid series" do
55
- Timecop.freeze(@current_time) do
56
- widget.data[:series].should ==
57
- {
58
- titles: [a_sensor.annotation, b_sensor.annotation],
59
- rows: [[interval_start.to_i * 1000, 12, 33]],
60
- options: [
61
- {color: a_color},
62
- {color: b_color}
63
- ]
64
- }
65
- end
66
- end
67
-
68
- it "should accept custom timespan" do
69
- Timecop.freeze(@current_time + interval) do
70
- widget.data(timespan: timespan)[:series][:rows].size.should == 1
71
- widget.data(timespan: timespan + interval)[:series][:rows].size.should == 2
72
- end
73
- end
74
-
75
- end
76
- end
4
+ it_should_behave_like "widget"
77
5
  end
78
6
 
79
-
@@ -1,78 +1,6 @@
1
1
  require "spec_helper"
2
2
 
3
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
- wdata[:interval].should == interval
40
- end
41
-
42
- describe "series attribute" do
43
- before(:each) do
44
- Timecop.freeze(interval_start + 1) do
45
- a_sensor.event(12)
46
- b_sensor.event(33)
47
- end
48
- Timecop.freeze(interval_start + interval + 1) do
49
- a_sensor.event(111)
50
- end
51
- @current_time = interval_start + 2 * interval - 1
52
- end
53
-
54
- it "should contain valid series" do
55
- Timecop.freeze(@current_time) do
56
- widget.data[:series].should ==
57
- {
58
- titles: [a_sensor.annotation, b_sensor.annotation],
59
- rows: [[interval_start.to_i * 1000, 12, 33]],
60
- options: [
61
- {color: a_color},
62
- {color: b_color}
63
- ]
64
- }
65
- end
66
- end
67
-
68
- it "should accept custom timespan" do
69
- Timecop.freeze(@current_time + interval) do
70
- widget.data(timespan: timespan)[:series][:rows].size.should == 1
71
- widget.data(timespan: timespan + interval)[:series][:rows].size.should == 2
72
- end
73
- end
74
-
75
- end
76
- end
4
+ it_should_behave_like "widget"
77
5
  end
78
6
 
@@ -1,78 +1,6 @@
1
1
  require "spec_helper"
2
2
 
3
3
  describe PulseMeter::Visualize::Widgets::Table 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::Table.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 == 'table'
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
4
+ it_should_behave_like "widget"
76
5
  end
77
6
 
78
-
@@ -160,6 +160,16 @@ shared_examples_for "timeline sensor" do |extra_init_values, default_event|
160
160
  redis.keys(sensor.data_key(@interval_id)).count.should == 0
161
161
  end
162
162
  end
163
+
164
+ it "should not store summarized data if it already exists" do
165
+ data_key = sensor.data_key(@interval_id)
166
+ redis.set(data_key, :dummy)
167
+ Timecop.freeze(@start_of_interval) do
168
+ sensor.event(sample_event)
169
+ sensor.reduce(@interval_id)
170
+ redis.get(data_key).should == "dummy"
171
+ end
172
+ end
163
173
  end
164
174
 
165
175
  describe "#reduce_all_raw" do
@@ -0,0 +1,97 @@
1
+ shared_examples_for "widget" do
2
+ let(:interval){ 100 }
3
+ let!(:a_sensor){ PulseMeter::Sensor::Timelined::Counter.new(:a_sensor, :ttl => 1000, :interval => interval, annotation: 'A') }
4
+ let!(:b_sensor){ PulseMeter::Sensor::Timelined::Counter.new(:b_sensor, :ttl => 1000, :interval => interval, annotation: 'B') }
5
+
6
+ let(:widget_name){ "some_widget" }
7
+
8
+ let(:redraw_interval){5}
9
+ let(:values_label){'xxxx'}
10
+ let(:width){6}
11
+ let(:timespan){interval * 2}
12
+ let(:a_color){'#FF0000'}
13
+ let(:b_color){'#FFFF00'}
14
+
15
+ let(:interval_start){ Time.at((Time.now.to_i / interval) * interval) }
16
+
17
+ def constantize(const_name)
18
+ const_name.to_s.split('::').reduce(Module, :const_get)
19
+ end
20
+
21
+ def class_name
22
+ described_class.to_s.split('::').last
23
+ end
24
+
25
+ def dsl_class
26
+ constantize "PulseMeter::Visualize::DSL::Widgets::#{class_name}"
27
+ end
28
+
29
+ let(:widget) do
30
+ w = dsl_class.new(widget_name)
31
+ w.redraw_interval redraw_interval
32
+ w.width width
33
+ w.sensor :a_sensor, color: a_color
34
+ w.sensor :b_sensor, color: b_color
35
+ w.gchart_options a: 1
36
+ w.timespan timespan
37
+ w.to_data
38
+ end
39
+
40
+ describe "#data" do
41
+ it "should contain type, title, redraw_interval, width, gchart_options, timespan attriutes" do
42
+ wdata = widget.data
43
+ wdata[:type].should == class_name.downcase
44
+ wdata[:title].should == widget_name
45
+ wdata[:redraw_interval].should == redraw_interval
46
+ wdata[:width].should == width
47
+ wdata[:gchart_options].should == {a: 1}
48
+ wdata[:timespan].should == timespan
49
+ wdata[:interval].should == interval
50
+ end
51
+
52
+ describe "series attribute" do
53
+ before(:each) do
54
+ Timecop.freeze(interval_start + 1) do
55
+ a_sensor.event(12)
56
+ b_sensor.event(33)
57
+ end
58
+ Timecop.freeze(interval_start + interval + 1) do
59
+ a_sensor.event(111)
60
+ end
61
+ @current_time = interval_start + 2 * interval - 1
62
+ end
63
+
64
+ it "should contain valid series" do
65
+ Timecop.freeze(@current_time) do
66
+ widget.data[:series].should ==
67
+ {
68
+ titles: [a_sensor.annotation, b_sensor.annotation],
69
+ rows: [[interval_start.to_i * 1000, 12, 33]],
70
+ options: [
71
+ {color: a_color},
72
+ {color: b_color}
73
+ ]
74
+ }
75
+ end
76
+ end
77
+
78
+ it "should accept custom timespan" do
79
+ Timecop.freeze(@current_time + interval) do
80
+ widget.data(timespan: timespan)[:series][:rows].size.should == 1
81
+ widget.data(timespan: timespan + interval)[:series][:rows].size.should == 2
82
+ end
83
+ end
84
+
85
+ it "should accept start_time and end_time" do
86
+ Timecop.freeze(@current_time + interval) do
87
+ widget.data(start_time: (Time.now - timespan).to_i)[:series][:rows].size.should == 1
88
+ widget.data(
89
+ start_time: (Time.now - interval - timespan).to_i,
90
+ end_time: Time.now.to_i
91
+ )[:series][:rows].size.should == 2
92
+ end
93
+ end
94
+
95
+ end
96
+ end
97
+ end
data/spec/spec_helper.rb CHANGED
@@ -18,6 +18,7 @@ Dir['spec/shared_examples/**/*.rb'].each{|f| require File.join(ROOT,f)}
18
18
  RSpec.configure do |config|
19
19
  config.before(:each) do
20
20
  PulseMeter.redis = MockRedis.new
21
+ Timecop.return
21
22
  end
22
23
  config.filter_run :focus => true
23
24
  config.run_all_when_everything_filtered = true
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: pulse-meter
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.11
4
+ version: 0.3.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -10,7 +10,7 @@ authors:
10
10
  autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2012-08-09 00:00:00.000000000 Z
13
+ date: 2012-10-17 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: gon-sinatra
@@ -140,6 +140,22 @@ dependencies:
140
140
  - - ! '>='
141
141
  - !ruby/object:Gem::Version
142
142
  version: '0'
143
+ - !ruby/object:Gem::Dependency
144
+ name: coffee-script
145
+ requirement: !ruby/object:Gem::Requirement
146
+ none: false
147
+ requirements:
148
+ - - ! '>='
149
+ - !ruby/object:Gem::Version
150
+ version: '0'
151
+ type: :development
152
+ prerelease: false
153
+ version_requirements: !ruby/object:Gem::Requirement
154
+ none: false
155
+ requirements:
156
+ - - ! '>='
157
+ - !ruby/object:Gem::Version
158
+ version: '0'
143
159
  - !ruby/object:Gem::Dependency
144
160
  name: foreman
145
161
  requirement: !ruby/object:Gem::Requirement
@@ -172,6 +188,22 @@ dependencies:
172
188
  - - ! '>='
173
189
  - !ruby/object:Gem::Version
174
190
  version: '0'
191
+ - !ruby/object:Gem::Dependency
192
+ name: listen
193
+ requirement: !ruby/object:Gem::Requirement
194
+ none: false
195
+ requirements:
196
+ - - ! '>='
197
+ - !ruby/object:Gem::Version
198
+ version: '0'
199
+ type: :development
200
+ prerelease: false
201
+ version_requirements: !ruby/object:Gem::Requirement
202
+ none: false
203
+ requirements:
204
+ - - ! '>='
205
+ - !ruby/object:Gem::Version
206
+ version: '0'
175
207
  - !ruby/object:Gem::Dependency
176
208
  name: mock_redis
177
209
  requirement: !ruby/object:Gem::Requirement
@@ -220,6 +252,22 @@ dependencies:
220
252
  - - ! '>='
221
253
  - !ruby/object:Gem::Version
222
254
  version: '0'
255
+ - !ruby/object:Gem::Dependency
256
+ name: rb-fsevent
257
+ requirement: !ruby/object:Gem::Requirement
258
+ none: false
259
+ requirements:
260
+ - - ! '>='
261
+ - !ruby/object:Gem::Version
262
+ version: '0'
263
+ type: :development
264
+ prerelease: false
265
+ version_requirements: !ruby/object:Gem::Requirement
266
+ none: false
267
+ requirements:
268
+ - - ! '>='
269
+ - !ruby/object:Gem::Version
270
+ version: '0'
223
271
  - !ruby/object:Gem::Dependency
224
272
  name: redcarpet
225
273
  requirement: !ruby/object:Gem::Requirement
@@ -268,6 +316,22 @@ dependencies:
268
316
  - - ! '>='
269
317
  - !ruby/object:Gem::Version
270
318
  version: '0'
319
+ - !ruby/object:Gem::Dependency
320
+ name: sprockets
321
+ requirement: !ruby/object:Gem::Requirement
322
+ none: false
323
+ requirements:
324
+ - - ! '>='
325
+ - !ruby/object:Gem::Version
326
+ version: '0'
327
+ type: :development
328
+ prerelease: false
329
+ version_requirements: !ruby/object:Gem::Requirement
330
+ none: false
331
+ requirements:
332
+ - - ! '>='
333
+ - !ruby/object:Gem::Version
334
+ version: '0'
271
335
  - !ruby/object:Gem::Dependency
272
336
  name: timecop
273
337
  requirement: !ruby/object:Gem::Requirement
@@ -337,6 +401,7 @@ files:
337
401
  - lib/pulse-meter/mixins/cmd.rb
338
402
  - lib/pulse-meter/mixins/dumper.rb
339
403
  - lib/pulse-meter/mixins/utils.rb
404
+ - lib/pulse-meter/observer.rb
340
405
  - lib/pulse-meter/sensor.rb
341
406
  - lib/pulse-meter/sensor/base.rb
342
407
  - lib/pulse-meter/sensor/configuration.rb
@@ -354,6 +419,7 @@ files:
354
419
  - lib/pulse-meter/sensor/timelined/max.rb
355
420
  - lib/pulse-meter/sensor/timelined/median.rb
356
421
  - lib/pulse-meter/sensor/timelined/min.rb
422
+ - lib/pulse-meter/sensor/timelined/multi_percentile.rb
357
423
  - lib/pulse-meter/sensor/timelined/percentile.rb
358
424
  - lib/pulse-meter/sensor/timelined/uniq_counter.rb
359
425
  - lib/pulse-meter/sensor/uniq_counter.rb
@@ -364,6 +430,32 @@ files:
364
430
  - lib/pulse-meter/version.rb
365
431
  - lib/pulse-meter/visualize/app.rb
366
432
  - lib/pulse-meter/visualize/base.rb
433
+ - lib/pulse-meter/visualize/coffee/application.coffee
434
+ - lib/pulse-meter/visualize/coffee/collections/page_info_list.coffee
435
+ - lib/pulse-meter/visualize/coffee/collections/sensor_info_list.coffee
436
+ - lib/pulse-meter/visualize/coffee/collections/widget_list.coffee
437
+ - lib/pulse-meter/visualize/coffee/extensions.coffee
438
+ - lib/pulse-meter/visualize/coffee/models/dinamic_widget.coffee
439
+ - lib/pulse-meter/visualize/coffee/models/page_info.coffee
440
+ - lib/pulse-meter/visualize/coffee/models/sensor_info.coffee
441
+ - lib/pulse-meter/visualize/coffee/models/widget.coffee
442
+ - lib/pulse-meter/visualize/coffee/presenters/area.coffee
443
+ - lib/pulse-meter/visualize/coffee/presenters/gauge.coffee
444
+ - lib/pulse-meter/visualize/coffee/presenters/line.coffee
445
+ - lib/pulse-meter/visualize/coffee/presenters/pie.coffee
446
+ - lib/pulse-meter/visualize/coffee/presenters/series.coffee
447
+ - lib/pulse-meter/visualize/coffee/presenters/table.coffee
448
+ - lib/pulse-meter/visualize/coffee/presenters/timeline.coffee
449
+ - lib/pulse-meter/visualize/coffee/presenters/widget.coffee
450
+ - lib/pulse-meter/visualize/coffee/router.coffee
451
+ - lib/pulse-meter/visualize/coffee/views/dynamic_chart.coffee
452
+ - lib/pulse-meter/visualize/coffee/views/dynamic_widget.coffee
453
+ - lib/pulse-meter/visualize/coffee/views/page_title.coffee
454
+ - lib/pulse-meter/visualize/coffee/views/page_titles.coffee
455
+ - lib/pulse-meter/visualize/coffee/views/sensor_info_list.coffee
456
+ - lib/pulse-meter/visualize/coffee/views/widget.coffee
457
+ - lib/pulse-meter/visualize/coffee/views/widget_chart.coffee
458
+ - lib/pulse-meter/visualize/coffee/views/widget_list.coffee
367
459
  - lib/pulse-meter/visualize/dsl/base.rb
368
460
  - lib/pulse-meter/visualize/dsl/errors.rb
369
461
  - lib/pulse-meter/visualize/dsl/layout.rb
@@ -380,14 +472,31 @@ files:
380
472
  - lib/pulse-meter/visualize/public/css/application.css
381
473
  - lib/pulse-meter/visualize/public/css/bootstrap.css
382
474
  - lib/pulse-meter/visualize/public/css/bootstrap.min.css
475
+ - lib/pulse-meter/visualize/public/css/images/ui-bg_flat_0_aaaaaa_40x100.png
476
+ - lib/pulse-meter/visualize/public/css/images/ui-bg_glass_55_fbf9ee_1x400.png
477
+ - lib/pulse-meter/visualize/public/css/images/ui-bg_glass_65_ffffff_1x400.png
478
+ - lib/pulse-meter/visualize/public/css/images/ui-bg_glass_75_dadada_1x400.png
479
+ - lib/pulse-meter/visualize/public/css/images/ui-bg_glass_75_e6e6e6_1x400.png
480
+ - lib/pulse-meter/visualize/public/css/images/ui-bg_glass_75_ffffff_1x400.png
481
+ - lib/pulse-meter/visualize/public/css/images/ui-bg_highlight-soft_75_cccccc_1x100.png
482
+ - lib/pulse-meter/visualize/public/css/images/ui-bg_inset-soft_95_fef1ec_1x100.png
483
+ - lib/pulse-meter/visualize/public/css/images/ui-icons_222222_256x240.png
484
+ - lib/pulse-meter/visualize/public/css/images/ui-icons_2e83ff_256x240.png
485
+ - lib/pulse-meter/visualize/public/css/images/ui-icons_454545_256x240.png
486
+ - lib/pulse-meter/visualize/public/css/images/ui-icons_888888_256x240.png
487
+ - lib/pulse-meter/visualize/public/css/images/ui-icons_cd0a0a_256x240.png
488
+ - lib/pulse-meter/visualize/public/css/images/ui-icons_f6cf3b_256x240.png
489
+ - lib/pulse-meter/visualize/public/css/jquery-ui-1.8.16.bootstrap.css
383
490
  - lib/pulse-meter/visualize/public/favicon.ico
384
491
  - lib/pulse-meter/visualize/public/img/glyphicons-halflings-white.png
385
492
  - lib/pulse-meter/visualize/public/img/glyphicons-halflings.png
386
- - lib/pulse-meter/visualize/public/js/application.coffee
387
493
  - lib/pulse-meter/visualize/public/js/application.js
388
494
  - lib/pulse-meter/visualize/public/js/backbone-min.js
389
495
  - lib/pulse-meter/visualize/public/js/bootstrap.js
390
496
  - lib/pulse-meter/visualize/public/js/jquery-1.7.2.min.js
497
+ - lib/pulse-meter/visualize/public/js/jquery-ui-1.8.16.bootstrap.min.js
498
+ - lib/pulse-meter/visualize/public/js/jquery-ui-1.8.23.custom.min.js
499
+ - lib/pulse-meter/visualize/public/js/jquery-ui-timepicker-addon.js
391
500
  - lib/pulse-meter/visualize/public/js/json2.js
392
501
  - lib/pulse-meter/visualize/public/js/underscore-min.js
393
502
  - lib/pulse-meter/visualize/sensor.rb
@@ -410,6 +519,7 @@ files:
410
519
  - spec/pulse_meter/mixins/cmd_spec.rb
411
520
  - spec/pulse_meter/mixins/dumper_spec.rb
412
521
  - spec/pulse_meter/mixins/utils_spec.rb
522
+ - spec/pulse_meter/observer_spec.rb
413
523
  - spec/pulse_meter/sensor/base_spec.rb
414
524
  - spec/pulse_meter/sensor/configuration_spec.rb
415
525
  - spec/pulse_meter/sensor/counter_spec.rb
@@ -426,6 +536,7 @@ files:
426
536
  - spec/pulse_meter/sensor/timelined/max_spec.rb
427
537
  - spec/pulse_meter/sensor/timelined/median_spec.rb
428
538
  - spec/pulse_meter/sensor/timelined/min_spec.rb
539
+ - spec/pulse_meter/sensor/timelined/multi_percentile_spec.rb
429
540
  - spec/pulse_meter/sensor/timelined/percentile_spec.rb
430
541
  - spec/pulse_meter/sensor/timelined/uniq_counter_spec.rb
431
542
  - spec/pulse_meter/sensor/uniq_counter_spec.rb
@@ -453,6 +564,7 @@ files:
453
564
  - spec/shared_examples/dsl_widget.rb
454
565
  - spec/shared_examples/timeline_sensor.rb
455
566
  - spec/shared_examples/timelined_subclass.rb
567
+ - spec/shared_examples/widget.rb
456
568
  - spec/spec_helper.rb
457
569
  - spec/support/matchers.rb
458
570
  homepage: https://github.com/savonarola/pulse-meter
@@ -475,10 +587,10 @@ required_rubygems_version: !ruby/object:Gem::Requirement
475
587
  version: '0'
476
588
  segments:
477
589
  - 0
478
- hash: 3888917459545765468
590
+ hash: 2422587240922148030
479
591
  requirements: []
480
592
  rubyforge_project:
481
- rubygems_version: 1.8.24
593
+ rubygems_version: 1.8.23
482
594
  signing_key:
483
595
  specification_version: 3
484
596
  summary: Lightweight Redis-based metrics aggregator and processor with CLI and simple
@@ -488,6 +600,7 @@ test_files:
488
600
  - spec/pulse_meter/mixins/cmd_spec.rb
489
601
  - spec/pulse_meter/mixins/dumper_spec.rb
490
602
  - spec/pulse_meter/mixins/utils_spec.rb
603
+ - spec/pulse_meter/observer_spec.rb
491
604
  - spec/pulse_meter/sensor/base_spec.rb
492
605
  - spec/pulse_meter/sensor/configuration_spec.rb
493
606
  - spec/pulse_meter/sensor/counter_spec.rb
@@ -504,6 +617,7 @@ test_files:
504
617
  - spec/pulse_meter/sensor/timelined/max_spec.rb
505
618
  - spec/pulse_meter/sensor/timelined/median_spec.rb
506
619
  - spec/pulse_meter/sensor/timelined/min_spec.rb
620
+ - spec/pulse_meter/sensor/timelined/multi_percentile_spec.rb
507
621
  - spec/pulse_meter/sensor/timelined/percentile_spec.rb
508
622
  - spec/pulse_meter/sensor/timelined/uniq_counter_spec.rb
509
623
  - spec/pulse_meter/sensor/uniq_counter_spec.rb
@@ -531,6 +645,7 @@ test_files:
531
645
  - spec/shared_examples/dsl_widget.rb
532
646
  - spec/shared_examples/timeline_sensor.rb
533
647
  - spec/shared_examples/timelined_subclass.rb
648
+ - spec/shared_examples/widget.rb
534
649
  - spec/spec_helper.rb
535
650
  - spec/support/matchers.rb
536
651
  has_rdoc: