Metadata-Version: 2.1
Name: setuptools-cmd-deps
Version: 1.0.0
Summary: setuptools plugin to configure the dependency among commands
Home-page: https://github.com/jameslan/setuptools-cmd-deps
Author: James Lan
Author-email: jameslan@gmail.com
License: Apache License 2.0
Platform: UNKNOWN
Classifier: Programming Language :: Python :: 3
Classifier: Programming Language :: Python :: 3.5
Classifier: Programming Language :: Python :: 3.6
Classifier: Programming Language :: Python :: 3.7
Classifier: Programming Language :: Python :: 3.8
Classifier: Intended Audience :: Developers
Classifier: License :: OSI Approved :: Apache Software License
Requires-Python: >=3.5
Description-Content-Type: text/markdown

# setuptools-cmd-deps

Configure `setuptools` command dependencies easily.

Once a custom `setuptools` command is defined and needs to be run before some build-in command,
the solution is to override the build-in command to ensure the new custom command is called.

For example, if a custom command `genreate_py` is implemented in class `GeneratePy`
and needs to be run before `build_py`,
You need to create you own command class `MyBuildPy` and call both `generate_py` and build-in `build_py`.
Then override `build_py` command in the invocation of `setuptools.setup` as follows,

```python
class GeneratePy(setuptools.Command):
    ...


class MyBuildPy(setuptools.command.build_py.build_py):
    ...


setuptools.setup(
    cmdclass={
        'generate_py': GenereatePy,
        'build_py': MyBuildPy,
    },
)
```

The implementation of `MyBuildPy` could be eliminated by using `setuptools-cmd-deps`.

## Command dependency in the project

If the command is just for the project and it won't be shared,
you could use new setup keyword `cmd_deps` to define the dependencies.

### Enable setuptools-cmd-deps

- If your `setup.py` will run only after all depending packages are installed,
add `setuptools-cmd-deps` in your dependency list,
such as `requirements.txt`, or `Pipfile`.

- If your `setup.py` supports running out of venv,
you may not want these packages to be installed in the system.
Then add `setuptools-cmd-deps` in the `setup_requires` option of your `setuptools`.

### Define dependency

```python
setuptools.setup(
    cmdclass={'generate_py': GenereatePy},
    cmd_deps={'build_py': ['generate_py']},
)
```

## Command dependency to be shared

If you want command definition to be used by other project and run before some command,
specify the dependency in the `setuptools.cmd_deps` section in your `entry_points`.

### Enable setuptools-cmd-deps for the target

Add `setuptools-cmd-deps` in the `install_requires` option of your `setuptools`,
so that any project uses your package, will automatically uses `setuptools-cmd-deps`.

### Define dependency

Generally speaking, you already have `distutils.commands` in your `entry_points`.

For example, you defined `gernate_py` command as follows,

```
distutils.commands =
    generate_py = command:GeneratePy
```

and want it always run before `build_py`, then add `setuptools.cmd_deps` as follows,

```
setuptools.cmd_deps =
    build_py_dep = build_py:generate_py
```

Note that the name `build_py_dep` is not used here.
It is just for the syntax.
For the same reason, if there are multiple dependencies for one command,
it should use dot `.` as delimiter,

```
setuptools.cmd_deps =
    command_dep = command:cmd1.cmd2
```

or you can have multiple rules,

```
setuptools.cmd_deps =
    command_dep1 = command:cmd1
    command_dep2 = command:cmd2
```


