pokan 0.2.3 → 0.2.4

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.
@@ -35,32 +35,26 @@ module Pokan
35
35
  message = JSON.parse(json_data)
36
36
  data = message['data']
37
37
 
38
- puts 'RECV'
39
38
  case message['action']
40
39
  when 'digest'
41
- puts "DIGEST from #{message['origin']}"
42
40
  pull = pull_message(data)
43
41
  send_datagram(pull, *message['origin'].split(':'))
44
42
 
45
43
  pull
46
44
  when 'pull'
47
- puts "PULL from #{message['origin']}"
48
45
  response = push_message(data['older'])
49
46
  merge(data['newer'])
50
47
  send_datagram(response, *message['origin'].split(':'))
51
48
 
52
49
  response
53
50
  when 'push'
54
- puts "PUSH from #{message['origin']}"
55
51
  merge(data)
56
52
  when 'hello'
57
- puts "HELLO from from #{message['origin']}"
58
53
  peer = Peer.new
59
54
  peer.id = message['origin']
60
55
  # peer.store(:role, message['role'])
61
56
  peer.save
62
57
  when 'goodbye'
63
- puts "GOODBYE from #{message['origin']}"
64
58
  peer = Query.new(Peer).where(id: message['origin'])[0]
65
59
  peer.store(:status, 'dead', message['timestamp'])
66
60
  peer.save
@@ -62,6 +62,7 @@ module Pokan
62
62
  def initialize(address)
63
63
  @event_handler = EventHandler.new
64
64
  @seed_address, @seed_port = '', ''
65
+ @periodics = []
65
66
  self.address = address
66
67
  self.udp_port = 5555
67
68
  super()
@@ -134,6 +135,19 @@ module Pokan
134
135
  register_event(event_name, &block) if AFTER_EVENTS.include? event
135
136
  end
136
137
 
138
+
139
+ # Adds behavior to the server, to be executed periodically (every given
140
+ # amount of seconds).
141
+ #
142
+ # server.every 2 do
143
+ # puts "Heya!"
144
+ # end
145
+ #
146
+ # Every 2 seconds "Heya!" will be printed out.
147
+ def every(seconds, &action)
148
+ @periodics << { :period => seconds, :action => action }
149
+ end
150
+
137
151
  # This method starts the server, which will bind specified TCP and UDP
138
152
  # ports (or 5555 by default). Optionally, you can pass the address of
139
153
  # another pokan instance (a seed), and the server will automatically
@@ -201,6 +215,7 @@ module Pokan
201
215
  def start_event_loop
202
216
  EventMachine.run {
203
217
  gossip
218
+ register_periodics
204
219
 
205
220
  RequestHandler.address = address
206
221
  RequestHandler.port = udp_port
@@ -213,6 +228,14 @@ module Pokan
213
228
  }
214
229
  end
215
230
 
231
+ def register_periodics
232
+ @periodics.each do |callback|
233
+ EventMachine.add_periodic_timer(callback[:period]) {
234
+ callback[:action].call
235
+ }
236
+ end
237
+ end
238
+
216
239
  def build_trap
217
240
  trap('INT') { prepare_to_die }
218
241
  trap('TERM') { prepare_to_die }
@@ -226,6 +249,7 @@ module Pokan
226
249
  def prepare_to_die
227
250
  say_goodbye(@seed_address, @seed_port)
228
251
  @event_handler.emit :shutdown
252
+ exit 0
229
253
  end
230
254
 
231
255
  def say_goodbye(address, port)
@@ -1,3 +1,3 @@
1
1
  module Pokan #:nodoc:
2
- VERSION = "0.2.3" unless defined? Pokan::VERSION
2
+ VERSION = "0.2.4" unless defined? Pokan::VERSION
3
3
  end
