wires 0.2.9 → 0.3.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.
- checksums.yaml +4 -4
- data/lib/wires.rb +3 -1
- data/lib/wires/channel.rb +26 -18
- data/lib/wires/clean.rb +9 -0
- data/lib/wires/event.rb +1 -0
- data/lib/wires/hub.rb +52 -17
- data/lib/wires/time.rb +9 -4
- metadata +30 -1
    
        checksums.yaml
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            ---
         | 
| 2 2 | 
             
            SHA1:
         | 
| 3 | 
            -
              metadata.gz:  | 
| 4 | 
            -
              data.tar.gz:  | 
| 3 | 
            +
              metadata.gz: fe770b52bcfa8f3d4ebd9cdbc9474495cf518d40
         | 
| 4 | 
            +
              data.tar.gz: 504f5acec60a51e872a21e01730f0e624e6ce0af
         | 
| 5 5 | 
             
            SHA512:
         | 
| 6 | 
            -
              metadata.gz:  | 
| 7 | 
            -
              data.tar.gz:  | 
| 6 | 
            +
              metadata.gz: 1e2e093f083689a43817e88ca3eec0dd013d513eb072c2f95b4fa98131c23748e61f19830dbe949d8560e91c706a069859f5813d256ed793295bba039bfbb96f
         | 
| 7 | 
            +
              data.tar.gz: 2bfa6a3d6fe622e208ea61b41ae7dc40ca6ed3bb20dba0c07a4eab0e916301f1a4a13e760eb89857079f57e524c3794d25f5ea07196d047df053522152542f28
         | 
    
        data/lib/wires.rb
    CHANGED
    
    
    
        data/lib/wires/channel.rb
    CHANGED
    
    | @@ -1,24 +1,30 @@ | |
| 1 1 |  | 
| 2 | 
            -
             | 
| 3 | 
            -
               | 
| 4 | 
            -
             | 
| 5 | 
            -
                 | 
| 2 | 
            +
            module Wires
         | 
| 3 | 
            +
              module Convenience
         | 
| 4 | 
            +
                
         | 
| 5 | 
            +
                def on(events, channels='*', &codeblock)
         | 
| 6 | 
            +
                  channels = [channels] unless channels.is_a? Array
         | 
| 7 | 
            +
                  for channel in channels
         | 
| 8 | 
            +
                    Wires::Channel.new(channel).register(events, codeblock)
         | 
| 9 | 
            +
                  end
         | 
| 10 | 
            +
                nil end
         | 
| 11 | 
            +
                
         | 
| 12 | 
            +
                def fire(event, channel='*') 
         | 
| 13 | 
            +
                  Wires::Channel.new(channel).fire(event, blocking:false)
         | 
| 14 | 
            +
                nil end
         | 
| 15 | 
            +
                
         | 
| 16 | 
            +
                def fire_and_wait(event, channel='*') 
         | 
| 17 | 
            +
                  Wires::Channel.new(channel).fire(event, blocking:true)
         | 
| 18 | 
            +
                nil end
         | 
| 19 | 
            +
                
         | 
| 20 | 
            +
                def Channel(*args) Wires::Channel.new(*args) end
         | 
| 21 | 
            +
                
         | 
| 6 22 | 
             
              end
         | 
| 7 | 
            -
             | 
| 8 | 
            -
             | 
| 9 | 
            -
             | 
| 10 | 
            -
            def fire(event, channel='*') 
         | 
| 11 | 
            -
              Wires::Channel.new(channel).fire(event, blocking:false)
         | 
| 12 | 
            -
            nil end
         | 
| 23 | 
            +
            end
         | 
| 13 24 |  | 
| 14 | 
            -
            def fire_and_wait(event, channel='*') 
         | 
| 15 | 
            -
              Wires::Channel.new(channel).fire(event, blocking:true)
         | 
| 16 | 
            -
            nil end
         | 
| 17 | 
            -
             | 
