seeing_is_believing 3.0.0.beta.4 → 3.0.0.beta.5

Sign up to get free protection for your applications and to get access to all the features.
Files changed (72) hide show
  1. checksums.yaml +4 -4
  2. data/.travis.yml +0 -8
  3. data/Rakefile +1 -1
  4. data/Readme.md +65 -25
  5. data/bin/seeing_is_believing +1 -0
  6. data/docs/sib-streaming.gif +0 -0
  7. data/features/deprecated-flags.feature +62 -2
  8. data/features/errors.feature +12 -7
  9. data/features/examples.feature +143 -4
  10. data/features/flags.feature +89 -29
  11. data/features/regression.feature +58 -14
  12. data/features/support/env.rb +4 -0
  13. data/features/xmpfilter-style.feature +181 -36
  14. data/lib/seeing_is_believing.rb +44 -33
  15. data/lib/seeing_is_believing/binary.rb +31 -88
  16. data/lib/seeing_is_believing/binary/align_chunk.rb +30 -11
  17. data/lib/seeing_is_believing/binary/annotate_end_of_file.rb +10 -16
  18. data/lib/seeing_is_believing/binary/annotate_every_line.rb +5 -25
  19. data/lib/seeing_is_believing/binary/annotate_marked_lines.rb +136 -0
  20. data/lib/seeing_is_believing/binary/comment_lines.rb +8 -10
  21. data/lib/seeing_is_believing/binary/commentable_lines.rb +20 -26
  22. data/lib/seeing_is_believing/binary/config.rb +392 -0
  23. data/lib/seeing_is_believing/binary/data_structures.rb +57 -0
  24. data/lib/seeing_is_believing/binary/engine.rb +104 -0
  25. data/lib/seeing_is_believing/binary/{comment_formatter.rb → format_comment.rb} +6 -6
  26. data/lib/seeing_is_believing/binary/remove_annotations.rb +29 -28
  27. data/lib/seeing_is_believing/binary/rewrite_comments.rb +42 -43
  28. data/lib/seeing_is_believing/code.rb +105 -49
  29. data/lib/seeing_is_believing/debugger.rb +6 -5
  30. data/lib/seeing_is_believing/error.rb +6 -17
  31. data/lib/seeing_is_believing/evaluate_by_moving_files.rb +78 -129
  32. data/lib/seeing_is_believing/event_stream/consumer.rb +114 -64
  33. data/lib/seeing_is_believing/event_stream/events.rb +169 -11
  34. data/lib/seeing_is_believing/event_stream/handlers/debug.rb +57 -0
  35. data/lib/seeing_is_believing/event_stream/handlers/record_exitstatus.rb +18 -0
  36. data/lib/seeing_is_believing/event_stream/handlers/stream_json_events.rb +45 -0
  37. data/lib/seeing_is_believing/event_stream/handlers/update_result.rb +39 -0
  38. data/lib/seeing_is_believing/event_stream/producer.rb +25 -24
  39. data/lib/seeing_is_believing/hash_struct.rb +206 -0
  40. data/lib/seeing_is_believing/result.rb +20 -3
  41. data/lib/seeing_is_believing/the_matrix.rb +20 -12
  42. data/lib/seeing_is_believing/version.rb +1 -1
  43. data/lib/seeing_is_believing/wrap_expressions.rb +55 -115
  44. data/lib/seeing_is_believing/wrap_expressions_with_inspect.rb +14 -0
  45. data/seeing_is_believing.gemspec +1 -1
  46. data/spec/binary/alignment_specs.rb +27 -0
  47. data/spec/binary/comment_lines_spec.rb +3 -2
  48. data/spec/binary/config_spec.rb +657 -0
  49. data/spec/binary/engine_spec.rb +97 -0
  50. data/spec/binary/{comment_formatter_spec.rb → format_comment_spec.rb} +2 -2
  51. data/spec/binary/marker_spec.rb +71 -0
  52. data/spec/binary/options_spec.rb +0 -0
  53. data/spec/binary/remove_annotations_spec.rb +31 -18
  54. data/spec/binary/rewrite_comments_spec.rb +26 -11
  55. data/spec/code_spec.rb +190 -6
  56. data/spec/debugger_spec.rb +4 -0
  57. data/spec/evaluate_by_moving_files_spec.rb +38 -20
  58. data/spec/event_stream_spec.rb +265 -116
  59. data/spec/hash_struct_spec.rb +514 -0
  60. data/spec/seeing_is_believing_spec.rb +108 -46
  61. data/spec/spec_helper.rb +9 -0
  62. data/spec/wrap_expressions_spec.rb +207 -172
  63. metadata +30 -18
  64. data/docs/for-presentations +0 -33
  65. data/lib/seeing_is_believing/binary/annotate_xmpfilter_style.rb +0 -128
  66. data/lib/seeing_is_believing/binary/interpret_flags.rb +0 -156
  67. data/lib/seeing_is_believing/binary/parse_args.rb +0 -263
  68. data/lib/seeing_is_believing/event_stream/update_result.rb +0 -24
  69. data/lib/seeing_is_believing/inspect_expressions.rb +0 -21
  70. data/lib/seeing_is_believing/parser_helpers.rb +0 -82
  71. data/spec/binary/interpret_flags_spec.rb +0 -332
  72. data/spec/binary/parse_args_spec.rb +0 -415
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 088b9ff70b1691264f78741d8a0ac2ae7b1afdff
4
- data.tar.gz: e895553cdb771ebee4558794ae674be0420b3777
3
+ metadata.gz: 19acf5dae90b9e2cbad24fb2152392f3d22ab1f2
4
+ data.tar.gz: 8c9bc8df800a1289cd0997c392027351798cbee1
5
5
  SHA512:
