seeing_is_believing 3.0.0.beta.6 → 3.0.0.beta.7
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.
- checksums.yaml +4 -4
- data/.rspec +1 -3
- data/.travis.yml +3 -2
- data/Gemfile +0 -1
- data/Rakefile +5 -5
- data/Readme.md +9 -5
- data/features/regression.feature +1 -2
- data/lib/seeing_is_believing/binary/annotate_end_of_file.rb +1 -1
- data/lib/seeing_is_believing/binary/annotate_marked_lines.rb +19 -8
- data/lib/seeing_is_believing/binary/comment_lines.rb +1 -1
- data/lib/seeing_is_believing/code.rb +11 -36
- data/lib/seeing_is_believing/the_matrix.rb +4 -0
- data/lib/seeing_is_believing/version.rb +1 -1
- data/lib/seeing_is_believing/wrap_expressions.rb +12 -5
- data/lib/seeing_is_believing/wrap_expressions_with_inspect.rb +4 -2
- data/seeing_is_believing.gemspec +2 -1
- data/spec/event_stream_spec.rb +1 -1
- data/spec/seeing_is_believing_spec.rb +8 -0
- data/spec/wrap_expressions_spec.rb +6 -10
- metadata +18 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 866178b03727394e7c24c5cfbaa48ea4edbca4e1
|
4
|
+
data.tar.gz: cfe4540e781ec9aa65b79a950d8760058136a85d
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 514947858dab6b669eeb25f8b729e330d9435b438f2821073a56a12226451710a54f775415591e56c8673d071e276c102ec7ca001f4f6f2ce03fe9d2f1282b7b
|
7
|
+
data.tar.gz: 341dea9e96e9e1c57565254830f5f22648bcd2b9363d492b1a8718dddc54e30861c449d5374f3822e7ef7c88ce89ea107c79e5049c7e216a35a88c3b8440f735
|
data/.rspec
CHANGED
data/.travis.yml
CHANGED
data/Gemfile
CHANGED
data/Rakefile
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
require 'bundler'
|
2
2
|
|
3
3
|
desc 'Have Bundler setup a standalone environment -- run tests in this, b/c its faster and safer'
|
4
|
-
task :
|
4
|
+
task :install do
|
5
5
|
# Running without rubygems # http://myronmars.to/n/dev-blog/2012/03/faster-test-boot-times-with-bundler-standalone
|
6
6
|
sh 'bundle install --standalone --binstubs bundle/bin'
|
7
7
|
end
|
@@ -17,14 +17,14 @@ task :clean do
|
|
17
17
|
]
|
18
18
|
end
|
19
19
|
|
20
|
-
|
21
|
-
$stderr.puts "\e[31mLooks like the gems aren\'t installed, run `rake
|
20
|
+
directory 'bundle' do
|
21
|
+
$stderr.puts "\e[31mLooks like the gems aren\'t installed, run `rake install` to install them\e[39m"
|
22
22
|
exit 1
|
23
23
|
end
|
24
24
|
|
25
25
|
desc 'Run specs'
|
26
26
|
task spec: :bundle do
|
27
|
-
sh 'ruby', '--disable-gem', *Bundler.load.specs.flat_map(&:full_require_paths).flat_map { |p| ['-I', p ] }, '-S', 'bundle/bin/
|
27
|
+
sh 'ruby', '--disable-gem', *Bundler.load.specs.flat_map(&:full_require_paths).flat_map { |p| ['-I', p ] }, '-S', 'bundle/bin/mrspec'
|
28
28
|
end
|
29
29
|
|
30
30
|
desc 'Run cukes'
|
@@ -36,4 +36,4 @@ desc 'Run all specs and cukes'
|
|
36
36
|
task default: [:spec, :cuke]
|
37
37
|
|
38
38
|
desc 'Install dependencies and run tests (mainly for Travis CI)'
|
39
|
-
task ci: [:
|
39
|
+
task ci: [:install, :spec, :cuke]
|
data/Readme.md
CHANGED
@@ -5,7 +5,7 @@ Seeing Is Believing
|
|
5
5
|
===================
|
6
6
|
|
7
7
|
Evaluates Ruby code, recording the results of each line.
|
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).
|
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
|

