Metadata-Version: 2.1
Name: tackle-box
Version: 0.2.0a3
Summary: Tackle box is a declarative DSL for building modular workflows and code generators. Tool is plugins based and can easily be extended by writing additional hooks or importing external providers creating a web of interoperable CLIs.
Home-page: https://github.com/robcxyz/tackle-box
Author: Rob Cannon
Author-email: robc.io.opensource@gmail.com
License: BSD
Keywords: cookiecutter,tackle,tackle-box,tacklebox,tackle box,Python,projects,project templates,Jinja2,skeleton,scaffolding,project directory,package,packaging,kubernetes
Platform: UNKNOWN
Classifier: Development Status :: 5 - Production/Stable
Classifier: Environment :: Console
Classifier: Intended Audience :: Developers
Classifier: Natural Language :: English
Classifier: License :: OSI Approved :: BSD License
Classifier: Programming Language :: Python :: 3 :: Only
Classifier: Programming Language :: Python :: 3
Classifier: Programming Language :: Python :: 3.6
Classifier: Programming Language :: Python :: 3.7
Classifier: Programming Language :: Python :: 3.8
Classifier: Programming Language :: Python :: 3.9
Classifier: Programming Language :: Python :: 3.10
Classifier: Programming Language :: Python :: Implementation :: CPython
Classifier: Programming Language :: Python :: Implementation :: PyPy
Classifier: Programming Language :: Python
Classifier: Topic :: Software Development
Requires-Python: >=3.6
Description-Content-Type: text/markdown
Requires-Dist: Jinja2 (<3.0.0)
Requires-Dist: pydantic (>=1.6.0)
Requires-Dist: PyInquirer (>=1.0.3)
Requires-Dist: PyYAML (>=5.3)
Provides-Extra: all
Requires-Dist: requests ; extra == 'all'
Requires-Dist: ptyprocess ; extra == 'all'
Requires-Dist: flake8 ; extra == 'all'
Requires-Dist: toml (>=0.10.0) ; extra == 'all'
Requires-Dist: tox ; extra == 'all'
Requires-Dist: rich ; extra == 'all'
Requires-Dist: pytest-asyncio ; extra == 'all'
Requires-Dist: pytest-cov ; extra == 'all'
Requires-Dist: GitPython ; extra == 'all'
Requires-Dist: pytest-mock ; extra == 'all'
Requires-Dist: freezegun ; extra == 'all'
Requires-Dist: pytest ; extra == 'all'
Provides-Extra: dev
Requires-Dist: requests ; extra == 'dev'
Requires-Dist: ptyprocess ; extra == 'dev'
Requires-Dist: flake8 ; extra == 'dev'
Requires-Dist: tox ; extra == 'dev'
Requires-Dist: pytest-asyncio ; extra == 'dev'
Requires-Dist: pytest-cov ; extra == 'dev'
Requires-Dist: pytest-mock ; extra == 'dev'
Requires-Dist: freezegun ; extra == 'dev'
Requires-Dist: pytest ; extra == 'dev'
Provides-Extra: git
Requires-Dist: GitPython ; extra == 'git'
Provides-Extra: requests
Requires-Dist: requests ; extra == 'requests'
Provides-Extra: rich
Requires-Dist: rich ; extra == 'rich'
Provides-Extra: toml
Requires-Dist: toml (>=0.10.0) ; extra == 'toml'

# Tackle Box

[![pypi](https://img.shields.io/pypi/v/tackle-box.svg)](https://pypi.python.org/pypi/tackle-box)
[![python](https://img.shields.io/pypi/pyversions/tackle-box.svg)](https://pypi.python.org/pypi/tackle-box)
[![codecov](https://codecov.io/gh/robcxyz/tackle-box/branch/main/graphs/badge.svg?branch=main)](https://codecov.io/github/robcxyz/tackle-box?branch=main)
[![main-tests](https://github.com/robcxyz/tackle-box/actions/workflows/main.yml/badge.svg)](https://github.com/robcxyz/tackle-box/actions)

* Tackle Box Documentation: [https://robcxyz.github.io/tackle-box](https://robcxyz.github.io/tackle-box)-> WIP
* GitHub: [https://github.com/robcxyz/tackle-box](https://github.com/robcxyz/tackle-box)
* PyPI: [https://pypi.org/project/tackle-box/](https://pypi.org/project/tackle-box/)
* Free and open source software: [BSD license](LICENSE)

Tackle box is a declarative DSL for building modular workflows and code generators. Tool is plugins based and can easily be extended by writing additional hooks or importing external providers creating a web of interoperable CLIs.

> WARNING - Project still alpha. Will be officially released shortly.

### Demo

```
pip3 install tackle-box

# General tour of tackle box
tackle robcxyz/tackle-demos

# Create a new provider in one minute
tackle robcxyz/tackle-provider

# Push to github and now you can call it
tackle <your GH username>/tackle-your-provider
# Or alternatively import/call it from another tackle file
```

[comment]: <> (### Use Cases)

[comment]: <> (Tackle box has a wide variety of use cases. Here are a few for inspiration.)

[comment]: <> (- [Code generation]&#40;&#41; - WIP)

[comment]: <> (- [Custom workflows]&#40;&#41; - WIP)

[comment]: <> (- [Keeping configuration files dry]&#40;&#41; - WIP)

[comment]: <> (- [Kubernetes]&#40;&#41; - WIP)

### Features

- Declarative: Everything is in yaml with easy to use interfaces
- Turing complete: Loops, conditionals and branching is supported
- Extensible: New providers can be created or imported remotely
- Lean: Tackle box has only 4 dependencies - core logic <1k LOC

### Basic Usage / Structure

Tackle-box can be called against any yaml/json file or remote location by specifying the path to a repo / directory. By default, tackle looks for a `tackle.yaml` file in the target location which is parsed sequentially with each key traversed looking for hook calls indicated by an arrow (`->`). Tackle box ships with ~70 hooks to do basic prompting / code generation / system operations but can easily be extended by writing additional hooks.

For instance given the following directory structure:

```
├── hooks
│ └── stuff.py
└── tackle.yaml
```

With `stuff.py` looking like:

```python
class Stuff(BaseHook):
    type: str = "do-stuff"
    things: str
    _args: list = ['things']

    def execute(self):
        print(self.things)
        return self.things
```

One could run a tackle file that looks like this:

```yaml
a-key->: do-stuff do-things
b-key:
  if: a-key == 'do-things'
  ->: do-stuff
  things: All the things
```

Which when run would print out "All the things" twice and result in the following context:

```yaml
compact: All the things
expanded: All the things
```

Which you can use to then generate code, print out to file, or do any number of custom actions with additional hook calls.

### Road Map

The main challenge with this project is going to be reaching a stable syntax that people can reliably build on. Until that happens any feedback is welcome that could help make any of the interfaces, both in the core parsing logic / hook interfaces, is welcome. A place outside of github issues will be made to better accommodate those conversations.

### Code of Conduct

Everyone interacting in the Cookiecutter project's codebases, issue trackers,
chat rooms, and mailing lists is expected to follow the
[PyPA Code of Conduct](https://www.pypa.io/en/latest/code-of-conduct/).

## Credit

Special thanks to the [cookiecutter](https://github.com/cookiecutter/cookiecutter) community for creating the inspiration for this project.



