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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: c3a7deedba252b3c5836103a614d7e04626aa153be9b35333c3953a25f3fa00d
4
- data.tar.gz: 760e452d990cf7e5dd1acde8721965617a7bce7920c0f754dafe35611fe424c4
3
+ metadata.gz: 5a60e2a6c84fbfe256e680819c7e7782fbe1b02c8719967d98debdf89dcb85ca
4
+ data.tar.gz: 2c94bb726e5f97523fff0c80674f60119e5b247d62d3d5e047594aa2bacd7835
5
5
  SHA512:
6
- metadata.gz: 3e26fb2fa428af240918200c18e0eff3aeb21d7a4dc41353293def318201d970113009c068278159158b896fbef19e9fe7f314ef4e4dce230c3d31857168bce1
7
- data.tar.gz: 58a116e619d03388c2610f412a54d2da481b62c0061c2ff783ef4b216fd7979e20a14eca494db36e18e7a25e6e853bac273d43e09dd956ed481eaeaf25b55546
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
- add_load_path = lambda do
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
- add_load_path.call # in case we execute via ./bin
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 = <<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
- bumbler
19
+ Usage:
20
+ bumbler
19
21
 
20
- Options:
21
- BANNER
22
- parser.on("-t", "--threshold MILISECONDS", Integer, "Threshold in ms to be listed as slow") { |t| options[:threshold] = t }
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
- else
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.all_slow_items
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
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  module Bumbler
2
3
  autoload :Bundler, 'bumbler/bundler'
3
4
  autoload :Hooks, 'bumbler/hooks'
@@ -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
- self.read_bundler_environment if @require_map.nil?
7
-
8
- return @require_map[path]
7
+ @require_map[path]
9
8
  end
10
-
11
- def require_started(path)
12
- gem_name = self.gem_for_require(path)
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, load_time)
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(:bundler, gem_name, load_time)
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
- @gem_state[spec.name] = {}
42
-
43
- Array(spec.autorequire || spec.name).each do |path|
44
- # Handle explicitly required gems
45
- path = spec.name if path == true
46
-
47
- @require_map[path] = spec.name
48
- @gem_state[spec.name][path] = false
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(:bundler, spec.name)
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
- # Do nothing unless we're in a bundle
4
- begin
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
- # Kick it off
12
- Bumbler::Hooks.hook_require!
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
- Bumbler::Bundler.start!
16
- Bumbler::Progress.start!
17
-
18
- rescue
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
- @previous_gems = {}
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
- def slow_threshold=(time)
10
- @slow_threshold = time
11
- end
10
+ attr_writer :slow_threshold
12
11
 
13
- def slow_requires
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 = self.instance_method(: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, *args)
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 this
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
- # Shortcut unless we're tracking the gem
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
- # Track load starts
71
- Bumbler::Bundler.require_started(path) unless @previous_gems[gem_name]
72
- @previous_gems[gem_name] = true
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
- Bumbler::Bundler.require_finished(path, time) if result
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 = Time.now.to_f
79
+ start = Process.clock_gettime(Process::CLOCK_MONOTONIC)
83
80
  result = yield
84
- time = (Time.now.to_f - start) * 1000 # ms
81
+ time = (Process.clock_gettime(Process::CLOCK_MONOTONIC) - start) * 1000 # ms
85
82
  @slow_requires[key] = time if time > @slow_threshold
86
- return time, result
83
+ [time, result]
87
84
  end
88
85
  end
89
86
  end
@@ -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[item_type][item_name] = {:time => 123.45}
7
- @registry = Hash.new { |h,k| h[k] = {} }
8
+ # registry[item_name] = 123.45
9
+ @registry = {}
8
10
 
9
11
  class << self
10
- def registry
11
- @registry
12
- end
12
+ attr_reader :registry
13
13
 
14
- def register_item(type, name)
14
+ def register_item(name)
15
15
  # Build a blank key for the item
16
- unless @registry[type][name]
17
- @item_count += 1
18
- end
16
+ @item_count += 1 unless @registry[name]
19
17
 
20
- @registry[type][name] = {}
18
+ @registry[name] = nil
21
19
  end
22
20
 
23
- def item_started(type, name)
24
- @curr_item = {:type => type, :name => name}
21
+ def item_started(name)
22
+ @curr_item = { name: name }
25
23
 
26
- self.render_progress
24
+ render_progress
27
25
  end
28
26
 
29
- def item_finished(type, name, time)
30
- @registry[type][name] = {:time => time}
27
+ def item_finished(name, time)
28
+ @registry[name] = time
31
29
 
32
- @loaded_items += 1
30
+ @loaded_items += 1
33
31
 
34
- @prev_item = {:type => type, :name => name, :time => time}
35
- @curr_item = nil if @curr_item && @curr_item[:name] == @prev_item[:name] && @curr_item[:type] == @prev_item[:type]
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
- def start!
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.to_f / @item_count.to_f) * inner_size).to_i, inner_size].min
52
- fill = '#' * fill_size
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
- return "[#{fill}#{empty}]"
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) ' % [@loaded_items.to_s.rjust(@item_count.to_s.size), @item_count]
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)' % [@prev_item[:name], ('%.2f' % @prev_item[:time]).rjust(7)] : ''
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 = self.tty_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 self.bar(width)
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' % [count, @curr_item[:name]]
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 tracked_items
5
- Bumbler::Progress.registry.each do |type, items|
6
- puts "Stats for #{type} items:"
7
-
8
- items.to_a.sort_by! {|n,d| d[:time].to_f}.each do |name, info|
9
- if info[:time]
10
- puts ' %s %s' % [('%.2f' % info[:time]).rjust(8), name]
11
- else
12
- puts " pending: #{name}"
13
- end
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 all_slow_items
21
+
22
+ def print_slow_items
21
23
  puts "Slow requires:"
22
- Bumbler::Hooks.slow_requires.to_a.sort_by! {|n,t| t}.each do |name, time|
23
- puts ' %s %s' % [('%.2f' % time).rjust(8), name]
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
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  Rails::Engine.prepend(Module.new do
2
3
  def load(file, *)
3
4
  initializer = file.sub(Rails.root.to_s, ".")
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  module Bumbler
2
- VERSION = '0.5.0'
3
+ VERSION = '0.6.0'
3
4
  end
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.5.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-08-16 00:00:00.000000000 Z
11
+ date: 2019-10-26 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
- name: rake
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: bump
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: maxitest
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: Why stare blankly at your terminal window when you can clutter it up
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.1.0
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: Track the load progress of your Bundler-based projects
110
+ summary: Find slowly loading gems for your Bundler-based projects
96
111
  test_files: []