rspec-longrun 1.0.1 → 2.0.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: b7b0d901e0ecd2a67b69060390b5264b9f76b3790017bf6078e0dc58ad8149b9
4
+ data.tar.gz: ae6d4575321836e4543825ad7ef9f478a71ed763a78f663b58ffe128bf7ab53c
5
+ SHA512:
6
+ metadata.gz: 0e1046bb744651efb275009ba7ddae501689ceab9e6702dbed4a4453d42250980fa82f47e345e0483545197f77d2f866a1f568b67560dff2877af10460793cd4
7
+ data.tar.gz: 04adfebac8fd026560a8dfb675a75f4b01eeb130dba732ff228acf7a5f0878982905ad1c57ea868ee666ba9d0117e701969dafbe665b0f5b0ac32a6b6ff9b3e1
@@ -1,7 +1,3 @@
1
1
  language: ruby
2
2
  env:
3
- - RSPEC_VERSION="~> 2.10.0"
4
- - RSPEC_VERSION="~> 2.11.0"
5
- - RSPEC_VERSION="~> 2.12.0"
6
- - RSPEC_VERSION="~> 2.13.0"
7
- - RSPEC_VERSION="~> 2.14.0"
3
+ - RSPEC_VERSION="~> 3.7.0"
data/README.md CHANGED
@@ -1,5 +1,8 @@
1
1
  # RSpec::Longrun
2
2
 
