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,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
+