pulse_meter-dygraphs_visualizer 0.4.15

Sign up to get free protection for your applications and to get access to all the features.
Files changed (109) hide show
  1. data/.gitignore +19 -0
  2. data/.rbenv-version +1 -0
  3. data/.rspec +1 -0
  4. data/.rvmrc +1 -0
  5. data/.travis.yml +9 -0
  6. data/Gemfile +4 -0
  7. data/LICENSE +22 -0
  8. data/Procfile +3 -0
  9. data/README.md +40 -0
  10. data/Rakefile +54 -0
  11. data/examples/basic.ru +125 -0
  12. data/examples/basic_sensor_data.rb +97 -0
  13. data/lib/pulse_meter/dygraphs_visualize/app.rb +78 -0
  14. data/lib/pulse_meter/dygraphs_visualize/base.rb +15 -0
  15. data/lib/pulse_meter/dygraphs_visualize/coffee/application.coffee +37 -0
  16. data/lib/pulse_meter/dygraphs_visualize/coffee/collections/page_info_list.coffee +17 -0
  17. data/lib/pulse_meter/dygraphs_visualize/coffee/collections/sensor_info_list.coffee +4 -0
  18. data/lib/pulse_meter/dygraphs_visualize/coffee/collections/widget_list.coffee +14 -0
  19. data/lib/pulse_meter/dygraphs_visualize/coffee/extensions.coffee +26 -0
  20. data/lib/pulse_meter/dygraphs_visualize/coffee/models/dinamic_widget.coffee +34 -0
  21. data/lib/pulse_meter/dygraphs_visualize/coffee/models/page_info.coffee +2 -0
  22. data/lib/pulse_meter/dygraphs_visualize/coffee/models/sensor_info.coffee +2 -0
  23. data/lib/pulse_meter/dygraphs_visualize/coffee/models/widget.coffee +63 -0
  24. data/lib/pulse_meter/dygraphs_visualize/coffee/presenters/line.coffee +1 -0
  25. data/lib/pulse_meter/dygraphs_visualize/coffee/presenters/series.coffee +26 -0
  26. data/lib/pulse_meter/dygraphs_visualize/coffee/presenters/stack.coffee +1 -0
  27. data/lib/pulse_meter/dygraphs_visualize/coffee/presenters/timeline.coffee +13 -0
  28. data/lib/pulse_meter/dygraphs_visualize/coffee/presenters/widget.coffee +48 -0
  29. data/lib/pulse_meter/dygraphs_visualize/coffee/router.coffee +21 -0
  30. data/lib/pulse_meter/dygraphs_visualize/coffee/views/dynamic_chart.coffee +92 -0
  31. data/lib/pulse_meter/dygraphs_visualize/coffee/views/dynamic_widget.coffee +58 -0
  32. data/lib/pulse_meter/dygraphs_visualize/coffee/views/page_title.coffee +17 -0
  33. data/lib/pulse_meter/dygraphs_visualize/coffee/views/page_titles.coffee +15 -0
  34. data/lib/pulse_meter/dygraphs_visualize/coffee/views/sensor_info_list.coffee +19 -0
  35. data/lib/pulse_meter/dygraphs_visualize/coffee/views/widget.coffee +91 -0
  36. data/lib/pulse_meter/dygraphs_visualize/coffee/views/widget_chart.coffee +15 -0
  37. data/lib/pulse_meter/dygraphs_visualize/coffee/views/widget_list.coffee +15 -0
  38. data/lib/pulse_meter/dygraphs_visualize/dsl/base.rb +131 -0
  39. data/lib/pulse_meter/dygraphs_visualize/dsl/errors.rb +40 -0
  40. data/lib/pulse_meter/dygraphs_visualize/dsl/layout.rb +27 -0
  41. data/lib/pulse_meter/dygraphs_visualize/dsl/page.rb +26 -0
  42. data/lib/pulse_meter/dygraphs_visualize/dsl/sensor.rb +20 -0
  43. data/lib/pulse_meter/dygraphs_visualize/dsl/widget.rb +37 -0
  44. data/lib/pulse_meter/dygraphs_visualize/dsl/widgets/line.rb +22 -0
  45. data/lib/pulse_meter/dygraphs_visualize/dsl/widgets/stack.rb +29 -0
  46. data/lib/pulse_meter/dygraphs_visualize/layout.rb +79 -0
  47. data/lib/pulse_meter/dygraphs_visualize/page.rb +25 -0
  48. data/lib/pulse_meter/dygraphs_visualize/public/css/application.css +61 -0
  49. data/lib/pulse_meter/dygraphs_visualize/public/css/bootstrap.css +4883 -0
  50. data/lib/pulse_meter/dygraphs_visualize/public/css/bootstrap.min.css +729 -0
  51. data/lib/pulse_meter/dygraphs_visualize/public/css/images/ui-bg_flat_0_aaaaaa_40x100.png +0 -0
  52. data/lib/pulse_meter/dygraphs_visualize/public/css/images/ui-bg_glass_55_fbf9ee_1x400.png +0 -0
  53. data/lib/pulse_meter/dygraphs_visualize/public/css/images/ui-bg_glass_65_ffffff_1x400.png +0 -0
  54. data/lib/pulse_meter/dygraphs_visualize/public/css/images/ui-bg_glass_75_dadada_1x400.png +0 -0
  55. data/lib/pulse_meter/dygraphs_visualize/public/css/images/ui-bg_glass_75_e6e6e6_1x400.png +0 -0
  56. data/lib/pulse_meter/dygraphs_visualize/public/css/images/ui-bg_glass_75_ffffff_1x400.png +0 -0
  57. data/lib/pulse_meter/dygraphs_visualize/public/css/images/ui-bg_highlight-soft_75_cccccc_1x100.png +0 -0
  58. data/lib/pulse_meter/dygraphs_visualize/public/css/images/ui-bg_inset-soft_95_fef1ec_1x100.png +0 -0
  59. data/lib/pulse_meter/dygraphs_visualize/public/css/images/ui-icons_222222_256x240.png +0 -0
  60. data/lib/pulse_meter/dygraphs_visualize/public/css/images/ui-icons_2e83ff_256x240.png +0 -0
  61. data/lib/pulse_meter/dygraphs_visualize/public/css/images/ui-icons_454545_256x240.png +0 -0
  62. data/lib/pulse_meter/dygraphs_visualize/public/css/images/ui-icons_888888_256x240.png +0 -0
  63. data/lib/pulse_meter/dygraphs_visualize/public/css/images/ui-icons_cd0a0a_256x240.png +0 -0
  64. data/lib/pulse_meter/dygraphs_visualize/public/css/images/ui-icons_f6cf3b_256x240.png +0 -0
  65. data/lib/pulse_meter/dygraphs_visualize/public/css/jquery-ui-1.8.16.bootstrap.css +1320 -0
  66. data/lib/pulse_meter/dygraphs_visualize/public/favicon.ico +208 -0
  67. data/lib/pulse_meter/dygraphs_visualize/public/img/glyphicons-halflings-white.png +0 -0
  68. data/lib/pulse_meter/dygraphs_visualize/public/img/glyphicons-halflings.png +0 -0
  69. data/lib/pulse_meter/dygraphs_visualize/public/js/application.js +833 -0
  70. data/lib/pulse_meter/dygraphs_visualize/public/js/backbone-min.js +38 -0
  71. data/lib/pulse_meter/dygraphs_visualize/public/js/bootstrap.js +1835 -0
  72. data/lib/pulse_meter/dygraphs_visualize/public/js/dygraph-combined.js +2 -0
  73. data/lib/pulse_meter/dygraphs_visualize/public/js/jquery-1.7.2.min.js +4 -0
  74. data/lib/pulse_meter/dygraphs_visualize/public/js/jquery-ui-1.8.16.bootstrap.min.js +791 -0
  75. data/lib/pulse_meter/dygraphs_visualize/public/js/jquery-ui-1.8.23.custom.min.js +21 -0
  76. data/lib/pulse_meter/dygraphs_visualize/public/js/jquery-ui-timepicker-addon.js +1687 -0
  77. data/lib/pulse_meter/dygraphs_visualize/public/js/json2.js +487 -0
  78. data/lib/pulse_meter/dygraphs_visualize/public/js/underscore-min.js +32 -0
  79. data/lib/pulse_meter/dygraphs_visualize/sensor.rb +63 -0
  80. data/lib/pulse_meter/dygraphs_visualize/series_color.rb +39 -0
  81. data/lib/pulse_meter/dygraphs_visualize/series_extractor.rb +107 -0
  82. data/lib/pulse_meter/dygraphs_visualize/views/main.haml +30 -0
  83. data/lib/pulse_meter/dygraphs_visualize/views/sensors.haml +75 -0
  84. data/lib/pulse_meter/dygraphs_visualize/views/widgets/extend_options.haml +11 -0
  85. data/lib/pulse_meter/dygraphs_visualize/views/widgets/line.haml +43 -0
  86. data/lib/pulse_meter/dygraphs_visualize/views/widgets/stack.haml +43 -0
  87. data/lib/pulse_meter/dygraphs_visualize/widget.rb +38 -0
  88. data/lib/pulse_meter/dygraphs_visualize/widgets/timeline.rb +107 -0
  89. data/lib/pulse_meter/dygraphs_visualizer.rb +34 -0
  90. data/lib/pulse_meter_dygraphs_visualizer.rb +2 -0
  91. data/pulse_meter-dygraphs_visualizer.gemspec +41 -0
  92. data/spec/pulse_meter/dygraphs_visualize/app_spec.rb +27 -0
  93. data/spec/pulse_meter/dygraphs_visualize/dsl/layout_spec.rb +64 -0
  94. data/spec/pulse_meter/dygraphs_visualize/dsl/page_spec.rb +62 -0
  95. data/spec/pulse_meter/dygraphs_visualize/dsl/sensor_spec.rb +30 -0
  96. data/spec/pulse_meter/dygraphs_visualize/dsl/widget_spec.rb +6 -0
  97. data/spec/pulse_meter/dygraphs_visualize/dsl/widgets/line_spec.rb +44 -0
  98. data/spec/pulse_meter/dygraphs_visualize/dsl/widgets/stack_spec.rb +55 -0
  99. data/spec/pulse_meter/dygraphs_visualize/layout_spec.rb +54 -0
  100. data/spec/pulse_meter/dygraphs_visualize/page_spec.rb +145 -0
  101. data/spec/pulse_meter/dygraphs_visualize/sensor_spec.rb +120 -0
  102. data/spec/pulse_meter/dygraphs_visualize/series_extractor_spec.rb +80 -0
  103. data/spec/pulse_meter/dygraphs_visualize/widgets/line_spec.rb +6 -0
  104. data/spec/pulse_meter/dygraphs_visualize/widgets/stack_spec.rb +6 -0
  105. data/spec/pulse_meter/dygraphs_visualizer_spec.rb +42 -0
  106. data/spec/shared_examples/dsl_widget.rb +106 -0
  107. data/spec/shared_examples/widget.rb +97 -0
  108. data/spec/spec_helper.rb +36 -0
  109. metadata +497 -0
