Skip to main content

Transform Python source code into it's most compact representation

Project description

Python Minifier

Transforms Python source code into its most compact representation.

Try it out!

python-minifier currently supports Python 2.7 and Python 3.3 to 3.14. Previous releases supported Python 2.6.

As an example, the following python source:

def handler(event, context):
    l.info(event)
    try:
        i_token = hashlib.new('md5', (event['RequestId'] + event['StackId']).encode()).hexdigest()
        props = event['ResourceProperties']

        if event['RequestType'] == 'Create':
            event['PhysicalResourceId'] = 'None'
            event['PhysicalResourceId'] = create_cert(props, i_token)
            add_tags(event['PhysicalResourceId'], props)
            validate(event['PhysicalResourceId'], props)

            if wait_for_issuance(event['PhysicalResourceId'], context):
                event['Status'] = 'SUCCESS'
                return send(event)
            else:
                return reinvoke(event, context)

        elif event['RequestType'] == 'Delete':
            if event['PhysicalResourceId'] != 'None':
                acm.delete_certificate(CertificateArn=event['PhysicalResourceId'])
            event['Status'] = 'SUCCESS'
            return send(event)

        elif event['RequestType'] == 'Update':

            if replace_cert(event):
                event['PhysicalResourceId'] = create_cert(props, i_token)
                add_tags(event['PhysicalResourceId'], props)
                validate(event['PhysicalResourceId'], props)

                if not wait_for_issuance(event['PhysicalResourceId'], context):
                    return reinvoke(event, context)
            else:
                if 'Tags' in event['OldResourceProperties']:
                    acm.remove_tags_from_certificate(CertificateArn=event['PhysicalResourceId'],
                                                     Tags=event['OldResourceProperties']['Tags'])

                add_tags(event['PhysicalResourceId'], props)

            event['Status'] = 'SUCCESS'
            return send(event)
        else:
            raise RuntimeError('Unknown RequestType')

    except Exception as ex:
        l.exception('')
        event['Status'] = 'FAILED'
        event['Reason'] = str(ex)
        return send(event)

Becomes:

def handler(event,context):
	L='OldResourceProperties';K='Tags';J='None';H='SUCCESS';G='RequestType';E='Status';D=context;B='PhysicalResourceId';A=event;l.info(A)
	try:
		F=hashlib.new('md5',(A['RequestId']+A['StackId']).encode()).hexdigest();C=A['ResourceProperties']
		if A[G]=='Create':
			A[B]=J;A[B]=create_cert(C,F);add_tags(A[B],C);validate(A[B],C)
			if wait_for_issuance(A[B],D):A[E]=H;return send(A)
			else:return reinvoke(A,D)
		elif A[G]=='Delete':
			if A[B]!=J:acm.delete_certificate(CertificateArn=A[B])
			A[E]=H;return send(A)
		elif A[G]=='Update':
			if replace_cert(A):
				A[B]=create_cert(C,F);add_tags(A[B],C);validate(A[B],C)
				if not wait_for_issuance(A[B],D):return reinvoke(A,D)
			else:
				if K in A[L]:acm.remove_tags_from_certificate(CertificateArn=A[B],Tags=A[L][K])
				add_tags(A[B],C)
			A[E]=H;return send(A)
		else:raise RuntimeError('Unknown RequestType')
	except Exception as I:l.exception('');A[E]='FAILED';A['Reason']=str(I);return send(A)

Why?

AWS Cloudformation templates may have AWS lambda function source code embedded in them, but only if the function is less than 4KiB. I wrote this package so I could write python normally and still embed the module in a template.

Installation

To install python-minifier use pip:

$ pip install python-minifier

Note that python-minifier depends on the python interpreter for parsing source code, and outputs source code compatible with the version of the interpreter it is run with.

This means that if you minify code written for Python 3.11 using python-minifier running with Python 3.12, the minified code may only run with Python 3.12.

python-minifier runs with and can minify code written for Python 2.7 and Python 3.3 to 3.14.

Usage

To minify a source file, and write the minified module to stdout:

$ pyminify hello.py

There is also an API. The same example would look like:

import python_minifier

with open('hello.py') as f:
    print(python_minifier.minify(f.read()))

Documentation is available at dflook.github.io/python-minifier/

License

Available under the MIT License. Full text is in the LICENSE file.

Copyright (c) 2024 Daniel Flook

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

python_minifier-3.2.0.tar.gz (85.5 kB view details)

Uploaded Source

Built Distributions

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

python_minifier-3.2.0-py3-none-any.whl (62.3 kB view details)

Uploaded Python 3

python_minifier-3.2.0-py2-none-any.whl (62.6 kB view details)

Uploaded Python 2

File details

Details for the file python_minifier-3.2.0.tar.gz.

File metadata

  • Download URL: python_minifier-3.2.0.tar.gz
  • Upload date:
  • Size: 85.5 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for python_minifier-3.2.0.tar.gz
Algorithm Hash digest
SHA256 d39d4aa9655206870b89b41099a84725e1845319aa5a8bea6a1046b5644cd413
MD5 6a5a7444f8f4987ffc0273bcba810020
BLAKE2b-256 ff65984ccfc140c6a9364331fe8cbeccc4138bd4083b165c7685998c07586f84

See more details on using hashes here.

Provenance

The following attestation bundles were made for python_minifier-3.2.0.tar.gz:

Publisher: release.yaml on dflook/python-minifier

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file python_minifier-3.2.0-py3-none-any.whl.

File metadata

File hashes

Hashes for python_minifier-3.2.0-py3-none-any.whl
Algorithm Hash digest
SHA256 b8486b1dc15980d1d833f72a8a8696616a611f1a10fb72aaf96e2de891beb4c2
MD5 cafea705ee6585b8b87d3e3f0e424aae
BLAKE2b-256 6905c26bcd42c9134b4d3919ddbabf8de323004e89355c1b0ce87d1be65fdd1d

See more details on using hashes here.

Provenance

The following attestation bundles were made for python_minifier-3.2.0-py3-none-any.whl:

Publisher: release.yaml on dflook/python-minifier

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file python_minifier-3.2.0-py2-none-any.whl.

File metadata

File hashes

Hashes for python_minifier-3.2.0-py2-none-any.whl
Algorithm Hash digest
SHA256 fb83102387787f9d4d53d58690eeca8dd2bcf197a8d329cae172f669a848883f
MD5 7a405844372883253ab305bc109665a2
BLAKE2b-256 3e05821d234cbe039f27e74400d24d2c402833b29a5942cd3d342bb2a5b88b58

See more details on using hashes here.

Provenance

The following attestation bundles were made for python_minifier-3.2.0-py2-none-any.whl:

Publisher: release.yaml on dflook/python-minifier

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

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