# -*- coding: utf-8 -*-
from setuptools import setup

packages = \
['gadk']

package_data = \
{'': ['*']}

install_requires = \
['click>=7.1.1,<8.0.0', 'colorama>=0.4.3,<0.5.0', 'pyyaml>=5.3,<6.0']

entry_points = \
{'console_scripts': ['gadk = gadk.cli:cmd']}

setup_kwargs = {
    'name': 'gadk',
    'version': '0.2.0',
    'description': 'Unofficial Github Actions Development Kit',
    'long_description': '# GADK: codify Github Actions Workflows\n\n[![PyPI version](https://badge.fury.io/py/gadk.svg)](https://badge.fury.io/py/gadk)\n\nThe extremely unofficial Github Actions Development Kit.\n\nGADK can be used to:\n\n* Define Github Actions Workflows as Python code and sync them to `.github/workflows/`.\n* Share common Workflow patterns such as build-test-deploy.\n* Abstract features like Artifacts.\n\n`gadk` mirrors the options supported by Github Actions Workflows so that you can generate\nworkflows from Python code. The classes exported from the `gadk` module\nshould be sufficient to replicate existing workflows, with the additional advantage of\nusing Python\'s mechanisms of abstraction.\n\n## Installation\n\nGADK can be installed using `pip`.\n\n```shell script\npip install gadk\n```\n\n## Instructions\n\n### Setup\n\n1. Create a file called `actions.py` in the root directory of your project.\n1. Enter the following simple workflow with import:\n    ```python\n    from gadk import *\n\n\n    class MyWorkflow(Workflow):\n        def __init__(self) -> None:\n            super().__init__("my_workflow", "my workflow")\n\n            self.on(pull_request=On(paths=["src/**"]), push=On(branches=["master"]))\n            self.jobs["test"] = Job(\n                steps=[\n                    RunStep("make test"),\n                ],\n            )\n    ```\n1. Run `gadk`.\n1. You should now have a file called `.github/workflows/my_workflow.yml` with the contents\nof your workflow.\n\n### Creating workflows\n\nCreating workflows starts with the `Workflow` class.\n\nThe `Workflow` class is the top-level element to represent a Github Action Workflow. You would\ncreate a new class that extends `Workflow` when you are creating a new GADK project, or want to\ntest/deploy a new service or subproject. In the constructor of this new class you would specify\nwhen the workflow is triggered, its jobs, the required environment variables, etc.\n\nWhen initialising the `Workflow` class, you are required to specify a short name that is also\nused as the filename in `.github/workflows/`. Additionally you may add a human-readable name.\n\n#### When to run the workflow\n\nThe `on` method of your workflow instance can be used to specify when to run the workflow.\nCurrently `gadk` supports triggering a workflow on a pull request or a push/merge. Each\nevent can be limited to changes to files or directories, and when pushing to a branch.\nSee the `On` class for both options.\n\n```python\nfrom gadk import *\n\n\nclass MyWorkflow(Workflow):\n    def __init__(self) -> None:\n        super().__init__("my_workflow", "my workflow")\n\n        # Run when:\n        #   * for pull requests, a file under `src/` changes,\n        #   * for merge/push to master.\n        self.on(pull_request=On(paths=["src/**"]), push=On(branches=["master"]))\n```\n\nNote that it\'s mandatory to specify the `on` section of a workflow. This is not currently\nbeing validated by `gadk.`\n\n#### Adding jobs\n\nThe `self.jobs` property of your workflow instance can be used to add jobs to your workflow.\nEach job must be an instance of `Job` or a subclass thereof.\n\nA job has several options to specify:\n\n* When to run the job: `Job(condition="..."")` specifies the condition on which to run the\njob. For instance, `"github.ref == \'refs/heads/master\'"` would only run the job when the\ncurrent branch is master. By default this condition is empty to always run the job.\n* Which container to run the job on: `Job(runs_on="...")` specifies the name of the container.\nBy default this is `ubuntu-18.04`.\n* Which steps to run: `Job(steps=[...])` specifies the steps to execute for this job.\nEach step must be a `RunStep` or `UsesStep` instance or subclass thereof. By default `gadk`\nadds a checkout v2 step and prepends it to the list of steps. This is a useful\ndefault for most jobs but can be disabled by specifying `Job(default_checkout=False)`.\n* Which environment variables to expose to the steps of the job: `Job(env={...})` specifies\nadditional environment variables. By default no environment variables are specified.\n* Which jobs need to run before this job: `Job(needs=[...])` specifies the names of the jobs\nthat should run before this job. Leaving this list empty or unspecified means the job will\nalways run, which is also the default.\n\n```python\nfrom gadk import *\n\n\nclass MyWorkflow(Workflow):\n    def __init__(self) -> None:\n        super().__init__("my_workflow", "my workflow")\n\n        # Specify 2 jobs to be run, one after the other..\n        self.jobs["test"] = Job(\n            steps=[RunStep("pytest"), RunStep("mypy")],  # Run 2 shell commands, one after the other.\n            # condition=""  # No condition specified to run always.\n            # runs_on="ubuntu-18.04"  # Run on the default container as specified by gadk.\n            env={"PYTHONPATH": "."},  # Add 1 additional environment variable.\n            # needs=None  # No other jobs need to be executed before this job.\n            # default_checkout=True   # Prepend an additional step to checkout the repository.\n        )\n        self.jobs["build"] = Job(\n            needs=["test"],  # The "test" job specified above must have finished running before this job can start.\n            steps=[RunStep("tar ...")], # Run a single fictional command (excluding the default checkout command).\n        )\n```\n\n#### Artifacts\n\nArtifacts are files or directories created as a result of a job. They are typically used to share resources\nbetween jobs, for instance when building code for deployment and verifying the code artifact before deployment,\nand finally deploying said artifact. They can also be used for debugging, as Github Actions expose the artifacts\ncreated by a workflow.\n\nThe default implementation of artifacts uses the `actions/upload-artifact@v1` action to upload an artifact\nin one job and then use the `actions/download-artifact@v1` action to download the artifact in a downstream\njob.\n\n`gadk` provides a simple abstraction of artifacts called `Artifact`. To use it you create an artifact\noutside of your jobs, then add `artifact.as_upload()` to the steps of the job creating the artifact,\nand finally add `artifact.as_download()` to the steps of the job(s) requiring the artifact.\n\n```python\nfrom gadk import *\n\n\nclass MyWorkflow(Workflow):\n    def __init__(self) -> None:\n        super().__init__("my_workflow", "my workflow")\n\n        # Create a code archive as an artifact.\n        code = Artifact(name="code-archive", path="build/code.zip")\n\n        # Specify 2 jobs to be run in parallel.\n        self.jobs["build"] = Job(\n            steps=[\n                # Build code archive somehow:\n                RunStep("build_code_archive"),\n                # Send off the archive for others to use.\n                code.as_upload(),\n            ]\n        )\n        self.jobs["verify"] = Job(\n            needs=["build"],  # Needed to ensure the artifact is ready.\n            steps=[\n                # Get the artifact.\n                code.as_download(),\n                # Use somehow...\n            ],\n        )\n```\n\n## Roadmap\n\n* Feature completeness: the first version of `gadk` was created to scratch a limited itch.\nThe next step is to represent all possible workflows.\n* Validation: the configuration is not validated but elements like `workflow.on` are required.\nIn the future this could be validated using a Yaml schema validator and runtime checks, e.g. specifying\na non-existent job in `job.needs`.\n',
    'author': 'Maarten Jacobs',
    'author_email': 'maarten.j.jacobs@gmail.com',
    'maintainer': None,
    'maintainer_email': None,
    'url': 'https://github.com/maartenJacobs/gadk',
    'packages': packages,
    'package_data': package_data,
    'install_requires': install_requires,
    'entry_points': entry_points,
    'python_requires': '>=3.6,<4',
}


setup(**setup_kwargs)
