que 0.5.0 → 0.6.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/.gitignore +1 -1
- data/.travis.yml +1 -1
- data/CHANGELOG.md +21 -1
- data/Gemfile +5 -0
- data/README.md +7 -6
- data/docs/advanced_setup.md +14 -4
- data/docs/customizing_que.md +4 -4
- data/docs/error_handling.md +13 -1
- data/docs/managing_workers.md +2 -2
- data/docs/migrating.md +26 -0
- data/docs/multiple_queues.md +13 -0
- data/docs/shutting_down_safely.md +7 -0
- data/docs/writing_reliable_jobs.md +43 -0
- data/lib/generators/que/templates/add_que.rb +1 -1
- data/lib/que.rb +27 -41
- data/lib/que/adapters/base.rb +75 -4
- data/lib/que/job.rb +45 -28
- data/lib/que/migrations.rb +3 -2
- data/lib/que/migrations/{1-down.sql → 1/down.sql} +0 -0
- data/lib/que/migrations/{1-up.sql → 1/up.sql} +0 -0
- data/lib/que/migrations/{2-down.sql → 2/down.sql} +0 -0
- data/lib/que/migrations/{2-up.sql → 2/up.sql} +0 -0
- data/lib/que/migrations/3/down.sql +5 -0
- data/lib/que/migrations/3/up.sql +5 -0
- data/lib/que/sql.rb +24 -17
- data/lib/que/version.rb +1 -1
- data/lib/que/worker.rb +6 -5
- data/spec/adapters/active_record_spec.rb +6 -6
- data/spec/adapters/sequel_spec.rb +4 -4
- data/spec/gemfiles/Gemfile1 +18 -0
- data/spec/gemfiles/Gemfile2 +18 -0
- data/spec/support/helpers.rb +2 -1
- data/spec/support/shared_examples/adapter.rb +7 -3
- data/spec/support/shared_examples/multi_threaded_adapter.rb +2 -2
- data/spec/travis.rb +12 -4
- data/spec/unit/customization_spec.rb +148 -0
- data/spec/unit/{queue_spec.rb → enqueue_spec.rb} +115 -14
- data/spec/unit/logging_spec.rb +3 -2
- data/spec/unit/migrations_spec.rb +3 -2
- data/spec/unit/pool_spec.rb +30 -6
- data/spec/unit/run_spec.rb +12 -0
- data/spec/unit/states_spec.rb +29 -31
- data/spec/unit/stats_spec.rb +16 -14
- data/spec/unit/work_spec.rb +120 -25
- data/spec/unit/worker_spec.rb +55 -9
- data/tasks/safe_shutdown.rb +1 -1
- metadata +30 -17
| @@ -17,7 +17,7 @@ describe "Que using the Sequel adapter" do | |
| 17 17 | 
             
                    end
         | 
| 18 18 | 
             
                  end
         | 
| 19 19 |  | 
| 20 | 
            -
                  SequelJob. | 
| 20 | 
            +
                  SequelJob.enqueue
         | 
| 21 21 | 
             
                  Que::Job.work
         | 
| 22 22 |  | 
| 23 23 | 
             
                  $pid1.should == $pid2
         | 
| @@ -31,17 +31,17 @@ describe "Que using the Sequel adapter" do | |
| 31 31 | 
             
                sleep_until { Que::Worker.workers.all? &:sleeping? }
         | 
| 32 32 |  | 
| 33 33 | 
             
                # Wakes a worker immediately when not in a transaction.
         | 
| 34 | 
            -
                Que::Job. | 
| 34 | 
            +
                Que::Job.enqueue
         | 
| 35 35 | 
             
                sleep_until { Que::Worker.workers.all?(&:sleeping?) && DB[:que_jobs].empty? }
         | 
| 36 36 |  | 
| 37 37 | 
             
                SEQUEL_ADAPTER_DB.transaction do
         | 
| 38 | 
            -
                  Que::Job. | 
| 38 | 
            +
                  Que::Job.enqueue
         | 
| 39 39 | 
             
                  Que::Worker.workers.each { |worker| worker.should be_sleeping }
         | 
| 40 40 | 
             
                end
         | 
| 41 41 | 
             
                sleep_until { Que::Worker.workers.all?(&:sleeping?) && DB[:que_jobs].empty? }
         | 
| 42 42 |  | 
| 43 43 | 
             
                # Do nothing when queueing with a specific :run_at.
         | 
| 44 | 
            -
                BlockJob. | 
| 44 | 
            +
                BlockJob.enqueue :run_at => Time.now
         | 
| 45 45 | 
             
                Que::Worker.workers.each { |worker| worker.should be_sleeping }
         | 