@@ -0,0 +1,6 @@
1
+ require "spec_helper"
2
+
3
+ describe PulseMeter::DygraphsVisualize::Widgets::Line do
4
+ it_should_behave_like "widget"
5
+ end
6
+
@@ -0,0 +1,6 @@
1
+ require "spec_helper"
2
+
3
+ describe PulseMeter::DygraphsVisualize::Widgets::Stack do
4
+ it_should_behave_like "widget"
5
+ end
6
+
@@ -0,0 +1,42 @@
1
+ require 'spec_helper'
2
+
3
+ describe PulseMeter::DygraphsVisualizer do
4
+ describe "::draw" do
5
+ it "should generate correct layout with passed block" do
6
+ layout = described_class.draw do |l|
7
+
8
+ l.title "My Gauges"
9
+
10
+ l.page "Dashboard" do |p|
11
+ p.line :convertion do |c|
12
+ c.sensor :adv_clicks, color: :green
13
+ c.sensor :adv_shows, color: :red
14
+ end
15
+
16
+ p.stack :agents, title: 'User Agents' do |c|
17
+ c.sensor :agent_ie
18
+ c.sensor :agent_chrome
19
+ c.sensor :agent_ff
20
+ c.sensor :agent_other
21
+ end
22
+
23
+ end
24
+
25
+ l.page "Request stats" do |p|
26
+ p.line :rph_total, sensor: :rph_total
27
+ p.line :rph_main_page, sensor: :rph_main_page
28
+ p.line :request_time_p95_hour
29
+
30
+ p.stack :success_vs_fail_total_hourly do |w|
31
+ w.sensor :success_total_hourly
32
+ w.sensor :fail_total_hourly
33
+ end
34
+
35
+ end
36
+
37
+ end
38
+ layout.should be_kind_of(PulseMeter::DygraphsVisualize::Layout)
39
+ end
40
+ end
41
+ end
42
+
@@ -0,0 +1,106 @@
1
+ shared_examples_for "dsl widget" do
2
+
3
+ let(:interval){ 100 }
4
+ let(:name) { "some_sensor" }
5
+ let!(:sensor){ PulseMeter::Sensor::Timelined::Max.new(name, :ttl => 1000, :interval => interval) }
6
+
7
+ let(:widget_name){ "some_widget" }
8
+ let(:w){ described_class.new(widget_name) }
9
+
10
+ describe '.new' do
11
+ it "should set default value for width papram" do
12
+ wid = w.to_data
13
+ wid.width.should == PulseMeter::DygraphsVisualize::DSL::Widget::MAX_WIDTH
14
+ end
15
+
16
+ it "should set title param from .new argument" do
17
+ wid = w.to_data
18
+ wid.title.should == widget_name
19
+ end
20
+ end
21
+
22
+ describe "#process_args" do
23
+ it "should set sensor by :sensor param" do
24
+ w.process_args :sensor => :sss
25
+ sensors = w.to_data.sensors
26
+ sensors.size.should == 1
27
+ sensors.first.name.to_s.should == 'sss'
28
+ end
29
+
30
+ it "should set title by :title param" do
31
+ w.process_args :title => 'Title XXX'
32
+ w.to_data.title.should == 'Title XXX'
33
+ end
34
+
35
+ it "should set width by :width param" do
36
+ w.process_args :width => 5
37
+ w.to_data.width.should == 5
38
+ end
39
+
40
+ end
41
+
42
+ describe "#sensor" do
43
+ it "should add sensor" do
44
+ w.sensor :s1
45
+ w.sensor :s2
46
+ sensors = w.to_data.sensors
47
+ sensors.size.should == 2
48
+ sensors.first.name.to_s.should == 's1'
49
+ sensors.last.name.to_s.should == 's2'
50
+ end
51
+ end
52
+
53
+ describe "#title" do
54
+ it "should set title" do
55
+ w.title 'Title XXX'
56
+ w.to_data.title.should == 'Title XXX'
57
+ w.title 'Title YYY'
58
+ w.to_data.title.should == 'Title YYY'
59
+ end
60
+ end
61
+
62
+ describe "#width" do
63
+ it "should set width" do
64
+ w.width 6
65
+ w.to_data.width.should == 6
66
+ end
67
+
68
+ it "should raise exception if width is invalid" do
69
+ expect { w.width -1 }.to raise_exception(PulseMeter::DygraphsVisualize::DSL::BadWidgetWidth)
70
+ expect { w.width 13 }.to raise_exception(PulseMeter::DygraphsVisualize::DSL::BadWidgetWidth)
71
+ end
72
+ end
73
+
74
+ describe "#redraw_interval" do
75
+ it "should set redraw_interval" do
76
+ w.redraw_interval 5
77
+ w.to_data.redraw_interval.should == 5
78
+ end
79
+ it "should raise exception if redraw_interval is negative" do
80
+ expect{ w.redraw_interval(-1) }.to raise_exception(PulseMeter::DygraphsVisualize::DSL::BadWidgetRedrawInterval)
81
+ end
82
+
83
+ end
84
+
85
+ describe "#to_data" do
86
+ it "should convert dsl data to widget" do
87
+ w.to_data.should be_kind_of(PulseMeter::DygraphsVisualize::Widget)
88
+ end
89
+ end
90
+
91
+ describe "#dygraphs_options" do
92
+ it "should add options to dygraphs_options hash" do
93
+ w.dygraphs_options a: 1
94
+ w.dygraphs_options b: 2
95
+ w.to_data.dygraphs_options.should include(a: 1, b: 2)
96
+ end
97
+ end
98
+
99
+ describe "any anknown method" do
100
+ it "should add options to dygraphs_options hash" do
101
+ w.foobar 123
102
+ w.to_data.dygraphs_options[:foobar].should == 123
103
+ end
104
+ end
105
+ end
106
+
@@ -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::DygraphsVisualize::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.dygraphs_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, dygraphs_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[:dygraphs_options][:a].should == 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
@@ -0,0 +1,36 @@
1
+ require 'rubygems'
2
+ require 'bundler/setup'
3
+ $:.unshift File.expand_path('../../lib/', __FILE__)
4
+
5
+ ROOT = File.expand_path('../..', __FILE__)
6
+
7
+ Bundler.require(:test, :development)
8
+
9
+ SimpleCov.start
10
+
11
+ require 'pulse_meter_dygraphs_visualizer'
12
+ PulseMeter.redis = MockRedis.new
13
+
14
+ require 'rack/test'
15
+
16
+ Dir['spec/shared_examples/**/*.rb'].each{|f| require File.join(ROOT,f)}
17
+
18
+ require 'aquarium'
19
+ include Aquarium::Aspects
20
+
21
+ Aspect.new :after, :calls_to => [:event, :event_at], :for_types => [PulseMeter::Sensor::Base, PulseMeter::Sensor::Timeline] do |jp, obj, *args|
22
+ PulseMeter.command_aggregator.wait_for_pending_events
23
+ end
24
+
25
+ PulseMeter.command_aggregator.max_queue_length = 20
26
+
27
+ RSpec.configure do |config|
28
+ config.before(:each) do
29
+ PulseMeter.redis = MockRedis.new
30
+ Timecop.return
31
+ PulseMeter.logger = Logger.new("/dev/null")
32
+ end
33
+ config.filter_run :focus => true
34
+ config.run_all_when_everything_filtered = true
35
+ end
36
+
metadata ADDED
@@ -0,0 +1,497 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: pulse_meter-dygraphs_visualizer
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.4.15
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Ilya Averyanov
9
+ - Sergey Averyanov
10
+ autorequire:
11
+ bindir: bin
12
+ cert_chain: []
13
+ date: 2013-11-09 00:00:00.000000000 Z
14
+ dependencies:
15
+ - !ruby/object:Gem::Dependency
16
+ name: pulse_meter_core
17
+ requirement: !ruby/object:Gem::Requirement
18
+ none: false
19
+ requirements:
20
+ - - ! '>='
21
+ - !ruby/object:Gem::Version
22
+ version: '0'
23
+ type: :runtime
24
+ prerelease: false
25
+ version_requirements: !ruby/object:Gem::Requirement
26
+ none: false
27
+ requirements:
28
+ - - ! '>='
29
+ - !ruby/object:Gem::Version
30
+ version: '0'
31
+ - !ruby/object:Gem::Dependency
32
+ name: gon-sinatra
33
+ requirement: !ruby/object:Gem::Requirement
34
+ none: false
35
+ requirements:
36
+ - - ! '>='
37
+ - !ruby/object:Gem::Version
38
+ version: '0'
39
+ type: :runtime
40
+ prerelease: false
41
+ version_requirements: !ruby/object:Gem::Requirement
42
+ none: false
43
+ requirements:
44
+ - - ! '>='
45
+ - !ruby/object:Gem::Version
46
+ version: '0'
47
+ - !ruby/object:Gem::Dependency
48
+ name: haml
49
+ requirement: !ruby/object:Gem::Requirement
50
+ none: false
51
+ requirements:
52
+ - - ! '>='
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ type: :runtime
56
+ prerelease: false
57
+ version_requirements: !ruby/object:Gem::Requirement
58
+ none: false
59
+ requirements:
60
+ - - ! '>='
61
+ - !ruby/object:Gem::Version
62
+ version: '0'
63
+ - !ruby/object:Gem::Dependency
64
+ name: sinatra
65
+ requirement: !ruby/object:Gem::Requirement
66
+ none: false
67
+ requirements:
68
+ - - ! '>='
69
+ - !ruby/object:Gem::Version
70
+ version: '0'
71
+ type: :runtime
72
+ prerelease: false
73
+ version_requirements: !ruby/object:Gem::Requirement
74
+ none: false
75
+ requirements:
76
+ - - ! '>='
77
+ - !ruby/object:Gem::Version
78
+ version: '0'
79
+ - !ruby/object:Gem::Dependency
80
+ name: sinatra-partial
81
+ requirement: !ruby/object:Gem::Requirement
82
+ none: false
83
+ requirements:
84
+ - - ! '>='
85
+ - !ruby/object:Gem::Version
86
+ version: '0'
87
+ type: :runtime
88
+ prerelease: false
89
+ version_requirements: !ruby/object:Gem::Requirement
90
+ none: false
91
+ requirements:
92
+ - - ! '>='
93
+ - !ruby/object:Gem::Version
94
+ version: '0'
95
+ - !ruby/object:Gem::Dependency
96
+ name: aquarium
97
+ requirement: !ruby/object:Gem::Requirement
98
+ none: false
99
+ requirements:
100
+ - - ! '>='
101
+ - !ruby/object:Gem::Version
102
+ version: '0'
103
+ type: :development
104
+ prerelease: false
105
+ version_requirements: !ruby/object:Gem::Requirement
106
+ none: false
107
+ requirements:
108
+ - - ! '>='
109
+ - !ruby/object:Gem::Version
110
+ version: '0'
111
+ - !ruby/object:Gem::Dependency
112
+ name: coffee-script
113
+ requirement: !ruby/object:Gem::Requirement
114
+ none: false
115
+ requirements:
116
+ - - ! '>='
117
+ - !ruby/object:Gem::Version
118
+ version: '0'
119
+ type: :development
120
+ prerelease: false
121
+ version_requirements: !ruby/object:Gem::Requirement
122
+ none: false
123
+ requirements:
124
+ - - ! '>='
125
+ - !ruby/object:Gem::Version
126
+ version: '0'
127
+ - !ruby/object:Gem::Dependency
128
+ name: foreman
129
+ requirement: !ruby/object:Gem::Requirement
130
+ none: false
131
+ requirements:
132
+ - - ! '>='
133
+ - !ruby/object:Gem::Version
134
+ version: '0'
135
+ type: :development
136
+ prerelease: false
137
+ version_requirements: !ruby/object:Gem::Requirement
138
+ none: false
139
+ requirements:
140
+ - - ! '>='
141
+ - !ruby/object:Gem::Version
142
+ version: '0'
143
+ - !ruby/object:Gem::Dependency
144
+ name: hashie
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'
159
+ - !ruby/object:Gem::Dependency
160
+ name: listen
161
+ requirement: !ruby/object:Gem::Requirement
162
+ none: false
163
+ requirements:
164
+ - - ! '>='
165
+ - !ruby/object:Gem::Version
166
+ version: '0'
167
+ type: :development
168
+ prerelease: false
169
+ version_requirements: !ruby/object:Gem::Requirement
170
+ none: false
171
+ requirements:
172
+ - - ! '>='
173
+ - !ruby/object:Gem::Version
174
+ version: '0'
175
+ - !ruby/object:Gem::Dependency
176
+ name: mock_redis
177
+ requirement: !ruby/object:Gem::Requirement
178
+ none: false
179
+ requirements:
180
+ - - ! '>='
181
+ - !ruby/object:Gem::Version
182
+ version: '0'
183
+ type: :development
184
+ prerelease: false
185
+ version_requirements: !ruby/object:Gem::Requirement
186
+ none: false
187
+ requirements:
188
+ - - ! '>='
189
+ - !ruby/object:Gem::Version
190
+ version: '0'
191
+ - !ruby/object:Gem::Dependency
192
+ name: rack-test
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'
207
+ - !ruby/object:Gem::Dependency
208
+ name: rake
209
+ requirement: !ruby/object:Gem::Requirement
210
+ none: false
211
+ requirements:
212
+ - - ! '>='
213
+ - !ruby/object:Gem::Version
214
+ version: '0'
215
+ type: :development
216
+ prerelease: false
217
+ version_requirements: !ruby/object:Gem::Requirement
218
+ none: false
219
+ requirements:
220
+ - - ! '>='
221
+ - !ruby/object:Gem::Version
222
+ version: '0'
223
+ - !ruby/object:Gem::Dependency
224
+ name: rb-fsevent
225
+ requirement: !ruby/object:Gem::Requirement
226
+ none: false
227
+ requirements:
228
+ - - ! '>='
229
+ - !ruby/object:Gem::Version
230
+ version: '0'
231
+ type: :development
232
+ prerelease: false
233
+ version_requirements: !ruby/object:Gem::Requirement
234
+ none: false
235
+ requirements:
236
+ - - ! '>='
237
+ - !ruby/object:Gem::Version
238
+ version: '0'
239
+ - !ruby/object:Gem::Dependency
240
+ name: redcarpet
241
+ requirement: !ruby/object:Gem::Requirement
242
+ none: false
243
+ requirements:
244
+ - - ! '>='
245
+ - !ruby/object:Gem::Version
246
+ version: '0'
247
+ type: :development
248
+ prerelease: false
249
+ version_requirements: !ruby/object:Gem::Requirement
250
+ none: false
251
+ requirements:
252
+ - - ! '>='
253
+ - !ruby/object:Gem::Version
254
+ version: '0'
255
+ - !ruby/object:Gem::Dependency
256
+ name: rspec
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'
271
+ - !ruby/object:Gem::Dependency
272
+ name: simplecov
273
+ requirement: !ruby/object:Gem::Requirement
274
+ none: false
275
+ requirements:
276
+ - - ! '>='
277
+ - !ruby/object:Gem::Version
278
+ version: '0'
279
+ type: :development
280
+ prerelease: false
281
+ version_requirements: !ruby/object:Gem::Requirement
282
+ none: false
283
+ requirements:
284
+ - - ! '>='
285
+ - !ruby/object:Gem::Version
286
+ version: '0'
287
+ - !ruby/object:Gem::Dependency
288
+ name: sprockets
289
+ requirement: !ruby/object:Gem::Requirement
290
+ none: false
291
+ requirements:
292
+ - - ! '>='
293
+ - !ruby/object:Gem::Version
294
+ version: '0'
295
+ type: :development
296
+ prerelease: false
297
+ version_requirements: !ruby/object:Gem::Requirement
298
+ none: false
299
+ requirements:
300
+ - - ! '>='
301
+ - !ruby/object:Gem::Version
302
+ version: '0'
303
+ - !ruby/object:Gem::Dependency
304
+ name: timecop
305
+ requirement: !ruby/object:Gem::Requirement
306
+ none: false
307
+ requirements:
308
+ - - ! '>='
309
+ - !ruby/object:Gem::Version
310
+ version: '0'
311
+ type: :development
312
+ prerelease: false
313
+ version_requirements: !ruby/object:Gem::Requirement
314
+ none: false
315
+ requirements:
316
+ - - ! '>='
317
+ - !ruby/object:Gem::Version
318
+ version: '0'
319
+ - !ruby/object:Gem::Dependency
320
+ name: yard
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'
335
+ description: Customizable web interface for PulseMeter gem
336
+ email:
337
+ - av@fun-box.ru
338
+ - averyanov@gmail.com
339
+ executables: []
340
+ extensions: []
341
+ extra_rdoc_files: []
342
+ files:
343
+ - .gitignore
344
+ - .rbenv-version
345
+ - .rspec
346
+ - .rvmrc
347
+ - .travis.yml
348
+ - Gemfile
349
+ - LICENSE
350
+ - Procfile
351
+ - README.md
352
+ - Rakefile
353
+ - examples/basic.ru
354
+ - examples/basic_sensor_data.rb
355
+ - lib/pulse_meter/dygraphs_visualize/app.rb
356
+ - lib/pulse_meter/dygraphs_visualize/base.rb
357
+ - lib/pulse_meter/dygraphs_visualize/coffee/application.coffee
358
+ - lib/pulse_meter/dygraphs_visualize/coffee/collections/page_info_list.coffee
359
+ - lib/pulse_meter/dygraphs_visualize/coffee/collections/sensor_info_list.coffee
360
+ - lib/pulse_meter/dygraphs_visualize/coffee/collections/widget_list.coffee
361
+ - lib/pulse_meter/dygraphs_visualize/coffee/extensions.coffee
362
+ - lib/pulse_meter/dygraphs_visualize/coffee/models/dinamic_widget.coffee
363
+ - lib/pulse_meter/dygraphs_visualize/coffee/models/page_info.coffee
364
+ - lib/pulse_meter/dygraphs_visualize/coffee/models/sensor_info.coffee
365
+ - lib/pulse_meter/dygraphs_visualize/coffee/models/widget.coffee
366
+ - lib/pulse_meter/dygraphs_visualize/coffee/presenters/line.coffee
367
+ - lib/pulse_meter/dygraphs_visualize/coffee/presenters/series.coffee
368
+ - lib/pulse_meter/dygraphs_visualize/coffee/presenters/stack.coffee
369
+ - lib/pulse_meter/dygraphs_visualize/coffee/presenters/timeline.coffee
370
+ - lib/pulse_meter/dygraphs_visualize/coffee/presenters/widget.coffee
371
+ - lib/pulse_meter/dygraphs_visualize/coffee/router.coffee
372
+ - lib/pulse_meter/dygraphs_visualize/coffee/views/dynamic_chart.coffee
373
+ - lib/pulse_meter/dygraphs_visualize/coffee/views/dynamic_widget.coffee
374
+ - lib/pulse_meter/dygraphs_visualize/coffee/views/page_title.coffee
375
+ - lib/pulse_meter/dygraphs_visualize/coffee/views/page_titles.coffee
376
+ - lib/pulse_meter/dygraphs_visualize/coffee/views/sensor_info_list.coffee
377
+ - lib/pulse_meter/dygraphs_visualize/coffee/views/widget.coffee
378
+ - lib/pulse_meter/dygraphs_visualize/coffee/views/widget_chart.coffee
379
+ - lib/pulse_meter/dygraphs_visualize/coffee/views/widget_list.coffee
380
+ - lib/pulse_meter/dygraphs_visualize/dsl/base.rb
381
+ - lib/pulse_meter/dygraphs_visualize/dsl/errors.rb
382
+ - lib/pulse_meter/dygraphs_visualize/dsl/layout.rb
383
+ - lib/pulse_meter/dygraphs_visualize/dsl/page.rb
384
+ - lib/pulse_meter/dygraphs_visualize/dsl/sensor.rb
385
+ - lib/pulse_meter/dygraphs_visualize/dsl/widget.rb
386
+ - lib/pulse_meter/dygraphs_visualize/dsl/widgets/line.rb
387
+ - lib/pulse_meter/dygraphs_visualize/dsl/widgets/stack.rb
388
+ - lib/pulse_meter/dygraphs_visualize/layout.rb
389
+ - lib/pulse_meter/dygraphs_visualize/page.rb
390
+ - lib/pulse_meter/dygraphs_visualize/public/css/application.css
391
+ - lib/pulse_meter/dygraphs_visualize/public/css/bootstrap.css
392
+ - lib/pulse_meter/dygraphs_visualize/public/css/bootstrap.min.css
393
+ - lib/pulse_meter/dygraphs_visualize/public/css/images/ui-bg_flat_0_aaaaaa_40x100.png
394
+ - lib/pulse_meter/dygraphs_visualize/public/css/images/ui-bg_glass_55_fbf9ee_1x400.png
395
+ - lib/pulse_meter/dygraphs_visualize/public/css/images/ui-bg_glass_65_ffffff_1x400.png
396
+ - lib/pulse_meter/dygraphs_visualize/public/css/images/ui-bg_glass_75_dadada_1x400.png
397
+ - lib/pulse_meter/dygraphs_visualize/public/css/images/ui-bg_glass_75_e6e6e6_1x400.png
398
+ - lib/pulse_meter/dygraphs_visualize/public/css/images/ui-bg_glass_75_ffffff_1x400.png
399
+ - lib/pulse_meter/dygraphs_visualize/public/css/images/ui-bg_highlight-soft_75_cccccc_1x100.png
400
+ - lib/pulse_meter/dygraphs_visualize/public/css/images/ui-bg_inset-soft_95_fef1ec_1x100.png
401
+ - lib/pulse_meter/dygraphs_visualize/public/css/images/ui-icons_222222_256x240.png
402
+ - lib/pulse_meter/dygraphs_visualize/public/css/images/ui-icons_2e83ff_256x240.png
403
+ - lib/pulse_meter/dygraphs_visualize/public/css/images/ui-icons_454545_256x240.png
404
+ - lib/pulse_meter/dygraphs_visualize/public/css/images/ui-icons_888888_256x240.png
405
+ - lib/pulse_meter/dygraphs_visualize/public/css/images/ui-icons_cd0a0a_256x240.png
406
+ - lib/pulse_meter/dygraphs_visualize/public/css/images/ui-icons_f6cf3b_256x240.png
407
+ - lib/pulse_meter/dygraphs_visualize/public/css/jquery-ui-1.8.16.bootstrap.css
408
+ - lib/pulse_meter/dygraphs_visualize/public/favicon.ico
409
+ - lib/pulse_meter/dygraphs_visualize/public/img/glyphicons-halflings-white.png
410
+ - lib/pulse_meter/dygraphs_visualize/public/img/glyphicons-halflings.png
411
+ - lib/pulse_meter/dygraphs_visualize/public/js/application.js
412
+ - lib/pulse_meter/dygraphs_visualize/public/js/backbone-min.js
413
+ - lib/pulse_meter/dygraphs_visualize/public/js/bootstrap.js
414
+ - lib/pulse_meter/dygraphs_visualize/public/js/dygraph-combined.js
415
+ - lib/pulse_meter/dygraphs_visualize/public/js/jquery-1.7.2.min.js
416
+ - lib/pulse_meter/dygraphs_visualize/public/js/jquery-ui-1.8.16.bootstrap.min.js
417
+ - lib/pulse_meter/dygraphs_visualize/public/js/jquery-ui-1.8.23.custom.min.js
418
+ - lib/pulse_meter/dygraphs_visualize/public/js/jquery-ui-timepicker-addon.js
419
+ - lib/pulse_meter/dygraphs_visualize/public/js/json2.js
420
+ - lib/pulse_meter/dygraphs_visualize/public/js/underscore-min.js
421
+ - lib/pulse_meter/dygraphs_visualize/sensor.rb
422
+ - lib/pulse_meter/dygraphs_visualize/series_color.rb
423
+ - lib/pulse_meter/dygraphs_visualize/series_extractor.rb
424
+ - lib/pulse_meter/dygraphs_visualize/views/main.haml
425
+ - lib/pulse_meter/dygraphs_visualize/views/sensors.haml
426
+ - lib/pulse_meter/dygraphs_visualize/views/widgets/extend_options.haml
427
+ - lib/pulse_meter/dygraphs_visualize/views/widgets/line.haml
428
+ - lib/pulse_meter/dygraphs_visualize/views/widgets/stack.haml
429
+ - lib/pulse_meter/dygraphs_visualize/widget.rb
430
+ - lib/pulse_meter/dygraphs_visualize/widgets/timeline.rb
431
+ - lib/pulse_meter/dygraphs_visualizer.rb
432
+ - lib/pulse_meter_dygraphs_visualizer.rb
433
+ - pulse_meter-dygraphs_visualizer.gemspec
434
+ - spec/pulse_meter/dygraphs_visualize/app_spec.rb
435
+ - spec/pulse_meter/dygraphs_visualize/dsl/layout_spec.rb
436
+ - spec/pulse_meter/dygraphs_visualize/dsl/page_spec.rb
437
+ - spec/pulse_meter/dygraphs_visualize/dsl/sensor_spec.rb
438
+ - spec/pulse_meter/dygraphs_visualize/dsl/widget_spec.rb
439
+ - spec/pulse_meter/dygraphs_visualize/dsl/widgets/line_spec.rb
440
+ - spec/pulse_meter/dygraphs_visualize/dsl/widgets/stack_spec.rb
441
+ - spec/pulse_meter/dygraphs_visualize/layout_spec.rb
442
+ - spec/pulse_meter/dygraphs_visualize/page_spec.rb
443
+ - spec/pulse_meter/dygraphs_visualize/sensor_spec.rb
444
+ - spec/pulse_meter/dygraphs_visualize/series_extractor_spec.rb
445
+ - spec/pulse_meter/dygraphs_visualize/widgets/line_spec.rb
446
+ - spec/pulse_meter/dygraphs_visualize/widgets/stack_spec.rb
447
+ - spec/pulse_meter/dygraphs_visualizer_spec.rb
448
+ - spec/shared_examples/dsl_widget.rb
449
+ - spec/shared_examples/widget.rb
450
+ - spec/spec_helper.rb
451
+ homepage: https://github.com/savonarola/pulse_meter-dygraphs_visualizer
452
+ licenses: []
453
+ post_install_message:
454
+ rdoc_options: []
455
+ require_paths:
456
+ - lib
457
+ required_ruby_version: !ruby/object:Gem::Requirement
458
+ none: false
459
+ requirements:
460
+ - - ! '>='
461
+ - !ruby/object:Gem::Version
462
+ version: 1.9.2
463
+ required_rubygems_version: !ruby/object:Gem::Requirement
464
+ none: false
465
+ requirements:
466
+ - - ! '>='
467
+ - !ruby/object:Gem::Version
468
+ version: '0'
469
+ segments:
470
+ - 0
471
+ hash: 1357323714148990149
472
+ requirements: []
473
+ rubyforge_project:
474
+ rubygems_version: 1.8.23
475
+ signing_key:
476
+ specification_version: 3
477
+ summary: Customizable Dygraphs-based web interface for lightweight metrics aggregator
478
+ and processor PulseMeter
479
+ test_files:
480
+ - spec/pulse_meter/dygraphs_visualize/app_spec.rb
481
+ - spec/pulse_meter/dygraphs_visualize/dsl/layout_spec.rb
482
+ - spec/pulse_meter/dygraphs_visualize/dsl/page_spec.rb
483
+ - spec/pulse_meter/dygraphs_visualize/dsl/sensor_spec.rb
484
+ - spec/pulse_meter/dygraphs_visualize/dsl/widget_spec.rb
485
+ - spec/pulse_meter/dygraphs_visualize/dsl/widgets/line_spec.rb
486
+ - spec/pulse_meter/dygraphs_visualize/dsl/widgets/stack_spec.rb
487
+ - spec/pulse_meter/dygraphs_visualize/layout_spec.rb
488
+ - spec/pulse_meter/dygraphs_visualize/page_spec.rb
489
+ - spec/pulse_meter/dygraphs_visualize/sensor_spec.rb
490
+ - spec/pulse_meter/dygraphs_visualize/series_extractor_spec.rb
491
+ - spec/pulse_meter/dygraphs_visualize/widgets/line_spec.rb
492
+ - spec/pulse_meter/dygraphs_visualize/widgets/stack_spec.rb
493
+ - spec/pulse_meter/dygraphs_visualizer_spec.rb
494
+ - spec/shared_examples/dsl_widget.rb
495
+ - spec/shared_examples/widget.rb
496
+ - spec/spec_helper.rb
497
+ has_rdoc: