lookout 2.0.1

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.
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