|
11
11
|
|
@@ -72,7 +72,7 @@ Editor Integration
|
|
72
72
|
Vim
|
73
73
|
===
|
74
74
|
|
75
|
-
I didn't write either of these, but they both support Seeing Is
|
75
|
+
I didn't write either of these, but they both support Seeing Is Believing. I've looked through the code, it works reasonably. One of them, I wound up having to edit the installed package, don't remember which.
|
76
76
|
|
77
77
|
* [vim-ruby-xmpfilter](https://github.com/t9md/vim-ruby-xmpfilter)
|
78
78
|
* [vim-seeing-is-believing](https://github.com/hwartig/vim-seeing-is-believing)
|
@@ -80,7 +80,9 @@ I didn't write either of these, but they both support Seeing Is Beleiving. I've
|
|
80
80
|
Emacs Integration
|
81
81
|
=================
|
82
82
|
|
83
|
-
|
83
|
+
You can use my friend's configuration [file](https://github.com/jcinnamond/seeing-is-believing).
|
84
|
+
|
85
|
+
Or, adding this function to your Emacs configuration will get you pretty far:
|
84
86
|
|
85
87
|
```scheme
|
86
88
|
(defun seeing-is-believing ()
|
@@ -88,8 +90,10 @@ Add this function to your Emacs configuration:
|
|
88
90
|
of seeing_is_believing."
|
89
91
|
(interactive)
|
90
92
|
(let ((beg (if (region-active-p) (region-beginning) (point-min)))
|
91
|
-
(end (if (region-active-p) (region-end) (point-max)))
|
92
|
-
|
93
|
+
(end (if (region-active-p) (region-end) (point-max)))
|
94
|
+
(origin (point)))
|
95
|
+
(shell-command-on-region beg end "seeing_is_believing" nil 'replace)
|
96
|
+
(goto-char origin)))
|
93
97
|
```
|
94
98
|
|
95
99
|
You can now call `seeing-is-believing` to replace the current region
|
data/features/regression.feature
CHANGED
@@ -12,7 +12,7 @@ class SeeingIsBelieving
|
|
12
12
|
exception_output_for(results, options)
|
13
13
|
|
14
14
|
code = Code.new(new_body)
|
15
|
-
code.rewriter.
|
15
|
+
code.rewriter.insert_after_multi code.body_range, output
|
16
16
|
new_body.replace code.rewriter.process
|
17
17
|
end
|
18
18
|
|
@@ -27,19 +27,30 @@ class SeeingIsBelieving
|
|
27
27
|
WrapExpressions.call \
|
28
28
|
program,
|
29
29
|
before_each: -> line_number {
|
30
|
+
# 74 b/c pretty print_defaults to 79 (guessing 80 chars with 1 reserved for newline), and
|
31
|
+
# 79 - "# => ".length # => 4
|
32
|
+
inspect = "$SiB.record_result(:inspect, #{line_number}, ("
|
33
|
+
pp = "$SiB.record_result(:pp, #{line_number}, ("
|
34
|
+
|
30
35
|
should_inspect = inspect_linenos.include? line_number
|
31
36
|
should_pp = pp_linenos.include? line_number
|
32
|
-
|
37
|
+
|
38
|
+
if should_inspect && should_pp then "#{pp}#{inspect}"
|
39
|
+
elsif should_inspect then inspect
|
40
|
+
elsif should_pp then pp
|
41
|
+
else ""
|
42
|
+
end
|
33
43
|
},
|
34
44
|
after_each: -> line_number {
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
45
|
+
inspect = "))"
|
46
|
+
pp = ")) { |v| PP.pp v, '', 74 }"
|
47
|
+
|
48
|
+
should_inspect = inspect_linenos.include? line_number
|
49
|
+
should_pp = pp_linenos.include? line_number
|
39
50
|
|
40
|
-
if should_inspect && should_pp then "
|
41
|
-
elsif should_inspect then
|
42
|
-
elsif should_pp then
|
51
|
+
if should_inspect && should_pp then "#{inspect}#{pp}"
|
52
|
+
elsif should_inspect then inspect
|
53
|
+
elsif should_pp then pp
|
43
54
|
else ""
|
44
55
|
end
|
45
56
|
}
|
@@ -22,7 +22,7 @@ class SeeingIsBelieving
|
|
22
22
|
first_index -= 1 while first_index > 0 && raw_code[first_index-1] != "\n"
|
23
23
|
comment_text = commenter.call raw_code[first_index...last_index], line_number
|
24
24
|
range = Parser::Source::Range.new(commentable_lines.buffer, first_index, last_index)
|
25
|
-
commentable_lines.rewriter.
|
25
|
+
commentable_lines.rewriter.insert_after_multi range, comment_text
|
26
26
|
end
|
27
27
|
commentable_lines.rewriter.process
|
28
28
|
end
|
@@ -24,20 +24,19 @@ class SeeingIsBelieving
|
|
24
24
|
@raw = raw_code
|
25
25
|
@buffer = Parser::Source::Buffer.new(name||"SeeingIsBelieving")
|
26
26
|
@buffer.source = raw
|
27
|
-
builder = Parser::Builders::Default.new.tap { |b| b.emit_file_line_as_literals = false }
|
28
27
|
@rewriter = Parser::Source::Rewriter.new buffer
|
29
|
-
|
30
|
-
@body_range = body_range_from_tokens(tokens)
|
28
|
+
builder = Parser::Builders::Default.new.tap { |b| b.emit_file_line_as_literals = false }
|
31
29
|
@parser = Parser::CurrentRuby.new builder
|
32
|
-
@
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
@syntax = Syntax.new error_message: $!.message, line_number: index_to_linenum($!.diagnostic.location.begin_pos)
|
38
|
-
ensure
|
39
|
-
@root ||= null_node
|
30
|
+
@syntax = Syntax.new
|
31
|
+
parser.diagnostics.consumer = lambda do |diagnostic|
|
32
|
+
if :fatal == diagnostic.level || :error == diagnostic.level
|
33
|
+
@syntax = Syntax.new error_message: diagnostic.message, line_number: index_to_linenum(diagnostic.location.begin_pos)
|
34
|
+
end
|
40
35
|
end
|
36
|
+
@root, @raw_comments, @tokens = parser.tokenize(@buffer, true)
|
37
|
+
@body_range = body_range_from_tokens(@tokens)
|
38
|
+
@inline_comments = raw_comments.select(&:inline?).map { |c| wrap_comment c }
|
39
|
+
@root ||= null_node
|
41
40
|
end
|
42
41
|
|
43
42
|
def range_for(start_index, end_index)
|
@@ -91,32 +90,8 @@ class SeeingIsBelieving
|
|
91
90
|
private
|
92
91
|
|
93
92
|
def comments_and_tokens(builder, buffer)
|
94
|
-
# THIS IS SO WE CAN EXTRACT COMMENTS FROM INVALID FILES.
|
95
|
-
# We do it by telling Parser's diagnostic to not blow up.
|
96
|
-
# https://github.com/whitequark/parser/blob/2d69a1b5f34ef15b3a8330beb036ac4bf4775e29/lib/parser/diagnostic/engine.rb
|
97
|
-
# However, this probably implies SiB won't work on Rbx/JRuby
|
98
|
-
# https://github.com/whitequark/parser/blob/2d69a1b5f34ef15b3a8330beb036ac4bf4775e29/lib/parser/base.rb#L129-134
|
99
|
-
# Ideally we could just do this
|
100
|
-
# parser.diagnostics.all_errors_are_fatal = false
|
101
|
-
# parser.diagnostics.ignore_warnings = false
|
102
|
-
# But, the parser will still blow up on "fatal" errors (e.g. unterminated string) So we need to actually change it.
|
103
|
-
# https://github.com/whitequark/parser/blob/2d69a1b5f34ef15b3a8330beb036ac4bf4775e29/lib/parser/diagnostic/engine.rb#L99
|
104
|
-
# We could make a NullDiagnostics like this:
|
105
|
-
# class NullDiagnostics < Parser::Diagnostic::Engine
|
106
|
-
# def process(*)
|
107
|
-
# # no op
|
108
|
-
# end
|
109
|
-
# end
|
110
|
-
# But we don't control initialization of the variable, and the value gets passed around, at least into the lexer.
|
111
|
-
# https://github.com/whitequark/parser/blob/2d69a1b5f34ef15b3a8330beb036ac4bf4775e29/lib/parser/base.rb#L139
|
112
|
-
# and since it's all private, it could change at any time (Parser is very state based),
|
113
|
-
# so I think it's just generally safer to mutate that one object, as we do now.
|
114
93
|
parser = Parser::CurrentRuby.new builder
|
115
|
-
|
116
|
-
def diagnostics.process(*)
|
117
|
-
self
|
118
|
-
end
|
119
|
-
_, all_comments, tokens = parser.tokenize(@buffer)
|
94
|
+
_, all_comments, tokens = parser.tokenize(@buffer, true)
|
120
95
|
[all_comments, tokens]
|
121
96
|
end
|
122
97
|
|
@@ -23,20 +23,27 @@ class SeeingIsBelieving
|
|
23
23
|
@called ||= begin
|
24
24
|
wrap_recursive code.root
|
25
25
|
|
26
|
-
|
26
|
+
wrappings = wrappings().sort_by(&:first)
|
27
27
|
|
28
28
|
wrappings.each do |line_num, (range, last_col, meta)|
|
29
|
-
rewriter.insert_before range, before_each.call(line_num)
|
30
29
|
case meta
|
31
30
|
when :total_fucking_failure
|
32
31
|
rewriter.replace range, '.....TOTAL FUCKING FAILURE!.....'
|
33
32
|
when :match_current_line
|
34
|
-
rewriter.
|
33
|
+
rewriter.insert_before_multi range, '~' # Regexp#~
|
35
34
|
end
|
36
|
-
rewriter.insert_after range, after_each.call(line_num)
|
37
35
|
end
|
38
36
|
|
39
|
-
|
37
|
+
wrappings.each do |line_num, (range, last_col, meta)|
|
38
|
+
rewriter.insert_before_multi range, before_each.call(line_num)
|
39
|
+
end
|
40
|
+
|
41
|
+
wrappings.each do |line_num, (range, last_col, meta)|
|
42
|
+
rewriter.insert_after_multi range, after_each.call(line_num)
|
43
|
+
end
|
44
|
+
|
45
|
+
rewriter.insert_before_multi root_range, before_all.call
|
46
|
+
rewriter.insert_after_multi root_range, after_all_text
|
40
47
|
rewriter.process
|
41
48
|
end
|
42
49
|
end
|
@@ -2,12 +2,14 @@ require 'seeing_is_believing/wrap_expressions'
|
|
2
2
|
class SeeingIsBelieving
|
3
3
|
module WrapExpressionsWithInspect
|
4
4
|
def self.call(program)
|
5
|
+
# NOTE: if it received the AST, it could figure out if it needs
|
6
|
+
# to always wrap the expression in parentheses
|
5
7
|
WrapExpressions.call program,
|
6
8
|
before_each: -> line_number {
|
7
|
-
"("
|
9
|
+
"$SiB.record_result(:inspect, #{line_number}, ("
|
8
10
|
},
|
9
11
|
after_each: -> line_number {
|
10
|
-
")
|
12
|
+
"))"
|
11
13
|
}
|
12
14
|
end
|
13
15
|
end
|
data/seeing_is_believing.gemspec
CHANGED
@@ -19,11 +19,12 @@ Gem::Specification.new do |s|
|
|
19
19
|
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
20
20
|
s.require_paths = ["lib"]
|
21
21
|
|
22
|
-
s.add_dependency "parser", ">= 2.
|
22
|
+
s.add_dependency "parser", ">= 2.3.0.7", "< 3.0"
|
23
23
|
|
24
24
|
s.add_development_dependency "what_weve_got_here_is_an_error_to_communicate"
|
25
25
|
s.add_development_dependency "haiti", ">= 0.1", "< 0.3"
|
26
26
|
s.add_development_dependency "rake", "~> 10.0"
|
27
|
+
s.add_development_dependency "mrspec", "~> 0.3.0"
|
27
28
|
s.add_development_dependency "rspec", "~> 3.2"
|
28
29
|
s.add_development_dependency "cucumber", "~> 1.2"
|
29
30
|
s.add_development_dependency "ichannel", "~> 5.1"
|
data/spec/event_stream_spec.rb
CHANGED
@@ -394,7 +394,7 @@ module SeeingIsBelieving::EventStream
|
|
394
394
|
backtrace_filename: __FILE__
|
395
395
|
end
|
396
396
|
|
397
|
-
example 'Example: Common edge case: name error'
|
397
|
+
example 'Example: Common edge case: name error' do
|
398
398
|
backtrace_line = record_exception(99) { BasicObject.new.instance_eval { not_a_local_or_meth } }
|
399
399
|
backtrace_frame = 0
|
400
400
|
backtrace_frame += 1 if defined? Rubinius # their method missing goes into the kernel
|
@@ -503,6 +503,10 @@ RSpec.describe SeeingIsBelieving do
|
|
503
503
|
expect(values_for "File.read(__FILE__).lines.count").to eq [['1']]
|
504
504
|
end
|
505
505
|
|
506
|
+
it 'records instances of BasicObject' do
|
507
|
+
expect(values_for 'o = BasicObject.new; def o.inspect; "some obj"; end; o').to eq [['some obj']]
|
508
|
+
end
|
509
|
+
|
506
510
|
context 'when given a debugger' do
|
507
511
|
let(:stream) { StringIO.new }
|
508
512
|
let(:debugger) { SeeingIsBelieving::Debugger.new stream: stream }
|
@@ -551,6 +555,10 @@ RSpec.describe SeeingIsBelieving do
|
|
551
555
|
it 'gets the exit status off of the child process' do
|
552
556
|
expect(invoke('exec "ruby", "-e", "exit 5"').exitstatus).to eq 5
|
553
557
|
end
|
558
|
+
|
559
|
+
it 'emits otuput on expicit invocations to warn' do
|
560
|
+
expect(invoke('warn "hello"').stderr).to eq "hello\n"
|
561
|
+
end
|
554
562
|
end
|
555
563
|
|
556
564
|
# Looked through the implementation of event_stream/producer to find a list of core behaviour it depends on
|
@@ -104,13 +104,11 @@ RSpec.describe SeeingIsBelieving::WrapExpressions do
|
|
104
104
|
end
|
105
105
|
|
106
106
|
it 'passes the current line number to the before_each and after_each wrappers' do
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
expect(pre_line_num).to eq 2
|
113
|
-
expect(post_line_num).to eq 2
|
107
|
+
result = described_class.call("a.each { |b|\n}\n",
|
108
|
+
before_each: -> n { "(#{n})" },
|
109
|
+
after_each: -> n { "<#{n}>" }
|
110
|
+
)
|
111
|
+
expect(result).to eq "(2)(1)a<1>.each { |b|\n}<2>\n"
|
114
112
|
end
|
115
113
|
|
116
114
|
it 'does nothing for an empty program' do
|
@@ -168,9 +166,7 @@ RSpec.describe SeeingIsBelieving::WrapExpressions do
|
|
168
166
|
0b001_001
|
169
167
|
|
170
168
|
?a
|
171
|
-
|
172
|
-
?\M-a
|
173
|
-
?\M-\C-a
|
169
|
+
?\\C-a
|
174
170
|
|
175
171
|
1..2
|
176
172
|
1...2
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: seeing_is_believing
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 3.0.0.beta.
|
4
|
+
version: 3.0.0.beta.7
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Josh Cheek
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2016-03-30 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: parser
|
@@ -16,7 +16,7 @@ dependencies:
|
|
16
16
|
requirements:
|
17
17
|
- - ">="
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: 2.
|
19
|
+
version: 2.3.0.7
|
20
20
|
- - "<"
|
21
21
|
- !ruby/object:Gem::Version
|
22
22
|
version: '3.0'
|
@@ -26,7 +26,7 @@ dependencies:
|
|
26
26
|
requirements:
|
27
27
|
- - ">="
|
28
28
|
- !ruby/object:Gem::Version
|
29
|
-
version: 2.
|
29
|
+
version: 2.3.0.7
|
30
30
|
- - "<"
|
31
31
|
- !ruby/object:Gem::Version
|
32
32
|
version: '3.0'
|
@@ -78,6 +78,20 @@ dependencies:
|
|
78
78
|
- - "~>"
|
79
79
|
- !ruby/object:Gem::Version
|
80
80
|
version: '10.0'
|
81
|
+
- !ruby/object:Gem::Dependency
|
82
|
+
name: mrspec
|
83
|
+
requirement: !ruby/object:Gem::Requirement
|
84
|
+
requirements:
|
85
|
+
- - "~>"
|
86
|
+
- !ruby/object:Gem::Version
|
87
|
+
version: 0.3.0
|
88
|
+
type: :development
|
89
|
+
prerelease: false
|
90
|
+
version_requirements: !ruby/object:Gem::Requirement
|
91
|
+
requirements:
|
92
|
+
- - "~>"
|
93
|
+
- !ruby/object:Gem::Version
|
94
|
+
version: 0.3.0
|
81
95
|
- !ruby/object:Gem::Dependency
|
82
96
|
name: rspec
|
83
97
|
requirement: !ruby/object:Gem::Requirement
|