eventr 0.1.0 → 0.2.5
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 +7 -0
- data/.rubocop.yml +67 -0
- data/lib/eventr.rb +6 -3
- data/lib/eventr/actors.rb +37 -21
- data/lib/eventr/coordinator.rb +27 -11
- data/lib/eventr/errors.rb +4 -3
- data/lib/eventr/version.rb +1 -1
- metadata +15 -23
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 30f604978c9fe74a9839039595bfe5a2b78565c5
|
4
|
+
data.tar.gz: 9acc64eab183b11feecb1255e2553ba4f4a44ef9
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: c4730cf4133c2c091859a13cffde0819cdd7648acb32962ab01e02fa09ad7031098f1e809254d98c3dd49c15e812a87bf9dfc81e19e5ae02731185b07fb2f6bd
|
7
|
+
data.tar.gz: 8f36a3634be23fd82ea2d2698bbeaf864808f4299b79ddbc874ad01edd562da891012f20260ebcb734575ad05b1f03fdb8ebe69dfaff86cbca441ceea889cbd8
|
data/.rubocop.yml
ADDED
@@ -0,0 +1,67 @@
|
|
1
|
+
AllCops:
|
2
|
+
Includes:
|
3
|
+
- Rakefile
|
4
|
+
Excludes:
|
5
|
+
- test.rb
|
6
|
+
- bin/**
|
7
|
+
|
8
|
+
|
9
|
+
SpecialGlobalVars:
|
10
|
+
Enabled: false
|
11
|
+
|
12
|
+
PerlBackrefs:
|
13
|
+
Enabled: false
|
14
|
+
|
15
|
+
Documentation:
|
16
|
+
Enabled: false
|
17
|
+
|
18
|
+
BlockComments:
|
19
|
+
Enabled: false
|
20
|
+
|
21
|
+
Encoding:
|
22
|
+
Enabled: false
|
23
|
+
|
24
|
+
RegexpLiteral:
|
25
|
+
Enabled: false
|
26
|
+
|
27
|
+
# dots at the end of lines are okay
|
28
|
+
DotPosition:
|
29
|
+
Enabled: false
|
30
|
+
|
31
|
+
MethodLength:
|
32
|
+
CountComments: false
|
33
|
+
Max: 15
|
34
|
+
|
35
|
+
ParameterLists:
|
36
|
+
Max: 5
|
37
|
+
CountKeywordArgs: true
|
38
|
+
|
39
|
+
BlockNesting:
|
40
|
+
Max: 4
|
41
|
+
|
42
|
+
CollectionMethods:
|
43
|
+
PreferredMethods:
|
44
|
+
map: 'collect'
|
45
|
+
map!: 'collect!'
|
46
|
+
reduce: 'inject'
|
47
|
+
detect: 'find'
|
48
|
+
find_all: 'select'
|
49
|
+
|
50
|
+
CaseIndentation:
|
51
|
+
IndentWhenRelativeTo: end
|
52
|
+
IndentOneStep: true
|
53
|
+
|
54
|
+
LineLength:
|
55
|
+
Enabled: false
|
56
|
+
|
57
|
+
# Personally, I prefer to outdent public/protected/private, as it makes
|
58
|
+
# it easier to see the different sections of code.
|
59
|
+
AccessModifierIndentation:
|
60
|
+
EnforcedStyle: outdent
|
61
|
+
|
62
|
+
EmptyLinesAroundAccessModifier:
|
63
|
+
Enabled: true
|
64
|
+
|
65
|
+
EndAlignment:
|
66
|
+
AlignWith: variable
|
67
|
+
|
data/lib/eventr.rb
CHANGED
@@ -16,9 +16,12 @@ with this program; if not, write to the Free Software Foundation, Inc.,
|
|
16
16
|
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
17
17
|
=end
|
18
18
|
|
19
|
-
require
|
20
|
-
require 'eventr/errors'
|
19
|
+
require 'eventr/version'
|
21
20
|
|
22
21
|
module Eventr
|
23
|
-
autoload :
|
22
|
+
autoload :Consumer, 'eventr/actors'
|
23
|
+
autoload :Publisher, 'eventr/actors'
|
24
|
+
autoload :SupervisedObject, 'eventr/actors'
|
25
|
+
autoload :Coordinator, 'eventr/coordinator'
|
26
|
+
autoload :Error, 'eventr/errors'
|
24
27
|
end
|
data/lib/eventr/actors.rb
CHANGED
@@ -21,6 +21,8 @@ require 'monitor'
|
|
21
21
|
|
22
22
|
module Eventr
|
23
23
|
class SupervisedObject
|
24
|
+
attr_reader :on_exception
|
25
|
+
|
24
26
|
def stop
|
25
27
|
threads.values.each { |t| t.send :kill }
|
26
28
|
end
|
@@ -30,27 +32,31 @@ module Eventr
|
|
30
32
|
start_supervisor_thread
|
31
33
|
end
|
32
34
|
|
33
|
-
def threads
|
34
|
-
|
35
|
-
|
35
|
+
def threads
|
36
|
+
@threads ||= {}
|
37
|
+
end
|
36
38
|
|
37
|
-
def
|
38
|
-
|
39
|
+
def application
|
40
|
+
threads[:application]
|
39
41
|
end
|
40
42
|
|
41
|
-
def
|
43
|
+
def supervisor
|
44
|
+
threads[:supervisor]
|
45
|
+
end
|
46
|
+
|
47
|
+
def on_exception=(&block) # rubocop:disable TrivialAccessors
|
42
48
|
@on_exception = block
|
43
49
|
end
|
44
50
|
|
45
51
|
def sleep_time_from_backoff
|
46
52
|
backoff = Thread.current[:backoff] || 0
|
47
|
-
(0..backoff).inject([1,0]) { |(a,b), _| [b, a+b] }[0]
|
53
|
+
(0..backoff).inject([1, 0]) { |(a, b), _| [b, a + b] }[0]
|
48
54
|
end
|
49
55
|
|
50
56
|
def start_application_thread
|
51
|
-
threads[:application] ||= Thread.new
|
57
|
+
threads[:application] ||= Thread.new do
|
52
58
|
begin
|
53
|
-
main
|
59
|
+
main
|
54
60
|
rescue StandardError => e
|
55
61
|
on_exception.call(e) if on_exception.respond_to? :call
|
56
62
|
warn "#{e.class.name}: #{e.message}\n\t#{e.backtrace.join("\n\t")}"
|
@@ -58,17 +64,17 @@ module Eventr
|
|
58
64
|
ensure
|
59
65
|
threads[:supervisor].wakeup # wakeup the supervisor to help us recover
|
60
66
|
end
|
61
|
-
|
67
|
+
end
|
62
68
|
end
|
63
69
|
|
64
|
-
def start_supervisor_thread
|
65
|
-
threads[:supervisor] ||= Thread.new
|
70
|
+
def start_supervisor_thread # rubocop:disable MethodLength
|
71
|
+
threads[:supervisor] ||= Thread.new do
|
66
72
|
Thread.current[:backoff] = 1
|
67
73
|
|
68
74
|
begin
|
69
75
|
runs = 5
|
70
|
-
loop
|
71
|
-
unless
|
76
|
+
loop do
|
77
|
+
unless application && application.alive?
|
72
78
|
puts "#{self.class.name}::Supervisor: cleaning up app thread and restarting it."
|
73
79
|
threads[:application] = nil
|
74
80
|
start_application_thread
|
@@ -87,7 +93,7 @@ module Eventr
|
|
87
93
|
end
|
88
94
|
|
89
95
|
sleep 1
|
90
|
-
|
96
|
+
end
|
91
97
|
|
92
98
|
rescue StandardError => e
|
93
99
|
warn "#{e.class.name}: #{e.message}\n\t#{e.backtrace.join("\n\t")}"
|
@@ -101,11 +107,12 @@ module Eventr
|
|
101
107
|
end
|
102
108
|
|
103
109
|
# if the supervisor goes away, take the whole thing down.
|
104
|
-
|
110
|
+
error_msg = "supervisor went away due to: #{e.class.name}: #{e.message} -> #{e.backtrace.first}"
|
111
|
+
threads[:application].raise Error::SupervisorDown, error_msg
|
105
112
|
|
106
113
|
raise e
|
107
114
|
end
|
108
|
-
|
115
|
+
end
|
109
116
|
end
|
110
117
|
end
|
111
118
|
|
@@ -114,18 +121,28 @@ module Eventr
|
|
114
121
|
private :block, :events
|
115
122
|
|
116
123
|
def initialize(&block)
|
117
|
-
@block = block
|
124
|
+
@block = block || method(:default_loop)
|
118
125
|
@events = Queue.new
|
119
126
|
end
|
120
127
|
|
121
|
-
def pop(non_block=false)
|
128
|
+
def pop(non_block = false)
|
122
129
|
events.pop(non_block)
|
123
130
|
end
|
124
|
-
|
131
|
+
alias_method :shift, :pop
|
125
132
|
|
126
133
|
def main
|
127
134
|
block.call(events)
|
128
135
|
end
|
136
|
+
|
137
|
+
def push(event)
|
138
|
+
@events << event
|
139
|
+
end
|
140
|
+
alias_method :publish, :push
|
141
|
+
|
142
|
+
def default_loop(events)
|
143
|
+
loop { Thread.stop }
|
144
|
+
end
|
145
|
+
private :default_loop
|
129
146
|
end
|
130
147
|
|
131
148
|
class Consumer < SupervisedObject
|
@@ -141,5 +158,4 @@ module Eventr
|
|
141
158
|
loop { block.call(publisher.pop) }
|
142
159
|
end
|
143
160
|
end
|
144
|
-
|
145
161
|
end
|
data/lib/eventr/coordinator.rb
CHANGED
@@ -15,9 +15,7 @@ You should have received a copy of the GNU General Public License along
|
|
15
15
|
with this program; if not, write to the Free Software Foundation, Inc.,
|
16
16
|
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
17
17
|
=end
|
18
|
-
|
19
|
-
require 'eventr/errors'
|
20
|
-
require 'eventr/actors'
|
18
|
+
require 'singleton'
|
21
19
|
|
22
20
|
module Eventr
|
23
21
|
class Coordinator
|
@@ -31,30 +29,48 @@ module Eventr
|
|
31
29
|
end
|
32
30
|
|
33
31
|
def self.method_missing(method, *args, &block)
|
34
|
-
return super unless
|
32
|
+
return super unless instance.public_method.include? method
|
35
33
|
instance.public_send(method, *args, &block)
|
36
34
|
end
|
37
35
|
|
36
|
+
def publishers(*queues)
|
37
|
+
queues.each { |queue| publisher(queue) }
|
38
|
+
end
|
39
|
+
|
38
40
|
def publisher(queue_name, &block)
|
39
|
-
|
41
|
+
if @publishers.include? queue_name
|
42
|
+
fail Error::InvalidQueue, "publisher already defined for queue '#{queue_name}'"
|
43
|
+
end
|
40
44
|
@publishers[queue_name] = Publisher.new(&block)
|
41
45
|
end
|
42
46
|
|
47
|
+
def publish(queue_name, event)
|
48
|
+
unless @publishers.include? queue_name
|
49
|
+
fail Error::InvalidQueue, "Publisher #{queue_name.inspect} doesn't exist"
|
50
|
+
end
|
51
|
+
@publishers[queue_name].push(event)
|
52
|
+
end
|
53
|
+
|
43
54
|
def consumer(queue_name, &block)
|
44
|
-
|
55
|
+
unless @publishers.include? queue_name
|
56
|
+
fail Error::InvalidQueue, "#{queue_name} queue does not exist. Define a publisher for the queue first."
|
57
|
+
end
|
45
58
|
@consumers[queue_name] ||= []
|
46
59
|
@consumers[queue_name] << Consumer.new(@publishers[queue_name], &block)
|
47
60
|
end
|
48
61
|
|
49
|
-
def start
|
50
|
-
@publishers.each do |
|
51
|
-
|
52
|
-
@consumers[
|
62
|
+
def start # rubycop:disable
|
63
|
+
@publishers.each do |q, p|
|
64
|
+
p.start
|
65
|
+
@consumers[q].each { |c| c.start }
|
53
66
|
end
|
54
67
|
end
|
55
68
|
|
56
69
|
def stop
|
57
|
-
@publishers.each
|
70
|
+
@publishers.each do |q, p|
|
71
|
+
p.stop
|
72
|
+
@consumers[q].each { |c| c.stop }
|
73
|
+
end
|
58
74
|
end
|
59
75
|
end
|
60
76
|
end
|
data/lib/eventr/errors.rb
CHANGED
@@ -17,7 +17,8 @@ with this program; if not, write to the Free Software Foundation, Inc.,
|
|
17
17
|
=end
|
18
18
|
|
19
19
|
module Eventr
|
20
|
-
class Error < ::StandardError
|
21
|
-
|
22
|
-
|
20
|
+
class Error < ::StandardError
|
21
|
+
class InvalidQueue < Error; end
|
22
|
+
class SupervisorDown < Error; end
|
23
|
+
end
|
23
24
|
end
|
data/lib/eventr/version.rb
CHANGED
metadata
CHANGED
@@ -1,62 +1,55 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: eventr
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
5
|
-
prerelease:
|
4
|
+
version: 0.2.5
|
6
5
|
platform: ruby
|
7
6
|
authors:
|
8
7
|
- Carl P. Corliss
|
9
8
|
autorequire:
|
10
9
|
bindir: bin
|
11
10
|
cert_chain: []
|
12
|
-
date:
|
11
|
+
date: 2014-03-08 00:00:00.000000000 Z
|
13
12
|
dependencies:
|
14
13
|
- !ruby/object:Gem::Dependency
|
15
14
|
name: bundler
|
16
15
|
requirement: !ruby/object:Gem::Requirement
|
17
|
-
none: false
|
18
16
|
requirements:
|
19
|
-
- - ~>
|
17
|
+
- - "~>"
|
20
18
|
- !ruby/object:Gem::Version
|
21
19
|
version: '1.3'
|
22
20
|
type: :development
|
23
21
|
prerelease: false
|
24
22
|
version_requirements: !ruby/object:Gem::Requirement
|
25
|
-
none: false
|
26
23
|
requirements:
|
27
|
-
- - ~>
|
24
|
+
- - "~>"
|
28
25
|
- !ruby/object:Gem::Version
|
29
26
|
version: '1.3'
|
30
27
|
- !ruby/object:Gem::Dependency
|
31
28
|
name: rake
|
32
29
|
requirement: !ruby/object:Gem::Requirement
|
33
|
-
none: false
|
34
30
|
requirements:
|
35
|
-
- -
|
31
|
+
- - ">="
|
36
32
|
- !ruby/object:Gem::Version
|
37
33
|
version: '0'
|
38
34
|
type: :development
|
39
35
|
prerelease: false
|
40
36
|
version_requirements: !ruby/object:Gem::Requirement
|
41
|
-
none: false
|
42
37
|
requirements:
|
43
|
-
- -
|
38
|
+
- - ">="
|
44
39
|
- !ruby/object:Gem::Version
|
45
40
|
version: '0'
|
46
41
|
- !ruby/object:Gem::Dependency
|
47
42
|
name: rspec
|
48
43
|
requirement: !ruby/object:Gem::Requirement
|
49
|
-
none: false
|
50
44
|
requirements:
|
51
|
-
- -
|
45
|
+
- - ">="
|
52
46
|
- !ruby/object:Gem::Version
|
53
47
|
version: '0'
|
54
48
|
type: :development
|
55
49
|
prerelease: false
|
56
50
|
version_requirements: !ruby/object:Gem::Requirement
|
57
|
-
none: false
|
58
51
|
requirements:
|
59
|
-
- -
|
52
|
+
- - ">="
|
60
53
|
- !ruby/object:Gem::Version
|
61
54
|
version: '0'
|
62
55
|
description: A threaded publish/subscribe object, for internal application events.
|
@@ -67,7 +60,8 @@ extensions: []
|
|
67
60
|
extra_rdoc_files:
|
68
61
|
- README.md
|
69
62
|
files:
|
70
|
-
- .gitignore
|
63
|
+
- ".gitignore"
|
64
|
+
- ".rubocop.yml"
|
71
65
|
- Gemfile
|
72
66
|
- LICENSE
|
73
67
|
- README.md
|
@@ -81,27 +75,25 @@ files:
|
|
81
75
|
homepage: http://github.com/rabbitt/eventr
|
82
76
|
licenses:
|
83
77
|
- GPLv2
|
78
|
+
metadata: {}
|
84
79
|
post_install_message:
|
85
80
|
rdoc_options: []
|
86
81
|
require_paths:
|
87
82
|
- lib
|
88
83
|
required_ruby_version: !ruby/object:Gem::Requirement
|
89
|
-
none: false
|
90
84
|
requirements:
|
91
|
-
- -
|
85
|
+
- - ">="
|
92
86
|
- !ruby/object:Gem::Version
|
93
87
|
version: '0'
|
94
88
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
95
|
-
none: false
|
96
89
|
requirements:
|
97
|
-
- -
|
90
|
+
- - ">="
|
98
91
|
- !ruby/object:Gem::Version
|
99
92
|
version: '0'
|
100
93
|
requirements: []
|
101
94
|
rubyforge_project:
|
102
|
-
rubygems_version:
|
95
|
+
rubygems_version: 2.2.2
|
103
96
|
signing_key:
|
104
|
-
specification_version:
|
97
|
+
specification_version: 4
|
105
98
|
summary: Internal PubSub event object
|
106
99
|
test_files: []
|
107
|
-
has_rdoc:
|