6
- metadata.gz: df2363ea76fdbfbea79b7a224873bd9beb56d2cc97bd81bf650f43adf46c22e7577715c114d2977232b35f8f47aa6d3c528b1e094ac26b2e1933115b2e9aa82a
7
- data.tar.gz: d2a0cb8f4959efed7f3bfa5a47c1f7e3ac93c8d2652e4f6911b77d288b0bb02b3b20299ab589de51a4080e317213e70de697b50b04d8c3204095e3b7476902b8
6
+ metadata.gz: d2198f2a94a2c5a570c087d8753feec78e71b08ac1b300d8e68cb4439e73111df75e1e610899853ccf33f205fc23330c65de0c9d19fbb24b4eba844f7ba6ce29
7
+ data.tar.gz: 0e5842837786d01d8d141c679b877074d0c4297059d1e2d80a7fc9f5d48a9e595b5c1be1ee0f3975b6edb70ffc995f97ba1be2076ae4154352c24818896505ac
@@ -6,11 +6,3 @@ rvm:
6
6
  - 2.1.2
7
7
  - 2.2.0
8
8
  - ruby-head
9
- - rbx-2
10
- - jruby-head
11
-
12
- matrix:
13
- allow_failures:
14
- - rvm: ruby-head
15
- - rvm: jruby-head
16
- - rvm: rbx-2
data/Rakefile CHANGED
@@ -1,6 +1,6 @@
1
1
  desc 'run specs'
2
2
  task :spec do
3
- sh 'rspec -t ~not_implemented -cf d --fail-fast'
3
+ sh 'rspec -cf d --fail-fast'
4
4
  end
5
5
 
6
6
  desc 'run cukes'
data/Readme.md CHANGED
@@ -4,36 +4,28 @@
4
4
  Seeing Is Believing
5
5
  ===================
6
6
 
