rspec-prof 0.0.3 → 0.0.4

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.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: ae9933597915662f4f7bca6325721f52cda3cafc
4
+ data.tar.gz: 45924ff5c34120c71d82aa1be0dbbc08f671714a
5
+ SHA512:
6
+ metadata.gz: 88baa3fe89c1ec1aca70dacd78c07db54cef258f8f4e03c1b06df5c8711ad01a288b541d108ed995c83fe77c8c37f73b8dded637ba5dd6c548483cf5dd20227a
7
+ data.tar.gz: 6a4fc8170ab7ab738e7f1d27efb10a24afa46e140cc54cecfe4d747224f1212f6a9be4fed39fd7657d846b3ac2ef35617414aa67139b9e27e1a9e84e221e60a4
@@ -0,0 +1,5 @@
1
+ README.rdoc
2
+ lib/**/*.rb
3
+ bin/*
4
+ features/**/*.feature
5
+ LICENSE
@@ -0,0 +1,25 @@
1
+ ## MAC OS
2
+ .DS_Store
3
+
4
+ ## TEXTMATE
5
+ *.tmproj
6
+ tmtags
7
+
8
+ ## EMACS
9
+ *~
10
+ \#*
11
+ .\#*
12
+
13
+ ## VIM
14
+ *.swp
15
+
16
+ ## PROJECT::GENERAL
17
+ coverage
18
+ rdoc
19
+ pkg
20
+ .idea
21
+
22
+ ## PROJECT::SPECIFIC
23
+ profiles
24
+ coverage
25
+ tmp
@@ -0,0 +1,3 @@
1
+ rvm:
2
+ - 2.0.0
3
+ - ruby-head
data/Gemfile ADDED
@@ -0,0 +1,2 @@
1
+ source 'https://rubygems.org'
2
+ gemspec
@@ -0,0 +1,67 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ rspec-prof (0.0.4)
5
+ rspec
6
+ ruby-prof
7
+
8
+ GEM
9
+ remote: https://rubygems.org/
10
+ specs:
11
+ aruba (0.5.3)
12
+ childprocess (>= 0.3.6)
13
+ cucumber (>= 1.1.1)
14
+ rspec-expectations (>= 2.7.0)
15
+ builder (3.2.2)
16
+ childprocess (0.3.9)
17
+ ffi (~> 1.0, >= 1.0.11)
18
+ coveralls (0.7.0)
19
+ multi_json (~> 1.3)
20
+ rest-client
21
+ simplecov (>= 0.7)
22
+ term-ansicolor
23
+ thor
24
+ cucumber (1.3.8)
25
+ builder (>= 2.1.2)
26
+ diff-lcs (>= 1.1.3)
27
+ gherkin (~> 2.12.1)
28
+ multi_json (>= 1.7.5, < 2.0)
29
+ multi_test (>= 0.0.2)
30
+ diff-lcs (1.2.4)
31
+ ffi (1.9.3)
32
+ gherkin (2.12.2)
33
+ multi_json (~> 1.3)
34
+ mime-types (2.0)
35
+ multi_json (1.8.2)
36
+ multi_test (0.0.2)
37
+ rake (10.1.0)
38
+ rest-client (1.6.7)
39
+ mime-types (>= 1.16)
40
+ rspec (2.14.1)
41
+ rspec-core (~> 2.14.0)
42
+ rspec-expectations (~> 2.14.0)
43
+ rspec-mocks (~> 2.14.0)
44
+ rspec-core (2.14.7)
45
+ rspec-expectations (2.14.3)
46
+ diff-lcs (>= 1.1.3, < 2.0)
47
+ rspec-mocks (2.14.4)
48
+ ruby-prof (0.13.0)
49
+ simplecov (0.7.1)
50
+ multi_json (~> 1.0)
51
+ simplecov-html (~> 0.7.1)
52
+ simplecov-html (0.7.1)
53
+ term-ansicolor (1.2.2)
54
+ tins (~> 0.8)
55
+ thor (0.18.1)
56
+ tins (0.12.0)
57
+
58
+ PLATFORMS
59
+ ruby
60
+
61
+ DEPENDENCIES
62
+ aruba
63
+ coveralls
64
+ cucumber
65
+ rake
66
+ rspec-prof!
67
+ simplecov
@@ -1,96 +1,65 @@
1
- = rspec-prof
1
+ = rspec-prof {<img src="https://travis-ci.org/sinisterchipmunk/rspec-prof.png?branch=master" alt="Build Status" />}[https://travis-ci.org/sinisterchipmunk/rspec-prof] {<img src="https://coveralls.io/repos/sinisterchipmunk/rspec-prof/badge.png?branch=master" alt="Coverage Status" />}[https://coveralls.io/r/sinisterchipmunk/rspec-prof?branch=master]
2
2
 
3
- Integrates ruby-prof with RSpec, allowing you to easily profile your RSpec examples.
3
+ Integrates ruby-prof with RSpec, allowing you to easily profile your RSpec
4
+ examples.
4
5
 
5
6
  == Installation
6
7
 
7
- gem install rspec-prof
8
+ If you need to use rspec-prof in Rails 2.x or RSpec 1.x, use version `0.0.3`.
8
9
 
9
- == Setup
10
+ Gemfile:
10
11
 
11
- You'd probably ought to enable the gem in your spec_helper.rb file:
12
- gem 'rspec-prof'
13
- require 'rspec-prof'
14
-
15
- Or, in Rails 2 (config/environment.rb):
16
- config.gem 'rspec-prof'
17
-
18
- Or, in Rails 3 (Gemfile):
19
12
  group :test do
20
13
  gem 'rspec-prof'
21
14
  end
22
15
 
23
16
  == Usage
24
17
 
25
- Easy, peasy: in your spec files, simply add a "profile" context:
26
-
27
- describe MyAwesomeObject do
28
- context "with an awesome string" do
29
- subject { MyAwesomeObject.new("an awesome string") }
30
-
31
- profile do # profile these examples!
32
- it "should be awesome" do
33
- subject.should be_awesome
34
- end
35
-
36
- it "should be epic" do
37
- subject.should be_epic
38
- end
39
- end
40
-
41
- # not profiled:
42
- it "should not be fail" do
43
- subject.should_not be_fail
44
- end
45
- end
46
- end
47
-
48
- The usage overviewed above will, by default, profile each spec independently. If you need to profile all of them in a
49
- single go, that's easy too:
50
-
51
- describe MyAwesomeObject do
52
- # . . .
53
-
54
- profile :all do # run all of these examples in a single profile
55
- # . . .
56
- end
57
- end
18
+ The easiest way to use rspec-prof is to export the `RSPEC_PROFILE` environment
19
+ variable:
58
20
 
59
- You can also explicitly pass an :each option to #profile, if it makes you feel better. There are a number of other
60
- options that you can pass in the form of a hash, such as min_percent:
21
+ $ rake spec RSPEC_PROFILE=each
61
22
 
62
- describe MyAwesomeObject do
63
- # . . .
64
-
65
- profile :min_percent => 0.01 do
66
- # . . .
67
- end
68
- end
69
-
70
- For an exhaustive list of options, see the RSpecProf::Profiler class.
23
+ This will cause every spec to be profiled individually. The output will be
24
+ placed in `./profiles` by default.
25
+
26
+ To execute all specs as parts of a single profile, export `RSPEC_PROFILE=all`
27
+ instead.
28
+
29
+ == Configuration
71
30
 
72
- === Suspending RSpecProf
31
+ You can set some configuration options for `rspec-prof`, as long as you do so
32
+ before `RSpec` begins running specs. Thus, the best place for this
33
+ configuration is in `spec/support/rspec-prof.rb`.
73
34
 
74
- You probably don't want to run the profiler every time you run a spec, because the profiler by its very nature will slow
75
- down your app and, therefore, limit your productivity. To disable profiling without having to change your specs, simply
76
- add this to your spec helper:
35
+ Valid configuration options and their default values are:
77
36
 
78
- RSpecProf.disable!
79
-
80
- ...and you're done. In case you need it (but I doubt you will because it's on by default), you can also enable the
81
- profiler similarly:
37
+ RSpecProf.printer_class = RubyProf::GraphHtmlPrinter
38
+ # The printer to be used when writing profiles
82
39
 
