text: #!/usr/bin/env python
  # coding: utf-8
  
  """setuptools module for sra_client package."""
  
  import subprocess  # nosec
  import distutils.command.build_py
  from urllib.request import urlopen
  from urllib.error import URLError
  
  from setuptools import setup, find_packages  # noqa: H301
  from setuptools.command.test import test as TestCommand
  
  NAME = "0x-sra-client"
  VERSION = "2.0.0"
  # To install the library, run the following
  #
  # python setup.py install
  #
  # prerequisite: setuptools
  # http://pypi.python.org/pypi/setuptools
  
  with open("README.md", "r") as file_handle:
      README_MD = file_handle.read()
  
  REQUIRES = ["urllib3 >= 1.15", "six >= 1.10", "certifi", "python-dateutil"]
  
  
  class TestCommandExtension(TestCommand):
      """Run pytest tests."""
  
      def run_tests(self):
          """Invoke pytest."""
          import pytest
  
          exit(pytest.main(["--doctest-modules"]))
  
  
  class TestPublishCommand(distutils.command.build_py.build_py):
      """Custom command to publish to test.pypi.org."""
  
      description = (
          "Publish dist/* to test.pypi.org. Run sdist & bdist_wheel first."
      )
  
      def run(self):
          """Run twine to upload to test.pypi.org."""
          subprocess.check_call(  # nosec
              (
                  "twine upload --repository-url https://test.pypi.org/legacy/"
                  + " --verbose dist/*"
              ).split()
          )
  
  
  class StartTestRelayerCommand(distutils.command.build_py.build_py):
      """Custom command to boot up a local 0x-launch-kit in docker."""
  
      description = "Run launch-kit daemon to support tests."
  
      def run(self):
          """Run `docker-compose up`."""
          subprocess.call(  # nosec
              ("docker-compose -f test/relayer/docker-compose.yml up -d").split()
          )
          launch_kit_ready = False
          print("Waiting for relayer to start accepting connections...", end="")
          while not launch_kit_ready:
              try:
                  launch_kit_ready = (
                      urlopen(  # nosec
                          "http://localhost:3000/v2/asset_pairs"
                      ).getcode()
                      == 200
                  )
              except URLError:
                  continue
          print("done")
  
  
  class StopTestRelayerCommand(distutils.command.build_py.build_py):
      """Custom command to tear down the local 0x-launch-kit test relayer."""
  
      description = "Tear down launch-kit daemon."
  
      def run(self):
          """Run `docker-compose down`."""
          subprocess.call(  # nosec
              ("docker-compose -f test/relayer/docker-compose.yml down").split()
          )
  
  
  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_targets = "test src/zero_ex/sra_client/__init__.py setup.py"
          lint_commands = [
              # formatter:
              (
                  f"black --line-length 79 --check --diff test {lint_targets}"
              ).split(),
              # style guide checker (formerly pep8):
              f"pycodestyle {lint_targets}".split(),
              # docstring style checker:
              f"pydocstyle {lint_targets}".split(),
              # static type checker:
              f"bandit -r {lint_targets}".split(),
              # general linter:
              f"pylint {lint_targets}".split(),
              # pylint takes relatively long to run, so it runs last, to enable
              # fast failures.
          ]
  
          for lint_command in lint_commands:
              print(
                  "Running lint command `", " ".join(lint_command).strip(), "`"
              )
              subprocess.check_call(lint_command)  # nosec
  
  
  class PublishCommand(distutils.command.build_py.build_py):
      """Custom command to publish to pypi.org."""
  
      description = "Publish dist/* to pypi.org. Run sdist & bdist_wheel first."
  
      def run(self):
          """Run twine to upload to pypi.org."""
          subprocess.check_call("twine upload dist/*".split())  # nosec
  
  
  class PublishDocsCommand(distutils.command.build_py.build_py):
      """Custom command to publish docs to S3."""
  
      description = (
          "Publish docs to "
          + "http://0x-sra-client-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=NAME,
      version=VERSION,
      description="Standard Relayer REST API Client",
      author_email="",
      url=(
          "https://github.com/0xproject/0x-monorepo/tree/development"
          "/python-packages/sra_client"
      ),
      keywords=["OpenAPI", "OpenAPI-Generator", "Standard Relayer REST API"],
      install_requires=REQUIRES,
      namespace_packages=["zero_ex"],
      packages=find_packages("src"),
      package_dir={"": "src"},
      include_package_data=True,
      long_description=README_MD,
      long_description_content_type="text/markdown",
      cmdclass={
          "test_publish": TestPublishCommand,
          "publish": PublishCommand,
          "start_test_relayer": StartTestRelayerCommand,
          "stop_test_relayer": StopTestRelayerCommand,
          "lint": LintCommand,
          "publish_docs": PublishDocsCommand,
          "test": TestCommandExtension,
      },
      extras_require={
          "dev": [
              "0x-contract-artifacts",
              "0x-contract-addresses",
              "0x-order-utils",
              "0x-web3",
              "bandit",
              "black",
              "coverage",
              "coveralls",
              "pycodestyle",
              "pydocstyle",
              "pylint",
              "pytest",
              "sphinx",
              "sphinx-autodoc-typehints",
          ]
      },
      command_options={
          "build_sphinx": {
              "source_dir": ("setup.py", "src"),
              "build_dir": ("setup.py", "build/docs"),
          }
      },
  )
  