The unasync project’s goal is to produce a permissively licensed, tool that gives you the ability to transform your asynchronous code into synchronous code.

Why are we doing it ?

You can find the whole discussion here.

In short the TLDR; version is, Unasync gives you the ability to transform your asynchronous code placed in _async directory into into synchronous code and put it in directory named _sync i.e

async def f():
   return await 1

will be transformed and placed in directory _sync

def f():
   return 1


pip install unasync


To use the unasync project you need to install the package and then create a _async folder where you will place the asynchronous code that you want to transform into synchronous code.

And then in your setup.py place the following code.

import unasync

    cmdclass={'build_py': unasync.cmdclass_build_py()},

Then create a file pyproject.toml in the root of your project and mention unasync as one of your build dependency.

requires = ["setuptools>=40.6.2", "wheel", "unasync"]
build-backend = "setuptools.build_meta"

And when you will build your package you will get your synchronous code in _sync folder.

If you’d like to customize where certain rules are applied you can pass customized unasync.Rule instances to unasync.cmdclass_build_py()

import unasync

    cmdclass={'build_py': unasync.cmdclass_build_py(rules=[
        # This rule transforms files within 'ahip' -> 'hip'
        # instead of the default '_async' -> '_sync'.
        unasync.Rule("/ahip/", "/hip/"),

        # This rule's 'fromdir' is more specific so will take precedent
        # over the above rule if the path is within /ahip/tests/...
        # This rule adds an additional token replacement over the default replacements.
        unasync.Rule("/ahip/tests/", "/hip/tests/", additional_replacements={"ahip": "hip"}),

Usage outside of setuptools

You can also use unasync without setuptools, to run unasync on tests, for example.

import unasync

    [file1, file2, ...],
        unasync.Rule("tests/", "tests_sync/", additional_replacements={"ahip": "hip"}),