# -*- coding: utf-8 -*- """install mythril and deploy source-dist and wheel to pypi.python.org. deps (requires up2date version): *) pip install --upgrade pip wheel setuptools twine publish to pypi w/o having to convert Readme.md to RST: 1) #> python setup.py sdist bdist_wheel 2) #> twine upload dist/* #; #optional --repository or --repository-url """ from setuptools import setup, find_packages from setuptools.command.install import install import sys import os import io # Package meta-data. NAME = "mythril" DESCRIPTION = "Security analysis tool for Ethereum smart contracts" URL = "https://github.com/ConsenSys/mythril" AUTHOR = "ConsenSys Dilligence" AUTHOR_MAIL = None REQUIRES_PYTHON = ">=3.5.0" # What packages are required for this module to be executed? REQUIRED = [ "coloredlogs>=10.0", "py_ecc==1.4.2", "ethereum>=2.3.2", "z3-solver>=4.8.5.0", "requests", "py-solc", "plyvel", "eth_abi==1.3.0", "eth-utils>=1.0.1", "eth-account>=0.1.0a2,<=0.3.0", "eth-hash>=0.1.0", "eth-keyfile>=0.5.1", "eth-keys>=0.2.0b3,<0.3.0", "eth-rlp>=0.1.0", "eth-tester==0.1.0b32", "eth-typing>=2.0.0", "coverage", "jinja2>=2.9", "rlp>=1.0.1", "transaction>=2.2.1", "py-flags", "mock", "configparser>=3.5.0", "persistent>=4.2.0", "ethereum-input-decoder>=0.2.2", "matplotlib", ] TESTS_REQUIRE = ["mypy", "pytest>=3.6.0", "pytest_mock", "pytest-cov"] # What packages are optional? EXTRAS = { # 'fancy feature': ['django'], } # If version is set to None then it will be fetched from __version__.py VERSION = None here = os.path.abspath(os.path.dirname(__file__)) # Import the README and use it as the long-description. # Note: this will only work if 'README.md' is present in your MANIFEST.in file! try: with io.open(os.path.join(here, "README.md"), encoding="utf-8") as f: long_description = "\n" + f.read() except FileNotFoundError: long_description = DESCRIPTION # Load the package's __version__.py module as a dictionary. about = {} if not VERSION: project_slug = NAME.lower().replace("-", "_").replace(" ", "_") with open(os.path.join(here, project_slug, "__version__.py")) as f: exec(f.read(), about) else: about["__version__"] = VERSION # Package version (vX.Y.Z). It must match git tag being used for CircleCI # deployment; otherwise the build will failed. class VerifyVersionCommand(install): """Custom command to verify that the git tag matches our version.""" description = "verify that the git tag matches our version" def run(self): """""" tag = os.getenv("CIRCLE_TAG") if tag != VERSION: info = "Git tag: {0} does not match the version of this app: {1}".format( tag, VERSION ) sys.exit(info) setup( name=NAME, version=about["__version__"][1:], description=DESCRIPTION, long_description=long_description, long_description_content_type="text/markdown", # requires twine and recent setuptools url=URL, author=AUTHOR, author_mail=AUTHOR_MAIL, license="MIT", classifiers=[ "Development Status :: 3 - Alpha", "Intended Audience :: Science/Research", "Topic :: Software Development :: Disassemblers", "License :: OSI Approved :: MIT License", "Programming Language :: Python :: 3.5", "Programming Language :: Python :: 3.6", "Programming Language :: Python :: 3.7", ], keywords="hacking disassembler security ethereum", packages=find_packages(exclude=["contrib", "docs", "tests"]), install_requires=REQUIRED, tests_require=TESTS_REQUIRE, python_requires=REQUIRES_PYTHON, extras_require=EXTRAS, package_data={"mythril.analysis.templates": ["*"], "mythril.support.assets": ["*"]}, include_package_data=True, entry_points={"console_scripts": ["myth=mythril.interfaces.cli:main"]}, cmdclass={"verify": VerifyVersionCommand}, )