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
metadata CHANGED
@@ -1,77 +1,83 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: seeing_is_believing
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.2.0
4
+ version: 3.0.0.beta.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Josh Cheek
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-01-05 00:00:00.000000000 Z
11
+ date: 2014-09-23 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
- name: parser
14
+ name: eval_in
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - ">="
18
- - !ruby/object:Gem::Version
19
- version: '2.2'
20
- - - "<"
17
+ - - "~>"
21
18
  - !ruby/object:Gem::Version
22
- version: '3.0'
19
+ version: 0.1.6
23
20
  type: :runtime
24
21
  prerelease: false
25
22
  version_requirements: !ruby/object:Gem::Requirement
26
23
  requirements:
27
- - - ">="
28
- - !ruby/object:Gem::Version
29
- version: '2.2'
30
- - - "<"
24
+ - - "~>"
31
25
  - !ruby/object:Gem::Version
32
- version: '3.0'
26
+ version: 0.1.6
33
27
  - !ruby/object:Gem::Dependency
34
- name: psych
28
+ name: parser
35
29
  requirement: !ruby/object:Gem::Requirement
36
30
  requirements:
37
- - - "~>"
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: 2.1.4
34
+ - - "<"
38
35
  - !ruby/object:Gem::Version
39
- version: '2.0'
36
+ version: '2.3'
40
37
  type: :runtime
41
38
  prerelease: false
42
39
  version_requirements: !ruby/object:Gem::Requirement
43
40
  requirements:
44
- - - "~>"
41
+ - - ">="
42
+ - !ruby/object:Gem::Version
43
+ version: 2.1.4
44
+ - - "<"
45
45
  - !ruby/object:Gem::Version
46
- version: '2.0'
46
+ version: '2.3'
47
47
  - !ruby/object:Gem::Dependency
48
- name: pry
48
+ name: webmock
49
49
  requirement: !ruby/object:Gem::Requirement
50
50
  requirements:
51
51
  - - "~>"
52
52
  - !ruby/object:Gem::Version
53
- version: 0.10.0
53
+ version: '1.18'
54
54
  type: :development
55
55
  prerelease: false
56
56
  version_requirements: !ruby/object:Gem::Requirement
57
57
  requirements:
58
58
  - - "~>"
59
59
  - !ruby/object:Gem::Version
60
- version: 0.10.0
60
+ version: '1.18'
61
61
  - !ruby/object:Gem::Dependency
62
62
  name: haiti
63
63
  requirement: !ruby/object:Gem::Requirement
64
64
  requirements:
65
- - - "~>"
65
+ - - ">="
66
66
  - !ruby/object:Gem::Version
67
- version: 0.1.0
67
+ version: '0.1'
68
+ - - "<"
69
+ - !ruby/object:Gem::Version
70
+ version: '0.3'
68
71
  type: :development
69
72
  prerelease: false
70
73
  version_requirements: !ruby/object:Gem::Requirement
71
74
  requirements:
72
- - - "~>"
75
+ - - ">="
73
76
  - !ruby/object:Gem::Version
74
- version: 0.1.0
77
+ version: '0.1'
78
+ - - "<"
79
+ - !ruby/object:Gem::Version
80
+ version: '0.3'
75
81
  - !ruby/object:Gem::Dependency
76
82
  name: rake
77
83
  requirement: !ruby/object:Gem::Requirement
@@ -140,6 +146,7 @@ extra_rdoc_files: []
140
146
  files:
141
147
  - ".gitignore"
142
148
  - ".travis.yml"
149
+ - Changelog.md
143
150
  - Gemfile
144
151
  - Rakefile
145
152
  - Readme.md
@@ -151,40 +158,52 @@ files:
151
158
  - features/examples.feature
152
159
  - features/flags.feature
153
160
  - features/regression.feature
161
+ - features/safe.feature
154
162
  - features/support/env.rb
163
+ - features/xmpfilter-style.feature
155
164
  - lib/seeing_is_believing.rb
156
165
  - lib/seeing_is_believing/binary.rb
157
- - lib/seeing_is_believing/binary/add_annotations.rb
158
166
  - lib/seeing_is_believing/binary/align_chunk.rb
159
167
  - lib/seeing_is_believing/binary/align_file.rb
160
168
  - lib/seeing_is_believing/binary/align_line.rb
161
- - lib/seeing_is_believing/binary/clean_body.rb
169
+ - lib/seeing_is_believing/binary/annotate_end_of_file.rb
170
+ - lib/seeing_is_believing/binary/annotate_every_line.rb
171
+ - lib/seeing_is_believing/binary/annotate_xmpfilter_style.rb
162
172
  - lib/seeing_is_believing/binary/comment_formatter.rb
