pq-wsm 0.0.1
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 +7 -0
- data/README.md +86 -0
- data/Rakefile +38 -0
- data/lib/generators/pc_queues/install_generator.rb +9 -0
- data/lib/generators/pc_queues/migration_generator.rb +15 -0
- data/lib/generators/pc_queues/templates/README +15 -0
- data/lib/generators/pc_queues/templates/initializer.rb +6 -0
- data/lib/generators/pc_queues/templates/migration.rb +36 -0
- data/lib/pc_queues.rb +43 -0
- data/lib/pc_queues/acts_as_enqueable.rb +31 -0
- data/lib/pc_queues/acts_as_queue_owner.rb +30 -0
- data/lib/pc_queues/priority_queue_item.rb +13 -0
- data/lib/pc_queues/queue.rb +312 -0
- data/lib/pc_queues/queue_item.rb +58 -0
- data/lib/pc_queues/queue_rule.rb +32 -0
- data/lib/pc_queues/queue_rule_set.rb +40 -0
- data/lib/pc_queues/queue_rules/boolean_queue_rule.rb +34 -0
- data/lib/pc_queues/queue_rules/numeric_queue_rule.rb +42 -0
- data/lib/pc_queues/queue_rules/sample_queue_rule.rb +36 -0
- data/lib/pc_queues/queue_rules/string_match_queue_rule.rb +44 -0
- data/lib/pc_queues/railtie.rb +10 -0
- data/lib/pc_queues/version.rb +3 -0
- data/lib/tasks/pc_queues_tasks.rake +4 -0
- data/spec/boolean_queue_rule_spec.rb +34 -0
- data/spec/numeric_queue_rule_spec.rb +123 -0
- data/spec/queue_spec.rb +494 -0
- data/spec/sample_queue_rule_spec.rb +34 -0
- data/spec/spec_helper.rb +30 -0
- data/spec/string_match_rule_spec.rb +76 -0
- data/spec/support/active_record.rb +42 -0
- data/spec/support/application.rb +122 -0
- data/spec/support/queue_helpers.rb +16 -0
- data/spec/support/redis_helpers.rb +32 -0
- data/spec/support/time.rb +23 -0
- metadata +131 -0
| @@ -0,0 +1,34 @@ | |
| 1 | 
            +
            require './spec/spec_helper'
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            describe PcQueues::QueueRules::SampleQueueRule do
         | 
| 4 | 
            +
             | 
| 5 | 
            +
              before :each do
         | 
| 6 | 
            +
                PcQueues.redis { |r| r.flushall }
         | 
| 7 | 
            +
             | 
| 8 | 
            +
                @company = Company.create :name => "ProctorCam"
         | 
| 9 | 
            +
                @company.create_hr_queue
         | 
| 10 | 
            +
             | 
| 11 | 
            +
                @people = {
         | 
| 12 | 
            +
                  :john => Person.create(:name => "John", :age => 42, :is_female => false),
         | 
| 13 | 
            +
                  :sally => Person.create(:name => "Sally", :age => 29, :is_female => true),
         | 
| 14 | 
            +
                  :mildred => Person.create(:name => "Mildred", :age => 67, :is_female => true),
         | 
| 15 | 
            +
                  :lars => Person.create(:name => "Lars", :age => 34, :is_female => false)
         | 
| 16 | 
            +
                }
         | 
| 17 | 
            +
              end
         | 
| 18 | 
            +
             | 
| 19 | 
            +
              after :each do
         | 
| 20 | 
            +
                @company.hr_queue.destroy
         | 
| 21 | 
            +
                @company.destroy
         | 
| 22 | 
            +
              end
         | 
| 23 | 
            +
             | 
| 24 | 
            +
              it "does not pass if the sample rate rolls false" do
         | 
| 25 | 
            +
                queue_rule = PcQueues::QueueRules::SampleQueueRule.create PcQueues::QueueRules::SampleQueueRule.options({:sample_percent => 0})
         | 
| 26 | 
            +
                expect(queue_rule.passes? @people[:john]).to eq(false)
         | 
| 27 | 
            +
              end
         | 
| 28 | 
            +
             | 
| 29 | 
            +
              it "passes if the sample rate rolls true" do
         | 
| 30 | 
            +
                queue_rule = PcQueues::QueueRules::SampleQueueRule.create PcQueues::QueueRules::SampleQueueRule.options({:sample_percent => 100})
         | 
| 31 | 
            +
                expect(queue_rule.passes? @people[:john]).to eq(true)
         | 
