# unasync

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

## Installation

    pip install unasync

## Usage

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

    setuptools.setup(
        ...
        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.

    [build-system]
    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

    setuptools.setup(
        ...
        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

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

- Release history
  - unasync 0.6.0 (2024-05-03)

# Indices and tables

- Index

- Module Index

- Search Page

- glossary