seeing_is_believing 0.0.11 → 0.0.13
Sign up to get free protection for your applications and to get access to all the features.
- data/Readme.md +11 -3
- data/features/flags.feature +54 -0
- data/features/step_definitions/steps.rb +11 -35
- data/lib/seeing_is_believing/binary.rb +18 -10
- data/lib/seeing_is_believing/binary/arg_parser.rb +19 -11
- data/lib/seeing_is_believing/evaluate_by_moving_files.rb +7 -4
- data/lib/seeing_is_believing/version.rb +1 -1
- data/spec/arg_parser_spec.rb +34 -2
- data/spec/evaluate_by_moving_files_spec.rb +18 -0
- data/spec/queue_spec.rb +2 -2
- data/textmate-integration.png +0 -0
- metadata +9 -9
data/Readme.md
CHANGED
@@ -88,15 +88,23 @@ TextMate Integration
|
|
88
88
|
Go to the bundle editor, create this new command in the Ruby bundle:
|
89
89
|
|
90
90
|
```shell
|
91
|
-
"$
|
92
|
-
|
93
|
-
|
91
|
+
if [ -z "$TM_FILEPATH" ]; then
|
92
|
+
"${TM_RUBY}" -S seeing_is_believing -Ku --result-length 200
|
93
|
+
else
|
94
|
+
"${TM_RUBY}" -S seeing_is_believing -Ku --result-length 200 --as "$TM_FILEPATH"
|
95
|
+
fi
|
94
96
|
```
|
95
97
|
|
96
98
|
It should look like this:
|
97
99
|
|
98
100
|
![textmate-integration][textmate-integration]
|
99
101
|
|
102
|
+
I also recommend a second command for cleaning the output:
|
103
|
+
|
104
|
+
```shell
|
105
|
+
"${TM_RUBY}" -S seeing_is_believing -Ku --clean
|
106
|
+
```
|
107
|
+
|
100
108
|
Emacs Integration
|
101
109
|
=================
|
102
110
|
|
data/features/flags.feature
CHANGED
@@ -177,6 +177,60 @@ Feature: Using flags
|
|
177
177
|
'ç' # => "ç"
|
178
178
|
"""
|
179
179
|
|
180
|
+
Scenario: --as and stdin
|
181
|
+
Given the file "example.rb" "1+1"
|
182
|
+
Given I have the stdin content:
|
183
|
+
"""
|
184
|
+
1+1
|
185
|
+
__FILE__
|
186
|
+
"""
|
187
|
+
When I run "seeing_is_believing --as example.rb"
|
188
|
+
Then stderr is empty
|
189
|
+
Then the exit status is 0
|
190
|
+
And stdout is:
|
191
|
+
"""
|
192
|
+
1+1 # => 2
|
193
|
+
__FILE__ # => "example.rb"
|
194
|
+
"""
|
195
|
+
|
196
|
+
Scenario: --as and -e
|
197
|
+
Given the file "example.rb" "1+1"
|
198
|
+
When I run 'seeing_is_believing --as example.rb -e "__FILE__"'
|
199
|
+
Then stderr is empty
|
200
|
+
And the exit status is 0
|
201
|
+
And stdout is '__FILE__ # => "example.rb"'
|
202
|
+
|
203
|
+
Scenario: --clean
|
204
|
+
Given the file "example.rb":
|
205
|
+
"""
|
206
|
+
1 + 1 # => not 2
|
207
|
+
2 + 2 # ~> Exception, something
|
208
|
+
|
209
|
+
|
210
|
+
# >> some stdout output
|
211
|
+
|
212
|
+
# !> some stderr output
|
213
|
+
__END__
|
214
|
+
1
|
215
|
+
"""
|
216
|
+
When I run "seeing_is_believing --clean example.rb"
|
217
|
+
Then stderr is empty
|
218
|
+
And the exit status is 0
|
219
|
+
And stdout is:
|
220
|
+
"""
|
221
|
+
1 + 1
|
222
|
+
2 + 2
|
223
|
+
|
224
|
+
__END__
|
225
|
+
1
|
226
|
+
"""
|
227
|
+
|
228
|
+
Scenario: --clean on an invalid file will clean
|
229
|
+
When I run 'seeing_is_believing --clean -e "1+ # => lkj"'
|
230
|
+
Then stderr is empty
|
231
|
+
And the exit status is 0
|
232
|
+
And stdout is '1+'
|
233
|
+
|
180
234
|
Scenario: --help
|
181
235
|
When I run "seeing_is_believing --help"
|
182
236
|
Then stderr is empty
|
@@ -1,35 +1,11 @@
|
|
1
|
-
Given
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
When 'I run "$command"' do |command|
|
14
|
-
@last_executed = CommandLineHelpers.execute command, @stdin_data
|
15
|
-
end
|
16
|
-
|
17
|
-
Then /^(stderr|stdout) is:$/ do |stream_name, output|
|
18
|
-
@last_executed.send(stream_name).chomp.should == eval_curlies(output)
|
19
|
-
end
|
20
|
-
|
21
|
-
Then /^(stderr|stdout) is "(.*?)"$/ do |stream_name, output|
|
22
|
-
@last_executed.send(stream_name).chomp.should == eval_curlies(output)
|
23
|
-
end
|
24
|
-
|
25
|
-
Then 'the exit status is $status' do |status|
|
26
|
-
@last_executed.exitstatus.to_s.should == status
|
27
|
-
end
|
28
|
-
|
29
|
-
Then /^(stderr|stdout) is empty$/ do |stream_name|
|
30
|
-
@last_executed.send(stream_name).should == ''
|
31
|
-
end
|
32
|
-
|
33
|
-
Then /^(stderr|stdout) includes "([^"]*)"$/ do |stream_name, content|
|
34
|
-
@last_executed.send(stream_name).should include content
|
35
|
-
end
|
1
|
+
Given('the file "$filename" "$body"') { |filename, body| CommandLineHelpers.write_file filename, body }
|
2
|
+
Given('the file "$filename":') { |filename, body| CommandLineHelpers.write_file filename, body }
|
3
|
+
Given('I have the stdin content "$content"') { |content| @stdin_data = content }
|
4
|
+
Given('I have the stdin content:') { |content| @stdin_data = content }
|
5
|
+
When('I run "$command"') { |command| @last_executed = CommandLineHelpers.execute command, @stdin_data }
|
6
|
+
When("I run '$command'") { |command| @last_executed = CommandLineHelpers.execute command, @stdin_data }
|
7
|
+
Then(/^(stderr|stdout) is:$/) { |stream_name, output| @last_executed.send(stream_name).chomp.should == output }
|
8
|
+
Then(/^(stderr|stdout) is ["'](.*?)["']$/) { |stream_name, output| @last_executed.send(stream_name).chomp.should == output }
|
9
|
+
Then(/^(stderr|stdout) is empty$/) { |stream_name| @last_executed.send(stream_name).should == '' }
|
10
|
+
Then(/^(stderr|stdout) includes "([^"]*)"$/) { |stream_name, content| @last_executed.send(stream_name).should include content }
|
11
|
+
Then('the exit status is $status') { |status| @last_executed.exitstatus.to_s.should == status }
|
@@ -15,11 +15,12 @@ class SeeingIsBelieving
|
|
15
15
|
end
|
16
16
|
|
17
17
|
def call
|
18
|
-
@exitstatus ||= if flags_have_errors? then print_errors
|
19
|
-
elsif should_print_help? then print_help
|
20
|
-
elsif has_filename? && file_dne? then print_file_dne
|
21
|
-
elsif
|
22
|
-
|
18
|
+
@exitstatus ||= if flags_have_errors? then print_errors ; 1
|
19
|
+
elsif should_print_help? then print_help ; 0
|
20
|
+
elsif has_filename? && file_dne? then print_file_dne ; 1
|
21
|
+
elsif should_clean? then print_cleaned_program ; 0
|
22
|
+
elsif invalid_syntax? then print_syntax_error ; 1
|
23
|
+
else print_program ; (results.has_exception? ? 1 : 0)
|
23
24
|
end
|
24
25
|
end
|
25
26
|
|
@@ -31,14 +32,14 @@ class SeeingIsBelieving
|
|
31
32
|
flags[:filename]
|
32
33
|
end
|
33
34
|
|
34
|
-
def
|
35
|
+
def cleaned_body
|
35
36
|
@body ||= PrintResultsNextToLines.remove_previous_output_from \
|
36
37
|
flags[:program] || (file_is_on_stdin? && stdin.read) || File.read(flags[:filename])
|
37
38
|
end
|
38
39
|
|
39
40
|
def results
|
40
|
-
@results ||= SeeingIsBelieving.call
|
41
|
-
filename: flags[:filename],
|
41
|
+
@results ||= SeeingIsBelieving.call cleaned_body,
|
42
|
+
filename: (flags[:as] || flags[:filename]),
|
42
43
|
require: flags[:require],
|
43
44
|
load_path: flags[:load_path],
|
44
45
|
encoding: flags[:encoding],
|
@@ -46,7 +47,7 @@ class SeeingIsBelieving
|
|
46
47
|
end
|
47
48
|
|
48
49
|
def printer
|
49
|
-
@printer ||= PrintResultsNextToLines.new
|
50
|
+
@printer ||= PrintResultsNextToLines.new cleaned_body, results, flags
|
50
51
|
end
|
51
52
|
|
52
53
|
def flags
|
@@ -86,7 +87,7 @@ class SeeingIsBelieving
|
|
86
87
|
end
|
87
88
|
|
88
89
|
def syntax_error_notice
|
89
|
-
out, err, syntax_status = Open3.capture3 'ruby', '-c', stdin_data:
|
90
|
+
out, err, syntax_status = Open3.capture3 'ruby', '-c', stdin_data: cleaned_body
|
90
91
|
return err unless syntax_status.success?
|
91
92
|
end
|
92
93
|
|
@@ -98,5 +99,12 @@ class SeeingIsBelieving
|
|
98
99
|
stderr.puts syntax_error_notice
|
99
100
|
end
|
100
101
|
|
102
|
+
def should_clean?
|
103
|
+
flags[:clean]
|
104
|
+
end
|
105
|
+
|
106
|
+
def print_cleaned_program
|
107
|
+
stdout.print cleaned_body
|
108
|
+
end
|
101
109
|
end
|
102
110
|
end
|
@@ -17,13 +17,16 @@ class SeeingIsBelieving
|
|
17
17
|
until args.empty?
|
18
18
|
case (arg = args.shift)
|
19
19
|
when '-h', '--help' then options[:help] = self.class.help_screen
|
20
|
+
when '-c', '--clean' then options[:clean] = true
|
20
21
|
when '-l', '--start-line' then extract_positive_int_for :start_line, arg
|
21
22
|
when '-L', '--end-line' then extract_positive_int_for :end_line, arg
|
22
23
|
when '-d', '--line-length' then extract_positive_int_for :line_length, arg
|
23
24
|
when '-D', '--result-length' then extract_positive_int_for :result_length, arg
|
24
|
-
when '-r', '--require' then next_arg("#{arg} expected a filename but did not see one")
|
25
|
-
when '-I', '--load-path' then next_arg("#{arg} expected a directory but did not see one")
|
26
|
-
when '-e', '--program' then next_arg("#{arg}
|
25
|
+
when '-r', '--require' then next_arg("#{arg} expected a filename as the following argument but did not see one") { |filename| options[:require] << filename }
|
26
|
+
when '-I', '--load-path' then next_arg("#{arg} expected a directory as the following argument but did not see one") { |dir| options[:load_path] << dir }
|
27
|
+
when '-e', '--program' then next_arg("#{arg} expected a program as the following argument but did not see one") { |program| options[:program] = program }
|
28
|
+
when '-a', '--as' then next_arg("#{arg} expected a filename as the following argument but did not see one") { |filename| options[:as] = filename }
|
29
|
+
when /\A-K(.+)/ then options[:encoding] = $1
|
27
30
|
when '-K', '--encoding' then next_arg("#{arg} expects an encoding, see `man ruby` for possibile values") { |encoding| options[:encoding] = encoding }
|
28
31
|
when /^-/ then options[:errors] << "Unknown option: #{arg.inspect}" # unknown flags
|
29
32
|
else
|
@@ -54,13 +57,14 @@ class SeeingIsBelieving
|
|
54
57
|
|
55
58
|
def options
|
56
59
|
@options ||= {
|
60
|
+
clean: false,
|
57
61
|
program: nil,
|
58
62
|
filename: nil,
|
59
|
-
errors: [],
|
60
63
|
start_line: 1,
|
61
64
|
line_length: Float::INFINITY,
|
62
65
|
end_line: Float::INFINITY,
|
63
66
|
result_length: Float::INFINITY,
|
67
|
+
errors: [],
|
64
68
|
require: [],
|
65
69
|
load_path: [],
|
66
70
|
}
|
@@ -90,13 +94,17 @@ Usage: #{$0} [options] [filename]
|
|
90
94
|
|
91
95
|
If no filename is provided, the binary will read the program from standard input.
|
92
96
|
|
93
|
-
-l, --start-line
|
94
|
-
-L, --end-line
|
95
|
-
-d, --line-length
|
96
|
-
-D, --result-length # max length of the portion after the "# => "
|
97
|
-
-
|
98
|
-
-
|
99
|
-
-
|
97
|
+
-l, --start-line n # line number to begin showing results on
|
98
|
+
-L, --end-line n # line number to stop showing results on
|
99
|
+
-d, --line-length n # max length of the entire line (only truncates results, not source lines)
|
100
|
+
-D, --result-length n # max length of the portion after the "# => "
|
101
|
+
-I, --load-path dir # a dir that should be added to the $LOAD_PATH
|
102
|
+
-r, --require file # additional files to be required before running the program
|
103
|
+
-e, --program program # Pass the program to execute as an argument
|
104
|
+
-K, --encoding encoding # sets file encoding, equivalent to Ruby's -Kx (see `man ruby` for valid values)
|
105
|
+
-a, --as filename # run the program as if it was the specified filename
|
106
|
+
-c, --clean # remove annotations from previous runs of seeing_is_believing
|
107
|
+
-h, --help # this help screen
|
100
108
|
HELP_SCREEN
|
101
109
|
end
|
102
110
|
end
|
@@ -49,7 +49,7 @@ class SeeingIsBelieving
|
|
49
49
|
end
|
50
50
|
},
|
51
51
|
ensure: -> {
|
52
|
-
|
52
|
+
set_back_to_initial_conditions
|
53
53
|
}
|
54
54
|
end
|
55
55
|
|
@@ -75,9 +75,12 @@ class SeeingIsBelieving
|
|
75
75
|
@was_backed_up = true
|
76
76
|
end
|
77
77
|
|
78
|
-
def
|
79
|
-
|
80
|
-
|
78
|
+
def set_back_to_initial_conditions
|
79
|
+
if @was_backed_up
|
80
|
+
FileUtils.mv temp_filename, filename
|
81
|
+
else
|
82
|
+
FileUtils.rm filename
|
83
|
+
end
|
81
84
|
end
|
82
85
|
|
83
86
|
def write_program_to_file
|
data/spec/arg_parser_spec.rb
CHANGED
@@ -41,8 +41,8 @@ describe SeeingIsBelieving::Binary::ArgParser do
|
|
41
41
|
end
|
42
42
|
|
43
43
|
specify 'unknown options set an error' do
|
44
|
-
parse(['--
|
45
|
-
parse(['-
|
44
|
+
parse(['--xyz']).should have_error 'Unknown option: "--xyz"'
|
45
|
+
parse(['-x']).should have_error 'Unknown option: "-x"'
|
46
46
|
end
|
47
47
|
|
48
48
|
example 'example: multiple args' do
|
@@ -206,10 +206,42 @@ describe SeeingIsBelieving::Binary::ArgParser do
|
|
206
206
|
parse(%w[--encoding u])[:encoding].should == 'u'
|
207
207
|
end
|
208
208
|
|
209
|
+
specify 'with -K, the argument can be placed immediately after it (e.g. -Ku) because Ruby allows this' do
|
210
|
+
parse(['-Ku'])[:encoding].should == 'u'
|
211
|
+
parse(['-Ku']).should_not have_error /-K/
|
212
|
+
end
|
213
|
+
|
209
214
|
it 'sets an error if not provided with an encoding' do
|
210
215
|
parse(['-K']).should have_error /-K/
|
211
216
|
parse(['--encoding']).should have_error /--encoding/
|
212
217
|
end
|
213
218
|
end
|
219
|
+
|
220
|
+
describe ':as' do
|
221
|
+
it 'defaults to nil' do
|
222
|
+
parse([])[:as].should be_nil
|
223
|
+
end
|
224
|
+
|
225
|
+
it 'can be set with -a and --as' do
|
226
|
+
parse(%w[-a abc])[:as].should == 'abc'
|
227
|
+
parse(%w[--as abc])[:as].should == 'abc'
|
228
|
+
end
|
229
|
+
|
230
|
+
it 'sets an error if not provided with a filename' do
|
231
|
+
parse(%w[-a]).should have_error /-a/
|
232
|
+
parse(%w[--as]).should have_error /--as/
|
233
|
+
end
|
234
|
+
end
|
235
|
+
|
236
|
+
describe ':clean' do
|
237
|
+
it 'defaults to false' do
|
238
|
+
parse([])[:clean].should == false
|
239
|
+
end
|
240
|
+
|
241
|
+
it 'can be set with -c and --clean' do
|
242
|
+
parse(%w[-c])[:clean].should == true
|
243
|
+
parse(%w[--clean])[:clean].should == true
|
244
|
+
end
|
245
|
+
end
|
214
246
|
end
|
215
247
|
|
@@ -63,6 +63,24 @@ describe SeeingIsBelieving::EvaluateByMovingFiles do
|
|
63
63
|
evaluator.call
|
64
64
|
end
|
65
65
|
|
66
|
+
it 'uses HardCoreEnsure to delete the file if it wrote it where one did not previously exist' do
|
67
|
+
evaluator = described_class.new 'PROGRAM', filename, error_stream: StringIO.new
|
68
|
+
FileUtils.rm_rf filename
|
69
|
+
SeeingIsBelieving::HardCoreEnsure.should_receive(:call) do |options|
|
70
|
+
# initial state
|
71
|
+
File.exist?(filename).should == false
|
72
|
+
|
73
|
+
# after code
|
74
|
+
options[:code].call rescue nil
|
75
|
+
File.read(filename).should == 'PROGRAM'
|
76
|
+
|
77
|
+
# after ensure
|
78
|
+
options[:ensure].call
|
79
|
+
File.exist?(filename).should == false
|
80
|
+
end
|
81
|
+
evaluator.call
|
82
|
+
end
|
83
|
+
|
66
84
|
it 'can require files' do
|
67
85
|
other_filename1 = File.join filedir, 'other1.rb'
|
68
86
|
other_filename2 = File.join filedir, 'other2.rb'
|
data/spec/queue_spec.rb
CHANGED
@@ -53,7 +53,7 @@ describe SeeingIsBelieving::Queue do
|
|
53
53
|
end
|
54
54
|
|
55
55
|
describe 'conditional iteration' do
|
56
|
-
it '
|
56
|
+
it 'can iterate while a condition is met' do
|
57
57
|
queue = queue_for *1..5
|
58
58
|
seen = []
|
59
59
|
queue.while { |arg| arg < 4 }.each { |arg| seen << arg }
|
@@ -61,7 +61,7 @@ describe SeeingIsBelieving::Queue do
|
|
61
61
|
queue.peek.should == 4
|
62
62
|
end
|
63
63
|
|
64
|
-
it '
|
64
|
+
it 'can iterate until a condition is met' do
|
65
65
|
queue = queue_for *1..5
|
66
66
|
seen = []
|
67
67
|
queue.until { |arg| arg == 4 }.each { |arg| seen << arg }
|
data/textmate-integration.png
CHANGED
Binary file
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: seeing_is_believing
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.13
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -13,7 +13,7 @@ date: 2013-02-16 00:00:00.000000000 Z
|
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: rake
|
16
|
-
requirement: &
|
16
|
+
requirement: &70333554807460 !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
19
|
- - ~>
|
@@ -21,10 +21,10 @@ dependencies:
|
|
21
21
|
version: 10.0.3
|
22
22
|
type: :development
|
23
23
|
prerelease: false
|
24
|
-
version_requirements: *
|
24
|
+
version_requirements: *70333554807460
|
25
25
|
- !ruby/object:Gem::Dependency
|
26
26
|
name: rspec
|
27
|
-
requirement: &
|
27
|
+
requirement: &70333554806960 !ruby/object:Gem::Requirement
|
28
28
|
none: false
|
29
29
|
requirements:
|
30
30
|
- - ~>
|
@@ -32,10 +32,10 @@ dependencies:
|
|
32
32
|
version: 2.12.0
|
33
33
|
type: :development
|
34
34
|
prerelease: false
|
35
|
-
version_requirements: *
|
35
|
+
version_requirements: *70333554806960
|
36
36
|
- !ruby/object:Gem::Dependency
|
37
37
|
name: cucumber
|
38
|
-
requirement: &
|
38
|
+
requirement: &70333554806500 !ruby/object:Gem::Requirement
|
39
39
|
none: false
|
40
40
|
requirements:
|
41
41
|
- - ~>
|
@@ -43,10 +43,10 @@ dependencies:
|
|
43
43
|
version: 1.2.1
|
44
44
|
type: :development
|
45
45
|
prerelease: false
|
46
|
-
version_requirements: *
|
46
|
+
version_requirements: *70333554806500
|
47
47
|
- !ruby/object:Gem::Dependency
|
48
48
|
name: ichannel
|
49
|
-
requirement: &
|
49
|
+
requirement: &70333554806040 !ruby/object:Gem::Requirement
|
50
50
|
none: false
|
51
51
|
requirements:
|
52
52
|
- - ~>
|
@@ -54,7 +54,7 @@ dependencies:
|
|
54
54
|
version: 5.1.1
|
55
55
|
type: :development
|
56
56
|
prerelease: false
|
57
|
-
version_requirements: *
|
57
|
+
version_requirements: *70333554806040
|
58
58
|
description: Records the results of every line of code in your file (intended to be
|
59
59
|
like xmpfilter), inspired by Bret Victor's JavaScript example in his talk "Inventing
|
60
60
|
on Principle"
|