monkeybox 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (3) hide show
  1. data/monkeybox.rb +78 -0
  2. data/test_monkeybox.rb +52 -0
  3. metadata +68 -0
data/monkeybox.rb ADDED
@@ -0,0 +1,78 @@
1
+ require 'rubygems'
2
+ require 'open4'
3
+ require 'quick_attr'
4
+ require 'std_capture'
5
+ #require 'sandbox'
6
+
7
+ #what happens if you are running a sandbox, but you give it something with a syntax error?
8
+
9
+ class MonkeyBox
10
+ extend QuickAttr
11
+ quick_attr :code,:output,:returned,:error
12
+
13
+ def wrap monkeys
14
+ %{
15
+ require 'std_capture'
16
+ require 'yaml'
17
+ out = nil
18
+ err = nil
19
+ ret = nil
20
+ out = StdCapture.capture {
21
+ begin
22
+ ret = eval {#{code}}
23
+ rescue Exception => e
24
+ err = exception
25
+ end
26
+ }
27
+ puts {:output => out,
28
+ :returned => ret,
29
+ :error => {:class => err.class,
30
+ :message => err.message,
31
+ :backtrace => err.backtrace}
32
+ }
33
+ }
34
+ end
35
+ def upwrap (output)
36
+ result = YAML::load(output)
37
+ end
38
+
39
+ def run
40
+
41
+ Open4::popen4("ruby #{__FILE__}") do |pid, stdin, stdout, stderr|
42
+
43
+ #puts code
44
+ stdin.puts code
45
+ stdin.close
46
+ yaml = stdout.read.strip
47
+ #puts "YAML: <#{yaml}>"
48
+ report = YAML::load(yaml) || {} #need to catch puts, because the test prints a message if the test fails.
49
+ output report[:output]
50
+ returned report[:returned]
51
+ error report[:error]
52
+
53
+ err = stderr.read
54
+ raise(err) if (err != "" )
55
+
56
+ #you have to check if there was an error your self.
57
+
58
+ end
59
+ self
60
+ end
61
+ end
62
+ if __FILE__ == $0 then
63
+ returned = nil
64
+
65
+ error = nil
66
+ output = StdCapture.capture {
67
+ code = $stdin.read
68
+ begin
69
+ returned = eval(code)
70
+ rescue Exception => e
71
+ error = e
72
+ end
73
+ }
74
+
75
+ puts ({:returned => returned,:output => output, :error => error, :error_trace => (error ? error.backtrace : nil) }.to_yaml)
76
+ puts "end".to_yaml #there is a problem with returning null, stdout seems to drop the last new line, so need something acceptable after.
77
+ end
78
+
data/test_monkeybox.rb ADDED
@@ -0,0 +1,52 @@
1
+ require 'test/unit'
2
+ require 'monkeybox'
3
+
4
+ class TestMonkeyBox < Test::Unit::TestCase
5
+ def test_simple
6
+ sb = MonkeyBox.new.code "print \"hello\"; true"
7
+ sb.run
8
+
9
+ assert_equal "hello", sb.output
10
+
11
+ end
12
+
13
+ def test_returned
14
+ sb = MonkeyBox.new.code("print \"hello\"; true").run
15
+ assert sb.returned
16
+ sb2 = MonkeyBox.new.code("false").run
17
+
18
+ assert !sb2.returned
19
+ end
20
+
21
+ def test_constant
22
+ sb = MonkeyBox.new.code "class NewConstant; end; nil"
23
+ sb.run
24
+ assert_equal "", sb.output
25
+ assert_equal nil, sb.returned
26
+ begin
27
+ eval "MonkeyBox::NewConstant"
28
+ raise "expected NameError"
29
+ rescue NameError => n
30
+ end
31
+
32
+ begin
33
+ eval "NewConstant"
34
+ raise "expected NameError"
35
+ rescue NameError => n
36
+ end
37
+
38
+ end
39
+
40
+ def test_error
41
+ sb = MonkeyBox.new.code "raise \"an exception\""
42
+ sb.run
43
+ #puts sb.output
44
+ assert_equal "", sb.output
45
+ assert sb.error
46
+ assert sb.error.is_a?(Exception)
47
+
48
+ end
49
+
50
+ end
51
+
52
+
metadata ADDED
@@ -0,0 +1,68 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: monkeybox
3
+ version: !ruby/object:Gem::Version
4
+ hash: 29
5
+ prerelease: false
6
+ segments:
7
+ - 0
8
+ - 0
9
+ - 1
10
+ version: 0.0.1
11
+ platform: ruby
12
+ authors:
13
+ - Dominic Tarr
14
+ autorequire:
15
+ bindir: bin
16
+ cert_chain: []
17
+
18
+ date: 2010-09-10 00:00:00 +12:00
19
+ default_executable:
20
+ dependencies: []
21
+
22
+ description: "\t\tmonkeybox runs ruby code in another ruby process.\n"
23
+ email: dominic.tarr@gmail.com
24
+ executables: []
25
+
26
+ extensions: []
27
+
28
+ extra_rdoc_files: []
29
+
30
+ files:
31
+ - monkeybox.rb
32
+ - test_monkeybox.rb
33
+ has_rdoc: true
34
+ homepage: http://github.com/dominictarr/monkeybox
35
+ licenses: []
36
+
37
+ post_install_message:
38
+ rdoc_options: []
39
+
40
+ require_paths:
41
+ - ./
42
+ required_ruby_version: !ruby/object:Gem::Requirement
43
+ none: false
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ hash: 3
48
+ segments:
49
+ - 0
50
+ version: "0"
51
+ required_rubygems_version: !ruby/object:Gem::Requirement
52
+ none: false
53
+ requirements:
54
+ - - ">="
55
+ - !ruby/object:Gem::Version
56
+ hash: 3
57
+ segments:
58
+ - 0
59
+ version: "0"
60
+ requirements: []
61
+
62
+ rubyforge_project:
63
+ rubygems_version: 1.3.7
64
+ signing_key:
65
+ specification_version: 3
66
+ summary: run sandbox ruby from monkeypatching, by running the code in another ruby process.
67
+ test_files: []
68
+