pork 1.2.3 → 1.2.4

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 095bec1d9b0e5589ead858fce38929b381210569
4
- data.tar.gz: a311efe4b88dd95d9d3121092ebd716227d6e207
3
+ metadata.gz: d777bebd67882252ec22825a62266878e8afb245
4
+ data.tar.gz: 5b59151244bdf671ca2c239b9eb503dd43eb04a4
5
5
  SHA512:
6
- metadata.gz: d580f3bb350761f874bfa061d554cb0d7c2f8a4fd74ac6fe90465c9c06100f89fba3186d452751f8a28bd72ebc4a7727ec0862b0523727cdf463f701531378d1
7
- data.tar.gz: af26e6604565d1b9041b30f0a993cae03c58ac4bcf515f376eb0bdaa187c3d5b3da0b6e683b49a82daae58d8a64fe36b5edb646cf366e618744a0715af17f402
6
+ metadata.gz: 7345227bf8de435f9673db212c5d255dfd4ec2f11f73caa5cd9b2154d99491fe3e159c7d293e3e3b7c42d1696c935dab8c0279ccea4211e26b9a081d6763531a
7
+ data.tar.gz: 11175993f303c48a9984e0f967bb713b1a28c17c214badc2dc73cb98e1f8eada9d2a6ecdb14fc923121b9f01253b18da2cdf286c58c7fbbcba7701a3598af37d
data/CHANGES.md CHANGED
@@ -1,5 +1,16 @@
1
1
  # CHANGES
2
2
 
3
+ ## Pork 1.2.4 -- 2015-04-25
4
+
5
+ ### Enhancement
6
+
7
+ * Introduced `Pork.show_source` to print the source of failing tests. Using
8
+ this feature requires `method_source` installed.
9
+
10
+ ### Bugs fixed
11
+
12
+ * Fixed a potential data race in parallel tests using `should`.
13
+
3
14
  ## Pork 1.2.3 -- 2015-04-16
4
15
 
5
16
  ### Enhancement
data/README.md CHANGED
@@ -148,6 +148,10 @@ end
148
148
  ## REQUIREMENTS:
149
149
 
150
150
  * Tested with MRI (official CRuby), Rubinius and JRuby.
151
+ * (Optional) [method_source][] if you would like to print the source for the
152
+ failing tests.
153
+
154
+ [method_source]: https://github.com/banister/method_source
151
155
 
152
156
  ## INSTALLATION:
153
157
 
@@ -931,6 +935,25 @@ Pork.autorun(true) # enable
931
935
 
932
936
  `require 'pork/auto'` would call `Pork.autorun`
933
937
 
