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