7
- Evaluates a file, recording the results of each line of code.
7
+ Evaluates Ruby code, recording the results of each line.
8
8
  Integrates with any extensible editor (I've integrated it with many already, see [the list](https://github.com/JoshCheek/seeing_is_believing#editor-integration).
9
9
 
10
10
  ![example](https://s3.amazonaws.com/josh.cheek/images/scratch/sib-example1.gif)
11
11
 
12
12
  Watch a [longer video](http://vimeo.com/73866851).
13
13
 
14
- Works in Ruby 1.9, 2.0, 2.1, rubinius (I **think**, need to make better tests), still trying to get it working with Jruby.
14
+ Works in Ruby 1.9, 2.0, 2.1, 2.2, rubinius (I **think**, need to make better tests), still trying to get it working with Jruby.
15
15
 
16
16
  Use The Binary
17
17
  ==============
18
18
 
19
- * Show every line of code (last expression)
20
- * Show only marked lines (xmpfilter style, except better b/c it understands expressions)
21
- * Clear annotations when they get in your way (even if code is invalid)
22
- * Smart enough to show
23
- * method arguments
24
- * if statement clauses
25
- * values in a hash
26
- * methods that are chained together across lines
27
- * multiline string/symbol/regex
28
-
29
- ```sh
30
- $ cat simple_example.rb
19
+ `cat simple_example.rb`
20
+
21
+ ```ruby
31
22
  5.times do |i|
32
23
  i * 2
33
24
  end
25
+ ```
34
26
 
35
-
36
- $ seeing_is_believing simple_example.rb
27
+ `seeing_is_believing simple_example.rb`
28
+ ```ruby
37
29
  5.times do |i| # => 5
38
30
  i * 2 # => 0, 2, 4, 6, 8
39
31
  end # => 5
@@ -64,7 +56,7 @@ result.exception # => nil
64
56
  Install
65
57
  =======
66
58
 
67
- Currently requires Ruby 1.9 or 2.0.
59
+ Currently requires Ruby 1.9 or 2.x
68
60
 
69
61
  $ gem install seeing_is_believing
70
62
 
@@ -101,17 +93,65 @@ or current buffer contents with the output of running it through
101
93
  Known Issues
102
94
  ============
103
95
 
104
- * `BEGIN/END` breaks things and I probably won't ever fix it, because it's annoying and it's really meant for command-line scripts... but there is currently a spec for it.
105
- * `exit!` ignores callbacks that `SeeingIsBelieving` uses to communicate the results back to the main app. If you call it, `SeeingIsBelieving` will blow up. We could "fix" this by overriding it, but I feel like that would violate the meaning of `exit!`, so basically, just don't call that method.
106
- * The code to find the data segment is naive, and could wind up interpolating results into a string or something.
96
+ * `begin; else; break; end` this code (an else without a resecue) will emit a warning in Ruby, and is omitted from `Parser`'s AST.
97
+ As such, I doubt that anyone will ever write it. But if you were to write it, it would blow up, because SiB rewrites your code, wrapping every expression that could have a value.
98
+ This code will be wrapped. But using the value is syntactically invalid in Ruby, because it constitutes a "void value expression" (aka a nightmare for anyone working with code).
99
+ I can't easily check it to seee if it's void since it's not in the parsed AST. But it's so edge taht I don't think it's worth worrying about.
100
+
101
+ Version 2
102
+ =========
103
+
104
+ Feature complete, I'll fix bugs in it until version 3 is released, though
105
+
106
+ Version 3
107
+ =========
107
108
 
108
- Shit that will probably never get done (or if it does, won't be until after 2.0)
109
- ================================================================================
109
+ These need to be done before release:
110
+
111
+ * Add default to number of captures (1000), require user to explicitly set it to infinity
112
+ * Update changelog with all changes
113
+ * Push the event stream up to the top level so we can expose it via the interface.
114
+ * Get it working on JRuby and Rbx
115
+ * Order frog stickers
116
+ * Figure out how to handle markers
117
+
118
+ Version 4
119
+ =========
110
120
 
111
121
  * How about if begin/rescue/end was able to record the result on the rescue section
112
- * How about if you could configure which kinds of results ou were interested in (e.g. turn on/off recording of method definitions, and other results)
113
- * What about recording the result of a line inside of a string interpolation, e.g. "a#{\n1\n}b" could record line 2 is 1 and line 3 is "a\n1\nb"
114
- * If given a file with a Unicode character, but not set Unicode, inform the user
122
+ * How about if you could configure which kinds of results you were interested in
123
+ (e.g. turn on/off recording of method definitions, and other results)
124
+ * What about recording the result of a line inside of a string interpolation,
125
+ e.g. "a#{\n1\n}b" could record line 2 is 1 and line 3 is "a\n1\nb"
126
+ This would require smarter annotators.
127
+ * Allow debugger to take a filename (ie debug to a file insteaad of to stderr)
128
+ * `--cd dir` cd to that dir before executing the code
129
+ * `--cd -` cd to the dir of the file being executed before executing it
130
+ * `--only-show-lines` output only on specified lines (doesn't change stdout/stderr/exceptions)
131
+ * More alignment strategies e.g. `min=40` would align to 40, unless that was too short.
132
+ Could have fallback strategies, so e.g. `-s min=40,fallback=line`
133
+ * Package Ruby with the editor downloads so that they don't require you to know so fkn much to set it up.
134
+ * Allow user to set marker
135
+
136
+ Inspiration
137
+ ===========
138
+
139
+ * [Xmpfilter](http://www.rubydoc.info/gems/rcodetools/0.8.5.0/Rcodetools/XMPFilter), which is a part of the [rcodetools gem](https://rubygems.org/gems/rcodetools).
140
+ * Bret Victor's completely inspiring talk [Inventing on Principle](https://www.youtube.com/watch?v=PUv66718DII).
141
+ * My 8th Light mentor, [Doug Bradbury](http://blog.8thlight.com/doug-bradbury/archive.html) who asked me to make it for his Kids Ruby sessions (I don't think we ever finished integrating it, though >.<)
142
+
143
+ Interestingly, [Swift playground](https://www.youtube.com/watch?v=oY6nQS3MiF8&t=25m51s)
144
+ are very similar (though better integrated since they cerce you into using xcode).
145
+ Released about a year and a half before them, but maybe I should take advantage of
146
+ their marketing anyway: Swift Playgrounds for Ruby!! :P
147
+
148
+ Shout outs
149
+ ==========
150
+
151
+ * Whitequark for all the work on [Parser](http://github.com/whitequark/parser/), which dramatically dramatically improved SiB (I used to have my own horribly shitty line-based parser)
152
+ * [Travis CI](https://travis-ci.org/JoshCheek/seeing_is_believing)... I love you times a million! So many difficult bugs have been caught by this.
153
+ It's so easy to work with, astoundingly convenient, helps me guarantee that SiB works on everyone else's computers, too. And it's free since SiB is open source.
154
+ I literally have a Travis CI sticker on my laptop, I love you that much.
115
155
 
116
156
  License
117
157
  =======
@@ -2,5 +2,6 @@
2
2
 
3
3
  $LOAD_PATH.unshift File.expand_path '../../lib', __FILE__
4
4
 
5
+ gem 'parser', '~> 2.2.0.2'
5
6
  require 'seeing_is_believing/binary'
6
7
  exit SeeingIsBelieving::Binary.call(ARGV, $stdin, $stdout, $stderr)
Binary file
@@ -5,8 +5,68 @@ Feature: Flags that are deprecated
5
5
  As such, these flags will continue to not blow up,
6
6
  even though they won't work anymore
7
7
 
8
- Scenario: --shebang
9
- When I run "seeing_is_believing -e 123 --shebang not/a/thing"
8
+ Scenario: --shebang with errors
9
+ When I run "seeing_is_believing -e 123 --shebang path/to/bin"
10
10
  Then stderr is empty
11
11
  And stdout is "123 # => 123"
12
12
  And the exit status is 0
13
+
14
+ Scenario: --shebang with errors
15
+ When I run "seeing_is_believing not_a_file.rb --shebang path/to/bin"
16
+ Then stdout is empty
17
+ And stderr is:
18
+ """
19
+ Error: not_a_file.rb does not exist!
20
+ Deprecated: `--shebang path/to/bin` SiB now uses the Ruby it was invoked with
21
+ """
22
+
23
+ Scenario: --number-of-captures without errors
24
+ Given the file "number_of_captures.rb":
25
+ """
26
+ 5.times do |i|
27
+ i
28
+ end
29
+ """
30
+ When I run "seeing_is_believing --number-of-captures 2 number_of_captures.rb"
31
+ Then stderr is empty
32
+ And stdout is:
33
+ """
34
+ 5.times do |i| # => 5
35
+ i # => 0, 1, ...
36
+ end # => 5
37
+ """
38
+ And the exit status is 0
39
+
40
+ Scenario: --shebang with errors
41
+ When I run "seeing_is_believing --shebang not/a/thing not_a_file.rb"
42
+ Then stdout is empty
43
+ And stderr is:
44
+ """
45
+ Error: not_a_file.rb does not exist!
46
+ Deprecated: `--shebang not/a/thing` SiB now uses the Ruby it was invoked with
47
+ """
48
+
49
+ Scenario: --number-of-captures with errors
50
+ When I run "seeing_is_believing not_a_file.rb --number-of-captures 2"
51
+ Then stdout is empty
52
+ And stderr is:
53
+ """
54
+ Error: not_a_file.rb does not exist!
55
+ Deprecated: `--number-of-captures 2` use --max-line-captures instead
56
+ """
57
+
58
+ Scenario: --inherit-exit-status without errors
59
+ Given the file "deprecated_inherit_exit_status.rb" "exit 123"
60
+ When I run "seeing_is_believing deprecated_inherit_exit_status.rb --inherit-exit-status"
61
+ Then stdout is "exit 123"
62
+ And stderr is empty
63
+ And the exit status is 123
64
+
65
+ Scenario: --inherit-exit-status with errors
66
+ When I run "seeing_is_believing not_a_file.rb --inherit-exit-status"
67
+ Then stdout is empty
68
+ And stderr is:
69
+ """
70
+ Error: not_a_file.rb does not exist!
71
+ Deprecated: `--inherit-exit-status` Dash has been removed for consistency, use --inherit-exitstatus
72
+ """
@@ -51,29 +51,34 @@ Feature: Running the binary unsuccessfully
51
51
  Scenario: Syntactically invalid file
52
52
  Given the file "invalid_syntax.rb":
53
53
  """
54
- 'abc
54
+ 'this is valid'
55
+ 'this is not
55
56
  """
56
57
  When I run "seeing_is_believing invalid_syntax.rb"
57
- Then stderr includes "1: unterminated string meets end of file"
58
+ Then stderr is:
59
+ """
60
+ Syntax Error: invalid_syntax.rb:2
61
+ unterminated string meets end of file
62
+ """
58
63
  And the exit status is 2
59
64
  And stdout is empty
60
65
 
61
66
  Scenario: Passing a nonexistent file
62
67
  When I run "seeing_is_believing this_file_does_not_exist.rb"
63
- Then stderr is "this_file_does_not_exist.rb does not exist!"
68
+ Then stderr is "Error: this_file_does_not_exist.rb does not exist!"
64
69
  And the exit status is 2
65
70
  And stdout is empty
66
71
 
67
72
  Scenario: Passing unknown options
68
73
  Given the file "some_file" "1"
69
74
  When I run "seeing_is_believing --unknown-option"
70
- Then stderr is 'Unknown option: "--unknown-option"'
75
+ Then stderr is 'Error: --unknown-option is not an option, see the help screen (-h) for a list of options'
71
76
  And the exit status is 2
72
77
  And stdout is empty
73
78
 
74
- Scenario: Passing an unknown option with a value but forgetting the filename
75
- When I run "seeing_is_believing --unknown-option some-value"
76
- Then stderr is 'Unknown option: "--unknown-option"'
79
+ Scenario: Reports deprecations with errors
80
+ When I run "seeing_is_believing this_file_does_not_exist.rb --number-of-captures 10"
81
+ Then stderr includes "--number-of-captures 10"
77
82
  And the exit status is 2
78
83
  And stdout is empty
79
84
 
@@ -105,7 +105,7 @@ Feature: Running the binary successfully
105
105
  def name
106
106
  @name # => "Josh", "Rick"
107
107
  end # => {{method_result :name}}
108
- end
108
+ end # => {{method_result :name}}
109
109
 
110
110
  User.new("Josh").name # => "Josh"
111
111
  User.new("Rick").name # => "Rick"
@@ -163,11 +163,13 @@ Feature: Running the binary successfully
163
163
  # !> goodbye
164
164
  """
165
165
 
166
- Scenario: Respects macros
166
+ Scenario: Respects macros / magic comments
167
167
  Given the file "some_dir/uses_macros.rb":
168
168
  """
169
+ # encoding: EUC-JP
169
170
  __FILE__
170
171
  __LINE__
172
+ __ENCODING__
171
173
  $stdout.puts "omg"
172
174
  $stderr.puts "hi"
173
175
  DATA.read
@@ -181,12 +183,14 @@ Feature: Running the binary successfully
181
183
  And the exit status is 0
182
184
  And stdout is:
183
185
  """
186
+ # encoding: EUC-JP
184
187
  __FILE__ # => "some_dir/uses_macros.rb"
185
- __LINE__ # => 2
188
+ __LINE__ # => 3
189
+ __ENCODING__ # => #<Encoding:EUC-JP>
186
190
  $stdout.puts "omg" # => nil
187
191
  $stderr.puts "hi" # => nil
188
192
  DATA.read # => "1\n2\n"
189
- __LINE__ # => 6
193
+ __LINE__ # => 8
190
194
 
191
195
  # >> omg
192
196
 
@@ -218,3 +222,138 @@ Feature: Running the binary successfully
218
222
  Then stderr is empty
219
223
  And the exit status is 0
220
224
  And stdout is "1 + 1 # => 2"
225
+
226
+ Scenario: Can exec another process, it records as many lines get exec'd, passes file descriptors, records exec'd output data
227
+ Given the stdin content "pass this through"
228
+ And the file "calls_exec.rb":
229
+ """
230
+ $stdout.puts "First program to stdout"
231
+ $stderr.puts "First program to stderr"
232
+ exec 'ruby', '-e', '
233
+ $stdout.puts "Stdin passed to second program: #{gets.inspect}"
234
+ $stderr.puts "Exec\'d file to stderr"
235
+ $stdout.flush
236
+ exec "ruby", "-v"
237
+ '
238
+ """
239
+ When I run "seeing_is_believing calls_exec.rb"
240
+ Then stderr is empty
241
+ And stdout is:
242
+ """
243
+ $stdout.puts "First program to stdout" # => nil
244
+ $stderr.puts "First program to stderr" # => nil
245
+ exec 'ruby', '-e', '
246
+ $stdout.puts "Stdin passed to second program: #{gets.inspect}"
247
+ $stderr.puts "Exec\'d file to stderr"
248
+ $stdout.flush
249
+ exec "ruby", "-v"
250
+ '
251
+
252
+ # >> First program to stdout
253
+ # >> Stdin passed to second program: "pass this through"
254
+ # >> {{`ruby -v`.chomp}}
255
+
256
+ # !> First program to stderr
257
+ # !> Exec'd file to stderr
258
+ """
259
+ And the exit status is 0
260
+
261
+
262
+ Scenario: Implicit regexp conditional
263
+ Given the stdin content "abc"
264
+ And the file "implicit_regex_conditional.rb":
265
+ """
266
+ gets
267
+ if /(.)c/
268
+ $1
269
+ end
270
+ """
271
+ When I run "seeing_is_believing implicit_regex_conditional.rb"
272
+ Then stdout is:
273
+ """
274
+ gets # => "abc"
275
+ if /(.)c/ # => 1
276
+ $1 # => "b"
277
+ end # => "b"
278
+ """
279
+
280
+
281
+ Scenario: BEGIN and END blocks
282
+ Given the file "BEGIN_and_END.rb":
283
+ """
284
+ # encoding: utf-8
285
+ p [:a, __LINE__]
286
+ BEGIN {
287
+ p [:b, __LINE__]
288
+ BEGIN { p [:c, __LINE__] }
289
+ }
290
+ p [:d, __LINE__]
291
+ END {
292
+ p [:e, __LINE__]
293
+ }
294
+ p [:f, __LINE__]
295
+ BEGIN { p [:g, __LINE__] }
296
+ END { p [:h, __LINE__] }
297
+ p [:i, __LINE__]
298
+ "π"
299
+ """
300
+ When I run "seeing_is_believing BEGIN_and_END.rb"
301
+ Then stderr is empty
302
+ Then stdout is:
303
+ """
304
+ # encoding: utf-8
305
+ p [:a, __LINE__] # => [:a, 2]
306
+ BEGIN {
307
+ p [:b, __LINE__] # => [:b, 4]
308
+ BEGIN { p [:c, __LINE__] } # => [:c, 5]
309
+ }
310
+ p [:d, __LINE__] # => [:d, 7]
311
+ END {
312
+ p [:e, __LINE__] # => [:e, 9]
313
+ }
314
+ p [:f, __LINE__] # => [:f, 11]
315
+ BEGIN { p [:g, __LINE__] } # => [:g, 12]
316
+ END { p [:h, __LINE__] } # => [:h, 13]
317
+ p [:i, __LINE__] # => [:i, 14]
318
+ "π" # => "π"
319
+
320
+ # >> [:c, 5]
321
+ # >> [:b, 4]
322
+ # >> [:g, 12]
323
+ # >> [:a, 2]
324
+ # >> [:d, 7]
325
+ # >> [:f, 11]
326
+ # >> [:i, 14]
327
+ # >> [:h, 13]
328
+ # >> [:e, 9]
329
+ """
330
+ When I run "seeing_is_believing BEGIN_and_END.rb --xmpfilter-style"
331
+ Then stderr is empty
332
+ Then stdout is:
333
+ """
334
+ # encoding: utf-8
335
+ p [:a, __LINE__]
336
+ BEGIN {
337
+ p [:b, __LINE__]
338
+ BEGIN { p [:c, __LINE__] }
339
+ }
340
+ p [:d, __LINE__]
341
+ END {
342
+ p [:e, __LINE__]
343
+ }
344
+ p [:f, __LINE__]
345
+ BEGIN { p [:g, __LINE__] }
346
+ END { p [:h, __LINE__] }
347
+ p [:i, __LINE__]
348
+ "π"
349
+
350
+ # >> [:c, 5]
351
+ # >> [:b, 4]
352
+ # >> [:g, 12]
353
+ # >> [:a, 2]
354
+ # >> [:d, 7]
355
+ # >> [:f, 11]
356
+ # >> [:i, 14]
357
+ # >> [:h, 13]
358
+ # >> [:e, 9]
359
+ """