163
173
  - lib/seeing_is_believing/binary/comment_lines.rb
164
174
  - lib/seeing_is_believing/binary/commentable_lines.rb
175
+ - lib/seeing_is_believing/binary/interpret_flags.rb
165
176
  - lib/seeing_is_believing/binary/parse_args.rb
177
+ - lib/seeing_is_believing/binary/remove_annotations.rb
166
178
  - lib/seeing_is_believing/binary/rewrite_comments.rb
179
+ - lib/seeing_is_believing/code.rb
167
180
  - lib/seeing_is_believing/debugger.rb
168
181
  - lib/seeing_is_believing/error.rb
169
182
  - lib/seeing_is_believing/evaluate_by_moving_files.rb
183
+ - lib/seeing_is_believing/evaluate_with_eval_in.rb
184
+ - lib/seeing_is_believing/event_stream/consumer.rb
185
+ - lib/seeing_is_believing/event_stream/events.rb
186
+ - lib/seeing_is_believing/event_stream/producer.rb
187
+ - lib/seeing_is_believing/event_stream/update_result.rb
170
188
  - lib/seeing_is_believing/hard_core_ensure.rb
171
- - lib/seeing_is_believing/has_exception.rb
172
- - lib/seeing_is_believing/line.rb
189
+ - lib/seeing_is_believing/inspect_expressions.rb
173
190
  - lib/seeing_is_believing/parser_helpers.rb
174
191
  - lib/seeing_is_believing/result.rb
175
192
  - lib/seeing_is_believing/the_matrix.rb
176
193
  - lib/seeing_is_believing/version.rb
177
194
  - lib/seeing_is_believing/wrap_expressions.rb
178
195
  - seeing_is_believing.gemspec
179
- - spec/binary/clean_body_spec.rb
180
196
  - spec/binary/comment_formatter_spec.rb
181
197
  - spec/binary/comment_lines_spec.rb
198
+ - spec/binary/interpret_flags_spec.rb
182
199
  - spec/binary/parse_args_spec.rb
200
+ - spec/binary/remove_annotations_spec.rb
183
201
  - spec/binary/rewrite_comments_spec.rb
202
+ - spec/code_spec.rb
184
203
  - spec/debugger_spec.rb
185
204
  - spec/evaluate_by_moving_files_spec.rb
205
+ - spec/event_stream_spec.rb
186
206
  - spec/hard_core_ensure_spec.rb
187
- - spec/line_spec.rb
188
207
  - spec/seeing_is_believing_spec.rb
189
208
  - spec/spec_helper.rb
190
209
  - spec/wrap_expressions_spec.rb
@@ -243,9 +262,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
243
262
  version: '0'
244
263
  required_rubygems_version: !ruby/object:Gem::Requirement
245
264
  requirements:
246
- - - ">="
265
+ - - ">"
247
266
  - !ruby/object:Gem::Version
248
- version: '0'
267
+ version: 1.3.1
249
268
  requirements: []
250
269
  rubyforge_project: seeing_is_believing
251
270
  rubygems_version: 2.4.1
@@ -257,16 +276,20 @@ test_files:
257
276
  - features/examples.feature
258
277
  - features/flags.feature
259
278
  - features/regression.feature
279
+ - features/safe.feature
260
280
  - features/support/env.rb
261
- - spec/binary/clean_body_spec.rb
281
+ - features/xmpfilter-style.feature
262
282
  - spec/binary/comment_formatter_spec.rb
263
283
  - spec/binary/comment_lines_spec.rb
284
+ - spec/binary/interpret_flags_spec.rb
264
285
  - spec/binary/parse_args_spec.rb
286
+ - spec/binary/remove_annotations_spec.rb
265
287
  - spec/binary/rewrite_comments_spec.rb
288
+ - spec/code_spec.rb
266
289
  - spec/debugger_spec.rb
267
290
  - spec/evaluate_by_moving_files_spec.rb
291
+ - spec/event_stream_spec.rb
268
292
  - spec/hard_core_ensure_spec.rb
269
- - spec/line_spec.rb
270
293
  - spec/seeing_is_believing_spec.rb
271
294
  - spec/spec_helper.rb
272
295
  - spec/wrap_expressions_spec.rb
