#!/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"), } }, )