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.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.8.1.tar.gz (407.7 kB view details)

Uploaded Source

Built Distributions

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

Uploaded Python 3 Windows x86-64

mini_racer-0.8.1-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.8.1-py3-none-musllinux_1_2_aarch64.whl (14.6 MB view details)

Uploaded Python 3 musllinux: musl 1.2+ ARM64

mini_racer-0.8.1-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.8.1-py3-none-manylinux_2_31_aarch64.whl (14.5 MB view details)

Uploaded Python 3 manylinux: glibc 2.31+ ARM64

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

Uploaded Python 3 macOS 11.0+ ARM64

mini_racer-0.8.1-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.8.1.tar.gz.

File metadata

  • Download URL: mini_racer-0.8.1.tar.gz
  • Upload date:
  • Size: 407.7 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.8.1.tar.gz
Algorithm Hash digest
SHA256 d4742500f830b04f2c1cfef2af74f1307954e65d9f902adeb7687229ef5fabf9
MD5 300bba2beffb56199c4651150986ee37
BLAKE2b-256 443ac9e66f4c9c692be4658b8237c571eb952a40d38cf7b80b74b273fa902ecf

See more details on using hashes here.

File details

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

File metadata

  • Download URL: mini_racer-0.8.1-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.8.1-py3-none-win_amd64.whl
Algorithm Hash digest
SHA256 7ca2fb6fdc272f6fa5fd75beeb597620e7fd22912aac57fbfbe7d317ff9af70a
MD5 efe004ba9b9652a164af116341e7d0da
BLAKE2b-256 54fd4ccac587e7a2aad3ea1e39ff660aa93a0132d252d9ba9e5a8e70d9ab90cb

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for mini_racer-0.8.1-py3-none-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 38383555d44ccda3e402f6f4a3001b8629f9cad7da1a7ed60417bc18aea0b4c5
MD5 42d4967837303e8b9647e56cfb01e287
BLAKE2b-256 3068e2380f5b6ea5ada3e3fdace4f0ff2b8a54b6c095978ef9173f82494b65c2

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for mini_racer-0.8.1-py3-none-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 adc71d446b95acf4573bb997734c27bb5006a8b6c35b168b076c8f57ebfa0441
MD5 e485dd2d2d16b188b8aa12c08aff32dc
BLAKE2b-256 f7c7200ded1316db7853c24b5eaee29b1d1e03722bc4ea6cdd41b8c5f0b17ab3

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for mini_racer-0.8.1-py3-none-manylinux_2_31_x86_64.whl
Algorithm Hash digest
SHA256 5225d04c3c1b3e94081383c5ed27525603d6d387841ab86f249bd0bf195fc733
MD5 a57d3adaceb17433af04fc0ad7a3a850
BLAKE2b-256 1e12b23010e1e1b1c8f777b4426dd8b2e282cc9afe5fa5b32b7a9d5212f475de

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for mini_racer-0.8.1-py3-none-manylinux_2_31_aarch64.whl
Algorithm Hash digest
SHA256 ea5214955ef3b953ae0691949146773a21c77e214ed190242512dc624f893ac2
MD5 0514592328644f2493e93adb110aa8e3
BLAKE2b-256 a548fd98e1cbdb1083ba2ab516448d9c3f6e12e3ce0db445f53e7e5eac760893

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for mini_racer-0.8.1-py3-none-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 e4c021b34f6f58e1a98ac6a5104f4f51a55b10ee214ab5018fcb9c1a0477799c
MD5 b3df940d5139651a73745d6c04635cc0
BLAKE2b-256 b5772d70040eaf3c23066c50f4df7e19505e0866ef0e443e806db8a1986bbec2

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for mini_racer-0.8.1-py3-none-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 543258f0f5d65bc2b437ebacc34a3d2c3a18aa3b7c25969cb918e843e3545af2
MD5 1eba3d2c2bd2da22b59cc31f182bd0fc
BLAKE2b-256 e672a10f96ffbb4c39376352f799c9f63db6589438c9580f96c5831ddd8ddc8f

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