#!/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,
},
)