resque-single 0.0.2

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: 64d6d2ad6223b4a2d43938640d464e63e9b62743
4
+ data.tar.gz: ba36f7360b4e5584944b11a17a50f17a781d9b2b
5
+ SHA512:
6
+ metadata.gz: 570b7839c31da2f740249bfa33c3529fa95bc93e8628b4d11b25a9d94aa79ef0d473b4fc296a69aaec308f3fcc2e3b74eedabe948c55ddce8e6e7858b59bea11
7
+ data.tar.gz: 563345347ce30a36583822caa0d8c6204032d4a5f2a883e85f3dcc0526ef8bbec82c15be7b0382b1c0490d6e7f39c9ea5eea405fc24a2e8a411bbd35f54c80ff
data/.gitignore ADDED
@@ -0,0 +1,14 @@
1
+ /.bundle/
2
+ /.yardoc
3
+ /Gemfile.lock
4
+ /_yardoc/
5
+ /coverage/
6
+ /doc/
7
+ /pkg/
8
+ /spec/reports/
9
+ /tmp/
10
+ *.bundle
11
+ *.so
12
+ *.o
13
+ *.a
14
+ mkmf.log
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in resque-unique.gemspec
4
+ gemspec
data/LICENSE.txt ADDED
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2014 bibendi
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,31 @@
1
+ # Resque::Single
2
+
3
+ TODO: Write a gem description
4
+
5
+ ## Installation
6
+
7
+ Add this line to your application's Gemfile:
8
+
9
+ ```ruby
10
+ gem 'resque-unique'
11
+ ```
12
+
13
+ And then execute:
14
+
15
+ $ bundle
16
+
17
+ Or install it yourself as:
18
+
19
+ $ gem install resque-unique
20
+
21
+ ## Usage
22
+
23
+ TODO: Write usage instructions here
24
+
25
+ ## Contributing
26
+
27
+ 1. Fork it ( https://bitbucket.org/shiplix/resque-single/fork )
28
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
29
+ 3. Commit your changes (`git commit -am 'Add some feature'`)
30
+ 4. Push to the branch (`git push origin my-new-feature`)
31
+ 5. Create a new Pull Request
data/Rakefile ADDED
@@ -0,0 +1,2 @@
1
+ require "bundler/gem_tasks"
2
+
@@ -0,0 +1,157 @@
1
+ require 'resque/single/version'
2
+ require 'resque'
3
+ require 'digest/sha1'
4
+ require 'active_support/core_ext/module/aliasing'
5
+ require 'resque/plugins/lock'
6
+ silence_warnings { require 'resque/plugins/progress' } # suppress Resque::Helpers warn
7
+
8
+ # Unique job
9
+ #
10
+ # Examples
11
+ # class MyJob
12
+ # extend Resque::Single
13
+ #
14
+ # # jobs are considered as equal if their first argument is the same
15
+ # lock_on { |*args| args.first }
16
+ #
17
+ # def self.execute(image_id)
18
+ # # do it
19
+ # end
20
+ # end
21
+ #
22
+ # MyJob.enqueue(11)
23
+ module Resque
24
+ module Single
25
+ def self.extended(base)
26
+ base.extend(Resque::Plugins::Progress)
27
+ base.extend(Resque::Plugins::Lock)
28
+ base.extend(ClassMethods)
29
+ base.singleton_class.class_eval do
30
+ alias_method_chain :enqueue, :check
31
+ end
32
+ end
33
+
34
+ module ClassMethods
35
+ def scheduled(queue, klass, *args)
36
+ klass.constantize.enqueue(*args)
37
+ end
38
+
39
+ def retry_args(*args)
40
+ args.shift
41
+ args
42
+ end
43
+
44
+ # Get or set proc returning unique arguments
45
+ def lock_on(&block)
46
+ if block_given?
47
+ @unique = block
48
+ else
49
+ @unique ||= proc { |*args| args }
50
+ end
51
+ end
52
+
53
+ # LockID should be independent from MetaID
54
+ def lock(meta_id, *args)
55
+ "lock:#{name}-#{Digest::SHA1.hexdigest(obj_to_string(lock_on[*args]))}"
56
+ end
57
+
58
+ # Overriding +meta_id+ here so now it generates the same MetaID for Jobs with same args
59
+ def meta_id(*args)
60
+ Digest::SHA1.hexdigest(['resque-unique', self, lock_on[*args]].join)
61
+ end
62
+
63
+ # get meta object associated with job
64
+ def meta
65
+ get_meta(@meta_id)
66
+ end
67
+
68
+ # default `perform` method override
69
+ def perform(meta_id, *args)
70
+ execute(*args)
71
+ end
72
+
73
+ def execute(*)
74
+ raise NotImplementedError, "You should implement `execute' method"
75
+ end
76
+
77
+ # When job is failed we should remove lock
78
+ def on_failure_lock(e, *args)
79
+ unlock(*args)
80
+ end
81
+
82
+ # Before dequeue check if job is running
83
+ def before_dequeue_lock(*args)
84
+ (meta_id = args.first) &&
85
+ (meta = get_meta(meta_id)) &&
86
+ !meta.working?
87
+ end
88
+
89
+ # When job is dequeued we should remove lock
90
+ def after_dequeue_lock(*args)
91
+ unlock(*args) if args.any?
92
+ end
93
+
94
+ # Fail metadata if dequeue succeed
95
+ def after_dequeue_meta(*args)
96
+ if (meta_id = args.first) && (meta = get_meta(meta_id))
97
+ meta.fail!
98
+ end
99
+ end
100
+
101
+ # Is job already in queue or in process?
102
+ def enqueued?(*args)
103
+ # if lock exists and timeout not exceeded
104
+ if locked?(*args)
105
+ get_meta(meta_id(*args))
106
+ else
107
+ nil
108
+ end
109
+ end
110
+
111
+ # Returns true if resque job is in locked state
112
+ def locked?(*args)
113
+ key = lock(nil, *args)
114
+ now = Time.now.to_i
115
+
116
+ Resque.redis.exists(key) && now <= Resque.redis.get(key).to_i
117
+ end
118
+
119
+ # Dequeue unique job
120
+ def dequeue(*args)
121
+ Resque.dequeue(self, meta_id(*args), *args)
122
+ end
123
+
124
+ # Overriding +enqueue+ method here so now it returns existing metadata if job already queued
125
+ def enqueue_with_check(*args) #:nodoc:
126
+ meta = enqueued?(*args) and return meta
127
+
128
+ # enqueue job and retrieve its meta
129
+ enqueue_without_check(*args)
130
+ end
131
+
132
+ private
133
+ # Remove lock for job with given +args+
134
+ def unlock(*args)
135
+ Resque.redis.del(lock(*args))
136
+ end
137
+
138
+ def obj_to_string(obj)
139
+ case obj
140
+ when Hash
141
+ s = []
142
+ obj.keys.sort.each do |k|
143
+ s << obj_to_string(k)
144
+ s << obj_to_string(obj[k])
145
+ end
146
+ s.to_s
147
+ when Array
148
+ s = []
149
+ obj.each { |a| s << obj_to_string(a) }
150
+ s.to_s
151
+ else
152
+ obj.to_s
153
+ end
154
+ end
155
+ end
156
+ end
157
+ end
@@ -0,0 +1,5 @@
1
+ module Resque
2
+ module Single
3
+ VERSION = "0.0.2"
4
+ end
5
+ end
@@ -0,0 +1,28 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'resque/single/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "resque-single"
8
+ spec.version = Resque::Single::VERSION
9
+ spec.authors = ["bibendi"]
10
+ spec.email = ["bibendi@bk.ru"]
11
+ spec.summary = 'Integration of resque with resque-progress and resque-lock'
12
+ spec.homepage = "https://bitbucket.org/shiplix/resque-single"
13
+ spec.license = "MIT"
14
+
15
+ spec.files = `git ls-files -z`.split("\x0")
16
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
17
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
18
+ spec.require_paths = ["lib"]
19
+
20
+ spec.add_runtime_dependency 'activesupport', '>= 3.0'
21
+ spec.add_runtime_dependency 'resque', '~> 1.25'
22
+ spec.add_runtime_dependency 'resque-lock', '~> 1.1.0'
23
+ spec.add_runtime_dependency 'resque-meta', '>= 2.0.0'
24
+ spec.add_runtime_dependency 'resque-progress', '~> 1.0.1'
25
+
26
+ spec.add_development_dependency "bundler", "~> 1.7"
27
+ spec.add_development_dependency "rake", "~> 10.0"
28
+ end
metadata ADDED
@@ -0,0 +1,150 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: resque-single
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.2
5
+ platform: ruby
6
+ authors:
7
+ - bibendi
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2014-12-28 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ prerelease: false
15
+ version_requirements: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - '>='
18
+ - !ruby/object:Gem::Version
19
+ version: '3.0'
20
+ requirement: !ruby/object:Gem::Requirement
21
+ requirements:
22
+ - - '>='
23
+ - !ruby/object:Gem::Version
24
+ version: '3.0'
25
+ type: :runtime
26
+ name: activesupport
27
+ - !ruby/object:Gem::Dependency
28
+ prerelease: false
29
+ version_requirements: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ~>
32
+ - !ruby/object:Gem::Version
33
+ version: '1.25'
34
+ requirement: !ruby/object:Gem::Requirement
35
+ requirements:
36
+ - - ~>
37
+ - !ruby/object:Gem::Version
38
+ version: '1.25'
39
+ type: :runtime
40
+ name: resque
41
+ - !ruby/object:Gem::Dependency
42
+ prerelease: false
43
+ version_requirements: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ~>
46
+ - !ruby/object:Gem::Version
47
+ version: 1.1.0
48
+ requirement: !ruby/object:Gem::Requirement
49
+ requirements:
50
+ - - ~>
51
+ - !ruby/object:Gem::Version
52
+ version: 1.1.0
53
+ type: :runtime
54
+ name: resque-lock
55
+ - !ruby/object:Gem::Dependency
56
+ prerelease: false
57
+ version_requirements: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - '>='
60
+ - !ruby/object:Gem::Version
61
+ version: 2.0.0
62
+ requirement: !ruby/object:Gem::Requirement
63
+ requirements:
64
+ - - '>='
65
+ - !ruby/object:Gem::Version
66
+ version: 2.0.0
67
+ type: :runtime
68
+ name: resque-meta
69
+ - !ruby/object:Gem::Dependency
70
+ prerelease: false
71
+ version_requirements: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ~>
74
+ - !ruby/object:Gem::Version
75
+ version: 1.0.1
76
+ requirement: !ruby/object:Gem::Requirement
77
+ requirements:
78
+ - - ~>
79
+ - !ruby/object:Gem::Version
80
+ version: 1.0.1
81
+ type: :runtime
82
+ name: resque-progress
83
+ - !ruby/object:Gem::Dependency
84
+ prerelease: false
85
+ version_requirements: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ~>
88
+ - !ruby/object:Gem::Version
89
+ version: '1.7'
90
+ requirement: !ruby/object:Gem::Requirement
91
+ requirements:
92
+ - - ~>
93
+ - !ruby/object:Gem::Version
94
+ version: '1.7'
95
+ type: :development
96
+ name: bundler
97
+ - !ruby/object:Gem::Dependency
98
+ prerelease: false
99
+ version_requirements: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - ~>
102
+ - !ruby/object:Gem::Version
103
+ version: '10.0'
104
+ requirement: !ruby/object:Gem::Requirement
105
+ requirements:
106
+ - - ~>
107
+ - !ruby/object:Gem::Version
108
+ version: '10.0'
109
+ type: :development
110
+ name: rake
111
+ description:
112
+ email:
113
+ - bibendi@bk.ru
114
+ executables: []
115
+ extensions: []
116
+ extra_rdoc_files: []
117
+ files:
118
+ - .gitignore
119
+ - Gemfile
120
+ - LICENSE.txt
121
+ - README.md
122
+ - Rakefile
123
+ - lib/resque/single.rb
124
+ - lib/resque/single/version.rb
125
+ - resque-single.gemspec
126
+ homepage: https://bitbucket.org/shiplix/resque-single
127
+ licenses:
128
+ - MIT
129
+ metadata: {}
130
+ post_install_message:
131
+ rdoc_options: []
132
+ require_paths:
133
+ - lib
134
+ required_ruby_version: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - '>='
137
+ - !ruby/object:Gem::Version
138
+ version: '0'
139
+ required_rubygems_version: !ruby/object:Gem::Requirement
140
+ requirements:
141
+ - - '>='
142
+ - !ruby/object:Gem::Version
143
+ version: '0'
144
+ requirements: []
145
+ rubyforge_project:
146
+ rubygems_version: 2.4.2
147
+ signing_key:
148
+ specification_version: 4
149
+ summary: Integration of resque with resque-progress and resque-lock
150
+ test_files: []