83
- RSpecProf.enable!
40
+ RSpecProf::FilenameHelpers.file_extension = "html"
41
+ # The file extension for profiles written to disk
84
42
 
85
- == Known Limitations
43
+ RSpecProf::FilenameHelpers.output_dir = "profiles"
44
+ # The destination directory into which profiles are written
86
45
 
87
- * ruby-prof cannot multithread. Therefore, RSpecProf also cannot multithread. If you try, you SHOULD get a warning (but
88
- just in case, this is your warning too) that the profiling cannot be performed due to multithreading. RSpecProf SHOULD
89
- disable itself at this point and allow your specs to run normally.
90
- * Profile blocks cannot be nested within each other. To do so would require multithreading and, even were it possible,
91
- I'm not sure how RSpecProf would be expected to comply; instead, RSpecProf will merely raise an error and your specs
92
- will fail.
93
- * I think that's it.
46
+ == Pausing and Resuming
47
+
48
+ It is perfectly OK to do this:
49
+
50
+ require 'spec_helper'
51
+
52
+ describe "smth" do
53
+ before do
54
+ # let's not profile the test set-up
55
+ RubyProf.pause if RubyProf.running?
56
+
57
+ sleep 30 # doing something expensive...
58
+
59
+ # don't forget to resume so specs can be measured!
60
+ RubyProf.resume if RubyProf.running?
61
+ end
62
+ end
94
63
 
95
64
  == Note on Patches/Pull Requests
96
65
 
@@ -98,8 +67,6 @@ profiler similarly:
98
67
  * Make your feature addition or bug fix.
99
68
  * Add tests for it. This is important so I don't break it in a
100
69
  future version unintentionally.
101
- * Commit, do not mess with rakefile, version, or history.
102
- (if you want to have your own version, that is fine but bump version in a commit by itself I can ignore when I pull)
103
70
  * Send me a pull request. Bonus points for topic branches.
104
71
 
105
72
  == Copyright
data/Rakefile CHANGED
@@ -1,77 +1,18 @@
1
- require 'rubygems'
2
- require 'rake'
3
-
4
1
  begin
