resque-unique_by_arity 3.0.2 → 3.0.3

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.
data/README.md CHANGED
@@ -1,89 +1,158 @@
1
- # Resque::UniqueByArity
1
+ <a href="https://github.com/resque"><img alt="resque Logo by GitHub" src="https://github.com/resque.png?size=192" width="14%" align="right"/></a>
2
2
 
3
- Because some jobs have parameters that you do not want to consider for
4
- determination of uniqueness.
3
+ # 💎 Resque::UniqueByArity
5
4
 
6
- NOTE:
5
+ [![Version][👽versioni]][👽version] [![Ruby Users Forum][✉️ruby-forum-top-img]][✉️ruby-forum] [![GitHub tag (latest SemVer)][⛳️tag-img]][⛳️tag] [![License: MIT][📄license-img]][📄license] [![Total downloads][👽dl-ranki]][👽dl-rank] [![CodeCov Test Coverage][🏀codecovi]][🏀codecov] [![Coveralls Test Coverage][🏀coveralls-img]][🏀coveralls] [![QLTY Test Coverage][🏀qlty-covi]][🏀qlty-cov] [![QLTY Maintainability][🏀qlty-mnti]][🏀qlty-mnt] [![CI Heads][🚎3-hd-wfi]][🚎3-hd-wf] [![CI Runtime Dependencies @ HEAD][🚎12-crh-wfi]][🚎12-crh-wf] [![CI Current][🚎11-c-wfi]][🚎11-c-wf] [![CI Truffle Ruby][🚎9-t-wfi]][🚎9-t-wf] [![CI JRuby][🚎10-j-wfi]][🚎10-j-wf] [![Deps Locked][🚎13-🔒️-wfi]][🚎13-🔒️-wf] [![Deps Unlocked][🚎14-🔓️-wfi]][🚎14-🔓️-wf] [![CI Test Coverage][🚎2-cov-wfi]][🚎2-cov-wf] [![CI Style][🚎5-st-wfi]][🚎5-st-wf] [![Apache SkyWalking Eyes License Compatibility Check][🚎15-🪪-wfi]][🚎15-🪪-wf]
7
6
 
8
- I rewrote, and renamed, both `resque_solo` and `resque-lonely_job`, becuase they
9
- can't be used together. Why? Their `redis_key` methods directly conflict,
10
- among other more subtle issues.
7
+ `if ci_badges.map(&:color).detect { it != "green"}` ☝️ [let me know on Discord][✉️discord-invite] or [RubyForum][✉️ruby-forum], as I may have missed the notification.
11
8
 
12
- This gem requires use of my rewritten gems for uniqueness enforcement:
9
+ ---
13
10
 
