wires 0.1.0 → 0.1.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (4) hide show
  1. checksums.yaml +4 -4
  2. data/lib/wires/channels.rb +26 -16
  3. data/lib/wires/hub.rb +24 -26
  4. metadata +2 -2
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 84333d4617ce57228fdd29e5255aa9e30f1ce474
4
- data.tar.gz: 445840683d9422bae1292a8655253d32510cca87
3
+ metadata.gz: ddf7c26252b01261e552ad00ca7ae8dcc20515e8
4
+ data.tar.gz: 667a3598ae40b52aab46a79a30126a036894429e
5
5
  SHA512:
6
- metadata.gz: 68bc50ed50729dcae3f913cf9db1dcc36bdf112710a7c03d9dfcc76ab7da05fccfc83f6e65846e29169ba325d3dba30e100d3570efe589cbcac00c46aedbecd8
7
- data.tar.gz: eaa90eea5b0051e1f1f9b773b51aa14290b440d29ea54b3d08ae2883a92fc1f5aed96dc812bd8c6ad94316c9d887c2c12387a7186fbfcf19fbfc332c5947eb2d
6
+ metadata.gz: 9df8d83551265f447ae50263a7f0595439f26137dc926ea1c4cf6f660e052bb9be011dcf59debd88bcad453a0b4d1d85b99aceb1911cb768439726c7a1dd38e3
7
+ data.tar.gz: 73a9116f9118c88194b47882df37309d8ee024fd7628a1bfe56c6d4a791bdcf0e65a62a092266905e6a922b15f87ee5cc58fae650cccc22086d339a84ee4ec97
@@ -4,12 +4,12 @@ def on(events, channels='*', &codeblock)
4
4
  for channel in channels
5
5
  Channel(channel).register(events, codeblock)
6
6
  end
7
- end
7
+ nil end
8
8
 
9
9
 
10
10
  def fire(event, channel='*')
11
11
  Channel(channel).fire(event)
12
- end
12
+ nil end
13
13
 
14
14
 
15
15
  def Channel(*args) Channel.new(*args) end
@@ -23,23 +23,26 @@ class Channel
23
23
  @name = name
24
24
  @target_list = Set.new
25
25
  @@channel_list << self
26
- end
26
+ nil end
27
27
 
28
28
  # Ensure that there is only one instance of Channel per name
29
29
  @@channel_list = Set.new
30
+ @@new_lock = Mutex.new
30
31
  def self.new(*args, &block)
31
- (@@channel_list.select {|x| x.name == args[0]} [0]) \
32
- or super(*args, &block)
32
+ @@new_lock.synchronize do
33
+ (@@channel_list.select {|x|
34
+ (x.name==args[0] and x.name.class==args[0].class)} [0]) \
35
+ or super(*args, &block)
36
+ end
33
37
  end
34
38
 
35
39
  # Class-wide reference to the global channel and event hub
36
40
  @@channel_star = Channel('*')
37
- @@hub = Hub.new
38
41
 
39
42
  # Register a proc to be triggered by an event on this channel
40
43
  def register(events, proc)
41
44
 
42
- if not proc then raise SyntaxError, \
45
+ if not proc.is_a?(Proc) then raise SyntaxError, \
43
46
  "No Proc given to execute on event: #{events}" end
44
47
 
45
48
  # Convert all events to strings
@@ -49,8 +52,7 @@ class Channel
49
52
  events.uniq!
50
53
 
51
54
  @target_list << [events, proc]
52
- @target_list << [events, proc]
53
- end
55
+ nil end
54
56
 
55
57
  # Fire an event on this channel
56
58
  def fire(_event)
@@ -74,10 +76,10 @@ class Channel
74
76
  for chan in relevant_channels()
75
77
  for target in chan.target_list
76
78
  for string in target[0] & event.class.codestrings
77
- @@hub.enqueue([string, event, *target[1..-1]])
79
+ Hub << [string, event, *target[1..-1]]
78
80
  end end end
79
81
 
80
- end
82
+ nil end
81
83
 
82
84
  def relevant_channels
83
85
  return @@channel_list if self==@@channel_star
@@ -88,11 +90,19 @@ class Channel
88
90
 
89
91
  relevant = [@@channel_star, self]
90
92
  for c in @@channel_list
91
- relevant << c if case c.name
92
- when Regexp
93
- self.name =~ c.name
94
- else String
95
- self.name == c.name.to_s
93
+ for code in Event.from_codestring(self.name).codestrings
94
+ relevant << c if case c.name
95
+ when Regexp
96
+ code =~ c.name
97
+ when Event
98
+ code == c.name.class
99
+ when Class
100
+ c.name <= Event ?
101
+ code == c.name :
102
+ code == c.name.to_s
103
+ else
104
+ code == c.name.to_s
105
+ end
96
106
  end
97
107
  end
98
108
  return relevant.uniq
data/lib/wires/hub.rb CHANGED
@@ -3,28 +3,30 @@
3
3
  def puts(x) $stdout.puts(x) end
4
4
 
5
5
 
6
+ # An event hub. Event/proc associations come in, and the procs
7
+ # get called in new threads in the order received
6
8
  class Hub
7
- def initialize
8
- @queue = Queue.new
9
+ @@queue = Queue.new
10
+
11
+ def self._run
12
+ @@keepgoing = true
13
+
14
+ while @@keepgoing
15
+ if @@queue.empty? then sleep(0)
16
+ else _process_item(@@queue.shift) end
17
+ end
9
18
  end
10
19
 
11
- def self.new
12
- @instance ||= super
20
+ def self.run!
21
+ @@thread = Thread.new() {Hub._run}
22
+ at_exit { @@thread.join if not $! }
13
23
  end
14
24
 
15
- def kill!() @keepgoing=false end
25
+ def self.run_in_place!() self._run() end
16
26
 
17
- def run
18
- @keepgoing = true
19
-
20
- while @keepgoing
21
- if @queue.empty? then sleep(0)
22
- else _process_item(@queue.shift) end
23
- end
24
-
25
- end
27
+ def self.kill!() @@keepgoing=false end
26
28
 
27
- def _process_item(x)
29
+ def self._process_item(x)
28
30
  x, waiting_thread = x
29
31
  string, event, proc = x
30
32
  Thread.new do
@@ -43,24 +45,20 @@ class Hub
43
45
  end
44
46
  end
45
47
 
46
- def _unhandled_exception(x)
48
+ def self._unhandled_exception(x)
47
49
  $stderr.puts $!
48
50
  $stderr.puts $@
49
51
  end
50
52
 
51
- def fire(x)
52
- @queue << [x, Thread.current]
53
+ def self.fire(x)
54
+ @@queue << [x, Thread.current]
53
55
  sleep
54
56
  end
55
57
 
56
- def enqueue(x)
57
- fire x
58
- end
58
+ def self.enqueue(x) fire(x) end
59
+ def self.<<(x) fire(x) end
60
+
61
+ private_class_method :new
59
62
  end
60
63
 
61
64
 
62
- # Run the hub in a new thread and join it at main thread exit
63
- # However, do not join if an exception caused the exit -
64
- # Such an exception indicates usually an error in user code
65
- __hub_thread = Thread.new() {Hub.new.run}
66
- at_exit { __hub_thread.join if not $! }
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: wires
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.1.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Joe McIlvain
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2013-06-23 00:00:00.000000000 Z
11
+ date: 2013-06-24 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description: An asynchronous (threaded) event routing framework in Ruby. Patch your
14
14
  objects together with wires. Inspired by the python 'circuits' framework.