wrong 0.4.5 → 0.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/README.markdown +9 -8
- data/lib/wrong.rb +1 -1
- data/lib/wrong/adapters/rspec.rb +10 -1
- data/lib/wrong/chunk.rb +74 -9
- data/lib/wrong/version.rb +1 -1
- data/test/adapters/rspec1/failing_spec.rb +9 -0
- data/test/adapters/rspec2/failing_spec.rb +9 -0
- data/test/adapters/rspec_test.rb +1 -1
- data/test/chunk_test.rb +90 -8
- data/test/d_test.rb +3 -1
- data/test/failure_message_test.rb +1 -1
- metadata +243 -190
data/README.markdown
CHANGED
@@ -159,7 +159,7 @@ Here's an RSpec example:
|
|
159
159
|
|
160
160
|
describe BleuCheese do
|
161
161
|
it "stinks" do
|
162
|
-
|
162
|
+
expect { BleuCheese.new.smell > 9000 }
|
163
163
|
end
|
164
164
|
end
|
165
165
|
|
@@ -171,11 +171,11 @@ This makes your code read like a BDD-style DSL, without RSpec's arcane "should"
|
|
171
171
|
|
172
172
|
BleuCheese.new.smell.should > 9000
|
173
173
|
|
174
|
-
and seriously, tell me which one more clearly describes the desired behavior. The object under test doesn't really have a `should` method, so why should it during a test? And in what human language is "should greater than" a valid phrase?
|
174
|
+
and seriously, tell me which one more clearly describes the desired behavior. The object under test doesn't really have a `should` method, so why should it magically get one during a test? And in what human language is "should greater than" a valid phrase?
|
175
175
|
|
176
176
|
## Algorithm ##
|
177
177
|
|
178
|
-
So wait a second. How do we do it? Doesn't Ruby have [poor support for AST introspection](http://blog.zenspider.com/2009/04/parsetree-eol.html)? Well, yes, it does, so we cheat: we figure out what file and line the assert block is defined in, then open the file, read the code, and parse it directly using Ryan Davis' amazing [RubyParser](http://parsetree.rubyforge.org/ruby_parser/) and [Ruby2Ruby](http://seattlerb.rubyforge.org/ruby2ruby/). You can bask in the kludge by examining `chunk.rb` and `assert.rb`. If you find some code it can't parse, please send it our way.
|
178
|
+
So wait a second. How do we do it? Doesn't Ruby have [poor support for AST introspection](http://blog.zenspider.com/2009/04/parsetree-eol.html)? Well, yes, it does, so we cheat: we figure out what file and line the assert block is defined in, then open the file, read the code, and parse it directly using Ryan Davis' amazing [RubyParser](http://parsetree.rubyforge.org/ruby_parser/) and [Ruby2Ruby](http://seattlerb.rubyforge.org/ruby2ruby/). You can bask in the kludge by examining `chunk.rb` and `assert.rb`. If you find some code it can't parse, please send it our way. As a failsafe we also use Sourcify, which has yet another home baked RACC parser, so we have many chances to parse your code.
|
179
179
|
|
180
180
|
Before you get your knickers in a twist about how this is totally unacceptable because it doesn't support this or that use case, here are our caveats and excuses:
|
181
181
|
|
@@ -183,7 +183,7 @@ Before you get your knickers in a twist about how this is totally unacceptable b
|
|
183
183
|
* Your code needs to be in a file.
|
184
184
|
* If you're developing Ruby code without saving it to a mounted disk, then sorry, Wrong is not right for you.
|
185
185
|
* We monkey-patch IRB so if you do `irb -rwrong` it'll save off your session in memory where Wrong can read it.
|
186
|
-
* It'd be nice if it could work inside a `-e` block but as far as we can tell, there's no way to grab that `-e` code from inside Ruby.
|
186
|
+
* It'd be nice if it could work inside a `-e` block but as far as we can tell, there's no way to grab that `-e` source code from inside Ruby.
|
187
187
|
* It's a development-time testing library, not a production runtime library, so there are no security or filesystem issues.
|
188
188
|
* `eval` isn't evil, it's just misunderstood.
|
189
189
|
* It makes a few assumptions about the structure of your code, leading to some restrictions:
|
@@ -191,6 +191,7 @@ Before you get your knickers in a twist about how this is totally unacceptable b
|
|
191
191
|
* You can't use metaprogramming to write your assert blocks.
|
192
192
|
* All variables and methods must be available in the binding of the assert block.
|
193
193
|
* Passing a proc around and eventually calling assert on it might not work in some Ruby implementations.
|
194
|
+
* "Doesn't all this parsing slow down my test run"? No - this applies to failure cases only. If the assert block returns true then Wrong simply moves on.
|
194
195
|
|
195
196
|
## Adapters ##
|
196
197
|
|
@@ -210,7 +211,7 @@ To use these, put the appropriate `require` in your helper, **after** requiring
|
|
210
211
|
|
211
212
|
assert("since we're on Earth") { sky.blue? }
|
212
213
|
|
213
|
-
Since the point of Wrong is to make asserts self-explanatory, you should
|
214
|
+
Since the point of Wrong is to make asserts self-explanatory, you should use explanations only when they would add something that you couldn't get from reading the (failed) assertion code itself. Don't bother doing things like this:
|
214
215
|
|
215
216
|
assert("the sky should be blue") { sky.blue? } # redundant
|
216
217
|
|
@@ -231,13 +232,13 @@ When a failure occurs, the exception message contains all the details you might
|
|
231
232
|
* If there is a formatter registered for this type of predicate, its output will come next. (See below.)
|
232
233
|
* SUBEXP is each of the subtrees of the claim, minus duplicates and truisms (e.g. literals).
|
233
234
|
* The word "is" is a very nice separator since it doesn't look like code, but is short enough to be easily visually parsed.
|
234
|
-
* VALUE is `eval(SUBEXP).inspect
|
235
|
+
* VALUE is `eval(SUBEXP).inspect`, wrapped and indented if necessary to fit your console
|
235
236
|
|
236
237
|
We hope this structure lets your eyes focus on the meaningful values and differences in the message, rather than glossing over with stack-trace burnout. If you have any suggestions on how to improve it, please share them.
|
237
238
|
|
238
239
|
(Why does VALUE use `inspect` and not `to_s`? Because `inspect` on standard objects like String and Array are sure to show all relevant details, such as white space, in a console-safe way, and we hope other libraries follow suit. Also, `to_s` often inserts line breaks and that messes up formatting and legibility.)
|
239
240
|
|
240
|
-
Wrong tries to maintain indentation to improve readability. If the inspected VALUE contains newlines, the succeeding lines will be indented to
|
241
|
+
Wrong tries to maintain indentation to improve readability. If the inspected VALUE contains newlines, or is longer than will fit on your console, the succeeding lines will be indented to a pleasant level.
|
241
242
|
|
242
243
|
## Formatters ##
|
243
244
|
|
@@ -288,7 +289,7 @@ or any of these at runtime:
|
|
288
289
|
|
289
290
|
### Color ###
|
290
291
|
|
291
|
-
Apparently, no test framework is successful unless and until it supports console colors.
|
292
|
+
Apparently, no test framework is successful unless and until it supports console colors. Call
|
292
293
|
|
293
294
|
Wrong.config.color
|
294
295
|
|
data/lib/wrong.rb
CHANGED
data/lib/wrong/adapters/rspec.rb
CHANGED
@@ -15,11 +15,20 @@ if Object.const_defined? :RSpec
|
|
15
15
|
end
|
16
16
|
end
|
17
17
|
|
18
|
+
# This would work if we didn't need to define failure_class
|
19
|
+
# todo: figure out how to get RSpec's config object to class_eval or whatever
|
20
|
+
# Rspec.configure do |config|
|
21
|
+
# config.include Wrong
|
22
|
+
# def failure_class
|
23
|
+
# RSpec::Expectations::ExpectationNotMetError
|
24
|
+
# end
|
25
|
+
# end
|
26
|
+
|
18
27
|
module RSpec
|
19
28
|
module Core
|
20
29
|
class ExampleGroup
|
21
30
|
include Wrong
|
22
|
-
|
31
|
+
|
23
32
|
def failure_class
|
24
33
|
RSpec::Expectations::ExpectationNotMetError
|
25
34
|
end
|
data/lib/wrong/chunk.rb
CHANGED
@@ -1,5 +1,6 @@
|
|
1
1
|
require 'ruby_parser'
|
2
2
|
require 'ruby2ruby'
|
3
|
+
require 'pp'
|
3
4
|
|
4
5
|
def require_optionally(library)
|
5
6
|
begin
|
@@ -63,8 +64,8 @@ module Wrong
|
|
63
64
|
# first try sourcify
|
64
65
|
@block.to_sexp[3] # the [3] is to strip out the "proc {" sourcify adds to everything
|
65
66
|
end
|
66
|
-
rescue
|
67
|
-
# fall through
|
67
|
+
rescue Exception => e
|
68
|
+
# sourcify failed, so fall through
|
68
69
|
end
|
69
70
|
|
70
71
|
# next try glomming
|
@@ -136,8 +137,8 @@ module Wrong
|
|
136
137
|
self.claim.to_ruby
|
137
138
|
rescue => e
|
138
139
|
# note: this is untested; it's to recover from when we can't locate the code
|
139
|
-
message = "Failed
|
140
|
-
raise
|
140
|
+
message = "Failed at #{file}:#{line_number} [couldn't retrieve source code due to #{e.inspect}]"
|
141
|
+
raise message
|
141
142
|
end
|
142
143
|
|
143
144
|
def parts(sexp = nil)
|
@@ -173,9 +174,25 @@ module Wrong
|
|
173
174
|
def details
|
174
175
|
@details ||= build_details
|
175
176
|
end
|
177
|
+
|
178
|
+
def pretty_value(value, starting_col = 0, indent_wrapped_lines = 6, width = Chunk.terminal_width)
|
179
|
+
# inspected = value.inspect
|
180
|
+
|
181
|
+
# note that if the first line overflows due to the starting column then pp won't wrap it right
|
182
|
+
inspected = PP.pp(value, "", width - starting_col).chomp
|
183
|
+
|
184
|
+
# this bit might be redundant with the pp call now
|
185
|
+
indented = indent_all(6, inspected)
|
186
|
+
if width
|
187
|
+
wrap_and_indent(indented, starting_col, indent_wrapped_lines, width)
|
188
|
+
else
|
189
|
+
indented
|
190
|
+
end
|
191
|
+
end
|
176
192
|
|
177
193
|
private
|
178
194
|
|
195
|
+
# todo: move to FailureMessage?
|
179
196
|
def build_details
|
180
197
|
require "wrong/rainbow" if Wrong.config[:color]
|
181
198
|
s = ""
|
@@ -193,12 +210,12 @@ module Wrong
|
|
193
210
|
part.gsub!(/\n/, newline(2))
|
194
211
|
part += newline(3)
|
195
212
|
end
|
196
|
-
value =
|
213
|
+
value = pretty_value(value, (4 + part.length + 4))
|
197
214
|
if Wrong.config[:color]
|
198
215
|
part = part.color(:blue)
|
199
216
|
value = value.color(:magenta)
|
200
217
|
end
|
201
|
-
details << indent(
|
218
|
+
details << indent(4, part, " is ", value)
|
202
219
|
end
|
203
220
|
rescue Exception => e
|
204
221
|
raises = "raises #{e.class}"
|
@@ -207,9 +224,9 @@ module Wrong
|
|
207
224
|
raises = raises.bold.color(:red)
|
208
225
|
end
|
209
226
|
formatted_exeption = if e.message and e.message != e.class.to_s
|
210
|
-
indent(
|
227
|
+
indent(4, part, " ", raises, ": ", indent_all(6, e.message))
|
211
228
|
else
|
212
|
-
indent(
|
229
|
+
indent(4, part, " ", raises)
|
213
230
|
end
|
214
231
|
details << formatted_exeption
|
215
232
|
end
|
@@ -227,7 +244,7 @@ module Wrong
|
|
227
244
|
|
228
245
|
public # don't know exactly why this needs to be public but eval'ed code can't find it otherwise
|
229
246
|
def indent(indent, *s)
|
230
|
-
"#{"
|
247
|
+
"#{" " * indent}#{s.join('')}"
|
231
248
|
end
|
232
249
|
|
233
250
|
def newline(indent)
|
@@ -237,6 +254,54 @@ public # don't know exactly why this needs to be public but eval'ed code can't f
|
|
237
254
|
def indent_all(amount, s)
|
238
255
|
s.gsub("\n", "\n#{indent(amount)}")
|
239
256
|
end
|
257
|
+
|
258
|
+
def wrap_and_indent(indented, starting_col, indent_wrapped_lines, full_width)
|
259
|
+
first_line = true
|
260
|
+
width = full_width - starting_col # the first line is essentially shorter
|
261
|
+
indented.split("\n").map do |line|
|
262
|
+
s = ""
|
263
|
+
while line.length > width
|
264
|
+
s << line[0...width]
|
265
|
+
s << newline(indent_wrapped_lines)
|
266
|
+
line = line[width..-1]
|
267
|
+
if first_line
|
268
|
+
width += starting_col - indent_wrapped_lines
|
269
|
+
first_line = false
|
270
|
+
end
|
271
|
+
end
|
272
|
+
s << line
|
273
|
+
s
|
274
|
+
end.join("\n")
|
275
|
+
end
|
276
|
+
|
277
|
+
# Returns [width, height] of terminal when detected, nil if not detected.
|
278
|
+
# Think of this as a simpler version of Highline's Highline::SystemExtensions.terminal_size()
|
279
|
+
# Lifted from https://github.com/cldwalker/hirb/blob/master/lib/hirb/util.rb#L59
|
280
|
+
def self.terminal_size
|
281
|
+
@@terminal_size ||= begin
|
282
|
+
if (ENV['COLUMNS'] =~ /^\d+$/) && (ENV['LINES'] =~ /^\d+$/)
|
283
|
+
[ENV['COLUMNS'].to_i, ENV['LINES'].to_i]
|
284
|
+
elsif (RUBY_PLATFORM =~ /java/ || (!STDIN.tty? && ENV['TERM'])) && command_exists?('tput')
|
285
|
+
[`tput cols`.to_i, `tput lines`.to_i]
|
286
|
+
elsif STDIN.tty? && command_exists?('stty')
|
287
|
+
`stty size`.scan(/\d+/).map { |s| s.to_i }.reverse
|
288
|
+
else
|
289
|
+
nil
|
290
|
+
end
|
291
|
+
rescue
|
292
|
+
nil
|
293
|
+
end
|
294
|
+
end
|
295
|
+
|
296
|
+
def self.terminal_width
|
297
|
+
terminal_size && terminal_size.first
|
298
|
+
end
|
299
|
+
|
300
|
+
# Determines if a shell command exists by searching for it in ENV['PATH'].
|
301
|
+
def self.command_exists?(command)
|
302
|
+
ENV['PATH'].split(File::PATH_SEPARATOR).any? {|d| File.exists? File.join(d, command) }
|
303
|
+
end
|
304
|
+
|
240
305
|
|
241
306
|
end
|
242
307
|
|
data/lib/wrong/version.rb
CHANGED
@@ -13,6 +13,15 @@ require "wrong/adapters/rspec"
|
|
13
13
|
# since we're not running 'spec' we have to do some stuff ourselves
|
14
14
|
include Spec::DSL::Main
|
15
15
|
|
16
|
+
describe "wrong's failure" do
|
17
|
+
it "is an RSpec exception" do
|
18
|
+
e = rescuing {
|
19
|
+
assert { false }
|
20
|
+
}
|
21
|
+
e.should be_a(Spec::Expectations::ExpectationNotMetError)
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
16
25
|
describe "arithmetic" do
|
17
26
|
it "should not work like this" do
|
18
27
|
assert { 2 + 2 == 5 }
|
@@ -17,6 +17,15 @@ puts RSpec::Core::Version::STRING
|
|
17
17
|
require 'rspec/autorun'
|
18
18
|
require "wrong/adapters/rspec"
|
19
19
|
|
20
|
+
describe "wrong's failure" do
|
21
|
+
it "is an RSpec exception" do
|
22
|
+
e = rescuing {
|
23
|
+
assert { false }
|
24
|
+
}
|
25
|
+
e.should be_a(RSpec::Expectations::ExpectationNotMetError)
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
20
29
|
describe "arithmetic" do
|
21
30
|
it "should not work like this" do
|
22
31
|
assert { 2 + 2 == 5 }
|
data/test/adapters/rspec_test.rb
CHANGED
@@ -36,7 +36,7 @@ describe "testing rspec" do
|
|
36
36
|
(rspec_version == 1 || RUBY_VERSION =~ /^1\.8\./ || RUBY_VERSION == '1.9.1' ? nil : 1) # RSpec v1 exits with 0 on failure :-(
|
37
37
|
end
|
38
38
|
|
39
|
-
assert { spec_output.include? "
|
39
|
+
assert { spec_output.include? "2 examples, 1 failure" }
|
40
40
|
assert { spec_output.include? "Expected ((2 + 2) == 5), but" }
|
41
41
|
end
|
42
42
|
end
|
data/test/chunk_test.rb
CHANGED
@@ -1,5 +1,7 @@
|
|
1
|
-
|
1
|
+
here = File.expand_path(File.dirname(__FILE__))
|
2
|
+
require "#{here}/test_helper"
|
2
3
|
require "wrong/chunk"
|
4
|
+
require 'yaml'
|
3
5
|
|
4
6
|
unless Object.const_defined?(:Chunk)
|
5
7
|
Chunk = Wrong::Chunk
|
@@ -74,7 +76,7 @@ describe Chunk do
|
|
74
76
|
end
|
75
77
|
|
76
78
|
it "finds the file to parse even when inside a chdir to a child directory" do
|
77
|
-
Dir.chdir("
|
79
|
+
Dir.chdir("#{here}") do
|
78
80
|
chunk = Chunk.new __FILE__, __LINE__ + 1; <<-CODE
|
79
81
|
"hi"
|
80
82
|
CODE
|
@@ -255,6 +257,15 @@ z
|
|
255
257
|
assert d == "\n" + ' x is "flavor:\tvanilla"' + "\n"
|
256
258
|
end
|
257
259
|
|
260
|
+
it "splits lower-down details correctly (bug)" do
|
261
|
+
hash = {:flavor => "vanilla"}
|
262
|
+
exception_with_newlines = Exception.new(hash.to_yaml.chomp)
|
263
|
+
d = details {
|
264
|
+
rescuing { raise exception_with_newlines }.message.include?(":flavor: chocolate")
|
265
|
+
}
|
266
|
+
assert d.include? "exception_with_newlines is #<Exception: --- \n :flavor: vanilla>"
|
267
|
+
end
|
268
|
+
|
258
269
|
it "skips assignments" do
|
259
270
|
y = 14
|
260
271
|
d = details { x = 7; y }
|
@@ -262,17 +273,88 @@ z
|
|
262
273
|
assert d =~ /y is 14/
|
263
274
|
end
|
264
275
|
|
265
|
-
|
266
|
-
|
267
|
-
|
268
|
-
|
269
|
-
|
276
|
+
class Weirdo
|
277
|
+
def initialize(inspected_value)
|
278
|
+
@inspected_value = inspected_value
|
279
|
+
end
|
280
|
+
|
281
|
+
def inspect
|
282
|
+
@inspected_value
|
270
283
|
end
|
284
|
+
end
|
285
|
+
|
271
286
|
|
272
|
-
|
287
|
+
it "indents unescaped newlines inside the inspected value" do
|
288
|
+
x = Weirdo.new("first\nsecond\nthird")
|
273
289
|
d = details { assert { x == "foo" } }
|
274
290
|
assert d == "\n x is first\n second\n third\n"
|
275
291
|
end
|
292
|
+
|
293
|
+
describe '#pretty_value' do
|
294
|
+
before do
|
295
|
+
@chunk = chunk = Chunk.new(__FILE__, __LINE__ + 1); <<-CODE
|
296
|
+
true
|
297
|
+
CODE
|
298
|
+
end
|
299
|
+
|
300
|
+
it 'inspects its value' do
|
301
|
+
assert @chunk.pretty_value(12) == "12"
|
302
|
+
assert @chunk.pretty_value("foo") == "\"foo\""
|
303
|
+
end
|
304
|
+
|
305
|
+
it 'escapes newlines in strings' do
|
306
|
+
assert @chunk.pretty_value("foo\nbar\nbaz") == "\"foo\\nbar\\nbaz\""
|
307
|
+
end
|
308
|
+
|
309
|
+
it 'indents newlines in raw inspect values (e.g. exceptions or YAML or whatever)' do
|
310
|
+
w = Weirdo.new("foo\nbar\nbaz")
|
311
|
+
assert @chunk.pretty_value(w) == "foo\n bar\n baz"
|
312
|
+
end
|
313
|
+
|
314
|
+
# def pretty_value(value, starting_col = 0, indent_wrapped_lines = 3, size = Chunk.terminal_size)
|
315
|
+
|
316
|
+
it 'inserts newlines in really long values, wrapped at the terminal width' do
|
317
|
+
abc = Weirdo.new("abcdefghijklmnopqrstuvwxyz")
|
318
|
+
pretty = @chunk.pretty_value(abc, 0, 0, 10)
|
319
|
+
assert pretty == <<-DONE.chomp
|
320
|
+
abcdefghij
|
321
|
+
klmnopqrst
|
322
|
+
uvwxyz
|
323
|
+
DONE
|
324
|
+
end
|
325
|
+
|
326
|
+
it 'subtracts the starting column from the wrapped width of the first line' do
|
327
|
+
abc = Weirdo.new("abcdefghijklmnopqrstuvwxyz")
|
328
|
+
pretty = @chunk.pretty_value(abc, 2, 0, 10)
|
329
|
+
assert pretty == <<-DONE.chomp
|
330
|
+
abcdefgh
|
331
|
+
ijklmnopqr
|
332
|
+
stuvwxyz
|
333
|
+
DONE
|
334
|
+
end
|
335
|
+
|
336
|
+
it "indents wrapped lines" do
|
337
|
+
abc = Weirdo.new("abcdefghijklmnopqrstuvwxyz")
|
338
|
+
pretty = @chunk.pretty_value(abc, 2, 3, 10)
|
339
|
+
assert pretty == <<-DONE.chomp
|
340
|
+
abcdefgh
|
341
|
+
ijklmno
|
342
|
+
pqrstuv
|
343
|
+
wxyz
|
344
|
+
DONE
|
345
|
+
end
|
346
|
+
|
347
|
+
it "wraps correctly" do
|
348
|
+
hash = {:flavor => "vanilla"}
|
349
|
+
object = Weirdo.new(hash.to_yaml.chomp)
|
350
|
+
pretty = @chunk.pretty_value(object, 2, 3, 80)
|
351
|
+
assert pretty == <<-DONE.chomp
|
352
|
+
---
|
353
|
+
:flavor: vanilla
|
354
|
+
DONE
|
355
|
+
end
|
356
|
+
|
357
|
+
end
|
276
358
|
|
277
359
|
end
|
278
360
|
end
|
data/test/d_test.rb
CHANGED
metadata
CHANGED
@@ -3,129 +3,137 @@ name: wrong
|
|
3
3
|
version: !ruby/object:Gem::Version
|
4
4
|
prerelease: false
|
5
5
|
segments:
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
version: 0.
|
6
|
+
- 0
|
7
|
+
- 5
|
8
|
+
- 0
|
9
|
+
version: 0.5.0
|
10
10
|
platform: ruby
|
11
11
|
authors:
|
12
|
-
|
13
|
-
|
12
|
+
- Steve Conover
|
13
|
+
- Alex Chaffee
|
14
14
|
autorequire:
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date: 2010-
|
18
|
+
date: 2010-12-08 00:00:00 -08:00
|
19
19
|
default_executable:
|
20
20
|
dependencies:
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
21
|
+
- !ruby/object:Gem::Dependency
|
22
|
+
name: predicated
|
23
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
24
|
+
none: false
|
25
|
+
requirements:
|
26
|
+
- - ">="
|
27
|
+
- !ruby/object:Gem::Version
|
28
|
+
segments:
|
29
|
+
- 0
|
30
|
+
- 2
|
31
|
+
- 2
|
32
|
+
version: 0.2.2
|
33
|
+
type: :runtime
|
34
|
+
prerelease: false
|
35
|
+
version_requirements: *id001
|
36
|
+
- !ruby/object:Gem::Dependency
|
37
|
+
name: ruby_parser
|
38
|
+
requirement: &id002 !ruby/object:Gem::Requirement
|
39
|
+
none: false
|
40
|
+
requirements:
|
41
|
+
- - ~>
|
42
|
+
- !ruby/object:Gem::Version
|
43
|
+
segments:
|
44
|
+
- 2
|
45
|
+
- 0
|
46
|
+
- 4
|
47
|
+
version: 2.0.4
|
48
|
+
type: :runtime
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: *id002
|
51
|
+
- !ruby/object:Gem::Dependency
|
52
|
+
name: ruby2ruby
|
53
|
+
requirement: &id003 !ruby/object:Gem::Requirement
|
54
|
+
none: false
|
55
|
+
requirements:
|
56
|
+
- - ~>
|
57
|
+
- !ruby/object:Gem::Version
|
58
|
+
segments:
|
59
|
+
- 1
|
60
|
+
- 2
|
61
|
+
version: "1.2"
|
62
|
+
type: :runtime
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: *id003
|
65
|
+
- !ruby/object:Gem::Dependency
|
66
|
+
name: sexp_processor
|
67
|
+
requirement: &id004 !ruby/object:Gem::Requirement
|
68
|
+
none: false
|
69
|
+
requirements:
|
70
|
+
- - ~>
|
71
|
+
- !ruby/object:Gem::Version
|
72
|
+
segments:
|
73
|
+
- 3
|
74
|
+
- 0
|
75
|
+
version: "3.0"
|
76
|
+
type: :runtime
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: *id004
|
79
|
+
- !ruby/object:Gem::Dependency
|
80
|
+
name: diff-lcs
|
81
|
+
requirement: &id005 !ruby/object:Gem::Requirement
|
82
|
+
none: false
|
83
|
+
requirements:
|
84
|
+
- - ~>
|
85
|
+
- !ruby/object:Gem::Version
|
86
|
+
segments:
|
87
|
+
- 1
|
88
|
+
- 1
|
89
|
+
- 2
|
90
|
+
version: 1.1.2
|
91
|
+
type: :runtime
|
92
|
+
prerelease: false
|
93
|
+
version_requirements: *id005
|
94
|
+
- !ruby/object:Gem::Dependency
|
95
|
+
name: ParseTree
|
96
|
+
requirement: &id006 !ruby/object:Gem::Requirement
|
97
|
+
none: false
|
98
|
+
requirements:
|
99
|
+
- - ~>
|
100
|
+
- !ruby/object:Gem::Version
|
101
|
+
segments:
|
102
|
+
- 3
|
103
|
+
- 0
|
104
|
+
version: "3.0"
|
105
|
+
type: :runtime
|
106
|
+
prerelease: false
|
107
|
+
version_requirements: *id006
|
108
|
+
- !ruby/object:Gem::Dependency
|
109
|
+
name: sourcify
|
110
|
+
requirement: &id007 !ruby/object:Gem::Requirement
|
111
|
+
none: false
|
112
|
+
requirements:
|
113
|
+
- - ">="
|
114
|
+
- !ruby/object:Gem::Version
|
115
|
+
segments:
|
116
|
+
- 0
|
117
|
+
- 3
|
118
|
+
- 0
|
119
|
+
version: 0.3.0
|
120
|
+
type: :runtime
|
121
|
+
prerelease: false
|
122
|
+
version_requirements: *id007
|
123
|
+
- !ruby/object:Gem::Dependency
|
124
|
+
name: file-tail
|
125
|
+
requirement: &id008 !ruby/object:Gem::Requirement
|
126
|
+
none: false
|
127
|
+
requirements:
|
128
|
+
- - ~>
|
129
|
+
- !ruby/object:Gem::Version
|
130
|
+
segments:
|
131
|
+
- 1
|
132
|
+
- 0
|
133
|
+
version: "1.0"
|
134
|
+
type: :runtime
|
135
|
+
prerelease: false
|
136
|
+
version_requirements: *id008
|
129
137
|
description: |-
|
130
138
|
Wrong provides a general assert method that takes a predicate block. Assertion failure
|
131
139
|
messages are rich in detail. The Wrong idea is to replace all those countless assert_this,
|
@@ -139,28 +147,70 @@ executables: []
|
|
139
147
|
extensions: []
|
140
148
|
|
141
149
|
extra_rdoc_files:
|
142
|
-
|
150
|
+
- README.markdown
|
143
151
|
files:
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
|
156
|
-
|
157
|
-
|
158
|
-
|
159
|
-
|
160
|
-
|
161
|
-
|
162
|
-
|
163
|
-
|
152
|
+
- lib/wrong/adapters/minitest.rb
|
153
|
+
- lib/wrong/adapters/rspec.rb
|
154
|
+
- lib/wrong/adapters/test_unit.rb
|
155
|
+
- lib/wrong/assert.rb
|
156
|
+
- lib/wrong/chunk.rb
|
157
|
+
- lib/wrong/close_to.rb
|
158
|
+
- lib/wrong/config.rb
|
159
|
+
- lib/wrong/d.rb
|
160
|
+
- lib/wrong/failure_message.rb
|
161
|
+
- lib/wrong/helpers.rb
|
162
|
+
- lib/wrong/irb.rb
|
163
|
+
- lib/wrong/message/array_diff.rb
|
164
|
+
- lib/wrong/message/string_comparison.rb
|
165
|
+
- lib/wrong/message/test_context.rb
|
166
|
+
- lib/wrong/rainbow.rb
|
167
|
+
- lib/wrong/ruby2ruby_patch.rb
|
168
|
+
- lib/wrong/sexp_ext.rb
|
169
|
+
- lib/wrong/version.rb
|
170
|
+
- lib/wrong.rb
|
171
|
+
- README.markdown
|
172
|
+
- test/adapters/minitest_test.rb
|
173
|
+
- test/adapters/railsapp/app/controllers/application_controller.rb
|
174
|
+
- test/adapters/railsapp/app/helpers/application_helper.rb
|
175
|
+
- test/adapters/railsapp/autotest/discover.rb
|
176
|
+
- test/adapters/railsapp/config/application.rb
|
177
|
+
- test/adapters/railsapp/config/boot.rb
|
178
|
+
- test/adapters/railsapp/config/environment.rb
|
179
|
+
- test/adapters/railsapp/config/environments/development.rb
|
180
|
+
- test/adapters/railsapp/config/environments/production.rb
|
181
|
+
- test/adapters/railsapp/config/environments/test.rb
|
182
|
+
- test/adapters/railsapp/config/initializers/backtrace_silencers.rb
|
183
|
+
- test/adapters/railsapp/config/initializers/inflections.rb
|
184
|
+
- test/adapters/railsapp/config/initializers/mime_types.rb
|
185
|
+
- test/adapters/railsapp/config/initializers/secret_token.rb
|
186
|
+
- test/adapters/railsapp/config/initializers/session_store.rb
|
187
|
+
- test/adapters/railsapp/config/routes.rb
|
188
|
+
- test/adapters/railsapp/db/seeds.rb
|
189
|
+
- test/adapters/railsapp/spec/spec_helper.rb
|
190
|
+
- test/adapters/railsapp/spec/wrong_spec.rb
|
191
|
+
- test/adapters/rspec1/failing_spec.rb
|
192
|
+
- test/adapters/rspec2/failing_spec.rb
|
193
|
+
- test/adapters/rspec_rails_test.rb
|
194
|
+
- test/adapters/rspec_test.rb
|
195
|
+
- test/adapters/test_unit_test.rb
|
196
|
+
- test/assert_advanced_test.rb
|
197
|
+
- test/assert_test.rb
|
198
|
+
- test/capturing_test.rb
|
199
|
+
- test/chunk_test.rb
|
200
|
+
- test/close_to_test.rb
|
201
|
+
- test/config_test.rb
|
202
|
+
- test/d_test.rb
|
203
|
+
- test/failure_message_test.rb
|
204
|
+
- test/failures_test.rb
|
205
|
+
- test/message/array_diff_test.rb
|
206
|
+
- test/message/test_context_test.rb
|
207
|
+
- test/rescuing_test.rb
|
208
|
+
- test/separate.rb
|
209
|
+
- test/sexp_ext_test.rb
|
210
|
+
- test/string_comparison_test.rb
|
211
|
+
- test/suite.rb
|
212
|
+
- test/test_helper.rb
|
213
|
+
- test/wrong_test.rb
|
164
214
|
has_rdoc: true
|
165
215
|
homepage: http://github.com/sconover/wrong
|
166
216
|
licenses: []
|
@@ -169,68 +219,71 @@ post_install_message:
|
|
169
219
|
rdoc_options: []
|
170
220
|
|
171
221
|
require_paths:
|
172
|
-
|
222
|
+
- lib
|
173
223
|
required_ruby_version: !ruby/object:Gem::Requirement
|
224
|
+
none: false
|
174
225
|
requirements:
|
175
|
-
|
176
|
-
|
177
|
-
|
178
|
-
|
179
|
-
|
226
|
+
- - ">="
|
227
|
+
- !ruby/object:Gem::Version
|
228
|
+
hash: -2030661794570010532
|
229
|
+
segments:
|
230
|
+
- 0
|
231
|
+
version: "0"
|
180
232
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
233
|
+
none: false
|
181
234
|
requirements:
|
182
|
-
|
183
|
-
|
184
|
-
|
185
|
-
|
186
|
-
|
235
|
+
- - ">="
|
236
|
+
- !ruby/object:Gem::Version
|
237
|
+
segments:
|
238
|
+
- 0
|
239
|
+
version: "0"
|
187
240
|
requirements: []
|
188
241
|
|
189
242
|
rubyforge_project: wrong
|
190
|
-
rubygems_version: 1.3.
|
243
|
+
rubygems_version: 1.3.7
|
191
244
|
signing_key:
|
192
245
|
specification_version: 3
|
193
246
|
summary: Wrong provides a general assert method that takes a predicate block. Assertion failure messages are rich in detail.
|
194
247
|
test_files:
|
195
|
-
|
196
|
-
|
197
|
-
|
198
|
-
|
199
|
-
|
200
|
-
|
201
|
-
|
202
|
-
|
203
|
-
|
204
|
-
|
205
|
-
|
206
|
-
|
207
|
-
|
208
|
-
|
209
|
-
|
210
|
-
|
211
|
-
|
212
|
-
|
213
|
-
|
214
|
-
|
215
|
-
|
216
|
-
|
217
|
-
|
218
|
-
|
219
|
-
|
220
|
-
|
221
|
-
|
222
|
-
|
223
|
-
|
224
|
-
|
225
|
-
|
226
|
-
|
227
|
-
|
228
|
-
|
229
|
-
|
230
|
-
|
231
|
-
|
232
|
-
|
233
|
-
|
234
|
-
|
235
|
-
|
236
|
-
|
248
|
+
- test/adapters/minitest_test.rb
|
249
|
+
- test/adapters/railsapp/app/controllers/application_controller.rb
|
250
|
+
- test/adapters/railsapp/app/helpers/application_helper.rb
|
251
|
+
- test/adapters/railsapp/autotest/discover.rb
|
252
|
+
- test/adapters/railsapp/config/application.rb
|
253
|
+
- test/adapters/railsapp/config/boot.rb
|
254
|
+
- test/adapters/railsapp/config/environment.rb
|
255
|
+
- test/adapters/railsapp/config/environments/development.rb
|
256
|
+
- test/adapters/railsapp/config/environments/production.rb
|
257
|
+
- test/adapters/railsapp/config/environments/test.rb
|
258
|
+
- test/adapters/railsapp/config/initializers/backtrace_silencers.rb
|
259
|
+
- test/adapters/railsapp/config/initializers/inflections.rb
|
260
|
+
- test/adapters/railsapp/config/initializers/mime_types.rb
|
261
|
+
- test/adapters/railsapp/config/initializers/secret_token.rb
|
262
|
+
- test/adapters/railsapp/config/initializers/session_store.rb
|
263
|
+
- test/adapters/railsapp/config/routes.rb
|
264
|
+
- test/adapters/railsapp/db/seeds.rb
|
265
|
+
- test/adapters/railsapp/spec/spec_helper.rb
|
266
|
+
- test/adapters/railsapp/spec/wrong_spec.rb
|
267
|
+
- test/adapters/rspec1/failing_spec.rb
|
268
|
+
- test/adapters/rspec2/failing_spec.rb
|
269
|
+
- test/adapters/rspec_rails_test.rb
|
270
|
+
- test/adapters/rspec_test.rb
|
271
|
+
- test/adapters/test_unit_test.rb
|
272
|
+
- test/assert_advanced_test.rb
|
273
|
+
- test/assert_test.rb
|
274
|
+
- test/capturing_test.rb
|
275
|
+
- test/chunk_test.rb
|
276
|
+
- test/close_to_test.rb
|
277
|
+
- test/config_test.rb
|
278
|
+
- test/d_test.rb
|
279
|
+
- test/failure_message_test.rb
|
280
|
+
- test/failures_test.rb
|
281
|
+
- test/message/array_diff_test.rb
|
282
|
+
- test/message/test_context_test.rb
|
283
|
+
- test/rescuing_test.rb
|
284
|
+
- test/separate.rb
|
285
|
+
- test/sexp_ext_test.rb
|
286
|
+
- test/string_comparison_test.rb
|
287
|
+
- test/suite.rb
|
288
|
+
- test/test_helper.rb
|
289
|
+
- test/wrong_test.rb
|