stone_checksums 1.0.0 → 1.0.1
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 +4 -4
- checksums.yaml.gz.sig +0 -0
- data/CHANGELOG.md +31 -7
- data/CODE_OF_CONDUCT.md +3 -4
- data/CONTRIBUTING.md +111 -48
- data/README.md +372 -281
- data/lib/gem_checksums/version.rb +7 -1
- data/lib/gem_checksums.rb +104 -50
- data/lib/stone_checksums/version.rb +11 -0
- data/lib/stone_checksums.rb +55 -1
- data/sig/gem_checksums.rbs +14 -0
- data/sig/stone_checksums.rbs +13 -0
- data.tar.gz.sig +0 -0
- metadata +63 -102
- metadata.gz.sig +0 -0
data/README.md
CHANGED
@@ -1,205 +1,234 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
[
|
4
|
-
[
|
5
|
-
[
|
6
|
-
[
|
7
|
-
[
|
8
|
-
[
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
[![CI Heads][🚎3-hd-wfi]][🚎3-hd-wf]
|
13
|
-
|
14
|
-
[
|
15
|
-
[![CI JRuby][🚎10-j-wfi]][🚎10-j-wf]
|
16
|
-
[![CI Supported][🚎6-s-wfi]][🚎6-s-wf]
|
17
|
-
[![CI Legacy][🚎4-lg-wfi]][🚎4-lg-wf]
|
18
|
-
[![CI Unsupported][🚎7-us-wfi]][🚎7-us-wf]
|
19
|
-
[![CI Ancient][🚎1-an-wfi]][🚎1-an-wf]
|
20
|
-
[![CI Hoary][🚎8-ho-wfi]][🚎8-ho-wf]
|
21
|
-
[![CI Test Coverage][🚎2-cov-wfi]][🚎2-cov-wf]
|
22
|
-
[![CI Style][🚎5-st-wfi]][🚎5-st-wf]
|
1
|
+
[![Galtzo FLOSS Logo by Aboling0, CC BY-SA 4.0][🖼️galtzo-i]][🖼️galtzo-discord] [![ruby-lang Logo, Yukihiro Matsumoto, Ruby Visual Identity Team, CC BY-SA 2.5][🖼️ruby-lang-i]][🖼️ruby-lang] [![stone_checksums Logo by Aboling0, CC BY-SA 4.0][🖼️stone_checksums-i]][🖼️stone_checksums]
|
2
|
+
|
3
|
+
[🖼️galtzo-i]: https://logos.galtzo.com/assets/images/galtzo-floss/avatar-192px.svg
|
4
|
+
[🖼️galtzo-discord]: 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/
|
7
|
+
[🖼️stone_checksums-i]: https://logos.galtzo.com/assets/images/galtzo-floss/stone_checksums/avatar-192px.svg
|
8
|
+
[🖼️stone_checksums]: https://github.com/galtzo-floss/stone_checksums
|
9
|
+
|
10
|
+
# 🍲 StoneChecksums - Generate SHA-256 and SHA-512 checksums of a RubyGem
|
11
|
+
|
12
|
+
[![Version][👽versioni]][👽version] [![License: MIT][📄license-img]][📄license-ref] [![Downloads Rank][👽dl-ranki]][👽dl-rank] [![Open Source Helpers][👽oss-helpi]][👽oss-help] [![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 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 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]
|
13
|
+
|
14
|
+
If ☝️ `ci_badges.map(&:color).detect { it != "green"}` [let me know][🖼️galtzo-discord], as I may have missed the [discord notification][🖼️galtzo-discord].
|
23
15
|
|
24
16
|
---
|
25
17
|
|
26
|
-
|
27
|
-
|
28
|
-
[![Buy me a coffee][🖇buyme-small-img]][🖇buyme]
|
29
|
-
[![Polar Shield][🖇polar-img]][🖇polar]
|
30
|
-
[![Donate to my FLOSS or refugee efforts at ko-fi.com][🖇kofi-img]][🖇kofi]
|
31
|
-
[![Donate to my FLOSS or refugee efforts using Patreon][🖇patreon-img]][🖇patreon]
|
18
|
+
OTOH, if `ci_badges.map(&:color).all? { it == "green"}` 👇️ send money so I can do more of this. FLOSS is now my full-time job.
|
19
|
+
|
20
|
+
[![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]
|
32
21
|
|
33
|
-
|
34
|
-
shipped as a RubyGem.
|
22
|
+
## 🌻 Synopsis
|
35
23
|
|
36
|
-
|
37
|
-
|
38
|
-
|
24
|
+
Generate SHA-256 and SHA-512 checksums of a rubygem library,
|
25
|
+
and commit them to your repository.
|
26
|
+
The SHA-256 will match the shown for each gem published to RubyGems.org.
|
39
27
|
|
40
|
-
```
|
41
|
-
rake
|
28
|
+
```console
|
29
|
+
# as a rake task:
|
30
|
+
bundle exec rake build:generate_checksums
|
31
|
+
# as a binstub:
|
32
|
+
bin/generate_checksums
|
42
33
|
```
|
43
34
|
|
44
|
-
Or giving the same result...
|
45
35
|
|
46
|
-
|
47
|
-
```shell
|
48
|
-
gem_checksums
|
49
|
-
```
|
36
|
+
## 💡 Info you can shake a stick at
|
50
37
|
|
51
|
-
|
38
|
+
### Federated DVCS
|
52
39
|
|
53
|
-
|
54
|
-
|
55
|
-
| Works with JRuby | [![JRuby 9.1 Compat][💎jruby-9.1i]][🚎10-j-wf] [![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-c-i]][🚎11-c-wf] [![JRuby HEAD Compat][💎jruby-headi]][🚎3-hd-wf] |
|
56
|
-
| Works with Truffle Ruby | [![Truffle Ruby 22.3 Compat][💎truby-22.3i]][🚎9-t-wf] [![Truffle Ruby 23.0 Compat][💎truby-23.0i]][🚎9-t-wf] [![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] |
|
57
|
-
| 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] |
|
58
|
-
| Works with MRI Ruby 2 | [![Ruby 2.2 Compat][💎ruby-2.2i]][🚎8-ho-wf] [![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] |
|
59
|
-
| Source | [![Source on GitLab.com][📜src-gl-img]][📜src-gl] [![Source on Github.com][📜src-gh-img]][📜src-gh] [![The best SHA: dQw4w9WgXcQ!][🧮kloc-img]][🧮kloc] |
|
60
|
-
| Documentation | [![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] |
|
61
|
-
| Compliance | [![License: MIT][📄license-img]][📄license-ref] [![📄ilo-declaration-img]][📄ilo-declaration] [![Security Policy][🔐security-img]][🔐security] [![CodeQL][🖐codeQL-img]][🖐codeQL] [![Contributor Covenant 2.1][🪇conduct-img]][🪇conduct] [![SemVer 2.0.0][📌semver-img]][📌semver] [![Keep-A-Changelog 1.0.0][📗keep-changelog-img]][📗keep-changelog] |
|
62
|
-
| Expert 1:1 Support | [![Get help from me on Upwork][👨🏼🏫expsup-upwork-img]][👨🏼🏫expsup-upwork] `or` [![Get help from me on Codementor][👨🏼🏫expsup-codementor-img]][👨🏼🏫expsup-codementor] |
|
63
|
-
| 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! |
|
64
|
-
| 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] |
|
65
|
-
| `...` 💖 | [![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] |
|
40
|
+
<details>
|
41
|
+
<summary>Find this repo on other forges (Coming soon!)</summary>
|
66
42
|
|
67
|
-
|
43
|
+
| Federated [DVCS][💎d-in-dvcs] Repository | Status | Issues | PRs | Wiki | CI | Discussions |
|
44
|
+
|-------------------------------------------------------|-------------------------------------------------------------------|---------------------------|--------------------------|---------------------------|--------------------------|------------------------------|
|
45
|
+
| 🧪 [galtzo-floss/stone_checksums on GitLab][📜src-gl] | The Truth | [💚][🤝gl-issues] | [💚][🤝gl-pulls] | [💚][📜wiki] | 🏀 Tiny Matrix | ➖ |
|
46
|
+
| 🧊 [galtzo-floss/stone_checksums on CodeBerg][📜src-cb] | An Ethical Mirror ([Donate][🤝cb-donate]) | [💚][🤝cb-issues] | [💚][🤝cb-pulls] | ➖ | ⭕️ No Matrix | ➖ |
|
47
|
+
| 🐙 [galtzo-floss/stone_checksums on GitHub][📜src-gh] | A Dirty Mirror | [💚][🤝gh-issues] | [💚][🤝gh-pulls] | ➖ | 💯 Full Matrix | [💚][gh-discussions] |
|
48
|
+
| 🎮️ [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] |
|
68
49
|
|
69
|
-
|
50
|
+
</details>
|
70
51
|
|
71
|
-
|
72
|
-
bundle add stone_checksums
|
73
|
-
```
|
52
|
+
[gh-discussions]: https://github.com/galtzo-floss/stone_checksums/discussions
|
74
53
|
|
75
|
-
|
54
|
+
### Enterprise Support [](https://tidelift.com/subscription/pkg/rubygems-stone_checksums?utm_source=rubygems-stone_checksums&utm_medium=referral&utm_campaign=readme)
|
76
55
|
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
56
|
+
<details>
|
57
|
+
<summary>Need enterprise-level guarantees?</summary>
|
58
|
+
|
59
|
+
[![Get help from me on Tidelift][🏙️entsup-tidelift-img]][🏙️entsup-tidelift]
|
60
|
+
|
61
|
+
- 💡Subscribe for support guarantees covering _all_ FLOSS dependencies
|
62
|
+
- 💡Tidelift is part of [Sonar][🏙️entsup-tidelift-sonar]
|
63
|
+
- 💡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
|
64
|
+
|
65
|
+
Alternatively:
|
66
|
+
|
67
|
+
- [![Live Chat on Discord][✉️discord-invite-img]][✉️discord-invite]
|
68
|
+
- [![Get help from me on Upwork][👨🏼🏫expsup-upwork-img]][👨🏼🏫expsup-upwork]
|
69
|
+
- [![Get help from me on Codementor][👨🏼🏫expsup-codementor-img]][👨🏼🏫expsup-codementor]
|
70
|
+
|
71
|
+
</details>
|
72
|
+
|
73
|
+
| Tokens to Remember | [![Gem name][⛳️name-img]][⛳️gem-name] [![Gem namespace][⛳️namespace-img]][⛳️gem-namespace] |
|
74
|
+
|-------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
|
75
|
+
| Works with JRuby | ![JRuby 9.1 Compat][💎jruby-9.1i] ![JRuby 9.2 Compat][💎jruby-9.2i] ![JRuby 9.3 Compat][💎jruby-9.3i] <br/> [![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] |
|
76
|
+
| Works with Truffle Ruby | ![Truffle Ruby 22.3 Compat][💎truby-22.3i] <br/> [![Truffle Ruby 23.0 Compat][💎truby-23.0i]][🚎9-t-wf] [![Truffle Ruby 23.1 Compat][💎truby-23.1i]][🚎9-t-wf] [![Truffle Ruby 24.1 Compat][💎truby-c-i]][🚎11-c-wf] |
|
77
|
+
| 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] |
|
78
|
+
| Works with MRI Ruby 2 | ![Ruby 2.0 Compat][💎ruby-2.0i] ![Ruby 2.1 Compat][💎ruby-2.1i] ![Ruby 2.2 Compat][💎ruby-2.2i] <br/> [![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] |
|
79
|
+
| Works with MRI Ruby 1 | ![Ruby 1.9 Compat][💎ruby-1.9i] |
|
80
|
+
| 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] |
|
81
|
+
| 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] [![Wiki][📜wiki-img]][📜wiki] |
|
82
|
+
| 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] |
|
83
|
+
| 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] |
|
84
|
+
| 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] |
|
85
|
+
| 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] |
|
86
|
+
| `...` 💖 | [![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] |
|
87
|
+
|
88
|
+
## ✨ Installation
|
89
|
+
|
90
|
+
Install the gem and add to the application's Gemfile by executing:
|
91
|
+
|
92
|
+
$ bundle add stone_checksums
|
83
93
|
|
84
94
|
If bundler is not being used to manage dependencies, install the gem by executing:
|
85
95
|
|
86
|
-
|
87
|
-
|
96
|
+
$ gem install stone_checksums
|
97
|
+
|
98
|
+
### 🔒 Secure Installation
|
99
|
+
|
100
|
+
<details>
|
101
|
+
<summary>For Medium or High Security Installations</summary>
|
102
|
+
|
103
|
+
This gem is cryptographically signed, and has verifiable [SHA-256 and SHA-512][💎SHA_checksums] checksums by
|
104
|
+
[stone_checksums][💎stone_checksums]. Be sure the gem you install hasn’t been tampered with
|
105
|
+
by following the instructions below.
|
106
|
+
|
107
|
+
Add my public key (if you haven’t already, expires 2045-04-29) as a trusted certificate:
|
108
|
+
|
109
|
+
```console
|
110
|
+
gem cert --add <(curl -Ls https://raw.github.com/galtzo-floss/certs/main/pboling.pem)
|
111
|
+
```
|
112
|
+
|
113
|
+
You only need to do that once. Then proceed to install with:
|
114
|
+
|
115
|
+
```console
|
116
|
+
gem install stone_checksums -P HighSecurity
|
88
117
|
```
|
89
118
|
|
90
|
-
|
119
|
+
The `HighSecurity` trust profile will verify signed gems, and not allow the installation of unsigned dependencies.
|
91
120
|
|
92
|
-
|
121
|
+
If you want to up your security game full-time:
|
93
122
|
|
94
|
-
```
|
95
|
-
|
96
|
-
gem_checksums
|
123
|
+
```console
|
124
|
+
bundle config set --global trust-policy MediumSecurity
|
97
125
|
```
|
98
126
|
|
99
|
-
|
127
|
+
`MediumSecurity` instead of `HighSecurity` is necessary if not all the gems you use are signed.
|
100
128
|
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
129
|
+
NOTE: Be prepared to track down certs for signed gems and add them the same way you added mine.
|
130
|
+
|
131
|
+
</details>
|
132
|
+
|
133
|
+
## ⚙️ Configuration
|
134
|
+
|
135
|
+
Configuration env vars:
|
136
|
+
- GEM_CHECKSUMS_CHECKSUMS_DIR: Where to write checksum files (default: checksums)
|
137
|
+
- GEM_CHECKSUMS_PACKAGE_DIR: Where to look for built gems (default: pkg)
|
138
|
+
- GEM_CHECKSUMS_GIT_DRY_RUN: When true, run a dry-run commit and clean up temporary files
|
139
|
+
- GEM_CHECKSUMS_ASSUME_YES: When true and Bundler < 2.7.0, proceed without interactive prompt (still requires SOURCE_DATE_EPOCH)
|
140
|
+
|
141
|
+
## 🔧 Basic Usage
|
142
|
+
|
143
|
+
### Generate Gem Checksums (SHA-256 and SHA-512)
|
144
|
+
|
145
|
+
This library helps you generate checksums for your built gem and commit them.
|
146
|
+
|
147
|
+
- Bundler >= 2.7.0: No SOURCE_DATE_EPOCH needed. Bundler now uses a constant timestamp internally, making builds reproducible by default.
|
148
|
+
- Bundler < 2.7.0: You must set SOURCE_DATE_EPOCH before building the gem to get deterministic checksums, or upgrade Bundler.
|
149
|
+
- If you still want to proceed on old Bundler non-interactively, set GEM_CHECKSUMS_ASSUME_YES=true (SOURCE_DATE_EPOCH is still required).
|
150
|
+
|
151
|
+
Usage via Rake (recommended):
|
152
|
+
|
153
|
+
```console
|
154
|
+
bundle exec rake build
|
155
|
+
bundle exec rake build:generate_checksums
|
110
156
|
```
|
111
157
|
|
112
|
-
|
158
|
+
Usage via CLI (equivalent):
|
113
159
|
|
114
|
-
```
|
115
|
-
|
116
|
-
rake build:generate_checksums
|
160
|
+
```console
|
161
|
+
bin/gem_checksums [pkg/your_gem-1.2.3.gem]
|
117
162
|
```
|
118
163
|
|
119
|
-
|
120
|
-
- does various checks to ensure the generated checksums will be valid
|
121
|
-
- does `git commit` the generated checksums
|
164
|
+
### Public API (YARD)
|
122
165
|
|
123
|
-
|
166
|
+
- Module StoneChecksums (primary namespace)
|
167
|
+
- ::install_tasks() -> void — loads Rake tasks (delegates to GemChecksums.install_tasks)
|
168
|
+
- ::generate(git_dry_run: Boolean = false) -> void — generate SHA-256/512 checksums and commit (delegates to GemChecksums.generate)
|
169
|
+
- Error < GemChecksums::Error — error class hierarchy is preserved
|
170
|
+
- Version::VERSION: String — current gem version
|
171
|
+
- Module GemChecksums (deprecated, backward-compatible namespace)
|
172
|
+
- ::install_tasks() -> void — identical behavior
|
173
|
+
- ::generate(git_dry_run: Boolean = false) -> void — identical behavior
|
174
|
+
- Error — base error class used internally
|
175
|
+
- Version::VERSION: String — same as StoneChecksums::Version::VERSION
|
124
176
|
|
125
|
-
|
177
|
+
See the generated YARD docs for full details: [Current release on RubyDoc.info][🚎yard-current].
|
126
178
|
|
127
|
-
|
128
|
-
- when `true` the `git commit` command will run with `--dry-run` flag
|
129
|
-
- when `true` the checksum files will be unstaged and deleted
|
130
|
-
- `GEM_CHECKSUMS_CHECKSUMS_DIR` default value is `checksums` (relative path)
|
131
|
-
- this directory will be created, relative to current working directory, if not present
|
132
|
-
- `GEM_CHECKSUMS_PACKAGE_DIR` default value is `pkg` (relative path)
|
133
|
-
- this directory will be searched for the latest gem package to generate checksums for
|
179
|
+
## 🦷 FLOSS Funding
|
134
180
|
|
135
|
-
|
181
|
+
While galtzo-floss tools are free software and will always be, the project would benefit immensely from some funding.
|
182
|
+
Raising a monthly budget of... "dollars" would make the project more sustainable.
|
136
183
|
|
137
|
-
|
138
|
-
|
184
|
+
We welcome both individual and corporate sponsors! We also offer a
|
185
|
+
wide array of funding channels to account for your preferences
|
186
|
+
(although currently [Open Collective][🖇osc] is our preferred funding platform).
|
139
187
|
|
140
|
-
|
188
|
+
**If you're working in a company that's making significant use of galtzo-floss tools we'd
|
189
|
+
appreciate it if you suggest to your company to become a galtzo-floss sponsor.**
|
141
190
|
|
142
|
-
|
191
|
+
You can support the development of galtzo-floss tools via
|
192
|
+
[GitHub Sponsors][🖇sponsor],
|
193
|
+
[Liberapay][⛳liberapay],
|
194
|
+
[PayPal][🖇paypal],
|
195
|
+
[Open Collective][🖇osc]
|
196
|
+
and [Tidelift][🏙️entsup-tidelift].
|
143
197
|
|
144
|
-
|
198
|
+
| 📍 NOTE |
|
199
|
+
|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
|
200
|
+
| 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. |
|
145
201
|
|
146
|
-
|
147
|
-
with notes for `zsh` and `bash` shells.
|
202
|
+
### Open Collective for Individuals
|
148
203
|
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
4. Run `git commit -am "🔖 Prepare release v<VERSION>"` to commit the changes
|
153
|
-
5. Run `git push` to trigger the final CI pipeline before release, & merge PRs
|
154
|
-
- NOTE: Remember to [check your project's CI][🧪build]!
|
155
|
-
6. Run `export GIT_TRUNK_BRANCH_NAME="$(git remote show origin | grep 'HEAD branch' | cut -d ' ' -f5)" && echo $GIT_TRUNK_BRANCH_NAME`
|
156
|
-
7. Run `git checkout $GIT_TRUNK_BRANCH_NAME`
|
157
|
-
8. Run `git pull origin $GIT_TRUNK_BRANCH_NAME` to ensure you will release the latest trunk code
|
158
|
-
9. Set `SOURCE_DATE_EPOCH` so `rake build` and `rake release` use same timestamp, and generate same checksums
|
159
|
-
- Run `export SOURCE_DATE_EPOCH=$EPOCHSECONDS && echo $SOURCE_DATE_EPOCH`
|
160
|
-
- If the echo above has no output, then it didn't work.
|
161
|
-
- Note that you'll need the `zsh/datetime` module, if running `zsh`.
|
162
|
-
- In `bash` you can use `date +%s` instead, i.e. `export SOURCE_DATE_EPOCH=$(date +%s) && echo $SOURCE_DATE_EPOCH`
|
163
|
-
10. Run `bundle exec rake build`
|
164
|
-
11. Run `gem_checksums` (from this gem, and added to path in .envrc,
|
165
|
-
more context [1][🔒️rubygems-checksums-pr] and [2][🔒️rubygems-guides-pr]) to create SHA-256 and SHA-512 checksums
|
166
|
-
- Checksums will be committed automatically by the script, but not pushed
|
167
|
-
12. Run `bundle exec rake release` which will create a git tag for the version,
|
168
|
-
push git commits and tags, and push the `.gem` file to [rubygems.org][💎rubygems]
|
204
|
+
<!-- OPENCOLLECTIVE-INDIVIDUALS:START -->
|
205
|
+
No backers yet. Be the first!
|
206
|
+
<!-- OPENCOLLECTIVE-INDIVIDUALS:END -->
|
169
207
|
|
170
|
-
[
|
171
|
-
[💎rubygems]: https://rubygems.org
|
172
|
-
[🔒️rubygems-security-guide]: https://guides.rubygems.org/security/#building-gems
|
173
|
-
[🔒️rubygems-checksums-pr]: https://github.com/rubygems/rubygems/pull/6022
|
174
|
-
[🔒️rubygems-guides-pr]: https://github.com/rubygems/guides/pull/325
|
208
|
+
Support us with a monthly donation and help us continue our activities. [[Become a backer](https://opencollective.com/galtzo-floss#backer)]
|
175
209
|
|
176
|
-
###
|
210
|
+
### Open Collective for Organizations
|
177
211
|
|
178
|
-
|
212
|
+
<!-- OPENCOLLECTIVE-ORGANIZATIONS:START -->
|
213
|
+
No sponsors yet. Be the first!
|
214
|
+
<!-- OPENCOLLECTIVE-ORGANIZATIONS:END -->
|
179
215
|
|
180
|
-
|
181
|
-
WARNING: Build time not provided via environment variable SOURCE_DATE_EPOCH.
|
182
|
-
To ensure consistent SHA-256 & SHA-512 checksums,
|
183
|
-
you must set this environment variable *before* building the gem.
|
216
|
+
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)]
|
184
217
|
|
185
|
-
|
218
|
+
### Another way to support open-source
|
186
219
|
|
187
|
-
How to
|
220
|
+
> How wonderful it is that nobody need wait a single moment before starting to improve the world.<br/>
|
221
|
+
>—Anne Frank
|
188
222
|
|
189
|
-
|
190
|
-
- export SOURCE_DATE_EPOCH=$EPOCHSECONDS && echo $SOURCE_DATE_EPOCH
|
191
|
-
- If the echo above has no output, then it didn't work.
|
192
|
-
- Note that you'll need the `zsh/datetime` module enabled.
|
223
|
+
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 — totaling 79 hours of FLOSS coding over just the past seven days, a pretty regular week for me. 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).
|
193
224
|
|
194
|
-
|
195
|
-
- set -x SOURCE_DATE_EPOCH (date +%s)
|
196
|
-
- echo $SOURCE_DATE_EPOCH
|
225
|
+
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`.
|
197
226
|
|
198
|
-
|
199
|
-
- export SOURCE_DATE_EPOCH=$(date +%s) && echo $SOURCE_DATE_EPOCH`
|
200
|
-
```
|
227
|
+
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.
|
201
228
|
|
202
|
-
|
229
|
+
**[Floss-Funding.dev][🖇floss-funding.dev]: 👉️ No network calls. 👉️ No tracking. 👉️ No oversight. 👉️ Minimal crypto hashing. 💡 Easily disabled nags**
|
230
|
+
|
231
|
+
[![Liberapay Goal Progress][⛳liberapay-img]][⛳liberapay] [![Donate on PayPal][🖇paypal-img]][🖇paypal] [![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]
|
203
232
|
|
204
233
|
## 🔐 Security
|
205
234
|
|
@@ -208,26 +237,29 @@ See [SECURITY.md][🔐security].
|
|
208
237
|
## 🤝 Contributing
|
209
238
|
|
210
239
|
If you need some ideas of where to help, you could work on adding more code coverage,
|
211
|
-
or if it is already 💯 (see [below](#code-coverage)) check
|
212
|
-
or check [issues][🤝issues], or [PRs][🤝pulls],
|
240
|
+
or if it is already 💯 (see [below](#code-coverage)) check [reek](REEK), [issues][🤝gh-issues], or [PRs][🤝gh-pulls],
|
213
241
|
or use the gem and think about how it could be better.
|
214
242
|
|
215
243
|
We [![Keep A Changelog][📗keep-changelog-img]][📗keep-changelog] so if you make changes, remember to update it.
|
216
244
|
|
217
245
|
See [CONTRIBUTING.md][🤝contributing] for more detailed instructions.
|
218
246
|
|
219
|
-
###
|
247
|
+
### 🚀 Release Instructions
|
220
248
|
|
221
|
-
|
249
|
+
See [CONTRIBUTING.md][🤝contributing].
|
222
250
|
|
223
251
|
### Code Coverage
|
224
252
|
|
225
|
-
[![Coverage Graph][🔑codecov-g
|
253
|
+
[![Coverage Graph][🔑codecov-g]][🔑codecov]
|
254
|
+
|
255
|
+
[![Coveralls Test Coverage][🔑coveralls-img]][🔑coveralls]
|
256
|
+
|
257
|
+
[![QLTY Test Coverage][🔑qlty-covi]][🔑qlty-cov]
|
226
258
|
|
227
259
|
### 🪇 Code of Conduct
|
228
260
|
|
229
|
-
Everyone interacting
|
230
|
-
chat rooms and mailing lists
|
261
|
+
Everyone interacting with this project's codebases, issue trackers,
|
262
|
+
chat rooms and mailing lists agrees to follow the [![Contributor Covenant 2.1][🪇conduct-img]][🪇conduct].
|
231
263
|
|
232
264
|
## 🌈 Contributors
|
233
265
|
|
@@ -235,18 +267,21 @@ chat rooms and mailing lists is expected to follow the [![Contributor Covenant 2
|
|
235
267
|
|
236
268
|
Made with [contributors-img][🖐contrib-rocks].
|
237
269
|
|
238
|
-
Also see GitLab Contributors: [https://gitlab.com/
|
270
|
+
Also see GitLab Contributors: [https://gitlab.com/galtzo-floss/stone_checksums/-/graphs/main][🚎contributors-gl]
|
239
271
|
|
240
|
-
|
272
|
+
<details>
|
273
|
+
<summary>⭐️ Star History</summary>
|
241
274
|
|
242
|
-
<a href="https://star-history.com/#
|
275
|
+
<a href="https://star-history.com/#galtzo-floss/stone_checksums&Date">
|
243
276
|
<picture>
|
244
|
-
<source media="(prefers-color-scheme: dark)" srcset="https://api.star-history.com/svg?repos=
|
245
|
-
<source media="(prefers-color-scheme: light)" srcset="https://api.star-history.com/svg?repos=
|
246
|
-
<img alt="Star History Chart" src="https://api.star-history.com/svg?repos=
|
277
|
+
<source media="(prefers-color-scheme: dark)" srcset="https://api.star-history.com/svg?repos=galtzo-floss/stone_checksums&type=Date&theme=dark" />
|
278
|
+
<source media="(prefers-color-scheme: light)" srcset="https://api.star-history.com/svg?repos=galtzo-floss/stone_checksums&type=Date" />
|
279
|
+
<img alt="Star History Chart" src="https://api.star-history.com/svg?repos=galtzo-floss/stone_checksums&type=Date" />
|
247
280
|
</picture>
|
248
281
|
</a>
|
249
282
|
|
283
|
+
</details>
|
284
|
+
|
250
285
|
## 📌 Versioning
|
251
286
|
|
252
287
|
This Library adheres to [![Semantic Versioning 2.0.0][📌semver-img]][📌semver].
|
@@ -255,34 +290,35 @@ Specifically, if a minor or patch version is released that breaks backward compa
|
|
255
290
|
a new version should be immediately released that restores compatibility.
|
256
291
|
Breaking changes to the public API will only be introduced with new major versions.
|
257
292
|
|
258
|
-
|
293
|
+
> dropping support for a platform is both obviously and objectively a breaking change <br/>
|
294
|
+
>—Jordan Harband ([@ljharb](https://github.com/ljharb), maintainer of SemVer) [in SemVer issue 716][📌semver-breaking]
|
259
295
|
|
260
|
-
|
296
|
+
I understand that policy doesn't work universally ("exceptions to every rule!"),
|
297
|
+
but it is the policy here.
|
298
|
+
As such, in many cases it is good to specify a dependency on this library using
|
299
|
+
the [Pessimistic Version Constraint][📌pvc] with two digits of precision.
|
261
300
|
|
262
|
-
|
263
|
-
|
264
|
-
|
301
|
+
For example:
|
302
|
+
|
303
|
+
```ruby
|
304
|
+
spec.add_dependency("stone_checksums", "~> 1.0")
|
305
|
+
```
|
265
306
|
|
266
|
-
>
|
307
|
+
<details>
|
308
|
+
<summary>📌 Is "Platform Support" part of the public API? More details inside.</summary>
|
267
309
|
|
268
|
-
|
310
|
+
SemVer should, IMO, but doesn't explicitly, say that dropping support for specific Platforms
|
311
|
+
is a *breaking change* to an API.
|
312
|
+
It is obvious to many, but not all, and since the spec is silent, the bike shedding is endless.
|
269
313
|
|
270
314
|
To get a better understanding of how SemVer is intended to work over a project's lifetime,
|
271
315
|
read this article from the creator of SemVer:
|
272
316
|
|
273
317
|
- ["Major Version Numbers are Not Sacred"][📌major-versions-not-sacred]
|
274
318
|
|
275
|
-
|
276
|
-
you can (and should) specify a dependency on these libraries using
|
277
|
-
the [Pessimistic Version Constraint][📌pvc] with two digits of precision.
|
278
|
-
|
279
|
-
For example:
|
280
|
-
|
281
|
-
```ruby
|
282
|
-
spec.add_dependency("gem_checksums", "~> 1.1")
|
283
|
-
```
|
319
|
+
</details>
|
284
320
|
|
285
|
-
See [CHANGELOG.md][📌changelog] for list of releases.
|
321
|
+
See [CHANGELOG.md][📌changelog] for a list of releases.
|
286
322
|
|
287
323
|
## 📄 License
|
288
324
|
|
@@ -292,120 +328,163 @@ See [LICENSE.txt][📄license] for the official [Copyright Notice][📄copyright
|
|
292
328
|
|
293
329
|
### © Copyright
|
294
330
|
|
295
|
-
<
|
296
|
-
|
297
|
-
|
298
|
-
|
299
|
-
|
300
|
-
|
301
|
-
|
302
|
-
|
303
|
-
</
|
331
|
+
<ul>
|
332
|
+
<li>
|
333
|
+
Copyright (c) 2023, 2025 Peter H. Boling, of
|
334
|
+
<a href="https://discord.gg/3qme4XHNKN">
|
335
|
+
Galtzo.com
|
336
|
+
<picture>
|
337
|
+
<img src="https://logos.galtzo.com/assets/images/galtzo-floss/avatar-128px-blank.svg" alt="Galtzo.com Logo (Wordless) by Aboling0, CC BY-SA 4.0" width="24">
|
338
|
+
</picture>
|
339
|
+
</a>, and stone_checksums contributors.
|
340
|
+
</li>
|
341
|
+
</ul>
|
342
|
+
|
343
|
+
## 🤑 A request for help
|
344
|
+
|
345
|
+
Maintainers have teeth, and need to pay their dentists.
|
346
|
+
After getting laid off in an RIF in March, and filled with many dozens of rejections,
|
347
|
+
I'm now spending ~80 hours a week building open source tools.
|
348
|
+
I'm hoping to be able to pay for my kids' health insurance this month,
|
349
|
+
so if you value the work I am doing, I need your support.
|
350
|
+
Please consider sponsoring me or the project.
|
304
351
|
|
305
|
-
|
352
|
+
[![Sponsor galtzo-floss/stone_checksums 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-img] 💌 [![Donate on PayPal][🖇paypal-bottom-img]][🖇paypal-img]
|
306
353
|
|
307
|
-
|
308
|
-
so perhaps you'll indulge me for another 20 seconds.
|
309
|
-
I maintain many dozens of gems, including this one,
|
310
|
-
because I want Ruby to be a great place for people to solve problems, big and small.
|
311
|
-
Please consider supporting my efforts via the giant yellow link below,
|
312
|
-
or one of the others at the head of this README.
|
354
|
+
To say "thanks for maintaining such a great tool" 👇️ Join the Discord or ☝️ send money.
|
313
355
|
|
314
|
-
|
356
|
+
To join the community or get help 👇️ Join the Discord.
|
357
|
+
|
358
|
+
[![Live Chat on Discord][✉️discord-invite-img]][✉️discord-invite]
|
359
|
+
|
360
|
+
### Please give the project a star ⭐ ♥.
|
361
|
+
|
362
|
+
Thanks for RTFM. ☺️
|
363
|
+
|
364
|
+
[⛳liberapay-img]: https://img.shields.io/liberapay/goal/pboling.svg?logo=liberapay&color=a51611
|
365
|
+
[⛳liberapay-bottom-img]: https://img.shields.io/liberapay/goal/pboling.svg?style=for-the-badge&logo=liberapay&color=a51611
|
366
|
+
[⛳liberapay]: https://liberapay.com/pboling/donate
|
367
|
+
[🖇osc-all-img]: https://img.shields.io/opencollective/all/galtzo-floss
|
368
|
+
[🖇osc-sponsors-img]: https://img.shields.io/opencollective/sponsors/galtzo-floss
|
369
|
+
[🖇osc-backers-img]: https://img.shields.io/opencollective/backers/galtzo-floss
|
370
|
+
[🖇osc-all-bottom-img]: https://img.shields.io/opencollective/all/galtzo-floss?style=for-the-badge
|
371
|
+
[🖇osc-sponsors-bottom-img]: https://img.shields.io/opencollective/sponsors/galtzo-floss?style=for-the-badge
|
372
|
+
[🖇osc-backers-bottom-img]: https://img.shields.io/opencollective/backers/galtzo-floss?style=for-the-badge
|
373
|
+
[🖇osc]: https://opencollective.com/galtzo-floss
|
374
|
+
[🖇sponsor-img]: https://img.shields.io/badge/Sponsor_Me!-pboling.svg?style=social&logo=github
|
375
|
+
[🖇sponsor-bottom-img]: https://img.shields.io/badge/Sponsor_Me!-pboling-blue?style=for-the-badge&logo=github
|
376
|
+
[🖇sponsor]: https://github.com/sponsors/pboling
|
377
|
+
[🖇polar-img]: https://img.shields.io/badge/polar-donate-a51611.svg
|
378
|
+
[🖇polar]: https://polar.sh/pboling
|
379
|
+
[🖇kofi-img]: https://img.shields.io/badge/ko--fi-✓-a51611.svg
|
380
|
+
[🖇kofi]: https://ko-fi.com/O5O86SNP4
|
381
|
+
[🖇patreon-img]: https://img.shields.io/badge/patreon-donate-a51611.svg
|
382
|
+
[🖇patreon]: https://patreon.com/galtzo
|
383
|
+
[🖇buyme-small-img]: https://img.shields.io/badge/buy_me_a_coffee-✓-a51611.svg?style=flat
|
384
|
+
[🖇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
|
385
|
+
[🖇buyme]: https://www.buymeacoffee.com/pboling
|
386
|
+
[🖇paypal-img]: https://img.shields.io/badge/donate-paypal-a51611.svg?style=flat&logo=paypal
|
387
|
+
[🖇paypal-bottom-img]: https://img.shields.io/badge/donate-paypal-a51611.svg?style=for-the-badge&logo=paypal&color=0A0A0A
|
388
|
+
[🖇paypal]: https://www.paypal.com/paypalme/peterboling
|
389
|
+
[🖇floss-funding.dev]: https://floss-funding.dev
|
390
|
+
[🖇floss-funding-gem]: https://github.com/galtzo-floss/floss_funding
|
391
|
+
[✉️discord-invite]: https://discord.gg/3qme4XHNKN
|
392
|
+
[✉️discord-invite-img]: https://img.shields.io/discord/1373797679469170758?style=for-the-badge
|
315
393
|
|
316
394
|
[✇bundle-group-pattern]: https://gist.github.com/pboling/4564780
|
317
|
-
[⛳️gem-namespace]: https://github.com/
|
318
|
-
[⛳️namespace-img]: https://img.shields.io/badge/namespace-
|
395
|
+
[⛳️gem-namespace]: https://github.com/galtzo-floss/stone_checksums
|
396
|
+
[⛳️namespace-img]: https://img.shields.io/badge/namespace-StoneChecksums-3C2D2D.svg?style=square&logo=ruby&logoColor=white
|
319
397
|
[⛳️gem-name]: https://rubygems.org/gems/stone_checksums
|
320
|
-
[⛳️name-img]: https://img.shields.io/badge/name-stone__checksums-
|
321
|
-
[🚂
|
322
|
-
[🚂
|
323
|
-
[🚂
|
324
|
-
[🚂
|
398
|
+
[⛳️name-img]: https://img.shields.io/badge/name-stone__checksums-3C2D2D.svg?style=square&logo=rubygems&logoColor=red
|
399
|
+
[🚂maint-blog]: http://www.railsbling.com/tags/stone_checksums
|
400
|
+
[🚂maint-blog-img]: https://img.shields.io/badge/blog-railsbling-0093D0.svg?style=for-the-badge&logo=rubyonrails&logoColor=orange
|
401
|
+
[🚂maint-contact]: http://www.railsbling.com/contact
|
402
|
+
[🚂maint-contact-img]: https://img.shields.io/badge/Contact-Maintainer-0093D0.svg?style=flat&logo=rubyonrails&logoColor=red
|
325
403
|
[💖🖇linkedin]: http://www.linkedin.com/in/peterboling
|
326
404
|
[💖🖇linkedin-img]: https://img.shields.io/badge/PeterBoling-LinkedIn-0B66C2?style=flat&logo=newjapanprowrestling
|
327
|
-
[💖✌️wellfound]: https://
|
405
|
+
[💖✌️wellfound]: https://wellfound.com/u/peter-boling/u/peter-boling
|
328
406
|
[💖✌️wellfound-img]: https://img.shields.io/badge/peter--boling-orange?style=flat&logo=wellfound
|
329
407
|
[💖💲crunchbase]: https://www.crunchbase.com/person/peter-boling
|
330
408
|
[💖💲crunchbase-img]: https://img.shields.io/badge/peter--boling-purple?style=flat&logo=crunchbase
|
331
409
|
[💖🐘ruby-mast]: https://ruby.social/@galtzo
|
332
410
|
[💖🐘ruby-mast-img]: https://img.shields.io/mastodon/follow/109447111526622197?domain=https%3A%2F%2Fruby.social&style=flat&logo=mastodon&label=Ruby%20%40galtzo
|
333
|
-
[💖🦋bluesky]: https://galtzo.
|
334
|
-
[💖🦋bluesky-img]: https://img.shields.io/badge/@galtzo.
|
411
|
+
[💖🦋bluesky]: https://bsky.app/profile/galtzo.com
|
412
|
+
[💖🦋bluesky-img]: https://img.shields.io/badge/@galtzo.com-0285FF?style=flat&logo=bluesky&logoColor=white
|
335
413
|
[💖🌳linktree]: https://linktr.ee/galtzo
|
336
414
|
[💖🌳linktree-img]: https://img.shields.io/badge/galtzo-purple?style=flat&logo=linktree
|
337
415
|
[💖💁🏼♂️devto]: https://dev.to/galtzo
|
338
416
|
[💖💁🏼♂️devto-img]: https://img.shields.io/badge/dev.to-0A0A0A?style=flat&logo=devdotto&logoColor=white
|
339
417
|
[💖💁🏼♂️aboutme]: https://about.me/peter.boling
|
340
418
|
[💖💁🏼♂️aboutme-img]: https://img.shields.io/badge/about.me-0A0A0A?style=flat&logo=aboutme&logoColor=white
|
419
|
+
[💖🧊berg]: https://codeberg.org/pboling
|
420
|
+
[💖🐙hub]: https://github.org/pboling
|
421
|
+
[💖🛖hut]: https://sr.ht/~galtzo/
|
422
|
+
[💖🧪lab]: https://gitlab.com/pboling
|
341
423
|
[👨🏼🏫expsup-upwork]: https://www.upwork.com/freelancers/~014942e9b056abdf86?mp_source=share
|
342
424
|
[👨🏼🏫expsup-upwork-img]: https://img.shields.io/badge/UpWork-13544E?style=for-the-badge&logo=Upwork&logoColor=white
|
343
425
|
[👨🏼🏫expsup-codementor]: https://www.codementor.io/peterboling?utm_source=github&utm_medium=button&utm_term=peterboling&utm_campaign=github
|
344
426
|
[👨🏼🏫expsup-codementor-img]: https://img.shields.io/badge/CodeMentor-Get_Help-1abc9c?style=for-the-badge&logo=CodeMentor&logoColor=white
|
345
|
-
[🏙️entsup-tidelift]: https://tidelift.com/subscription
|
427
|
+
[🏙️entsup-tidelift]: https://tidelift.com/subscription/pkg/rubygems-stone_checksums?utm_source=rubygems-stone_checksums&utm_medium=referral&utm_campaign=readme
|
346
428
|
[🏙️entsup-tidelift-img]: https://img.shields.io/badge/Tidelift_and_Sonar-Enterprise_Support-FD3456?style=for-the-badge&logo=sonar&logoColor=white
|
347
429
|
[🏙️entsup-tidelift-sonar]: https://blog.tidelift.com/tidelift-joins-sonar
|
348
430
|
[💁🏼♂️peterboling]: http://www.peterboling.com
|
349
431
|
[🚂railsbling]: http://www.railsbling.com
|
350
432
|
[📜src-gl-img]: https://img.shields.io/badge/GitLab-FBA326?style=for-the-badge&logo=Gitlab&logoColor=orange
|
351
|
-
[📜src-gl]: https://gitlab.com/
|
433
|
+
[📜src-gl]: https://gitlab.com/galtzo-floss/stone_checksums/
|
434
|
+
[📜src-cb-img]: https://img.shields.io/badge/CodeBerg-4893CC?style=for-the-badge&logo=CodeBerg&logoColor=blue
|
435
|
+
[📜src-cb]: https://codeberg.org/galtzo-floss/stone_checksums
|
352
436
|
[📜src-gh-img]: https://img.shields.io/badge/GitHub-238636?style=for-the-badge&logo=Github&logoColor=green
|
353
|
-
[📜src-gh]: https://github.com/
|
437
|
+
[📜src-gh]: https://github.com/galtzo-floss/stone_checksums
|
354
438
|
[📜docs-cr-rd-img]: https://img.shields.io/badge/RubyDoc-Current_Release-943CD2?style=for-the-badge&logo=readthedocs&logoColor=white
|
355
|
-
[📜docs-head-rd-img]: https://img.shields.io/badge/
|
356
|
-
[📜wiki]: https://gitlab.com/
|
439
|
+
[📜docs-head-rd-img]: https://img.shields.io/badge/YARD_on_Galtzo.com-HEAD-943CD2?style=for-the-badge&logo=readthedocs&logoColor=white
|
440
|
+
[📜wiki]: https://gitlab.com/galtzo-floss/stone_checksums/-/wikis/home
|
357
441
|
[📜wiki-img]: https://img.shields.io/badge/wiki-examples-943CD2.svg?style=for-the-badge&logo=Wiki&logoColor=white
|
358
442
|
[👽dl-rank]: https://rubygems.org/gems/stone_checksums
|
359
443
|
[👽dl-ranki]: https://img.shields.io/gem/rd/stone_checksums.svg
|
360
|
-
[👽oss-help]: https://www.codetriage.com/
|
361
|
-
[👽oss-helpi]: https://www.codetriage.com/
|
444
|
+
[👽oss-help]: https://www.codetriage.com/galtzo-floss/stone_checksums
|
445
|
+
[👽oss-helpi]: https://www.codetriage.com/galtzo-floss/stone_checksums/badges/users.svg
|
362
446
|
[👽version]: https://rubygems.org/gems/stone_checksums
|
363
447
|
[👽versioni]: https://img.shields.io/gem/v/stone_checksums.svg
|
364
|
-
[🔑
|
365
|
-
[🔑
|
366
|
-
[🔑
|
367
|
-
[🔑
|
368
|
-
[🔑codecov]: https://codecov.io/gh/
|
369
|
-
[🔑codecovi
|
370
|
-
[🔑coveralls]: https://coveralls.io/github/
|
371
|
-
[🔑coveralls-img]: https://coveralls.io/repos/github/
|
372
|
-
[
|
373
|
-
[
|
374
|
-
[
|
375
|
-
[
|
376
|
-
[🚎
|
377
|
-
[🚎
|
378
|
-
[🚎
|
379
|
-
[🚎
|
380
|
-
[🚎
|
381
|
-
[🚎
|
382
|
-
[🚎
|
383
|
-
[🚎
|
384
|
-
[🚎
|
385
|
-
[🚎
|
386
|
-
[🚎
|
387
|
-
[🚎
|
388
|
-
[🚎
|
389
|
-
[🚎
|
390
|
-
[🚎
|
391
|
-
[🚎
|
392
|
-
[🚎
|
393
|
-
[🚎
|
394
|
-
[🚎
|
395
|
-
[🚎
|
396
|
-
[🚎
|
397
|
-
[🚎
|
398
|
-
[
|
399
|
-
[
|
400
|
-
[
|
401
|
-
[
|
402
|
-
[
|
403
|
-
[
|
404
|
-
[🖇kofi-img]: https://img.shields.io/badge/buy_me_coffee-donate-yellow.svg
|
405
|
-
[🖇kofi]: https://ko-fi.com/O5O86SNP4
|
406
|
-
[🖇patreon-img]: https://img.shields.io/badge/patreon-donate-yellow.svg
|
407
|
-
[🖇patreon]: https://patreon.com/galtzo
|
408
|
-
[💎ruby-2.2i]: https://img.shields.io/badge/Ruby-2.2-DF00CA?style=for-the-badge&logo=ruby&logoColor=white
|
448
|
+
[🔑qlty-mnt]: https://qlty.sh/gh/galtzo-floss/projects/stone_checksums
|
449
|
+
[🔑qlty-mnti]: https://qlty.sh/gh/galtzo-floss/projects/stone_checksums/maintainability.svg
|
450
|
+
[🔑qlty-cov]: https://qlty.sh/gh/galtzo-floss/projects/stone_checksums/metrics/code?sort=coverageRating
|
451
|
+
[🔑qlty-covi]: https://qlty.sh/gh/galtzo-floss/projects/stone_checksums/coverage.svg
|
452
|
+
[🔑codecov]: https://codecov.io/gh/galtzo-floss/stone_checksums
|
453
|
+
[🔑codecovi]: https://codecov.io/gh/galtzo-floss/stone_checksums/graph/badge.svg
|
454
|
+
[🔑coveralls]: https://coveralls.io/github/galtzo-floss/stone_checksums?branch=main
|
455
|
+
[🔑coveralls-img]: https://coveralls.io/repos/github/galtzo-floss/stone_checksums/badge.svg?branch=main
|
456
|
+
[🖐codeQL]: https://github.com/galtzo-floss/stone_checksums/security/code-scanning
|
457
|
+
[🖐codeQL-img]: https://github.com/galtzo-floss/stone_checksums/actions/workflows/codeql-analysis.yml/badge.svg
|
458
|
+
[🚎1-an-wf]: https://github.com/galtzo-floss/stone_checksums/actions/workflows/ancient.yml
|
459
|
+
[🚎1-an-wfi]: https://github.com/galtzo-floss/stone_checksums/actions/workflows/ancient.yml/badge.svg
|
460
|
+
[🚎2-cov-wf]: https://github.com/galtzo-floss/stone_checksums/actions/workflows/coverage.yml
|
461
|
+
[🚎2-cov-wfi]: https://github.com/galtzo-floss/stone_checksums/actions/workflows/coverage.yml/badge.svg
|
462
|
+
[🚎3-hd-wf]: https://github.com/galtzo-floss/stone_checksums/actions/workflows/heads.yml
|
463
|
+
[🚎3-hd-wfi]: https://github.com/galtzo-floss/stone_checksums/actions/workflows/heads.yml/badge.svg
|
464
|
+
[🚎4-lg-wf]: https://github.com/galtzo-floss/stone_checksums/actions/workflows/legacy.yml
|
465
|
+
[🚎4-lg-wfi]: https://github.com/galtzo-floss/stone_checksums/actions/workflows/legacy.yml/badge.svg
|
466
|
+
[🚎5-st-wf]: https://github.com/galtzo-floss/stone_checksums/actions/workflows/style.yml
|
467
|
+
[🚎5-st-wfi]: https://github.com/galtzo-floss/stone_checksums/actions/workflows/style.yml/badge.svg
|
468
|
+
[🚎6-s-wf]: https://github.com/galtzo-floss/stone_checksums/actions/workflows/supported.yml
|
469
|
+
[🚎6-s-wfi]: https://github.com/galtzo-floss/stone_checksums/actions/workflows/supported.yml/badge.svg
|
470
|
+
[🚎7-us-wf]: https://github.com/galtzo-floss/stone_checksums/actions/workflows/unsupported.yml
|
471
|
+
[🚎7-us-wfi]: https://github.com/galtzo-floss/stone_checksums/actions/workflows/unsupported.yml/badge.svg
|
472
|
+
[🚎8-ho-wf]: https://github.com/galtzo-floss/stone_checksums/actions/workflows/hoary.yml
|
473
|
+
[🚎8-ho-wfi]: https://github.com/galtzo-floss/stone_checksums/actions/workflows/hoary.yml/badge.svg
|
474
|
+
[🚎9-t-wf]: https://github.com/galtzo-floss/stone_checksums/actions/workflows/truffle.yml
|
475
|
+
[🚎9-t-wfi]: https://github.com/galtzo-floss/stone_checksums/actions/workflows/truffle.yml/badge.svg
|
476
|
+
[🚎10-j-wf]: https://github.com/galtzo-floss/stone_checksums/actions/workflows/jruby.yml
|
477
|
+
[🚎10-j-wfi]: https://github.com/galtzo-floss/stone_checksums/actions/workflows/jruby.yml/badge.svg
|
478
|
+
[🚎11-c-wf]: https://github.com/galtzo-floss/stone_checksums/actions/workflows/current.yml
|
479
|
+
[🚎11-c-wfi]: https://github.com/galtzo-floss/stone_checksums/actions/workflows/current.yml/badge.svg
|
480
|
+
[🚎13-🔒️-wf]: https://github.com/galtzo-floss/stone_checksums/actions/workflows/locked_deps.yml
|
481
|
+
[🚎13-🔒️-wfi]: https://github.com/galtzo-floss/stone_checksums/actions/workflows/locked_deps.yml/badge.svg
|
482
|
+
[🚎14-🔓️-wf]: https://github.com/galtzo-floss/stone_checksums/actions/workflows/unlocked_deps.yml
|
483
|
+
[🚎14-🔓️-wfi]: https://github.com/galtzo-floss/stone_checksums/actions/workflows/unlocked_deps.yml/badge.svg
|
484
|
+
[💎ruby-1.9i]: https://img.shields.io/badge/Ruby-1.9_(%F0%9F%9A%ABCI)-AABBCC?style=for-the-badge&logo=ruby&logoColor=white
|
485
|
+
[💎ruby-2.0i]: https://img.shields.io/badge/Ruby-2.0_(%F0%9F%9A%ABCI)-AABBCC?style=for-the-badge&logo=ruby&logoColor=white
|
486
|
+
[💎ruby-2.1i]: https://img.shields.io/badge/Ruby-2.1_(%F0%9F%9A%ABCI)-AABBCC?style=for-the-badge&logo=ruby&logoColor=white
|
487
|
+
[💎ruby-2.2i]: https://img.shields.io/badge/Ruby-2.2_(%F0%9F%9A%ABCI)-AABBCC?style=for-the-badge&logo=ruby&logoColor=white
|
409
488
|
[💎ruby-2.3i]: https://img.shields.io/badge/Ruby-2.3-DF00CA?style=for-the-badge&logo=ruby&logoColor=white
|
410
489
|
[💎ruby-2.4i]: https://img.shields.io/badge/Ruby-2.4-DF00CA?style=for-the-badge&logo=ruby&logoColor=white
|
411
490
|
[💎ruby-2.5i]: https://img.shields.io/badge/Ruby-2.5-DF00CA?style=for-the-badge&logo=ruby&logoColor=white
|
@@ -417,46 +496,58 @@ or one of the others at the head of this README.
|
|
417
496
|
[💎ruby-3.3i]: https://img.shields.io/badge/Ruby-3.3-CC342D?style=for-the-badge&logo=ruby&logoColor=white
|
418
497
|
[💎ruby-c-i]: https://img.shields.io/badge/Ruby-current-CC342D?style=for-the-badge&logo=ruby&logoColor=green
|
419
498
|
[💎ruby-headi]: https://img.shields.io/badge/Ruby-HEAD-CC342D?style=for-the-badge&logo=ruby&logoColor=blue
|
420
|
-
[💎truby-22.3i]: https://img.shields.io/badge/Truffle_Ruby-22.
|
499
|
+
[💎truby-22.3i]: https://img.shields.io/badge/Truffle_Ruby-22.3_(%F0%9F%9A%ABCI)-AABBCC?style=for-the-badge&logo=ruby&logoColor=pink
|
421
500
|
[💎truby-23.0i]: https://img.shields.io/badge/Truffle_Ruby-23.0-34BCB1?style=for-the-badge&logo=ruby&logoColor=pink
|
422
501
|
[💎truby-23.1i]: https://img.shields.io/badge/Truffle_Ruby-23.1-34BCB1?style=for-the-badge&logo=ruby&logoColor=pink
|
423
502
|
[💎truby-c-i]: https://img.shields.io/badge/Truffle_Ruby-current-34BCB1?style=for-the-badge&logo=ruby&logoColor=green
|
424
503
|
[💎truby-headi]: https://img.shields.io/badge/Truffle_Ruby-HEAD-34BCB1?style=for-the-badge&logo=ruby&logoColor=blue
|
425
|
-
[💎jruby-9.1i]: https://img.shields.io/badge/JRuby-9.
|
426
|
-
[💎jruby-9.2i]: https://img.shields.io/badge/JRuby-9.
|
427
|
-
[💎jruby-9.3i]: https://img.shields.io/badge/JRuby-9.
|
504
|
+
[💎jruby-9.1i]: https://img.shields.io/badge/JRuby-9.1_(%F0%9F%9A%ABCI)-AABBCC?style=for-the-badge&logo=ruby&logoColor=red
|
505
|
+
[💎jruby-9.2i]: https://img.shields.io/badge/JRuby-9.2_(%F0%9F%9A%ABCI)-AABBCC?style=for-the-badge&logo=ruby&logoColor=red
|
506
|
+
[💎jruby-9.3i]: https://img.shields.io/badge/JRuby-9.3_(%F0%9F%9A%ABCI)-AABBCC?style=for-the-badge&logo=ruby&logoColor=red
|
507
|
+
[💎jruby-9.4i]: https://img.shields.io/badge/JRuby-9.4-FBE742?style=for-the-badge&logo=ruby&logoColor=red
|
428
508
|
[💎jruby-c-i]: https://img.shields.io/badge/JRuby-current-FBE742?style=for-the-badge&logo=ruby&logoColor=green
|
429
509
|
[💎jruby-headi]: https://img.shields.io/badge/JRuby-HEAD-FBE742?style=for-the-badge&logo=ruby&logoColor=blue
|
430
|
-
[🤝issues]: https://github.com/
|
431
|
-
[🤝pulls]: https://github.com/
|
510
|
+
[🤝gh-issues]: https://github.com/galtzo-floss/stone_checksums/issues
|
511
|
+
[🤝gh-pulls]: https://github.com/galtzo-floss/stone_checksums/pulls
|
512
|
+
[🤝gl-issues]: https://gitlab.com/galtzo-floss/stone_checksums/-/issues
|
513
|
+
[🤝gl-pulls]: https://gitlab.com/galtzo-floss/stone_checksums/-/merge_requests
|
514
|
+
[🤝cb-issues]: https://codeberg.org/galtzo-floss/stone_checksums/issues
|
515
|
+
[🤝cb-pulls]: https://codeberg.org/galtzo-floss/stone_checksums/pulls
|
516
|
+
[🤝cb-donate]: https://donate.codeberg.org/
|
432
517
|
[🤝contributing]: CONTRIBUTING.md
|
433
|
-
[🔑codecov-g
|
518
|
+
[🔑codecov-g]: https://codecov.io/gh/galtzo-floss/stone_checksums/graphs/tree.svg
|
434
519
|
[🖐contrib-rocks]: https://contrib.rocks
|
435
|
-
[🖐contributors]: https://github.com/
|
436
|
-
[🖐contributors-img]: https://contrib.rocks/image?repo=
|
437
|
-
[🚎contributors-gl]: https://gitlab.com/
|
520
|
+
[🖐contributors]: https://github.com/galtzo-floss/stone_checksums/graphs/contributors
|
521
|
+
[🖐contributors-img]: https://contrib.rocks/image?repo=galtzo-floss/stone_checksums
|
522
|
+
[🚎contributors-gl]: https://gitlab.com/galtzo-floss/stone_checksums/-/graphs/main
|
438
523
|
[🪇conduct]: CODE_OF_CONDUCT.md
|
439
|
-
[🪇conduct-img]: https://img.shields.io/badge/Contributor_Covenant-2.1-
|
524
|
+
[🪇conduct-img]: https://img.shields.io/badge/Contributor_Covenant-2.1-259D6C.svg
|
440
525
|
[📌pvc]: http://guides.rubygems.org/patterns/#pessimistic-version-constraint
|
441
526
|
[📌semver]: https://semver.org/spec/v2.0.0.html
|
442
|
-
[📌semver-img]: https://img.shields.io/badge/semver-2.0.0-
|
527
|
+
[📌semver-img]: https://img.shields.io/badge/semver-2.0.0-259D6C.svg?style=flat
|
443
528
|
[📌semver-breaking]: https://github.com/semver/semver/issues/716#issuecomment-869336139
|
444
529
|
[📌major-versions-not-sacred]: https://tom.preston-werner.com/2022/05/23/major-version-numbers-are-not-sacred.html
|
445
530
|
[📌changelog]: CHANGELOG.md
|
446
531
|
[📗keep-changelog]: https://keepachangelog.com/en/1.0.0/
|
447
|
-
[📗keep-changelog-img]: https://img.shields.io/badge/keep--a--changelog-1.0.0-
|
532
|
+
[📗keep-changelog-img]: https://img.shields.io/badge/keep--a--changelog-1.0.0-34495e.svg?style=flat
|
533
|
+
[📌gitmoji]:https://gitmoji.dev
|
534
|
+
[📌gitmoji-img]:https://img.shields.io/badge/gitmoji_commits-%20😜%20😍-34495e.svg?style=flat-square
|
448
535
|
[🧮kloc]: https://www.youtube.com/watch?v=dQw4w9WgXcQ
|
449
|
-
[🧮kloc-img]: https://img.shields.io/badge/KLOC-0.
|
536
|
+
[🧮kloc-img]: https://img.shields.io/badge/KLOC-0.097-FFDD67.svg?style=for-the-badge&logo=YouTube&logoColor=blue
|
450
537
|
[🔐security]: SECURITY.md
|
451
|
-
[🔐security-img]: https://img.shields.io/badge/security-policy-
|
538
|
+
[🔐security-img]: https://img.shields.io/badge/security-policy-259D6C.svg?style=flat
|
452
539
|
[📄copyright-notice-explainer]: https://opensource.stackexchange.com/questions/5778/why-do-licenses-such-as-the-mit-license-specify-a-single-year
|
453
540
|
[📄license]: LICENSE.txt
|
454
541
|
[📄license-ref]: https://opensource.org/licenses/MIT
|
455
|
-
[📄license-img]: https://img.shields.io/badge/License-MIT-
|
542
|
+
[📄license-img]: https://img.shields.io/badge/License-MIT-259D6C.svg
|
456
543
|
[📄ilo-declaration]: https://www.ilo.org/declaration/lang--en/index.htm
|
457
|
-
[📄ilo-declaration-img]: https://img.shields.io/badge/ILO_Fundamental_Principles-✓-
|
544
|
+
[📄ilo-declaration-img]: https://img.shields.io/badge/ILO_Fundamental_Principles-✓-259D6C.svg?style=flat
|
458
545
|
[🚎yard-current]: http://rubydoc.info/gems/stone_checksums
|
459
|
-
[🚎yard-head]: https://
|
460
|
-
[
|
461
|
-
[
|
462
|
-
[
|
546
|
+
[🚎yard-head]: https://rspec-stubbed-env.galtzo.com
|
547
|
+
[💎stone_checksums]: https://github.com/galtzo-floss/stone_checksums
|
548
|
+
[💎SHA_checksums]: https://gitlab.com/galtzo-floss/stone_checksums/-/tree/main/checksums
|
549
|
+
[💎rlts]: https://github.com/rubocop-lts/rubocop-lts
|
550
|
+
[💎rlts-img]: https://img.shields.io/badge/code_style_%26_linting-rubocop--lts-34495e.svg?plastic&logo=ruby&logoColor=white
|
551
|
+
[💎appraisal2]: https://github.com/appraisal-rb/appraisal2
|
552
|
+
[💎appraisal2-img]: https://img.shields.io/badge/appraised_by-appraisal2-34495e.svg?plastic&logo=ruby&logoColor=white
|
553
|
+
[💎d-in-dvcs]: https://railsbling.com/posts/dvcs/put_the_d_in_dvcs/
|