aboutsummaryrefslogblamecommitdiffstats
path: root/python-packages/contract_demo/setup.py
blob: a7afbd30c812faaffa1ad5a91550a15d135e21c0 (plain) (tree)

















































































































































                                                                               
#!/usr/bin/env python

"""setuptools module for 0x-contract-demo package."""

import distutils.command.build_py
from distutils.command.clean import clean
import subprocess  # nosec
from shutil import rmtree
from os import environ, path
from sys import argv

from setuptools import setup
from setuptools.command.test import test as TestCommand


class TestCommandExtension(TestCommand):
    """Run pytest tests."""

    def run_tests(self):
        """Invoke pytest."""
        import pytest

        exit(pytest.main())


class LintCommand(distutils.command.build_py.build_py):
    """Custom setuptools command class for running linters."""

    description = "Run linters"

    def run(self):
        """Run linter shell commands."""
        lint_commands = [
            # formatter:
            "black --line-length 79 --check --diff test setup.py".split(),
            # style guide checker (formerly pep8):
            "pycodestyle test setup.py".split(),
            # docstring style checker:
            "pydocstyle test setup.py".split(),
            # static type checker:
            "mypy test setup.py".split(),
            # security issue checker:
            "bandit -r ./setup.py".split(),
            # general linter:
            "pylint test setup.py".split(),
            # pylint takes relatively long to run, so it runs last, to enable
            # fast failures.
        ]

        # tell mypy where to find interface stubs for 3rd party libs
        environ["MYPYPATH"] = path.join(
            path.dirname(path.realpath(argv[0])), "stubs"
        )

        for lint_command in lint_commands:
            print(
                "Running lint command `", " ".join(lint_command).strip(), "`"
            )
            subprocess.check_call(lint_command)  # nosec


class CleanCommandExtension(clean):
    """Custom command to do custom cleanup."""

    def run(self):
        """Run the regular clean, followed by our custom commands."""
        super().run()
        rmtree(".mypy_cache", ignore_errors=True)
        rmtree(".tox", ignore_errors=True)
        rmtree(".pytest_cache", ignore_errors=True)


class GanacheCommand(distutils.command.build_py.build_py):
    """Custom command to publish to pypi.org."""

    description = "Run ganache daemon to support tests."

    def run(self):
        """Run ganache."""
        cmd_line = "docker run -d -p 8545:8545 0xorg/ganache-cli:2.2.2".split()
        subprocess.call(cmd_line)  # nosec


class PublishDocsCommand(distutils.command.build_py.build_py):
    """Custom command to publish docs to S3."""

    description = (
        "Publish docs to "
        + "http://0x-contract-addresses-py.s3-website-us-east-1.amazonaws.com/"
    )

    def run(self):
        """Run npm package `discharge` to build & upload docs."""
        subprocess.check_call("discharge deploy".split())  # nosec


setup(
    name="0x-contract-demo",
    version="1.0.0",
    description="Demonstration of calling 0x contracts",
    url=(
        "https://github.com/0xProject/0x-monorepo/tree/development"
        + "/python-packages/contract_demo"
    ),
    author="F. Eugene Aumson",
    author_email="feuGeneA@users.noreply.github.com",
    cmdclass={
        "clean": CleanCommandExtension,
        "lint": LintCommand,
        "test": TestCommandExtension,
        "ganache": GanacheCommand,
        "publish_docs": PublishDocsCommand,
    },
    install_requires=[
        "0x-contract-addresses",
        "0x-contract-artifacts",
        "0x-order-utils",
        "0x-web3",  # TEMPORARY! pending resolution of our web3.py PR#1147
        "mypy_extensions",
    ],
    extras_require={
        "dev": [
            "bandit",
            "black",
            "coverage",
            "coveralls",
            "mypy",
            "mypy_extensions",
            "pycodestyle",
            "pydocstyle",
            "pylint",
            "pytest",
            "sphinx",
            "tox",
        ]
    },
    python_requires=">=3.6, <4",
    license="Apache 2.0",
    zip_safe=False,  # required per mypy
    command_options={
        "build_sphinx": {
            "source_dir": ("setup.py", "test"),
            "build_dir": ("setup.py", "build/docs"),
        }
    },
)