seeing_is_believing 3.0.0.beta.3 → 3.0.0.beta.4
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/.travis.yml +1 -0
- data/features/deprecated-flags.feature +12 -0
- data/features/flags.feature +2 -16
- data/features/regression.feature +46 -0
- data/features/xmpfilter-style.feature +55 -0
- data/lib/seeing_is_believing/binary/interpret_flags.rb +1 -5
- data/lib/seeing_is_believing/binary/parse_args.rb +12 -12
- data/lib/seeing_is_believing/binary/remove_annotations.rb +1 -1
- data/lib/seeing_is_believing/binary.rb +3 -3
- data/lib/seeing_is_believing/evaluate_by_moving_files.rb +60 -11
- data/lib/seeing_is_believing/event_stream/consumer.rb +61 -37
- data/lib/seeing_is_believing/event_stream/events.rb +3 -1
- data/lib/seeing_is_believing/event_stream/producer.rb +38 -21
- data/lib/seeing_is_believing/event_stream/update_result.rb +6 -2
- data/lib/seeing_is_believing/inspect_expressions.rb +5 -1
- data/lib/seeing_is_believing/parser_helpers.rb +11 -1
- data/lib/seeing_is_believing/result.rb +6 -1
- data/lib/seeing_is_believing/the_matrix.rb +18 -18
- data/lib/seeing_is_believing/version.rb +1 -1
- data/lib/seeing_is_believing/wrap_expressions.rb +0 -1
- data/lib/seeing_is_believing.rb +0 -2
- data/seeing_is_believing.gemspec +2 -4
- data/spec/binary/interpret_flags_spec.rb +0 -14
- data/spec/binary/parse_args_spec.rb +5 -6
- data/spec/event_stream_spec.rb +161 -70
- data/spec/seeing_is_believing_spec.rb +29 -63
- metadata +8 -37
- data/features/safe.feature +0 -33
- data/lib/seeing_is_believing/evaluate_with_eval_in.rb +0 -27
@@ -2,7 +2,6 @@
|
|
2
2
|
require 'spec_helper'
|
3
3
|
require 'stringio'
|
4
4
|
require 'seeing_is_believing'
|
5
|
-
require 'seeing_is_believing/evaluate_with_eval_in'
|
6
5
|
|
7
6
|
RSpec.describe SeeingIsBelieving do
|
8
7
|
def method_result(name)
|
@@ -30,10 +29,6 @@ RSpec.describe SeeingIsBelieving do
|
|
30
29
|
|
31
30
|
let(:proving_grounds_dir) { File.expand_path '../../proving_grounds', __FILE__ }
|
32
31
|
|
33
|
-
it 'evaluates with EvaluateByMovingFiles by default' do
|
34
|
-
expect(values_for "`echo 1`").to eq [['"1\n"']] # shows we're not using the only other option (EvaluateWithEvalIn)
|
35
|
-
end
|
36
|
-
|
37
32
|
it 'takes a string and returns a result of the line numbers (counting from 1) and each inspected result from that line' do
|
38
33
|
input = "10+10\n'2'+'2'"
|
39
34
|
expect(invoke(input)[1]).to eq ["20"]
|
@@ -45,6 +40,23 @@ RSpec.describe SeeingIsBelieving do
|
|
45
40
|
expect(invoke(input)[1]).to eq ['"NUM"']
|
46
41
|
end
|
47
42
|
|
43
|
+
it 'makes the SiB version info available' do
|
44
|
+
expect(invoke('$SiB.ver')[1][0]).to eq SeeingIsBelieving::VERSION.inspect
|
45
|
+
end
|
46
|
+
|
47
|
+
it 'records various useful information on the result' do
|
48
|
+
result = invoke '', number_of_captures: 10, filename: 'abc.rb'
|
49
|
+
expect(result.sib_version).to eq SeeingIsBelieving::VERSION
|
50
|
+
expect(result.ruby_version).to eq RUBY_VERSION
|
51
|
+
expect(result.number_of_captures).to eq 10 # TODO: rename to max_captures_per_line ?? (also max_line_captures would prob get renamed if we do this)
|
52
|
+
expect(result.num_lines).to eq 1
|
53
|
+
expect(result.filename).to eq 'abc.rb'
|
54
|
+
end
|
55
|
+
|
56
|
+
it 'makes the Ruby versino info available' do
|
57
|
+
expect(invoke('').ruby_version).to eq RUBY_VERSION
|
58
|
+
end
|
59
|
+
|
48
60
|
it 'allows uers to pass in their own inspection recorder' do
|
49
61
|
wrapper = lambda { |program, filename, num_captures|
|
50
62
|
SeeingIsBelieving::InspectExpressions.call \
|
@@ -145,7 +157,7 @@ RSpec.describe SeeingIsBelieving do
|
|
145
157
|
expect(result.exception.backtrace).to be_a_kind_of Array
|
146
158
|
end
|
147
159
|
|
148
|
-
context 'exceptions in exit blocks'
|
160
|
+
context 'exceptions in exit blocks' do
|
149
161
|
# I'm punting on this because there is just no good way to stop that from happening without changing actual behaviour
|
150
162
|
# see https://github.com/JoshCheek/seeing_is_believing/issues/24
|
151
163
|
it 'does not include information about the_matrix in the exception backtraces' do
|
@@ -368,27 +380,6 @@ RSpec.describe SeeingIsBelieving do
|
|
368
380
|
['2']]
|
369
381
|
end
|
370
382
|
|
371
|
-
it 'can evaluate under a different ruby executable' do
|
372
|
-
Dir.chdir proving_grounds_dir do
|
373
|
-
File.write 'omg-ruby', "#!/usr/bin/env ruby
|
374
|
-
$LOAD_PATH.unshift '#{File.expand_path '../../lib', __FILE__}'
|
375
|
-
|
376
|
-
require 'seeing_is_believing/event_stream/producer'
|
377
|
-
sib = SeeingIsBelieving::EventStream::Producer.new($stdout)
|
378
|
-
sib.record_result(:inspect, 1, /omg/)
|
379
|
-
sib.finish!
|
380
|
-
"
|
381
|
-
File.chmod 0755, 'omg-ruby'
|
382
|
-
old_path = ENV['PATH']
|
383
|
-
ENV['PATH'] = "#{proving_grounds_dir}:#{old_path}"
|
384
|
-
begin
|
385
|
-
expect(values_for("1", ruby_executable: 'omg-ruby')).to eq [["/omg/"]]
|
386
|
-
ensure
|
387
|
-
ENV['PATH'] = old_path
|
388
|
-
end
|
389
|
-
end
|
390
|
-
end
|
391
|
-
|
392
383
|
describe 'BEGIN and END' do
|
393
384
|
it 'Executes in the appropriate order' do
|
394
385
|
pending 'not implemented'
|
@@ -481,41 +472,16 @@ RSpec.describe SeeingIsBelieving do
|
|
481
472
|
# should ProgramRewriter have some debug options?
|
482
473
|
end
|
483
474
|
|
484
|
-
|
485
|
-
|
486
|
-
|
487
|
-
|
488
|
-
|
489
|
-
|
490
|
-
|
491
|
-
|
492
|
-
|
493
|
-
|
494
|
-
|
495
|
-
|
496
|
-
it 'can use EvaluateWithEvalIn' do
|
497
|
-
require 'seeing_is_believing/event_stream/producer'
|
498
|
-
redirect_url = 'https://example.com/whatever'
|
499
|
-
api_redirect_url = redirect_url + '.json'
|
500
|
-
|
501
|
-
stream = StringIO.new
|
502
|
-
producer = SeeingIsBelieving::EventStream::Producer.new(stream)
|
503
|
-
producer.record_result :inspect, 1, "a"
|
504
|
-
producer.record_result :inspect, 1, "b"
|
505
|
-
producer.record_result :inspect, 2, "c"
|
506
|
-
producer.finish!
|
507
|
-
|
508
|
-
response = { 'lang' => 'whatever',
|
509
|
-
'lang_friendly' => 'whatever',
|
510
|
-
'code' => 'whatever',
|
511
|
-
'output' => stream.string,
|
512
|
-
'status' => 'OK (0.012 sec real, 0.013 sec wall, 7 MB, 22 syscalls)'}
|
513
|
-
|
514
|
-
stub_request(:post, 'https://eval.in/').to_return(status: 302, headers: {'Location' => redirect_url})
|
515
|
-
stub_request(:get, api_redirect_url).to_return(status: 200, body: JSON.dump(response))
|
516
|
-
|
517
|
-
values = values_for "whatever", evaluator: SeeingIsBelieving::EvaluateWithEvalIn
|
518
|
-
expect(values).to eq [['"a"', '"b"'], ['"c"']]
|
519
|
-
end
|
475
|
+
it 'can deal with exec' do
|
476
|
+
result = invoke \
|
477
|
+
"1+1\n"\
|
478
|
+
"$stdout.puts *1..1000\n"\
|
479
|
+
"$stderr.puts *1..1000\n"\
|
480
|
+
"exec %(ruby -e '$stdout.puts %[out from exec];
|
481
|
+
$stderr.puts %[err from exec]')"
|
482
|
+
expect(result[1]).to eq ['2']
|
483
|
+
nums = (1..1000).map { |n| "#{n}\n" }.join('')
|
484
|
+
expect(result.stdout).to eq "#{nums}out from exec\n"
|
485
|
+
expect(result.stderr).to eq "#{nums}err from exec\n"
|
520
486
|
end
|
521
487
|
end
|
metadata
CHANGED
@@ -1,63 +1,35 @@
|
|
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.4
|
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: 2015-01-06 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
|
-
- !ruby/object:Gem::Dependency
|
14
|
-
name: eval_in
|
15
|
-
requirement: !ruby/object:Gem::Requirement
|
16
|
-
requirements:
|
17
|
-
- - "~>"
|
18
|
-
- !ruby/object:Gem::Version
|
19
|
-
version: 0.1.6
|
20
|
-
type: :runtime
|
21
|
-
prerelease: false
|
22
|
-
version_requirements: !ruby/object:Gem::Requirement
|
23
|
-
requirements:
|
24
|
-
- - "~>"
|
25
|
-
- !ruby/object:Gem::Version
|
26
|
-
version: 0.1.6
|
27
13
|
- !ruby/object:Gem::Dependency
|
28
14
|
name: parser
|
29
15
|
requirement: !ruby/object:Gem::Requirement
|
30
16
|
requirements:
|
31
17
|
- - ">="
|
32
18
|
- !ruby/object:Gem::Version
|
33
|
-
version: 2.
|
19
|
+
version: '2.2'
|
34
20
|
- - "<"
|
35
21
|
- !ruby/object:Gem::Version
|
36
|
-
version: '
|
22
|
+
version: '3.0'
|
37
23
|
type: :runtime
|
38
24
|
prerelease: false
|
39
25
|
version_requirements: !ruby/object:Gem::Requirement
|
40
26
|
requirements:
|
41
27
|
- - ">="
|
42
28
|
- !ruby/object:Gem::Version
|
43
|
-
version: 2.
|
29
|
+
version: '2.2'
|
44
30
|
- - "<"
|
45
31
|
- !ruby/object:Gem::Version
|
46
|
-
version: '
|
47
|
-
- !ruby/object:Gem::Dependency
|
48
|
-
name: webmock
|
49
|
-
requirement: !ruby/object:Gem::Requirement
|
50
|
-
requirements:
|
51
|
-
- - "~>"
|
52
|
-
- !ruby/object:Gem::Version
|
53
|
-
version: '1.18'
|
54
|
-
type: :development
|
55
|
-
prerelease: false
|
56
|
-
version_requirements: !ruby/object:Gem::Requirement
|
57
|
-
requirements:
|
58
|
-
- - "~>"
|
59
|
-
- !ruby/object:Gem::Version
|
60
|
-
version: '1.18'
|
32
|
+
version: '3.0'
|
61
33
|
- !ruby/object:Gem::Dependency
|
62
34
|
name: haiti
|
63
35
|
requirement: !ruby/object:Gem::Requirement
|
@@ -154,11 +126,11 @@ files:
|
|
154
126
|
- docs/example.gif
|
155
127
|
- docs/for-presentations
|
156
128
|
- docs/frog-brown.png
|
129
|
+
- features/deprecated-flags.feature
|
157
130
|
- features/errors.feature
|
158
131
|
- features/examples.feature
|
159
132
|
- features/flags.feature
|
160
133
|
- features/regression.feature
|
161
|
-
- features/safe.feature
|
162
134
|
- features/support/env.rb
|
163
135
|
- features/xmpfilter-style.feature
|
164
136
|
- lib/seeing_is_believing.rb
|
@@ -180,7 +152,6 @@ files:
|
|
180
152
|
- lib/seeing_is_believing/debugger.rb
|
181
153
|
- lib/seeing_is_believing/error.rb
|
182
154
|
- lib/seeing_is_believing/evaluate_by_moving_files.rb
|
183
|
-
- lib/seeing_is_believing/evaluate_with_eval_in.rb
|
184
155
|
- lib/seeing_is_believing/event_stream/consumer.rb
|
185
156
|
- lib/seeing_is_believing/event_stream/events.rb
|
186
157
|
- lib/seeing_is_believing/event_stream/producer.rb
|
@@ -272,11 +243,11 @@ signing_key:
|
|
272
243
|
specification_version: 4
|
273
244
|
summary: Records results of every line of code in your file
|
274
245
|
test_files:
|
246
|
+
- features/deprecated-flags.feature
|
275
247
|
- features/errors.feature
|
276
248
|
- features/examples.feature
|
277
249
|
- features/flags.feature
|
278
250
|
- features/regression.feature
|
279
|
-
- features/safe.feature
|
280
251
|
- features/support/env.rb
|
281
252
|
- features/xmpfilter-style.feature
|
282
253
|
- spec/binary/comment_formatter_spec.rb
|
data/features/safe.feature
DELETED
@@ -1,33 +0,0 @@
|
|
1
|
-
Feature: Running in safe-mode
|
2
|
-
|
3
|
-
It would be nice to be able to expose SiB via a bot like hubot.
|
4
|
-
To do this, though, you need to be able to trust the code that users submit.
|
5
|
-
I wrote https://github.com/JoshCheek/eval_in to use the https://eval.in
|
6
|
-
website to run code safely. SiB just needs to use it.
|
7
|
-
|
8
|
-
@wip
|
9
|
-
Scenario: Running normal code
|
10
|
-
Given the file 'safe-example1.rb' 'print "hello, #{gets}"'
|
11
|
-
And the stdin content "world"
|
12
|
-
When I run "seeing_is_believing --safe safe-example1.rb"
|
13
|
-
Then stderr is empty
|
14
|
-
And the exit status is 0
|
15
|
-
And stdout is:
|
16
|
-
"""
|
17
|
-
print "hello, #{gets}" # => nil
|
18
|
-
|
19
|
-
# >> hello, world
|
20
|
-
"""
|
21
|
-
|
22
|
-
Scenario: Unsafe code
|
23
|
-
Scenario: With --xmpfilter
|
24
|
-
Scenario: With incompatible options
|
25
|
-
Scenario: With --timeout
|
26
|
-
Scenario: With --as
|
27
|
-
Scenario: With --debug
|
28
|
-
Scenario: Wpper-bound number of captures to prevent it from consuming too many resources
|
29
|
-
--program program # Pass the program to execute as an argument
|
30
|
-
--load-path dir # a dir that should be added to the $LOAD_PATH
|
31
|
-
--require file # additional files to be required before running the program
|
32
|
-
--encoding encoding # sets file encoding, equivalent to Ruby's -Kx (see `man ruby` for valid values)
|
33
|
-
--shebang ruby-executable # if you want SiB to use some ruby other than the one in the path
|
@@ -1,27 +0,0 @@
|
|
1
|
-
require 'eval_in'
|
2
|
-
require 'stringio'
|
3
|
-
|
4
|
-
class SeeingIsBelieving
|
5
|
-
class EvaluateWithEvalIn
|
6
|
-
def self.call(*args)
|
7
|
-
new(*args).call
|
8
|
-
end
|
9
|
-
|
10
|
-
attr_accessor :program, :filename, :input_stream, :matrix_filename, :require_flags, :load_path_flags, :encoding, :timeout, :ruby_executable, :debugger
|
11
|
-
|
12
|
-
def initialize(program, filename, options={})
|
13
|
-
self.program = program
|
14
|
-
# self.input_stream = options.fetch :input_stream, StringIO.new('')
|
15
|
-
# self.timeout = options[:timeout]
|
16
|
-
# self.debugger = options.fetch :debugger, Debugger.new(stream: nil)
|
17
|
-
end
|
18
|
-
|
19
|
-
def call
|
20
|
-
eval_in_result = ::EvalIn.call(program, language: 'ruby/mri-2.1')
|
21
|
-
result = Result.new
|
22
|
-
EventStream::Consumer.new(StringIO.new eval_in_result.output)
|
23
|
-
.each { |event| EventStream::UpdateResult.call result, event }
|
24
|
-
result
|
25
|
-
end
|
26
|
-
end
|
27
|
-
end
|