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 +4 -4
- data/elected.gemspec +1 -0
- data/lib/elected.rb +2 -0
- data/lib/elected/core_ext.rb +46 -0
- data/lib/elected/senado.rb +22 -7
- data/lib/elected/stats.rb +46 -0
- data/lib/elected/version.rb +1 -1
- metadata +18 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: e44506af127e794e43d83b9b84725d455da6d66a
|
4
|
+
data.tar.gz: 456a3e9970c362014b05bd10abefcf8d48142840
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 3089d6d14ca943641136c04e313bfaf2e5404211fd847670313c3c57efd80379678d07299303d5407e9a17b44191093ad87d477fd9f13c93f73c6191b5b283da
|
7
|
+
data.tar.gz: f27b522321802aa0fe9568d751e923d626c8622bdc47fe8debca93615d1993e6505a26050ed06951f8b86327b43f3d396d3bb1ef2a09e43b5a706de2e51ac334
|
data/elected.gemspec
CHANGED
data/lib/elected.rb
CHANGED
@@ -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
|
data/lib/elected/senado.rb
CHANGED
@@ -5,10 +5,13 @@ module Elected
|
|
5
5
|
|
6
6
|
include Logging
|
7
7
|
|
8
|
-
|
8
|
+
attr_writer :key, :timeout
|
9
|
+
attr_reader :stats
|
9
10
|
|
10
11
|
def initialize(key = nil, timeout = nil)
|
11
|
-
@key
|
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
|
-
|
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
|
-
|
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
|
-
|
60
|
-
|
61
|
-
|
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
|
data/lib/elected/version.rb
CHANGED
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.
|
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-
|
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:
|