lookout 2.0.1
Sign up to get free protection for your applications and to get access to all the features.
- data/README +645 -0
- data/Rakefile +9 -0
- data/lib/lookout.rb +34 -0
- data/lib/lookout/aphonic.rb +40 -0
- data/lib/lookout/benchmark.rb +11 -0
- data/lib/lookout/diff.rb +10 -0
- data/lib/lookout/diff/algorithms.rb +5 -0
- data/lib/lookout/diff/algorithms/difflib.rb +38 -0
- data/lib/lookout/diff/algorithms/difflib/position.rb +92 -0
- data/lib/lookout/diff/algorithms/difflib/position/to.rb +47 -0
- data/lib/lookout/diff/formats.rb +7 -0
- data/lib/lookout/diff/formats/hash.rb +53 -0
- data/lib/lookout/diff/formats/inline.rb +39 -0
- data/lib/lookout/diff/formats/unified.rb +57 -0
- data/lib/lookout/diff/group.rb +61 -0
- data/lib/lookout/diff/groups.rb +34 -0
- data/lib/lookout/diff/match.rb +36 -0
- data/lib/lookout/diff/operation.rb +33 -0
- data/lib/lookout/diff/operations.rb +36 -0
- data/lib/lookout/diff/operations/delete.rb +9 -0
- data/lib/lookout/diff/operations/equal.rb +27 -0
- data/lib/lookout/diff/operations/insert.rb +9 -0
- data/lib/lookout/diff/operations/replace.rb +9 -0
- data/lib/lookout/diff/range.rb +91 -0
- data/lib/lookout/equality.rb +178 -0
- data/lib/lookout/expectation.rb +50 -0
- data/lib/lookout/expectations.rb +62 -0
- data/lib/lookout/expectations/behavior.rb +20 -0
- data/lib/lookout/expectations/state.rb +29 -0
- data/lib/lookout/mock.rb +18 -0
- data/lib/lookout/mock/method.rb +70 -0
- data/lib/lookout/mock/method/arguments.rb +33 -0
- data/lib/lookout/mock/method/arguments/any.rb +11 -0
- data/lib/lookout/mock/method/arguments/anything.rb +11 -0
- data/lib/lookout/mock/method/arguments/list.rb +15 -0
- data/lib/lookout/mock/method/arguments/none.rb +11 -0
- data/lib/lookout/mock/method/arguments/one.rb +11 -0
- data/lib/lookout/mock/method/calls.rb +11 -0
- data/lib/lookout/mock/method/calls/class.rb +21 -0
- data/lib/lookout/mock/method/calls/exactly.rb +28 -0
- data/lib/lookout/mock/method/calls/instance.rb +25 -0
- data/lib/lookout/mock/method/calls/lower.rb +22 -0
- data/lib/lookout/mock/method/calls/upper.rb +22 -0
- data/lib/lookout/mock/methods.rb +12 -0
- data/lib/lookout/mock/object.rb +12 -0
- data/lib/lookout/object.rb +11 -0
- data/lib/lookout/output.rb +21 -0
- data/lib/lookout/rake/tasks.rb +36 -0
- data/lib/lookout/rake/tasks/gem.rb +49 -0
- data/lib/lookout/rake/tasks/tags.rb +16 -0
- data/lib/lookout/rake/tasks/test.rb +46 -0
- data/lib/lookout/rake/tasks/test/loader.rb +19 -0
- data/lib/lookout/recorder.rb +45 -0
- data/lib/lookout/recorder/not.rb +11 -0
- data/lib/lookout/recorder/tape.rb +21 -0
- data/lib/lookout/recorders.rb +6 -0
- data/lib/lookout/recorders/reception.rb +47 -0
- data/lib/lookout/recorders/state.rb +35 -0
- data/lib/lookout/result.rb +23 -0
- data/lib/lookout/results.rb +46 -0
- data/lib/lookout/results/error.rb +18 -0
- data/lib/lookout/results/error/exception.rb +36 -0
- data/lib/lookout/results/error/exception/backtrace.rb +41 -0
- data/lib/lookout/results/failure.rb +16 -0
- data/lib/lookout/results/failures.rb +6 -0
- data/lib/lookout/results/failures/behavior.rb +4 -0
- data/lib/lookout/results/failures/state.rb +4 -0
- data/lib/lookout/results/fulfilled.rb +9 -0
- data/lib/lookout/runners.rb +5 -0
- data/lib/lookout/runners/console.rb +22 -0
- data/lib/lookout/stub.rb +16 -0
- data/lib/lookout/stub/method.rb +105 -0
- data/lib/lookout/stub/methods.rb +18 -0
- data/lib/lookout/stub/object.rb +11 -0
- data/lib/lookout/ui.rb +7 -0
- data/lib/lookout/ui/console.rb +36 -0
- data/lib/lookout/ui/silent.rb +12 -0
- data/lib/lookout/version.rb +5 -0
- data/lib/lookout/xml.rb +17 -0
- data/test/unit/examples.rb +169 -0
- data/test/unit/lookout.rb +7 -0
- data/test/unit/lookout/diff.rb +4 -0
- data/test/unit/lookout/diff/algorithms/difflib.rb +56 -0
- data/test/unit/lookout/diff/algorithms/difflib/position.rb +92 -0
- data/test/unit/lookout/diff/algorithms/difflib/position/to.rb +12 -0
- data/test/unit/lookout/diff/formats/inline.rb +17 -0
- data/test/unit/lookout/diff/formats/unified.rb +67 -0
- data/test/unit/lookout/diff/group.rb +4 -0
- data/test/unit/lookout/diff/groups.rb +102 -0
- data/test/unit/lookout/diff/match.rb +5 -0
- data/test/unit/lookout/diff/operations.rb +22 -0
- data/test/unit/lookout/diff/operations/delete.rb +45 -0
- data/test/unit/lookout/diff/operations/equal.rb +45 -0
- data/test/unit/lookout/diff/operations/insert.rb +45 -0
- data/test/unit/lookout/diff/operations/replace.rb +45 -0
- data/test/unit/lookout/diff/range.rb +50 -0
- data/test/unit/lookout/equality.rb +113 -0
- data/test/unit/lookout/expectation.rb +39 -0
- data/test/unit/lookout/expectations.rb +58 -0
- data/test/unit/lookout/expectations/behavior.rb +35 -0
- data/test/unit/lookout/expectations/state.rb +29 -0
- data/test/unit/lookout/mock.rb +4 -0
- data/test/unit/lookout/mock/method.rb +143 -0
- data/test/unit/lookout/mock/method/arguments.rb +57 -0
- data/test/unit/lookout/mock/method/arguments/any.rb +11 -0
- data/test/unit/lookout/recorder.rb +11 -0
- data/test/unit/lookout/results.rb +30 -0
- data/test/unit/lookout/results/error.rb +7 -0
- data/test/unit/lookout/results/failures/behavior.rb +7 -0
- data/test/unit/lookout/results/failures/state.rb +7 -0
- data/test/unit/lookout/results/fulfilled.rb +7 -0
- data/test/unit/lookout/runners/console.rb +4 -0
- data/test/unit/lookout/stub.rb +4 -0
- data/test/unit/lookout/stub/method.rb +48 -0
- data/test/unit/lookout/ui/formatters/exception.rb +5 -0
- data/test/unit/lookout/ui/formatters/exception/backtrace.rb +11 -0
- data/test/unit/lookout/xml.rb +55 -0
- metadata +496 -0
@@ -0,0 +1,23 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
|
3
|
+
class Lookout::Result
|
4
|
+
class << self
|
5
|
+
def is(is)
|
6
|
+
[:error, :failure, :fulfilled].each do |type|
|
7
|
+
define_method :"#{type}?" do
|
8
|
+
type == is
|
9
|
+
end
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
def initialize(file, line)
|
15
|
+
@file, @line = file, line
|
16
|
+
end
|
17
|
+
|
18
|
+
attr_reader :file, :line
|
19
|
+
|
20
|
+
def to_s
|
21
|
+
'%s:%d' % [file, line]
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,46 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
|
3
|
+
class Lookout::Results
|
4
|
+
autoload :Error, 'lookout/results/error'
|
5
|
+
autoload :Failure, 'lookout/results/failure'
|
6
|
+
autoload :Failures, 'lookout/results/failures'
|
7
|
+
autoload :Fulfilled, 'lookout/results/fulfilled'
|
8
|
+
|
9
|
+
include Enumerable
|
10
|
+
|
11
|
+
def initialize
|
12
|
+
@results = []
|
13
|
+
end
|
14
|
+
|
15
|
+
def <<(result)
|
16
|
+
@results << result
|
17
|
+
self
|
18
|
+
end
|
19
|
+
|
20
|
+
def each
|
21
|
+
@results.each do |result|
|
22
|
+
yield result
|
23
|
+
end
|
24
|
+
self
|
25
|
+
end
|
26
|
+
|
27
|
+
def succeeded?
|
28
|
+
all?{ |result| result.fulfilled? }
|
29
|
+
end
|
30
|
+
|
31
|
+
def size
|
32
|
+
@results.size
|
33
|
+
end
|
34
|
+
|
35
|
+
def fulfillments
|
36
|
+
select{ |result| result.fulfilled? }
|
37
|
+
end
|
38
|
+
|
39
|
+
def errors
|
40
|
+
select{ |result| result.error? }
|
41
|
+
end
|
42
|
+
|
43
|
+
def failures
|
44
|
+
select{ |result| result.failure? }
|
45
|
+
end
|
46
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
|
3
|
+
class Lookout::Results::Error < Lookout::Result
|
4
|
+
autoload :Exception, 'lookout/results/error/exception'
|
5
|
+
|
6
|
+
is :error
|
7
|
+
|
8
|
+
def initialize(file, line, message, exception)
|
9
|
+
super file, line
|
10
|
+
@message, @exception = message, Exception.new(exception)
|
11
|
+
end
|
12
|
+
|
13
|
+
attr_reader :message, :exception
|
14
|
+
|
15
|
+
def to_s
|
16
|
+
[super, message, exception].compact.join(': ')
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
|
3
|
+
class Lookout::Results::Error::Exception
|
4
|
+
autoload :Backtrace, 'lookout/results/error/exception/backtrace'
|
5
|
+
|
6
|
+
def initialize(exception)
|
7
|
+
@exception = exception
|
8
|
+
end
|
9
|
+
|
10
|
+
def message
|
11
|
+
# Chomping off a \n here isn’t 100 percent compatible with how Ruby 1.9
|
12
|
+
# does it, but it simplifies the code and also makes the output better if
|
13
|
+
# the message is a lone \n.
|
14
|
+
message = @exception.message.to_str.chomp("\n")
|
15
|
+
if @exception.class == RuntimeError and message.empty?
|
16
|
+
'unhandled exception'
|
17
|
+
elsif message.empty?
|
18
|
+
@exception.class.name
|
19
|
+
elsif @exception.class.name.empty? or @exception.class.name =~ /^#/
|
20
|
+
message
|
21
|
+
else
|
22
|
+
before, newline, after = message.partition("\n")
|
23
|
+
'%s (%s)%s%s' % [before, @exception.class.name, newline, after]
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
def backtrace
|
28
|
+
@backtrace ||= Backtrace.new(@exception.backtrace)
|
29
|
+
end
|
30
|
+
|
31
|
+
def to_s
|
32
|
+
"%s\n%s" % [message, backtrace]
|
33
|
+
end
|
34
|
+
|
35
|
+
attr_reader :exception
|
36
|
+
end
|
@@ -0,0 +1,41 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
|
3
|
+
class Lookout::Results::Error::Exception::Backtrace
|
4
|
+
def initialize(backtrace, filter = ENV['LOOKOUT_DO_NOT_FILTER_BACKTRACE'].nil?)
|
5
|
+
@filter = filter
|
6
|
+
@backtrace = case backtrace
|
7
|
+
when nil then []
|
8
|
+
when String then [backtrace]
|
9
|
+
when Array then backtrace.select{ |l| String === l }
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
def backtrace
|
14
|
+
return @backtrace unless @filter
|
15
|
+
before or outside or @backtrace
|
16
|
+
end
|
17
|
+
|
18
|
+
def to_s
|
19
|
+
backtrace.map{ |location| "\tfrom %s" % location }.join("\n")
|
20
|
+
end
|
21
|
+
|
22
|
+
private
|
23
|
+
|
24
|
+
def before
|
25
|
+
nilify(@backtrace.take_while{ |location| not reject? location })
|
26
|
+
end
|
27
|
+
|
28
|
+
def outside
|
29
|
+
nilify(@backtrace.reject{ |location| reject? location })
|
30
|
+
end
|
31
|
+
|
32
|
+
def nilify(backtrace)
|
33
|
+
backtrace.empty? ? nil : backtrace
|
34
|
+
end
|
35
|
+
|
36
|
+
def reject?(location)
|
37
|
+
location.start_with? Root
|
38
|
+
end
|
39
|
+
|
40
|
+
Root = 4.times.reduce(__FILE__){ |path, _| File.dirname(path) }
|
41
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
|
3
|
+
class Lookout::Results::Failure < Lookout::Result
|
4
|
+
is :failure
|
5
|
+
|
6
|
+
def initialize(file, line, message)
|
7
|
+
super file, line
|
8
|
+
@message = message
|
9
|
+
end
|
10
|
+
|
11
|
+
attr_reader :message
|
12
|
+
|
13
|
+
def to_s
|
14
|
+
[super, message].compact.join(': ')
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
|
3
|
+
class Lookout::Runners::Console
|
4
|
+
def initialize(expectations = Lookout::Expectations.new)
|
5
|
+
@expectations = expectations
|
6
|
+
@run = true
|
7
|
+
end
|
8
|
+
|
9
|
+
def install
|
10
|
+
at_exit do
|
11
|
+
exit 1 unless @run and @expectations.evaluate.succeeded?
|
12
|
+
end
|
13
|
+
self
|
14
|
+
end
|
15
|
+
|
16
|
+
def expectations_eval(&block)
|
17
|
+
@expectations.instance_eval(&block)
|
18
|
+
rescue
|
19
|
+
@run = false
|
20
|
+
raise
|
21
|
+
end
|
22
|
+
end
|
data/lib/lookout/stub.rb
ADDED
@@ -0,0 +1,16 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
|
3
|
+
module Lookout::Stub
|
4
|
+
autoload :Method, 'lookout/stub/method'
|
5
|
+
autoload :Methods, 'lookout/stub/methods'
|
6
|
+
autoload :Object, 'lookout/stub/object'
|
7
|
+
|
8
|
+
class << self
|
9
|
+
def methods
|
10
|
+
methods = Methods.new
|
11
|
+
yield methods
|
12
|
+
ensure
|
13
|
+
methods.undefine if methods
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,105 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
|
3
|
+
class Lookout::Stub::Method
|
4
|
+
class Values
|
5
|
+
def initialize(*values)
|
6
|
+
@values = values
|
7
|
+
@offset = -1
|
8
|
+
end
|
9
|
+
|
10
|
+
def next
|
11
|
+
@offset = [@offset + 1, @values.count - 1].min
|
12
|
+
@values[@offset]
|
13
|
+
end
|
14
|
+
|
15
|
+
def call
|
16
|
+
yield(*self.next)
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
class Each
|
21
|
+
def initialize(*values)
|
22
|
+
@values = values
|
23
|
+
end
|
24
|
+
|
25
|
+
def call
|
26
|
+
@values.each do |value|
|
27
|
+
yield value
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
def initialize(object, method, &body)
|
33
|
+
@object, @method, @body = object, method.to_sym, body || Nil
|
34
|
+
@yield = nil
|
35
|
+
@defined = false
|
36
|
+
end
|
37
|
+
|
38
|
+
def yield(*values)
|
39
|
+
@yield = Values.new(*values)
|
40
|
+
self
|
41
|
+
end
|
42
|
+
|
43
|
+
def each(*values)
|
44
|
+
@yield = Each.new(*values)
|
45
|
+
self
|
46
|
+
end
|
47
|
+
|
48
|
+
def define
|
49
|
+
return self if @defined
|
50
|
+
define!
|
51
|
+
@defined = true
|
52
|
+
self
|
53
|
+
end
|
54
|
+
|
55
|
+
def call(*args, &block)
|
56
|
+
@yield.call(&block) if @yield and block
|
57
|
+
@body.call(*args)
|
58
|
+
end
|
59
|
+
|
60
|
+
def undefine
|
61
|
+
return self unless @defined
|
62
|
+
undefine!
|
63
|
+
@defined = false
|
64
|
+
self
|
65
|
+
end
|
66
|
+
|
67
|
+
private
|
68
|
+
|
69
|
+
Nil = proc{ Lookout::Stub::Object.new }
|
70
|
+
|
71
|
+
def define!
|
72
|
+
meta.module_exec(@method, visibility, stash, self) do |method, visibility, stash, stub|
|
73
|
+
alias_method stash, method if
|
74
|
+
method_defined? method or private_method_defined? method
|
75
|
+
define_method method do |*args, &block|
|
76
|
+
stub.call(*args, &block)
|
77
|
+
end
|
78
|
+
send visibility, method
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
82
|
+
def undefine!
|
83
|
+
meta.module_exec(@method, stash) do |method, stash|
|
84
|
+
remove_method method
|
85
|
+
if method_defined? stash or private_method_defined? stash
|
86
|
+
alias_method method, stash
|
87
|
+
remove_method stash
|
88
|
+
end
|
89
|
+
end
|
90
|
+
end
|
91
|
+
|
92
|
+
def visibility
|
93
|
+
meta.private_method_defined?(@method) ? :private :
|
94
|
+
meta.protected_method_defined?(@method) ? :protected :
|
95
|
+
:public
|
96
|
+
end
|
97
|
+
|
98
|
+
def stash
|
99
|
+
:"__stubbed_method_#{@method}"
|
100
|
+
end
|
101
|
+
|
102
|
+
def meta
|
103
|
+
(class << @object; self; end)
|
104
|
+
end
|
105
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
|
3
|
+
class Lookout::Stub::Methods
|
4
|
+
def initialize
|
5
|
+
@methods = []
|
6
|
+
end
|
7
|
+
|
8
|
+
def define(object, method, &body)
|
9
|
+
Lookout::Stub::Method.new(object, method, &body).define.tap{ |m| @methods << m }
|
10
|
+
end
|
11
|
+
|
12
|
+
def undefine
|
13
|
+
@methods.each do |method|
|
14
|
+
method.undefine
|
15
|
+
end
|
16
|
+
self
|
17
|
+
end
|
18
|
+
end
|
data/lib/lookout/ui.rb
ADDED
@@ -0,0 +1,36 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
|
3
|
+
class Lookout::UI::Console < Lookout::UI::Silent
|
4
|
+
def initialize(io = $stdout)
|
5
|
+
@io = io
|
6
|
+
end
|
7
|
+
|
8
|
+
def summarize(results, time)
|
9
|
+
return if results.succeeded?
|
10
|
+
summarize_total results, time
|
11
|
+
summarize_group results, :errors
|
12
|
+
summarize_group results, :failures
|
13
|
+
@io.flush
|
14
|
+
end
|
15
|
+
|
16
|
+
private
|
17
|
+
|
18
|
+
def summarize_total(results, time)
|
19
|
+
@io.printf "Ran %d expectations in %.3f seconds: %s\n",
|
20
|
+
results.size,
|
21
|
+
time,
|
22
|
+
[:errors, :failures, :fulfillments].inject([]){ |result, type|
|
23
|
+
next result unless (size = results.send(type).size) > 0
|
24
|
+
result << '%d %s' % [size, type]
|
25
|
+
}.join(', ')
|
26
|
+
end
|
27
|
+
|
28
|
+
def summarize_group(results, type)
|
29
|
+
group = results.send(type)
|
30
|
+
return if group.empty?
|
31
|
+
@io.puts '', type.to_s.upcase, ''
|
32
|
+
group.each do |item|
|
33
|
+
@io.puts item, ''
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|