From 92fd0a9d24378d01d87dfa6fd0ec5a42edfe8308 Mon Sep 17 00:00:00 2001 From: "F. Eugene Aumson" Date: Wed, 10 Oct 2018 12:14:20 -0400 Subject: feat: project stub for python order utilities An empty project, with respect to functionality, but one configured with a test framework, linters, CI integration, etc. https://app.asana.com/0/836857747873847/839549782781239/f --- python-packages/order_utils/setup.py | 127 +++++++++++++++++++++++++++++++++++ 1 file changed, 127 insertions(+) create mode 100644 python-packages/order_utils/setup.py (limited to 'python-packages/order_utils/setup.py') diff --git a/python-packages/order_utils/setup.py b/python-packages/order_utils/setup.py new file mode 100644 index 000000000..4d5d69de1 --- /dev/null +++ b/python-packages/order_utils/setup.py @@ -0,0 +1,127 @@ +"""setuptools module for order_utils package.""" + +import subprocess # nosec +from shutil import rmtree +from os import path, remove, walk + +from distutils.command.clean import clean # type: ignore +from setuptools import setup # type: ignore +import setuptools.command.build_py # type: ignore +from setuptools.command.test import test as TestCommand # type: ignore + + +class TestCommandExtension(TestCommand): + """Run pytest tests.""" + + def run_tests(self): + """Invoke pytest.""" + import pytest # type: ignore + + pytest.main() + + +# pylint: disable=too-many-ancestors +class LintCommand(setuptools.command.build_py.build_py): + """Custom setuptools command class for running linters.""" + + def run(self): + """Run linter shell commands.""" + lint_commands = [ + # formatter: + "black --line-length 79 --check --diff src test setup.py".split(), + # style guide checker (formerly pep8): + "pycodestyle src test setup.py".split(), + # docstring style checker: + "pydocstyle src test setup.py".split(), + # static type checker: + "mypy src setup.py".split(), + # security issue checker: + "bandit -r src ./setup.py".split(), + # general linter: + "pylint src test setup.py".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 CleanCommandExtension(clean): + """Custom command to do custom cleanup.""" + + def run(self): + """Run the regular clean, followed by our custom commands.""" + super().run() + rmtree("build", ignore_errors=True) + rmtree(".mypy_cache", ignore_errors=True) + rmtree(".tox", ignore_errors=True) + rmtree(".pytest_cache", ignore_errors=True) + rmtree("src/order_utils.egg-info", ignore_errors=True) + # delete all .pyc files + for root, _, files in walk("."): + for file in files: + if file[-4:] == ".pyc": + remove(path.join(root, file)) + + +setup( + name="order_utils", + version="1.0.0", + description="Order utilities for 0x applications", + author="F. Eugene Aumson", + cmdclass={ + "clean": CleanCommandExtension, + "lint": LintCommand, + "test": TestCommandExtension, + }, + include_package_data=True, + install_requires=["web3"], + extras_require={ + "dev": [ + "bandit", + "black", + "coverage", + "coveralls", + "mypy", + "pycodestyle", + "pydocstyle", + "pylint", + "pytest", + "sphinx", + "tox", + ] + }, + python_requires=">=3.6, <4", + package_data={"zero_ex.order_utils": ["py.typed"]}, + package_dir={"": "src"}, + license="Apache 2.0", + keywords=( + "ethereum cryptocurrency 0x decentralized blockchain dex exchange" + ), + packages=["zero_ex.order_utils"], + classifiers=[ + "Development Status :: 1 - Planning", + "Intended Audience :: Developers", + "Intended Audience :: Financial and Insurance Industry", + "License :: OSI Approved :: Apache Software License", + "Natural Language :: English", + "Operating System :: OS Independent", + "Programming Language :: Python", + "Programming Language :: Python :: 3 :: Only", + "Programming Language :: Python :: 3.6", + "Programming Language :: Python :: 3.7", + "Topic :: Office/Business :: Financial", + "Topic :: Software Development :: Libraries", + "Topic :: Utilities", + ], + zip_safe=False, + command_options={ + "build_sphinx": { + "source_dir": ("setup.py", "src"), + "build_dir": ("setup.py", "build/docs"), + } + }, +) -- cgit v1.2.3 From 55f9348d0add1cd3d314edf5ef2056ddf37c8c7b Mon Sep 17 00:00:00 2001 From: "F. Eugene Aumson" Date: Fri, 12 Oct 2018 16:00:45 -0400 Subject: fix: use python's extsplit, not manual splicing --- python-packages/order_utils/setup.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'python-packages/order_utils/setup.py') diff --git a/python-packages/order_utils/setup.py b/python-packages/order_utils/setup.py index 4d5d69de1..ba11fb349 100644 --- a/python-packages/order_utils/setup.py +++ b/python-packages/order_utils/setup.py @@ -63,7 +63,8 @@ class CleanCommandExtension(clean): # delete all .pyc files for root, _, files in walk("."): for file in files: - if file[-4:] == ".pyc": + (_, extension) = path.splitext(file) + if extension == '.pyc': remove(path.join(root, file)) -- cgit v1.2.3 From a424c2adfabbbd9313b4f5ddeeeaebd0811fd1cd Mon Sep 17 00:00:00 2001 From: "F. Eugene Aumson" Date: Fri, 12 Oct 2018 16:05:41 -0400 Subject: fix: linter --- python-packages/order_utils/setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'python-packages/order_utils/setup.py') diff --git a/python-packages/order_utils/setup.py b/python-packages/order_utils/setup.py index ba11fb349..a76d724aa 100644 --- a/python-packages/order_utils/setup.py +++ b/python-packages/order_utils/setup.py @@ -64,7 +64,7 @@ class CleanCommandExtension(clean): for root, _, files in walk("."): for file in files: (_, extension) = path.splitext(file) - if extension == '.pyc': + if extension == ".pyc": remove(path.join(root, file)) -- cgit v1.2.3 From 1f0c7f8fbeba90ac1f65c57ff58782051c751b3d Mon Sep 17 00:00:00 2001 From: "F. Eugene Aumson" Date: Tue, 23 Oct 2018 12:08:16 -0400 Subject: feat(order_utils.py): ERC20 asset data encoding and decoding In addition to the ERC20 codec, also: Stopped ignoring type errors on 3rd party imports, by including interface stubs for them; Removed the unimplemented signature-utils module, which was just a stand-in when the python project support was first put in place. https://github.com/0xProject/0x-monorepo/pull/1144 --- python-packages/order_utils/setup.py | 39 +++++++++++++++++++++++++++--------- 1 file changed, 29 insertions(+), 10 deletions(-) mode change 100644 => 100755 python-packages/order_utils/setup.py (limited to 'python-packages/order_utils/setup.py') diff --git a/python-packages/order_utils/setup.py b/python-packages/order_utils/setup.py old mode 100644 new mode 100755 index a76d724aa..1a094cfe1 --- a/python-packages/order_utils/setup.py +++ b/python-packages/order_utils/setup.py @@ -1,13 +1,16 @@ +#!/usr/bin/env python + """setuptools module for order_utils package.""" import subprocess # nosec from shutil import rmtree -from os import path, remove, walk +from os import environ, path, remove, walk +from sys import argv -from distutils.command.clean import clean # type: ignore -from setuptools import setup # type: ignore -import setuptools.command.build_py # type: ignore -from setuptools.command.test import test as TestCommand # type: ignore +from distutils.command.clean import clean +import distutils.command.build_py +from setuptools import setup +from setuptools.command.test import test as TestCommand class TestCommandExtension(TestCommand): @@ -15,13 +18,13 @@ class TestCommandExtension(TestCommand): def run_tests(self): """Invoke pytest.""" - import pytest # type: ignore + import pytest pytest.main() # pylint: disable=too-many-ancestors -class LintCommand(setuptools.command.build_py.build_py): +class LintCommand(distutils.command.build_py.build_py): """Custom setuptools command class for running linters.""" def run(self): @@ -34,7 +37,7 @@ class LintCommand(setuptools.command.build_py.build_py): # docstring style checker: "pydocstyle src test setup.py".split(), # static type checker: - "mypy src setup.py".split(), + "mypy src test setup.py".split(), # security issue checker: "bandit -r src ./setup.py".split(), # general linter: @@ -42,6 +45,21 @@ class LintCommand(setuptools.command.build_py.build_py): # 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" + ) + + # HACK(gene): until eth_abi releases + # https://github.com/ethereum/eth-abi/pull/107 , we need to simply + # create an empty file `py.typed` in the eth_abi package directory. + import eth_abi + + eth_abi_dir = path.dirname(path.realpath(eth_abi.__file__)) + with open(path.join(eth_abi_dir, "py.typed"), "a"): + pass + for lint_command in lint_commands: print( "Running lint command `", " ".join(lint_command).strip(), "`" @@ -79,7 +97,7 @@ setup( "test": TestCommandExtension, }, include_package_data=True, - install_requires=["web3"], + install_requires=["eth-abi", "web3"], extras_require={ "dev": [ "bandit", @@ -87,6 +105,7 @@ setup( "coverage", "coveralls", "mypy", + "mypy_extensions", "pycodestyle", "pydocstyle", "pylint", @@ -118,7 +137,7 @@ setup( "Topic :: Software Development :: Libraries", "Topic :: Utilities", ], - zip_safe=False, + zip_safe=False, # required per mypy command_options={ "build_sphinx": { "source_dir": ("setup.py", "src"), -- cgit v1.2.3 From 0f6307169604f36b0316f236eb96d6001b788f50 Mon Sep 17 00:00:00 2001 From: "F. Eugene Aumson" Date: Fri, 26 Oct 2018 14:27:57 -0400 Subject: fix(order_utils.py): tweaks for first publish (#1185) --- python-packages/order_utils/setup.py | 66 +++++++++++++++++++++++++++++------- 1 file changed, 53 insertions(+), 13 deletions(-) (limited to 'python-packages/order_utils/setup.py') diff --git a/python-packages/order_utils/setup.py b/python-packages/order_utils/setup.py index 1a094cfe1..159499ec4 100755 --- a/python-packages/order_utils/setup.py +++ b/python-packages/order_utils/setup.py @@ -4,7 +4,7 @@ import subprocess # nosec from shutil import rmtree -from os import environ, path, remove, walk +from os import environ, path from sys import argv from distutils.command.clean import clean @@ -27,6 +27,8 @@ class TestCommandExtension(TestCommand): 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 = [ @@ -73,31 +75,64 @@ class CleanCommandExtension(clean): def run(self): """Run the regular clean, followed by our custom commands.""" super().run() - rmtree("build", ignore_errors=True) + rmtree("dist", ignore_errors=True) rmtree(".mypy_cache", ignore_errors=True) rmtree(".tox", ignore_errors=True) rmtree(".pytest_cache", ignore_errors=True) rmtree("src/order_utils.egg-info", ignore_errors=True) - # delete all .pyc files - for root, _, files in walk("."): - for file in files: - (_, extension) = path.splitext(file) - if extension == ".pyc": - remove(path.join(root, file)) + + +# pylint: disable=too-many-ancestors +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() + ) + + +# pylint: disable=too-many-ancestors +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 + + +with open("README.md", "r") as file_handle: + README_MD = file_handle.read() setup( - name="order_utils", - version="1.0.0", + name="0x-order-utils", + version="0.1.0", description="Order utilities for 0x applications", + long_description=README_MD, + long_description_content_type="text/markdown", + url="https://github.com/0xproject/0x-monorepo/python-packages/order_utils", author="F. Eugene Aumson", + author_email="feuGeneA@users.noreply.github.com", cmdclass={ "clean": CleanCommandExtension, "lint": LintCommand, "test": TestCommandExtension, + "test_publish": TestPublishCommand, + "publish": PublishCommand, }, include_package_data=True, - install_requires=["eth-abi", "web3"], + install_requires=["eth-abi", "mypy_extensions", "web3"], extras_require={ "dev": [ "bandit", @@ -112,6 +147,7 @@ setup( "pytest", "sphinx", "tox", + "twine", ] }, python_requires=">=3.6, <4", @@ -121,9 +157,10 @@ setup( keywords=( "ethereum cryptocurrency 0x decentralized blockchain dex exchange" ), - packages=["zero_ex.order_utils"], + namespace_packages=["zero_ex"], + packages=["zero_ex.order_utils", "zero_ex.dev_utils"], classifiers=[ - "Development Status :: 1 - Planning", + "Development Status :: 2 - Pre-Alpha", "Intended Audience :: Developers", "Intended Audience :: Financial and Insurance Industry", "License :: OSI Approved :: Apache Software License", @@ -133,7 +170,10 @@ setup( "Programming Language :: Python :: 3 :: Only", "Programming Language :: Python :: 3.6", "Programming Language :: Python :: 3.7", + "Topic :: Internet :: WWW/HTTP", "Topic :: Office/Business :: Financial", + "Topic :: Other/Nonlisted Topic", + "Topic :: Security :: Cryptography", "Topic :: Software Development :: Libraries", "Topic :: Utilities", ], -- cgit v1.2.3 From af91a56a5594d07d7da6caaeff79f5a7fb31ff98 Mon Sep 17 00:00:00 2001 From: "F. Eugene Aumson" Date: Fri, 26 Oct 2018 15:13:42 -0400 Subject: feat(order_utils.py): ERC721 asset data codec (#1186) --- python-packages/order_utils/setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'python-packages/order_utils/setup.py') diff --git a/python-packages/order_utils/setup.py b/python-packages/order_utils/setup.py index 159499ec4..22a5f4c41 100755 --- a/python-packages/order_utils/setup.py +++ b/python-packages/order_utils/setup.py @@ -20,7 +20,7 @@ class TestCommandExtension(TestCommand): """Invoke pytest.""" import pytest - pytest.main() + exit(pytest.main()) # pylint: disable=too-many-ancestors -- cgit v1.2.3 From 95b2898b9c0898c7e2d98ee603bff0604bf2a829 Mon Sep 17 00:00:00 2001 From: "F. Eugene Aumson" Date: Wed, 7 Nov 2018 11:20:46 -0500 Subject: [order_utils.py] is_signature_valid, via Exchange contract (#1216) First support for signature validation, done via Exchange contract's isValidSignature() method. --- python-packages/order_utils/setup.py | 47 ++++++++++++++++++++++++++++++------ 1 file changed, 39 insertions(+), 8 deletions(-) (limited to 'python-packages/order_utils/setup.py') diff --git a/python-packages/order_utils/setup.py b/python-packages/order_utils/setup.py index 22a5f4c41..1b07b612c 100755 --- a/python-packages/order_utils/setup.py +++ b/python-packages/order_utils/setup.py @@ -5,11 +5,12 @@ import subprocess # nosec from shutil import rmtree from os import environ, path +from pathlib import Path from sys import argv from distutils.command.clean import clean import distutils.command.build_py -from setuptools import setup +from setuptools import find_packages, setup from setuptools.command.test import test as TestCommand @@ -59,8 +60,15 @@ class LintCommand(distutils.command.build_py.build_py): import eth_abi eth_abi_dir = path.dirname(path.realpath(eth_abi.__file__)) - with open(path.join(eth_abi_dir, "py.typed"), "a"): - pass + Path(path.join(eth_abi_dir, "py.typed")).touch() + + # HACK(gene): until eth_utils fixes + # https://github.com/ethereum/eth-utils/issues/140 , we need to simply + # create an empty file `py.typed` in the eth_abi package directory. + import eth_utils + + eth_utils_dir = path.dirname(path.realpath(eth_utils.__file__)) + Path(path.join(eth_utils_dir, "py.typed")).touch() for lint_command in lint_commands: print( @@ -79,7 +87,7 @@ class CleanCommandExtension(clean): rmtree(".mypy_cache", ignore_errors=True) rmtree(".tox", ignore_errors=True) rmtree(".pytest_cache", ignore_errors=True) - rmtree("src/order_utils.egg-info", ignore_errors=True) + rmtree("src/0x_order_utils.egg-info", ignore_errors=True) # pylint: disable=too-many-ancestors @@ -111,6 +119,26 @@ class PublishCommand(distutils.command.build_py.build_py): subprocess.check_call("twine upload dist/*".split()) # nosec +# pylint: disable=too-many-ancestors +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 --gasLimit" + + " 10000000 --db /snapshot --noVMErrorsOnRPCResponse -p 8545" + + " --networkId 50 -m" + ).split() + cmd_line.append( + "concert load couple harbor equip island argue ramp clarify fence" + + " smart topic" + ) + subprocess.call(cmd_line) # nosec + + with open("README.md", "r") as file_handle: README_MD = file_handle.read() @@ -130,9 +158,9 @@ setup( "test": TestCommandExtension, "test_publish": TestPublishCommand, "publish": PublishCommand, + "ganache": GanacheCommand, }, - include_package_data=True, - install_requires=["eth-abi", "mypy_extensions", "web3"], + install_requires=["eth-abi", "eth_utils", "mypy_extensions", "web3"], extras_require={ "dev": [ "bandit", @@ -151,14 +179,17 @@ setup( ] }, python_requires=">=3.6, <4", - package_data={"zero_ex.order_utils": ["py.typed"]}, + package_data={ + "zero_ex.order_utils": ["py.typed"], + "zero_ex.contract_artifacts": ["artifacts/*"], + }, package_dir={"": "src"}, license="Apache 2.0", keywords=( "ethereum cryptocurrency 0x decentralized blockchain dex exchange" ), namespace_packages=["zero_ex"], - packages=["zero_ex.order_utils", "zero_ex.dev_utils"], + packages=find_packages("src"), classifiers=[ "Development Status :: 2 - Pre-Alpha", "Intended Audience :: Developers", -- cgit v1.2.3 From 7b4f63a39ca4b4e05123d2b6871c6e01f8a132a2 Mon Sep 17 00:00:00 2001 From: "F. Eugene Aumson" Date: Tue, 13 Nov 2018 16:30:12 -0500 Subject: feat(order_utils.py) generate_order_hash_hex() (#1234) --- python-packages/order_utils/setup.py | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) (limited to 'python-packages/order_utils/setup.py') diff --git a/python-packages/order_utils/setup.py b/python-packages/order_utils/setup.py index 1b07b612c..7f1da2f34 100755 --- a/python-packages/order_utils/setup.py +++ b/python-packages/order_utils/setup.py @@ -160,7 +160,13 @@ setup( "publish": PublishCommand, "ganache": GanacheCommand, }, - install_requires=["eth-abi", "eth_utils", "mypy_extensions", "web3"], + install_requires=[ + "eth-abi", + "eth_utils", + "ethereum", + "mypy_extensions", + "web3", + ], extras_require={ "dev": [ "bandit", -- cgit v1.2.3 From e1d64def2017ced0aba599b989ad42a51fdd46fe Mon Sep 17 00:00:00 2001 From: "F. Eugene Aumson" Date: Wed, 14 Nov 2018 10:41:52 -0500 Subject: feat(order_utils.py): sign_hash() (#1254) Also moved is_valid_signature() into main package module, for simplicity. Also consolidated a handul of in-line pylint disable directives into the .pylintrc config file. --- python-packages/order_utils/setup.py | 4 ---- 1 file changed, 4 deletions(-) (limited to 'python-packages/order_utils/setup.py') diff --git a/python-packages/order_utils/setup.py b/python-packages/order_utils/setup.py index 7f1da2f34..5a8db2b64 100755 --- a/python-packages/order_utils/setup.py +++ b/python-packages/order_utils/setup.py @@ -24,7 +24,6 @@ class TestCommandExtension(TestCommand): exit(pytest.main()) -# pylint: disable=too-many-ancestors class LintCommand(distutils.command.build_py.build_py): """Custom setuptools command class for running linters.""" @@ -90,7 +89,6 @@ class CleanCommandExtension(clean): rmtree("src/0x_order_utils.egg-info", ignore_errors=True) -# pylint: disable=too-many-ancestors class TestPublishCommand(distutils.command.build_py.build_py): """Custom command to publish to test.pypi.org.""" @@ -108,7 +106,6 @@ class TestPublishCommand(distutils.command.build_py.build_py): ) -# pylint: disable=too-many-ancestors class PublishCommand(distutils.command.build_py.build_py): """Custom command to publish to pypi.org.""" @@ -119,7 +116,6 @@ class PublishCommand(distutils.command.build_py.build_py): subprocess.check_call("twine upload dist/*".split()) # nosec -# pylint: disable=too-many-ancestors class GanacheCommand(distutils.command.build_py.build_py): """Custom command to publish to pypi.org.""" -- cgit v1.2.3 From b961cb195299ce6a091ae692ec815b52f6b89300 Mon Sep 17 00:00:00 2001 From: "F. Eugene Aumson" Date: Wed, 14 Nov 2018 12:56:31 -0500 Subject: fix(order_utils.py): validate order w/json schema (#1260) --- python-packages/order_utils/setup.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'python-packages/order_utils/setup.py') diff --git a/python-packages/order_utils/setup.py b/python-packages/order_utils/setup.py index 5a8db2b64..679bfb4b2 100755 --- a/python-packages/order_utils/setup.py +++ b/python-packages/order_utils/setup.py @@ -159,7 +159,7 @@ setup( install_requires=[ "eth-abi", "eth_utils", - "ethereum", + "jsonschema", "mypy_extensions", "web3", ], @@ -184,6 +184,7 @@ setup( package_data={ "zero_ex.order_utils": ["py.typed"], "zero_ex.contract_artifacts": ["artifacts/*"], + "zero_ex.json_schemas": ["schemas/*"], }, package_dir={"": "src"}, license="Apache 2.0", -- cgit v1.2.3 From 43443d6057da64e972511e3a79334407874d2084 Mon Sep 17 00:00:00 2001 From: "F. Eugene Aumson" Date: Sat, 17 Nov 2018 07:07:25 -0500 Subject: fix(order_utils.py): publish docs to S3, not RTD (#1264) Publishing to readthedocs.io (RTD) wasn't working, for various reasons. Changed to publish docs to S3. --- python-packages/order_utils/setup.py | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) (limited to 'python-packages/order_utils/setup.py') diff --git a/python-packages/order_utils/setup.py b/python-packages/order_utils/setup.py index 679bfb4b2..125de5ff7 100755 --- a/python-packages/order_utils/setup.py +++ b/python-packages/order_utils/setup.py @@ -116,6 +116,19 @@ class PublishCommand(distutils.command.build_py.build_py): 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-order-utils-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 + + class GanacheCommand(distutils.command.build_py.build_py): """Custom command to publish to pypi.org.""" @@ -141,7 +154,7 @@ with open("README.md", "r") as file_handle: setup( name="0x-order-utils", - version="0.1.0", + version="1.0.1", description="Order utilities for 0x applications", long_description=README_MD, long_description_content_type="text/markdown", @@ -154,6 +167,7 @@ setup( "test": TestCommandExtension, "test_publish": TestPublishCommand, "publish": PublishCommand, + "publish_docs": PublishDocsCommand, "ganache": GanacheCommand, }, install_requires=[ -- cgit v1.2.3