brown 1.1.2 → 2.1.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -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: 1.1.2
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-04-01 00:00:00.000000000 Z
11
+ date: 2015-06-01 00:00:00.000000000 Z
13
12
  dependencies:
14
13
  - !ruby/object:Gem::Dependency
15
- name: amqp
14
+ name: bunny
16
15
  requirement: !ruby/object:Gem::Requirement
17
16
  requirements:
18
17
  - - "~>"
19
18
  - !ruby/object:Gem::Version
20
- version: '1.4'
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.4'
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: eventmachine-le
42
+ name: bundler
44
43
  requirement: !ruby/object:Gem::Requirement
45
44
  requirements:
46
- - - "~>"
45
+ - - ">="
47
46
  - !ruby/object:Gem::Version
48
- version: '1.0'
49
- type: :runtime
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: '1.0'
54
+ version: '0'
56
55
  - !ruby/object:Gem::Dependency
57
- name: extlib
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.9'
63
- type: :runtime
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.9'
68
+ version: '0'
70
69
  - !ruby/object:Gem::Dependency
71
- name: murmurhash3
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.1'
77
- type: :runtime
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.1'
82
+ version: '0'
84
83
  - !ruby/object:Gem::Dependency
85
- name: protobuf
84
+ name: guard-rspec
86
85
  requirement: !ruby/object:Gem::Requirement
87
86
  requirements:
88
- - - "~>"
87
+ - - ">="
89
88
  - !ruby/object:Gem::Version
90
- version: '3.0'
91
- type: :runtime
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: '3.0'
96
+ version: '0'
98
97
  - !ruby/object:Gem::Dependency
99
- name: bundler
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: github-release
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: '0'
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: '0'
130
+ version: 10.4.2
126
131
  - !ruby/object:Gem::Dependency
127
- name: git-version-bump
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.10'
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.10'
144
+ version: '0.9'
140
145
  - !ruby/object:Gem::Dependency
141
- name: rake
146
+ name: redcarpet
142
147
  requirement: !ruby/object:Gem::Requirement
143
148
  requirements:
144
- - - "~>"
149
+ - - ">="
145
150
  - !ruby/object:Gem::Version
146
- version: '10.4'
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: 10.4.2
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: '10.4'
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: 10.4.2
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
- - Gemfile
169
- - Rakefile
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/amqp_errors.rb
177
- - lib/brown/logger.rb
178
- - lib/brown/message.rb
179
- - lib/brown/module_methods.rb
180
- - lib/brown/queue_definition.rb
181
- - lib/brown/queue_factory.rb
182
- - lib/brown/receiver.rb
183
- - lib/brown/sender.rb
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: '0'
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: Run individual smith agents directly from the command line
232
+ summary: Autonomous agent framework
210
233
  test_files: []
234
+ has_rdoc:
data/Gemfile DELETED
@@ -1,3 +0,0 @@
1
- source 'https://rubygems.org'
2
-
3
- gemspec
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