--- a +++ b/setup.py @@ -0,0 +1,170 @@ +#!/usr/bin/env python + +import os +import sys +from shutil import rmtree +from setuptools import Command, find_packages, setup + +here = os.path.abspath(os.path.dirname(__file__)) + + +def get_version(): + init_py_path = os.path.join(os.path.abspath(os.path.dirname(__file__)), "dosma", "__init__.py") + init_py = open(init_py_path, "r").readlines() + version_line = [l.strip() for l in init_py if l.startswith("__version__")][0] # noqa: E741 + version = version_line.split("=")[-1].strip().strip("'\"") + + # The following is used to build release packages. + # Users should never use it. + suffix = os.getenv("DOSMA_VERSION_SUFFIX", "") + version = version + suffix + if os.getenv("BUILD_NIGHTLY", "0") == "1": + from datetime import datetime + + date_str = datetime.today().strftime("%y%m%d") + version = version + ".dev" + date_str + + new_init_py = [l for l in init_py if not l.startswith("__version__")] # noqa: E741 + new_init_py.append('__version__ = "{}"\n'.format(version)) + with open(init_py_path, "w") as f: + f.write("".join(new_init_py)) + return version + + +def get_resources(): + """Get the resources files for dosma. To be used with `package_data`. + + All files under 'dosma/resources/{elastix,templates}'. + """ + import pathlib + + files = [] + # Elastix files + for path in pathlib.Path("dosma/resources/elastix/params").rglob("*.*"): + files.append(str(path)) + for path in pathlib.Path("dosma/resources/templates").rglob("*.*"): + files.append(str(path)) + return [x.split("/", 1)[1] for x in files] + + +class UploadCommand(Command): + """Support setup.py upload. + + Adapted from https://github.com/robustness-gym/meerkat. + """ + + description = "Build and publish the package." + user_options = [] + + @staticmethod + def status(s): + """Prints things in bold.""" + print("\033[1m{0}\033[0m".format(s)) + + def initialize_options(self): + pass + + def finalize_options(self): + pass + + def run(self): + try: + self.status("Removing previous builds…") + rmtree(os.path.join(here, "dist")) + except OSError: + pass + + self.status("Building Source and Wheel (universal) distribution…") + os.system("{0} setup.py sdist bdist_wheel --universal".format(sys.executable)) + + self.status("Uploading the package to PyPI via Twine…") + os.system("twine upload dist/*") + + self.status("Pushing git tags…") + os.system("git tag v{0}".format(get_version())) + os.system("git push --tags") + + sys.exit() + + +# --------------------------------------------------- +# Setup Information +# --------------------------------------------------- + +# Required pacakges. +REQUIRED = [ + "matplotlib", + "numpy", + "h5py", + "natsort", + "nested-lookup", + "nibabel", + "nipype", + "packaging", + "pandas", + # TODO Issue #57: Remove pydicom upper bound (https://github.com/ad12/DOSMA/issues/57) + "pydicom>=1.6.0", + "scikit-image", + "scipy", + "seaborn", + "openpyxl", + "Pmw", + "PyYAML", + "tabulate", + "termcolor", + "tqdm>=4.42.0", +] + +# Optional packages. +# TODO Issue #106: Fix to only import tensorflow version with fixed version +# once keras import statements are properly handled. +EXTRAS = { + "dev": [ + "coverage", + "flake8", + "flake8-bugbear", + "flake8-comprehensions", + "isort", + "black==21.4b2", + "click==8.0.2", + "simpleitk", + "sphinx", + "sphinxcontrib.bibtex", + "m2r2", + "tensorflow<=2.4.1", + "keras<=2.4.3", + "sigpy", + ], + "ai": ["tensorflow<=2.4.1", "keras<=2.4.3"], + "docs": ["mistune>=0.8.1,<2.0.0", "sphinx", "sphinxcontrib.bibtex", "m2r2"], +} + +with open("README.md", "r", encoding="utf-8") as fh: + long_description = fh.read() + + +setup( + name="dosma", + version=get_version(), + author="Arjun Desai", + url="https://github.com/ad12/DOSMA", + project_urls={"Documentation": "https://dosma.readthedocs.io/"}, + description="An AI-powered open-source medical image analysis toolbox", + long_description=long_description, + long_description_content_type="text/markdown", + packages=find_packages(exclude=("configs", "tests", "tests.*")), + package_data={"dosma": get_resources()}, + python_requires=">=3.6", + install_requires=REQUIRED, + license="GNU", + classifiers=[ + "Programming Language :: Python :: 3", + "License :: OSI Approved :: GNU General Public License v3 (GPLv3)", + "Operating System :: OS Independent", + ], + extras_require=EXTRAS, + # $ setup.py publish support. + cmdclass={ + "upload": UploadCommand, + }, +)