938
+ ### Pork.show_source
939
+
940
+ If you have [method_source][] installed, you could call this and have Pork
941
+ print the source to the failing lines. Here's an example of what Pork would
942
+ print with `Pork.show_source`:
943
+
944
+ ```
945
+ Replicate this test with:
946
+ env PORK_TEST='test/test_pork.rb:12' PORK_MODE=shuffled PORK_SEED=345 /usr/bin/ruby -S test/test_pork.rb
947
+ test/test_pork.rb:13:in `block in <main>'
948
+ would 'print the source' do
949
+ => flunk
950
+ end
951
+ would print the source
952
+ Pork::Error: Flunked
953
+ ```
954
+
955
+ [method_source]: https://github.com/banister/method_source
956
+
934
957
  ### Pork.Rainbows!
935
958
 
936
959
  Have you seen Rainbows!?
@@ -940,6 +963,7 @@ Have you seen Rainbows!?
940
963
  * Chun-Yi Liu (@trantorliu)
941
964
  * Lin Jen-Shin (@godfat)
942
965
  * Josh Kalderimis (@joshk)
966
+ * Yang-Hsing Lin (@mz026)
943
967
 
944
968
  ## LICENSE:
945
969
 
data/Rakefile CHANGED
@@ -10,5 +10,5 @@ Gemgem.init(dir) do |s|
10
10
  require 'pork/version'
11
11
  s.name = 'pork'
12
12
  s.version = Pork::VERSION
13
- %w[muack].each{ |g| s.add_development_dependency(g) }
13
+ %w[method_source].each{ |g| s.add_development_dependency(g) }
14
14
  end
@@ -22,6 +22,11 @@ module Pork
22
22
  Pork::Stat.__send__(:include, Pork::Rainbows)
23
23
  end
24
24
 
25
+ def self.show_source
26
+ require 'pork/extra/show_source'
27
+ Pork::Stat.__send__(:include, Pork::ShowSource)
28
+ end
29
+
25
30
  def self.stat
26
31
  @stat ||= Pork::Stat.new
27
32
  end
@@ -0,0 +1,33 @@
1
+
2
+ require 'method_source'
3
+
4
+ module Pork
5
+ module ShowSource
6
+ def show_source test, err
7
+ source = test.source
8
+ sopath = "#{test.source_location.first}:"
9
+ lowers = test.source_location.last
10
+ uppers = lowers + source.size
11
+ lineno = reject_pork(test, err).find do |backtrace|
12
+ # find the line from the test source, exclude everything else
13
+ next unless backtrace.start_with?(sopath)
14
+ number = backtrace[/(?<=\.rb:)\d+/].to_i
15
+ break number if number >= lowers && number < uppers
16
+ end
17
+ return '' unless lineno # TODO: error might be coming from before block
18
+ lowerl = lineno - lowers
19
+ upperl = MethodSource.expression_at(source, lowerl + 1).
20
+ count("\n") + lowerl
21
+ indent = source[/^\s*/].size
22
+ result = source.each_line.with_index.map do |source_line, index|
23
+ line = source_line[indent..-1] || "\n"
24
+ if index >= lowerl && index < upperl
25
+ highlight_line(" => #{line}")
26
+ else
27
+ backlight_line(" #{line}")
28
+ end
29
+ end.join
30
+ "\n#{result.chomp}"
31
+ end
32
+ end
33
+ end
@@ -25,7 +25,7 @@ module Pork
25
25
  end
26
26
 
27
27
  def would desc=:default, opts={}, &test
28
- @tests << [:would, desc, test, opts]
28
+ @tests << [:would, desc, test || lambda{}, opts]
29
29
  end
30
30
 
31
31
  def execute mode, *args
@@ -67,7 +67,7 @@ module Pork
67
67
  stat.incr_skips
68
68
  stat.case_skip
69
69
  else
70
- err = [e, description_for("would #{desc}"), test.source_location]
70
+ err = [e, description_for("would #{desc}"), test]
71
71
  case e
72
72
  when Failure
73
73
  stat.add_failure(err)
@@ -10,7 +10,7 @@ module Pork
10
10
  def parallel stat=Stat.new, paths=all_paths
11
11
  paths.shuffle.each_slice(cores).map do |paths_slice|
12
12
  Thread.new do
13
- execute(:shuffled, Stat.new, paths_slice)
13
+ execute(:shuffled, Stat.new(stat.io), paths_slice)
14
14
  end
15
15
  end.map(&:value).inject(stat, &:merge)
16
16
  end
@@ -4,7 +4,7 @@ require 'pork/stat'
4
4
  module Pork
5
5
  module BottomupBacktrace
6
6
  private
7
- def backtrace err
7
+ def backtrace *_
8
8
  super.reverse
9
9
  end
10
10
  end
@@ -12,7 +12,7 @@ module Pork
12
12
  gray(super)
13
13
  end
14
14
 
15
- def message msg
15
+ def show_message msg
16
16
  blue(super)
17
17
  end
18
18
 
@@ -20,6 +20,10 @@ module Pork
20
20
  magenta(super)
21
21
  end
22
22
 
23
+ def highlight_line line
24
+ "#{color(41, super.chomp)}\n"
25
+ end
26
+
23
27
  def time_spent
24
28
  cyan(super)
25
29
  end
@@ -40,7 +44,7 @@ module Pork
40
44
  end
41
45
  end
42
46
 
43
- def backtrace err
47
+ def backtrace *_
44
48
  super.map do |b|
45
49
  path, msgs = b.split(':', 2)
46
50
  dir , file = ::File.split(path)
@@ -13,10 +13,12 @@ module Pork
13
13
  def execute mode, stat=Stat.new, *args
14
14
  thread = Thread.current
15
15
  original_group, group = thread.group, ThreadGroup.new
16
+ original_stat = thread[:pork_stat]
16
17
  group.add(thread)
17
18
  thread[:pork_stat] = stat
18
19
  super(mode, stat, *args)
19
20
  ensure
21
+ thread[:pork_stat] = original_stat
20
22
  original_group.add(thread)
21
23
  end
22
24
  end
@@ -55,10 +55,11 @@ module Pork
55
55
 
56
56
  private
57
57
  def report_exceptions
58
- exceptions.reverse_each.map do |(err, msg, source_location)|
59
- "\n #{show_command(source_location)}" \
60
- "\n #{show_backtrace(err)}" \
61
- "\n#{message(msg)}" \
58
+ exceptions.reverse_each.map do |(err, msg, test)|
59
+ "\n #{show_command(test.source_location)}" \
60
+ "\n #{show_backtrace(test, err)}" \
61
+ "#{show_source(test, err)}" \
62
+ "\n#{show_message(msg)}" \
62
63
  "\n#{show_exception(err)}"
63
64
  end
64
65
  end
@@ -71,19 +72,31 @@ module Pork
71
72
  "#{env(source_location)} #{Gem.ruby} -S #{$0} #{ARGV.join(' ')}"
72
73
  end
73
74
 
74
- def show_backtrace err
75
- backtrace(err).join("\n ")
75
+ def show_backtrace test, err
76
+ backtrace(test, err).join("\n ")
76
77
  end
77
78
 
78
- def backtrace err
79
+ def backtrace test, err
79
80
  if $VERBOSE
80
81
  err.backtrace
81
82
  else
82
- strip(err.backtrace.reject{ |l| l =~ %r{/lib/pork(/\w+)*\.rb:\d+} })
83
+ strip(reject_pork(test, err))
83
84
  end
84
85
  end
85
86
 
86
- def message msg
87
+ def show_source _, _
88
+ ''
89
+ end
90
+
91
+ def highlight_line line
92
+ line
93
+ end
94
+
95
+ def backlight_line line
96
+ line
97
+ end
98
+
99
+ def show_message msg
87
100
  msg
88
101
  end
89
102
 
@@ -91,6 +104,15 @@ module Pork
91
104
  "#{err.class}: #{err.message}"
92
105
  end
93
106
 
107
+ def reject_pork test, err
108
+ bt = err.backtrace.reject{ |l| l =~ %r{/lib/pork(/\w+)*\.rb:\d+} }
109
+ if bt.empty?
110
+ ["#{test.source_location.join(':')}:in `block in would'"]
111
+ else
112
+ bt
113
+ end
114
+ end
115
+
94
116
  def strip bt
