pulse-meter 0.2.1 → 0.2.2

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 (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 = {})