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

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

Uploaded Source

Built Distributions

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

Uploaded Python 3 Windows x86-64

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

Uploaded Python 3 musllinux: musl 1.2+ ARM64

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

Uploaded Python 3 manylinux: glibc 2.31+ ARM64

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

Uploaded Python 3 macOS 11.0+ ARM64

mini_racer-0.8.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.8.0.tar.gz.

File metadata

  • Download URL: mini_racer-0.8.0.tar.gz
  • Upload date:
  • Size: 404.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.8.0.tar.gz
Algorithm Hash digest
SHA256 61a34ea7189dd8d5c023a15c5ef757d936ac014af0334664643c1105024f971d
MD5 1250523b45cbce19a04527ab05f83255
BLAKE2b-256 01f31392e94805015d78c50a8b3831e7aaa4a60bc0848f3fa2ce0c5a5e0a36a1

See more details on using hashes here.

File details

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

File metadata

  • Download URL: mini_racer-0.8.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.8.0-py3-none-win_amd64.whl
Algorithm Hash digest
SHA256 654b4abe5d4d572367007d120056dac574915e515119949fc9cb2a3bcb3d2a5b
MD5 a7f867fdbb80eb07f48a4cfe9e2d9540
BLAKE2b-256 0d0c949aa55a224328d5dd4049a3a12f4f2afbe0519f2eae7e2a1677fe80c24c

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for mini_racer-0.8.0-py3-none-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 58a3681824badc349cb388b8574206f6fa7ddda88578fea57a2d1074bce5d84b
MD5 7c1cbaf387ada94e3b80e1721be14767
BLAKE2b-256 dee3bb0539a469e4d8f5ce017fc0c80ca1b0241e7b32766b5315c840807234e6

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for mini_racer-0.8.0-py3-none-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 f3bf0b8319f72e08e617e186ef77c199b157676b5f8b3e0e61b54f6ae6d93ffb
MD5 e9d36e06e8006870b043a1d68206212c
BLAKE2b-256 f20906586f00859232844b1a02ef0de7d27ce64881bea53b04796ff99dbc78b8

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for mini_racer-0.8.0-py3-none-manylinux_2_31_x86_64.whl
Algorithm Hash digest
SHA256 60a74b3030327cdb0dcaaa2003e377db734660f2066563e3412a35946cdfd9fd
MD5 1bfc853451e9ce617a0e71e2b546d39c
BLAKE2b-256 88127bc98c468d04aa50b9fa824308466ef0efb71237dcb8562b82fd7c319198

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for mini_racer-0.8.0-py3-none-manylinux_2_31_aarch64.whl
Algorithm Hash digest
SHA256 e054eba45b4cbd664ed5fa92d46b5ce2897601a9a502c2d27785fc132f61f013
MD5 7d11b6cf74cf917f7a98afc12b301090
BLAKE2b-256 74c5ed1fe45d5e77f71fadb2e5dd1cbcc165c365196f5a75636895454cd6f4d2

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for mini_racer-0.8.0-py3-none-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 919d0ba42c84e905d3b701783af5554114250eeae6e930d186060e4da799de70
MD5 2a55f0eebb2285e8063eda81406efe08
BLAKE2b-256 1c133ea4fc07fc7ae7fdc97f7dac422cf0c1dabf3abe9a1dac5a14b40f75e1d6

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for mini_racer-0.8.0-py3-none-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 1f855c7000770ffd7304ff67984fe2396f8dde1d1f15441db2c26fa8aa6fcc36
MD5 9c90a84a9d1d5796675b719987b724c1
BLAKE2b-256 edd8820ff8789683aa28239e31ef2fd77694a24db134d10e4e51fb0a1100302d

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