rspec-support 3.2.2 → 3.3.0

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: 60a2be459dac1db7bb1f0e0744c43f44096ba5f1
4
- data.tar.gz: d0aa42011432477ee8022bba5dd6ab339639e1f8
3
+ metadata.gz: a74da896e672529b21b1753eb56081e6f5f8f5d7
4
+ data.tar.gz: 9b5f92e7bf487974d55cf1e086a113479542554d
5
5
  SHA512:
6
- metadata.gz: b68e8f0bc090208f255295646f95c41bbb925fe7068615ab82058bbfa0101895d4b94ae3f4482fa1270dc7e9532b053cc9c735918955e1cf46fe4664b0dd3043
7
- data.tar.gz: 96062033ec6dfc37bd8d3e430353839c55f04dbaf3f6385b69190e8bee61d821ad966809904f499ff5bc7c7685f4d7d478b8b02f09ec405a22a45cae3e2b3659
6
+ metadata.gz: 2ea71400d27d790bc32e8a208e4d371f11a4c32a1941a77013f87ae94bc309368746b2fd893397b284ffa95aeb75fc099c06a027611a2b79ce73705864cdaf2e
7
+ data.tar.gz: 8902798fc1ebc40eb8c0b6d407307520434c4bf0ac1f322890d5b2d53214b45bb154fc6d1e9dc296d3ee3c6541a562d17529e8515f6c845ac3a1dc518c272dab
checksums.yaml.gz.sig CHANGED
Binary file
data.tar.gz.sig CHANGED
Binary file
data/Changelog.md CHANGED
@@ -1,4 +1,24 @@
1
+ ### 3.3.0 / 2015-06-12
2
+ [Full Changelog](http://github.com/rspec/rspec-support/compare/v3.2.2...v3.3.0)
3
+
4
+ Enhancements:
5
+
6
+ * Improve formatting of arrays and hashes in failure messages so they
7
+ use our custom formatting of matchers, time objects, etc.
8
+ (Myron Marston, Nicholas Chmielewski, #205)
9
+ * Use improved formatting for diffs as well. (Nicholas Chmielewski, #205)
10
+
11
+ Bug Fixes:
12
+
13
+ * Fix `FuzzyMatcher` so that it checks `expected == actual` rather than
14
+ `actual == expected`, which avoids errors in situations where the
15
+ `actual` object's `==` is improperly implemented to assume that only
16
+ objects of the same type will be given. This allows rspec-mocks'
17
+ `anything` to match against objects with buggy `==` definitions.
18
+ (Myron Marston, #193)
19
+
1
20
  ### 3.2.2 / 2015-02-23
21
+ [Full Changelog](http://github.com/rspec/rspec-support/compare/v3.2.1...v3.2.2)
2
22
 
3
23
  Bug Fixes:
4
24
 
data/lib/rspec/support.rb CHANGED
@@ -72,5 +72,40 @@ module RSpec
72
72
  end
73
73
  end
74
74
  end
75
+
76
+ # A single thread local variable so we don't excessively pollute that namespace.
77
+ def self.thread_local_data
78
+ Thread.current[:__rspec] ||= {}
79
+ end
80
+
81
+ def self.failure_notifier=(callable)
82
+ thread_local_data[:failure_notifier] = callable
83
+ end
84
+
85
+ # @private
86
+ DEFAULT_FAILURE_NOTIFIER = lambda { |failure, _opts| raise failure }
87
+
88
+ def self.failure_notifier
89
+ thread_local_data[:failure_notifier] || DEFAULT_FAILURE_NOTIFIER
90
+ end
91
+
92
+ def self.notify_failure(failure, options={})
93
+ failure_notifier.call(failure, options)
94
+ end
95
+
96
+ def self.with_failure_notifier(callable)
97
+ orig_notifier = failure_notifier
98
+ self.failure_notifier = callable
99
+ yield
100
+ ensure
101
+ self.failure_notifier = orig_notifier
102
+ end
103
+
104
+ # The Differ is only needed when a a spec fails with a diffable failure.
105
+ # In the more common case of all specs passing or the only failures being
106
+ # non-diffable, we can avoid the extra cost of loading the differ, diff-lcs,
107
+ # pp, etc by avoiding an unnecessary require. Instead, autoload will take
108
+ # care of loading the differ on first use.
109
+ autoload :Differ, "rspec/support/differ"
75
110
  end
76
111
  end
@@ -1,5 +1,6 @@
1
1
  RSpec::Support.require_rspec_support 'encoded_string'
2
2
  RSpec::Support.require_rspec_support 'hunk_generator'
3
+ RSpec::Support.require_rspec_support "object_formatter"
3
4
 
4
5
  require 'pp'
5
6
 
@@ -25,7 +26,7 @@ module RSpec
25
26
 
26
27
  # rubocop:disable MethodLength
27
28
  def diff_as_string(actual, expected)
28
- encoding = pick_encoding(actual, expected)
29
+ encoding = EncodedString.pick_encoding(actual, expected)
29
30
 
30
31
  actual = EncodedString.new(actual, encoding)
31
32
  expected = EncodedString.new(expected, encoding)
@@ -59,8 +60,9 @@ module RSpec
59
60
  diff_as_string(actual_as_string, expected_as_string)
60
61
  end
61
62
 
62
- attr_reader :color
63
- alias_method :color?, :color
63
+ def color?
64
+ @color
65
+ end
64
66
 
65
67
  def initialize(opts={})
66
68
  @color = opts.fetch(:color, false)
@@ -177,12 +179,9 @@ module RSpec
177
179
  object = @object_preparer.call(object)
178
180
  case object
179
181
  when Hash
180
- object.keys.sort_by { |k| k.to_s }.map do |key|
181
- pp_key = PP.singleline_pp(key, "")
182
- pp_value = PP.singleline_pp(object[key], "")
183
-
184
- "#{pp_key} => #{pp_value},"
185
- end.join("\n")
182
+ hash_to_string(object)
183
+ when Array
184
+ PP.pp(ObjectFormatter.prepare_for_inspection(object), "")
186
185
  when String
187
186
  object =~ /\n/ ? object : object.inspect
188
187
  else
@@ -190,13 +189,14 @@ module RSpec
190
189
  end
191
190
  end
192
191
 
193
- if String.method_defined?(:encoding)
194
- def pick_encoding(source_a, source_b)
195
- Encoding.compatible?(source_a, source_b) || Encoding.default_external
196
- end
197
- else
198
- def pick_encoding(_source_a, _source_b)
199
- end
192
+ def hash_to_string(hash)
193
+ formatted_hash = ObjectFormatter.prepare_for_inspection(hash)
194
+ formatted_hash.keys.sort_by { |k| k.to_s }.map do |key|
195
+ pp_key = PP.singleline_pp(key, "")
196
+ pp_value = PP.singleline_pp(formatted_hash[key], "")
197
+
198
+ "#{pp_key} => #{pp_value},"
199
+ end.join("\n")
200
200
  end
201
201
 
202
202
  def handle_encoding_errors(actual, expected)
@@ -16,6 +16,8 @@ module RSpec
16
16
  stack = generate_path(stack, part)
17
17
  begin
18
18
  Dir.mkdir(stack) unless directory_exists?(stack)
19
+ rescue Errno::EEXIST => e
20
+ raise e unless directory_exists?(stack)
19
21
  rescue Errno::ENOTDIR => e
20
22
  raise Errno::EEXIST, e.message
21
23
  end
@@ -131,8 +131,15 @@ module RSpec
131
131
  def detect_source_encoding(string)
132
132
  string.encoding
133
133
  end
134
+
135
+ def self.pick_encoding(source_a, source_b)
136
+ Encoding.compatible?(source_a, source_b) || Encoding.default_external
137
+ end
134
138
  else
135
139
 
140
+ def self.pick_encoding(_source_a, _source_b)
141
+ end
142
+
136
143
  private
137
144
 
138
145
  def matching_encoding(string)
@@ -12,7 +12,7 @@ module RSpec
12
12
  return arrays_match?(expected, actual.to_a)
13
13
  end
14
14
 
15
- return true if actual == expected
15
+ return true if expected == actual
16
16
 
17
17
  begin
18
18
  expected === actual
@@ -0,0 +1,93 @@
1
+ module RSpec
2
+ module Support
3
+ # Provide additional output details beyond what `inspect` provides when
4
+ # printing Time, DateTime, or BigDecimal
5
+ module ObjectFormatter
6
+ # @api private
7
+ def self.format(object)
8
+ prepare_for_inspection(object).inspect
9
+ end
10
+
11
+ # rubocop:disable MethodLength
12
+
13
+ # @private
14
+ # Prepares the provided object to be formatted by wrapping it as needed
15
+ # in something that, when `inspect` is called on it, will produce the
16
+ # desired output.
17
+ #
18
+ # This allows us to apply the desired formatting to hash/array data structures
19
+ # at any level of nesting, simply by walking that structure and replacing items
20
+ # with custom items that have `inspect` defined to return the desired output
21
+ # for that item. Then we can just use `Array#inspect` or `Hash#inspect` to
22
+ # format the entire thing.
23
+ def self.prepare_for_inspection(object)
24
+ case object
25
+ when Array
26
+ return object.map { |o| prepare_for_inspection(o) }
27
+ when Hash
28
+ return prepare_hash(object)
29
+ when Time
30
+ inspection = format_time(object)
31
+ else
32
+ if defined?(DateTime) && DateTime === object
33
+ inspection = format_date_time(object)
34
+ elsif defined?(BigDecimal) && BigDecimal === object
35
+ inspection = "#{object.to_s 'F'} (#{object.inspect})"
36
+ elsif RSpec::Support.is_a_matcher?(object) && object.respond_to?(:description)
37
+ inspection = object.description
38
+ else
39
+ return object
40
+ end
41
+ end
42
+
43
+ InspectableItem.new(inspection)
44
+ end
45
+ # rubocop:enable MethodLength
46
+
47
+ # @private
48
+ def self.prepare_hash(input)
49
+ input.inject({}) do |hash, (k, v)|
50
+ hash[prepare_for_inspection(k)] = prepare_for_inspection(v)
51
+ hash
52
+ end
53
+ end
54
+
55
+ TIME_FORMAT = "%Y-%m-%d %H:%M:%S"
56
+
57
+ if Time.method_defined?(:nsec)
58
+ # @private
59
+ def self.format_time(time)
60
+ time.strftime("#{TIME_FORMAT}.#{"%09d" % time.nsec} %z")
61
+ end
62
+ else # for 1.8.7
63
+ # @private
64
+ def self.format_time(time)
65
+ time.strftime("#{TIME_FORMAT}.#{"%06d" % time.usec} %z")
66
+ end
67
+ end
68
+
69
+ DATE_TIME_FORMAT = "%a, %d %b %Y %H:%M:%S.%N %z"
70
+ # ActiveSupport sometimes overrides inspect. If `ActiveSupport` is
71
+ # defined use a custom format string that includes more time precision.
72
+ # @private
73
+ def self.format_date_time(date_time)
74
+ if defined?(ActiveSupport)
75
+ date_time.strftime(DATE_TIME_FORMAT)
76
+ else
77
+ date_time.inspect
78
+ end
79
+ end
80
+
81
+ # @private
82
+ InspectableItem = Struct.new(:inspection) do
83
+ def inspect
84
+ inspection
85
+ end
86
+
87
+ def pretty_print(pp)
88
+ pp.text inspection
89
+ end
90
+ end
91
+ end
92
+ end
93
+ end
@@ -1,3 +1,5 @@
1
+ require 'rbconfig'
2
+
1
3
  module RSpec
2
4
  module Support
3
5
  # @api private
@@ -1,4 +1,6 @@
1
1
  require 'rspec/support'
2
+ require 'rspec/support/spec/in_sub_process'
3
+
2
4
  RSpec::Support.require_rspec_support "spec/deprecation_helpers"
3
5
  RSpec::Support.require_rspec_support "spec/with_isolated_stderr"
4
6
  RSpec::Support.require_rspec_support "spec/stderr_splitter"
@@ -12,14 +14,15 @@ RSpec.configure do |c|
12
14
  c.include RSpecHelpers
13
15
  c.include RSpec::Support::WithIsolatedStdErr
14
16
  c.include RSpec::Support::FormattingSupport
17
+ c.include RSpec::Support::InSubProcess
15
18
 
16
19
  unless defined?(Debugger) # debugger causes warnings when used
17
20
  c.before do
18
21
  warning_preventer.reset!
19
22
  end
20
23
 
21
- c.after do |example|
22
- warning_preventer.verify_example!(example)
24
+ c.after do
25
+ warning_preventer.verify_no_warnings!
23
26
  end
24
27
  end
25
28
 
@@ -30,6 +33,7 @@ RSpec.configure do |c|
30
33
 
31
34
  c.filter_run :focus
32
35
  c.run_all_when_everything_filtered = true
36
+ c.example_status_persistence_file_path = "./spec/examples.txt"
33
37
 
34
38
  c.define_derived_metadata :failing_on_appveyor do |meta|
35
39
  meta[:pending] ||= "This spec fails on AppVeyor and needs someone to fix it."
@@ -43,7 +47,8 @@ module RSpec
43
47
  # Simplecov emits some ruby warnings when loaded, so silence them.
44
48
  old_verbose, $VERBOSE = $VERBOSE, false
45
49
 
46
- return if ENV['NO_COVERAGE'] || RUBY_VERSION < '1.9.3' || RUBY_ENGINE != 'ruby'
50
+ return if ENV['NO_COVERAGE'] || RUBY_VERSION < '1.9.3'
51
+ return if RUBY_ENGINE != 'ruby' || RSpec::Support::OS.windows?
47
52
 
48
53
  # Don't load it when we're running a single isolated
49
54
  # test file rather than the whole suite.
@@ -54,6 +54,10 @@ module RSpecHelpers
54
54
  end
55
55
  end
56
56
 
57
+ def expect_no_warnings
58
+ expect(::Kernel).not_to receive(:warn)
59
+ end
60
+
57
61
  def allow_warning
58
62
  allow(::Kernel).to receive(:warn)
59
63
  end
@@ -15,7 +15,7 @@ module RSpec
15
15
 
16
16
  begin
17
17
  yield
18
- warning_preventer.verify_example!(self) if prevent_warnings
18
+ warning_preventer.verify_no_warnings! if prevent_warnings
19
19
  rescue Exception => e
20
20
  exception = e
21
21
  end
@@ -35,13 +35,18 @@ module RSpec
35
35
 
36
36
  raise exception if exception
37
37
  end
38
+ # rubocop:enable MethodLength
39
+ alias :in_sub_process_if_possible :in_sub_process
38
40
  else
39
41
  def in_sub_process(*)
40
42
  skip "This spec requires forking to work properly, " \
41
43
  "and your platform does not support forking"
42
44
  end
45
+
46
+ def in_sub_process_if_possible(*)
47
+ yield
48
+ end
43
49
  end
44
- # rubocop:enable MethodLength
45
50
  end
46
51
  end
47
52
  end
@@ -0,0 +1,145 @@
1
+ require 'rspec/support/spec/shell_out'
2
+
3
+ RSpec.shared_examples_for "library wide checks" do |lib, options|
4
+ consider_a_test_env_file = options.fetch(:consider_a_test_env_file, /MATCHES NOTHING/)
5
+ allowed_loaded_feature_regexps = options.fetch(:allowed_loaded_feature_regexps, [])
6
+ preamble_for_lib = options[:preamble_for_lib]
7
+ preamble_for_spec = "require 'rspec/core'; require 'spec_helper'"
8
+ skip_spec_files = options.fetch(:skip_spec_files, /MATCHES NOTHING/)
9
+
10
+ include RSpec::Support::ShellOut
11
+
12
+ define_method :files_to_require_for do |sub_dir|
13
+ slash = File::SEPARATOR
14
+ lib_path_re = /#{slash + lib}[^#{slash}]*#{slash}lib/
15
+ load_path = $LOAD_PATH.grep(lib_path_re).first
16
+ directory = load_path.sub(/lib$/, sub_dir)
17
+ files = Dir["#{directory}/**/*.rb"]
18
+ extract_regex = /#{Regexp.escape(directory) + File::SEPARATOR}(.+)\.rb$/
19
+
20
+ # We sort to ensure the files are loaded in a consistent order, regardless
21
+ # of OS. Otherwise, it could load in a different order on Travis than
22
+ # locally, and potentially trigger a "circular require considered harmful"
23
+ # warning or similar.
24
+ files.sort.map { |file| file[extract_regex, 1] }
25
+ end
26
+
27
+ def command_from(code_lines)
28
+ code_lines.join("\n")
29
+ end
30
+
31
+ def load_all_files(files, preamble, postamble=nil)
32
+ requires = files.map { |f| "require '#{f}'" }
33
+ command = command_from(Array(preamble) + requires + Array(postamble))
34
+
35
+ stdout, stderr, status = with_env 'NO_COVERAGE' => '1' do
36
+ options = %w[ -w ]
37
+ options << "--disable=gem" if RUBY_VERSION.to_f >= 1.9 && RSpec::Support::Ruby.mri?
38
+ run_ruby_with_current_load_path(command, *options)
39
+ end
40
+
41
+ # Ignore bundler warning.
42
+ stderr = stderr.split("\n").reject { |l| l =~ %r{bundler/source/rubygems} }.join("\n")
43
+ [stdout, stderr, status.exitstatus]
44
+ end
45
+
46
+ define_method :load_all_lib_files do
47
+ files = all_lib_files - lib_test_env_files
48
+ preamble = ['orig_loaded_features = $".dup', preamble_for_lib]
49
+ postamble = ['puts(($" - orig_loaded_features).join("\n"))']
50
+
51
+ @loaded_feature_lines, stderr, exitstatus = load_all_files(files, preamble, postamble)
52
+ ["", stderr, exitstatus]
53
+ end
54
+
55
+ define_method :load_all_spec_files do
56
+ files = files_to_require_for("spec") + lib_test_env_files
57
+ files = files.reject { |f| f =~ skip_spec_files }
58
+ load_all_files(files, preamble_for_spec)
59
+ end
60
+
61
+ attr_reader :all_lib_files, :lib_test_env_files,
62
+ :lib_file_results, :spec_file_results
63
+
64
+ before(:context) do
65
+ @all_lib_files = files_to_require_for("lib")
66
+ @lib_test_env_files = all_lib_files.grep(consider_a_test_env_file)
67
+
68
+ @lib_file_results, @spec_file_results = [
69
+ # Load them in parallel so it's faster...
70
+ Thread.new { load_all_lib_files },
71
+ Thread.new { load_all_spec_files }
72
+ ].map(&:join).map(&:value)
73
+ end
74
+
75
+ def have_successful_no_warnings_output
76
+ eq ["", "", 0]
77
+ end
78
+
79
+ it "issues no warnings when loaded", :slow do
80
+ expect(lib_file_results).to have_successful_no_warnings_output
81
+ end
82
+
83
+ it "issues no warnings when the spec files are loaded", :slow do
84
+ expect(spec_file_results).to have_successful_no_warnings_output
85
+ end
86
+
87
+ it 'only loads a known set of stdlibs so gem authors are forced ' \
88
+ 'to load libs they use to have passing specs', :slow do
89
+ loaded_features = @loaded_feature_lines.split("\n")
90
+ if RUBY_VERSION == '1.8.7'
91
+ # On 1.8.7, $" returns the relative require path if that was used
92
+ # to require the file. LIB_REGEX will not match the relative version
93
+ # since it has a `/lib` prefix. Here we deal with this by expanding
94
+ # relative files relative to the $LOAD_PATH dir (lib).
95
+ Dir.chdir("lib") { loaded_features.map! { |f| File.expand_path(f) } }
96
+ end
97
+
98
+ loaded_features.reject! { |feature| RSpec::CallerFilter::LIB_REGEX =~ feature }
99
+ loaded_features.reject! { |feature| allowed_loaded_feature_regexps.any? { |r| r =~ feature } }
100
+
101
+ expect(loaded_features).to eq([])
102
+ end
103
+
104
+ # This malformed whitespace detection logic has been borrowed from bundler:
105
+ # https://github.com/bundler/bundler/blob/v1.8.0/spec/quality_spec.rb
106
+ def check_for_tab_characters(filename)
107
+ failing_lines = []
108
+ File.readlines(filename).each_with_index do |line, number|
109
+ failing_lines << number + 1 if line =~ /\t/
110
+ end
111
+
112
+ return if failing_lines.empty?
113
+ "#{filename} has tab characters on lines #{failing_lines.join(', ')}"
114
+ end
115
+
116
+ def check_for_extra_spaces(filename)
117
+ failing_lines = []
118
+ File.readlines(filename).each_with_index do |line, number|
119
+ next if line =~ /^\s+#.*\s+\n$/
120
+ failing_lines << number + 1 if line =~ /\s+\n$/
121
+ end
122
+
123
+ return if failing_lines.empty?
124
+ "#{filename} has spaces on the EOL on lines #{failing_lines.join(', ')}"
125
+ end
126
+
127
+ RSpec::Matchers.define :be_well_formed do
128
+ match do |actual|
129
+ actual.empty?
130
+ end
131
+
132
+ failure_message do |actual|
133
+ actual.join("\n")
134
+ end
135
+ end
136
+
137
+ it "has no malformed whitespace", :slow do
138
+ error_messages = []
139
+ `git ls-files -z`.split("\x0").each do |filename|
140
+ error_messages << check_for_tab_characters(filename)
141
+ error_messages << check_for_extra_spaces(filename)
142
+ end
143
+ expect(error_messages.compact).to be_well_formed
144
+ end
145
+ end
@@ -22,6 +22,9 @@ module RSpec
22
22
  return stdout, filter(stderr), status
23
23
  end
24
24
  else # 1.8.7
25
+ # popen3 doesn't provide the exit status so we fake it out.
26
+ FakeProcessStatus = Struct.new(:exitstatus)
27
+
25
28
  def shell_out(*command)
26
29
  stdout = stderr = nil
27
30
 
@@ -30,8 +33,7 @@ module RSpec
30
33
  stderr = err.read
31
34
  end
32
35
 
33
- # popen3 doesn't provide the exit status so we fake it out.
34
- status = instance_double(Process::Status, :exitstatus => 0)
36
+ status = FakeProcessStatus.new(0)
35
37
  return stdout, filter(stderr), status
36
38
  end
37
39
  end
@@ -50,8 +50,8 @@ module RSpec
50
50
  @output_tracker = ::StringIO.new
51
51
  end
52
52
 
53
- def verify_example!(example)
54
- example.send(:fail, "Warnings were generated: #{output}") if has_output?
53
+ def verify_no_warnings!
54
+ raise "Warnings were generated: #{output}" if has_output?
55
55
  reset!
56
56
  end
57
57
 
@@ -0,0 +1,46 @@
1
+ require 'rspec/matchers'
2
+ # Special matcher for comparing encoded strings so that
3
+ # we don't run any expectation failures through the Differ,
4
+ # which also relies on EncodedString. Instead, confirm the
5
+ # strings have the same bytes.
6
+ RSpec::Matchers.define :be_identical_string do |expected|
7
+
8
+ if String.method_defined?(:encoding)
9
+ match do
10
+ expected_encoding? &&
11
+ actual.bytes.to_a == expected.bytes.to_a
12
+ end
13
+
14
+ failure_message do
15
+ "expected\n#{actual.inspect} (#{actual.encoding.name}) to be identical to\n"\
16
+ "#{expected.inspect} (#{expected.encoding.name})\n"\
17
+ "The exact bytes are printed below for more detail:\n"\
18
+ "#{actual.bytes.to_a}\n"\
19
+ "#{expected.bytes.to_a}\n"\
20
+ end
21
+
22
+ # Depends on chaining :with_same_encoding for it to
23
+ # check for string encoding.
24
+ def expected_encoding?
25
+ if defined?(@expect_same_encoding) && @expect_same_encoding
26
+ actual.encoding == expected.encoding
27
+ else
28
+ true
29
+ end
30
+ end
31
+ else
32
+ match do
33
+ actual.split(//) == expected.split(//)
34
+ end
35
+
36
+ failure_message do
37
+ "expected\n#{actual.inspect} to be identical to\n#{expected.inspect}\n"
38
+ end
39
+ end
40
+
41
+ chain :with_same_encoding do
42
+ @expect_same_encoding ||= true
43
+ end
44
+ end
45
+ RSpec::Matchers.alias_matcher :a_string_identical_to, :be_identical_string
46
+ RSpec::Matchers.alias_matcher :be_diffed_as, :be_identical_string
@@ -1,7 +1,7 @@
1
1
  module RSpec
2
2
  module Support
3
3
  module Version
4
- STRING = '3.2.2'
4
+ STRING = '3.3.0'
5
5
  end
6
6
  end
7
7
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rspec-support
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.2.2
4
+ version: 3.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - David Chelimsky
@@ -48,7 +48,7 @@ cert_chain:
48
48
  ZsVDj6a7lH3cNqtWXZxrb2wO38qV5AkYj8SQK7Hj3/Yui9myUX3crr+PdetazSqQ
49
49
  F3MdtaDehhjC
50
50
  -----END CERTIFICATE-----
51
- date: 2015-02-24 00:00:00.000000000 Z
51
+ date: 2015-06-12 00:00:00.000000000 Z
52
52
  dependencies:
53
53
  - !ruby/object:Gem::Dependency
54
54
  name: bundler
@@ -96,15 +96,17 @@ files:
96
96
  - lib/rspec/support/hunk_generator.rb
97
97
  - lib/rspec/support/matcher_definition.rb
98
98
  - lib/rspec/support/method_signature_verifier.rb
99
+ - lib/rspec/support/object_formatter.rb
99
100
  - lib/rspec/support/recursive_const_methods.rb
100
101
  - lib/rspec/support/ruby_features.rb
101
102
  - lib/rspec/support/spec.rb
102
103
  - lib/rspec/support/spec/deprecation_helpers.rb
103
104
  - lib/rspec/support/spec/formatting_support.rb
104
105
  - lib/rspec/support/spec/in_sub_process.rb
105
- - lib/rspec/support/spec/prevent_load_time_warnings.rb
106
+ - lib/rspec/support/spec/library_wide_checks.rb
106
107
  - lib/rspec/support/spec/shell_out.rb
107
108
  - lib/rspec/support/spec/stderr_splitter.rb
109
+ - lib/rspec/support/spec/string_matcher.rb
108
110
  - lib/rspec/support/spec/with_isolated_directory.rb
109
111
  - lib/rspec/support/spec/with_isolated_stderr.rb
110
112
  - lib/rspec/support/version.rb
@@ -130,9 +132,9 @@ required_rubygems_version: !ruby/object:Gem::Requirement
130
132
  - !ruby/object:Gem::Version
131
133
  version: '0'
132
134
  requirements: []
133
- rubyforge_project: rspec
135
+ rubyforge_project:
134
136
  rubygems_version: 2.2.2
135
137
  signing_key:
136
138
  specification_version: 4
137
- summary: rspec-support-3.2.2
139
+ summary: rspec-support-3.3.0
138
140
  test_files: []
metadata.gz.sig CHANGED
Binary file
@@ -1,56 +0,0 @@
1
- require 'rspec/support/spec/shell_out'
2
-
3
- module RSpec
4
- module Support
5
- module WarningsPrevention
6
- def files_to_require_for(lib, sub_dir)
7
- slash = File::SEPARATOR
8
- lib_path_re = /#{slash + lib}[^#{slash}]*#{slash}lib/
9
- load_path = $LOAD_PATH.grep(lib_path_re).first
10
- directory = load_path.sub(/lib$/, sub_dir)
11
- files = Dir["#{directory}/**/*.rb"]
12
- extract_regex = /#{Regexp.escape(directory) + File::SEPARATOR}(.+)\.rb$/
13
-
14
- # We sort to ensure the files are loaded in a consistent order, regardless
15
- # of OS. Otherwise, it could load in a different order on Travis than
16
- # locally, and potentially trigger a "circular require considered harmful"
17
- # warning or similar.
18
- files.sort.map { |file| file[extract_regex, 1] }
19
- end
20
- end
21
- end
22
- end
23
-
24
- RSpec.shared_examples_for "a library that issues no warnings when loaded" do |lib, *preamble_stmnts|
25
- include RSpec::Support::ShellOut
26
- include RSpec::Support::WarningsPrevention
27
-
28
- define_method :expect_no_warnings_from_files_in do |sub_dir, *pre_stmnts|
29
- # We want to explicitly load every file because each lib has some files that
30
- # aren't automatically loaded, instead being delayed based on an autoload
31
- # (such as for rspec-expectations' matchers) or based on a config option
32
- # (e.g. `config.mock_with :rr` => 'rspec/core/mocking_adapters/rr').
33
- files_to_require = files_to_require_for(lib, sub_dir)
34
- statements = pre_stmnts + files_to_require.map do |file|
35
- "require '#{file}'"
36
- end
37
-
38
- command = statements.join("; ")
39
-
40
- stdout, stderr, status = with_env 'NO_COVERAGE' => '1' do
41
- run_ruby_with_current_load_path(command, "-w")
42
- end
43
-
44
- expect(stdout).to eq("")
45
- expect(stderr).to eq("")
46
- expect(status.exitstatus).to eq(0)
47
- end
48
-
49
- it "issues no warnings when loaded", :slow do
50
- expect_no_warnings_from_files_in "lib", *preamble_stmnts
51
- end
52
-
53
- it "issues no warnings when the spec files are loaded", :slow do
54
- expect_no_warnings_from_files_in "spec", "require 'rspec/core'; require 'spec_helper'"
55
- end
56
- end