elected 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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: a5dc6e900af2721826b12eee64a192c8d99ad72c
4
- data.tar.gz: eee1b4827086be7717aab4378c91d9752928fc13
3
+ metadata.gz: e44506af127e794e43d83b9b84725d455da6d66a
4
+ data.tar.gz: 456a3e9970c362014b05bd10abefcf8d48142840
5
5
  SHA512:
6
- metadata.gz: 4148d59cee205f8cb33c9347eaa433efb3d1cbc74e9920936868e6b9379ea4ddc5acb1957eafeb73341e7089a786c2e2c73187fe9097ed81640e83935453568e
7
- data.tar.gz: 92f15065455697f2dc440e275973f7101943dc227f171415ba1e1172bf6b46837bd246d71567a9ea12838c0b42fb54630a99ad858de9babcaf17682a6a19f6b2
6
+ metadata.gz: 3089d6d14ca943641136c04e313bfaf2e5404211fd847670313c3c57efd80379678d07299303d5407e9a17b44191093ad87d477fd9f13c93f73c6191b5b283da
7
+ data.tar.gz: f27b522321802aa0fe9568d751e923d626c8622bdc47fe8debca93615d1993e6505a26050ed06951f8b86327b43f3d396d3bb1ef2a09e43b5a706de2e51ac334
data/elected.gemspec CHANGED
@@ -20,6 +20,7 @@ Gem::Specification.new do |spec|
20
20
  spec.require_paths = ['lib']
21
21
 
22
22
  spec.add_dependency 'redlock', '0.1.3'
23
+ spec.add_dependency 'concurrent-ruby', '1.0.0.pre4'
23
24
  spec.add_dependency 'pry'
24
25
 
25
26
  spec.add_development_dependency 'bundler', '~> 1.10'
data/lib/elected.rb CHANGED
@@ -33,6 +33,8 @@ module Elected
33
33
 
34
34
  end
35
35
 
36
+ require 'elected/core_ext'
36
37
  require 'elected/logging'
38
+ require 'elected/stats'
37
39
  require 'elected/lider'
38
40
  require 'elected/senado'
@@ -0,0 +1,46 @@
1
+ # Try taken from https://github.com/rails/rails/blob/master/activesupport/lib/active_support/core_ext/object/try.rb
2
+
3
+ class Object
4
+ # Return a list of methods defined locally for a particular object. Useful
5
+ # for seeing what it does whilst losing all the guff that's implemented
6
+ # by its parents (eg Object).
7
+ def local_methods(obj = self)
8
+ (obj.methods - obj.class.superclass.instance_methods).sort
9
+ end unless Object.respond_to?(:local_methods)
10
+
11
+ def try(*a, &b)
12
+ try!(*a, &b) if a.empty? || respond_to?(a.first)
13
+ end unless Object.respond_to?(:try)
14
+
15
+ def try!(*a, &b)
16
+ if a.empty? && block_given?
17
+ if b.arity.zero?
18
+ instance_eval(&b)
19
+ else
20
+ yield self
21
+ end
22
+ else
23
+ public_send(*a, &b)
24
+ end
25
+ end unless Object.respond_to?(:try!)
26
+ end
27
+
28
+ class NilClass
29
+ def try(*args)
30
+ nil
31
+ end unless NilClass.respond_to?(:try)
32
+
33
+ def try!(*args)
34
+ nil
35
+ end unless NilClass.respond_to?(:try!)
36
+ end
37
+
38
+ class String
39
+ def underscore
40
+ self.gsub(/::/, '/').
41
+ gsub(/([A-Z]+)([A-Z][a-z])/, '\1_\2').
42
+ gsub(/([a-z\d])([A-Z])/, '\1_\2').
43
+ tr('-', '_').
44
+ downcase
45
+ end unless ''.respond_to?(:underscore)
46
+ end
@@ -5,10 +5,13 @@ module Elected
5
5
 
6
6
  include Logging
7
7
 
8
- attr_accessor :key, :timeout
8
+ attr_writer :key, :timeout
9
+ attr_reader :stats
9
10
 
10
11
  def initialize(key = nil, timeout = nil)
