1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
|
"""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:
(_, extension) = path.splitext(file)
if extension == ".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"),
}
},
)
|