3
+ [![Gem Version](https://badge.fury.io/rb/rspec-longrun.png)](http://badge.fury.io/rb/rspec-longrun)
4
+ [![Build Status](https://secure.travis-ci.org/mdub/rspec-longrun.png?branch=master)](http://travis-ci.org/mdub/rspec-longrun)
5
+
3
6
  RSpec is a fine unit-testing framework, but is also handy for acceptance and integration tests. But the default report formatters make it difficult to track progress of such long-running tests.
4
7
 
5
8
  The RSpec::Longrun::Formatter outputs the name of each test as it starts, rather than waiting until it passes or fails. It also provides a mechanism for reporting on progress of a test while it is still executing.
@@ -34,29 +37,31 @@ The resulting test output looks something like:
34
37
 
35
38
  Include RSpec::Longrun::DSL to define the 'step' method, which can be used to group blocks of code within the context of a large test. For example:
36
39
 
37
- describe "Account management" do
40
+ ```ruby
41
+ describe "Account management" do
38
42
 
39
- include RSpec::Longrun::DSL # <-- important
43
+ include RSpec::Longrun::DSL # <-- important
40
44
 
41
- example "Log in and alter preferences" do
45
+ example "Log in and alter preferences" do
42
46
 
43
- step "Log in" do
44
- ui.go_home
45
- ui.authenticate_as "joe", "fnord"
46
- end
47
+ step "Log in" do
48
+ ui.go_home
49
+ ui.authenticate_as "joe", "fnord"
50
+ end
47
51
 
48
- step "Navigate to preferences page" do
49
- ui.nav.prefs_link.click
50
- end
52
+ step "Navigate to preferences page" do
53
+ ui.nav.prefs_link.click
54
+ end
51
55
 
52
- step "Change preferences" do
53
- ui.prefs_pane.enter_defaults
54
- ui.prefs_pane.save
55
- end
56
+ step "Change preferences" do
57
+ ui.prefs_pane.enter_defaults
58
+ ui.prefs_pane.save
59
+ end
56
60
 
57
- end
61
+ end
58
62
 
59
- end
63
+ end
64
+ ```
60
65
 
61
66
  The resulting test output looks something like:
62
67
 
data/Rakefile CHANGED
@@ -5,7 +5,7 @@ require "rspec/core/rake_task"
5
5
 
6
6
  RSpec::Core::RakeTask.new(:spec) do |t|
7
7
  t.pattern = 'spec/**/*_spec.rb'
8
- t.rspec_opts = ["--colour", "--format", "nested"]
8
+ t.rspec_opts = ["--colour", "--format", "documentation"]
9
9
  end
10
10
 
11
11
  task :default => :spec
@@ -12,7 +12,7 @@ describe "Underpants gnomes" do
12
12
  sleep 0.3 # thinking
13
13
  end
14
14
  step "Profit!" do
15
- pending "need a real business plan"
15
+ skip "need a real business plan"
16
16
  end
17
17
  end
18
18
 
@@ -0,0 +1,13 @@
1
+ require 'rspec'
2
+ require 'rspec/longrun'
3
+
4
+ RSpec.describe("foo") do
5
+ describe "bar" do
6
+ describe "baz" do
7
+ it "bleeds"
8
+ end
9
+ end
10
+ describe "qux" do
11
+ it "hurts"
12
+ end
13
+ end
@@ -0,0 +1,13 @@
1
+ require 'rspec'
2
+ require 'rspec/longrun'
3
+
4
+ RSpec.describe("suite") do
5
+ example "works" do; end
6
+ example "is unimplemented" do
7
+ pending "implement me"
8
+ raise "not implemented"
9
+ end
10
+ example "fails" do
11
+ fail "no worky"
12
+ end
13
+ end
@@ -0,0 +1,21 @@
1
+ require 'rspec'
2
+ require 'rspec/longrun'
3
+
4
+ RSpec.describe("stepped") do
5
+
6
+ include RSpec::Longrun::DSL
7
+
8
+ example "has steps" do
9
+ step "Collect underpants" do
10
+ end
11
+ step "Er ..." do
12
+ step "(thinking)" do
13
+ end
14
+ end
15
+ step "Profit!" do
16
+ pending "a real plan"
17
+ fail
18
+ end
19
+ end
20
+
21
+ end
@@ -1,23 +1,37 @@
1
- require 'rspec/longrun/core_ext'
2
-
3
- # extend rspec-core with support for "steps"
4
-
5
1
  module RSpec
6
2
  module Longrun
7
3
  module DSL
8
4
 
9
- private
10
-
11
5
  def step(description)
12
- pending(description) unless block_given?
6
+ rspec_longrun_formatter.step_started(description)
13
7
  begin
14
- @_rspec_reporter.step_started(description)
15
- yield
16
- ensure
17
- @_rspec_reporter.step_finished(description)
8
+ yield if block_given?
9
+ rspec_longrun_formatter.step_finished
10
+ rescue => e
11
+ rspec_longrun_formatter.step_errored(e)
12
+ raise e
18
13
  end
19
14
  end
20
15
 
16
+ private
17
+
18
+ def rspec_longrun_formatter
19
+ Thread.current["rspec.longrun.formatter"] || NullStepFormatter.new
20
+ end
21
+
22
+ class NullStepFormatter
23
+
24
+ def step_started(_description)
25
+ end
26
+
27
+ def step_finished
28
+ end
29
+
30
+ def step_errored(_e)
31
+ end
32
+
33
+ end
34
+
21
35
  end
22
36
  end
23
37
  end
@@ -5,64 +5,63 @@ module RSpec
5
5
 
6
6
  class Formatter < RSpec::Core::Formatters::BaseTextFormatter
7
7
 
8
+ RSpec::Core::Formatters.register self,
9
+ :start,
10
+ :example_group_started, :example_group_finished,
11
+ :example_started, :example_passed,
12
+ :example_pending, :example_failed
13
+
8
14
  def initialize(output)
9
15
  super(output)
10
16
  @blocks = [Block.new(true)]
11
17
  end
12
18
 
13
- def example_group_started(example_group)
14
- super(example_group)
15
- begin_block(example_group.description)
19
+ def start(notification)
20
+ Thread.current["rspec.longrun.formatter"] = self
21
+ end
22
+
23
+ def example_group_started(notification)
24
+ begin_block(notification.group.description)
16
25
  end
17
26
 
18
- def example_group_finished(example_group)
19
- super(example_group)
27
+ def example_group_finished(notification)
20
28
  end_block
21
29
  end
22
30
 
23
- def example_started(example)
24
- super(example)
25
- begin_block(detail_color(example.description))
31
+ def example_started(notification)
32
+ begin_block(wrap(notification.example.description, :detail))
26
33
  end
27
34
 
28
- def example_passed(example)
29
- super(example)
30
- end_block(success_color("OK"))
35
+ def example_passed(notification)
36
+ end_block(wrap("OK", :success))
31
37
  end
32
38
 
33
- def example_pending(example)
34
- super(example)
35
- end_block(pending_color("PENDING: " + example.execution_result[:pending_message]))
39
+ def example_pending(notification)
40
+ end_block(wrap("PENDING: " + notification.example.execution_result.pending_message, :pending))
36
41
  end
37
42
 
38
- def example_failed(example)
39
- super(example)
40
- end_block(failure_color("FAILED"))
43
+ def example_failed(notification)
44
+ end_block(wrap("FAILED", :failure))
41
45
  end
42
46
 
43
47
  def step_started(description)
44
48
  begin_block(description)
45
49
  end
46
50
 
47
- def step_finished(description)
48
- end_block
51
+ def step_finished
52
+ end_block(wrap("✓", :success))
49
53
  end
50
54
 
51
- protected
52
-
53
- def self.alias_missing_method(method_name, fallback_method_name)
54
- unless method_defined?(method_name)
55
- alias_method method_name, fallback_method_name
56
- end
55
+ def step_errored(e)
56
+ end_block(wrap("✗", :failure))
57
57
  end
58
58
 
59
- alias_missing_method :detail_color, :cyan
60
- alias_missing_method :success_color, :green
61
- alias_missing_method :pending_color, :yellow
62
- alias_missing_method :failure_color, :red
63
-
64
59
  private
65
60
 
61
+ def wrap(*args)
62
+ RSpec::Core::Formatters::ConsoleCodes.wrap(*args)
63
+ end
64
+
66
65
  def current_block
67
66
  @blocks.last
68
67
  end
@@ -98,7 +97,8 @@ module RSpec
98
97
  end
99
98
 
100
99
  def faint(text)
101
- color(text, "\e[2m")
100
+ return text unless RSpec.configuration.color_enabled?
101
+ "\e[2m#{text}\e[0m"
102
102
  end
103
103
 
104
104
  class Block
@@ -1,5 +1,5 @@
1
1
  module RSpec
2
2
  module Longrun
3
- VERSION = "1.0.1"
3
+ VERSION = "2.0.0"
4
4
  end
5
5
  end
@@ -13,6 +13,6 @@ Gem::Specification.new do |gem|
13
13
  gem.require_paths = ["lib"]
14
14
  gem.version = RSpec::Longrun::VERSION
15
15
 
16
- gem.add_runtime_dependency("rspec-core", ">= 2.10.0")
16
+ gem.add_runtime_dependency("rspec-core", ">= 3.7.0")
17
17
 
18
18
  end
@@ -4,17 +4,6 @@ require "stringio"
4
4
  describe RSpec::Longrun::Formatter do
5
5
 
6
6
  let(:output_buffer) { StringIO.new }
7
- let(:formatter) { described_class.new(output_buffer) }
8
- let(:reporter) { RSpec::Core::Reporter.new(formatter) }
9
-
10
- def undent(raw)
11
- if raw =~ /\A( +)/
12
- indent = $1
13
- raw.gsub(/^#{indent}/, '').gsub(/ +$/, '')
14
- else
15
- raw
16
- end
17
- end
18
7
 
19
8
  def output
20
9
  output_buffer.string
@@ -24,46 +13,47 @@ describe RSpec::Longrun::Formatter do
24
13
  output.gsub(/0\.\d\ds/, "N.NNs")
25
14
  end
26
15
 
27
- module NoColor
16
+ let(:formatter) { described_class.new(output_buffer) }
28
17
 
29
- def color_enabled?
30
- false
31
- end
18
+ before do
19
+ allow(RSpec.configuration).to receive(:color_enabled?).and_return(false)
20
+ end
32
21
 
22
+ def example_group(desc)
23
+ notification = double(group: double(description: desc))
24
+ formatter.example_group_started(notification)
25
+ yield if block_given?
26
+ formatter.example_group_finished(notification)
33
27
  end
34
28
 
35
- before do
36
- formatter.extend(NoColor)
37
- suite.run(reporter)
29
+ def example(desc, result, pending_message = nil)
30
+ notification = double(
31
+ example: double(
32
+ description: desc,
33
+ execution_result: double(pending_message: pending_message)
34
+ )
35
+ )
36
+ formatter.example_started(notification)
37
+ yield if block_given?
38
+ formatter.public_send("example_#{result}", notification)
39
+ end
40
+
41
+ def step(desc)
42
+ formatter.step_started(desc)
43
+ yield if block_given?
44
+ formatter.step_finished
38
45
  end
39
46
 
40
- context "for nested example groups" do
47
+ context "given an empty example group" do
41
48
 
42
- let(:suite) do
43
- RSpec::Core::ExampleGroup.describe("foo") do
44
- describe "bar" do
45
- describe "baz" do
46
- it "bleeds"
47
- end
48
- end
49
- describe "qux" do
50
- it "hurts"
51
- end
49
+ before do
50
+ example_group "suite" do
52
51
  end
53
52
  end
54
53
 
55
- it "outputs nested group names" do
56
- normalized_output.should eql(undent(<<-EOF))
57
- foo {
58
- bar {
59
- baz {
60
- bleeds PENDING: Not yet implemented (N.NNs)
61
- } (N.NNs)
62
- } (N.NNs)
63
- qux {
64
- hurts PENDING: Not yet implemented (N.NNs)
65
- } (N.NNs)
66
- } (N.NNs)
54
+ it "outputs suite entry" do
55
+ expect(normalized_output).to eql(<<~EOF)
56
+ suite (N.NNs)
67
57
  EOF
68
58
  end
69
59
 
@@ -71,24 +61,46 @@ describe RSpec::Longrun::Formatter do
71
61
 
72
62
  context "with examples" do
73
63
 
74
- let(:suite) do
75
- RSpec::Core::ExampleGroup.describe("suite") do
76
- example "works" do; end
77
- example "is unimplemented" do
78
- pending "implement me"
79
- end
80
- example "fails" do
81
- fail "no worky"
82
- end
64
+ before do
65
+ example_group "suite" do
66
+ example "works", :passed
67
+ example "fails", :failed
68
+ example "is unimplemented", :pending, "implement me"
83
69
  end
84
70
  end
85
71
 
86
72
  it "outputs example names and status" do
87
- normalized_output.should eql(undent(<<-EOF))
73
+ expect(normalized_output).to eql(<<~EOF)
88
74
  suite {
89
75
  works OK (N.NNs)
90
- is unimplemented PENDING: implement me (N.NNs)
91
76
  fails FAILED (N.NNs)
77
+ is unimplemented PENDING: implement me (N.NNs)
78
+ } (N.NNs)
79
+ EOF
80
+ end
81
+
82
+ end
83
+
84
+ context "with nested example groups" do
85
+
86
+ before do
87
+ example_group "top" do
88
+ example_group "A" do
89
+ end
90
+ example_group "B" do
91
+ example_group "1" do
92
+ end
93
+ end
94
+ end
95
+ end
96
+
97
+ it "outputs nested group names" do
98
+ expect(normalized_output).to eql(<<~EOF)
99
+ top {
100
+ A (N.NNs)
101
+ B {
102
+ 1 (N.NNs)
103
+ } (N.NNs)
92
104
  } (N.NNs)
93
105
  EOF
94
106
  end
@@ -97,10 +109,9 @@ describe RSpec::Longrun::Formatter do
97
109
 
98
110
  context "with steps" do
99
111
 
100
- let(:suite) do
101
- RSpec::Core::ExampleGroup.describe("suite") do
102
- include RSpec::Longrun::DSL
103
- example "has steps" do
112
+ before do
113
+ example_group "suite" do
114
+ example "has steps", :passed do
104
115
  step "Collect underpants" do
105
116
  end
106
117
  step "Er ..." do
@@ -113,14 +124,15 @@ describe RSpec::Longrun::Formatter do
113
124
  end
114
125
 
115
126
  it "outputs steps" do
116
- normalized_output.should eql(undent(<<-EOF))
127
+ expect(normalized_output).to eql(<<~EOF)
117
128
  suite {
118
129
  has steps {
119
- Collect underpants (N.NNs)
130
+ Collect underpants (N.NNs)
120
131
  Er ... {
121
- (thinking) (N.NNs)
122
- } (N.NNs)
123
- } PENDING: Profit! (N.NNs)
132
+ (thinking) (N.NNs)
133
+ } (N.NNs)
134
+ Profit! (N.NNs)
135
+ } OK (N.NNs)
124
136
  } (N.NNs)
125
137
  EOF
126
138
  end
metadata CHANGED
@@ -1,32 +1,29 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rspec-longrun
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.1
5
- prerelease:
4
+ version: 2.0.0
6
5
  platform: ruby
7
6
  authors:
8
7
  - Mike Williams
9
8
  autorequire:
10
9
  bindir: bin
11
10
  cert_chain: []
12
- date: 2014-04-22 00:00:00.000000000 Z
11
+ date: 2018-06-08 00:00:00.000000000 Z
13
12
  dependencies:
14
13
  - !ruby/object:Gem::Dependency
15
14
  name: rspec-core
16
15
  requirement: !ruby/object:Gem::Requirement
17
- none: false
18
16
  requirements:
19
- - - ! '>='
17
+ - - ">="
20
18
  - !ruby/object:Gem::Version
21
- version: 2.10.0
19
+ version: 3.7.0
22
20
  type: :runtime
23
21
  prerelease: false
24
22
  version_requirements: !ruby/object:Gem::Requirement
25
- none: false
26
23
  requirements:
27
- - - ! '>='
24
+ - - ">="
28
25
  - !ruby/object:Gem::Version
29
- version: 2.10.0
26
+ version: 3.7.0
30
27
  description:
31
28
  email:
32
29
  - mdub@dogbiscuit.org
@@ -34,16 +31,18 @@ executables: []
34
31
  extensions: []
35
32
  extra_rdoc_files: []
36
33
  files:
37
- - .gitignore
38
- - .rspec
39
- - .travis.yml
34
+ - ".gitignore"
35
+ - ".rspec"
36
+ - ".travis.yml"
40
37
  - Gemfile
41
38
  - LICENSE
42
39
  - README.md
43
40
  - Rakefile
44
41
  - examples/example_spec.rb
42
+ - examples/nested_spec.rb
43
+ - examples/status_spec.rb
44
+ - examples/stepped_spec.rb
45
45
  - lib/rspec/longrun.rb
46
- - lib/rspec/longrun/core_ext.rb
47
46
  - lib/rspec/longrun/dsl.rb
48
47
  - lib/rspec/longrun/formatter.rb
49
48
  - lib/rspec/longrun/version.rb
@@ -51,33 +50,26 @@ files:
51
50
  - spec/rspec/longrun/formatter_spec.rb
52
51
  homepage: http://github.com/mdub/rspec-longrun
53
52
  licenses: []
53
+ metadata: {}
54
54
  post_install_message:
55
55
  rdoc_options: []
56
56
  require_paths:
57
57
  - lib
58
58
  required_ruby_version: !ruby/object:Gem::Requirement
59
- none: false
60
59
  requirements:
61
- - - ! '>='
60
+ - - ">="
62
61
  - !ruby/object:Gem::Version
63
62
  version: '0'
64
- segments:
65
- - 0
66
- hash: 1047382986774099312
67
63
  required_rubygems_version: !ruby/object:Gem::Requirement
68
- none: false
69
64
  requirements:
70
- - - ! '>='
65
+ - - ">="
71
66
  - !ruby/object:Gem::Version
72
67
  version: '0'
73
- segments:
74
- - 0
75
- hash: 1047382986774099312
76
68
  requirements: []
77
69
  rubyforge_project:
78
- rubygems_version: 1.8.23.2
70
+ rubygems_version: 2.7.6
79
71
  signing_key:
80
- specification_version: 3
72
+ specification_version: 4
81
73
  summary: An RSpec formatter for long-running specs.
82
74
  test_files:
83
75
  - spec/rspec/longrun/formatter_spec.rb
@@ -1,50 +0,0 @@
1
- require 'rspec/core'
2
- require 'rspec/core/formatters/base_formatter'
3
-
4
- # extend rspec-core with support for "steps"
5
- module RSpec::Core
6
-
7
- class Reporter
8
-
9
- if defined?(NOTIFICATIONS)
10
- NOTIFICATIONS.push("step_started", "step_finished")
11
- end
12
-
13
- def step_started(description)
14
- notify :step_started, description
15
- end
16
-
17
- def step_finished(description)
18
- notify :step_finished, description
19
- end
20
-
21
- end
22
-
23
- unless defined?(Reporter::NOTIFICATIONS)
24
-
25
- class Formatters::BaseFormatter
26
-
27
- def step_started(description)
28
- end
29
-
30
- def step_finished(description)
31
- end
32
-
33
- end
34
-
35
- end
36
-
37
- class Example
38
-
39
- private
40
-
41
- alias :start_without_reporter :start
42
-
43
- def start(reporter)
44
- start_without_reporter(reporter)
45
- @example_group_instance.instance_variable_set(:@_rspec_reporter, reporter)
46
- end
47
-
48
- end
49
-
50
- end