5
- require 'jeweler'
6
- Jeweler::Tasks.new do |gem|
7
- gem.name = "rspec-prof"
8
- gem.summary = %Q{Integrates ruby-prof with RSpec, allowing you to easily profile your RSpec examples.}
9
- gem.description = %Q{Integrates ruby-prof with RSpec, allowing you to easily profile your RSpec examples.}
10
- gem.email = "sinisterchipmunk@gmail.com"
11
- gem.homepage = "http://www.thoughtsincomputation.com/"
12
- gem.authors = ["Colin MacKenzie IV"]
13
- gem.add_dependency "sc-core-ext", ">= 1.2.1"
14
- gem.add_dependency "rspec"
15
- gem.add_dependency "ruby-prof"
16
- gem.add_development_dependency "jeweler", ">= 1.4.0"
17
- gem.add_development_dependency "rspec", ">= 1.3.0"
18
- gem.add_development_dependency "builder", ">= 2.1.2"
19
- gem.files = FileList['**/*'] - FileList['profiles/**/*'] - FileList['pkg/**/*']
20
- gem.test_files = FileList['spec/**/*']
21
- # gem is a Gem::Specification... see http://www.rubygems.org/read/chapter/20 for additional settings
22
- end
23
- Jeweler::GemcutterTasks.new
2
+ require 'bundler'
3
+ Bundler::GemHelper.install_tasks
4
+ Bundler.setup
24
5
  rescue LoadError
25
- puts "Jeweler (or a dependency) not available. Install it with: gem install jeweler"
26
- end
27
-
28
- unless defined?(RSPEC_VERSION)
29
- begin
30
- # RSpec 1.3.0
31
- require 'spec/rake/spectask'
32
- require 'spec/version'
33
-
34
- RSPEC_VERSION = Spec::VERSION::STRING
35
- rescue LoadError
36
- # RSpec 2.0
37
- begin
38
- require 'rspec/core/rake_task'
39
- require 'rspec/core/version'
40
-
41
- RSPEC_VERSION = RSpec::Core::Version::STRING
42
- rescue LoadError
43
- raise "RSpec does not seem to be installed. You must gem install rspec to use this gem."
44
- end
45
- end
6
+ puts " *** You don't seem to have Bundler installed. ***"
7
+ puts " Please run the following command:"
8
+ puts
9
+ puts " gem install bundler"
10
+ raise "bundler is not installed"
46
11
  end
47
12
 
48
- if RSPEC_VERSION >= "2.0.0"
49
- RSpec::Core::RakeTask.new(:spec) do |spec|
50
- spec.pattern = 'spec/**/*_spec.rb'
51
- end
52
- else # Rake task for 1.3.x
53
- Spec::Rake::SpecTask.new(:spec) do |spec|
54
- spec.libs << 'lib' << 'spec'
55
- spec.spec_files = FileList['spec/**/*_spec.rb']
56
- end
57
-
58
- Spec::Rake::SpecTask.new(:rcov) do |spec|
59
- spec.libs << 'lib' << 'spec'
60
- spec.pattern = 'spec/**/*_spec.rb'
61
- spec.rcov = true
62
- end
63
- end
13
+ require 'coveralls/rake/task'
14
+ Coveralls::RakeTask.new
64
15
 
65
- task :spec => :check_dependencies
66
-
67
- task :default => :spec
68
-
69
- require 'rake/rdoctask'
70
- Rake::RDocTask.new do |rdoc|
71
- version = File.exist?('VERSION') ? File.read('VERSION') : ""
72
-
73
- rdoc.rdoc_dir = 'rdoc'
74
- rdoc.title = "rspec-prof #{version}"
75
- rdoc.rdoc_files.include('README*')
76
- rdoc.rdoc_files.include('lib/**/*.rb')
77
- end
16
+ require 'cucumber/rake/task'
17
+ Cucumber::Rake::Task.new :cucumber
18
+ task :default => [:cucumber, 'coveralls:push']
@@ -0,0 +1,64 @@
1
+ Feature: Profile with environment variables
2
+
3
+ Background:
4
+ Given a file named "spec/a_spec.rb" with:
5
+ """ruby
6
+ require 'spec_helper'
7
+
8
+ describe 'a gerbil' do
9
+ it 'has feet' do
10
+ end
11
+
12
+ it 'has a nose' do
13
+ RubyProf.pause if RubyProf.running?
14
+ RubyProf.resume if RubyProf.running?
15
+ end
16
+ end
17
+ """
18
+
19
+ Scenario: when set to 'each' and running only a specific scenario
20
+ Given the environment variable "RSPEC_PROFILE" is set to "each"
21
+ When I run `rspec spec/a_spec.rb:7`
22
+ Then it should pass
23
+ And the following files should exist:
24
+ | profiles/a-gerbil/has-a-nose:7.html |
25
+ And the following files should not exist:
26
+ | profiles/all.html |
27
+ | profiles/a-gerbil/has-feet:4.html |
28
+
29
+ Scenario: when set to 'each'
30
+ Given the environment variable "RSPEC_PROFILE" is set to "each"
31
+ When I run `rspec`
32
+ Then it should pass
33
+ And the following files should exist:
34
+ | profiles/a-gerbil/has-feet:4.html |
35
+ | profiles/a-gerbil/has-a-nose:7.html |
36
+ And the following files should not exist:
37
+ | profiles/all.html |
38
+
39
+ Scenario: when set to 'all'
40
+ Given the environment variable "RSPEC_PROFILE" is set to "all"
41
+ When I run `rspec`
42
+ Then it should pass
43
+ And the following files should exist:
44
+ | profiles/all.html |
45
+ And the following files should not exist:
46
+ | profiles/a-gerbil/has-feet:4.html |
47
+ | profiles/a-gerbil/has-a-nose:7.html |
48
+
49
+ Scenario: when set to some invalid value
50
+ Given the environment variable "RSPEC_PROFILE" is set to "invalid value"
51
+ When I run `rspec`
52
+ Then it should fail
53
+ And the output should contain:
54
+ """
55
+ ENV['RSPEC_PROFILE'] should be blank, 'all' or 'each', but was 'invalid value'
56
+ """
57
+
58
+ Scenario: when not set at all
59
+ When I run `rspec`
60
+ Then it should pass
61
+ And the following files should not exist:
62
+ | profiles/all.html |
63
+ | profiles/a-gerbil/has-feet:4.html |
64
+ | profiles/a-gerbil/has-a-nose:7.html |
@@ -0,0 +1,3 @@
1
+ Given(/^the environment variable "(.*?)" is set to "(.*?)"$/) do |arg1, arg2|
2
+ ENV[arg1] = arg2
3
+ end
@@ -0,0 +1,3 @@
1
+ Then(/^it should (pass|fail)$/) do |pass_fail|
2
+ step "it should #{pass_fail} with:", ""
3
+ end
@@ -0,0 +1,5 @@
1
+ require 'aruba/cucumber'
2
+
3
+ Before do
4
+ @aruba_timeout_seconds = 60
5
+ end
@@ -0,0 +1,3 @@
1
+ After do
2
+ ENV.delete 'RSPEC_PROFILE'
3
+ end
@@ -0,0 +1,18 @@
1
+ Before do |scenario|
2
+
3
+ step 'a file named "spec/spec_helper.rb" with:', <<-end_file
4
+ require 'simplecov'
5
+ require 'coveralls'
6
+
7
+ SimpleCov.start do
8
+ root "#{File.expand_path('../..', File.dirname(__FILE__))}"
9
+ coverage_dir 'coverage'
10
+ SimpleCov.command_name #{scenario.title.inspect}
11
+ filters.clear
12
+ add_filter { |f| !f.filename['rspec-prof'] }
13
+ end
14
+
15
+ require 'rspec-prof'
16
+ end_file
17
+
18
+ end
@@ -1,120 +1,77 @@
1
- unless defined?(Gem)
2
- require 'rubygems'
3
- gem 'sc-core-ext', ">= 1.2.1"
4
- gem 'rspec'
5
- gem 'ruby-prof'
6
- end
7
-
8
- require 'sc-core-ext'
9
- require 'ruby-prof'
10
1
  require 'fileutils'
