seeing_is_believing 2.2.0 → 3.0.0.beta.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (60) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +1 -0
  3. data/Changelog.md +33 -0
  4. data/bin/seeing_is_believing +1 -1
  5. data/features/errors.feature +3 -3
  6. data/features/examples.feature +6 -6
  7. data/features/flags.feature +51 -196
  8. data/features/regression.feature +12 -3
  9. data/features/safe.feature +33 -0
  10. data/features/support/env.rb +20 -0
  11. data/features/xmpfilter-style.feature +156 -0
  12. data/lib/seeing_is_believing.rb +17 -35
  13. data/lib/seeing_is_believing/binary.rb +81 -176
  14. data/lib/seeing_is_believing/binary/align_chunk.rb +5 -7
  15. data/lib/seeing_is_believing/binary/align_file.rb +4 -5
  16. data/lib/seeing_is_believing/binary/align_line.rb +4 -4
  17. data/lib/seeing_is_believing/binary/annotate_end_of_file.rb +60 -0
  18. data/lib/seeing_is_believing/binary/annotate_every_line.rb +64 -0
  19. data/lib/seeing_is_believing/binary/annotate_xmpfilter_style.rb +133 -0
  20. data/lib/seeing_is_believing/binary/comment_formatter.rb +19 -5
  21. data/lib/seeing_is_believing/binary/comment_lines.rb +1 -1
  22. data/lib/seeing_is_believing/binary/commentable_lines.rb +1 -1
  23. data/lib/seeing_is_believing/binary/interpret_flags.rb +149 -0
  24. data/lib/seeing_is_believing/binary/parse_args.rb +96 -104
  25. data/lib/seeing_is_believing/binary/remove_annotations.rb +95 -0
  26. data/lib/seeing_is_believing/binary/rewrite_comments.rb +8 -30
  27. data/lib/seeing_is_believing/code.rb +99 -0
  28. data/lib/seeing_is_believing/evaluate_by_moving_files.rb +27 -19
  29. data/lib/seeing_is_believing/evaluate_with_eval_in.rb +27 -0
  30. data/lib/seeing_is_believing/event_stream/consumer.rb +111 -0
  31. data/lib/seeing_is_believing/event_stream/events.rb +16 -0
  32. data/lib/seeing_is_believing/event_stream/producer.rb +106 -0
  33. data/lib/seeing_is_believing/event_stream/update_result.rb +21 -0
  34. data/lib/seeing_is_believing/inspect_expressions.rb +24 -0
  35. data/lib/seeing_is_believing/parser_helpers.rb +1 -11
  36. data/lib/seeing_is_believing/result.rb +14 -56
  37. data/lib/seeing_is_believing/the_matrix.rb +14 -14
  38. data/lib/seeing_is_believing/version.rb +1 -1
  39. data/lib/seeing_is_believing/wrap_expressions.rb +32 -9
  40. data/seeing_is_believing.gemspec +7 -7
  41. data/spec/binary/comment_formatter_spec.rb +169 -18
  42. data/spec/binary/comment_lines_spec.rb +1 -1
  43. data/spec/binary/interpret_flags_spec.rb +307 -0
  44. data/spec/binary/parse_args_spec.rb +93 -91
  45. data/spec/binary/{clean_body_spec.rb → remove_annotations_spec.rb} +29 -22
  46. data/spec/binary/rewrite_comments_spec.rb +13 -13
  47. data/spec/code_spec.rb +49 -0
  48. data/spec/debugger_spec.rb +1 -1
  49. data/spec/evaluate_by_moving_files_spec.rb +7 -3
  50. data/spec/event_stream_spec.rb +390 -0
  51. data/spec/hard_core_ensure_spec.rb +1 -1
  52. data/spec/seeing_is_believing_spec.rb +137 -40
  53. data/spec/spec_helper.rb +3 -3
  54. data/spec/wrap_expressions_spec.rb +48 -35
  55. metadata +58 -35
  56. data/lib/seeing_is_believing/binary/add_annotations.rb +0 -144
  57. data/lib/seeing_is_believing/binary/clean_body.rb +0 -95
  58. data/lib/seeing_is_believing/has_exception.rb +0 -27
  59. data/lib/seeing_is_believing/line.rb +0 -90
  60. data/spec/line_spec.rb +0 -86
