sidekiq-delay_extensions 6.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
+ SHA256:
3
+ metadata.gz: 716a9aa8fc7cb10a70fa3677b0f23c782cf07bb31fe9ad5423da4c1b065a8477
4
+ data.tar.gz: a2652e237b7de3ca5a8a4cbb72655f805fb535b4e52b8aacf8d3c0b9a479515c
5
+ SHA512:
6
+ metadata.gz: e9a1f926727cb57afc4221a2b23ea5c025f0ab566e9c2b000b46a51258376cede7bddb3795128456e2792a92a1352cc6a3e7c9b6793a4e8ff91dd1cf9993e7ae
7
+ data.tar.gz: 800db7a111af06c8854f348ce117d535bb4b88f9e54f2435f80bbcbf3db5a48b10f67ec1ba7655030d4b8dbc7fbbc2c13aa53e7bbc53eda0e84c597380401adc
data/Changes.md ADDED
@@ -0,0 +1,13 @@
1
+ # Sidekiq Delay Extensions Changes
2
+
3
+ [Sidekiq Changes](https://github.com/gemhome/sidekiq-delay_extensions/blob/main/Changes.md)
4
+
5
+ 6.4.1
6
+ ---------
7
+
8
+ - Extracted from https://github.com/mperham/sidekiq/tree/v6.4.1
9
+
10
+ 6.4.0
11
+ ---------
12
+
13
+ - Extracted from https://github.com/mperham/sidekiq/tree/v6.4.0
data/Gemfile ADDED
@@ -0,0 +1,28 @@
1
+ source "https://rubygems.org"
2
+
3
+ gemspec
4
+
5
+ gem "sidekiq", ">= 6.4.0"
6
+ gem "rake"
7
+ gem "redis-namespace"
8
+ gem "rails", ">= 6.0.2"
9
+ gem "sqlite3", platforms: :ruby
10
+ gem "activerecord-jdbcsqlite3-adapter", platforms: :jruby
11
+
12
+ # mail dependencies
13
+ gem "net-smtp", platforms: :mri, require: false
14
+
15
+ group :test do
16
+ gem "minitest"
17
+ gem "simplecov"
18
+ gem "codecov", require: false
19
+ end
20
+
21
+ group :development, :test do
22
+ gem "standard", require: false
23
+ end
24
+
25
+ group :load_test do
26
+ gem "hiredis"
27
+ gem "toxiproxy"
28
+ end
data/LICENSE ADDED
@@ -0,0 +1,9 @@
1
+ Copyright (c) Contributed Systems LLC
2
+
3
+ Sidekiq is an Open Source project licensed under the terms of
4
+ the LGPLv3 license. Please see <http://www.gnu.org/licenses/lgpl-3.0.html>
5
+ for license text.
6
+
7
+ Sidekiq Pro and Sidekiq Enterprise have a commercial-friendly license.
8
+ You can find the commercial license in COMM-LICENSE.txt.
9
+ Please see https://sidekiq.org for purchasing options.
data/README.md ADDED
@@ -0,0 +1,54 @@
1
+ Sidekiq Delay Extensions
2
+ ==============
3
+
4
+ [![Gem Version](https://badge.fury.io/rb/sidekiq-delay_extensions.svg)](https://rubygems.org/gems/sidekiq-delay_extensions)
5
+ ![Build](https://github.com/gehome/sidekiq-delay_extensions/workflows/CI/badge.svg)
6
+
7
+ The [Sidekiq delay extensions are deprecated in 6.x and will be removed from 7.x](https://github.com/mperham/sidekiq/issues/5076).
8
+
9
+ This gem extracts the delay extensions from the latest 6.x release and will match
10
+ Sidekiq 6.x version numbers.
11
+
12
+ When Sidekiq reaches 7.0, this gem will begin being maintained on its own. Maintainers wanted.
13
+
14
+ Requirements
15
+ -----------------
16
+
17
+ - See https://github.com/mperham/sidekiq/tree/v6.4.0
18
+ - Redis: 4.0+
19
+ - Ruby: MRI 2.5+ or JRuby 9.2+.
20
+ - Sidekiq 6.0 supports Rails 5.0+ but does not require it.
21
+
22
+ Installation
23
+ -----------------
24
+
25
+ gem install sidekiq
26
+ gem install sidekiq-delay_extensions
27
+
28
+ In your initializers, include the line:
29
+
30
+ Sidekiq::DelayExtensions.enable_delay!
31
+
32
+ Testing
33
+ -----------------
34
+
35
+ In your test environment, include the line:
36
+
37
+ require "sidekiq/delay_extensions/testing"
38
+
39
+ Contributing
40
+ -----------------
41
+
42
+ Please see [the contributing guidelines](https://github.com/gemhome/sidekiq-delay_extensions/blob/main/.github/contributing.md).
43
+
44
+
45
+ License
46
+ -----------------
47
+
48
+ Please see [LICENSE](https://github.com/gemhome/sidekiq-delay_extensions/blob/main/LICENSE) for licensing details.
49
+
50
+
51
+ Original Author
52
+ -----------------
53
+
54
+ Mike Perham, [@getajobmike](https://twitter.com/getajobmike) / [@sidekiq](https://twitter.com/sidekiq), [https://www.mikeperham.com](https://www.mikeperham.com) / [https://www.contribsys.com](https://www.contribsys.com)
@@ -0,0 +1,48 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "sidekiq/delay_extensions/generic_proxy"
4
+
5
+ module Sidekiq
6
+ module DelayExtensions
7
+ ##
8
+ # Adds +delay+, +delay_for+ and +delay_until+ methods to ActionMailer to offload arbitrary email
9
+ # delivery to Sidekiq.
10
+ #
11
+ # @example
12
+ # UserMailer.delay.send_welcome_email(new_user)
13
+ # UserMailer.delay_for(5.days).send_welcome_email(new_user)
14
+ # UserMailer.delay_until(5.days.from_now).send_welcome_email(new_user)
15
+ class DelayedMailer
16
+ include Sidekiq::Worker
17
+
18
+ def perform(yml)
19
+ (target, method_name, args, kwargs) = YAML.load(yml)
20
+ msg = kwargs.empty? ? target.public_send(method_name, *args) : target.public_send(method_name, *args, **kwargs)
21
+ # The email method can return nil, which causes ActionMailer to return
22
+ # an undeliverable empty message.
23
+ if msg
24
+ msg.deliver_now
25
+ else
26
+ raise "#{target.name}##{method_name} returned an undeliverable mail object"
27
+ end
28
+ end
29
+ end
30
+
31
+ module ActionMailer
32
+ def sidekiq_delay(options = {})
33
+ Proxy.new(DelayedMailer, self, options)
34
+ end
35
+
36
+ def sidekiq_delay_for(interval, options = {})
37
+ Proxy.new(DelayedMailer, self, options.merge("at" => Time.now.to_f + interval.to_f))
38
+ end
39
+
40
+ def sidekiq_delay_until(timestamp, options = {})
41
+ Proxy.new(DelayedMailer, self, options.merge("at" => timestamp.to_f))
42
+ end
43
+ alias_method :delay, :sidekiq_delay
44
+ alias_method :delay_for, :sidekiq_delay_for
45
+ alias_method :delay_until, :sidekiq_delay_until
46
+ end
47
+ end
48
+ end
@@ -0,0 +1,43 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "sidekiq/delay_extensions/generic_proxy"
4
+
5
+ module Sidekiq
6
+ module DelayExtensions
7
+ ##
8
+ # Adds +delay+, +delay_for+ and +delay_until+ methods to ActiveRecord to offload instance method
9
+ # execution to Sidekiq.
10
+ #
11
+ # @example
12
+ # User.recent_signups.each { |user| user.delay.mark_as_awesome }
13
+ #
14
+ # Please note, this is not recommended as this will serialize the entire
15
+ # object to Redis. Your Sidekiq jobs should pass IDs, not entire instances.
16
+ # This is here for backwards compatibility with Delayed::Job only.
17
+ class DelayedModel
18
+ include Sidekiq::Worker
19
+
20
+ def perform(yml)
21
+ (target, method_name, args, kwargs) = YAML.load(yml)
22
+ kwargs.empty? ? target.__send__(method_name, *args) : target.__send__(method_name, *args, **kwargs)
23
+ end
24
+ end
25
+
26
+ module ActiveRecord
27
+ def sidekiq_delay(options = {})
28
+ Proxy.new(DelayedModel, self, options)
29
+ end
30
+
31
+ def sidekiq_delay_for(interval, options = {})
32
+ Proxy.new(DelayedModel, self, options.merge("at" => Time.now.to_f + interval.to_f))
33
+ end
34
+
35
+ def sidekiq_delay_until(timestamp, options = {})
36
+ Proxy.new(DelayedModel, self, options.merge("at" => timestamp.to_f))
37
+ end
38
+ alias_method :delay, :sidekiq_delay
39
+ alias_method :delay_for, :sidekiq_delay_for
40
+ alias_method :delay_until, :sidekiq_delay_until
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,36 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "sidekiq/api"
4
+
5
+ module Sidekiq
6
+ module DelayExtensions
7
+ module JobRecord
8
+ def display_class
9
+ # Unwrap known wrappers so they show up in a human-friendly manner in the Web UI
10
+ @klass ||= self["display_class"] || begin
11
+ case klass
12
+ when /\ASidekiq::DelayExtensions::Delayed/
13
+ safe_load(args[0], klass) do |target, method, _|
14
+ "#{target}.#{method}"
15
+ end
16
+ else
17
+ super
18
+ end
19
+ end
20
+ end
21
+
22
+ def display_args
23
+ # Unwrap known wrappers so they show up in a human-friendly manner in the Web UI
24
+ @display_args ||= case klass
25
+ when /\ASidekiq::DelayExtensions::Delayed/
26
+ safe_load(args[0], args) do |_, _, arg|
27
+ arg
28
+ end
29
+
30
+ else
31
+ super
32
+ end
33
+ end
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,43 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "sidekiq/delay_extensions/generic_proxy"
4
+
5
+ module Sidekiq
6
+ module DelayExtensions
7
+ ##
8
+ # Adds `delay`, `delay_for` and `delay_until` methods to all Classes to offload class method
9
+ # execution to Sidekiq.
10
+ #
11
+ # @example
12
+ # User.delay.delete_inactive
13
+ # Wikipedia.delay.download_changes_for(Date.today)
14
+ #
15
+ class DelayedClass
16
+ include Sidekiq::Worker
17
+
18
+ def perform(yml)
19
+ (target, method_name, args, kwargs) = YAML.load(yml)
20
+ kwargs.empty? ? target.__send__(method_name, *args) : target.__send__(method_name, *args, **kwargs)
21
+ end
22
+ end
23
+
24
+ module Klass
25
+ def sidekiq_delay(options = {})
26
+ Proxy.new(DelayedClass, self, options)
27
+ end
28
+
29
+ def sidekiq_delay_for(interval, options = {})
30
+ Proxy.new(DelayedClass, self, options.merge("at" => Time.now.to_f + interval.to_f))
31
+ end
32
+
33
+ def sidekiq_delay_until(timestamp, options = {})
34
+ Proxy.new(DelayedClass, self, options.merge("at" => timestamp.to_f))
35
+ end
36
+ alias_method :delay, :sidekiq_delay
37
+ alias_method :delay_for, :sidekiq_delay_for
38
+ alias_method :delay_until, :sidekiq_delay_until
39
+ end
40
+ end
41
+ end
42
+
43
+ Module.__send__(:include, Sidekiq::DelayExtensions::Klass) unless defined?(::Rails)
@@ -0,0 +1,33 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "yaml"
4
+
5
+ module Sidekiq
6
+ module DelayExtensions
7
+ SIZE_LIMIT = 8_192
8
+
9
+ class Proxy < BasicObject
10
+ def initialize(performable, target, options = {})
11
+ @performable = performable
12
+ @target = target
13
+ @opts = options
14
+ end
15
+
16
+ def method_missing(name, *args, **kwargs)
17
+ # Sidekiq has a limitation in that its message must be JSON.
18
+ # JSON can't round trip real Ruby objects so we use YAML to
19
+ # serialize the objects to a String. The YAML will be converted
20
+ # to JSON and then deserialized on the other side back into a
21
+ # Ruby object.
22
+ obj = [@target, name, args, kwargs]
23
+ marshalled = ::YAML.dump(obj)
24
+ if marshalled.size > SIZE_LIMIT
25
+ ::Sidekiq.logger.warn { "#{@target}.#{name} job argument is #{marshalled.bytesize} bytes, you should refactor it to reduce the size" }
26
+ end
27
+ @performable.client_push({"class" => @performable,
28
+ "args" => [marshalled],
29
+ "display_class" => "#{@target}.#{name}"}.merge(@opts))
30
+ end
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,8 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "sidekiq/testing"
4
+
5
+ module Sidekiq
6
+ Sidekiq::DelayExtensions::DelayedMailer.extend(TestingExtensions) if defined?(Sidekiq::DelayExtensions::DelayedMailer)
7
+ Sidekiq::DelayExtensions::DelayedModel.extend(TestingExtensions) if defined?(Sidekiq::DelayExtensions::DelayedModel)
8
+ end
@@ -0,0 +1,7 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Sidekiq
4
+ module DelayExtensions
5
+ VERSION = "6.4.0"
6
+ end
7
+ end
@@ -0,0 +1,46 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "sidekiq"
4
+
5
+ module Sidekiq
6
+ module DelayExtensions
7
+ def self.enable_delay!
8
+ if defined?(::ActiveSupport)
9
+ require "sidekiq/delay_extensions/active_record"
10
+ require "sidekiq/delay_extensions/action_mailer"
11
+
12
+ # Need to patch Psych so it can autoload classes whose names are serialized
13
+ # in the delayed YAML.
14
+ Psych::Visitors::ToRuby.prepend(Sidekiq::DelayExtensions::PsychAutoload)
15
+
16
+ ActiveSupport.on_load(:active_record) do
17
+ include Sidekiq::DelayExtensions::ActiveRecord
18
+ end
19
+ ActiveSupport.on_load(:action_mailer) do
20
+ extend Sidekiq::DelayExtensions::ActionMailer
21
+ end
22
+ end
23
+
24
+ require "sidekiq/delay_extensions/class_methods"
25
+ Module.__send__(:include, Sidekiq::DelayExtensions::Klass)
26
+
27
+ require "sidekiq/delay_extensions/api"
28
+ Sidekiq::JobRecord.prepend(Sidekiq::DelayExtensions::JobRecord)
29
+ end
30
+
31
+ module PsychAutoload
32
+ def resolve_class(klass_name)
33
+ return nil if !klass_name || klass_name.empty?
34
+ # constantize
35
+ names = klass_name.split("::")
36
+ names.shift if names.empty? || names.first.empty?
37
+
38
+ names.inject(Object) do |constant, name|
39
+ constant.const_defined?(name) ? constant.const_get(name) : constant.const_missing(name)
40
+ end
41
+ rescue NameError
42
+ super
43
+ end
44
+ end
45
+ end
46
+ end
@@ -0,0 +1,32 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "lib/sidekiq/delay_extensions/version"
4
+
5
+ Gem::Specification.new do |spec|
6
+ spec.name = "sidekiq-delay_extensions"
7
+ spec.version = Sidekiq::DelayExtensions::VERSION
8
+ spec.authors = ["Mike Perham", "Benjamin Fleischer"]
9
+ spec.email = ["mperham@gmail.com", "github@benjaminfleischer.com"]
10
+
11
+ spec.summary = "Sidekiq Delay Extensions"
12
+ spec.description = "Extracted from Sidekiq 6.0"
13
+ spec.homepage = "https://github.com/gemhome/sidekiq-delay_extensions/wiki/Delayed-extensions"
14
+ spec.license = "LGPL-3.0"
15
+
16
+ spec.files = Dir.glob("{bin,lib,config}/**/*") + %w[Gemfile sidekiq-delay_extensions.gemspec README.md Changes.md LICENSE]
17
+
18
+ spec.bindir = "exe"
19
+ spec.executables = []
20
+ spec.require_paths = ["lib"]
21
+ spec.required_ruby_version = ">= 2.5.0"
22
+
23
+ spec.metadata = {
24
+ "homepage_uri" => "https://github.com/gemhome/sidekiq-delay_extensions/wiki/Delayed-extensions",
25
+ "bug_tracker_uri" => "https://github.com/gemhome/sidekiq-delay_extensions/issues",
26
+ "documentation_uri" => "https://github.com/gemhome/sidekiq-delay_extensions/wiki",
27
+ "changelog_uri" => "https://github.com/gemhome/sidekiq-delay_extensions/blob/main/Changes.md",
28
+ "source_code_uri" => "https://github.com/gemhome/sidekiq-delay_extensions"
29
+ }
30
+
31
+ spec.add_dependency "sidekiq", ">= 6.4.0"
32
+ end
metadata ADDED
@@ -0,0 +1,77 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: sidekiq-delay_extensions
3
+ version: !ruby/object:Gem::Version
4
+ version: 6.4.0
5
+ platform: ruby
6
+ authors:
7
+ - Mike Perham
8
+ - Benjamin Fleischer
9
+ autorequire:
10
+ bindir: exe
11
+ cert_chain: []
12
+ date: 2022-02-08 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: sidekiq
16
+ requirement: !ruby/object:Gem::Requirement
17
+ requirements:
18
+ - - ">="
19
+ - !ruby/object:Gem::Version
20
+ version: 6.4.0
21
+ type: :runtime
22
+ prerelease: false
23
+ version_requirements: !ruby/object:Gem::Requirement
24
+ requirements:
25
+ - - ">="
26
+ - !ruby/object:Gem::Version
27
+ version: 6.4.0
28
+ description: Extracted from Sidekiq 6.0
29
+ email:
30
+ - mperham@gmail.com
31
+ - github@benjaminfleischer.com
32
+ executables: []
33
+ extensions: []
34
+ extra_rdoc_files: []
35
+ files:
36
+ - Changes.md
37
+ - Gemfile
38
+ - LICENSE
39
+ - README.md
40
+ - lib/sidekiq/delay_extensions.rb
41
+ - lib/sidekiq/delay_extensions/action_mailer.rb
42
+ - lib/sidekiq/delay_extensions/active_record.rb
43
+ - lib/sidekiq/delay_extensions/api.rb
44
+ - lib/sidekiq/delay_extensions/class_methods.rb
45
+ - lib/sidekiq/delay_extensions/generic_proxy.rb
46
+ - lib/sidekiq/delay_extensions/testing.rb
47
+ - lib/sidekiq/delay_extensions/version.rb
48
+ - sidekiq-delay_extensions.gemspec
49
+ homepage: https://github.com/gemhome/sidekiq-delay_extensions/wiki/Delayed-extensions
50
+ licenses:
51
+ - LGPL-3.0
52
+ metadata:
53
+ homepage_uri: https://github.com/gemhome/sidekiq-delay_extensions/wiki/Delayed-extensions
54
+ bug_tracker_uri: https://github.com/gemhome/sidekiq-delay_extensions/issues
55
+ documentation_uri: https://github.com/gemhome/sidekiq-delay_extensions/wiki
56
+ changelog_uri: https://github.com/gemhome/sidekiq-delay_extensions/blob/main/Changes.md
57
+ source_code_uri: https://github.com/gemhome/sidekiq-delay_extensions
58
+ post_install_message:
59
+ rdoc_options: []
60
+ require_paths:
61
+ - lib
62
+ required_ruby_version: !ruby/object:Gem::Requirement
63
+ requirements:
64
+ - - ">="
65
+ - !ruby/object:Gem::Version
66
+ version: 2.5.0
67
+ required_rubygems_version: !ruby/object:Gem::Requirement
68
+ requirements:
69
+ - - ">="
70
+ - !ruby/object:Gem::Version
71
+ version: '0'
72
+ requirements: []
73
+ rubygems_version: 3.1.4
74
+ signing_key:
75
+ specification_version: 4
76
+ summary: Sidekiq Delay Extensions
77
+ test_files: []