| 32 | 
            +
              end
         | 
| 33 | 
            +
              
         | 
| 34 | 
            +
            end
         | 
    
        data/spec/spec_helper.rb
    ADDED
    
    | @@ -0,0 +1,30 @@ | |
| 1 | 
            +
            #
         | 
| 2 | 
            +
            # This source file is part of project: ProctorServ
         | 
| 3 | 
            +
            #
         | 
| 4 | 
            +
            # A Proctoring Workflow Platform
         | 
| 5 | 
            +
            #
         | 
| 6 | 
            +
            # Copyright (c) ProctorCam Inc. 2013 All rights reserved
         | 
| 7 | 
            +
            #
         | 
| 8 | 
            +
            # This file is copied to spec/ when you run 'rails generate rspec:install'
         | 
| 9 | 
            +
             | 
| 10 | 
            +
            require 'support/active_record'
         | 
| 11 | 
            +
            require 'pc_queues'
         | 
| 12 | 
            +
            require './lib/generators/pc_queues/templates/migration'
         | 
| 13 | 
            +
            require 'support/application'
         | 
| 14 | 
            +
             | 
| 15 | 
            +
            %x[ps cax | grep redis-server]
         | 
| 16 | 
            +
            raise "Redis needs to be running to test pc-queues!" if $?.exitstatus > 0
         | 
| 17 | 
            +
             | 
| 18 | 
            +
            RSpec.configure do |config|
         | 
| 19 | 
            +
              config.order = "random"
         | 
| 20 | 
            +
             | 
| 21 | 
            +
              config.before(:suite) do
         | 
| 22 | 
            +
                CreatePcQueuesTables.migrate :up
         | 
| 23 | 
            +
                ApplicationMigration.migrate :up
         | 
| 24 | 
            +
              end
         | 
| 25 | 
            +
             | 
| 26 | 
            +
              config.after(:suite) do
         | 
| 27 | 
            +
                CreatePcQueuesTables.migrate :down
         | 
| 28 | 
            +
                ApplicationMigration.migrate :down
         | 
| 29 | 
            +
              end
         | 
| 30 | 
            +
            end
         | 
| @@ -0,0 +1,76 @@ | |
| 1 | 
            +
            require './spec/spec_helper'
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            describe PcQueues::QueueRules::StringMatchQueueRule do
         | 
| 4 | 
            +
             | 
| 5 | 
            +
              before :each do
         | 
| 6 | 
            +
                PcQueues.redis { |r| r.flushall }
         | 
| 7 | 
            +
             | 
| 8 | 
            +
                @company = Company.create :name => "ProctorCam"
         | 
| 9 | 
            +
                @company.create_hr_queue
         | 
| 10 | 
            +
             | 
| 11 | 
            +
                @people = {
         | 
| 12 | 
            +
                  :john => Person.create(:name => "John", :age => 42, :is_female => false),
         | 
| 13 | 
            +
                  :sally => Person.create(:name => "Sally", :age => 29, :is_female => true),
         | 
| 14 | 
            +
                  :mildred => Person.create(:name => "Mildred", :age => 67, :is_female => true),
         | 
| 15 | 
            +
                  :lars => Person.create(:name => "Lars", :age => 34, :is_female => false)
         | 
| 16 | 
            +
                }
         | 
| 17 | 
            +
              end
         | 
| 18 | 
            +
             | 
| 19 | 
            +
              after :each do
         | 
| 20 | 
            +
                @company.hr_queue.destroy
         | 
| 21 | 
            +
                @company.destroy
         | 
| 22 | 
            +
              end
         | 
| 23 | 
            +
             | 
| 24 | 
            +
              describe "when passed a regular_expression" do
         | 
| 25 | 
            +
             | 
| 26 | 
            +
                it "passes when the regexp matches" do
         | 
| 27 | 
            +
                  queue_rule = NameMatchQueueRule.create(NameMatchQueueRule.options({:regular_expression => "J.*n"}))
         | 
| 28 | 
            +
                  expect(queue_rule.passes? @people[:john]).to eq(true)
         | 
| 29 | 
            +
                end
         | 
| 30 | 
            +
             | 
| 31 | 
            +
                it "does not pass when the regexp does not match" do
         | 
| 32 | 
            +
                  queue_rule = NameMatchQueueRule.create(NameMatchQueueRule.options({:regular_expression => "J.*n"}))
         | 
