lookout 2.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (118) hide show
  1. data/README +645 -0
  2. data/Rakefile +9 -0
  3. data/lib/lookout.rb +34 -0
  4. data/lib/lookout/aphonic.rb +40 -0
  5. data/lib/lookout/benchmark.rb +11 -0
  6. data/lib/lookout/diff.rb +10 -0
  7. data/lib/lookout/diff/algorithms.rb +5 -0
  8. data/lib/lookout/diff/algorithms/difflib.rb +38 -0
  9. data/lib/lookout/diff/algorithms/difflib/position.rb +92 -0
  10. data/lib/lookout/diff/algorithms/difflib/position/to.rb +47 -0
  11. data/lib/lookout/diff/formats.rb +7 -0
  12. data/lib/lookout/diff/formats/hash.rb +53 -0
  13. data/lib/lookout/diff/formats/inline.rb +39 -0
  14. data/lib/lookout/diff/formats/unified.rb +57 -0
  15. data/lib/lookout/diff/group.rb +61 -0
  16. data/lib/lookout/diff/groups.rb +34 -0
  17. data/lib/lookout/diff/match.rb +36 -0
  18. data/lib/lookout/diff/operation.rb +33 -0
  19. data/lib/lookout/diff/operations.rb +36 -0
  20. data/lib/lookout/diff/operations/delete.rb +9 -0
  21. data/lib/lookout/diff/operations/equal.rb +27 -0
  22. data/lib/lookout/diff/operations/insert.rb +9 -0
  23. data/lib/lookout/diff/operations/replace.rb +9 -0
  24. data/lib/lookout/diff/range.rb +91 -0
  25. data/lib/lookout/equality.rb +178 -0
  26. data/lib/lookout/expectation.rb +50 -0
  27. data/lib/lookout/expectations.rb +62 -0
  28. data/lib/lookout/expectations/behavior.rb +20 -0
  29. data/lib/lookout/expectations/state.rb +29 -0
  30. data/lib/lookout/mock.rb +18 -0
  31. data/lib/lookout/mock/method.rb +70 -0
  32. data/lib/lookout/mock/method/arguments.rb +33 -0
  33. data/lib/lookout/mock/method/arguments/any.rb +11 -0
  34. data/lib/lookout/mock/method/arguments/anything.rb +11 -0
  35. data/lib/lookout/mock/method/arguments/list.rb +15 -0
  36. data/lib/lookout/mock/method/arguments/none.rb +11 -0
  37. data/lib/lookout/mock/method/arguments/one.rb +11 -0
  38. data/lib/lookout/mock/method/calls.rb +11 -0
  39. data/lib/lookout/mock/method/calls/class.rb +21 -0
  40. data/lib/lookout/mock/method/calls/exactly.rb +28 -0
  41. data/lib/lookout/mock/method/calls/instance.rb +25 -0
  42. data/lib/lookout/mock/method/calls/lower.rb +22 -0
  43. data/lib/lookout/mock/method/calls/upper.rb +22 -0
  44. data/lib/lookout/mock/methods.rb +12 -0
  45. data/lib/lookout/mock/object.rb +12 -0
  46. data/lib/lookout/object.rb +11 -0
  47. data/lib/lookout/output.rb +21 -0
  48. data/lib/lookout/rake/tasks.rb +36 -0
  49. data/lib/lookout/rake/tasks/gem.rb +49 -0
  50. data/lib/lookout/rake/tasks/tags.rb +16 -0
  51. data/lib/lookout/rake/tasks/test.rb +46 -0
  52. data/lib/lookout/rake/tasks/test/loader.rb +19 -0
  53. data/lib/lookout/recorder.rb +45 -0
  54. data/lib/lookout/recorder/not.rb +11 -0
  55. data/lib/lookout/recorder/tape.rb +21 -0
  56. data/lib/lookout/recorders.rb +6 -0
  57. data/lib/lookout/recorders/reception.rb +47 -0
  58. data/lib/lookout/recorders/state.rb +35 -0
  59. data/lib/lookout/result.rb +23 -0
  60. data/lib/lookout/results.rb +46 -0
  61. data/lib/lookout/results/error.rb +18 -0
  62. data/lib/lookout/results/error/exception.rb +36 -0
  63. data/lib/lookout/results/error/exception/backtrace.rb +41 -0
  64. data/lib/lookout/results/failure.rb +16 -0
  65. data/lib/lookout/results/failures.rb +6 -0
  66. data/lib/lookout/results/failures/behavior.rb +4 -0
  67. data/lib/lookout/results/failures/state.rb +4 -0
  68. data/lib/lookout/results/fulfilled.rb +9 -0
  69. data/lib/lookout/runners.rb +5 -0
  70. data/lib/lookout/runners/console.rb +22 -0
  71. data/lib/lookout/stub.rb +16 -0
  72. data/lib/lookout/stub/method.rb +105 -0
  73. data/lib/lookout/stub/methods.rb +18 -0
  74. data/lib/lookout/stub/object.rb +11 -0
  75. data/lib/lookout/ui.rb +7 -0
  76. data/lib/lookout/ui/console.rb +36 -0
  77. data/lib/lookout/ui/silent.rb +12 -0
  78. data/lib/lookout/version.rb +5 -0
  79. data/lib/lookout/xml.rb +17 -0
  80. data/test/unit/examples.rb +169 -0
  81. data/test/unit/lookout.rb +7 -0
  82. data/test/unit/lookout/diff.rb +4 -0
  83. data/test/unit/lookout/diff/algorithms/difflib.rb +56 -0
  84. data/test/unit/lookout/diff/algorithms/difflib/position.rb +92 -0
  85. data/test/unit/lookout/diff/algorithms/difflib/position/to.rb +12 -0
  86. data/test/unit/lookout/diff/formats/inline.rb +17 -0
  87. data/test/unit/lookout/diff/formats/unified.rb +67 -0
  88. data/test/unit/lookout/diff/group.rb +4 -0
  89. data/test/unit/lookout/diff/groups.rb +102 -0
  90. data/test/unit/lookout/diff/match.rb +5 -0
  91. data/test/unit/lookout/diff/operations.rb +22 -0
  92. data/test/unit/lookout/diff/operations/delete.rb +45 -0
  93. data/test/unit/lookout/diff/operations/equal.rb +45 -0
  94. data/test/unit/lookout/diff/operations/insert.rb +45 -0
  95. data/test/unit/lookout/diff/operations/replace.rb +45 -0
  96. data/test/unit/lookout/diff/range.rb +50 -0
  97. data/test/unit/lookout/equality.rb +113 -0
  98. data/test/unit/lookout/expectation.rb +39 -0
  99. data/test/unit/lookout/expectations.rb +58 -0
  100. data/test/unit/lookout/expectations/behavior.rb +35 -0
  101. data/test/unit/lookout/expectations/state.rb +29 -0
  102. data/test/unit/lookout/mock.rb +4 -0
  103. data/test/unit/lookout/mock/method.rb +143 -0
  104. data/test/unit/lookout/mock/method/arguments.rb +57 -0
  105. data/test/unit/lookout/mock/method/arguments/any.rb +11 -0
  106. data/test/unit/lookout/recorder.rb +11 -0
  107. data/test/unit/lookout/results.rb +30 -0
  108. data/test/unit/lookout/results/error.rb +7 -0
  109. data/test/unit/lookout/results/failures/behavior.rb +7 -0
  110. data/test/unit/lookout/results/failures/state.rb +7 -0
  111. data/test/unit/lookout/results/fulfilled.rb +7 -0
  112. data/test/unit/lookout/runners/console.rb +4 -0
  113. data/test/unit/lookout/stub.rb +4 -0
  114. data/test/unit/lookout/stub/method.rb +48 -0
  115. data/test/unit/lookout/ui/formatters/exception.rb +5 -0
  116. data/test/unit/lookout/ui/formatters/exception/backtrace.rb +11 -0
  117. data/test/unit/lookout/xml.rb +55 -0
  118. metadata +496 -0
