gem_bench 2.0.0 → 2.0.2

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: bb28fac08232d2a64f31d1c3ac4dd0172ae1898460cc24b6770d84bb6fb8f478
4
- data.tar.gz: abe5ec2c0d44d28e70dd89141da8d56e3c440f80b21b5ff8d197aaa01031e10e
3
+ metadata.gz: 59e1de2253ef3ec5e1a82ee85837764bd4f5bb52e4e1445489d7ae3d28adf5b6
4
+ data.tar.gz: '088ee6272de7a10656b202e1a24a29cfc144e0032e218fdb6322552eec416fe5'
5
5
  SHA512:
6
- metadata.gz: 8a56aa10d455dbf1b745af1d83b80db1c5501ae78edf3ddd3fcb8047e4230512249249215240765a540a963eff6551149406d534ba5fa209a10bce8e358884a9
7
- data.tar.gz: 58e77a2c83629a736e203c8918f8258f04f0e83357a403b53669f1a439d5996f34f429701d7be5bc154842dcf941fa27c0884afba976b6d8e1a031d44f83dc19
6
+ metadata.gz: 98f28036a4f33a517593ed8af78fdf3b177d4033bc58a3e1be55958513ec28e72f24dad753f3c400fa0b35af6b40b85d17026e11fed669862dd2b8d56f7690bc
7
+ data.tar.gz: e5334f36e3e534be04804c83ee37eb94810b05aa73fefcb1c39b573f3fdab692ea1f4a9ca5b5a929bdc0a2666dcb591520f8648e412fc30ff3c44bc76c5da9bd
checksums.yaml.gz.sig CHANGED
Binary file
data/CHANGELOG.md CHANGED
@@ -11,37 +11,68 @@ and this project adheres to [Semantic Versioning v2](https://semver.org/spec/v2.
11
11
  ### Fixed
12
12
  ### Removed
13
13
 
14
+ [2.0.2] SEP.17.2024
15
+ COVERAGE: 82.15% -- 382/465 lines in 9 files
16
+ BRANCH COVERAGE: 58.79% -- 97/165 branches in 9 branches
17
+ 51.72% documented
18
+ ### Added
19
+ - CI for Ancient Rubies
20
+ - Ruby 2.3
21
+ - Ruby 2.4
22
+ - Ruby 2.5
23
+ - Ruby 2.6
24
+ - More & improved documentation
25
+ ### Fixed
26
+ - Typo in URL in documentation
27
+ - Gemspec description & Summary
28
+
29
+ [2.0.1] SEP.17.2024
30
+ COVERAGE: 82.15% -- 382/465 lines in 9 files
31
+ BRANCH COVERAGE: 58.08% -- 97/167 branches in 9 files
32
+ 51.72% documented
33
+ ### Added
34
+ - Ability to re-namespace and load copy of a gem alongside vanilla version for benchmarking via `GemBench::Jersey`
35
+ - See: https://github.com/panorama-ed/memo_wise/pull/339
36
+ - Many more tests
37
+ - `kettle-soup-cover` for test coverage enforcement
38
+ - Better documentation
39
+ - Improved instructions for contributing
40
+ ### Changed
41
+ - Improved `bin/checksums`
42
+ ### Fixed
43
+ - Stopped swallowing `ArgumentError` in certain exceptional cases
44
+
14
45
  [2.0.0] SEP.25.2023
15
46
  ### Added
16
- * Compatible with Bundler 2+
17
- * Checksums for release
18
- * SHA-256
19
- * SHA-512
20
- * Signed releases
21
- * Add CODE_OF_CONDUCT.md
22
- * Add SECURITY.md (Security policy)
23
- * Github Actions
47
+ - Compatible with Bundler 2+
48
+ - Checksums for release
49
+ - SHA-256
50
+ - SHA-512
51
+ - Signed releases
52
+ - Add CODE_OF_CONDUCT.md
53
+ - Add SECURITY.md (Security policy)
54
+ - Github Actions
24
55
  ### Changed
25
- * Dropped support for Ruby 2.0, 2.1, and 2.2
26
- * `VERSION` constant now lives at `GemBench::Version::VERSION`, enhanced by `version_gem`
27
- * Changelog updated to Keep-a-changelog format (going forward)
56
+ - Dropped support for Ruby 2.0, 2.1, and 2.2
57
+ - `VERSION` constant now lives at `GemBench::Version::VERSION`, enhanced by `version_gem`
58
+ - Changelog updated to Keep-a-changelog format (going forward)
28
59
  ### Removed
29
- * Removed Appraisals
30
- * Removed Travis-CI
60
+ - Removed Appraisals
61
+ - Removed Travis-CI
31
62
 
32
63
  [1.0.6] SEP.09.2018
33
- * Documentation improvements
34
- * Add Ruby 2.5 to build matrix
64
+ - Documentation improvements
65
+ - Add Ruby 2.5 to build matrix
35
66
 
36
67
  [1.0.5] JUN.05.2017
37
- * Allow github macro as an alternative to git within Gemfile for strict version constraint analysis
68
+ - Allow github macro as an alternative to git within Gemfile for strict version constraint analysis
38
69
 
39
70
  [1.0.3] JUN.02.2017
40
- * fixed accidental removal of loaded_gems in 1.0.2
41
- * better documentation
71
+ - fixed accidental removal of loaded_gems in 1.0.2
72
+ - better documentation
42
73
 
43
74
  [1.0.2] JUN.02.2017
44
- * version constraint checking, useful to add a spec enforcing Gemfile version constraints, by Peter Boling
75
+ - version constraint checking, useful to add a spec enforcing Gemfile version constraints, by Peter Boling
45
76
  - Console use:
46
77
  - GemBench::StrictVersionRequirement.new({verbose: true})
47
78
  - Spec use:
@@ -55,41 +86,41 @@ end
55
86
  ```
56
87
 
57
88
  [1.0.1] MAR.25.2017
58
- * fixed a typo that prevented Gemfile comparison by mobilutz
89
+ - fixed a typo that prevented Gemfile comparison by mobilutz
59
90
 
60
91
  [1.0.0] FEB.26.2017
61
- * New feature: scan all code (except for test/spec/feature code) in all loaded gems for a given regex:
92
+ - New feature: scan all code (except for test/spec/feature code) in all loaded gems for a given regex:
62
93
  - puts GemBench.find(look_for_regex: /HERE BE DRAGONS/).starters.map {|gem| "#{gem.name} has DRAGONS at #{gem.stats}" }.join("\n")
63
- * Added basic specs
64
- * More Documentation
65
- * added back git dependency to gemspec (pulled in latest Gem scaffolding from Bundler :/)
94
+ - Added basic specs
95
+ - More Documentation
96
+ - added back git dependency to gemspec (pulled in latest Gem scaffolding from Bundler :/)
66
97
 
67
98
  [0.0.8] JAN.16.2014
68
- * Corrected issues with 0.0.7 release.
69
- * More Documentation
70
- * removed git dependency from gemspec
99
+ - Corrected issues with 0.0.7 release.
100
+ - More Documentation
101
+ - removed git dependency from gemspec
71
102
 
72
103
  [0.0.7] DEC.23.2013 (Yanked immediately)
73
- * Attempt to fix failure on encoding problem, with a rescue fallback (Issue #1) by Peter Boling
74
- * Readme / Documentation improvements by John Bachir
75
- * Runtime output improvements by John Bachir
104
+ - Attempt to fix failure on encoding problem, with a rescue fallback (Issue #1) by Peter Boling
105
+ - Readme / Documentation improvements by John Bachir
106
+ - Runtime output improvements by John Bachir
76
107
 
77
108
  [0.0.6] AUG.29.2013
78
- * Added license to gemspec by Peter Boling
79
- * No longer altering Ruby load path - Let the gem manager do that by Peter Boling
109
+ - Added license to gemspec by Peter Boling
110
+ - No longer altering Ruby load path - Let the gem manager do that by Peter Boling
80
111
 
81
112
  [0.0.5] AUG.28.2013
82
- * Encode as UTF-8 prior to comparison by Peter Boling
113
+ - Encode as UTF-8 prior to comparison by Peter Boling
83
114
 
84
115
  [0.0.4] APR.06.2013
85
- * Expanded exclusion list by Peter Boling
116
+ - Expanded exclusion list by Peter Boling
86
117
 
87
118
  [0.0.3] APR.06.2013
88
- * Late night coding needs more coffee by Peter Boling
119
+ - Late night coding needs more coffee by Peter Boling
89
120
 
90
121
  [0.0.2] APR.06.2013
91
- * Works against 265 dependency Gemfile by Peter Boling
92
- * Added ability to evaluate a Gemfile by Peter Boling
122
+ - Works against 265 dependency Gemfile by Peter Boling
123
+ - Added ability to evaluate a Gemfile by Peter Boling
93
124
 
94
125
  [0.0.1] APR.05.2013
95
- * Initial release by Peter Boling
126
+ - Initial release by Peter Boling
data/CONTRIBUTING.md CHANGED
@@ -1,46 +1,62 @@
1
1
  ## Contributing
2
2
 
3
- Bug reports and pull requests are welcome on GitLab at [https://gitlab.com/rubocop-lts/standard-rubocop-lts][🚎src-main]
4
- . This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to
5
- the [code of conduct][conduct].
3
+ Bug reports and pull requests are welcome on GitHub at [https://github.com/pboling/gem_bench][🚎src-main].
4
+ This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to
5
+ the [code of conduct][🤝conduct].
6
6
 
7
7
  To submit a patch, please fork the project and create a patch with tests. Once you're happy with it send a pull request
8
- and post a message to the [gitter chat][🏘chat].
8
+ and you might also post a message to the [gitter chat][🏘chat].
9
9
 
10
10
  ## Development
11
11
 
12
- After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake spec` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
12
+ After checking out the repo, run `bin/setup` to install dependencies.
13
+ Then, run `bin/rake` to run the default rake tasks, which include specs.
14
+ You can also run `bin/console` for an interactive prompt that will allow you to experiment.
13
15
 
14
16
  ## Release
15
17
 
16
- To release a new version:
18
+ ### One-time, Per-developer, Setup
19
+
20
+ **IMPORTANT**: Your public key for signing gems will need to be picked up by the line in the
21
+ `gemspec` defining the `spec.cert_chain` (check the relevant ENV variables there),
22
+ in order to sign the new release.
23
+ See: [RubyGems Security Guide][🔒️rubygems-security-guide]
24
+
25
+ ### To release a new version:
17
26
 
18
27
  1. Run `bin/setup && bin/rake` as a tests, coverage, & linting sanity check
19
- 2. update the version number in `version.rb`
28
+ 2. Update the version number in `version.rb`
20
29
  3. Run `bin/setup && bin/rake` again as a secondary check, and to update `Gemfile.lock`
21
- 4. Double check the `CHANGELOG.md`, make sure changes are documented
22
- 5. run `git commit -am "🔖 Prepare release v<VERSION>"` to commit the changes
23
- 6. Run `git push` to trigger the final CI pipeline before release, & merge PRs
24
- 7. Run `git checkout main` (Or whichever branch is considered `trunk`, e.g. `master`)
25
- 8. Run `git pull origin main` to ensure you will release the latest trunk code.
26
- 9. Run `bundle exec rake build`
27
- 10. Run `bin/checksum` to create and commit the SHA256 & SHA512 checksums
28
- 11. Run `bundle exec rake release`
29
-
30
- NOTE: You will need to have a public key in `certs/`, and list your cert in the
31
- `gemspec`, in order to sign the new release.
32
- See: [RubyGems Security Guide][rubygems-security-guide]
30
+ 4. Run `git commit -am "🔖 Prepare release v<VERSION>"` to commit the changes
31
+ 5. Run `git push` to trigger the final CI pipeline before release, & merge PRs
32
+ - NOTE: Remember to [check the build][🧪build]!
33
+ 6. Run `export GIT_TRUNK_BRANCH_NAME="$(git remote show origin | grep 'HEAD branch' | cut -d ' ' -f5)" && echo $GIT_TRUNK_BRANCH_NAME`
34
+ 7. Run `git checkout $GIT_TRUNK_BRANCH_NAME`
35
+ 8. Run `git pull origin $GIT_TRUNK_BRANCH_NAME` to ensure you will release the latest trunk code
36
+ 9. Set `SOURCE_DATE_EPOCH` so `rake build` and `rake release` use same timestamp, and generate same checksums
37
+ - Run `export SOURCE_DATE_EPOCH=$EPOCHSECONDS && echo $SOURCE_DATE_EPOCH`
38
+ - If the echo above has no output, then it didn't work.
39
+ - Note that you'll need the `zsh/datetime` module, if running `zsh`.
40
+ - In `bash` you can use `date +%s` instead, i.e. `export SOURCE_DATE_EPOCH=$(date +%s) && echo $SOURCE_DATE_EPOCH`
41
+ 10. Run `bundle exec rake build`
42
+ 11. Run `bin/checksums` (more [context][🔒️rubygems-checksums-pr]) to create SHA-256 and SHA-512 checksums
43
+ - Checksums will be committed automatically by the script, but not pushed
44
+ 12. Run `bundle exec rake release` which will create a git tag for the version,
45
+ push git commits and tags, and push the `.gem` file to [rubygems.org][💎rubygems]
33
46
 
34
47
  ## Contributors
35
48
 
36
- [![Contributors](https://contrib.rocks/image?repo=pboling/gitmoji-regex)][🖐contributors]
49
+ [![Contributors][🖐contributors-img]][🖐contributors]
37
50
 
38
- Made with [contributors-img][contrib-rocks].
51
+ Made with [contributors-img][🖐contrib-rocks].
39
52
 
53
+ [🧪build]: https://github.com/pboling/gem_bench/actions
54
+ [🤝conduct]: https://github.com/pboling/gem_bench/blob/main/CODE_OF_CONDUCT.md
55
+ [🖐contrib-rocks]: https://contrib.rocks
40
56
  [🖐contributors]: https://github.com/pboling/gem_bench/graphs/contributors
41
- [contrib-rocks]: https://contrib.rocks
42
- [conduct]: https://github.com/pboling/gem_bench/blob/main/CODE_OF_CONDUCT.md
43
- [🚎src-main]: https://github.com/pboling/gem_bench/tree/main
57
+ [🖐contributors-img]: https://contrib.rocks/image?repo=pboling/gem_bench
58
+ [💎rubygems]: https://rubygems.org
59
+ [🔒️rubygems-security-guide]: https://guides.rubygems.org/security/#building-gems
60
+ [🔒️rubygems-checksums-pr]: https://github.com/rubygems/guides/pull/325
61
+ [🚎src-main]: https://github.com/pboling/gem_bench
44
62
  [🏘chat]: https://matrix.to/#/%23pboling_gem_bench:gitter.im
45
- [rubygems-security-guide]: https://guides.rubygems.org/security/#building-gems
46
- [rubygems]: https://rubygems.org
data/LICENSE.txt CHANGED
@@ -1,6 +1,6 @@
1
1
  MIT License
2
2
 
3
- Copyright (c) 2013 - 2018 Peter H. Boling, http://railsbling.com
3
+ Copyright (c) 2013 - 2014, 2016 - 2020, 2023 - 2024 Peter H. Boling, http://railsbling.com
4
4
 
5
5
  Permission is hereby granted, free of charge, to any person obtaining a copy
6
6
  of this software and associated documentation files (the "Software"), to deal
data/README.md CHANGED
@@ -1,43 +1,175 @@
1
1
  # GemBench
2
2
 
3
- `gem_bench` is for static Gemfile and installed gem library source code analysis.
4
-
5
- `gem_bench` can also be used to trim down app load times by keeping your worst players on the bench.
6
-
7
- Gem: "Put me in coach!"
8
- You: ❨╯°□°❩╯︵┻━┻
9
-
10
- | Project | GemBench |
11
- |------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
12
- | gem name | [gem_bench](https://rubygems.org/gems/gem_bench) |
13
- | license | [![License: MIT](https://img.shields.io/badge/License-MIT-green.svg)](https://opensource.org/licenses/MIT) |
14
- | download rank | [![Downloads Today](https://img.shields.io/gem/rd/gem_bench.svg)](https://github.com/pboling/gem_bench) |
15
- | version | [![Version](https://img.shields.io/gem/v/gem_bench.svg)](https://rubygems.org/gems/gem_bench) |
16
- | dependencies | [![Depfu](https://badges.depfu.com/badges/865e7bb1d0d3eb3ba807fca7344e22d1/overview.svg)](https://depfu.com/github/pboling/gem_bench?project_id=5613) |
17
- | continuous integration | [![Current][🚎cwfi]][🚎cwf] [![Heads][🖐hwfi]][🖐hwf] [![Style][🧮swfi]][🧮swf] [![Coverage][📗cov-wfi]][📗cov-wf] |
18
- | test coverage | [![Test Coverage](https://api.codeclimate.com/v1/badges/80787f126e7a486b19af/test_coverage)](https://codeclimate.com/github/pboling/gem_bench/test_coverage) |
19
- | maintainability | [![Maintainability](https://api.codeclimate.com/v1/badges/80787f126e7a486b19af/maintainability)](https://codeclimate.com/github/pboling/gem_bench/maintainability) |
20
- | code triage | [![Open Source Helpers](https://www.codetriage.com/pboling/gem_bench/badges/users.svg)](https://www.codetriage.com/pboling/gem_bench) |
21
- | homepage | [on Github.com][homepage] |
22
- | documentation | [on Rdoc.info][documentation] |
23
- | live chat | [![Join the chat][🏘chati]][🏘chat] |
24
- | expert support | [![Get help on Codementor](https://cdn.codementor.io/badges/get_help_github.svg)](https://www.codementor.io/peterboling?utm_source=github&utm_medium=button&utm_term=peterboling&utm_campaign=github) |
25
- | Spread ~♡ⓛⓞⓥⓔ♡~ | [🌏](https://about.me/peter.boling), [👼](https://angel.co/peter-boling), [![Tweet Peter](https://img.shields.io/twitter/follow/galtzo.svg?style=social&label=Follow)](http://twitter.com/galtzo) |
26
-
27
- [🚎cwf]: https://github.com/rubocop-lts/rubocop-lts/actions/workflows/current.yml
28
- [🚎cwfi]: https://github.com/rubocop-lts/rubocop-lts/actions/workflows/current.yml/badge.svg
29
- [🖐hwf]: https://github.com/rubocop-lts/rubocop-lts/actions/workflows/heads.yml
30
- [🖐hwfi]: https://github.com/rubocop-lts/rubocop-lts/actions/workflows/heads.yml/badge.svg
31
- [🧮swf]: https://github.com/rubocop-lts/rubocop-lts/actions/workflows/style.yml
32
- [🧮swfi]: https://github.com/rubocop-lts/rubocop-lts/actions/workflows/style.yml/badge.svg
33
- [📗cov-wf]: https://github.com/rubocop-lts/rubocop-lts/actions/workflows/coverage.yml
34
- [📗cov-wfi]: https://github.com/rubocop-lts/rubocop-lts/actions/workflows/coverage.yml/badge.svg
3
+ <div id="badges">
4
+
5
+ <div align="center">
6
+
7
+ [![License: MIT](https://img.shields.io/badge/License-MIT-green.svg)](https://opensource.org/licenses/MIT)
8
+ [![Version](https://img.shields.io/gem/v/gem_bench.svg)](https://rubygems.org/gems/gem_bench)
9
+ [![Downloads Today](https://img.shields.io/gem/rd/gem_bench.svg)](https://github.com/pboling/gem_bench)
10
+ [![Depfu](https://badges.depfu.com/badges/865e7bb1d0d3eb3ba807fca7344e22d1/overview.svg)](https://depfu.com/github/pboling/gem_bench?project_id=2688)
11
+ [![CodeCov][🖇codecov-img♻️]][🖇codecov]
12
+ [![Test Coverage](https://api.codeclimate.com/v1/badges/80787f126e7a486b19af/test_coverage)](https://codeclimate.com/github/pboling/gem_bench/test_coverage)
13
+ [![Maintainability](https://api.codeclimate.com/v1/badges/80787f126e7a486b19af/maintainability)](https://codeclimate.com/github/pboling/gem_bench/maintainability)
14
+ [![CI Supported Build][🚎s-wfi]][🚎s-wf]
15
+ [![CI Unsupported Build][🚎us-wfi]][🚎us-wf]
16
+ [![CI Style Build][🚎st-wfi]][🚎st-wf]
17
+ [![CI Coverage Build][🚎cov-wfi]][🚎cov-wf]
18
+ [![CI Heads Build][🚎hd-wfi]][🚎hd-wf]
19
+ [![CI Ancient Build][🚎an-wfi]][🚎an-wf]
20
+
21
+ [🖇codecov-img♻️]: https://codecov.io/gh/pboling/gem_bench/graph/badge.svg?token=selEoMrZzA
22
+ [🖇codecov]: https://codecov.io/gh/pboling/gem_bench
23
+ [🚎s-wf]: https://github.com/pboling/gem_bench/actions/workflows/supported.yml
24
+ [🚎s-wfi]: https://github.com/pboling/gem_bench/actions/workflows/supported.yml/badge.svg
25
+ [🚎us-wf]: https://github.com/pboling/gem_bench/actions/workflows/unsupported.yml
26
+ [🚎us-wfi]: https://github.com/pboling/gem_bench/actions/workflows/unsupported.yml/badge.svg
27
+ [🚎st-wf]: https://github.com/pboling/gem_bench/actions/workflows/style.yml
28
+ [🚎st-wfi]: https://github.com/pboling/gem_bench/actions/workflows/style.yml/badge.svg
29
+ [🚎cov-wf]: https://github.com/pboling/gem_bench/actions/workflows/coverage.yml
30
+ [🚎cov-wfi]: https://github.com/pboling/gem_bench/actions/workflows/coverage.yml/badge.svg
31
+ [🚎hd-wf]: https://github.com/pboling/gem_bench/actions/workflows/heads.yml
32
+ [🚎hd-wfi]: https://github.com/pboling/gem_bench/actions/workflows/heads.yml/badge.svg
33
+ [🚎an-wf]: https://github.com/pboling/gem_bench/actions/workflows/ancient.yml
34
+ [🚎an-wfi]: https://github.com/pboling/gem_bench/actions/workflows/ancient.yml/badge.svg
35
+
36
+ </div>
37
+
38
+ -----
39
+
40
+ <div align="center">
41
+
42
+ [![Liberapay Patrons][⛳liberapay-img]][⛳liberapay]
43
+ [![Sponsor Me on Github][🖇sponsor-img]][🖇sponsor]
44
+ [![Polar Shield][🖇polar-img]][🖇polar]
45
+ [![Donate to my FLOSS or refugee efforts at ko-fi.com][🖇kofi-img]][🖇kofi]
46
+ [![Donate to my FLOSS or refugee efforts using Patreon][🖇patreon-img]][🖇patreon]
47
+
48
+ [⛳liberapay-img]: https://img.shields.io/liberapay/patrons/pboling.svg?logo=liberapay
49
+ [⛳liberapay]: https://liberapay.com/pboling/donate
50
+ [🖇sponsor-img]: https://img.shields.io/badge/Sponsor_Me!-pboling.svg?style=social&logo=github
51
+ [🖇sponsor]: https://github.com/sponsors/pboling
52
+ [🖇polar-img]: https://polar.sh/embed/seeks-funding-shield.svg?org=pboling
53
+ [🖇polar]: https://polar.sh/pboling
54
+ [🖇kofi-img]: https://img.shields.io/badge/buy%20me%20coffee-donate-yellow.svg
55
+ [🖇kofi]: https://ko-fi.com/O5O86SNP4
56
+ [🖇patreon-img]: https://img.shields.io/badge/patreon-donate-yellow.svg
57
+ [🖇patreon]: https://patreon.com/galtzo
58
+
59
+ <span class="badge-buymealatte">
60
+ <a href="https://www.buymeacoffee.com/pboling"><img src="https://img.buymeacoffee.com/button-api/?text=Buy me a latte&emoji=&slug=pboling&button_colour=FFDD00&font_colour=000000&font_family=Cookie&outline_colour=000000&coffee_colour=ffffff" /></a>
61
+ </span>
62
+
63
+ </div>
64
+ </div>
65
+
66
+ ## What's it do?
67
+
68
+ 🏁 Copy & Re-namespace any gem to benchmark side-by-side with `benchmarks-ips`!
69
+
70
+ 👯 For example, many of the ~dozen Memoization gems use the same namespaces (`Memoist`, `Memery`, etc).
71
+ In order to compare them side-by-side one of them must be re-namespaced.
72
+
73
+ <details>
74
+ <summary>Scene: Spectator at a game of Ruby Sports Gem Ball</summary>
75
+
76
+ Gem wearing jersey **#23**:
77
+
78
+ > "Put me in coach!"
79
+
80
+ Other Gem, also wearing jersey **#23**:
81
+
82
+ > "Put me in coach!"
83
+
84
+ Coach:
85
+
86
+ > ❨╯°□°❩╯︵┻━┻ fine, but one of you change your jersey first!
87
+
88
+ </details>
89
+
90
+ 🤩 Benchmark trunk against released version of a library!
91
+
92
+ 🧐 A `git clone` build can now be run against the latest public release build, side-by-side, by re-namespacing one of them.
93
+
94
+ 🕵️‍♀️ Static Gemfile and installed gem library source code analysis.
95
+ Regex search through all of a project's source code, including installed Bundler dependencies.
96
+
97
+ 🛟 Trim down app load times, such as on Heroku, by finding and keeping your worst players on the bench.
98
+
99
+ | Project | GemBench |
100
+ |----------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
101
+ | gem name | [gem_bench](https://rubygems.org/gems/gem_bench) |
102
+ | code triage | [![Open Source Helpers](https://www.codetriage.com/pboling/gem_bench/badges/users.svg)](https://www.codetriage.com/pboling/gem_bench) |
103
+ | homepage | [on Github.com][homepage] |
104
+ | documentation | [on Rdoc.info][documentation] |
105
+ | live chat | [![Join the chat][🏘chati]][🏘chat] |
106
+ | expert support | [![Get help on Codementor](https://cdn.codementor.io/badges/get_help_github.svg)](https://www.codementor.io/peterboling?utm_source=github&utm_medium=button&utm_term=peterboling&utm_campaign=github) |
107
+ | `...` 💖 | [![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] |
108
+
35
109
  [🏘chat]: https://matrix.to/#/%23pboling_gem_bench:gitter.im
36
110
  [🏘chati]: https://badges.gitter.im/Join%20Chat.svg
37
111
 
112
+ <!-- 7️⃣ spread 💖 -->
113
+ [🐦tweet-img]: https://img.shields.io/twitter/follow/galtzo.svg?style=social&label=Follow%20%40galtzo
114
+ [🐦tweet]: http://twitter.com/galtzo
115
+ [🚎blog]: http://www.railsbling.com/tags/gem_bench/
116
+ [🚎blog-img]: https://img.shields.io/badge/blog-railsbling-brightgreen.svg?style=flat
117
+ [🖇linkedin]: http://www.linkedin.com/in/peterboling
118
+ [🖇linkedin-img]: https://img.shields.io/badge/PeterBoling-blue?style=plastic&logo=linkedin
119
+ [✌️wellfound]: https://angel.co/u/peter-boling
120
+ [✌️wellfound-img]: https://img.shields.io/badge/peter--boling-orange?style=plastic&logo=wellfound
121
+ [💲crunchbase]: https://www.crunchbase.com/person/peter-boling
122
+ [💲crunchbase-img]: https://img.shields.io/badge/peter--boling-purple?style=plastic&logo=crunchbase
123
+ [🐘ruby-mast]: https://ruby.social/@galtzo
124
+ [🐘ruby-mast-img]: https://img.shields.io/mastodon/follow/109447111526622197?domain=https%3A%2F%2Fruby.social&style=plastic&logo=mastodon&label=Ruby%20%40galtzo
125
+ [🌳linktree]: https://linktr.ee/galtzo
126
+ [🌳linktree-img]: https://img.shields.io/badge/galtzo-purple?style=plastic&logo=linktree
127
+
128
+ <!-- Maintainer Contact Links -->
129
+ [aboutme]: https://about.me/peter.boling
130
+ [coderme]: https://coderwall.com/Peter%20Boling
131
+
132
+ ### New for 2.0.1 - `GemBench::Jersey`
133
+
134
+ Allows you to re-namespace any gem.
135
+ You can, for example, benchmark a gem against another version of itself.
136
+
137
+ The gem `alt_memery` uses a namespace, `Memery`, that does not match the gem name.
138
+
139
+ ```ruby
140
+ require "gem_bench/jersey"
141
+
142
+ jersey = GemBench::Jersey.new(
143
+ gem_name: "alt_memery",
144
+ trades: {"Memery" => "AltMemery"},
145
+ metadata: { # optional, mostly used for benchmarking report output
146
+ something: "a value here",
147
+ something_else: :obviously,
148
+ },
149
+ )
150
+ jersey.doff_and_don
151
+ # The re-namespaced constant is now available!
152
+ AltMemery # => AltMemery
153
+ jersey.as_klass # => AltMemery
154
+
155
+ # The original, unmodified, gem is still there!
156
+ require "alt_memery"
157
+
158
+ Memery # => Memery
159
+ # So you can use both!
160
+ ```
161
+
162
+ NOTE: It is not required by default, so you do need to require the Jersey if you want to use it!
163
+
164
+ ```ruby
165
+ require "gem_bench/jersey"
166
+ ```
167
+
168
+ For a real example, see: https://github.com/panorama-ed/memo_wise/pull/339
169
+
38
170
  ### New for 2.0.0 - Dropped Support for Ruby 2.0, 2.1, 2.2
39
171
 
40
- -- Required Ruby is now 2.3+
172
+ - Required Ruby is now 2.3+
41
173
  - `VERSION` is now namespaced at `GemBench::Version::VERSION` and is enhanced by `version_gem`.
42
174
 
43
175
  ### New for 1.0.2 - Gemfile specs
@@ -45,6 +177,7 @@ You: ❨╯°□°❩╯︵┻━┻
45
177
  Version constraints are important. Give the Gemfile some love in your CI build
46
178
 
47
179
  Create a `spec/gemfile_spec.rb` like:
180
+
48
181
  ```ruby
49
182
  Rspec.describe("Gemfile") do
50
183
  it("has version constraint on every gem") do
@@ -76,8 +209,16 @@ For string version constraints anything is allowed (e.g. `'~> 1.0'`), as it assu
76
209
 
77
210
  Search the Ruby source code of all the gems loaded by your Gemfile for a specified regex, to find out which gems have wat DRAGONS.
78
211
 
79
- Gem: "I have no wat DRAGONS!"
80
- You: ❨╯°□°❩╯︵┻━┻
212
+ <details>
213
+ <summary>Scene: Rubiana Jones is searching for WAT Dragon relics in dusty bins of source code</summary>
214
+
215
+ Gem:
216
+
217
+ > "I have no wat DRAGONS!"`
218
+
219
+ Rubiana Jones:
220
+
221
+ > ❨╯°□°❩╯︵┻━┻ Yes you do!
81
222
 
82
223
  ```
83
224
  >> puts GemBench.find(look_for_regex: /wat/).starters.map {|gem| "#{gem.name} has wat DRAGONS at #{gem.stats}" }.join("\n")
@@ -90,6 +231,8 @@ byebug has wat DRAGONS at [["/Users/pboling/.rvm/gems/ruby-2.4.0@foss/gems/byebu
90
231
  NOTE: 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.
91
232
  NOTE: 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!
92
233
 
234
+ </details>
235
+
93
236
  It is a fact of RubyGems that many of them do not need to be loaded by your app at boot time.
94
237
  It is a fact of Bundler that you don't know which ones need to be 'required' while staring at the Gemfile.
95
238
  It 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 ❨╯°□°❩╯︵┻━┻
@@ -100,11 +243,22 @@ You can even use it to evaluate your project's actual Gemfile for easy peasy boo
100
243
 
101
244
  ## Installation
102
245
 
103
- You *may not* need to add this gem to your project. You have three options, 1, 2 or BEST:
246
+ You *may not* need to add this gem to your project.
247
+
248
+ Install the gem and add to the application's Gemfile by executing:
249
+
250
+ $ bundle add active_security
251
+
252
+ If bundler is not being used to manage dependencies, install the gem by executing:
253
+
254
+ $ gem install active_security
255
+
256
+ <details>
257
+ <summary>Installation Options</summary>
104
258
 
105
259
  ### Option 1
106
260
 
107
- Just install it, and require it in your`irb`/`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`.
261
+ Just 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`.
108
262
 
109
263
  $ gem install gem_bench
110
264
 
@@ -130,13 +284,16 @@ If you are going to use the gem in your specs, you will need to add it to the te
130
284
 
131
285
  gem 'gem_bench', :group => :test
132
286
 
287
+ </details>
288
+
133
289
  ## Usage
134
290
 
135
291
  Works with Ruby >= 2.3.
136
292
 
137
- ### Example!
293
+ ### Examples
138
294
 
139
- Getting tired of seeing this `irb` warning, perhaps?
295
+ <details>
296
+ <summary>Getting tired of seeing this `irb` warning, perhaps?</summary>
140
297
 
141
298
  ```
142
299
  $ bundle exec rails console
@@ -145,6 +302,7 @@ irb: warn: can't alias context from irb_context.
145
302
  ```
146
303
 
147
304
  Find out what gems may be causing it by defining `context`!
305
+
148
306
  ```
149
307
  >> require 'gem_bench'
150
308
  => true
@@ -153,13 +311,49 @@ Find out what gems may be causing it by defining `context`!
153
311
  [GemBench] Detected 11 loaded gems + 2 loaded gems which GemBench is configured to ignore.
154
312
  => [byebug, diff-lcs]
155
313
  ```
314
+
156
315
  Then find the file with the first occurrence of the regex in each:
316
+
157
317
  ```
158
318
  >> bad_context_maybes.map { |bcm| bcm.stats.map(&:first) }
159
319
  => [["/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"]]
160
320
  ```
161
321
 
162
- ### More Different Example!
322
+ </details>
323
+
324
+ <details>
325
+ <summary>Find what gems have `RAILS_ENV` specific code!</summary>
326
+
327
+ Let's try to find what libraries might be using a conditional guard to alter their behavior in a specific Rails environment.
328
+
329
+ ```
330
+ # Not a perfect regex, but pretty good: https://rubular.com/r/b7tdIoYOVQM2RR
331
+ # RAILS_ENV == "development"
332
+ # Rails.env.development?
333
+ # Rails.env == "development"
334
+ # ENV["RAILS_ENV"] == "development"
335
+ # ENV.fetch("RAILS_ENV") == "development"
336
+ >> require "gem_bench"
337
+ => true
338
+ >> conditional_rails_behavior_regex = /(ENV(\["|\.fetch\("))?rails(_|\.)env("\]|"\))?( == "|\.)development/i
339
+ >> conditional_rails_behavior = GemBench.find(look_for_regex: conditional_rails_behavior_regex).starters
340
+ => [rack, actionpack, actioncable, actionmailer, rubocop, railties, rubocop-ruby2_7, sass, sass-rails]
341
+ >> print conditional_rails_behavior.map {|gem| "#{gem.name} has Rails.env condition in #{gem.stats}" }.join("\n")
342
+ rack 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]]
343
+ actionpack 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]]
344
+ actioncable 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]]
345
+ actionmailer 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]]
346
+ rubocop 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]]
347
+ railties 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]]
348
+ rubocop-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]]
349
+ sass 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]]
350
+ sass-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]]
351
+ ```
352
+
353
+ </details>
354
+
355
+ <details>
356
+ <summary> Basic Gemfile Analysis</summary>
163
357
 
164
358
  Fire up an `irb` session or a `rails console` and then:
165
359
 
@@ -215,14 +409,17 @@ If you run the check against a real app's Gemfile it will find numerous primary
215
409
 
216
410
  In a random directory, in an irb session, where there is no Gemfile in sight it will give a lot more information.
217
411
 
218
- ### Advanced Usage
412
+ </details>
413
+
414
+ <details>
415
+ <summary>Advanced Gemfile Analysis</summary>
219
416
 
220
417
  In order to *also* see list gems may *not* be required at boot time you need to:
221
418
 
222
419
  1. Make sure you are in the root of a project with a Gemfile
223
420
  2. Make sure the gem is actually a dependency in the Gemfile
224
421
 
225
- So here's a [*fat* Gemfile][bundle-group-pattern] weighing in at 265 gem dependencies. We'll use it for this example:
422
+ So here's a [fat Gemfile][bundle-group-pattern] weighing in at 265 gem dependencies. We'll use it for this example:
226
423
 
227
424
  ∴ bundle exec rails console
228
425
  Welcome to RAILS. You are using ruby 1.9.3p392 (2013-02-22 revision 39386) [x86_64-darwin12.2.1]. Have fun ;)
@@ -375,52 +572,104 @@ How much faster will my app boot loading 45 fewer gems? A bit.
375
572
 
376
573
  **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.
377
574
 
575
+ </details>
576
+
378
577
  ## Future
379
578
 
380
579
  This gem determines which gems need to be loaded at Rails' boot time by looking for Railties and Engines.
381
580
  A 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.
382
581
 
383
- ## Contributors
582
+ ## 🤝 Contributing
583
+
584
+ See [CONTRIBUTING.md][🤝contributing]
585
+
586
+ [🤝contributing]: CONTRIBUTING.md
384
587
 
385
- [![Contributors](https://contrib.rocks/image?repo=pboling/gitmoji-regex)][🖐contributors]
588
+ ### Code Coverage
386
589
 
387
- Made with [contributors-img][contrib-rocks].
590
+ If you need some ideas of where to help, you could work on adding more code coverage.
388
591
 
592
+ [![Coverage Graph][🔑codecov-g]][🖇codecov]
593
+
594
+ [🔑codecov-g]: https://codecov.io/gh/pboling/gem_bench/graphs/tree.svg?token=selEoMrZzA
595
+
596
+ ## 🌈 Contributors
597
+
598
+ [![Contributors][🖐contributors-img]][🖐contributors]
599
+
600
+ Made with [contributors-img][🖐contrib-rocks].
601
+
602
+ [🖐contrib-rocks]: https://contrib.rocks
389
603
  [🖐contributors]: https://github.com/pboling/gem_bench/graphs/contributors
390
- [contrib-rocks]: https://contrib.rocks
604
+ [🖐contributors-img]: https://contrib.rocks/image?repo=pboling/gem_bench
605
+
606
+ ## Star History
607
+
608
+ <a href="https://star-history.com/#pboling/gem_bench&Date">
609
+ <picture>
610
+ <source media="(prefers-color-scheme: dark)" srcset="https://api.star-history.com/svg?repos=pboling/gem_bench&type=Date&theme=dark" />
611
+ <source media="(prefers-color-scheme: light)" srcset="https://api.star-history.com/svg?repos=pboling/gem_bench&type=Date" />
612
+ <img alt="Star History Chart" src="https://api.star-history.com/svg?repos=pboling/gem_bench&type=Date" />
613
+ </picture>
614
+ </a>
615
+
616
+ ## 🪇 Code of Conduct
617
+
618
+ Everyone interacting in this project's codebases, issue trackers,
619
+ chat rooms and mailing lists is expected to follow the [code of conduct][🪇conduct].
620
+
621
+ [🪇conduct]: CODE_OF_CONDUCT.md
391
622
 
392
- ## Contributing
623
+ ## 📌 Versioning
393
624
 
394
- See [CONTRIBUTING.md](CONTRIBUTING.md)
625
+ This Library adheres to [Semantic Versioning 2.0.0][📌semver].
626
+ Violations of this scheme should be reported as bugs.
627
+ Specifically, if a minor or patch version is released that breaks backward compatibility,
628
+ a new version should be immediately released that restores compatibility.
629
+ Breaking changes to the public API will only be introduced with new major versions.
395
630
 
396
- ## Versioning
631
+ To get a better understanding of how SemVer is intended to work over a project's lifetime,
632
+ read this article from the creator of SemVer:
397
633
 
398
- This library aims to adhere to [Semantic Versioning 2.0.0][semver].
399
- Violations of this scheme should be reported as bugs. Specifically,
400
- if a minor or patch version is released that breaks backward
401
- compatibility, a new version should be immediately released that
402
- restores compatibility. Breaking changes to the public API will
403
- only be introduced with new major versions.
634
+ - ["Major Version Numbers are Not Sacred"][📌major-versions-not-sacred]
404
635
 
405
- As a result of this policy, you can (and should) specify a
406
- dependency on this gem using the [Pessimistic Version Constraint][pvc] with two digits of precision.
636
+ As a result of this policy, you can (and should) specify a dependency on these libraries using
637
+ the [Pessimistic Version Constraint][📌pvc] with two digits of precision.
407
638
 
408
639
  For example:
409
640
 
410
- spec.add_dependency 'gem_bench', '~> 2.0'
641
+ ```ruby
642
+ spec.add_dependency("gem_bench", "~> 2.0")
643
+ ```
411
644
 
412
- See [CHANGELOG.md](CHANGELOG.md) for list of releases.
645
+ See [CHANGELOG.md][📌changelog] for list of releases.
413
646
 
414
- ## Legal
647
+ [comment]: <> ( 📌 VERSIONING LINKS )
415
648
 
416
- * [![License: MIT](https://img.shields.io/badge/License-MIT-green.svg)](https://opensource.org/licenses/MIT)
417
- * Copyright (c) 2013 - 2014, 2016 - 2020, 2023 [Peter H. Boling][peterboling] of [Rails Bling][railsbling]
649
+ [📌pvc]: http://guides.rubygems.org/patterns/#pessimistic-version-constraint
650
+ [📌semver]: http://semver.org/
651
+ [📌major-versions-not-sacred]: https://tom.preston-werner.com/2022/05/23/major-version-numbers-are-not-sacred.html
652
+ [📌changelog]: CHANGELOG.md
653
+
654
+ ## 📄 License
655
+
656
+ The gem is available as open source under the terms of
657
+ the [MIT License][📄license] [![License: MIT][📄license-img]][📄license-ref].
658
+ See [LICENSE.txt][📄license] for the official [Copyright Notice][📄copyright-notice-explainer].
659
+
660
+ [comment]: <> ( 📄 LEGAL LINKS )
661
+
662
+ [📄copyright-notice-explainer]: https://opensource.stackexchange.com/questions/5778/why-do-licenses-such-as-the-mit-license-specify-a-single-year
663
+ [📄license]: LICENSE.txt
664
+ [📄license-ref]: https://opensource.org/licenses/MIT
665
+ [📄license-img]: https://img.shields.io/badge/License-MIT-green.svg
666
+
667
+ ### © Copyright
668
+
669
+ * Copyright (c) 2013 - 2014, 2016 - 2020, 2023 - 2024 [Peter H. Boling][peterboling] of [Rails Bling][railsbling]
418
670
 
419
- [semver]: http://semver.org/
420
- [pvc]: http://docs.rubygems.org/read/chapter/16#page74
421
- [bundle-group-pattern]: https://gist.github.com/pboling/4564780
422
671
  [railsbling]: http://www.railsbling.com
423
672
  [peterboling]: http://www.peterboling.com
424
- [coderwall]: http://coderwall.com/pboling
673
+ [bundle-group-pattern]: https://gist.github.com/pboling/4564780
425
674
  [documentation]: http://rdoc.info/github/pboling/gem_bench/frames
426
675
  [homepage]: https://github.com/pboling/gem_bench
@@ -0,0 +1,150 @@
1
+ # Std Libs Dependencies
2
+ require "tmpdir"
3
+
4
+ # Re-write a gem to a temp directory, re-namespace the primary namespace of that gem module, and load it.
5
+ # If the original gem defines multiple top-level namespaces, they can all be renamed by providing more key value pairs.
6
+ # If the original gem monkey patches other libraries, that behavior can't be isolated, so YMMV.
7
+ #
8
+ # NOTE: Non-top-level namespaces do not need to be renamed, as they are isolated within their parent namespace.
9
+ #
10
+ # Usage
11
+ #
12
+ # jersey = GemBench::Jersey.new(
13
+ # gem_name: "alt_memery"
14
+ # trades: {
15
+ # "Memery" => "AltMemery"
16
+ # },
17
+ # metadata: {
18
+ # something: "a value here",
19
+ # something_else: :obviously,
20
+ # },
21
+ # )
22
+ # jersey.doff_and_don
23
+ # # The re-namespaced constant is now available!
24
+ # AltMemery # => AltMemery
25
+ #
26
+ module GemBench
27
+ class Jersey
28
+ attr_reader :gem_name
29
+ attr_reader :gem_path
30
+ attr_reader :trades
31
+ attr_reader :metadata
32
+ attr_reader :files
33
+ attr_reader :verbose
34
+
35
+ def initialize(gem_name:, trades:, metadata: {}, verbose: false)
36
+ @gem_name = gem_name
37
+ @gem_path = Gem.loaded_specs[gem_name]&.full_gem_path
38
+ @gem_lib_dir = Gem
39
+ @trades = trades
40
+ @metadata = metadata
41
+ @verbose = verbose
42
+ end
43
+
44
+ def required?
45
+ gem_path && trades.values.all? { |new_namespace| Object.const_defined?(new_namespace) }
46
+ end
47
+
48
+ # Generates tempfiles and requires them, resulting
49
+ # in a loaded gem that will not have namespace
50
+ # collisions when alongside the original-namespaced gem.
51
+ # If a block is provided the contents of each file will be yielded to the block,
52
+ # after all namespace substitutions are complete, but before the contents
53
+ # are written to the re-namespaced gem. The return value of the block will be
54
+ # written to the file in this scenario.
55
+ #
56
+ # @return void
57
+ def doff_and_don(&block)
58
+ return puts "Skipping #{gem_name} (not loaded on #{RUBY_VERSION})" unless gem_path
59
+
60
+ puts "Doffing #{gem_path}" if verbose
61
+ Dir.mktmpdir do |directory|
62
+ files = []
63
+ Dir[File.join(gem_path, "lib", "**", "*.rb")].map do |file|
64
+ if verbose
65
+ puts file
66
+ puts File.basename(file)
67
+ puts "--------------------------------"
68
+ end
69
+ dirname = File.dirname(file)
70
+ puts "dirname: #{dirname}" if verbose
71
+ is_at_gem_root = dirname[(-4)..(-1)] == "/lib"
72
+ puts "is_at_gem_root: #{is_at_gem_root}" if verbose
73
+ lib_split = dirname.split("/lib/")[-1]
74
+ puts "lib_split: #{lib_split}" if verbose
75
+ # lib_split could be like:
76
+ # - "ruby/gems/3.2.0/gems/method_source-1.1.0/lib"
77
+ # - "method_source"
78
+ # Se we check to make sure it is actually a subdir of the gem's lib directory
79
+ full_path = File.join(gem_path, "lib", lib_split)
80
+ relative_path = !is_at_gem_root && Dir.exist?(full_path) && lib_split
81
+ puts "relative_path: #{relative_path}" if verbose
82
+ filename = File.basename(file)[0..-4]
83
+ puts "filename: #{filename}" if verbose
84
+
85
+ if relative_path
86
+ dir_path = File.join(directory, relative_path)
87
+ Dir.mkdir(dir_path) unless Dir.exist?(dir_path)
88
+ puts "creating #{filename} in #{dir_path}" if verbose
89
+ files << create_tempfile_copy(file, filename, dir_path, :dd1, &block)
90
+ else
91
+ puts "directory not relative (#{directory}) for file #{filename}" if verbose
92
+ files << create_tempfile_copy(file, filename, directory, :dd2, &block)
93
+ end
94
+ end
95
+ load_gem_copy(files)
96
+ end
97
+
98
+ nil
99
+ end
100
+
101
+ def primary_namespace
102
+ trades.values.first
103
+ end
104
+
105
+ # Will raise NameError if called before #doff_and_don
106
+ def as_klass
107
+ Object.const_get(primary_namespace) if gem_path
108
+ end
109
+
110
+ private
111
+
112
+ def load_gem_copy(files)
113
+ files.each do |filepath|
114
+ # begin
115
+ require filepath
116
+ # rescue LoadError => e
117
+ # puts file.to_s
118
+ # puts tempfile.path
119
+ # puts e.class
120
+ # puts e.message
121
+ # end
122
+ end
123
+ end
124
+
125
+ # @return [String] the file path of the new copy of the original file
126
+ def create_tempfile_copy(file, filename, directory, from, &block)
127
+ # Value of block is returned from File.open
128
+ File.open(File.join(directory, "#{filename}.rb"), "w") do |file_copy|
129
+ new_jersey(file, file_copy, from, &block)
130
+ end
131
+ end
132
+
133
+ # @return [String] the file path of the new copy of the original file
134
+ def new_jersey(file, file_copy, from)
135
+ nj = File.read(file)
136
+ trades.each do |old_namespace, new_namespace|
137
+ nj.gsub!(old_namespace, new_namespace)
138
+ end
139
+ if verbose
140
+ puts "new_jersey has from: #{from}"
141
+ puts "new_jersey has file: #{file}"
142
+ puts "new_jersey file_copy path: #{file_copy.path}"
143
+ end
144
+ nj = yield nj if block_given?
145
+ file_copy.write(nj)
146
+ file_copy.close
147
+ file_copy.path
148
+ end
149
+ end
150
+ end
@@ -27,24 +27,7 @@ module GemBench
27
27
  # gems got checked, and which had nothing to check
28
28
  @checked = true
29
29
  line_match ||= GemBench::RAILTIE_REGEX
30
- scan = if GemBench::DO_NOT_SCAN.include?(name)
31
- false
32
- else
33
- begin
34
- File.read(file_path).encode(
35
- "utf-8",
36
- invalid: :replace,
37
- undef: :replace,
38
- replace: "_",
39
- ) =~ line_match
40
- rescue ArgumentError => e
41
- if e.message =~ /invalid byte sequence/
42
- puts "[GemBench] checking #{file_path} failed due to unparseable file content"
43
- false # Assume the likelihood of files with encoding issues that also contain railtie to be low, so: false.
44
- end
45
- end
46
- end
47
-
30
+ scan = !GemBench::DO_NOT_SCAN.include?(name) && check_line(file_path, line_match)
48
31
  stats << [file_path, scan] if scan
49
32
  self.state = if !!scan
50
33
  GemBench::PLAYER_STATES[:starter]
@@ -53,6 +36,23 @@ module GemBench
53
36
  end
54
37
  end
55
38
 
39
+ def check_line(file_path, line_match)
40
+ File.read(file_path).encode(
41
+ "utf-8",
42
+ invalid: :replace,
43
+ undef: :replace,
44
+ replace: "_",
45
+ ) =~ line_match
46
+ rescue ArgumentError => e
47
+ if e.message =~ /invalid byte sequence/
48
+ puts "[GemBench] checking #{file_path} failed due to unparseable file content"
49
+ false # Assume the likelihood of files with encoding issues that also contain railtie to be low, so: false.
50
+ else
51
+ puts "[GemBench] checking #{file_path} failed. Please report a bug to https://github.com/pboling/gembench/issues"
52
+ raise e
53
+ end
54
+ end
55
+
56
56
  def starter?
57
57
  state == GemBench::PLAYER_STATES[:starter]
58
58
  end
@@ -71,6 +71,8 @@ module GemBench
71
71
  "gem '#{name}', '~> #{version}'"
72
72
  when :upgrade # when upgrading, and testing gem compatibility you want to try anything newer
73
73
  "gem '#{name}', '>= #{version}'"
74
+ else
75
+ raise ArgumentError, "Unknown format for #{self.class.name}#to_s"
74
76
  end
75
77
  end
76
78
 
@@ -1,5 +1,5 @@
1
1
  module GemBench
2
2
  module Version
3
- VERSION = "2.0.0"
3
+ VERSION = "2.0.2"
4
4
  end
5
5
  end
data.tar.gz.sig CHANGED
Binary file
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: gem_bench
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.0.0
4
+ version: 2.0.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Peter Boling
@@ -36,7 +36,7 @@ cert_chain:
36
36
  KuxrfYrN+9HvMdm+nZ6TypmKftHY3Gj+/uu+g8Icm/zrvTWAEE0mcJOkfrIoNPJb
37
37
  pF8dMA==
38
38
  -----END CERTIFICATE-----
39
- date: 2023-09-25 00:00:00.000000000 Z
39
+ date: 2024-09-18 00:00:00.000000000 Z
40
40
  dependencies:
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: bundler
@@ -61,7 +61,7 @@ dependencies:
61
61
  version: '1.1'
62
62
  - - ">="
63
63
  - !ruby/object:Gem::Version
64
- version: 1.1.3
64
+ version: 1.1.4
65
65
  type: :runtime
66
66
  prerelease: false
67
67
  version_requirements: !ruby/object:Gem::Requirement
@@ -71,49 +71,61 @@ dependencies:
71
71
  version: '1.1'
72
72
  - - ">="
73
73
  - !ruby/object:Gem::Version
74
- version: 1.1.3
74
+ version: 1.1.4
75
75
  - !ruby/object:Gem::Dependency
76
- name: redcarpet
76
+ name: yard
77
77
  requirement: !ruby/object:Gem::Requirement
78
78
  requirements:
79
+ - - "~>"
80
+ - !ruby/object:Gem::Version
81
+ version: '0.9'
79
82
  - - ">="
80
83
  - !ruby/object:Gem::Version
81
- version: '0'
84
+ version: 0.9.34
82
85
  type: :development
83
86
  prerelease: false
84
87
  version_requirements: !ruby/object:Gem::Requirement
85
88
  requirements:
89
+ - - "~>"
90
+ - !ruby/object:Gem::Version
91
+ version: '0.9'
86
92
  - - ">="
87
93
  - !ruby/object:Gem::Version
88
- version: '0'
94
+ version: 0.9.34
89
95
  - !ruby/object:Gem::Dependency
90
- name: yard
96
+ name: yard-junk
91
97
  requirement: !ruby/object:Gem::Requirement
92
98
  requirements:
93
- - - ">="
99
+ - - "~>"
94
100
  - !ruby/object:Gem::Version
95
- version: '0'
101
+ version: 0.0.10
96
102
  type: :development
97
103
  prerelease: false
98
104
  version_requirements: !ruby/object:Gem::Requirement
99
105
  requirements:
100
- - - ">="
106
+ - - "~>"
101
107
  - !ruby/object:Gem::Version
102
- version: '0'
108
+ version: 0.0.10
103
109
  - !ruby/object:Gem::Dependency
104
- name: yard-junk
110
+ name: kettle-soup-cover
105
111
  requirement: !ruby/object:Gem::Requirement
106
112
  requirements:
113
+ - - "~>"
114
+ - !ruby/object:Gem::Version
115
+ version: '1.0'
107
116
  - - ">="
108
117
  - !ruby/object:Gem::Version
109
- version: '0'
118
+ version: 1.0.2
110
119
  type: :development
111
120
  prerelease: false
112
121
  version_requirements: !ruby/object:Gem::Requirement
113
122
  requirements:
123
+ - - "~>"
124
+ - !ruby/object:Gem::Version
125
+ version: '1.0'
114
126
  - - ">="
115
127
  - !ruby/object:Gem::Version
116
- version: '0'
128
+ version: 1.0.2
117
129
  - !ruby/object:Gem::Dependency
118
130
  name: awesome_print
119
131
  requirement: !ruby/object:Gem::Requirement
@@ -129,19 +141,19 @@ dependencies:
129
141
  - !ruby/object:Gem::Version
130
142
  version: '0'
131
143
  - !ruby/object:Gem::Dependency
132
- name: gem-release
144
+ name: method_source
133
145
  requirement: !ruby/object:Gem::Requirement
134
146
  requirements:
135
- - - "~>"
147
+ - - ">="
136
148
  - !ruby/object:Gem::Version
137
- version: '2.0'
149
+ version: 1.1.0
138
150
  type: :development
139
151
  prerelease: false
140
152
  version_requirements: !ruby/object:Gem::Requirement
141
153
  requirements:
142
- - - "~>"
154
+ - - ">="
143
155
  - !ruby/object:Gem::Version
144
- version: '2.0'
156
+ version: 1.1.0
145
157
  - !ruby/object:Gem::Dependency
146
158
  name: rake
147
159
  requirement: !ruby/object:Gem::Requirement
@@ -246,10 +258,26 @@ dependencies:
246
258
  - - ">="
247
259
  - !ruby/object:Gem::Version
248
260
  version: '0'
261
+ - !ruby/object:Gem::Dependency
262
+ name: standard
263
+ requirement: !ruby/object:Gem::Requirement
264
+ requirements:
265
+ - - ">="
266
+ - !ruby/object:Gem::Version
267
+ version: 1.35.1
268
+ type: :development
269
+ prerelease: false
270
+ version_requirements: !ruby/object:Gem::Requirement
271
+ requirements:
272
+ - - ">="
273
+ - !ruby/object:Gem::Version
274
+ version: 1.35.1
249
275
  description: |-
250
- Enforce Gemfile version constraints
251
- Regex search across all installed gem's source code to find issues quickly
252
- Trim down app load times by keeping your worst players on the bench (useful for beating Heroku slug load time cutoff)
276
+ * Benchmark different versions of same or similar gems
277
+ * Copy & Re-namespace any gem to benchmark side-by-side with `benchmarks-ips`
278
+ * Enforce Gemfile version constraints
279
+ * Regex search across all installed gem's source code to find issues quickly
280
+ * Trim down app load times by keeping your worst players on the bench (useful for beating Heroku slug load time cutoff)
253
281
  email:
254
282
  - peter.boling@gmail.com
255
283
  executables: []
@@ -264,6 +292,7 @@ files:
264
292
  - SECURITY.md
265
293
  - lib/gem_bench.rb
266
294
  - lib/gem_bench/gemfile_line_tokenizer.rb
295
+ - lib/gem_bench/jersey.rb
267
296
  - lib/gem_bench/player.rb
268
297
  - lib/gem_bench/scout.rb
269
298
  - lib/gem_bench/strict_version_gem.rb
@@ -275,10 +304,10 @@ licenses:
275
304
  - MIT
276
305
  metadata:
277
306
  homepage_uri: https://railsbling.com/tags/gem_bench/
278
- source_code_uri: http://github.com/pboling/gem_bench/tree/v2.0.0
279
- changelog_uri: http://github.com/pboling/gem_bench/blob/v2.0.0/CHANGELOG.md
307
+ source_code_uri: http://github.com/pboling/gem_bench/tree/v2.0.2
308
+ changelog_uri: http://github.com/pboling/gem_bench/blob/v2.0.2/CHANGELOG.md
280
309
  bug_tracker_uri: http://github.com/pboling/gem_bench/issues
281
- documentation_uri: https://www.rubydoc.info/gems/gem_bench/2.0.0
310
+ documentation_uri: https://www.rubydoc.info/gems/gem_bench/2.0.2
282
311
  wiki_uri: http://github.com/pboling/gem_bench/wiki
283
312
  funding_uri: https://liberapay.com/pboling
284
313
  rubygems_mfa_required: 'true'
@@ -297,8 +326,9 @@ required_rubygems_version: !ruby/object:Gem::Requirement
297
326
  - !ruby/object:Gem::Version
298
327
  version: '0'
299
328
  requirements: []
300
- rubygems_version: 3.4.19
329
+ rubygems_version: 3.5.18
301
330
  signing_key:
302
331
  specification_version: 4
303
- summary: Static Gemfile and installed gem library source code analysis
332
+ summary: Benchmark different versions of same or similar gems & Static Gemfile and
333
+ installed gem library source code analysis
304
334
  test_files: []
metadata.gz.sig CHANGED
Binary file