{"id":30218776,"url":"https://github.com/galtzo-floss/gem_bench","last_synced_at":"2025-08-14T07:04:29.751Z","repository":{"id":7872258,"uuid":"9244975","full_name":"galtzo-floss/gem_bench","owner":"galtzo-floss","description":"Benchmark different versions of same or similar gems \u0026 Static Gemfile and installed gem library source code analysis","archived":false,"fork":false,"pushed_at":"2024-12-12T01:42:07.000Z","size":302,"stargazers_count":91,"open_issues_count":1,"forks_count":5,"subscribers_count":5,"default_branch":"main","last_synced_at":"2025-08-09T20:43:15.888Z","etag":null,"topics":["benchmark","benchmarking","bundler","rubygem","rubygems"],"latest_commit_sha":null,"homepage":"http://railsbling.com/gem_bench","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/galtzo-floss.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,"zenodo":null},"funding":{"github":["pboling"],"patreon":"galtzo","ko_fi":"pboling","liberapay":"pboling","issuehunt":"pboling"}},"created_at":"2013-04-05T16:06:30.000Z","updated_at":"2025-08-04T18:12:33.000Z","dependencies_parsed_at":"2024-01-13T03:01:28.125Z","dependency_job_id":"11575e73-698d-4dc6-9c7b-8b3af74f7351","html_url":"https://github.com/galtzo-floss/gem_bench","commit_stats":null,"previous_names":["acquaintable/gem_bench"],"tags_count":19,"template":false,"template_full_name":null,"purl":"pkg:github/galtzo-floss/gem_bench","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/galtzo-floss%2Fgem_bench","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/galtzo-floss%2Fgem_bench/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/galtzo-floss%2Fgem_bench/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/galtzo-floss%2Fgem_bench/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/galtzo-floss","download_url":"https://codeload.github.com/galtzo-floss/gem_bench/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/galtzo-floss%2Fgem_bench/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":270378803,"owners_count":24573444,"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","status":"online","status_checked_at":"2025-08-14T02:00:10.309Z","response_time":75,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"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":["benchmark","benchmarking","bundler","rubygem","rubygems"],"created_at":"2025-08-14T07:02:04.144Z","updated_at":"2025-08-14T07:04:29.687Z","avatar_url":"https://github.com/galtzo-floss.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://liberapay.com/pboling/donate","https://polar.sh/pboling","https://ko-fi.com/O5O86SNP4","https://www.buymeacoffee.com/pboling","https://img.buymeacoffee.com/button-api/?text=Buy"],"categories":["Ruby"],"sub_categories":[],"readme":"# GemBench\n\n\u003cdiv id=\"badges\"\u003e\n\n\u003cdiv align=\"center\"\u003e\n\n[![License: MIT](https://img.shields.io/badge/License-MIT-green.svg)](https://opensource.org/licenses/MIT)\n[![Version](https://img.shields.io/gem/v/gem_bench.svg)](https://rubygems.org/gems/gem_bench)\n[![Downloads Today](https://img.shields.io/gem/rd/gem_bench.svg)](https://github.com/pboling/gem_bench)\n[![Depfu](https://badges.depfu.com/badges/865e7bb1d0d3eb3ba807fca7344e22d1/overview.svg)](https://depfu.com/github/pboling/gem_bench?project_id=2688)\n[![CodeCov][🖇codecov-img♻️]][🖇codecov]\n[![Test Coverage](https://api.codeclimate.com/v1/badges/80787f126e7a486b19af/test_coverage)](https://codeclimate.com/github/pboling/gem_bench/test_coverage)\n[![Maintainability](https://api.codeclimate.com/v1/badges/80787f126e7a486b19af/maintainability)](https://codeclimate.com/github/pboling/gem_bench/maintainability)\n[![CI Supported Build][🚎s-wfi]][🚎s-wf]\n[![CI Unsupported Build][🚎us-wfi]][🚎us-wf]\n[![CI Style Build][🚎st-wfi]][🚎st-wf]\n[![CI Coverage Build][🚎cov-wfi]][🚎cov-wf]\n[![CI Heads Build][🚎hd-wfi]][🚎hd-wf]\n[![CI Ancient Build][🚎an-wfi]][🚎an-wf]\n\n[🖇codecov-img♻️]: https://codecov.io/gh/pboling/gem_bench/graph/badge.svg?token=selEoMrZzA\n[🖇codecov]: https://codecov.io/gh/pboling/gem_bench\n[🚎s-wf]: https://github.com/pboling/gem_bench/actions/workflows/supported.yml\n[🚎s-wfi]: https://github.com/pboling/gem_bench/actions/workflows/supported.yml/badge.svg\n[🚎us-wf]: https://github.com/pboling/gem_bench/actions/workflows/unsupported.yml\n[🚎us-wfi]: https://github.com/pboling/gem_bench/actions/workflows/unsupported.yml/badge.svg\n[🚎st-wf]: https://github.com/pboling/gem_bench/actions/workflows/style.yml\n[🚎st-wfi]: https://github.com/pboling/gem_bench/actions/workflows/style.yml/badge.svg\n[🚎cov-wf]: https://github.com/pboling/gem_bench/actions/workflows/coverage.yml\n[🚎cov-wfi]: https://github.com/pboling/gem_bench/actions/workflows/coverage.yml/badge.svg\n[🚎hd-wf]: https://github.com/pboling/gem_bench/actions/workflows/heads.yml\n[🚎hd-wfi]: https://github.com/pboling/gem_bench/actions/workflows/heads.yml/badge.svg\n[🚎an-wf]: https://github.com/pboling/gem_bench/actions/workflows/ancient.yml\n[🚎an-wfi]: https://github.com/pboling/gem_bench/actions/workflows/ancient.yml/badge.svg\n\n\u003c/div\u003e\n\n-----\n\n\u003cdiv align=\"center\"\u003e\n\n[![Liberapay Patrons][⛳liberapay-img]][⛳liberapay]\n[![Sponsor Me on Github][🖇sponsor-img]][🖇sponsor]\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\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%20me%20coffee-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\n\u003cspan class=\"badge-buymealatte\"\u003e\n\u003ca href=\"https://www.buymeacoffee.com/pboling\"\u003e\u003cimg src=\"https://img.buymeacoffee.com/button-api/?text=Buy me a latte\u0026emoji=\u0026slug=pboling\u0026button_colour=FFDD00\u0026font_colour=000000\u0026font_family=Cookie\u0026outline_colour=000000\u0026coffee_colour=ffffff\" /\u003e\u003c/a\u003e\n\u003c/span\u003e\n\n\u003c/div\u003e\n\u003c/div\u003e\n\n[benchmarking-example]: https://github.com/panorama-ed/memo_wise/pull/339\n\n## What's it do?\n\n🏁 Copy \u0026 Re-namespace any gem to benchmark side-by-side with `benchmarks-ips`!\n\n👯 For example, many of the ~dozen Memoization gems use the same namespaces (`Memoist`, `Memery`, etc).\nIn order to compare them side-by-side one of them must be re-namespaced. ([working example][benchmarking-example])\n\n\u003cdetails\u003e\n  \u003csummary\u003eScene: Spectator at a game of Ruby Sports Gem Ball\u003c/summary\u003e\n\nGem wearing jersey **#23**:\n\n\u003e \"Put me in coach!\"\n\nOther Gem, also wearing jersey **#23**:\n\n\u003e \"Put me in coach!\"\n\nCoach:\n\n\u003e ❨╯°□°❩╯︵┻━┻ fine, but one of you change your jersey first!\n\n\u003c/details\u003e\n\n🤩 Benchmark trunk against released version of a library! ([working example][benchmarking-example])\n\n🧐 A `git clone` build can now be run against the latest public release build, side-by-side, by re-namespacing one of them. ([working example][benchmarking-example])\n\n🕵️‍♀️ Static Gemfile and installed gem library source code analysis.\nRegex search through all of a project's source code, including installed Bundler dependencies.\n\n🛟 Trim down app load times, such as on Heroku, by finding and keeping your worst players on the bench.\n\n| Primary Namespace | `GemBench`                                                                                                                                                                                                                                                                                                                                                                                                                                              |\n|-------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|\n| gem name          | [gem_bench](https://rubygems.org/gems/gem_bench)                                                                                                                                                                                                                                                                                                                                                                                                      |\n| code triage       | [![Open Source Helpers](https://www.codetriage.com/pboling/gem_bench/badges/users.svg)](https://www.codetriage.com/pboling/gem_bench)                                                                                                                                                                                                                                                                                                                 |\n| documentation     | [on Github.com][homepage], [on Rdoc.info][documentation]                                                                                                                                                                                                                                                                                                                                                                                                                           |\n| expert support    | [![Get help on Codementor](https://cdn.codementor.io/badges/get_help_github.svg)](https://www.codementor.io/peterboling?utm_source=github\u0026utm_medium=button\u0026utm_term=peterboling\u0026utm_campaign=github)                                                                                                                                                                                                                                                 |\n| `...` 💖          | [![Liberapay Patrons][⛳liberapay-img]][⛳liberapay] [![Sponsor Me][🖇sponsor-img]][🖇sponsor] [![Follow Me on LinkedIn][🖇linkedin-img]][🖇linkedin] [![Find Me on WellFound:][✌️wellfound-img]][✌️wellfound] [![Find Me on CrunchBase][💲crunchbase-img]][💲crunchbase] [![My LinkTree][🌳linktree-img]][🌳linktree] [![Follow Me on Ruby.Social][🐘ruby-mast-img]][🐘ruby-mast] [![Tweet @ Peter][🐦tweet-img]][🐦tweet] [💻][coderme] [🌏][aboutme] |\n\n\u003c!-- 7️⃣ spread 💖 --\u003e\n[🐦tweet-img]: https://img.shields.io/twitter/follow/galtzo.svg?style=social\u0026label=Follow%20%40galtzo\n[🐦tweet]: http://twitter.com/galtzo\n[🚎blog]: http://www.railsbling.com/tags/gem_bench/\n[🚎blog-img]: https://img.shields.io/badge/blog-railsbling-brightgreen.svg?style=flat\n[🖇linkedin]: http://www.linkedin.com/in/peterboling\n[🖇linkedin-img]: https://img.shields.io/badge/PeterBoling-blue?style=plastic\u0026logo=linkedin\n[✌️wellfound]: https://angel.co/u/peter-boling\n[✌️wellfound-img]: https://img.shields.io/badge/peter--boling-orange?style=plastic\u0026logo=wellfound\n[💲crunchbase]: https://www.crunchbase.com/person/peter-boling\n[💲crunchbase-img]: https://img.shields.io/badge/peter--boling-purple?style=plastic\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=plastic\u0026logo=mastodon\u0026label=Ruby%20%40galtzo\n[🌳linktree]: https://linktr.ee/galtzo\n[🌳linktree-img]: https://img.shields.io/badge/galtzo-purple?style=plastic\u0026logo=linktree\n\n\u003c!-- Maintainer Contact Links --\u003e\n[aboutme]: https://about.me/peter.boling\n[coderme]: https://coderwall.com/Peter%20Boling\n\n### New for 2.0.1 - `GemBench::Jersey`\n\nAllows you to re-namespace any gem.\nYou can, for example, benchmark a gem against another version of itself.\n\nThe gem `alt_memery` uses a namespace, `Memery`, that does not match the gem name.\n\n```ruby\nrequire \"gem_bench/jersey\"\n\njersey = GemBench::Jersey.new(\n  gem_name: \"alt_memery\",\n  trades: {\"Memery\" =\u003e \"AltMemery\"},\n  metadata: { # optional, mostly used for benchmarking report output\n    something: \"a value here\",\n    something_else: :obviously,\n  },\n)\njersey.doff_and_don\n# The re-namespaced constant is now available!\nAltMemery # =\u003e AltMemery\njersey.as_klass # =\u003e AltMemery\n\n# The original, unmodified, gem is still there!\nrequire \"alt_memery\"\n\nMemery # =\u003e Memery\n# So you can use both!\n```\n\nNOTE: It is not required by default, so you do need to require the Jersey if you want to use it!\n\n```ruby\nrequire \"gem_bench/jersey\"\n```\n\n#### Usage\n\nIf the original gem defines multiple top-level namespaces,\nthey can all be renamed by providing more key value pairs in `trades`.\nIf the original gem monkey patches other libraries,\nthat behavior can't be isolated, so YMMV.\n\nNOTE: Non-top-level namespaces do not need to be renamed,\nas they are isolated within their parent namespace.\n\n#### Example\n\nFor a real example, see: https://github.com/panorama-ed/memo_wise/pull/339\n\n#### Naming: Why `doff_and_don`?\n\n\u003e Wouldn't \"copy_gem\" make sense?\n\nActually copy is an overloaded term, which creates confusion in this use case.\nThis method Generates a temp directory, and creates a copy of a gem within it.\nRe-namespaces the copy according to the `trades` configuration.\nThen requires each file of the \"copied gem\", resulting\nin a loaded gem that will not have namespace\ncollisions when loaded alongside the original-namespaced gem.\nNote that \"copied gem\" in the previous sentence is ambiguous without the supporting context.\nThe \"copied gem\" can mean either the original, or the \"copy\", which is why this gem refers to\na \"doffed gem\" (the original) and a \"donned gem\" (the copy).\n\nAlso because `Jersey`.  Duh...\n\n#### Advanced Usage\n\nIf a block is provided the contents of each file will be yielded to the block,\nafter all namespace substitutions from `trades` are complete, but before the contents\nare written to the donned (re-namespaced) gem. The return value of the block will be\nwritten to the file in this scenario.\n\n### New for 2.0.0 - Dropped Support for Ruby 2.0, 2.1, 2.2\n\n- Required Ruby is now 2.3+\n- `VERSION` is now namespaced at `GemBench::Version::VERSION` and is enhanced by `version_gem`.\n\n### New for 1.0.2 - Gemfile specs\n\nVersion constraints are important.  Give the Gemfile some love in your CI build\n\nCreate a `spec/gemfile_spec.rb` like:\n\n```ruby\nRspec.describe(\"Gemfile\") do\n  it(\"has version constraint on every gem\") do\n    requirements = GemBench::StrictVersionRequirement.new({verbose: false})\n    expect(requirements.list_missing_version_constraints).to(eq([]))\n  end\nend\n```\n\nThen your build will fail as soon as a gem is added without a proper constraint:\n\n```\nFailures:\n\n1) Gemfile has version constraint on every gem\nFailure/Error: expect(requirements.list_missing_version_constraints).to eq([])\n\n  expected: []\n       got: [\"puma\"]\n\n  (compared using ==)\n# ./spec/gemfile_spec.rb:7:in `block (2 levels) in \u003ctop (required)\u003e'\n```\n\nFor `:git`/`:github` sources, `:ref` and `:tag` are considered as \"constraints\", while `:branch` is not, because branches may be a moving target, and this gem aims to make Gemfiles production-ready.\nFor string version constraints anything is allowed (e.g. `'~\u003e 1.0'`), as it assumes the constraint placed is well considered.\n\n### New for 1.0.0 - Find WAT Dragons in 3rd party source code\n\nSearch the Ruby source code of all the gems loaded by your Gemfile for a specified regex, to find out which gems have wat DRAGONS.\n\n\u003cdetails\u003e\n  \u003csummary\u003eScene: Rubiana Jones is searching for WAT Dragon relics in dusty bins of source code\u003c/summary\u003e\n\nGem:\n\n\u003e \"I have no wat DRAGONS!\"`\n\nRubiana Jones:\n\n\u003e ❨╯°□°❩╯︵┻━┻ Yes you do!\n\n```\n\u003e\u003e puts GemBench.find(look_for_regex: /wat/).starters.map {|gem| \"#{gem.name} has wat DRAGONS at #{gem.stats}\" }.join(\"\\n\")\n[GemBench] Will search for gems in [\"/Users/pboling/.rvm/gems/ruby-2.4.0@foss/gems\", \"/Users/pboling/.rvm/gems/ruby-2.4.0@global/gems\", \"/Users/pboling/.rvm/gems/ruby-2.4.0@foss/bundler/gems\"]\n[GemBench] Detected 11 loaded gems + 2 loaded gems which GemBench is configured to ignore.\nbyebug has wat DRAGONS at [[\"/Users/pboling/.rvm/gems/ruby-2.4.0@foss/gems/byebug-9.0.6/lib/byebug/commands/frame.rb\", 954]]\n=\u003e nil\n```\n\nNOTE: The number (954, above) is not a line number. The file which contains the text `wat` was the 954th file evaluated, i.e. the number doesn't matter.\nNOTE: This is a contrived example.  The occurrence of `wat` in byebug is meaningless: `byebug/commands/frame.rb:34` has `        if there is a front end also watching over things.`.  This is just an example!  You can find anything you want, perhaps even something important!\n\n\u003c/details\u003e\n\nIt is a fact of RubyGems that many of them do not need to be loaded by your app at boot time.\nIt is a fact of Bundler that you don't know which ones need to be 'required' while staring at the Gemfile.\nIt is a fact of Heroku that you only have 60, 75, or 120 ([by special request](https://devcenter.heroku.com/articles/error-codes#h20-app-boot-timeout)) precious seconds to get your app loaded before ❨╯°□°❩╯︵┻━┻\n\nThis gem helps by telling you which gems don't need to be loaded during boot time.\n\nYou can even use it to evaluate your project's actual Gemfile for easy peasy boot time savings. (see Advanced Usage)\n\n## Installation\n\nYou *may not* need to add this gem to your project.\n\nInstall the gem and add to the application's Gemfile by executing:\n\n    $ bundle add gem_bench\n\nIf bundler is not being used to manage dependencies, install the gem by executing:\n\n    $ gem install gem_bench\n\n\u003cdetails\u003e\n    \u003csummary\u003eInstallation Options\u003c/summary\u003e\n\n### Option 1\n\nJust install it, and require it in your `irb` or `console` session when you want to use it.  However, if you load your console with `bundle exec` then you only have access to gems in the gemfile, so either load without `bundle exec` or add it to the `Gemfile`.\n\n    $ gem install gem_bench\n\n### Option 2\n\nIf you decide to include it in your project: add this line to your `Gemfile` in the `:development` group.\n\n    gem 'gem_bench', :require =\u003e false, :group =\u003e :development\n\n### Option BEST 1\n\nOr better yet [follow the bundle group pattern in your Gemfile][bundle-group-pattern] and setup a console group so it will only load in the console, and not the web app.  With it loading only in the console session the `require: false` is completely optional. The gem is tiny, so won't impact console load time much. Requiring it will allow checking your `Gemfile` without needing to first `require 'gem_bench'`.\n\n    gem 'gem_bench', :group =\u003e :console\n\nAnd then execute:\n\n    $ bundle\n\n### Option BEST 2\n\nIf you are going to use the gem in your specs, you will need to add it to the test group.\n\n    gem 'gem_bench', :group =\u003e :test\n\n\u003c/details\u003e\n\n## Usage\n\nWorks with Ruby \u003e= 2.3.\n\n### Examples\n\n\u003cdetails\u003e\n    \u003csummary\u003eGetting tired of seeing this `irb` warning, perhaps?\u003c/summary\u003e\n\n```\n$ bundle exec rails console\nLoading staging environment (Rails M.m.p)\nirb: warn: can't alias context from irb_context.\n```\n\nFind out what gems may be causing it by defining `context`!\n\n```\n\u003e\u003e require 'gem_bench'\n=\u003e true\n\u003e\u003e bad_context_maybes = GemBench.find(look_for_regex: /def context/).starters\n[GemBench] Will search for gems in [\"/Users/pboling/.rvm/gems/ruby-2.4.0@foss/gems\", \"/Users/pboling/.rvm/gems/ruby-2.4.0@global/gems\", \"/Users/pboling/.rvm/gems/ruby-2.4.0@foss/bundler/gems\"]\n[GemBench] Detected 11 loaded gems + 2 loaded gems which GemBench is configured to ignore.\n=\u003e [byebug, diff-lcs]\n```\n\nThen find the file with the first occurrence of the regex in each:\n\n```\n\u003e\u003e bad_context_maybes.map { |bcm| bcm.stats.map(\u0026:first) }\n=\u003e [[\"/Users/pboling/.rvm/gems/ruby-2.4.0@foss/gems/byebug-9.0.6/lib/byebug/command.rb\"], [\"/Users/pboling/.rvm/gems/ruby-2.4.0@foss/gems/diff-lcs-1.3/lib/diff/lcs/hunk.rb\"]]\n```\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n  \u003csummary\u003eFind what gems have `RAILS_ENV` specific code!\u003c/summary\u003e\n\nLet's try to find what libraries might be using a conditional guard to alter their behavior in a specific Rails environment.\n\n```\n# Not a perfect regex, but pretty good: https://rubular.com/r/b7tdIoYOVQM2RR\n# RAILS_ENV == \"development\"\n# Rails.env.development?\n# Rails.env == \"development\"\n# ENV[\"RAILS_ENV\"] == \"development\"\n# ENV.fetch(\"RAILS_ENV\") == \"development\"\n\u003e\u003e require \"gem_bench\"\n=\u003e true\n\u003e\u003e conditional_rails_behavior_regex = /(ENV(\\[\"|\\.fetch\\(\"))?rails(_|\\.)env(\"\\]|\"\\))?( == \"|\\.)development/i\n\u003e\u003e conditional_rails_behavior = GemBench.find(look_for_regex: conditional_rails_behavior_regex).starters\n=\u003e [rack, actionpack, actioncable, actionmailer, rubocop, railties, rubocop-ruby2_7, sass, sass-rails]\n\u003e\u003e print conditional_rails_behavior.map {|gem| \"#{gem.name} has Rails.env condition in #{gem.stats}\" }.join(\"\\n\")\nrack has Rails.env condition in [[\"/Users/pboling/.asdf/installs/ruby/2.7.8/lib/ruby/gems/2.7.0/gems/rack-mini-profiler-3.1.0/lib/mini_profiler_rails/railtie.rb\", 1154]]\nactionpack has Rails.env condition in [[\"/Users/pboling/.asdf/installs/ruby/2.7.8/lib/ruby/gems/2.7.0/gems/actionpack-3.2.22.5/lib/action_controller/metal/force_ssl.rb\", 1377]]\nactioncable has Rails.env condition in [[\"/Users/pboling/.asdf/installs/ruby/2.7.8/lib/ruby/gems/2.7.0/gems/actioncable-5.2.8.1/lib/action_cable/engine.rb\", 886]]\nactionmailer has Rails.env condition in [[\"/Users/pboling/.asdf/installs/ruby/2.7.8/lib/ruby/gems/2.7.0/gems/actionmailer-7.0.5/lib/action_mailer/railtie.rb\", 807]]\nrubocop has Rails.env condition in [[\"/Users/pboling/.asdf/installs/ruby/2.7.8/lib/ruby/gems/2.7.0/gems/rubocop-ruby2_2-2.0.5/lib/rubocop/ruby2_2/railtie.rb\", 131]]\nrailties has Rails.env condition in [[\"/Users/pboling/.asdf/installs/ruby/2.7.8/lib/ruby/gems/2.7.0/gems/railties-3.2.22.5/lib/rails.rb\", 2478]]\nrubocop-ruby2_7 has Rails.env condition in [[\"/Users/pboling/.asdf/installs/ruby/2.7.8/lib/ruby/gems/2.7.0/gems/rubocop-ruby2_7-2.0.5/lib/rubocop/ruby2_7/railtie.rb\", 131]]\nsass has Rails.env condition in [[\"/Users/pboling/.asdf/installs/ruby/2.7.8/lib/ruby/gems/2.7.0/gems/sass-rails-5.1.0/lib/sass/rails/railtie.rb\", 3349]]\nsass-rails has Rails.env condition in [[\"/Users/pboling/.asdf/installs/ruby/2.7.8/lib/ruby/gems/2.7.0/gems/sass-rails-5.1.0/lib/sass/rails/railtie.rb\", 3349]]\n```\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n  \u003csummary\u003e Basic Gemfile Analysis\u003c/summary\u003e\n\nFire up an `irb` session or a `rails console` and then:\n\n    \u003e\u003e require 'gem_bench'\n    =\u003e true\n    \u003e\u003e team = GemBench.check({verbose: true}) # verbose: true =\u003e print output, verbose: false =\u003e just returns a GemBench::Team object you can inspect.\n\nHere is an example `irb` session where I have installed only `gem_bench`, `rails`, and `bundler`.  For the first run I don't require any gems besides `gem_bench`.\n\n    ∴ irb\n    \u003e\u003e require 'gem_bench'\n    =\u003e true\n    \u003e\u003e team = GemBench.check({verbose: true})\n    [GemBench] Will search for gems in [\"/Users/pboling/.rvm/gems/ruby-1.9.3-head@foss/gems\", \"/Users/pboling/.rvm/gems/ruby-1.9.3-head@global/gems\", \"/Users/pboling/.rvm/gems/ruby-1.9.3-head@foss/bundler/gems\"]\n    [GemBench] Will check Gemfile at /Users/pboling/Documents/src/my/gem_bench/Gemfile.\n    [GemBench] Detected 0 loaded gems\n      (excluding the 2 loaded gems which GemBench is configured to ignore)\n    [GemBench] No gems were evaluated by GemBench.\n    [GemBench] Usage: Require another gem in this session to evaluate it.\n      Example:\n        require 'rails'\n        GemBench.check({verbose: true})\n    [GemBench] Evaluated 0 gems against your Gemfile but found no primary dependencies which can safely skip require on boot (require: false).\n\nFor the second run I `require 'rails'` as well, and now I can see which rails dependencies are required at boot time.  I am in a project with a Gemfile, (gem_bench) but it doesn't depend on rails.\n\n    ∴ irb\n    \u003e\u003e require 'gem_bench'\n    =\u003e true\n    \u003e\u003e require 'rails'\n    =\u003e true\n    \u003e\u003e team = GemBench.check({verbose: true})\n    [GemBench] Will search for gems in [\"/Users/pboling/.rvm/gems/ruby-1.9.3-head@foss/gems\", \"/Users/pboling/.rvm/gems/ruby-1.9.3-head@global/gems\", \"/Users/pboling/.rvm/gems/ruby-1.9.3-head@foss/bundler/gems\"]\n    [GemBench] Will check Gemfile at /Users/pboling/Documents/src/my/gem_bench/Gemfile.\n    [GemBench] Detected 14 loaded gems\n      (excluding the 2 loaded gems which GemBench is configured to ignore)\n    [GemBench] You might want to verify that activesupport v3.2.13 really has a Rails::Railtie or Rails::Engine.  Check these files:\n      [\"/Users/pboling/.rvm/gems/ruby-1.9.3-head@foss/gems/activesupport-3.2.11/lib/active_support/i18n_railtie.rb\", 146]\n    [GemBench] You might want to verify that actionpack v3.2.13 really has a Rails::Railtie or Rails::Engine.  Check these files:\n      [\"/Users/pboling/.rvm/gems/ruby-1.9.3-head@foss/gems/actionpack-3.2.11/lib/action_controller/railtie.rb\", 248]\n    [GemBench] You might want to verify that railties v3.2.13 really has a Rails::Railtie or Rails::Engine.  Check these files:\n      [\"/Users/pboling/.rvm/gems/ruby-1.9.3-head@foss/gems/railties-3.2.11/lib/rails/application/configuration.rb\", 245]\n    [GemBench] If you want to check for false positives, the files to check for Railties and Engines are listed above.\n    [GemBench] 3 out of 14 evaluated gems actually need to be loaded at boot time. They are:\n      [SUGGESTION] 1) gem 'activesupport', '~\u003e 3.2.13'\n      [SUGGESTION] 2) gem 'actionpack', '~\u003e 3.2.13'\n      [SUGGESTION] 3) gem 'railties', '~\u003e 3.2.13'\n    [GemBench] Evaluated 14 gems against your Gemfile but found no primary dependencies which can safely skip require on boot (require: false).\n\nSee that?  Only 3 of the 14 gems rails loads need to be required when your app boots, technically!\nHowever, in order to prevent loading them we would have to make them primary dependencies, listed in the Gemfile, which isn't really the best idea.  Moving on...\nIf you run the check against a real app's Gemfile it will find numerous primary dependencies that don't need to be required at app boot. See Advanced Usage :)\n\nIn a random directory, in an irb session, where there is no Gemfile in sight it will give a lot more information.\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n  \u003csummary\u003eAdvanced Gemfile Analysis\u003c/summary\u003e\n\nIn order to *also* see list gems may *not* be required at boot time you need to:\n\n1. Make sure you are in the root of a project with a Gemfile\n2. Make sure the gem is actually a dependency in the Gemfile\n\nSo here's a [fat Gemfile][bundle-group-pattern] weighing in at 265 gem dependencies.  We'll use it for this example:\n\n    ∴ bundle exec rails console\n    Welcome to RAILS. You are using ruby 1.9.3p392 (2013-02-22 revision 39386) [x86_64-darwin12.2.1]. Have fun ;)\n    Loading development environment (Rails 3.2.13)\n    [1] pry(main)\u003e a = GemBench.check({verbose: true})\n    ... # snip # ...\n    [GemBench] If you want to check for false positives, the files to check for Railties and Engines are listed above.\n    [GemBench] 74 out of 265 evaluated gems actually need to be loaded at boot time. They are:\n      [SUGGESTION] 1) gem 'activesupport', '~\u003e 3.2.13', require: false\n      [SUGGESTION] 2) gem 'sprockets', '~\u003e 2.2.2', require: false\n      [SUGGESTION] 3) gem 'actionpack', '~\u003e 3.2.13', require: false\n      [SUGGESTION] 4) gem 'actionmailer', '~\u003e 3.2.13', require: false\n      [SUGGESTION] 5) gem 'activerecord', '~\u003e 3.2.13', require: false\n      [SUGGESTION] 6) gem 'activerecord-postgres-array', '~\u003e 0.0.9', require: false\n      [SUGGESTION] 7) gem 'activerecord-postgres-hstore', '~\u003e 0.7.6', require: false\n      [SUGGESTION] 8) gem 'activeresource', '~\u003e 3.2.13', require: false\n      [SUGGESTION] 9) gem 'railties', '~\u003e 3.2.13', require: false\n      [SUGGESTION] 10) gem 'acts-as-messageable', '~\u003e 0.4.8', require: false\n      [SUGGESTION] 11) gem 'airbrake', '~\u003e 3.1.10', require: false\n      [SUGGESTION] 12) gem 'asset_sync', '~\u003e 0.5.4', require: false\n      [SUGGESTION] 13) gem 'slim', '~\u003e 1.3.6', require: false\n      [SUGGESTION] 14) gem 'sidekiq', '~\u003e 2.10.0', require: false\n      [SUGGESTION] 15) gem 'aws-sdk', '~\u003e 1.8.5', require: false\n      [SUGGESTION] 16) gem 'better_errors', '~\u003e 0.8.0', require: false\n      [SUGGESTION] 17) gem 'sass', '~\u003e 3.2.7', require: false\n      [SUGGESTION] 18) gem 'bootstrap-sass', '~\u003e 2.3.1.0', require: false\n      [SUGGESTION] 19) gem 'haml', '~\u003e 4.0.1', require: false\n      [SUGGESTION] 20) gem 'bullet', '~\u003e 4.5.0', require: false\n      [SUGGESTION] 21) gem 'parallel', '~\u003e 0.6.4', require: false\n      [SUGGESTION] 22) gem 'cells', '~\u003e 3.8.8', require: false\n      [SUGGESTION] 23) gem 'coffee-rails', '~\u003e 3.2.2', require: false\n      [SUGGESTION] 24) gem 'compass', '~\u003e 0.12.2', require: false\n      [SUGGESTION] 25) gem 'compass-rails', '~\u003e 1.0.3', require: false\n      [SUGGESTION] 26) gem 'csv_pirate', '~\u003e 5.0.7', require: false\n      [SUGGESTION] 27) gem 'devise', '~\u003e 2.2.3', require: false\n      [SUGGESTION] 28) gem 'devise_invitable', '~\u003e 1.1.3', require: false\n      [SUGGESTION] 29) gem 'rails', '~\u003e 3.2.13', require: false\n      [SUGGESTION] 30) gem 'dismissible_helpers', '~\u003e 0.1.5', require: false\n      [SUGGESTION] 31) gem 'dotenv', '~\u003e 0.6.0', require: false\n      [SUGGESTION] 32) gem 'dry_views', '~\u003e 0.0.2', require: false\n      [SUGGESTION] 33) gem 'sass-rails', '~\u003e 3.2.6', require: false\n      [SUGGESTION] 34) gem 'font-awesome-sass-rails', '~\u003e 3.0.2.2', require: false\n      [SUGGESTION] 35) gem 'foundation-icons-sass-rails', '~\u003e 2.0.0', require: false\n      [SUGGESTION] 36) gem 'g', '~\u003e 1.7.2', require: false\n      [SUGGESTION] 37) gem 'geocoder', '~\u003e 1.1.6', require: false\n      [SUGGESTION] 38) gem 'geokit', '~\u003e 1.6.5', require: false\n      [SUGGESTION] 39) gem 'geokit-rails3', '~\u003e 0.1.5', require: false\n      [SUGGESTION] 40) gem 'pry', '~\u003e 0.9.12', require: false\n      [SUGGESTION] 41) gem 'rspec', '~\u003e 2.13.0', require: false\n      [SUGGESTION] 42) gem 'spork', '~\u003e 1.0.0rc3', require: false\n      [SUGGESTION] 43) gem 'haml-rails', '~\u003e 0.4', require: false\n      [SUGGESTION] 44) gem 'handlebars_assets', '~\u003e 0.12.0', require: false\n      [SUGGESTION] 45) gem 'hirefire-resource', '~\u003e 0.0.2', require: false\n      [SUGGESTION] 46) gem 'jquery-rails', '~\u003e 2.2.1', require: false\n      [SUGGESTION] 47) gem 'html5-rails', '~\u003e 0.0.7', require: false\n      [SUGGESTION] 48) gem 'jquery-ui-rails', '~\u003e 3.0.1', require: false\n      [SUGGESTION] 49) gem 'kaminari', '~\u003e 0.14.1', require: false\n      [SUGGESTION] 50) gem 'neography', '~\u003e 1.0.9', require: false\n      [SUGGESTION] 51) gem 'neoid', '~\u003e 0.1.2', require: false\n      [SUGGESTION] 52) gem 'nested_form', '~\u003e 0.3.2', require: false\n      [SUGGESTION] 53) gem 'newrelic_rpm', '~\u003e 3.6.0.78', require: false\n      [SUGGESTION] 54) gem 'parallel_tests', '~\u003e 0.10.4', require: false\n      [SUGGESTION] 55) gem 'pg', '~\u003e 0.15.0', require: false\n      [SUGGESTION] 56) gem 'rspec-rails', '~\u003e 2.13.0', require: false\n      [SUGGESTION] 57) gem 'pg_power', '~\u003e 1.3.1', require: false\n      [SUGGESTION] 58) gem 'pry-rails', '~\u003e 0.2.2', require: false\n      [SUGGESTION] 59) gem 'quiet_assets', '~\u003e 1.0.2', require: false\n      [SUGGESTION] 60) gem 'remotipart', '~\u003e 1.0.5', require: false\n      [SUGGESTION] 61) gem 'rails_admin', '~\u003e 0.4.6', require: false\n      [SUGGESTION] 62) gem 'requirejs-rails', '~\u003e 0.9.1.1', require: false\n      [SUGGESTION] 63) gem 'rolify', '~\u003e 3.2.0', require: false\n      [SUGGESTION] 64) gem 'rspec-cells', '~\u003e 0.1.6', require: false\n      [SUGGESTION] 65) gem 'sanitize_email', '~\u003e 1.0.6', require: false\n      [SUGGESTION] 66) gem 'simplecov', '~\u003e 0.7.1', require: false\n      [SUGGESTION] 67) gem 'spork-rails', '~\u003e 3.2.1', require: false\n      [SUGGESTION] 68) gem 'sprockets-rails', '~\u003e 0.0.1', require: false\n      [SUGGESTION] 69) gem 'stackable_flash', '~\u003e 0.0.7', require: false\n      [SUGGESTION] 70) gem 'state_machine', '~\u003e 1.2.0', require: false\n      [SUGGESTION] 71) gem 'teabag', '~\u003e 0.4.6', require: false\n      [SUGGESTION] 72) gem 'turbo-sprockets-rails3', '~\u003e 0.3.6', require: false\n      [SUGGESTION] 73) gem 'turbolinks', '~\u003e 1.1.1', require: false\n      [SUGGESTION] 74) gem 'zurb-foundation', '~\u003e 4.1.1', require: false\n    [GemBench] Evaluated 265 gems and Gemfile at /Users/pboling/Documents/RubyMineProjects/simple/Gemfile.\n    [GemBench] Here are 45 suggestions for improvement:\n      [SUGGESTION] 1) gem 'tilt', '~\u003e 1.3.6'\n      [SUGGESTION] 2) gem 'json', '~\u003e 1.7.7'\n      [SUGGESTION] 3) gem 'annotate', '~\u003e 2.5.0'\n      [SUGGESTION] 4) gem 'nokogiri', '~\u003e 1.5.9'\n      [SUGGESTION] 5) gem 'redis', '~\u003e 3.0.3'\n      [SUGGESTION] 6) gem 'sinatra', '~\u003e 1.3.6'\n      [SUGGESTION] 7) gem 'autoscaler', '~\u003e 0.2.1'\n      [SUGGESTION] 8) gem 'binding_of_caller', '~\u003e 0.7.1'\n      [SUGGESTION] 9) gem 'bourne', '~\u003e 1.4.0'\n      [SUGGESTION] 10) gem 'brakeman', '~\u003e 1.9.5'\n      [SUGGESTION] 11) gem 'cancan', '~\u003e 1.6.9'\n      [SUGGESTION] 12) gem 'capybara', '~\u003e 2.0.3'\n      [SUGGESTION] 13) gem 'chronic', '~\u003e 0.9.1'\n      [SUGGESTION] 14) gem 'compass-h5bp', '~\u003e 0.1.1'\n      [SUGGESTION] 15) gem 'database_cleaner', '~\u003e 0.9.1'\n      [SUGGESTION] 16) gem 'debugger', '~\u003e 1.5.0'\n      [SUGGESTION] 17) gem 'devise-async', '~\u003e 0.7.0'\n      [SUGGESTION] 18) gem 'dotenv-rails', '~\u003e 0.6.0'\n      [SUGGESTION] 19) gem 'email_spec', '~\u003e 1.4.0'\n      [SUGGESTION] 20) gem 'fabrication', '~\u003e 2.6.4'\n      [SUGGESTION] 21) gem 'fakeweb', '~\u003e 1.3.0'\n      [SUGGESTION] 22) gem 'flag_shih_tzu', '~\u003e 0.3.2'\n      [SUGGESTION] 23) gem 'friendly_id', '~\u003e 4.0.9'\n      [SUGGESTION] 24) gem 'guard', '~\u003e 1.7.0'\n      [SUGGESTION] 25) gem 'guard-rspec', '~\u003e 2.5.2'\n      [SUGGESTION] 26) gem 'i18n-airbrake', '~\u003e 0.0.2'\n      [SUGGESTION] 27) gem 'km', '~\u003e 1.1.3'\n      [SUGGESTION] 28) gem 'localtunnel', '~\u003e 0.3'\n      [SUGGESTION] 29) gem 'mailcatcher', '~\u003e 0.5.10'\n      [SUGGESTION] 30) gem 'numbers_and_words', '~\u003e 0.6.0'\n      [SUGGESTION] 31) gem 'oj', '~\u003e 2.0.10'\n      [SUGGESTION] 32) gem 'omniauth-facebook', '~\u003e 1.4.1'\n      [SUGGESTION] 33) gem 'poltergeist', '~\u003e 1.0.2'\n      [SUGGESTION] 34) gem 'pry-doc', '~\u003e 0.4.5'\n      [SUGGESTION] 35) gem 'puma', '~\u003e 2.0.0.b7'\n      [SUGGESTION] 36) gem 'queryable_array', '~\u003e 0.0.1'\n      [SUGGESTION] 37) gem 'rails_best_practices', '~\u003e 1.13.4'\n      [SUGGESTION] 38) gem 'redcarpet', '~\u003e 2.2.2'\n      [SUGGESTION] 39) gem 'redis-rails', '~\u003e 3.2.3'\n      [SUGGESTION] 40) gem 'shoulda-matchers', '~\u003e 1.4.2'\n      [SUGGESTION] 41) gem 'sidekiq-status', '~\u003e 0.3.0'\n      [SUGGESTION] 42) gem 'terminal-notifier', '~\u003e 1.4.2'\n      [SUGGESTION] 43) gem 'test-unit', '~\u003e 2.5.4'\n      [SUGGESTION] 44) gem 'uglifier', '~\u003e 1.3.0'\n      [SUGGESTION] 45) gem 'vestal_versions', '~\u003e 1.2.3'\n\n`gem_bench` found 45 gems which are listed as primary dependencies in my `Gemfile` which I can add `require: false` to.\nAfter adding `require: false`, try all these locally:\n\n1. running your tests\n2. starting the console\n3. starting the server and using your app\n4. running rake tasks if you have any special ones\n\nWhen doing these, you will probably encounter errors saying that a library is not available. You should then\nadd `require \"foo\"` where the error happens. Keep in mind that if this is in an initializer or environment file,\nyou aren't saving any time when the rails server is booting. However,\nit does save time when running a rake task that does not invoke the environment (some do, some don't). So, if\nyou don't think saving this time is worth the minor additional code complexity, you can exclude the `require: false`s\nin these cases.\n\nAfter adding your `require: false`s, run gem_bench again. The gem's logic isn't perfect so it sometimes\nwill find new suggested exclusions.\n\nHow much faster will my app boot loading 45 fewer gems?  A bit.\n\n**Note:** Some of the gems in the list above should have been excluded.  They are now excluded as of `gem_bench` version 0.0.4.\n\n\u003c/details\u003e\n\n## Future\n\nThis gem determines which gems need to be loaded at Rails' boot time by looking for Railties and Engines.\nA future version will also look for initializers, because gems which have code that runs (e.g. configuration) in an initializer also need to be loaded at boot time.\n\n## 🤝 Contributing\n\nSee [CONTRIBUTING.md][🤝contributing]\n\n[🤝contributing]: CONTRIBUTING.md\n\n### Code Coverage\n\nIf you need some ideas of where to help, you could work on adding more code coverage.\n\n[![Coverage Graph][🔑codecov-g]][🖇codecov]\n\n[🔑codecov-g]: https://codecov.io/gh/pboling/gem_bench/graphs/tree.svg?token=selEoMrZzA\n\n## 🌈 Contributors\n\n[![Contributors][🖐contributors-img]][🖐contributors]\n\nMade with [contributors-img][🖐contrib-rocks].\n\n[🖐contrib-rocks]: https://contrib.rocks\n[🖐contributors]: https://github.com/pboling/gem_bench/graphs/contributors\n[🖐contributors-img]: https://contrib.rocks/image?repo=pboling/gem_bench\n\n## Star History\n\n\u003ca href=\"https://star-history.com/#pboling/gem_bench\u0026Date\"\u003e\n \u003cpicture\u003e\n   \u003csource media=\"(prefers-color-scheme: dark)\" srcset=\"https://api.star-history.com/svg?repos=pboling/gem_bench\u0026type=Date\u0026theme=dark\" /\u003e\n   \u003csource media=\"(prefers-color-scheme: light)\" srcset=\"https://api.star-history.com/svg?repos=pboling/gem_bench\u0026type=Date\" /\u003e\n   \u003cimg alt=\"Star History Chart\" src=\"https://api.star-history.com/svg?repos=pboling/gem_bench\u0026type=Date\" /\u003e\n \u003c/picture\u003e\n\u003c/a\u003e\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 [code of conduct][🪇conduct].\n\n[🪇conduct]: CODE_OF_CONDUCT.md\n\n## 📌 Versioning\n\nThis Library adheres to [Semantic Versioning 2.0.0][📌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\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, you 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_bench\", \"~\u003e 2.0\")\n```\n\nSee [CHANGELOG.md][📌changelog] for list of releases.\n\n[comment]: \u003c\u003e ( 📌 VERSIONING LINKS )\n\n[📌pvc]: http://guides.rubygems.org/patterns/#pessimistic-version-constraint\n[📌semver]: http://semver.org/\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\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[comment]: \u003c\u003e ( 📄 LEGAL LINKS )\n\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\n### © Copyright\n\n* Copyright (c) 2013 - 2014, 2016 - 2020, 2023 - 2024 [Peter H. Boling][peterboling] of [Rails Bling][railsbling]\n\n[railsbling]: http://www.railsbling.com\n[peterboling]: http://www.peterboling.com\n[bundle-group-pattern]: https://gist.github.com/pboling/4564780\n[documentation]: http://rdoc.info/github/pboling/gem_bench/frames\n[homepage]: https://github.com/pboling/gem_bench\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgaltzo-floss%2Fgem_bench","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fgaltzo-floss%2Fgem_bench","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgaltzo-floss%2Fgem_bench/lists"}