| 33 | 
            +
                  expect(queue_rule.passes? @people[:mildred]).to eq(false)
         | 
| 34 | 
            +
                end
         | 
| 35 | 
            +
             | 
| 36 | 
            +
              end
         | 
| 37 | 
            +
             | 
| 38 | 
            +
              describe "when passed a contains" do
         | 
| 39 | 
            +
             | 
| 40 | 
            +
                it "passes when the value contains the :contains value exactly" do
         | 
| 41 | 
            +
                  queue_rule = NameMatchQueueRule.create(NameMatchQueueRule.options({:contains => "John"}))
         | 
| 42 | 
            +
                  expect(queue_rule.passes? @people[:john]).to eq(true)
         | 
| 43 | 
            +
                end
         | 
| 44 | 
            +
             | 
| 45 | 
            +
                it "does not pass when the value does not contain the :contains value (case sensitivity)" do
         | 
| 46 | 
            +
                  queue_rule = NameMatchQueueRule.create(NameMatchQueueRule.options({:contains => "john"}))
         | 
| 47 | 
            +
                  expect(queue_rule.passes? @people[:john]).to eq(false)
         | 
| 48 | 
            +
                end
         | 
| 49 | 
            +
             | 
| 50 | 
            +
                it "does not pass when the value does not contain the :contains value" do
         | 
| 51 | 
            +
                  queue_rule = NameMatchQueueRule.create(NameMatchQueueRule.options({:contains => "john"}))
         | 
| 52 | 
            +
                  expect(queue_rule.passes? @people[:mildred]).to eq(false)
         | 
| 53 | 
            +
                end
         | 
| 54 | 
            +
             | 
| 55 | 
            +
              end
         | 
| 56 | 
            +
             | 
| 57 | 
            +
              describe "when passed an icontains" do
         | 
| 58 | 
            +
             | 
| 59 | 
            +
                it "passes when the value contains the :icontains value exactly" do
         | 
| 60 | 
            +
                  queue_rule = NameMatchQueueRule.create(NameMatchQueueRule.options({:icontains => "John"}))
         | 
| 61 | 
            +
                  expect(queue_rule.passes? @people[:john]).to eq(true)
         | 
| 62 | 
            +
                end
         | 
| 63 | 
            +
             | 
| 64 | 
            +
                it "passes when the value contains the :icontains value regardless of case" do
         | 
| 65 | 
            +
                  queue_rule = NameMatchQueueRule.create(NameMatchQueueRule.options({:icontains => "john"}))
         | 
| 66 | 
            +
                  expect(queue_rule.passes? @people[:john]).to eq(true)
         | 
| 67 | 
            +
                end
         | 
| 68 | 
            +
             | 
| 69 | 
            +
                it "does not pass when the value does not contain the :icontains value" do
         | 
| 70 | 
            +
                  queue_rule = NameMatchQueueRule.create(NameMatchQueueRule.options({:icontains => "john"}))
         | 
| 71 | 
            +
                  expect(queue_rule.passes? @people[:mildred]).to eq(false)
         | 
| 72 | 
            +
                end
         | 
| 73 | 
            +
             | 
| 74 | 
            +
              end
         | 
| 75 | 
            +
             | 
| 76 | 
            +
            end
         | 
| @@ -0,0 +1,42 @@ | |
| 1 | 
            +
            require 'active_record'
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            ActiveRecord::Base.establish_connection({
         | 
| 4 | 
            +
              :adapter => "mysql2",
         | 
| 5 | 
            +
              :database => "pc-queues",
         | 
| 6 | 
            +
              :encoding => "utf8",
         | 
| 7 | 
            +
              :pool => 15,
         | 
| 8 | 
            +
              :timeout => 5000,
         | 
| 9 | 
            +
              :username => "proctorserv",
         | 
| 10 | 
            +
              :password => "pr0ct0rcam",
         | 
| 11 | 
            +
              :host => "localhost"
         | 
| 12 | 
            +
            })
         | 
| 13 | 
            +
             | 
| 14 | 
            +
            module ActiveModel::Validations
         | 
| 15 | 
            +
              # Extension to enhance `should have` on AR Model instances.  Calls
         | 
| 16 | 
            +
              # model.valid? in order to prepare the object's errors object.
         | 
| 17 | 
            +
              #
         | 
| 18 | 
            +
              # You can also use this to specify the content of the error messages.
         | 
| 19 | 
            +
              #
         | 
| 20 | 
            +
              # @example
         | 
| 21 | 
            +
              #
         | 