| 18 | 
            -
             | 
| 19 | 
            -
            def Channel(*args) Wires::Channel.new(*args) end
         | 
| 20 25 |  | 
| 21 26 | 
             
            module Wires
         | 
| 27 | 
            +
              
         | 
| 22 28 | 
             
              class Channel
         | 
| 23 29 |  | 
| 24 30 | 
             
                attr_reader :name
         | 
| @@ -29,7 +35,6 @@ module Wires | |
| 29 35 | 
             
                  @target_list = Set.new
         | 
| 30 36 | 
             
                nil end
         | 
| 31 37 |  | 
| 32 | 
            -
                
         | 
| 33 38 | 
             
                # Redefine this class method to use an alternate Hub
         | 
| 34 39 | 
             
                def self.hub; Hub; end
         | 
| 35 40 | 
             
                # Don't redefine this instance method!
         | 
| @@ -74,6 +79,7 @@ module Wires | |
| 74 79 |  | 
| 75 80 | 
             
                # Fire an event on this channel
         | 
| 76 81 | 
             
                def fire(event, blocking:false)
         | 
| 82 | 
            +
                  backtrace = caller
         | 
| 77 83 |  | 
| 78 84 | 
             
                  # Create an instance object from one of several acceptable input forms
         | 
| 79 85 | 
             
                  event = Event.new_from event
         | 
| @@ -82,7 +88,7 @@ module Wires | |
| 82 88 | 
             
                  for chan in relevant_channels()
         | 
| 83 89 | 
             
                    for target in chan.target_list
         | 
| 84 90 | 
             
                      for string in target[0] & event.class.codestrings
         | 
| 85 | 
            -
                        self.class.hub.spawn(event, string, *target[1], blocking)
         | 
| 91 | 
            +
                        self.class.hub.spawn(event, string, *target[1], blocking, backtrace)
         | 
| 86 92 | 
             
                  end end end
         | 
| 87 93 |  | 
| 88 94 | 
             
                nil end
         | 
| @@ -108,5 +114,7 @@ module Wires | |
| 108 114 | 
             
                  end
         | 
| 109 115 | 
             
                  return relevant.uniq
         | 
| 110 116 | 
             
                end
         | 
| 117 | 
            +
                
         | 
| 111 118 | 
             
              end
         | 
| 119 | 
            +
              
         | 
| 112 120 | 
             
            end
         | 
    
        data/lib/wires/clean.rb
    ADDED
    
    
    
        data/lib/wires/event.rb
    CHANGED
    
    
    
        data/lib/wires/hub.rb
    CHANGED
    
    | @@ -1,5 +1,4 @@ | |
| 1 1 |  | 
| 2 | 
            -
            #TODO: Allow custom grain times
         | 
| 3 2 | 
             
            module Wires
         | 
| 4 3 | 
             
              # An Event Hub. Event/proc associations come in, and the procs 
         | 
| 5 4 | 
             
              # get called in new threads in the order received
         | 
| @@ -33,12 +32,8 @@ module Wires | |
| 33 32 |  | 
| 34 33 | 
             
                    @please_finish_all = false
         | 
| 35 34 |  | 
| 36 | 
            -
                     | 
| 37 | 
            -
             | 
| 38 | 
            -
                    end
         | 
| 39 | 
            -
                    @on_neglect_done = Proc.new do |args|
         | 
| 40 | 
            -
                      $stderr.puts "#{self} finally spawned neglected task: #{args.inspect}"
         | 
| 41 | 
            -
                    end
         | 
| 35 | 
            +
                    reset_neglect_procs
         | 
| 36 | 
            +
                    reset_handler_exception_proc
         | 
| 42 37 |  | 
| 43 38 | 
             
                    at_exit { (sleep 0.05 until dead?) unless $! }
         | 
| 44 39 |  | 
| @@ -101,22 +96,45 @@ module Wires | |
| 101 96 |  | 
| 102 97 | 
             
                  def on_neglect(&block)
         | 