@@ -0,0 +1,39 @@
1
+ # Generated by jeweler
2
+ # DO NOT EDIT THIS FILE DIRECTLY
3
+ # Instead, edit Jeweler::Tasks in Rakefile, and run 'rake gemspec'
4
+ # -*- encoding: utf-8 -*-
5
+
6
+ Gem::Specification.new do |s|
7
+ s.name = "pokan"
8
+ s.version = "0.1.0rc1"
9
+
10
+ s.required_rubygems_version = Gem::Requirement.new("> 1.3.1") if s.respond_to? :required_rubygems_version=
11
+ s.authors = ["Renato Mascarenhas", "Rafael Regis do Prado", "Fabio Lima Pereira"]
12
+ s.date = "2011-11-10"
13
+ s.description = "pokan is an implementation of the Gossip protocol \n (best described in http://www.cs.cornell.edu/home/rvr/papers/flowgossip.pdf),\n which aims to have a simple, event based API capable of being used in large,\n not previously known networks."
14
+ s.email = "haze-gem@googlegroups.com"
15
+ s.homepage = "http://github.com/haze/pokan"
16
+ s.licenses = ["MIT"]
17
+ s.require_paths = ["lib"]
18
+ s.rubygems_version = "1.8.10"
19
+ s.summary = "Gossip-protocol implementation with an event based API"
20
+
21
+ if s.respond_to? :specification_version then
22
+ s.specification_version = 3
23
+
24
+ if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
25
+ s.add_runtime_dependency(%q<json>, [">= 0"])
26
+ s.add_runtime_dependency(%q<eventmachine>, [">= 0"])
27
+ s.add_runtime_dependency(%q<redis>, [">= 0"])
28
+ else
29
+ s.add_dependency(%q<json>, [">= 0"])
30
+ s.add_dependency(%q<eventmachine>, [">= 0"])
31
+ s.add_dependency(%q<redis>, [">= 0"])
32
+ end
33
+ else
34
+ s.add_dependency(%q<json>, [">= 0"])
35
+ s.add_dependency(%q<eventmachine>, [">= 0"])
36
+ s.add_dependency(%q<redis>, [">= 0"])
37
+ end
38
+ end
39
+
@@ -24,7 +24,7 @@ describe Pokan::Server do
24
24
 
25
25
  context 'when behavior is added to the server' do
26
26
 
27
- before { @server = Pokan::Server.new('10.10.10.8') }
27
+ before { @server = Pokan::Server.new('127.0.0.1') }
28
28
 
29
29
  it 'should properly call registered callbacks on events' do
30
30
  @block_called = false
@@ -35,6 +35,14 @@ describe Pokan::Server do
35
35
  @block_called.should be_true
36
36
  end
37
37
 
38
+ it 'should call registered, periodic behavior' do
39
+ @block_called = false
40
+ @server.every(2) { @block_called = true; @server.stop }
41
+
42
+ @server.start
43
+ @block_called.should be_true
44
+ end
45
+
38
46
  def add_behavior_to_event(event)
39
47
  @server.on event do |key, value|
40
48
  @block_called = true
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: pokan
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.3
4
+ version: 0.2.4
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -11,11 +11,11 @@ authors:
11
11
  autorequire:
12
12
  bindir: bin
13
13
  cert_chain: []
14
- date: 2011-11-15 00:00:00.000000000 Z
14
+ date: 2011-11-20 00:00:00.000000000 Z
15
15
  dependencies:
16
16
  - !ruby/object:Gem::Dependency
17
17
  name: json
18
- requirement: &4669280 !ruby/object:Gem::Requirement
18
+ requirement: &4607080 !ruby/object:Gem::Requirement
19
19
  none: false
20
20
  requirements:
21
21
  - - ! '>='
@@ -23,10 +23,10 @@ dependencies:
23
23
  version: '0'
24
24
  type: :runtime
25
25
  prerelease: false
26
- version_requirements: *4669280
26
+ version_requirements: *4607080
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: eventmachine
29
- requirement: &4689500 !ruby/object:Gem::Requirement
29
+ requirement: &4604620 !ruby/object:Gem::Requirement
30
30
  none: false
31
31
  requirements:
32
32
  - - ! '>='
@@ -34,10 +34,10 @@ dependencies:
34
34
  version: '0'
35
35
  type: :runtime
36
36
  prerelease: false
37
- version_requirements: *4689500
37
+ version_requirements: *4604620
38
38
  - !ruby/object:Gem::Dependency
39
39
  name: redis
40
- requirement: &4687940 !ruby/object:Gem::Requirement
40
+ requirement: &4675760 !ruby/object:Gem::Requirement
41
41
  none: false
42
42
  requirements:
43
43
  - - ! '>='
@@ -45,7 +45,7 @@ dependencies:
45
45
  version: '0'
46
46
  type: :runtime
47
47
  prerelease: false
48
- version_requirements: *4687940
48
+ version_requirements: *4675760
49
49
  description: ! "pokan is an implementation of the Gossip protocol \n (best described
50
50
  in http://www.cs.cornell.edu/home/rvr/papers/flowgossip.pdf),\n which aims to
51
51
  have a simple, event based API capable of being used in large,\n not previously
@@ -76,6 +76,7 @@ files:
76
76
  - lib/pokan/server.rb
77
77
  - lib/pokan/server_messages.rb
78
78
  - lib/pokan/version.rb
79
+ - pokan.gemspec
79
80
  - spec/pokan/connection_spec.rb
80
81
  - spec/pokan/entity_spec.rb
81
82
  - spec/pokan/event_handler_spec.rb
@@ -101,7 +102,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
101
102
  version: '0'
102
103
  segments:
103
104
  - 0
104
- hash: 3156693804676612369
105
+ hash: 2770225815694164353
105
106
  required_rubygems_version: !ruby/object:Gem::Requirement
106
107
  none: false
107
108
  requirements: