Mercurial > pydertron
annotate docs.txt @ 23:7cbbec55aef6
Minor modifications.
| author | Atul Varma <varmaa@toolness.com> |
|---|---|
| date | Thu, 10 Sep 2009 17:05:05 -0700 |
| parents | 915fdf283ac5 |
| children | c2c369402a2e |
| rev | line source |
|---|---|
|
22
915fdf283ac5
Moved docs out to a separate file.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
1 ========= |
|
915fdf283ac5
Moved docs out to a separate file.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
2 Pydertron |
|
915fdf283ac5
Moved docs out to a separate file.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
3 ========= |
|
915fdf283ac5
Moved docs out to a separate file.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
4 |
|
915fdf283ac5
Moved docs out to a separate file.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
5 Pydertron is a high-level wrapper for `Pydermonkey`__ that |
|
915fdf283ac5
Moved docs out to a separate file.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
6 provides convenient, secure object wrapping between JS and Python |
|
915fdf283ac5
Moved docs out to a separate file.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
7 space. |
|
915fdf283ac5
Moved docs out to a separate file.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
8 |
|
915fdf283ac5
Moved docs out to a separate file.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
9 The ``JsSandbox`` class encapsulates a JavaScript runtime, context, global |
|
915fdf283ac5
Moved docs out to a separate file.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
10 object, and a simple `SecurableModule`__ implementation that complies |
|
915fdf283ac5
Moved docs out to a separate file.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
11 with the `CommonJS`__ standard. It also provides a high-level bridge between |
|
915fdf283ac5
Moved docs out to a separate file.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
12 Python and JavaScript so that you don't need to deal with any of the |
|
915fdf283ac5
Moved docs out to a separate file.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
13 low-level details of the Pydermonkey API. |
|
915fdf283ac5
Moved docs out to a separate file.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
14 |
|
915fdf283ac5
Moved docs out to a separate file.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
15 __ http://code.google.com/p/pydermonkey |
|
915fdf283ac5
Moved docs out to a separate file.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
16 __ http://wiki.commonjs.org/wiki/CommonJS/Modules/SecurableModules |
|
915fdf283ac5
Moved docs out to a separate file.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
17 __ http://wiki.commonjs.org/wiki/CommonJS |
|
915fdf283ac5
Moved docs out to a separate file.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
18 |
|
915fdf283ac5
Moved docs out to a separate file.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
19 For instance, here we'll create a ``JsSandbox`` whose module root |
| 23 | 20 points to the `monkeys`__ SecurableModule compliance test over HTTP: |
|
22
915fdf283ac5
Moved docs out to a separate file.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
21 |
|
915fdf283ac5
Moved docs out to a separate file.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
22 >>> url = ("http://interoperablejs.googlecode.com/svn/trunk/" |
|
915fdf283ac5
Moved docs out to a separate file.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
23 ... "compliance/monkeys/") |
|
915fdf283ac5
Moved docs out to a separate file.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
24 >>> sandbox = JsSandbox(HttpFileSystem(url)) |
|
915fdf283ac5
Moved docs out to a separate file.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
25 |
| 23 | 26 __ http://interoperablejs.googlecode.com/svn/trunk/compliance/monkeys/ |
| 27 | |
|
22
915fdf283ac5
Moved docs out to a separate file.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
28 This compliance test requires a global ``sys`` object that contains one |
|
915fdf283ac5
Moved docs out to a separate file.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
29 method, ``print()``, that takes two arguments. First, we'll create the |
|
915fdf283ac5
Moved docs out to a separate file.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
30 ``print()`` function and prepare it for exposure to JS code: |
|
915fdf283ac5
Moved docs out to a separate file.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
31 |
|
915fdf283ac5
Moved docs out to a separate file.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
32 >>> @jsexposed |
|
915fdf283ac5
Moved docs out to a separate file.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
33 ... def jsprint(message, label): |
|
915fdf283ac5
Moved docs out to a separate file.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
34 ... print message, label |
|
915fdf283ac5
Moved docs out to a separate file.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
35 |
|
915fdf283ac5
Moved docs out to a separate file.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
36 Note the use of the ``@jsexposed`` decorator: all this does is set |
|
915fdf283ac5
Moved docs out to a separate file.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
37 the function's ``__jsexposed__`` attribute to ``True``. This is |
|
915fdf283ac5
Moved docs out to a separate file.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
38 done for security purposes: only Python callables satisfying this |
|
915fdf283ac5
Moved docs out to a separate file.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
39 criteria will be exposed to JavaScript code, to ensure that |
|
915fdf283ac5
Moved docs out to a separate file.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
40 untrusted JS can't accidentally gain access to privileged Python |
|
915fdf283ac5
Moved docs out to a separate file.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
41 functionality. |
|
915fdf283ac5
Moved docs out to a separate file.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
42 |
|
915fdf283ac5
Moved docs out to a separate file.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
43 Creating a JS object can be done like this: |
|
915fdf283ac5
Moved docs out to a separate file.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
44 |
|
915fdf283ac5
Moved docs out to a separate file.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
45 >>> system = sandbox.new_object() |
|
915fdf283ac5
Moved docs out to a separate file.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
46 |
|
915fdf283ac5
Moved docs out to a separate file.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
47 We can now access and set properties on this object via either |
|
915fdf283ac5
Moved docs out to a separate file.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
48 item or attribute lookup, just like in JavaScript. Because |
|
915fdf283ac5
Moved docs out to a separate file.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
49 ``print`` is a reserved word in Python, though, we'll use item |
|
915fdf283ac5
Moved docs out to a separate file.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
50 lookup to set the property here: |
|
915fdf283ac5
Moved docs out to a separate file.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
51 |
|
915fdf283ac5
Moved docs out to a separate file.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
52 >>> system['print'] = jsprint |
|
915fdf283ac5
Moved docs out to a separate file.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
53 |
|
915fdf283ac5
Moved docs out to a separate file.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
54 Now we tell the sandbox that we want the ``sys`` object to be a |
|
915fdf283ac5
Moved docs out to a separate file.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
55 global: |
|
915fdf283ac5
Moved docs out to a separate file.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
56 |
|
915fdf283ac5
Moved docs out to a separate file.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
57 >>> sandbox.set_globals(sys = system) |
|
915fdf283ac5
Moved docs out to a separate file.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
58 |
|
915fdf283ac5
Moved docs out to a separate file.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
59 And finally, we execute the compliance test by running a one-line |
|
915fdf283ac5
Moved docs out to a separate file.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
60 script that imports the 'program' module, like so: |
|
915fdf283ac5
Moved docs out to a separate file.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
61 |
|
915fdf283ac5
Moved docs out to a separate file.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
62 >>> sandbox.run_script("require('program');") |
|
915fdf283ac5
Moved docs out to a separate file.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
63 PASS monkeys permitted pass |
|
915fdf283ac5
Moved docs out to a separate file.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
64 DONE info |
|
915fdf283ac5
Moved docs out to a separate file.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
65 0 |
|
915fdf283ac5
Moved docs out to a separate file.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
66 |
|
915fdf283ac5
Moved docs out to a separate file.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
67 Note the ``0`` in the last line: this is the return value of |
|
915fdf283ac5
Moved docs out to a separate file.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
68 ``sandbox.run_script()``, which returns ``0`` on success, and |
|
915fdf283ac5
Moved docs out to a separate file.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
69 ``-1`` if an exception was raised. For instance, the output of bad |
|
915fdf283ac5
Moved docs out to a separate file.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
70 code looks like this: |
|
915fdf283ac5
Moved docs out to a separate file.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
71 |
|
915fdf283ac5
Moved docs out to a separate file.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
72 >>> sandbox.run_script("(function foo() { bar(); })();", |
|
915fdf283ac5
Moved docs out to a separate file.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
73 ... stderr=sys.stdout) |
|
915fdf283ac5
Moved docs out to a separate file.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
74 Traceback (most recent call last): |
|
915fdf283ac5
Moved docs out to a separate file.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
75 File "<string>", line 1, in <module> |
|
915fdf283ac5
Moved docs out to a separate file.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
76 File "<string>", line 1, in foo |
|
915fdf283ac5
Moved docs out to a separate file.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
77 ReferenceError: bar is not defined |
|
915fdf283ac5
Moved docs out to a separate file.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
78 -1 |
|
915fdf283ac5
Moved docs out to a separate file.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
79 |
|
915fdf283ac5
Moved docs out to a separate file.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
80 Note that the traceback displayed is actually referring to |
|
915fdf283ac5
Moved docs out to a separate file.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
81 JavaScript code: one of Pydertron's helpful conveniences is that |
|
915fdf283ac5
Moved docs out to a separate file.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
82 it makes debugging JS code as much like debugging Python code as |
|
915fdf283ac5
Moved docs out to a separate file.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
83 possible. |