| 22 | 
            +
              #     model.should have(:no).errors_on(:attribute)
         | 
| 23 | 
            +
              #     model.should have(1).error_on(:attribute)
         | 
| 24 | 
            +
              #     model.should have(n).errors_on(:attribute)
         | 
| 25 | 
            +
              #
         | 
| 26 | 
            +
              #     model.errors_on(:attribute).should include("can't be blank")
         | 
| 27 | 
            +
              def errors_on(attribute)
         | 
| 28 | 
            +
                self.valid?
         | 
| 29 | 
            +
                [self.errors[attribute]].flatten.compact
         | 
| 30 | 
            +
              end
         | 
| 31 | 
            +
              alias :error_on :errors_on
         | 
| 32 | 
            +
            end
         | 
| 33 | 
            +
             | 
| 34 | 
            +
            # Don't pollute database between tests
         | 
| 35 | 
            +
            RSpec.configure do |config|
         | 
| 36 | 
            +
              config.around do |example|
         | 
| 37 | 
            +
                ActiveRecord::Base.transaction do
         | 
| 38 | 
            +
                  example.run
         | 
| 39 | 
            +
                  raise ActiveRecord::Rollback
         | 
| 40 | 
            +
                end
         | 
| 41 | 
            +
              end
         | 
| 42 | 
            +
            end
         | 
| @@ -0,0 +1,122 @@ | |
| 1 | 
            +
             | 
| 2 | 
            +
            class ApplicationMigration < ActiveRecord::Migration
         | 
| 3 | 
            +
              def change
         | 
| 4 | 
            +
                create_table :people do |t|
         | 
| 5 | 
            +
                  t.string :name
         | 
| 6 | 
            +
                  t.integer :age
         | 
| 7 | 
            +
                  t.boolean :is_female
         | 
| 8 | 
            +
                end
         | 
| 9 | 
            +
             | 
| 10 | 
            +
                create_table :companies do |t|
         | 
| 11 | 
            +
                  t.string :name
         | 
| 12 | 
            +
                end
         | 
| 13 | 
            +
              end
         | 
| 14 | 
            +
            end
         | 
| 15 | 
            +
             | 
| 16 | 
            +
            class Person < ActiveRecord::Base
         | 
| 17 | 
            +
              include PcQueues::ActsAsEnqueable
         | 
| 18 | 
            +
             | 
| 19 | 
            +
              # attr_accessible :name, :age, :is_female
         | 
| 20 | 
            +
              def self.accessible_attributes
         | 
| 21 | 
            +
                [:name, :age, :is_female]
         | 
| 22 | 
            +
              end
         | 
| 23 | 
            +
            end
         | 
| 24 | 
            +
             | 
| 25 | 
            +
            class PersonQueue < PcQueues::Queue
         | 
| 26 | 
            +
              enqueues Person
         | 
| 27 | 
            +
            end
         | 
| 28 | 
            +
             | 
| 29 | 
            +
            class Company < ActiveRecord::Base
         | 
| 30 | 
            +
              include PcQueues::ActsAsQueueOwner
         | 
| 31 | 
            +
             | 
| 32 | 
            +
              has_many_queues_as :it_queues, :class_name => 'PersonQueue'
         | 
| 33 | 
            +
              has_one_queue_as :hr_queue, :class_name => 'PersonQueue'
         | 
| 34 | 
            +
            end
         | 
| 35 | 
            +
             | 
| 36 | 
            +
            class GenderQueueRule < PcQueues::QueueRules::BooleanQueueRule
         | 
| 37 | 
            +
              def self.options(opts = {})
         | 
| 38 | 
            +
                opts[:bool_value] = opts[:is_female]
         | 
| 39 | 
            +
                opts.except! :is_female
         | 
| 40 | 
            +
                super
         | 
| 41 | 
            +
              end
         | 
| 42 | 
            +
             | 
| 43 | 
            +
              # Implementors must provide an implementation of this method that takes
         | 
| 44 | 
            +
              # the args splat passed to the queue and returns a numberic value
         | 
| 45 | 
            +
              def value(person, *args)
         | 
| 46 | 
            +
                person.is_female
         | 
| 47 | 
            +
              end
         | 
| 48 | 
            +
            end
         | 
| 49 | 
            +
             | 
| 50 | 
            +
            class AgeQueueRule < PcQueues::QueueRules::NumericQueueRule
         | 
| 51 | 
            +
              def value(person, *args)
         | 
| 52 | 
            +
                person.age
         | 