@@ -1,27 +0,0 @@
1
- class SeeingIsBelieving
2
-
3
- # We cannot serialize the actual exception because we do not have any guarantee that its class is defined on the SIB side,
4
- # so we must use simpler data structures (Strings and arrays)
5
- RecordedException = Struct.new :class_name, :message, :backtrace do
6
- def self.from_primitive(primitive)
7
- return nil unless primitive
8
- exception = new
9
- exception.class_name = primitive['class_name']
10
- exception.message = primitive['message']
11
- exception.backtrace = primitive['backtrace']
12
- exception
13
- end
14
-
15
- def to_primitive
16
- { 'class_name' => class_name,
17
- 'message' => message,
18
- 'backtrace' => backtrace,
19
- }
20
- end
21
- end
22
-
23
- module HasException
24
- attr_accessor :exception
25
- alias has_exception? exception
26
- end
27
- end
@@ -1,90 +0,0 @@
1
- require 'seeing_is_believing/has_exception'
2
-
3
- class SeeingIsBelieving
4
- # thin wrapper over an array, used by the result
5
- class Line
6
- include HasException
7
- include Enumerable
8
-
9
- # delegate all methods to the array, but return self where the array would be returned
10
- Array.instance_methods(false).sort.each do |method_name|
11
- define_method method_name do |*args, &block|
12
- result = @array.__send__ method_name, *args, &block
13
- result.equal?(@array) ? self : result
14
- end
15
- end
16
-
17
- def to_float(n)
18
- return n unless n == Float::INFINITY
19
- 'FUCKING_INFINITY_AND_JESUS_FUCKING_CHRIST_JSON_AND_MARSHAL_AND_YAML_WHAT_THE_FUCK?'
20
- end
21
-
22
- def from_float(n)
23
- return n if n.kind_of? Float
24
- Float::INFINITY
25
- end
26
-
27
- def to_primitive
28
- { 'array' => @array,
29
- 'max_number_of_captures' => to_float(@max_number_of_captures),
30
- 'num_results' => @num_results,
31
- 'total_size' => @total_size,
32
- 'exception' => (exception && exception.to_primitive)
33
- }
34
- end
35
-
36
- def from_primitive(primitive)
37
- @array = primitive['array']
38
- @max_number_of_captures = from_float primitive['max_number_of_captures']
39
- @num_results = primitive['num_results']
40
- @total_size = primitive['total_size']
41
- @exception = RecordedException.from_primitive primitive['exception']
42
- end
43
-
44
- def to_a
45
- @array.dup
46
- end
47
- alias to_ary to_a
48
-
49
- def initialize(array = [], max_number_of_captures=Float::INFINITY)
50
- @array = []
51
- @max_number_of_captures = max_number_of_captures
52
- @num_results = 0
53
- @total_size = 0
54
- array.each { |element| record_result element }
55
- end
56
-
57
- StackErrors = [SystemStackError]
58
- StackErrors << Java::JavaLang::StackOverflowError if defined?(RUBY_PLATFORM) && RUBY_PLATFORM == 'java'
59
- def record_result(value)
60
- begin
61
- inspected = value.inspect.to_str # only invoke inspect once, b/c the inspection may be recorded
62
- rescue NoMethodError
63
- inspected = "#<no inspect available>"
64
- rescue *StackErrors
65
- # this is necessary because SystemStackError won't show the backtrace of the method we tried to call
66
- # which means there won't be anything showing the user where this came from
67
- # so we need to re-raise the error to get a backtrace that shows where we came from
68
- # otherwise it looks like the bug is in SiB and not the user's program, see https://github.com/JoshCheek/seeing_is_believing/issues/37
69
- raise SystemStackError, "Calling inspect blew the stack (is it recursive w/o a base case?)"
70
- end
71
-
72
- if size < @max_number_of_captures then @array << inspected
73
- elsif size == @max_number_of_captures then @array << '...'
74
- end
75
- @num_results += 1
76
- @total_size += inspected.size
77
- self
78
- end
79
-
80
- def ==(ary_or_line)
81
- return @array == ary_or_line if Array === ary_or_line
82
- ary_or_line == @array && exception == ary_or_line.exception
83
- end
84
-
85
- def inspect
86
- inspected_exception = has_exception? ? "#{exception.class}:#{exception.message.inspect}" : "no exception"
87
- "#<SIB:Line#{@array.inspect} (#@num_results, #@total_size) #{inspected_exception}>"
88
- end
89
- end
90
- end
data/spec/line_spec.rb DELETED
@@ -1,86 +0,0 @@
1
- require 'spec_helper'
2
- require 'seeing_is_believing/result'
3
-
4
- describe SeeingIsBelieving::Line do
5
- Line = described_class
6
-
7
- def line_for(*args)
8
- line = Line.new
9
- args.each { |a| line.record_result a }
10
- line
11
- end
12
-
13
- it 'inspects prettily' do
14
- expect(line_for( ).inspect).to eq '#<SIB:Line[] (0, 0) no exception>'
15
- expect(line_for("a" ).inspect).to eq '#<SIB:Line["\"a\""] (1, 3) no exception>'
16
- expect(line_for("a", 12).inspect).to eq '#<SIB:Line["\"a\"", "12"] (2, 5) no exception>'
17
-
18
- line = Line.new
19
- line.exception = RuntimeError.new("omg")
20
- expect(line.inspect).to eq '#<SIB:Line[] (0, 0) RuntimeError:"omg">'
21
- end
22
-
23
- it "doesn't blow up when there is no #inspect available e.g. BasicObject" do
24
- obj = BasicObject.new
25
- expect(line_for(obj).inspect).to eq '#<SIB:Line["#<no inspect available>"] (1, 23) no exception>'
26
- end
27
-
28
- it "doesn't blow up when #inspect returns a not-String (e.g. pathalogical libraries like FactoryGirl)" do
29
- obj = BasicObject.new
30
- def obj.inspect
31
- nil
32
- end
33
- expect(line_for(obj).inspect).to eq '#<SIB:Line["#<no inspect available>"] (1, 23) no exception>'
34
- end
35
-
36
- it 'knows when it has an exception' do
37
- exception = RuntimeError.new 'omg'
38
- line = Line.new
39
- expect(line).to_not have_exception
40
- line.exception = exception
41
- expect(line).to have_exception
42
- expect(line.exception).to equal exception
43
- end
44
-
45
- it 'delegates its other methods to array, but returns itself where the array would be returned' do
46
- line = Line.new
47
- expect(line).to be_empty
48
- expect((line << 1)).to equal line
49
- expect(line).to_not be_empty
50
- expect(line.map { |i| i * 2 }).to eq [2]
51
- line << 10 << 100
52
- expect(line.take(2)).to eq [1, 10]
53
- end
54
-
55
- it 'returns its array for #to_a and #to_ary' do
56
- line = line_for 1, 2
57
- expect(line.to_a).to be_a_kind_of Array
58
- expect(line.to_a).to eq %w[1 2]
59
- expect(line.to_ary).to be_a_kind_of Array
60
- expect(line.to_ary).to eq %w[1 2]
61
- end
62
-
63
- it 'is equal to arrays with the same elements as its array' do
64
- expect(line_for(1, 2)).to eq %w[1 2]
65
- expect(line_for(1, 2)).to_not eq %w[2 1]
66
- end
67
-
68
- # Exception equality seems to be based off of the message, and be indifferent to the class, I don't think it's that important to fix it
69
- it "is equal to lines with the same elements and the same exception" do
70
- exception = RuntimeError.new 'omg'
71
-
72
- expect(line_for(1, 2)).to eq line_for(1, 2)
73
- expect(line_for(1, 2)).to_not eq line_for(2, 1)
74
-
75
- line1 = line_for(1, 2)
76
- line1.exception = exception
77
- expect(line1).to_not eq line_for(1, 2)
78
-
79
- line2 = line_for(1, 2)
80
- line2.exception = exception
81
- expect(line1).to eq line2
82
-
83
- line2.exception = RuntimeError.new 'wrong message'
84
- expect(line1).to_not eq line2
85
- end
86
- end