brown 1.1.2 → 2.1.0
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/.gitignore +4 -1
- data/.yardopts +1 -0
- data/LICENCE +674 -0
- data/README.md +321 -0
- data/bin/brown +72 -12
- data/brown.gemspec +31 -21
- data/lib/.gitkeep +0 -0
- data/lib/brown.rb +17 -3
- data/lib/brown/agent.rb +417 -21
- data/lib/brown/agent/amqp_message.rb +42 -0
- data/lib/brown/agent/amqp_message_mock.rb +28 -0
- data/lib/brown/agent/amqp_publisher.rb +169 -0
- data/lib/brown/agent/memo.rb +64 -0
- data/lib/brown/agent/stimulus.rb +143 -0
- data/lib/brown/test.rb +152 -0
- metadata +88 -64
- data/Gemfile +0 -3
- data/Rakefile +0 -19
- data/lib/brown/acl_loader.rb +0 -57
- data/lib/brown/acl_lookup.rb +0 -52
- data/lib/brown/amqp_errors.rb +0 -148
- data/lib/brown/logger.rb +0 -51
- data/lib/brown/message.rb +0 -73
- data/lib/brown/module_methods.rb +0 -134
- data/lib/brown/queue_definition.rb +0 -32
- data/lib/brown/queue_factory.rb +0 -33
- data/lib/brown/receiver.rb +0 -143
- data/lib/brown/sender.rb +0 -92
- data/lib/brown/util.rb +0 -58
- data/lib/smith.rb +0 -4
data/lib/brown/test.rb
ADDED
@@ -0,0 +1,152 @@
|
|
1
|
+
require 'brown'
|
2
|
+
require 'brown/agent/amqp_message_mock'
|
3
|
+
|
4
|
+
# Additional testing methods for {Brown::Agent}.
|
5
|
+
#
|
6
|
+
# You can cause these methods to become part of {Brown::Agent} with
|
7
|
+
#
|
8
|
+
# require 'brown/test_helpers'
|
9
|
+
#
|
10
|
+
module Brown::TestHelpers
|
11
|
+
#:nodoc:
|
12
|
+
def self.included(base)
|
13
|
+
base.class_eval do
|
14
|
+
%i{memo amqp_publisher amqp_listener}.each do |m|
|
15
|
+
alias_method "#{m}_without_test".to_sym, m
|
16
|
+
alias_method m, "#{m}_with_test".to_sym
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
# Is there not an arbitrary stimulus with the specified name registered
|
22
|
+
# on this agent?
|
23
|
+
#
|
24
|
+
# @param name [Symbol]
|
25
|
+
#
|
26
|
+
# @return Boolean
|
27
|
+
#
|
28
|
+
def stimulus?(name)
|
29
|
+
@stimuli && @stimuli.has_key?(name)
|
30
|
+
end
|
31
|
+
|
32
|
+
# Is there a memo with the specified name registered on this agent?
|
33
|
+
#
|
34
|
+
# @param name [Symbol]
|
35
|
+
#
|
36
|
+
# @return Boolean
|
37
|
+
#
|
38
|
+
def memo?(name)
|
39
|
+
@memos && @memos.has_key?(name)
|
40
|
+
end
|
41
|
+
|
42
|
+
#:nodoc:
|
43
|
+
#
|
44
|
+
# Test-specific decorator to replace the "real" memo container object
|
45
|
+
# with a test-enabled alternative.
|
46
|
+
#
|
47
|
+
def memo_with_test(name, safe=false, &generator)
|
48
|
+
memo_without_test(name, safe, &generator)
|
49
|
+
|
50
|
+
# Throw out the real memo, replace with our own testing-enabled variant
|
51
|
+
@memos[name] = Brown::Agent::Memo.new(generator, safe, true)
|
52
|
+
end
|
53
|
+
|
54
|
+
# Is there a timer which will go off every `n` seconds registered on this
|
55
|
+
# agent?
|
56
|
+
#
|
57
|
+
# @param n [Integer]
|
58
|
+
#
|
59
|
+
# @return Boolean
|
60
|
+
#
|
61
|
+
def timer?(n)
|
62
|
+
!instance_methods.select { |m| m =~ /^every_#{n}__/ }.empty?
|
63
|
+
end
|
64
|
+
|
65
|
+
# Set off all timers which trigger every `n` seconds on the running agent.
|
66
|
+
#
|
67
|
+
# @param n [Integer]
|
68
|
+
#
|
69
|
+
def trigger(n)
|
70
|
+
self.instance_methods.select { |m| m =~ /^every_#{n}__/ }.each do |m|
|
71
|
+
self.new.__send__(m)
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
75
|
+
#:nodoc:
|
76
|
+
#
|
77
|
+
# Test-specific decorator to record the existence of a publisher.
|
78
|
+
#
|
79
|
+
def amqp_publisher_with_test(name, *args)
|
80
|
+
@amqp_publishers ||= {}
|
81
|
+
|
82
|
+
@amqp_publishers[name] = true
|
83
|
+
|
84
|
+
amqp_publisher_without_test(name, *args)
|
85
|
+
end
|
86
|
+
|
87
|
+
# Is there a publisher with the specified name registered on this agent?
|
88
|
+
#
|
89
|
+
# @param name [Symbol]
|
90
|
+
#
|
91
|
+
# @return Boolean
|
92
|
+
#
|
93
|
+
def amqp_publisher?(name)
|
94
|
+
@amqp_publishers && @amqp_publishers[name]
|
95
|
+
end
|
96
|
+
|
97
|
+
#:nodoc:
|
98
|
+
#
|
99
|
+
# Test-specific decorator to record the details of a listener.
|
100
|
+
#
|
101
|
+
def amqp_listener_with_test(exchange_name, *args, &blk)
|
102
|
+
@amqp_listeners ||= {}
|
103
|
+
|
104
|
+
@amqp_listeners[exchange_name.to_s] = blk
|
105
|
+
|
106
|
+
amqp_listener_without_test(exchange_name, *args, &blk)
|
107
|
+
end
|
108
|
+
|
109
|
+
# Is there a listener on the specified exchange name registered on this agent?
|
110
|
+
#
|
111
|
+
# @param exchange_name [#to_s]
|
112
|
+
#
|
113
|
+
# @return Boolean
|
114
|
+
#
|
115
|
+
def amqp_listener?(exchange_name)
|
116
|
+
@amqp_listeners && @amqp_listeners[exchange_name.to_s].is_a?(Proc)
|
117
|
+
end
|
118
|
+
|
119
|
+
# Cause a message to be received by the listener on `exchange_name`.
|
120
|
+
#
|
121
|
+
# @param exchange_name [#to_s] the name of the exchange.
|
122
|
+
#
|
123
|
+
# @param payload [String] the literal string which is the payload of the
|
124
|
+
# message.
|
125
|
+
#
|
126
|
+
# @return [Boolean] whether or not the message was acked. You *usually*
|
127
|
+
# want to check that this is true, because an agent that doesn't ack
|
128
|
+
# each message when it has finished processing it is almost always
|
129
|
+
# buggy, but there are specialised circumstances where you actually
|
130
|
+
# want to *not* ack the message.
|
131
|
+
#
|
132
|
+
# @raise [ArgumentError] if you attempt to send a message via an exchange
|
133
|
+
# that isn't being listened on.
|
134
|
+
#
|
135
|
+
def amqp_receive(exchange_name, payload, **opts)
|
136
|
+
unless amqp_listener?(exchange_name)
|
137
|
+
raise ArgumentError,
|
138
|
+
"Unknown exchange: #{exchange_name}"
|
139
|
+
end
|
140
|
+
|
141
|
+
msg = Brown::Agent::AMQPMessageMock.new(opts.merge(payload: payload))
|
142
|
+
|
143
|
+
@amqp_listeners[exchange_name].call(msg)
|
144
|
+
|
145
|
+
msg.acked?
|
146
|
+
end
|
147
|
+
end
|
148
|
+
|
149
|
+
class << Brown::Agent
|
150
|
+
include Brown::TestHelpers
|
151
|
+
end
|
152
|
+
|
metadata
CHANGED
@@ -1,30 +1,29 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: brown
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 2.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
|
-
- Richard Heycock
|
8
7
|
- Matt Palmer
|
9
8
|
autorequire:
|
10
9
|
bindir: bin
|
11
10
|
cert_chain: []
|
12
|
-
date: 2015-
|
11
|
+
date: 2015-06-01 00:00:00.000000000 Z
|
13
12
|
dependencies:
|
14
13
|
- !ruby/object:Gem::Dependency
|
15
|
-
name:
|
14
|
+
name: bunny
|
16
15
|
requirement: !ruby/object:Gem::Requirement
|
17
16
|
requirements:
|
18
17
|
- - "~>"
|
19
18
|
- !ruby/object:Gem::Version
|
20
|
-
version: '1.
|
19
|
+
version: '1.7'
|
21
20
|
type: :runtime
|
22
21
|
prerelease: false
|
23
22
|
version_requirements: !ruby/object:Gem::Requirement
|
24
23
|
requirements:
|
25
24
|
- - "~>"
|
26
25
|
- !ruby/object:Gem::Version
|
27
|
-
version: '1.
|
26
|
+
version: '1.7'
|
28
27
|
- !ruby/object:Gem::Dependency
|
29
28
|
name: envied
|
30
29
|
requirement: !ruby/object:Gem::Requirement
|
@@ -40,63 +39,63 @@ dependencies:
|
|
40
39
|
- !ruby/object:Gem::Version
|
41
40
|
version: '0.8'
|
42
41
|
- !ruby/object:Gem::Dependency
|
43
|
-
name:
|
42
|
+
name: bundler
|
44
43
|
requirement: !ruby/object:Gem::Requirement
|
45
44
|
requirements:
|
46
|
-
- - "
|
45
|
+
- - ">="
|
47
46
|
- !ruby/object:Gem::Version
|
48
|
-
version: '
|
49
|
-
type: :
|
47
|
+
version: '0'
|
48
|
+
type: :development
|
50
49
|
prerelease: false
|
51
50
|
version_requirements: !ruby/object:Gem::Requirement
|
52
51
|
requirements:
|
53
|
-
- - "
|
52
|
+
- - ">="
|
54
53
|
- !ruby/object:Gem::Version
|
55
|
-
version: '
|
54
|
+
version: '0'
|
56
55
|
- !ruby/object:Gem::Dependency
|
57
|
-
name:
|
56
|
+
name: github-release
|
58
57
|
requirement: !ruby/object:Gem::Requirement
|
59
58
|
requirements:
|
60
|
-
- - "
|
59
|
+
- - ">="
|
61
60
|
- !ruby/object:Gem::Version
|
62
|
-
version: '0
|
63
|
-
type: :
|
61
|
+
version: '0'
|
62
|
+
type: :development
|
64
63
|
prerelease: false
|
65
64
|
version_requirements: !ruby/object:Gem::Requirement
|
66
65
|
requirements:
|
67
|
-
- - "
|
66
|
+
- - ">="
|
68
67
|
- !ruby/object:Gem::Version
|
69
|
-
version: '0
|
68
|
+
version: '0'
|
70
69
|
- !ruby/object:Gem::Dependency
|
71
|
-
name:
|
70
|
+
name: guard-spork
|
72
71
|
requirement: !ruby/object:Gem::Requirement
|
73
72
|
requirements:
|
74
|
-
- - "
|
73
|
+
- - ">="
|
75
74
|
- !ruby/object:Gem::Version
|
76
|
-
version: '0
|
77
|
-
type: :
|
75
|
+
version: '0'
|
76
|
+
type: :development
|
78
77
|
prerelease: false
|
79
78
|
version_requirements: !ruby/object:Gem::Requirement
|
80
79
|
requirements:
|
81
|
-
- - "
|
80
|
+
- - ">="
|
82
81
|
- !ruby/object:Gem::Version
|
83
|
-
version: '0
|
82
|
+
version: '0'
|
84
83
|
- !ruby/object:Gem::Dependency
|
85
|
-
name:
|
84
|
+
name: guard-rspec
|
86
85
|
requirement: !ruby/object:Gem::Requirement
|
87
86
|
requirements:
|
88
|
-
- - "
|
87
|
+
- - ">="
|
89
88
|
- !ruby/object:Gem::Version
|
90
|
-
version: '
|
91
|
-
type: :
|
89
|
+
version: '0'
|
90
|
+
type: :development
|
92
91
|
prerelease: false
|
93
92
|
version_requirements: !ruby/object:Gem::Requirement
|
94
93
|
requirements:
|
95
|
-
- - "
|
94
|
+
- - ">="
|
96
95
|
- !ruby/object:Gem::Version
|
97
|
-
version: '
|
96
|
+
version: '0'
|
98
97
|
- !ruby/object:Gem::Dependency
|
99
|
-
name:
|
98
|
+
name: pry-byebug
|
100
99
|
requirement: !ruby/object:Gem::Requirement
|
101
100
|
requirements:
|
102
101
|
- - ">="
|
@@ -110,82 +109,106 @@ dependencies:
|
|
110
109
|
- !ruby/object:Gem::Version
|
111
110
|
version: '0'
|
112
111
|
- !ruby/object:Gem::Dependency
|
113
|
-
name:
|
112
|
+
name: rake
|
114
113
|
requirement: !ruby/object:Gem::Requirement
|
115
114
|
requirements:
|
115
|
+
- - "~>"
|
116
|
+
- !ruby/object:Gem::Version
|
117
|
+
version: '10.4'
|
116
118
|
- - ">="
|
117
119
|
- !ruby/object:Gem::Version
|
118
|
-
version:
|
120
|
+
version: 10.4.2
|
119
121
|
type: :development
|
120
122
|
prerelease: false
|
121
123
|
version_requirements: !ruby/object:Gem::Requirement
|
122
124
|
requirements:
|
125
|
+
- - "~>"
|
126
|
+
- !ruby/object:Gem::Version
|
127
|
+
version: '10.4'
|
123
128
|
- - ">="
|
124
129
|
- !ruby/object:Gem::Version
|
125
|
-
version:
|
130
|
+
version: 10.4.2
|
126
131
|
- !ruby/object:Gem::Dependency
|
127
|
-
name:
|
132
|
+
name: rb-inotify
|
128
133
|
requirement: !ruby/object:Gem::Requirement
|
129
134
|
requirements:
|
130
135
|
- - "~>"
|
131
136
|
- !ruby/object:Gem::Version
|
132
|
-
version: '0.
|
137
|
+
version: '0.9'
|
133
138
|
type: :development
|
134
139
|
prerelease: false
|
135
140
|
version_requirements: !ruby/object:Gem::Requirement
|
136
141
|
requirements:
|
137
142
|
- - "~>"
|
138
143
|
- !ruby/object:Gem::Version
|
139
|
-
version: '0.
|
144
|
+
version: '0.9'
|
140
145
|
- !ruby/object:Gem::Dependency
|
141
|
-
name:
|
146
|
+
name: redcarpet
|
142
147
|
requirement: !ruby/object:Gem::Requirement
|
143
148
|
requirements:
|
144
|
-
- - "
|
149
|
+
- - ">="
|
145
150
|
- !ruby/object:Gem::Version
|
146
|
-
version: '
|
151
|
+
version: '0'
|
152
|
+
type: :development
|
153
|
+
prerelease: false
|
154
|
+
version_requirements: !ruby/object:Gem::Requirement
|
155
|
+
requirements:
|
147
156
|
- - ">="
|
148
157
|
- !ruby/object:Gem::Version
|
149
|
-
version:
|
158
|
+
version: '0'
|
159
|
+
- !ruby/object:Gem::Dependency
|
160
|
+
name: rspec
|
161
|
+
requirement: !ruby/object:Gem::Requirement
|
162
|
+
requirements:
|
163
|
+
- - ">="
|
164
|
+
- !ruby/object:Gem::Version
|
165
|
+
version: '0'
|
150
166
|
type: :development
|
151
167
|
prerelease: false
|
152
168
|
version_requirements: !ruby/object:Gem::Requirement
|
153
169
|
requirements:
|
154
|
-
- - "
|
170
|
+
- - ">="
|
155
171
|
- !ruby/object:Gem::Version
|
156
|
-
version: '
|
172
|
+
version: '0'
|
173
|
+
- !ruby/object:Gem::Dependency
|
174
|
+
name: yard
|
175
|
+
requirement: !ruby/object:Gem::Requirement
|
176
|
+
requirements:
|
157
177
|
- - ">="
|
158
178
|
- !ruby/object:Gem::Version
|
159
|
-
version:
|
179
|
+
version: '0'
|
180
|
+
type: :development
|
181
|
+
prerelease: false
|
182
|
+
version_requirements: !ruby/object:Gem::Requirement
|
183
|
+
requirements:
|
184
|
+
- - ">="
|
185
|
+
- !ruby/object:Gem::Version
|
186
|
+
version: '0'
|
160
187
|
description:
|
161
|
-
email:
|
188
|
+
email:
|
189
|
+
- theshed+brown@hezmatt.org
|
162
190
|
executables:
|
163
191
|
- brown
|
164
192
|
extensions: []
|
165
193
|
extra_rdoc_files: []
|
166
194
|
files:
|
167
195
|
- ".gitignore"
|
168
|
-
-
|
169
|
-
-
|
196
|
+
- ".yardopts"
|
197
|
+
- LICENCE
|
198
|
+
- README.md
|
170
199
|
- bin/brown
|
171
200
|
- brown.gemspec
|
201
|
+
- lib/.gitkeep
|
172
202
|
- lib/brown.rb
|
173
|
-
- lib/brown/acl_loader.rb
|
174
|
-
- lib/brown/acl_lookup.rb
|
175
203
|
- lib/brown/agent.rb
|
176
|
-
- lib/brown/
|
177
|
-
- lib/brown/
|
178
|
-
- lib/brown/
|
179
|
-
- lib/brown/
|
180
|
-
- lib/brown/
|
181
|
-
- lib/brown/
|
182
|
-
|
183
|
-
|
184
|
-
- lib/brown/util.rb
|
185
|
-
- lib/smith.rb
|
186
|
-
homepage:
|
187
|
-
licenses:
|
188
|
-
- GPL-3
|
204
|
+
- lib/brown/agent/amqp_message.rb
|
205
|
+
- lib/brown/agent/amqp_message_mock.rb
|
206
|
+
- lib/brown/agent/amqp_publisher.rb
|
207
|
+
- lib/brown/agent/memo.rb
|
208
|
+
- lib/brown/agent/stimulus.rb
|
209
|
+
- lib/brown/test.rb
|
210
|
+
homepage: http://theshed.hezmatt.org/brown
|
211
|
+
licenses: []
|
189
212
|
metadata: {}
|
190
213
|
post_install_message:
|
191
214
|
rdoc_options: []
|
@@ -195,7 +218,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
195
218
|
requirements:
|
196
219
|
- - ">="
|
197
220
|
- !ruby/object:Gem::Version
|
198
|
-
version:
|
221
|
+
version: 2.1.0
|
199
222
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
200
223
|
requirements:
|
201
224
|
- - ">="
|
@@ -206,5 +229,6 @@ rubyforge_project:
|
|
206
229
|
rubygems_version: 2.2.2
|
207
230
|
signing_key:
|
208
231
|
specification_version: 4
|
209
|
-
summary:
|
232
|
+
summary: Autonomous agent framework
|
210
233
|
test_files: []
|
234
|
+
has_rdoc:
|
data/Gemfile
DELETED
data/Rakefile
DELETED
@@ -1,19 +0,0 @@
|
|
1
|
-
exec(*(["bundle", "exec", $PROGRAM_NAME] + ARGV)) if ENV['BUNDLE_GEMFILE'].nil?
|
2
|
-
|
3
|
-
Bundler.setup(:default, :development)
|
4
|
-
|
5
|
-
task :default => :test
|
6
|
-
|
7
|
-
begin
|
8
|
-
Bundler.setup(:default, :development)
|
9
|
-
rescue Bundler::BundlerError => e
|
10
|
-
$stderr.puts e.message
|
11
|
-
$stderr.puts "Run `bundle install` to install missing gems"
|
12
|
-
exit e.status_code
|
13
|
-
end
|
14
|
-
|
15
|
-
Bundler::GemHelper.install_tasks
|
16
|
-
|
17
|
-
task :release do
|
18
|
-
sh "git release"
|
19
|
-
end
|