| 53 | 
            +
              end
         | 
| 54 | 
            +
            end
         | 
| 55 | 
            +
             | 
| 56 | 
            +
            class IsOverAgeQueueRule < AgeQueueRule
         | 
| 57 | 
            +
              def self.options(opts = {})
         | 
| 58 | 
            +
                opts[:operator] = '>='
         | 
| 59 | 
            +
                super
         | 
| 60 | 
            +
              end
         | 
| 61 | 
            +
            end
         | 
| 62 | 
            +
             | 
| 63 | 
            +
            class NameMatchQueueRule < PcQueues::QueueRules::StringMatchQueueRule
         | 
| 64 | 
            +
              def self.options(opts)
         | 
| 65 | 
            +
                opts[:icontains] = opts[:name] if opts.key? :name
         | 
| 66 | 
            +
                opts.except! :name
         | 
| 67 | 
            +
                super
         | 
| 68 | 
            +
              end
         | 
| 69 | 
            +
             | 
| 70 | 
            +
              def value(person, *args)
         | 
| 71 | 
            +
                person.name
         | 
| 72 | 
            +
              end
         | 
| 73 | 
            +
            end
         | 
| 74 | 
            +
             | 
| 75 | 
            +
            Wolverine.config.script_path = Pathname.new "#{File.dirname(__FILE__)}/../app/wolverine/"
         | 
| 76 | 
            +
             | 
| 77 | 
            +
            PcQueues.config do |config|
         | 
| 78 | 
            +
              #  Configuring Redis
         | 
| 79 | 
            +
              #
         | 
| 80 | 
            +
              # Redis can be configured by:
         | 
| 81 | 
            +
              #
         | 
| 82 | 
            +
              # * passing an options Hash for the Redis Client connection pool
         | 
| 83 | 
            +
              # * passing an existing ConnectionPool
         | 
| 84 | 
            +
              #
         | 
| 85 | 
            +
              # Example using a Hash
         | 
| 86 | 
            +
              #
         | 
| 87 | 
            +
              #    config.redis = { :namespace => 'myapp', :size => 1, :url => 'redis://myhost:8877/0' }
         | 
| 88 | 
            +
              #
         | 
| 89 | 
            +
              #
         | 
| 90 | 
            +
              # Example using ConnectionPool
         | 
| 91 | 
            +
              #
         | 
| 92 | 
            +
              #    config.redis = PcQueues.create { :namespace => 'myapp', :size => 1, :url => 'redis://myhost:8877/0' }
         | 
| 93 | 
            +
              #
         | 
| 94 | 
            +
              
         | 
| 95 | 
            +
              config.redis = PcQueues.create({
         | 
| 96 | 
            +
                :url => 'redis://localhost',
         | 
| 97 | 
            +
                :size => 1
         | 
| 98 | 
            +
              })
         | 
| 99 | 
            +
              
         | 
| 100 | 
            +
              #
         | 
| 101 | 
            +
              # Also if you have different ways of doing a cold start, you can set up a cold start method here
         | 
| 102 | 
            +
              # to wrap it.
         | 
| 103 | 
            +
              #
         | 
| 104 | 
            +
              # A Sidekiq worker to do this would look like this:
         | 
| 105 | 
            +
              #
         | 
| 106 | 
            +
              # First a Worker Class
         | 
| 107 | 
            +
              #
         | 
| 108 | 
            +
              # class QueueColdStarter
         | 
| 109 | 
            +
              #   include Sidekiq::Worker
         | 
| 110 | 
            +
              #   
         | 
| 111 | 
            +
              #   def perform(queue_id)
         | 
| 112 | 
            +
              #     queue = PcQueues::Queue.find(queue_id)
         | 
| 113 | 
            +
              #     queue.cold_start
         | 
| 114 | 
            +
              #   end
         | 
| 115 | 
            +
              # end
         | 
| 116 | 
            +
              #
         | 
| 117 | 
            +
              # Next Set the config method cold_start to call it
         | 
| 118 | 
            +
              #
         | 
| 119 | 
            +
              config.cold_start = Proc.new { |q| puts "Cold starting: #{q}"; q.cold_start }
         | 
| 120 | 
            +
              #   
         | 
| 121 | 
            +
              
         | 
| 122 | 
            +
            end
         | 
| @@ -0,0 +1,16 @@ | |
| 1 | 
            +
            class QueueHelpers
         | 
| 2 | 
            +
              class << self
         | 