| 46 46 | 
             
              end
         | 
| 47 47 |  | 
| @@ -0,0 +1,18 @@ | |
| 1 | 
            +
            source 'https://rubygems.org'
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            gem 'que', path: '../..'
         | 
| 4 | 
            +
             | 
| 5 | 
            +
            group :development, :test do
         | 
| 6 | 
            +
              gem 'rake'
         | 
| 7 | 
            +
             | 
| 8 | 
            +
              gem 'activerecord',    '~> 3.2', :require => nil
         | 
| 9 | 
            +
              gem 'sequel',          '~> 3', :require => nil
         | 
| 10 | 
            +
              gem 'connection_pool', :require => nil
         | 
| 11 | 
            +
              gem 'pg',              :require => nil, :platform => :ruby
         | 
| 12 | 
            +
              gem 'pg_jruby',        :require => nil, :platform => :jruby
         | 
| 13 | 
            +
            end
         | 
| 14 | 
            +
             | 
| 15 | 
            +
            group :test do
         | 
| 16 | 
            +
              gem 'rspec', '~> 2.14.1'
         | 
| 17 | 
            +
              gem 'pry'
         | 
| 18 | 
            +
            end
         | 
| @@ -0,0 +1,18 @@ | |
| 1 | 
            +
            source 'https://rubygems.org'
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            gem 'que', path: "../.."
         | 
| 4 | 
            +
             | 
| 5 | 
            +
            group :development, :test do
         | 
| 6 | 
            +
              gem 'rake'
         | 
| 7 | 
            +
             | 
| 8 | 
            +
              gem 'activerecord',    '~> 4.0', :require => nil
         | 
| 9 | 
            +
              gem 'sequel',          '~> 4', :require => nil
         | 
| 10 | 
            +
              gem 'connection_pool', :require => nil
         | 
| 11 | 
            +
              gem 'pg',              :require => nil, :platform => :ruby
         | 
| 12 | 
            +
              gem 'pg_jruby',        :require => nil, :platform => :jruby
         | 
| 13 | 
            +
            end
         | 
| 14 | 
            +
             | 
| 15 | 
            +
            group :test do
         | 
| 16 | 
            +
              gem 'rspec', '~> 2.14.1'
         | 
| 17 | 
            +
              gem 'pry'
         | 
| 18 | 
            +
            end
         | 
    
        data/spec/support/helpers.rb
    CHANGED
    
    
| @@ -1,12 +1,16 @@ | |
| 1 1 | 
             
            shared_examples "a Que adapter" do
         | 
| 2 2 | 
             
              it "should be able to execute arbitrary SQL and return indifferent hashes" do
         | 
| 3 3 | 
             
                result = Que.execute("SELECT 1 AS one")
         | 