11
- @key, @timeout = key, timeout
12
+ @key = key
13
+ @timeout = timeout
14
+ @stats = Stats.new :elected, :rejected, :missing, :released
12
15
  end
13
16
 
14
17
  def key
@@ -31,7 +34,11 @@ module Elected
31
34
  def release
32
35
  return false unless @leader
33
36
 
34
- Elected.electorado.unlock @leader.info if @leader.current?
37
+ if @leader.current?
38
+ Elected.electorado.unlock @leader.info
39
+ @stats.increment :released
40
+ end
41
+
35
42
  @leader = false
36
43
  end
37
44
 
@@ -48,7 +55,11 @@ module Elected
48
55
  end
49
56
 
50
57
  def get_leader
51
- return false unless @leader
58
+ unless @leader
59
+ @stats.increment :missing
60
+ return false
61
+ end
62
+
52
63
  return @leader if @leader.current?
53
64
 
54
65
  release
@@ -56,9 +67,13 @@ module Elected
56
67
 
57
68
  def set_leader
58
69
  found = Elected.electorado.lock key, timeout
59
- return false unless found
60
-
61
- @leader = Lider.new found, timeout
70
+ if found
71
+ @stats.increment :elected
72
+ @leader = Lider.new found, timeout
73
+ else
74
+ @stats.increment :rejected
75
+ false
76
+ end
62
77
  end
63
78
 
64
79
  end
@@ -0,0 +1,46 @@
1
+ require 'concurrent'
2
+ require 'concurrent/thread_safe/util/adder'
3
+
4
+ module Elected
5
+ class Stats
6
+
7
+ attr_reader :counters
8
+
9
+ def initialize(*names)
10
+ @counters = Concurrent::Hash.new
11
+ names.map { |x| get_or_set_counter x }
12
+ end
13
+
14
+ def count(name)
15
+ get_or_set_counter(name).sum
16
+ end
17
+
18
+ def increment(name, value = 1)
19
+ get_or_set_counter(name).add value
20
+ count name
21
+ end
22
+
23
+ def to_hash
24
+ @counters.keys.sort.each_with_object({}) { |k, h| h[k] = count k }
25
+ end
26
+
27
+ def to_s
28
+ %{#<#{self.class.name} #{to_hash.map { |k, v| "#{k}=#{v}" }.join(' ')}>}
29
+ end
30
+
31
+ alias :inspect :to_s
32
+
33
+ private
34
+
35
+ def get_or_set_counter(name, initial_value = 0)
36
+ safe_name = name.to_s.strip.underscore.to_sym
37
+ found = @counters[safe_name]
38
+ return found if found
39
+
40
+ @counters[safe_name] = Concurrent::ThreadSafe::Util::Adder.new.tap do |c|
41
+ c.add(initial_value) unless initial_value == 0
42
+ end
43
+ end
44
+
45
+ end
46
+ end
@@ -1,3 +1,3 @@
1
1
  module Elected
2
- VERSION = '0.2.1'
2
+ VERSION = '0.2.2'
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: elected
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.1
4
+ version: 0.2.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Adrian Madrid
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2015-10-30 00:00:00.000000000 Z
11
+ date: 2015-11-02 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: redlock
@@ -24,6 +24,20 @@ dependencies:
24
24
  - - '='
25
25
  - !ruby/object:Gem::Version
26
26
  version: 0.1.3
27
+ - !ruby/object:Gem::Dependency
28
+ name: concurrent-ruby
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - '='
32
+ - !ruby/object:Gem::Version
33
+ version: 1.0.0.pre4
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - '='
39
+ - !ruby/object:Gem::Version
40
+ version: 1.0.0.pre4
27
41
  - !ruby/object:Gem::Dependency
28
42
  name: pry
29
43
  requirement: !ruby/object:Gem::Requirement
@@ -113,9 +127,11 @@ files:
113
127
  - bin/setup
114
128
  - elected.gemspec
115
129
  - lib/elected.rb
130
+ - lib/elected/core_ext.rb
116
131
  - lib/elected/lider.rb
117
132
  - lib/elected/logging.rb
118
133
  - lib/elected/senado.rb
134
+ - lib/elected/stats.rb
119
135
  - lib/elected/version.rb
120
136
  homepage: https://github.com/simple-finance/elected
121
137
  licenses: