boot_polish 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
data/.gitignore ADDED
@@ -0,0 +1,18 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ coverage
6
+ InstalledFiles
7
+ .yardoc
8
+ InstalledFiles
9
+ _yardoc
10
+ coverage
11
+ doc/
12
+ lib/bundler/man
13
+ pkg
14
+ rdoc
15
+ spec/reports
16
+ test/tmp
17
+ test/version_tmp
18
+ tmp
data/.pairs ADDED
@@ -0,0 +1,21 @@
1
+ pairs:
2
+ bw: Brent Wheeldon; brent
3
+ co: Cathy O'Connell; cathy
4
+ nm: Nick Monje; nmonje
5
+ eg: Evan Goodberry; egoodberry
6
+ bm: Ben Moss; bmoss
7
+ ck: Chien Kuo; ckuo
8
+ ec: Edwin Chong; echong
9
+ ab: Adam Berlin; aberlin
10
+ ra: Rasheed Abdul-Aziz; rabdulaziz
11
+ rm: Ryan McGarvey; ryan
12
+ jm: Johnny Mukai; johnny
13
+ js: James Somers; james
14
+ mt: Mark Thorn; mark
15
+ me: Maia Engeli; maia
16
+ mf: Michael Frederick; mike
17
+ gd: Geoffrey Ducharme; geoffrey
18
+ ak: Alex Kramer; alex
19
+ email:
20
+ prefix: pair
21
+ domain: pivotallabs.com
data/.travis.yml ADDED
@@ -0,0 +1,4 @@
1
+ language: ruby
2
+ rvm:
3
+ - 1.9.3
4
+
data/Gemfile ADDED
@@ -0,0 +1,8 @@
1
+ source 'https://rubygems.org'
2
+
3
+ group :test do
4
+ gem 'rake'
5
+ end
6
+
7
+ # Specify your gem's dependencies in boot_polish.gemspec
8
+ gemspec
data/Gemfile.lock ADDED
@@ -0,0 +1,40 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ boot_polish (0.0.1)
5
+ rubytree
6
+
7
+ GEM
8
+ remote: https://rubygems.org/
9
+ specs:
10
+ coderay (1.0.8)
11
+ diff-lcs (1.1.3)
12
+ json (1.7.6)
13
+ method_source (0.8.1)
14
+ pry (0.9.10)
15
+ coderay (~> 1.0.5)
16
+ method_source (~> 0.8)
17
+ slop (~> 3.3.1)
18
+ rake (10.0.3)
19
+ rspec (2.12.0)
20
+ rspec-core (~> 2.12.0)
21
+ rspec-expectations (~> 2.12.0)
22
+ rspec-mocks (~> 2.12.0)
23
+ rspec-core (2.12.2)
24
+ rspec-expectations (2.12.1)
25
+ diff-lcs (~> 1.1.3)
26
+ rspec-mocks (2.12.1)
27
+ rubytree (0.8.3)
28
+ json (>= 1.7.5)
29
+ structured_warnings (>= 0.1.3)
30
+ slop (3.3.3)
31
+ structured_warnings (0.1.3)
32
+
33
+ PLATFORMS
34
+ ruby
35
+
36
+ DEPENDENCIES
37
+ boot_polish!
38
+ pry
39
+ rake
40
+ rspec
data/LICENSE.txt ADDED
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2013 Rasheed Abdul-Aziz
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,60 @@
1
+ # BootPolish
2
+
3
+ [![Build Status](https://travis-ci.org/zephyr-dev/boot_polish.png)](https://travis-ci.org/zephyr-dev/boot_polish)
4
+
5
+ Boot time introspection to help you get under the heroku 60 second timeout.
6
+
7
+ ## Installation
8
+
9
+ Add this line to your application's Gemfile:
10
+
11
+ gem 'boot_polish'
12
+
13
+ And then execute:
14
+
15
+ $ bundle
16
+
17
+ Or install it yourself as:
18
+
19
+ $ gem install boot_polish
20
+
21
+ ## Usage
22
+
23
+ Add the following line to your 'config/boot.rb' right after the require 'rubygems'
24
+
25
+ require 'boot_polish'
26
+
27
+ I personally wrap it in a guard:
28
+
29
+ if ENV["BENCHMARK_REQUIRES"] && ENV["BENCHMARK_REQUIRES"] == 'true'
30
+ require 'boot_polish'
31
+ end
32
+
33
+ During startup, you'll see all the requires and their associated times.
34
+ The default renderer is leaf-first, where the very deepest require is shown first,
35
+ with each subsequent outdentation showing the aggregate time for the require and
36
+ its children.
37
+
38
+ For example:
39
+
40
+ 0.0020 for require c/4
41
+ 0.0187 for require c/3
42
+ 0.0009 for require c/2
43
+ 0.0002 for require c/1/z
44
+ 0.0015 for require c/1
45
+ 0.0250 for require c
46
+ 0.0002 for require b
47
+ 0.0002 for require a
48
+
49
+ 'a' and 'b' had no children requires
50
+ 'c' required c/1 (which required c/1/z), c/2, c/3 and c/4
51
+
52
+ 'c' had a time of 0.0250 which was a cumulative of it's time and all it's child requires.
53
+
54
+ ## Todo
55
+
56
+ * Make it possible to specify the renderer used by the require_benchmark
57
+ * Introduce some basic network logging (on socket)
58
+ * Introduce basic HTTP logging
59
+ * Introduce a plugin architecture for testing specific hogs (fog, postgress, etc)
60
+
data/Rakefile ADDED
@@ -0,0 +1,6 @@
1
+ require "bundler/gem_tasks"
2
+ require 'rspec/core/rake_task'
3
+
4
+ RSpec::Core::RakeTask.new(:spec)
5
+
6
+ task :default => :spec
@@ -0,0 +1,24 @@
1
+ # -*- encoding: utf-8 -*-
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'boot_polish/version'
5
+
6
+ Gem::Specification.new do |gem|
7
+ gem.name = "boot_polish"
8
+ gem.version = BootPolish::VERSION
9
+ gem.authors = ["Rasheed Abdul-Aziz"]
10
+ gem.email = ["rasheed@pivotallabs.com"]
11
+ gem.description = %q{Boot time introspection to help you get under the heroku 60 second timeout.}
12
+ gem.summary = %q{Boot time introspection to help you get under the heroku 60 second timeout.}
13
+ gem.homepage = "https://github.com/zephyr-dev/boot_polish"
14
+
15
+ gem.files = `git ls-files`.split($/)
16
+ gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
17
+ gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
18
+ gem.require_paths = ["lib"]
19
+
20
+ gem.add_dependency "rubytree"
21
+
22
+ gem.add_development_dependency "rspec"
23
+ gem.add_development_dependency "pry"
24
+ end
@@ -0,0 +1,10 @@
1
+ require 'boot_polish/base'
2
+ require 'boot_polish/nested_benchmark'
3
+ require 'boot_polish/default_renderer'
4
+
5
+ def require(file)
6
+ BootPolish::Base.require_benchmark.nest "require #{file}" do
7
+ super(file)
8
+ end
9
+ end
10
+
@@ -0,0 +1,9 @@
1
+ require 'boot_polish/nested_benchmark'
2
+
3
+ module BootPolish
4
+ class Base
5
+ def self.require_benchmark
6
+ @require_benchmark ||= NestedBenchmark.new
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,33 @@
1
+ module BootPolish
2
+ class DefaultRenderer
3
+
4
+ def initialize(output = nil)
5
+ @output = output || STDOUT
6
+ @indent = -1
7
+ end
8
+
9
+ def descend
10
+ @indent += 1
11
+ end
12
+
13
+ def exception(method, exception)
14
+ @output << "#{indent}#{method} raised #{exception.message}\n"
15
+ end
16
+
17
+ def benchmark method, time
18
+ @output << format("#{indent}%.4f for #{method}\n", time.real)
19
+ end
20
+
21
+ def ascend
22
+ @indent -= 1
23
+ end
24
+
25
+ private
26
+
27
+ def indent
28
+ " " * @indent
29
+ end
30
+
31
+ end
32
+
33
+ end
@@ -0,0 +1,48 @@
1
+ require 'benchmark'
2
+
3
+ module BootPolish
4
+ class NestedBenchmark
5
+
6
+ attr_accessor :visitor
7
+
8
+ def initialize(visitor = nil)
9
+ @visitor = visitor || DefaultRenderer.new
10
+ end
11
+
12
+ def nest method, &block
13
+ result = nil
14
+
15
+ before_call
16
+
17
+ time_to_run = Benchmark.measure do
18
+ begin
19
+ result = yield
20
+ rescue Exception => e
21
+ after_call(method, nil, e)
22
+ raise e
23
+ end
24
+ end
25
+
26
+ after_call(method, time_to_run)
27
+
28
+ result
29
+ end
30
+
31
+ private
32
+
33
+ def before_call
34
+ @visitor.descend
35
+ end
36
+
37
+ def after_call(method, time_to_run, exception = nil)
38
+ if exception
39
+ @visitor.exception(method, exception)
40
+ else
41
+ @visitor.benchmark(method, time_to_run)
42
+ end
43
+
44
+ @visitor.ascend
45
+ end
46
+
47
+ end
48
+ end
@@ -0,0 +1,49 @@
1
+ require 'tree'
2
+ module BootPolish
3
+ class TreeRenderer
4
+
5
+ def initialize(output = nil)
6
+ @output = output || STDOUT
7
+ @tree = Tree::TreeNode.new("ROOT", "Root Content")
8
+ @current_node = @tree
9
+ end
10
+
11
+ def descend
12
+ new_node = Tree::TreeNode.new("node-#{@current_node.level}-#{@current_node.children.count}")
13
+ @current_node << new_node
14
+ @current_node = new_node
15
+ end
16
+
17
+ def exception(method, exception)
18
+ @current_node.content = { method: method, exception: exception }
19
+ end
20
+
21
+ def benchmark method, time
22
+ @current_node.content = { method: method, time: time }
23
+ end
24
+
25
+ def ascend
26
+ render(@current_node) if @current_node.parent.name == "ROOT"
27
+ @current_node = @current_node.parent
28
+ end
29
+ private
30
+
31
+ def render(current_node)
32
+ result = current_node.content
33
+ @output << " " * (current_node.level - 1)
34
+ if result[:exception]
35
+ @output << "#{result[:method]} raised exception: #{result[:exception].message}"
36
+ else
37
+ @output << format("%.4f for #{result[:method]}", result[:time].real)
38
+ end
39
+ @output << "\n"
40
+
41
+ current_node.children.each do |child|
42
+ render child
43
+ end
44
+ @output.flush
45
+ end
46
+
47
+ end
48
+
49
+ end
@@ -0,0 +1,3 @@
1
+ module BootPolish
2
+ VERSION = "0.0.1"
3
+ end
@@ -0,0 +1,12 @@
1
+ require 'spec_helper'
2
+ require 'boot_polish/base'
3
+
4
+ module BootPolish
5
+ describe Base do
6
+ describe ".require_benchmark" do
7
+ it "is memoized" do
8
+ BootPolish::Base.require_benchmark.should === BootPolish::Base.require_benchmark
9
+ end
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,54 @@
1
+ require "spec_helper"
2
+ require "boot_polish/default_renderer"
3
+
4
+ module BootPolish
5
+ describe DefaultRenderer do
6
+ describe "instance" do
7
+
8
+ let(:output) { double(:output) }
9
+ let(:time) { double(:time, real: 9.99) }
10
+ let(:renderer) { DefaultRenderer.new(output) }
11
+
12
+ describe "#benchmark" do
13
+ it "outputs the method and real time" do
14
+ output.should_receive(:<<).with(/(footle)+/)
15
+
16
+ renderer.descend
17
+ renderer.benchmark("footle", time)
18
+ renderer.ascend
19
+ end
20
+ end
21
+
22
+ describe "#exception" do
23
+ it "outputs the method and the error" do
24
+ output.should_receive(:<<).with(/(footle)+.*(dootle)+/)
25
+
26
+ renderer.descend
27
+ renderer.exception("footle", Exception.new("dootle"))
28
+ renderer.ascend
29
+ end
30
+ end
31
+
32
+ describe "#ascend and #descend" do
33
+ it "indents two spaces for each descend after the first" do
34
+ output.should_receive(:<<).with(/footle/).ordered
35
+ output.should_receive(:<<).with(/^ .*wankle/).ordered
36
+ output.should_receive(:<<).with(/spittle/).ordered
37
+
38
+ renderer.descend
39
+ renderer.benchmark("footle", time)
40
+ renderer.descend
41
+ renderer.benchmark("wankle", time)
42
+ renderer.ascend
43
+ renderer.ascend
44
+
45
+ renderer.descend
46
+ renderer.benchmark("spittle", time)
47
+ renderer.ascend
48
+ end
49
+
50
+ end
51
+ end
52
+ end
53
+ end
54
+
@@ -0,0 +1,60 @@
1
+ require "spec_helper"
2
+ require "boot_polish/nested_benchmark"
3
+
4
+ module BootPolish
5
+ describe NestedBenchmark do
6
+
7
+ describe "instance" do
8
+
9
+ let(:visitor) { double(:visitor, benchmark: nil, descend: nil, ascend: nil) }
10
+ let(:nested_benchmark) { NestedBenchmark.new( visitor ) }
11
+
12
+ describe "#visitor" do
13
+ context "is passed into new" do
14
+ it "is the same as the initalized value" do
15
+ nested_benchmark.visitor.should == visitor
16
+ end
17
+
18
+ it "can be changed" do
19
+ another_visitor = double(:another_visitor)
20
+ nested_benchmark.visitor = another_visitor
21
+ nested_benchmark.visitor.should == another_visitor
22
+ end
23
+ end
24
+
25
+ context "it is not passed into new" do
26
+ it "defaults to a new instance of DefaultRenderer" do
27
+ renderer = double(:renderer)
28
+ DefaultRenderer.should_receive(:new).and_return(renderer)
29
+
30
+ nested_benchmark = NestedBenchmark.new
31
+
32
+ nested_benchmark.visitor.should == renderer
33
+ end
34
+ end
35
+
36
+ end
37
+
38
+ describe "#nest" do
39
+ it "returns the blocks evaluated value" do
40
+ nested_benchmark.nest("holas") do
41
+ 77
42
+ end.should == 77
43
+ end
44
+ end
45
+
46
+ it "visits and yields in the correct order" do
47
+ block_content = double(:block_content)
48
+
49
+ visitor.should_receive(:descend).ordered
50
+ block_content.should_receive(:yield!).ordered
51
+ visitor.should_receive(:benchmark).with("Hi", kind_of(Benchmark::Tms)).ordered
52
+ visitor.should_receive(:ascend).ordered
53
+
54
+ nested_benchmark.nest("Hi") do
55
+ block_content.yield!
56
+ end
57
+ end
58
+ end
59
+ end
60
+ end
@@ -0,0 +1,64 @@
1
+ require "spec_helper"
2
+ require "boot_polish/tree_renderer"
3
+
4
+ module BootPolish
5
+ describe TreeRenderer do
6
+ describe "instance" do
7
+
8
+ let(:output) { double(:output) }
9
+ let(:time) { double(:time, real: 9.99) }
10
+ let(:renderer) { TreeRenderer.new(output) }
11
+
12
+ before do
13
+ output.should_receive(:flush).any_number_of_times
14
+ output.should_receive(:<<).with("\n").any_number_of_times
15
+ end
16
+
17
+ describe "#benchmark" do
18
+ it "outputs the method and real time" do
19
+ output.should_receive(:<<).with(/(footle)+/)
20
+ output.should_receive(:<<).with(anything).any_number_of_times
21
+
22
+ renderer.descend
23
+ renderer.benchmark("footle", time)
24
+ renderer.ascend
25
+ end
26
+ end
27
+
28
+ describe "#exception" do
29
+ it "outputs the method and the error" do
30
+ output.should_receive(:<<).with(/(footle)+.*(dootle)+/)
31
+ output.should_receive(:<<).with(anything).any_number_of_times
32
+
33
+ renderer.descend
34
+ renderer.exception("footle", Exception.new("dootle"))
35
+ renderer.ascend
36
+ end
37
+ end
38
+
39
+ describe "#ascend and #descend" do
40
+ it "indents two spaces for each descend after the first" do
41
+ output.should_receive(:<<).with("").ordered
42
+ output.should_receive(:<<).with(/footle/).ordered
43
+ output.should_receive(:<<).with(" ").ordered
44
+ output.should_receive(:<<).with(/wankle/).ordered
45
+ output.should_receive(:<<).with("").ordered
46
+ output.should_receive(:<<).with(/spittle/).ordered
47
+
48
+ renderer.descend
49
+ renderer.benchmark("footle", time)
50
+ renderer.descend
51
+ renderer.benchmark("wankle", time)
52
+ renderer.ascend
53
+ renderer.ascend
54
+
55
+ renderer.descend
56
+ renderer.benchmark("spittle", time)
57
+ renderer.ascend
58
+ end
59
+
60
+ end
61
+ end
62
+ end
63
+ end
64
+
@@ -0,0 +1,27 @@
1
+ require 'spec_helper'
2
+ require 'boot_polish'
3
+
4
+ describe "adding benchmarking aspects" do
5
+ describe ".require" do
6
+ it "benchmarks the require using require_benchmark.nest" do
7
+ benchmark = double(:benchmark)
8
+
9
+ benchmark.should_receive(:nest).
10
+ with("require fixtures/dummy.rb").
11
+ and_yield()
12
+
13
+ benchmark.should_receive(:nest).
14
+ any_number_of_times.
15
+ with(anything).
16
+ and_yield()
17
+
18
+
19
+ BootPolish::Base.should_receive(:require_benchmark).
20
+ any_number_of_times.
21
+ and_return(benchmark)
22
+
23
+ require('fixtures/dummy.rb').should be_true
24
+ end
25
+
26
+ end
27
+ end
File without changes
@@ -0,0 +1,10 @@
1
+ require 'rspec'
2
+ require 'pry'
3
+ $:.unshift File.expand_path('..', __FILE__)
4
+ $:.unshift File.expand_path('../../lib', __FILE__)
5
+
6
+ RSpec.configure do |config|
7
+ config.before(:each) do
8
+ @lib_dir = File.expand_path('../../lib', __FILE__)
9
+ end
10
+ end
metadata ADDED
@@ -0,0 +1,128 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: boot_polish
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Rasheed Abdul-Aziz
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2013-01-28 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: rubytree
16
+ requirement: !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ! '>='
20
+ - !ruby/object:Gem::Version
21
+ version: '0'
22
+ type: :runtime
23
+ prerelease: false
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ! '>='
28
+ - !ruby/object:Gem::Version
29
+ version: '0'
30
+ - !ruby/object:Gem::Dependency
31
+ name: rspec
32
+ requirement: !ruby/object:Gem::Requirement
33
+ none: false
34
+ requirements:
35
+ - - ! '>='
36
+ - !ruby/object:Gem::Version
37
+ version: '0'
38
+ type: :development
39
+ prerelease: false
40
+ version_requirements: !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ! '>='
44
+ - !ruby/object:Gem::Version
45
+ version: '0'
46
+ - !ruby/object:Gem::Dependency
47
+ name: pry
48
+ requirement: !ruby/object:Gem::Requirement
49
+ none: false
50
+ requirements:
51
+ - - ! '>='
52
+ - !ruby/object:Gem::Version
53
+ version: '0'
54
+ type: :development
55
+ prerelease: false
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ none: false
58
+ requirements:
59
+ - - ! '>='
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ description: Boot time introspection to help you get under the heroku 60 second timeout.
63
+ email:
64
+ - rasheed@pivotallabs.com
65
+ executables: []
66
+ extensions: []
67
+ extra_rdoc_files: []
68
+ files:
69
+ - .gitignore
70
+ - .pairs
71
+ - .travis.yml
72
+ - Gemfile
73
+ - Gemfile.lock
74
+ - LICENSE.txt
75
+ - README.md
76
+ - Rakefile
77
+ - boot_polish.gemspec
78
+ - lib/boot_polish.rb
79
+ - lib/boot_polish/base.rb
80
+ - lib/boot_polish/default_renderer.rb
81
+ - lib/boot_polish/nested_benchmark.rb
82
+ - lib/boot_polish/tree_renderer.rb
83
+ - lib/boot_polish/version.rb
84
+ - spec/boot_polish/base_spec.rb
85
+ - spec/boot_polish/default_renderer_spec.rb
86
+ - spec/boot_polish/nested_benchmark_spec.rb
87
+ - spec/boot_polish/tree_renderer_spec.rb
88
+ - spec/boot_polish_spec.rb
89
+ - spec/fixtures/dummy.rb
90
+ - spec/spec_helper.rb
91
+ homepage: https://github.com/zephyr-dev/boot_polish
92
+ licenses: []
93
+ post_install_message:
94
+ rdoc_options: []
95
+ require_paths:
96
+ - lib
97
+ required_ruby_version: !ruby/object:Gem::Requirement
98
+ none: false
99
+ requirements:
100
+ - - ! '>='
101
+ - !ruby/object:Gem::Version
102
+ version: '0'
103
+ segments:
104
+ - 0
105
+ hash: -3906148387546673340
106
+ required_rubygems_version: !ruby/object:Gem::Requirement
107
+ none: false
108
+ requirements:
109
+ - - ! '>='
110
+ - !ruby/object:Gem::Version
111
+ version: '0'
112
+ segments:
113
+ - 0
114
+ hash: -3906148387546673340
115
+ requirements: []
116
+ rubyforge_project:
117
+ rubygems_version: 1.8.24
118
+ signing_key:
119
+ specification_version: 3
120
+ summary: Boot time introspection to help you get under the heroku 60 second timeout.
121
+ test_files:
122
+ - spec/boot_polish/base_spec.rb
123
+ - spec/boot_polish/default_renderer_spec.rb
124
+ - spec/boot_polish/nested_benchmark_spec.rb
125
+ - spec/boot_polish/tree_renderer_spec.rb
126
+ - spec/boot_polish_spec.rb
127
+ - spec/fixtures/dummy.rb
128
+ - spec/spec_helper.rb