diff --git a/.gitignore b/.gitignore index 0d577ce..0153f2a 100644 --- a/.gitignore +++ b/.gitignore @@ -101,6 +101,9 @@ celerybeat.pid # SageMath parsed files *.sage.py +# uv (library, not app — devs regenerate the lockfile locally) +uv.lock + # Environments .env .venv diff --git a/docs/ReleaseInstructions.md b/docs/ReleaseInstructions.md index 14be7b1..97172bc 100644 --- a/docs/ReleaseInstructions.md +++ b/docs/ReleaseInstructions.md @@ -4,7 +4,7 @@ * Ensure `master` is stable: CI is green, no in-flight critical PRs. * Confirm `setup.py` has the intended release version (e.g. `version = "0.5.0"`). -* Sanity-check dependency version ranges in `setup.py`: +* Sanity-check dependency version ranges in `pyproject.toml`: * No major-version caps without an inline comment justifying it. * Every dependency has both a lower bound and an upper cap (using `<`, not `<=`). * Caps are at the minor level (`=77", "wheel"] # >=77 for PEP 639 SPDX license expression support +build-backend = "setuptools.build_meta" + +[project] +name = "autogluon.cloud" +description = "Train and deploy ML models in the cloud" +readme = "README.md" +requires-python = ">=3.10,<3.14" +license = "Apache-2.0" +license-files = ["LICENSE", "NOTICE"] +authors = [{ name = "AutoGluon Community" }] +classifiers = [ + "Development Status :: 4 - Beta", + "Intended Audience :: Education", + "Intended Audience :: Developers", + "Intended Audience :: Science/Research", + "Intended Audience :: Customer Service", + "Intended Audience :: Financial and Insurance Industry", + "Intended Audience :: Healthcare Industry", + "Intended Audience :: Telecommunications Industry", + "Operating System :: MacOS", + "Operating System :: Microsoft :: Windows", + "Operating System :: POSIX", + "Operating System :: Unix", + "Programming Language :: Python :: 3", + "Programming Language :: Python :: 3.10", + "Programming Language :: Python :: 3.11", + "Programming Language :: Python :: 3.12", + "Programming Language :: Python :: 3.13", + "Topic :: Software Development", + "Topic :: Scientific/Engineering :: Artificial Intelligence", + "Topic :: Scientific/Engineering :: Information Analysis", + "Topic :: Scientific/Engineering :: Image Recognition", +] +# version stays dynamic and is owned by setup.py (so the RELEASE=1 -> clean +# version, else .dev0 logic keeps working). +dynamic = ["version"] +dependencies = [ + # common module provides utils with stable api across minor version + "autogluon.common>=0.7,<1.6", + # <2 because unlikely to introduce breaking changes in minor releases. >=1.10 because 1.10 is 3 years old, no need to support older + "boto3>=1.10,<2", + "packaging>=23.0,<27", + "sagemaker>=2.126.0,<3", + "pyarrow>=19.0.1,<25", # lower bound to avoid https://github.com/apache/arrow/issues/45283 + "PyYAML~=6.0", + "Pillow>=10.2,<13", + "huggingface_hub>=0.20,<2", + "typing_extensions>=4.0,<5", + # CLI dependencies (autogluon-cloud command) + "click>=8.0,<9", + "rich>=13.0,<15", +] + +[project.optional-dependencies] +ray = ["ray[default]>=2.10.0,<2.56"] +all = [ # To allow user to pass ag objects + "autogluon>=0.7,<1.6", + "autogluon.cloud[ray]", +] +tests = [ + "pytest", + "moto", + "autogluon.common>=0.7", +] + +[project.urls] +Documentation = "https://auto.gluon.ai/cloud" +"Bug Reports" = "https://github.com/autogluon/autogluon-cloud/issues" +Source = "https://github.com/autogluon/autogluon-cloud/" +"Contribute!" = "https://github.com/autogluon/autogluon-cloud/blob/master/CONTRIBUTING.md" + +[project.scripts] +autogluon-cloud = "autogluon.cloud.cli:main" + +[tool.setuptools] +zip-safe = true +include-package-data = true + +[tool.setuptools.packages.find] +where = ["src"] +namespaces = true + +[tool.setuptools.package-data] +"autogluon.cloud" = [ + "default_cluster_configs/*.yaml", + "utils/autogluon_dlc.json", + "templates/*.yaml", +] + [tool.ruff] line-length = 119 target-version = "py310" diff --git a/setup.py b/setup.py index 5a93d6c..ff39a24 100644 --- a/setup.py +++ b/setup.py @@ -5,8 +5,6 @@ AUTOGLUON = "autogluon" CLOUD = "cloud" -PYTHON_REQUIRES = ">=3.10, <3.14" - def create_version_file(*, version): print("-- Building version " + version) @@ -26,113 +24,9 @@ def update_version(version): return version -def default_setup_args(*, version): - from setuptools import find_namespace_packages - - long_description = open("README.md").read() - name = f"{AUTOGLUON}.{CLOUD}" - setup_args = dict( - name=name, - version=version, - author="AutoGluon Community", - url="https://github.com/autogluon/autogluon-cloud", - description="Train and deploy AutoGluon backed models on the cloud", - long_description=long_description, - long_description_content_type="text/markdown", - license="Apache-2.0", - license_files=("LICENSE", "NOTICE"), - # Package info - packages=find_namespace_packages("src"), - package_dir={"": "src"}, - zip_safe=True, - include_package_data=True, - python_requires=PYTHON_REQUIRES, - package_data={ - "autogluon.cloud": [ - "default_cluster_configs/*.yaml", - "utils/autogluon_dlc.json", - "templates/*.yaml", - ], - }, - classifiers=[ - "Development Status :: 4 - Beta", - "Intended Audience :: Education", - "Intended Audience :: Developers", - "Intended Audience :: Science/Research", - "Intended Audience :: Customer Service", - "Intended Audience :: Financial and Insurance Industry", - "Intended Audience :: Healthcare Industry", - "Intended Audience :: Telecommunications Industry", - "License :: OSI Approved :: Apache Software License", - "Operating System :: MacOS", - "Operating System :: Microsoft :: Windows", - "Operating System :: POSIX", - "Operating System :: Unix", - "Programming Language :: Python :: 3", - "Programming Language :: Python :: 3.10", - "Programming Language :: Python :: 3.11", - "Programming Language :: Python :: 3.12", - "Programming Language :: Python :: 3.13", - "Topic :: Software Development", - "Topic :: Scientific/Engineering :: Artificial Intelligence", - "Topic :: Scientific/Engineering :: Information Analysis", - "Topic :: Scientific/Engineering :: Image Recognition", - ], - project_urls={ - "Documentation": "https://auto.gluon.ai", - "Bug Reports": "https://github.com/autogluon/autogluon-cloud/issues", - "Source": "https://github.com/autogluon/autogluon-cloud/", - "Contribute!": "https://github.com/autogluon/autogluon-cloud/blob/master/CONTRIBUTING.md", - }, - ) - return setup_args - - -version = "0.5.1" -version = update_version(version) - -install_requires = [ - # common module provides utils with stable api across minor version - "autogluon.common>=0.7,<1.6", - # <2 because unlikely to introduce breaking changes in minor releases. >=1.10 because 1.10 is 3 years old, no need to support older - "boto3>=1.10,<2", - "packaging>=23.0,<27", - "sagemaker>=2.126.0,<3", - "pyarrow>=19.0.1,<25", # lower bound to avoid https://github.com/apache/arrow/issues/45283 - "PyYAML~=6.0", - "Pillow>=10.2,<13", - "huggingface_hub>=0.20,<2", - "typing_extensions>=4.0,<5", - # CLI dependencies (autogluon-cloud command) - "click>=8.0,<9", - "rich>=13.0,<15", -] - -extras_require = dict() - -ray_requires = ["ray[default]>=2.10.0,<2.56"] -extras_require["ray"] = ray_requires - -all_requires = ["autogluon>=0.7,<1.6"] + ray_requires # To allow user to pass ag objects -extras_require["all"] = all_requires - -test_requirements = [ - "pytest", - "moto", - "autogluon.common>=0.7", -] -extras_require["tests"] = test_requirements +version = update_version("0.5.1") if __name__ == "__main__": create_version_file(version=version) - setup_args = default_setup_args(version=version) - setup( - install_requires=install_requires, - extras_require=extras_require, - entry_points={ - "console_scripts": [ - "autogluon-cloud=autogluon.cloud.cli:main", - ], - }, - **setup_args, - ) + # Everything except the dynamic version lives in pyproject.toml. + setup(version=version)