@@ -1,144 +0,0 @@
1
- require 'stringio'
2
- require 'seeing_is_believing/has_exception'
3
- require 'seeing_is_believing/binary/comment_formatter'
4
-
5
- require 'seeing_is_believing/binary'
6
- require 'seeing_is_believing/binary/clean_body'
7
- require 'seeing_is_believing/binary/rewrite_comments'
8
- require 'seeing_is_believing/binary/comment_lines'
9
-
10
- class SeeingIsBelieving
11
- class Binary
12
- class AddAnnotations
13
- include HasException
14
-
15
- def self.method_from_options(*args)
16
- define_method(args.first) { options.fetch *args }
17
- end
18
-
19
- method_from_options :filename, nil
20
- method_from_options :start_line # rename: line_to_begin_recording
21
- method_from_options :end_line # rename: line_to_end_recording
22
- method_from_options :xmpfilter_style
23
- method_from_options :debugger
24
-
25
- attr_accessor :results, :body
26
- def initialize(uncleaned_body, options={}, &annotater)
27
- self.options = options
28
- self.body = CleanBody.call uncleaned_body, !xmpfilter_style
29
- self.results = SeeingIsBelieving.call body,
30
- filename: (options[:as] || options[:filename]),
31
- require: options[:require],
32
- load_path: options[:load_path],
33
- encoding: options[:encoding],
34
- stdin: options[:stdin],
35
- timeout: options[:timeout],
36
- debugger: debugger,
37
- ruby_executable: options[:shebang],
38
- number_of_captures: options[:number_of_captures]
39
- end
40
-
41
- def call
42
- @new_body ||= begin
43
- new_body = if xmpfilter_style
44
- body_with_updated_annotations
45
- else
46
- body_with_everything_annotated
47
- end
48
-
49
- add_stdout_stderr_and_exceptions_to new_body
50
-
51
- debugger.context "OUTPUT"
52
- new_body
53
- end
54
- end
55
-
56
- private
57
-
58
- attr_accessor :body, :options, :alignment_strategy
59
-
60
- # doesn't currently realign output markers, do we want to do that?
61
- def body_with_updated_annotations
62
- RewriteComments.call body do |line_number, line_to_whitespace, whitespace, comment|
63
- if !comment[VALUE_REGEX]
64
- [whitespace, comment]
65
- elsif line_to_whitespace.empty?
66
- result = results[line_number-1].map { |result| result.gsub "\n", '\n' }.join(', ')
67
- [whitespace, CommentFormatter.call(whitespace.size, VALUE_MARKER, result, options)]
68
- else
69
- result = results[line_number].map { |result| result.gsub "\n", '\n' }.join(', ')
70
- [whitespace, CommentFormatter.call(line_to_whitespace.size + whitespace.size, VALUE_MARKER, result, options)]
71
- end
72
- end
73
- end
74
-
75
- def body_with_everything_annotated
76
- alignment_strategy = options[:alignment_strategy].new body, start_line, end_line
77
- CommentLines.call body do |line, line_number|
78
- options = options().merge pad_to: alignment_strategy.line_length_for(line_number)
79
- if line_number < start_line || end_line < line_number
80
- ''
81
- elsif results[line_number].has_exception?
82
- exception = results[line_number].exception
83
- result = sprintf "%s: %s", exception.class_name, exception.message.gsub("\n", '\n')
84
- CommentFormatter.call(line.size, EXCEPTION_MARKER, result, options)
85
- elsif results[line_number].any?
86
- result = results[line_number].map { |result| result.gsub "\n", '\n' }.join(', ')
87
- CommentFormatter.call(line.size, VALUE_MARKER, result, options)
88
- else
89
- ''
90
- end
91
- end
92
- end
93
-
94
- def add_stdout_stderr_and_exceptions_to(new_body)
95
- output = stdout_ouptut_for(results) <<
96
- stderr_ouptut_for(results) <<
97
- exception_output_for(results)
98
-
99
- # this technically could find an __END__ in a string or whatever
100
- # going to just ignore that, though
101
- if new_body[/^__END__$/]
102
- new_body.sub! "\n__END__", "\n#{output}__END__"
103
- else
104
- new_body << "\n" unless new_body.end_with? "\n"
105
- new_body << output
106
- end
107
- end
108
-
109
- def stdout_ouptut_for(results)
110
- return '' unless results.has_stdout?
111
- output = "\n"
112
- results.stdout.each_line do |line|
113
- output << CommentFormatter.call(0, STDOUT_MARKER, line.chomp, options()) << "\n"
114
- end
115
- output
116
- end
117
-
118
- def stderr_ouptut_for(results)
119
- return '' unless results.has_stderr?
120
- output = "\n"
121
- results.stderr.each_line do |line|
122
- output << CommentFormatter.call(0, STDERR_MARKER, line.chomp, options()) << "\n"
123
- end
124
- output
125
- end
126
-
127
- def exception_output_for(results)
128
- return '' unless results.has_exception?
129
- exception = results.exception
130
- output = "\n"
131
- output << CommentFormatter.new(0, EXCEPTION_MARKER, exception.class_name, options).call << "\n"
132
- exception.message.each_line do |line|
133
- output << CommentFormatter.new(0, EXCEPTION_MARKER, line.chomp, options).call << "\n"
134
- end
135
- output << EXCEPTION_MARKER.sub(/\s+$/, '') << "\n"
136
- exception.backtrace.each do |line|
137
- output << CommentFormatter.new(0, EXCEPTION_MARKER, line.chomp, options).call << "\n"
138
- end
139
- output
140
- end
141
-
142
- end
143
- end
144
- end
@@ -1,95 +0,0 @@
1
- # CleanedBody
2
- # takes a body
3
- # removes annotations
4
- # only removes "# =>" when should_clean_values is false
5
-
6
- require 'seeing_is_believing/binary'
7
- require 'seeing_is_believing/parser_helpers'
8
-
9
- class SeeingIsBelieving
10
- class Binary
11
- class CleanBody
12
- def self.call(code, should_clean_values)
13
- new(code, should_clean_values).call
14
- end
15
-
16
- def initialize(code, should_clean_values)
17
- self.should_clean_values = should_clean_values
18
- self.code = code
19
- end
20
-
21
- def call
22
- buffer, parser, rewriter = ParserHelpers.initialize_parser code, 'strip_comments'
23
- comments = ParserHelpers.comments_from parser, buffer
24
-
25
- removed_comments = { result: [], exception: [], stdout: [], stderr: [] }
26
-
27
- comments.each do |comment|
28
- case comment.text
29
- when VALUE_REGEX
30
- if should_clean_values
31
- removed_comments[:result] << comment
32
- rewriter.remove comment.location.expression
33
- end
34
- when EXCEPTION_REGEX
35
- removed_comments[:exception] << comment
36
- rewriter.remove comment.location.expression
37
- when STDOUT_REGEX
38
- removed_comments[:stdout] << comment
39
- rewriter.remove comment.location.expression
40
- when STDERR_REGEX
41
- removed_comments[:stderr] << comment
42
- rewriter.remove comment.location.expression
43
- end
44
- end
45
-
46
- remove_whitespace_preceeding_comments(buffer, rewriter, removed_comments)
47
- rewriter.process
48
- rescue Parser::SyntaxError => e
49
- raise SyntaxError, e.message
50
- end
51
-
52
- private
53
-
54
- attr_accessor :code, :should_clean_values, :buffer
55
-
56
- def remove_whitespace_preceeding_comments(buffer, rewriter, removed_comments)
57
- removed_comments[:result].each { |comment| remove_whitespace_before comment.location.expression.begin_pos, buffer, rewriter, false }
58
- removed_comments[:exception].each { |comment| remove_whitespace_before comment.location.expression.begin_pos, buffer, rewriter, true }
59
- removed_comments[:stdout].each { |comment| remove_whitespace_before comment.location.expression.begin_pos, buffer, rewriter, true }
60
- removed_comments[:stderr].each { |comment| remove_whitespace_before comment.location.expression.begin_pos, buffer, rewriter, true }
61
- end
62
-
63
- # any whitespace before the index (on the same line) will be removed
64
- # if the preceeding whitespace is at the beginning of the line, the newline will be removed
65
- # if there is a newline before all of that, and remove_preceeding_newline is true, it will be removed as well
66
- def remove_whitespace_before(index, buffer, rewriter, remove_preceeding_newline)
67
- end_pos = index
68
- begin_pos = end_pos - 1
69
- begin_pos -= 1 while code[begin_pos] =~ /\s/ && code[begin_pos] != "\n"
70
- begin_pos -= 1 if code[begin_pos] == "\n"
71
- begin_pos -= 1 if code[begin_pos] == "\n" && remove_preceeding_newline
72
- return if begin_pos.next == end_pos
73
- rewriter.remove Parser::Source::Range.new(buffer, begin_pos.next, end_pos)
74
- end
75
-
76
- # returns comments in groups that are on consecutive lines
77
- def adjacent_comments(comments, buffer)
78
- comments = comments.sort_by { |comment| comment.location.begin_pos }
79
- current_chunk = 0
80
- last_line_seen = -100
81
- chunks_to_comment = comments.chunk do |comment|
82
- line = comment.location.begin_pos.line
83
- if last_line_seen.next == line
84
- last_line_seen = line
85
- current_chunk
86
- else
87
- last_line_seen = line
88
- current_chunk += 1
89
- end
90
- end
91
- chunks_to_comment.map &:last
92
- end
93
- end
94
- end
95
- end