pulse_meter-dygraphs_visualizer 0.4.15
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +19 -0
- data/.rbenv-version +1 -0
- data/.rspec +1 -0
- data/.rvmrc +1 -0
- data/.travis.yml +9 -0
- data/Gemfile +4 -0
- data/LICENSE +22 -0
- data/Procfile +3 -0
- data/README.md +40 -0
- data/Rakefile +54 -0
- data/examples/basic.ru +125 -0
- data/examples/basic_sensor_data.rb +97 -0
- data/lib/pulse_meter/dygraphs_visualize/app.rb +78 -0
- data/lib/pulse_meter/dygraphs_visualize/base.rb +15 -0
- data/lib/pulse_meter/dygraphs_visualize/coffee/application.coffee +37 -0
- data/lib/pulse_meter/dygraphs_visualize/coffee/collections/page_info_list.coffee +17 -0
- data/lib/pulse_meter/dygraphs_visualize/coffee/collections/sensor_info_list.coffee +4 -0
- data/lib/pulse_meter/dygraphs_visualize/coffee/collections/widget_list.coffee +14 -0
- data/lib/pulse_meter/dygraphs_visualize/coffee/extensions.coffee +26 -0
- data/lib/pulse_meter/dygraphs_visualize/coffee/models/dinamic_widget.coffee +34 -0
- data/lib/pulse_meter/dygraphs_visualize/coffee/models/page_info.coffee +2 -0
- data/lib/pulse_meter/dygraphs_visualize/coffee/models/sensor_info.coffee +2 -0
- data/lib/pulse_meter/dygraphs_visualize/coffee/models/widget.coffee +63 -0
- data/lib/pulse_meter/dygraphs_visualize/coffee/presenters/line.coffee +1 -0
- data/lib/pulse_meter/dygraphs_visualize/coffee/presenters/series.coffee +26 -0
- data/lib/pulse_meter/dygraphs_visualize/coffee/presenters/stack.coffee +1 -0
- data/lib/pulse_meter/dygraphs_visualize/coffee/presenters/timeline.coffee +13 -0
- data/lib/pulse_meter/dygraphs_visualize/coffee/presenters/widget.coffee +48 -0
- data/lib/pulse_meter/dygraphs_visualize/coffee/router.coffee +21 -0
- data/lib/pulse_meter/dygraphs_visualize/coffee/views/dynamic_chart.coffee +92 -0
- data/lib/pulse_meter/dygraphs_visualize/coffee/views/dynamic_widget.coffee +58 -0
- data/lib/pulse_meter/dygraphs_visualize/coffee/views/page_title.coffee +17 -0
- data/lib/pulse_meter/dygraphs_visualize/coffee/views/page_titles.coffee +15 -0
- data/lib/pulse_meter/dygraphs_visualize/coffee/views/sensor_info_list.coffee +19 -0
- data/lib/pulse_meter/dygraphs_visualize/coffee/views/widget.coffee +91 -0
- data/lib/pulse_meter/dygraphs_visualize/coffee/views/widget_chart.coffee +15 -0
- data/lib/pulse_meter/dygraphs_visualize/coffee/views/widget_list.coffee +15 -0
- data/lib/pulse_meter/dygraphs_visualize/dsl/base.rb +131 -0
- data/lib/pulse_meter/dygraphs_visualize/dsl/errors.rb +40 -0
- data/lib/pulse_meter/dygraphs_visualize/dsl/layout.rb +27 -0
- data/lib/pulse_meter/dygraphs_visualize/dsl/page.rb +26 -0
- data/lib/pulse_meter/dygraphs_visualize/dsl/sensor.rb +20 -0
- data/lib/pulse_meter/dygraphs_visualize/dsl/widget.rb +37 -0
- data/lib/pulse_meter/dygraphs_visualize/dsl/widgets/line.rb +22 -0
- data/lib/pulse_meter/dygraphs_visualize/dsl/widgets/stack.rb +29 -0
- data/lib/pulse_meter/dygraphs_visualize/layout.rb +79 -0
- data/lib/pulse_meter/dygraphs_visualize/page.rb +25 -0
- data/lib/pulse_meter/dygraphs_visualize/public/css/application.css +61 -0
- data/lib/pulse_meter/dygraphs_visualize/public/css/bootstrap.css +4883 -0
- data/lib/pulse_meter/dygraphs_visualize/public/css/bootstrap.min.css +729 -0
- data/lib/pulse_meter/dygraphs_visualize/public/css/images/ui-bg_flat_0_aaaaaa_40x100.png +0 -0
- data/lib/pulse_meter/dygraphs_visualize/public/css/images/ui-bg_glass_55_fbf9ee_1x400.png +0 -0
- data/lib/pulse_meter/dygraphs_visualize/public/css/images/ui-bg_glass_65_ffffff_1x400.png +0 -0
- data/lib/pulse_meter/dygraphs_visualize/public/css/images/ui-bg_glass_75_dadada_1x400.png +0 -0
- data/lib/pulse_meter/dygraphs_visualize/public/css/images/ui-bg_glass_75_e6e6e6_1x400.png +0 -0
- data/lib/pulse_meter/dygraphs_visualize/public/css/images/ui-bg_glass_75_ffffff_1x400.png +0 -0
- data/lib/pulse_meter/dygraphs_visualize/public/css/images/ui-bg_highlight-soft_75_cccccc_1x100.png +0 -0
- data/lib/pulse_meter/dygraphs_visualize/public/css/images/ui-bg_inset-soft_95_fef1ec_1x100.png +0 -0
- data/lib/pulse_meter/dygraphs_visualize/public/css/images/ui-icons_222222_256x240.png +0 -0
- data/lib/pulse_meter/dygraphs_visualize/public/css/images/ui-icons_2e83ff_256x240.png +0 -0
- data/lib/pulse_meter/dygraphs_visualize/public/css/images/ui-icons_454545_256x240.png +0 -0
- data/lib/pulse_meter/dygraphs_visualize/public/css/images/ui-icons_888888_256x240.png +0 -0
- data/lib/pulse_meter/dygraphs_visualize/public/css/images/ui-icons_cd0a0a_256x240.png +0 -0
- data/lib/pulse_meter/dygraphs_visualize/public/css/images/ui-icons_f6cf3b_256x240.png +0 -0
- data/lib/pulse_meter/dygraphs_visualize/public/css/jquery-ui-1.8.16.bootstrap.css +1320 -0
- data/lib/pulse_meter/dygraphs_visualize/public/favicon.ico +208 -0
- data/lib/pulse_meter/dygraphs_visualize/public/img/glyphicons-halflings-white.png +0 -0
- data/lib/pulse_meter/dygraphs_visualize/public/img/glyphicons-halflings.png +0 -0
- data/lib/pulse_meter/dygraphs_visualize/public/js/application.js +833 -0
- data/lib/pulse_meter/dygraphs_visualize/public/js/backbone-min.js +38 -0
- data/lib/pulse_meter/dygraphs_visualize/public/js/bootstrap.js +1835 -0
- data/lib/pulse_meter/dygraphs_visualize/public/js/dygraph-combined.js +2 -0
- data/lib/pulse_meter/dygraphs_visualize/public/js/jquery-1.7.2.min.js +4 -0
- data/lib/pulse_meter/dygraphs_visualize/public/js/jquery-ui-1.8.16.bootstrap.min.js +791 -0
- data/lib/pulse_meter/dygraphs_visualize/public/js/jquery-ui-1.8.23.custom.min.js +21 -0
- data/lib/pulse_meter/dygraphs_visualize/public/js/jquery-ui-timepicker-addon.js +1687 -0
- data/lib/pulse_meter/dygraphs_visualize/public/js/json2.js +487 -0
- data/lib/pulse_meter/dygraphs_visualize/public/js/underscore-min.js +32 -0
- data/lib/pulse_meter/dygraphs_visualize/sensor.rb +63 -0
- data/lib/pulse_meter/dygraphs_visualize/series_color.rb +39 -0
- data/lib/pulse_meter/dygraphs_visualize/series_extractor.rb +107 -0
- data/lib/pulse_meter/dygraphs_visualize/views/main.haml +30 -0
- data/lib/pulse_meter/dygraphs_visualize/views/sensors.haml +75 -0
- data/lib/pulse_meter/dygraphs_visualize/views/widgets/extend_options.haml +11 -0
- data/lib/pulse_meter/dygraphs_visualize/views/widgets/line.haml +43 -0
- data/lib/pulse_meter/dygraphs_visualize/views/widgets/stack.haml +43 -0
- data/lib/pulse_meter/dygraphs_visualize/widget.rb +38 -0
- data/lib/pulse_meter/dygraphs_visualize/widgets/timeline.rb +107 -0
- data/lib/pulse_meter/dygraphs_visualizer.rb +34 -0
- data/lib/pulse_meter_dygraphs_visualizer.rb +2 -0
- data/pulse_meter-dygraphs_visualizer.gemspec +41 -0
- data/spec/pulse_meter/dygraphs_visualize/app_spec.rb +27 -0
- data/spec/pulse_meter/dygraphs_visualize/dsl/layout_spec.rb +64 -0
- data/spec/pulse_meter/dygraphs_visualize/dsl/page_spec.rb +62 -0
- data/spec/pulse_meter/dygraphs_visualize/dsl/sensor_spec.rb +30 -0
- data/spec/pulse_meter/dygraphs_visualize/dsl/widget_spec.rb +6 -0
- data/spec/pulse_meter/dygraphs_visualize/dsl/widgets/line_spec.rb +44 -0
- data/spec/pulse_meter/dygraphs_visualize/dsl/widgets/stack_spec.rb +55 -0
- data/spec/pulse_meter/dygraphs_visualize/layout_spec.rb +54 -0
- data/spec/pulse_meter/dygraphs_visualize/page_spec.rb +145 -0
- data/spec/pulse_meter/dygraphs_visualize/sensor_spec.rb +120 -0
- data/spec/pulse_meter/dygraphs_visualize/series_extractor_spec.rb +80 -0
- data/spec/pulse_meter/dygraphs_visualize/widgets/line_spec.rb +6 -0
- data/spec/pulse_meter/dygraphs_visualize/widgets/stack_spec.rb +6 -0
- data/spec/pulse_meter/dygraphs_visualizer_spec.rb +42 -0
- data/spec/shared_examples/dsl_widget.rb +106 -0
- data/spec/shared_examples/widget.rb +97 -0
- data/spec/spec_helper.rb +36 -0
- 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,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,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
|
+
|