pulse-meter 0.2.1 → 0.2.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (82) hide show
  1. data/.travis.yml +4 -0
  2. data/examples/basic.ru +23 -5
  3. data/examples/basic_sensor_data.rb +15 -2
  4. data/examples/full/server.ru +2 -3
  5. data/examples/minimal/server.ru +3 -2
  6. data/lib/pulse-meter/sensor.rb +2 -1
  7. data/lib/pulse-meter/sensor/configuration.rb +3 -1
  8. data/lib/pulse-meter/sensor/hashed_indicator.rb +22 -0
  9. data/lib/pulse-meter/sensor/timeline.rb +13 -1
  10. data/lib/pulse-meter/version.rb +1 -1
  11. data/lib/pulse-meter/visualize/app.rb +6 -2
  12. data/lib/pulse-meter/visualize/base.rb +15 -0
  13. data/lib/pulse-meter/visualize/dsl/base.rb +131 -0
  14. data/lib/pulse-meter/visualize/dsl/errors.rb +0 -6
  15. data/lib/pulse-meter/visualize/dsl/layout.rb +12 -41
  16. data/lib/pulse-meter/visualize/dsl/page.rb +15 -41
  17. data/lib/pulse-meter/visualize/dsl/sensor.rb +9 -10
  18. data/lib/pulse-meter/visualize/dsl/widget.rb +18 -65
  19. data/lib/pulse-meter/visualize/dsl/widget_old.rb +95 -0
  20. data/lib/pulse-meter/visualize/dsl/widgets/area.rb +20 -0
  21. data/lib/pulse-meter/visualize/dsl/widgets/gauge.rb +12 -0
  22. data/lib/pulse-meter/visualize/dsl/widgets/line.rb +21 -0
  23. data/lib/pulse-meter/visualize/dsl/widgets/pie.rb +16 -0
  24. data/lib/pulse-meter/visualize/dsl/widgets/table.rb +19 -0
  25. data/lib/pulse-meter/visualize/layout.rb +7 -16
  26. data/lib/pulse-meter/visualize/page.rb +5 -10
  27. data/lib/pulse-meter/visualize/public/favicon.ico +0 -0
  28. data/lib/pulse-meter/visualize/public/js/application.coffee +156 -107
  29. data/lib/pulse-meter/visualize/public/js/application.js +283 -122
  30. data/lib/pulse-meter/visualize/sensor.rb +7 -13
  31. data/lib/pulse-meter/visualize/views/main.haml +8 -52
  32. data/lib/pulse-meter/visualize/views/widgets/area.haml +31 -0
  33. data/lib/pulse-meter/visualize/views/widgets/extend_options.haml +11 -0
  34. data/lib/pulse-meter/visualize/views/widgets/gauge.haml +13 -0
  35. data/lib/pulse-meter/visualize/views/widgets/line.haml +31 -0
  36. data/lib/pulse-meter/visualize/views/widgets/pie.haml +13 -0
  37. data/lib/pulse-meter/visualize/views/widgets/table.haml +23 -0
  38. data/lib/pulse-meter/visualize/widget.rb +17 -87
  39. data/lib/pulse-meter/visualize/widgets/gauge.rb +47 -0
  40. data/lib/pulse-meter/visualize/widgets/pie.rb +36 -0
  41. data/lib/pulse-meter/visualize/widgets/timeline.rb +90 -0
  42. data/lib/pulse-meter/visualizer.rb +18 -8
  43. data/perl/PulseMeter/Sensor/Base.pm +42 -0
  44. data/perl/PulseMeter/Sensor/Counter.pm +19 -0
  45. data/perl/PulseMeter/Sensor/HashedIndicator.pm +12 -0
  46. data/perl/PulseMeter/Sensor/Indicator.pm +17 -0
  47. data/perl/PulseMeter/Sensor/Timeline.pm +51 -0
  48. data/perl/PulseMeter/Sensor/Timelined/Average.pm +13 -0
  49. data/perl/PulseMeter/Sensor/Timelined/Counter.pm +12 -0
  50. data/perl/PulseMeter/Sensor/Timelined/HashedCounter.pm +12 -0
  51. data/perl/PulseMeter/Sensor/Timelined/Max.pm +18 -0
  52. data/perl/PulseMeter/Sensor/Timelined/Median.pm +8 -0
  53. data/perl/PulseMeter/Sensor/Timelined/Min.pm +18 -0
  54. data/perl/PulseMeter/Sensor/Timelined/Percentile.pm +17 -0
  55. data/perl/PulseMeter/Sensor/Timelined/UniqCounter.pm +13 -0
  56. data/perl/PulseMeter/Sensor/UniqCounter.pm +12 -0
  57. data/pulse-meter.gemspec +1 -0
  58. data/spec/pulse_meter/sensor/configuration_spec.rb +10 -2
  59. data/spec/pulse_meter/sensor/hashed_indicator_spec.rb +39 -0
  60. data/spec/pulse_meter/visualize/dsl/layout_spec.rb +8 -8
  61. data/spec/pulse_meter/visualize/dsl/page_spec.rb +29 -42
  62. data/spec/pulse_meter/visualize/dsl/sensor_spec.rb +5 -5
  63. data/spec/pulse_meter/visualize/dsl/widget_spec.rb +1 -122
  64. data/spec/pulse_meter/visualize/dsl/widgets/area_spec.rb +44 -0
  65. data/spec/pulse_meter/visualize/dsl/widgets/gauge_spec.rb +22 -0
  66. data/spec/pulse_meter/visualize/dsl/widgets/line_spec.rb +44 -0
  67. data/spec/pulse_meter/visualize/dsl/widgets/pie_spec.rb +35 -0
  68. data/spec/pulse_meter/visualize/dsl/widgets/table_spec.rb +36 -0
  69. data/spec/pulse_meter/visualize/layout_spec.rb +3 -3
  70. data/spec/pulse_meter/visualize/page_spec.rb +2 -2
  71. data/spec/pulse_meter/visualize/sensor_spec.rb +4 -4
  72. data/spec/pulse_meter/visualize/series_extractor_spec.rb +3 -3
  73. data/spec/pulse_meter/visualize/widgets/area_spec.rb +78 -0
  74. data/spec/pulse_meter/visualize/widgets/gauge_spec.rb +63 -0
  75. data/spec/pulse_meter/visualize/widgets/line_spec.rb +77 -0
  76. data/spec/pulse_meter/visualize/widgets/pie_spec.rb +73 -0
  77. data/spec/pulse_meter/visualize/widgets/table_spec.rb +78 -0
  78. data/spec/shared_examples/dsl_widget.rb +106 -0
  79. data/spec/shared_examples/timeline_sensor.rb +32 -2
  80. metadata +75 -6
  81. data/lib/pulse-meter/visualize/dsl.rb +0 -0
  82. data/spec/pulse_meter/visualize/widget_spec.rb +0 -122
