simplecov 0.6.4 → 0.7.0

Sign up to get free protection for your applications and to get access to all the features.
data/.gitignore CHANGED
@@ -1,5 +1,6 @@
1
1
  .bundle
2
2
  Gemfile.lock
3
+ gemfiles/*.lock
3
4
 
4
5
  ## MAC OS
5
6
  .DS_Store
data/.travis.yml CHANGED
@@ -1,3 +1,5 @@
1
+ before_install:
2
+ - echo "yes" | gem uninstall json
1
3
  script:
2
4
  - bundle
3
5
  - rake appraisal:install
@@ -6,10 +8,14 @@ rvm:
6
8
  - 1.8.7
7
9
  - 1.9.2
8
10
  - 1.9.3
11
+ - ruby-head
9
12
  - ree
10
- - rbx
11
- - jruby
13
+ - rbx-18mode
14
+ - jruby-18mode
15
+ matrix:
16
+ allow_failures:
17
+ - rvm: ruby-head
12
18
  notifications:
13
19
  email:
14
20
  on_success: always
15
- on_failure: always
21
+ on_failure: always
data/.yardopts ADDED
@@ -0,0 +1 @@
1
+ - **/*.md
data/CHANGELOG.md CHANGED
@@ -1,3 +1,25 @@
1
+ Unreleased ([changes](https://github.com/colszowka/simplecov/compare/v0.7.0...master))
2
+ -------------------
3
+
4
+ v0.7.0, 2012-10-10 ([changes](https://github.com/colszowka/simplecov/compare/v0.6.4...v0.7.0))
5
+ -------------------
6
+
7
+ * [FEATURE] The new `maximum_coverage_drop` and `minimum_coverage` now allow you to fail your build when the
8
+ coverage dropped by more than what you allowed or is below a minimum value required. Also, `refuse_coverage_drop` disallows
9
+ any coverage drops between test runs.
10
+ See https://github.com/colszowka/simplecov/pull/151, https://github.com/colszowka/simplecov/issues/11,
11
+ https://github.com/colszowka/simplecov/issues/90, and https://github.com/colszowka/simplecov/issues/96 (thanks to @infertux)
12
+ * [FEATURE] SimpleCov now ships with a built-in MultiFormatter which allows the easy usage of multiple result formatters at
13
+ the same time without the need to write custom wrapper code.
14
+ See https://github.com/colszowka/simplecov/pull/158 (thanks to @nikitug)
15
+ * [BUGFIX] The usage of digits, hyphens and underscores in group names could lead to broken tab navigation
16
+ in the default simplecov-html reports. See https://github.com/colszowka/simplecov-html/pull/14 (thanks to @ebelgarts)
17
+ * [REFACTORING] A few more ruby warnings removed. See https://github.com/colszowka/simplecov/issues/106 and
18
+ https://github.com/colszowka/simplecov/pull/139. (thanks to @lukejahnke)
19
+ * A [Pledgie button](https://github.com/colszowka/simplecov/commit/63cfa99f8658fa5cc66a38c83b3195fdf71b9e93) for those that
20
+ feel generous :)
21
+ * The usual bunch of README fixes and documentation tweaks. Thanks to everyone who contributed those!
22
+
1
23
  v0.6.4, 2012-05-10 ([changes](https://github.com/colszowka/simplecov/compare/v0.6.3...v0.6.4))
2
24
  -------------------
3
25
 
data/CONTRIBUTING.md ADDED
@@ -0,0 +1,20 @@
1
+ # Making Contributions
2
+
3
+ To fetch & test the library for development, do:
4
+
5
+ $ git clone https://github.com/colszowka/simplecov.git
6
+ $ cd simplecov
7
+ $ bundle
8
+ $ rake appraisal:install
9
+ $ rake appraisal
10
+
11
+ For more information on the appraisal gem (for testing against multiple gem dependency versions), please see
12
+ https://github.com/thoughtbot/appraisal/
13
+
14
+ If you want to contribute, please:
15
+
16
+ * Fork the project.
17
+ * Make your feature addition or bug fix.
18
+ * Add tests for it. This is important so I don't break it in a future version unintentionally.
19
+ * **Bonus Points** go out to anyone who also updates `CHANGELOG.md` :)
20
+ * Send me a pull request on Github.
data/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  SimpleCov [![Build Status](https://secure.travis-ci.org/colszowka/simplecov.png)][Continuous Integration] [![Dependency Status](https://gemnasium.com/colszowka/simplecov.png)][Dependencies]
2
2
  =========
3
- *Code coverage for Ruby 1.9*
3
+ **Code coverage for Ruby 1.9**
4
4
 
5
5
  * [Source Code]
6
6
  * [API documentation]
@@ -8,7 +8,7 @@ SimpleCov [![Build Status](https://secure.travis-ci.org/colszowka/simplecov.png)
8
8
  * [Rubygem]
9
9
  * [Continuous Integration]
10
10
 
11
- [Coverage]: http://www.ruby-doc.org/ruby-1.9/classes/Coverage.html "API doc for Ruby 1.9's Coverage library"
11
+ [Coverage]: http://www.ruby-doc.org/stdlib-1.9.3/libdoc/coverage/rdoc/Coverage.html "API doc for Ruby 1.9's Coverage library"
12
12
  [Source Code]: https://github.com/colszowka/simplecov "Source Code @ GitHub"
13
13
  [API documentation]: http://rubydoc.info/gems/simplecov/frames "RDoc API Documentation at Rubydoc.info"
14
14
  [Configuration]: http://rubydoc.info/gems/simplecov/SimpleCov/Configuration "Configuration options API documentation"
@@ -17,7 +17,9 @@ SimpleCov [![Build Status](https://secure.travis-ci.org/colszowka/simplecov.png)
17
17
  [Continuous Integration]: http://travis-ci.org/colszowka/simplecov "SimpleCov is built around the clock by travis-ci.org"
18
18
  [Dependencies]: https://gemnasium.com/colszowka/simplecov "SimpleCov dependencies on Gemnasium"
19
19
  [simplecov-html]: https://github.com/colszowka/simplecov-html "SimpleCov HTML Formatter Source Code @ GitHub"
20
+ [Pledgie]: http://www.pledgie.com/campaigns/18379
20
21
 
22
+ [![You can support the development of SimpleCov via Pledgie - thanks for your help](http://www.pledgie.com/campaigns/18379.png?skin_name=chrome)][Pledgie]
21
23
 
22
24
  SimpleCov is a code coverage analysis tool for Ruby 1.9. It uses [1.9's built-in Coverage][Coverage] library to gather code
23
25
  coverage data, but makes processing its results much easier by providing a clean API to filter, group, merge, format
@@ -48,8 +50,20 @@ Getting started
48
50
 
49
51
  # Previous content of test helper now starts here
50
52
 
51
- **Note:** If SimpleCov starts after your application code is already loaded (via `require`), it won't be able to track your files and their coverage!
52
- The `SimpleCov.start` **must** be issued **before any of your application code is required!**
53
+ **Note:** If SimpleCov starts after your application code is already loaded (via `require`), it won't be able to
54
+ track your files and their coverage! The `SimpleCov.start` **must** be issued **before any of your application code
55
+ is required!**
56
+
57
+ SimpleCov must be running in the process that you want the code coverage analysis to happen on. When testing a server
58
+ process (i.e. a JSON API endpoint) via a separate test process (i.e. when using Selenium) where you want to see all
59
+ code executed by the `rails server`, and not just code executed in your actual test files, you'll want to add something
60
+ like this to the top of `script/rails`:
61
+
62
+ if ENV['RAILS_ENV'] == 'test'
63
+ require 'simplecov'
64
+ SimpleCov.start 'rails'
65
+ puts "required simplecov"
66
+ end
53
67
 
54
68
  3. Run your tests, open up `coverage/index.html` in your browser and check out what you've missed so far.
55
69
 
@@ -148,6 +162,18 @@ to use SimpleCov with them. Here's an overview of the known ones:
148
162
  <a href="https://github.com/colszowka/simplecov/issues/80">SimpleCov #80</a>
149
163
  </td>
150
164
  </tr>
165
+ <tr>
166
+ <td>
167
+ <b>RubyMine</b>
168
+ </td>
169
+ <td>
170
+ The <a href="https://www.jetbrains.com/ruby/">RubyMine IDE</a> has built-in support for SimpleCov's coverage reports,
171
+ though you might need to explicitly set the output root using `SimpleCov.root('foo/bar/baz')`
172
+ </td>
173
+ <td>
174
+ <a href="https://github.com/colszowka/simplecov/issues/95">SimpleCov #95</a>
175
+ </td>
176
+ </tr>
151
177
  </table>
152
178
 
153
179
  ## Configuring SimpleCov
@@ -264,7 +290,7 @@ Add your groups with:
264
290
 
265
291
  Normally, you want to have your coverage analyzed across ALL of your test suites, right?
266
292
 
267
- Simplecov automatically caches coverage results in your (coverage_path)/resultset.yml. Those results will then
293
+ Simplecov automatically caches coverage results in your (coverage_path)/.resultset.json. Those results will then
268
294
  be automatically merged when generating the result, so when coverage is set up properly for cucumber and your
269
295
  unit / functional / integration tests, all of those test suites will be taken into account when building the
270
296
  coverage report.
@@ -391,6 +417,23 @@ You can define what simplecov should do when your test suite finishes by customi
391
417
 
392
418
  Above is the default behaviour. Do whatever you like instead!
393
419
 
420
+ ### Minimum coverage
421
+
422
+ You can define the minimum coverage percentage expected. SimpleCov will return non-zero if unmet.
423
+
424
+ SimpleCov.minimum_coverage 90
425
+
426
+ ### Maximum coverage drop
427
+
428
+ You can define the maximum coverage drop percentage at once. SimpleCov will return non-zero if exceeded.
429
+
430
+ SimpleCov.maximum_coverage_drop 5
431
+
432
+ ### Refuse dropping coverage
433
+
434
+ You can also entirely refuse dropping coverage between test runs:
435
+
436
+ SimpleCov.refuse_coverage_drop
394
437
 
395
438
  ## Using your own formatter
396
439
 
@@ -404,18 +447,12 @@ being an instance of SimpleCov::Result. Do whatever your wish with that!
404
447
 
405
448
  ## Using multiple formatters
406
449
 
407
- There is currently no built-in support for this, but you could help yourself with a wrapper class:
408
-
409
- class SimpleCov::Formatter::MergedFormatter
410
- def format(result)
411
- SimpleCov::Formatter::HTMLFormatter.new.format(result)
412
- SimpleCov::Formatter::CSVFormatter.new.format(result)
413
- end
414
- end
415
-
416
- Then configure the formatter to use the new merger:
450
+ If you want to use multiple result formats, as of SimpleCov 0.7.0 you can use the built-in MultiFormatter:
417
451
 
418
- SimpleCov.formatter = SimpleCov::Formatter::MergedFormatter
452
+ SimpleCov.formatter = SimpleCov::Formatter::MultiFormatter[
453
+ SimpleCov::Formatter::HTMLFormatter,
454
+ SimpleCov::Formatter::CSVFormatter,
455
+ ]
419
456
 
420
457
  ## Available formatters
421
458
 
@@ -432,7 +469,10 @@ available:
432
469
 
433
470
  CSV formatter for SimpleCov code coverage tool for ruby 1.9+
434
471
 
472
+ #### [simplecov-vim](https://github.com/nyarly/Simplecov-Vim)
473
+ *by Judson Lester*
435
474
 
475
+ A formatter for Simplecov that emits a Vim script to mark up code files with coverage information.
436
476
 
437
477
  ## Ruby version compatibility
438
478
 
@@ -445,27 +485,9 @@ interpreters add the coverage library.
445
485
 
446
486
  SimpleCov is built in [Continuous Integration] on 1.8.7, ree, 1.9.2, 1.9.3.
447
487
 
488
+ ## Contributing
448
489
 
449
-
450
- ## Contributions
451
-
452
- To fetch & test the library for development, do:
453
-
454
- $ git clone https://github.com/colszowka/simplecov.git
455
- $ cd simplecov
456
- $ bundle
457
- $ rake appraisal:install
458
- $ rake appraisal
459
-
460
- For more information on the appraisal gem (for testing against multiple gem dependency versions), please see
461
- https://github.com/thoughtbot/appraisal/
462
-
463
- If you want to contribute, please:
464
-
465
- * Fork the project.
466
- * Make your feature addition or bug fix.
467
- * Add tests for it. This is important so I don't break it in a future version unintentionally.
468
- * Send me a pull request on Github.
490
+ See the [contributing guide](https://github.com/colszowka/simplecov/blob/master/CONTRIBUTING.md).
469
491
 
470
492
  ## Kudos
471
493
 
@@ -0,0 +1,52 @@
1
+ @test_unit @config
2
+ Feature:
3
+
4
+ The formatter for test coverage can be customized
5
+ with the SimpleCov.formatter setting. There are two
6
+ built-in formatters:
7
+ SimpleCov::Formatter::SimpleFormatter is a simple
8
+ formatter returning a string of all files with
9
+ theirs coverages.
10
+ SimpleCov::Formatter::MultiFormatter is a formatter
11
+ used to call multiple formatters at once.
12
+
13
+ Scenario: With SimpleFormatter
14
+ Given SimpleCov for Test/Unit is configured with:
15
+ """
16
+ require 'simplecov'
17
+ SimpleCov.formatter = SimpleCov::Formatter::SimpleFormatter
18
+ SimpleCov.at_exit do
19
+ puts SimpleCov.result.format!
20
+ end
21
+ SimpleCov.start do
22
+ add_group 'Libs', 'lib/faked_project/'
23
+ end
24
+ """
25
+
26
+ When I successfully run `bundle exec rake test`
27
+ Then the output should contain "lib/faked_project/meta_magic.rb (coverage: 100.0%)"
28
+
29
+ Scenario: With MultiFormatter
30
+ Given SimpleCov for Test/Unit is configured with:
31
+ """
32
+ require 'simplecov'
33
+ SimpleCov.formatter = SimpleCov::Formatter::MultiFormatter[
34
+ SimpleCov::Formatter::SimpleFormatter,
35
+ Class.new do
36
+ def format(result)
37
+ raise "Unable to format"
38
+ end
39
+ end
40
+ ]
41
+
42
+ SimpleCov.at_exit do
43
+ puts SimpleCov.result.format!.join
44
+ end
45
+ SimpleCov.start do
46
+ add_group 'Libs', 'lib/faked_project/'
47
+ end
48
+ """
49
+
50
+ When I successfully run `bundle exec rake test`
51
+ Then the output should contain "lib/faked_project/meta_magic.rb (coverage: 100.0%)"
52
+ And the output should match /Formatter [^\s]* failed with RuntimeError: Unable to format/
@@ -0,0 +1,36 @@
1
+ @test_unit @config
2
+ Feature:
3
+
4
+ Exit code should be non-zero if the overall coverage decreases by more than
5
+ the maximum_coverage_drop threshold.
6
+
7
+ Scenario:
8
+ Given SimpleCov for Test/Unit is configured with:
9
+ """
10
+ require 'simplecov'
11
+ SimpleCov.start do
12
+ add_filter 'test.rb'
13
+ maximum_coverage_drop 3.14
14
+ end
15
+ """
16
+
17
+ When I run `bundle exec rake test`
18
+ Then the exit status should be 0
19
+ And a file named "coverage/.last_run.json" should exist
20
+
21
+ Given a file named "lib/faked_project/missed.rb" with:
22
+ """
23
+ class UncoveredSourceCode
24
+ def foo
25
+ never_reached
26
+ rescue => err
27
+ but no one cares about invalid ruby here
28
+ end
29
+ end
30
+ """
31
+
32
+ When I run `bundle exec rake test`
33
+ Then the exit status should not be 0
34
+ And the output should contain "Coverage has dropped by 3.32% since the last time (maximum allowed: 3.14%)."
35
+ And a file named "coverage/.last_run.json" should exist
36
+
@@ -34,7 +34,7 @@ Feature:
34
34
 
35
35
  And I should see the groups:
36
36
  | name | coverage | files |
37
- | All Files | 90.48% | 4 |
37
+ | All Files | 90.48% | 4 |
38
38
 
39
39
  And I should see the source files:
40
40
  | name | coverage |
@@ -0,0 +1,59 @@
1
+ @test_unit @config
2
+ Feature:
3
+
4
+ Exit code should be non-zero if the overall coverage is below the
5
+ minimum_coverage threshold.
6
+
7
+ Scenario:
8
+ Given SimpleCov for Test/Unit is configured with:
9
+ """
10
+ require 'simplecov'
11
+ SimpleCov.start do
12
+ add_filter 'test.rb'
13
+ minimum_coverage 90
14
+ end
15
+ """
16
+
17
+ When I run `bundle exec rake test`
18
+ Then the exit status should not be 0
19
+ And the output should contain "Coverage (88.10%) is below the expected minimum coverage (90.00%)."
20
+
21
+ Scenario:
22
+ Given SimpleCov for Test/Unit is configured with:
23
+ """
24
+ require 'simplecov'
25
+ SimpleCov.start do
26
+ add_filter 'test.rb'
27
+ minimum_coverage 88.11
28
+ end
29
+ """
30
+
31
+ When I run `bundle exec rake test`
32
+ Then the exit status should not be 0
33
+ And the output should contain "Coverage (88.10%) is below the expected minimum coverage (88.11%)."
34
+
35
+ Scenario:
36
+ Given SimpleCov for Test/Unit is configured with:
37
+ """
38
+ require 'simplecov'
39
+ SimpleCov.start do
40
+ add_filter 'test.rb'
41
+ minimum_coverage 88.10
42
+ end
43
+ """
44
+
45
+ When I run `bundle exec rake test`
46
+ Then the exit status should be 0
47
+
48
+ Scenario:
49
+ Given SimpleCov for Test/Unit is configured with:
50
+ """
51
+ require 'simplecov'
52
+ SimpleCov.start do
53
+ add_filter 'test.rb'
54
+ end
55
+ """
56
+
57
+ When I run `bundle exec rake test`
58
+ Then the exit status should be 0
59
+
@@ -0,0 +1,35 @@
1
+ @test_unit @config
2
+ Feature:
3
+
4
+ Exit code should be non-zero if the overall coverage decreases.
5
+
6
+ Scenario:
7
+ Given SimpleCov for Test/Unit is configured with:
8
+ """
9
+ require 'simplecov'
10
+ SimpleCov.start do
11
+ add_filter 'test.rb'
12
+ refuse_coverage_drop
13
+ end
14
+ """
15
+
16
+ When I run `bundle exec rake test`
17
+ Then the exit status should be 0
18
+ And a file named "coverage/.last_run.json" should exist
19
+
20
+ Given a file named "lib/faked_project/missed.rb" with:
21
+ """
22
+ class UncoveredSourceCode
23
+ def foo
24
+ never_reached
25
+ rescue => err
26
+ but no one cares about invalid ruby here
27
+ end
28
+ end
29
+ """
30
+
31
+ When I run `bundle exec rake test`
32
+ Then the exit status should not be 0
33
+ And the output should contain "Coverage has dropped by 3.32% since the last time (maximum allowed: 0.00%)."
34
+ And a file named "coverage/.last_run.json" should exist
35
+
data/lib/simplecov.rb CHANGED
@@ -54,6 +54,14 @@ module SimpleCov
54
54
  self.running = false
55
55
  end
56
56
 
57
+ #
58
+ # Returns nil if the result has not been computed
59
+ # Otherwise, returns the result
60
+ #
61
+ def result?
62
+ defined? @result and @result
63
+ end
64
+
57
65
  #
58
66
  # Applies the configured filters to the given array of SimpleCov::SourceFile items
59
67
  #
@@ -105,12 +113,15 @@ end
105
113
  $LOAD_PATH.unshift(File.join(File.dirname(__FILE__)))
106
114
  require 'simplecov/configuration'
107
115
  SimpleCov.send :extend, SimpleCov::Configuration
116
+ require 'simplecov/exit_codes'
117
+ require 'simplecov/json'
108
118
  require 'simplecov/adapters'
109
119
  require 'simplecov/source_file'
110
120
  require 'simplecov/file_list'
111
121
  require 'simplecov/result'
112
122
  require 'simplecov/filter'
113
123
  require 'simplecov/formatter'
124
+ require 'simplecov/last_run'
114
125
  require 'simplecov/merge_helpers'
115
126
  require 'simplecov/result_merger'
116
127
  require 'simplecov/command_guesser'
@@ -60,7 +60,7 @@ module SimpleCov::Configuration
60
60
  @name ||= SimpleCov::CommandGuesser.guess
61
61
  @name
62
62
  end
63
-
63
+
64
64
  #
65
65
  # Gets or sets the configured formatter.
66
66
  #
@@ -108,7 +108,7 @@ module SimpleCov::Configuration
108
108
  # add_filter 'foobar'
109
109
  # end
110
110
  #
111
- # This is equivalent to SimpleCov.add_filter 'foobar' and thus makes it easier to set a buchn of configure
111
+ # This is equivalent to SimpleCov.add_filter 'foobar' and thus makes it easier to set a bunch of configure
112
112
  # options at once.
113
113
  #
114
114
  def configure(&block)
@@ -138,7 +138,7 @@ module SimpleCov::Configuration
138
138
  # the SimpleCov.root is this.
139
139
  #
140
140
  def project_name(new_name=nil)
141
- return @project_name if @project_name and new_name.nil?
141
+ return @project_name if defined? @project_name and @project_name and new_name.nil?
142
142
  @project_name = new_name if new_name.kind_of?(String)
143
143
  @project_name ||= File.basename(root.split('/').last).capitalize.gsub('_', ' ')
144
144
  end
@@ -148,8 +148,8 @@ module SimpleCov::Configuration
148
148
  # are joined and combined into a single coverage report
149
149
  #
150
150
  def use_merging(use=nil)
151
- @use_merging = use unless use.nil? # Set if param given
152
- @use_merging = true if @use_merging != false
151
+ @use_merging = use unless use.nil?
152
+ @use_merging = true unless defined? @use_merging and @use_merging == false
153
153
  end
154
154
 
155
155
  #
@@ -165,10 +165,38 @@ module SimpleCov::Configuration
165
165
  # Configure with SimpleCov.merge_timeout(3600) # 1hr
166
166
  #
167
167
  def merge_timeout(seconds=nil)
168
- @merge_timeout = seconds if !seconds.nil? and seconds.kind_of?(Fixnum)
168
+ @merge_timeout = seconds if seconds.kind_of?(Fixnum)
169
169
  @merge_timeout ||= 600
170
170
  end
171
171
 
172
+ #
173
+ # Defines the minimum overall coverage required for the testsuite to pass.
174
+ # SimpleCov will return non-zero if the current coverage is below this threshold.
175
+ #
176
+ # Default is 0% (disabled)
177
+ #
178
+ def minimum_coverage(coverage=nil)
179
+ @minimum_coverage ||= (coverage || 0).to_f.round(2)
180
+ end
181
+
182
+ #
183
+ # Defines the maximum coverage drop at once allowed for the testsuite to pass.
184
+ # SimpleCov will return non-zero if the coverage decreases by more than this threshold.
185
+ #
186
+ # Default is 100% (disabled)
187
+ #
188
+ def maximum_coverage_drop(coverage_drop=nil)
189
+ @maximum_coverage_drop ||= (coverage_drop || 100).to_f.round(2)
190
+ end
191
+
192
+ #
193
+ # Refuses any coverage drop. That is, coverage is only allowed to increase.
194
+ # SimpleCov will return non-zero if the coverage decreases.
195
+ #
196
+ def refuse_coverage_drop
197
+ maximum_coverage_drop 0
198
+ end
199
+
172
200
  #
173
201
  # Add a filter to the processing chain.
174
202
  # There are three ways to define a filter:
@@ -195,7 +223,7 @@ module SimpleCov::Configuration
195
223
  def add_group(group_name, filter_argument=nil, &filter_proc)
196
224
  groups[group_name] = parse_filter(filter_argument, &filter_proc)
197
225
  end
198
-
226
+
199
227
  private
200
228
 
201
229
  #
@@ -46,9 +46,38 @@ at_exit do
46
46
  #if it was a SystemExit, use the accompanying status
47
47
  #otherwise set a non-zero status representing termination by some other exception
48
48
  #(see github issue 41)
49
- @exit_status = $!.is_a?(SystemExit) ? $!.status : 1
49
+ @exit_status = $!.is_a?(SystemExit) ? $!.status : SimpleCov::ExitCodes::EXCEPTION
50
50
  end
51
+
51
52
  SimpleCov.at_exit.call
53
+
54
+ if SimpleCov.result? # Result has been computed
55
+ covered_percent = SimpleCov.result.covered_percent.round(2)
56
+
57
+ if @exit_status.to_i == 0 # No other errors
58
+ @exit_status = if covered_percent < SimpleCov.minimum_coverage
59
+ $stderr.puts "Coverage (%.2f%%) is below the expected minimum coverage (%.2f%%)." % \
60
+ [covered_percent, SimpleCov.minimum_coverage]
61
+
62
+ SimpleCov::ExitCodes::MINIMUM_COVERAGE
63
+
64
+ elsif (last_run = SimpleCov::LastRun.read)
65
+ diff = last_run['result']['covered_percent'] - covered_percent
66
+ if diff > SimpleCov.maximum_coverage_drop
67
+ $stderr.puts "Coverage has dropped by %.2f%% since the last time (maximum allowed: %.2f%%)." % \
68
+ [diff, SimpleCov.maximum_coverage_drop]
69
+
70
+ SimpleCov::ExitCodes::MAXIMUM_COVERAGE_DROP
71
+ end
72
+ end
73
+ end
74
+
75
+ metrics = {
76
+ :result => { :covered_percent => covered_percent }
77
+ }
78
+ SimpleCov::LastRun.write(metrics)
79
+ end
80
+
52
81
  exit @exit_status if @exit_status # Force exit with stored status (see github issue #5)
53
82
  end
54
83
 
@@ -0,0 +1,5 @@
1
+ module SimpleCov::ExitCodes
2
+ EXCEPTION = 1
3
+ MINIMUM_COVERAGE = 2
4
+ MAXIMUM_COVERAGE_DROP = 3
5
+ end
@@ -5,3 +5,4 @@ module SimpleCov
5
5
  end
6
6
 
7
7
  require 'simplecov/formatter/simple_formatter'
8
+ require 'simplecov/formatter/multi_formatter'
@@ -0,0 +1,25 @@
1
+ class SimpleCov::Formatter::MultiFormatter
2
+ def self.[](*args)
3
+ Class.new(self) do
4
+ define_method :formatters do
5
+ @formatters ||= args
6
+ end
7
+ end
8
+ end
9
+
10
+ def format(result)
11
+ formatters.map do |formatter|
12
+ begin
13
+ formatter.new.format(result)
14
+ rescue => e
15
+ STDERR.puts("Formatter #{formatter} failed with #{e.class}: #{e.message} (#{e.backtrace.first})")
16
+ nil
17
+ end
18
+ end
19
+ end
20
+
21
+ def formatters
22
+ @formatters ||= []
23
+ end
24
+
25
+ end
@@ -0,0 +1,27 @@
1
+ require 'multi_json'
2
+
3
+ module SimpleCov::JSON
4
+ class << self
5
+ def parse(json)
6
+ # Detect and use available MultiJson API - it changed in v1.3
7
+ if MultiJson.respond_to?(:adapter)
8
+ MultiJson.load(json)
9
+ else
10
+ MultiJson.decode(json)
11
+ end
12
+ end
13
+
14
+ def dump(string)
15
+ if defined? ::JSON
16
+ ::JSON.pretty_generate(string)
17
+ else
18
+ # Detect and use available MultiJson API - it changed in v1.3
19
+ if MultiJson.respond_to?(:adapter)
20
+ MultiJson.dump(string)
21
+ else
22
+ MultiJson.encode(string)
23
+ end
24
+ end
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,20 @@
1
+ module SimpleCov::LastRun
2
+ class << self
3
+ def last_run_path
4
+ File.join(SimpleCov.coverage_path, '.last_run.json')
5
+ end
6
+
7
+ def read
8
+ return nil unless File.exist?(last_run_path)
9
+
10
+ SimpleCov::JSON.parse(File.read(last_run_path))
11
+ end
12
+
13
+ def write(json)
14
+ File.open(last_run_path, "w+") do |f|
15
+ f.puts SimpleCov::JSON.dump(json)
16
+ end
17
+ end
18
+ end
19
+ end
20
+
@@ -1,5 +1,3 @@
1
- require 'multi_json'
2
-
3
1
  #
4
2
  # Singleton that is responsible for caching, loading and merging
5
3
  # SimpleCov::Results into a single result for coverage analysis based
@@ -7,7 +5,7 @@ require 'multi_json'
7
5
  #
8
6
  module SimpleCov::ResultMerger
9
7
  class << self
10
- # The path to the resultset.yml cache file
8
+ # The path to the .resultset.json cache file
11
9
  def resultset_path
12
10
  File.join(SimpleCov.coverage_path, '.resultset.json')
13
11
  end
@@ -15,12 +13,7 @@ module SimpleCov::ResultMerger
15
13
  # Loads the cached resultset from YAML and returns it as a Hash
16
14
  def resultset
17
15
  if stored_data
18
- # Detect and use available MultiJson API - it changed in v1.3
19
- if MultiJson.respond_to?(:adapter)
20
- MultiJson.load(stored_data)
21
- else
22
- MultiJson.decode(stored_data)
23
- end
16
+ SimpleCov::JSON.parse(stored_data)
24
17
  else
25
18
  {}
26
19
  end
@@ -73,16 +66,7 @@ module SimpleCov::ResultMerger
73
66
  command_name, data = result.to_hash.first
74
67
  new_set[command_name] = data
75
68
  File.open(resultset_path, "w+") do |f|
76
- if defined? ::JSON
77
- f.puts JSON.pretty_generate(new_set)
78
- else
79
- # Detect and use available MultiJson API - it changed in v1.3
80
- if MultiJson.respond_to?(:adapter)
81
- f.puts MultiJson.dump(new_set)
82
- else
83
- f.puts MultiJson.encode(new_set)
84
- end
85
- end
69
+ f.puts SimpleCov::JSON.dump(new_set)
86
70
  end
87
71
  true
88
72
  end
@@ -1,3 +1,3 @@
1
1
  module SimpleCov
2
- VERSION = "0.6.4"
2
+ VERSION = "0.7.0"
3
3
  end
data/simplecov.gemspec CHANGED
@@ -13,7 +13,7 @@ Gem::Specification.new do |gem|
13
13
  gem.summary = gem.description
14
14
 
15
15
  gem.add_dependency 'multi_json', '~> 1.0'
16
- gem.add_dependency 'simplecov-html', '~> 0.5.3'
16
+ gem.add_dependency 'simplecov-html', '~> 0.7.0'
17
17
  gem.add_development_dependency 'aruba'
18
18
  gem.add_development_dependency 'capybara'
19
19
  gem.add_development_dependency 'appraisal'
@@ -10,7 +10,7 @@ class Foo
10
10
 
11
11
  #:nocov:
12
12
  def skipped
13
- @foo * 2
13
+ @foo * 2
14
14
  end
15
15
  #:nocov:
16
16
  end
data/test/test_result.rb CHANGED
@@ -21,7 +21,7 @@ class TestResult < Test::Unit::TestCase
21
21
 
22
22
  should "have 3 source files" do
23
23
  assert_equal 3, @result.source_files.count
24
- assert @result.source_files.all? {|s| s.instance_of?(SimpleCov::SourceFile)}, "Not alL instances are of SimpleCov::SourceFile type"
24
+ assert @result.source_files.all? {|s| s.instance_of?(SimpleCov::SourceFile)}, "Not all instances are of SimpleCov::SourceFile type"
25
25
  end
26
26
 
27
27
  should "return an instance of SimpleCov::FileList for source_files and files" do
@@ -111,6 +111,21 @@ class TestResult < Test::Unit::TestCase
111
111
  assert_equal String, @result.format!.class
112
112
  end
113
113
  end
114
+
115
+ context "and multi formatter being used" do
116
+ setup do
117
+ SimpleCov.formatter = SimpleCov::Formatter::MultiFormatter[
118
+ SimpleCov::Formatter::SimpleFormatter,
119
+ SimpleCov::Formatter::SimpleFormatter,
120
+ ]
121
+ end
122
+
123
+ should "return an array containing formatted string with result.format!" do
124
+ formated = @result.format!
125
+ assert_equal 2, formated.count
126
+ assert_equal String, formated.first.class
127
+ end
128
+ end
114
129
  end
115
130
 
116
131
  context "with groups set up that do not match all files" do
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: simplecov
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.6.4
4
+ version: 0.7.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,11 +9,11 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-05-10 00:00:00.000000000 Z
12
+ date: 2012-10-10 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: multi_json
16
- requirement: &70152796757480 !ruby/object:Gem::Requirement
16
+ requirement: !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ~>
@@ -21,21 +21,31 @@ dependencies:
21
21
  version: '1.0'
22
22
  type: :runtime
23
23
  prerelease: false
24
- version_requirements: *70152796757480
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ~>
28
+ - !ruby/object:Gem::Version
29
+ version: '1.0'
25
30
  - !ruby/object:Gem::Dependency
26
31
  name: simplecov-html
27
- requirement: &70152796756780 !ruby/object:Gem::Requirement
32
+ requirement: !ruby/object:Gem::Requirement
28
33
  none: false
29
34
  requirements:
30
35
  - - ~>
31
36
  - !ruby/object:Gem::Version
32
- version: 0.5.3
37
+ version: 0.7.0
33
38
  type: :runtime
34
39
  prerelease: false
35
- version_requirements: *70152796756780
40
+ version_requirements: !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ~>
44
+ - !ruby/object:Gem::Version
45
+ version: 0.7.0
36
46
  - !ruby/object:Gem::Dependency
37
47
  name: aruba
38
- requirement: &70152796756220 !ruby/object:Gem::Requirement
48
+ requirement: !ruby/object:Gem::Requirement
39
49
  none: false
40
50
  requirements:
41
51
  - - ! '>='
@@ -43,10 +53,15 @@ dependencies:
43
53
  version: '0'
44
54
  type: :development
45
55
  prerelease: false
46
- version_requirements: *70152796756220
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ none: false
58
+ requirements:
59
+ - - ! '>='
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
47
62
  - !ruby/object:Gem::Dependency
48
63
  name: capybara
49
- requirement: &70152796755580 !ruby/object:Gem::Requirement
64
+ requirement: !ruby/object:Gem::Requirement
50
65
  none: false
51
66
  requirements:
52
67
  - - ! '>='
@@ -54,10 +69,15 @@ dependencies:
54
69
  version: '0'
55
70
  type: :development
56
71
  prerelease: false
57
- version_requirements: *70152796755580
72
+ version_requirements: !ruby/object:Gem::Requirement
73
+ none: false
74
+ requirements:
75
+ - - ! '>='
76
+ - !ruby/object:Gem::Version
77
+ version: '0'
58
78
  - !ruby/object:Gem::Dependency
59
79
  name: appraisal
60
- requirement: &70152796755020 !ruby/object:Gem::Requirement
80
+ requirement: !ruby/object:Gem::Requirement
61
81
  none: false
62
82
  requirements:
63
83
  - - ! '>='
@@ -65,10 +85,15 @@ dependencies:
65
85
  version: '0'
66
86
  type: :development
67
87
  prerelease: false
68
- version_requirements: *70152796755020
88
+ version_requirements: !ruby/object:Gem::Requirement
89
+ none: false
90
+ requirements:
91
+ - - ! '>='
92
+ - !ruby/object:Gem::Version
93
+ version: '0'
69
94
  - !ruby/object:Gem::Dependency
70
95
  name: cucumber
71
- requirement: &70152796754340 !ruby/object:Gem::Requirement
96
+ requirement: !ruby/object:Gem::Requirement
72
97
  none: false
73
98
  requirements:
74
99
  - - ! '>='
@@ -76,10 +101,15 @@ dependencies:
76
101
  version: 1.1.4
77
102
  type: :development
78
103
  prerelease: false
79
- version_requirements: *70152796754340
104
+ version_requirements: !ruby/object:Gem::Requirement
105
+ none: false
106
+ requirements:
107
+ - - ! '>='
108
+ - !ruby/object:Gem::Version
109
+ version: 1.1.4
80
110
  - !ruby/object:Gem::Dependency
81
111
  name: rake
82
- requirement: &70152796769980 !ruby/object:Gem::Requirement
112
+ requirement: !ruby/object:Gem::Requirement
83
113
  none: false
84
114
  requirements:
85
115
  - - ! '>='
@@ -87,10 +117,15 @@ dependencies:
87
117
  version: '0'
88
118
  type: :development
89
119
  prerelease: false
90
- version_requirements: *70152796769980
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ none: false
122
+ requirements:
123
+ - - ! '>='
124
+ - !ruby/object:Gem::Version
125
+ version: '0'
91
126
  - !ruby/object:Gem::Dependency
92
127
  name: rspec
93
- requirement: &70152796769100 !ruby/object:Gem::Requirement
128
+ requirement: !ruby/object:Gem::Requirement
94
129
  none: false
95
130
  requirements:
96
131
  - - ! '>='
@@ -98,10 +133,15 @@ dependencies:
98
133
  version: '0'
99
134
  type: :development
100
135
  prerelease: false
101
- version_requirements: *70152796769100
136
+ version_requirements: !ruby/object:Gem::Requirement
137
+ none: false
138
+ requirements:
139
+ - - ! '>='
140
+ - !ruby/object:Gem::Version
141
+ version: '0'
102
142
  - !ruby/object:Gem::Dependency
103
143
  name: shoulda
104
- requirement: &70152796768260 !ruby/object:Gem::Requirement
144
+ requirement: !ruby/object:Gem::Requirement
105
145
  none: false
106
146
  requirements:
107
147
  - - ! '>='
@@ -109,7 +149,12 @@ dependencies:
109
149
  version: '0'
110
150
  type: :development
111
151
  prerelease: false
112
- version_requirements: *70152796768260
152
+ version_requirements: !ruby/object:Gem::Requirement
153
+ none: false
154
+ requirements:
155
+ - - ! '>='
156
+ - !ruby/object:Gem::Version
157
+ version: '0'
113
158
  description: Code coverage for Ruby 1.9 with a powerful configuration library and
114
159
  automatic merging of coverage across test suites
115
160
  email:
@@ -120,8 +165,10 @@ extra_rdoc_files: []
120
165
  files:
121
166
  - .gitignore
122
167
  - .travis.yml
168
+ - .yardopts
123
169
  - Appraisals
124
170
  - CHANGELOG.md
171
+ - CONTRIBUTING.md
125
172
  - Gemfile
126
173
  - LICENSE
127
174
  - README.md
@@ -132,12 +179,16 @@ files:
132
179
  - features/config_command_name.feature
133
180
  - features/config_coverage_dir.feature
134
181
  - features/config_deactivate_merging.feature
182
+ - features/config_formatters.feature
135
183
  - features/config_merge_timeout.feature
136
184
  - features/config_nocov_token.feature
137
185
  - features/config_project_name.feature
138
186
  - features/config_styles.feature
139
187
  - features/cucumber_basic.feature
188
+ - features/maximum_coverage_drop.feature
140
189
  - features/merging_test_unit_and_rspec.feature
190
+ - features/minimum_coverage.feature
191
+ - features/refuse_coverage_drop.feature
141
192
  - features/rspec_basic.feature
142
193
  - features/rspec_fails_on_initialization.feature
143
194
  - features/rspec_groups_and_filters_basic.feature
@@ -157,18 +208,20 @@ files:
157
208
  - features/test_unit_without_simplecov.feature
158
209
  - features/unicode_compatiblity.feature
159
210
  - gemfiles/multi_json-legacy.gemfile
160
- - gemfiles/multi_json-legacy.gemfile.lock
161
211
  - gemfiles/multi_json-new.gemfile
162
- - gemfiles/multi_json-new.gemfile.lock
163
212
  - lib/simplecov.rb
164
213
  - lib/simplecov/adapters.rb
165
214
  - lib/simplecov/command_guesser.rb
166
215
  - lib/simplecov/configuration.rb
167
216
  - lib/simplecov/defaults.rb
217
+ - lib/simplecov/exit_codes.rb
168
218
  - lib/simplecov/file_list.rb
169
219
  - lib/simplecov/filter.rb
170
220
  - lib/simplecov/formatter.rb
221
+ - lib/simplecov/formatter/multi_formatter.rb
171
222
  - lib/simplecov/formatter/simple_formatter.rb
223
+ - lib/simplecov/json.rb
224
+ - lib/simplecov/last_run.rb
172
225
  - lib/simplecov/merge_helpers.rb
173
226
  - lib/simplecov/railtie.rb
174
227
  - lib/simplecov/railties/tasks.rake
@@ -233,7 +286,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
233
286
  version: '0'
234
287
  segments:
235
288
  - 0
236
- hash: 1802100492995601719
289
+ hash: -2872785497252698057
237
290
  required_rubygems_version: !ruby/object:Gem::Requirement
238
291
  none: false
239
292
  requirements:
@@ -242,83 +295,12 @@ required_rubygems_version: !ruby/object:Gem::Requirement
242
295
  version: '0'
243
296
  segments:
244
297
  - 0
245
- hash: 1802100492995601719
298
+ hash: -2872785497252698057
246
299
  requirements: []
247
300
  rubyforge_project:
248
- rubygems_version: 1.8.16
301
+ rubygems_version: 1.8.24
249
302
  signing_key:
250
303
  specification_version: 3
251
304
  summary: Code coverage for Ruby 1.9 with a powerful configuration library and automatic
252
305
  merging of coverage across test suites
253
- test_files:
254
- - features/config_adapters.feature
255
- - features/config_autoload.feature
256
- - features/config_command_name.feature
257
- - features/config_coverage_dir.feature
258
- - features/config_deactivate_merging.feature
259
- - features/config_merge_timeout.feature
260
- - features/config_nocov_token.feature
261
- - features/config_project_name.feature
262
- - features/config_styles.feature
263
- - features/cucumber_basic.feature
264
- - features/merging_test_unit_and_rspec.feature
265
- - features/rspec_basic.feature
266
- - features/rspec_fails_on_initialization.feature
267
- - features/rspec_groups_and_filters_basic.feature
268
- - features/rspec_groups_and_filters_complex.feature
269
- - features/rspec_groups_using_filter_class.feature
270
- - features/rspec_without_simplecov.feature
271
- - features/skipping_code_blocks_manually.feature
272
- - features/step_definitions/html_steps.rb
273
- - features/step_definitions/simplecov_steps.rb
274
- - features/step_definitions/transformers.rb
275
- - features/step_definitions/web_steps.rb
276
- - features/support/env.rb
277
- - features/test_unit_basic.feature
278
- - features/test_unit_groups_and_filters_basic.feature
279
- - features/test_unit_groups_and_filters_complex.feature
280
- - features/test_unit_groups_using_filter_class.feature
281
- - features/test_unit_without_simplecov.feature
282
- - features/unicode_compatiblity.feature
283
- - test/faked_project/Gemfile
284
- - test/faked_project/Rakefile
285
- - test/faked_project/cucumber.yml
286
- - test/faked_project/features/step_definitions/my_steps.rb
287
- - test/faked_project/features/support/env.rb
288
- - test/faked_project/features/test_stuff.feature
289
- - test/faked_project/lib/faked_project.rb
290
- - test/faked_project/lib/faked_project/framework_specific.rb
291
- - test/faked_project/lib/faked_project/meta_magic.rb
292
- - test/faked_project/lib/faked_project/some_class.rb
293
- - test/faked_project/spec/faked_spec.rb
294
- - test/faked_project/spec/meta_magic_spec.rb
295
- - test/faked_project/spec/some_class_spec.rb
296
- - test/faked_project/spec/spec_helper.rb
297
- - test/faked_project/test/faked_test.rb
298
- - test/faked_project/test/meta_magic_test.rb
299
- - test/faked_project/test/some_class_test.rb
300
- - test/faked_project/test/test_helper.rb
301
- - test/fixtures/app/controllers/sample_controller.rb
302
- - test/fixtures/app/models/user.rb
303
- - test/fixtures/deleted_source_sample.rb
304
- - test/fixtures/frameworks/rspec_bad.rb
305
- - test/fixtures/frameworks/rspec_good.rb
306
- - test/fixtures/frameworks/testunit_bad.rb
307
- - test/fixtures/frameworks/testunit_good.rb
308
- - test/fixtures/iso-8859.rb
309
- - test/fixtures/resultset1.rb
310
- - test/fixtures/resultset2.rb
311
- - test/fixtures/sample.rb
312
- - test/fixtures/utf-8.rb
313
- - test/helper.rb
314
- - test/shoulda_macros.rb
315
- - test/test_1_8_fallbacks.rb
316
- - test/test_command_guesser.rb
317
- - test/test_deleted_source.rb
318
- - test/test_file_list.rb
319
- - test/test_filters.rb
320
- - test/test_merge_helpers.rb
321
- - test/test_result.rb
322
- - test/test_return_codes.rb
323
- - test/test_source_file.rb
324
- - test/test_source_file_line.rb
306
+ test_files: []
@@ -1,85 +0,0 @@
1
- PATH
2
- remote: /Users/colszowka/Projects/github/colszowka/simplecov
3
- specs:
4
- simplecov (0.6.2)
5
- multi_json (~> 1.0)
6
- simplecov-html (~> 0.5.3)
7
-
8
- GEM
9
- remote: http://rubygems.org/
10
- specs:
11
- addressable (2.2.8)
12
- appraisal (0.4.1)
13
- bundler
14
- rake
15
- aruba (0.4.11)
16
- childprocess (>= 0.2.3)
17
- cucumber (>= 1.1.1)
18
- ffi (>= 1.0.11)
19
- rspec (>= 2.7.0)
20
- builder (3.0.0)
21
- capybara (1.1.2)
22
- mime-types (>= 1.16)
23
- nokogiri (>= 1.3.3)
24
- rack (>= 1.0.0)
25
- rack-test (>= 0.5.4)
26
- selenium-webdriver (~> 2.0)
27
- xpath (~> 0.1.4)
28
- childprocess (0.3.2)
29
- ffi (~> 1.0.6)
30
- cucumber (1.2.0)
31
- builder (>= 2.1.2)
32
- diff-lcs (>= 1.1.3)
33
- gherkin (~> 2.10.0)
34
- json (>= 1.4.6)
35
- diff-lcs (1.1.3)
36
- ffi (1.0.11)
37
- gherkin (2.10.0)
38
- json (>= 1.4.6)
39
- json (1.7.1)
40
- libwebsocket (0.1.3)
41
- addressable
42
- mime-types (1.18)
43
- multi_json (1.0.4)
44
- nokogiri (1.5.2)
45
- rack (1.4.1)
46
- rack-test (0.6.1)
47
- rack (>= 1.0)
48
- rake (0.9.2.2)
49
- rspec (2.10.0)
50
- rspec-core (~> 2.10.0)
51
- rspec-expectations (~> 2.10.0)
52
- rspec-mocks (~> 2.10.0)
53
- rspec-core (2.10.0)
54
- rspec-expectations (2.10.0)
55
- diff-lcs (~> 1.1.3)
56
- rspec-mocks (2.10.1)
57
- rubyzip (0.9.8)
58
- selenium-webdriver (2.21.2)
59
- childprocess (>= 0.2.5)
60
- ffi (~> 1.0)
61
- libwebsocket (~> 0.1.3)
62
- multi_json (~> 1.0)
63
- rubyzip
64
- shoulda (3.0.1)
65
- shoulda-context (~> 1.0.0)
66
- shoulda-matchers (~> 1.0.0)
67
- shoulda-context (1.0.0)
68
- shoulda-matchers (1.0.0)
69
- simplecov-html (0.5.3)
70
- xpath (0.1.4)
71
- nokogiri (~> 1.3)
72
-
73
- PLATFORMS
74
- ruby
75
-
76
- DEPENDENCIES
77
- appraisal
78
- aruba
79
- capybara
80
- cucumber (>= 1.1.4)
81
- multi_json (~> 1.0.0)
82
- rake
83
- rspec
84
- shoulda
85
- simplecov!
@@ -1,85 +0,0 @@
1
- PATH
2
- remote: /Users/colszowka/Projects/github/colszowka/simplecov
3
- specs:
4
- simplecov (0.6.2)
5
- multi_json (~> 1.0)
6
- simplecov-html (~> 0.5.3)
7
-
8
- GEM
9
- remote: http://rubygems.org/
10
- specs:
11
- addressable (2.2.8)
12
- appraisal (0.4.1)
13
- bundler
14
- rake
15
- aruba (0.4.11)
16
- childprocess (>= 0.2.3)
17
- cucumber (>= 1.1.1)
18
- ffi (>= 1.0.11)
19
- rspec (>= 2.7.0)
20
- builder (3.0.0)
21
- capybara (1.1.2)
22
- mime-types (>= 1.16)
23
- nokogiri (>= 1.3.3)
24
- rack (>= 1.0.0)
25
- rack-test (>= 0.5.4)
26
- selenium-webdriver (~> 2.0)
27
- xpath (~> 0.1.4)
28
- childprocess (0.3.2)
29
- ffi (~> 1.0.6)
30
- cucumber (1.2.0)
31
- builder (>= 2.1.2)
32
- diff-lcs (>= 1.1.3)
33
- gherkin (~> 2.10.0)
34
- json (>= 1.4.6)
35
- diff-lcs (1.1.3)
36
- ffi (1.0.11)
37
- gherkin (2.10.0)
38
- json (>= 1.4.6)
39
- json (1.7.1)
40
- libwebsocket (0.1.3)
41
- addressable
42
- mime-types (1.18)
43
- multi_json (1.3.4)
44
- nokogiri (1.5.2)
45
- rack (1.4.1)
46
- rack-test (0.6.1)
47
- rack (>= 1.0)
48
- rake (0.9.2.2)
49
- rspec (2.10.0)
50
- rspec-core (~> 2.10.0)
51
- rspec-expectations (~> 2.10.0)
52
- rspec-mocks (~> 2.10.0)
53
- rspec-core (2.10.0)
54
- rspec-expectations (2.10.0)
55
- diff-lcs (~> 1.1.3)
56
- rspec-mocks (2.10.1)
57
- rubyzip (0.9.8)
58
- selenium-webdriver (2.21.2)
59
- childprocess (>= 0.2.5)
60
- ffi (~> 1.0)
61
- libwebsocket (~> 0.1.3)
62
- multi_json (~> 1.0)
63
- rubyzip
64
- shoulda (3.0.1)
65
- shoulda-context (~> 1.0.0)
66
- shoulda-matchers (~> 1.0.0)
67
- shoulda-context (1.0.0)
68
- shoulda-matchers (1.0.0)
69
- simplecov-html (0.5.3)
70
- xpath (0.1.4)
71
- nokogiri (~> 1.3)
72
-
73
- PLATFORMS
74
- ruby
75
-
76
- DEPENDENCIES
77
- appraisal
78
- aruba
79
- capybara
80
- cucumber (>= 1.1.4)
81
- multi_json (>= 1.3.4)
82
- rake
83
- rspec
84
- shoulda
85
- simplecov!