snaky_hash 2.0.3 → 2.0.7

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,171 +1,125 @@
1
- # 🐍 SnakyHash
1
+ <a href="https://github.com/ruby-oauth"><img alt="ruby-oauth Logo by Aboling0, CC BY-SA 4.0" src="https://logos.galtzo.com/assets/images/ruby-oauth/avatar-128px.svg" width="14%" align="right"/></a>
2
2
 
3
- [![Version][👽versioni]][👽version] [![License: MIT][📄license-img]][📄license-ref] [![Downloads Rank][👽dl-ranki]][👽dl-rank] [![Open Source Helpers][👽oss-helpi]][👽oss-help] [![Depfu][🔑depfui♻️]][🔑depfu] [![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] [![CI Supported][🚎6-s-wfi]][🚎6-s-wf] [![CI Legacy][🚎4-lg-wfi]][🚎4-lg-wf] [![CI Unsupported][🚎7-us-wfi]][🚎7-us-wf] [![CI Ancient][🚎1-an-wfi]][🚎1-an-wf] [![CI Test Coverage][🚎2-cov-wfi]][🚎2-cov-wf] [![CI Style][🚎5-st-wfi]][🚎5-st-wf] [![CodeQL][🖐codeQL-img]][🖐codeQL]
3
+ # 🔮 SnakyHash
4
4
 
5
- ---
6
-
7
- [![Liberapay Goal Progress][⛳liberapay-img]][⛳liberapay] [![Sponsor Me on Github][🖇sponsor-img]][🖇sponsor] [![Buy me a coffee][🖇buyme-small-img]][🖇buyme] [![Donate on Polar][🖇polar-img]][🖇polar] [![Donate to my FLOSS or refugee efforts at ko-fi.com][🖇kofi-img]][🖇kofi] [![Donate to my FLOSS or refugee efforts using Patreon][🖇patreon-img]][🖇patreon]
5
+ [![Version][👽versioni]][👽version] [![GitHub tag (latest SemVer)][⛳️tag-img]][⛳️tag] [![License: MIT][📄license-img]][📄license] [![Downloads Rank][👽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]
8
6
 
9
- This library is similar in purpose to the HashWithIndifferentAccess that is famously used in Rails, but does a lot more.
7
+ `if ci_badges.map(&:color).detect { it != "green"}` ☝️ [let me know][✉️discord-invite], as I may have missed the [discord notification][✉️discord-invite].
10
8
 
11
- This gem is used by `oauth` and `oauth2` gems to normalize hash keys to `snake_case` and lookups,
12
- and provide a nice psuedo-object interface.
13
-
14
- It can be thought of as a mashup of:
9
+ ---
15
10
 
16
- * `Rash` (specifically the [`rash_alt`](https://github.com/shishi/rash_alt) flavor), which is a special `Mash`, made popular by the `hashie` gem, and
17
- * `serialized_hashie` [gem by krystal](https://github.com/krystal/serialized-hashie), rewritten, with some behavior changes
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.
18
12
 
19
- Classes that `include SnakyHash::Snake.new` should inherit from `Hashie::Mash`.
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]
20
14
 
21
- ## New for v2.0.2: Serialization Support
15
+ <details markdown="1">
16
+ <summary>👣 How will this project approach the September 2025 hostile takeover of RubyGems? 🚑️</summary>
22
17
 
23
- The serialization support is set to `false` by default, for backwards compatibility, but may be switched to `true` in the next major release, which will be v3. Example:
18
+ I've summarized my thoughts in [this blog post](https://dev.to/galtzo/hostile-takeover-of-rubygems-my-thoughts-5hlo).
24
19
 
25
- ```ruby
26
- # This class has `dump` and `load` abilities!
27
- class MyStringKeyedHash < Hashie::Mash
28
- include SnakyHash::Snake.new(
29
- key_type: :string,
30
- serializer: true,
31
- )
32
- end
33
- ```
34
-
35
- ✨ Also new dump & load plugin extensions to control the way your data is dumped and loaded.
36
-
37
- ### Note for use with oauth2 gem
38
-
39
- The serializer is being introduced as a disabled option for backwards compatibility.
40
- In snaky_hash v3 it will default to `true`.
41
- If you want to start using the serializer immediately, reopen the `SnakyHash::StringKeyed` class and add the `SnakyHash::Serializer` module like this:
42
-
43
- ```ruby
44
- SnakyHash::StringKeyed.class_eval do
45
- extend SnakyHash::Serializer
46
- end
47
- ```
20
+ </details>
48
21
 
49
- or you can create a custom class
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>
50
23
 
51
- ```ruby
52
- class MyHash < Hashie::Mash
53
- include SnakyHash::Snake.new(key_type: :string, serializer: true)
54
- # Which is the same as:
55
- # include SnakyHash::Snake.new(key_type: :string)
56
- # extend SnakyHash::Serializer
57
- end
58
- ```
59
-
60
- You can then add serialization extensions as needed. See [serialization](#serialization) and [extensions](#extensions) for more.
24
+ ## 💡 Info you can shake a stick at
61
25
 
62
- | Federated [DVCS][💎d-in-dvcs] Repository | Status | Issues | PRs | Wiki | CI | Discussions |
63
- |-----------------------------------------------|-------------------------------------------------------------------|---------------------------|--------------------------|---------------------------|--------------------------|------------------------------|
64
- | 🧪 [oauth-xx/snaky_hash on GitLab][📜src-gl] | The Truth | [💚][🤝gl-issues] | [💚][🤝gl-pulls] | [💚][📜wiki] | 🏀 Tiny Matrix | ➖ |
65
- | 🧊 [oauth-xx/snaky_hash on CodeBerg][📜src-cb] | An Ethical Mirror ([Donate][🤝cb-donate]) | ➖ | [💚][🤝cb-pulls] | ➖ | ⭕️ No Matrix | |
66
- | 🐙 [oauth-xx/snaky_hash on GitHub][📜src-gh] | A Dirty Mirror | [💚][🤝gh-issues] | [💚][🤝gh-pulls] | ➖ | 💯 Full Matrix | ➖ |
67
- | 🤼 [OAuth Ruby Google Group][⛳gg-discussions] | "Active" | ➖ | ➖ | ➖ | ➖ | [💚][⛳gg-discussions] |
68
- | 🎮️ [Discord Server][✉️discord-invite] | [![Live Chat on Discord][✉️discord-invite-img]][✉️discord-invite] | [Let's][✉️discord-invite] | [talk][✉️discord-invite] | [about][✉️discord-invite] | [this][✉️discord-invite] | [library!][✉️discord-invite] |
26
+ | Tokens to Remember | [![Gem name][⛳️name-img]][⛳️gem-name] [![Gem namespace][⛳️namespace-img]][⛳️gem-namespace] |
27
+ |-------------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
28
+ | 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]|
29
+ | 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]|
30
+ | Works with MRI Ruby 4 | [![Ruby current Compat][💎ruby-c-i]][🚎11-c-wf] [![Ruby HEAD Compat][💎ruby-headi]][🚎3-hd-wf]|
31
+ | 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]|
32
+ | Works with MRI Ruby 2 | ![Ruby 2.2 Compat][💎ruby-2.2i] ![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]|
33
+ | Support & Community | [![Join Me on Daily.dev's RubyFriends][✉️ruby-friends-img]][✉️ruby-friends] [![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] |
34
+ | 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] |
35
+ | 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] |
36
+ | 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] |
37
+ | 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] |
38
+ | 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] |
39
+ | `...` 💖 | [![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] |
40
+
41
+ ### Compatibility
42
+
43
+ Compatible with MRI Ruby 2.2.0+, and concordant releases of JRuby, and TruffleRuby.
44
+ CI workflows and Appraisals are generated for MRI Ruby 2.4+.
45
+ This test floor is configured by `ruby.test_minimum` in `.kettle-jem.yml` and
46
+ may be higher than the gem's runtime compatibility floor when legacy Rubies are
47
+ not practical for the current toolchain.
48
+
49
+ <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>
50
+
51
+ The _amazing_ test matrix is powered by the kettle-dev stack.
52
+
53
+ <details markdown="1">
54
+ <summary>How kettle-dev manages complexity in tests</summary>
55
+
56
+ | Gem | Source | Role | Daily download rank |
57
+ |-----|--------|------|---------------------|
58
+ | [appraisal2](https://bestgems.org/gems/appraisal2) | [GitHub](https://github.com/appraisal-rb/appraisal2) | multi-dependency Appraisal matrix generation | [![Daily download rank for appraisal2](https://img.shields.io/gem/rd/appraisal2.svg?style=flat-square)](https://bestgems.org/gems/appraisal2) |
59
+ | [appraisal2-rubocop](https://bestgems.org/gems/appraisal2-rubocop) | [GitHub](https://github.com/appraisal-rb/appraisal2-rubocop) | RuboCop Appraisal generator integration | [![Daily download rank for appraisal2-rubocop](https://img.shields.io/gem/rd/appraisal2-rubocop.svg?style=flat-square)](https://bestgems.org/gems/appraisal2-rubocop) |
60
+ | [kettle-dev](https://bestgems.org/gems/kettle-dev) | [GitHub](https://github.com/kettle-dev/kettle-dev) | development, release, and CI workflow tooling | [![Daily download rank for kettle-dev](https://img.shields.io/gem/rd/kettle-dev.svg?style=flat-square)](https://bestgems.org/gems/kettle-dev) |
61
+ | [kettle-jem](https://bestgems.org/gems/kettle-jem) | [GitHub](https://github.com/kettle-dev/kettle-jem) | Appraisals & CI workflow templates | [![Daily download rank for kettle-jem](https://img.shields.io/gem/rd/kettle-jem.svg?style=flat-square)](https://bestgems.org/gems/kettle-jem) |
62
+ | [kettle-soup-cover](https://bestgems.org/gems/kettle-soup-cover) | [GitHub](https://github.com/kettle-dev/kettle-soup-cover) | SimpleCov coverage policy and reporting | [![Daily download rank for kettle-soup-cover](https://img.shields.io/gem/rd/kettle-soup-cover.svg?style=flat-square)](https://bestgems.org/gems/kettle-soup-cover) |
63
+ | [kettle-test](https://bestgems.org/gems/kettle-test) | [GitHub](https://github.com/kettle-dev/kettle-test) | standard test runner and coverage harness | [![Daily download rank for kettle-test](https://img.shields.io/gem/rd/kettle-test.svg?style=flat-square)](https://bestgems.org/gems/kettle-test) |
64
+ | [rubocop-lts](https://bestgems.org/gems/rubocop-lts) | [GitHub](https://github.com/rubocop-lts/rubocop-lts) | Ruby-version-aware linting | [![Daily download rank for rubocop-lts](https://img.shields.io/gem/rd/rubocop-lts.svg?style=flat-square)](https://bestgems.org/gems/rubocop-lts) |
65
+ | [turbo_tests2](https://bestgems.org/gems/turbo_tests2) | [GitHub](https://github.com/galtzo-floss/turbo_tests2) | parallel test execution | [![Daily download rank for turbo_tests2](https://img.shields.io/gem/rd/turbo_tests2.svg?style=flat-square)](https://bestgems.org/gems/turbo_tests2) |
69
66
 
70
- ## Upgrading Runtime Gem Dependencies
67
+ </details>
71
68
 
72
- Due to oauth and oauth2 gems depending on this gem,
73
- this project sits underneath a large portion of the authorization systems on the internet.
69
+ ### Federated DVCS
74
70
 
75
- That means it is painful for the Ruby community when this gem forces updates to its runtime dependencies.
71
+ <details markdown="1">
72
+ <summary>Find this repo on federated forges (Coming soon!)</summary>
76
73
 
77
- As a result, great care, and a lot of time, have been invested to ensure this gem is working with all the
78
- leading versions per each minor version of Ruby of all the runtime dependencies it can install with.
74
+ | Federated [DVCS][💎d-in-dvcs] Repository | Status | Issues | PRs | Wiki | CI | Discussions |
75
+ |-------------------------------------------------|-----------------------------------------------------------------------|---------------------------|--------------------------|---------------------------|--------------------------|------------------------------|
76
+ | 🧪 [ruby-oauth/snaky_hash on GitLab][📜src-gl] | The Truth | [💚][🤝gl-issues] | [💚][🤝gl-pulls] | [💚][📜gl-wiki] | 🐭 Tiny Matrix | ➖ |
77
+ | 🧊 [ruby-oauth/snaky_hash on CodeBerg][📜src-cb] | An Ethical Mirror ([Donate][🤝cb-donate]) | [💚][🤝cb-issues] | [💚][🤝cb-pulls] | ➖ | ⭕️ No Matrix | ➖ |
78
+ | 🐙 [ruby-oauth/snaky_hash on GitHub][📜src-gh] | Another Mirror | [💚][🤝gh-issues] | [💚][🤝gh-pulls] | [💚][📜gh-wiki] | 💯 Full Matrix | [💚][gh-discussions] |
79
+ | 🎮️ [Discord Server][✉️discord-invite] | [![Live Chat on Discord][✉️discord-invite-img-ftb]][✉️discord-invite] | [Let's][✉️discord-invite] | [talk][✉️discord-invite] | [about][✉️discord-invite] | [this][✉️discord-invite] | [library!][✉️discord-invite] |
79
80
 
80
- What does that mean specifically for the runtime dependencies?
81
+ </details>
81
82
 
82
- We have 100% test coverage of lines and branches, and this test suite runs across a large matrix
83
- covering the latest patch for each of the following minor versions:
83
+ [gh-discussions]: https://github.com/ruby-oauth/snaky_hash/discussions
84
84
 
85
- * MRI Ruby @ v2.3, v2.4, v2.5, v2.6, v2.7, v3.0, v3.1, v3.2, v3.3, v3.4, HEAD
86
- * NOTE: This gem will still install on ruby v2.2, but vanilla GitHub Actions no longer supports testing against it, so YMMV.
87
- * JRuby @ v9.2, v9.3, v9.4, v10.0, HEAD
88
- * TruffleRuby @ v23.1, v23.2, HEAD
89
- * gem `hashie` @ v0, v1, v2, v3, v4, v5, HEAD ⏩️ [hashie/hashie](https://github.com/hashie/hashie)
90
- * gem `version_gem` - @v1, HEAD ⏩️ [oauth-xx/version_gem](https://gitlab.com/oauth-xx/version_gem)
85
+ ### Enterprise Support [![Tidelift](https://tidelift.com/badges/package/rubygems/snaky_hash)](https://tidelift.com/subscription/pkg/rubygems-snaky_hash?utm_source=rubygems-snaky_hash&utm_medium=referral&utm_campaign=readme)
91
86
 
92
- NOTE: `version_gem`, and this library, were both extracted from the ouaht2 gem. They are part of the `oauth-xx` org,
93
- and are developed in tight collaboration with the oauth and oauth2 gems.
87
+ Available as part of the Tidelift Subscription.
94
88
 
95
- ### You should upgrade this gem with confidence\*.
89
+ <details markdown="1">
90
+ <summary>Need enterprise-level guarantees?</summary>
96
91
 
97
- - This gem follows a _strict & correct_ (according to the maintainer of SemVer; [more info][sv-pub-api]) interpretation of SemVer.
98
- - Dropping support for **any** of the runtime dependency versions above will be a major version bump.
99
- - If you aren't on one of the minor versions above, make getting there a priority.
100
- - You should upgrade the dependencies of this gem with confidence\*.
101
- - Please do upgrade, and then, when it goes smooth as butter [please sponsor me][🖇sponsor]. Thanks!
92
+ 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.
102
93
 
103
- [sv-pub-api]: #-is-platform-support-part-of-the-public-api
94
+ [![Get help from me on Tidelift][🏙️entsup-tidelift-img]][🏙️entsup-tidelift]
104
95
 
105
- \* MIT license; I am unable to make guarantees.
96
+ - 💡Subscribe for support guarantees covering _all_ your FLOSS dependencies
97
+ - 💡Tidelift is part of [Sonar][🏙️entsup-tidelift-sonar]
98
+ - 💡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
106
99
 
107
- | 🚚 Test matrix brought to you by | 🔎 appraisal++ |
108
- |----------------------------------|-------------------------------------------------------------------------|
109
- | Adds back support for old Rubies | ✨ [appraisal PR #250](https://github.com/thoughtbot/appraisal/pull/250) |
110
- | Adds support for `eval_gemfile` | ✨ [appraisal PR #248](https://github.com/thoughtbot/appraisal/pull/248) |
111
- | Please review | my PRs! |
100
+ Alternatively:
112
101
 
113
- ## 💡 Info you can shake a stick at
102
+ - [![Live Chat on Discord][✉️discord-invite-img-ftb]][✉️discord-invite]
103
+ - [![Get help from me on Upwork][👨🏼‍🏫expsup-upwork-img]][👨🏼‍🏫expsup-upwork]
104
+ - [![Get help from me on Codementor][👨🏼‍🏫expsup-codementor-img]][👨🏼‍🏫expsup-codementor]
114
105
 
115
- | Tokens to Remember | [![Gem name][⛳️name-img]][⛳️gem-name] [![Gem namespace][⛳️namespace-img]][⛳️gem-namespace] |
116
- |-------------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
117
- | Works with JRuby | [![JRuby 9.2 Compat][💎jruby-9.2i]][🚎10-j-wf] [![JRuby 9.3 Compat][💎jruby-9.3i]][🚎10-j-wf] [![JRuby 9.4 Compat][💎jruby-9.4i]][🚎10-j-wf] [![JRuby 10.0 Compat][💎jruby-c-i]][🚎11-c-wf] [![JRuby HEAD Compat][💎jruby-headi]][🚎3-hd-wf] |
118
- | Works with Truffle Ruby | [![Truffle Ruby 23.1 Compat][💎truby-23.1i]][🚎9-t-wf] [![Truffle Ruby 24.1 Compat][💎truby-c-i]][🚎11-c-wf] [![Truffle Ruby HEAD Compat][💎truby-headi]][🚎3-hd-wf] |
119
- | Works with MRI Ruby 3 | [![Ruby 3.0 Compat][💎ruby-3.0i]][🚎4-lg-wf] [![Ruby 3.1 Compat][💎ruby-3.1i]][🚎6-s-wf] [![Ruby 3.2 Compat][💎ruby-3.2i]][🚎6-s-wf] [![Ruby 3.3 Compat][💎ruby-3.3i]][🚎6-s-wf] [![Ruby 3.4 Compat][💎ruby-c-i]][🚎11-c-wf] [![Ruby HEAD Compat][💎ruby-headi]][🚎3-hd-wf] |
120
- | Works with MRI Ruby 2 | [![Ruby 2.3 Compat][💎ruby-2.3i]][🚎1-an-wf] [![Ruby 2.4 Compat][💎ruby-2.4i]][🚎1-an-wf] [![Ruby 2.5 Compat][💎ruby-2.5i]][🚎1-an-wf] [![Ruby 2.6 Compat][💎ruby-2.6i]][🚎7-us-wf] [![Ruby 2.7 Compat][💎ruby-2.7i]][🚎7-us-wf] |
121
- | 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] |
122
- | Documentation | [![Discussion][⛳gg-discussions-img]][⛳gg-discussions] [![Current release on RubyDoc.info][📜docs-cr-rd-img]][🚎yard-current] [![HEAD on RubyDoc.info][📜docs-head-rd-img]][🚎yard-head] [![BDFL Blog][🚂bdfl-blog-img]][🚂bdfl-blog] [![Wiki][📜wiki-img]][📜wiki] |
123
- | Compliance | [![License: MIT][📄license-img]][📄license-ref] [![📄ilo-declaration-img]][📄ilo-declaration] [![Security Policy][🔐security-img]][🔐security] [![Contributor Covenant 2.1][🪇conduct-img]][🪇conduct] [![SemVer 2.0.0][📌semver-img]][📌semver] |
124
- | Style | [![Enforced Code Style Linter][💎rlts-img]][💎rlts] [![Keep-A-Changelog 1.0.0][📗keep-changelog-img]][📗keep-changelog] [![Gitmoji Commits][📌gitmoji-img]][📌gitmoji] |
125
- | Support | [![Live Chat on Discord][✉️discord-invite-img]][✉️discord-invite] [![Get help from me on Upwork][👨🏼‍🏫expsup-upwork-img]][👨🏼‍🏫expsup-upwork] [![Get help from me on Codementor][👨🏼‍🏫expsup-codementor-img]][👨🏼‍🏫expsup-codementor] |
126
- | Enterprise Support | [![Get help from me on Tidelift][🏙️entsup-tidelift-img]][🏙️entsup-tidelift]<br/>💡Subscribe for support guarantees covering _all_ FLOSS dependencies!<br/>💡Tidelift is part of [Sonar][🏙️entsup-tidelift-sonar]!<br/>💡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! |
127
- | Comrade BDFL 🎖️ | [![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 BDFL][🚂bdfl-contact-img]][🚂bdfl-contact] [![My technical writing][💖💁🏼‍♂️devto-img]][💖💁🏼‍♂️devto] |
128
- | `...` 💖 | [![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] |
106
+ </details>
129
107
 
130
108
  ## ✨ Installation
131
109
 
132
110
  Install the gem and add to the application's Gemfile by executing:
133
111
 
134
- $ bundle add snaky_hash
135
-
136
- If bundler is not being used to manage dependencies, install the gem by executing:
137
-
138
- $ gem install snaky_hash
139
-
140
- ### 🔒 Secure Installation
141
-
142
- `snaky_hash` is cryptographically signed, and has verifiable [SHA-256 and SHA-512][💎SHA_checksums] checksums by
143
- [stone_checksums][💎stone_checksums]. Be sure the gem you install hasn’t been tampered with
144
- by following the instructions below.
145
-
146
- Add my public key (if you haven’t already, expires 2045-04-29) as a trusted certificate:
147
-
148
- ```shell
149
- gem cert --add <(curl -Ls https://raw.github.com/oauth-xx/snaky_hash/main/certs/pboling.pem)
150
- ```
151
-
152
- You only need to do that once. Then proceed to install with:
153
-
154
- ```shell
155
- gem install snaky_hash -P MediumSecurity
112
+ ```console
113
+ bundle add snaky_hash
156
114
  ```
157
115
 
158
- The `MediumSecurity` trust profile will verify signed gems, but allow the installation of unsigned dependencies.
159
-
160
- This is necessary because not all of `snaky_hash`’s dependencies are signed, so we cannot use `HighSecurity`.
161
-
162
- If you want to up your security game full-time:
116
+ If bundler is not being used to manage dependencies, install the gem by executing:
163
117
 
164
- ```shell
165
- bundle config set --global trust-policy MediumSecurity
118
+ ```console
119
+ gem install snaky_hash
166
120
  ```
167
121
 
168
- NOTE: Be prepared to track down certs for signed gems and add them the same way you added mine.
122
+ ## ⚙️ Configuration
169
123
 
170
124
  ## 🔧 Basic Usage
171
125
 
@@ -195,7 +149,7 @@ are left as-is.
195
149
  class MySerializedSnakedHash < Hashie::Mash
196
150
  include SnakyHash::Snake.new(
197
151
  key_type: :symbol, # default :string
198
- serializer: true, # default: false
152
+ serializer: true # default: false
199
153
  )
200
154
  end
201
155
 
@@ -244,7 +198,7 @@ Let's say I want to really smash up my hash and make it more food-like.
244
198
  class MyExtSnakedHash < Hashie::Mash
245
199
  include SnakyHash::Snake.new(
246
200
  key_type: :symbol, # default :string
247
- serializer: true, # default: false
201
+ serializer: true # default: false
248
202
  )
249
203
  end
250
204
 
@@ -326,6 +280,67 @@ snake.very_fine_hat # => 'cheese'
326
280
 
327
281
  See [CONTRIBUTING.md][🤝contributing].
328
282
 
283
+ ## 🦷 FLOSS Funding
284
+
285
+ While ruby-oauth tools are free software and will always be, the project would benefit immensely from some funding.
286
+ Raising a monthly budget of... "dollars" would make the project more sustainable.
287
+
288
+ We welcome both individual and corporate sponsors! We also offer a
289
+ wide array of funding channels to account for your preferences.
290
+ Currently, [Open Collective][🖇osc] is our preferred funding platform.
291
+
292
+ **If you're working in a company that's making significant use of ruby-oauth tools we'd
293
+ appreciate it if you suggest to your company to become a ruby-oauth sponsor.**
294
+
295
+ You can support the development of ruby-oauth tools via
296
+ [GitHub Sponsors][🖇sponsor],
297
+ [Liberapay][⛳liberapay],
298
+ [PayPal][🖇paypal],
299
+ [Open Collective][🖇osc]
300
+ and [Tidelift][🏙️entsup-tidelift].
301
+
302
+ | 📍 NOTE |
303
+ |----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
304
+ | 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. |
305
+
306
+ ### Open Collective for Individuals
307
+
308
+ Support us with a monthly donation and help us continue our activities. [[Become a backer](https://opencollective.com/ruby-oauth#backer)]
309
+
310
+ NOTE: [kettle-readme-backers][kettle-readme-backers] updates this list every day, automatically.
311
+
312
+ <!-- OPENCOLLECTIVE-INDIVIDUALS:START -->
313
+ No backers yet. Be the first!
314
+ <!-- OPENCOLLECTIVE-INDIVIDUALS:END -->
315
+
316
+ ### Open Collective for Organizations
317
+
318
+ Become a sponsor and get your logo on our README on GitHub with a link to your site. [[Become a sponsor](https://opencollective.com/ruby-oauth#sponsor)]
319
+
320
+ NOTE: [kettle-readme-backers][kettle-readme-backers] updates this list every day, automatically.
321
+
322
+ <!-- OPENCOLLECTIVE-ORGANIZATIONS:START -->
323
+ No sponsors yet. Be the first!
324
+
325
+ ### Open Collective for Donors
326
+
327
+ [Bill Woika](https://opencollective.com/bill-woika) [Philipp Ebneter](https://opencollective.com/guest-e77282f7) [Grigoriy](https://opencollective.com/guest-c93e0c48)
328
+ <!-- OPENCOLLECTIVE-ORGANIZATIONS:END -->
329
+
330
+ [kettle-readme-backers]: https://github.com/ruby-oauth/snaky_hash/blob/main/bin/kettle-readme-backers
331
+
332
+ ### Another way to support open-source
333
+
334
+ 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).
335
+
336
+ 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`.
337
+
338
+ 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.
339
+
340
+ **[Floss-Funding.dev][🖇floss-funding.dev]: 👉️ No network calls. 👉️ No tracking. 👉️ No oversight. 👉️ Minimal crypto hashing. 💡 Easily disabled nags**
341
+
342
+ [![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]
343
+
329
344
  ## 🔐 Security
330
345
 
331
346
  See [SECURITY.md][🔐security].
@@ -333,22 +348,34 @@ See [SECURITY.md][🔐security].
333
348
  ## 🤝 Contributing
334
349
 
335
350
  If you need some ideas of where to help, you could work on adding more code coverage,
336
- or if it is already 💯 (see [below](#code-coverage)) check [issues][🤝gh-issues], or [PRs][🤝gh-pulls],
351
+ or if it is already 💯 (see [below](#code-coverage)) check [issues][🤝gh-issues] or [PRs][🤝gh-pulls],
337
352
  or use the gem and think about how it could be better.
338
353
 
339
354
  We [![Keep A Changelog][📗keep-changelog-img]][📗keep-changelog] so if you make changes, remember to update it.
340
355
 
341
356
  See [CONTRIBUTING.md][🤝contributing] for more detailed instructions.
342
357
 
358
+ ### 🚀 Release Instructions
359
+
360
+ See [CONTRIBUTING.md][🤝contributing].
361
+
343
362
  ### Code Coverage
344
363
 
345
- [![Coveralls Test Coverage][🔑coveralls-img]][🔑coveralls]
346
- [![QLTY Test Coverage][🔑qlty-covi♻️]][🔑qlty-cov]
364
+ <details markdown="1">
365
+ <summary>Coverage service badges</summary>
366
+
367
+ [![Coverage Graph][🏀codecov-g]][🏀codecov]
368
+
369
+ [![Coveralls Test Coverage][🏀coveralls-img]][🏀coveralls]
370
+
371
+ [![QLTY Test Coverage][🏀qlty-covi]][🏀qlty-cov]
372
+
373
+ </details>
347
374
 
348
375
  ### 🪇 Code of Conduct
349
376
 
350
- Everyone interacting in this project's codebases, issue trackers,
351
- chat rooms and mailing lists is expected to follow the [![Contributor Covenant 2.1][🪇conduct-img]][🪇conduct].
377
+ Everyone interacting with this project's codebases, issue trackers,
378
+ chat rooms and mailing lists agrees to follow the [![Contributor Covenant 2.1][🪇conduct-img]][🪇conduct].
352
379
 
353
380
  ## 🌈 Contributors
354
381
 
@@ -356,106 +383,137 @@ chat rooms and mailing lists is expected to follow the [![Contributor Covenant 2
356
383
 
357
384
  Made with [contributors-img][🖐contrib-rocks].
358
385
 
359
- Also see GitLab Contributors: [https://gitlab.com/oauth-xx/snaky_hash/-/graphs/main][🚎contributors-gl]
386
+ Also see GitLab Contributors: [https://gitlab.com/ruby-oauth/snaky_hash/-/graphs/main][🚎contributors-gl]
360
387
 
361
- ## ⭐️ Star History
388
+ <details markdown="1">
389
+ <summary>⭐️ Star History</summary>
362
390
 
363
- <a href="https://star-history.com/#oauth-xx/snaky_hash&Date">
391
+ <a href="https://star-history.com/ruby-oauth/snaky_hash&Date">
364
392
  <picture>
365
- <source media="(prefers-color-scheme: dark)" srcset="https://api.star-history.com/svg?repos=oauth-xx/snaky_hash&type=Date&theme=dark" />
366
- <source media="(prefers-color-scheme: light)" srcset="https://api.star-history.com/svg?repos=oauth-xx/snaky_hash&type=Date" />
367
- <img alt="Star History Chart" src="https://api.star-history.com/svg?repos=oauth-xx/snaky_hash&type=Date" />
393
+ <source media="(prefers-color-scheme: dark)" srcset="https://api.star-history.com/svg?repos=ruby-oauth/snaky_hash&type=Date&theme=dark" />
394
+ <source media="(prefers-color-scheme: light)" srcset="https://api.star-history.com/svg?repos=ruby-oauth/snaky_hash&type=Date" />
395
+ <img alt="Star History Chart" src="https://api.star-history.com/svg?repos=ruby-oauth/snaky_hash&type=Date" />
368
396
  </picture>
369
397
  </a>
370
398
 
371
- ## 📌 Versioning
399
+ </details>
372
400
 
373
- This Library adheres to [![Semantic Versioning 2.0.0][📌semver-img]][📌semver].
374
- Violations of this scheme should be reported as bugs.
375
- Specifically, if a minor or patch version is released that breaks backward compatibility,
376
- a new version should be immediately released that restores compatibility.
377
- Breaking changes to the public API will only be introduced with new major versions.
401
+ ## 📌 Versioning
378
402
 
379
- ### 📌 Is "Platform Support" part of the public API?
403
+ This library follows [![Semantic Versioning 2.0.0][📌semver-img]][📌semver] for its public API where practical.
404
+ For most applications, prefer the [Pessimistic Version Constraint][📌pvc] with two digits of precision.
380
405
 
381
- Yes. But I'm obligated to include notes...
406
+ For example:
382
407
 
383
- SemVer should, but doesn't explicitly, say that dropping support for specific Platforms
384
- is a *breaking change* to an API.
385
- It is obvious to many, but not all, and since the spec is silent, the bike shedding is endless.
408
+ ```ruby
409
+ spec.add_dependency("snaky_hash", "~> 2.0")
410
+ ```
386
411
 
387
- > dropping support for a platform is both obviously and objectively a breaking change
412
+ <details markdown="1">
413
+ <summary>📌 Is "Platform Support" part of the public API? More details inside.</summary>
388
414
 
389
- - Jordan Harband (@ljharb, maintainer of SemVer) [in SemVer issue 716][📌semver-breaking]
415
+ Dropping support for a platform can be a breaking change for affected users.
416
+ If a release changes supported platforms, it should be called out clearly in the changelog and versioned with that impact in mind.
390
417
 
391
418
  To get a better understanding of how SemVer is intended to work over a project's lifetime,
392
419
  read this article from the creator of SemVer:
393
420
 
394
421
  - ["Major Version Numbers are Not Sacred"][📌major-versions-not-sacred]
395
422
 
396
- As a result of this policy, and the interpretive lens used by the maintainer,
397
- you can (and should) specify a dependency on these libraries using
398
- the [Pessimistic Version Constraint][📌pvc] with two digits of precision.
399
-
400
- For example:
401
-
402
- ```ruby
403
- spec.add_dependency("snaky_hash", "~> 2.0")
404
- ```
423
+ </details>
405
424
 
406
- See [CHANGELOG.md][📌changelog] for list of releases.
425
+ See [CHANGELOG.md][📌changelog] for a list of releases.
407
426
 
408
427
  ## 📄 License
409
428
 
410
429
  The gem is available as open source under the terms of
411
- the [MIT License][📄license] [![License: MIT][📄license-img]][📄license-ref].
412
- See [LICENSE.txt][📄license] for the official [Copyright Notice][📄copyright-notice-explainer].
430
+ the [MIT](MIT.md) [![License: MIT][📄license-img]][📄license-ref].
413
431
 
414
432
  ### © Copyright
415
433
 
416
- <ul>
417
- <li>
418
- 2022, 2025 Peter H. Boling, of
419
- <a href="https://railsbling.com">
420
- RailsBling.com
421
- <picture>
422
- <img alt="Rails Bling" height="20" src="https://railsbling.com/images/logos/RailsBling-TrainLogo.svg" />
423
- </picture>
424
- </a>, and snaky_hash contributors
425
- </li>
426
- </ul>
434
+ See [LICENSE.md][📄license] for the official copyright notice.
427
435
 
428
- ## 🤑 One more thing
436
+ <details markdown="1">
437
+ <summary>Copyright holders</summary>
429
438
 
430
- You made it to the bottom of the page,
431
- so perhaps you'll indulge me for another 20 seconds.
432
- I maintain many dozens of gems, including this one,
433
- because I want Ruby to be a great place for people to solve problems, big and small.
434
- Please consider supporting my efforts via the giant yellow link below,
435
- or one of the others at the head of this README.
439
+ - Copyright (c) 2022, 2025-2026 Peter H. Boling
436
440
 
437
- [![Buy me a latte][🖇buyme-img]][🖇buyme]
441
+ </details>
442
+
443
+ ## 🤑 A request for help
444
+
445
+ Maintainers have teeth and need to pay their dentists.
446
+ After getting laid off in an RIF in March, and encountering difficulty finding a new one,
447
+ I began spending most of my time building open source tools.
448
+ I'm hoping to be able to pay for my kids' health insurance this month,
449
+ so if you value the work I am doing, I need your support.
450
+ Please consider sponsoring me or the project.
451
+
452
+ To join the community or get help 👇️ Join the Discord.
453
+
454
+ [![Live Chat on Discord][✉️discord-invite-img-ftb]][✉️discord-invite]
455
+
456
+ To say "thanks!" ☝️ Join the Discord or 👇️ send money.
457
+
458
+ [![Sponsor ruby-oauth/snaky_hash 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]
438
459
 
439
- [⛳gg-discussions]: https://groups.google.com/g/oauth-ruby
440
- [⛳gg-discussions-img]: https://img.shields.io/badge/google-group-0093D0.svg?style=for-the-badge&logo=google&logoColor=orange
460
+ ### Please give the project a star ⭐ ♥.
461
+
462
+ 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.
463
+
464
+ Thanks for RTFM. ☺️
465
+
466
+ [⛳liberapay-img]: https://img.shields.io/liberapay/goal/pboling.svg?logo=liberapay&color=a51611&style=flat
467
+ [⛳liberapay-bottom-img]: https://img.shields.io/liberapay/goal/pboling.svg?style=for-the-badge&logo=liberapay&color=a51611
468
+ [⛳liberapay]: https://liberapay.com/pboling/donate
469
+ [🖇osc-all-img]: https://img.shields.io/opencollective/all/ruby-oauth
470
+ [🖇osc-sponsors-img]: https://img.shields.io/opencollective/sponsors/ruby-oauth
471
+ [🖇osc-backers-img]: https://img.shields.io/opencollective/backers/ruby-oauth
472
+ [🖇osc-backers]: https://opencollective.com/ruby-oauth#backer
473
+ [🖇osc-backers-i]: https://opencollective.com/ruby-oauth/backers/badge.svg?style=flat
474
+ [🖇osc-sponsors]: https://opencollective.com/ruby-oauth#sponsor
475
+ [🖇osc-sponsors-i]: https://opencollective.com/ruby-oauth/sponsors/badge.svg?style=flat
476
+ [🖇osc-all-bottom-img]: https://img.shields.io/opencollective/all/ruby-oauth?style=for-the-badge
477
+ [🖇osc-sponsors-bottom-img]: https://img.shields.io/opencollective/sponsors/ruby-oauth?style=for-the-badge
478
+ [🖇osc-backers-bottom-img]: https://img.shields.io/opencollective/backers/ruby-oauth?style=for-the-badge
479
+ [🖇osc]: https://opencollective.com/ruby-oauth
480
+ [🖇sponsor-img]: https://img.shields.io/badge/Sponsor_Me!-pboling.svg?style=social&logo=github
481
+ [🖇sponsor-bottom-img]: https://img.shields.io/badge/Sponsor_Me!-pboling-blue?style=for-the-badge&logo=github
482
+ [🖇sponsor]: https://github.com/sponsors/pboling
483
+ [🖇kofi-img]: https://img.shields.io/badge/ko--fi-%E2%9C%93-a51611.svg?style=flat
484
+ [🖇kofi]: https://ko-fi.com/pboling
485
+ [🖇buyme-small-img]: https://img.shields.io/badge/buy_me_a_coffee-%E2%9C%93-a51611.svg?style=flat
486
+ [🖇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
487
+ [🖇buyme]: https://www.buymeacoffee.com/pboling
488
+ [🖇paypal-img]: https://img.shields.io/badge/donate-paypal-a51611.svg?style=flat&logo=paypal
489
+ [🖇paypal-bottom-img]: https://img.shields.io/badge/donate-paypal-a51611.svg?style=for-the-badge&logo=paypal&color=0A0A0A
490
+ [🖇paypal]: https://www.paypal.com/paypalme/peterboling
491
+ [🖇floss-funding.dev]: https://floss-funding.dev
492
+ [🖇floss-funding-gem]: https://github.com/galtzo-floss/floss_funding
493
+ [✉️discord-invite]: https://discord.gg/3qme4XHNKN
494
+ [✉️discord-invite-img-ftb]: https://img.shields.io/discord/1373797679469170758?style=for-the-badge&logo=discord
495
+ [✉️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
496
+ [✉️ruby-friends]: https://app.daily.dev/squads/rubyfriends
441
497
 
442
498
  [✇bundle-group-pattern]: https://gist.github.com/pboling/4564780
443
- [⛳️gem-namespace]: https://github.com/oauth-xx/snaky_hash
444
- [⛳️namespace-img]: https://img.shields.io/badge/namespace-OAuth2-brightgreen.svg?style=flat&logo=ruby&logoColor=white
445
- [⛳️gem-name]: https://rubygems.org/gems/snaky_hash
446
- [⛳️name-img]: https://img.shields.io/badge/name-snaky_hash-brightgreen.svg?style=flat&logo=rubygems&logoColor=red
447
- [🚂bdfl-blog]: http://www.railsbling.com/tags/snaky_hash
448
- [🚂bdfl-blog-img]: https://img.shields.io/badge/blog-railsbling-0093D0.svg?style=for-the-badge&logo=rubyonrails&logoColor=orange
449
- [🚂bdfl-contact]: http://www.railsbling.com/contact
450
- [🚂bdfl-contact-img]: https://img.shields.io/badge/Contact-BDFL-0093D0.svg?style=flat&logo=rubyonrails&logoColor=red
499
+ [⛳️gem-namespace]: https://github.com/ruby-oauth/snaky_hash
500
+ [⛳️namespace-img]: https://img.shields.io/badge/namespace-SnakyHash-3C2D2D.svg?style=square&logo=ruby&logoColor=white
501
+ [⛳️gem-name]: https://bestgems.org/gems/snaky_hash
502
+ [⛳️name-img]: https://img.shields.io/badge/name-snaky__hash-3C2D2D.svg?style=square&logo=rubygems&logoColor=red
503
+ [⛳️tag-img]: https://img.shields.io/github/tag/ruby-oauth/snaky_hash.svg
504
+ [⛳️tag]: https://github.com/ruby-oauth/snaky_hash/releases
505
+ [🚂maint-blog]: http://www.railsbling.com/tags/snaky_hash
506
+ [🚂maint-blog-img]: https://img.shields.io/badge/blog-railsbling-0093D0.svg?style=for-the-badge&logo=rubyonrails&logoColor=orange
507
+ [🚂maint-contact]: http://www.railsbling.com/contact
508
+ [🚂maint-contact-img]: https://img.shields.io/badge/Contact-Maintainer-0093D0.svg?style=flat&logo=rubyonrails&logoColor=red
451
509
  [💖🖇linkedin]: http://www.linkedin.com/in/peterboling
452
- [💖🖇linkedin-img]: https://img.shields.io/badge/PeterBoling-LinkedIn-0B66C2?style=flat&logo=newjapanprowrestling
453
- [💖✌️wellfound]: https://angel.co/u/peter-boling
510
+ [💖🖇linkedin-img]: https://img.shields.io/badge/LinkedIn-Profile-0B66C2?style=flat&logo=newjapanprowrestling
511
+ [💖✌️wellfound]: https://wellfound.com/u/peter-boling
454
512
  [💖✌️wellfound-img]: https://img.shields.io/badge/peter--boling-orange?style=flat&logo=wellfound
455
513
  [💖💲crunchbase]: https://www.crunchbase.com/person/peter-boling
456
514
  [💖💲crunchbase-img]: https://img.shields.io/badge/peter--boling-purple?style=flat&logo=crunchbase
457
515
  [💖🐘ruby-mast]: https://ruby.social/@galtzo
458
- [💖🐘ruby-mast-img]: https://img.shields.io/mastodon/follow/109447111526622197?domain=https%3A%2F%2Fruby.social&style=flat&logo=mastodon&label=Ruby%20%40galtzo
516
+ [💖🐘ruby-mast-img]: https://img.shields.io/mastodon/follow/109447111526622197?domain=https://ruby.social&style=flat&logo=mastodon&label=Ruby%20@galtzo
459
517
  [💖🦋bluesky]: https://bsky.app/profile/galtzo.com
460
518
  [💖🦋bluesky-img]: https://img.shields.io/badge/@galtzo.com-0285FF?style=flat&logo=bluesky&logoColor=white
461
519
  [💖🌳linktree]: https://linktr.ee/galtzo
@@ -472,77 +530,76 @@ or one of the others at the head of this README.
472
530
  [👨🏼‍🏫expsup-upwork-img]: https://img.shields.io/badge/UpWork-13544E?style=for-the-badge&logo=Upwork&logoColor=white
473
531
  [👨🏼‍🏫expsup-codementor]: https://www.codementor.io/peterboling?utm_source=github&utm_medium=button&utm_term=peterboling&utm_campaign=github
474
532
  [👨🏼‍🏫expsup-codementor-img]: https://img.shields.io/badge/CodeMentor-Get_Help-1abc9c?style=for-the-badge&logo=CodeMentor&logoColor=white
475
- [🏙️entsup-tidelift]: https://tidelift.com/subscription
533
+ [🏙️entsup-tidelift]: https://tidelift.com/subscription/pkg/rubygems-snaky_hash?utm_source=rubygems-snaky_hash&utm_medium=referral&utm_campaign=readme
476
534
  [🏙️entsup-tidelift-img]: https://img.shields.io/badge/Tidelift_and_Sonar-Enterprise_Support-FD3456?style=for-the-badge&logo=sonar&logoColor=white
477
535
  [🏙️entsup-tidelift-sonar]: https://blog.tidelift.com/tidelift-joins-sonar
478
536
  [💁🏼‍♂️peterboling]: http://www.peterboling.com
479
537
  [🚂railsbling]: http://www.railsbling.com
480
538
  [📜src-gl-img]: https://img.shields.io/badge/GitLab-FBA326?style=for-the-badge&logo=Gitlab&logoColor=orange
481
- [📜src-gl]: https://gitlab.com/oauth-xx/snaky_hash/
539
+ [📜src-gl]: https://gitlab.com/ruby-oauth/snaky_hash
482
540
  [📜src-cb-img]: https://img.shields.io/badge/CodeBerg-4893CC?style=for-the-badge&logo=CodeBerg&logoColor=blue
483
- [📜src-cb]: https://codeberg.org/oauth-xx/snaky_hash
541
+ [📜src-cb]: https://codeberg.org/ruby-oauth/snaky_hash
484
542
  [📜src-gh-img]: https://img.shields.io/badge/GitHub-238636?style=for-the-badge&logo=Github&logoColor=green
485
- [📜src-gh]: https://github.com/oauth-xx/snaky_hash
543
+ [📜src-gh]: https://github.com/ruby-oauth/snaky_hash
486
544
  [📜docs-cr-rd-img]: https://img.shields.io/badge/RubyDoc-Current_Release-943CD2?style=for-the-badge&logo=readthedocs&logoColor=white
487
545
  [📜docs-head-rd-img]: https://img.shields.io/badge/YARD_on_Galtzo.com-HEAD-943CD2?style=for-the-badge&logo=readthedocs&logoColor=white
488
- [📜wiki]: https://gitlab.com/oauth-xx/snaky_hash/-/wikis/home
489
- [📜wiki-img]: https://img.shields.io/badge/wiki-examples-943CD2.svg?style=for-the-badge&logo=Wiki&logoColor=white
490
- [👽dl-rank]: https://rubygems.org/gems/snaky_hash
546
+ [📜gl-wiki]: https://gitlab.com/ruby-oauth/snaky_hash/-/wikis/home
547
+ [📜gh-wiki]: https://github.com/ruby-oauth/snaky_hash/wiki
548
+ [📜gl-wiki-img]: https://img.shields.io/badge/wiki-gitlab-943CD2.svg?style=for-the-badge&logo=gitlab&logoColor=white
549
+ [📜gh-wiki-img]: https://img.shields.io/badge/wiki-github-943CD2.svg?style=for-the-badge&logo=github&logoColor=white
550
+ [👽dl-rank]: https://bestgems.org/gems/snaky_hash
491
551
  [👽dl-ranki]: https://img.shields.io/gem/rd/snaky_hash.svg
492
- [👽oss-help]: https://www.codetriage.com/oauth-xx/snaky_hash
493
- [👽oss-helpi]: https://www.codetriage.com/oauth-xx/snaky_hash/badges/users.svg
494
- [👽version]: https://rubygems.org/gems/snaky_hash
552
+ [👽version]: https://bestgems.org/gems/snaky_hash
495
553
  [👽versioni]: https://img.shields.io/gem/v/snaky_hash.svg
496
- [🔑qlty-mnt]: https://qlty.sh/gh/oauth-xx/projects/snaky_hash
497
- [🔑qlty-mnti♻️]: https://qlty.sh/badges/84e960b2-4ed2-4b47-9913-02c32680ec98/maintainability.svg
498
- [🔑qlty-cov]: https://qlty.sh/gh/oauth-xx/projects/snaky_hash
499
- [🔑qlty-covi♻️]: https://qlty.sh/badges/84e960b2-4ed2-4b47-9913-02c32680ec98/test_coverage.svg
500
- [🔑codecov]: https://codecov.io/gh/oauth-xx/snaky_hash
501
- [🔑codecovi♻️]: https://codecov.io/gh/oauth-xx/snaky_hash/graph/badge.svg?token=XqaZixl4ss
502
- [🔑coveralls]: https://coveralls.io/github/oauth-xx/snaky_hash?branch=main
503
- [🔑coveralls-img]: https://coveralls.io/repos/github/oauth-xx/snaky_hash/badge.svg?branch=main
504
- [🔑depfu]: https://depfu.com/github/oauth-xx/snaky_hash?project_id=63073
505
- [🔑depfui♻️]: https://badges.depfu.com/badges/7019dcf43672ba8c0e77e7fdd1063398/count.svg
506
- [🖐codeQL]: https://github.com/oauth-xx/snaky_hash/security/code-scanning
507
- [🖐codeQL-img]: https://github.com/oauth-xx/snaky_hash/actions/workflows/codeql-analysis.yml/badge.svg
508
- [🚎1-an-wf]: https://github.com/oauth-xx/snaky_hash/actions/workflows/ancient.yml
509
- [🚎1-an-wfi]: https://github.com/oauth-xx/snaky_hash/actions/workflows/ancient.yml/badge.svg
510
- [🚎2-cov-wf]: https://github.com/oauth-xx/snaky_hash/actions/workflows/coverage.yml
511
- [🚎2-cov-wfi]: https://github.com/oauth-xx/snaky_hash/actions/workflows/coverage.yml/badge.svg
512
- [🚎3-hd-wf]: https://github.com/oauth-xx/snaky_hash/actions/workflows/heads.yml
513
- [🚎3-hd-wfi]: https://github.com/oauth-xx/snaky_hash/actions/workflows/heads.yml/badge.svg
514
- [🚎4-lg-wf]: https://github.com/oauth-xx/snaky_hash/actions/workflows/legacy.yml
515
- [🚎4-lg-wfi]: https://github.com/oauth-xx/snaky_hash/actions/workflows/legacy.yml/badge.svg
516
- [🚎5-st-wf]: https://github.com/oauth-xx/snaky_hash/actions/workflows/style.yml
517
- [🚎5-st-wfi]: https://github.com/oauth-xx/snaky_hash/actions/workflows/style.yml/badge.svg
518
- [🚎6-s-wf]: https://github.com/oauth-xx/snaky_hash/actions/workflows/supported.yml
519
- [🚎6-s-wfi]: https://github.com/oauth-xx/snaky_hash/actions/workflows/supported.yml/badge.svg
520
- [🚎7-us-wf]: https://github.com/oauth-xx/snaky_hash/actions/workflows/unsupported.yml
521
- [🚎7-us-wfi]: https://github.com/oauth-xx/snaky_hash/actions/workflows/unsupported.yml/badge.svg
522
- [🚎8-ho-wf]: https://github.com/oauth-xx/snaky_hash/actions/workflows/hoary.yml
523
- [🚎8-ho-wfi]: https://github.com/oauth-xx/snaky_hash/actions/workflows/hoary.yml/badge.svg
524
- [🚎9-t-wf]: https://github.com/oauth-xx/snaky_hash/actions/workflows/truffle.yml
525
- [🚎9-t-wfi]: https://github.com/oauth-xx/snaky_hash/actions/workflows/truffle.yml/badge.svg
526
- [🚎10-j-wf]: https://github.com/oauth-xx/snaky_hash/actions/workflows/jruby.yml
527
- [🚎10-j-wfi]: https://github.com/oauth-xx/snaky_hash/actions/workflows/jruby.yml/badge.svg
528
- [🚎11-c-wf]: https://github.com/oauth-xx/snaky_hash/actions/workflows/current.yml
529
- [🚎11-c-wfi]: https://github.com/oauth-xx/snaky_hash/actions/workflows/current.yml/badge.svg
530
- [🚎12-crh-wf]: https://github.com/oauth-xx/snaky_hash/actions/workflows/current-runtime-heads.yml
531
- [🚎12-crh-wfi]: https://github.com/oauth-xx/snaky_hash/actions/workflows/current-runtime-heads.yml/badge.svg
532
- [⛳liberapay-img]: https://img.shields.io/liberapay/goal/pboling.svg?logo=liberapay
533
- [⛳liberapay]: https://liberapay.com/pboling/donate
534
- [🖇sponsor-img]: https://img.shields.io/badge/Sponsor_Me!-pboling.svg?style=social&logo=github
535
- [🖇sponsor]: https://github.com/sponsors/pboling
536
- [🖇polar-img]: https://img.shields.io/badge/polar-donate-yellow.svg
537
- [🖇polar]: https://polar.sh/pboling
538
- [🖇kofi-img]: https://img.shields.io/badge/a_more_different_coffee-✓-yellow.svg
539
- [🖇kofi]: https://ko-fi.com/O5O86SNP4
540
- [🖇patreon-img]: https://img.shields.io/badge/patreon-donate-yellow.svg
541
- [🖇patreon]: https://patreon.com/galtzo
542
- [🖇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
543
- [🖇buyme]: https://www.buymeacoffee.com/pboling
544
- [🖇buyme-small-img]: https://img.shields.io/badge/buy_me_a_coffee-✓-yellow.svg?style=flat
545
- [💎ruby-2.3i]: https://img.shields.io/badge/Ruby-2.3-DF00CA?style=for-the-badge&logo=ruby&logoColor=white
554
+ [🏀qlty-mnt]: https://qlty.sh/gh/ruby-oauth/projects/snaky_hash
555
+ [🏀qlty-mnti]: https://qlty.sh/gh/ruby-oauth/projects/snaky_hash/maintainability.svg
556
+ [🏀qlty-cov]: https://qlty.sh/gh/ruby-oauth/projects/snaky_hash/metrics/code?sort=coverageRating
557
+ [🏀qlty-covi]: https://qlty.sh/gh/ruby-oauth/projects/snaky_hash/coverage.svg
558
+ [🏀codecov]: https://codecov.io/gh/ruby-oauth/snaky_hash
559
+ [🏀codecovi]: https://codecov.io/gh/ruby-oauth/snaky_hash/graph/badge.svg
560
+ [🏀coveralls]: https://coveralls.io/github/ruby-oauth/snaky_hash?branch=main
561
+ [🏀coveralls-img]: https://coveralls.io/repos/github/ruby-oauth/snaky_hash/badge.svg?branch=main
562
+ [🚎ruby-2.4-wf]: https://github.com/ruby-oauth/snaky_hash/actions/workflows/ruby-2.4.yml
563
+ [🚎ruby-2.5-wf]: https://github.com/ruby-oauth/snaky_hash/actions/workflows/ruby-2.5.yml
564
+ [🚎ruby-2.6-wf]: https://github.com/ruby-oauth/snaky_hash/actions/workflows/ruby-2.6.yml
565
+ [🚎ruby-2.7-wf]: https://github.com/ruby-oauth/snaky_hash/actions/workflows/ruby-2.7.yml
566
+ [🚎ruby-3.0-wf]: https://github.com/ruby-oauth/snaky_hash/actions/workflows/ruby-3.0.yml
567
+ [🚎ruby-3.1-wf]: https://github.com/ruby-oauth/snaky_hash/actions/workflows/ruby-3.1.yml
568
+ [🚎ruby-3.2-wf]: https://github.com/ruby-oauth/snaky_hash/actions/workflows/ruby-3.2.yml
569
+ [🚎ruby-3.3-wf]: https://github.com/ruby-oauth/snaky_hash/actions/workflows/ruby-3.3.yml
570
+ [🚎ruby-3.4-wf]: https://github.com/ruby-oauth/snaky_hash/actions/workflows/ruby-3.4.yml
571
+ [🚎jruby-9.2-wf]: https://github.com/ruby-oauth/snaky_hash/actions/workflows/jruby-9.2.yml
572
+ [🚎jruby-9.3-wf]: https://github.com/ruby-oauth/snaky_hash/actions/workflows/jruby-9.3.yml
573
+ [🚎jruby-9.4-wf]: https://github.com/ruby-oauth/snaky_hash/actions/workflows/jruby-9.4.yml
574
+ [🚎jruby-10.0-wf]: https://github.com/ruby-oauth/snaky_hash/actions/workflows/jruby-10.0.yml
575
+ [🚎truby-22.3-wf]: https://github.com/ruby-oauth/snaky_hash/actions/workflows/truffleruby-22.3.yml
576
+ [🚎truby-23.0-wf]: https://github.com/ruby-oauth/snaky_hash/actions/workflows/truffleruby-23.0.yml
577
+ [🚎truby-23.1-wf]: https://github.com/ruby-oauth/snaky_hash/actions/workflows/truffleruby-23.1.yml
578
+ [🚎truby-24.2-wf]: https://github.com/ruby-oauth/snaky_hash/actions/workflows/truffleruby-24.2.yml
579
+ [🚎truby-25.0-wf]: https://github.com/ruby-oauth/snaky_hash/actions/workflows/truffleruby-25.0.yml
580
+ [🚎truby-33.0-wf]: https://github.com/ruby-oauth/snaky_hash/actions/workflows/truffleruby-33.0.yml
581
+ [🚎2-cov-wf]: https://github.com/ruby-oauth/snaky_hash/actions/workflows/coverage.yml
582
+ [🚎2-cov-wfi]: https://github.com/ruby-oauth/snaky_hash/actions/workflows/coverage.yml/badge.svg
583
+ [🚎3-hd-wf]: https://github.com/ruby-oauth/snaky_hash/actions/workflows/heads.yml
584
+ [🚎3-hd-wfi]: https://github.com/ruby-oauth/snaky_hash/actions/workflows/heads.yml/badge.svg
585
+ [🚎5-st-wf]: https://github.com/ruby-oauth/snaky_hash/actions/workflows/style.yml
586
+ [🚎5-st-wfi]: https://github.com/ruby-oauth/snaky_hash/actions/workflows/style.yml/badge.svg
587
+ [🚎9-t-wf]: https://github.com/ruby-oauth/snaky_hash/actions/workflows/truffle.yml
588
+ [🚎9-t-wfi]: https://github.com/ruby-oauth/snaky_hash/actions/workflows/truffle.yml/badge.svg
589
+ [🚎10-j-wf]: https://github.com/ruby-oauth/snaky_hash/actions/workflows/jruby.yml
590
+ [🚎10-j-wfi]: https://github.com/ruby-oauth/snaky_hash/actions/workflows/jruby.yml/badge.svg
591
+ [🚎11-c-wf]: https://github.com/ruby-oauth/snaky_hash/actions/workflows/current.yml
592
+ [🚎11-c-wfi]: https://github.com/ruby-oauth/snaky_hash/actions/workflows/current.yml/badge.svg
593
+ [🚎12-crh-wf]: https://github.com/ruby-oauth/snaky_hash/actions/workflows/dep-heads.yml
594
+ [🚎12-crh-wfi]: https://github.com/ruby-oauth/snaky_hash/actions/workflows/dep-heads.yml/badge.svg
595
+ [🚎13-🔒️-wf]: https://github.com/ruby-oauth/snaky_hash/actions/workflows/locked_deps.yml
596
+ [🚎13-🔒️-wfi]: https://github.com/ruby-oauth/snaky_hash/actions/workflows/locked_deps.yml/badge.svg
597
+ [🚎14-🔓️-wf]: https://github.com/ruby-oauth/snaky_hash/actions/workflows/unlocked_deps.yml
598
+ [🚎14-🔓️-wfi]: https://github.com/ruby-oauth/snaky_hash/actions/workflows/unlocked_deps.yml/badge.svg
599
+ [🚎15-🪪-wf]: https://github.com/ruby-oauth/snaky_hash/actions/workflows/license-eye.yml
600
+ [🚎15-🪪-wfi]: https://github.com/ruby-oauth/snaky_hash/actions/workflows/license-eye.yml/badge.svg
601
+ [💎ruby-2.2i]: https://img.shields.io/badge/Ruby-2.2_(%F0%9F%9A%ABCI)-AABBCC?style=for-the-badge&logo=ruby&logoColor=white
602
+ [💎ruby-2.3i]: https://img.shields.io/badge/Ruby-2.3_(%F0%9F%9A%ABCI)-AABBCC?style=for-the-badge&logo=ruby&logoColor=white
546
603
  [💎ruby-2.4i]: https://img.shields.io/badge/Ruby-2.4-DF00CA?style=for-the-badge&logo=ruby&logoColor=white
547
604
  [💎ruby-2.5i]: https://img.shields.io/badge/Ruby-2.5-DF00CA?style=for-the-badge&logo=ruby&logoColor=white
548
605
  [💎ruby-2.6i]: https://img.shields.io/badge/Ruby-2.6-DF00CA?style=for-the-badge&logo=ruby&logoColor=white
@@ -551,71 +608,78 @@ or one of the others at the head of this README.
551
608
  [💎ruby-3.1i]: https://img.shields.io/badge/Ruby-3.1-CC342D?style=for-the-badge&logo=ruby&logoColor=white
552
609
  [💎ruby-3.2i]: https://img.shields.io/badge/Ruby-3.2-CC342D?style=for-the-badge&logo=ruby&logoColor=white
553
610
  [💎ruby-3.3i]: https://img.shields.io/badge/Ruby-3.3-CC342D?style=for-the-badge&logo=ruby&logoColor=white
611
+ [💎ruby-3.4i]: https://img.shields.io/badge/Ruby-3.4-CC342D?style=for-the-badge&logo=ruby&logoColor=white
554
612
  [💎ruby-c-i]: https://img.shields.io/badge/Ruby-current-CC342D?style=for-the-badge&logo=ruby&logoColor=green
555
613
  [💎ruby-headi]: https://img.shields.io/badge/Ruby-HEAD-CC342D?style=for-the-badge&logo=ruby&logoColor=blue
556
614
  [💎truby-22.3i]: https://img.shields.io/badge/Truffle_Ruby-22.3-34BCB1?style=for-the-badge&logo=ruby&logoColor=pink
557
615
  [💎truby-23.0i]: https://img.shields.io/badge/Truffle_Ruby-23.0-34BCB1?style=for-the-badge&logo=ruby&logoColor=pink
558
616
  [💎truby-23.1i]: https://img.shields.io/badge/Truffle_Ruby-23.1-34BCB1?style=for-the-badge&logo=ruby&logoColor=pink
617
+ [💎truby-24.2i]: https://img.shields.io/badge/Truffle_Ruby-24.2-34BCB1?style=for-the-badge&logo=ruby&logoColor=pink
618
+ [💎truby-25.0i]: https://img.shields.io/badge/Truffle_Ruby-25.0-34BCB1?style=for-the-badge&logo=ruby&logoColor=pink
619
+ [💎truby-33.0i]: https://img.shields.io/badge/Truffle_Ruby-33.0-34BCB1?style=for-the-badge&logo=ruby&logoColor=pink
559
620
  [💎truby-c-i]: https://img.shields.io/badge/Truffle_Ruby-current-34BCB1?style=for-the-badge&logo=ruby&logoColor=green
560
621
  [💎truby-headi]: https://img.shields.io/badge/Truffle_Ruby-HEAD-34BCB1?style=for-the-badge&logo=ruby&logoColor=blue
561
- [💎jruby-9.1i]: https://img.shields.io/badge/JRuby-9.1-FBE742?style=for-the-badge&logo=ruby&logoColor=red
562
622
  [💎jruby-9.2i]: https://img.shields.io/badge/JRuby-9.2-FBE742?style=for-the-badge&logo=ruby&logoColor=red
563
623
  [💎jruby-9.3i]: https://img.shields.io/badge/JRuby-9.3-FBE742?style=for-the-badge&logo=ruby&logoColor=red
564
624
  [💎jruby-9.4i]: https://img.shields.io/badge/JRuby-9.4-FBE742?style=for-the-badge&logo=ruby&logoColor=red
625
+ [💎jruby-10.0i]: https://img.shields.io/badge/JRuby-10.0-FBE742?style=for-the-badge&logo=ruby&logoColor=red
565
626
  [💎jruby-c-i]: https://img.shields.io/badge/JRuby-current-FBE742?style=for-the-badge&logo=ruby&logoColor=green
566
627
  [💎jruby-headi]: https://img.shields.io/badge/JRuby-HEAD-FBE742?style=for-the-badge&logo=ruby&logoColor=blue
567
- [🤝gh-issues]: https://github.com/oauth-xx/snaky_hash/issues
568
- [🤝gh-pulls]: https://github.com/oauth-xx/snaky_hash/pulls
569
- [🤝gl-issues]: https://gitlab.com/oauth-xx/snaky_hash/-/issues
570
- [🤝gl-pulls]: https://gitlab.com/oauth-xx/snaky_hash/-/merge_requests
571
- [🤝cb-issues]: https://codeberg.org/oauth-xx/snaky_hash/issues
572
- [🤝cb-pulls]: https://codeberg.org/oauth-xx/snaky_hash/pulls
628
+ [🤝gh-issues]: https://github.com/ruby-oauth/snaky_hash/issues
629
+ [🤝gh-pulls]: https://github.com/ruby-oauth/snaky_hash/pulls
630
+ [🤝gl-issues]: https://gitlab.com/ruby-oauth/snaky_hash/-/issues
631
+ [🤝gl-pulls]: https://gitlab.com/ruby-oauth/snaky_hash/-/merge_requests
632
+ [🤝cb-issues]: https://codeberg.org/ruby-oauth/snaky_hash/issues
633
+ [🤝cb-pulls]: https://codeberg.org/ruby-oauth/snaky_hash/pulls
573
634
  [🤝cb-donate]: https://donate.codeberg.org/
574
- [🤝contributing]: CONTRIBUTING.md
575
- [🔑codecov-g♻️]: https://codecov.io/gh/oauth-xx/snaky_hash/graphs/tree.svg?token=XqaZixl4ss
635
+ [🤝contributing]: https://github.com/ruby-oauth/snaky_hash/blob/main/CONTRIBUTING.md
636
+ [🏀codecov-g]: https://codecov.io/gh/ruby-oauth/snaky_hash/graph/badge.svg
576
637
  [🖐contrib-rocks]: https://contrib.rocks
577
- [🖐contributors]: https://github.com/oauth-xx/snaky_hash/graphs/contributors
578
- [🖐contributors-img]: https://contrib.rocks/image?repo=oauth-xx/snaky_hash
579
- [🚎contributors-gl]: https://gitlab.com/oauth-xx/snaky_hash/-/graphs/main
580
- [🪇conduct]: CODE_OF_CONDUCT.md
638
+ [🖐contributors]: https://github.com/ruby-oauth/snaky_hash/graphs/contributors
639
+ [🖐contributors-img]: https://contrib.rocks/image?repo=ruby-oauth/snaky_hash
640
+ [🚎contributors-gl]: https://gitlab.com/ruby-oauth/snaky_hash/-/graphs/main
641
+ [🪇conduct]: https://github.com/ruby-oauth/snaky_hash/blob/main/CODE_OF_CONDUCT.md
581
642
  [🪇conduct-img]: https://img.shields.io/badge/Contributor_Covenant-2.1-259D6C.svg
582
643
  [📌pvc]: http://guides.rubygems.org/patterns/#pessimistic-version-constraint
583
644
  [📌semver]: https://semver.org/spec/v2.0.0.html
584
645
  [📌semver-img]: https://img.shields.io/badge/semver-2.0.0-259D6C.svg?style=flat
585
646
  [📌semver-breaking]: https://github.com/semver/semver/issues/716#issuecomment-869336139
586
647
  [📌major-versions-not-sacred]: https://tom.preston-werner.com/2022/05/23/major-version-numbers-are-not-sacred.html
587
- [📌changelog]: CHANGELOG.md
648
+ [📌changelog]: https://github.com/ruby-oauth/snaky_hash/blob/main/CHANGELOG.md
588
649
  [📗keep-changelog]: https://keepachangelog.com/en/1.0.0/
589
650
  [📗keep-changelog-img]: https://img.shields.io/badge/keep--a--changelog-1.0.0-34495e.svg?style=flat
590
- [📌gitmoji]:https://gitmoji.dev
591
- [📌gitmoji-img]:https://img.shields.io/badge/gitmoji_commits-%20😜%20😍-34495e.svg?style=flat-square
651
+ [📌gitmoji]: https://gitmoji.dev
652
+ [📌gitmoji-img]: https://img.shields.io/badge/gitmoji_commits-%20%F0%9F%98%9C%20%F0%9F%98%8D-34495e.svg?style=flat-square
592
653
  [🧮kloc]: https://www.youtube.com/watch?v=dQw4w9WgXcQ
593
- [🧮kloc-img]: https://img.shields.io/badge/KLOC-0.132-FFDD67.svg?style=for-the-badge&logo=YouTube&logoColor=blue
594
- [🔐security]: SECURITY.md
654
+ [🧮kloc-img]: https://img.shields.io/badge/KLOC-0.133-FFDD67.svg?style=for-the-badge&logo=YouTube&logoColor=blue
655
+ [🔐security]: https://github.com/ruby-oauth/snaky_hash/blob/main/SECURITY.md
595
656
  [🔐security-img]: https://img.shields.io/badge/security-policy-259D6C.svg?style=flat
596
657
  [📄copyright-notice-explainer]: https://opensource.stackexchange.com/questions/5778/why-do-licenses-such-as-the-mit-license-specify-a-single-year
597
- [📄license]: LICENSE.txt
598
- [📄license-ref]: https://opensource.org/licenses/MIT
658
+ [📄license]: LICENSE.md
659
+ [📄license-ref]: MIT.md
599
660
  [📄license-img]: https://img.shields.io/badge/License-MIT-259D6C.svg
661
+ [📄license-compat]: https://www.apache.org/legal/resolved.html#category-a
662
+ [📄license-compat-img]: https://img.shields.io/badge/Apache_Compatible:_Category_A-%E2%9C%93-259D6C.svg?style=flat&logo=Apache
663
+
600
664
  [📄ilo-declaration]: https://www.ilo.org/declaration/lang--en/index.htm
601
665
  [📄ilo-declaration-img]: https://img.shields.io/badge/ILO_Fundamental_Principles-✓-259D6C.svg?style=flat
602
666
  [🚎yard-current]: http://rubydoc.info/gems/snaky_hash
603
- [🚎yard-head]: https://snaky_hash.galtzo.com
604
- [💎stone_checksums]: https://github.com/pboling/stone_checksums
605
- [💎SHA_checksums]: https://gitlab.com/oauth-xx/snaky_hash/-/tree/main/checksums
667
+ [🚎yard-head]: https://snaky-hash.galtzo.com
668
+ [💎stone_checksums]: https://github.com/galtzo-floss/stone_checksums
669
+ [💎SHA_checksums]: https://gitlab.com/ruby-oauth/snaky_hash/-/tree/main/checksums
606
670
  [💎rlts]: https://github.com/rubocop-lts/rubocop-lts
607
- [💎rlts-img]: https://img.shields.io/badge/code_style_%26_linting-rubocop--lts-34495e.svg?plastic&logo=ruby&logoColor=white
671
+ [💎rlts-img]: https://img.shields.io/badge/code_style_&_linting-rubocop--lts-34495e.svg?plastic&logo=ruby&logoColor=white
672
+ [💎appraisal2]: https://github.com/appraisal-rb/appraisal2
673
+ [💎appraisal2-img]: https://img.shields.io/badge/appraised_by-appraisal2-34495e.svg?plastic&logo=ruby&logoColor=white
608
674
  [💎d-in-dvcs]: https://railsbling.com/posts/dvcs/put_the_d_in_dvcs/
609
- [✉️discord-invite]: https://discord.gg/3qme4XHNKN
610
- [✉️discord-invite-img]: https://img.shields.io/discord/1373797679469170758?style=for-the-badge
611
-
612
- <details>
613
- <summary>Deprecated Badges</summary>
614
-
615
- CodeCov currently fails to parse the coverage upload.
616
-
617
- [![CodeCov Test Coverage][🔑codecovi♻️]][🔑codecov]
618
-
619
- [![Coverage Graph][🔑codecov-g♻️]][🔑codecov]
620
675
 
621
- </details>
676
+ <!-- kettle-jem:metadata:start -->
677
+ | Field | Value |
678
+ |---|---|
679
+ | Package | snaky_hash |
680
+ | Description | 🔮 A Hashie::Mash joint to make #snakelife better |
681
+ | Homepage | https://github.com/ruby-oauth/snaky_hash |
682
+ | Source | https://github.com/ruby-oauth/snaky_hash |
683
+ | License | `MIT` |
684
+ | Funding | https://github.com/sponsors/pboling, https://ko-fi.com/pboling, https://liberapay.com/pboling/donate, https://opencollective.com/ruby-oauth, https://thanks.dev/u/gh/pboling, https://tidelift.com/funding/github/rubygems/snaky_hash, https://www.buymeacoffee.com/pboling |
685
+ <!-- kettle-jem:metadata:end -->