| 103 98 | 
             
                    @on_neglect=block
         | 
| 104 | 
            -
                  end
         | 
| 99 | 
            +
                  nil end
         | 
| 105 100 | 
             
                  def on_neglect_done(&block)
         | 
| 106 101 | 
             
                    @on_neglect_done=block
         | 
| 102 | 
            +
                  nil end
         | 
| 103 | 
            +
                  def on_handler_exception(&block)
         | 
| 104 | 
            +
                    @on_handler_exception=block
         | 
| 105 | 
            +
                  end
         | 
| 106 | 
            +
                  
         | 
| 107 | 
            +
                  def reset_neglect_procs
         | 
| 108 | 
            +
                    @on_neglect = Proc.new do |args|
         | 
| 109 | 
            +
                      $stderr.puts "#{self} neglected to spawn task: #{args.inspect}"
         | 
| 110 | 
            +
                    end
         | 
| 111 | 
            +
                    @on_neglect_done = Proc.new do |args|
         | 
| 112 | 
            +
                      $stderr.puts "#{self} finally spawned neglected task: #{args.inspect}"
         | 
| 113 | 
            +
                    end
         | 
| 114 | 
            +
                  nil end
         | 
| 115 | 
            +
                  
         | 
| 116 | 
            +
                  def reset_handler_exception_proc
         | 
| 117 | 
            +
                    @on_handler_exception = Proc.new { raise }
         | 
| 107 118 | 
             
                  end
         | 
| 108 119 |  | 
| 109 120 | 
             
                  # Spawn a task
         | 
| 110 | 
            -
                  def spawn(*args) # :args: event, ch_string, proc, blocking
         | 
| 121 | 
            +
                  def spawn(*args) # :args: event, ch_string, proc, blocking, fire_bt
         | 
| 122 | 
            +
             | 
| 111 123 | 
             
                    @spawning_count_lock.synchronize { @spawning_count += 1 }
         | 
| 112 124 |  | 
| 113 125 | 
             
                    return neglect(*args) if dead?
         | 
| 114 126 |  | 
| 115 | 
            -
                    event, ch_string, proc, blocking = *args
         | 
| 127 | 
            +
                    event, ch_string, proc, blocking, fire_bt = *args
         | 
| 128 | 
            +
                    *exc_args = event, ch_string, fire_bt
         | 
| 116 129 |  | 
| 117 130 | 
             
                    # If blocking, run the proc in this thread
         | 
| 118 131 | 
             
                    if blocking
         | 
| 119 | 
            -
                       | 
| 132 | 
            +
                      begin
         | 
| 133 | 
            +
                        proc.call(event, ch_string)
         | 
| 134 | 
            +
                      rescue Exception => exc
         | 
| 135 | 
            +
                        unhandled_exception(exc, *exc_args)
         | 
| 136 | 
            +
                      end
         | 
| 137 | 
            +
                      
         | 
| 120 138 | 
             
                      return :done
         | 
| 121 139 | 
             
                    end
         | 
| 122 140 |  | 
| @@ -133,10 +151,17 @@ module Wires | |
| 133 151 | 
             
                        raise ThreadError if (@max_child_threads) and \
         | 
| 134 152 | 
             
                                             (@max_child_threads <= @child_threads.size)
         | 
| 135 153 | 
             
                        # Start the new child thread; follow with chain of neglected tasks
         | 
| 136 | 
            -
                        new_thread = Thread.new  | 
| 137 | 
            -
             | 
| 154 | 
            +
                        new_thread = Thread.new do
         | 
| 155 | 
            +
                          begin
         | 
| 156 | 
            +
                            proc.call(event, ch_string)
         | 
| 157 | 
            +
                            spawn_neglected_task_chain
         | 
| 158 | 
            +
                          rescue Exception => exc
         | 
| 159 | 
            +
                            unhandled_exception(exc, *exc_args)
         | 