2
+ require 'ruby-prof'
3
+ require 'rspec/core'
4
+ require 'rspec-prof/filename_helpers'
5
+
6
+ class RSpecProf
7
+ extend FilenameHelpers
11
8
 
12
- require File.join(File.dirname(__FILE__), "rspec")
13
- require 'rspec-prof/profiler'
14
- $rspec_prof_filename_id = 0
15
- $rspec_prof_thread_id = Thread.current.object_id
9
+ @printer_class = RubyProf::GraphHtmlPrinter
16
10
 
17
- # See the README for general usage information.
18
- #
19
- # See RSpecProf::Profiler for all configuration options.
20
- #
21
- # You can enable RSpecProf by adding
22
- # RSpecProf.enable!
23
- # to your spec_helper.rb file. Actually, RSpecProf is enabled by default.
24
- #
25
- # You can disable RSpecProf by adding
26
- # RSpecProf.disable!
27
- # to your spec_helper.rb file.
28
- #
29
- # You can see if RSpecProf is enabled by calling
30
- # RSpecProf.enabled?
31
- #
32
- module RSpecProf
33
11
  class << self
34
- # Enables all profiling
35
- def enable!
36
- @enabled = true
37
- end
38
-
39
- # Disables all profiling with RSpecProf
40
- def disable!
41
- @enable = false
42
- end
43
-
44
- # Returns true if profiling is enabled, false otherwise.
45
- def enabled?
46
- @enabled ||= true
12
+ attr_accessor :printer_class
13
+
14
+ def profile filename
15
+ profiler = new.start
16
+ yield
17
+ ensure
18
+ profiler.save_to filename
47
19
  end
48
20
  end
49
-
50
- module InstanceMethods
51
- # Returns a unique filename for this example group, based on the total description and a unique identifier.
52
- def default_filename
53
- if RSPEC_VERSION >= "2.0.0"
54
- description = self.example.to_s
55
- description = self.class.ancestors.collect { |a| a.description }.reverse.join(" ") if description.blank?
56
- puts description
57
- (
58
- "#{$rspec_prof_filename_id += 1}-" +
59
- description
60
- ).gsub(/\s+/, '_').gsub(/\(profiling\)/, '')
61
- else
62
- (
63
- "#{$rspec_prof_filename_id += 1}-" +
64
- self.class.description_parts.join(" ") +
65
- " #{self.description}"
66
- ).gsub(/\s+/, '_').gsub(/\(profiling\)/, '')
67
- end
68
- end
21
+
22
+ def start
23
+ return if @profiling
24
+ @profiling = true
25
+ RubyProf.start
26
+ self
27
+ end
28
+
29
+ def stop
30
+ return unless @profiling
31
+ @profiling = false
32
+ @result = RubyProf.stop
69
33
  end