| 3 | 
            +
                def get_redis_length(queue)
         | 
| 4 | 
            +
                  PcQueues.redis { |r|
         | 
| 5 | 
            +
                    r.llen("#{PcQueues.namespace}:#{queue.class.name}.#{queue.id}").to_i
         | 
| 6 | 
            +
                  }
         | 
| 7 | 
            +
                end
         | 
| 8 | 
            +
             | 
| 9 | 
            +
                def get_queue_items(queue)
         | 
| 10 | 
            +
                  ids = PcQueues.redis { |r|
         | 
| 11 | 
            +
                    r.lrange("#{PcQueues.namespace}:#{queue.class.name}.#{queue.id}", 0, -1)
         | 
| 12 | 
            +
                  }
         | 
| 13 | 
            +
                  ids.map{|id| queue.enqueable_type.find id.to_i }
         | 
| 14 | 
            +
                end
         | 
| 15 | 
            +
              end
         | 
| 16 | 
            +
            end
         | 
| @@ -0,0 +1,32 @@ | |
| 1 | 
            +
            #
         | 
| 2 | 
            +
            # This source file is part of project: ProctorServ
         | 
| 3 | 
            +
            #
         | 
| 4 | 
            +
            # A Proctoring Workflow Platform
         | 
| 5 | 
            +
            #
         | 
| 6 | 
            +
            # Copyright (c) ProctorCam Inc. 2013 All rights reserved
         | 
| 7 | 
            +
            #
         | 
| 8 | 
            +
            module RedisHelpers
         | 
| 9 | 
            +
              module Subscription
         | 
| 10 | 
            +
             | 
| 11 | 
            +
                def self.subscribe_to_and_publish(channel, subscribe_proc, &publish_block)
         | 
| 12 | 
            +
                  message = ""
         | 
| 13 | 
            +
                  conn = Redis.new
         | 
| 14 | 
            +
                  namespaced_channel = "#{PcQueues.namespace}:#{channel}"
         | 
| 15 | 
            +
             | 
| 16 | 
            +
                  conn.subscribe namespaced_channel do |on|
         | 
| 17 | 
            +
                    on.subscribe { |c, subscriptions| yield }
         | 
| 18 | 
            +
             | 
| 19 | 
            +
                    on.message do |c, msg|
         | 
| 20 | 
            +
                      conn.unsubscribe namespaced_channel
         | 
| 21 | 
            +
                      message = msg
         | 
| 22 | 
            +
                      subscribe_proc.call msg
         | 
| 23 | 
            +
                    end
         | 
| 24 | 
            +
                  end
         | 
| 25 | 
            +
             | 
| 26 | 
            +
                  conn.quit
         | 
| 27 | 
            +
                  message
         | 
| 28 | 
            +
                end
         | 
| 29 | 
            +
             | 
| 30 | 
            +
              end
         | 
| 31 | 
            +
             | 
| 32 | 
            +
            end
         | 
| @@ -0,0 +1,23 @@ | |
| 1 | 
            +
            class Time
         | 
| 2 | 
            +
              class << self
         | 
| 3 | 
            +
             | 
| 4 | 
            +
                alias_method :prev_now, :now
         | 
| 5 | 
            +
             | 
| 6 | 
            +
                def travel_to(t)
         | 
| 7 | 
            +
                  @now = t
         | 
| 8 | 
            +
                end
         | 
| 9 | 
            +
             | 
| 10 | 
            +
                def now
         | 
| 11 | 
            +
                  @now ? @now : prev_now
         | 
| 12 | 
            +
                end
         | 
| 13 | 
            +
             | 
| 14 | 
            +
                def reset
         | 
| 15 | 
            +
                  @now = nil
         | 
| 16 | 
            +
                end
         | 
| 17 | 
            +
             | 
| 18 | 
            +
                def wait_until_even_second
         | 
| 19 | 
            +
                  while (t = Time.now.to_f) % 1 > 0.01 do ; end
         | 
| 20 | 
            +
                end
         | 
| 21 | 
            +
             | 
| 22 | 
            +
              end
         | 
| 23 | 
            +
            end
         | 
    
        metadata
    ADDED
    
    | @@ -0,0 +1,131 @@ | |
| 1 | 
            +
            --- !ruby/object:Gem::Specification
         | 
| 2 | 
            +
            name: pq-wsm
         | 
| 3 | 
            +
            version: !ruby/object:Gem::Version
         | 
| 4 | 
            +
              version: 0.0.1
         | 
| 5 | 
            +
            platform: ruby
         | 
| 6 | 
            +
            authors:
         | 
| 7 | 
            +
            - Test Only
         | 
| 8 | 
            +
            autorequire: 
         | 
| 9 | 
            +
            bindir: bin
         | 
| 10 | 
            +
            cert_chain: []
         | 
| 11 | 
            +
            date: 2016-06-08 00:00:00.000000000 Z
         | 
| 12 | 
            +
            dependencies:
         | 
| 13 | 
            +
            - !ruby/object:Gem::Dependency
         | 
| 14 | 
            +
              name: rails
         | 
| 15 | 
            +
              requirement: !ruby/object:Gem::Requirement
         | 
| 16 | 
            +
                requirements:
         | 
| 17 | 
            +
                - - '='
         | 
| 18 | 
            +
                  - !ruby/object:Gem::Version
         | 
| 19 | 
            +
                    version: 4.2.6
         | 
| 20 | 
            +
              type: :runtime
         | 
| 21 | 
            +
              prerelease: false
         | 
| 22 | 
            +
              version_requirements: !ruby/object:Gem::Requirement
         | 
| 23 | 
            +
                requirements:
         | 
| 24 | 
            +
                - - '='
         | 
| 25 | 
            +
                  - !ruby/object:Gem::Version
         | 
| 26 | 
            +
                    version: 4.2.6
         | 
| 27 | 
            +
            - !ruby/object:Gem::Dependency
         | 
| 28 | 
            +
              name: mysql2
         | 
| 29 | 
            +
              requirement: !ruby/object:Gem::Requirement
         | 
| 30 | 
            +
                requirements:
         | 
| 31 | 
            +
                - - ">="
         | 
| 32 | 
            +
                  - !ruby/object:Gem::Version
         | 
| 33 | 
            +
                    version: '0'
         | 
| 34 | 
            +
              type: :development
         | 
| 35 | 
            +
              prerelease: false
         | 
| 36 | 
            +
              version_requirements: !ruby/object:Gem::Requirement
         | 
| 37 | 
            +
                requirements:
         | 
| 38 | 
            +
                - - ">="
         | 
| 39 | 
            +
                  - !ruby/object:Gem::Version
         | 
| 40 | 
            +
                    version: '0'
         | 
| 41 | 
            +
            - !ruby/object:Gem::Dependency
         | 
| 42 | 
            +
              name: rspec-rails
         | 
| 43 | 
            +
              requirement: !ruby/object:Gem::Requirement
         | 
| 44 | 
            +
                requirements:
         | 
| 45 | 
            +
                - - ">="
         | 
| 46 | 
            +
                  - !ruby/object:Gem::Version
         | 
| 47 | 
            +
                    version: '0'
         | 
| 48 | 
            +
              type: :development
         | 
| 49 | 
            +
              prerelease: false
         | 
| 50 | 
            +
              version_requirements: !ruby/object:Gem::Requirement
         | 
| 51 | 
            +
                requirements:
         | 
| 52 | 
            +
                - - ">="
         | 
| 53 | 
            +
                  - !ruby/object:Gem::Version
         | 
| 54 | 
            +
                    version: '0'
         | 
| 55 | 
            +
            description: A Queuing gem designed to support ActiveRecord models with an active
         | 
| 56 | 
            +
              Redis publishing component.
         | 
| 57 | 
            +
            email:
         | 
| 58 | 
            +
            - unlikely_pc_email@proctorcam.com
         | 
| 59 | 
            +
            executables: []
         | 
| 60 | 
            +
            extensions: []
         | 
| 61 | 
            +
            extra_rdoc_files: []
         | 
| 62 | 
            +
            files:
         | 
| 63 | 
            +
            - README.md
         | 
| 64 | 
            +
            - Rakefile
         | 
| 65 | 
            +
            - lib/generators/pc_queues/install_generator.rb
         | 
| 66 | 
            +
            - lib/generators/pc_queues/migration_generator.rb
         | 
| 67 | 
            +
            - lib/generators/pc_queues/templates/README
         | 
| 68 | 
            +
            - lib/generators/pc_queues/templates/initializer.rb
         | 
| 69 | 
            +
            - lib/generators/pc_queues/templates/migration.rb
         | 
| 70 | 
            +
            - lib/pc_queues.rb
         | 
| 71 | 
            +
            - lib/pc_queues/acts_as_enqueable.rb
         | 
| 72 | 
            +
            - lib/pc_queues/acts_as_queue_owner.rb
         | 
