elected 0.2.1 → 0.2.2

Sign up to get free protection for your applications and to get access to all the features.
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: