resque-restriction 0.3.0 → 0.4.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 ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 9262042b42b7838c1b204a900d56f13263afb3d5
4
+ data.tar.gz: 3fd139447714181f6b99a7f2ad484a5ad70461c9
5
+ SHA512:
6
+ metadata.gz: 3058d61e4310002f6d2e5f6c5f85c6e7b830507138852e8fdfbc99d5a2f68b8467d63df2ea8a516cec09100e3cc00db1a13ad7e5a1976bec199b1516fc00ddff
7
+ data.tar.gz: 74d9ddcb8677d8c0ea764d8b9bae61e702aabec26e548e83546725a6cac5f38afdba12dbd3f9b3660e3052dfaca51117827cf88a892ccadf5de0f0f354b3f5ec
data/CHANGELOG.md ADDED
@@ -0,0 +1,7 @@
1
+ ### Unreleased
2
+
3
+ # 0.4.0
4
+ * release for Rails>=4.2 with ActiveJob
5
+
6
+ # 0.3.0
7
+ * release for Rails<4.2
data/Gemfile ADDED
@@ -0,0 +1,3 @@
1
+ source 'https://rubygems.org'
2
+
3
+ gemspec
data/Gemfile.lock ADDED
@@ -0,0 +1,116 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ resque-restriction (0.4.0)
5
+ activejob
6
+ jeweler
7
+ mocha
8
+ resque
9
+ rspec
10
+
11
+ GEM
12
+ remote: https://rubygems.org/
13
+ specs:
14
+ activejob (4.2.0)
15
+ activesupport (= 4.2.0)
16
+ globalid (>= 0.3.0)
17
+ activesupport (4.2.0)
18
+ i18n (~> 0.7)
19
+ json (~> 1.7, >= 1.7.7)
20
+ minitest (~> 5.1)
21
+ thread_safe (~> 0.3, >= 0.3.4)
22
+ tzinfo (~> 1.1)
23
+ addressable (2.3.6)
24
+ builder (3.2.2)
25
+ descendants_tracker (0.0.4)
26
+ thread_safe (~> 0.3, >= 0.3.1)
27
+ diff-lcs (1.2.5)
28
+ faraday (0.9.0)
29
+ multipart-post (>= 1.2, < 3)
30
+ git (1.2.9.1)
31
+ github_api (0.12.4)
32
+ addressable (~> 2.3)
33
+ descendants_tracker (~> 0.0.4)
34
+ faraday (~> 0.8, < 0.10)
35
+ hashie (>= 3.4)
36
+ multi_json (>= 1.7.5, < 2.0)
37
+ nokogiri (~> 1.6.6)
38
+ oauth2
39
+ globalid (0.3.3)
40
+ activesupport (>= 4.1.0)
41
+ hashie (3.4.2)
42
+ highline (1.6.21)
43
+ i18n (0.7.0)
44
+ jeweler (2.0.1)
45
+ builder
46
+ bundler (>= 1.0)
47
+ git (>= 1.2.5)
48
+ github_api
49
+ highline (>= 1.6.15)
50
+ nokogiri (>= 1.5.10)
51
+ rake
52
+ rdoc
53
+ json (1.8.3)
54
+ jwt (1.0.0)
55
+ metaclass (0.0.4)
56
+ mini_portile (0.6.1)
57
+ minitest (5.7.0)
58
+ mocha (1.1.0)
59
+ metaclass (~> 0.0.1)
60
+ mono_logger (1.1.0)
61
+ multi_json (1.11.2)
62
+ multi_xml (0.5.5)
63
+ multipart-post (2.0.0)
64
+ nokogiri (1.6.6.2)
65
+ mini_portile (~> 0.6.0)
66
+ oauth2 (1.0.0)
67
+ faraday (>= 0.8, < 0.10)
68
+ jwt (~> 1.0)
69
+ multi_json (~> 1.3)
70
+ multi_xml (~> 0.5)
71
+ rack (~> 1.2)
72
+ rack (1.6.0)
73
+ rack-protection (1.5.3)
74
+ rack
75
+ rake (10.4.2)
76
+ rdoc (4.1.0)
77
+ redis (3.2.1)
78
+ redis-namespace (1.5.1)
79
+ redis (~> 3.0, >= 3.0.4)
80
+ resque (1.25.2)
81
+ mono_logger (~> 1.0)
82
+ multi_json (~> 1.0)
83
+ redis-namespace (~> 1.3)
84
+ sinatra (>= 0.9.2)
85
+ vegas (~> 0.1.2)
86
+ rspec (3.1.0)
87
+ rspec-core (~> 3.1.0)
88
+ rspec-expectations (~> 3.1.0)
89
+ rspec-mocks (~> 3.1.0)
90
+ rspec-core (3.1.7)
91
+ rspec-support (~> 3.1.0)
92
+ rspec-expectations (3.1.2)
93
+ diff-lcs (>= 1.2.0, < 2.0)
94
+ rspec-support (~> 3.1.0)
95
+ rspec-mocks (3.1.3)
96
+ rspec-support (~> 3.1.0)
97
+ rspec-support (3.1.2)
98
+ sinatra (1.4.5)
99
+ rack (~> 1.4)
100
+ rack-protection (~> 1.4)
101
+ tilt (~> 1.3, >= 1.3.4)
102
+ thread_safe (0.3.5)
103
+ tilt (1.4.1)
104
+ tzinfo (1.2.2)
105
+ thread_safe (~> 0.1)
106
+ vegas (0.1.11)
107
+ rack (>= 1.0.0)
108
+
109
+ PLATFORMS
110
+ ruby
111
+
112
+ DEPENDENCIES
113
+ resque-restriction!
114
+
115
+ BUNDLED WITH
116
+ 1.10.3
data/README.markdown CHANGED
@@ -41,16 +41,17 @@ You can also add customized restriction as you like. For example, we have a job
41
41
 
42
42
  class GenerateFacebookShares < Resque::Plugins::RestrictionJob
43
43
  restrict :per_day => 40
44
-
44
+
45
45
  def self.restriction_identifier(options)
46
46
  [self.to_s, options["user_id"]].join(":")
47
47
  end
48
-
48
+
49
49
  #rest of your class here
50
50
  end
51
51
 
52
52
  options["user_id"] returns the user's facebook uid, the key point is that the different restriction_identifiers can restrict different job execution numbers.
53
53
 
54
+
54
55
  Contributing
55
56
  ------------
56
57
 
@@ -70,6 +71,8 @@ Contributors
70
71
  ------------
71
72
  Matt Conway :: matt@conwaysplace.com :: @mattconway
72
73
 
74
+ Martin Fourcade :: fourcade.m@gmail.com :: @mfourcade
75
+
73
76
  Copyright
74
77
  ---------
75
78
  Copyright (c) 2010 Richard Huang. See LICENSE for details.
data/Rakefile CHANGED
@@ -1,23 +1,9 @@
1
1
  require 'rake'
2
- require 'spec/rake/spectask'
3
- require 'rake/rdoctask'
2
+ require 'rspec/core/rake_task'
4
3
 
5
- desc 'Default: run unit tests.'
6
- task :default => :spec
7
-
8
- desc 'Generate documentation for the resque-restriction plugin.'
9
- Rake::RDocTask.new(:rdoc) do |rdoc|
10
- rdoc.rdoc_dir = 'rdoc'
11
- rdoc.title = 'resque_restriction'
12
- rdoc.options << '--line-numbers' << '--inline-source'
13
- rdoc.rdoc_files.include('README*')
14
- rdoc.rdoc_files.include('lib/**/*.rb')
15
- end
4
+ RSpec::Core::RakeTask.new(:spec)
16
5
 
17
- desc "Run all specs in spec directory"
18
- Spec::Rake::SpecTask.new(:spec) do |t|
19
- t.spec_files = FileList['spec/**/*_spec.rb']
20
- end
6
+ task :default => :spec
21
7
 
22
8
  begin
23
9
  require 'jeweler'
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.3.0
1
+ 0.4.0
@@ -2,7 +2,7 @@ module Resque
2
2
  class Job
3
3
  class <<self
4
4
  alias_method :origin_reserve, :reserve
5
-
5
+
6
6
  def reserve(queue)
7
7
  if queue =~ /^#{Plugins::Restriction::RESTRICTION_QUEUE_PREFIX}/
8
8
  # If processing the restriction queue, when poping and pushing to end,
@@ -14,7 +14,7 @@ module Resque
14
14
  # and return
15
15
  payload = Resque.pop(queue)
16
16
  if payload
17
- if ! constantize(payload['class']).repush(*payload['args'])
17
+ if !Object.const_get(payload['class']).repush(*payload['args'])
18
18
  return new(queue, payload)
19
19
  end
20
20
  end
@@ -1,5 +1,8 @@
1
+ require 'active_job'
2
+
1
3
  module Resque
2
4
  module Plugins
5
+
3
6
  module Restriction
4
7
  SECONDS = {
5
8
  :per_minute => 60,
@@ -28,7 +31,6 @@ module Resque
28
31
  # if we get a 0 result back, the key wasn't set, so we know we are
29
32
  # already tracking the count for that period'
30
33
  period_active = ! Resque.redis.setnx(key, number.to_i - 1)
31
-
32
34
  # If we are already tracking that period, then decrement by one to
33
35
  # see if we are allowed to run, pushing to restriction queue to run
34
36
  # later if not. Note that the value stored is the number of outstanding
@@ -44,6 +46,9 @@ module Resque
44
46
  Resque.push restriction_queue_name, :class => to_s, :args => args
45
47
  raise Resque::Job::DontPerform
46
48
  end
49
+ else
50
+ # This is the first time we set the key, so we mark it to expire
51
+ mark_restriction_key_to_expire_for(key, period)
47
52
  end
48
53
  end
49
54
  end
@@ -73,16 +78,12 @@ module Resque
73
78
  self.to_s
74
79
  end
75
80
 
76
- def restriction_queue_name
77
- queue_name = Resque.queue_from_class(self)
78
- "#{RESTRICTION_QUEUE_PREFIX}_#{queue_name}"
79
- end
80
81
 
81
82
  def seconds(period)
82
83
  if SECONDS.keys.include? period
83
84
  SECONDS[period]
84
85
  else
85
- period.to_s =~ /^per_(\d+)$/ and $1
86
+ period.to_s =~ /^per_(\d+)$/ and $1.to_i
86
87
  end
87
88
  end
88
89
 
@@ -106,11 +107,30 @@ module Resque
106
107
  end
107
108
  end
108
109
 
110
+ def mark_restriction_key_to_expire_for(key, period)
111
+ Resque.redis.expire(key, seconds(period)) unless period == :concurrent
112
+ end
109
113
  end
110
114
 
111
- class RestrictionJob
115
+ class RestrictionJob < ActiveJob::Base
112
116
  extend Restriction
113
- end
114
117
 
118
+ before_perform do |job|
119
+ self.class.before_perform_restriction(*job.arguments)
120
+ end
121
+
122
+ after_perform do |job|
123
+ self.class.after_perform_restriction(*job.arguments)
124
+ end
125
+
126
+ rescue_from(StandardError) do |err|
127
+ self.class.on_failure_restriction(err, *self.arguments)
128
+ end
129
+
130
+ def self.restriction_queue_name
131
+ queue_name = self.new.queue_name
132
+ "#{Resque::Plugins::Restriction::RESTRICTION_QUEUE_PREFIX}_#{queue_name}"
133
+ end
134
+ end
115
135
  end
116
136
  end
@@ -1,61 +1,58 @@
1
1
  # Generated by jeweler
2
2
  # DO NOT EDIT THIS FILE DIRECTLY
3
- # Instead, edit Jeweler::Tasks in Rakefile, and run the gemspec command
3
+ # Instead, edit Jeweler::Tasks in Rakefile, and run 'rake gemspec'
4
4
  # -*- encoding: utf-8 -*-
5
+ # stub: resque-restriction 0.4.0 ruby lib
5
6
 
6
7
  Gem::Specification.new do |s|
7
- s.name = %q{resque-restriction}
8
- s.version = "0.3.0"
8
+ s.name = "resque-restriction"
9
+ s.version = "0.4.0"
9
10
 
10
11
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
12
+ s.require_paths = ["lib"]
11
13
  s.authors = ["Richard Huang"]
12
- s.date = %q{2010-11-04}
13
- s.description = %q{resque-restriction is an extension to resque queue system that restricts the execution number of certain jobs in a period time, the exceeded jobs will be executed at the next period.}
14
- s.email = %q{flyerhzm@gmail.com}
14
+ s.date = "2015-10-19"
15
+ s.description = "resque-restriction is an extension to resque queue system that restricts the execution number of certain jobs in a period time, the exceeded jobs will be executed at the next period."
16
+ s.email = "flyerhzm@gmail.com"
15
17
  s.extra_rdoc_files = [
16
18
  "LICENSE",
17
- "README.markdown"
19
+ "README.markdown"
18
20
  ]
19
21
  s.files = [
20
- ".gitignore",
21
- ".rvmrc.example",
22
- "LICENSE",
23
- "README.markdown",
24
- "Rakefile",
25
- "VERSION",
26
- "init.rb",
27
- "lib/resque-restriction.rb",
28
- "lib/resque-restriction/job.rb",
29
- "lib/resque-restriction/restriction_job.rb",
30
- "rails/init.rb",
31
- "resque-restriction.gemspec",
32
- "spec/redis-test.conf",
33
- "spec/resque-restriction/job_spec.rb",
34
- "spec/resque-restriction/restriction_job_spec.rb",
35
- "spec/spec.opts",
36
- "spec/spec_helper.rb"
37
- ]
38
- s.homepage = %q{http://github.com/flyerhzm/resque-restriction}
39
- s.rdoc_options = ["--charset=UTF-8"]
40
- s.require_paths = ["lib"]
41
- s.rubygems_version = %q{1.3.7}
42
- s.summary = %q{resque-restriction is an extension to resque queue system that restricts the execution number of certain jobs in a period time.}
43
- s.test_files = [
22
+ "CHANGELOG.md",
23
+ "Gemfile",
24
+ "Gemfile.lock",
25
+ "LICENSE",
26
+ "README.markdown",
27
+ "Rakefile",
28
+ "VERSION",
29
+ "init.rb",
30
+ "lib/resque-restriction.rb",
31
+ "lib/resque-restriction/job.rb",
32
+ "lib/resque-restriction/restriction_job.rb",
33
+ "rails/init.rb",
34
+ "resque-restriction.gemspec",
35
+ "spec/redis-test.conf",
44
36
  "spec/resque-restriction/job_spec.rb",
45
- "spec/resque-restriction/restriction_job_spec.rb",
46
- "spec/spec_helper.rb"
37
+ "spec/resque-restriction/restriction_job_spec.rb",
38
+ "spec/spec_helper.rb"
47
39
  ]
40
+ s.homepage = "http://github.com/flyerhzm/resque-restriction"
41
+ s.rubygems_version = "2.4.8"
42
+ s.summary = "resque-restriction is an extension to resque queue system that restricts the execution number of certain jobs in a period time."
48
43
 
49
44
  if s.respond_to? :specification_version then
50
- current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
51
- s.specification_version = 3
45
+ s.specification_version = 4
52
46
 
53
47
  if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
48
+ s.add_runtime_dependency(%q<resque-restriction>, [">= 0"])
54
49
  s.add_runtime_dependency(%q<resque>, [">= 1.7.0"])
55
50
  else
51
+ s.add_dependency(%q<resque-restriction>, [">= 0"])
56
52
  s.add_dependency(%q<resque>, [">= 1.7.0"])
57
53
  end
58
54
  else
55
+ s.add_dependency(%q<resque-restriction>, [">= 0"])
59
56
  s.add_dependency(%q<resque>, [">= 1.7.0"])
60
57
  end
61
58
  end
data/spec/redis-test.conf CHANGED
@@ -112,7 +112,7 @@ databases 16
112
112
  # Glue small output buffers together in order to send small replies in a
113
113
  # single TCP packet. Uses a bit more CPU but most of the times it is a win
114
114
  # in terms of number of queries per second. Use 'yes' if unsure.
115
- glueoutputbuf yes
115
+ # glueoutputbuf yes
116
116
 
117
117
  # Use object sharing. Can save a lot of memory if you have many common
118
118
  # string in your dataset, but performs lookups against the shared objects
@@ -1,37 +1,37 @@
1
- require File.join(File.dirname(__FILE__) + '/../spec_helper')
1
+ require File.expand_path('../spec_helper', File.dirname(__FILE__))
2
2
 
3
- describe Resque::Job do
4
- before(:each) do
3
+ RSpec.describe Resque::Job do
4
+ before(:example) do
5
5
  Resque.redis.flushall
6
6
  end
7
7
 
8
8
  it "should repush restriction queue when reserve" do
9
9
  Resque.push('restriction_normal', :class => 'OneHourRestrictionJob', :args => ['any args'])
10
- Resque::Job.reserve('restriction_normal').should == Resque::Job.new('restriction_normal', {'class' => 'OneHourRestrictionJob', 'args' => ['any args']})
11
- Resque::Job.reserve('restriction_normal').should be_nil
12
- Resque::Job.reserve('normal').should be_nil
10
+ expect(Resque::Job.reserve('restriction_normal')).to eq Resque::Job.new('restriction_normal', {'class' => 'OneHourRestrictionJob', 'args' => ['any args']})
11
+ expect(Resque::Job.reserve('restriction_normal')).to be_nil
12
+ expect(Resque::Job.reserve('normal')).to be_nil
13
13
  end
14
14
 
15
15
  it "should push back to restriction queue when still restricted" do
16
16
  Resque.redis.set(OneHourRestrictionJob.redis_key(:per_hour), -1)
17
17
  Resque.push('restriction_normal', :class => 'OneHourRestrictionJob', :args => ['any args'])
18
- Resque::Job.reserve('restriction_normal').should be_nil
19
- Resque.pop('restriction_normal').should == {'class' => 'OneHourRestrictionJob', 'args' => ['any args']}
20
- Resque::Job.reserve('normal').should be_nil
18
+ expect(Resque::Job.reserve('restriction_normal')).to be_nil
19
+ expect(Resque.pop('restriction_normal')).to eq({'class' => 'OneHourRestrictionJob', 'args' => ['any args']})
20
+ expect(Resque::Job.reserve('normal')).to be_nil
21
21
  end
22
22
 
23
23
  it "should not repush when reserve normal queue" do
24
24
  Resque.push('normal', :class => 'OneHourRestrictionJob', :args => ['any args'])
25
- Resque::Job.reserve('normal').should == Resque::Job.new('normal', {'class' => 'OneHourRestrictionJob', 'args' => ['any args']})
26
- Resque::Job.reserve('normal').should be_nil
27
- Resque::Job.reserve('restriction_normal').should be_nil
25
+ expect(Resque::Job.reserve('normal')).to eq Resque::Job.new('normal', {'class' => 'OneHourRestrictionJob', 'args' => ['any args']})
26
+ expect(Resque::Job.reserve('normal')).to be_nil
27
+ expect(Resque::Job.reserve('restriction_normal')).to be_nil
28
28
  end
29
29
 
30
30
  it "should only push back queue_length times to restriction queue" do
31
31
  Resque.redis.set(OneHourRestrictionJob.redis_key(:per_hour), -1)
32
32
  3.times { Resque.push('restriction_normal', :class => 'OneHourRestrictionJob', :args => ['any args']) }
33
- Resque.size('restriction_normal').should == 3
34
- OneHourRestrictionJob.should_receive(:repush).exactly(3).times.and_return(true)
33
+ expect(Resque.size('restriction_normal')).to eq 3
34
+ expect(OneHourRestrictionJob).to receive(:repush).exactly(3).times.and_return(true)
35
35
  Resque::Job.reserve('restriction_normal')
36
36
  end
37
37
 
@@ -1,124 +1,220 @@
1
- require File.join(File.dirname(__FILE__) + '/../spec_helper')
1
+ require File.expand_path('../spec_helper', File.dirname(__FILE__))
2
2
 
3
- describe Resque::Plugins::RestrictionJob do
4
- it "should follow the convention" do
3
+ RSpec.describe Resque::Plugins::RestrictionJob do
4
+ skip "should follow the convention" do
5
5
  Resque::Plugin.lint(Resque::Plugins::RestrictionJob)
6
6
  end
7
7
 
8
8
  context "redis_key" do
9
9
  it "should get redis_key with different period" do
10
- Resque::Plugins::RestrictionJob.redis_key(:per_minute).should == "Resque::Plugins::RestrictionJob:#{Time.now.to_i / 60}"
11
- Resque::Plugins::RestrictionJob.redis_key(:per_hour).should == "Resque::Plugins::RestrictionJob:#{Time.now.to_i / (60*60)}"
12
- Resque::Plugins::RestrictionJob.redis_key(:per_day).should == "Resque::Plugins::RestrictionJob:#{Time.now.to_i / (24*60*60)}"
13
- Resque::Plugins::RestrictionJob.redis_key(:per_month).should == "Resque::Plugins::RestrictionJob:#{Date.today.strftime("%Y-%m")}"
14
- Resque::Plugins::RestrictionJob.redis_key(:per_year).should == "Resque::Plugins::RestrictionJob:#{Date.today.year}"
10
+ expect(Resque::Plugins::RestrictionJob.redis_key(:per_minute)).to eq "Resque::Plugins::RestrictionJob:#{Time.now.to_i / 60}"
11
+ expect(Resque::Plugins::RestrictionJob.redis_key(:per_hour)).to eq "Resque::Plugins::RestrictionJob:#{Time.now.to_i / (60*60)}"
12
+ expect(Resque::Plugins::RestrictionJob.redis_key(:per_day)).to eq "Resque::Plugins::RestrictionJob:#{Time.now.to_i / (24*60*60)}"
13
+ expect(Resque::Plugins::RestrictionJob.redis_key(:per_month)).to eq "Resque::Plugins::RestrictionJob:#{Date.today.strftime("%Y-%m")}"
14
+ expect(Resque::Plugins::RestrictionJob.redis_key(:per_year)).to eq "Resque::Plugins::RestrictionJob:#{Date.today.year}"
15
15
  end
16
16
 
17
17
  it "should accept customization" do
18
- Resque::Plugins::RestrictionJob.redis_key(:per_1800).should == "Resque::Plugins::RestrictionJob:#{Time.now.to_i / 1800}"
19
- Resque::Plugins::RestrictionJob.redis_key(:per_7200).should == "Resque::Plugins::RestrictionJob:#{Time.now.to_i / 7200}"
18
+ expect(Resque::Plugins::RestrictionJob.redis_key(:per_1800)).to eq "Resque::Plugins::RestrictionJob:#{Time.now.to_i / 1800}"
19
+ expect(Resque::Plugins::RestrictionJob.redis_key(:per_7200)).to eq "Resque::Plugins::RestrictionJob:#{Time.now.to_i / 7200}"
20
20
  end
21
21
  end
22
-
22
+
23
23
  context "settings" do
24
24
  it "get correct number to restriction jobs" do
25
- OneDayRestrictionJob.settings.should == {:per_day => 100}
26
- OneHourRestrictionJob.settings.should == {:per_hour => 10}
27
- MultipleRestrictionJob.settings.should == {:per_hour => 10, :per_300 => 2}
28
- MultiCallRestrictionJob.settings.should == {:per_hour => 10, :per_300 => 2}
25
+ expect(OneDayRestrictionJob.settings).to eq({:per_day => 100})
26
+ expect(OneHourRestrictionJob.settings).to eq({:per_hour => 10})
27
+ expect(MultipleRestrictionJob.settings).to eq({:per_hour => 10, :per_300 => 2})
28
+ expect(MultiCallRestrictionJob.settings).to eq({:per_hour => 10, :per_300 => 2})
29
29
  end
30
30
  end
31
-
31
+
32
+ context 'restriction_queue_name' do
33
+ class MyJob < Resque::Plugins::RestrictionJob
34
+ queue_as 'awesome_queue_name'
35
+
36
+ def perform(args)
37
+ end
38
+ end
39
+
40
+ it 'concats restriction queue prefix with queue name' do
41
+ expect(MyJob.restriction_queue_name).to eq("#{Resque::Plugins::Restriction::RESTRICTION_QUEUE_PREFIX}_awesome_queue_name")
42
+ end
43
+ end
44
+
32
45
  context "resque" do
33
46
  include PerformJob
34
47
 
35
- before(:each) do
48
+ before(:example) do
36
49
  Resque.redis.flushall
37
50
  end
38
-
51
+
39
52
  it "should set execution number and decrement it when one job first executed" do
40
53
  result = perform_job(OneHourRestrictionJob, "any args")
41
- result.should be_true
42
- Resque.redis.get(OneHourRestrictionJob.redis_key(:per_hour)).should == "9"
54
+ expect(Resque.redis.get(OneHourRestrictionJob.redis_key(:per_hour))).to eq "9"
43
55
  end
44
56
 
45
57
  it "should use restriction_identifier to set exclusive execution counts" do
46
58
  result = perform_job(IdentifiedRestrictionJob, 1)
47
- result.should be_true
48
59
  result = perform_job(IdentifiedRestrictionJob, 1)
49
- result.should be_true
50
60
  result = perform_job(IdentifiedRestrictionJob, 2)
51
- result.should be_true
52
- Resque.redis.get(IdentifiedRestrictionJob.redis_key(:per_hour, 1)).should == "8"
53
- Resque.redis.get(IdentifiedRestrictionJob.redis_key(:per_hour, 2)).should == "9"
61
+
62
+ expect(Resque.redis.get(IdentifiedRestrictionJob.redis_key(:per_hour, 1))).to eq "8"
63
+ expect(Resque.redis.get(IdentifiedRestrictionJob.redis_key(:per_hour, 2))).to eq "9"
54
64
  end
55
65
 
56
66
  it "should decrement execution number when one job executed" do
57
67
  Resque.redis.set(OneHourRestrictionJob.redis_key(:per_hour), 6)
58
68
  result = perform_job(OneHourRestrictionJob, "any args")
59
- result.should be_true
60
- Resque.redis.get(OneHourRestrictionJob.redis_key(:per_hour)).should == "5"
69
+
70
+ expect(Resque.redis.get(OneHourRestrictionJob.redis_key(:per_hour))).to eq "5"
61
71
  end
62
72
 
63
73
  it "should increment execution number when concurrent job completes" do
64
74
  t = Thread.new do
65
- result = perform_job(ConcurrentRestrictionJob, "any args")
66
- result.should be_true
75
+ perform_job(ConcurrentRestrictionJob, "any args")
67
76
  end
68
77
  sleep 0.1
69
- Resque.redis.get(ConcurrentRestrictionJob.redis_key(:concurrent)).should == "0"
78
+ expect(Resque.redis.get(ConcurrentRestrictionJob.redis_key(:concurrent))).to eq "0"
70
79
  t.join
71
- Resque.redis.get(ConcurrentRestrictionJob.redis_key(:concurrent)).should == "1"
80
+ expect(Resque.redis.get(ConcurrentRestrictionJob.redis_key(:concurrent))).to eq "1"
72
81
  end
73
82
 
74
83
  it "should increment execution number when concurrent job fails" do
75
- ConcurrentRestrictionJob.should_receive(:perform).and_raise("bad")
84
+ expect_any_instance_of(ConcurrentRestrictionJob).to receive(:perform).and_raise("bad")
76
85
  perform_job(ConcurrentRestrictionJob, "any args") rescue nil
77
- Resque.redis.get(ConcurrentRestrictionJob.redis_key(:concurrent)).should == "1"
86
+ expect(Resque.redis.get(ConcurrentRestrictionJob.redis_key(:concurrent))).to eq "1"
78
87
  end
79
88
 
80
89
  it "should put the job into restriction queue when execution count < 0" do
81
90
  Resque.redis.set(OneHourRestrictionJob.redis_key(:per_hour), 0)
82
91
  result = perform_job(OneHourRestrictionJob, "any args")
83
- result.should_not be_true
84
- Resque.redis.get(OneHourRestrictionJob.redis_key(:per_hour)).should == "0"
85
- Resque.redis.lrange("queue:restriction_normal", 0, -1).should == [Resque.encode(:class => "OneHourRestrictionJob", :args => ["any args"])]
92
+ # expect(result).to_not be(true)
93
+ expect(Resque.redis.get(OneHourRestrictionJob.redis_key(:per_hour))).to eq "0"
94
+ expect(Resque.redis.lrange("queue:restriction_normal", 0, -1)).to eq [Resque.encode(:class => "OneHourRestrictionJob", :args => ["any args"])]
95
+ end
96
+
97
+ describe "expiration of period keys" do
98
+ class MyJob < Resque::Plugins::RestrictionJob
99
+ def perform(args)
100
+ end
101
+ end
102
+
103
+ shared_examples_for "expiration" do
104
+ before(:example) do
105
+ MyJob.restrict period => 10
106
+ end
107
+
108
+ context "when the key is not set" do
109
+ it "should mark period keys to expire" do
110
+ perform_job(MyJob, "any args")
111
+ expect(Resque.redis.ttl(MyJob.redis_key(period))).to eq MyJob.seconds(period)
112
+ end
113
+ end
114
+
115
+ context "when the key is set" do
116
+ before(:example) do
117
+ Resque.redis.set(MyJob.redis_key(period), 5)
118
+ end
119
+
120
+ it "should not mark period keys to expire" do
121
+ perform_job(MyJob, "any args")
122
+ expect(Resque.redis.ttl(MyJob.redis_key(period))).to eq -1
123
+ end
124
+ end
125
+ end
126
+
127
+ describe "per minute" do
128
+ def period
129
+ :per_minute
130
+ end
131
+
132
+ it_should_behave_like "expiration"
133
+ end
134
+
135
+ describe "per hour" do
136
+ def period
137
+ :per_hour
138
+ end
139
+
140
+ it_should_behave_like "expiration"
141
+ end
142
+
143
+ describe "per day" do
144
+ def period
145
+ :per_day
146
+ end
147
+
148
+ it_should_behave_like "expiration"
149
+ end
150
+
151
+ describe "per week" do
152
+ def period
153
+ :per_week
154
+ end
155
+
156
+ it_should_behave_like "expiration"
157
+ end
158
+
159
+ describe "per month" do
160
+ def period
161
+ :per_month
162
+ end
163
+
164
+ it_should_behave_like "expiration"
165
+ end
166
+
167
+ describe "per year" do
168
+ def period
169
+ :per_year
170
+ end
171
+
172
+ it_should_behave_like "expiration"
173
+ end
174
+
175
+ describe "per custom period" do
176
+ def period
177
+ :per_359
178
+ end
179
+
180
+ it_should_behave_like "expiration"
181
+ end
86
182
  end
87
183
 
88
184
  context "multiple restrict" do
89
185
  it "should restrict per_minute" do
90
186
  result = perform_job(MultipleRestrictionJob, "any args")
91
- Resque.redis.get(MultipleRestrictionJob.redis_key(:per_hour)).should == "9"
92
- Resque.redis.get(MultipleRestrictionJob.redis_key(:per_300)).should == "1"
187
+ expect(Resque.redis.get(MultipleRestrictionJob.redis_key(:per_hour))).to eq "9"
188
+ expect(Resque.redis.get(MultipleRestrictionJob.redis_key(:per_300))).to eq "1"
93
189
  result = perform_job(MultipleRestrictionJob, "any args")
94
190
  result = perform_job(MultipleRestrictionJob, "any args")
95
- Resque.redis.get(MultipleRestrictionJob.redis_key(:per_hour)).should == "8"
96
- Resque.redis.get(MultipleRestrictionJob.redis_key(:per_300)).should == "0"
191
+ expect(Resque.redis.get(MultipleRestrictionJob.redis_key(:per_hour))).to eq "8"
192
+ expect(Resque.redis.get(MultipleRestrictionJob.redis_key(:per_300))).to eq "0"
97
193
  end
98
194
 
99
195
  it "should restrict per_hour" do
100
196
  Resque.redis.set(MultipleRestrictionJob.redis_key(:per_hour), 1)
101
197
  Resque.redis.set(MultipleRestrictionJob.redis_key(:per_300), 2)
102
198
  result = perform_job(MultipleRestrictionJob, "any args")
103
- Resque.redis.get(MultipleRestrictionJob.redis_key(:per_hour)).should == "0"
104
- Resque.redis.get(MultipleRestrictionJob.redis_key(:per_300)).should == "1"
199
+ expect(Resque.redis.get(MultipleRestrictionJob.redis_key(:per_hour))).to eq "0"
200
+ expect(Resque.redis.get(MultipleRestrictionJob.redis_key(:per_300))).to eq "1"
105
201
  result = perform_job(MultipleRestrictionJob, "any args")
106
- Resque.redis.get(MultipleRestrictionJob.redis_key(:per_hour)).should == "0"
107
- Resque.redis.get(MultipleRestrictionJob.redis_key(:per_300)).should == "1"
202
+ expect(Resque.redis.get(MultipleRestrictionJob.redis_key(:per_hour))).to eq "0"
203
+ expect(Resque.redis.get(MultipleRestrictionJob.redis_key(:per_300))).to eq "1"
108
204
  end
109
205
  end
110
206
 
111
207
  context "repush" do
112
208
  it "should push restricted jobs onto restriction queue" do
113
209
  Resque.redis.set(OneHourRestrictionJob.redis_key(:per_hour), -1)
114
- Resque.should_receive(:push).once.with('restriction_normal', :class => 'OneHourRestrictionJob', :args => ['any args'])
115
- OneHourRestrictionJob.repush('any args').should be_true
210
+ expect(Resque).to receive(:push).once.with('restriction_normal', :class => 'OneHourRestrictionJob', :args => ['any args'])
211
+ expect(OneHourRestrictionJob.repush('any args')).to be(true)
116
212
  end
117
213
 
118
214
  it "should not push unrestricted jobs onto restriction queue" do
119
215
  Resque.redis.set(OneHourRestrictionJob.redis_key(:per_hour), 1)
120
- Resque.should_not_receive(:push)
121
- OneHourRestrictionJob.repush('any args').should be_false
216
+ expect(Resque).not_to receive(:push)
217
+ expect(OneHourRestrictionJob.repush('any args')).to be(false)
122
218
  end
123
219
 
124
220
  end
data/spec/spec_helper.rb CHANGED
@@ -1,5 +1,4 @@
1
1
  require 'rubygems'
2
- require 'spec/autorun'
3
2
  require 'mocha'
4
3
 
5
4
  dir = File.dirname(__FILE__)
@@ -38,53 +37,52 @@ puts "Starting redis for testing at localhost:9736..."
38
37
  `redis-server #{dir}/redis-test.conf`
39
38
  Resque.redis = 'localhost:9736'
40
39
 
41
- ##
40
+ #
42
41
  # Helper to perform job classes
43
42
  #
44
43
  module PerformJob
45
44
  def perform_job(klass, *args)
46
- resque_job = Resque::Job.new(:testqueue, 'class' => klass, 'args' => args)
47
- resque_job.perform
45
+ klass.perform_now(*args)
48
46
  end
49
47
  end
50
48
 
51
49
  class OneDayRestrictionJob < Resque::Plugins::RestrictionJob
52
50
  restrict :per_day => 100
53
51
 
54
- @queue = 'normal'
55
-
56
- def self.perform(args)
52
+ queue_as 'normal'
53
+
54
+ def perform(args)
57
55
  end
58
56
  end
59
57
 
60
58
  class OneHourRestrictionJob < Resque::Plugins::RestrictionJob
61
59
  restrict :per_hour => 10
62
60
 
63
- @queue = 'normal'
61
+ queue_as 'normal'
64
62
 
65
- def self.perform(args)
63
+ def perform(args)
66
64
  end
67
65
  end
68
66
 
69
67
  class IdentifiedRestrictionJob < Resque::Plugins::RestrictionJob
70
68
  restrict :per_hour => 10
71
69
 
72
- @queue = 'normal'
70
+ queue_as 'normal'
73
71
 
74
72
  def self.restriction_identifier(*args)
75
73
  [self.to_s, args.first].join(":")
76
74
  end
77
75
 
78
- def self.perform(*args)
76
+ def perform(args)
79
77
  end
80
78
  end
81
79
 
82
80
  class ConcurrentRestrictionJob < Resque::Plugins::RestrictionJob
83
81
  restrict :concurrent => 1
84
82
 
85
- @queue = 'normal'
83
+ queue_as 'normal'
86
84
 
87
- def self.perform(*args)
85
+ def perform(args)
88
86
  sleep 0.2
89
87
  end
90
88
  end
@@ -92,9 +90,9 @@ end
92
90
  class MultipleRestrictionJob < Resque::Plugins::RestrictionJob
93
91
  restrict :per_hour => 10, :per_300 => 2
94
92
 
95
- @queue = 'normal'
93
+ queue_as 'normal'
96
94
 
97
- def self.perform(args)
95
+ def perform(args)
98
96
  end
99
97
  end
100
98
 
@@ -102,8 +100,8 @@ class MultiCallRestrictionJob < Resque::Plugins::RestrictionJob
102
100
  restrict :per_hour => 10
103
101
  restrict :per_300 => 2
104
102
 
105
- @queue = 'normal'
103
+ queue_as 'normal'
106
104
 
107
- def self.perform(args)
105
+ def perform(args)
108
106
  end
109
- end
107
+ end
metadata CHANGED
@@ -1,51 +1,56 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: resque-restriction
3
- version: !ruby/object:Gem::Version
4
- hash: 19
5
- prerelease: false
6
- segments:
7
- - 0
8
- - 3
9
- - 0
10
- version: 0.3.0
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.4.0
11
5
  platform: ruby
12
- authors:
6
+ authors:
13
7
  - Richard Huang
14
8
  autorequire:
15
9
  bindir: bin
16
10
  cert_chain: []
17
-
18
- date: 2010-11-04 00:00:00 +08:00
19
- default_executable:
20
- dependencies:
21
- - !ruby/object:Gem::Dependency
22
- name: resque
11
+ date: 2015-10-19 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: resque-restriction
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :runtime
23
21
  prerelease: false
24
- requirement: &id001 !ruby/object:Gem::Requirement
25
- none: false
26
- requirements:
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: resque
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
27
31
  - - ">="
28
- - !ruby/object:Gem::Version
29
- hash: 11
30
- segments:
31
- - 1
32
- - 7
33
- - 0
32
+ - !ruby/object:Gem::Version
34
33
  version: 1.7.0
35
34
  type: :runtime
36
- version_requirements: *id001
37
- description: resque-restriction is an extension to resque queue system that restricts the execution number of certain jobs in a period time, the exceeded jobs will be executed at the next period.
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: 1.7.0
41
+ description: resque-restriction is an extension to resque queue system that restricts
42
+ the execution number of certain jobs in a period time, the exceeded jobs will be
43
+ executed at the next period.
38
44
  email: flyerhzm@gmail.com
39
45
  executables: []
40
-
41
46
  extensions: []
42
-
43
- extra_rdoc_files:
47
+ extra_rdoc_files:
44
48
  - LICENSE
45
49
  - README.markdown
46
- files:
47
- - .gitignore
48
- - .rvmrc.example
50
+ files:
51
+ - CHANGELOG.md
52
+ - Gemfile
53
+ - Gemfile.lock
49
54
  - LICENSE
50
55
  - README.markdown
51
56
  - Rakefile
@@ -59,43 +64,29 @@ files:
59
64
  - spec/redis-test.conf
60
65
  - spec/resque-restriction/job_spec.rb
61
66
  - spec/resque-restriction/restriction_job_spec.rb
62
- - spec/spec.opts
63
67
  - spec/spec_helper.rb
64
- has_rdoc: true
65
68
  homepage: http://github.com/flyerhzm/resque-restriction
66
69
  licenses: []
67
-
70
+ metadata: {}
68
71
  post_install_message:
69
- rdoc_options:
70
- - --charset=UTF-8
71
- require_paths:
72
+ rdoc_options: []
73
+ require_paths:
72
74
  - lib
73
- required_ruby_version: !ruby/object:Gem::Requirement
74
- none: false
75
- requirements:
75
+ required_ruby_version: !ruby/object:Gem::Requirement
76
+ requirements:
76
77
  - - ">="
77
- - !ruby/object:Gem::Version
78
- hash: 3
79
- segments:
80
- - 0
81
- version: "0"
82
- required_rubygems_version: !ruby/object:Gem::Requirement
83
- none: false
84
- requirements:
78
+ - !ruby/object:Gem::Version
79
+ version: '0'
80
+ required_rubygems_version: !ruby/object:Gem::Requirement
81
+ requirements:
85
82
  - - ">="
86
- - !ruby/object:Gem::Version
87
- hash: 3
88
- segments:
89
- - 0
90
- version: "0"
83
+ - !ruby/object:Gem::Version
84
+ version: '0'
91
85
  requirements: []
92
-
93
86
  rubyforge_project:
94
- rubygems_version: 1.3.7
87
+ rubygems_version: 2.4.8
95
88
  signing_key:
96
- specification_version: 3
97
- summary: resque-restriction is an extension to resque queue system that restricts the execution number of certain jobs in a period time.
98
- test_files:
99
- - spec/resque-restriction/job_spec.rb
100
- - spec/resque-restriction/restriction_job_spec.rb
101
- - spec/spec_helper.rb
89
+ specification_version: 4
90
+ summary: resque-restriction is an extension to resque queue system that restricts
91
+ the execution number of certain jobs in a period time.
92
+ test_files: []
data/.gitignore DELETED
@@ -1,5 +0,0 @@
1
- spec/dump.rdb
2
- pkg/**
3
- .idea
4
- .rvmrc
5
-
data/.rvmrc.example DELETED
@@ -1,2 +0,0 @@
1
- rvm_gemset_create_on_use_flag=1
2
- rvm gemset use resque-restriction
data/spec/spec.opts DELETED
@@ -1,8 +0,0 @@
1
- --colour
2
- --format
3
- specdoc
4
- --reverse
5
- --timeout
6
- 20
7
- --loadby
8
- mtime