@@ -1,57 +1,31 @@
1
1
  module PulseMeter
2
2
  module Visualize
3
3
  module DSL
4
- WIDGETS = %w(pie line area table)
5
- DEFAULT_GCHART_OPTIONS = {}
4
+ class Page < Base
5
+ self.data_class = PulseMeter::Visualize::Page
6
6
 
7
- class Page
8
- def initialize(title = nil)
9
- @title = title || ""
10
- @widgets = []
11
- @gchart_options = DEFAULT_GCHART_OPTIONS.dup
7
+ def initialize(title = '')
8
+ super()
9
+ self.title(title)
12
10
  end
13
11
 
14
- def widget(type, title = '', widget_args = nil, &block)
15
- w = PulseMeter::Visualize::DSL::Widget.new(type, title)
16
- w.process_args(widget_args) if widget_args
17
- yield(w) if block_given?
18
- @widgets << w
19
- end
12
+ string_setter :title
20
13
 
21
- WIDGETS.each do |wtype|
22
- class_eval <<-EVAL
23
- def #{wtype}(title = '', args = nil, &block)
24
- widget(:#{wtype}, title, args, &block)
25
- end
26
- EVAL
27
- end
14
+ dsl_array_extender :widgets, :area, PulseMeter::Visualize::DSL::Widgets::Area
15
+ dsl_array_extender :widgets, :line, PulseMeter::Visualize::DSL::Widgets::Line
16
+ dsl_array_extender :widgets, :pie, PulseMeter::Visualize::DSL::Widgets::Pie
17
+ dsl_array_extender :widgets, :table, PulseMeter::Visualize::DSL::Widgets::Table
18
+ dsl_array_extender :widgets, :gauge, PulseMeter::Visualize::DSL::Widgets::Gauge
28
19
 
29
- def spline(*args, &block)
30
- STDERR.puts "DEPRECATION: spline widget is no longer available. Using `line' as a fallback."
31
- line(*args, &block)
32
- end
20
+ hash_extender :gchart_options
33
21
 
34
- def title(new_title)
35
- @title = new_title || ''
22
+ def spline(*args)
23
+ STDERR.puts "DEPRECATION: spline widget is no longer available."
36
24
  end
37
25
 
38
- def highchart_options(_)
26
+ def highchart_options(*args)
39
27
  STDERR.puts "DEPRECATION: highchart_options DSL helper does not take effect anymore, use gchart_options instead"
40
28
  end
41
-
42
- def gchart_options(options = {})
43
- @gchart_options.merge!(options)
44
- end
45
-
46
- def to_page
47
- args = {
48
- title: @title,
49
- widgets: @widgets.map(&:to_widget),
50
- gchart_options: @gchart_options
51
- }
52
- PulseMeter::Visualize::Page.new(args)
53
- end
54
-
55
29
  end
56
30
  end
57
31
  end
@@ -1,18 +1,17 @@
1
1
  module PulseMeter
2
2
  module Visualize
3
- module DSL
4
- class Sensor
5
- def initialize(name)
6
- @args = {:sensor => name}
7
- end
3
+ module DSL
4
+ class Sensor < Base
8
5
 
9
- def process_args(args)
10
- @args.merge!(args)
11
- end
6
+ self.data_class = PulseMeter::Visualize::Sensor
12
7
 
13
- def to_sensor
14
- PulseMeter::Visualize::Sensor.new(@args)
8
+ def initialize(name)
9
+ super()
10
+ self.name(name)
15
11
  end
12
+
13
+ string_setter :color
14
+ string_setter :name
16
15
  end
17
16
  end
18
17
  end
@@ -1,82 +1,35 @@
1
1
  module PulseMeter
2
2
  module Visualize
3
3
  module DSL
4
- class Widget
5
- include PulseMeter::Mixins::Utils
4
+ class Widget < Base
5
+ MAX_WIDTH = 10
6
6
 
7
- DEFAULT_WIDTH = 10
8
- DEFAULT_TIMESPAN = 60 * 60 * 24 # One day
7
+ self.data_class = PulseMeter::Visualize::Widget
9
8
 
10
- def initialize(type, title = '')
11
- raise BadWidgetType, type if type.to_s.empty?
12
- @type = type
13
- @title = title.to_s || ''
14
- @values_label = ''
15
- @width = DEFAULT_WIDTH
16
- @sensors = []
17
- @show_last_point = false
18
- @redraw_interval = nil
19
- @timespan = DEFAULT_TIMESPAN
9
+ def initialize(title)
10
+ super()
11
+ self.title(title)
12
+ self.width(MAX_WIDTH)
20
13
  end
21
14
 
22
- def process_args(args)
23
- [:sensor, :title, :width, :values_label, :show_last_point, :redraw_interval, :timespan].each do |arg|
24
- if args.has_key?(arg)
25
- send(arg, args[arg])
26
- end
27
- end
28
- end
29
-
30
- def redraw_interval(new_redraw_interval)
31
- new_redraw_interval = new_redraw_interval.to_i
32
- raise BadWidgetRedrawInterval, new_redraw_interval unless new_redraw_interval > 0
33
- @redraw_interval = new_redraw_interval
34
- end
35
-
36
- def show_last_point(new_show_last_point)
37
- @show_last_point = !!new_show_last_point
38
- end
15
+ hash_extender :gchart_options
16
+
17
+ string_setter :title
39
18
 
40
- def timespan(new_timespan)
41
- new_timespan = new_timespan.to_i
42
- raise BadWidgetTimeSpan, new_timespan unless new_timespan > 0
43
- @timespan = new_timespan
19
+ int_setter :redraw_interval do |int|
20
+ raise BadWidgetRedrawInterval, int unless int > 0
44
21
  end
45
-
46
- def values_label(new_label)
47
- @values_label = new_label.to_s
22
+
23
+ int_setter :width do |w|
24
+ raise BadWidgetWidth, w unless w > 0 && w <= MAX_WIDTH
48
25
  end
49
26
 
50
- def title(new_title)
51
- @title = new_title.to_s || ''
52
- end
27
+ dsl_array_extender :sensors, :sensor, PulseMeter::Visualize::DSL::Sensor
53
28
 
54
- def width(new_width)
55
- raise BadWidgetWidth, new_width unless new_width.respond_to?(:to_i)
56
- w = new_width.to_i
57
- raise BadWidgetWidth, new_width unless w > 0 && w <= 10
58
- @width = new_width.to_i
29
+ def method_missing(name, value)
30
+ gchart_options(name => value)
59
31
  end
60
32
 
61
- def sensor(name, sensor_args = nil)
62
- s = PulseMeter::Visualize::DSL::Sensor.new(name)
63
- s.process_args(sensor_args) if sensor_args
64
- @sensors << s
65
- end
66
-
67
- def to_widget
68
- args = {
69
- title: @title,
70
- type: @type,
71
- values_label: @values_label,
72
- width: @width,
73
- sensors: @sensors.map(&:to_sensor),
74
- redraw_interval: @redraw_interval,
75
- show_last_point: @show_last_point,
76
- timespan: @timespan
77
- }
78
- PulseMeter::Visualize::Widget.new(args)
79
- end
80
33
  end
81
34
  end
82
35
  end
@@ -0,0 +1,95 @@
1
+ module PulseMeter
2
+ module Visualize
3
+ module DSL
4
+ class Widget
5
+ include PulseMeter::Mixins::Utils
6
+
7
+ DEFAULT_WIDTH = 10
8
+ DEFAULT_TIMESPAN = 60 * 60 * 24 # One day
9
+ DEFAULT_GCHART_OPTIONS = {}
10
+
11
+ def initialize(type, title = '')
12
+ raise BadWidgetType, type if type.to_s.empty?
13
+ @type = type
14
+ @title = title.to_s || ''
15
+ @values_label = ''
16
+ @width = DEFAULT_WIDTH
17
+ @sensors = []
18
+ @show_last_point = false
19
+ @redraw_interval = nil
20
+ @timespan = DEFAULT_TIMESPAN
21
+ @gchart_options = DEFAULT_GCHART_OPTIONS.dup
22
+ end
23
+
24
+ def process_args(args)
25
+ [:sensor, :title, :width, :values_label, :show_last_point, :redraw_interval, :timespan].each do |arg|
26
+ if args.has_key?(arg)
27
+ send(arg, args[arg])
28
+ end
29
+ end
30
+ end
31
+
32
+ def redraw_interval(new_redraw_interval)
33
+ new_redraw_interval = new_redraw_interval.to_i
34
+ raise BadWidgetRedrawInterval, new_redraw_interval unless new_redraw_interval > 0
35
+ @redraw_interval = new_redraw_interval
36
+ end
37
+
38
+ def show_last_point(new_show_last_point)
39
+ @show_last_point = !!new_show_last_point
40
+ end
41
+
42
+ def timespan(new_timespan)
43
+ new_timespan = new_timespan.to_i
44
+ raise BadWidgetTimeSpan, new_timespan unless new_timespan > 0
45
+ @timespan = new_timespan
46
+ end
47
+
48
+ def values_label(new_label)
49
+ @values_label = new_label.to_s
50
+ end
51
+
52
+ def title(new_title)
53
+ @title = new_title.to_s || ''
54
+ end
55
+
56
+ def width(new_width)
57
+ raise BadWidgetWidth, new_width unless new_width.respond_to?(:to_i)
58
+ w = new_width.to_i
59
+ raise BadWidgetWidth, new_width unless w > 0 && w <= 10
60
+ @width = new_width.to_i
61
+ end
62
+
63
+ def gchart_options(options = {})
64
+ @gchart_options.merge!(options)
65
+ end
66
+
67
+ def sensor(name, sensor_args = nil)
68
+ s = PulseMeter::Visualize::DSL::Sensor.new(name)
69
+ s.process_args(sensor_args) if sensor_args
70
+ @sensors << s
71
+ end
72
+
73
+ def method_missing(name, value)
74
+ @gchart_options[name] = value
75
+ end
76
+
77
+ def to_widget
78
+ args = {
79
+ title: @title,
80
+ type: @type,
81
+ values_label: @values_label,
82
+ width: @width,
83
+ sensors: @sensors.map(&:to_sensor),
84
+ redraw_interval: @redraw_interval,
85
+ show_last_point: @show_last_point,
86
+ timespan: @timespan,
87
+ gchart_options: @gchart_options
88
+ }
89
+ PulseMeter::Visualize::Widget.new(args)
90
+ end
91
+ end
92
+ end
93
+ end
94
+ end
95
+
@@ -0,0 +1,20 @@
1
+ module PulseMeter
2
+ module Visualize
3
+ module DSL
4
+ module Widgets
5
+ class Area < PulseMeter::Visualize::DSL::Widget
6
+ self.data_class = PulseMeter::Visualize::Widgets::Area
7
+
8
+ string_setter :values_label
9
+ bool_setter :show_last_point
10
+
11
+ int_setter :timespan do |ts|
12
+ raise BadWidgetTimeSpan, ts unless ts > 0
13
+ end
14
+
15
+ end
16
+ end
17
+ end
18
+ end
19
+ end
20
+
@@ -0,0 +1,12 @@
1
+ module PulseMeter
2
+ module Visualize
3
+ module DSL
4
+ module Widgets
5
+ class Gauge < PulseMeter::Visualize::DSL::Widget
6
+ self.data_class = PulseMeter::Visualize::Widgets::Gauge
7
+ end
8
+ end
9
+ end
10
+ end
11
+ end
12
+
@@ -0,0 +1,21 @@
1
+ module PulseMeter
2
+ module Visualize
3
+ module DSL
4
+ module Widgets
5
+ class Line < PulseMeter::Visualize::DSL::Widget
6
+ self.data_class = PulseMeter::Visualize::Widgets::Line
7
+
8
+ string_setter :values_label
9
+ bool_setter :show_last_point
10
+
11
+ int_setter :timespan do |ts|
12
+ raise BadWidgetTimeSpan, ts unless ts > 0
13
+ end
14
+
15
+ end
16
+ end
17
+ end
18
+ end
19
+ end
20
+
21
+
@@ -0,0 +1,16 @@
1
+ module PulseMeter
2
+ module Visualize
3
+ module DSL
4
+ module Widgets
5
+ class Pie < PulseMeter::Visualize::DSL::Widget
6
+ self.data_class = PulseMeter::Visualize::Widgets::Pie
7
+
8
+ string_setter :values_label
9
+ bool_setter :show_last_point
10
+
11
+ end
12
+ end
13
+ end
14
+ end
15
+ end
16
+
@@ -0,0 +1,19 @@
1
+ module PulseMeter
2
+ module Visualize
3
+ module DSL
4
+ module Widgets
5
+ class Table < PulseMeter::Visualize::DSL::Widget
6
+ self.data_class = PulseMeter::Visualize::Widgets::Table
7
+
8
+ bool_setter :show_last_point
9
+
10
+ int_setter :timespan do |ts|
11
+ raise BadWidgetTimeSpan, ts unless ts > 0
12
+ end
13
+
14
+ end
15
+ end
16
+ end
17
+ end
18
+ end
19
+
@@ -1,18 +1,10 @@
1
1
  module PulseMeter
2
2
  module Visualize
3
- class Layout
4
- attr_reader :pages
5
-
6
- attr_reader :title
7
- attr_reader :use_utc
8
- attr_reader :gchart_options
9
-
10
- def initialize(args)
11
- raise ArgumentError unless args.respond_to?('[]')
12
- @title = args[:title] or raise ArgumentError, ":title not specified"
13
- @pages = args[:pages] or raise ArgumentError, ":pages not specified"
14
- @use_utc = args[:use_utc]
15
- @gchart_options = args[:gchart_options]
3
+ class Layout < Base
4
+ def initialize(opts)
5
+ super
6
+ @opts[:pages] ||= []
7
+ @opts[:gchart_options] ||= {}
16
8
  end
17
9
 
18
10
  def to_app
@@ -33,8 +25,8 @@ module PulseMeter
33
25
 
34
26
  def options
35
27
  {
36
- use_utc: @use_utc,
37
- gchart_options: @gchart_options
28
+ use_utc: use_utc,
29
+ gchart_options: gchart_options
38
30
  }
39
31
  end
40
32
 
@@ -45,7 +37,6 @@ module PulseMeter
45
37
  def widgets(page_id)
46
38
  pages[page_id].widget_datas
47
39
  end
48
-
49
40
  end
50
41
  end
51
42
  end
@@ -1,15 +1,10 @@
1
1
  module PulseMeter
2
2
  module Visualize
3
- class Page
4
- attr_reader :widgets
5
- attr_reader :title
6
- attr_reader :gchart_options
7
-
8
- def initialize(args)
9
- raise ArgumentError unless args.respond_to?('[]')
10
- @title = args[:title] or raise ArgumentError, ":title not specified"
11
- @widgets = args[:widgets] or raise ArgumentError, ":widgets not specified"
12
- @gchart_options = args[:gchart_options] or raise ArgumentError, ":gchart_options not specified"
3
+ class Page < Base
4
+ def initialize(opts)
5
+ super
6
+ @opts[:widgets] ||= []
7
+ @opts[:gchart_options] ||= {}
13
8
  end
14
9
 
15
10
  def widget_data(widget_id, opts = {})