Skip to main content

Minimal, modern embedded V8 for Python.

Project description

PyPI status indicator Github workflow status indicator ISC License

Minimal, modern embedded V8 for Python.

MiniRacer logo: a V8 with a very snakey 8

Full documentation.

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.

New home! (As of March 2024)

PyMiniRacer was created by Sqreen, and originally lived at https://github.com/sqreen/PyMiniRacer with the PyPI package py-mini-racer.

As of March 2024, after a few years without updates, I have reached out to the original Sqreen team. We agreed that I should fork PyMiniRacer, giving it a new home at https://github.com/bpcreech/PyMiniRacer with a new PyPI package mini-racer (note: no py-). It now has a new version for the first time since 2021!

Examples

MiniRacer is straightforward to use:

    $ pip install mini-racer

and then:

    $ python3
    >>> 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("'❤'"))
    
    >>> ctx.eval("var fun = () => ({ foo: 1 });")

Variables are kept inside of a context:

    >>> ctx.eval("x.company")
    'Sqreen'

While eval only supports returning primitive data types such as strings, call supports returning composite types such as objects:

    >>> ctx.call("fun")
    {'foo': 1}

Composite values are serialized using JSON. Use a custom JSON encoder when sending non-JSON encodable parameters:

    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)
    >>> 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:

    >>> ctx.execute("[1,2,3].includes(5)")
    False

MiniRacer supports the ECMA Intl API:

    # Indonesian dates!
    >>> ctx.eval('Intl.DateTimeFormat(["ban", "id"]).format(new Date())')
    '16/3/2024'

V8 heap information can be retrieved:

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

Compatibility

PyMiniRacer is compatible with Python 3.8-3.12 and is based on ctypes.

PyMiniRacer is distributed using wheels on PyPI. The wheels are intended to provide compatibility with:

OS x86_64 aarch64
macOS ≥ 10.9
Windows ≥ 10
Ubuntu ≥ 20.04
Debian ≥ 11
RHEL ≥ 8
other Linuxes with glibc ≥ 2.31
Alpine ≥ 3.19
other Linux with musl ≥ 1.2

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.

Developing and releasing PyMiniRacer

See the contribution guide.

Credits

Built with love by Sqreen.

PyMiniRacer launch was described in this blog post.

PyMiniRacer is inspired by mini_racer, built for the Ruby world by Sam Saffron.

In 2024, PyMiniRacer was revived, and adopted by Ben Creech. Upon discussion with the original Sqreen authors, we decided to re-launch PyMiniRacer as a fork under https://github.com/bpcreech/PyMiniRacer and https://pypi.org/project/mini-racer/.

Release history

0.9.0 (2024-03-30)

  • Revamped JS execution model to be out-of-thread. Python/C++ interaction now happens via callbacks.

  • Consequently, Control+C (KeyboardInterrupt) now interrupts JS execution.

  • Hardened C++-side thread safety model, resolving potential race conditions introduced in v0.8.1 (but not actually reported as happening anywhere).

  • Further improved JS exception reporting; exception reports now show the offending code where possible.

  • Introduced timeout_sec parameter to eval, call, and execute to replace the timeout, which unfortunately uses milliseconds (unlike the Python standard library). In the future we may emit deprecation warnings for use of timeout.

0.8.1 (2024-03-23)

  • A series of C++ changes which should not impact the behavior of PyMiniRacer:
  • Refactoring how we use V8 by inverting the control flow. Before we had function evaluations which ran and drained the message loop. Now we have an always-running message loop into which we inject function evaluations. This seems to be the preferred way to use V8. This is not expected to cause any behavior changes (but, in tests, makes microtask competion more consistent).
  • Refactoring the C++ implementation into multiple components to make startup and teardown logic more robust.
  • Added tests for the existing fast-function-call path.
  • Also, simplified Python conversion of C++ evaluation results.

0.8.0 (2024-03-18)

  • General overhaul of C++ implementation to better adhere to modern best practice. This should have no visible impact except for the following notes...
  • Exposed the hard memory limit as a context-specific (as opposed to eval-specific) limit, since that's how it worked all along anyway. The max_memory eval argument still works for backwards compatibility purposes.
  • Correct message type of some exceptions to str instead of bytes (they should all be str now).
  • Added better messages for JS parse errors.
  • Added backtraces for more JS errors.
  • Added some really basic Python typing.

0.7.0 (2024-03-06)

  • Update V8 to 12.2
  • Drop Python 2 support
  • Fix small Python 3.12 issue and add testing for Python 3.9-3.12
  • Add aarch64 support for Mac and Linux
  • Revamp DLL loading to be compliant with Python 3.9-style resource loading. This may present a small breaking change for advanced usage; the EXTENSION_PATH and EXTENSION_NAME module variables, and MiniRacer.v8_flags and MiniRacer.ext class variable have all been removed.
  • Add support for the ECMAScript internalization API and thus the ECMA Intl API
  • Use fast startup snapshots
  • Switch from setuptools to Hatch
  • Switch from tox to Hatch
  • Switch from flake8 and isort to Hatch's wrapper of Ruff
  • Switch from Sphinx to mkdocs (and hatch-mkdocs)
  • Switch from unittest to pytest
  • Add ARCHITECTURE.md and lots of code comments

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.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

mini_racer-0.9.0.tar.gz (413.3 kB view details)

Uploaded Source

Built Distributions

mini_racer-0.9.0-py3-none-win_amd64.whl (12.9 MB view details)

Uploaded Python 3 Windows x86-64

mini_racer-0.9.0-py3-none-musllinux_1_2_x86_64.whl (14.4 MB view details)

