sanitize_email 2.0.11 → 2.0.13

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 1e6d63e93062c0547e5177ee1bcf3a854cb68196a49b86332297bbdd10e10afb
4
- data.tar.gz: 3c65b2465ea81c6204524f7a2f57f3681212ff53598920caa675fbc410159fd3
3
+ metadata.gz: e428d45c83d29ee8b27c9752d85bb8b53518bd3ea1ababeab6829719e6422c7a
4
+ data.tar.gz: 87522e8f3cb045b99c8a1d3ee16253182c76a673542d3de812f3650c609ca74a
5
5
  SHA512:
6
- metadata.gz: d3260192f60a3e2466ccb6338c1fd4f5913dcb87110e458006b42c68af7c3d5ebf898bdbecd1d24f40b3745dcd53995e0c11e0a4178443a798369ce0d03f8d73
7
- data.tar.gz: 40967af8eb1b26da3ab0467852284a86330725ce3bc2a86ea71f570a816689114844279bdca87ea2a9867d3c83c6f1158d2b3405c7a77147f2a3096206be85ce
6
+ metadata.gz: 3af8f96025e00cbcdb2a6e76e661e0a312db260ee564d1312aad841e19c6ac26b61cbd29ca61fd42ad74fecc7dcf5f91191d03743d2e2f6ebadd0f8b6401b5c1
7
+ data.tar.gz: cdd89499132bb6ac8845678113eb857aac44db01214062207d8e18c921fef04091c05b0950fe0b0338390dfd759f4e4cd1692200894e1a161138a872acdfd81e
checksums.yaml.gz.sig CHANGED
Binary file
data/CHANGELOG.md CHANGED
@@ -30,6 +30,47 @@ Please file a bug if you notice a violation of semantic versioning.
30
30
 
31
31
  ### Security
32
32
 
33
+ ## [2.0.13] - 2026-07-02
34
+
35
+ - TAG: [v2.0.13][2.0.13t]
36
+ - COVERAGE: 83.12% -- 320/385 lines in 13 files
37
+ - BRANCH COVERAGE: 76.07% -- 89/117 branches in 13 files
38
+ - 51.14% documented
39
+
40
+ ### Added
41
+
42
+ - Added support for JRuby 10.1 and TruffleRuby 34.0.
43
+
44
+ ### Changed
45
+
46
+ - Retemplated project metadata and CI/development automation with `kettle-jem` v7.0.0.
47
+
48
+ ### Fixed
49
+
50
+ - Root development bundle now includes the default Rails 7.2 test stack so
51
+ `bundle exec kettle-test` can load `rails_helper` and Combustion.
52
+ - Package configured license files in gem release file lists.
53
+
54
+ ## [2.0.12] - 2026-06-14
55
+
56
+ - TAG: [v2.0.12][2.0.12t]
57
+ - COVERAGE: 94.87% -- 259/273 lines in 7 files
58
+ - BRANCH COVERAGE: 81.19% -- 82/101 branches in 7 files
59
+ - 51.14% documented
60
+
61
+ ### Changed
62
+
63
+ - Refreshed generated project metadata, support documentation and README
64
+ badges, funding metadata, documentation URLs, CI workflow pins and matrices,
65
+ `docs/CNAME`, and development dependency floors from the latest `kettle-jem`
66
+ template.
67
+
68
+ ### Fixed
69
+
70
+ - Honored explicit per-call `activation_proc` and `engage` options in `SanitizeEmail.sanitary`, and restored temporary sanitization state when a delivery raises.
71
+ - Preserved the Rails environment activation override in sanitizer specs so
72
+ test setup matches configured activation behavior.
73
+
33
74
  ## [2.0.11] - 2026-05-28
34
75
 
35
76
  - TAG: [v2.0.11][2.0.11t]
@@ -441,7 +482,11 @@ Old version?
441
482
  * Fixed require paths
442
483
  * added about.yml and this CHANGELOG
443
484
 
444
- [Unreleased]: https://github.com/galtzo-floss/sanitize_email/compare/v2.0.11...HEAD
485
+ [Unreleased]: https://github.com/galtzo-floss/sanitize_email/compare/v2.0.13...HEAD
486
+ [2.0.13]: https://github.com/galtzo-floss/sanitize_email/compare/v2.0.12...v2.0.13
487
+ [2.0.13t]: https://github.com/galtzo-floss/sanitize_email/releases/tag/v2.0.13
488
+ [2.0.12]: https://github.com/galtzo-floss/sanitize_email/compare/v2.0.11...v2.0.12
489
+ [2.0.12t]: https://github.com/galtzo-floss/sanitize_email/releases/tag/v2.0.12
445
490
  [2.0.11]: https://github.com/galtzo-floss/sanitize_email/compare/v2.0.10...v2.0.11
446
491
  [2.0.11t]: https://github.com/galtzo-floss/sanitize_email/releases/tag/v2.0.11
447
492
  [2.0.10]: https://github.com/galtzo-floss/sanitize_email/compare/v2.0.9...v2.0.10
data/CITATION.cff CHANGED
@@ -12,9 +12,9 @@ authors:
12
12
  orcid: 'https://orcid.org/0009-0008-8519-441X'
13
13
  identifiers:
14
14
  - type: url
15
- value: 'https://github.com/galtzo-floss/sanitize_email/tree/main/gems/sanitize_email'
15
+ value: 'https://github.com/galtzo-floss/sanitize_email'
16
16
  description: "sanitize_email"
17
- repository-code: 'https://github.com/galtzo-floss/sanitize_email/tree/main/gems/sanitize_email'
17
+ repository-code: 'https://github.com/galtzo-floss/sanitize_email'
18
18
  abstract: >-
19
19
  sanitize_email
20
20
  license: See license file
data/CONTRIBUTING.md CHANGED
@@ -102,22 +102,41 @@ Git hooks and commit message helpers (exe/kettle-commit-msg)
102
102
  - GIT_HOOK_FOOTER_SENTINEL: Required when footer append is enabled — a unique first-line sentinel to prevent duplicates
103
103
  - GIT_HOOK_FOOTER_APPEND_DEBUG: Extra debug output in the footer template (true/false)
104
104
 
105
+ Git diff driver setup
106
+ - Local setup writes repository `.gitattributes` entries and local Git `diff.smorg-*` command config so this checkout uses StructuredMerge semantic diffs.
107
+ - Global setup registers `diff.smorg-*` commands once in the user Git config; use it when you work across several StructuredMerge-enabled repositories.
108
+ - Include-file setup writes `.git/smorg/config` and includes it from local Git config, keeping command registrations out of the repository files.
109
+ - Git hosting forges generally ignore external diff drivers, so pull request views may still show raw textual diffs even when local `git diff` uses semantic drivers.
110
+
111
+ ```console
112
+ K_JEM_TEMPLATING=true kettle-jem install
113
+ ```
114
+
115
+ Troubleshooting Git diffs
116
+ - Use `git diff --no-ext-diff` to compare against Git's built-in diff output.
117
+ - Use `git diff --no-textconv` when a textconv projection obscures the raw file bytes you need to inspect.
118
+ - If Git reports a missing `smorg-*` executable, rerun `bundle install` and the setup command above, then check `git config --local --get-regexp '^diff\.smorg-'`.
119
+ - To remove managed local entries, run `K_JEM_TEMPLATING=true kettle-jem install --undo`; remove global command registrations with `git config --global --unset-all diff.smorg-ruby.command`.
120
+
105
121
  For a quick starting point, this repository’s `mise.toml` defines the shared defaults, and `.env.local` can override them locally. Copy `.env.local.example` to `.env.local`, use `KEY=value` lines, and either activate `mise` in your shell or run commands through `mise exec -C /path/to/project -- ...`.