70
-
71
- module ClassMethods
72
- # Sets up a profiling context. All specs within this context will be profiled. You can pass a scope of
73
- # :each or :all. A scope of :each will cause each contained spec to be profiled independently of any others;
74
- # a scope of :all will profile all specs at once and produce a net result. You can also pass some options:
75
- # see RSpecProf::Profiler for information on those.
76
- def profile(scope = :each, options = {}, &block)
77
- if scope.kind_of?(Hash)
78
- options.reverse_merge! scope
79
- scope = :each
80
- end
81
-
82
- context "(profiling)" do
83
- before(scope) do
84
- raise "Cannot start profiling because a profiler is already active" if @profiler
85
- if Thread.current.object_id == $rspec_prof_thread_id
86
- @profiler = RSpecProf::Profiler.new(options.reverse_merge(:file => default_filename))
87
- @profiler.start
88
- else
89
- Kernel.warn "Profiling is disabled because you appear to be multi-threading the specs"
90
- end
91
- end
92
-
93
- instance_eval &block
94
-
95
- after(scope) do
96
- @profiler.stop if @profiler
97
- @profiler = nil
98
- end
99
- end
34
+
35
+ def profiling?
36
+ @profiling
37
+ end
38
+
39
+ def result
40
+ @result
41
+ end
42
+
43
+ def save_to filename
44
+ stop
45
+ FileUtils.mkdir_p File.dirname(filename)
46
+ File.open(filename, "w") do |f|
47
+ printer = RSpecProf.printer_class.new(result)
48
+ printer.print f
100
49
  end
101
50
  end
102
51
  end
103
52
 
104
- if RSPEC_VERSION >= "2.0.0"
105
- RSpec.configure do |config|
106
- config.extend RSpecProf::ClassMethods
107
- config.include RSpecProf::InstanceMethods
53
+ RSpec.configure do |config|
54
+ config.before(:all) do
55
+ unless ['all', 'each', ''].include?(ENV['RSPEC_PROFILE'].to_s)
56
+ raise "ENV['RSPEC_PROFILE'] should be blank, 'all' or 'each', but was '#{ENV['RSPEC_PROFILE']}'"
57
+ end
58
+
59
+ if ENV['RSPEC_PROFILE'] == 'all'
60
+ @profiler = RSpecProf.new.start
61
+ end
62
+ end
63
+
64
+ config.after(:all) do
65
+ if ENV['RSPEC_PROFILE'] == 'all'
66
+ @profiler.save_to "profiles/all.html"
67
+ end
108
68
  end
109
69
 
110
- #RSpec::Core::ExampleGroup.send(:include, RSpecProf::ClassMethods)
111
- #RSpec::Core::Example.send(:include, RSpecProf::InstanceMethods)
112
- else
113
- Spec::Runner.configure do |config|
114
- config.extend RSpecProf::ClassMethods
115
- config.include RSpecProf::InstanceMethods
70
+ config.around(:each) do |example|
71
+ if ENV['RSPEC_PROFILE'] == 'each'
72
+ RSpecProf.profile(RSpecProf.filename_for(example)) { example.call }
73
+ else
74
+ example.call
75
+ end
116
76
  end
117
-
118
- Spec::Example::ExampleGroupMethods.send(:include, RSpecProf::ClassMethods)
119
- Spec::Example::ExampleMethods.send(:include, RSpecProf::InstanceMethods)
120
77
  end
@@ -0,0 +1,38 @@
1
+ class RSpecProf
2
+ module FilenameHelpers
3
+ @output_dir = "profiles"
4
+ @file_extension = "html"
5
+
6
+ class << self
7
+ attr_accessor :output_dir
8
+ attr_accessor :file_extension
9
+ end
10
+
11
+ def output_dir
12
+ RSpecProf::FilenameHelpers.output_dir
13
+ end
14
+
15
+ def file_extension
16
+ RSpecProf::FilenameHelpers.file_extension
17
+ end
18
+
19
+ def path_for metadata
20
+ if metadata[:example_group]
21
+ File.join(path_for(metadata[:example_group], metadata[:description]))
22
+ else
23
+ metadata[:description]
24
+ end
25
+ end
26
+
27
+ def filename_for example
28
+ path = path_for(example.metadata[:example_group])
29
+ line_number = example.metadata[:line_number].to_s
30
+ description = example.metadata[:description]
31
+ File.join(
32
+ output_dir,
33
+ path,
34
+ description
35
+ ).gsub(/\s+/, '-') + ":" + line_number + ".#{file_extension}"
36
+ end
37
+ end
38
+ end
@@ -1,71 +1,31 @@
1
- # Generated by jeweler
2
- # DO NOT EDIT THIS FILE DIRECTLY
3
- # Instead, edit Jeweler::Tasks in Rakefile, and run the gemspec command
4
1
  # -*- encoding: utf-8 -*-
5
2
 
6
3
  Gem::Specification.new do |s|
7
- s.name = %q{rspec-prof}
8
- s.version = "0.0.3"
4
+ s.name = "rspec-prof"
5
+ s.version = "0.0.4"
9
6
 
10
7
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
8
  s.authors = ["Colin MacKenzie IV"]
12
- s.date = %q{2010-07-17}
13
- s.description = %q{Integrates ruby-prof with RSpec, allowing you to easily profile your RSpec examples.}
14
- s.email = %q{sinisterchipmunk@gmail.com}
9
+ s.date = "2011-11-04"
10
+ s.description = "Integrates ruby-prof with RSpec, allowing you to easily profile your RSpec examples."
11
+ s.email = "sinisterchipmunk@gmail.com"
15
12
  s.extra_rdoc_files = [
16
13
  "LICENSE",
17
- "README.rdoc"
14
+ "README.rdoc"
18
15
  ]
