bumbler 0.5.0 → 0.6.0
Sign up to get free protection for your applications and to get access to all the features.
- 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: []
|