pulse-meter 0.1.7 → 0.1.8

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.
@@ -4,46 +4,63 @@ require "pulse-meter"
4
4
 
5
5
  PulseMeter.redis = Redis.new
6
6
 
7
- lama_counter = PulseMeter::Sensor::Timelined::Counter.new(:lama_count,
8
- annotation: 'Lama Count',
9
- interval: 10,
10
- ttl: 3600
11
- )
7
+ cfg = PulseMeter::Sensor::Configuration.new(
8
+ lama_count: {
9
+ type: 'timelined/counter',
10
+ args: {
11
+ annotation: 'Lama Count',
12
+ interval: 10,
13
+ ttl: 3600
14
+ }
15
+ },
12
16
 
13
- lama_average_age = PulseMeter::Sensor::Timelined::Average.new(:lama_average_age,
14
- annotation: 'Lama Average Age',
15
- interval: 20,
16
- ttl: 3600
17
- )
17
+ lama_average_age: {
18
+ type: 'timelined/average',
19
+ args: {
20
+ annotation: 'Lama Average Age',
21
+ interval: 20,
22
+ ttl: 3600
23
+ }
24
+ },
18
25
 
19
- rhino_counter = PulseMeter::Sensor::Timelined::Counter.new(:rhino_count,
20
- annotation: 'Rhino Count',
21
- interval: 10,
22
- ttl: 3600
23
- )
26
+ rhino_count: {
27
+ type: 'timelined/counter',
28
+ args: {
29
+ annotation: 'Rhino Count',
30
+ interval: 10,
31
+ ttl: 3600
32
+ }
33
+ },
24
34
 
25
- goose_counter = PulseMeter::Sensor::Timelined::HashedCounter.new(:goose_count,
26
- annotation: 'Goose Count',
27
- interval: 10,
28
- ttl: 3600
29
- )
35
+ goose_count: {
36
+ type: 'timelined/hashed_counter',
37
+ args: {
38
+ annotation: 'Goose Count',
39
+ interval: 10,
40
+ ttl: 3600
41
+ }
42
+ },
30
43
 
31
- rhino_average_age = PulseMeter::Sensor::Timelined::Average.new(:rhino_average_age,
32
- annotation: 'Rhino average age',
33
- interval: 20,
34
- ttl: 3600
44
+ rhino_average_age: {
45
+ type: 'timelined/average',
46
+ args: {
47
+ annotation: 'Rhino average age',
48
+ interval: 20,
49
+ ttl: 3600
50
+ }
51
+ }
35
52
  )
36
53
 
37
54
  while true
38
55
  sleep(Random.rand)
39
56
  STDERR.puts "tick"
40
- lama_counter.event(1)
41
- rhino_counter.event(2)
42
- lama_average_age.event(Random.rand(50))
43
- rhino_average_age.event(Random.rand(100))
57
+ cfg.lama_count(1)
58
+ cfg.rhino_count(2)
59
+ cfg.lama_average_age(Random.rand(50))
60
+ cfg.rhino_average_age(Random.rand(100))
44
61
 
45
62
  10.times do
46
63
  goose_n = Random.rand(4)
47
- goose_counter.event("goose_#{goose_n}" => 1)
64
+ cfg.goose_count("goose_#{goose_n}" => 1)
48
65
  end
49
66
  end
data/lib/pulse-meter.rb CHANGED
@@ -3,6 +3,7 @@ require "pulse-meter/version"
3
3
  require "pulse-meter/mixins/dumper"
4
4
  require "pulse-meter/mixins/utils"
5
5
  require "pulse-meter/sensor"
6
+ require "pulse-meter/sensor/configuration"
6
7
 
7
8
  module PulseMeter
8
9
  @@redis = nil
@@ -75,6 +75,18 @@ module PulseMeter
75
75
  (first_letter_upper ? first.capitalize : first.downcase) + terms.map(&:capitalize).join
76
76
  end
77
77
 
78
+ # Symbolizes hash keys
79
+ def symbolize_keys(h)
80
+ h.each_with_object({}) do |(k, v), acc|
81
+ new_k = if k.respond_to?(:to_sym)
82
+ k.to_sym
83
+ else
84
+ k
85
+ end
86
+ acc[new_k] = v
87
+ end
88
+ end
89
+
78
90
  # Deeply capitalizes Array values or Hash keys
79
91
  def camelize_keys(item)
80
92
  case item
@@ -0,0 +1,47 @@
1
+ module PulseMeter
2
+ module Sensor
3
+ class Configuration
4
+ include PulseMeter::Mixins::Utils
5
+
6
+ def initialize(opts = {})
7
+ @sensors = {}
8
+ opts.each do |name, opts|
9
+ add_sensor(name, opts)
10
+ end
11
+ end
12
+
13
+ def add_sensor(name, opts)
14
+ type = opts.respond_to?(:type) ? opts.type : opts[:type]
15
+ klass_s = sensor_class(type)
16
+ klass = constantize(klass_s)
17
+ raise ArgumentError, "#{klass_s} is not a valid class for a sensor" unless klass
18
+ args = (opts.respond_to?(:args) ? opts.args : opts[:args]) || {}
19
+ @sensors[name.to_s] = klass.new(name, symbolize_keys(args.to_hash))
20
+ end
21
+
22
+ def sensor(name)
23
+ @sensors[name.to_s]
24
+ end
25
+
26
+ def method_missing(name, *args)
27
+ name = name.to_s
28
+ if @sensors.has_key?(name)
29
+ @sensors[name].event(*args)
30
+ else
31
+ raise ArgumentError, "Unknown sensor: `#{name}'"
32
+ end
33
+ end
34
+
35
+ protected
36
+
37
+ def sensor_class(type)
38
+ entries = type.to_s.split('/').map do |entry|
39
+ entry.split('_').map(&:capitalize).join
40
+ end
41
+ entries.unshift('PulseMeter::Sensor').join('::')
42
+ end
43
+
44
+
45
+ end
46
+ end
47
+ end
@@ -1,3 +1,3 @@
1
1
  module PulseMeter
2
- VERSION = "0.1.7"
2
+ VERSION = "0.1.8"
3
3
  end
data/pulse-meter.gemspec CHANGED
@@ -28,6 +28,7 @@ Gem::Specification.new do |gem|
28
28
  gem.add_runtime_dependency('thor')
29
29
 
30
30
  gem.add_development_dependency('foreman')
31
+ gem.add_development_dependency('hashie')
31
32
  gem.add_development_dependency('mock_redis')
32
33
  gem.add_development_dependency('rack-test')
33
34
  gem.add_development_dependency('rake')
@@ -131,4 +131,11 @@ describe PulseMeter::Mixins::Utils do
131
131
  dummy.camelize_keys({ :aa_bb_cc => [ { :dd_ee => 123 }, 456 ] }).should =={ 'aaBbCc' => [ { 'ddEe' => 123 }, 456 ] }
132
132
  end
133
133
  end
134
+
135
+ describe "#symbolize_keys" do
136
+ it "should convert symbolizable keys to symbols" do
137
+ dummy.symbolize_keys({"a" => 5, 6 => 7}).should == {a: 5, 6 => 7}
138
+ end
139
+
140
+ end
134
141
  end
@@ -0,0 +1,83 @@
1
+ require "spec_helper"
2
+
3
+ describe PulseMeter::Sensor::Configuration do
4
+ describe "#add_sensor" do
5
+ let(:cfg) {described_class.new}
6
+
7
+ it "should create sensor available under passed name" do
8
+ cfg.sensor(:foo).should be_nil
9
+ cfg.add_sensor(:foo, type: 'counter')
10
+ cfg.sensor(:foo).should_not be_nil
11
+ end
12
+
13
+ it "should event shortcut for the sensor" do
14
+ cfg.add_sensor(:foo, type: 'counter')
15
+ sensor = cfg.sensor(:foo)
16
+ sensor.should_receive(:event).with(321)
17
+ cfg.foo(321)
18
+ end
19
+
20
+ it "should create sensor with correct type" do
21
+ cfg.add_sensor(:foo, type: 'counter')
22
+ cfg.sensor(:foo).should be_kind_of(PulseMeter::Sensor::Counter)
23
+ end
24
+
25
+ it "should raise exception if sensor type is bad" do
26
+ expect{ cfg.add_sensor(:foo, type: 'baaaar') }.to raise_exception(ArgumentError)
27
+ end
28
+
29
+ it "should pass args to created sensor" do
30
+ cfg.add_sensor(:foo, type: 'counter', args: {annotation: "My Foo Counter"} )
31
+ cfg.sensor(:foo).annotation.should == "My Foo Counter"
32
+ end
33
+
34
+ it "should accept hashie-objects" do
35
+ class Dummy
36
+ def type
37
+ 'counter'
38
+ end
39
+ def args
40
+ Hashie::Mash.new(annotation: "My Foo Counter")
41
+ end
42
+ end
43
+
44
+ cfg.add_sensor(:foo, Dummy.new)
45
+ cfg.sensor(:foo).annotation.should == "My Foo Counter"
46
+ end
47
+
48
+
49
+ end
50
+
51
+ describe ".new" do
52
+ it "should add passed sensor setting hash using keys as names" do
53
+ opts = {
54
+ cnt: {
55
+ type: 'counter'
56
+ },
57
+ ind: {
58
+ type: 'indicator'
59
+ }
60
+ }
61
+ cfg1 = described_class.new(opts)
62
+ cfg2 = described_class.new
63
+ opts.each{|k,v| cfg2.add_sensor(k, v)}
64
+ cfg1.to_yaml.should == cfg2.to_yaml
65
+ end
66
+ end
67
+
68
+ describe "#sensor" do
69
+ it "should give access to added sensors" do
70
+ opts = {
71
+ cnt: {
72
+ type: 'counter',
73
+ args: {
74
+ annotation: "MySensor"
75
+ }
76
+ },
77
+ }
78
+ cfg = described_class.new(opts)
79
+ cfg.sensor(:cnt).annotation.should == "MySensor"
80
+ cfg.sensor("cnt").annotation.should == "MySensor"
81
+ end
82
+ end
83
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: pulse-meter
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.7
4
+ version: 0.1.8
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -10,7 +10,7 @@ authors:
10
10
  autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2012-06-04 00:00:00.000000000 Z
13
+ date: 2012-06-05 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: gon-sinatra
@@ -140,6 +140,22 @@ dependencies:
140
140
  - - ! '>='
141
141
  - !ruby/object:Gem::Version
142
142
  version: '0'
143
+ - !ruby/object:Gem::Dependency
144
+ name: hashie
145
+ requirement: !ruby/object:Gem::Requirement
146
+ none: false
147
+ requirements:
148
+ - - ! '>='
149
+ - !ruby/object:Gem::Version
150
+ version: '0'
151
+ type: :development
152
+ prerelease: false
153
+ version_requirements: !ruby/object:Gem::Requirement
154
+ none: false
155
+ requirements:
156
+ - - ! '>='
157
+ - !ruby/object:Gem::Version
158
+ version: '0'
143
159
  - !ruby/object:Gem::Dependency
144
160
  name: mock_redis
145
161
  requirement: !ruby/object:Gem::Requirement
@@ -303,6 +319,7 @@ files:
303
319
  - lib/pulse-meter/mixins/utils.rb
304
320
  - lib/pulse-meter/sensor.rb
305
321
  - lib/pulse-meter/sensor/base.rb
322
+ - lib/pulse-meter/sensor/configuration.rb
306
323
  - lib/pulse-meter/sensor/counter.rb
307
324
  - lib/pulse-meter/sensor/hashed_counter.rb
308
325
  - lib/pulse-meter/sensor/indicator.rb
@@ -347,6 +364,7 @@ files:
347
364
  - spec/pulse_meter/mixins/dumper_spec.rb
348
365
  - spec/pulse_meter/mixins/utils_spec.rb
349
366
  - spec/pulse_meter/sensor/base_spec.rb
367
+ - spec/pulse_meter/sensor/configuration_spec.rb
350
368
  - spec/pulse_meter/sensor/counter_spec.rb
351
369
  - spec/pulse_meter/sensor/hashed_counter_spec.rb
352
370
  - spec/pulse_meter/sensor/indicator_spec.rb
@@ -403,6 +421,7 @@ test_files:
403
421
  - spec/pulse_meter/mixins/dumper_spec.rb
404
422
  - spec/pulse_meter/mixins/utils_spec.rb
405
423
  - spec/pulse_meter/sensor/base_spec.rb
424
+ - spec/pulse_meter/sensor/configuration_spec.rb
406
425
  - spec/pulse_meter/sensor/counter_spec.rb
407
426
  - spec/pulse_meter/sensor/hashed_counter_spec.rb
408
427
  - spec/pulse_meter/sensor/indicator_spec.rb