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,38 @@
1
+ module PulseMeter
2
+ module DygraphsVisualize
3
+ class Error < StandardError; end
4
+
5
+ class Widget < Base
6
+ def initialize(opts)
7
+ super
8
+ @opts[:sensors] ||= []
9
+ end
10
+
11
+ def data
12
+ {
13
+ type: type,
14
+ title: title,
15
+ redraw_interval: redraw_interval,
16
+ width: width,
17
+ dygraphs_options: dygraphs_options,
18
+ values_title: values_label
19
+ }
20
+ end
21
+
22
+ def type
23
+ self.class.to_s.split('::').last.downcase
24
+ end
25
+
26
+ protected
27
+
28
+ def gauge_series_data
29
+ ensure_gauge_indicators!
30
+ sensors.map do |s|
31
+ [s.annotation, s.value]
32
+ end
33
+ end
34
+
35
+ end
36
+ end
37
+ end
38
+
@@ -0,0 +1,107 @@
1
+ module PulseMeter
2
+ module DygraphsVisualize
3
+ module Widgets
4
+ class Error < StandardError; end
5
+ class Timeline < PulseMeter::DygraphsVisualize::Widget
6
+
7
+ class NotATimelinedSensorInWidget < PulseMeter::DygraphsVisualize::Error; end
8
+ class DifferentSensorIntervalsInWidget < PulseMeter::DygraphsVisualize::Error; end
9
+
10
+ DEFAULT_TIMESPAN = 3600
11
+
12
+ def initialize(opts)
13
+ super
14
+ opts[:timespan] ||= DEFAULT_TIMESPAN
15
+ end
16
+
17
+ def data(options = {})
18
+ from, till = get_interval_borders(options)
19
+ super().merge({
20
+ values_title: values_label,
21
+ series: series_data(from, till),
22
+ timespan: timespan,
23
+ interval: interval
24
+ })
25
+ end
26
+
27
+ protected
28
+
29
+ def get_interval_borders(options)
30
+ from = if options[:start_time] && (options[:start_time] > 0)
31
+ Time.at options[:start_time]
32
+ else
33
+ tspan = options[:timespan] || timespan
34
+ Time.now - tspan
35
+ end
36
+
37
+ till = if options[:end_time] && (options[:end_time] > 0)
38
+ Time.at options[:end_time]
39
+ else
40
+ Time.now
41
+ end
42
+ [from, till]
43
+ end
44
+
45
+ def series_data(from, till)
46
+ ensure_equal_intervals!
47
+ sensor_datas = sensors.map{ |s|
48
+ s.timeline_data(from, till, show_last_point)
49
+ }
50
+ rows = []
51
+ titles = []
52
+ series_options = []
53
+ datas = []
54
+ sensor_datas.each do |sensor_data|
55
+ sensor_data.each do |tl|
56
+ titles << tl[:name]
57
+ series_options << {color: PulseMeter::DygraphsVisualize::SeriesColor.new(tl).color}
58
+ datas << tl[:data]
59
+ end
60
+ end
61
+ unless datas.empty?
62
+ first = datas.shift
63
+ first.each_with_index do |tl_data, row_num|
64
+ rows << datas.each_with_object([tl_data[:x], tl_data[:y]]) do |data_col, row|
65
+ row << data_col[row_num][:y]
66
+ end
67
+ end
68
+ end
69
+ {
70
+ titles: titles,
71
+ rows: rows,
72
+ options: series_options
73
+ }
74
+ end
75
+
76
+ def ensure_equal_intervals!
77
+ intervals = []
78
+ sensors.each do |s|
79
+ unless s.type < PulseMeter::Sensor::Timeline
80
+ raise NotATimelinedSensorInWidget, "sensor `#{s.name}' is not timelined"
81
+ end
82
+ intervals << s.interval
83
+ end
84
+
85
+ unless intervals.all?{|i| i == intervals.first}
86
+ interval_notice = sensors.map{|s| "#{s.name}: #{s.interval}"}.join(', ')
87
+ raise DifferentSensorIntervalsInWidget, "Sensors with different intervals in a single widget: #{interval_notice}"
88
+ end
89
+ end
90
+
91
+ def interval
92
+ if sensors.empty?
93
+ nil
94
+ else
95
+ sensors.first.interval
96
+ end
97
+ end
98
+
99
+ end
100
+
101
+ class Stack < Timeline; end
102
+ class Line < Timeline; end
103
+
104
+ end
105
+ end
106
+ end
107
+
@@ -0,0 +1,34 @@
1
+ # DygraphsVisualize
2
+
3
+ require 'pulse_meter/dygraphs_visualize/series_color'
4
+ require 'pulse_meter/dygraphs_visualize/base'
5
+ require 'pulse_meter/dygraphs_visualize/sensor'
6
+ require 'pulse_meter/dygraphs_visualize/widget'
7
+ require 'pulse_meter/dygraphs_visualize/widgets/timeline'
8
+ require 'pulse_meter/dygraphs_visualize/page'
9
+ require 'pulse_meter/dygraphs_visualize/layout'
10
+
11
+ # DSL
12
+
13
+ require 'pulse_meter/dygraphs_visualize/dsl/errors'
14
+ require 'pulse_meter/dygraphs_visualize/dsl/base'
15
+ require 'pulse_meter/dygraphs_visualize/dsl/sensor'
16
+ require 'pulse_meter/dygraphs_visualize/dsl/widget'
17
+ require 'pulse_meter/dygraphs_visualize/dsl/widgets/line'
18
+ require 'pulse_meter/dygraphs_visualize/dsl/widgets/stack'
19
+ require 'pulse_meter/dygraphs_visualize/dsl/page'
20
+ require 'pulse_meter/dygraphs_visualize/dsl/layout'
21
+
22
+ # App
23
+
24
+ require 'pulse_meter/dygraphs_visualize/app'
25
+
26
+ module PulseMeter
27
+ class DygraphsVisualizer
28
+ def self.draw(&block)
29
+ layout_cofigurator = PulseMeter::DygraphsVisualize::DSL::Layout.new
30
+ yield(layout_cofigurator)
31
+ layout_cofigurator.to_data
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,2 @@
1
+ require 'pulse_meter_core'
2
+ require 'pulse_meter/dygraphs_visualizer'
@@ -0,0 +1,41 @@
1
+ # -*- encoding: utf-8 -*-
2
+ Gem::Specification.new do |gem|
3
+ gem.authors = ["Ilya Averyanov", "Sergey Averyanov"]
4
+ gem.email = ["av@fun-box.ru", "averyanov@gmail.com"]
5
+ gem.description = %q{Customizable web interface for PulseMeter gem}
6
+ gem.summary = %q{
7
+ Customizable Dygraphs-based web interface for lightweight metrics aggregator and processor PulseMeter
8
+ }
9
+ gem.homepage = "https://github.com/savonarola/pulse_meter-dygraphs_visualizer"
10
+
11
+ gem.required_ruby_version = '>= 1.9.2'
12
+ gem.files = `git ls-files`.split($\)
13
+ gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
14
+ gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
15
+ gem.name = "pulse_meter-dygraphs_visualizer"
16
+ gem.require_paths = ["lib"]
17
+ gem.version = "0.4.15"
18
+
19
+ gem.add_runtime_dependency('pulse_meter_core')
20
+ gem.add_runtime_dependency('gon-sinatra')
21
+ gem.add_runtime_dependency('haml')
22
+ gem.add_runtime_dependency('sinatra')
23
+ gem.add_runtime_dependency('sinatra-partial')
24
+
25
+ gem.add_development_dependency('aquarium')
26
+ gem.add_development_dependency('coffee-script')
27
+ gem.add_development_dependency('foreman')
28
+ gem.add_development_dependency('hashie')
29
+ gem.add_development_dependency('listen')
30
+ gem.add_development_dependency('mock_redis')
31
+ gem.add_development_dependency('rack-test')
32
+ gem.add_development_dependency('rake')
33
+ gem.add_development_dependency('rb-fsevent')
34
+ gem.add_development_dependency('redcarpet')
35
+ gem.add_development_dependency('rspec')
36
+ gem.add_development_dependency('simplecov')
37
+ gem.add_development_dependency('sprockets')
38
+ gem.add_development_dependency('timecop')
39
+ gem.add_development_dependency('yard')
40
+
41
+ end
@@ -0,0 +1,27 @@
1
+ require 'spec_helper'
2
+
3
+ describe PulseMeter::DygraphsVisualize::App do
4
+ include Rack::Test::Methods
5
+ before(:each) do
6
+ @layout = PulseMeter::DygraphsVisualizer.draw do |l|
7
+ l.title "Foo meters"
8
+ l.page "Foo page" do
9
+ end
10
+ end
11
+ end
12
+
13
+ def app
14
+ PulseMeter::DygraphsVisualize::App.new(@layout)
15
+ end
16
+
17
+ it "responds to /" do
18
+ get '/'
19
+ last_response.should be_ok
20
+ last_response.body.should include("Foo meters")
21
+ end
22
+
23
+ it "responds to /application.js" do
24
+ get '/js/application.js'
25
+ last_response.should be_ok
26
+ end
27
+ end
@@ -0,0 +1,64 @@
1
+ require 'spec_helper'
2
+
3
+ describe PulseMeter::DygraphsVisualize::DSL::Layout do
4
+ let(:interval){ 100 }
5
+ let(:sensor_name) { "some_sensor" }
6
+ let!(:sensor){ PulseMeter::Sensor::Timelined::Max.new(sensor_name, :ttl => 1000, :interval => interval) }
7
+ let(:layout){ described_class.new }
8
+
9
+ describe '.new' do
10
+ it "should initialize pages, title, use_utc, dygraphs_options" do
11
+ l = layout.to_data
12
+ l.title.should == PulseMeter::DygraphsVisualize::DSL::Layout::DEFAULT_TITLE
13
+ l.pages.should == []
14
+ l.use_utc.should be_false
15
+ l.dygraphs_options.should == {}
16
+ end
17
+ end
18
+
19
+ describe "#page" do
20
+ it "should add page constructed by block to pages" do
21
+ layout.page "My Foo Page" do |p|
22
+ p.stack "foo_widget", sensor: sensor_name
23
+ p.line "bar_widget" do |w|
24
+ w.sensor(sensor_name)
25
+ end
26
+ end
27
+ l = layout.to_data
28
+ l.pages.size.should == 1
29
+ p = l.pages.first
30
+ p.title.should == "My Foo Page"
31
+ p.widgets.size.should == 2
32
+ p.widgets.first.title.should == "foo_widget"
33
+ p.widgets.last.title.should == "bar_widget"
34
+ end
35
+ end
36
+
37
+ describe "#title" do
38
+ it "should set layout title" do
39
+ layout.title "Foo Title"
40
+ layout.to_data.title.should == 'Foo Title'
41
+ end
42
+ end
43
+
44
+ describe "#use_utc" do
45
+ it "should set use_utc" do
46
+ layout.use_utc false
47
+ layout.to_data.use_utc.should be_false
48
+ end
49
+ end
50
+
51
+ describe "#dygraphs_options" do
52
+ it "should set dygraphs_options" do
53
+ layout.dygraphs_options({b: 1})
54
+ layout.to_data.dygraphs_options.should == {b: 1}
55
+ end
56
+ end
57
+
58
+ describe "#to_data" do
59
+ it "should convert layout dsl data to DygraphsVisualize::Layout" do
60
+ layout.to_data.should be_kind_of(PulseMeter::DygraphsVisualize::Layout)
61
+ end
62
+ end
63
+ end
64
+
@@ -0,0 +1,62 @@
1
+ require 'spec_helper'
2
+
3
+ describe PulseMeter::DygraphsVisualize::DSL::Page do
4
+ let(:interval){ 100 }
5
+ let(:sensor_name) { "some_sensor" }
6
+ let!(:sensor){ PulseMeter::Sensor::Timelined::Max.new(sensor_name, :ttl => 1000, :interval => interval) }
7
+ let(:title) { "page title" }
8
+ let(:page){ PulseMeter::DygraphsVisualize::DSL::Page.new(title) }
9
+
10
+ describe '.new' do
11
+ it "should initialize title and widgets" do
12
+ p = page.to_data
13
+ p.title.should == title
14
+ p.widgets.should == []
15
+ end
16
+ end
17
+
18
+ [:line, :stack].each do |widget_type|
19
+
20
+ describe "##{widget_type}" do
21
+ it "should add #{widget_type} widget initialized by args to widgets" do
22
+ page.send(widget_type, :some_widget_name, sensor: sensor_name, width: 7)
23
+ w = page.to_data.widgets.first
24
+ w.width.should == 7
25
+ w.title.should == "some_widget_name"
26
+ w.sensors.first.name.should == sensor_name
27
+ end
28
+
29
+ it "should add #{widget_type} widget initialized by block" do
30
+ page.send(widget_type, :some_widget_name) do |w|
31
+ w.sensor(sensor_name)
32
+ w.sensor(sensor_name)
33
+ w.title "foo_widget"
34
+ w.width 7
35
+ end
36
+ w = page.to_data.widgets.first
37
+ w.type.should == widget_type.to_s
38
+ w.width.should == 7
39
+ w.title.should == "foo_widget"
40
+ w.sensors.size.should == 2
41
+ w.sensors.first.name.should == sensor_name
42
+ w.sensors.last.name.should == sensor_name
43
+ end
44
+ end
45
+
46
+ end
47
+
48
+ describe "#title" do
49
+ it "should set page title" do
50
+ page.title "Foo Title"
51
+ page.to_data.title.should == 'Foo Title'
52
+ end
53
+ end
54
+
55
+ describe "#to_data" do
56
+ it "should convert DSL data to DygraphsVisualize::Page" do
57
+ page.to_data.should be_kind_of(PulseMeter::DygraphsVisualize::Page)
58
+ end
59
+ end
60
+
61
+ end
62
+
@@ -0,0 +1,30 @@
1
+ require 'spec_helper'
2
+
3
+ describe PulseMeter::DygraphsVisualize::DSL::Sensor do
4
+ let(:interval){ 100 }
5
+ let(:name) { "some_sensor" }
6
+ let!(:sensor){ PulseMeter::Sensor::Timelined::Max.new(name, :ttl => 1000, :interval => interval) }
7
+
8
+ describe '.new' do
9
+ it "should save passed name and create DygraphsVisualize::Sensor with it" do
10
+ described_class.new(name).to_data.name.to_s.should == name
11
+ end
12
+ end
13
+
14
+ describe '#process_args' do
15
+ it "should pass args transparently to DygraphsVisualize::Sensor" do
16
+ s = described_class.new(name)
17
+ s.process_args color: :red
18
+ s.to_data.color.to_s.should == 'red'
19
+ end
20
+ end
21
+
22
+ describe '#to_data' do
23
+ # actually tested above
24
+ it "should convert dsl data to sensor" do
25
+ described_class.new(name).to_data.should be_kind_of(PulseMeter::DygraphsVisualize::Sensor)
26
+ end
27
+ end
28
+
29
+ end
30
+
@@ -0,0 +1,6 @@
1
+ require 'spec_helper'
2
+
3
+ describe PulseMeter::DygraphsVisualize::DSL::Widget do
4
+ it_should_behave_like "dsl widget"
5
+ end
6
+
@@ -0,0 +1,44 @@
1
+ require 'spec_helper'
2
+
3
+ describe PulseMeter::DygraphsVisualize::DSL::Widgets::Line do
4
+ it_should_behave_like "dsl widget"
5
+
6
+ let(:interval){ 100 }
7
+ let(:name) { "some_sensor" }
8
+ let!(:sensor){ PulseMeter::Sensor::Timelined::Max.new(name, :ttl => 1000, :interval => interval) }
9
+
10
+ let(:widget_name){ "some_widget" }
11
+ let(:w){ described_class.new(widget_name) }
12
+
13
+ describe "#to_data" do
14
+ it "should produce PulseMeter::DygraphsVisualize::Widgets::Area class" do
15
+ w.to_data.should be_kind_of(PulseMeter::DygraphsVisualize::Widgets::Line)
16
+ end
17
+ end
18
+
19
+ describe "#values_label" do
20
+ it "should set values_label" do
21
+ w.values_label "some y-axis legend"
22
+ w.to_data.values_label.should == "some y-axis legend"
23
+ end
24
+ end
25
+
26
+ describe "#show_last_point" do
27
+ it "should set show_last_point" do
28
+ w.show_last_point true
29
+ w.to_data.show_last_point.should be_true
30
+ end
31
+ end
32
+
33
+ describe "#timespan" do
34
+ it "should set timespan" do
35
+ w.timespan 5
36
+ w.to_data.timespan.should == 5
37
+ end
38
+ it "should raise exception if timespan is negative" do
39
+ expect{ w.timespan(-1) }.to raise_exception(PulseMeter::DygraphsVisualize::DSL::BadWidgetTimeSpan)
40
+ end
41
+ end
42
+
43
+ end
44
+