noah 0.1-jruby → 0.2-jruby

Sign up to get free protection for your applications and to get access to all the features.
data/bin/noah-watcher.rb CHANGED
@@ -12,6 +12,7 @@ begin
12
12
  require 'eventmachine'
13
13
  require 'em-http-request'
14
14
  require 'noah'
15
+ require 'noah/agent'
15
16
  require 'json'
16
17
  rescue LoadError
17
18
  puts HELP
@@ -20,67 +21,13 @@ end
20
21
 
21
22
  LOGGER = Logger.new(STDOUT)
22
23
 
23
- class EventMachine::NoahAgent
24
- include EM::Deferrable
25
-
26
- @@watchers = Noah::Watcher.watch_list
27
-
28
- def initialize
29
- @logger = LOGGER
30
- @logger.debug("Initializing with #{@@watchers.size} registered watches")
31
- if EventMachine.reactor_running?
32
- @worker = EM.spawn {|event, message, watch_list|
33
- logger = LOGGER
34
- logger.info("Worker initiated")
35
- logger.debug("got event on http worker: #{event}")
36
- matches = watch_list.find_all{|w| event =~ /^#{Base64.decode64(w)}/}
37
- logger.debug("Found #{matches.size} matches for #{event}")
38
- EM::Iterator.new(matches).each do |watch, iter|
39
- p, ep = Base64.decode64(watch).split("|")
40
- logger.info("Sending message to: #{ep} for pattern: #{p}")
41
- http = EM::HttpRequest.new(ep, :connection_timeout => 2, :inactivity_timeout => 4).post :body => message
42
- http.callback {
43
- logger.info("Message posted to #{ep} successfully")
44
- }
45
- http.errback {
46
- logger.error("Something went wrong")
47
- }
48
- iter.next
49
- end
50
- }
51
- self.succeed("Succeed callback")
52
- else
53
- logger.fatal("Must be inside a reactor!")
54
- end
55
- end
56
-
57
- def watchers
58
- @@watchers.size
59
- end
60
-
61
- def reread_watchers
62
- @logger.debug("Found new watches")
63
- @logger.debug("Current watch count: #{@@watchers.size}")
64
- @@watchers = Noah::Watcher.watch_list
65
- @logger.debug("New watch count: #{@@watchers.size}")
66
- #@logger.debug(@@watchers)
67
- end
68
-
69
- def broker(msg)
70
- # This is just for testing for now
71
- e,m = msg.split("|")
72
- be = Base64.encode64(e).gsub("\n","")
73
- @worker.notify e, m, @@watchers.clone
74
- end
75
- end
76
-
77
24
  EventMachine.run do
78
25
  EM.error_handler do |e|
79
- Logger.new(STDOUT).warn(e)
26
+ LOGGER.warn(e)
80
27
  end
81
28
  logger = LOGGER
82
29
  trap("INT") { logger.debug("Shutting down. Watches will not be fired");EM.stop }
83
- noah = EventMachine::NoahAgent.new
30
+ noah = Noah::Agent.new
84
31
  noah.errback{|x| logger.error("Errback: #{x}")}
85
32
  noah.callback{|y| logger.info("Callback: #{y}")}
86
33
  # Passing messages...like a boss
@@ -93,7 +40,6 @@ EventMachine.run do
93
40
  r.on(:pmessage) do |pattern, event, message|
94
41
  noah.reread_watchers if event =~ /^\/\/noah\/watcher\/.*/
95
42
  master_channel.push "#{event}|#{message}"
96
- logger.debug("Saw[#{event}]")
97
43
  end
98
44
 
99
45
  sub = master_channel.subscribe {|msg|
data/config/warble.rb CHANGED
@@ -8,7 +8,7 @@ Warbler::Config.new do |config|
8
8
  config.includes = FileList["config.ru"]
9
9
  config.excludes = FileList["noah.gemspec", "Gemfile", "Gemfile.lock"]
10
10
  config.bundler = false
11
- config.gems += ["json", "ohm", "ohm-contrib", "sinatra", "sinatra-namespace", "haml"]
11
+ config.gems += ["json", "ohm", "ohm-contrib", "sinatra", "haml"]
12
12
  config.gem_excludes = [/^(test|spec)\//]
13
13
  config.public_html = FileList["views/**/*"]
14
14
  config.webxml.booter = :rack
data/lib/noah/agent.rb ADDED
@@ -0,0 +1,53 @@
1
+ $:.unshift(File.expand_path(File.join(File.dirname(__FILE__), "..", "lib")))
2
+ require 'rubygems'
3
+ require 'logger'
4
+ require 'noah'
5
+ require 'noah/agents/http_agent'
6
+ require 'noah/agents/dummy_agent'
7
+
8
+ module Noah
9
+ class Agent
10
+ include EM::Deferrable
11
+
12
+ Noah::Agents::HttpAgent.register
13
+ Noah::Agents::DummyAgent.register
14
+
15
+ @@watchers = Noah::Watcher.watch_list
16
+ @@agents = Noah::Watchers.agents
17
+
18
+ def initialize
19
+ @logger = LOGGER
20
+ @logger.debug("Initializing with #{@@watchers.size} registered watches")
21
+ @logger.debug("#{@@agents} agents registered")
22
+ if EventMachine.reactor_running?
23
+ self.succeed("Succeed callback")
24
+ else
25
+ logger.fatal("Must be inside a reactor!")
26
+ end
27
+ end
28
+
29
+ def watchers
30
+ @@watchers.size
31
+ end
32
+
33
+ def http_worker
34
+ @http_worker
35
+ end
36
+
37
+ def reread_watchers
38
+ @logger.debug("Found new watches")
39
+ @logger.debug("Current watch count: #{@@watchers.size}")
40
+ @@watchers = Noah::Watcher.watch_list
41
+ @logger.debug("New watch count: #{@@watchers.size}")
42
+ end
43
+
44
+ def broker(msg)
45
+ e,m = msg.split("|")
46
+ be = Base64.encode64(e).gsub("\n","")
47
+ EM::Iterator.new(@@agents).each do |agent, iter|
48
+ agent.send(:notify, e, m, @@watchers.clone)
49
+ iter.next
50
+ end
51
+ end
52
+ end
53
+ end
@@ -0,0 +1,29 @@
1
+ module Noah::Agents
2
+ class DummyAgent
3
+ include EM::Deferrable
4
+
5
+ PREFIX = "dummy"
6
+ NAME = "dummy"
7
+
8
+ def self.register
9
+ Noah::Watchers.register_agent(self)
10
+ end
11
+
12
+ def self.notify(event, message, watch_list)
13
+ logger = LOGGER
14
+ logger.info("#{NAME}: Worker initiated")
15
+ logger.debug("#{NAME}: got event - #{event}")
16
+ matches = watch_list.find_all{|w| event =~ /^#{Base64.decode64(w)}/}
17
+ logger.debug("#{NAME}: Found #{matches.size} possible matches for #{event}")
18
+ EM::Iterator.new(matches).each do |watch, iter|
19
+ p, ep = Base64.decode64(watch).split("|")
20
+ if ep =~ /^#{PREFIX}/
21
+ logger.info("#{NAME}: Sending message to: #{ep} for pattern: #{p}")
22
+ logger.debug("#{NAME}: message received: #{message}")
23
+ end
24
+ iter.next
25
+ end
26
+ end
27
+
28
+ end
29
+ end
@@ -0,0 +1,37 @@
1
+ require 'logger'
2
+
3
+ module Noah::Agents
4
+ class HttpAgent
5
+ include EM::Deferrable
6
+
7
+ PREFIX = "http"
8
+ NAME = "http"
9
+
10
+ def self.register
11
+ Noah::Watchers.register_agent(self)
12
+ end
13
+
14
+ def self.notify(event, message, watch_list)
15
+ logger = LOGGER
16
+ logger.info("#{NAME}: Worker initiated")
17
+ logger.debug("#{NAME}: got event - #{event}")
18
+ matches = watch_list.find_all{|w| event =~ /^#{Base64.decode64(w)}/}
19
+ logger.debug("#{PREFIX}: Found #{matches.size} possible matches for #{event}")
20
+ EM::Iterator.new(matches).each do |watch, iter|
21
+ p, ep = Base64.decode64(watch).split("|")
22
+ if ep =~ /^#{PREFIX}/
23
+ logger.info("#{NAME}: Sending message to (#{ep}) for pattern (#{p})")
24
+ http = EM::HttpRequest.new(ep, :connection_timeout => 2, :inactivity_timeout => 4).post :body => message
25
+ http.callback {
26
+ logger.info("#{NAME}: Message posted to #{ep} successfully")
27
+ }
28
+ http.errback {
29
+ logger.error("#{NAME}: Something went wrong with #{ep}")
30
+ }
31
+ iter.next
32
+ end
33
+ end
34
+ end
35
+
36
+ end
37
+ end
@@ -55,8 +55,17 @@ module Noah
55
55
  end
56
56
 
57
57
  class Watchers
58
+ @@agents = []
58
59
  def self.all(options = {})
59
60
  options.empty? ? Watcher.all.sort : Watcher.find(options).sort
60
61
  end
62
+
63
+ def self.register_agent(agent_class)
64
+ @@agents << agent_class
65
+ end
66
+
67
+ def self.agents
68
+ @@agents
69
+ end
61
70
  end
62
71
  end
data/lib/noah/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Noah
2
- VERSION = "0.1"
2
+ VERSION = "0.2"
3
3
  end
metadata CHANGED
@@ -1,8 +1,11 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: noah
3
3
  version: !ruby/object:Gem::Version
4
- prerelease:
5
- version: "0.1"
4
+ prerelease: false
5
+ segments:
6
+ - 0
7
+ - 2
8
+ version: "0.2"
6
9
  platform: jruby
7
10
  authors:
8
11
  - John E. Vincent
@@ -10,17 +13,22 @@ autorequire:
10
13
  bindir: bin
11
14
  cert_chain: []
12
15
 
13
- date: 2011-03-14 00:00:00 -04:00
16
+ date: 2011-03-15 00:00:00 -04:00
14
17
  default_executable:
15
18
  dependencies:
16
19
  - !ruby/object:Gem::Dependency
17
20
  name: eventmachine
18
21
  prerelease: false
19
22
  requirement: &id001 !ruby/object:Gem::Requirement
20
- none: false
21
23
  requirements:
22
24
  - - "="
23
25
  - !ruby/object:Gem::Version
26
+ segments:
27
+ - 1
28
+ - 0
29
+ - 0
30
+ - beta
31
+ - 3
24
32
  version: 1.0.0.beta.3
25
33
  type: :runtime
26
34
  version_requirements: *id001
@@ -28,10 +36,15 @@ dependencies:
28
36
  name: em-http-request
29
37
  prerelease: false
30
38
  requirement: &id002 !ruby/object:Gem::Requirement
31
- none: false
32
39
  requirements:
33
40
  - - "="
34
41
  - !ruby/object:Gem::Version
42
+ segments:
43
+ - 1
44
+ - 0
45
+ - 0
46
+ - beta
47
+ - 3
35
48
  version: 1.0.0.beta.3
36
49
  type: :runtime
37
50
  version_requirements: *id002
@@ -39,10 +52,13 @@ dependencies:
39
52
  name: redis
40
53
  prerelease: false
41
54
  requirement: &id003 !ruby/object:Gem::Requirement
42
- none: false
43
55
  requirements:
44
56
  - - "="
45
57
  - !ruby/object:Gem::Version
58
+ segments:
59
+ - 2
60
+ - 1
61
+ - 1
46
62
  version: 2.1.1
47
63
  type: :runtime
48
64
  version_requirements: *id003
@@ -50,10 +66,13 @@ dependencies:
50
66
  name: nest
51
67
  prerelease: false
52
68
  requirement: &id004 !ruby/object:Gem::Requirement
53
- none: false
54
69
  requirements:
55
70
  - - "="
56
71
  - !ruby/object:Gem::Version
72
+ segments:
73
+ - 1
74
+ - 1
75
+ - 0
57
76
  version: 1.1.0
58
77
  type: :runtime
59
78
  version_requirements: *id004
@@ -61,10 +80,13 @@ dependencies:
61
80
  name: rack
62
81
  prerelease: false
63
82
  requirement: &id005 !ruby/object:Gem::Requirement
64
- none: false
65
83
  requirements:
66
84
  - - "="
67
85
  - !ruby/object:Gem::Version
86
+ segments:
87
+ - 1
88
+ - 2
89
+ - 1
68
90
  version: 1.2.1
69
91
  type: :runtime
70
92
  version_requirements: *id005
@@ -72,10 +94,13 @@ dependencies:
72
94
  name: tilt
73
95
  prerelease: false
74
96
  requirement: &id006 !ruby/object:Gem::Requirement
75
- none: false
76
97
  requirements:
77
98
  - - "="
78
99
  - !ruby/object:Gem::Version
100
+ segments:
101
+ - 1
102
+ - 2
103
+ - 2
79
104
  version: 1.2.2
80
105
  type: :runtime
81
106
  version_requirements: *id006
@@ -83,10 +108,13 @@ dependencies:
83
108
  name: sinatra
84
109
  prerelease: false
85
110
  requirement: &id007 !ruby/object:Gem::Requirement
86
- none: false
87
111
  requirements:
88
112
  - - "="
89
113
  - !ruby/object:Gem::Version
114
+ segments:
115
+ - 1
116
+ - 1
117
+ - 2
90
118
  version: 1.1.2
91
119
  type: :runtime
92
120
  version_requirements: *id007
@@ -94,10 +122,13 @@ dependencies:
94
122
  name: ohm
95
123
  prerelease: false
96
124
  requirement: &id008 !ruby/object:Gem::Requirement
97
- none: false
98
125
  requirements:
99
126
  - - "="
100
127
  - !ruby/object:Gem::Version
128
+ segments:
129
+ - 0
130
+ - 1
131
+ - 3
101
132
  version: 0.1.3
102
133
  type: :runtime
103
134
  version_requirements: *id008
@@ -105,10 +136,13 @@ dependencies:
105
136
  name: ohm-contrib
106
137
  prerelease: false
107
138
  requirement: &id009 !ruby/object:Gem::Requirement
108
- none: false
109
139
  requirements:
110
140
  - - "="
111
141
  - !ruby/object:Gem::Version
142
+ segments:
143
+ - 0
144
+ - 1
145
+ - 1
112
146
  version: 0.1.1
113
147
  type: :runtime
114
148
  version_requirements: *id009
@@ -116,10 +150,13 @@ dependencies:
116
150
  name: haml
117
151
  prerelease: false
118
152
  requirement: &id010 !ruby/object:Gem::Requirement
119
- none: false
120
153
  requirements:
121
154
  - - "="
122
155
  - !ruby/object:Gem::Version
156
+ segments:
157
+ - 3
158
+ - 0
159
+ - 25
123
160
  version: 3.0.25
124
161
  type: :runtime
125
162
  version_requirements: *id010
@@ -127,10 +164,13 @@ dependencies:
127
164
  name: vegas
128
165
  prerelease: false
129
166
  requirement: &id011 !ruby/object:Gem::Requirement
130
- none: false
131
167
  requirements:
132
168
  - - "="
133
169
  - !ruby/object:Gem::Version
170
+ segments:
171
+ - 0
172
+ - 1
173
+ - 8
134
174
  version: 0.1.8
135
175
  type: :runtime
136
176
  version_requirements: *id011
@@ -138,10 +178,11 @@ dependencies:
138
178
  name: jruby-openssl
139
179
  prerelease: false
140
180
  requirement: &id012 !ruby/object:Gem::Requirement
141
- none: false
142
181
  requirements:
143
182
  - - ">="
144
183
  - !ruby/object:Gem::Version
184
+ segments:
185
+ - 0
145
186
  version: "0"
146
187
  type: :runtime
147
188
  version_requirements: *id012
@@ -149,10 +190,11 @@ dependencies:
149
190
  name: json
150
191
  prerelease: false
151
192
  requirement: &id013 !ruby/object:Gem::Requirement
152
- none: false
153
193
  requirements:
154
194
  - - ">="
155
195
  - !ruby/object:Gem::Version
196
+ segments:
197
+ - 0
156
198
  version: "0"
157
199
  type: :runtime
158
200
  version_requirements: *id013
@@ -160,10 +202,13 @@ dependencies:
160
202
  name: warbler
161
203
  prerelease: false
162
204
  requirement: &id014 !ruby/object:Gem::Requirement
163
- none: false
164
205
  requirements:
165
206
  - - "="
166
207
  - !ruby/object:Gem::Version
208
+ segments:
209
+ - 1
210
+ - 2
211
+ - 1
167
212
  version: 1.2.1
168
213
  type: :development
169
214
  version_requirements: *id014
@@ -171,10 +216,13 @@ dependencies:
171
216
  name: diff-lcs
172
217
  prerelease: false
173
218
  requirement: &id015 !ruby/object:Gem::Requirement
174
- none: false
175
219
  requirements:
176
220
  - - "="
177
221
  - !ruby/object:Gem::Version
222
+ segments:
223
+ - 1
224
+ - 1
225
+ - 2
178
226
  version: 1.1.2
179
227
  type: :development
180
228
  version_requirements: *id015
@@ -182,10 +230,13 @@ dependencies:
182
230
  name: sinatra-reloader
183
231
  prerelease: false
184
232
  requirement: &id016 !ruby/object:Gem::Requirement
185
- none: false
186
233
  requirements:
187
234
  - - "="
188
235
  - !ruby/object:Gem::Version
236
+ segments:
237
+ - 0
238
+ - 5
239
+ - 0
189
240
  version: 0.5.0
190
241
  type: :development
191
242
  version_requirements: *id016
@@ -193,10 +244,12 @@ dependencies:
193
244
  name: rspec
194
245
  prerelease: false
195
246
  requirement: &id017 !ruby/object:Gem::Requirement
196
- none: false
197
247
  requirements:
198
248
  - - ~>
199
249
  - !ruby/object:Gem::Version
250
+ segments:
251
+ - 2
252
+ - 5
200
253
  version: "2.5"
201
254
  type: :development
202
255
  version_requirements: *id017
@@ -204,10 +257,13 @@ dependencies:
204
257
  name: rcov
205
258
  prerelease: false
206
259
  requirement: &id018 !ruby/object:Gem::Requirement
207
- none: false
208
260
  requirements:
209
261
  - - "="
210
262
  - !ruby/object:Gem::Version
263
+ segments:
264
+ - 0
265
+ - 9
266
+ - 9
211
267
  version: 0.9.9
212
268
  type: :development
213
269
  version_requirements: *id018
@@ -215,10 +271,13 @@ dependencies:
215
271
  name: rack-test
216
272
  prerelease: false
217
273
  requirement: &id019 !ruby/object:Gem::Requirement
218
- none: false
219
274
  requirements:
220
275
  - - "="
221
276
  - !ruby/object:Gem::Version
277
+ segments:
278
+ - 0
279
+ - 5
280
+ - 7
222
281
  version: 0.5.7
223
282
  type: :development
224
283
  version_requirements: *id019
@@ -263,6 +322,9 @@ files:
263
322
  - examples/websocket.html
264
323
  - examples/websocket.rb
265
324
  - lib/noah.rb
325
+ - lib/noah/agent.rb
326
+ - lib/noah/agents/dummy_agent.rb
327
+ - lib/noah/agents/http_agent.rb
266
328
  - lib/noah/app.rb
267
329
  - lib/noah/application_routes.rb
268
330
  - lib/noah/ark.rb
@@ -315,21 +377,23 @@ rdoc_options: []
315
377
  require_paths:
316
378
  - lib
317
379
  required_ruby_version: !ruby/object:Gem::Requirement
318
- none: false
319
380
  requirements:
320
381
  - - ">="
321
382
  - !ruby/object:Gem::Version
383
+ segments:
384
+ - 0
322
385
  version: "0"
323
386
  required_rubygems_version: !ruby/object:Gem::Requirement
324
- none: false
325
387
  requirements:
326
388
  - - ">="
327
389
  - !ruby/object:Gem::Version
390
+ segments:
391
+ - 0
328
392
  version: "0"
329
393
  requirements: []
330
394
 
331
395
  rubyforge_project: noah
332
- rubygems_version: 1.5.2
396
+ rubygems_version: 1.3.6
333
397
  signing_key:
334
398
  specification_version: 3
335
399
  summary: Application registry based on Apache Zookeeper