| 4 | 
            -
                result.should == [{'one'=> | 
| 5 | 
            -
                result.first[:one].should ==  | 
| 4 | 
            +
                result.should == [{'one'=>1}]
         | 
| 5 | 
            +
                result.first[:one].should == 1
         | 
| 6 | 
            +
              end
         | 
| 7 | 
            +
             | 
| 8 | 
            +
              it "should be able to execute multiple SQL statements in one string" do
         | 
| 9 | 
            +
                Que.execute("SELECT 1 AS one; SELECT 1 AS one")
         | 
| 6 10 | 
             
              end
         | 
| 7 11 |  | 
| 8 12 | 
             
              it "should be able to queue and work a job" do
         | 
| 9 | 
            -
                Que::Job. | 
| 13 | 
            +
                Que::Job.enqueue
         | 
| 10 14 | 
             
                result = Que::Job.work
         | 
| 11 15 | 
             
                result[:event].should == :job_worked
         | 
| 12 16 | 
             
                result[:job][:job_class].should == 'Que::Job'
         | 
| @@ -26,11 +26,11 @@ shared_examples "a multi-threaded Que adapter" do | |
| 26 26 | 
             
              end
         | 
| 27 27 |  | 
| 28 28 | 
             
              it "should allow multiple workers to complete jobs simultaneously" do
         | 
| 29 | 
            -
                BlockJob. | 
| 29 | 
            +
                BlockJob.enqueue
         | 
| 30 30 | 
             
                worker_1 = Que::Worker.new
         | 
| 31 31 | 
             
                $q1.pop
         | 
| 32 32 |  | 
| 33 | 
            -
                Que::Job. | 
| 33 | 
            +
                Que::Job.enqueue
         | 
| 34 34 | 
             
                DB[:que_jobs].count.should be 2
         | 
| 35 35 |  | 
| 36 36 | 
             
                worker_2 = Que::Worker.new
         | 
    
        data/spec/travis.rb
    CHANGED
    
    | @@ -4,10 +4,18 @@ | |
| 4 4 | 
             
            test_runs = if ENV['TESTS']
         | 
| 5 5 | 
             
                          Integer(ENV['TESTS'])
         | 
| 6 6 | 
             
                        else
         | 
| 7 | 
            -
                           | 
| 7 | 
            +
                          25
         | 
| 8 8 | 
             
                        end
         | 
| 9 9 |  | 
| 10 | 
            -
             | 
| 11 | 
            -
             | 
| 12 | 
            -
             | 
| 10 | 
            +
             | 
| 11 | 
            +
            # I think travis might be pausing jobs, let's try a higher timeout
         | 
| 12 | 
            +
            QUE_TEST_TIMEOUT = 10
         | 
| 13 | 
            +
             | 
| 14 | 
            +
            %w( Gemfile spec/gemfiles/Gemfile1 spec/gemfiles/Gemfile2 ).each do |gemfile|
         | 
| 15 | 
            +
              # Install the particular gemfile
         | 
| 16 | 
            +
              system("BUNDLE_GEMFILE=#{gemfile} bundle")
         | 
| 17 | 
            +
              1.upto(test_runs) do |i|
         | 
| 18 | 
            +
                puts "Test Run #{i}"
         | 
| 19 | 
            +
                exit(-1) if !system("bundle exec rake")
         | 
| 20 | 
            +
              end
         | 
| 13 21 | 
             
            end
         | 
| @@ -0,0 +1,148 @@ | |
| 1 | 
            +
            require 'spec_helper'
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            # A few specs to ensure that the ideas given in the customizing_que document
         | 
| 4 | 
            +
            # stay functional.
         | 
| 5 | 
            +
            describe "Customizing Que" do
         | 
| 6 | 
            +
              it "Cron should allow for easy recurring jobs" do
         | 
| 7 | 
            +
                class Cron < Que::Job
         | 
| 8 | 
            +
                  def run
         | 
| 9 | 
            +
                    destroy
         | 
| 10 | 
            +
                    self.class.enqueue :run_at => @attrs[:run_at] + 3600
         | 
| 11 | 
            +
                  end
         | 
| 12 | 
            +
                end
         | 
| 13 | 
            +
             | 
| 14 | 
            +
                Cron.enqueue
         | 
| 15 | 
            +
             | 
| 16 | 
            +
                run_at = DB[:que_jobs].get(:run_at).to_f
         | 
| 17 | 
            +
             | 
| 18 | 
            +
                Que::Job.work
         | 
| 19 | 
            +
             | 
| 20 | 
            +
                DB[:que_jobs].get(:run_at).to_f.should be_within(0.000001).of(run_at + 3600)
         | 
| 21 | 
            +
              end
         | 
| 22 | 
            +
             | 
| 23 | 
            +
              it "Object#delay should allow for simpler job enqueueing" do
         | 
| 24 | 
            +
                begin
         | 
| 25 | 
            +
                  class Delayed < Que::Job
         | 
| 26 | 
            +
                    def run(receiver, method, args)
         | 
| 27 | 
            +
                      Marshal.load(receiver).send method, *Marshal.load(args)
         | 
| 28 | 
            +
                    end
         | 
| 29 | 
            +
                  end
         | 
| 30 | 
            +
             | 
| 31 | 
            +
                  class DelayedAction
         | 
| 32 | 
            +
                    def initialize(receiver)
         | 
| 33 | 
            +
                      @receiver = receiver
         | 
| 34 | 
            +
                    end
         | 
| 35 | 
            +
             | 
| 36 | 
            +
                    def method_missing(method, *args)
         | 
| 37 | 
            +
                      Delayed.queue Marshal.dump(@receiver), method, Marshal.dump(args)
         | 
| 38 | 
            +
                    end
         | 
| 39 | 
            +
                  end
         | 
| 40 | 
            +
             | 
| 41 | 
            +
                  class Object
         | 
| 42 | 
            +
                    def delay
         | 
| 43 | 
            +
                      DelayedAction.new(self)
         | 
| 44 | 
            +
                    end
         | 
| 45 | 
            +
                  end
         | 
| 46 | 
            +
             | 
| 47 | 
            +
                  module MyModule
         | 
| 48 | 
            +
                    class << self
         | 
| 49 | 
            +
                      def blah
         | 
| 50 | 
            +
                        $run = true
         | 
| 51 | 
            +
                      end
         | 
| 52 | 
            +
                    end
         | 
| 53 | 
            +
                  end
         | 
| 54 | 
            +
             | 
| 55 | 
            +
                  MyModule.delay.blah
         | 
| 56 | 
            +
                  Que::Job.work
         | 
| 57 | 
            +
             | 
| 58 | 
            +
                  $run.should be true
         | 
| 59 | 
            +
                ensure
         | 
| 60 | 
            +
                  $run = nil
         | 
| 61 | 
            +
                end
         | 
| 62 | 
            +
              end
         | 
| 63 | 
            +
             | 
| 64 | 
            +
              it "QueueClassic-style jobs should be easy" do
         | 
| 65 | 
            +
                begin
         | 
| 66 | 
            +
                  class Command < Que::Job
         | 
| 67 | 
            +
                    def run(method, *args)
         | 
| 68 | 
            +
                      receiver, message = method.split('.')
         | 
| 69 | 
            +
                      Object.const_get(receiver).send(message, *args)
         | 
| 70 | 
            +
                    end
         | 
| 71 | 
            +
                  end
         | 
| 72 | 
            +
             | 
| 73 | 
            +
                  module MyModule
         | 
| 74 | 
            +
                    class << self
         | 
| 75 | 
            +
                      def blah(arg)
         | 
| 76 | 
            +
                        $value = arg
         | 
| 77 | 
            +
                      end
         | 
| 78 | 
            +
                    end
         | 
| 79 | 
            +
                  end
         | 
| 80 | 
            +
             | 
| 81 | 
            +
                  Command.enqueue "MyModule.blah", "hello world"
         | 
| 82 | 
            +
                  Que::Job.work
         | 
| 83 | 
            +
             | 
| 84 | 
            +
                  $value.should == "hello world"
         | 
| 85 | 
            +
                ensure
         | 
| 86 | 
            +
                  $value = nil
         | 
| 87 | 
            +
                end
         | 
| 88 | 
            +
              end
         | 
| 89 | 
            +
             | 
| 90 | 
            +
              describe "retaining deleted jobs" do
         | 
| 91 | 
            +
                before do
         | 
| 92 | 
            +
                  Que.execute "CREATE TABLE finished_jobs AS SELECT * FROM que_jobs LIMIT 0"
         | 
| 93 | 
            +
                end
         | 
| 94 | 
            +
             | 
| 95 | 
            +
                after do
         | 
| 96 | 
            +
                  DB.drop_table? :finished_jobs
         | 
| 97 | 
            +
                end
         | 
| 98 | 
            +
             | 
| 99 | 
            +
                it "with a Ruby override" do
         | 
| 100 | 
            +
                  class MyJobClass < Que::Job
         | 
| 101 | 
            +
                    def destroy
         | 
| 102 | 
            +
                      Que.execute "INSERT INTO finished_jobs SELECT * FROM que_jobs WHERE queue = $1::text AND priority = $2::integer AND run_at = $3::timestamptz AND job_id = $4::bigint", @attrs.values_at(:queue, :priority, :run_at, :job_id)
         | 
| 103 | 
            +
                      super
         | 
| 104 | 
            +
                    end
         | 
| 105 | 
            +
                  end
         | 
| 106 | 
            +
             | 
| 107 | 
            +
                  class MyJob < MyJobClass
         | 
| 108 | 
            +
                  end
         | 
| 109 | 
            +
             | 
| 110 | 
            +
                  MyJob.enqueue 1, 'arg1', :priority => 89
         | 
| 111 | 
            +
                  Que::Job.work
         | 
| 112 | 
            +
             | 
| 113 | 
            +
                  DB[:finished_jobs].count.should == 1
         | 
| 114 | 
            +
                  job = DB[:finished_jobs].first
         | 
| 115 | 
            +
                  job[:priority].should == 89
         | 
| 116 | 
            +
                  JSON.load(job[:args]).should == [1, 'arg1']
         | 
| 117 | 
            +
                end
         | 
| 118 | 
            +
             | 
| 119 | 
            +
                it "with a trigger" do
         | 
| 120 | 
            +
                  begin
         | 
| 121 | 
            +
                    Que.execute <<-SQL
         | 
| 122 | 
            +
                      CREATE FUNCTION please_save_my_job()
         | 
| 123 | 
            +
                      RETURNS trigger
         | 
| 124 | 
            +
                      LANGUAGE plpgsql
         | 
| 125 | 
            +
                      AS $$
         | 
| 126 | 
            +
                        BEGIN
         | 
| 127 | 
            +
                          INSERT INTO finished_jobs SELECT (OLD).*;
         | 
| 128 | 
            +
                          RETURN OLD;
         | 
| 129 | 
            +
                        END;
         | 
| 130 | 
            +
                      $$;
         | 
| 131 | 
            +
                    SQL
         | 
| 132 | 
            +
             | 
| 133 | 
            +
                    Que.execute "CREATE TRIGGER keep_all_my_old_jobs BEFORE DELETE ON que_jobs FOR EACH ROW EXECUTE PROCEDURE please_save_my_job();"
         | 
| 134 | 
            +
             | 
| 135 | 
            +
                    Que::Job.enqueue 2, 'arg2', :priority => 45
         | 
| 136 | 
            +
                    Que::Job.work
         | 
| 137 | 
            +
             | 
| 138 | 
            +
                    DB[:finished_jobs].count.should == 1
         | 
| 139 | 
            +
                    job = DB[:finished_jobs].first
         | 
| 140 | 
            +
                    job[:priority].should == 45
         | 
| 141 | 
            +
                    JSON.load(job[:args]).should == [2, 'arg2']
         | 
| 142 | 
            +
                  ensure
         | 
| 143 | 
            +
                    DB.drop_trigger :que_jobs, :keep_all_my_old_jobs, :if_exists => true
         | 
| 144 | 
            +
                    DB.drop_function :please_save_my_job, :if_exists => true
         | 
| 145 | 
            +
                  end
         | 
| 146 | 
            +
                end
         | 
| 147 | 
            +
              end
         | 
| 148 | 
            +
            end
         | 
| @@ -1,28 +1,37 @@ | |
| 1 1 | 
             
            require 'spec_helper'
         | 
| 2 2 |  | 
| 3 | 
            -
            describe Que::Job, '. | 
| 3 | 
            +
            describe Que::Job, '.enqueue' do
         | 
| 4 4 | 
             
              it "should be able to queue a job" do
         | 
| 5 5 | 
             
                DB[:que_jobs].count.should be 0
         | 
| 6 | 
            -
                result = Que::Job. | 
| 6 | 
            +
                result = Que::Job.enqueue
         | 
| 7 7 | 
             
                DB[:que_jobs].count.should be 1
         | 
| 8 8 |  | 
| 9 9 | 
             
                result.should be_an_instance_of Que::Job
         | 
| 10 | 
            -
                result.attrs[: | 
| 10 | 
            +
                result.attrs[:queue].should == ''
         | 
| 11 | 
            +
                result.attrs[:priority].should == 100
         | 
| 11 12 | 
             
                result.attrs[:args].should == []
         | 
| 12 13 |  | 
| 13 14 | 
             
                job = DB[:que_jobs].first
         | 
| 15 | 
            +
                job[:queue].should == ''
         | 
| 14 16 | 
             
                job[:priority].should be 100
         | 
| 15 17 | 
             
                job[:run_at].should be_within(3).of Time.now
         | 
| 16 18 | 
             
                job[:job_class].should == "Que::Job"
         | 
| 17 19 | 
             
                JSON.load(job[:args]).should == []
         | 
| 18 20 | 
             
              end
         | 
| 19 21 |  | 
| 22 | 
            +
              it "should be aliased to .queue" do
         | 
| 23 | 
            +
                DB[:que_jobs].count.should be 0
         | 
| 24 | 
            +
                Que::Job.queue
         | 
| 25 | 
            +
                DB[:que_jobs].count.should be 1
         | 
| 26 | 
            +
              end
         | 
| 27 | 
            +
             | 
| 20 28 | 
             
              it "should be able to queue a job with arguments" do
         | 
| 21 29 | 
             
                DB[:que_jobs].count.should be 0
         | 
| 22 | 
            -
                Que::Job. | 
| 30 | 
            +
                Que::Job.enqueue 1, 'two'
         | 
| 23 31 | 
             
                DB[:que_jobs].count.should be 1
         | 
| 24 32 |  | 
| 25 33 | 
             
                job = DB[:que_jobs].first
         | 
| 34 | 
            +
                job[:queue].should == ''
         | 
| 26 35 | 
             
                job[:priority].should be 100
         | 
| 27 36 | 
             
                job[:run_at].should be_within(3).of Time.now
         | 
| 28 37 | 
             
                job[:job_class].should == "Que::Job"
         | 
| @@ -31,7 +40,7 @@ describe Que::Job, '.queue' do | |
| 31 40 |  | 
| 32 41 | 
             
              it "should be able to queue a job with complex arguments" do
         | 
| 33 42 | 
             
                DB[:que_jobs].count.should be 0
         | 
| 34 | 
            -
                Que::Job. | 
| 43 | 
            +
                Que::Job.enqueue 1, 'two', :string => "string",
         | 
| 35 44 | 
             
                                         :integer => 5,
         | 
| 36 45 | 
             
                                         :array => [1, "two", {:three => 3}],
         | 
| 37 46 | 
             
                                         :hash => {:one => 1, :two => 'two', :three => [3]}
         | 
| @@ -39,6 +48,7 @@ describe Que::Job, '.queue' do | |
| 39 48 | 
             
                DB[:que_jobs].count.should be 1
         | 
| 40 49 |  | 
| 41 50 | 
             
                job = DB[:que_jobs].first
         | 
| 51 | 
            +
                job[:queue].should == ''
         | 
| 42 52 | 
             
                job[:priority].should be 100
         | 
| 43 53 | 
             
                job[:run_at].should be_within(3).of Time.now
         | 
| 44 54 | 
             
                job[:job_class].should == "Que::Job"
         | 
| @@ -56,10 +66,11 @@ describe Que::Job, '.queue' do | |
| 56 66 |  | 
| 57 67 | 
             
              it "should be able to queue a job with a specific time to run" do
         | 
| 58 68 | 
             
                DB[:que_jobs].count.should be 0
         | 
| 59 | 
            -
                Que::Job. | 
| 69 | 
            +
                Que::Job.enqueue 1, :run_at => Time.now + 60
         | 
| 60 70 | 
             
                DB[:que_jobs].count.should be 1
         | 
| 61 71 |  | 
| 62 72 | 
             
                job = DB[:que_jobs].first
         | 
| 73 | 
            +
                job[:queue].should == ''
         | 
| 63 74 | 
             
                job[:priority].should be 100
         | 
| 64 75 | 
             
                job[:run_at].should be_within(3).of Time.now + 60
         | 
| 65 76 | 
             
                job[:job_class].should == "Que::Job"
         | 
| @@ -68,10 +79,11 @@ describe Que::Job, '.queue' do | |
| 68 79 |  | 
| 69 80 | 
             
              it "should be able to queue a job with a specific priority" do
         | 
| 70 81 | 
             
                DB[:que_jobs].count.should be 0
         | 
| 71 | 
            -
                Que::Job. | 
| 82 | 
            +
                Que::Job.enqueue 1, :priority => 4
         | 
| 72 83 | 
             
                DB[:que_jobs].count.should be 1
         | 
| 73 84 |  | 
| 74 85 | 
             
                job = DB[:que_jobs].first
         | 
| 86 | 
            +
                job[:queue].should == ''
         | 
| 75 87 | 
             
                job[:priority].should be 4
         | 
| 76 88 | 
             
                job[:run_at].should be_within(3).of Time.now
         | 
| 77 89 | 
             
                job[:job_class].should == "Que::Job"
         | 
| @@ -80,59 +92,148 @@ describe Que::Job, '.queue' do | |
| 80 92 |  | 
| 81 93 | 
             
              it "should be able to queue a job with queueing options in addition to argument options" do
         | 
| 82 94 | 
             
                DB[:que_jobs].count.should be 0
         | 
| 83 | 
            -
                Que::Job. | 
| 95 | 
            +
                Que::Job.enqueue 1, :string => "string", :run_at => Time.now + 60, :priority => 4
         | 
| 84 96 | 
             
                DB[:que_jobs].count.should be 1
         | 
| 85 97 |  | 
| 86 98 | 
             
                job = DB[:que_jobs].first
         | 
| 99 | 
            +
                job[:queue].should == ''
         | 
| 87 100 | 
             
                job[:priority].should be 4
         | 
| 88 101 | 
             
                job[:run_at].should be_within(3).of Time.now + 60
         | 
| 89 102 | 
             
                job[:job_class].should == "Que::Job"
         | 
| 90 103 | 
             
                JSON.load(job[:args]).should == [1, {'string' => 'string'}]
         | 
| 91 104 | 
             
              end
         | 
| 92 105 |  | 
| 106 | 
            +
              it "should respect a job class defined as a string" do
         | 
| 107 | 
            +
                Que.enqueue 'argument', :queue => 'my_queue', :other_arg => 'other_arg', :job_class => 'MyJobClass'
         | 
| 108 | 
            +
                Que::Job.enqueue 'argument', :queue => 'my_queue', :other_arg => 'other_arg', :job_class => 'MyJobClass'
         | 
| 109 | 
            +
             | 
| 110 | 
            +
                DB[:que_jobs].count.should be 2
         | 
| 111 | 
            +
                DB[:que_jobs].all.each do |job|
         | 
| 112 | 
            +
                  job[:job_class].should == 'MyJobClass'
         | 
| 113 | 
            +
                  job[:queue].should == 'my_queue'
         | 
| 114 | 
            +
                  JSON.load(job[:args]).should == ['argument', {'other_arg' => 'other_arg'}]
         | 
| 115 | 
            +
                end
         | 
| 116 | 
            +
              end
         | 
| 117 | 
            +
             | 
| 93 118 | 
             
              it "should respect a default (but overridable) priority for the job class" do
         | 
| 94 119 | 
             
                class DefaultPriorityJob < Que::Job
         | 
| 95 | 
            -
                  @ | 
| 120 | 
            +
                  @priority = 3
         | 
| 96 121 | 
             
                end
         | 
| 97 122 |  | 
| 98 123 | 
             
                DB[:que_jobs].count.should be 0
         | 
| 99 | 
            -
                DefaultPriorityJob. | 
| 100 | 
            -
                DefaultPriorityJob. | 
| 124 | 
            +
                DefaultPriorityJob.enqueue 1
         | 
| 125 | 
            +
                DefaultPriorityJob.enqueue 1, :priority => 4
         | 
| 101 126 | 
             
                DB[:que_jobs].count.should be 2
         | 
| 102 127 |  | 
| 103 128 | 
             
                first, second = DB[:que_jobs].order(:job_id).all
         | 
| 104 129 |  | 
| 130 | 
            +
                first[:queue].should == ''
         | 
| 105 131 | 
             
                first[:priority].should be 3
         | 
| 106 132 | 
             
                first[:run_at].should be_within(3).of Time.now
         | 
| 107 133 | 
             
                first[:job_class].should == "DefaultPriorityJob"
         | 
| 108 134 | 
             
                JSON.load(first[:args]).should == [1]
         | 
| 109 135 |  | 
| 136 | 
            +
                second[:queue].should == ''
         | 
| 110 137 | 
             
                second[:priority].should be 4
         | 
| 111 138 | 
             
                second[:run_at].should be_within(3).of Time.now
         | 
| 112 139 | 
             
                second[:job_class].should == "DefaultPriorityJob"
         | 
| 113 140 | 
             
                JSON.load(second[:args]).should == [1]
         | 
| 114 141 | 
             
              end
         | 
| 115 142 |  | 
| 143 | 
            +
              it "should respect the old @default_priority setting" do
         | 
| 144 | 
            +
                class OldDefaultPriorityJob < Que::Job
         | 
| 145 | 
            +
                  @default_priority = 3
         | 
| 146 | 
            +
                end
         | 
| 147 | 
            +
             | 
| 148 | 
            +
                DB[:que_jobs].count.should be 0
         | 
| 149 | 
            +
                OldDefaultPriorityJob.enqueue 1
         | 
| 150 | 
            +
                OldDefaultPriorityJob.enqueue 1, :priority => 4
         | 
| 151 | 
            +
                DB[:que_jobs].count.should be 2
         | 
| 152 | 
            +
             | 
| 153 | 
            +
                first, second = DB[:que_jobs].order(:job_id).all
         | 
| 154 | 
            +
             | 
| 155 | 
            +
                first[:queue].should == ''
         | 
| 156 | 
            +
                first[:priority].should be 3
         | 
| 157 | 
            +
                first[:run_at].should be_within(3).of Time.now
         | 
| 158 | 
            +
                first[:job_class].should == "OldDefaultPriorityJob"
         | 
| 159 | 
            +
                JSON.load(first[:args]).should == [1]
         | 
| 160 | 
            +
             | 
| 161 | 
            +
                second[:queue].should == ''
         | 
| 162 | 
            +
                second[:priority].should be 4
         | 
| 163 | 
            +
                second[:run_at].should be_within(3).of Time.now
         | 
| 164 | 
            +
                second[:job_class].should == "OldDefaultPriorityJob"
         | 
| 165 | 
            +
                JSON.load(second[:args]).should == [1]
         | 
| 166 | 
            +
              end
         | 
| 167 | 
            +
             | 
| 116 168 | 
             
              it "should respect a default (but overridable) run_at for the job class" do
         | 
| 117 169 | 
             
                class DefaultRunAtJob < Que::Job
         | 
| 118 | 
            -
                  @ | 
| 170 | 
            +
                  @run_at = -> { Time.now + 60 }
         | 
| 119 171 | 
             
                end
         | 
| 120 172 |  | 
| 121 173 | 
             
                DB[:que_jobs].count.should be 0
         | 
| 122 | 
            -
                DefaultRunAtJob. | 
| 123 | 
            -
                DefaultRunAtJob. | 
| 174 | 
            +
                DefaultRunAtJob.enqueue 1
         | 
| 175 | 
            +
                DefaultRunAtJob.enqueue 1, :run_at => Time.now + 30
         | 
| 124 176 | 
             
                DB[:que_jobs].count.should be 2
         | 
| 125 177 |  | 
| 126 178 | 
             
                first, second = DB[:que_jobs].order(:job_id).all
         | 
| 127 179 |  | 
| 180 | 
            +
                first[:queue].should == ''
         | 
| 128 181 | 
             
                first[:priority].should be 100
         | 
| 129 182 | 
             
                first[:run_at].should be_within(3).of Time.now + 60
         | 
| 130 183 | 
             
                first[:job_class].should == "DefaultRunAtJob"
         | 
| 131 184 | 
             
                JSON.load(first[:args]).should == [1]
         | 
| 132 185 |  | 
| 186 | 
            +
                second[:queue].should == ''
         | 
| 133 187 | 
             
                second[:priority].should be 100
         | 
| 134 188 | 
             
                second[:run_at].should be_within(3).of Time.now + 30
         | 
| 135 189 | 
             
                second[:job_class].should == "DefaultRunAtJob"
         | 
| 136 190 | 
             
                JSON.load(second[:args]).should == [1]
         | 
| 137 191 | 
             
              end
         | 
| 192 | 
            +
             | 
| 193 | 
            +
              it "should respect the old @default_run_at setting" do
         | 
| 194 | 
            +
                class OldDefaultRunAtJob < Que::Job
         | 
| 195 | 
            +
                  @default_run_at = -> { Time.now + 60 }
         | 
| 196 | 
            +
                end
         | 
| 197 | 
            +
             | 
| 198 | 
            +
                DB[:que_jobs].count.should be 0
         | 
| 199 | 
            +
                OldDefaultRunAtJob.enqueue 1
         | 
| 200 | 
            +
                OldDefaultRunAtJob.enqueue 1, :run_at => Time.now + 30
         | 
| 201 | 
            +
                DB[:que_jobs].count.should be 2
         | 
| 202 | 
            +
             | 
| 203 | 
            +
                first, second = DB[:que_jobs].order(:job_id).all
         | 
| 204 | 
            +
             | 
| 205 | 
            +
                first[:queue].should == ''
         | 
| 206 | 
            +
                first[:priority].should be 100
         | 
| 207 | 
            +
                first[:run_at].should be_within(3).of Time.now + 60
         | 
| 208 | 
            +
                first[:job_class].should == "OldDefaultRunAtJob"
         | 
| 209 | 
            +
                JSON.load(first[:args]).should == [1]
         | 
| 210 | 
            +
             | 
| 211 | 
            +
                second[:queue].should == ''
         | 
| 212 | 
            +
                second[:priority].should be 100
         | 
| 213 | 
            +
                second[:run_at].should be_within(3).of Time.now + 30
         | 
| 214 | 
            +
                second[:job_class].should == "OldDefaultRunAtJob"
         | 
| 215 | 
            +
                JSON.load(second[:args]).should == [1]
         | 
| 216 | 
            +
              end
         | 
| 217 | 
            +
             | 
| 218 | 
            +
              it "should respect a default (but overridable) queue for the job class" do
         | 
| 219 | 
            +
                class NamedQueueJob < Que::Job
         | 
| 220 | 
            +
                  @queue = :my_queue
         | 
| 221 | 
            +
                end
         | 
| 222 | 
            +
             | 
| 223 | 
            +
                DB[:que_jobs].count.should be 0
         | 
| 224 | 
            +
                NamedQueueJob.enqueue 1
         | 
| 225 | 
            +
                NamedQueueJob.enqueue 1, :queue => 'my_queue_2'
         | 
| 226 | 
            +
                NamedQueueJob.enqueue 1, :queue => :my_queue_2
         | 
| 227 | 
            +
                NamedQueueJob.enqueue 1, :queue => ''
         | 
| 228 | 
            +
                NamedQueueJob.enqueue 1, :queue => nil
         | 
| 229 | 
            +
                DB[:que_jobs].count.should be 5
         | 
| 230 | 
            +
             | 
| 231 | 
            +
                first, second, third, fourth, fifth = DB[:que_jobs].order(:job_id).select_map(:queue)
         | 
| 232 | 
            +
             | 
| 233 | 
            +
                first.should  == 'my_queue'
         | 
| 234 | 
            +
                second.should == 'my_queue_2'
         | 
| 235 | 
            +
                third.should  == 'my_queue_2'
         | 
| 236 | 
            +
                fourth.should == ''
         | 
| 237 | 
            +
                fifth.should  == ''
         | 
| 238 | 
            +
              end
         | 
| 138 239 | 
             
            end
         |