seeing_is_believing 2.2.0 → 3.0.0.beta.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 (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