From 164ea51068dfff29aa51b93e93b83d4ce3987f4d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20Morales?= Date: Fri, 6 Dec 2024 14:58:10 -0600 Subject: [PATCH] enh: use configuration from settings.ini (#560) --- .github/workflows/ci.yaml | 23 ++++++++ nixtla/__init__.py | 3 +- settings.ini | 11 ++-- setup.py | 111 ++++++++++++++++++++------------------ 4 files changed, 90 insertions(+), 58 deletions(-) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index f68001ad..7f22509d 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -83,3 +83,26 @@ jobs: - name: Run tests run: nbdev_test --timing --do_print --n_workers 0 --skip_file_re "computing_at_scale|distributed" + + run-minimal-tests: + runs-on: ${{ matrix.os }} + timeout-minutes: 60 + strategy: + fail-fast: false + matrix: + os: [macos-13, macos-14, ubuntu-latest, windows-latest] + python-version: ["3.9", "3.13"] + steps: + - name: Clone repo + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + + - name: Set up python + uses: actions/setup-python@0b93645e9fea7318ecaed2b359559ac225c90a2b # 5.3.0 + with: + python-version: ${{ matrix.python-version }} + + - name: Install pip requirements + run: pip install uv && uv pip install --system . matplotlib nbdev python-dotenv + + - name: Run tests + run: nbdev_test --n_workers 0 --path nbs/docs/getting-started/2_quickstart.ipynb diff --git a/nixtla/__init__.py b/nixtla/__init__.py index 64c539a0..1fd272cb 100644 --- a/nixtla/__init__.py +++ b/nixtla/__init__.py @@ -1,4 +1,3 @@ -__all__ = ["NixtlaClient"] __version__ = "0.6.4" - +__all__ = ["NixtlaClient"] from .nixtla_client import NixtlaClient diff --git a/settings.ini b/settings.ini index fe61fc2a..ef45b380 100644 --- a/settings.ini +++ b/settings.ini @@ -2,7 +2,7 @@ host = github lib_name = nixtla user = Nixtla -description = Time series forecasting suite using TimeGPT +description = Python SDK for Nixtla API (TimeGPT) keywords = time-series forecasting gpt author = Nixtla author_email = business@nixtla.io @@ -14,9 +14,12 @@ audience = Developers language = English custom_sidebar = True license = apache2 -status = 2 -requirements = requests pandas tenacity -dev_requirements = nbdev plotly statsforecast python-dotenv +status = 4 +requirements = annotated-types httpx[zstd] orjson pandas tenacity tqdm utilsforecast>=0.2.8 +dev_requirements = black datasetsforecast fire hierarchicalforecast jupyterlab nbdev neuralforecast numpy<2 plotly polars pre-commit pyreadr python-dotenv pyyaml setuptools<70 statsforecast tabulate +distributed_requirements = fugue[dask,ray,spark]>=0.8.7 pandas<2.2 ray<2.6.3 +plotting_requirements = utilsforecast[plotting] +date_extra_requirements = holidays nbs_path = nbs doc_path = _docs recursive = True diff --git a/setup.py b/setup.py index f1065ccc..6d849acb 100644 --- a/setup.py +++ b/setup.py @@ -1,58 +1,65 @@ +from pkg_resources import parse_version +from configparser import ConfigParser import setuptools +assert parse_version(setuptools.__version__)>=parse_version('36.2') -with open("README.md", "r", encoding="utf8") as fh: - long_description = fh.read() +# note: all settings are in settings.ini; edit there, not here +config = ConfigParser(delimiters=['=']) +config.read('settings.ini') +cfg = config['DEFAULT'] -dev = [ - "black", - "datasetsforecast", - "fire", - "hierarchicalforecast", - "jupyterlab", - "nbdev", - "neuralforecast", - "numpy<2", - "plotly", - "polars", - "pre-commit", - "pyreadr", - "python-dotenv", - "pyyaml", - "setuptools<70", - "statsforecast", - "tabulate", -] -distributed = ["fugue[dask,ray,spark]>=0.8.7", "pandas<2.2", "ray<2.6.3"] -plotting = ["utilsforecast[plotting]"] -date_extras = ["holidays"] +cfg_keys = 'version description keywords author author_email'.split() +expected = cfg_keys + "lib_name user branch license status min_python audience language".split() +for o in expected: assert o in cfg, "missing expected setting: {}".format(o) +setup_cfg = {o:cfg[o] for o in cfg_keys} + +licenses = { + 'apache2': ('Apache Software License 2.0','OSI Approved :: Apache Software License'), + 'mit': ('MIT License', 'OSI Approved :: MIT License'), + 'gpl2': ('GNU General Public License v2', 'OSI Approved :: GNU General Public License v2 (GPLv2)'), + 'gpl3': ('GNU General Public License v3', 'OSI Approved :: GNU General Public License v3 (GPLv3)'), + 'bsd3': ('BSD License', 'OSI Approved :: BSD License'), +} +statuses = [ '1 - Planning', '2 - Pre-Alpha', '3 - Alpha', + '4 - Beta', '5 - Production/Stable', '6 - Mature', '7 - Inactive' ] +py_versions = '3.9 3.10 3.11 3.12 3.13'.split() + +requirements = cfg['requirements'].split() +distributed_requirements = cfg['distributed_requirements'].split() +plotting_requirements = cfg['plotting_requirements'].split() +date_extra_requirements = cfg['date_extra_requirements'].split() +dev_requirements = cfg['dev_requirements'].split() +dev_requirements.extend(plotting_requirements) +dev_requirements.extend(date_extra_requirements) + +min_python = cfg['min_python'] +lic = licenses.get(cfg['license'].lower(), (cfg['license'], None)) setuptools.setup( - name="nixtla", - version="0.6.4", - description="Python SDK for Nixtla API (TimeGPT)", - long_description=long_description, - long_description_content_type="text/markdown", - url="https://github.com/Nixtla/nixtla", - packages=setuptools.find_packages(exclude=["action_files"]), - classifiers=[ - "Programming Language :: Python :: 3", - "License :: OSI Approved :: MIT License", - "Operating System :: OS Independent", - ], - python_requires=">=3.9", - install_requires=[ - "annotated-types", - "httpx[zstd]", - "orjson", - "pandas", - "tenacity", - "tqdm", - "utilsforecast>=0.2.8", - ], - extras_require={ - "dev": dev + plotting + date_extras, - "distributed": distributed, - "plotting": plotting, - "date_extras": date_extras, + name = cfg['lib_name'], + license = lic[0], + classifiers = [ + 'Development Status :: ' + statuses[int(cfg['status'])], + 'Intended Audience :: ' + cfg['audience'].title(), + 'Natural Language :: ' + cfg['language'].title(), + ] + ['Programming Language :: Python :: '+o for o in py_versions[py_versions.index(min_python):]] + (['License :: ' + lic[1] ] if lic[1] else []), + url = cfg['git_url'], + packages = setuptools.find_packages(exclude=['action_files']), + include_package_data = True, + install_requires = requirements, + extras_require = { + "dev": dev_requirements, + "distributed": distributed_requirements, + "plotting": plotting_requirements, + "date_extras": date_extra_requirements, + }, + dependency_links = cfg.get('dep_links','').split(), + python_requires = '>=' + cfg['min_python'], + long_description = open('README.md', encoding='utf-8').read(), + long_description_content_type = 'text/markdown', + zip_safe = False, + entry_points = { + 'console_scripts': cfg.get('console_scripts','').split(), + 'nbdev': [f'{cfg.get("lib_path")}={cfg.get("lib_path")}._modidx:d'] }, -) + **setup_cfg)