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 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: []