* git rm unnecessary .gitkeep file * After all Pytest runs, show short test summary * abi-gen/Py: facilitate inlining of parameter lists Effectively, stopped new-lines from being introduced by calls to the `params` and `typed_params` partials. * abi-gen: simple Py wrapper test for local dev'ment * abi-gen/Py: stop gen'ing ValidatorBase * abi-gen/Py: declare abi() wrapper method in Base * abi-gen/Py: methods as classes to ease call/sendTx Represent methods as classes in order to faciliate access to a method's different operations (call, send_transaction, etc). * contract_wrappers.py: make Base methods public Changed some methods on BaseContractWrapper to be public. * contract_wrappers.py: remove unused method * contract_wrappers.py: extract method * abi-gen/Py: inline method * contract_wrappers.py: fix bug in call() We were passing transaction parameters through to sendTransaction() invocations, but not to call() invocations. * abi-gen/Py: remove `view_only` param to call/tx Formerly, in the BaseContractWrapper, there was just one function used for both eth_call and eth_sendTransaction, and you would distinguish between the two by specifying `view_only=True` when you wanted a call. This commit defines a method dedicated to executing an eth_call, and leaves the old method behind, with the `view_only` param removed, to be used for eth_sendTransaction. * abi-gen/Py: rename method * contract_wrappers/Py: simplify web3 func handling Pass web3 function instance into generated wrapper method class constructor, rather than having that class obtain it upon each method call. Really this is just an elimination of a call to BaseContractWrapper.contract_instance(), which will be removed completely in a shortly-upcoming commit. * contract_wrappers.py: inline method Inline and remove method BaseContractWrapper.contract_instance(). * contract_wrappers.py: pass Validator to *Method Pass a ValidatorBase instance into construction of the contract method classes, *Method, to eliminate another dependency on the containing contract object, which will be eliminated completely in a shortly-upcoming commit. * abi-gen/Py: BaseContractWrapper -> ContractMethod Change the fundamental thing-to-be-wrapped from the contract to the method. Since the named method classes were introduced (in a previous commit), and since the operations contained within the Base are predominantly focused on supporting method calls more than anything else, it makes more intuitive sense to provide a base for the methods than for the contract. With this change, the method classes no longer require a contract object to be passed to their constructors. The contract members that the methods were utilizing are now passed directly to the method constructor. * contract_wrappers.py: rename module to bases... ...from _base_contract_wrapper. The old name hasn't made sense since ValidatorBase was moved into that module, and definitely doesn't make sense now that the fundamental thing-to-be-wrapped has changed from the contract to the method. Also renamed to make it public (removed the leading underscore) since we're generating code that will depend on it. * abi-gen/Py: clarify call/sendTx docstrings * abi-gen/Py: adjust whitespace * contract_wrappers.py: inline method * abi-gen/Py: rename class ValidatorBase... ...to just Validator. It's in the "bases" module, which provides the context needed in order to know it's a base class * python-packages: fix silent failures of ./parallel * contract_wrappers.py: remove private_key support Having this present was overcomplicating interfaces. And it was untested (and not readily working when testing was attempted). And it only provided a thin layer of convenience, which a client could easily code up themselves. * contract_wrappers.py: inline method * contract_wrappers.py: rm unused member variables * contract_wrappers.py: rm unnecessary instance var * abi-gen/Py: add estimate_gas to gen'd methods * update CHANGELOG.json
201 lines
5.9 KiB
Python
Executable File
201 lines
5.9 KiB
Python
Executable File
#!/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", "-rapP"]))
|
|
# show short test summary at end ^
|
|
|
|
|
|
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-backend 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 0x-launch-kit-backend 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"),
|
|
"warning_is_error": ("setup.py", "true"),
|
|
}
|
|
},
|
|
)
|