14
- - [`resque-unique_at_runtime`](https://github.com/pboling/resque-unique_at_runtime)
15
- - [`resque-unique_in_queue`](https://github.com/pboling/resque-unique_in_queue)
11
+ `if ci_badges.map(&:color).all? { it == "green"}` 👇️ send money so I can do more of this. FLOSS maintenance is now my full-time job.
16
12
 
17
- | Project | Resque::UniqueByArity |
18
- |------------------------ | ----------------------- |
19
- | gem name | [resque-unique_by_arity](https://rubygems.org/gems/resque-unique_by_arity) |
20
- | license | [![License: MIT](https://img.shields.io/badge/License-MIT-green.svg)](https://opensource.org/licenses/MIT) |
21
- | download rank | [![Downloads Today](https://img.shields.io/gem/rd/resque-unique_by_arity.svg)](https://github.com/pboling/resque-unique_by_arity) |
22
- | version | [![Version](https://img.shields.io/gem/v/resque-unique_by_arity.svg)](https://rubygems.org/gems/resque-unique_by_arity) |
23
- | dependencies | [![Depfu](https://badges.depfu.com/badges/25c6e1e4c671926e9adea898f2df9a47/count.svg)](https://depfu.com/github/pboling/resque-unique_by_arity?project_id=2729) |
24
- | continuous integration | [![Build Status](https://travis-ci.org/pboling/resque-unique_by_arity.svg?branch=master)](https://travis-ci.org/pboling/resque-unique_by_arity) |
25
- | test coverage | [![Test Coverage](https://api.codeclimate.com/v1/badges/7520df3968eb146c8894/test_coverage)](https://codeclimate.com/github/pboling/resque-unique_by_arity/test_coverage) |
26
- | maintainability | [![Maintainability](https://api.codeclimate.com/v1/badges/7520df3968eb146c8894/maintainability)](https://codeclimate.com/github/pboling/resque-unique_by_arity/maintainability) |
27
- | code triage | [![Open Source Helpers](https://www.codetriage.com/pboling/resque-unique_by_arity/badges/users.svg)](https://www.codetriage.com/pboling/resque-unique_by_arity) |
28
- | homepage | [on Github.com][homepage], [on Railsbling.com][blogpage] |
29
- | documentation | [on RDoc.info][documentation] |
30
- | Spread ~♡ⓛⓞⓥⓔ♡~ | [🌍 🌎 🌏](https://about.me/peter.boling), [🍚](https://www.crowdrise.com/helprefugeeswithhopefortomorrowliberia/fundraiser/peterboling), [➕](https://plus.google.com/+PeterBoling/posts), [👼](https://angel.co/peter-boling), [🐛](https://www.topcoder.com/members/pboling/), [:shipit:](http://coderwall.com/pboling), [![Tweet Peter](https://img.shields.io/twitter/follow/galtzo.svg?style=social&label=Follow)](http://twitter.com/galtzo) |
13
+ [![OpenCollective Backers][🖇osc-backers-i]][🖇osc-backers] [![OpenCollective Sponsors][🖇osc-sponsors-i]][🖇osc-sponsors] [![Sponsor Me on Github][🖇sponsor-img]][🖇sponsor] [![Liberapay Goal Progress][⛳liberapay-img]][⛳liberapay] [![Donate on PayPal][🖇paypal-img]][🖇paypal] [![Buy me a coffee][🖇buyme-small-img]][🖇buyme] [![Donate at ko-fi.com][🖇kofi-img]][🖇kofi]
31
14
 
32
- ## Important Note
15
+ <details markdown="1">
16
+ <summary>👣 How will this project approach the September 2025 hostile takeover of RubyGems? 🚑️</summary>
33
17
 
34
- See `lib/resque/unique_by_arity/configuration.rb` for all config options. Only
35
- a smattering of what is available is documented in this README.
18
+ I've summarized my thoughts in [this blog post](https://dev.to/galtzo/hostile-takeover-of-rubygems-my-thoughts-5hlo).
36
19
 
37
- ## Most Important Note
20
+ </details>
38
21
 
39
- You must configure this gem *after* you define the perform class method in your
40
- job or an error will be raised thanks to `perform` not having been defined yet.
22
+ ## 🌻 Synopsis <a href="https://discord.gg/3qme4XHNKN"><img alt="Galtzo FLOSS Logo by Aboling0, CC BY-SA 4.0" src="https://logos.galtzo.com/assets/images/galtzo-floss/avatar-128px.svg" width="8%" align="right"/></a> <a href="https://ruby-toolbox.com"><img alt="ruby-lang Logo, Yukihiro Matsumoto, Ruby Visual Identity Team, CC BY-SA 2.5" src="https://logos.galtzo.com/assets/images/ruby-lang/avatar-128px.svg" width="8%" align="right"/></a>
41
23
 
42
- Example:
24
+ `resque-unique_by_arity` composes queue-time and runtime uniqueness and lets each job choose which leading `perform` arguments define its uniqueness signature. It supports queue-local uniqueness, cross-queue uniqueness, and runtime uniqueness without hand-written Redis key methods.
43
25
 
44
- ```ruby
45
- class MyJob
46
- def self.perform(arg)
47
- # do stuff
48
- end
49
- include Resque::Plugins::UniqueByArity.new(
50
- arity_for_uniqueness: 1,
51
- lock_after_execution_period: 60,
52
- runtime_lock_timeout: 60 * 60 * 24 * 5, # 5 days
53
- unique_at_runtime: true,
54
- unique_in_queue: true
55
- )
56
- end
57
- ```
26
+ Use it when a job has ancillary arguments, such as options or tracing values, that should not create a separate unit of work.
58
27
 
59
- ## Installation
28
+ ## 💡 Info you can shake a stick at
60
29
 
61
- Add this line to your application's Gemfile:
30
+ | Tokens to Remember | [![Gem name][⛳️name-img]][⛳️gem-name] [![Gem namespace][⛳️namespace-img]][⛳️gem-namespace] |
31
+ |-------------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
32
+ | Works with JRuby | [![JRuby 9.2 Compat][💎jruby-9.2i]][🚎jruby-9.2-wf] [![JRuby 9.3 Compat][💎jruby-9.3i]][🚎jruby-9.3-wf] <br/> [![JRuby 9.4 Compat][💎jruby-9.4i]][🚎jruby-9.4-wf] [![JRuby 10.0 Compat][💎jruby-10.0i]][🚎jruby-10.0-wf] [![JRuby current Compat][💎jruby-c-i]][🚎10-j-wf] [![JRuby HEAD Compat][💎jruby-headi]][🚎3-hd-wf]|
33
+ | Works with Truffle Ruby | [![Truffle Ruby 22.3 Compat][💎truby-22.3i]][🚎truby-22.3-wf] [![Truffle Ruby 23.0 Compat][💎truby-23.0i]][🚎truby-23.0-wf] [![Truffle Ruby 23.1 Compat][💎truby-23.1i]][🚎truby-23.1-wf] <br/> [![Truffle Ruby 24.2 Compat][💎truby-24.2i]][🚎truby-24.2-wf] [![Truffle Ruby 25.0 Compat][💎truby-25.0i]][🚎truby-25.0-wf] [![Truffle Ruby 33.0 Compat][💎truby-33.0i]][🚎truby-33.0-wf] [![Truffle Ruby current Compat][💎truby-c-i]][🚎9-t-wf] [![Truffle Ruby HEAD Compat][💎truby-headi]][🚎3-hd-wf]|
34
+ | Works with MRI Ruby 4 | [![Ruby current Compat][💎ruby-c-i]][🚎11-c-wf] [![Ruby HEAD Compat][💎ruby-headi]][🚎3-hd-wf]|
35
+ | Works with MRI Ruby 3 | [![Ruby 3.0 Compat][💎ruby-3.0i]][🚎ruby-3.0-wf] [![Ruby 3.1 Compat][💎ruby-3.1i]][🚎ruby-3.1-wf] [![Ruby 3.2 Compat][💎ruby-3.2i]][🚎ruby-3.2-wf] [![Ruby 3.3 Compat][💎ruby-3.3i]][🚎ruby-3.3-wf] [![Ruby 3.4 Compat][💎ruby-3.4i]][🚎ruby-3.4-wf]|
36
+ | Works with MRI Ruby 2 | ![Ruby 2.3 Compat][💎ruby-2.3i] <br/> [![Ruby 2.4 Compat][💎ruby-2.4i]][🚎ruby-2.4-wf] [![Ruby 2.5 Compat][💎ruby-2.5i]][🚎ruby-2.5-wf] [![Ruby 2.6 Compat][💎ruby-2.6i]][🚎ruby-2.6-wf] [![Ruby 2.7 Compat][💎ruby-2.7i]][🚎ruby-2.7-wf]|
37
+ | Support & Community | [![Join Me on Daily.dev's RubyFriends][✉️ruby-friends-img]][✉️ruby-friends] [![Get help from RubyForum][✉️ruby-forum-img]][✉️ruby-forum] [![Live Chat on Discord][✉️discord-invite-img-ftb]][✉️discord-invite] [![Get help from me on Upwork][👨🏼‍🏫expsup-upwork-img]][👨🏼‍🏫expsup-upwork] [![Get help from me on Codementor][👨🏼‍🏫expsup-codementor-img]][👨🏼‍🏫expsup-codementor] |
38
+ | Source | [![Source on GitLab.com][📜src-gl-img]][📜src-gl] [![Source on CodeBerg.org][📜src-cb-img]][📜src-cb] [![Source on GitHub.com][📜src-gh-img]][📜src-gh] [![The best SHA: dQw4w9WgXcQ!][🧮kloc-img]][🧮kloc] |
39
+ | Documentation | [![Current release on RubyDoc.info][📜docs-cr-rd-img]][🚎yard-current] [![YARD on Galtzo.com][📜docs-head-rd-img]][🚎yard-head] [![Maintainer Blog][🚂maint-blog-img]][🚂maint-blog] [![GitLab Wiki][📜gl-wiki-img]][📜gl-wiki] [![GitHub Wiki][📜gh-wiki-img]][📜gh-wiki] |
40
+ | Compliance | [![License: MIT][📄license-img]][📄license] [![Apache license compatibility: Category A][📄license-compat-img]][📄license-compat] [![📄ilo-declaration-img]][📄ilo-declaration] [![Security Policy][🔐security-img]][🔐security] [![Contributor Covenant 2.1][🪇conduct-img]][🪇conduct] [![SemVer 2.0.0][📌semver-img]][📌semver] |
41
+ | Style | [![Enforced Code Style Linter][💎rlts-img]][💎rlts] [![Keep-A-Changelog 1.0.0][📗keep-changelog-img]][📗keep-changelog] [![Gitmoji Commits][📌gitmoji-img]][📌gitmoji] [![Compatibility appraised by: appraisal2][💎appraisal2-img]][💎appraisal2] |
42
+ | Maintainer 🎖️ | [![Follow Me on LinkedIn][💖🖇linkedin-img]][💖🖇linkedin] [![Follow Me on Ruby.Social][💖🐘ruby-mast-img]][💖🐘ruby-mast] [![Follow Me on Bluesky][💖🦋bluesky-img]][💖🦋bluesky] [![Contact Maintainer][🚂maint-contact-img]][🚂maint-contact] [![My technical writing][💖💁🏼‍♂️devto-img]][💖💁🏼‍♂️devto] |
43
+ | `...` 💖 | [![Find Me on WellFound:][💖✌️wellfound-img]][💖✌️wellfound] [![Find Me on CrunchBase][💖💲crunchbase-img]][💖💲crunchbase] [![My LinkTree][💖🌳linktree-img]][💖🌳linktree] [![More About Me][💖💁🏼‍♂️aboutme-img]][💖💁🏼‍♂️aboutme] [🧊][💖🧊berg] [🐙][💖🐙hub] [🛖][💖🛖hut] [🧪][💖🧪lab] |
62
44
 
63
- ```ruby
64
- gem 'resque-unique_by_arity'
45
+ ### Compatibility
46
+
47
+ Compatible with MRI Ruby 2.3.0+, JRuby, and TruffleRuby.
48
+ CI workflows and Appraisals are generated for MRI Ruby 2.4+.
49
+ This test floor is configured by `ruby.test_minimum` in `.kettle-jem.yml` and
50
+ may be higher than the gem's runtime compatibility floor when legacy Rubies are
51
+ not practical for the current toolchain.
52
+
53
+ <a href="https://github.com/kettle-dev"><img alt="kettle-dev Logo by Aboling0, CC BY-SA 4.0" src="https://logos.galtzo.com/assets/images/kettle-dev/avatar-128px.svg" width="14%" align="right"/></a>
54
+
55
+ The _amazing_ test matrix is powered by the kettle-dev stack.
56
+
57
+ <details markdown="1">
58
+ <summary>How kettle-dev manages complexity in tests</summary>
59
+
60
+ | Gem | Source | Role | Total downloads |
61
+ |-----|--------|------|---------------------|
62
+ | [appraisal2](https://clickgems.clickhouse.com/dashboard/appraisal2) | [GitHub](https://github.com/appraisal-rb/appraisal2) | multi-dependency Appraisal matrix generation | [![Total downloads for appraisal2](https://img.shields.io/gem/dt/appraisal2.svg?style=flat-square)](https://clickgems.clickhouse.com/dashboard/appraisal2) |
63
+ | [appraisal2-rubocop](https://clickgems.clickhouse.com/dashboard/appraisal2-rubocop) | [GitHub](https://github.com/appraisal-rb/appraisal2-rubocop) | RuboCop Appraisal generator integration | [![Total downloads for appraisal2-rubocop](https://img.shields.io/gem/dt/appraisal2-rubocop.svg?style=flat-square)](https://clickgems.clickhouse.com/dashboard/appraisal2-rubocop) |
64
+ | [kettle-dev](https://clickgems.clickhouse.com/dashboard/kettle-dev) | [GitHub](https://github.com/kettle-dev/kettle-dev) | development, release, and CI workflow tooling | [![Total downloads for kettle-dev](https://img.shields.io/gem/dt/kettle-dev.svg?style=flat-square)](https://clickgems.clickhouse.com/dashboard/kettle-dev) |
65
+ | [kettle-jem](https://clickgems.clickhouse.com/dashboard/kettle-jem) | [GitHub](https://github.com/kettle-dev/kettle-jem) | Appraisals & CI workflow templates | [![Total downloads for kettle-jem](https://img.shields.io/gem/dt/kettle-jem.svg?style=flat-square)](https://clickgems.clickhouse.com/dashboard/kettle-jem) |
66
+ | [kettle-soup-cover](https://clickgems.clickhouse.com/dashboard/kettle-soup-cover) | [GitHub](https://github.com/kettle-dev/kettle-soup-cover) | SimpleCov coverage policy and reporting | [![Total downloads for kettle-soup-cover](https://img.shields.io/gem/dt/kettle-soup-cover.svg?style=flat-square)](https://clickgems.clickhouse.com/dashboard/kettle-soup-cover) |
67
+ | [kettle-test](https://clickgems.clickhouse.com/dashboard/kettle-test) | [GitHub](https://github.com/kettle-dev/kettle-test) | standard test runner and coverage harness | [![Total downloads for kettle-test](https://img.shields.io/gem/dt/kettle-test.svg?style=flat-square)](https://clickgems.clickhouse.com/dashboard/kettle-test) |
68
+ | [rubocop-lts](https://clickgems.clickhouse.com/dashboard/rubocop-lts) | [GitHub](https://github.com/rubocop-lts/rubocop-lts) | Ruby-version-aware linting | [![Total downloads for rubocop-lts](https://img.shields.io/gem/dt/rubocop-lts.svg?style=flat-square)](https://clickgems.clickhouse.com/dashboard/rubocop-lts) |
69
+ | [turbo_tests2](https://clickgems.clickhouse.com/dashboard/turbo_tests2) | [GitHub](https://github.com/galtzo-floss/turbo_tests2) | parallel test execution | [![Total downloads for turbo_tests2](https://img.shields.io/gem/dt/turbo_tests2.svg?style=flat-square)](https://clickgems.clickhouse.com/dashboard/turbo_tests2) |
70
+
71
+ </details>
72
+
73
+ ### Federated DVCS
74
+
75
+ <details markdown="1">
76
+ <summary>Find this repo on federated forges (Coming soon!)</summary>
77
+
78
+ | Federated [DVCS][💎d-in-dvcs] Repository | Status | Issues | PRs | Wiki | CI |
79
+ |-------------------------------------------------|-------------------------------------------|-------------------|------------------|-----------------|----------------|
80
+ | 🧪 [resque/resque-unique_by_arity on GitLab][📜src-gl] | The Truth | [💚][🤝gl-issues] | [💚][🤝gl-pulls] | [💚][📜gl-wiki] | 🐭 Tiny Matrix |
81
+ | 🧊 [resque/resque-unique_by_arity on CodeBerg][📜src-cb] | An Ethical Mirror ([Donate][🤝cb-donate]) | [💚][🤝cb-issues] | [💚][🤝cb-pulls] | ➖ | ⭕️ No Matrix |
82
+ | 🐙 [resque/resque-unique_by_arity on GitHub][📜src-gh] | Another Mirror | [💚][🤝gh-issues] | [💚][🤝gh-pulls] | [💚][📜gh-wiki] | 💯 Full Matrix |
83
+
84
+ </details>
85
+
86
+ ### Enterprise Support
87
+
88
+ [![Tidelift](https://tidelift.com/badges/package/rubygems/resque-unique_by_arity)](https://tidelift.com/subscription/pkg/rubygems-resque-unique_by_arity?utm_source=rubygems-resque-unique_by_arity&utm_medium=referral&utm_campaign=readme)
89
+
90
+ Available as part of the Tidelift Subscription.
91
+
92
+ <details markdown="1">
93
+ <summary>Need enterprise-level guarantees?</summary>
94
+
95
+ The maintainers of this and thousands of other packages are working with Tidelift to deliver commercial support and maintenance for the open source packages you use to build your applications. Save time, reduce risk, and improve code health, while paying the maintainers of the exact packages you use.
96
+
97
+ [![Get help from me on Tidelift][🏙️entsup-tidelift-img]][🏙️entsup-tidelift]
98
+
99
+ - 💡Subscribe for support guarantees covering _all_ your FLOSS dependencies
100
+ - 💡Tidelift is part of [Sonar][🏙️entsup-tidelift-sonar]
101
+ - 💡Tidelift pays maintainers to maintain the software you depend on!<br/>📊`@`Pointy Haired Boss: An [enterprise support][🏙️entsup-tidelift] subscription is "[never gonna let you down][🧮kloc]", and *supports* open source maintainers
102
+
103
+ Alternatively:
104
+
105
+ - [![Ruby Users Forum][✉️ruby-forum-img]][✉️ruby-forum]
106
+ - [![Live Chat on Discord][✉️discord-invite-img-ftb]][✉️discord-invite]
107
+ - [![Get help from me on Upwork][👨🏼‍🏫expsup-upwork-img]][👨🏼‍🏫expsup-upwork]
108
+ - [![Get help from me on Codementor][👨🏼‍🏫expsup-codementor-img]][👨🏼‍🏫expsup-codementor]
109
+
110
+ </details>
111
+
112
+ ## ✨ Installation
113
+
114
+ Install the gem and add to the application's Gemfile by executing:
115
+
116
+ ```console
117
+ bundle add resque-unique_by_arity
65
118
  ```
66
119
 
67
- And then execute:
120
+ If bundler is not being used to manage dependencies, install the gem by executing:
121
+
122
+ ```console
123
+ gem install resque-unique_by_arity
124
+ ```
68
125
 
69
- $ bundle
126
+ ## ⚙️ Configuration
70
127
 
71
- Or install it yourself as:
128
+ Set application defaults with `Resque::UniqueByArity.configure`, then include a configured plugin instance in each job:
72
129
 
73
- $ gem install resque-unique_by_arity
130
+ ```ruby
131
+ class RefreshAccount
132
+ @queue = :accounts
74
133
 
75
- ## Usage
134
+ include Resque::Plugins::UniqueByArity.new(
135
+ arity_for_uniqueness: 1,
136
+ unique_in_queue: true,
137
+ unique_at_runtime: true,
138
+ arity_validation: :error
139
+ )
140
+ end
141
+ ```
142
+
143
+ `arity_for_uniqueness` is the number of leading arguments used for the key. Use `arity_for_uniqueness_at_runtime`, `arity_for_uniqueness_in_queue`, or `arity_for_uniqueness_across_queues` when an enforcement axis needs a different arity. Choose either `unique_in_queue` or `unique_across_queues`, never both. `arity_validation` accepts `:warning`, `:error`, `:skip`, or `nil`/`false`.
144
+
145
+ ## 🔧 Basic Usage
76
146
 
77
147
  ### Global Configuration
78
148
 
79
149
  The following is showing the default values. These global configs are copied into each per-class config unless they are overridden by the class config.
80
150
 
81
-
82
151
  Create an initializer (e.g. `config/initializers/resque-unique_by_arity.rb` for rails) and customize the following:
83
152
 
84
153
  ```ruby
85
- Resque::UniqueByArity.configure do |config|
86
- config.logger = nil
154
+ Resque::UniqueByArity.configure do |config|
155
+ config.logger = nil
87
156
  config.log_level = :debug
88
157
  config.arity_for_uniqueness = 0
89
158
  config.unique_at_runtime = false
@@ -91,21 +160,21 @@ Create an initializer (e.g. `config/initializers/resque-unique_by_arity.rb` for
91
160
  # No need to do the following if keeping default values
92
161
  config.runtime_lock_timeout = 60 * 60 * 24 * 5
93
162
  config.runtime_requeue_interval = 1
94
- config.unique_at_runtime_key_base = 'r-uar'.freeze
163
+ config.unique_at_runtime_key_base = "r-uar".freeze
95
164
  config.lock_after_execution_period = 0
96
165
  config.ttl = -1
97
- config.unique_in_queue_key_base = 'r-uiq'.freeze
166
+ config.unique_in_queue_key_base = "r-uiq".freeze
98
167
  # Debug Mode is preferably set via an environment variable:
99
168
  # to one of 'true', 'arity', or 'arity,queue,runtime' for all three tools:
100
169
  # ENV['RESQUE_DEBUG'] = 'true'
101
170
  # config.debug_mode = true
102
- end
171
+ end
103
172
  ```
104
173
 
105
174
  ### Per Job Class Configuration
106
175
 
107
176
  This gem will take care to set the class instance variables (similar to the
108
- familiar `@queue` class instance variable) that are utilized by
177
+ familiar `@queue` class instance variable) that are utilized by
109
178
  `resque-unique_in_queue` and `resque-unique_at_runtime` (default values shown):
110
179
 
111
180
  ```ruby
@@ -168,7 +237,7 @@ class MyJob
168
237
  # Because the third argument is optional the arity valdiation will not approve.
169
238
  # Arguments to be considered for uniqueness should be required arguments.
170
239
  # The warning log might look like:
171
- #
240
+ #
172
241
  # MyJob.perform has the following required parameters: [:my, :cat], which is not enough to satisfy the configured arity_for_uniqueness of 3
173
242
  end
174
243
  include Resque::Plugins::UniqueByArity.new(
@@ -179,7 +248,6 @@ class MyJob
179
248
  end
180
249
  ```
181
250
 
182
-
183
251
  ### Lock After Execution
184
252
 
185
253
  Give the job a break after it finishes running, and don't allow another of the
@@ -233,7 +301,7 @@ end
233
301
  ```
234
302
 
235
303
  #### Oops, I have stale runtime uniqueness keys for MyJob stored in Redis...
236
-
304
+
237
305
  Preventing jobs with matching signatures from running, and they never get
238
306
  dequeued because there is no actual corresponding job to dequeue.
239
307
 
@@ -278,7 +346,7 @@ end
278
346
  ```
279
347
 
280
348
  #### Oops, I have stale Queue Time uniqueness keys...
281
-
349
+
282
350
  Preventing jobs with matching signatures from being queued, and they never get
283
351
  dequeued because there is no actual corresponding job to dequeue.
284
352
 
@@ -288,7 +356,7 @@ Option: Rampage
288
356
 
289
357
  ```ruby
290
358
  # Delete *all* queued jobs in the queue, and
291
- # delete *all* unqueness keys for the queue.
359
+ # delete *all* uniqueness keys for the queue.
292
360
  Redis.remove_queue('queue_name')
293
361
  ```
294
362
 
@@ -296,7 +364,7 @@ Option: Butterfly
296
364
 
297
365
  ```ruby
298
366
  # Delete *no* queued jobs at all, and
299
- # delete *all* unqueness keys for the queue (might then allow duplicates).
367
+ # delete *all* uniqueness keys for the queue (might then allow duplicates).
300
368
  Resque::UniqueInQueue::Queue.cleanup('queue_name')
301
369
  ```
302
370
 
@@ -358,9 +426,9 @@ class MyJob
358
426
  #...
359
427
  )
360
428
 
361
- # Core hashing algorithm for a job used for *all 3 types* of uniqueness
362
- # @return [Array<String, arguments>], where the string is the unique digest, and arguments are the specific args that were used to calculate the digest
363
- def self.redis_unique_hash(payload)
429
+ # Core hashing algorithm for a job used for *all 3 types* of uniqueness
430
+ # @return [Array<String, arguments>], where the string is the unique digest, and arguments are the specific args that were used to calculate the digest
431
+ def self.redis_unique_hash(payload, arity_for_uniqueness = 1)
364
432
  # for how the built-in version works
365
433
  # uniqueness_args = payload["args"] # over simplified & ignoring arity
366
434
  # args = { class: job, args: uniqueness_args }
@@ -370,9 +438,10 @@ class MyJob
370
438
  def self.unique_in_queue_redis_key_prefix
371
439
  # "unique_job:#{self}" # <= default value
372
440
  end
373
-
441
+
374
442
  def self.unique_in_queue_redis_key(queue, payload)
375
- # unique_hash, _args_for_uniqueness = redis_unique_hash(payload)
443
+ # arity_for_uniqueness = determine_arity # over simplified & ignoring context-specific arity determination
444
+ # unique_hash, _args_for_uniqueness = redis_unique_hash(payload, arity_for_uniqueness)
376
445
  # "#{unique_in_queue_key_namespace(queue)}:#{unique_in_queue_redis_key_prefix}:#{unique_hash}"
377
446
  end
378
447
 
@@ -381,68 +450,406 @@ class MyJob
381
450
  # "r-uiq:queue:#{queue}:job" # <= is for unique within queue at queue time
382
451
  # "r-uiq:across_queues:job" # <= is for unique across all queues at queue time
383
452
  end
384
-
453
+
385
454
  def self.runtime_key_namespace
386
455
  # "unique_at_runtime:#{self}"
387
456
  end
388
-
457
+
389
458
  def self.unique_at_runtime_redis_key(*args)
390
- # unique_hash, _args_for_uniqueness = redis_unique_hash({"class" => self.to_s, "args" => args})
459
+ # payload = {"class" => self.to_s, "args" => args}
460
+ # unique_hash, _args_for_uniqueness = redis_unique_hash(payload, configuration.arity_for_uniqueness_at_runtime)
391
461
  # key = "#{runtime_key_namespace}:#{unique_hash}" # <= simplified default
392
462
  end
393
463
  end
394
464
  ```
395
465
 
396
- ## Development
466
+ ## 🦷 FLOSS Funding
397
467
 
398
- After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake spec` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
468
+ While resque tools are free software and will always be, the project would benefit immensely from some funding.
469
+ Raising a monthly budget of... "dollars" would make the project more sustainable.
399
470
 
400
- To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org).
471
+ We welcome both individual and corporate sponsors! We also offer a
472
+ wide array of funding channels to account for your preferences.
473
+ Currently, [Open Collective][🖇osc] is our preferred funding platform.
401
474
 
402
- ## Contributing
475
+ **If you're working in a company that's making significant use of resque tools we'd
476
+ appreciate it if you suggest to your company to become a resque sponsor.**
403
477
 
404
- Bug reports and pull requests are welcome on GitHub at https://github.com/pboling/resque-unique_by_arity. This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the [Contributor Covenant](http://contributor-covenant.org) code of conduct.
478
+ You can support the development of resque tools via
479
+ [GitHub Sponsors][🖇sponsor],
480
+ [Liberapay][⛳liberapay],
481
+ [PayPal][🖇paypal],
482
+ [Open Collective][🖇osc]
483
+ and [Tidelift][🏙️entsup-tidelift].
405
484
 
406
- 1. Fork it
407
- 2. Create your feature branch (`git checkout -b my-new-feature`)
408
- 3. Commit your changes (`git commit -am 'Added some feature'`)
409
- 4. Push to the branch (`git push origin my-new-feature`)
410
- 5. Create new Pull Request
485
+ | 📍 NOTE |
486
+ |----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
487
+ | If doing a sponsorship in the form of donation is problematic for your company <br/> from an accounting standpoint, we'd recommend the use of Tidelift, <br/> where you can get a support-like subscription instead. |
411
488
 
412
- ## Code of Conduct
489
+ ### Open Collective for Individuals
413
490
 
414
- Everyone interacting in the Resque::UniqueByArity project’s codebases, issue trackers, chat rooms and mailing lists is expected to follow the [code of conduct](https://github.com/pboling/resque-unique_by_arity/blob/master/CODE_OF_CONDUCT.md).
491
+ Support us with a monthly donation and help us continue our activities. [[Become a backer](https://opencollective.com/resque#backer)]
415
492
 
416
- ## Versioning
493
+ NOTE: [kettle-readme-backers][kettle-readme-backers] updates this list every day, automatically.
417
494
 
418
- This library aims to adhere to [Semantic Versioning 2.0.0][semver].
419
- Violations of this scheme should be reported as bugs. Specifically,
420
- if a minor or patch version is released that breaks backward
421
- compatibility, a new version should be immediately released that
422
- restores compatibility. Breaking changes to the public API will
423
- only be introduced with new major versions.
495
+ <!-- OPENCOLLECTIVE-INDIVIDUALS:START -->
496
+ No backers yet. Be the first!
497
+ <!-- OPENCOLLECTIVE-INDIVIDUALS:END -->
424
498
 
425
- As a result of this policy, you can (and should) specify a
426
- dependency on this gem using the [Pessimistic Version Constraint][pvc] with two digits of precision.
499
+ ### Open Collective for Organizations
427
500
 
428
- For example:
501
+ Become a sponsor and get your logo on our README on GitHub with a link to your site. [[Become a sponsor](https://opencollective.com/resque#sponsor)]
429
502
 
430
- ```ruby
431
- spec.add_dependency 'resque-unique_by_arity', '~> 0.0'
432
- ```
503
+ NOTE: [kettle-readme-backers][kettle-readme-backers] updates this list every day, automatically.
504
+
505
+ <!-- OPENCOLLECTIVE-ORGANIZATIONS:START -->
506
+ No sponsors yet. Be the first!
507
+ <!-- OPENCOLLECTIVE-ORGANIZATIONS:END -->
508
+
509
+ [kettle-readme-backers]: https://github.com/resque/resque-unique_by_arity/blob/main/bin/kettle-readme-backers
510
+
511
+ ### Another way to support open-source
512
+
513
+ I’m driven by a passion to foster a thriving open-source community – a space where people can tackle complex problems, no matter how small. Revitalizing libraries that have fallen into disrepair, and building new libraries focused on solving real-world challenges, are my passions. I was recently affected by layoffs, and the tech jobs market is unwelcoming. I’m reaching out here because your support would significantly aid my efforts to provide for my family, and my farm (11 🐔 chickens, 2 🐶 dogs, 3 🐰 rabbits, 8 🐈‍ cats).
514
+
515
+ If you work at a company that uses my work, please encourage them to support me as a corporate sponsor. My work on gems you use might show up in `bundle fund`.
516
+
517
+ I’m developing a new library, [floss_funding][🖇floss-funding-gem], designed to empower open-source developers like myself to get paid for the work we do, in a sustainable way. Please give it a look.
518
+
519
+ **[Floss-Funding.dev][🖇floss-funding.dev]: 👉️ No network calls. 👉️ No tracking. 👉️ No oversight. 👉️ Minimal crypto hashing. 💡 Easily disabled nags**
520
+
521
+ [![OpenCollective Backers][🖇osc-backers-i]][🖇osc-backers] [![OpenCollective Sponsors][🖇osc-sponsors-i]][🖇osc-sponsors] [![Sponsor Me on Github][🖇sponsor-img]][🖇sponsor] [![Liberapay Goal Progress][⛳liberapay-img]][⛳liberapay] [![Donate on PayPal][🖇paypal-img]][🖇paypal] [![Buy me a coffee][🖇buyme-small-img]][🖇buyme] [![Donate to my FLOSS efforts at ko-fi.com][🖇kofi-img]][🖇kofi]
522
+
523
+ ## 🔐 Security
433
524
 
525
+ See [SECURITY.md][🔐security].
434
526
 
435
- ## License
527
+ ## 🤝 Contributing
436
528
 
437
- * Copyright (c) 2017 - 2018 [Peter H. Boling][peterboling] of [Rails Bling][railsbling]
529
+ If you need some ideas of where to help, you could work on adding more code coverage,
530
+ check [issues][🤝gh-issues] or [PRs][🤝gh-pulls], or use the gem and think about how it could be better.
438
531
 
439
- [![License: MIT](https://img.shields.io/badge/License-MIT-green.svg)](https://opensource.org/licenses/MIT)
532
+ We [![Keep A Changelog][📗keep-changelog-img]][📗keep-changelog] so if you make changes, remember to update it.
533
+
534
+ See [CONTRIBUTING.md][🤝contributing] for more detailed instructions.
535
+
536
+ ### 🚀 Release Instructions
537
+
538
+ See [CONTRIBUTING.md][🤝contributing].
539
+
540
+ ### Code Coverage
541
+
542
+ <details markdown="1">
543
+ <summary>Coverage service badges</summary>
544
+
545
+ [![Coverage Graph][🏀codecov-g]][🏀codecov]
546
+
547
+ [![Coveralls Test Coverage][🏀coveralls-img]][🏀coveralls]
548
+
549
+ [![QLTY Test Coverage][🏀qlty-covi]][🏀qlty-cov]
550
+
551
+ </details>
552
+
553
+ ### 🪇 Code of Conduct
554
+
555
+ Everyone interacting with this project's codebases, issue trackers,
556
+ chat rooms and mailing lists agrees to follow the [![Contributor Covenant 2.1][🪇conduct-img]][🪇conduct].
557
+
558
+ ## 🌈 Contributors
559
+
560
+ [![Contributors][🖐contributors-img]][🖐contributors]
561
+
562
+ Made with [contributors-img][🖐contrib-rocks].
563
+
564
+ Also see GitLab Contributors: [https://gitlab.com/resque/resque-unique_by_arity/-/graphs/main][🚎contributors-gl]
565
+
566
+ ## 📌 Versioning
567
+
568
+ This library follows [![Semantic Versioning 2.0.0][📌semver-img]][📌semver] for its public API where practical.
569
+ For most applications, prefer the [Pessimistic Version Constraint][📌pvc] with two digits of precision.
570
+
571
+ For example:
572
+
573
+ ```ruby
574
+ spec.add_dependency("resque-unique_by_arity", "~> 3.0")
575
+ ```
440
576
 
441
- [license]: LICENSE
442
- [semver]: http://semver.org/
443
- [pvc]: http://guides.rubygems.org/patterns/#pessimistic-version-constraint
444
- [railsbling]: http://www.railsbling.com
445
- [peterboling]: http://www.peterboling.com
446
- [documentation]: http://rdoc.info/github/pboling/resque-unique_by_arity/frames
447
- [homepage]: https://github.com/pboling/resque-unique_by_arity/
448
- [blogpage]: http://www.railsbling.com/tags/resque-unique_by_arity/
577
+ <details markdown="1">
578
+ <summary>📌 Is "Platform Support" part of the public API? More details inside.</summary>
579
+
580
+ Dropping support for a platform can be a breaking change for affected users.
581
+ If a release changes supported platforms, it should be called out clearly in the changelog and versioned with that impact in mind.
582
+
583
+ To get a better understanding of how SemVer is intended to work over a project's lifetime,
584
+ read this article from the creator of SemVer:
585
+
586
+ - ["Major Version Numbers are Not Sacred"][📌major-versions-not-sacred]
587
+
588
+ </details>
589
+
590
+ See [CHANGELOG.md][📌changelog] for a list of releases.
591
+
592
+ ## 📄 License
593
+
594
+ The gem is available as open source under the terms of
595
+ the [MIT](https://github.com/resque/resque-unique_by_arity/blob/main/MIT.md) [![License: MIT][📄license-img]][📄license-ref].
596
+
597
+ ### © Copyright
598
+
599
+ See [LICENSE.md][📄license] for the official copyright notice.
600
+
601
+ <details markdown="1">
602
+ <summary>Copyright holders</summary>
603
+
604
+ - Copyright (c) 2017-2018, 2026 Peter H. Boling
605
+ - Copyright (c) 2018 Daniel Cunha
606
+ - Copyright (c) 2019 Josh Reeves
607
+
608
+ </details>
609
+
610
+ ## 🤑 A request for help
611
+
612
+ Maintainers have teeth and need to pay their dentists.
613
+ After getting laid off in an RIF in March, and encountering difficulty finding a new one,
614
+ I began spending most of my time building open source tools.
615
+ I'm hoping to be able to pay for my kids' health insurance this month,
616
+ so if you value the work I am doing, I need your support.
617
+ Please consider sponsoring me or the project.
618
+
619
+ To join the community or get help, use the RubyForum or Discord.
620
+
621
+ [![Ruby Users Forum][✉️ruby-forum-img]][✉️ruby-forum]
622
+ [![Live Chat on Discord][✉️discord-invite-img-ftb]][✉️discord-invite]
623
+
624
+ To say "thanks!" ☝️ Join the community or 👇️ send money.
625
+
626
+ [![Sponsor resque/resque-unique_by_arity on Open Source Collective][🖇osc-all-bottom-img]][🖇osc] 💌 [![Sponsor me on GitHub Sponsors][🖇sponsor-bottom-img]][🖇sponsor] 💌 [![Sponsor me on Liberapay][⛳liberapay-bottom-img]][⛳liberapay] 💌 [![Donate on PayPal][🖇paypal-bottom-img]][🖇paypal]
627
+
628
+ ### Please give the project a star ⭐ ♥.
629
+
630
+ Many parts of this project are actively managed by a [kettle-jem](https://github.com/structuredmerge/structuredmerge-ruby/tree/main/gems/kettle-jem) smart template utilizing [StructuredMerge.org](https://structuredmerge.org) merge contracts.
631
+
632
+ Thanks for RTFM. ☺️
633
+
634
+ [⛳liberapay-img]: https://img.shields.io/liberapay/goal/pboling.svg?logo=liberapay&color=a51611&style=flat
635
+ [⛳liberapay-bottom-img]: https://img.shields.io/liberapay/goal/pboling.svg?style=for-the-badge&logo=liberapay&color=a51611
636
+ [⛳liberapay]: https://liberapay.com/pboling/donate
637
+ [🖇osc-all-img]: https://img.shields.io/opencollective/all/resque
638
+ [🖇osc-sponsors-img]: https://img.shields.io/opencollective/sponsors/resque
639
+ [🖇osc-backers-img]: https://img.shields.io/opencollective/backers/resque
640
+ [🖇osc-backers]: https://opencollective.com/resque#backer
641
+ [🖇osc-backers-i]: https://opencollective.com/resque/backers/badge.svg?style=flat
642
+ [🖇osc-sponsors]: https://opencollective.com/resque#sponsor
643
+ [🖇osc-sponsors-i]: https://opencollective.com/resque/sponsors/badge.svg?style=flat
644
+ [🖇osc-all-bottom-img]: https://img.shields.io/opencollective/all/resque?style=for-the-badge
645
+ [🖇osc-sponsors-bottom-img]: https://img.shields.io/opencollective/sponsors/resque?style=for-the-badge
646
+ [🖇osc-backers-bottom-img]: https://img.shields.io/opencollective/backers/resque?style=for-the-badge
647
+ [🖇osc]: https://opencollective.com/resque
648
+ [🖇sponsor-img]: https://img.shields.io/badge/Sponsor_Me!-pboling.svg?style=social&logo=github
649
+ [🖇sponsor-bottom-img]: https://img.shields.io/badge/Sponsor_Me!-pboling-blue?style=for-the-badge&logo=github
650
+ [🖇sponsor]: https://github.com/sponsors/pboling
651
+ [🖇kofi-img]: https://img.shields.io/badge/ko--fi-%E2%9C%93-a51611.svg?style=flat
652
+ [🖇kofi]: https://ko-fi.com/pboling
653
+ [🖇buyme-small-img]: https://img.shields.io/badge/buy_me_a_coffee-%E2%9C%93-a51611.svg?style=flat
654
+ [🖇buyme-img]: https://img.buymeacoffee.com/button-api/?text=Buy%20me%20a%20latte&emoji=&slug=pboling&button_colour=FFDD00&font_colour=000000&font_family=Cookie&outline_colour=000000&coffee_colour=ffffff
655
+ [🖇buyme]: https://www.buymeacoffee.com/pboling
656
+ [🖇paypal-img]: https://img.shields.io/badge/donate-paypal-a51611.svg?style=flat&logo=paypal
657
+ [🖇paypal-bottom-img]: https://img.shields.io/badge/donate-paypal-a51611.svg?style=for-the-badge&logo=paypal&color=0A0A0A
658
+ [🖇paypal]: https://www.paypal.com/paypalme/peterboling
659
+ [🖇floss-funding.dev]: https://floss-funding.dev
660
+ [🖇floss-funding-gem]: https://github.com/galtzo-floss/floss_funding
661
+ [✉️discord-invite]: https://discord.gg/3qme4XHNKN
662
+ [✉️discord-invite-img-ftb]: https://img.shields.io/discord/1373797679469170758?style=for-the-badge&logo=discord
663
+ [✉️ruby-friends-img]: https://img.shields.io/badge/daily.dev-%F0%9F%92%8E_Ruby_Friends-0A0A0A?style=for-the-badge&logo=dailydotdev&logoColor=white
664
+ [✉️ruby-friends]: https://app.daily.dev/squads/rubyfriends
665
+ [✉️ruby-forum-top-img]: https://img.shields.io/discourse/topics?server=https%3A%2F%2Fwww.rubyforum.org&style=flat&logo=discourse&label=Ruby%20Users%20Forum
666
+ [✉️ruby-forum-img]: https://img.shields.io/discourse/topics?server=https%3A%2F%2Fwww.rubyforum.org&style=for-the-badge&logo=discourse&label=Ruby%20Users%20Forum
667
+ [✉️ruby-forum]: https://www.rubyforum.org/tag/resque
668
+
669
+ [✇bundle-group-pattern]: https://gist.github.com/pboling/4564780
670
+ [⛳️gem-namespace]: https://github.com/resque/resque-unique_by_arity
671
+ [⛳️namespace-img]: https://img.shields.io/badge/namespace-Resque::UniqueByArity-3C2D2D.svg?style=square&logo=ruby&logoColor=white
672
+ [⛳️gem-name]: https://clickgems.clickhouse.com/dashboard/resque-unique_by_arity
673
+ [⛳️name-img]: https://img.shields.io/badge/name-resque--unique__by__arity-3C2D2D.svg?style=square&logo=rubygems&logoColor=red
674
+ [⛳️tag-img]: https://img.shields.io/github/tag/resque/resque-unique_by_arity.svg
675
+ [⛳️tag]: https://github.com/resque/resque-unique_by_arity/releases
676
+ [🚂maint-blog]: http://www.railsbling.com/tags/resque-unique_by_arity
677
+ [🚂maint-blog-img]: https://img.shields.io/badge/blog-railsbling-0093D0.svg?style=for-the-badge&logo=rubyonrails&logoColor=orange
678
+ [🚂maint-contact]: http://www.railsbling.com/contact
679
+ [🚂maint-contact-img]: https://img.shields.io/badge/Contact-Maintainer-0093D0.svg?style=flat&logo=rubyonrails&logoColor=red
680
+ [💖🖇linkedin]: http://www.linkedin.com/in/peterboling
681
+ [💖🖇linkedin-img]: https://img.shields.io/badge/LinkedIn-Profile-0B66C2?style=flat&logo=newjapanprowrestling
682
+ [💖✌️wellfound]: https://wellfound.com/u/peter-boling
683
+ [💖✌️wellfound-img]: https://img.shields.io/badge/peter--boling-orange?style=flat&logo=wellfound
684
+ [💖💲crunchbase]: https://www.crunchbase.com/person/peter-boling
685
+ [💖💲crunchbase-img]: https://img.shields.io/badge/peter--boling-purple?style=flat&logo=crunchbase
686
+ [💖🐘ruby-mast]: https://ruby.social/@galtzo
687
+ [💖🐘ruby-mast-img]: https://img.shields.io/mastodon/follow/109447111526622197?domain=https://ruby.social&style=flat&logo=mastodon&label=Ruby%20@galtzo
688
+ [💖🦋bluesky]: https://bsky.app/profile/galtzo.com
689
+ [💖🦋bluesky-img]: https://img.shields.io/badge/@galtzo.com-0285FF?style=flat&logo=bluesky&logoColor=white
690
+ [💖🌳linktree]: https://linktr.ee/galtzo
691
+ [💖🌳linktree-img]: https://img.shields.io/badge/galtzo-purple?style=flat&logo=linktree
692
+ [💖💁🏼‍♂️devto]: https://dev.to/galtzo
693
+ [💖💁🏼‍♂️devto-img]: https://img.shields.io/badge/dev.to-0A0A0A?style=flat&logo=devdotto&logoColor=white
694
+ [💖💁🏼‍♂️aboutme]: https://about.me/peter.boling
695
+ [💖💁🏼‍♂️aboutme-img]: https://img.shields.io/badge/about.me-0A0A0A?style=flat&logo=aboutme&logoColor=white
696
+ [💖🧊berg]: https://codeberg.org/pboling
697
+ [💖🐙hub]: https://github.org/pboling
698
+ [💖🛖hut]: https://sr.ht/~galtzo/
699
+ [💖🧪lab]: https://gitlab.com/pboling
700
+ [👨🏼‍🏫expsup-upwork]: https://www.upwork.com/freelancers/~014942e9b056abdf86?mp_source=share
701
+ [👨🏼‍🏫expsup-upwork-img]: https://img.shields.io/badge/UpWork-13544E?style=for-the-badge&logo=Upwork&logoColor=white
702
+ [👨🏼‍🏫expsup-codementor]: https://www.codementor.io/peterboling?utm_source=github&utm_medium=button&utm_term=peterboling&utm_campaign=github
703
+ [👨🏼‍🏫expsup-codementor-img]: https://img.shields.io/badge/CodeMentor-Get_Help-1abc9c?style=for-the-badge&logo=CodeMentor&logoColor=white
704
+ [🏙️entsup-tidelift]: https://tidelift.com/subscription/pkg/rubygems-resque-unique_by_arity?utm_source=rubygems-resque-unique_by_arity&utm_medium=referral&utm_campaign=readme
705
+ [🏙️entsup-tidelift-img]: https://img.shields.io/badge/Tidelift_and_Sonar-Enterprise_Support-FD3456?style=for-the-badge&logo=sonar&logoColor=white
706
+ [🏙️entsup-tidelift-sonar]: https://blog.tidelift.com/tidelift-joins-sonar
707
+ [💁🏼‍♂️peterboling]: http://www.peterboling.com
708
+ [🚂railsbling]: http://www.railsbling.com
709
+ [📜src-gl-img]: https://img.shields.io/badge/GitLab-FBA326?style=for-the-badge&logo=Gitlab&logoColor=orange
710
+ [📜src-gl]: https://gitlab.com/resque/resque-unique_by_arity
711
+ [📜src-cb-img]: https://img.shields.io/badge/CodeBerg-4893CC?style=for-the-badge&logo=CodeBerg&logoColor=blue
712
+ [📜src-cb]: https://codeberg.org/resque/resque-unique_by_arity
713
+ [📜src-gh-img]: https://img.shields.io/badge/GitHub-238636?style=for-the-badge&logo=GitHub&logoColor=green
714
+ [📜src-gh]: https://github.com/resque/resque-unique_by_arity
715
+ [📜docs-cr-rd-img]: https://img.shields.io/badge/RubyDoc-Current_Release-943CD2?style=for-the-badge&logo=readthedocs&logoColor=white
716
+ [📜docs-head-rd-img]: https://img.shields.io/badge/YARD_on_Galtzo.com-HEAD-943CD2?style=for-the-badge&logo=readthedocs&logoColor=white
717
+ [📜gl-wiki]: https://gitlab.com/resque/resque-unique_by_arity/-/wikis/home
718
+ [📜gh-wiki]: https://github.com/resque/resque-unique_by_arity/wiki
719
+ [📜gl-wiki-img]: https://img.shields.io/badge/wiki-gitlab-943CD2.svg?style=for-the-badge&logo=gitlab&logoColor=white
720
+ [📜gh-wiki-img]: https://img.shields.io/badge/wiki-github-943CD2.svg?style=for-the-badge&logo=github&logoColor=white
721
+ [👽dl-rank]: https://clickgems.clickhouse.com/dashboard/resque-unique_by_arity
722
+ [👽dl-ranki]: https://img.shields.io/gem/dt/resque-unique_by_arity.svg
723
+ [👽version]: https://clickgems.clickhouse.com/dashboard/resque-unique_by_arity
724
+ [👽versioni]: https://img.shields.io/gem/v/resque-unique_by_arity.svg
725
+ [🏀qlty-mnt]: https://qlty.sh/gh/resque/projects/resque-unique_by_arity
726
+ [🏀qlty-mnti]: https://qlty.sh/gh/resque/projects/resque-unique_by_arity/maintainability.svg
727
+ [🏀qlty-cov]: https://qlty.sh/gh/resque/projects/resque-unique_by_arity/metrics/code?sort=coverageRating
728
+ [🏀qlty-covi]: https://qlty.sh/gh/resque/projects/resque-unique_by_arity/coverage.svg
729
+ [🏀codecov]: https://codecov.io/gh/resque/resque-unique_by_arity
730
+ [🏀codecovi]: https://codecov.io/gh/resque/resque-unique_by_arity/graph/badge.svg
731
+ [🏀coveralls]: https://coveralls.io/github/resque/resque-unique_by_arity?branch=main
732
+ [🏀coveralls-img]: https://coveralls.io/repos/github/resque/resque-unique_by_arity/badge.svg?branch=main
733
+ [🚎ruby-2.4-wf]: https://github.com/resque/resque-unique_by_arity/actions/workflows/ruby-2.4.yml
734
+ [🚎ruby-2.5-wf]: https://github.com/resque/resque-unique_by_arity/actions/workflows/ruby-2.5.yml
735
+ [🚎ruby-2.6-wf]: https://github.com/resque/resque-unique_by_arity/actions/workflows/ruby-2.6.yml
736
+ [🚎ruby-2.7-wf]: https://github.com/resque/resque-unique_by_arity/actions/workflows/ruby-2.7.yml
737
+ [🚎ruby-3.0-wf]: https://github.com/resque/resque-unique_by_arity/actions/workflows/ruby-3.0.yml
738
+ [🚎ruby-3.1-wf]: https://github.com/resque/resque-unique_by_arity/actions/workflows/ruby-3.1.yml
739
+ [🚎ruby-3.2-wf]: https://github.com/resque/resque-unique_by_arity/actions/workflows/ruby-3.2.yml
740
+ [🚎ruby-3.3-wf]: https://github.com/resque/resque-unique_by_arity/actions/workflows/ruby-3.3.yml
741
+ [🚎ruby-3.4-wf]: https://github.com/resque/resque-unique_by_arity/actions/workflows/ruby-3.4.yml
742
+ [🚎jruby-9.2-wf]: https://github.com/resque/resque-unique_by_arity/actions/workflows/jruby-9.2.yml
743
+ [🚎jruby-9.3-wf]: https://github.com/resque/resque-unique_by_arity/actions/workflows/jruby-9.3.yml
744
+ [🚎jruby-9.4-wf]: https://github.com/resque/resque-unique_by_arity/actions/workflows/jruby-9.4.yml
745
+ [🚎jruby-10.0-wf]: https://github.com/resque/resque-unique_by_arity/actions/workflows/jruby-10.0.yml
746
+ [🚎truby-22.3-wf]: https://github.com/resque/resque-unique_by_arity/actions/workflows/truffleruby-22.3.yml
747
+ [🚎truby-23.0-wf]: https://github.com/resque/resque-unique_by_arity/actions/workflows/truffleruby-23.0.yml
748
+ [🚎truby-23.1-wf]: https://github.com/resque/resque-unique_by_arity/actions/workflows/truffleruby-23.1.yml
749
+ [🚎truby-24.2-wf]: https://github.com/resque/resque-unique_by_arity/actions/workflows/truffleruby-24.2.yml
750
+ [🚎truby-25.0-wf]: https://github.com/resque/resque-unique_by_arity/actions/workflows/truffleruby-25.0.yml
751
+ [🚎truby-33.0-wf]: https://github.com/resque/resque-unique_by_arity/actions/workflows/truffleruby-33.0.yml
752
+ [🚎2-cov-wf]: https://github.com/resque/resque-unique_by_arity/actions/workflows/coverage.yml
753
+ [🚎2-cov-wfi]: https://github.com/resque/resque-unique_by_arity/actions/workflows/coverage.yml/badge.svg
754
+ [🚎3-hd-wf]: https://github.com/resque/resque-unique_by_arity/actions/workflows/heads.yml
755
+ [🚎3-hd-wfi]: https://github.com/resque/resque-unique_by_arity/actions/workflows/heads.yml/badge.svg
756
+ [🚎5-st-wf]: https://github.com/resque/resque-unique_by_arity/actions/workflows/style.yml
757
+ [🚎5-st-wfi]: https://github.com/resque/resque-unique_by_arity/actions/workflows/style.yml/badge.svg
758
+ [🚎9-t-wf]: https://github.com/resque/resque-unique_by_arity/actions/workflows/truffle.yml
759
+ [🚎9-t-wfi]: https://github.com/resque/resque-unique_by_arity/actions/workflows/truffle.yml/badge.svg
760
+ [🚎10-j-wf]: https://github.com/resque/resque-unique_by_arity/actions/workflows/jruby.yml
761
+ [🚎10-j-wfi]: https://github.com/resque/resque-unique_by_arity/actions/workflows/jruby.yml/badge.svg
762
+ [🚎11-c-wf]: https://github.com/resque/resque-unique_by_arity/actions/workflows/current.yml
763
+ [🚎11-c-wfi]: https://github.com/resque/resque-unique_by_arity/actions/workflows/current.yml/badge.svg
764
+ [🚎12-crh-wf]: https://github.com/resque/resque-unique_by_arity/actions/workflows/dep-heads.yml
765
+ [🚎12-crh-wfi]: https://github.com/resque/resque-unique_by_arity/actions/workflows/dep-heads.yml/badge.svg
766
+ [🚎13-🔒️-wf]: https://github.com/resque/resque-unique_by_arity/actions/workflows/locked_deps.yml
767
+ [🚎13-🔒️-wfi]: https://github.com/resque/resque-unique_by_arity/actions/workflows/locked_deps.yml/badge.svg
768
+ [🚎14-🔓️-wf]: https://github.com/resque/resque-unique_by_arity/actions/workflows/unlocked_deps.yml
769
+ [🚎14-🔓️-wfi]: https://github.com/resque/resque-unique_by_arity/actions/workflows/unlocked_deps.yml/badge.svg
770
+ [🚎15-🪪-wf]: https://github.com/resque/resque-unique_by_arity/actions/workflows/license-eye.yml
771
+ [🚎15-🪪-wfi]: https://github.com/resque/resque-unique_by_arity/actions/workflows/license-eye.yml/badge.svg
772
+ [💎ruby-2.3i]: https://img.shields.io/badge/Ruby-2.3_(%F0%9F%9A%ABCI)-AABBCC?style=for-the-badge&logo=ruby&logoColor=white
773
+ [💎ruby-2.4i]: https://img.shields.io/badge/Ruby-2.4-DF00CA?style=for-the-badge&logo=ruby&logoColor=white
774
+ [💎ruby-2.5i]: https://img.shields.io/badge/Ruby-2.5-DF00CA?style=for-the-badge&logo=ruby&logoColor=white
775
+ [💎ruby-2.6i]: https://img.shields.io/badge/Ruby-2.6-DF00CA?style=for-the-badge&logo=ruby&logoColor=white
776
+ [💎ruby-2.7i]: https://img.shields.io/badge/Ruby-2.7-DF00CA?style=for-the-badge&logo=ruby&logoColor=white
777
+ [💎ruby-3.0i]: https://img.shields.io/badge/Ruby-3.0-CC342D?style=for-the-badge&logo=ruby&logoColor=white
778
+ [💎ruby-3.1i]: https://img.shields.io/badge/Ruby-3.1-CC342D?style=for-the-badge&logo=ruby&logoColor=white
779
+ [💎ruby-3.2i]: https://img.shields.io/badge/Ruby-3.2-CC342D?style=for-the-badge&logo=ruby&logoColor=white
780
+ [💎ruby-3.3i]: https://img.shields.io/badge/Ruby-3.3-CC342D?style=for-the-badge&logo=ruby&logoColor=white
781
+ [💎ruby-3.4i]: https://img.shields.io/badge/Ruby-3.4-CC342D?style=for-the-badge&logo=ruby&logoColor=white
782
+ [💎ruby-c-i]: https://img.shields.io/badge/Ruby-current-CC342D?style=for-the-badge&logo=ruby&logoColor=green
783
+ [💎ruby-headi]: https://img.shields.io/badge/Ruby-HEAD-CC342D?style=for-the-badge&logo=ruby&logoColor=blue
784
+ [💎truby-22.3i]: https://img.shields.io/badge/Truffle_Ruby-22.3-34BCB1?style=for-the-badge&logo=ruby&logoColor=pink
785
+ [💎truby-23.0i]: https://img.shields.io/badge/Truffle_Ruby-23.0-34BCB1?style=for-the-badge&logo=ruby&logoColor=pink
786
+ [💎truby-23.1i]: https://img.shields.io/badge/Truffle_Ruby-23.1-34BCB1?style=for-the-badge&logo=ruby&logoColor=pink
787
+ [💎truby-24.2i]: https://img.shields.io/badge/Truffle_Ruby-24.2-34BCB1?style=for-the-badge&logo=ruby&logoColor=pink
788
+ [💎truby-25.0i]: https://img.shields.io/badge/Truffle_Ruby-25.0-34BCB1?style=for-the-badge&logo=ruby&logoColor=pink
789
+ [💎truby-33.0i]: https://img.shields.io/badge/Truffle_Ruby-33.0-34BCB1?style=for-the-badge&logo=ruby&logoColor=pink
790
+ [💎truby-c-i]: https://img.shields.io/badge/Truffle_Ruby-current-34BCB1?style=for-the-badge&logo=ruby&logoColor=green
791
+ [💎truby-headi]: https://img.shields.io/badge/Truffle_Ruby-HEAD-34BCB1?style=for-the-badge&logo=ruby&logoColor=blue
792
+ [💎jruby-9.2i]: https://img.shields.io/badge/JRuby-9.2-FBE742?style=for-the-badge&logo=ruby&logoColor=red
793
+ [💎jruby-9.3i]: https://img.shields.io/badge/JRuby-9.3-FBE742?style=for-the-badge&logo=ruby&logoColor=red
794
+ [💎jruby-9.4i]: https://img.shields.io/badge/JRuby-9.4-FBE742?style=for-the-badge&logo=ruby&logoColor=red
795
+ [💎jruby-10.0i]: https://img.shields.io/badge/JRuby-10.0-FBE742?style=for-the-badge&logo=ruby&logoColor=red
796
+ [💎jruby-c-i]: https://img.shields.io/badge/JRuby-current-FBE742?style=for-the-badge&logo=ruby&logoColor=green
797
+ [💎jruby-headi]: https://img.shields.io/badge/JRuby-HEAD-FBE742?style=for-the-badge&logo=ruby&logoColor=blue
798
+ [🤝gh-issues]: https://github.com/resque/resque-unique_by_arity/issues
799
+ [🤝gh-pulls]: https://github.com/resque/resque-unique_by_arity/pulls
800
+ [🤝gl-issues]: https://gitlab.com/resque/resque-unique_by_arity/-/issues
801
+ [🤝gl-pulls]: https://gitlab.com/resque/resque-unique_by_arity/-/merge_requests
802
+ [🤝cb-issues]: https://codeberg.org/resque/resque-unique_by_arity/issues
803
+ [🤝cb-pulls]: https://codeberg.org/resque/resque-unique_by_arity/pulls
804
+ [🤝cb-donate]: https://donate.codeberg.org/
805
+ [🤝contributing]: https://github.com/resque/resque-unique_by_arity/blob/main/CONTRIBUTING.md
806
+ [🏀codecov-g]: https://codecov.io/gh/resque/resque-unique_by_arity/graph/badge.svg
807
+ [🖐contrib-rocks]: https://contrib.rocks
808
+ [🖐contributors]: https://github.com/resque/resque-unique_by_arity/graphs/contributors
809
+ [🖐contributors-img]: https://contrib.rocks/image?repo=resque/resque-unique_by_arity
810
+ [🚎contributors-gl]: https://gitlab.com/resque/resque-unique_by_arity/-/graphs/main
811
+ [🪇conduct]: https://github.com/resque/resque-unique_by_arity/blob/main/CODE_OF_CONDUCT.md
812
+ [🪇conduct-img]: https://img.shields.io/badge/Contributor_Covenant-2.1-259D6C.svg
813
+ [📌pvc]: http://guides.rubygems.org/patterns/#pessimistic-version-constraint
814
+ [📌semver]: https://semver.org/spec/v2.0.0.html
815
+ [📌semver-img]: https://img.shields.io/badge/semver-2.0.0-259D6C.svg?style=flat
816
+ [📌semver-breaking]: https://github.com/semver/semver/issues/716#issuecomment-869336139
817
+ [📌major-versions-not-sacred]: https://tom.preston-werner.com/2022/05/23/major-version-numbers-are-not-sacred.html
818
+ [📌changelog]: https://github.com/resque/resque-unique_by_arity/blob/main/CHANGELOG.md
819
+ [📗keep-changelog]: https://keepachangelog.com/en/1.0.0/
820
+ [📗keep-changelog-img]: https://img.shields.io/badge/keep--a--changelog-1.0.0-34495e.svg?style=flat
821
+ [📌gitmoji]: https://gitmoji.dev
822
+ [📌gitmoji-img]: https://img.shields.io/badge/gitmoji_commits-%20%F0%9F%98%9C%20%F0%9F%98%8D-34495e.svg?style=flat-square
823
+ [🧮kloc]: https://www.youtube.com/watch?v=dQw4w9WgXcQ
824
+ [🧮kloc-img]: https://img.shields.io/badge/KLOC-0.318-FFDD67.svg?style=for-the-badge&logo=YouTube&logoColor=blue
825
+ [🔐security]: https://github.com/resque/resque-unique_by_arity/blob/main/SECURITY.md
826
+ [🔐security-img]: https://img.shields.io/badge/security-policy-259D6C.svg?style=flat
827
+ [📄copyright-notice-explainer]: https://opensource.stackexchange.com/questions/5778/why-do-licenses-such-as-the-mit-license-specify-a-single-year
828
+ [📄license]: LICENSE.md
829
+ [📄license-ref]: https://github.com/resque/resque-unique_by_arity/blob/main/MIT.md
830
+ [📄license-img]: https://img.shields.io/badge/License-MIT-259D6C.svg
831
+ [📄license-compat]: https://www.apache.org/legal/resolved.html#category-a
832
+ [📄license-compat-img]: https://img.shields.io/badge/Apache_Compatible:_Category_A-%E2%9C%93-259D6C.svg?style=flat&logo=Apache
833
+
834
+ [📄ilo-declaration]: https://www.ilo.org/declaration/lang--en/index.htm
835
+ [📄ilo-declaration-img]: https://img.shields.io/badge/ILO_Fundamental_Principles-✓-259D6C.svg?style=flat
836
+ [🚎yard-current]: http://rubydoc.info/gems/resque-unique_by_arity
837
+ [🚎yard-head]: https://resque-unique-by-arity.galtzo.com
838
+ [💎stone_checksums]: https://github.com/galtzo-floss/stone_checksums
839
+ [💎SHA_checksums]: https://gitlab.com/resque/resque-unique_by_arity/-/tree/main/checksums
840
+ [💎rlts]: https://github.com/rubocop-lts/rubocop-lts
841
+ [💎rlts-img]: https://img.shields.io/badge/code_style_&_linting-rubocop--lts-34495e.svg?plastic&logo=ruby&logoColor=white
842
+ [💎appraisal2]: https://github.com/appraisal-rb/appraisal2
843
+ [💎appraisal2-img]: https://img.shields.io/badge/appraised_by-appraisal2-34495e.svg?plastic&logo=ruby&logoColor=white
844
+ [💎d-in-dvcs]: https://railsbling.com/posts/dvcs/put_the_d_in_dvcs/
845
+
846
+ <!-- kettle-jem:metadata:start -->
847
+ | Field | Value |
848
+ |---|---|
849
+ | Package | resque-unique_by_arity |
850
+ | Description | 💎 Configure resque-unique_in_queue and resque-unique_at_runtime uniqueness by arity of perform method, with automated cleanup tools |
851
+ | Homepage | https://github.com/resque/resque-unique_by_arity |
852
+ | Source | https://github.com/resque/resque-unique_by_arity |
853
+ | License | `MIT` |
854
+ | Funding | https://github.com/sponsors/pboling, https://ko-fi.com/pboling, https://liberapay.com/pboling/donate, https://opencollective.com/resque, https://thanks.dev/u/gh/pboling, https://tidelift.com/funding/github/rubygems/resque-unique_by_arity, https://www.buymeacoffee.com/pboling |
855
+ <!-- kettle-jem:metadata:end -->