Skip to main content

PyPI Python version Format Test

Groovy is a Python-to-JavaScript transpiler, meaning that it converts Python functions to their JavaScript equivalents. It is used in the Gradio library, so that developers can write functions in Python and have them run as fast as client-side JavaScript ⚡. Instead of aiming for full coverage of Python features, groovy prioritizes clear error reporting for unsupported Python code, making it easier for developers to modify their functions accordingly.

🚀 Features

  • Converts simple Python functions into JavaScript equivalents.
  • Supports a subset of the Python standard library along with some Gradio-specific classes.
  • Provides complete error reporting when a function can't be transpiled (either due to no equivalent in JavaScript or ambiguity).

📦 Installation

Install groovy via pip:

pip install groovy

🔧 Usage

from groovy import transpile

def sum_range(n: int):
    total = 0
    for i in range(n):
        total = total + i
    return total

js_code = transpile(sum)
print(js_code)

produces:

function sum_range(n) {
    let total = 0;
    for (let i of Array.from({length: n}, (_, i) => i)) {
        total = (total + i);
    }
    return total;

Note that the JavaScript function is not necessarily minimized or optimized (yet) but it should return exactly the same value when called with the same arguments. While the internal implementation of the transpiled JavaScript function may differ slightly from the Python version (e.g. Python tuples may get converted to JS arrays), groovy tries to guarantee that the return values will be identical for the same inputs.

If groovy encounters unsupported syntax, it will complain clearly (throw a TranspilationError with all of the issues along with line numbers and the code that caused the issue, making it easy for developers to fix their code.

def example_function(x, y):
    z = x + y
    if z > 10:
        print(z)
    else:
        print(0)

transpile(example_function)

raises:

TranspilerError: 2 issues found:

* Line 4: Unsupported function "print()"
>> print(z)
* Line 6: Unsupported function "print()"
>> print(0)

🤔 Ambiguity

groovy takes a conservative approach when encountering ambiguous types. Instead of making assumptions about types, it will raise a TranspilationError. For example, a simple sum function without type hints will fail:

def sum(a, b):
    return a + b

transpile(sum)  # Raises TranspilationError: Cannot determine types for parameters 'a' and 'b'

This is because + could mean different things in JavaScript depending on the types (string concatenation vs numeric addition vs. custom behavior for a custom class). Adding type hints (which is strongly recommended for all usage) resolves the ambiguity:

def sum(a: int, b: int):
    return a + b

transpile(sum)  # Works! Produces: function sum(a, b) { return (a + b); }

🔥 Supported Syntax

groovy supports the following Python syntax and built-in functions. Other functions will not be transpiled.

General

Python Syntax JavaScript Equivalent
def function(x: int) function function(x)
x + y, x - y, x * y, x / y (x + y), (x - y), (x * y), (x / y)
x > y, x < y, x >= y, x <= y (x > y), (x < y), (x >= y), (x <= y)
x == y, x != y (x === y), (x !== y)
x in list, x not in list list.includes(x), !list.includes(x)
x = value let x = value
if condition: ... elif: ... else: ... if (condition) { ... } else if { ... } else { ... }
for x in range(n) for (let x of Array.from({length: n}, (_, i) => i))
for x in list for (let x of list)
while condition while (condition)
[x for x in list if condition] list.filter(x => condition).map(x => x)
len(list) list.length
len(dict) Object.keys(dict).length
[1, 2, 3] [1, 2, 3]
(1, 2, 3) [1, 2, 3]
{"key": "value"} {"key": "value"}
x and y, x or y (x && y), `(x
None null

Gradio-specific syntax

Python Syntax JavaScript Equivalent
gr.Component(param=value) {"param": "value", "__type__": "update"}

📜 License

groovy is open-source under the MIT License.


Contributions to increase coverage of the Python library that groovy can transpile are welcome! We welcome AI-generated PRs if the rationale is clear to follow, PRs are not too large in scope, and tests are included.

Download files

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

Source Distribution

groovy-0.1.1.tar.gz (16.9 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

groovy-0.1.1-py3-none-any.whl (13.8 kB view details)

Uploaded Python 3

File details

Details for the file groovy-0.1.1.tar.gz.

File metadata

  • Download URL: groovy-0.1.1.tar.gz
  • Upload date:
  • Size: 16.9 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.13.2

File hashes

Hashes for groovy-0.1.1.tar.gz
Algorithm Hash digest
SHA256 1f537d4125f89b97b8657d787a410bcdf22ed3ab7c5c32dc4e25c3e88fe60956
MD5 4f68cd52d91d7224a40b576799857d3d
BLAKE2b-256 c70e536ed8386c8c4749ee1e7481a96e96e66a05d1ed0dec67e690d30080108d

See more details on using hashes here.

File details

Details for the file groovy-0.1.1-py3-none-any.whl.

File metadata

  • Download URL: groovy-0.1.1-py3-none-any.whl
  • Upload date:
  • Size: 13.8 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.13.2

File hashes

Hashes for groovy-0.1.1-py3-none-any.whl
Algorithm Hash digest
SHA256 372787bddf166c7e93c9429226504c8753864ec57dfccec48f6b0c2317e99b74
MD5 6c3b0ad59383ef687c8a8efa553cc428
BLAKE2b-256 12600b7e0904e52621b0d0a1a052aaf35526f66572a6377fb26ff51339c2fbd9

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page