smith 0.5.7

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.
Files changed (50) hide show
  1. data/bin/agency +55 -0
  2. data/bin/smithctl +102 -0
  3. data/lib/smith.rb +237 -0
  4. data/lib/smith/acl_compiler.rb +74 -0
  5. data/lib/smith/agent.rb +207 -0
  6. data/lib/smith/agent_cache.rb +40 -0
  7. data/lib/smith/agent_config.rb +22 -0
  8. data/lib/smith/agent_monitoring.rb +52 -0
  9. data/lib/smith/agent_process.rb +181 -0
  10. data/lib/smith/application/agency.rb +126 -0
  11. data/lib/smith/bootstrap.rb +153 -0
  12. data/lib/smith/cache.rb +61 -0
  13. data/lib/smith/command.rb +128 -0
  14. data/lib/smith/commands/agency/agents.rb +28 -0
  15. data/lib/smith/commands/agency/common.rb +18 -0
  16. data/lib/smith/commands/agency/kill.rb +13 -0
  17. data/lib/smith/commands/agency/list.rb +65 -0
  18. data/lib/smith/commands/agency/logger.rb +56 -0
  19. data/lib/smith/commands/agency/metadata.rb +14 -0
  20. data/lib/smith/commands/agency/restart.rb +39 -0
  21. data/lib/smith/commands/agency/start.rb +62 -0
  22. data/lib/smith/commands/agency/state.rb +14 -0
  23. data/lib/smith/commands/agency/stop.rb +70 -0
  24. data/lib/smith/commands/agency/version.rb +23 -0
  25. data/lib/smith/commands/smithctl/cat.rb +70 -0
  26. data/lib/smith/commands/smithctl/pop.rb +76 -0
  27. data/lib/smith/commands/smithctl/rm.rb +36 -0
  28. data/lib/smith/commands/smithctl/smithctl_version.rb +23 -0
  29. data/lib/smith/commands/smithctl/top.rb +42 -0
  30. data/lib/smith/commands/template.rb +9 -0
  31. data/lib/smith/config.rb +32 -0
  32. data/lib/smith/logger.rb +91 -0
  33. data/lib/smith/messaging/acl/agency_command.proto +5 -0
  34. data/lib/smith/messaging/acl/agent_command.proto +5 -0
  35. data/lib/smith/messaging/acl/agent_config_request.proto +4 -0
  36. data/lib/smith/messaging/acl/agent_config_update.proto +5 -0
  37. data/lib/smith/messaging/acl/agent_keepalive.proto +6 -0
  38. data/lib/smith/messaging/acl/agent_lifecycle.proto +12 -0
  39. data/lib/smith/messaging/acl/agent_stats.proto +14 -0
  40. data/lib/smith/messaging/acl/default.rb +51 -0
  41. data/lib/smith/messaging/acl/search.proto +9 -0
  42. data/lib/smith/messaging/amqp_options.rb +55 -0
  43. data/lib/smith/messaging/endpoint.rb +116 -0
  44. data/lib/smith/messaging/exceptions.rb +7 -0
  45. data/lib/smith/messaging/payload.rb +102 -0
  46. data/lib/smith/messaging/queue_factory.rb +67 -0
  47. data/lib/smith/messaging/receiver.rb +237 -0
  48. data/lib/smith/messaging/responder.rb +15 -0
  49. data/lib/smith/messaging/sender.rb +61 -0
  50. metadata +239 -0