| 160 | 
            +
                          end
         | 
| 161 | 
            +
                        end
         | 
| 162 | 
            +
                        
         | 
| 138 163 | 
             
                      # Capture ThreadError from either OS or user-set limitation
         | 
| 139 | 
            -
                      rescue ThreadError; return neglect(*args) | 
| 164 | 
            +
                      rescue ThreadError; return neglect(*args) end
         | 
| 140 165 |  | 
| 141 166 | 
             
                      @child_threads << new_thread
         | 
| 142 167 | 
             
                      return new_thread
         | 
| @@ -171,11 +196,21 @@ module Wires | |
| 171 196 | 
             
                  nil end
         | 
| 172 197 |  | 
| 173 198 | 
             
                private
         | 
| 199 | 
            +
                
         | 
| 200 | 
            +
                  # Send relevant data to a custom exception handler
         | 
| 201 | 
            +
                  def unhandled_exception(exception, event, ch_string, fire_bt)
         | 
| 202 | 
            +
                    
         | 
| 203 | 
            +
                    class << exception;  attr_reader :fire_backtrace; end
         | 
| 204 | 
            +
                    exception.instance_variable_set(:@fire_backtrace, fire_bt.dup)
         | 
| 205 | 
            +
                    
         | 
| 206 | 
            +
                    @on_handler_exception.call(exception, event, ch_string)
         | 
| 207 | 
            +
                    
         | 
| 208 | 
            +
                  end
         | 
| 174 209 |  | 
| 175 210 | 
             
                  # Temporarily neglect a task until resources are available to run it
         | 
| 176 211 | 
             
                  def neglect(*args)
         | 
| 177 212 | 
             
                    @neglected_lock.synchronize do
         | 
| 178 | 
            -
                      @on_neglect.call(args)
         | 
| 213 | 
            +
                      @on_neglect.call(*args)
         | 
| 179 214 | 
             
                      @neglected << args
         | 
| 180 215 | 
             
                    end
         | 
| 181 216 | 
             
                  false end
         | 
| @@ -187,7 +222,7 @@ module Wires | |
| 187 222 | 
             
                      ((@neglected.shift)[0...-1]<<true) # Call with blocking
         | 
| 188 223 | 
             
                    end
         | 
| 189 224 | 
             
                    spawn(*args)
         | 
| 190 | 
            -
                    @on_neglect_done.call(args)
         | 
| 225 | 
            +
                    @on_neglect_done.call(*args)
         | 
| 191 226 | 
             
                    spawn_neglected_task_chain
         | 
| 192 227 | 
             
                  nil end
         | 
| 193 228 |  | 
| @@ -200,7 +235,7 @@ module Wires | |
| 200 235 | 
             
                      end
         | 
| 201 236 | 
             
                      break if cease
         | 
| 202 237 | 
             
                      spawn(*args)
         | 
| 203 | 
            -
                      @on_neglect_done.call(args)
         | 
| 238 | 
            +
                      @on_neglect_done.call(*args)
         | 
| 204 239 | 
             
                    end
         | 
| 205 240 | 
             
                  nil end
         | 
| 206 241 |  | 
    
        data/lib/wires/time.rb
    CHANGED
    
    | @@ -1,5 +1,4 @@ | |
| 1 1 |  | 
| 2 | 
            -
             | 
| 3 2 | 
             
            module Wires
         | 
| 4 3 |  | 
| 5 4 | 
             
              class TimeSchedulerAnonEvent  < Event; end
         | 
| @@ -240,9 +239,15 @@ class ActiveSupport::Duration | |
| 240 239 |  | 
| 241 240 | 
             
            end
         | 
| 242 241 |  | 
| 243 | 
            -
             | 
| 244 | 
            -
               | 
| 245 | 
            -
                 | 
| 242 | 
            +
            module Wires
         | 
| 243 | 
            +
              module Convenience
         | 
| 244 | 
            +
                
         | 