106
122
 
107
123
  ## Appraisals
108
124
 
109
125
  From time to time the [appraisal2][🚎appraisal2] gemfiles in `gemfiles/` will need to be updated.
110
126
  Generated appraisal and CI workflow floors are controlled by `ruby.test_minimum`
111
- in `.kettle-jem.yml`; this project was templated with `ruby.test_minimum: 2.4`.
127
+ in `.structuredmerge/kettle-jem.yml`; this project was templated with `ruby.test_minimum: 2.4`.
112
128
  That value describes the lowest Ruby version expected to run the test/development
113
129
  toolchain, and it may be higher than the gemspec runtime floor.
114
130
 
115
131
  They are created and updated with the commands:
116
132
 
117
133
  ```console
118
- bin/rake appraisal:update
134
+ bin/rake appraisal:generate
119
135
  ```
120
136
 
137
+ Use `bin/rake appraisal:update` when you intentionally need to resolve fresh
138
+ appraisal locks.
139
+
121
140
  If you need to reset all gemfiles/*.gemfile.lock files:
122
141
 
123
142
  ```console
@@ -233,9 +252,9 @@ NOTE: To build without signing the gem set `SKIP_GEM_SIGNING` to any value in th
233
252
  14. Run `bundle exec rake release` which will create a git tag for the version,
234
253
  push git commits and tags, and push the `.gem` file to the gem host configured in the gemspec.
235
254
 
236
- [📜src-gl]: https://gitlab.com/galtzo-floss/sanitize_email/-/tree/main/gems/sanitize_email
237
- [📜src-cb]: https://codeberg.org/galtzo-floss/sanitize_email/src/branch/main/gems/sanitize_email
238
- [📜src-gh]: https://github.com/galtzo-floss/sanitize_email/tree/main/gems/sanitize_email
255
+ [📜src-gl]: https://gitlab.com/galtzo-floss/sanitize_email
256
+ [📜src-cb]: https://codeberg.org/galtzo-floss/sanitize_email
257
+ [📜src-gh]: https://github.com/galtzo-floss/sanitize_email
239
258
  [🧪build]: https://github.com/galtzo-floss/sanitize_email/actions
240
259
  [🤝conduct]: https://github.com/galtzo-floss/sanitize_email/blob/main/CODE_OF_CONDUCT.md
241
260
  [🖐contrib-rocks]: https://contrib.rocks
data/FUNDING.md CHANGED
@@ -4,20 +4,20 @@ Official Discord 👉️ [![Live Chat on Discord][✉️discord-invite-img]][✉
4
4
 
5
5
  Many paths lead to being a sponsor or a backer of this project. Are you on such a path?
6
6
 
7
- [![Sponsor Me on Github][🖇sponsor-img]][🖇sponsor] [![Liberapay Goal Progress][⛳liberapay-img]][⛳liberapay] [![Donate on PayPal][🖇paypal-img]][🖇paypal]
7
+ [![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]
8
8
 
9
- [![Buy me a coffee][🖇buyme-small-img]][🖇buyme] [![Donate on Polar][🖇polar-img]][🖇polar] [![Donate to my FLOSS efforts at ko-fi.com][🖇kofi-img]][🖇kofi] [![Donate to my FLOSS efforts using Patreon][🖇patreon-img]][🖇patreon]
9
+ [![Buy me a coffee][🖇buyme-small-img]][🖇buyme] [![Donate to my FLOSS efforts at ko-fi.com][🖇kofi-img]][🖇kofi]
10
10
 
11
11
  [⛳liberapay-img]: https://img.shields.io/liberapay/goal/pboling.svg?logo=liberapay&color=a51611&style=flat
12
12
  [⛳liberapay]: https://liberapay.com/pboling/donate
13
+ [🖇osc-backers]: https://opencollective.com/galtzo-floss#backer
14
+ [🖇osc-backers-i]: https://opencollective.com/galtzo-floss/backers/badge.svg?style=flat
15
+ [🖇osc-sponsors]: https://opencollective.com/galtzo-floss#sponsor
16
+ [🖇osc-sponsors-i]: https://opencollective.com/galtzo-floss/sponsors/badge.svg?style=flat
13
17
  [🖇sponsor-img]: https://img.shields.io/badge/Sponsor_Me!-pboling.svg?style=social&logo=github
14
18
  [🖇sponsor]: https://github.com/sponsors/pboling
15
- [🖇polar-img]: https://img.shields.io/badge/polar-donate-a51611.svg?style=flat
16
- [🖇polar]: https://polar.sh/pboling
17
19
  [🖇kofi-img]: https://img.shields.io/badge/ko--fi-%E2%9C%93-a51611.svg?style=flat
18
20
  [🖇kofi]: https://ko-fi.com/pboling
19
- [🖇patreon-img]: https://img.shields.io/badge/patreon-donate-a51611.svg?style=flat
20
- [🖇patreon]: https://patreon.com/galtzo
21
21
  [🖇buyme-small-img]: https://img.shields.io/badge/buy_me_a_coffee-%E2%9C%93-a51611.svg?style=flat
22
22
  [🖇buyme]: https://www.buymeacoffee.com/pboling
23
23
  [🖇paypal-img]: https://img.shields.io/badge/donate-paypal-a51611.svg?style=flat&logo=paypal
@@ -42,7 +42,7 @@ To join the community or get help 👇️ Join the Discord.
42
42
 
43
43
  To say "thanks!" ☝️ Join the Discord or 👇️ send money.
44
44
 
45
- [![Sponsor me on GitHub Sponsors][🖇sponsor-bottom-img]][🖇sponsor] 💌 [![Sponsor me on Liberapay][⛳liberapay-bottom-img]][⛳liberapay] 💌 [![Donate on PayPal][🖇paypal-bottom-img]][🖇paypal]
45
+ [![Sponsor galtzo-floss/sanitize_email 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]
46
46
 
47
47
  # Another Way to Support Open Source Software
48
48
 
@@ -55,6 +55,13 @@ I’m developing a new library, [floss_funding][🖇floss-funding-gem], designed
55
55
  **[Floss-Funding.dev][🖇floss-funding.dev]: 👉️ No network calls. 👉️ No tracking. 👉️ No oversight. 👉️ Minimal crypto hashing. 💡 Easily disabled nags**
56
56
 
57
57
  [⛳liberapay-bottom-img]: https://img.shields.io/liberapay/goal/pboling.svg?style=for-the-badge&logo=liberapay&color=a51611
58
+ [🖇osc-all-img]: https://img.shields.io/opencollective/all/galtzo-floss
59
+ [🖇osc-sponsors-img]: https://img.shields.io/opencollective/sponsors/galtzo-floss
60
+ [🖇osc-backers-img]: https://img.shields.io/opencollective/backers/galtzo-floss
61
+ [🖇osc-all-bottom-img]: https://img.shields.io/opencollective/all/galtzo-floss?style=for-the-badge
62
+ [🖇osc-sponsors-bottom-img]: https://img.shields.io/opencollective/sponsors/galtzo-floss?style=for-the-badge
63
+ [🖇osc-backers-bottom-img]: https://img.shields.io/opencollective/backers/galtzo-floss?style=for-the-badge
64
+ [🖇osc]: https://opencollective.com/galtzo-floss
58
65
  [🖇sponsor-bottom-img]: https://img.shields.io/badge/Sponsor_Me!-pboling-blue?style=for-the-badge&logo=github
59
66
  [🖇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
60
67
  [🖇paypal-bottom-img]: https://img.shields.io/badge/donate-paypal-a51611.svg?style=for-the-badge&logo=paypal&color=0A0A0A
data/LICENSE.md CHANGED
@@ -7,16 +7,16 @@ Choose the option that best fits your use case:
7
7
 
8
8
  ## Copyright Notice
9
9
 
10
- Copyright (c) 2008 Peter Boling
11
- Copyright (c) 2009 John Trupiano
12
- Copyright (c) 2009-2010 pboling
13
- Copyright (c) 2009 Peter H. Boling
14
- Copyright (c) 2012 David Morton
15
- Copyright (c) 2012 Harry Lascelles
16
- Copyright (c) 2012-2018, 2022, 2024, 2026 Peter H. Boling
17
- Copyright (c) 2013 Adrien Siami
18
- Copyright (c) 2013 Chris Altman
19
- Copyright (c) 2014 Scott Rocher
20
- Copyright (c) 2017 Marcus Ilgner
21
- Copyright (c) 2018 Bernardo Galindo
22
- Copyright (c) 2024-2025 joeyparis
10
+ - Copyright (c) 2008 Peter Boling
11
+ - Copyright (c) 2009 John Trupiano
12
+ - Copyright (c) 2009-2010 pboling
13
+ - Copyright (c) 2009 Peter H. Boling
14
+ - Copyright (c) 2012 David Morton
15
+ - Copyright (c) 2012 Harry Lascelles
16
+ - Copyright (c) 2012-2018, 2022, 2024, 2026 Peter H. Boling
17
+ - Copyright (c) 2013 Adrien Siami
18
+ - Copyright (c) 2013 Chris Altman
19
+ - Copyright (c) 2014 Scott Rocher
20
+ - Copyright (c) 2017 Marcus Ilgner
21
+ - Copyright (c) 2018 Bernardo Galindo
22
+ - Copyright (c) 2024-2025 joeyparis
data/MIT.md ADDED
@@ -0,0 +1,21 @@
1
+ The MIT License (MIT)
2
+
3
+ See [LICENSE.md](LICENSE.md) for the copyright notice.
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in
13
+ all copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21
+ THE SOFTWARE.
data/README.md CHANGED
@@ -1,30 +1,25 @@
1
- [![Galtzo FLOSS Logo by Aboling0, CC BY-SA 4.0][🖼️galtzo-floss-i]][🖼️galtzo-floss] [![ruby-lang Logo, Yukihiro Matsumoto, Ruby Visual Identity Team, CC BY-SA 2.5][🖼️ruby-lang-i]][🖼️ruby-lang]
2
-
3
- [🖼️galtzo-floss-i]: https://logos.galtzo.com/assets/images/galtzo-floss/avatar-192px.svg
4
- [🖼️galtzo-floss]: https://discord.gg/3qme4XHNKN
5
- [🖼️ruby-lang-i]: https://logos.galtzo.com/assets/images/ruby-lang/avatar-192px.svg
6
- [🖼️ruby-lang]: https://www.ruby-lang.org/
1
+ <a href="https://github.com/galtzo-floss"><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="12%" align="right"/></a> <a href="https://github.com/galtzo-floss/sanitize_email"><img alt="sanitize_email Logo by Aboling0, CC BY-SA 4.0" src="https://logos.galtzo.com/assets/images/galtzo-floss/sanitize_email/avatar-128px.svg" width="12%" align="right"/></a>
7
2
 
8
3
  # 📧 SanitizeEmail
9
4
 
10
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]
11
6
 
12
- `if ci_badges.map(&:color).detect { it != "green"}` ☝️ [let me know][🖼️galtzo-floss], as I may have missed the [discord notification][🖼️galtzo-floss].
7
+ `if ci_badges.map(&:color).detect { it != "green"}` ☝️ [let me know][✉️discord-invite], as I may have missed the [discord notification][✉️discord-invite].
13
8
 
14
9
  ---
15
10
 
16
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.
17
12
 
18
- [![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 on Polar][🖇polar-img]][🖇polar] [![Donate at ko-fi.com][🖇kofi-img]][🖇kofi]
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]
19
14
 
20
- <details>
15
+ <details markdown="1">
21
16
  <summary>👣 How will this project approach the September 2025 hostile takeover of RubyGems? 🚑️</summary>
22
17
 
23
18
  I've summarized my thoughts in [this blog post](https://dev.to/galtzo/hostile-takeover-of-rubygems-my-thoughts-5hlo).
24
19
 
25
20
  </details>
26
21
 
27
- ## 🌻 Synopsis
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>
28
23
 
29
24
  It's particularly helpful when you want to prevent the delivery of email (e.g. in development/test environments) or alter the to/cc/bcc (e.g. in staging or demo environments) of all email generated from your application.
30
25
 
@@ -41,11 +36,11 @@ It's particularly helpful when you want to prevent the delivery of email (e.g. i
41
36
 
42
37
  | Tokens to Remember | [![Gem name][⛳️name-img]][⛳️gem-name] [![Gem namespace][⛳️namespace-img]][⛳️gem-namespace] |
43
38
  |-------------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
44
- | 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 current Compat][💎jruby-c-i]][🚎10-j-wf] [![JRuby HEAD Compat][💎jruby-headi]][🚎3-hd-wf]|
45
- | 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 current Compat][💎truby-c-i]][🚎9-t-wf]|
46
- | Works with MRI Ruby 4 | [![Ruby 4.0 Compat][💎ruby-4.0i]][🚎11-c-wf] [![Ruby current Compat][💎ruby-c-i]][🚎11-c-wf] [![Ruby HEAD Compat][💎ruby-headi]][🚎3-hd-wf]|
39
+ | 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]|
40
+ | 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]|
41
+ | Works with MRI Ruby 4 | [![Ruby current Compat][💎ruby-c-i]][🚎11-c-wf] [![Ruby HEAD Compat][💎ruby-headi]][🚎3-hd-wf]|
47
42
  | 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]|
48
- | Works with MRI Ruby 2 | [![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]|
43
+ | 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]|
49
44
  | 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] |
50
45
  | 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] |
51
46
  | 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] |
@@ -62,11 +57,25 @@ This test floor is configured by `ruby.test_minimum` in `.kettle-jem.yml` and
62
57
  may be higher than the gem's runtime compatibility floor when legacy Rubies are
63
58
  not practical for the current toolchain.
64
59
 
65
- | 🚚 _Amazing_ test matrix was brought to you by | 🔎 appraisal2 🔎 and the color 💚 green 💚 |
66
- |------------------------------------------------|--------------------------------------------------------|
67
- | 👟 Check it out! | ✨ [github.com/appraisal-rb/appraisal2][💎appraisal2] ✨ |
60
+ <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>
68
61
 
62
+ The _amazing_ test matrix is powered by the kettle-dev stack.
63
+
64
+ <details markdown="1">
65
+ <summary>How kettle-dev manages complexity in tests</summary>
66
+
67
+ | Gem | Source | Role | Daily download rank |
68
+ |-----|--------|------|---------------------|
69
+ | [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) |
70
+ | [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) |
71
+ | [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) |
72
+ | [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) |
73
+ | [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) |
74
+ | [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) |
75
+ | [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) |
76
+ | [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
77
 
78
+ </details>
70
79
 
71
80
  ### Federated DVCS
72
81
 
@@ -142,29 +151,50 @@ This happens in a few different ways, and two of them are in the config below (`
142
151
 
143
152
  ## 🔧 Basic Usage
144
153
 
145
-
146
154
  ## 🦷 FLOSS Funding
147
155
 
148
- While pboling tools are free software and will always be, the project would benefit immensely from some funding.
156
+ While galtzo-floss tools are free software and will always be, the project would benefit immensely from some funding.
149
157
  Raising a monthly budget of... "dollars" would make the project more sustainable.
150
158
 
151
159
  We welcome both individual and corporate sponsors! We also offer a
152
160
  wide array of funding channels to account for your preferences.
153
- Currently, [GitHub Sponsors][🖇sponsor], and [Liberapay][⛳liberapay] are our preferred funding platforms.
161
+ Currently, [Open Collective][🖇osc] is our preferred funding platform.
154
162
 
155
- **If you're working in a company that's making significant use of pboling tools we'd
156
- appreciate it if you suggest to your company to become a pboling sponsor.**
163
+ **If you're working in a company that's making significant use of galtzo-floss tools we'd
164
+ appreciate it if you suggest to your company to become a galtzo-floss sponsor.**
157
165
 
158
- You can support the development of pboling tools via
166
+ You can support the development of galtzo-floss tools via
159
167
  [GitHub Sponsors][🖇sponsor],
160
168
  [Liberapay][⛳liberapay],
161
169
  [PayPal][🖇paypal],
170
+ [Open Collective][🖇osc]
162
171
  and [Tidelift][🏙️entsup-tidelift].
163
172
 
164
173
  | 📍 NOTE |
165
174
  |----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
166
175
  | 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. |
167
176
 
177
+ ### Open Collective for Individuals
178
+
179
+ Support us with a monthly donation and help us continue our activities. [[Become a backer](https://opencollective.com/galtzo-floss#backer)]
180
+
181
+ NOTE: [kettle-readme-backers][kettle-readme-backers] updates this list every day, automatically.
182
+
183
+ <!-- OPENCOLLECTIVE-INDIVIDUALS:START -->
184
+ No backers yet. Be the first!
185
+ <!-- OPENCOLLECTIVE-INDIVIDUALS:END -->
186
+
187
+ ### Open Collective for Organizations
188
+
189
+ Become a sponsor and get your logo on our README on GitHub with a link to your site. [[Become a sponsor](https://opencollective.com/galtzo-floss#sponsor)]
190
+
191
+ NOTE: [kettle-readme-backers][kettle-readme-backers] updates this list every day, automatically.
192
+
193
+ <!-- OPENCOLLECTIVE-ORGANIZATIONS:START -->
194
+ No sponsors yet. Be the first!
195
+ <!-- OPENCOLLECTIVE-ORGANIZATIONS:END -->
196
+
197
+ [kettle-readme-backers]: https://github.com/galtzo-floss/sanitize_email/blob/main/bin/kettle-readme-backers
168
198
 
169
199
  ### Another way to support open-source
170
200
 
@@ -176,7 +206,7 @@ I’m developing a new library, [floss_funding][🖇floss-funding-gem], designed
176
206
 
177
207
  **[Floss-Funding.dev][🖇floss-funding.dev]: 👉️ No network calls. 👉️ No tracking. 👉️ No oversight. 👉️ Minimal crypto hashing. 💡 Easily disabled nags**
178
208
 
179
- [![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 on Polar][🖇polar-img]][🖇polar] [![Donate to my FLOSS efforts at ko-fi.com][🖇kofi-img]][🖇kofi] [![Donate to my FLOSS efforts using Patreon][🖇patreon-img]][🖇patreon]
209
+ [![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]
180
210
 
181
211
  ## 🔐 Security
182
212
 
@@ -222,7 +252,7 @@ Made with [contributors-img][🖐contrib-rocks].
222
252
 
223
253
  Also see GitLab Contributors: [https://gitlab.com/galtzo-floss/sanitize_email/-/graphs/main][🚎contributors-gl]
224
254
 
225
- <details>
255
+ <details markdown="1">
226
256
  <summary>⭐️ Star History</summary>
227
257
 
228
258
  <a href="https://star-history.com/galtzo-floss/sanitize_email&Date">
@@ -304,24 +334,33 @@ To join the community or get help 👇️ Join the Discord.
304
334
 
305
335
  To say "thanks!" ☝️ Join the Discord or 👇️ send money.
306
336
 
307
- [![Sponsor me on GitHub Sponsors][🖇sponsor-bottom-img]][🖇sponsor] 💌 [![Sponsor me on Liberapay][⛳liberapay-bottom-img]][⛳liberapay] 💌 [![Donate on PayPal][🖇paypal-bottom-img]][🖇paypal]
337
+ [![Sponsor galtzo-floss/sanitize_email 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]
308
338
 
309
339
  ### Please give the project a star ⭐ ♥.
310
340
 
341
+ 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.
342
+
311
343
  Thanks for RTFM. ☺️
312
344
 
313
345
  [⛳liberapay-img]: https://img.shields.io/liberapay/goal/pboling.svg?logo=liberapay&color=a51611&style=flat
314
346
  [⛳liberapay-bottom-img]: https://img.shields.io/liberapay/goal/pboling.svg?style=for-the-badge&logo=liberapay&color=a51611
315
347
  [⛳liberapay]: https://liberapay.com/pboling/donate
348
+ [🖇osc-all-img]: https://img.shields.io/opencollective/all/galtzo-floss
349
+ [🖇osc-sponsors-img]: https://img.shields.io/opencollective/sponsors/galtzo-floss
350
+ [🖇osc-backers-img]: https://img.shields.io/opencollective/backers/galtzo-floss
351
+ [🖇osc-backers]: https://opencollective.com/galtzo-floss#backer
352
+ [🖇osc-backers-i]: https://opencollective.com/galtzo-floss/backers/badge.svg?style=flat
353
+ [🖇osc-sponsors]: https://opencollective.com/galtzo-floss#sponsor
354
+ [🖇osc-sponsors-i]: https://opencollective.com/galtzo-floss/sponsors/badge.svg?style=flat
355
+ [🖇osc-all-bottom-img]: https://img.shields.io/opencollective/all/galtzo-floss?style=for-the-badge
356
+ [🖇osc-sponsors-bottom-img]: https://img.shields.io/opencollective/sponsors/galtzo-floss?style=for-the-badge
357
+ [🖇osc-backers-bottom-img]: https://img.shields.io/opencollective/backers/galtzo-floss?style=for-the-badge
358
+ [🖇osc]: https://opencollective.com/galtzo-floss
316
359
  [🖇sponsor-img]: https://img.shields.io/badge/Sponsor_Me!-pboling.svg?style=social&logo=github
317
360
  [🖇sponsor-bottom-img]: https://img.shields.io/badge/Sponsor_Me!-pboling-blue?style=for-the-badge&logo=github
318
361
  [🖇sponsor]: https://github.com/sponsors/pboling
319
- [🖇polar-img]: https://img.shields.io/badge/polar-donate-a51611.svg?style=flat
320
- [🖇polar]: https://polar.sh/pboling
321
362
  [🖇kofi-img]: https://img.shields.io/badge/ko--fi-%E2%9C%93-a51611.svg?style=flat
322
363
  [🖇kofi]: https://ko-fi.com/pboling
323
- [🖇patreon-img]: https://img.shields.io/badge/patreon-donate-a51611.svg?style=flat
324
- [🖇patreon]: https://patreon.com/galtzo
325
364
  [🖇buyme-small-img]: https://img.shields.io/badge/buy_me_a_coffee-%E2%9C%93-a51611.svg?style=flat
326
365
  [🖇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
327
366
  [🖇buyme]: https://www.buymeacoffee.com/pboling
@@ -336,7 +375,7 @@ Thanks for RTFM. ☺️
336
375
  [✉️ruby-friends]: https://app.daily.dev/squads/rubyfriends
337
376
 
338
377
  [✇bundle-group-pattern]: https://gist.github.com/pboling/4564780
339
- [⛳️gem-namespace]: https://github.com/galtzo-floss/sanitize_email/tree/main/gems/sanitize_email
378
+ [⛳️gem-namespace]: https://github.com/galtzo-floss/sanitize_email
340
379
  [⛳️namespace-img]: https://img.shields.io/badge/namespace-SanitizeEmail-3C2D2D.svg?style=square&logo=ruby&logoColor=white
341
380
  [⛳️gem-name]: https://bestgems.org/gems/sanitize_email
342
381
  [⛳️name-img]: https://img.shields.io/badge/name-sanitize__email-3C2D2D.svg?style=square&logo=rubygems&logoColor=red
@@ -376,11 +415,11 @@ Thanks for RTFM. ☺️
376
415
  [💁🏼‍♂️peterboling]: http://www.peterboling.com
377
416
  [🚂railsbling]: http://www.railsbling.com
378
417
  [📜src-gl-img]: https://img.shields.io/badge/GitLab-FBA326?style=for-the-badge&logo=Gitlab&logoColor=orange
379
- [📜src-gl]: https://gitlab.com/galtzo-floss/sanitize_email/-/tree/main/gems/sanitize_email
418
+ [📜src-gl]: https://gitlab.com/galtzo-floss/sanitize_email
380
419
  [📜src-cb-img]: https://img.shields.io/badge/CodeBerg-4893CC?style=for-the-badge&logo=CodeBerg&logoColor=blue
381
- [📜src-cb]: https://codeberg.org/galtzo-floss/sanitize_email/src/branch/main/gems/sanitize_email
420
+ [📜src-cb]: https://codeberg.org/galtzo-floss/sanitize_email
382
421
  [📜src-gh-img]: https://img.shields.io/badge/GitHub-238636?style=for-the-badge&logo=Github&logoColor=green
383
- [📜src-gh]: https://github.com/galtzo-floss/sanitize_email/tree/main/gems/sanitize_email
422
+ [📜src-gh]: https://github.com/galtzo-floss/sanitize_email
384
423
  [📜docs-cr-rd-img]: https://img.shields.io/badge/RubyDoc-Current_Release-943CD2?style=for-the-badge&logo=readthedocs&logoColor=white
385
424
  [📜docs-head-rd-img]: https://img.shields.io/badge/YARD_on_Galtzo.com-HEAD-943CD2?style=for-the-badge&logo=readthedocs&logoColor=white
386
425
  [📜gl-wiki]: https://gitlab.com/galtzo-floss/sanitize_email/-/wikis/home
@@ -411,11 +450,13 @@ Thanks for RTFM. ☺️
411
450
  [🚎jruby-9.2-wf]: https://github.com/galtzo-floss/sanitize_email/actions/workflows/jruby-9.2.yml
412
451
  [🚎jruby-9.3-wf]: https://github.com/galtzo-floss/sanitize_email/actions/workflows/jruby-9.3.yml
413
452
  [🚎jruby-9.4-wf]: https://github.com/galtzo-floss/sanitize_email/actions/workflows/jruby-9.4.yml
453
+ [🚎jruby-10.0-wf]: https://github.com/galtzo-floss/sanitize_email/actions/workflows/jruby-10.0.yml
414
454
  [🚎truby-22.3-wf]: https://github.com/galtzo-floss/sanitize_email/actions/workflows/truffleruby-22.3.yml
415
455
  [🚎truby-23.0-wf]: https://github.com/galtzo-floss/sanitize_email/actions/workflows/truffleruby-23.0.yml
416
456
  [🚎truby-23.1-wf]: https://github.com/galtzo-floss/sanitize_email/actions/workflows/truffleruby-23.1.yml
417
457
  [🚎truby-24.2-wf]: https://github.com/galtzo-floss/sanitize_email/actions/workflows/truffleruby-24.2.yml
418
458
  [🚎truby-25.0-wf]: https://github.com/galtzo-floss/sanitize_email/actions/workflows/truffleruby-25.0.yml
459
+ [🚎truby-33.0-wf]: https://github.com/galtzo-floss/sanitize_email/actions/workflows/truffleruby-33.0.yml
419
460
  [🚎2-cov-wf]: https://github.com/galtzo-floss/sanitize_email/actions/workflows/coverage.yml
420
461
  [🚎2-cov-wfi]: https://github.com/galtzo-floss/sanitize_email/actions/workflows/coverage.yml/badge.svg
421
462
  [🚎3-hd-wf]: https://github.com/galtzo-floss/sanitize_email/actions/workflows/heads.yml
@@ -436,6 +477,7 @@ Thanks for RTFM. ☺️
436
477
  [🚎14-🔓️-wfi]: https://github.com/galtzo-floss/sanitize_email/actions/workflows/unlocked_deps.yml/badge.svg
437
478
  [🚎15-🪪-wf]: https://github.com/galtzo-floss/sanitize_email/actions/workflows/license-eye.yml
438
479
  [🚎15-🪪-wfi]: https://github.com/galtzo-floss/sanitize_email/actions/workflows/license-eye.yml/badge.svg
480
+ [💎ruby-2.3i]: https://img.shields.io/badge/Ruby-2.3_(%F0%9F%9A%ABCI)-AABBCC?style=for-the-badge&logo=ruby&logoColor=white
439
481
  [💎ruby-2.4i]: https://img.shields.io/badge/Ruby-2.4-DF00CA?style=for-the-badge&logo=ruby&logoColor=white
440
482
  [💎ruby-2.5i]: https://img.shields.io/badge/Ruby-2.5-DF00CA?style=for-the-badge&logo=ruby&logoColor=white
441
483
  [💎ruby-2.6i]: https://img.shields.io/badge/Ruby-2.6-DF00CA?style=for-the-badge&logo=ruby&logoColor=white
@@ -445,7 +487,6 @@ Thanks for RTFM. ☺️
445
487
  [💎ruby-3.2i]: https://img.shields.io/badge/Ruby-3.2-CC342D?style=for-the-badge&logo=ruby&logoColor=white
446
488
  [💎ruby-3.3i]: https://img.shields.io/badge/Ruby-3.3-CC342D?style=for-the-badge&logo=ruby&logoColor=white
447
489
  [💎ruby-3.4i]: https://img.shields.io/badge/Ruby-3.4-CC342D?style=for-the-badge&logo=ruby&logoColor=white
448
- [💎ruby-4.0i]: https://img.shields.io/badge/Ruby-4.0-CC342D?style=for-the-badge&logo=ruby&logoColor=white
449
490
  [💎ruby-c-i]: https://img.shields.io/badge/Ruby-current-CC342D?style=for-the-badge&logo=ruby&logoColor=green
450
491
  [💎ruby-headi]: https://img.shields.io/badge/Ruby-HEAD-CC342D?style=for-the-badge&logo=ruby&logoColor=blue
451
492
  [💎truby-22.3i]: https://img.shields.io/badge/Truffle_Ruby-22.3-34BCB1?style=for-the-badge&logo=ruby&logoColor=pink
@@ -453,10 +494,13 @@ Thanks for RTFM. ☺️
453
494
  [💎truby-23.1i]: https://img.shields.io/badge/Truffle_Ruby-23.1-34BCB1?style=for-the-badge&logo=ruby&logoColor=pink
454
495
  [💎truby-24.2i]: https://img.shields.io/badge/Truffle_Ruby-24.2-34BCB1?style=for-the-badge&logo=ruby&logoColor=pink
455
496
  [💎truby-25.0i]: https://img.shields.io/badge/Truffle_Ruby-25.0-34BCB1?style=for-the-badge&logo=ruby&logoColor=pink
497
+ [💎truby-33.0i]: https://img.shields.io/badge/Truffle_Ruby-33.0-34BCB1?style=for-the-badge&logo=ruby&logoColor=pink
456
498
  [💎truby-c-i]: https://img.shields.io/badge/Truffle_Ruby-current-34BCB1?style=for-the-badge&logo=ruby&logoColor=green
499
+ [💎truby-headi]: https://img.shields.io/badge/Truffle_Ruby-HEAD-34BCB1?style=for-the-badge&logo=ruby&logoColor=blue
457
500
  [💎jruby-9.2i]: https://img.shields.io/badge/JRuby-9.2-FBE742?style=for-the-badge&logo=ruby&logoColor=red
458
501
  [💎jruby-9.3i]: https://img.shields.io/badge/JRuby-9.3-FBE742?style=for-the-badge&logo=ruby&logoColor=red
459
502
  [💎jruby-9.4i]: https://img.shields.io/badge/JRuby-9.4-FBE742?style=for-the-badge&logo=ruby&logoColor=red
503
+ [💎jruby-10.0i]: https://img.shields.io/badge/JRuby-10.0-FBE742?style=for-the-badge&logo=ruby&logoColor=red
460
504
  [💎jruby-c-i]: https://img.shields.io/badge/JRuby-current-FBE742?style=for-the-badge&logo=ruby&logoColor=green
461
505
  [💎jruby-headi]: https://img.shields.io/badge/JRuby-HEAD-FBE742?style=for-the-badge&logo=ruby&logoColor=blue
462
506
  [🤝gh-issues]: https://github.com/galtzo-floss/sanitize_email/issues
@@ -485,7 +529,7 @@ Thanks for RTFM. ☺️
485
529
  [📌gitmoji]: https://gitmoji.dev
486
530
  [📌gitmoji-img]: https://img.shields.io/badge/gitmoji_commits-%20%F0%9F%98%9C%20%F0%9F%98%8D-34495e.svg?style=flat-square
487
531
  [🧮kloc]: https://www.youtube.com/watch?v=dQw4w9WgXcQ
488
- [🧮kloc-img]: https://img.shields.io/badge/KLOC-0.276-FFDD67.svg?style=for-the-badge&logo=YouTube&logoColor=blue
532
+ [🧮kloc-img]: https://img.shields.io/badge/KLOC-0.385-FFDD67.svg?style=for-the-badge&logo=YouTube&logoColor=blue
489
533
  [🔐security]: https://github.com/galtzo-floss/sanitize_email/blob/main/SECURITY.md
490
534
  [🔐security-img]: https://img.shields.io/badge/security-policy-259D6C.svg?style=flat
491
535
  [📄copyright-notice-explainer]: https://opensource.stackexchange.com/questions/5778/why-do-licenses-such-as-the-mit-license-specify-a-single-year
@@ -493,7 +537,7 @@ Thanks for RTFM. ☺️
493
537
  [📄license-ref]: MIT.md
494
538
  [📄license-img]: https://img.shields.io/badge/License-MIT-259D6C.svg
495
539
  [📄license-compat]: https://www.apache.org/legal/resolved.html#category-a
496
- [📄license-compat-img]: https://img.shields.io/badge/Apache_Compatible:_Category_A-✓-259D6C.svg?style=flat&logo=Apache
540
+ [📄license-compat-img]: https://img.shields.io/badge/Apache_Compatible:_Category_A-%E2%9C%93-259D6C.svg?style=flat&logo=Apache
497
541
 
498
542
  [📄ilo-declaration]: https://www.ilo.org/declaration/lang--en/index.htm
499
543
  [📄ilo-declaration-img]: https://img.shields.io/badge/ILO_Fundamental_Principles-✓-259D6C.svg?style=flat
@@ -513,7 +557,7 @@ Thanks for RTFM. ☺️
513
557
  | Package | sanitize_email |
514
558
  | Description | Email Condom for your Ruby Server.<br>In Rails, Sinatra, et al, or simply the mail gem: Aids in development, testing, qa, and production troubleshooting of email issues without worrying that emails will get sent to actual live addresses. |
515
559
  | Homepage | https://github.com/galtzo-floss/sanitize_email |
516
- | Source | https://github.com/galtzo-floss/sanitize_email/tree/v2.0.10 |
560
+ | Source | https://github.com/galtzo-floss/sanitize_email |
517
561
  | License | `MIT` |
518
- | Funding | https://github.com/sponsors/pboling, https://issuehunt.io/u/pboling, https://ko-fi.com/pboling, https://liberapay.com/pboling/donate, https://patreon.com/galtzo, https://polar.sh/pboling, https://thanks.dev/gh/pboling, https://tidelift.com/funding/github/rubygems/sanitize_email, https://www.buymeacoffee.com/pboling |
562
+ | Funding | https://github.com/sponsors/pboling, https://ko-fi.com/pboling, https://liberapay.com/pboling/donate, https://opencollective.com/galtzo-floss, https://thanks.dev/gh/pboling, https://tidelift.com/funding/github/rubygems/sanitize_email, https://www.buymeacoffee.com/pboling |
519
563
  <!-- kettle-jem:metadata:end -->
data/SECURITY.md CHANGED
@@ -4,7 +4,7 @@
4
4
 
5
5
  | Version | Supported |
6
6
  |----------|-----------|
7
- | 1.latest | ✅ |
7
+ | 2.0.latest | ✅ |
8
8
 
9
9
  ## Security contact information
10
10
 
@@ -55,7 +55,7 @@ module SanitizeEmail
55
55
  # while nil ignores this setting and checks activation_proc
56
56
  engage: nil,
57
57
 
58
- activation_proc: proc { false },
58
+ activation_proc: proc { false }
59
59
  }.freeze
60
60
 
61
61
  INIT_KEYS = [:sanitized_to, :sanitized_cc, :sanitized_bcc, :good_list, :bad_list].freeze
@@ -100,7 +100,7 @@ module SanitizeEmail
100
100
  return if force_sanitize.nil?
101
101
 
102
102
  deprecation_warning_message(
103
- <<-DEPRECATION,
103
+ <<-DEPRECATION
104
104
  SanitizeEmail::Config.config[:force_sanitize] is deprecated.
105
105
  Please use SanitizeEmail.force_sanitize or SanitizeEmail.sanitary instead.
106
106
  Refer to https://github.com/galtzo-floss/sanitize_email/wiki for examples.
@@ -50,7 +50,7 @@ module SanitizeEmail
50
50
  {
51
51
  # can be an arrays, so casting it as arrays
52
52
  "X-Sanitize-Email-To" => to_decoded,
53
- "X-Sanitize-Email-Cc" => cc_decoded,
53
+ "X-Sanitize-Email-Cc" => cc_decoded
54
54
  # Don't write out the BCC, as those addresses should not be visible
55
55
  # in message headers for obvious reasons
56
56
  }.each do |header_key, header_value|
@@ -58,7 +58,7 @@ module SanitizeEmail
58
58
  SanitizeEmail::MailHeaderTools.update_header(
59
59
  header_key,
60
60
  header_value,
61
- message,
61
+ message
62
62
  )
63
63
  end
64
64
  end
@@ -99,7 +99,7 @@ module SanitizeEmail
99
99
  end,
100
100
  bcc: actual_personalization[:bcc]&.map do |bcc|
101
101
  bcc.merge(email: override_email(:bcc, bcc[:email]).join(","))
102
- end,
102
+ end
103
103
  )
104
104
  end
105
105
  end
@@ -133,20 +133,19 @@ module SanitizeEmail
133
133
  # then just return the default sanitized recipients
134
134
  return sanitized_addresses unless SanitizeEmail.use_actual_email_as_sanitized_user_name
135
135
 
136
- with_user_names = inject_user_names(real_addresses, sanitized_addresses)
136
+ inject_user_names(real_addresses, sanitized_addresses)
137
137
  # puts "real_addresses 2: #{real_addresses}"
138
138
  # puts "override_email 6: #{type} - #{with_user_names}"
139
139
  # Otherwise inject the email as the "user name"
140
- with_user_names
141
140
  end
142
141
 
143
142
  def address_list_filter(list_type, address)
144
143
  # TODO: How does this handle email addresses with user names like "Foo Example <foo@example.org>"
145
144
  has_address = send(list_type).include?(address)
146
145
  case list_type
147
- when :good_list then
146
+ when :good_list
148
147
  has_address ? address : nil
149
- when :bad_list then
148
+ when :bad_list
150
149
  has_address ? nil : address
151
150
  else
152
151
  raise ArgumentError, "address_list_filter got unknown list_type: #{list_type}"
@@ -175,11 +174,11 @@ module SanitizeEmail
175
174
 
176
175
  def sanitize_addresses(type)
177
176
  case type
178
- when :to then
177
+ when :to
179
178
  Array(sanitized_to)
180
- when :cc then
179
+ when :cc
181
180
  Array(sanitized_cc)
182
- when :bcc then
181
+ when :bcc
183
182
  Array(sanitized_bcc)
184
183
  else
185
184
  raise UnknownOverride, "unknown email override"
@@ -2,7 +2,7 @@
2
2
 
3
3
  module SanitizeEmail
4
4
  module Version
5
- VERSION = "2.0.11"
5
+ VERSION = "2.0.13"
6
6
  end
7
7
  VERSION = Version::VERSION # Traditional Constant Location
8
8
  end
@@ -24,7 +24,7 @@ module SanitizeEmail
24
24
  # This gem must be loaded **after** Rails in order for the Engine/Railtie to register itself automatically.
25
25
  # Otherwise, you'd have to manually require what you need from below.
26
26
  # Allow non-rails implementations to use this gem
27
- # :nocov:
27
+ # simplecov:disable
28
28
  if defined?(::Rails::VERSION)
29
29
  if defined?(::Rails::Engine)
30
30
  if ::Rails::VERSION::MAJOR >= 6
@@ -53,7 +53,7 @@ module SanitizeEmail
53
53
  warn "SanitizeEmail was unable to detect a compatible Mail class to register an interceptor on."
54
54
  end
55
55
  end
56
- # :nocov:
56
+ # simplecov:enable
57
57
 
58
58
  class << self
59
59
  extend SanitizeEmail::Deprecation
@@ -80,7 +80,7 @@ module SanitizeEmail
80
80
  end
81
81
 
82
82
  def respond_to_missing?(method_name, include_private = false)
83
- method_name ? method_name : super
83
+ method_name || super
84
84
  end
85
85
 
86
86
  # NOTE: Deprecated method
@@ -117,11 +117,20 @@ module SanitizeEmail
117
117
  #
118
118
  def sanitary(config_options = {})
119
119
  raise MissingBlockParameter, "SanitizeEmail.sanitary must be called with a block" unless block_given?
120
- janitor(forcing: true) do
120
+ forcing =
121
+ if config_options.key?(:activation_proc) || config_options.key?(:engage)
122
+ nil
123
+ else
124
+ true
125
+ end
126
+ janitor(forcing: forcing) do
121
127
  original = SanitizeEmail::Config.config.dup
122
- SanitizeEmail::Config.config.merge!(config_options)
123
- yield
124
- SanitizeEmail::Config.config = original
128
+ begin
129
+ SanitizeEmail::Config.config.merge!(config_options)
130
+ yield
131
+ ensure
132
+ SanitizeEmail::Config.config = original
133
+ end
125
134
  end
126
135
  end
127
136
 
@@ -149,6 +158,7 @@ module SanitizeEmail
149
158
  original = SanitizeEmail.force_sanitize
150
159
  SanitizeEmail.force_sanitize = options[:forcing]
151
160
  yield
161
+ ensure
152
162
  SanitizeEmail.force_sanitize = original
153
163
  end
154
164
 
data.tar.gz.sig CHANGED
Binary file
metadata CHANGED
@@ -1,12 +1,21 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sanitize_email
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.0.11
4
+ version: 2.0.13
5
5
  platform: ruby
6
6
  authors:
7
7
  - Peter Boling
8
8
  - John Trupiano
9
- - George Anderson
9
+ - pboling
10
+ - Peter H. Boling
11
+ - David Morton
12
+ - Harry Lascelles
13
+ - Adrien Siami
14
+ - Chris Altman
15
+ - Scott Rocher
16
+ - Marcus Ilgner
17
+ - Bernardo Galindo
18
+ - joeyparis
10
19
  bindir: exe
11
20
  cert_chain:
12
21
  - |
@@ -62,7 +71,7 @@ dependencies:
62
71
  version: '1.1'
63
72
  - - ">="
64
73
  - !ruby/object:Gem::Version
65
- version: 1.1.9
74
+ version: 1.1.13
66
75
  type: :runtime
67
76
  prerelease: false
68
77
  version_requirements: !ruby/object:Gem::Requirement
@@ -72,27 +81,27 @@ dependencies:
72
81
  version: '1.1'
73
82
  - - ">="
74
83
  - !ruby/object:Gem::Version
75
- version: 1.1.9
84
+ version: 1.1.13
76
85
  - !ruby/object:Gem::Dependency
77
86
  name: kettle-dev
78
87
  requirement: !ruby/object:Gem::Requirement
79
88
  requirements:
80
89
  - - "~>"
81
90
  - !ruby/object:Gem::Version
82
- version: '2.0'
91
+ version: '2.3'
83
92
  - - ">="
84
93
  - !ruby/object:Gem::Version
85
- version: 2.0.5
94
+ version: 2.3.0
86
95
  type: :development
87
96
  prerelease: false
88
97
  version_requirements: !ruby/object:Gem::Requirement
89
98
  requirements:
90
99
  - - "~>"
91
100
  - !ruby/object:Gem::Version
92
- version: '2.0'
101
+ version: '2.3'
93
102
  - - ">="
94
103
  - !ruby/object:Gem::Version
95
- version: 2.0.5
104
+ version: 2.3.0
96
105
  - !ruby/object:Gem::Dependency
97
106
  name: bundler-audit
98
107
  requirement: !ruby/object:Gem::Requirement
@@ -147,20 +156,20 @@ dependencies:
147
156
  requirements:
148
157
  - - "~>"
149
158
  - !ruby/object:Gem::Version
150
- version: '3.0'
159
+ version: '3.1'
151
160
  - - ">="
152
161
  - !ruby/object:Gem::Version
153
- version: 3.0.6
162
+ version: 3.1.4
154
163
  type: :development
155
164
  prerelease: false
156
165
  version_requirements: !ruby/object:Gem::Requirement
157
166
  requirements:
158
167
  - - "~>"
159
168
  - !ruby/object:Gem::Version
160
- version: '3.0'
169
+ version: '3.1'
161
170
  - - ">="
162
171
  - !ruby/object:Gem::Version
163
- version: 3.0.6
172
+ version: 3.1.4
164
173
  - !ruby/object:Gem::Dependency
165
174
  name: kettle-test
166
175
  requirement: !ruby/object:Gem::Requirement
@@ -170,7 +179,7 @@ dependencies:
170
179
  version: '2.0'
171
180
  - - ">="
172
181
  - !ruby/object:Gem::Version
173
- version: 2.0.1
182
+ version: 2.0.9
174
183
  type: :development
175
184
  prerelease: false
176
185
  version_requirements: !ruby/object:Gem::Requirement
@@ -180,7 +189,27 @@ dependencies:
180
189
  version: '2.0'
181
190
  - - ">="
182
191
  - !ruby/object:Gem::Version
183
- version: 2.0.1
192
+ version: 2.0.9
193
+ - !ruby/object:Gem::Dependency
194
+ name: turbo_tests2
195
+ requirement: !ruby/object:Gem::Requirement
196
+ requirements:
197
+ - - "~>"
198
+ - !ruby/object:Gem::Version
199
+ version: '3.1'
200
+ - - ">="
201
+ - !ruby/object:Gem::Version
202
+ version: 3.1.6
203
+ type: :development
204
+ prerelease: false
205
+ version_requirements: !ruby/object:Gem::Requirement
206
+ requirements:
207
+ - - "~>"
208
+ - !ruby/object:Gem::Version
209
+ version: '3.1'
210
+ - - ">="
211
+ - !ruby/object:Gem::Version
212
+ version: 3.1.6
184
213
  - !ruby/object:Gem::Dependency
185
214
  name: ruby-progressbar
186
215
  requirement: !ruby/object:Gem::Requirement
@@ -204,7 +233,7 @@ dependencies:
204
233
  version: '1.0'
205
234
  - - ">="
206
235
  - !ruby/object:Gem::Version
207
- version: 1.0.3
236
+ version: 1.0.4
208
237
  type: :development
209
238
  prerelease: false
210
239
  version_requirements: !ruby/object:Gem::Requirement
@@ -214,7 +243,7 @@ dependencies:
214
243
  version: '1.0'
215
244
  - - ">="
216
245
  - !ruby/object:Gem::Version
217
- version: 1.0.3
246
+ version: 1.0.4
218
247
  - !ruby/object:Gem::Dependency
219
248
  name: gitmoji-regex
220
249
  requirement: !ruby/object:Gem::Requirement
@@ -224,7 +253,7 @@ dependencies:
224
253
  version: '2.0'
225
254
  - - ">="
226
255
  - !ruby/object:Gem::Version
227
- version: 2.0.0
256
+ version: 2.0.4
228
257
  type: :development
229
258
  prerelease: false
230
259
  version_requirements: !ruby/object:Gem::Requirement
@@ -234,7 +263,7 @@ dependencies:
234
263
  version: '2.0'
235
264
  - - ">="
236
265
  - !ruby/object:Gem::Version
237
- version: 2.0.0
266
+ version: 2.0.4
238
267
  - !ruby/object:Gem::Dependency
239
268
  name: appraisal
240
269
  requirement: !ruby/object:Gem::Requirement
@@ -249,6 +278,20 @@ dependencies:
249
278
  - - "~>"
250
279
  - !ruby/object:Gem::Version
251
280
  version: '2.5'
281
+ - !ruby/object:Gem::Dependency
282
+ name: psych
283
+ requirement: !ruby/object:Gem::Requirement
284
+ requirements:
285
+ - - "<"
286
+ - !ruby/object:Gem::Version
287
+ version: '5.3'
288
+ type: :development
289
+ prerelease: false
290
+ version_requirements: !ruby/object:Gem::Requirement
291
+ requirements:
292
+ - - "<"
293
+ - !ruby/object:Gem::Version
294
+ version: '5.3'
252
295
  - !ruby/object:Gem::Dependency
253
296
  name: rdoc
254
297
  requirement: !ruby/object:Gem::Requirement
@@ -321,7 +364,7 @@ description: |2
321
364
  Email Condom for your Ruby Server.
322
365
  In Rails, Sinatra, et al, or simply the mail gem: Aids in development, testing, qa, and production troubleshooting of email issues without worrying that emails will get sent to actual live addresses.
323
366
  email:
324
- - peter.boling@gmail.com
367
+ - floss@galtzo.com
325
368
  executables: []
326
369
  extensions: []
327
370
  extra_rdoc_files:
@@ -341,6 +384,7 @@ files:
341
384
  - CONTRIBUTING.md
342
385
  - FUNDING.md
343
386
  - LICENSE.md
387
+ - MIT.md
344
388
  - README.md
345
389
  - RUBOCOP.md
346
390
  - SECURITY.md
@@ -364,10 +408,10 @@ licenses:
364
408
  - MIT
365
409
  metadata:
366
410
  homepage_uri: https://sanitize-email.galtzo.com
367
- source_code_uri: https://github.com/galtzo-floss/sanitize_email/tree/v2.0.11
368
- changelog_uri: https://github.com/galtzo-floss/sanitize_email/blob/v2.0.11/CHANGELOG.md
411
+ source_code_uri: https://github.com/galtzo-floss/sanitize_email/tree/v2.0.13
412
+ changelog_uri: https://github.com/galtzo-floss/sanitize_email/blob/v2.0.13/CHANGELOG.md
369
413
  bug_tracker_uri: https://github.com/galtzo-floss/sanitize_email/issues
370
- documentation_uri: https://www.rubydoc.info/gems/sanitize_email/2.0.11
414
+ documentation_uri: https://www.rubydoc.info/gems/sanitize_email/2.0.13
371
415
  funding_uri: https://github.com/sponsors/pboling
372
416
  wiki_uri: https://github.com/galtzo-floss/sanitize_email/wiki
373
417
  news_uri: https://www.railsbling.com/tags/sanitize_email
metadata.gz.sig CHANGED
Binary file