bumbler 0.5.0 → 0.6.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/MIT-LICENSE.md +22 -0
- data/README.md +83 -0
- data/bin/bumbler +28 -15
- data/lib/bumbler.rb +1 -0
- data/lib/bumbler/bundler.rb +26 -35
- data/lib/bumbler/go.rb +10 -16
- data/lib/bumbler/hooks.rb +17 -20
- data/lib/bumbler/progress.rb +25 -31
- data/lib/bumbler/stats.rb +18 -16
- data/lib/bumbler/track_initializers.rb +1 -0
- data/lib/bumbler/version.rb +2 -1
- metadata +24 -9
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 5a60e2a6c84fbfe256e680819c7e7782fbe1b02c8719967d98debdf89dcb85ca
|
4
|
+
data.tar.gz: 2c94bb726e5f97523fff0c80674f60119e5b247d62d3d5e047594aa2bacd7835
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f7644c6cdb5b218d01fa3b9c47835a3be6e1a9260dc94d15d9628b021b4653f1330963c7084cba7947e9569858f92174fadd7510a088a0407dfeefde413b7860
|
7
|
+
data.tar.gz: 4f5019ba1b21b83ef31a40be91fe911ad915d0d1030527206476485d81c8342e8db3f7e2c47582d71ffdbedbf4fe5439244f5e8bc774274971b06b2da44b5f95
|
data/MIT-LICENSE.md
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
The MIT License (MIT)
|
2
|
+
=====================
|
3
|
+
|
4
|
+
Copyright (c) 2014 Ian MacLeod <ian@nevir.net>
|
5
|
+
|
6
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy of
|
7
|
+
this software and associated documentation files (the "Software"), to deal in
|
8
|
+
the Software without restriction, including without limitation the rights to
|
9
|
+
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
|
10
|
+
of the Software, and to permit persons to whom the Software is furnished to do
|
11
|
+
so, subject to the following conditions:
|
12
|
+
|
13
|
+
The above copyright notice and this permission notice shall be included in all
|
14
|
+
copies or substantial portions of the Software.
|
15
|
+
|
16
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
17
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
18
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
19
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
20
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
21
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
22
|
+
SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,83 @@
|
|
1
|
+
Bumbler
|
2
|
+
=======
|
3
|
+
|
4
|
+
Find slow loading gems in your [Bundler](http://gembundler.com/)-based projects!
|
5
|
+
|
6
|
+
Bumbler tracks how long the main require of each gem takes,
|
7
|
+
for example with `gem 'bar'` it tracks `require 'bar'`. If the gem name and the require name are different,
|
8
|
+
add `require:` manually for correct time tracking, for example `gem 'bar-foo', require: 'bar_foo'`.
|
9
|
+
This reuquire tracking can sometimes lead to false positives, because of dependencies,
|
10
|
+
for example `foo` requires `rails` which leads to `foo` being marked as slow.
|
11
|
+
|
12
|
+
For rails projects it loads `config/environment.rb`, for all others it runs `Bundler.require *Bundler.groups`.
|
13
|
+
|
14
|
+
```bash
|
15
|
+
gem install bumbler
|
16
|
+
cd project && bumbler
|
17
|
+
```
|
18
|
+
|
19
|
+
### Custom entrypoints
|
20
|
+
|
21
|
+
Add bumbler to your Gemfile
|
22
|
+
```ruby
|
23
|
+
gem 'bumbler'
|
24
|
+
```
|
25
|
+
|
26
|
+
```
|
27
|
+
RUBYOPT=-rbumbler/go bundle exec ruby -r./lib/foo.rb -e Bumbler::Stats.print_slow_items
|
28
|
+
```
|
29
|
+
|
30
|
+
### Custom threshold
|
31
|
+
|
32
|
+
Set the minimum number of milliseconds before something slow is listed. For
|
33
|
+
example, to show anything >= 10ms:
|
34
|
+
|
35
|
+
```bash
|
36
|
+
bumbler -t 10
|
37
|
+
```
|
38
|
+
|
39
|
+
### Rails: Track load-time of initializers
|
40
|
+
|
41
|
+
See how slow your app's initializers are (`./config/initializers/*`), as well as
|
42
|
+
the initializers for any engines you rely on.
|
43
|
+
|
44
|
+
```bash
|
45
|
+
bumbler --initializers
|
46
|
+
```
|
47
|
+
|
48
|
+
### Show all loaded gems
|
49
|
+
|
50
|
+
Rails:
|
51
|
+
|
52
|
+
```bash
|
53
|
+
bumbler --all
|
54
|
+
```
|
55
|
+
|
56
|
+
Ruby:
|
57
|
+
|
58
|
+
```bash
|
59
|
+
-e Bumbler::Stats.print_tracked_items
|
60
|
+
```
|
61
|
+
|
62
|
+
|
63
|
+
Development
|
64
|
+
-----------
|
65
|
+
|
66
|
+
### Rails
|
67
|
+
|
68
|
+
We don't have any integration tests with rails, so when touching rails code make sure to test it in a real app.
|
69
|
+
|
70
|
+
```Ruby
|
71
|
+
cd my-rails-app && ~/Code/tools/bumbler/bin/bumbler
|
72
|
+
```
|
73
|
+
|
74
|
+
### Release new version
|
75
|
+
|
76
|
+
`rake bump:[major|minor|patch] && rake release`
|
77
|
+
|
78
|
+
|
79
|
+
License
|
80
|
+
-------
|
81
|
+
|
82
|
+
Bumbler is MIT licensed. [See the accompanying file](MIT-LICENSE.md) for the full
|
83
|
+
text.
|
data/bin/bumbler
CHANGED
@@ -1,30 +1,35 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
|
-
|
3
|
-
path = File.join(File.dirname(__FILE__), '..', 'lib')
|
4
|
-
$LOAD_PATH << path unless $LOAD_PATH.include? path
|
5
|
-
end
|
2
|
+
# frozen_string_literal: true
|
6
3
|
|
7
|
-
|
4
|
+
# in case we execute via ./bin
|
5
|
+
add_load_path = -> do
|
6
|
+
local_lib = File.expand_path('../lib', __dir__)
|
7
|
+
$LOAD_PATH << local_lib unless $LOAD_PATH.include? local_lib
|
8
|
+
end
|
9
|
+
add_load_path.call
|
8
10
|
|
9
11
|
require 'optparse'
|
10
12
|
require 'bumbler'
|
11
13
|
|
12
14
|
options = {}
|
13
15
|
OptionParser.new do |parser|
|
14
|
-
parser.banner =
|
15
|
-
Bumbler shows how long loading your bundle components take.
|
16
|
+
parser.banner = <<~BANNER
|
17
|
+
Bumbler shows how long loading your bundle components take.
|
16
18
|
|
17
|
-
Usage:
|
18
|
-
|
19
|
+
Usage:
|
20
|
+
bumbler
|
19
21
|
|
20
|
-
Options:
|
21
|
-
BANNER
|
22
|
-
parser.on("-t", "--threshold
|
22
|
+
Options:
|
23
|
+
BANNER
|
24
|
+
parser.on("-t", "--threshold MILLISECONDS", Integer, "Threshold in ms to be listed as slow") { |t| options[:threshold] = t }
|
23
25
|
parser.on("--initializers", "Show load time of initializers") { options[:initializers] = true }
|
26
|
+
parser.on("--all", "Show all load times") { options[:all] = true }
|
24
27
|
parser.on("-h", "--help", "Show this.") { puts parser; exit }
|
25
|
-
parser.on('-v', '--version', 'Show Version'){ puts Bumbler::VERSION; exit}
|
28
|
+
parser.on('-v', '--version', 'Show Version') { puts Bumbler::VERSION; exit }
|
26
29
|
end.parse!
|
27
30
|
|
31
|
+
abort "Not arguments supported" unless ARGV.empty?
|
32
|
+
|
28
33
|
Bumbler::Hooks.slow_threshold = options[:threshold] if options[:threshold]
|
29
34
|
|
30
35
|
if options[:initializers]
|
@@ -32,10 +37,18 @@ if options[:initializers]
|
|
32
37
|
add_load_path.call # bundler kicks us out
|
33
38
|
require 'bumbler/track_initializers'
|
34
39
|
require './config/environment'
|
35
|
-
|
40
|
+
elsif File.exist?('./config/environment')
|
36
41
|
require 'bumbler/go'
|
37
42
|
require './config/environment'
|
38
43
|
add_load_path.call # bundler kicks us out
|
44
|
+
else
|
45
|
+
require 'bumbler/go'
|
46
|
+
Bundler.require(*Bundler.definition.groups)
|
39
47
|
end
|
40
48
|
|
41
|
-
Bumbler::Stats.
|
49
|
+
Bumbler::Stats.print_overview
|
50
|
+
if options[:all]
|
51
|
+
Bumbler::Stats.print_tracked_items
|
52
|
+
else
|
53
|
+
Bumbler::Stats.print_slow_items
|
54
|
+
end
|
data/lib/bumbler.rb
CHANGED
data/lib/bumbler/bundler.rb
CHANGED
@@ -1,54 +1,45 @@
|
|
1
|
+
# frozen_string_literal: true
|
1
2
|
module Bumbler
|
2
3
|
module Bundler
|
3
4
|
class << self
|
4
5
|
# Returns which gem a require maps to, or nil.
|
5
6
|
def gem_for_require(path)
|
6
|
-
|
7
|
-
|
8
|
-
return @require_map[path]
|
7
|
+
@require_map[path]
|
9
8
|
end
|
10
|
-
|
11
|
-
def require_started(
|
12
|
-
|
13
|
-
return unless gem_name
|
14
|
-
|
15
|
-
Bumbler::Progress.item_started(:bundler, gem_name)
|
9
|
+
|
10
|
+
def require_started(gem_name)
|
11
|
+
Bumbler::Progress.item_started(gem_name)
|
16
12
|
end
|
17
|
-
|
18
|
-
def require_finished(path,
|
19
|
-
self.read_bundler_environment if @gem_state.nil?
|
20
|
-
|
21
|
-
# Tick it off for the gem.
|
22
|
-
gem_name = self.gem_for_require(path)
|
23
|
-
return unless gem_name
|
24
|
-
|
13
|
+
|
14
|
+
def require_finished(gem_name, path, time)
|
25
15
|
@gem_state[gem_name][path] = true
|
26
|
-
|
27
16
|
if @gem_state[gem_name].values.all?
|
28
|
-
Bumbler::Progress.item_finished(
|
17
|
+
Bumbler::Progress.item_finished(gem_name, time)
|
29
18
|
end
|
30
19
|
end
|
31
|
-
|
32
|
-
def start!
|
33
|
-
self.read_bundler_environment
|
34
|
-
end
|
35
|
-
|
20
|
+
|
36
21
|
def read_bundler_environment
|
37
22
|
@require_map = {}
|
38
23
|
@gem_state = {}
|
39
|
-
|
24
|
+
|
40
25
|
::Bundler.environment.current_dependencies.each do |spec|
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
26
|
+
gem_name = spec.name
|
27
|
+
@gem_state[gem_name] = {}
|
28
|
+
|
29
|
+
# TODO: this is horrible guess-work ... we need to get the gems load-path instead
|
30
|
+
paths =
|
31
|
+
if !spec.autorequire || spec.autorequire == [true]
|
32
|
+
[gem_name]
|
33
|
+
else
|
34
|
+
spec.autorequire
|
35
|
+
end
|
36
|
+
|
37
|
+
paths.each do |path|
|
38
|
+
@require_map[path] = gem_name
|
39
|
+
@gem_state[gem_name][path] = false
|
49
40
|
end
|
50
|
-
|
51
|
-
Bumbler::Progress.register_item(
|
41
|
+
|
42
|
+
Bumbler::Progress.register_item(gem_name)
|
52
43
|
end
|
53
44
|
end
|
54
45
|
end
|
data/lib/bumbler/go.rb
CHANGED
@@ -1,20 +1,14 @@
|
|
1
|
+
# frozen_string_literal: true
|
1
2
|
require 'bumbler'
|
3
|
+
require 'bundler'
|
2
4
|
|
3
|
-
#
|
4
|
-
|
5
|
-
require 'bundler'
|
6
|
-
# This raises if there isn't a gemfile in our root
|
7
|
-
Bundler.default_gemfile
|
8
|
-
# Workaround for Ruby 2.3, see: github.com/nevir/Bumbler/issues/12
|
9
|
-
Bumbler::Bundler
|
5
|
+
# This raises if there isn't a gemfile in our root
|
6
|
+
Bundler.default_gemfile
|
10
7
|
|
11
|
-
|
12
|
-
|
13
|
-
Bumbler::Hooks.watch_require!
|
8
|
+
# Workaround for Ruby 2.3, see: github.com/nevir/Bumbler/issues/12
|
9
|
+
Bumbler::Bundler.name
|
14
10
|
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
# Welp, if we fail, we fail.
|
20
|
-
end
|
11
|
+
# Kick it off
|
12
|
+
Bumbler::Bundler.read_bundler_environment
|
13
|
+
Bumbler::Hooks.hook_require!
|
14
|
+
Bumbler::Hooks.watch_require!
|
data/lib/bumbler/hooks.rb
CHANGED
@@ -1,18 +1,15 @@
|
|
1
|
+
# frozen_string_literal: true
|
1
2
|
module Bumbler
|
2
3
|
module Hooks
|
3
4
|
@slow_threshold = 100.0
|
4
|
-
@
|
5
|
+
@started_items = {}
|
5
6
|
@slow_requires = {}
|
6
7
|
|
7
8
|
# Everything's a class method (we're a singleton)
|
8
9
|
class << self
|
9
|
-
|
10
|
-
@slow_threshold = time
|
11
|
-
end
|
10
|
+
attr_writer :slow_threshold
|
12
11
|
|
13
|
-
|
14
|
-
@slow_requires
|
15
|
-
end
|
12
|
+
attr_reader :slow_requires
|
16
13
|
|
17
14
|
# Inject our custom handling of require into the Kernel.
|
18
15
|
def hook_require!
|
@@ -29,7 +26,7 @@ module Bumbler
|
|
29
26
|
end
|
30
27
|
end
|
31
28
|
|
32
|
-
orig_instance_require =
|
29
|
+
orig_instance_require = instance_method(:require)
|
33
30
|
define_method(:require) do |path, *args|
|
34
31
|
::Bumbler::Hooks.handle_require(path) do
|
35
32
|
orig_instance_require.bind(self).call(path, *args)
|
@@ -44,7 +41,7 @@ module Bumbler
|
|
44
41
|
def watch_require!
|
45
42
|
::Kernel.module_eval do
|
46
43
|
# It isn't previously defined in Kernel. This could be a bit dangerous, though.
|
47
|
-
def self.method_added(method_name, *
|
44
|
+
def self.method_added(method_name, *_args)
|
48
45
|
if method_name == :require && !::Bumbler::Hooks.hooking_require?
|
49
46
|
# Fix those hooks.
|
50
47
|
::Bumbler::Hooks.hook_require!
|
@@ -59,31 +56,31 @@ module Bumbler
|
|
59
56
|
|
60
57
|
# Actually do something about a require here.
|
61
58
|
def handle_require(path, &block)
|
62
|
-
# break out early if we're already handling
|
59
|
+
# break out early if we're already handling the path
|
63
60
|
return yield if path == @previous_require
|
64
61
|
@previous_require = path
|
65
62
|
|
66
|
-
#
|
67
|
-
gem_name = Bumbler::Bundler.gem_for_require(path)
|
68
|
-
return yield unless gem_name
|
63
|
+
# ignore untracked gem
|
64
|
+
return yield unless (gem_name = Bumbler::Bundler.gem_for_require(path))
|
69
65
|
|
70
|
-
#
|
71
|
-
Bumbler::Bundler.require_started(
|
72
|
-
@
|
66
|
+
# track load starts
|
67
|
+
Bumbler::Bundler.require_started(gem_name) unless @started_items[gem_name]
|
68
|
+
@started_items[gem_name] = true
|
73
69
|
|
74
70
|
time, result = benchmark(path, &block)
|
75
71
|
|
76
|
-
|
72
|
+
# TODO: for items with multiple paths we need to add the times
|
73
|
+
Bumbler::Bundler.require_finished(gem_name, path, time) if result
|
77
74
|
|
78
75
|
result
|
79
76
|
end
|
80
77
|
|
81
78
|
def benchmark(key)
|
82
|
-
start =
|
79
|
+
start = Process.clock_gettime(Process::CLOCK_MONOTONIC)
|
83
80
|
result = yield
|
84
|
-
time = (
|
81
|
+
time = (Process.clock_gettime(Process::CLOCK_MONOTONIC) - start) * 1000 # ms
|
85
82
|
@slow_requires[key] = time if time > @slow_threshold
|
86
|
-
|
83
|
+
[time, result]
|
87
84
|
end
|
88
85
|
end
|
89
86
|
end
|
data/lib/bumbler/progress.rb
CHANGED
@@ -1,44 +1,38 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
# TODO: replace with ruby-progressbar dependency
|
1
3
|
module Bumbler
|
2
4
|
module Progress
|
3
5
|
@item_count = 0
|
4
6
|
@loaded_items = 0
|
5
7
|
|
6
|
-
# registry[
|
7
|
-
@registry =
|
8
|
+
# registry[item_name] = 123.45
|
9
|
+
@registry = {}
|
8
10
|
|
9
11
|
class << self
|
10
|
-
|
11
|
-
@registry
|
12
|
-
end
|
12
|
+
attr_reader :registry
|
13
13
|
|
14
|
-
def register_item(
|
14
|
+
def register_item(name)
|
15
15
|
# Build a blank key for the item
|
16
|
-
unless @registry[
|
17
|
-
@item_count += 1
|
18
|
-
end
|
16
|
+
@item_count += 1 unless @registry[name]
|
19
17
|
|
20
|
-
@registry[
|
18
|
+
@registry[name] = nil
|
21
19
|
end
|
22
20
|
|
23
|
-
def item_started(
|
24
|
-
@curr_item = {:
|
21
|
+
def item_started(name)
|
22
|
+
@curr_item = { name: name }
|
25
23
|
|
26
|
-
|
24
|
+
render_progress
|
27
25
|
end
|
28
26
|
|
29
|
-
def item_finished(
|
30
|
-
@registry[
|
27
|
+
def item_finished(name, time)
|
28
|
+
@registry[name] = time
|
31
29
|
|
32
|
-
@loaded_items
|
30
|
+
@loaded_items += 1
|
33
31
|
|
34
|
-
@prev_item = {
|
35
|
-
@curr_item = nil if @curr_item && @curr_item[:name] ==
|
36
|
-
|
37
|
-
self.render_progress
|
38
|
-
end
|
32
|
+
@prev_item = { name: name, time: time }
|
33
|
+
@curr_item = nil if @curr_item && @curr_item[:name] == name
|
39
34
|
|
40
|
-
|
41
|
-
# No-op for now.
|
35
|
+
render_progress
|
42
36
|
end
|
43
37
|
|
44
38
|
def tty_width
|
@@ -48,11 +42,11 @@ module Bumbler
|
|
48
42
|
def bar(width)
|
49
43
|
inner_size = width - 2
|
50
44
|
|
51
|
-
fill_size = [((@loaded_items
|
52
|
-
fill
|
45
|
+
fill_size = [((@loaded_items / @item_count.to_f) * inner_size).to_i, inner_size].min
|
46
|
+
fill = '#' * fill_size
|
53
47
|
empty = ' ' * (inner_size - fill_size)
|
54
48
|
|
55
|
-
|
49
|
+
"[#{fill}#{empty}]"
|
56
50
|
end
|
57
51
|
|
58
52
|
def render_progress
|
@@ -64,12 +58,12 @@ module Bumbler
|
|
64
58
|
# (##/##) <current>... <prev> (####.##ms)
|
65
59
|
#
|
66
60
|
# Skip the current if there isn't enough room
|
67
|
-
count = '(%s/%d) '
|
61
|
+
count = format('(%s/%d) ', @loaded_items.to_s.rjust(@item_count.to_s.size), @item_count)
|
68
62
|
current = @curr_item ? "#{@curr_item[:name]}... " : ''
|
69
|
-
prev = @prev_item ? '%s (%sms)'
|
63
|
+
prev = @prev_item ? format('%s (%sms)', @prev_item[:name], ('%.2f' % @prev_item[:time]).rjust(7)) : ''
|
70
64
|
|
71
65
|
if $stdout.tty?
|
72
|
-
width =
|
66
|
+
width = tty_width
|
73
67
|
|
74
68
|
print "\r\e[A\r\e[A" if @outputted_once
|
75
69
|
@outputted_once = true
|
@@ -78,7 +72,7 @@ module Bumbler
|
|
78
72
|
space_for_current = width - (count.length + prev.length)
|
79
73
|
|
80
74
|
# Render the progress
|
81
|
-
puts
|
75
|
+
puts bar(width)
|
82
76
|
|
83
77
|
if space_for_current >= current.length
|
84
78
|
puts count + current + prev.rjust(width - count.length - current.length)
|
@@ -86,7 +80,7 @@ module Bumbler
|
|
86
80
|
puts count + prev.rjust(width - count.length)
|
87
81
|
end
|
88
82
|
elsif @curr_item
|
89
|
-
puts '%s %s'
|
83
|
+
puts format('%s %s', count, @curr_item[:name])
|
90
84
|
end
|
91
85
|
end
|
92
86
|
end
|
data/lib/bumbler/stats.rb
CHANGED
@@ -1,28 +1,30 @@
|
|
1
|
+
# frozen_string_literal: true
|
1
2
|
module Bumbler
|
2
3
|
module Stats
|
3
4
|
class << self
|
4
|
-
def
|
5
|
-
Bumbler::Progress.registry
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
5
|
+
def print_overview
|
6
|
+
registry = Bumbler::Progress.registry
|
7
|
+
puts "#{registry.count { |_n, time| time }} of #{registry.size} gems required"
|
8
|
+
end
|
9
|
+
|
10
|
+
def print_tracked_items
|
11
|
+
Bumbler::Progress.registry.sort_by { |_n, time| time.to_f }.each do |name, time|
|
12
|
+
if time
|
13
|
+
puts format(' %s %s', ('%.2f' % time).rjust(8), name)
|
14
|
+
else
|
15
|
+
puts " pending: #{name}"
|
14
16
|
end
|
15
17
|
end
|
16
|
-
|
18
|
+
|
17
19
|
self
|
18
20
|
end
|
19
|
-
|
20
|
-
def
|
21
|
+
|
22
|
+
def print_slow_items
|
21
23
|
puts "Slow requires:"
|
22
|
-
Bumbler::Hooks.slow_requires.to_a.sort_by! {|
|
23
|
-
puts ' %s %s'
|
24
|
+
Bumbler::Hooks.slow_requires.to_a.sort_by! { |_n, t| t }.each do |name, time|
|
25
|
+
puts format(' %s %s', ('%.2f' % time).rjust(8), name)
|
24
26
|
end
|
25
|
-
|
27
|
+
|
26
28
|
self
|
27
29
|
end
|
28
30
|
end
|
data/lib/bumbler/version.rb
CHANGED
metadata
CHANGED
@@ -1,17 +1,17 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: bumbler
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.6.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Ian MacLeod
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2019-
|
11
|
+
date: 2019-10-26 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
|
-
name:
|
14
|
+
name: bump
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
17
|
- - ">="
|
@@ -25,7 +25,7 @@ dependencies:
|
|
25
25
|
- !ruby/object:Gem::Version
|
26
26
|
version: '0'
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
|
-
name:
|
28
|
+
name: maxitest
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
31
|
- - ">="
|
@@ -39,7 +39,21 @@ dependencies:
|
|
39
39
|
- !ruby/object:Gem::Version
|
40
40
|
version: '0'
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
|
-
name:
|
42
|
+
name: rake
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - ">="
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '0'
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - ">="
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: rubocop
|
43
57
|
requirement: !ruby/object:Gem::Requirement
|
44
58
|
requirements:
|
45
59
|
- - ">="
|
@@ -52,8 +66,7 @@ dependencies:
|
|
52
66
|
- - ">="
|
53
67
|
- !ruby/object:Gem::Version
|
54
68
|
version: '0'
|
55
|
-
description:
|
56
|
-
with awesome progress bars?
|
69
|
+
description: Find slowly loading gems for your Bundler-based projects
|
57
70
|
email:
|
58
71
|
- ian@nevir.net
|
59
72
|
executables:
|
@@ -61,6 +74,8 @@ executables:
|
|
61
74
|
extensions: []
|
62
75
|
extra_rdoc_files: []
|
63
76
|
files:
|
77
|
+
- MIT-LICENSE.md
|
78
|
+
- README.md
|
64
79
|
- bin/bumbler
|
65
80
|
- lib/bumbler.rb
|
66
81
|
- lib/bumbler/bundler.rb
|
@@ -82,7 +97,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
82
97
|
requirements:
|
83
98
|
- - ">="
|
84
99
|
- !ruby/object:Gem::Version
|
85
|
-
version: 2.
|
100
|
+
version: 2.3.0
|
86
101
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
87
102
|
requirements:
|
88
103
|
- - ">="
|
@@ -92,5 +107,5 @@ requirements: []
|
|
92
107
|
rubygems_version: 3.0.3
|
93
108
|
signing_key:
|
94
109
|
specification_version: 4
|
95
|
-
summary:
|
110
|
+
summary: Find slowly loading gems for your Bundler-based projects
|
96
111
|
test_files: []
|