pulse_meter-dygraphs_visualizer 0.4.15

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 (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: