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.
Files changed (35) hide show
  1. checksums.yaml +7 -0
  2. data/README.md +86 -0
  3. data/Rakefile +38 -0
  4. data/lib/generators/pc_queues/install_generator.rb +9 -0
  5. data/lib/generators/pc_queues/migration_generator.rb +15 -0
  6. data/lib/generators/pc_queues/templates/README +15 -0
  7. data/lib/generators/pc_queues/templates/initializer.rb +6 -0
  8. data/lib/generators/pc_queues/templates/migration.rb +36 -0
  9. data/lib/pc_queues.rb +43 -0
  10. data/lib/pc_queues/acts_as_enqueable.rb +31 -0
  11. data/lib/pc_queues/acts_as_queue_owner.rb +30 -0
  12. data/lib/pc_queues/priority_queue_item.rb +13 -0
  13. data/lib/pc_queues/queue.rb +312 -0
  14. data/lib/pc_queues/queue_item.rb +58 -0
  15. data/lib/pc_queues/queue_rule.rb +32 -0
  16. data/lib/pc_queues/queue_rule_set.rb +40 -0
  17. data/lib/pc_queues/queue_rules/boolean_queue_rule.rb +34 -0
  18. data/lib/pc_queues/queue_rules/numeric_queue_rule.rb +42 -0
  19. data/lib/pc_queues/queue_rules/sample_queue_rule.rb +36 -0
  20. data/lib/pc_queues/queue_rules/string_match_queue_rule.rb +44 -0
  21. data/lib/pc_queues/railtie.rb +10 -0
  22. data/lib/pc_queues/version.rb +3 -0
  23. data/lib/tasks/pc_queues_tasks.rake +4 -0
  24. data/spec/boolean_queue_rule_spec.rb +34 -0
  25. data/spec/numeric_queue_rule_spec.rb +123 -0
  26. data/spec/queue_spec.rb +494 -0
  27. data/spec/sample_queue_rule_spec.rb +34 -0
  28. data/spec/spec_helper.rb +30 -0
  29. data/spec/string_match_rule_spec.rb +76 -0
  30. data/spec/support/active_record.rb +42 -0
  31. data/spec/support/application.rb +122 -0
  32. data/spec/support/queue_helpers.rb +16 -0
  33. data/spec/support/redis_helpers.rb +32 -0
  34. data/spec/support/time.rb +23 -0
  35. 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
@@ -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