19
- s.files = [
20
- "LICENSE",
21
- "README.rdoc",
22
- "Rakefile",
23
- "VERSION",
24
- "lib/rspec-prof.rb",
25
- "lib/rspec-prof/profiler.rb",
26
- "lib/rspec.rb",
27
- "rspec-prof.gemspec",
28
- "spec/rspec-prof_spec.rb",
29
- "spec/spec.opts",
30
- "spec/spec_helper.rb"
31
- ]
32
- s.homepage = %q{http://www.thoughtsincomputation.com/}
33
- s.rdoc_options = ["--charset=UTF-8"]
16
+ s.files = `git ls-files`.split("\n")
17
+ s.homepage = "http://www.thoughtsincomputation.com/"
34
18
  s.require_paths = ["lib"]
35
- s.rubygems_version = %q{1.3.7}
36
- s.summary = %q{Integrates ruby-prof with RSpec, allowing you to easily profile your RSpec examples.}
37
- s.test_files = [
38
- "spec/rspec-prof_spec.rb",
39
- "spec/spec.opts",
40
- "spec/spec_helper.rb"
41
- ]
42
-
43
- if s.respond_to? :specification_version then
44
- current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
45
- s.specification_version = 3
19
+ s.rubygems_version = "1.8.10"
20
+ s.summary = "Integrates ruby-prof with RSpec, allowing you to easily profile your RSpec examples."
21
+ s.test_files = `git ls-files -- features/`.split("\n")
46
22
 
47
- if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
48
- s.add_runtime_dependency(%q<sc-core-ext>, [">= 1.2.1"])
49
- s.add_runtime_dependency(%q<rspec>, [">= 0"])
50
- s.add_runtime_dependency(%q<ruby-prof>, [">= 0"])
51
- s.add_development_dependency(%q<jeweler>, [">= 1.4.0"])
52
- s.add_development_dependency(%q<rspec>, [">= 1.3.0"])
53
- s.add_development_dependency(%q<builder>, [">= 2.1.2"])
54
- else
55
- s.add_dependency(%q<sc-core-ext>, [">= 1.2.1"])
56
- s.add_dependency(%q<rspec>, [">= 0"])
57
- s.add_dependency(%q<ruby-prof>, [">= 0"])
58
- s.add_dependency(%q<jeweler>, [">= 1.4.0"])
59
- s.add_dependency(%q<rspec>, [">= 1.3.0"])
60
- s.add_dependency(%q<builder>, [">= 2.1.2"])
61
- end
62
- else
63
- s.add_dependency(%q<sc-core-ext>, [">= 1.2.1"])
64
- s.add_dependency(%q<rspec>, [">= 0"])
65
- s.add_dependency(%q<ruby-prof>, [">= 0"])
66
- s.add_dependency(%q<jeweler>, [">= 1.4.0"])
67
- s.add_dependency(%q<rspec>, [">= 1.3.0"])
68
- s.add_dependency(%q<builder>, [">= 2.1.2"])
69
- end
23
+ s.add_runtime_dependency 'rspec'
24
+ s.add_runtime_dependency 'ruby-prof'
25
+ s.add_development_dependency 'cucumber'
26
+ s.add_development_dependency 'aruba'
27
+ s.add_development_dependency 'simplecov'
28
+ s.add_development_dependency 'coveralls'
29
+ s.add_development_dependency 'rake'
70
30
  end
71
31
 
metadata CHANGED
@@ -1,162 +1,168 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: rspec-prof
3
- version: !ruby/object:Gem::Version
4
- prerelease: false
5
- segments:
6
- - 0
7
- - 0
8
- - 3
9
- version: 0.0.3
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.4
10
5
  platform: ruby
11
- authors:
6
+ authors:
12
7
  - Colin MacKenzie IV
13
8
  autorequire:
14
9
  bindir: bin
15
10
  cert_chain: []
16
-
17
- date: 2010-07-17 00:00:00 -04:00
18
- default_executable:
19
- dependencies:
20
- - !ruby/object:Gem::Dependency
21
- name: sc-core-ext
22
- prerelease: false
23
- requirement: &id001 !ruby/object:Gem::Requirement
24
- none: false
25
- requirements:
26
- - - ">="
27
- - !ruby/object:Gem::Version
28
- segments:
29
- - 1
30
- - 2
31
- - 1
32
- version: 1.2.1
33
- type: :runtime
34
- version_requirements: *id001
35
- - !ruby/object:Gem::Dependency
11
+ date: 2011-11-04 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
36
14
  name: rspec
37
- prerelease: false
38
- requirement: &id002 !ruby/object:Gem::Requirement
39
- none: false
40
- requirements:
41
- - - ">="
42
- - !ruby/object:Gem::Version
43
- segments:
44
- - 0
45
- version: "0"
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - '>='
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
46
20
  type: :runtime
47
- version_requirements: *id002
48
- - !ruby/object:Gem::Dependency
49
- name: ruby-prof
50
21
  prerelease: false
51
- requirement: &id003 !ruby/object:Gem::Requirement
52
- none: false
53
- requirements:
54
- - - ">="
55
- - !ruby/object:Gem::Version
56
- segments:
57
- - 0
58
- version: "0"
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - '>='
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: ruby-prof
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - '>='
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
59
34
  type: :runtime
60
- version_requirements: *id003
61
- - !ruby/object:Gem::Dependency
62
- name: jeweler
63
35
  prerelease: false
64
- requirement: &id004 !ruby/object:Gem::Requirement
65
- none: false
66
- requirements:
67
- - - ">="
68
- - !ruby/object:Gem::Version
69
- segments:
70
- - 1
71
- - 4
72
- - 0
73
- version: 1.4.0
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - '>='
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: cucumber
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: aruba
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - '>='
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
74
62
  type: :development
75
- version_requirements: *id004
76
- - !ruby/object:Gem::Dependency
77
- name: rspec
78
63
  prerelease: false
79
- requirement: &id005 !ruby/object:Gem::Requirement
80
- none: false
81
- requirements:
82
- - - ">="
83
- - !ruby/object:Gem::Version
84
- segments:
85
- - 1
86
- - 3
87
- - 0
88
- version: 1.3.0
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - '>='
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: simplecov
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - '>='
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
89
76
  type: :development
90
- version_requirements: *id005
91
- - !ruby/object:Gem::Dependency
92
- name: builder
93
77
  prerelease: false
94
- requirement: &id006 !ruby/object:Gem::Requirement
95
- none: false
96
- requirements:
97
- - - ">="
98
- - !ruby/object:Gem::Version
99
- segments:
100
- - 2
101
- - 1
102
- - 2
103
- version: 2.1.2
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - '>='
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: coveralls
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - '>='
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
104
90
  type: :development
105
- version_requirements: *id006
106
- description: Integrates ruby-prof with RSpec, allowing you to easily profile your RSpec examples.
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - '>='
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
97
+ - !ruby/object:Gem::Dependency
98
+ name: rake
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - '>='
102
+ - !ruby/object:Gem::Version
103
+ version: '0'
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - '>='
109
+ - !ruby/object:Gem::Version
110
+ version: '0'
111
+ description: Integrates ruby-prof with RSpec, allowing you to easily profile your
112
+ RSpec examples.
107
113
  email: sinisterchipmunk@gmail.com
108
114
  executables: []
109
-
110
115
  extensions: []
111
-
112
- extra_rdoc_files:
116
+ extra_rdoc_files:
113
117
  - LICENSE
114
118
  - README.rdoc
115
- files:
119
+ files:
120
+ - .document
121
+ - .gitignore
122
+ - .travis.yml
123
+ - Gemfile
124
+ - Gemfile.lock
116
125
  - LICENSE
117
126
  - README.rdoc
118
127
  - Rakefile
119
128
  - VERSION
129
+ - features/profile_with_env_vars.feature
130
+ - features/step_definitions/environment_variable_steps.rb
131
+ - features/step_definitions/pass_fail_steps.rb
132
+ - features/support/env.rb
133
+ - features/support/reset_env.rb
134
+ - features/support/spec_helper.rb
120
135
  - lib/rspec-prof.rb
121
- - lib/rspec-prof/profiler.rb
122
- - lib/rspec.rb
136
+ - lib/rspec-prof/filename_helpers.rb
123
137
  - rspec-prof.gemspec
124
- - spec/rspec-prof_spec.rb
125
- - spec/spec.opts
126
- - spec/spec_helper.rb
127
- has_rdoc: true
128
138
  homepage: http://www.thoughtsincomputation.com/
129
139
  licenses: []
130
-
140
+ metadata: {}
131
141
  post_install_message:
132
- rdoc_options:
133
- - --charset=UTF-8
134
- require_paths:
142
+ rdoc_options: []
143
+ require_paths:
135
144
  - lib
136
- required_ruby_version: !ruby/object:Gem::Requirement
137
- none: false
138
- requirements:
139
- - - ">="
140
- - !ruby/object:Gem::Version
141
- segments:
142
- - 0
143
- version: "0"
144
- required_rubygems_version: !ruby/object:Gem::Requirement
145
- none: false
146
- requirements:
147
- - - ">="
148
- - !ruby/object:Gem::Version
149
- segments:
150
- - 0
151
- version: "0"
145
+ required_ruby_version: !ruby/object:Gem::Requirement
146
+ requirements:
147
+ - - '>='
148
+ - !ruby/object:Gem::Version
149
+ version: '0'
150
+ required_rubygems_version: !ruby/object:Gem::Requirement
151
+ requirements:
152
+ - - '>='
153
+ - !ruby/object:Gem::Version
154
+ version: '0'
152
155
  requirements: []
153
-
154
156
  rubyforge_project:
155
- rubygems_version: 1.3.7
157
+ rubygems_version: 2.0.3
156
158
  signing_key:
157
- specification_version: 3
158
- summary: Integrates ruby-prof with RSpec, allowing you to easily profile your RSpec examples.
159
- test_files:
160
- - spec/rspec-prof_spec.rb
161
- - spec/spec.opts
162
- - spec/spec_helper.rb
159
+ specification_version: 4
160
+ summary: Integrates ruby-prof with RSpec, allowing you to easily profile your RSpec
161
+ examples.
162
+ test_files:
163
+ - features/profile_with_env_vars.feature
164
+ - features/step_definitions/environment_variable_steps.rb
165
+ - features/step_definitions/pass_fail_steps.rb
166
+ - features/support/env.rb
167
+ - features/support/reset_env.rb
168
+ - features/support/spec_helper.rb
@@ -1,89 +0,0 @@
1
- module RSpecProf
2
- class Profiler
3
- attr_reader :options
4
-
5
- # Possible options:
6
- # :min_percent - Number 0 to 100 that specifes the minimum
7
- # %self (the methods self time divided by the
8
- # overall total time) that a method must take
9
- # for it to be printed out in the report.
10
- # Default value is 0.
11
- #
12
- # :print_file - True or false. Specifies if a method's source
13
- # file should be printed. Default value is false.
14
- #
15
- # :printer - Specifies the output printer. Valid values include
16
- # :flat, :graph, :graph_html and :call_tree. Defaults
17
- # to :graph_html.
18
- #
19
- # :file - filename or IO stream to send data to. By default this
20
- # is generated from your spec description and prepended
21
- # with a unique ID. Extension is added automatically if
22
- # one is not already present.
23
- #
24
- # :measure_mode - possible choices are 'wall_time', 'cpu_time',
25
- # 'allocations', 'memory', 'process_time'. Defaults
26
- # to 'process_time'
27
- #
28
- # :directory - the directory in which to place :file. If :file is not
29
- # a String, this is ignored. Defaults to "./profiler"
30
- #
31
- def initialize(options)
32
- @options = default_options.merge(options)
33
-
34
- if @options[:file].kind_of?(String)
35
- case @options[:printer]
36
- when :graph_html
37
- ext = "html"
38
- else
39
- ext = "txt"
40
- end
41
-
42
- @options[:file] = "#{@options[:file]}.#{ext}" unless @options[:file] =~ /\./
43
- end
44
-
45
- ENV["RUBY_PROF_MEASURE_MODE"] = options[:measure_mode]
46
- RubyProf.figure_measure_mode
47
- end
48
-
49
- def start
50
- RubyProf.start
51
- end
52
-
53
- def stop
54
- file = options[:file]
55
- result = RubyProf.stop
56
-
57
- printer_class = options[:printer].kind_of?(Class) ? options[:printer] :
58
- "RubyProf::#{options[:printer].to_s.camelize}Printer".constantize
59
- with_io(file) do |out|
60
- printer = printer_class.new(result)
61
- printer.print(out, :print_file => options[:print_file], :min_percent => options[:min_percent])
62
- end
63
- end
64
-
65
- private
66
- def default_options
67
- {
68
- :min_percent => 0,
69
- :print_file => false,
70
- :printer => :graph_html,
71
- :file => "./profile",
72
- :measure_mode => 'process_time',
73
- :directory => "./profiles"
74
- }
75
- end
76
-
77
- def with_io(file)
78
- if file.respond_to?(:write) && file.respond_to?(:puts)
79
- yield file
80
- else
81
- file = File.expand_path(File.join(options[:directory], file))
82
- FileUtils.makedirs(File.dirname(file))
83
- File.open(file, "w") do |out|
84
- yield out
85
- end
86
- end
87
- end
88
- end
89
- end
@@ -1,19 +0,0 @@
1
- unless defined?(RSPEC_VERSION)
2
- begin
3
- # RSpec 1.3.0
4
- require 'spec'
5
- require 'spec/version'
6
-
7
- RSPEC_VERSION = Spec::VERSION::STRING
8
- rescue LoadError
9
- # RSpec 2.0
10
- begin
11
- require 'rspec/core'
12
- require 'rspec/core/version'
13
-
14
- RSPEC_VERSION = RSpec::Core::Version::STRING
15
- rescue LoadError
16
- raise "RSpec does not seem to be installed. You must gem install rspec to use this gem."
17
- end
18
- end
19
- end
@@ -1,45 +0,0 @@
1
- require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
2
-
3
- describe RSpecProf do
4
- # I'm still at a loss as to how to spec extensions to rspec short of just using the extension.
5
-
6
- shared_examples_for "profiling rspec" do
7
- it "should profile rspec" do
8
- # uhh, how to measure success?
9
- sleep(1)
10
- end
11
- end
12
-
13
- context "a context" do
14
- profile do
15
- it_should_behave_like "profiling rspec"
16
- end
17
-
18
- profile :printer => :graph do
19
- it_should_behave_like "profiling rspec"
20
- end
21
-
22
- profile :measure_mode => "wall_time", :printer => :graph do
23
- it_should_behave_like "profiling rspec"
24
- end
25
-
26
- profile :file => StringIO.new("") do
27
- it_should_behave_like "profiling rspec"
28
- end
29
-
30
- profile :min_percent => 0.01 do
31
- it_should_behave_like "profiling rspec"
32
- end
33
-
34
- profile :each do
35
- it_should_behave_like "profiling rspec"
36
- end
37
- end
38
-
39
- context "profile multiple" do
40
- profile :all do
41
- it "should profile 1" do sleep(1); end
42
- it "should profile 2" do 100000.times { }; end
43
- end
44
- end
45
- end
@@ -1 +0,0 @@
1
- -c
@@ -1,9 +0,0 @@
1
- $LOAD_PATH.unshift(File.dirname(__FILE__))
2
- $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
3
- require File.join(File.dirname(__FILE__), "../lib/rspec-prof")
4
-
5
- if RSPEC_VERSION >= "2.0.0"
6
- require 'rspec/autorun'
7
- else
8
- require 'spec/autorun'
9
- end