@@ -0,0 +1,15 @@
1
+ # -*- encoding: utf-8 -*-
2
+ module Smith
3
+ module Messaging
4
+ class Responder
5
+ include Smith::Logger
6
+ include EventMachine::Deferrable
7
+
8
+ def value(value=nil, &blk)
9
+ logger.verbose { "Running responders: #{(value || blk).inspect}" }
10
+ value ||= ((blk) ? blk.call : nil)
11
+ set_deferred_status(:succeeded, value)
12
+ end
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,61 @@
1
+ # -*- encoding: utf-8 -*-
2
+ module Smith
3
+ module Messaging
4
+ class Sender < Endpoint
5
+
6
+ include Logger
7
+
8
+ attr_accessor :options
9
+
10
+ def initialize(queue_name, opts={})
11
+ @auto_ack = opts.delete(:auto_ack) || true
12
+ @threading = opts.delete(:threading) || false
13
+ super(queue_name, AmqpOptions.new(opts))
14
+ end
15
+
16
+ def publish(message, opts={}, &block)
17
+ _publish(message, options.publish({:type => message.type}, opts) , &block)
18
+ end
19
+
20
+ def publish_and_receive(message, &block)
21
+ message_id = random
22
+ Receiver.new(message_id, :auto_delete => true).ready do |receiver|
23
+
24
+ receiver.subscribe do |r|
25
+ raise "Incorrect correlation_id: #{metadata.correlation_id}" if r.metadata.correlation_id != message_id
26
+
27
+ cancel_timeout
28
+
29
+ block.call(r)
30
+
31
+ # Cancel the receive queue. Queues get left behind because the reply queue is
32
+ # still listening. By cancel'ling the consumer it releases the queue and exchange.
33
+ r.metadata.channel.consumers.each do |k,v|
34
+ if k.start_with?(receiver.queue_name)
35
+ logger.verbose { "Cancelling: #{k}" }
36
+ v.cancel
37
+ end
38
+ end
39
+ end
40
+
41
+ # DO NOT MOVE THIS OUTSIDE THE READY BLOCK: YOU WILL LOSE MESSAGES. The reason is
42
+ # that a message can be published and responded too before the receive queue is set up.
43
+ _publish(message, options.publish(:reply_to => message_id, :message_id => message_id, :type => message.type))
44
+ end
45
+ end
46
+
47
+ private
48
+
49
+ def _publish(message, opts, &block)
50
+ logger.verbose { "Publishing to: [queue]: #{denomalized_queue_name}. [options]: #{opts}" }
51
+ logger.verbose { "Payload content: [queue]: #{denomalized_queue_name}, [metadata type]: #{message.type}, [message]: #{message.inspect}" }
52
+ if message.initialized?
53
+ increment_counter
54
+ exchange.publish(message.encode, opts, &block)
55
+ else
56
+ raise IncompletePayload, "Message is incomplete: #{message.to_s}"
57
+ end
58
+ end
59
+ end
60
+ end
61
+ end
metadata ADDED
@@ -0,0 +1,239 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: smith
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.5.7
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Richard Heycock
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2012-02-22 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: amqp
16
+ requirement: &19248700 !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ! '>='
20
+ - !ruby/object:Gem::Version
21
+ version: 0.9.5.pre
22
+ type: :runtime
23
+ prerelease: false
24
+ version_requirements: *19248700
25
+ - !ruby/object:Gem::Dependency
26
+ name: dm-core
27
+ requirement: &19248220 !ruby/object:Gem::Requirement
28
+ none: false
29
+ requirements:
30
+ - - =
31
+ - !ruby/object:Gem::Version
32
+ version: 1.0.1
33
+ type: :runtime
34
+ prerelease: false
35
+ version_requirements: *19248220
36
+ - !ruby/object:Gem::Dependency
37
+ name: dm-observer
38
+ requirement: &19247760 !ruby/object:Gem::Requirement
39
+ none: false
40
+ requirements:
41
+ - - =
42
+ - !ruby/object:Gem::Version
43
+ version: 1.0.1
44
+ type: :runtime
45
+ prerelease: false
46
+ version_requirements: *19247760
47
+ - !ruby/object:Gem::Dependency
48
+ name: dm-yaml-adapter
49
+ requirement: &19247300 !ruby/object:Gem::Requirement
50
+ none: false
51
+ requirements:
52
+ - - =
53
+ - !ruby/object:Gem::Version
54
+ version: 1.0.1
55
+ type: :runtime
56
+ prerelease: false
57
+ version_requirements: *19247300
58
+ - !ruby/object:Gem::Dependency
59
+ name: daemons
60
+ requirement: &19246840 !ruby/object:Gem::Requirement
61
+ none: false
62
+ requirements:
63
+ - - ! '>='
64
+ - !ruby/object:Gem::Version
65
+ version: 1.1.4
66
+ type: :runtime
67
+ prerelease: false
68
+ version_requirements: *19246840
69
+ - !ruby/object:Gem::Dependency
70
+ name: eventmachine
71
+ requirement: &19742440 !ruby/object:Gem::Requirement
72
+ none: false
73
+ requirements:
74
+ - - ! '>='
75
+ - !ruby/object:Gem::Version
76
+ version: 1.0.0.beta.4
77
+ type: :runtime
78
+ prerelease: false
79
+ version_requirements: *19742440
80
+ - !ruby/object:Gem::Dependency
81
+ name: extlib
82
+ requirement: &19741980 !ruby/object:Gem::Requirement
83
+ none: false
84
+ requirements:
85
+ - - ! '>='
86
+ - !ruby/object:Gem::Version
87
+ version: 0.9.15
88
+ type: :runtime
89
+ prerelease: false
90
+ version_requirements: *19741980
91
+ - !ruby/object:Gem::Dependency
92
+ name: logging
93
+ requirement: &19741520 !ruby/object:Gem::Requirement
94
+ none: false
95
+ requirements:
96
+ - - ! '>='
97
+ - !ruby/object:Gem::Version
98
+ version: 1.6.1
99
+ type: :runtime
100
+ prerelease: false
101
+ version_requirements: *19741520
102
+ - !ruby/object:Gem::Dependency
103
+ name: optimism
104
+ requirement: &19741060 !ruby/object:Gem::Requirement
105
+ none: false
106
+ requirements:
107
+ - - ! '>='
108
+ - !ruby/object:Gem::Version
109
+ version: 3.0.3
110
+ type: :runtime
111
+ prerelease: false
112
+ version_requirements: *19741060
113
+ - !ruby/object:Gem::Dependency
114
+ name: ruby_protobuf
115
+ requirement: &19740600 !ruby/object:Gem::Requirement
116
+ none: false
117
+ requirements:
118
+ - - =
119
+ - !ruby/object:Gem::Version
120
+ version: 0.4.11
121
+ type: :runtime
122
+ prerelease: false
123
+ version_requirements: *19740600
124
+ - !ruby/object:Gem::Dependency
125
+ name: state_machine
126
+ requirement: &19740140 !ruby/object:Gem::Requirement
127
+ none: false
128
+ requirements:
129
+ - - =
130
+ - !ruby/object:Gem::Version
131
+ version: 1.1.2
132
+ type: :runtime
133
+ prerelease: false
134
+ version_requirements: *19740140
135
+ - !ruby/object:Gem::Dependency
136
+ name: trollop
137
+ requirement: &19739680 !ruby/object:Gem::Requirement
138
+ none: false
139
+ requirements:
140
+ - - ! '>='
141
+ - !ruby/object:Gem::Version
142
+ version: 1.16.2
143
+ type: :runtime
144
+ prerelease: false
145
+ version_requirements: *19739680
146
+ - !ruby/object:Gem::Dependency
147
+ name: yajl-ruby
148
+ requirement: &19739220 !ruby/object:Gem::Requirement
149
+ none: false
150
+ requirements:
151
+ - - ! '>='
152
+ - !ruby/object:Gem::Version
153
+ version: 1.1.0
154
+ type: :runtime
155
+ prerelease: false
156
+ version_requirements: *19739220
157
+ description: Simple multi-agent framework. It uses AMQP for it's messaging layer.
158
+ email: rgh@filterfish.org
159
+ executables:
160
+ - agency
161
+ - smithctl
162
+ extensions: []
163
+ extra_rdoc_files: []
164
+ files:
165
+ - bin/agency
166
+ - bin/smithctl
167
+ - lib/smith/acl_compiler.rb
168
+ - lib/smith/agent.rb
169
+ - lib/smith/agent_cache.rb
170
+ - lib/smith/agent_config.rb
171
+ - lib/smith/agent_monitoring.rb
172
+ - lib/smith/agent_process.rb
173
+ - lib/smith/application/agency.rb
174
+ - lib/smith/bootstrap.rb
175
+ - lib/smith/cache.rb
176
+ - lib/smith/command.rb
177
+ - lib/smith/commands/agency/agents.rb
178
+ - lib/smith/commands/agency/common.rb
179
+ - lib/smith/commands/agency/kill.rb
180
+ - lib/smith/commands/agency/list.rb
181
+ - lib/smith/commands/agency/metadata.rb
182
+ - lib/smith/commands/agency/restart.rb
183
+ - lib/smith/commands/agency/start.rb
184
+ - lib/smith/commands/agency/state.rb
185
+ - lib/smith/commands/agency/stop.rb
186
+ - lib/smith/commands/agency/version.rb
187
+ - lib/smith/commands/agency/logger.rb
188
+ - lib/smith/commands/smithctl/cat.rb
189
+ - lib/smith/commands/smithctl/pop.rb
190
+ - lib/smith/commands/smithctl/rm.rb
191
+ - lib/smith/commands/smithctl/smithctl_version.rb
192
+ - lib/smith/commands/smithctl/top.rb
193
+ - lib/smith/commands/template.rb
194
+ - lib/smith/config.rb
195
+ - lib/smith/logger.rb
196
+ - lib/smith/messaging/acl/agency_command.proto
197
+ - lib/smith/messaging/acl/agent_command.proto
198
+ - lib/smith/messaging/acl/agent_config_request.proto
199
+ - lib/smith/messaging/acl/agent_config_update.proto
200
+ - lib/smith/messaging/acl/agent_keepalive.proto
201
+ - lib/smith/messaging/acl/agent_lifecycle.proto
202
+ - lib/smith/messaging/acl/agent_stats.proto
203
+ - lib/smith/messaging/acl/default.rb
204
+ - lib/smith/messaging/acl/search.proto
205
+ - lib/smith/messaging/amqp_options.rb
206
+ - lib/smith/messaging/endpoint.rb
207
+ - lib/smith/messaging/exceptions.rb
208
+ - lib/smith/messaging/payload.rb
209
+ - lib/smith/messaging/queue_factory.rb
210
+ - lib/smith/messaging/responder.rb
211
+ - lib/smith/messaging/sender.rb
212
+ - lib/smith/messaging/receiver.rb
213
+ - lib/smith.rb
214
+ homepage: http://github.com/filterfish/smith2/
215
+ licenses: []
216
+ post_install_message:
217
+ rdoc_options: []
218
+ require_paths:
219
+ - lib
220
+ required_ruby_version: !ruby/object:Gem::Requirement
221
+ none: false
222
+ requirements:
223
+ - - ! '>='
224
+ - !ruby/object:Gem::Version
225
+ version: '0'
226
+ required_rubygems_version: !ruby/object:Gem::Requirement
227
+ none: false
228
+ requirements:
229
+ - - ! '>='
230
+ - !ruby/object:Gem::Version
231
+ version: '0'
232
+ requirements: []
233
+ rubyforge_project: nowarning
234
+ rubygems_version: 1.8.11
235
+ signing_key:
236
+ specification_version: 3
237
+ summary: Multi-agent framework
238
+ test_files: []
239
+ has_rdoc: false