95
117
  strip_home(strip_cwd(bt))
96
118
  end
@@ -2,6 +2,7 @@
2
2
  require 'pork/auto'
3
3
 
4
4
  Pork.autorun(false)
5
+ Pork.show_source
5
6
 
6
7
  at_exit do
7
8
  Pork.module_eval do
@@ -1,4 +1,4 @@
1
1
 
2
2
  module Pork
3
- VERSION = '1.2.3'
3
+ VERSION = '1.2.4'
4
4
  end
@@ -1,14 +1,14 @@
1
1
  # -*- encoding: utf-8 -*-
2
- # stub: pork 1.2.3 ruby lib
2
+ # stub: pork 1.2.4 ruby lib
3
3
 
4
4
  Gem::Specification.new do |s|
5
5
  s.name = "pork"
6
- s.version = "1.2.3"
6
+ s.version = "1.2.4"
7
7
 
8
8
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
9
9
  s.require_paths = ["lib"]
10
10
  s.authors = ["Lin Jen-Shin (godfat)"]
11
- s.date = "2015-04-16"
11
+ s.date = "2015-04-25"
12
12
  s.description = "Pork -- Simple and clean and modular testing library.\n\nInspired by [Bacon][].\n\n[Bacon]: https://github.com/chneukirchen/bacon"
13
13
  s.email = ["godfat (XD) godfat.org"]
14
14
  s.files = [
@@ -29,6 +29,7 @@ Gem::Specification.new do |s|
29
29
  "lib/pork/executor.rb",
30
30
  "lib/pork/expect.rb",
31
31
  "lib/pork/extra/rainbows.rb",
32
+ "lib/pork/extra/show_source.rb",
32
33
  "lib/pork/imp.rb",
33
34
  "lib/pork/inspect.rb",
34
35
  "lib/pork/mode/parallel.rb",
@@ -49,7 +50,8 @@ Gem::Specification.new do |s|
49
50
  "test/test_nested.rb",
50
51
  "test/test_pork_test.rb",
51
52
  "test/test_readme.rb",
52
- "test/test_should.rb"]
53
+ "test/test_should.rb",
54
+ "test/test_stat.rb"]
53
55
  s.homepage = "https://github.com/godfat/pork"
54
56
  s.licenses = ["Apache License 2.0"]
55
57
  s.rubygems_version = "2.4.6"
@@ -60,17 +62,18 @@ Gem::Specification.new do |s|
60
62
  "test/test_nested.rb",
61
63
  "test/test_pork_test.rb",
62
64
  "test/test_readme.rb",
63
- "test/test_should.rb"]
65
+ "test/test_should.rb",
66
+ "test/test_stat.rb"]
64
67
 
65
68
  if s.respond_to? :specification_version then
66
69
  s.specification_version = 4
67
70
 
68
71
  if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
69
- s.add_development_dependency(%q<muack>, [">= 0"])
72
+ s.add_development_dependency(%q<method_source>, [">= 0"])
70
73
  else
