pq-wsm 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
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