.. image:: https://img.shields.io/pypi/v/py_mini_racer.svg
:target: https://pypi.python.org/pypi/py_mini_racer
.. image:: https://dev.azure.com/sqreenci/PyMiniRacer/_apis/build/status/sqreen.PyMiniRacer?branchName=master
:target: https://dev.azure.com/sqreenci/PyMiniRacer/_build/latest?definitionId=10&branchName=master
.. image:: https://img.shields.io/badge/License-ISC-blue.svg
:target: https://opensource.org/licenses/ISC
Minimal, modern embedded V8 for Python.
.. image:: https://github.com/sqreen/PyMiniRacer/raw/master/data/py_mini_racer.png
:align: center
Features
--------
* Latest ECMAScript support
* Web Assembly support
* Unicode support
* Thread safe
* Re-usable contexts
MiniRacer can be easily used by Django or Flask projects to minify assets, run
babel or WASM modules.
Examples
--------
MiniRacer is straightforward to use:
.. code-block:: python
>>> from py_mini_racer import MiniRacer
>>> ctx = MiniRacer()
>>> ctx.eval("1+1")
2
>>> ctx.eval("var x = {company: 'Sqreen'}; x.company")
'Sqreen'
>>> print(ctx.eval("'\N{HEAVY BLACK HEART}'"))
❤
>>> ctx.eval("var fun = () => ({ foo: 1 });")
Variables are kept inside of a context:
.. code-block:: python
>>> ctx.eval("x.company")
'Sqreen'
While ``eval`` only supports returning primitive data types such as
strings, ``call`` supports returning composite types such as objects:
.. code-block:: python
>>> ctx.call("fun")
{'foo': 1}
Composite values are serialized using JSON.
Use a custom JSON encoder when sending non-JSON encodable parameters:
.. code-block:: python
import json
from datetime import datetime
class CustomEncoder(json.JSONEncoder):
def default(self, obj):
if isinstance(obj, datetime):
return obj.isoformat()
return json.JSONEncoder.default(self, obj)
.. code-block:: python
>>> ctx.eval("var f = function(args) { return args; }")
>>> ctx.call("f", datetime.now(), encoder=CustomEncoder)
'2017-03-31T16:51:02.474118'
MiniRacer is ES6 capable:
.. code-block:: python
>>> ctx.execute("[1,2,3].includes(5)")
False
V8 heap information can be retrieved:
.. code-block:: python
>>> ctx.heap_stats()
{'total_physical_size': 1613896,
'used_heap_size': 1512520,
'total_heap_size': 3997696,
'total_heap_size_executable': 3145728,
'heap_size_limit': 1501560832}
A WASM example is available in the `tests`_.
.. _`tests`: https://github.com/sqreen/PyMiniRacer/blob/master/tests/test_wasm.py
Compatibility
-------------
PyMiniRacer is compatible with Python 2 & 3 and based on ctypes.
The binary builds have been tested on x86_64 with:
* macOS >= 10.13
* Ubuntu >= 16.04
* Debian >= 9
* CentOS >= 7
* Alpine >= 3.11
* Windows 10
It should work on any Linux with a libc >= 2.12 and a wheel compatible pip (>= 8.1).
If you're running Alpine Linux, you may need to install required dependencies manually using the following command:
.. code-block:: bash
$ apk add libgcc libstdc++
If you have a up-to-date pip and it doesn't use a wheel, you might have an environment for which no wheel is built. Please open an issue.
Installation
------------
We built Python wheels (prebuilt binaries) for macOS 64 bits, Linux 64 bits and Windows 64 bits.
.. code:: bash
$ pip install py-mini-racer
Build
-----
**Warning**: building this package from source takes several GB of disk space and takes ~60 minutes.
First check that your current Python executable is version 2.7. This is required
by the V8 build system.
.. code:: bash
$ python --version
Python 2.7.16
You can build the extension with the following command:
.. code:: bash
$ python helpers/v8_build.py
You can generate a wheel for whatever Python version with the command:
.. code:: bash
$ python3 helpers/build_package.py wheel dist
It will then build V8, the extension, and generates a wheel for your current
Python version. The V8 builds are cached in the ``py_mini_racer/extension/v8/``
directory.
Notes for building on macOS
'''''''''''''''''''''''''''
The legacy Python binary builds (OSX 10.6) need to be downloaded from:
https://www.python.org/downloads/
They will allow to build a wheel compatible with former OSX versions.
Tests
-----
If you want to run the tests, you need to build the extension first, first install pytest:
.. code-block:: bash
$ python -m pip install pytest
Then launch:
.. code:: bash
$ python -m pytest tests
Credits
-------
Built with love by Sqreen_.
.. _Sqreen: https://www.sqreen.com
PyMiniRacer launch was described in `this blog post`_.
.. _`this blog post`: https://blog.sqreen.com/embedding-javascript-into-python/
PyMiniRacer is inspired by mini_racer_, built for the Ruby world by Sam Saffron.
.. _`mini_racer`: https://github.com/SamSaffron/mini_racer
`Cookiecutter-pypackage`_ was used as this package skeleton.
.. _`Cookiecutter-pypackage`: https://github.com/audreyr/cookiecutter-pypackage
History
-------
0.6.0 (2020-04-20)
'''''''''''''''''''
* Update V8 to 8.9
* Optimize function calls without arguments
* Switch V8 to single threaded mode to avoid crashes after fork
* Switch to strict mode by default
* Revamp documentation
0.5.0 (2020-02-25)
'''''''''''''''''''
* Update V8 to 8.8
0.4.0 (2020-09-22)
'''''''''''''''''''
* Universal wheels for Linux, Mac and Windows
* Fallback to source package for Alpine Linux
0.3.0 (2020-06-29)
'''''''''''''''''''
* Introduce a strict mode
* Fix array conversion when size changes dynamically (CVE-2020-25489)
0.2.0 (2020-03-11)
'''''''''''''''''''
* Support for Alpine Linux
* Avoid pip private modules in setup.py
0.2.0b1 (2020-01-09)
'''''''''''''''''''''
* Support for Windows 64 bits
* Support for Python 3.8
* Upgrade V8 to 7.8
* Support soft memory limits
0.1.18 (2019-01-04)
''''''''''''''''''''
* Support memory and time limits
0.1.17 (2018-19-12)
''''''''''''''''''''
* Upgrade libv8
* Fix a memory leak
0.1.16 (2018-07-11)
''''''''''''''''''''
* Add wheel for Python without PyMalloc
0.1.15 (2018-06-18)
''''''''''''''''''''
* Add wheel for Python 3.7
0.1.14 (2018-05-25)
''''''''''''''''''''
* Add support for pip 10
* Update package metadata
0.1.13 (2018-03-15)
''''''''''''''''''''
* Add heap_stats function
* Fix issue with returned strings containing null bytes
0.1.12 (2018-17-04)
''''''''''''''''''''
* Remove dependency to enum
0.1.11 (2017-07-11)
''''''''''''''''''''
* Add compatibility for centos6
0.1.10 (2017-03-31)
''''''''''''''''''''
* Add the possibility to pass a custom JSON encoder in call.
0.1.9 (2017-03-24)
'''''''''''''''''''
* Fix the compilation for Ubuntu 12.04 and glibc < 2.17.
0.1.8 (2017-03-02)
'''''''''''''''''''
* Update targets build for better compatibility with old Mac OS X and linux platforms.
0.1.7 (2016-10-04)
'''''''''''''''''''
* Improve general performances of the JS execution.
* Add the possibility to build a different version of V8 (for example with debug symbols).
* Fix a conflict that could happens between statically linked libraries and dynamic ones.
0.1.6 (2016-08-12)
'''''''''''''''''''
* Add error message when py_mini_racer sdist fails to build asking to update pip in order to download the pre-compiled wheel instead of the source distribution.
0.1.5 (2016-08-04)
'''''''''''''''''''
* Build py_mini_racer against a static Python. When built against a shared library python, it doesn't work with a static Python.
0.1.4 (2016-08-04)
'''''''''''''''''''
* Ensure JSEvalException message is converted to unicode
0.1.3 (2016-08-04)
'''''''''''''''''''
* Fix extension loading for python3
* Add a make target for building distributions (sdist + wheels)
* Fix eval conversion for python 3
0.1.2 (2016-08-03)
'''''''''''''''''''
* Fix date support
* Fix Dockerfile for generating python3 wheels
0.1.1 (2016-08-02)
'''''''''''''''''''
* Fix sdist distribution.
0.1.0 (2016-08-01)
'''''''''''''''''''
* First release on PyPI.
Raw data
{
"_id": null,
"home_page": "https://github.com/sqreen/PyMiniRacer",
"name": "py-mini-racer",
"maintainer": "",
"docs_url": null,
"requires_python": "",
"maintainer_email": "",
"keywords": "py_mini_racer",
"author": "Sqreen",
"author_email": "support@sqreen.com",
"download_url": "https://files.pythonhosted.org/packages/50/97/a578b918b2e5923dd754cb60bb8b8aeffc85255ffb92566e3c65b148ff72/py_mini_racer-0.6.0.tar.gz",
"platform": "",
"description": ".. image:: https://img.shields.io/pypi/v/py_mini_racer.svg\n :target: https://pypi.python.org/pypi/py_mini_racer\n\n.. image:: https://dev.azure.com/sqreenci/PyMiniRacer/_apis/build/status/sqreen.PyMiniRacer?branchName=master\n :target: https://dev.azure.com/sqreenci/PyMiniRacer/_build/latest?definitionId=10&branchName=master\n\n.. image:: https://img.shields.io/badge/License-ISC-blue.svg\n :target: https://opensource.org/licenses/ISC\n\nMinimal, modern embedded V8 for Python.\n\n.. image:: https://github.com/sqreen/PyMiniRacer/raw/master/data/py_mini_racer.png\n :align: center\n\nFeatures\n--------\n\n* Latest ECMAScript support\n* Web Assembly support\n* Unicode support\n* Thread safe\n* Re-usable contexts\n\nMiniRacer can be easily used by Django or Flask projects to minify assets, run\nbabel or WASM modules.\n\nExamples\n--------\n\nMiniRacer is straightforward to use:\n\n.. code-block:: python\n\n >>> from py_mini_racer import MiniRacer\n >>> ctx = MiniRacer()\n >>> ctx.eval(\"1+1\")\n 2\n >>> ctx.eval(\"var x = {company: 'Sqreen'}; x.company\")\n 'Sqreen'\n >>> print(ctx.eval(\"'\\N{HEAVY BLACK HEART}'\"))\n \u2764\n >>> ctx.eval(\"var fun = () => ({ foo: 1 });\")\n\nVariables are kept inside of a context:\n\n.. code-block:: python\n\n >>> ctx.eval(\"x.company\")\n 'Sqreen'\n\n\nWhile ``eval`` only supports returning primitive data types such as\nstrings, ``call`` supports returning composite types such as objects:\n\n.. code-block:: python\n\n >>> ctx.call(\"fun\")\n {'foo': 1}\n\n\nComposite values are serialized using JSON.\nUse a custom JSON encoder when sending non-JSON encodable parameters:\n\n.. code-block:: python\n\n import json\n\n from datetime import datetime\n\n class CustomEncoder(json.JSONEncoder):\n\n def default(self, obj):\n if isinstance(obj, datetime):\n return obj.isoformat()\n\n return json.JSONEncoder.default(self, obj)\n\n\n.. code-block:: python\n\n >>> ctx.eval(\"var f = function(args) { return args; }\")\n >>> ctx.call(\"f\", datetime.now(), encoder=CustomEncoder)\n '2017-03-31T16:51:02.474118'\n\n\nMiniRacer is ES6 capable:\n\n.. code-block:: python\n\n >>> ctx.execute(\"[1,2,3].includes(5)\")\n False\n\nV8 heap information can be retrieved:\n\n.. code-block:: python\n\n >>> ctx.heap_stats()\n {'total_physical_size': 1613896,\n 'used_heap_size': 1512520,\n 'total_heap_size': 3997696,\n 'total_heap_size_executable': 3145728,\n 'heap_size_limit': 1501560832}\n\n\nA WASM example is available in the `tests`_.\n\n.. _`tests`: https://github.com/sqreen/PyMiniRacer/blob/master/tests/test_wasm.py\n\n\nCompatibility\n-------------\n\nPyMiniRacer is compatible with Python 2 & 3 and based on ctypes.\n\nThe binary builds have been tested on x86_64 with:\n\n* macOS >= 10.13\n* Ubuntu >= 16.04\n* Debian >= 9\n* CentOS >= 7\n* Alpine >= 3.11\n* Windows 10\n\nIt should work on any Linux with a libc >= 2.12 and a wheel compatible pip (>= 8.1).\n\nIf you're running Alpine Linux, you may need to install required dependencies manually using the following command:\n\n.. code-block:: bash\n\n $ apk add libgcc libstdc++\n\nIf you have a up-to-date pip and it doesn't use a wheel, you might have an environment for which no wheel is built. Please open an issue.\n\nInstallation\n------------\n\nWe built Python wheels (prebuilt binaries) for macOS 64 bits, Linux 64 bits and Windows 64 bits.\n\n.. code:: bash\n\n $ pip install py-mini-racer\n\nBuild\n-----\n\n**Warning**: building this package from source takes several GB of disk space and takes ~60 minutes.\n\nFirst check that your current Python executable is version 2.7. This is required\nby the V8 build system.\n\n.. code:: bash\n\n $ python --version\n Python 2.7.16\n\nYou can build the extension with the following command:\n\n.. code:: bash\n\n $ python helpers/v8_build.py\n\nYou can generate a wheel for whatever Python version with the command:\n\n.. code:: bash\n\n $ python3 helpers/build_package.py wheel dist\n\nIt will then build V8, the extension, and generates a wheel for your current\nPython version. The V8 builds are cached in the ``py_mini_racer/extension/v8/``\ndirectory.\n\nNotes for building on macOS\n'''''''''''''''''''''''''''\n\nThe legacy Python binary builds (OSX 10.6) need to be downloaded from:\n https://www.python.org/downloads/\n\nThey will allow to build a wheel compatible with former OSX versions.\n\nTests\n-----\n\nIf you want to run the tests, you need to build the extension first, first install pytest:\n\n.. code-block:: bash\n\n $ python -m pip install pytest\n\nThen launch:\n\n.. code:: bash\n\n $ python -m pytest tests\n\nCredits\n-------\n\nBuilt with love by Sqreen_.\n\n.. _Sqreen: https://www.sqreen.com\n\nPyMiniRacer launch was described in `this blog post`_.\n\n.. _`this blog post`: https://blog.sqreen.com/embedding-javascript-into-python/\n\nPyMiniRacer is inspired by mini_racer_, built for the Ruby world by Sam Saffron.\n\n.. _`mini_racer`: https://github.com/SamSaffron/mini_racer\n\n`Cookiecutter-pypackage`_ was used as this package skeleton.\n\n.. _`Cookiecutter-pypackage`: https://github.com/audreyr/cookiecutter-pypackage\n\n\n\n\nHistory\n-------\n\n0.6.0 (2020-04-20)\n'''''''''''''''''''\n* Update V8 to 8.9\n* Optimize function calls without arguments\n* Switch V8 to single threaded mode to avoid crashes after fork\n* Switch to strict mode by default\n* Revamp documentation\n\n0.5.0 (2020-02-25)\n'''''''''''''''''''\n* Update V8 to 8.8\n\n0.4.0 (2020-09-22)\n'''''''''''''''''''\n* Universal wheels for Linux, Mac and Windows\n* Fallback to source package for Alpine Linux\n\n0.3.0 (2020-06-29)\n'''''''''''''''''''\n* Introduce a strict mode\n* Fix array conversion when size changes dynamically (CVE-2020-25489)\n\n0.2.0 (2020-03-11)\n'''''''''''''''''''\n* Support for Alpine Linux\n* Avoid pip private modules in setup.py\n\n0.2.0b1 (2020-01-09)\n'''''''''''''''''''''\n* Support for Windows 64 bits\n* Support for Python 3.8\n* Upgrade V8 to 7.8\n* Support soft memory limits\n\n0.1.18 (2019-01-04)\n''''''''''''''''''''\n* Support memory and time limits\n\n0.1.17 (2018-19-12)\n''''''''''''''''''''\n* Upgrade libv8\n* Fix a memory leak\n\n0.1.16 (2018-07-11)\n''''''''''''''''''''\n* Add wheel for Python without PyMalloc\n\n0.1.15 (2018-06-18)\n''''''''''''''''''''\n* Add wheel for Python 3.7\n\n\n0.1.14 (2018-05-25)\n''''''''''''''''''''\n* Add support for pip 10\n* Update package metadata\n\n0.1.13 (2018-03-15)\n''''''''''''''''''''\n* Add heap_stats function\n* Fix issue with returned strings containing null bytes\n\n0.1.12 (2018-17-04)\n''''''''''''''''''''\n* Remove dependency to enum\n\n0.1.11 (2017-07-11)\n''''''''''''''''''''\n* Add compatibility for centos6\n\n0.1.10 (2017-03-31)\n''''''''''''''''''''\n* Add the possibility to pass a custom JSON encoder in call.\n\n0.1.9 (2017-03-24)\n'''''''''''''''''''\n* Fix the compilation for Ubuntu 12.04 and glibc < 2.17.\n\n0.1.8 (2017-03-02)\n'''''''''''''''''''\n* Update targets build for better compatibility with old Mac OS X and linux platforms.\n\n0.1.7 (2016-10-04)\n'''''''''''''''''''\n* Improve general performances of the JS execution.\n* Add the possibility to build a different version of V8 (for example with debug symbols).\n* Fix a conflict that could happens between statically linked libraries and dynamic ones.\n\n0.1.6 (2016-08-12)\n'''''''''''''''''''\n* Add error message when py_mini_racer sdist fails to build asking to update pip in order to download the pre-compiled wheel instead of the source distribution.\n\n0.1.5 (2016-08-04)\n'''''''''''''''''''\n* Build py_mini_racer against a static Python. When built against a shared library python, it doesn't work with a static Python.\n\n0.1.4 (2016-08-04)\n'''''''''''''''''''\n* Ensure JSEvalException message is converted to unicode\n\n0.1.3 (2016-08-04)\n'''''''''''''''''''\n* Fix extension loading for python3\n* Add a make target for building distributions (sdist + wheels)\n* Fix eval conversion for python 3\n\n0.1.2 (2016-08-03)\n'''''''''''''''''''\n* Fix date support\n* Fix Dockerfile for generating python3 wheels\n\n\n0.1.1 (2016-08-02)\n'''''''''''''''''''\n* Fix sdist distribution.\n\n\n0.1.0 (2016-08-01)\n'''''''''''''''''''\n* First release on PyPI.\n\n\n",
"bugtrack_url": null,
"license": "ISCL",
"summary": "Minimal, modern embedded V8 for Python.",
"version": "0.6.0",
"project_urls": {
"Homepage": "https://github.com/sqreen/PyMiniRacer"
},
"split_keywords": [
"py_mini_racer"
],
"urls": [
{
"comment_text": "",
"digests": {
"blake2b_256": "1313058240c7fd1fbf29a24bda048d93346c2a56275736b76b56afe64050a161",
"md5": "dc5823c40af70b4538d5d406adf422c8",
"sha256": "346e73bb89a2024888244d487834be24a121089ceb0641dd0200cb96c4e24b57"
},
"downloads": -1,
"filename": "py_mini_racer-0.6.0-py2.py3-none-macosx_10_10_x86_64.whl",
"has_sig": false,
"md5_digest": "dc5823c40af70b4538d5d406adf422c8",
"packagetype": "bdist_wheel",
"python_version": "py2.py3",
"requires_python": null,
"size": 5280865,
"upload_time": "2021-04-22T07:58:29",
"upload_time_iso_8601": "2021-04-22T07:58:29.118789Z",
"url": "https://files.pythonhosted.org/packages/13/13/058240c7fd1fbf29a24bda048d93346c2a56275736b76b56afe64050a161/py_mini_racer-0.6.0-py2.py3-none-macosx_10_10_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "29a98ce0ca222ef04d602924a1e099be93f5435ca6f3294182a30574d4159ca2",
"md5": "a6338e8383e784bb39741a63e5d01eb5",
"sha256": "42896c24968481dd953eeeb11de331f6870917811961c9b26ba09071e07180e2"
},
"downloads": -1,
"filename": "py_mini_racer-0.6.0-py2.py3-none-manylinux1_x86_64.whl",
"has_sig": false,
"md5_digest": "a6338e8383e784bb39741a63e5d01eb5",
"packagetype": "bdist_wheel",
"python_version": "py2.py3",
"requires_python": null,
"size": 5416149,
"upload_time": "2021-04-22T07:58:25",
"upload_time_iso_8601": "2021-04-22T07:58:25.615948Z",
"url": "https://files.pythonhosted.org/packages/29/a9/8ce0ca222ef04d602924a1e099be93f5435ca6f3294182a30574d4159ca2/py_mini_racer-0.6.0-py2.py3-none-manylinux1_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "5d7176ac5d593e14b148a4847b608c5ad9a2c7c4827c796c33b396d0437fa113",
"md5": "6d374ecdbac8cb5e44a59ec8aaf40bb0",
"sha256": "97cab31bbf63ce462ba4cd6e978c572c916d8b15586156c7c5e0b2e42c10baab"
},
"downloads": -1,
"filename": "py_mini_racer-0.6.0-py2.py3-none-win_amd64.whl",
"has_sig": false,
"md5_digest": "6d374ecdbac8cb5e44a59ec8aaf40bb0",
"packagetype": "bdist_wheel",
"python_version": "py2.py3",
"requires_python": null,
"size": 4797809,
"upload_time": "2021-04-22T07:58:32",
"upload_time_iso_8601": "2021-04-22T07:58:32.286778Z",
"url": "https://files.pythonhosted.org/packages/5d/71/76ac5d593e14b148a4847b608c5ad9a2c7c4827c796c33b396d0437fa113/py_mini_racer-0.6.0-py2.py3-none-win_amd64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "5097a578b918b2e5923dd754cb60bb8b8aeffc85255ffb92566e3c65b148ff72",
"md5": "ce07b3bd8ecceea6cbc3f6ff51f1f79f",
"sha256": "f71e36b643d947ba698c57cd9bd2232c83ca997b0802fc2f7f79582377040c11"
},
"downloads": -1,
"filename": "py_mini_racer-0.6.0.tar.gz",
"has_sig": false,
"md5_digest": "ce07b3bd8ecceea6cbc3f6ff51f1f79f",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 5994836,
"upload_time": "2021-04-22T07:58:35",
"upload_time_iso_8601": "2021-04-22T07:58:35.993523Z",
"url": "https://files.pythonhosted.org/packages/50/97/a578b918b2e5923dd754cb60bb8b8aeffc85255ffb92566e3c65b148ff72/py_mini_racer-0.6.0.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2021-04-22 07:58:35",
"github": true,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"github_user": "sqreen",
"github_project": "PyMiniRacer",
"travis_ci": false,
"coveralls": false,
"github_actions": true,
"tox": true,
"lcname": "py-mini-racer"
}