| 245 | 
            +
                def fire_every(interval, event, channel='*', **kwargs)
         | 
| 246 | 
            +
                  Wires::TimeScheduler << \
         | 
| 247 | 
            +
                    Wires::TimeSchedulerItem.new(self, event, channel, **kwargs)
         | 
| 248 | 
            +
                end
         | 
| 249 | 
            +
                
         | 
| 250 | 
            +
              end
         | 
| 246 251 | 
             
            end
         | 
| 247 252 |  | 
| 248 253 | 
             
            # TODO: Repeatable event sugar?
         | 
    
        metadata
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            --- !ruby/object:Gem::Specification
         | 
| 2 2 | 
             
            name: wires
         | 
| 3 3 | 
             
            version: !ruby/object:Gem::Version
         | 
| 4 | 
            -
              version: 0. | 
| 4 | 
            +
              version: 0.3.0
         | 
| 5 5 | 
             
            platform: ruby
         | 
| 6 6 | 
             
            authors:
         | 
| 7 7 | 
             
            - Joe McIlvain
         | 
| @@ -66,6 +66,34 @@ dependencies: | |
| 66 66 | 
             
                - - '>='
         | 
| 67 67 | 
             
                  - !ruby/object:Gem::Version
         | 
| 68 68 | 
             
                    version: '0'
         | 
| 69 | 
            +
            - !ruby/object:Gem::Dependency
         | 
| 70 | 
            +
              name: turn
         | 
| 71 | 
            +
              requirement: !ruby/object:Gem::Requirement
         | 
| 72 | 
            +
                requirements:
         | 
| 73 | 
            +
                - - '>='
         | 
| 74 | 
            +
                  - !ruby/object:Gem::Version
         | 
| 75 | 
            +
                    version: '0'
         | 
| 76 | 
            +
              type: :development
         | 
| 77 | 
            +
              prerelease: false
         | 
| 78 | 
            +
              version_requirements: !ruby/object:Gem::Requirement
         | 
| 79 | 
            +
                requirements:
         | 
| 80 | 
            +
                - - '>='
         | 
| 81 | 
            +
                  - !ruby/object:Gem::Version
         | 
| 82 | 
            +
                    version: '0'
         | 
| 83 | 
            +
            - !ruby/object:Gem::Dependency
         | 
| 84 | 
            +
              name: starkfish
         | 
| 85 | 
            +
              requirement: !ruby/object:Gem::Requirement
         | 
| 86 | 
            +
                requirements:
         | 
| 87 | 
            +
                - - '>='
         | 
| 88 | 
            +
                  - !ruby/object:Gem::Version
         | 
| 89 | 
            +
                    version: '0'
         | 
| 90 | 
            +
              type: :development
         | 
| 91 | 
            +
              prerelease: false
         | 
| 92 | 
            +
              version_requirements: !ruby/object:Gem::Requirement
         | 
| 93 | 
            +
                requirements:
         | 
| 94 | 
            +
                - - '>='
         | 
| 95 | 
            +
                  - !ruby/object:Gem::Version
         | 
| 96 | 
            +
                    version: '0'
         | 
| 69 97 | 
             
            description: An asynchronous (threaded) event routing framework in Ruby. Patch your
         | 
| 70 98 | 
             
              objects together with wires. Inspired by the python 'circuits' framework.
         | 
| 71 99 | 
             
            email: joe.eli.mac@gmail.com
         | 
| @@ -77,6 +105,7 @@ files: | |
| 77 105 | 
             
            - lib/wires/time.rb
         | 
| 78 106 | 
             
            - lib/wires/hub.rb
         | 
| 79 107 | 
             
            - lib/wires/expect_type.rb
         | 
| 108 | 
            +
            - lib/wires/clean.rb
         | 
| 80 109 | 
             
            - lib/wires/channel.rb
         | 
| 81 110 | 
             
            - lib/wires/event.rb
         | 
| 82 111 | 
             
            - LICENSE
         |