bundler-stats 2.0.1 → 2.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.github/workflows/main.yml +27 -0
- data/.gitignore +1 -0
- data/.ruby-version +1 -0
- data/CHANGELOG.md +97 -4
- data/README.md +110 -13
- data/bin/bundle-stats +0 -1
- data/bin/bundler-stats +3 -0
- data/bundler-stats.gemspec +5 -5
- data/lib/bundler/stats/calculator.rb +2 -4
- data/lib/bundler/stats/cli.rb +15 -12
- data/lib/bundler/stats/printer.rb +1 -1
- data/lib/bundler/stats/skiplist.rb +32 -0
- data/lib/bundler/stats/tree.rb +6 -5
- data/lib/bundler/stats/version.rb +1 -1
- data/lib/bundler/stats.rb +1 -0
- data/spec/lib/bundler/stats/calculator_spec.rb +21 -4
- data/spec/lib/bundler/stats/printer_spec.rb +12 -2
- data/spec/lib/bundler/stats/remover_spec.rb +1 -2
- data/spec/lib/bundler/stats/tree_spec.rb +10 -7
- data/spec/spec_helper.rb +11 -0
- metadata +35 -21
- data/.travis.yml +0 -6
- data/bin/bundler-stats +0 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 38f866872f6ba724ee82db46ba1715c05bcf8f22272f0ae6a23a96b1760232ce
|
4
|
+
data.tar.gz: ee9b4655d4c8faa1da7f23d3602820ab70eeaf10aad836f4bc7c544cd10bf795
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: e31cce716bfae8bdc92e525d1047678b96c4ea18f80aee2875718f84c690a8a76dbd34ee923b445724716f45eb0e9cdbeab69e13b0d6479284cb4a1185beeecf
|
7
|
+
data.tar.gz: 2644320effea69f6e117a92154e3ddf0e0a3327a23d8141262dc4138fefa8a8a84eab049e68686ded2f778d2b271cbf8a00c43a6eb2b9fa06c09d01b11ce694d
|
@@ -0,0 +1,27 @@
|
|
1
|
+
name: CI
|
2
|
+
|
3
|
+
on:
|
4
|
+
push:
|
5
|
+
branches: [ master ]
|
6
|
+
pull_request:
|
7
|
+
branches: [ master ]
|
8
|
+
|
9
|
+
jobs:
|
10
|
+
test:
|
11
|
+
strategy:
|
12
|
+
matrix:
|
13
|
+
os: [ubuntu-latest, macos-latest]
|
14
|
+
ruby-version: [3.1, 3.0, 2.7, 2.6, 2.5, 2.4, 2.3]
|
15
|
+
runs-on: ${{ matrix.os }}
|
16
|
+
|
17
|
+
steps:
|
18
|
+
- uses: actions/checkout@v2
|
19
|
+
- name: Set up Ruby ${{ matrix.ruby-version }}
|
20
|
+
uses: ruby/setup-ruby@v1
|
21
|
+
with:
|
22
|
+
ruby-version: ${{ matrix.ruby-version }}
|
23
|
+
bundler-cache: true
|
24
|
+
- name: Install dependencies
|
25
|
+
run: bundle install
|
26
|
+
- name: Run tests
|
27
|
+
run: bundle exec rspec
|
data/.gitignore
CHANGED
data/.ruby-version
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
2.7.3
|
data/CHANGELOG.md
CHANGED
@@ -1,19 +1,112 @@
|
|
1
1
|
Changelog
|
2
2
|
=============
|
3
3
|
|
4
|
-
## [
|
4
|
+
## [2.3.0] - 2022-02-12
|
5
|
+
|
6
|
+
### Added
|
7
|
+
- Skiplist now correctly removes dependencies from 1st and onward levels
|
8
|
+
- Wildcard ability for specifying gems for skiplist
|
9
|
+
- Document `versions` in README
|
10
|
+
|
11
|
+
## [2.2.0] - 2022-02-09
|
12
|
+
|
13
|
+
### Added
|
14
|
+
- Support for gems.rb and gems.locked files.
|
15
|
+
- Proper exit codes from thor when errors occur
|
16
|
+
- Looser dependency on thor
|
17
|
+
|
18
|
+
## [2.1.1] - 2021-11-30
|
19
|
+
|
20
|
+
### Changed
|
21
|
+
- Symlink isn't the recommended way to alias a command. Patterned current
|
22
|
+
solution after bundle-audit. Boy that naming convention was unfortunate.
|
23
|
+
- Pin down dependencies a bit.
|
24
|
+
|
25
|
+
### Added
|
26
|
+
- Moved to Github test workflow, by @etagwerker.
|
27
|
+
- New default ruby version to be most current non-3 ruby.
|
28
|
+
- Build artifacts now ignored.
|
29
|
+
- Moved to a real spec_helper so tests can be filtered during runs if desired.
|
30
|
+
|
5
31
|
### Fixed
|
32
|
+
- Failing test from previous version.
|
6
33
|
|
7
|
-
|
34
|
+
## [2.1.0] - 2021-11-29
|
35
|
+
|
36
|
+
### Changed
|
37
|
+
- Add Travis targets for more modern rubies, by @etagwerker.
|
38
|
+
- Make sorting predictable across platforms, by @etagwerker.
|
39
|
+
|
40
|
+
### Fixed
|
41
|
+
- Fix error in CI when `tput` isn't available, by @etagwerker.
|
42
|
+
|
43
|
+
## [2.0.1] - 2018-05-04
|
8
44
|
|
9
|
-
## [1.1.0] - 2018-03-15
|
10
45
|
### Added
|
46
|
+
- Complete custom table printer for some nicer output.
|
47
|
+
|
48
|
+
## [2.0.0] - 2018-05-04
|
49
|
+
Broken as hell.
|
50
|
+
|
51
|
+
## [1.3.4] - 2019-04-18
|
52
|
+
|
53
|
+
### Changed
|
54
|
+
- Allow use of either `bundle-stats` or `bundler-stats` since the gem name was
|
55
|
+
a confusing choice. Live and learn.
|
56
|
+
|
57
|
+
### Added
|
58
|
+
- Display resolved version of a gem when using `bundler-stats show`.
|
59
|
+
|
60
|
+
## [1.3.3] - 2019-04-18
|
61
|
+
|
62
|
+
### Changed
|
63
|
+
- Only print missing system dependency warning once per target gem, rather than
|
64
|
+
blowing up the console when a complicated gem is affected.
|
11
65
|
|
66
|
+
## [1.3.2] - 2019-04-17
|
67
|
+
|
68
|
+
### Fixed
|
69
|
+
- Fix issue when testing removability and a system gem from another platform
|
70
|
+
is "required", thx @rwojnarowski.
|
71
|
+
|
72
|
+
## [1.3.1] - 2019-04-05
|
73
|
+
|
74
|
+
### Changed
|
75
|
+
- Nicer table printing, still committed to not adding a table printing gem.
|
76
|
+
|
77
|
+
## [1.3.0] - 2019-04-05
|
78
|
+
|
79
|
+
### Changed
|
80
|
+
- Reversed the order in which gems are printed to worst-offenders-first.
|
81
|
+
|
82
|
+
## [1.2.1] - 2019-04-05
|
83
|
+
|
84
|
+
### Fixed
|
85
|
+
- When a system gem is missing from the lockfile (but is depended upon), warn
|
86
|
+
the user rather than exploding.
|
87
|
+
|
88
|
+
## [1.2.0] - 2019-04-05
|
89
|
+
|
90
|
+
### Fixed
|
91
|
+
- Loosen dependency on thor gem, by localhostdotdev.
|
92
|
+
|
93
|
+
## [1.1.2] - 2018-03-16
|
94
|
+
Wonkiness w/ versioning. Apparently I was bad at this.
|
95
|
+
|
96
|
+
## [1.1.0] - 2018-03-16
|
97
|
+
Eventually superseded by 1.1.2 for reasons.
|
98
|
+
|
99
|
+
### Fixed
|
100
|
+
- Remove unintentional inclusion of pry outside of dev environment, per @Tuxified
|
101
|
+
|
102
|
+
## [1.1.0] - 2018-03-15
|
103
|
+
|
104
|
+
### Added
|
12
105
|
- Adds a way to view dependency version restrictions for a given gem, by @olivierlacan
|
13
106
|
|
14
107
|
## [1.0.0] - 2016-04-13
|
15
|
-
### Added
|
16
108
|
|
109
|
+
### Added
|
17
110
|
- Base library, woo!
|
18
111
|
- List all transitive dependencies and how many other deps rely on them
|
19
112
|
- View list of Github-specified dependencies
|
data/README.md
CHANGED
@@ -34,8 +34,10 @@ Usage
|
|
34
34
|
bundle-stats version # Prints the bundler-stats version
|
35
35
|
bundle-stats versions TARGET # Shows versions requirements for target in other dependencies
|
36
36
|
|
37
|
+
### Auditing Your Gemfile
|
38
|
+
|
37
39
|
The most obvious thing to do is run the command by itself, which should help
|
38
|
-
identify problem areas
|
40
|
+
identify problem areas.
|
39
41
|
|
40
42
|
> bundle-stats
|
41
43
|
|
@@ -62,7 +64,7 @@ identify problem areas:
|
|
62
64
|
Unpinned Versions 54
|
63
65
|
Github Refs 0
|
64
66
|
|
65
|
-
It looks like rails_admin is a huge problem. Use `show` to investigate
|
67
|
+
It looks like rails_admin is a huge problem. Use `show` to investigate.
|
66
68
|
|
67
69
|
> bundle-stats show rails_admin
|
68
70
|
bundle-stats for rails_admin
|
@@ -98,22 +100,117 @@ It looks like rails_admin is a huge problem. Use `show` to investigate:
|
|
98
100
|
| | bundler |
|
99
101
|
+--------------------------------|----------------------------------------+
|
100
102
|
|
101
|
-
|
102
|
-
|
103
|
-
|
103
|
+
### Skipping Common Dependencies
|
104
|
+
|
105
|
+
Let's take a look at another common gem to rails codebases. In this case,
|
106
|
+
we have some unique dependencies, but also many dependencies on rails, and on
|
107
|
+
its constituent gems.
|
108
|
+
|
109
|
+
> bundle-stats show compass-rails
|
110
|
+
bundle-stats for compass-rails
|
111
|
+
|
112
|
+
+--------------------------------|----------------------------------------+
|
113
|
+
| Depended Upon By (0) | |
|
114
|
+
| Depends On (35) | compass, sass-rails, sprockets |
|
115
|
+
| | chunky_png, compass-core |
|
116
|
+
| | compass-import-once, rb-fsevent |
|
117
|
+
| | rb-inotify, sass, multi_json, ffi |
|
118
|
+
| | railties, sprockets-rails, tilt |
|
119
|
+
| | actionpack, activesupport, method_source |
|
120
|
+
| | rake, thor, actionview, rack, rack-test |
|
121
|
+
| | rails-dom-testing, rails-html-sanitizer |
|
122
|
+
| | builder, erubi, concurrent-ruby, i18n |
|
123
|
+
| | minitest, tzinfo, thread_safe, nokogiri |
|
124
|
+
| | mini_portile2, loofah, crass |
|
125
|
+
| Unique to This (3) | compass, compass-core |
|
126
|
+
| | compass-import-once |
|
127
|
+
+--------------------------------|----------------------------------------+
|
128
|
+
|
129
|
+
We're not looking to remove rails, so there's not much point in including it
|
130
|
+
within this output. Instead, we can use the `nofollow` flag to skip it in all
|
131
|
+
output lists.
|
104
132
|
|
105
|
-
> bundle-stats show
|
106
|
-
bundle-stats for
|
133
|
+
> bundle-stats show compass-rails --nofollow="railties,activeupport,actionview,actionpack"
|
134
|
+
bundle-stats for compass-rails
|
107
135
|
|
108
136
|
+--------------------------------|----------------------------------------+
|
109
|
-
| Depended Upon By (
|
110
|
-
|
|
137
|
+
| Depended Upon By (0) | |
|
138
|
+
| Depends On (20) | compass, sass-rails, sprockets |
|
139
|
+
| | chunky_png, compass-core |
|
140
|
+
| | compass-import-once, rb-fsevent |
|
141
|
+
| | rb-inotify, sass, multi_json, ffi |
|
111
142
|
| | sprockets-rails, tilt, concurrent-ruby |
|
112
|
-
| | rack,
|
113
|
-
|
|
143
|
+
| | rack, activesupport, i18n, minitest |
|
144
|
+
| | tzinfo, thread_safe |
|
145
|
+
| Unique to This (3) | compass, compass-core |
|
146
|
+
| | compass-import-once |
|
114
147
|
+--------------------------------|----------------------------------------+
|
115
148
|
|
116
|
-
|
149
|
+
This is better, but for other codebases it's common for gems to depend on each
|
150
|
+
of the _many many_ child gems of rails individually. Rather than specifying each
|
151
|
+
by itself, we can use wildcards to remove them in bulk.
|
152
|
+
|
153
|
+
> bundle-stats show compass-rails --nofollow="rail*,action*,active*"
|
154
|
+
bundle-stats for compass-rails
|
155
|
+
|
156
|
+
+--------------------------------|----------------------------------------+
|
157
|
+
| Depended Upon By (0) | |
|
158
|
+
| Depends On (15) | compass, sass-rails, sprockets |
|
159
|
+
| | chunky_png, compass-core |
|
160
|
+
| | compass-import-once, rb-fsevent |
|
161
|
+
| | rb-inotify, sass, multi_json, ffi |
|
162
|
+
| | sprockets-rails, tilt, concurrent-ruby |
|
163
|
+
| | rack |
|
164
|
+
| Unique to This (3) | compass, compass-core |
|
165
|
+
| | compass-import-once |
|
166
|
+
+--------------------------------|----------------------------------------+
|
167
|
+
|
168
|
+
### Showing Required Versions
|
169
|
+
|
170
|
+
Sometimes you try to upgrade a gem, you ask bundler _very nicely_, but you
|
171
|
+
find that the version hasn't changed. When that happens, sometimes it's not
|
172
|
+
clear why the gem version isn't changing.
|
173
|
+
|
174
|
+
In that case, use `versions` to list all required dependencies on your gem.
|
175
|
+
|
176
|
+
> bundle-stats versions actionpack
|
177
|
+
version dependencies for actionpack
|
178
|
+
|
179
|
+
Depended Upon By 24
|
180
|
+
Resolved Version 5.2.0
|
181
|
+
|
182
|
+
+----------------------------|------------------+
|
183
|
+
| Name | Required Version |
|
184
|
+
+----------------------------|------------------+
|
185
|
+
| webpacker | = 5.2.0 |
|
186
|
+
| actionmailer | = 5.2.0 |
|
187
|
+
| activestorage | = 5.2.0 |
|
188
|
+
| coffee-rails | = 5.2.0 |
|
189
|
+
| compass-rails | = 5.2.0 |
|
190
|
+
| devise | = 5.2.0 |
|
191
|
+
| factory_bot_rails | = 5.2.0 |
|
192
|
+
| font-awesome-rails | = 5.2.0 |
|
193
|
+
| rails_admin | = 5.2.0 |
|
194
|
+
| railties | = 5.2.0 |
|
195
|
+
| sass-rails | = 5.2.0 |
|
196
|
+
| scenic | = 5.2.0 |
|
197
|
+
| versionist | = 5.2.0 |
|
198
|
+
| actioncable | = 5.2.0 |
|
199
|
+
| jquery-rails | = 5.2.0 |
|
200
|
+
| jquery-ui-rails | = 5.2.0 |
|
201
|
+
| jquery_file_download-rails | = 5.2.0 |
|
202
|
+
| rails | = 5.2.0 |
|
203
|
+
| rspec-rails | >= 3.0 |
|
204
|
+
| sprockets-rails | >= 4.0 |
|
205
|
+
| haml-rails | >= 4.0.1 |
|
206
|
+
| responders | >= 4.2.0, < 5.3 |
|
207
|
+
| simple_form | >= 5.0 |
|
208
|
+
| rails-controller-testing | ~> 5.x, >= 5.0.1 |
|
209
|
+
+----------------------------|------------------+
|
210
|
+
|
211
|
+
### Output Formats
|
212
|
+
|
213
|
+
To consume information with a build job or somesuch, all commands can emit JSON.
|
117
214
|
|
118
215
|
> bundle-stats show sass-rails --nofollow="railties,activesupport,actionpack" -f json
|
119
216
|
{
|
@@ -154,7 +251,7 @@ Credits
|
|
154
251
|
Thanks to the many kind people at [RailsCamp East
|
155
252
|
2016](http://east.railscamp.com) for the help, the ideas, and the support.
|
156
253
|
|
157
|
-
|
254
|
+
Also, many other folks for their feature / fix contributions. ❤️
|
158
255
|
|
159
256
|
License
|
160
257
|
-------
|
data/bin/bundle-stats
CHANGED
data/bin/bundler-stats
ADDED
data/bundler-stats.gemspec
CHANGED
@@ -15,7 +15,7 @@ Gem::Specification.new do |gem|
|
|
15
15
|
gem.licenses = "MIT"
|
16
16
|
gem.authors = "Joseph Mastey"
|
17
17
|
gem.email = "jmmastey@gmail.com"
|
18
|
-
gem.homepage = ""
|
18
|
+
gem.homepage = "http://github.com/jmmastey/bundler-stats"
|
19
19
|
|
20
20
|
gem.metadata = {
|
21
21
|
"homepage_uri" => "http://github.com/jmmastey/bundler-stats",
|
@@ -35,12 +35,12 @@ Gem::Specification.new do |gem|
|
|
35
35
|
|
36
36
|
gem.require_paths = %w[ext lib].select { |dir| File.directory?(dir) }
|
37
37
|
|
38
|
-
gem.add_dependency "bundler", ">= 1.9"
|
39
|
-
gem.add_dependency "thor", "
|
38
|
+
gem.add_dependency "bundler", ">= 1.9", "< 3"
|
39
|
+
gem.add_dependency "thor", ">= 0.19.0", "< 2.0"
|
40
40
|
|
41
41
|
gem.add_development_dependency "rspec", "~> 3.4"
|
42
42
|
gem.add_development_dependency "guard", "~> 2.13"
|
43
|
-
gem.add_development_dependency "guard-rspec"
|
43
|
+
gem.add_development_dependency "guard-rspec", "< 5"
|
44
44
|
gem.add_development_dependency "pry", "~> 0.10"
|
45
|
-
gem.add_development_dependency "rb-readline"
|
45
|
+
gem.add_development_dependency "rb-readline", "< 1"
|
46
46
|
end
|
@@ -5,7 +5,7 @@ module Bundler
|
|
5
5
|
class Calculator
|
6
6
|
attr_reader :parser, :tree, :gemfile, :remover
|
7
7
|
|
8
|
-
def initialize(gemfile_path, lockfile_path,
|
8
|
+
def initialize(gemfile_path, lockfile_path, skiplist = nil)
|
9
9
|
raise ArgumentError unless File.readable?(lockfile_path)
|
10
10
|
raise ArgumentError unless File.readable?(gemfile_path)
|
11
11
|
|
@@ -17,9 +17,7 @@ module Bundler
|
|
17
17
|
lock_contents = File.read(lockfile_path)
|
18
18
|
@parser = Bundler::LockfileParser.new(lock_contents)
|
19
19
|
|
20
|
-
skiplist = options.fetch(:skiplist, [])
|
21
20
|
@tree = Bundler::Stats::Tree.new(@parser, skiplist: skiplist)
|
22
|
-
|
23
21
|
@remover = Bundler::Stats::Remover.new(@tree, @gemfile)
|
24
22
|
end
|
25
23
|
|
@@ -64,7 +62,7 @@ module Bundler
|
|
64
62
|
stats = @gemfile.map do |gem|
|
65
63
|
@tree.summarize(gem.name)
|
66
64
|
end
|
67
|
-
stats.sort_by { |row| row[:total_dependencies] }
|
65
|
+
stats.sort_by { |row| [row[:total_dependencies] * -1, row[:name]] }
|
68
66
|
end
|
69
67
|
end
|
70
68
|
end
|
data/lib/bundler/stats/cli.rb
CHANGED
@@ -59,6 +59,10 @@ module Bundler
|
|
59
59
|
|
60
60
|
private
|
61
61
|
|
62
|
+
def self.exit_on_failure?
|
63
|
+
true
|
64
|
+
end
|
65
|
+
|
62
66
|
def draw_stats(gem_stats, summary)
|
63
67
|
max_name_length = gem_stats.map { |gem| gem[:name].length }.max
|
64
68
|
|
@@ -95,7 +99,7 @@ module Bundler
|
|
95
99
|
|
96
100
|
def draw_versions(stats, target)
|
97
101
|
dependers = stats[:top_level_dependencies] # they do the depending
|
98
|
-
say "
|
102
|
+
say "version dependencies for #{target}"
|
99
103
|
say Printer.new(
|
100
104
|
headers: nil,
|
101
105
|
borders: false,
|
@@ -117,31 +121,30 @@ module Bundler
|
|
117
121
|
end
|
118
122
|
|
119
123
|
def build_calculator(options)
|
120
|
-
|
121
|
-
|
122
|
-
else
|
123
|
-
skiplist = []
|
124
|
-
end
|
125
|
-
|
126
|
-
@calculator ||= Bundler::Stats::Calculator.new(gemfile_path, lockfile_path, skiplist: skiplist)
|
124
|
+
skiplist = Bundler::Stats::Skiplist.new(options[:nofollow])
|
125
|
+
@calculator ||= Bundler::Stats::Calculator.new(gemfile_path, lockfile_path, skiplist)
|
127
126
|
end
|
128
127
|
|
129
128
|
def gemfile_path
|
130
129
|
cwd = Pathname.new("./")
|
131
130
|
until cwd.realdirpath.root? do
|
132
|
-
|
131
|
+
%w(gems.rb Gemfile).each do |gemfile|
|
132
|
+
return (cwd + gemfile) if File.exist?(cwd + gemfile)
|
133
|
+
end
|
133
134
|
cwd = cwd.parent
|
134
135
|
end
|
135
|
-
raise ArgumentError, "Couldn't find Gemfile in this directory or parents"
|
136
|
+
raise ArgumentError, "Couldn't find gems.rb nor Gemfile in this directory or parents"
|
136
137
|
end
|
137
138
|
|
138
139
|
def lockfile_path
|
139
140
|
cwd = Pathname.new(".")
|
140
141
|
until cwd.realdirpath.root? do
|
141
|
-
|
142
|
+
%w(gems.locked Gemfile.lock).each do |lockfile|
|
143
|
+
return (cwd + lockfile) if File.exist?(cwd + lockfile)
|
144
|
+
end
|
142
145
|
cwd = cwd.parent
|
143
146
|
end
|
144
|
-
raise ArgumentError, "Couldn't find Gemfile in this directory or parents"
|
147
|
+
raise ArgumentError, "Couldn't find gems.locked nor Gemfile.lock in this directory or parents"
|
145
148
|
end
|
146
149
|
end
|
147
150
|
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
class Bundler::Stats::Skiplist
|
2
|
+
attr_reader :regex_list
|
3
|
+
|
4
|
+
def initialize(list = '')
|
5
|
+
@regex_list = if list.respond_to?(:regex_list)
|
6
|
+
list.regex_list
|
7
|
+
elsif list.respond_to?(:split)
|
8
|
+
list
|
9
|
+
.gsub(/\s+/, '')
|
10
|
+
.split(",")
|
11
|
+
.map { |str| glob_to_regex(str) }
|
12
|
+
else
|
13
|
+
(list || []).map { |str| glob_to_regex(str) }
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
def filter(gem_list)
|
18
|
+
gem_list.reject { |gem| self.include?(gem) }
|
19
|
+
end
|
20
|
+
|
21
|
+
def include?(target)
|
22
|
+
@regex_list.any? { |pattern| pattern =~ target.name }
|
23
|
+
end
|
24
|
+
|
25
|
+
private
|
26
|
+
|
27
|
+
def glob_to_regex(str)
|
28
|
+
str.gsub!('*','.*') # weird globbish behavior
|
29
|
+
|
30
|
+
/^#{str}$/
|
31
|
+
end
|
32
|
+
end
|
data/lib/bundler/stats/tree.rb
CHANGED
@@ -1,20 +1,21 @@
|
|
1
1
|
class Bundler::Stats::Tree
|
2
|
-
attr_accessor :tree
|
2
|
+
attr_accessor :tree, :skiplist
|
3
3
|
|
4
4
|
ERR_MESSAGE = "The dependency `%s` wasn't found. It may not be present in " \
|
5
5
|
"your Gemfile.lock. This often happens when a dependency isn't " \
|
6
6
|
"installed on your platform."
|
7
7
|
|
8
|
-
def initialize(parser, skiplist:
|
8
|
+
def initialize(parser, skiplist: '')
|
9
9
|
raise ArgumentError unless parser.respond_to?(:specs)
|
10
10
|
|
11
11
|
@parser = parser
|
12
12
|
@tree = specs_as_tree(@parser.specs)
|
13
|
-
@skiplist = skiplist
|
13
|
+
@skiplist = Bundler::Stats::Skiplist.new(skiplist)
|
14
14
|
end
|
15
15
|
|
16
16
|
def summarize(target)
|
17
17
|
transitive_dependencies = transitive_dependencies(target)
|
18
|
+
|
18
19
|
{ name: target,
|
19
20
|
total_dependencies: transitive_dependencies.count,
|
20
21
|
first_level_dependencies: first_level_dependencies(target).count,
|
@@ -51,12 +52,12 @@ class Bundler::Stats::Tree
|
|
51
52
|
return []
|
52
53
|
end
|
53
54
|
|
54
|
-
top_level = @tree[target].dependencies
|
55
|
+
top_level = skiplist.filter(@tree[target].dependencies)
|
55
56
|
all_level = top_level + top_level.inject([]) do |arr, dep|
|
56
57
|
# turns out bundler refuses to include itself in the dependency tree,
|
57
58
|
# which is sneaky
|
58
59
|
next arr if dep.name == "bundler"
|
59
|
-
next arr if
|
60
|
+
next arr if skiplist.include? dep
|
60
61
|
|
61
62
|
arr += transitive_dependencies(dep.name)
|
62
63
|
end
|
data/lib/bundler/stats.rb
CHANGED
@@ -1,5 +1,4 @@
|
|
1
|
-
require '
|
2
|
-
require 'bundler/stats'
|
1
|
+
require 'spec_helper'
|
3
2
|
|
4
3
|
describe Bundler::Stats::Calculator do
|
5
4
|
subject { described_class }
|
@@ -39,9 +38,9 @@ describe Bundler::Stats::Calculator do
|
|
39
38
|
# this sucks. break this dependency further
|
40
39
|
allow(Bundler::LockfileParser).to receive(:new) { "parser" }
|
41
40
|
|
42
|
-
target = subject.new(gemfile_path, lockfile_path, skiplist
|
41
|
+
target = subject.new(gemfile_path, lockfile_path, "skiplist")
|
43
42
|
|
44
|
-
expect(Bundler::Stats::Tree).to have_received(:new).with("parser", skiplist: "
|
43
|
+
expect(Bundler::Stats::Tree).to have_received(:new).with("parser", skiplist: "skiplist")
|
45
44
|
end
|
46
45
|
end
|
47
46
|
|
@@ -77,6 +76,16 @@ describe Bundler::Stats::Calculator do
|
|
77
76
|
end
|
78
77
|
|
79
78
|
context "#gem_stats" do
|
79
|
+
let(:partial_sorted_result) do
|
80
|
+
[
|
81
|
+
["rolify", 0],
|
82
|
+
["rubocop-rspec", 0],
|
83
|
+
["spring", 0],
|
84
|
+
["state_machine", 0],
|
85
|
+
["will_paginate", 0]
|
86
|
+
]
|
87
|
+
end
|
88
|
+
|
80
89
|
it "includes entries for each gem" do
|
81
90
|
calculator = subject.new(gemfile_path, lockfile_path)
|
82
91
|
|
@@ -85,6 +94,14 @@ describe Bundler::Stats::Calculator do
|
|
85
94
|
expect(target).to be_a(Array)
|
86
95
|
expect(target.length).to eq(calculator.gemfile.length)
|
87
96
|
end
|
97
|
+
|
98
|
+
it "sorts entries by total dependencies descending and name ascending" do
|
99
|
+
calculator = subject.new(gemfile_path, lockfile_path)
|
100
|
+
|
101
|
+
target = calculator.gem_stats
|
102
|
+
tuple = target.map {|x| [x[:name], x[:total_dependencies]] }
|
103
|
+
expect(tuple).to end_with(*partial_sorted_result)
|
104
|
+
end
|
88
105
|
end
|
89
106
|
|
90
107
|
context "#summary" do
|
@@ -1,5 +1,4 @@
|
|
1
|
-
require '
|
2
|
-
require 'bundler/stats'
|
1
|
+
require 'spec_helper'
|
3
2
|
|
4
3
|
describe Bundler::Stats::Printer do
|
5
4
|
subject { described_class }
|
@@ -30,6 +29,17 @@ describe Bundler::Stats::Printer do
|
|
30
29
|
expect(response).to eq(80)
|
31
30
|
end
|
32
31
|
end
|
32
|
+
|
33
|
+
context "tput returns an error" do
|
34
|
+
it "returns the default value" do
|
35
|
+
allow(Kernel).to receive(:send).and_return("tput: No value for $TERM and no -T specified")
|
36
|
+
|
37
|
+
printer = subject.new
|
38
|
+
response = printer.terminal_width
|
39
|
+
|
40
|
+
expect(response).to eq(80)
|
41
|
+
end
|
42
|
+
end
|
33
43
|
end
|
34
44
|
|
35
45
|
describe "#column_widths" do
|
@@ -1,5 +1,4 @@
|
|
1
|
-
require '
|
2
|
-
require 'bundler/stats'
|
1
|
+
require 'spec_helper'
|
3
2
|
|
4
3
|
describe Bundler::Stats::Tree do
|
5
4
|
subject { described_class }
|
@@ -141,20 +140,24 @@ describe Bundler::Stats::Tree do
|
|
141
140
|
end
|
142
141
|
|
143
142
|
context "skip lists" do
|
144
|
-
it "
|
143
|
+
it "skips processing the requested entry, plus children of skipped entries" do
|
145
144
|
tree = subject.new(parser, skiplist: ["depth-three"])
|
146
145
|
|
147
146
|
target = tree.transitive_dependencies("depth-one")
|
148
147
|
|
149
|
-
expect(target.map(&:name)).to include("depth-
|
148
|
+
expect(target.map(&:name)).to include("depth-two")
|
149
|
+
expect(target.map(&:name)).not_to include("depth-three")
|
150
|
+
expect(target.map(&:name)).not_to include("depth-four")
|
150
151
|
end
|
151
152
|
|
152
|
-
it "
|
153
|
-
tree = subject.new(parser, skiplist: ["depth-
|
153
|
+
it "allows skiplist wildcards" do
|
154
|
+
tree = subject.new(parser, skiplist: ["depth-t*"])
|
154
155
|
|
155
156
|
target = tree.transitive_dependencies("depth-one")
|
156
157
|
|
157
|
-
expect(target.map(&:name)).not_to include("depth-
|
158
|
+
expect(target.map(&:name)).not_to include("depth-two")
|
159
|
+
expect(target.map(&:name)).not_to include("depth-three")
|
160
|
+
expect(target.map(&:name)).not_to include("depth-four") # because transitive
|
158
161
|
end
|
159
162
|
end
|
160
163
|
end
|
data/spec/spec_helper.rb
ADDED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: bundler-stats
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.0
|
4
|
+
version: 2.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Joseph Mastey
|
8
|
-
autorequire:
|
8
|
+
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2022-02-13 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -17,6 +17,9 @@ dependencies:
|
|
17
17
|
- - ">="
|
18
18
|
- !ruby/object:Gem::Version
|
19
19
|
version: '1.9'
|
20
|
+
- - "<"
|
21
|
+
- !ruby/object:Gem::Version
|
22
|
+
version: '3'
|
20
23
|
type: :runtime
|
21
24
|
prerelease: false
|
22
25
|
version_requirements: !ruby/object:Gem::Requirement
|
@@ -24,20 +27,29 @@ dependencies:
|
|
24
27
|
- - ">="
|
25
28
|
- !ruby/object:Gem::Version
|
26
29
|
version: '1.9'
|
30
|
+
- - "<"
|
31
|
+
- !ruby/object:Gem::Version
|
32
|
+
version: '3'
|
27
33
|
- !ruby/object:Gem::Dependency
|
28
34
|
name: thor
|
29
35
|
requirement: !ruby/object:Gem::Requirement
|
30
36
|
requirements:
|
31
|
-
- - "
|
37
|
+
- - ">="
|
38
|
+
- !ruby/object:Gem::Version
|
39
|
+
version: 0.19.0
|
40
|
+
- - "<"
|
32
41
|
- !ruby/object:Gem::Version
|
33
|
-
version: '0
|
42
|
+
version: '2.0'
|
34
43
|
type: :runtime
|
35
44
|
prerelease: false
|
36
45
|
version_requirements: !ruby/object:Gem::Requirement
|
37
46
|
requirements:
|
38
|
-
- - "
|
47
|
+
- - ">="
|
48
|
+
- !ruby/object:Gem::Version
|
49
|
+
version: 0.19.0
|
50
|
+
- - "<"
|
39
51
|
- !ruby/object:Gem::Version
|
40
|
-
version: '0
|
52
|
+
version: '2.0'
|
41
53
|
- !ruby/object:Gem::Dependency
|
42
54
|
name: rspec
|
43
55
|
requirement: !ruby/object:Gem::Requirement
|
@@ -70,16 +82,16 @@ dependencies:
|
|
70
82
|
name: guard-rspec
|
71
83
|
requirement: !ruby/object:Gem::Requirement
|
72
84
|
requirements:
|
73
|
-
- - "
|
85
|
+
- - "<"
|
74
86
|
- !ruby/object:Gem::Version
|
75
|
-
version: '
|
87
|
+
version: '5'
|
76
88
|
type: :development
|
77
89
|
prerelease: false
|
78
90
|
version_requirements: !ruby/object:Gem::Requirement
|
79
91
|
requirements:
|
80
|
-
- - "
|
92
|
+
- - "<"
|
81
93
|
- !ruby/object:Gem::Version
|
82
|
-
version: '
|
94
|
+
version: '5'
|
83
95
|
- !ruby/object:Gem::Dependency
|
84
96
|
name: pry
|
85
97
|
requirement: !ruby/object:Gem::Requirement
|
@@ -98,16 +110,16 @@ dependencies:
|
|
98
110
|
name: rb-readline
|
99
111
|
requirement: !ruby/object:Gem::Requirement
|
100
112
|
requirements:
|
101
|
-
- - "
|
113
|
+
- - "<"
|
102
114
|
- !ruby/object:Gem::Version
|
103
|
-
version: '
|
115
|
+
version: '1'
|
104
116
|
type: :development
|
105
117
|
prerelease: false
|
106
118
|
version_requirements: !ruby/object:Gem::Requirement
|
107
119
|
requirements:
|
108
|
-
- - "
|
120
|
+
- - "<"
|
109
121
|
- !ruby/object:Gem::Version
|
110
|
-
version: '
|
122
|
+
version: '1'
|
111
123
|
description: Looks through your lockfile and tries to identify problematic use of
|
112
124
|
dependencies
|
113
125
|
email: jmmastey@gmail.com
|
@@ -120,9 +132,10 @@ extra_rdoc_files:
|
|
120
132
|
- CODE_OF_CONDUCT.md
|
121
133
|
- README.md
|
122
134
|
files:
|
135
|
+
- ".github/workflows/main.yml"
|
123
136
|
- ".gitignore"
|
124
137
|
- ".rspec"
|
125
|
-
- ".
|
138
|
+
- ".ruby-version"
|
126
139
|
- CHANGELOG.md
|
127
140
|
- CODE_OF_CONDUCT.md
|
128
141
|
- Gemfile
|
@@ -137,22 +150,24 @@ files:
|
|
137
150
|
- lib/bundler/stats/cli.rb
|
138
151
|
- lib/bundler/stats/printer.rb
|
139
152
|
- lib/bundler/stats/remover.rb
|
153
|
+
- lib/bundler/stats/skiplist.rb
|
140
154
|
- lib/bundler/stats/tree.rb
|
141
155
|
- lib/bundler/stats/version.rb
|
142
156
|
- spec/lib/bundler/stats/calculator_spec.rb
|
143
157
|
- spec/lib/bundler/stats/printer_spec.rb
|
144
158
|
- spec/lib/bundler/stats/remover_spec.rb
|
145
159
|
- spec/lib/bundler/stats/tree_spec.rb
|
160
|
+
- spec/spec_helper.rb
|
146
161
|
- spec/test_gemfile
|
147
162
|
- spec/test_gemfile.lock
|
148
|
-
homepage:
|
163
|
+
homepage: http://github.com/jmmastey/bundler-stats
|
149
164
|
licenses:
|
150
165
|
- MIT
|
151
166
|
metadata:
|
152
167
|
homepage_uri: http://github.com/jmmastey/bundler-stats
|
153
168
|
changelog_uri: https://github.com/jmmastey/bundler-stats/blob/master/CHANGELOG.md
|
154
169
|
source_code_uri: http://github.com/jmmastey/bundler-stats
|
155
|
-
post_install_message:
|
170
|
+
post_install_message:
|
156
171
|
rdoc_options: []
|
157
172
|
require_paths:
|
158
173
|
- lib
|
@@ -167,9 +182,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
167
182
|
- !ruby/object:Gem::Version
|
168
183
|
version: '0'
|
169
184
|
requirements: []
|
170
|
-
|
171
|
-
|
172
|
-
signing_key:
|
185
|
+
rubygems_version: 3.1.6
|
186
|
+
signing_key:
|
173
187
|
specification_version: 4
|
174
188
|
summary: Dependency investigation for Bundler
|
175
189
|
test_files: []
|
data/.travis.yml
DELETED
data/bin/bundler-stats
DELETED
@@ -1 +0,0 @@
|
|
1
|
-
bin/bundle-stats
|