resque-pubsub 0.1.2 → 0.2.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.
- data/MIT-LICENSE +1 -1
- data/README.md +13 -13
- data/examples/resque-pubsub.rb +1 -1
- data/lib/resque-pubsub.rb +2 -6
- data/lib/resque/plugins/pubsub/broker.rb +22 -19
- data/lib/resque/plugins/pubsub/exchange.rb +29 -32
- data/lib/resque/plugins/pubsub/publisher.rb +8 -9
- data/lib/resque/plugins/pubsub/subscriber.rb +10 -11
- data/test/fixtures/test_custom_subscriber.rb +19 -0
- data/test/fixtures/test_publisher.rb +3 -0
- data/test/fixtures/test_subscriber.rb +19 -0
- data/test/pubsub_test.rb +35 -42
- data/test/test_helper.rb +8 -7
- metadata +8 -9
- data/test/debug.log +0 -16
- data/test/test_publisher.rb +0 -4
- data/test/test_subscriber.rb +0 -17
- data/test/test_subscriber_custom.rb +0 -17
    
        data/MIT-LICENSE
    CHANGED
    
    
    
        data/README.md
    CHANGED
    
    | @@ -11,26 +11,26 @@ Usage / Examples | |
| 11 11 |  | 
| 12 12 | 
             
            A simple class that can publish a message:
         | 
| 13 13 |  | 
| 14 | 
            -
             | 
| 15 | 
            -
             | 
| 14 | 
            +
                class TestPublisher
         | 
| 15 | 
            +
                  include Resque::Plugins::Pubsub::Publisher
         | 
| 16 16 |  | 
| 17 | 
            -
             | 
| 18 | 
            -
             | 
| 17 | 
            +
                  def some_method
         | 
| 18 | 
            +
                    self.publish(topic, message)
         | 
| 19 | 
            +
                  end
         | 
| 19 20 | 
             
                end
         | 
| 20 | 
            -
              end
         | 
| 21 21 |  | 
| 22 22 |  | 
| 23 23 | 
             
            A simple class that subscribes to messages on a particular topic:
         | 
| 24 24 |  | 
| 25 | 
            -
             | 
| 26 | 
            -
             | 
| 25 | 
            +
                class TestSubscriber
         | 
| 26 | 
            +
                  include Resque::Plugins::Pubsub::Subscriber
         | 
| 27 27 |  | 
| 28 | 
            -
             | 
| 28 | 
            +
                  subscribe 'test_topic'
         | 
| 29 29 |  | 
| 30 | 
            -
             | 
| 31 | 
            -
             | 
| 30 | 
            +
                  def self.read_test_topic_message(message)
         | 
| 31 | 
            +
                    # Do something with the message
         | 
| 32 | 
            +
                  end
         | 
| 32 33 | 
             
                end
         | 
| 33 | 
            -
              end
         | 
| 34 34 |  | 
| 35 35 |  | 
| 36 36 | 
             
            Customize & Extend
         | 
| @@ -63,13 +63,13 @@ Running Resque | |
| 63 63 | 
             
            A sample config file is provided in examples/resque-pubsub.rb. If you put this in config/initializers for a Rails app,
         | 
| 64 64 | 
             
            then Resque will default to the app namespace but will take an override on namespace from the environment variable RESQUE_NAMESPACE. Thus
         | 
| 65 65 |  | 
| 66 | 
            -
             | 
| 66 | 
            +
                QUEUE=* RESQUE_NAMESPACE="resque:pubsub" rake environment resque:work
         | 
| 67 67 |  | 
| 68 68 | 
             
            will run resque jobs against the default pubsub namespace (i.e., will be the pubsub server)
         | 
| 69 69 |  | 
| 70 70 | 
             
            while 
         | 
| 71 71 |  | 
| 72 | 
            -
             | 
| 72 | 
            +
                QUEUE=* rake environment resque:work
         | 
| 73 73 |  | 
| 74 74 | 
             
            will run resque in an app as normal.
         | 
| 75 75 |  | 
    
        data/examples/resque-pubsub.rb
    CHANGED
    
    | @@ -4,7 +4,7 @@ rails_root = ENV['RAILS_ROOT'] || File.dirname(__FILE__) + '/../../../..' | |
| 4 4 | 
             
            rails_env = ENV['RAILS_ENV'] || 'development'
         | 
| 5 5 |  | 
| 6 6 | 
             
            REDIS_CONFIG = YAML.load_file(rails_root + '/config/redis.yml')[rails_env]
         | 
