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.
@@ -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