| 73 | 
            +
            - lib/pc_queues/priority_queue_item.rb
         | 
| 74 | 
            +
            - lib/pc_queues/queue.rb
         | 
| 75 | 
            +
            - lib/pc_queues/queue_item.rb
         | 
| 76 | 
            +
            - lib/pc_queues/queue_rule.rb
         | 
| 77 | 
            +
            - lib/pc_queues/queue_rule_set.rb
         | 
| 78 | 
            +
            - lib/pc_queues/queue_rules/boolean_queue_rule.rb
         | 
| 79 | 
            +
            - lib/pc_queues/queue_rules/numeric_queue_rule.rb
         | 
| 80 | 
            +
            - lib/pc_queues/queue_rules/sample_queue_rule.rb
         | 
| 81 | 
            +
            - lib/pc_queues/queue_rules/string_match_queue_rule.rb
         | 
| 82 | 
            +
            - lib/pc_queues/railtie.rb
         | 
| 83 | 
            +
            - lib/pc_queues/version.rb
         | 
| 84 | 
            +
            - lib/tasks/pc_queues_tasks.rake
         | 
| 85 | 
            +
            - spec/boolean_queue_rule_spec.rb
         | 
| 86 | 
            +
            - spec/numeric_queue_rule_spec.rb
         | 
| 87 | 
            +
            - spec/queue_spec.rb
         | 
| 88 | 
            +
            - spec/sample_queue_rule_spec.rb
         | 
| 89 | 
            +
            - spec/spec_helper.rb
         | 
| 90 | 
            +
            - spec/string_match_rule_spec.rb
         | 
| 91 | 
            +
            - spec/support/active_record.rb
         | 
| 92 | 
            +
            - spec/support/application.rb
         | 
| 93 | 
            +
            - spec/support/queue_helpers.rb
         | 
| 94 | 
            +
            - spec/support/redis_helpers.rb
         | 
| 95 | 
            +
            - spec/support/time.rb
         | 
| 96 | 
            +
            homepage: http://gitlab.proctorcam.com/proctorcam-development/pc-queues
         | 
| 97 | 
            +
            licenses: []
         | 
| 98 | 
            +
            metadata: {}
         | 
| 99 | 
            +
            post_install_message: 
         | 
| 100 | 
            +
            rdoc_options: []
         | 
| 101 | 
            +
            require_paths:
         | 
| 102 | 
            +
            - lib
         | 
| 103 | 
            +
            required_ruby_version: !ruby/object:Gem::Requirement
         | 
| 104 | 
            +
              requirements:
         | 
| 105 | 
            +
              - - ">="
         | 
| 106 | 
            +
                - !ruby/object:Gem::Version
         | 
| 107 | 
            +
                  version: '0'
         | 
| 108 | 
            +
            required_rubygems_version: !ruby/object:Gem::Requirement
         | 
| 109 | 
            +
              requirements:
         | 
| 110 | 
            +
              - - ">="
         | 
| 111 | 
            +
                - !ruby/object:Gem::Version
         | 
| 112 | 
            +
                  version: '0'
         | 
| 113 | 
            +
            requirements: []
         | 
| 114 | 
            +
            rubyforge_project: 
         | 
| 115 | 
            +
            rubygems_version: 2.6.4
         | 
| 116 | 
            +
            signing_key: 
         | 
| 117 | 
            +
            specification_version: 4
         | 
| 118 | 
            +
            summary: A Queuing gem designed to support ActiveRecord models with an active Redis
         | 
| 119 | 
            +
              publishing component.
         | 
| 120 | 
            +
            test_files:
         | 
| 121 | 
            +
            - spec/boolean_queue_rule_spec.rb
         | 
| 122 | 
            +
            - spec/numeric_queue_rule_spec.rb
         | 
| 123 | 
            +
            - spec/queue_spec.rb
         | 
| 124 | 
            +
            - spec/sample_queue_rule_spec.rb
         | 
| 125 | 
            +
            - spec/spec_helper.rb
         | 
| 126 | 
            +
            - spec/string_match_rule_spec.rb
         | 
| 127 | 
            +
            - spec/support/active_record.rb
         | 
| 128 | 
            +
            - spec/support/application.rb
         | 
| 129 | 
            +
            - spec/support/queue_helpers.rb
         | 
| 130 | 
            +
            - spec/support/redis_helpers.rb
         | 
| 131 | 
            +
            - spec/support/time.rb
         |