| 7 | 
            -
            Resque.redis = REDIS_CONFIG[ | 
| 7 | 
            +
            Resque.redis = REDIS_CONFIG['host'] + ':' + REDIS_CONFIG["port"].to_s
         | 
| 8 8 |  | 
| 9 9 | 
             
            namespace = ENV['RESQUE_NAMESPACE'] || 'mynamespace' # Edit this to use a different namespace for Resque in the app
         | 
| 10 10 | 
             
            Resque.redis.namespace = namespace
         | 
    
        data/lib/resque-pubsub.rb
    CHANGED
    
    | @@ -1,6 +1,2 @@ | |
| 1 | 
            -
            require 'resque | 
| 2 | 
            -
             | 
| 3 | 
            -
            require 'resque/plugins/pubsub/broker'
         | 
| 4 | 
            -
            self.send(:include, Resque::Plugins::Pubsub::Subscriber)
         | 
| 5 | 
            -
            self.send(:include, Resque::Plugins::Pubsub::Publisher)
         | 
| 6 | 
            -
             | 
| 1 | 
            +
            require 'resque'
         | 
| 2 | 
            +
            Dir.glob(File.expand_path('resque/plugins/pubsub/*', File.dirname(__FILE__))).each { |filename| require filename }
         | 
| @@ -1,31 +1,34 @@ | |
| 1 1 | 
             
            module Resque
         | 
| 2 2 | 
             
              module Plugins
         | 
| 3 | 
            -
                #
         | 
| 4 | 
            -
                # pubsub broker
         | 
| 5 | 
            -
                #
         | 
| 6 3 | 
             
                module Pubsub
         | 
| 7 4 | 
             
                  class Broker
         | 
| 5 | 
            +
             | 
| 8 6 | 
             
                    @queue = :messages
         | 
| 9 7 | 
             
                    # Returns a top-level Redis connection so that the broker can distribute messages
         | 
| 10 8 | 
             
                    # across namespaces. If none has been created, will
         | 
| 11 9 | 
             
                    # create a new one using information from the Resque connection.
         | 
| 12 | 
            -
             | 
| 13 | 
            -
             | 
| 14 | 
            -
             | 
| 15 | 
            -
                       | 
| 16 | 
            -
                         | 
| 17 | 
            -
             | 
| 18 | 
            -
             | 
| 19 | 
            -
             | 
| 20 | 
            -
             | 
| 21 | 
            -
                       | 
| 22 | 
            -
                         | 
| 23 | 
            -
                         | 
| 24 | 
            -
             | 
| 25 | 
            -
             | 
| 26 | 
            -
             | 
| 10 | 
            +
             | 
| 11 | 
            +
                    class << self
         | 
| 12 | 
            +
             | 
| 13 | 
            +
                      def redis
         | 
| 14 | 
            +
                        return @redis if @redis
         | 
| 15 | 
            +
                        client_to_copy = Resque.redis.client
         | 
| 16 | 
            +
                        @redis = Redis.new(:host => client_to_copy.host, :port => client_to_copy.port, :thread_safe => true, :db => client_to_copy.db)
         | 
| 17 | 
            +
                      end
         | 
| 18 | 
            +
             | 
| 19 | 
            +
                      def perform(topic, message)
         | 
| 20 | 
            +
                        subscribers = Exchange.redis.smembers("#{topic}_subscribers")
         | 
| 21 | 
            +
                        subscribers.each do |s|
         | 
| 22 | 
            +
                          sinfo = JSON.parse(s)
         | 
| 23 | 
            +
                          puts "[Broker] distributing to #{sinfo.inspect}"
         | 
| 24 | 
            +
                          Broker.redis.sadd("#{sinfo['namespace']}:queues", "fanout:#{topic}")
         | 
| 25 | 
            +
                          Broker.redis.rpush("#{sinfo['namespace']}:queue:fanout:#{topic}", { :class => sinfo['class'], :args => [message] }.to_json)
         | 
| 26 | 
            +
                        end
         | 
| 27 | 
            +
                      end
         | 
| 28 | 
            +
             | 
| 27 29 | 
             
                    end
         | 
| 30 | 
            +
             | 
| 28 31 | 
             
                  end
         | 
| 29 32 | 
             
                end
         | 
| 30 33 | 
             
              end
         | 
| 31 | 
            -
            end
         | 
| 34 | 
            +
            end
         | 
| @@ -1,42 +1,39 @@ | |
| 1 | 
            -
            require 'resque'
         | 
| 2 1 | 
             
            module Resque
         | 
| 3 2 | 
             
              module Plugins
         | 
| 4 | 
            -
                #
         | 
| 5 | 
            -
                # pubsub exchange manager
         | 
| 6 | 
            -
                #
         | 
| 7 3 | 
             
                module Pubsub
         | 
| 8 4 | 
             
                  class Exchange
         | 
| 9 | 
            -
                    @@pubsub_namespace = nil
         | 
| 10 | 
            -
                    # Returns the current Redis connection. If none has been created, will
         | 
| 11 | 
            -
                    # create a new one using information from the Resque connection and our config.
         | 
| 12 | 
            -
                    def self.redis
         | 
| 13 | 
            -
                      return @redis if @redis
         | 
| 14 | 
            -
                      client_to_copy = Resque.redis.client
         | 
| 15 | 
            -
                      redis_new = Redis.new(:host => client_to_copy.host, :port => client_to_copy.port,
         | 
| 16 | 
            -
                        :thread_safe => true, :db => client_to_copy.db)
         | 
| 17 | 
            -
                      puts "making a redis in exchange, namespace will be #{@@pubsub_namespace}"
         | 
| 18 | 
            -
                      @redis = Redis::Namespace.new(@@pubsub_namespace || "resque:pubsub", :redis => redis_new)
         | 
| 19 | 
            -
                    end
         | 
| 20 5 |  | 
| 21 6 | 
             
                    @queue = :subscription_requests
         | 
| 22 | 
            -
             | 
| 23 | 
            -
                     | 
| 24 | 
            -
             | 
| 25 | 
            -
                       | 
| 26 | 
            -
             | 
| 27 | 
            -
             | 
| 28 | 
            -
             | 
| 29 | 
            -
             | 
| 30 | 
            -
             | 
| 31 | 
            -
             | 
| 32 | 
            -
             | 
| 33 | 
            -
             | 
| 34 | 
            -
             | 
| 35 | 
            -
             | 
| 36 | 
            -
             | 
| 37 | 
            -
             | 
| 38 | 
            -
                       | 
| 7 | 
            +
             | 
| 8 | 
            +
                    class << self
         | 
| 9 | 
            +
             | 
| 10 | 
            +
                      def redis
         | 
| 11 | 
            +
                        return @redis if @redis
         | 
| 12 | 
            +
                        client_to_copy = Resque.redis.client
         | 
| 13 | 
            +
                        redis_new = Redis.new(:host => client_to_copy.host, :port => client_to_copy.port, :thread_safe => true, :db => client_to_copy.db)
         | 
| 14 | 
            +
                        puts "[Exchange] making a redis in exchange, namespace will be #{@pubsub_namespace}"
         | 
| 15 | 
            +
                        @redis = Redis::Namespace.new(@pubsub_namespace || 'resque:pubsub', :redis => redis_new)
         | 
| 16 | 
            +
                      end
         | 
| 17 | 
            +
             | 
| 18 | 
            +
                      def perform(subscription_info)
         | 
| 19 | 
            +
                        puts '[Exchange] handling a subscription on the exchange'
         | 
| 20 | 
            +
                        puts "[Exchange] requested subscription is #{subscription_info.inspect}"
         | 
| 21 | 
            +
                        puts "[Exchange] namespace is #{Exchange.redis.namespace}"
         | 
| 22 | 
            +
                        Exchange.redis.sadd("#{subscription_info["topic"]}_subscribers", { :class => subscription_info['class'], :namespace => subscription_info['namespace'] }.to_json)
         | 
| 23 | 
            +
                      end
         | 
| 24 | 
            +
             | 
| 25 | 
            +
                      def pubsub_namespace
         | 
| 26 | 
            +
                        @pubsub_namespace
         | 
| 27 | 
            +
                      end
         | 
| 28 | 
            +
             | 
| 29 | 
            +
                      def pubsub_namespace=(namespace)
         | 
| 30 | 
            +
                        @pubsub_namespace = namespace
         | 
| 31 | 
            +
                        @redis.client.disconnect if @redis
         | 
| 32 | 
            +
                        @redis = nil
         | 
| 33 | 
            +
                      end
         | 
| 34 | 
            +
             | 
| 39 35 | 
             
                    end
         | 
| 36 | 
            +
             | 
| 40 37 | 
             
                  end
         | 
| 41 38 | 
             
                end
         | 
| 42 39 | 
             
              end
         | 
| @@ -1,23 +1,22 @@ | |
| 1 | 
            -
            require 'resque/plugins/pubsub/exchange'
         | 
| 2 1 | 
             
            module Resque
         | 
| 3 2 | 
             
              module Plugins
         | 
| 4 | 
            -
                #
         | 
| 5 | 
            -
                # pubsub publisher
         | 
| 6 | 
            -
                #
         | 
| 7 3 | 
             
                module Pubsub
         | 
| 8 4 | 
             
                  module Publisher
         | 
| 9 | 
            -
             | 
| 10 | 
            -
             | 
| 5 | 
            +
             | 
| 6 | 
            +
                    def self.included(base)
         | 
| 11 7 | 
             
                      base.send(:include, InstanceMethods)
         | 
| 12 8 | 
             
                    end
         | 
| 13 9 |  | 
| 14 10 | 
             
                    module InstanceMethods
         | 
| 11 | 
            +
                      
         | 
| 15 12 | 
             
                      def publish(topic, message)
         | 
| 16 | 
            -
                        puts " | 
| 17 | 
            -
                        Exchange.redis.sadd(:queues,  | 
| 18 | 
            -
                        Exchange.redis.rpush( | 
| 13 | 
            +
                        puts "[#{self.class.to_s}] publishing #{message} in #{topic}"
         | 
| 14 | 
            +
                        Exchange.redis.sadd(:queues, 'messages')
         | 
| 15 | 
            +
                        Exchange.redis.rpush('queue:messages', { :class => 'Resque::Plugins::Pubsub::Broker', :args => [topic, message] }.to_json)
         | 
| 19 16 | 
             
                      end
         | 
| 17 | 
            +
                      
         | 
| 20 18 | 
             
                    end
         | 
| 19 | 
            +
             | 
| 21 20 | 
             
                  end
         | 
| 22 21 | 
             
                end
         | 
| 23 22 | 
             
              end
         | 
| @@ -1,33 +1,32 @@ | |
| 1 | 
            -
            require 'resque/plugins/pubsub/exchange'
         | 
| 2 1 | 
             
            module Resque
         | 
| 3 2 | 
             
              module Plugins
         | 
| 4 | 
            -
                #
         | 
| 5 | 
            -
                # pubsub subscriber
         | 
| 6 | 
            -
                #
         | 
| 7 3 | 
             
                module Pubsub
         | 
| 8 4 | 
             
                  module Subscriber
         | 
| 9 | 
            -
             | 
| 10 | 
            -
             | 
| 5 | 
            +
             | 
| 6 | 
            +
                    def self.included(base)
         | 
| 7 | 
            +
                      base.send(:extend, ClassMethods)
         | 
| 11 8 | 
             
                    end
         | 
| 12 | 
            -
             | 
| 9 | 
            +
             | 
| 13 10 | 
             
                    module ClassMethods
         | 
| 11 | 
            +
                      
         | 
| 14 12 | 
             
                      def subscribe(topic, options={})
         | 
| 15 13 | 
             
                        @queue = "fanout:#{topic}"
         | 
| 16 14 | 
             
                        reader_method = options[:reader_method] || "read_#{topic}_message"
         | 
| 17 15 | 
             
                        module_eval <<-"end_eval"
         | 
| 18 16 | 
             
                          def self.perform(message)
         | 
| 19 | 
            -
                            self.send("#{reader_method}", message)
         | 
| 20 | 
            -
             | 
| 17 | 
            +
                            self.send("#{reader_method.to_s}", message)
         | 
| 18 | 
            +
                          end
         | 
| 21 19 | 
             
                        end_eval
         | 
| 22 20 | 
             
                        options[:namespace] = Resque.redis.namespace
         | 
| 23 21 | 
             
                        options[:topic] = topic
         | 
| 24 22 | 
             
                        options[:class] = self.to_s
         | 
| 25 | 
            -
                        puts " | 
| 23 | 
            +
                        puts "[#{self.to_s}] subscribing with #{options.inspect}"
         | 
| 26 24 | 
             
                        Exchange.redis.sadd(:queues, :subscription_requests)
         | 
| 27 | 
            -
                        Exchange.redis.rpush("queue:subscription_requests", {:class=>'Resque::Plugins::Pubsub::Exchange', :args=>[options]}.to_json)      
         | 
| 25 | 
            +
                        Exchange.redis.rpush("queue:subscription_requests", { :class => 'Resque::Plugins::Pubsub::Exchange', :args => [options] }.to_json)      
         | 
| 28 26 | 
             
                      end
         | 
| 29 27 |  | 
| 30 28 | 
             
                    end
         | 
| 29 | 
            +
             | 
| 31 30 | 
             
                  end
         | 
| 32 31 | 
             
                end
         | 
| 33 32 | 
             
              end
         | 
| @@ -0,0 +1,19 @@ | |
| 1 | 
            +
            class TestCustomSubscriber
         | 
| 2 | 
            +
              include Resque::Plugins::Pubsub::Subscriber
         | 
| 3 | 
            +
             | 
| 4 | 
            +
              subscribe 'test_custom_topic', :reader_method => :simple
         | 
| 5 | 
            +
             | 
| 6 | 
            +
              class << self
         | 
| 7 | 
            +
             | 
| 8 | 
            +
                def simple(message)
         | 
| 9 | 
            +
                  puts "[#{self.to_s}] got test custom topic message: #{message.inspect}"
         | 
| 10 | 
            +
                  @last_message = message
         | 
| 11 | 
            +
                end
         | 
| 12 | 
            +
             | 
| 13 | 
            +
                def last_message
         | 
| 14 | 
            +
                  @last_message
         | 
| 15 | 
            +
                end
         | 
| 16 | 
            +
             | 
| 17 | 
            +
              end
         | 
| 18 | 
            +
             | 
| 19 | 
            +
            end
         | 
| @@ -0,0 +1,19 @@ | |
| 1 | 
            +
            class TestSubscriber
         | 
| 2 | 
            +
              include Resque::Plugins::Pubsub::Subscriber
         | 
| 3 | 
            +
             | 
| 4 | 
            +
              subscribe 'test_topic'
         | 
| 5 | 
            +
             | 
| 6 | 
            +
              class << self
         | 
| 7 | 
            +
             | 
| 8 | 
            +
                def read_test_topic_message(message)
         | 
| 9 | 
            +
                  puts "[#{self.to_s}] got test topic message: #{message.inspect}"
         | 
| 10 | 
            +
                  @last_message = message
         | 
| 11 | 
            +
                end
         | 
| 12 | 
            +
             | 
| 13 | 
            +
                def last_message
         | 
| 14 | 
            +
                  @last_message
         | 
| 15 | 
            +
                end
         | 
| 16 | 
            +
             | 
| 17 | 
            +
              end
         | 
| 18 | 
            +
             | 
| 19 | 
            +
            end
         | 
    
        data/test/pubsub_test.rb
    CHANGED
    
    | @@ -1,8 +1,10 @@ | |
| 1 | 
            -
            require File.dirname(__FILE__) | 
| 1 | 
            +
            require File.expand_path('test_helper.rb', File.dirname(__FILE__))
         | 
| 2 2 |  | 
| 3 3 | 
             
            class PubsubTest < Test::Unit::TestCase
         | 
| 4 | 
            +
             | 
| 4 5 | 
             
              def setup
         | 
| 5 6 | 
             
                $success = $lock_failed = $lock_expired = 0
         | 
| 7 | 
            +
                Resque.redis.namespace = nil
         | 
| 6 8 | 
             
                Resque.redis.flushall
         | 
| 7 9 | 
             
                Resque.redis.namespace = 'test_pubsub'
         | 
| 8 10 | 
             
              end
         | 
| @@ -12,72 +14,63 @@ class PubsubTest < Test::Unit::TestCase | |
| 12 14 | 
             
                  Resque::Plugin.lint(Resque::Plugins::Pubsub)
         | 
| 13 15 | 
             
                end
         | 
| 14 16 | 
             
              end
         | 
| 15 | 
            -
             | 
| 17 | 
            +
             | 
| 16 18 | 
             
              def test_all
         | 
| 17 | 
            -
                 | 
| 18 | 
            -
                require 'test_publisher'
         | 
| 19 | 
            -
                require 'test_subscriber'
         | 
| 19 | 
            +
                TestSubscriber.subscribe('test_topic')
         | 
| 20 20 | 
             
                # Now process the subscription
         | 
| 21 21 | 
             
                Resque.redis.namespace = 'resque:pubsub'
         | 
| 22 | 
            -
                 | 
| 23 | 
            -
                @worker.process
         | 
| 22 | 
            +
                Resque::Worker.new(:subscription_requests).process
         | 
| 24 23 | 
             
                # Check that the subscription is in the subscribers list
         | 
| 25 | 
            -
                assert  | 
| 24 | 
            +
                assert subscription_exists(Resque.redis.smembers('test_topic_subscribers'), 'TestSubscriber', 'test_pubsub')
         | 
| 25 | 
            +
              
         | 
| 26 26 | 
             
                p = TestPublisher.new
         | 
| 27 | 
            -
                p.publish( | 
| 27 | 
            +
                p.publish('test_topic', 'Test message')
         | 
| 28 28 | 
             
                # Run Resque for the broker
         | 
| 29 29 | 
             
                Resque.redis.namespace = 'resque:pubsub'
         | 
| 30 | 
            -
                 | 
| 31 | 
            -
                @worker.process
         | 
| 30 | 
            +
                Resque::Worker.new(:messages).process
         | 
| 32 31 | 
             
                # Check that the message queue has been populated
         | 
| 33 32 | 
             
                Resque.redis.namespace = 'test_pubsub'
         | 
| 34 33 | 
             
                assert Resque.redis.keys.include?('queue:fanout:test_topic')
         | 
| 35 | 
            -
                 | 
| 34 | 
            +
                assert_equal 1, Resque.redis.llen('queue:fanout:test_topic')
         | 
| 35 | 
            +
                
         | 
| 36 36 | 
             
                # Now run the subscriber Resque
         | 
| 37 | 
            -
                 | 
| 38 | 
            -
                 | 
| 39 | 
            -
                 | 
| 40 | 
            -
                assert TestSubscriber.last_message=='Test message'
         | 
| 37 | 
            +
                Resque::Worker.new('fanout:test_topic').process
         | 
| 38 | 
            +
                assert_equal 0, Resque.redis.llen('queue:fanout:test_topic')
         | 
| 39 | 
            +
                assert_equal 'Test message', TestSubscriber.last_message
         | 
| 41 40 | 
             
              end
         | 
| 42 | 
            -
             | 
| 41 | 
            +
             | 
| 43 42 | 
             
              def test_configuration_options
         | 
| 44 | 
            -
                # Configure the pubsub namespace
         | 
| 45 | 
            -
                require 'resque-pubsub'
         | 
| 46 43 | 
             
                Resque::Plugins::Pubsub::Exchange.pubsub_namespace = 'resque:custom_space'
         | 
| 47 | 
            -
                 | 
| 48 | 
            -
                require 'test_publisher'
         | 
| 49 | 
            -
                require 'test_subscriber'
         | 
| 50 | 
            -
                require 'test_subscriber_custom'
         | 
| 44 | 
            +
                TestCustomSubscriber.subscribe('test_custom_topic', :reader_method => :simple)
         | 
| 51 45 | 
             
                # Now process the subscription
         | 
| 52 46 | 
             
                Resque.redis.namespace = 'resque:custom_space'
         | 
| 53 | 
            -
                 | 
| 54 | 
            -
                @worker.process
         | 
| 47 | 
            +
                Resque::Worker.new(:subscription_requests).process
         | 
| 55 48 | 
             
                # Check that the subscription is in the subscribers list
         | 
| 56 | 
            -
                assert  | 
| 57 | 
            -
                 | 
| 58 | 
            -
                 | 
| 49 | 
            +
                assert subscription_exists(Resque.redis.smembers('test_custom_topic_subscribers'), 'TestCustomSubscriber', 'test_pubsub')
         | 
| 50 | 
            +
                
         | 
| 51 | 
            +
                TestPublisher.new.publish('test_custom_topic', 'Test custom message')
         | 
| 59 52 | 
             
                # Run Resque for the broker
         | 
| 60 53 | 
             
                Resque.redis.namespace = 'resque:custom_space'
         | 
| 61 | 
            -
                 | 
| 62 | 
            -
                @worker.process
         | 
| 54 | 
            +
                Resque::Worker.new(:messages).process
         | 
| 63 55 | 
             
                # Check that the message queue has been populated
         | 
| 64 56 | 
             
                Resque.redis.namespace = 'test_pubsub'
         | 
| 65 57 | 
             
                assert Resque.redis.keys.include?('queue:fanout:test_custom_topic')
         | 
| 66 | 
            -
                 | 
| 58 | 
            +
                assert_equal 1, Resque.redis.llen('queue:fanout:test_custom_topic')
         | 
| 59 | 
            +
                
         | 
| 67 60 | 
             
                # Now run the subscriber Resque
         | 
| 68 | 
            -
                 | 
| 69 | 
            -
                 | 
| 70 | 
            -
                 | 
| 71 | 
            -
                 | 
| 72 | 
            -
                # Also make sure TestSubscriber DIDN'T get the message
         | 
| 73 | 
            -
                assert TestSubscriber.last_message!='Test custom message'
         | 
| 61 | 
            +
                Resque::Worker.new('fanout:test_custom_topic').process
         | 
| 62 | 
            +
                assert_equal 0, Resque.redis.llen('queue:fanout:test_custom_topic')
         | 
| 63 | 
            +
                assert_equal 'Test custom message', TestCustomSubscriber.last_message
         | 
| 64 | 
            +
                assert_not_equal 'Test custom message', TestSubscriber.last_message
         | 
| 74 65 | 
             
              end
         | 
| 66 | 
            +
             | 
| 67 | 
            +
              private
         | 
| 75 68 |  | 
| 76 | 
            -
              def  | 
| 77 | 
            -
                subscribers.inject(false)  | 
| 69 | 
            +
              def subscription_exists(subscribers, klass, namespace)
         | 
| 70 | 
            +
                subscribers.inject(false) do |result, s|
         | 
| 78 71 | 
             
                  sinfo = JSON.parse(s)
         | 
| 79 | 
            -
                  result = result || (sinfo[ | 
| 80 | 
            -
                 | 
| 72 | 
            +
                  result = result || (sinfo['class'] == klass && sinfo['namespace'] == namespace)
         | 
| 73 | 
            +
                end
         | 
| 81 74 | 
             
              end
         | 
| 82 75 |  | 
| 83 | 
            -
            end
         | 
| 76 | 
            +
            end
         | 
    
        data/test/test_helper.rb
    CHANGED
    
    | @@ -10,15 +10,13 @@ require 'active_support/test_case' | |
| 10 10 |  | 
| 11 11 | 
             
            require 'resque-pubsub'
         | 
| 12 12 |  | 
| 13 | 
            -
            ##
         | 
| 14 13 | 
             
            # make sure we can run redis
         | 
| 15 | 
            -
            if !system( | 
| 14 | 
            +
            if !system('which redis-server')
         | 
| 16 15 | 
             
              puts '', "** can't find `redis-server` in your path"
         | 
| 17 16 | 
             
              puts "** try running `sudo rake install`"
         | 
| 18 17 | 
             
              abort ''
         | 
| 19 18 | 
             
            end
         | 
| 20 19 |  | 
| 21 | 
            -
            ##
         | 
| 22 20 | 
             
            # start our own redis when the tests start,
         | 
| 23 21 | 
             
            # kill it when they end
         | 
| 24 22 | 
             
            at_exit do
         | 
| @@ -31,12 +29,15 @@ at_exit do | |
| 31 29 | 
             
              end
         | 
| 32 30 |  | 
| 33 31 | 
             
              pid = `ps -e -o pid,command | grep [r]edis-test`.split(" ")[0]
         | 
| 34 | 
            -
              puts  | 
| 32 | 
            +
              puts 'Killing test redis server...'
         | 
| 35 33 | 
             
              `rm -f #{dir}/dump.rdb`
         | 
| 36 | 
            -
              Process.kill( | 
| 34 | 
            +
              Process.kill('KILL', pid.to_i)
         | 
| 37 35 | 
             
              exit exit_code
         | 
| 38 36 | 
             
            end
         | 
| 39 37 |  | 
| 40 | 
            -
            puts  | 
| 38 | 
            +
            puts 'Starting redis for testing at localhost:9736...'
         | 
| 41 39 | 
             
            `redis-server #{dir}/redis-test.conf`
         | 
| 42 | 
            -
            Resque.redis = '127.0.0.1:9736'
         | 
| 40 | 
            +
            Resque.redis = '127.0.0.1:9736'
         | 
| 41 | 
            +
            Resque.redis.namespace = 'test_pubsub'
         | 
| 42 | 
            +
             | 
| 43 | 
            +
            Dir.glob(File.expand_path(dir + '/fixtures/*')).each { |filename| require filename }
         | 
    
        metadata
    CHANGED
    
    | @@ -1,13 +1,13 @@ | |
| 1 1 | 
             
            --- !ruby/object:Gem::Specification 
         | 
| 2 2 | 
             
            name: resque-pubsub
         | 
| 3 3 | 
             
            version: !ruby/object:Gem::Version 
         | 
| 4 | 
            -
              hash:  | 
| 4 | 
            +
              hash: 23
         | 
| 5 5 | 
             
              prerelease: false
         | 
| 6 6 | 
             
              segments: 
         | 
| 7 7 | 
             
              - 0
         | 
| 8 | 
            -
              - 1
         | 
| 9 8 | 
             
              - 2
         | 
| 10 | 
            -
               | 
| 9 | 
            +
              - 0
         | 
| 10 | 
            +
              version: 0.2.0
         | 
| 11 11 | 
             
            platform: ruby
         | 
| 12 12 | 
             
            authors: 
         | 
| 13 13 | 
             
            - Monica McArthur
         | 
| @@ -15,7 +15,7 @@ autorequire: | |
| 15 15 | 
             
            bindir: bin
         | 
| 16 16 | 
             
            cert_chain: []
         | 
| 17 17 |  | 
| 18 | 
            -
            date: 2011-04- | 
| 18 | 
            +
            date: 2011-04-12 00:00:00 -07:00
         | 
| 19 19 | 
             
            default_executable: 
         | 
| 20 20 | 
             
            dependencies: 
         | 
| 21 21 | 
             
            - !ruby/object:Gem::Dependency 
         | 
| @@ -34,7 +34,7 @@ dependencies: | |
| 34 34 | 
             
                    version: 1.9.10
         | 
| 35 35 | 
             
              type: :runtime
         | 
| 36 36 | 
             
              version_requirements: *id001
         | 
| 37 | 
            -
            description: " | 
| 37 | 
            +
            description: "    A Resque plugin. Provides a lightweight publish/subscribe messaging system, with message persistence when clients are down.\n"
         | 
| 38 38 | 
             
            email: mechaferret@gmail.com
         | 
| 39 39 | 
             
            executables: []
         | 
| 40 40 |  | 
| @@ -53,13 +53,12 @@ files: | |
| 53 53 | 
             
            - lib/resque/plugins/pubsub/publisher.rb
         | 
| 54 54 | 
             
            - lib/resque/plugins/pubsub/subscriber.rb
         | 
| 55 55 | 
             
            - lib/resque-pubsub.rb
         | 
| 56 | 
            -
            - test/ | 
| 56 | 
            +
            - test/fixtures/test_custom_subscriber.rb
         | 
| 57 | 
            +
            - test/fixtures/test_publisher.rb
         | 
| 58 | 
            +
            - test/fixtures/test_subscriber.rb
         | 
| 57 59 | 
             
            - test/pubsub_test.rb
         | 
| 58 60 | 
             
            - test/redis-test.conf
         | 
| 59 61 | 
             
            - test/test_helper.rb
         | 
| 60 | 
            -
            - test/test_publisher.rb
         | 
| 61 | 
            -
            - test/test_subscriber.rb
         | 
| 62 | 
            -
            - test/test_subscriber_custom.rb
         | 
| 63 62 | 
             
            has_rdoc: true
         | 
| 64 63 | 
             
            homepage: http://github.com/mechaferret/resque-pubsub
         | 
| 65 64 | 
             
            licenses: []
         | 
    
        data/test/debug.log
    DELETED
    
    | @@ -1,16 +0,0 @@ | |
| 1 | 
            -
            # Logfile created on Thu Jan 20 18:20:02 -0800 2011 by logger.rb/22285
         | 
| 2 | 
            -
              [4;36;1mSQL (0.2ms)[0m   [0;1mSET SQL_AUTO_IS_NULL=0[0m
         | 
| 3 | 
            -
              [4;35;1mSQL (0.3ms)[0m   [0mSHOW TABLES[0m
         | 
| 4 | 
            -
              [4;36;1mSQL (430.6ms)[0m   [0;1mCREATE TABLE `transactionals` (`id` int(11) DEFAULT NULL auto_increment PRIMARY KEY, `name` varchar(255), `description` varchar(255), `other_id` int(11)) ENGINE=InnoDB[0m
         | 
| 5 | 
            -
              [4;35;1mSQL (0.4ms)[0m   [0mSHOW TABLES[0m
         | 
| 6 | 
            -
              [4;36;1mSQL (114.4ms)[0m   [0;1mCREATE TABLE `transactional_facts` (`id` int(11) DEFAULT NULL auto_increment PRIMARY KEY, `name` varchar(255), `description` varchar(255), `other_id` int(11)) ENGINE=InnoDB[0m
         | 
| 7 | 
            -
              [4;35;1mSQL (0.4ms)[0m   [0mSHOW TABLES[0m
         | 
| 8 | 
            -
              [4;36;1mSQL (102.1ms)[0m   [0;1mCREATE TABLE `schema_migrations` (`version` varchar(255) NOT NULL) ENGINE=InnoDB[0m
         | 
| 9 | 
            -
              [4;35;1mSQL (172.5ms)[0m   [0mCREATE UNIQUE INDEX `unique_schema_migrations` ON `schema_migrations` (`version`)[0m
         | 
| 10 | 
            -
              [4;36;1mSQL (0.4ms)[0m   [0;1mSHOW TABLES[0m
         | 
| 11 | 
            -
              [4;35;1mSQL (0.1ms)[0m   [0mSELECT version FROM `schema_migrations`[0m
         | 
| 12 | 
            -
              [4;36;1mSQL (0.4ms)[0m   [0;1mINSERT INTO `schema_migrations` (version) VALUES ('3')[0m
         | 
| 13 | 
            -
              [4;35;1mTransactional Columns (38.0ms)[0m   [0mSHOW FIELDS FROM `transactionals`[0m
         | 
| 14 | 
            -
              [4;36;1mSQL (0.3ms)[0m   [0;1mBEGIN[0m
         | 
| 15 | 
            -
              [4;35;1mTransactional Create (0.3ms)[0m   [0mINSERT INTO `transactionals` (`name`, `other_id`, `description`) VALUES(NULL, NULL, NULL)[0m
         | 
| 16 | 
            -
              [4;36;1mSQL (0.7ms)[0m   [0;1mCOMMIT[0m
         | 
    
        data/test/test_publisher.rb
    DELETED
    
    
    
        data/test/test_subscriber.rb
    DELETED
    
    | @@ -1,17 +0,0 @@ | |
| 1 | 
            -
            class TestSubscriber
         | 
| 2 | 
            -
              require 'resque-pubsub'
         | 
| 3 | 
            -
              
         | 
| 4 | 
            -
              subscribe 'test_topic'
         | 
| 5 | 
            -
              
         | 
| 6 | 
            -
              @@last_message = nil
         | 
| 7 | 
            -
              
         | 
| 8 | 
            -
              def self.read_test_topic_message(message)
         | 
| 9 | 
            -
                puts "got test topic message: #{message.inspect}"
         | 
| 10 | 
            -
                @@last_message = message
         | 
| 11 | 
            -
              end
         | 
| 12 | 
            -
              
         | 
| 13 | 
            -
              def self.last_message
         | 
| 14 | 
            -
                @@last_message
         | 
| 15 | 
            -
              end
         | 
| 16 | 
            -
              
         | 
| 17 | 
            -
            end
         | 
| @@ -1,17 +0,0 @@ | |
| 1 | 
            -
            class TestSubscriberCustom
         | 
| 2 | 
            -
              require 'resque-pubsub'
         | 
| 3 | 
            -
              
         | 
| 4 | 
            -
              subscribe 'test_custom_topic', :reader_method => 'simple'
         | 
| 5 | 
            -
              
         | 
| 6 | 
            -
              @@last_message = nil
         | 
| 7 | 
            -
              
         | 
| 8 | 
            -
              def self.simple(message)
         | 
| 9 | 
            -
                puts "in simple, got test custom topic message: #{message.inspect}"
         | 
| 10 | 
            -
                @@last_message = message
         | 
| 11 | 
            -
              end
         | 
| 12 | 
            -
              
         | 
| 13 | 
            -
              def self.last_message
         | 
| 14 | 
            -
                @@last_message
         | 
| 15 | 
            -
              end
         | 
| 16 | 
            -
              
         | 
| 17 | 
            -
            end
         |