monkeybox 0.0.1

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.
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
+