{"id":27635072,"url":"https://github.com/pboling/gem_checksums","last_synced_at":"2025-04-23T19:42:59.343Z","repository":{"id":273987357,"uuid":"920927336","full_name":"pboling/gem_checksums","owner":"pboling","description":"`gem install stone_checksums`; Generate SHA-256 and SHA-512 checksums of RubyGem libraries","archived":false,"fork":false,"pushed_at":"2025-04-05T23:40:03.000Z","size":121,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-04-19T15:59:03.996Z","etag":null,"topics":["rubygems","security-tools","software-release"],"latest_commit_sha":null,"homepage":"","language":"Ruby","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/pboling.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":"CONTRIBUTING.md","funding":".github/FUNDING.yml","license":"LICENSE.txt","code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":"SECURITY.md","support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null},"funding":{"github":["pboling"],"patreon":"galtzo","ko_fi":"pboling","liberapay":"pboling","issuehunt":"pboling"}},"created_at":"2025-01-23T02:41:54.000Z","updated_at":"2025-04-05T23:40:07.000Z","dependencies_parsed_at":null,"dependency_job_id":"666f78bd-db76-4e44-b5f1-639e32ee11d5","html_url":"https://github.com/pboling/gem_checksums","commit_stats":null,"previous_names":["pboling/gem_checksums"],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pboling%2Fgem_checksums","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pboling%2Fgem_checksums/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pboling%2Fgem_checksums/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pboling%2Fgem_checksums/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/pboling","download_url":"https://codeload.github.com/pboling/gem_checksums/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":250501311,"owners_count":21440997,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["rubygems","security-tools","software-release"],"created_at":"2025-04-23T19:42:57.075Z","updated_at":"2025-04-23T19:42:59.330Z","avatar_url":"https://github.com/pboling.png","language":"Ruby","funding_links":["https://github.com/sponsors/pboling","https://patreon.com/galtzo","https://ko-fi.com/pboling","https://liberapay.com/pboling","https://issuehunt.io/r/pboling","https://tidelift.com/subscription","https://blog.tidelift.com/tidelift-joins-sonar","https://liberapay.com/pboling/donate","https://polar.sh/pboling","https://ko-fi.com/O5O86SNP4","https://img.buymeacoffee.com/button-api/?text=Buy%20me%20a%20latte\u0026emoji=\u0026slug=pboling\u0026button_colour=FFDD00\u0026font_colour=000000\u0026font_family=Cookie\u0026outline_colour=000000\u0026coffee_colour=ffffff","https://www.buymeacoffee.com/pboling"],"categories":[],"sub_categories":[],"readme":"# StoneChecksums née GemChecksums\n\n[![Version][👽versioni]][👽version]\n[![License: MIT][📄license-img]][📄license-ref]\n[![Downloads Rank][👽dl-ranki]][👽dl-rank]\n[![Open Source Helpers][👽oss-helpi]][👽oss-help]\n[![Depfu][🔑depfui♻️]][🔑depfu]\n[![CodeCov Test Coverage][🔑codecovi♻️]][🔑codecov]\n[![Coveralls Test Coverage][🔑coveralls-img]][🔑coveralls]\n[![CodeClimate Test Coverage][🔑cc-covi♻️]][🔑cc-cov]\n[![Maintainability][🔑cc-mnti♻️]][🔑cc-mnt]\n[![CI Heads][🚎3-hd-wfi]][🚎3-hd-wf]\n[![CI Current][🚎11-c-wfi]][🚎11-c-wf]\n[![CI Truffle Ruby][🚎9-t-wfi]][🚎9-t-wf]\n[![CI JRuby][🚎10-j-wfi]][🚎10-j-wf]\n[![CI Supported][🚎6-s-wfi]][🚎6-s-wf]\n[![CI Legacy][🚎4-lg-wfi]][🚎4-lg-wf]\n[![CI Unsupported][🚎7-us-wfi]][🚎7-us-wf]\n[![CI Ancient][🚎1-an-wfi]][🚎1-an-wf]\n[![CI Hoary][🚎8-ho-wfi]][🚎8-ho-wf]\n[![CI Test Coverage][🚎2-cov-wfi]][🚎2-cov-wf]\n[![CI Style][🚎5-st-wfi]][🚎5-st-wf]\n\n---\n\n[![Liberapay Patrons][⛳liberapay-img]][⛳liberapay]\n[![Sponsor Me on Github][🖇sponsor-img]][🖇sponsor]\n[![Buy me a coffee][🖇buyme-small-img]][🖇buyme]\n[![Polar Shield][🖇polar-img]][🖇polar]\n[![Donate to my FLOSS or refugee efforts at ko-fi.com][🖇kofi-img]][🖇kofi]\n[![Donate to my FLOSS or refugee efforts using Patreon][🖇patreon-img]][🖇patreon]\n\nA ruby shell script, and rake task, to generate SHA-256 and SHA-512 checksums of RubyGem libraries,\nshipped as a RubyGem.\n\nYou may be familiar with the standard rake task `build:checksum` from RubyGems.\nThis gem ships an improved version as `build:generate_checksums`, based on the\n[RubyGems pull request][🔒️rubygems-checksums-pr] I started in October 2022.\n\n```shell\nrake build:generate_checksums\n```\n\nOr giving the same result...\n\nThe script accomplishes the same thing if you prefer that:\n```shell\ngem_checksums\n```\n\n## Info you can shake a stick at\n\n| Tokens to Remember      | [![Gem name][⛳️name-img]][⛳️gem-name] [![Gem namespace][⛳️namespace-img]][⛳️gem-namespace]                                                                                                                                                                                                                                                                                                                                                                          |\n|-------------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|\n| 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]                                                                                                                                                                                                                         |\n| 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]                                                                                                                                                                                  |\n| 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]                                                                                                                                                                                         |\n| 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]                                                                                                                                                                                       |\n| 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]                                                                                                                                                                                                                                                                                                             |\n| 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]                                                                                                                                                                                                                                                        |\n| 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]                                                                                                            |\n| 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]                                                                                                                                                                                                                                                                                    |\n| Enterprise Support      | [![Get help from me on Tidelift][🏙️entsup-tidelift-img]][🏙️entsup-tidelift]\u003cbr/\u003e💡Subscribe for support guarantees covering _all_ FLOSS dependencies!\u003cbr/\u003e💡Tidelift is part of [Sonar][🏙️entsup-tidelift-sonar]!\u003cbr/\u003e💡Tidelift pays maintainers to maintain the software you depend on!\u003cbr/\u003e📊`@`Pointy Haired Boss: An [enterprise support][🏙️entsup-tidelift] subscription is \"[never gonna let you down][🧮kloc]\", and *supports* open source maintainers! |\n| 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]                                                                                                                                                              |\n| `...` 💖                | [![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]                                                                                                                                                                                                                             |\n\n## Installation\n\nInstall the gem and add to your library's Gemfile by executing:\n\n```bash\nbundle add stone_checksums\n```\n\nOr add it as a development dependency to the gemspec:\n\n```ruby\nGem::Specification.new do |spec|\n  # ...\n  spec.add_development_dependency(\"stone_checksums\", \"~\u003e 1.0\")\nend\n```\n\nIf bundler is not being used to manage dependencies, install the gem by executing:\n\n```bash\ngem install stone_checksums\n```\n\n## Usage\n\nOnce installed you can use the shell script without any changes to your code.\n\n```shell\n# prepend with `bundle exec` if gem was added to Gemfile instead of installed globally\ngem_checksums\n```\n\nHowever, if you want to use the bundled rake task you'll need to add it to your Rakefile first.\n\n```ruby\nbegin\n  require \"stone_checksums\"\n  GemChecksums.install_tasks\nrescue LoadError\n  task(\"build:generate_checksums\") do\n    warn(\"stone_checksums gem is not available\")\n  end\nend\n```\n\nThen you can do:\n\n```shell\n# prepend with `bundle exec` if gem was added to Gemfile instead of installed globally\nrake build:generate_checksums\n```\n\nIt is different from, and improves on, the standard rake task in that it:\n- does various checks to ensure the generated checksums will be valid\n- does `git commit` the generated checksums\n\n### ENV variables\n\nBehavior can be controlled by ENV variables!\n\n- `GEM_CHECKSUMS_GIT_DRY_RUN` default value is `false`\n  - when `true` the `git commit` command will run with `--dry-run` flag\n  - when `true` the checksum files will be unstaged and deleted\n- `GEM_CHECKSUMS_CHECKSUMS_DIR` default value is `checksums` (relative path)\n  - this directory will be created, relative to current working directory, if not present\n- `GEM_CHECKSUMS_PACKAGE_DIR` default value is `pkg` (relative path)\n  - this directory will be searched for the latest gem package to generate checksums for\n\n### ARGV\n\nIf an argument is provided to the rake task it should be the path to\na specific `.gem` package you want to generate checksums for.\n\nThe script version does not accept arguments, and should be controlled by the ENV variables if needed.\n\n### How To: Release gem with checksums generated by `stone_checksums`\n\nGenerating checksums makes sense when you are building and releasing a gem, so how does it fit into that process?\n\nNOTE: This is an example process which assumes your project has bundler binstubs, and a version.rb file,\nwith notes for `zsh` and `bash` shells.\n\n1. Run `bin/setup \u0026\u0026 bin/rake` as a tests, coverage, \u0026 linting sanity check\n2. Update the version number in `version.rb`\n3. Run `bin/setup \u0026\u0026 bin/rake` again as a secondary check, and to update `Gemfile.lock`\n4. Run `git commit -am \"🔖 Prepare release v\u003cVERSION\u003e\"` to commit the changes\n5. Run `git push` to trigger the final CI pipeline before release, \u0026 merge PRs\n    - NOTE: Remember to [check your project's CI][🧪build]!\n6. Run `export GIT_TRUNK_BRANCH_NAME=\"$(git remote show origin | grep 'HEAD branch' | cut -d ' ' -f5)\" \u0026\u0026 echo $GIT_TRUNK_BRANCH_NAME`\n7. Run `git checkout $GIT_TRUNK_BRANCH_NAME`\n8. Run `git pull origin $GIT_TRUNK_BRANCH_NAME` to ensure you will release the latest trunk code\n9. Set `SOURCE_DATE_EPOCH` so `rake build` and `rake release` use same timestamp, and generate same checksums\n    - Run `export SOURCE_DATE_EPOCH=$EPOCHSECONDS \u0026\u0026 echo $SOURCE_DATE_EPOCH`\n    - If the echo above has no output, then it didn't work.\n    - Note that you'll need the `zsh/datetime` module, if running `zsh`.\n    - In `bash` you can use `date +%s` instead, i.e. `export SOURCE_DATE_EPOCH=$(date +%s) \u0026\u0026 echo $SOURCE_DATE_EPOCH`\n10. Run `bundle exec rake build`\n11. Run `gem_checksums` (from this gem, and added to path in .envrc,\n    more context [1][🔒️rubygems-checksums-pr] and [2][🔒️rubygems-guides-pr]) to create SHA-256 and SHA-512 checksums\n    - Checksums will be committed automatically by the script, but not pushed\n12. Run `bundle exec rake release` which will create a git tag for the version,\n    push git commits and tags, and push the `.gem` file to [rubygems.org][💎rubygems]\n\n[🧪build]: https://github.com/pboling/gem_checksums/actions\n[💎rubygems]: https://rubygems.org\n[🔒️rubygems-security-guide]: https://guides.rubygems.org/security/#building-gems\n[🔒️rubygems-checksums-pr]: https://github.com/rubygems/rubygems/pull/6022\n[🔒️rubygems-guides-pr]: https://github.com/rubygems/guides/pull/325\n\n### Too many steps?\n\nIf you don't follow the steps above you'll end up seeing this error:\n\n```\nWARNING: Build time not provided via environment variable SOURCE_DATE_EPOCH.\n         To ensure consistent SHA-256 \u0026 SHA-512 checksums,\n         you must set this environment variable *before* building the gem.\n\nIMPORTANT: After setting the build time, you *must re-build the gem*, i.e. bundle exec rake build, or gem build.\n\nHow to set the build time:\n\nIn zsh shell:\n  - export SOURCE_DATE_EPOCH=$EPOCHSECONDS \u0026\u0026 echo $SOURCE_DATE_EPOCH\n  - If the echo above has no output, then it didn't work.\n  - Note that you'll need the `zsh/datetime` module enabled.\n\nIn fish shell:\n  - set -x SOURCE_DATE_EPOCH (date +%s)\n  - echo $SOURCE_DATE_EPOCH\n\nIn bash shell:\n  - export SOURCE_DATE_EPOCH=$(date +%s) \u0026\u0026 echo $SOURCE_DATE_EPOCH`\n```\n\nJust do what it says!\n\n## 🔐 Security\n\nSee [SECURITY.md][🔐security].\n\n## 🤝 Contributing\n\nIf you need some ideas of where to help, you could work on adding more code coverage,\nor if it is already 💯 (see [below](#code-coverage)) check TODOs (see [below](#todos)),\nor check [issues][🤝issues], or [PRs][🤝pulls],\nor use the gem and think about how it could be better.\n\nWe [![Keep A Changelog][📗keep-changelog-img]][📗keep-changelog] so if you make changes, remember to update it.\n\nSee [CONTRIBUTING.md][🤝contributing] for more detailed instructions.\n\n### TODOs\n\n- [ ] Prepend `rake build` task with check for `SOURCE_DATE_EPOCH` environment variable, and raise error if not set.\n\n### Code Coverage\n\n[![Coverage Graph][🔑codecov-g♻️]][🔑codecov]\n\n### 🪇 Code of Conduct\n\nEveryone interacting in this project's codebases, issue trackers,\nchat rooms and mailing lists is expected to follow the [![Contributor Covenant 2.1][🪇conduct-img]][🪇conduct].\n\n## 🌈 Contributors\n\n[![Contributors][🖐contributors-img]][🖐contributors]\n\nMade with [contributors-img][🖐contrib-rocks].\n\nAlso see GitLab Contributors: [https://gitlab.com/pboling/gem_checksums/-/graphs/main][🚎contributors-gl]\n\n## ⭐️ Star History\n\n\u003ca href=\"https://star-history.com/#pboling/gem_checksums\u0026Date\"\u003e\n \u003cpicture\u003e\n   \u003csource media=\"(prefers-color-scheme: dark)\" srcset=\"https://api.star-history.com/svg?repos=pboling/gem_checksums\u0026type=Date\u0026theme=dark\" /\u003e\n   \u003csource media=\"(prefers-color-scheme: light)\" srcset=\"https://api.star-history.com/svg?repos=pboling/gem_checksums\u0026type=Date\" /\u003e\n   \u003cimg alt=\"Star History Chart\" src=\"https://api.star-history.com/svg?repos=pboling/gem_checksums\u0026type=Date\" /\u003e\n \u003c/picture\u003e\n\u003c/a\u003e\n\n## 📌 Versioning\n\nThis Library adheres to [![Semantic Versioning 2.0.0][📌semver-img]][📌semver].\nViolations of this scheme should be reported as bugs.\nSpecifically, if a minor or patch version is released that breaks backward compatibility,\na new version should be immediately released that restores compatibility.\nBreaking changes to the public API will only be introduced with new major versions.\n\n### 📌 Is \"Platform Support\" part of the public API?\n\nYes.  But I'm obligated to include notes...\n\nSemVer should, but doesn't explicitly, say that dropping support for specific Platforms\nis a *breaking change* to an API.\nIt is obvious to many, but not all, and since the spec is silent, the bike shedding is endless.\n\n\u003e dropping support for a platform is both obviously and objectively a breaking change\n\n- Jordan Harband (@ljharb) [in SemVer issue 716][📌semver-breaking]\n\nTo get a better understanding of how SemVer is intended to work over a project's lifetime,\nread this article from the creator of SemVer:\n\n- [\"Major Version Numbers are Not Sacred\"][📌major-versions-not-sacred]\n\nAs a result of this policy, and the interpretive lens used by the maintainer,\nyou can (and should) specify a dependency on these libraries using\nthe [Pessimistic Version Constraint][📌pvc] with two digits of precision.\n\nFor example:\n\n```ruby\nspec.add_dependency(\"gem_checksums\", \"~\u003e 1.1\")\n```\n\nSee [CHANGELOG.md][📌changelog] for list of releases.\n\n## 📄 License\n\nThe gem is available as open source under the terms of\nthe [MIT License][📄license] [![License: MIT][📄license-img]][📄license-ref].\nSee [LICENSE.txt][📄license] for the official [Copyright Notice][📄copyright-notice-explainer].\n\n### © Copyright\n\n\u003cp\u003e\n  Copyright (c) 2022 - 2025 Peter H. Boling,\n  \u003ca href=\"https://railsbling.com\"\u003e\n    RailsBling.com\n    \u003cpicture\u003e\n      \u003cimg alt=\"Rails Bling\" height=\"20\" src=\"https://railsbling.com/images/logos/RailsBling-TrainLogo.svg\" /\u003e\n    \u003c/picture\u003e\n  \u003c/a\u003e\n\u003c/p\u003e\n\n## 🤑 One more thing\n\nYou made it to the bottom of the page,\nso perhaps you'll indulge me for another 20 seconds.\nI maintain many dozens of gems, including this one,\nbecause I want Ruby to be a great place for people to solve problems, big and small.\nPlease consider supporting my efforts via the giant yellow link below,\nor one of the others at the head of this README.\n\n[![Buy me a latte][🖇buyme-img]][🖇buyme]\n\n[✇bundle-group-pattern]: https://gist.github.com/pboling/4564780\n[⛳️gem-namespace]: https://github.com/pboling/gem_checksums/blob/main/lib/gem_checksums.rb\n[⛳️namespace-img]: https://img.shields.io/badge/namespace-GemChecksums-brightgreen.svg?style=flat\u0026logo=ruby\u0026logoColor=white\n[⛳️gem-name]: https://rubygems.org/gems/stone_checksums\n[⛳️name-img]: https://img.shields.io/badge/name-stone__checksums-brightgreen.svg?style=flat\u0026logo=rubygems\u0026logoColor=red\n[🚂bdfl-blog]: http://www.railsbling.com/tags/gem_checksums\n[🚂bdfl-blog-img]: https://img.shields.io/badge/blog-railsbling-0093D0.svg?style=for-the-badge\u0026logo=rubyonrails\u0026logoColor=orange\n[🚂bdfl-contact]: http://www.railsbling.com/contact\n[🚂bdfl-contact-img]: https://img.shields.io/badge/Contact-BDFL-0093D0.svg?style=flat\u0026logo=rubyonrails\u0026logoColor=red\n[💖🖇linkedin]: http://www.linkedin.com/in/peterboling\n[💖🖇linkedin-img]: https://img.shields.io/badge/PeterBoling-LinkedIn-0B66C2?style=flat\u0026logo=newjapanprowrestling\n[💖✌️wellfound]: https://angel.co/u/peter-boling\n[💖✌️wellfound-img]: https://img.shields.io/badge/peter--boling-orange?style=flat\u0026logo=wellfound\n[💖💲crunchbase]: https://www.crunchbase.com/person/peter-boling\n[💖💲crunchbase-img]: https://img.shields.io/badge/peter--boling-purple?style=flat\u0026logo=crunchbase\n[💖🐘ruby-mast]: https://ruby.social/@galtzo\n[💖🐘ruby-mast-img]: https://img.shields.io/mastodon/follow/109447111526622197?domain=https%3A%2F%2Fruby.social\u0026style=flat\u0026logo=mastodon\u0026label=Ruby%20%40galtzo\n[💖🦋bluesky]: https://galtzo.bsky.social\n[💖🦋bluesky-img]: https://img.shields.io/badge/@galtzo.bsky.social-0285FF?style=flat\u0026logo=bluesky\u0026logoColor=white\n[💖🌳linktree]: https://linktr.ee/galtzo\n[💖🌳linktree-img]: https://img.shields.io/badge/galtzo-purple?style=flat\u0026logo=linktree\n[💖💁🏼‍♂️devto]: https://dev.to/galtzo\n[💖💁🏼‍♂️devto-img]: https://img.shields.io/badge/dev.to-0A0A0A?style=flat\u0026logo=devdotto\u0026logoColor=white\n[💖💁🏼‍♂️aboutme]: https://about.me/peter.boling\n[💖💁🏼‍♂️aboutme-img]: https://img.shields.io/badge/about.me-0A0A0A?style=flat\u0026logo=aboutme\u0026logoColor=white\n[👨🏼‍🏫expsup-upwork]: https://www.upwork.com/freelancers/~014942e9b056abdf86?mp_source=share\n[👨🏼‍🏫expsup-upwork-img]: https://img.shields.io/badge/UpWork-13544E?style=for-the-badge\u0026logo=Upwork\u0026logoColor=white\n[👨🏼‍🏫expsup-codementor]: https://www.codementor.io/peterboling?utm_source=github\u0026utm_medium=button\u0026utm_term=peterboling\u0026utm_campaign=github\n[👨🏼‍🏫expsup-codementor-img]: https://img.shields.io/badge/CodeMentor-Get_Help-1abc9c?style=for-the-badge\u0026logo=CodeMentor\u0026logoColor=white\n[🏙️entsup-tidelift]: https://tidelift.com/subscription\n[🏙️entsup-tidelift-img]: https://img.shields.io/badge/Tidelift_and_Sonar-Enterprise_Support-FD3456?style=for-the-badge\u0026logo=sonar\u0026logoColor=white\n[🏙️entsup-tidelift-sonar]: https://blog.tidelift.com/tidelift-joins-sonar\n[💁🏼‍♂️peterboling]: http://www.peterboling.com\n[🚂railsbling]: http://www.railsbling.com\n[📜src-gl-img]: https://img.shields.io/badge/GitLab-FBA326?style=for-the-badge\u0026logo=Gitlab\u0026logoColor=orange\n[📜src-gl]: https://gitlab.com/pboling/gem_checksums/\n[📜src-gh-img]: https://img.shields.io/badge/GitHub-238636?style=for-the-badge\u0026logo=Github\u0026logoColor=green\n[📜src-gh]: https://github.com/pboling/gem_checksums\n[📜docs-cr-rd-img]: https://img.shields.io/badge/RubyDoc-Current_Release-943CD2?style=for-the-badge\u0026logo=readthedocs\u0026logoColor=white\n[📜docs-head-rd-img]: https://img.shields.io/badge/RubyDoc-HEAD-943CD2?style=for-the-badge\u0026logo=readthedocs\u0026logoColor=white\n[📜wiki]: https://gitlab.com/pboling/gem_checksums/-/wikis/home\n[📜wiki-img]: https://img.shields.io/badge/wiki-examples-943CD2.svg?style=for-the-badge\u0026logo=Wiki\u0026logoColor=white\n[👽dl-rank]: https://rubygems.org/gems/stone_checksums\n[👽dl-ranki]: https://img.shields.io/gem/rd/stone_checksums.svg\n[👽oss-help]: https://www.codetriage.com/pboling/gem_checksums\n[👽oss-helpi]: https://www.codetriage.com/pboling/gem_checksums/badges/users.svg\n[👽version]: https://rubygems.org/gems/stone_checksums\n[👽versioni]: https://img.shields.io/gem/v/stone_checksums.svg\n[🔑cc-mnt]: https://codeclimate.com/github/pboling/gem_checksums/maintainability\n[🔑cc-mnti♻️]: https://api.codeclimate.com/v1/badges/ff2234fcbe9051436f37/maintainability\n[🔑cc-cov]: https://codeclimate.com/github/pboling/gem_checksums/test_coverage\n[🔑cc-covi♻️]: https://api.codeclimate.com/v1/badges/ff2234fcbe9051436f37/test_coverage\n[🔑codecov]: https://codecov.io/gh/pboling/gem_checksums\n[🔑codecovi♻️]: https://codecov.io/gh/pboling/gem_checksums/branch/main/graph/badge.svg?token=iQykVGCFME\n[🔑coveralls]: https://coveralls.io/github/pboling/gem_checksums?branch=main\n[🔑coveralls-img]: https://coveralls.io/repos/github/pboling/gem_checksums/badge.svg?branch=main\n[🔑depfu]: https://depfu.com/github/pboling/gem_checksums\n[🔑depfui♻️]: https://badges.depfu.com/badges/85187dfdd2ecf7839b2ec78c64d2bf4e/count.svg\n[🖐codeQL]: https://github.com/pboling/gem_checksums/security/code-scanning\n[🖐codeQL-img]: https://github.com/pboling/gem_checksums/actions/workflows/codeql-analysis.yml/badge.svg\n[🚎1-an-wf]: https://github.com/pboling/gem_checksums/actions/workflows/ancient.yml\n[🚎1-an-wfi]: https://github.com/pboling/gem_checksums/actions/workflows/ancient.yml/badge.svg\n[🚎2-cov-wf]: https://github.com/pboling/gem_checksums/actions/workflows/coverage.yml\n[🚎2-cov-wfi]: https://github.com/pboling/gem_checksums/actions/workflows/coverage.yml/badge.svg\n[🚎3-hd-wf]: https://github.com/pboling/gem_checksums/actions/workflows/heads.yml\n[🚎3-hd-wfi]: https://github.com/pboling/gem_checksums/actions/workflows/heads.yml/badge.svg\n[🚎4-lg-wf]: https://github.com/pboling/gem_checksums/actions/workflows/legacy.yml\n[🚎4-lg-wfi]: https://github.com/pboling/gem_checksums/actions/workflows/legacy.yml/badge.svg\n[🚎5-st-wf]: https://github.com/pboling/gem_checksums/actions/workflows/style.yml\n[🚎5-st-wfi]: https://github.com/pboling/gem_checksums/actions/workflows/style.yml/badge.svg\n[🚎6-s-wf]: https://github.com/pboling/gem_checksums/actions/workflows/supported.yml\n[🚎6-s-wfi]: https://github.com/pboling/gem_checksums/actions/workflows/supported.yml/badge.svg\n[🚎7-us-wf]: https://github.com/pboling/gem_checksums/actions/workflows/unsupported.yml\n[🚎7-us-wfi]: https://github.com/pboling/gem_checksums/actions/workflows/unsupported.yml/badge.svg\n[🚎8-ho-wf]: https://github.com/pboling/gem_checksums/actions/workflows/hoary.yml\n[🚎8-ho-wfi]: https://github.com/pboling/gem_checksums/actions/workflows/hoary.yml/badge.svg\n[🚎9-t-wf]: https://github.com/pboling/gem_checksums/actions/workflows/truffle.yml\n[🚎9-t-wfi]: https://github.com/pboling/gem_checksums/actions/workflows/truffle.yml/badge.svg\n[🚎10-j-wf]: https://github.com/pboling/gem_checksums/actions/workflows/jruby.yml\n[🚎10-j-wfi]: https://github.com/pboling/gem_checksums/actions/workflows/jruby.yml/badge.svg\n[🚎11-c-wf]: https://github.com/pboling/gem_checksums/actions/workflows/current.yml\n[🚎11-c-wfi]: https://github.com/pboling/gem_checksums/actions/workflows/current.yml/badge.svg\n[⛳liberapay-img]: https://img.shields.io/liberapay/patrons/pboling.svg?logo=liberapay\n[⛳liberapay]: https://liberapay.com/pboling/donate\n[🖇sponsor-img]: https://img.shields.io/badge/Sponsor_Me!-pboling.svg?style=social\u0026logo=github\n[🖇sponsor]: https://github.com/sponsors/pboling\n[🖇polar-img]: https://polar.sh/embed/seeks-funding-shield.svg?org=pboling\n[🖇polar]: https://polar.sh/pboling\n[🖇kofi-img]: https://img.shields.io/badge/buy_me_coffee-donate-yellow.svg\n[🖇kofi]: https://ko-fi.com/O5O86SNP4\n[🖇patreon-img]: https://img.shields.io/badge/patreon-donate-yellow.svg\n[🖇patreon]: https://patreon.com/galtzo\n[💎ruby-2.2i]: https://img.shields.io/badge/Ruby-2.2-DF00CA?style=for-the-badge\u0026logo=ruby\u0026logoColor=white\n[💎ruby-2.3i]: https://img.shields.io/badge/Ruby-2.3-DF00CA?style=for-the-badge\u0026logo=ruby\u0026logoColor=white\n[💎ruby-2.4i]: https://img.shields.io/badge/Ruby-2.4-DF00CA?style=for-the-badge\u0026logo=ruby\u0026logoColor=white\n[💎ruby-2.5i]: https://img.shields.io/badge/Ruby-2.5-DF00CA?style=for-the-badge\u0026logo=ruby\u0026logoColor=white\n[💎ruby-2.6i]: https://img.shields.io/badge/Ruby-2.6-DF00CA?style=for-the-badge\u0026logo=ruby\u0026logoColor=white\n[💎ruby-2.7i]: https://img.shields.io/badge/Ruby-2.7-DF00CA?style=for-the-badge\u0026logo=ruby\u0026logoColor=white\n[💎ruby-3.0i]: https://img.shields.io/badge/Ruby-3.0-CC342D?style=for-the-badge\u0026logo=ruby\u0026logoColor=white\n[💎ruby-3.1i]: https://img.shields.io/badge/Ruby-3.1-CC342D?style=for-the-badge\u0026logo=ruby\u0026logoColor=white\n[💎ruby-3.2i]: https://img.shields.io/badge/Ruby-3.2-CC342D?style=for-the-badge\u0026logo=ruby\u0026logoColor=white\n[💎ruby-3.3i]: https://img.shields.io/badge/Ruby-3.3-CC342D?style=for-the-badge\u0026logo=ruby\u0026logoColor=white\n[💎ruby-c-i]: https://img.shields.io/badge/Ruby-current-CC342D?style=for-the-badge\u0026logo=ruby\u0026logoColor=green\n[💎ruby-headi]: https://img.shields.io/badge/Ruby-HEAD-CC342D?style=for-the-badge\u0026logo=ruby\u0026logoColor=blue\n[💎truby-22.3i]: https://img.shields.io/badge/Truffle_Ruby-22.3-34BCB1?style=for-the-badge\u0026logo=ruby\u0026logoColor=pink\n[💎truby-23.0i]: https://img.shields.io/badge/Truffle_Ruby-23.0-34BCB1?style=for-the-badge\u0026logo=ruby\u0026logoColor=pink\n[💎truby-23.1i]: https://img.shields.io/badge/Truffle_Ruby-23.1-34BCB1?style=for-the-badge\u0026logo=ruby\u0026logoColor=pink\n[💎truby-c-i]: https://img.shields.io/badge/Truffle_Ruby-current-34BCB1?style=for-the-badge\u0026logo=ruby\u0026logoColor=green\n[💎truby-headi]: https://img.shields.io/badge/Truffle_Ruby-HEAD-34BCB1?style=for-the-badge\u0026logo=ruby\u0026logoColor=blue\n[💎jruby-9.1i]: https://img.shields.io/badge/JRuby-9.1-FBE742?style=for-the-badge\u0026logo=ruby\u0026logoColor=red\n[💎jruby-9.2i]: https://img.shields.io/badge/JRuby-9.2-FBE742?style=for-the-badge\u0026logo=ruby\u0026logoColor=red\n[💎jruby-9.3i]: https://img.shields.io/badge/JRuby-9.3-FBE742?style=for-the-badge\u0026logo=ruby\u0026logoColor=red\n[💎jruby-c-i]: https://img.shields.io/badge/JRuby-current-FBE742?style=for-the-badge\u0026logo=ruby\u0026logoColor=green\n[💎jruby-headi]: https://img.shields.io/badge/JRuby-HEAD-FBE742?style=for-the-badge\u0026logo=ruby\u0026logoColor=blue\n[🤝issues]: https://github.com/pboling/gem_checksums/issues\n[🤝pulls]: https://github.com/pboling/gem_checksums/pulls\n[🤝contributing]: CONTRIBUTING.md\n[🔑codecov-g♻️]: https://codecov.io/gh/pboling/gem_checksums/graphs/tree.svg?token=iQykVGCFME\n[🖐contrib-rocks]: https://contrib.rocks\n[🖐contributors]: https://github.com/pboling/gem_checksums/graphs/contributors\n[🖐contributors-img]: https://contrib.rocks/image?repo=pboling/gem_checksums\n[🚎contributors-gl]: https://gitlab.com/pboling/gem_checksums/-/graphs/main\n[🪇conduct]: CODE_OF_CONDUCT.md\n[🪇conduct-img]: https://img.shields.io/badge/Contributor_Covenant-2.1-4baaaa.svg\n[📌pvc]: http://guides.rubygems.org/patterns/#pessimistic-version-constraint\n[📌semver]: https://semver.org/spec/v2.0.0.html\n[📌semver-img]: https://img.shields.io/badge/semver-2.0.0-FFDD67.svg?style=flat\n[📌semver-breaking]: https://github.com/semver/semver/issues/716#issuecomment-869336139\n[📌major-versions-not-sacred]: https://tom.preston-werner.com/2022/05/23/major-version-numbers-are-not-sacred.html\n[📌changelog]: CHANGELOG.md\n[📗keep-changelog]: https://keepachangelog.com/en/1.0.0/\n[📗keep-changelog-img]: https://img.shields.io/badge/keep--a--changelog-1.0.0-FFDD67.svg?style=flat\n[🧮kloc]: https://www.youtube.com/watch?v=dQw4w9WgXcQ\n[🧮kloc-img]: https://img.shields.io/badge/KLOC-0.075-FFDD67.svg?style=for-the-badge\u0026logo=YouTube\u0026logoColor=blue\n[🔐security]: SECURITY.md\n[🔐security-img]: https://img.shields.io/badge/security-policy-brightgreen.svg?style=flat\n[📄copyright-notice-explainer]: https://opensource.stackexchange.com/questions/5778/why-do-licenses-such-as-the-mit-license-specify-a-single-year\n[📄license]: LICENSE.txt\n[📄license-ref]: https://opensource.org/licenses/MIT\n[📄license-img]: https://img.shields.io/badge/License-MIT-green.svg\n[📄ilo-declaration]: https://www.ilo.org/declaration/lang--en/index.htm\n[📄ilo-declaration-img]: https://img.shields.io/badge/ILO_Fundamental_Principles-✓-brightgreen.svg?style=flat\n[🚎yard-current]: http://rubydoc.info/gems/stone_checksums\n[🚎yard-head]: https://rubydoc.info/github/pboling/gem_checksums/main\n[🖇buyme-img]: https://img.buymeacoffee.com/button-api/?text=Buy%20me%20a%20latte\u0026emoji=\u0026slug=pboling\u0026button_colour=FFDD00\u0026font_colour=000000\u0026font_family=Cookie\u0026outline_colour=000000\u0026coffee_colour=ffffff\n[🖇buyme]: https://www.buymeacoffee.com/pboling\n[🖇buyme-small-img]: https://img.shields.io/badge/Buy--Me--A--Coffee-✓-brightgreen.svg?style=flat\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpboling%2Fgem_checksums","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fpboling%2Fgem_checksums","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpboling%2Fgem_checksums/lists"}