gem_bench 2.0.0 → 2.0.1

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: b054d58ceb273738cbb17694960de3fb3a5c8646eeed7f41c77e9b4177e3a52c
4
+ data.tar.gz: a5565712bc1ae7423890b8b7615a048850962e6a403f6ed76828804f60fa8840
5
5
  SHA512:
6
- metadata.gz: 8a56aa10d455dbf1b745af1d83b80db1c5501ae78edf3ddd3fcb8047e4230512249249215240765a540a963eff6551149406d534ba5fa209a10bce8e358884a9
7
- data.tar.gz: 58e77a2c83629a736e203c8918f8258f04f0e83357a403b53669f1a439d5996f34f429701d7be5bc154842dcf941fa27c0884afba976b6d8e1a031d44f83dc19
6
+ metadata.gz: 9ba5c0b8243072eec99db4ccd0d7efd6aab41d6d592bfddecf359259777a9be5c578f7ef8c3cf02b01117369c0f777db594cbf22ec5663d6dbaf06c700e87d96
7
+ data.tar.gz: 25e0360cd1200ecdc0d7a65de318c02270492c255dc66f9bf46cd4359a5fe37ff6b67307c351b20657ada7a3ec04584221bbe8bafce5f29e8d2373671042a941
checksums.yaml.gz.sig CHANGED
Binary file
data/CHANGELOG.md CHANGED
@@ -11,6 +11,22 @@ and this project adheres to [Semantic Versioning v2](https://semver.org/spec/v2.
11
11
  ### Fixed
12
12
  ### Removed
13
13
 
14
+ [2.0.1] SEP.17.2024
15
+ COVERAGE: 82.15% -- 382/465 lines in 9 files
16
+ BRANCH COVERAGE: 58.08% -- 97/167 branches in 9 files
17
+ 51.72% documented
18
+ ### Added
19
+ * Ability to re-namespace and load copy of a gem alongside vanilla version for benchmarking via `GemBench::Jersey`
20
+ * See: https://github.com/panorama-ed/memo_wise/pull/339
21
+ * Many more tests
22
+ * `kettle-soup-cover` for test coverage enforcement
23
+ * Better documentation
24
+ * Improved instructions for contributing
25
+ ### Changed
26
+ * Improved `bin/checksums`
27
+ ### Fixed
28
+ * Stopped swallowing `ArgumentError` in certain exceptional cases
29
+
14
30
  [2.0.0] SEP.25.2023
15
31
  ### Added
16
32
  * Compatible with Bundler 2+
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/README.md CHANGED
@@ -1,43 +1,143 @@
1
1
  # GemBench
2
2
 
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
+ [![Test Coverage](https://api.codeclimate.com/v1/badges/80787f126e7a486b19af/test_coverage)](https://codeclimate.com/github/pboling/gem_bench/test_coverage)
12
+ [![Maintainability](https://api.codeclimate.com/v1/badges/80787f126e7a486b19af/maintainability)](https://codeclimate.com/github/pboling/gem_bench/maintainability)
13
+ [![CI Supported Build][🚎s-wfi]][🚎s-wf]
14
+ [![CI Unsupported Build][🚎us-wfi]][🚎us-wf]
15
+ [![CI Style Build][🚎st-wfi]][🚎st-wf]
16
+ [![CI Coverage Build][🚎cov-wfi]][🚎cov-wf]
17
+ [![CI Heads Build][🚎hd-wfi]][🚎hd-wf]
18
+
19
+ [🚎s-wf]: https://github.com/pboling/gem_bench/actions/workflows/supported.yml
20
+ [🚎s-wfi]: https://github.com/pboling/gem_bench/actions/workflows/supported.yml/badge.svg
21
+ [🚎us-wf]: https://github.com/pboling/gem_bench/actions/workflows/unsupported.yml
22
+ [🚎us-wfi]: https://github.com/pboling/gem_bench/actions/workflows/unsupported.yml/badge.svg
23
+ [🚎st-wf]: https://github.com/pboling/gem_bench/actions/workflows/style.yml
24
+ [🚎st-wfi]: https://github.com/pboling/gem_bench/actions/workflows/style.yml/badge.svg
25
+ [🚎cov-wf]: https://github.com/pboling/gem_bench/actions/workflows/coverage.yml
26
+ [🚎cov-wfi]: https://github.com/pboling/gem_bench/actions/workflows/coverage.yml/badge.svg
27
+ [🚎hd-wf]: https://github.com/pboling/gem_bench/actions/workflows/heads.yml
28
+ [🚎hd-wfi]: https://github.com/pboling/gem_bench/actions/workflows/heads.yml/badge.svg
29
+
30
+ </div>
31
+
32
+ -----
33
+
34
+ <div align="center">
35
+
36
+ [![Liberapay Patrons][⛳liberapay-img]][⛳liberapay]
37
+ [![Sponsor Me on Github][🖇sponsor-img]][🖇sponsor]
38
+ [![Polar Shield][🖇polar-img]][🖇polar]
39
+ [![Donate to my FLOSS or refugee efforts at ko-fi.com][🖇kofi-img]][🖇kofi]
40
+ [![Donate to my FLOSS or refugee efforts using Patreon][🖇patreon-img]][🖇patreon]
41
+
42
+ [⛳liberapay-img]: https://img.shields.io/liberapay/patrons/pboling.svg?logo=liberapay
43
+ [⛳liberapay]: https://liberapay.com/pboling/donate
44
+ [🖇sponsor-img]: https://img.shields.io/badge/Sponsor_Me!-pboling.svg?style=social&logo=github
45
+ [🖇sponsor]: https://github.com/sponsors/pboling
46
+ [🖇polar-img]: https://polar.sh/embed/seeks-funding-shield.svg?org=pboling
47
+ [🖇polar]: https://polar.sh/pboling
48
+ [🖇kofi-img]: https://img.shields.io/badge/buy%20me%20coffee-donate-yellow.svg
49
+ [🖇kofi]: https://ko-fi.com/O5O86SNP4
50
+ [🖇patreon-img]: https://img.shields.io/badge/patreon-donate-yellow.svg
51
+ [🖇patreon]: https://patreon.com/galtzo
52
+
53
+ <span class="badge-buymealatte">
54
+ <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>
55
+ </span>
56
+
57
+ </div>
58
+ </div>
59
+
60
+ Scene: You are a spectator at a game of Ruby Sports Gem Ball.
61
+
62
+ Gem wearing jersey namespace **#23**:
63
+
64
+ > "Put me in coach!"
65
+
66
+ Other Gem, also wearing jersey namespace **#23**:
67
+
68
+ > "Put me in coach!"
69
+
70
+ Coach:
71
+
72
+ > ❨╯°□°❩╯︵┻━┻ fine, but one of you change your jersey first!
73
+
74
+ ## What's it do?
75
+
3
76
  `gem_bench` is for static Gemfile and installed gem library source code analysis.
4
77
 
5
- `gem_bench` can also be used to trim down app load times by keeping your worst players on the bench.
78
+ `gem_bench` can be used to re-namespace a gem at run-time so that you can run simultaneously:
79
+
80
+ - two versions of the same library, or
81
+ - two different things that happen to have a namespace collision,
6
82
 
7
- Gem: "Put me in coach!"
8
- You: ❨╯°□°❩╯︵┻━┻
83
+ for benchmarking or other purposes.
84
+
85
+ `gem_bench` can also be used to trim down app load times by keeping your worst players on the bench.
9
86
 
10
87
  | Project | GemBench |
11
88
  |------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
12
89
  | 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
90
  | code triage | [![Open Source Helpers](https://www.codetriage.com/pboling/gem_bench/badges/users.svg)](https://www.codetriage.com/pboling/gem_bench) |
21
91
  | homepage | [on Github.com][homepage] |
22
92
  | documentation | [on Rdoc.info][documentation] |
23
93
  | live chat | [![Join the chat][🏘chati]][🏘chat] |
24
94
  | 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
95
+ | 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) |
96
+
35
97
  [🏘chat]: https://matrix.to/#/%23pboling_gem_bench:gitter.im
36
98
  [🏘chati]: https://badges.gitter.im/Join%20Chat.svg
37
99
 
100
+ ### New for 2.0.1 - `GemBench::Jersey`
101
+
102
+ Allows you to re-namespace any gem.
103
+ You can, for example, benchmark a gem against another version of itself.
104
+
105
+ The gem `alt_memery` uses a namespace, `Memery`, that does not match the gem name.
106
+
107
+ ```ruby
108
+ require "gem_bench/jersey"
109
+
110
+ jersey = GemBench::Jersey.new(
111
+ gem_name: "alt_memery",
112
+ trades: {"Memery" => "AltMemery"},
113
+ metadata: { # optional, mostly used for benchmarking report output
114
+ something: "a value here",
115
+ something_else: :obviously,
116
+ },
117
+ )
118
+ jersey.doff_and_don
119
+ # The re-namespaced constant is now available!
120
+ AltMemery # => AltMemery
121
+ jersey.as_klass # => AltMemery
122
+
123
+ # The original, unmodified, gem is still there!
124
+ require "alt_memery"
125
+
126
+ Memery # => Memery
127
+ # So you can use both!
128
+ ```
129
+
130
+ NOTE: It is not required by default, so you do need to require the Jersey if you want to use it!
131
+
132
+ ```ruby
133
+ require "gem_bench/jersey"
134
+ ```
135
+
136
+ For a real example, see: https://github.com/panorama-ed/memo_wise/pull/339
137
+
38
138
  ### New for 2.0.0 - Dropped Support for Ruby 2.0, 2.1, 2.2
39
139
 
40
- -- Required Ruby is now 2.3+
140
+ - Required Ruby is now 2.3+
41
141
  - `VERSION` is now namespaced at `GemBench::Version::VERSION` and is enhanced by `version_gem`.
42
142
 
43
143
  ### New for 1.0.2 - Gemfile specs
@@ -45,6 +145,7 @@ You: ❨╯°□°❩╯︵┻━┻
45
145
  Version constraints are important. Give the Gemfile some love in your CI build
46
146
 
47
147
  Create a `spec/gemfile_spec.rb` like:
148
+
48
149
  ```ruby
49
150
  Rspec.describe("Gemfile") do
50
151
  it("has version constraint on every gem") do
@@ -76,8 +177,13 @@ For string version constraints anything is allowed (e.g. `'~> 1.0'`), as it assu
76
177
 
77
178
  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
179
 
79
- Gem: "I have no wat DRAGONS!"
80
- You: ❨╯°□°❩╯︵┻━┻
180
+ Gem:
181
+
182
+ > "I have no wat DRAGONS!"`
183
+
184
+ You:
185
+
186
+ > ❨╯°□°❩╯︵┻━┻ Yes you do!
81
187
 
82
188
  ```
83
189
  >> puts GemBench.find(look_for_regex: /wat/).starters.map {|gem| "#{gem.name} has wat DRAGONS at #{gem.stats}" }.join("\n")
@@ -145,6 +251,7 @@ irb: warn: can't alias context from irb_context.
145
251
  ```
146
252
 
147
253
  Find out what gems may be causing it by defining `context`!
254
+
148
255
  ```
149
256
  >> require 'gem_bench'
150
257
  => true
@@ -153,12 +260,42 @@ Find out what gems may be causing it by defining `context`!
153
260
  [GemBench] Detected 11 loaded gems + 2 loaded gems which GemBench is configured to ignore.
154
261
  => [byebug, diff-lcs]
155
262
  ```
263
+
156
264
  Then find the file with the first occurrence of the regex in each:
265
+
157
266
  ```
158
267
  >> bad_context_maybes.map { |bcm| bcm.stats.map(&:first) }
159
268
  => [["/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
269
  ```
161
270
 
271
+ ### Find what gems have `RAILS_ENV` specific code!
272
+
273
+ Let's try to find what libraries might be using a conditional guard to alter their behavior in a specific Rails environment.
274
+
275
+ ```
276
+ # Not a perfect regex, but pretty good: https://rubular.com/r/b7tdIoYOVQM2RR
277
+ # RAILS_ENV == "development"
278
+ # Rails.env.development?
279
+ # Rails.env == "development"
280
+ # ENV["RAILS_ENV"] == "development"
281
+ # ENV.fetch("RAILS_ENV") == "development"
282
+ >> require "gem_bench"
283
+ => true
284
+ >> conditional_rails_behavior_regex = /(ENV(\["|\.fetch\("))?rails(_|\.)env("\]|"\))?( == "|\.)development/i
285
+ >> conditional_rails_behavior = GemBench.find(look_for_regex: conditional_rails_behavior_regex).starters
286
+ => [rack, actionpack, actioncable, actionmailer, rubocop, railties, rubocop-ruby2_7, sass, sass-rails]
287
+ >> print conditional_rails_behavior.map {|gem| "#{gem.name} has Rails.env condition in #{gem.stats}" }.join("\n")
288
+ 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]]
289
+ 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]]
290
+ 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]]
291
+ 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]]
292
+ 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]]
293
+ 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]]
294
+ 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]]
295
+ 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]]
296
+ 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]]
297
+ ```
298
+
162
299
  ### More Different Example!
163
300
 
164
301
  Fire up an `irb` session or a `rails console` and then:
@@ -222,7 +359,7 @@ In order to *also* see list gems may *not* be required at boot time you need to:
222
359
  1. Make sure you are in the root of a project with a Gemfile
223
360
  2. Make sure the gem is actually a dependency in the Gemfile
224
361
 
225
- So here's a [*fat* Gemfile][bundle-group-pattern] weighing in at 265 gem dependencies. We'll use it for this example:
362
+ So here's a [fat Gemfile][bundle-group-pattern] weighing in at 265 gem dependencies. We'll use it for this example:
226
363
 
227
364
  ∴ bundle exec rails console
228
365
  Welcome to RAILS. You are using ruby 1.9.3p392 (2013-02-22 revision 39386) [x86_64-darwin12.2.1]. Have fun ;)
@@ -382,12 +519,13 @@ A future version will also look for initializers, because gems which have code t
382
519
 
383
520
  ## Contributors
384
521
 
385
- [![Contributors](https://contrib.rocks/image?repo=pboling/gitmoji-regex)][🖐contributors]
522
+ [![Contributors][🖐contributors-img]][🖐contributors]
386
523
 
387
- Made with [contributors-img][contrib-rocks].
524
+ Made with [contributors-img][🖐contrib-rocks].
388
525
 
526
+ [🖐contrib-rocks]: https://contrib.rocks
389
527
  [🖐contributors]: https://github.com/pboling/gem_bench/graphs/contributors
390
- [contrib-rocks]: https://contrib.rocks
528
+ [🖐contributors-img]: https://contrib.rocks/image?repo=pboling/gem_bench
391
529
 
392
530
  ## Contributing
393
531
 
@@ -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.1"
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.1
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-17 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,6 +258,20 @@ 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
276
  Enforce Gemfile version constraints
251
277
  Regex search across all installed gem's source code to find issues quickly
@@ -264,6 +290,7 @@ files:
264
290
  - SECURITY.md
265
291
  - lib/gem_bench.rb
266
292
  - lib/gem_bench/gemfile_line_tokenizer.rb
293
+ - lib/gem_bench/jersey.rb
267
294
  - lib/gem_bench/player.rb
268
295
  - lib/gem_bench/scout.rb
269
296
  - lib/gem_bench/strict_version_gem.rb
@@ -275,10 +302,10 @@ licenses:
275
302
  - MIT
276
303
  metadata:
277
304
  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
305
+ source_code_uri: http://github.com/pboling/gem_bench/tree/v2.0.1
306
+ changelog_uri: http://github.com/pboling/gem_bench/blob/v2.0.1/CHANGELOG.md
280
307
  bug_tracker_uri: http://github.com/pboling/gem_bench/issues
281
- documentation_uri: https://www.rubydoc.info/gems/gem_bench/2.0.0
308
+ documentation_uri: https://www.rubydoc.info/gems/gem_bench/2.0.1
282
309
  wiki_uri: http://github.com/pboling/gem_bench/wiki
283
310
  funding_uri: https://liberapay.com/pboling
284
311
  rubygems_mfa_required: 'true'
@@ -297,7 +324,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
297
324
  - !ruby/object:Gem::Version
298
325
  version: '0'
299
326
  requirements: []
300
- rubygems_version: 3.4.19
327
+ rubygems_version: 3.4.22
301
328
  signing_key:
302
329
  specification_version: 4
303
330
  summary: Static Gemfile and installed gem library source code analysis
metadata.gz.sig CHANGED
Binary file