@@ -0,0 +1,9 @@
1
+ # -*- coding: utf-8 -*-
2
+
3
+ $:.unshift File.expand_path('../lib', __FILE__)
4
+ require 'lookout/rake/tasks'
5
+
6
+ Lookout::Rake::Tasks::Test.new do |t|
7
+ ENV['LOOKOUT_DO_NOT_FILTER_BACKTRACE'] = ''
8
+ end
9
+ Lookout::Rake::Tasks::Gem.new
@@ -0,0 +1,34 @@
1
+ # -*- coding: utf-8 -*-
2
+
3
+ module Lookout
4
+ autoload :Aphonic, 'lookout/aphonic'
5
+ autoload :Benchmark, 'lookout/benchmark'
6
+ autoload :Diff, 'lookout/diff'
7
+ autoload :Equality, 'lookout/equality'
8
+ autoload :Expectation, 'lookout/expectation'
9
+ autoload :Expectations, 'lookout/expectations'
10
+ autoload :Output, 'lookout/output'
11
+ autoload :Mock, 'lookout/mock'
12
+ autoload :Recorder, 'lookout/recorder'
13
+ autoload :Recorders, 'lookout/recorders'
14
+ autoload :Result, 'lookout/result'
15
+ autoload :Results, 'lookout/results'
16
+ autoload :Runners, 'lookout/runners'
17
+ autoload :Stub, 'lookout/stub'
18
+ autoload :UI, 'lookout/ui'
19
+ autoload :Version, 'lookout/version'
20
+ autoload :XML, 'lookout/xml'
21
+
22
+ class << self
23
+ def runner(runner = nil)
24
+ return @runner = runner if runner
25
+ @runner ||= Lookout::Runners::Console.new.install
26
+ end
27
+ end
28
+ end
29
+
30
+ require 'lookout/object'
31
+
32
+ def Expectations(&block)
33
+ Lookout.runner.expectations_eval(&block)
34
+ end
@@ -0,0 +1,40 @@
1
+ # -*- coding: utf-8 -*-
2
+
3
+ class Lookout::Aphonic
4
+ Methods = [
5
+ :__id__, :__send__, :object_id, # Methods that must be defined
6
+ :extend, :is_a? # Methods that we need
7
+ ]
8
+
9
+ def self.silence(name)
10
+ undef_method name if
11
+ instance_methods.include?(RUBY_VERSION < '1.9' ? name.to_s : name.to_sym) and
12
+ not Methods.include? name.to_sym
13
+ end
14
+
15
+ instance_methods.each do |name|
16
+ silence name
17
+ end
18
+ end
19
+
20
+ [Kernel, Object].each do |object|
21
+ object.instance_eval{ class << self; self; end }.instance_eval do
22
+ method_added = method(:method_added)
23
+ define_method :method_added do |name|
24
+ result = method_added.call(name)
25
+ Lookout::Aphonic.silence name if self == object
26
+ result
27
+ end
28
+ end
29
+ end
30
+
31
+ class Module
32
+ append_features = instance_method(:append_features)
33
+ define_method :append_features do |mod|
34
+ result = append_features.bind(self).call(mod)
35
+ instance_methods.each do |name|
36
+ Lookout::Aphonic.silence name
37
+ end if mod == Object
38
+ result
39
+ end
40
+ end
@@ -0,0 +1,11 @@
1
+ # -*- coding: utf-8 -*-
2
+
3
+ module Lookout::Benchmark
4
+ class << self
5
+ def time
6
+ start = Time.now.to_f
7
+ yield
8
+ Time.now.to_f - start
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,10 @@
1
+ module Lookout::Diff
2
+ autoload :Algorithms, 'lookout/diff/algorithms'
3
+ autoload :Formats, 'lookout/diff/formats'
4
+ autoload :Group, 'lookout/diff/group'
5
+ autoload :Groups, 'lookout/diff/groups'
6
+ autoload :Match, 'lookout/diff/match'
7
+ autoload :Operation, 'lookout/diff/operation'
8
+ autoload :Operations, 'lookout/diff/operations'
9
+ autoload :Range, 'lookout/diff/range'
10
+ end
@@ -0,0 +1,5 @@
1
+ # -*- coding: utf-8 -*-
2
+
3
+ module Lookout::Diff::Algorithms
4
+ autoload :Difflib, 'lookout/diff/algorithms/difflib'
5
+ end
@@ -0,0 +1,38 @@
1
+ # -*- coding: utf-8 -*-
2
+
3
+ class Lookout::Diff::Algorithms::Difflib
4
+ autoload :Position, 'lookout/diff/algorithms/difflib/position'
5
+
6
+ include Enumerable
7
+
8
+ def initialize(from, to, &is_junk)
9
+ @from, @to, @is_junk = from, to, is_junk
10
+ end
11
+
12
+ def each
13
+ current = Lookout::Diff::Match.new(Lookout::Diff::Range.new(@from, 0...0),
14
+ Lookout::Diff::Range.new(@to, 0...0))
15
+ stack = [Position.origin(@from, @to, &@is_junk)]
16
+ until stack.empty?
17
+ case item = stack.pop
18
+ when Position
19
+ match = item.match
20
+ next if match.empty?
21
+ stack.push item.begin_after(match) if item.ends_after? match
22
+ stack.push match
23
+ stack.push item.end_before(match) if item.begins_before? match
24
+ when Lookout::Diff::Match
25
+ if current.touches? item
26
+ current += item
27
+ else
28
+ yield current unless current.empty?
29
+ current = item
30
+ end
31
+ end
32
+ end
33
+ yield current unless current.empty?
34
+ yield Lookout::Diff::Match.new(current.from.at(@from.size...@from.size),
35
+ current.to.at(@to.size...@to.size))
36
+ self
37
+ end
38
+ end
@@ -0,0 +1,92 @@
1
+ # -*- coding: utf-8 -*-
2
+
3
+ class Lookout::Diff::Algorithms::Difflib::Position
4
+ autoload :To, 'lookout/diff/algorithms/difflib/position/to'
5
+
6
+ class << self
7
+ def origin(from, to)
8
+ to = To.new(to)
9
+ new(Lookout::Diff::Range.new(from),
10
+ to,
11
+ block_given? ?
12
+ to.indexes.reduce({}){ |j, (k, v)| j[k] = yield(k); j } :
13
+ {})
14
+ end
15
+ end
16
+
17
+ def initialize(from, to, junk)
18
+ @from, @to, @junk = from, to, junk
19
+ end
20
+
21
+ def match
22
+ match = leftmost_longest
23
+ junk.empty? ? match : expand(expand(match, false), true)
24
+ end
25
+
26
+ def begins_before?(match)
27
+ from.begins_before? match.from and to.begins_before? match.to
28
+ end
29
+
30
+ def ends_after?(match)
31
+ from.ends_after? match.from and to.ends_after? match.to
32
+ end
33
+
34
+ def begin_after(match)
35
+ self.class.new(from.begin_after(match.from), to.begin_after(match.to), junk)
36
+ end
37
+
38
+ def end_before(match)
39
+ self.class.new(from.end_before(match.from), to.end_before(match.to), junk)
40
+ end
41
+
42
+ def ==(other)
43
+ from == other.from and to == other.to and junk == other.junk
44
+ end
45
+
46
+ def inspect
47
+ '#<%s %p,%p>' % [self.class, from, to]
48
+ end
49
+
50
+ protected
51
+
52
+ attr_reader :from, :to, :junk
53
+
54
+ private
55
+
56
+ def leftmost_longest
57
+ match = Lookout::Diff::Match.new(@from.at(0...0), @to.at(0...0))
58
+ sizes = Hash.new(0)
59
+ @from.each_with_index do |item, from|
60
+ _sizes = Hash.new(0)
61
+ @to.each_index(item) do |to|
62
+ size = _sizes[to] = sizes[to - 1] + 1
63
+ match = Lookout::Diff::Match.
64
+ new(@from.at(from - size + 1..from),
65
+ @to.at(to - size + 1..to)) if size > match.size
66
+ end unless junk[item]
67
+ sizes = _sizes
68
+ end
69
+ match
70
+ end
71
+
72
+ def expand(match, junking)
73
+ from_begin, to_begin = match.from.begin, match.to.begin
74
+ while from_begin > @from.begin and to_begin > @to.begin and
75
+ junk[@to[to_begin - 1]] ^ !junking and
76
+ @from[from_begin - 1] == @to[to_begin - 1]
77
+ from_begin -= 1
78
+ to_begin -= 1
79
+ end
80
+
81
+ from_end, to_end = match.from.end, match.to.end
82
+ while from_end + 1 <= @from.end and to_end + 1 <= @to.end and
83
+ junk[@to[to_end + 1]] ^ !junking and
84
+ @from[from_end + 1] == @to[to_end + 1]
85
+ from_end += 1
86
+ to_end += 1
87
+ end
88
+
89
+ Lookout::Diff::Match.new(from.at(from_begin..from_end),
90
+ to.at(to_begin..to_end))
91
+ end
92
+ end
@@ -0,0 +1,47 @@
1
+ # -*- coding: utf-8 -*-
2
+
3
+ class Lookout::Diff::Algorithms::Difflib::Position::To <
4
+ Lookout::Diff::Range
5
+ def initialize(items, range = 0...items.size, indexes = nil)
6
+ super items, range
7
+ @indexes = indexes
8
+ end
9
+
10
+ def each_index(item)
11
+ indexes[item].each do |index|
12
+ next if index < range.begin
13
+ break if index > range.end
14
+ yield index
15
+ end
16
+ end
17
+
18
+ def indexes
19
+ return @indexes if @indexes
20
+ @indexes = Hash.new{ |h, k| h[k] = [] }
21
+ each = items.is_a?(String) ?
22
+ (' '[0].is_a?(Integer) ? :each_byte : :each_char) :
23
+ :each
24
+ i = 0
25
+ items.send(each) do |item|
26
+ @indexes[item] << i
27
+ i += 1
28
+ end
29
+ @indexes
30
+ end
31
+
32
+ def begin_after(other)
33
+ self.class.new(items, other.range.end + 1..range.end, indexes)
34
+ end
35
+
36
+ def end_before(other)
37
+ self.class.new(items, range.begin...other.range.begin, indexes)
38
+ end
39
+
40
+ def at(range)
41
+ Lookout::Diff::Range.new(items, range)
42
+ end
43
+
44
+ def ==(other)
45
+ super and indexes == other.indexes
46
+ end
47
+ end
@@ -0,0 +1,7 @@
1
+ # -*- coding: utf-8 -*-
2
+
3
+ module Lookout::Diff::Formats
4
+ autoload :Hash, 'lookout/diff/formats/hash'
5
+ autoload :Inline, 'lookout/diff/formats/inline'
6
+ autoload :Unified, 'lookout/diff/formats/unified'
7
+ end
@@ -0,0 +1,53 @@
1
+ # -*- coding: utf-8 -*-
2
+
3
+ class Lookout::Diff::Formats::Hash
4
+ include Enumerable
5
+
6
+ def initialize(operations)
7
+ @operations = operations
8
+ end
9
+
10
+ def each
11
+ @operations.each do |op|
12
+ operation = Operation.new(op)
13
+ yield operation.to_s unless operation.empty?
14
+ end
15
+ end
16
+
17
+ private
18
+
19
+ class Operation
20
+ def initialize(operation)
21
+ @lines = operation.apply(self)
22
+ end
23
+
24
+ def empty?
25
+ @lines.nil?
26
+ end
27
+
28
+ def delete(operation)
29
+ mark('-', operation.from)
30
+ end
31
+
32
+ def equal(operation)
33
+ end
34
+
35
+ def insert(operation)
36
+ mark('+', operation.to)
37
+ end
38
+
39
+ def replace(operation)
40
+ delete(operation) + insert(operation)
41
+ end
42
+
43
+ def to_s
44
+ @lines.join("\n")
45
+ end
46
+
47
+ private
48
+
49
+ def mark(mark, range)
50
+ range.map{ |item| '%s%s' % [mark, item] }
51
+ end
52
+ end
53
+ end
@@ -0,0 +1,39 @@
1
+ # -*- coding: utf-8 -*-
2
+
3
+ class Lookout::Diff::Formats::Inline
4
+ def initialize(operations)
5
+ @to_s = ToS.new(operations).to_s
6
+ end
7
+
8
+ def to_s
9
+ @to_s
10
+ end
11
+
12
+ private
13
+
14
+ class ToS
15
+ def initialize(operations)
16
+ @to_s = operations.map{ |o| o.apply(self) }.join('').freeze
17
+ end
18
+
19
+ def delete(operation)
20
+ '[-%s-]' % operation.from.to_items
21
+ end
22
+
23
+ def equal(operation)
24
+ operation.from.to_items
25
+ end
26
+
27
+ def insert(operation)
28
+ '{+%s+}' % operation.to.to_items
29
+ end
30
+
31
+ def replace(operation)
32
+ delete(operation) + insert(operation)
33
+ end
34
+
35
+ def to_s
36
+ @to_s
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,57 @@
1
+ # -*- coding: utf-8 -*-
2
+
3
+ class Lookout::Diff::Formats::Unified
4
+ include Enumerable
5
+
6
+ def initialize(groups)
7
+ @groups = groups
8
+ end
9
+
10
+ def each
11
+ @groups.each do |group|
12
+ next if group.parity?
13
+ yield Group.new(group).to_s
14
+ end
15
+ self
16
+ end
17
+
18
+ private
19
+
20
+ class Group
21
+ def initialize(group)
22
+ @group = group
23
+ end
24
+
25
+ def delete(operation)
26
+ mark('-', operation.from)
27
+ end
28
+
29
+ def equal(operation)
30
+ mark(' ', operation.from)
31
+ end
32
+
33
+ def insert(operation)
34
+ mark('+', operation.to)
35
+ end
36
+
37
+ def replace(operation)
38
+ delete(operation).concat(insert(operation))
39
+ end
40
+
41
+ def to_s
42
+ lines = ['@@ -%d,%d +%d,%d @@' %
43
+ [@group.from.begin + 1, @group.from.size,
44
+ @group.to.begin + 1, @group.to.size]]
45
+ @group.each do |operation|
46
+ lines.concat operation.apply(self)
47
+ end
48
+ lines.join("\n")
49
+ end
50
+
51
+ private
52
+
53
+ def mark(mark, range)
54
+ range.map{ |item| '%s%s' % [mark, item] }
55
+ end
56
+ end
57
+ end