Uploaded Python 3 musllinux: musl 1.2+ x86-64

mini_racer-0.9.0-py3-none-musllinux_1_2_aarch64.whl (14.6 MB view details)

Uploaded Python 3 musllinux: musl 1.2+ ARM64

mini_racer-0.9.0-py3-none-manylinux_2_31_x86_64.whl (14.4 MB view details)

Uploaded Python 3 manylinux: glibc 2.31+ x86-64

mini_racer-0.9.0-py3-none-manylinux_2_31_aarch64.whl (14.5 MB view details)

Uploaded Python 3 manylinux: glibc 2.31+ ARM64

mini_racer-0.9.0-py3-none-macosx_11_0_arm64.whl (14.2 MB view details)

Uploaded Python 3 macOS 11.0+ ARM64

mini_racer-0.9.0-py3-none-macosx_10_9_x86_64.whl (15.1 MB view details)

Uploaded Python 3 macOS 10.9+ x86-64

File details

Details for the file mini_racer-0.9.0.tar.gz.

File metadata

  • Download URL: mini_racer-0.9.0.tar.gz
  • Upload date:
  • Size: 413.3 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/5.0.0 CPython/3.12.2

File hashes

Hashes for mini_racer-0.9.0.tar.gz
Algorithm Hash digest
SHA256 84d9e0814b77b1d9883ae6f5f2a1817066dfec2f53529b37f5583d655c8d2f9b
MD5 7dcfd0be68f64e197999b1a2d74e4287
BLAKE2b-256 23f18a84ac147dd69560bc9c5163e2fc9821bef5e9d55cae3ab387889ec41334

See more details on using hashes here.

File details

Details for the file mini_racer-0.9.0-py3-none-win_amd64.whl.

File metadata

  • Download URL: mini_racer-0.9.0-py3-none-win_amd64.whl
  • Upload date:
  • Size: 12.9 MB
  • Tags: Python 3, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/5.0.0 CPython/3.12.2

File hashes

Hashes for mini_racer-0.9.0-py3-none-win_amd64.whl
Algorithm Hash digest
SHA256 beb9a91bcddf4159932c8b8b8a02c2c343223e7a3bf18f4221ea2a04fadb3e9b
MD5 0a5bf0cb740d8456ca6b01abc46f8a50
BLAKE2b-256 dc14e7a61356d998be9a226bf4f37dfdd4325075975296ea8ea902baf5b136ab

See more details on using hashes here.

File details

Details for the file mini_racer-0.9.0-py3-none-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for mini_racer-0.9.0-py3-none-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 9fc9a8bc535e8d10b1b97a598ef98fc564ed74dac6ca2a1d05723a88d6d9338e
MD5 3a676e4bbb7fad21d9c7f4df8f32c7af
BLAKE2b-256 3b555ec6234168f7a59193bdf11d4243ec72bcabb7715ad9f57a4dc31b950894

See more details on using hashes here.

File details

Details for the file mini_racer-0.9.0-py3-none-musllinux_1_2_aarch64.whl.

File metadata

File hashes

Hashes for mini_racer-0.9.0-py3-none-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 e0551cadf80b43cc9fa265bf7aaeaa29c1ed17074f7328a130704fbc9b302fa5
MD5 48e7fa0d4281f8be755a10433e7d1ab4
BLAKE2b-256 dba3a506970eda991e0cbbd8fa133453623a001138475b59fa3b61feb7a3b4c0

See more details on using hashes here.

File details

Details for the file mini_racer-0.9.0-py3-none-manylinux_2_31_x86_64.whl.

File metadata

File hashes

Hashes for mini_racer-0.9.0-py3-none-manylinux_2_31_x86_64.whl
Algorithm Hash digest
SHA256 6d9b69416054eb70329c5f26bc4c516de667f90587ef606cccddff56b32705bb
MD5 dacb5aaa091517491582f11e5bd5f286
BLAKE2b-256 f9603bd9022c365fb296e41b815716d1036da327e66becbf5a16ecf8514448a6

See more details on using hashes here.

File details

Details for the file mini_racer-0.9.0-py3-none-manylinux_2_31_aarch64.whl.

File metadata

File hashes

Hashes for mini_racer-0.9.0-py3-none-manylinux_2_31_aarch64.whl
Algorithm Hash digest
SHA256 7876774e501ce05af39574ce634e47faa1a30a1f7a4fa138bfb635c79032321c
MD5 30ae8068d9e4fcdbc240b4b69a2c0805
BLAKE2b-256 d4bd00316065bb08d98f8662afe9e6137c768fa647edfa49cf44f6f95b408224

See more details on using hashes here.

File details

Details for the file mini_racer-0.9.0-py3-none-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for mini_racer-0.9.0-py3-none-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 78038294128bda0caceceebfeabda1c028e8910be3ec023fa138d39278cbb8f8
MD5 67f3401c57bbc6d73c0e3a06c7ba3660
BLAKE2b-256 753dfb17e5ca6e5abb61def451a43c340dad95b7b16d63d2a78085b91c37f0fc

See more details on using hashes here.

File details

Details for the file mini_racer-0.9.0-py3-none-macosx_10_9_x86_64.whl.

File metadata

File hashes

Hashes for mini_racer-0.9.0-py3-none-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 bc67e11fe38aae31565792c314e47401b50bb14390db4c0fcb8e5d5db11cba43
MD5 960019bed57246b345e8571c59b06e1f
BLAKE2b-256 84082b202bd97d27c8c3cd7472d76ec02a2f30141d5c1b761553ede61657ce7f

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page