71
- s.add_dependency(%q<muack>, [">= 0"])
74
+ s.add_dependency(%q<method_source>, [">= 0"])
72
75
  end
73
76
  else
74
- s.add_dependency(%q<muack>, [">= 0"])
77
+ s.add_dependency(%q<method_source>, [">= 0"])
75
78
  end
76
79
  end
@@ -52,7 +52,7 @@ describe 'A' do
52
52
 
53
53
  would 'skip' do
54
54
  skip
55
- should.flunk
55
+ flunk
56
56
  end
57
57
  end
58
58
 
@@ -0,0 +1,88 @@
1
+
2
+ require 'pork/test'
3
+ require 'stringio'
4
+
5
+ describe Pork::Stat do
6
+ before do
7
+ @executor = Class.new(Pork::Executor){init}
8
+ end
9
+
10
+ def run
11
+ @stat = @executor.execute(Pork.execute_mode, Pork::Stat.new(StringIO.new))
12
+ expect_one_error
13
+ end
14
+
15
+ def expect_one_error
16
+ expect(@stat.io.string) .eq "\e[31mE\e[0m"
17
+ expect(@stat.tests) .eq 1
18
+ expect(@stat.assertions).eq 0
19
+ expect(@stat.errors) .eq 1
20
+ end
21
+
22
+ would 'always have backtrace' do
23
+ @executor.would
24
+ run
25
+
26
+ err, _, test = @stat.exceptions.first
27
+ err.set_backtrace([])
28
+
29
+ expect(@stat.send(:show_backtrace, test, err)).not.empty?
30
+ end
31
+
32
+ describe 'Pork::Stat#show_source' do
33
+ def verify source
34
+ run
35
+ err, _, test = @stat.exceptions.first
36
+ yield(err) if block_given?
37
+ expect(@stat.send(:show_source, test, err)).include?(source)
38
+ end
39
+
40
+ would 'one line' do
41
+ @executor.would{ flunk }
42
+ verify('=> @executor.would{ flunk }')
43
+ end
44
+
45
+ would 'more lines' do
46
+ @executor.would do
47
+ flunk
48
+ end
49
+ verify(<<-SOURCE.chomp)
50
+ @executor.would do
51
+ \e[41m => flunk\e[0m
52
+ end
53
+ SOURCE
54
+ end
55
+
56
+ would 'multiple lines' do
57
+ @executor.would do
58
+ raise \
59
+ 'error'
60
+ end
61
+ verify(<<-SOURCE.chomp)
62
+ @executor.would do
63
+ \e[41m => raise \\\e[0m
64
+ \e[41m => 'error'\e[0m
65
+ end
66
+ SOURCE
67
+ end
68
+
69
+ would 'show the line in the test, not other methods' do
70
+ @executor.send(:define_method, :f){ flunk }
71
+ @executor.would do
72
+ f
73
+ end
74
+ verify(<<-SOURCE.chomp)
75
+ @executor.would do
76
+ \e[41m => f\e[0m
77
+ end
78
+ SOURCE
79
+ end
80
+
81
+ would 'show the line in the test, even if it is from 3rd party' do
82
+ @executor.would{ flunk }
83
+ verify("=> @executor.would{ flunk }") do |err|
84
+ err.set_backtrace(err.backtrace.unshift("bad.rb:#{__LINE__}"))
85
+ end
86
+ end
87
+ end
88
+ end
metadata CHANGED
@@ -1,17 +1,17 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: pork
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.2.3
4
+ version: 1.2.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Lin Jen-Shin (godfat)
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-04-16 00:00:00.000000000 Z
11
+ date: 2015-04-25 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
- name: muack
14
+ name: method_source
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
17
  - - ">="
@@ -53,6 +53,7 @@ files:
53
53
  - lib/pork/executor.rb
54
54
  - lib/pork/expect.rb
55
55
  - lib/pork/extra/rainbows.rb
56
+ - lib/pork/extra/show_source.rb
56
57
  - lib/pork/imp.rb
57
58
  - lib/pork/inspect.rb
58
59
  - lib/pork/mode/parallel.rb
@@ -74,6 +75,7 @@ files:
74
75
  - test/test_pork_test.rb
75
76
  - test/test_readme.rb
76
77
  - test/test_should.rb
78
+ - test/test_stat.rb
77
79
  homepage: https://github.com/godfat/pork
78
80
  licenses:
79
81
  - Apache License 2.0
@@ -105,3 +107,4 @@ test_files:
105
107
  - test/test_pork_test.rb
106
108
  - test/test_readme.rb
107
109
  - test/test_should.rb
110
+ - test/test_stat.rb