Skip to content

Commit

Permalink
refactor: modernize build with pyproject.toml (#322)
Browse files Browse the repository at this point in the history
  • Loading branch information
tsutterley authored Aug 23, 2024
1 parent 6988bdc commit e6d8f4b
Show file tree
Hide file tree
Showing 10 changed files with 106 additions and 171 deletions.
35 changes: 0 additions & 35 deletions .dockerignore

This file was deleted.

4 changes: 2 additions & 2 deletions .github/workflows/python-publish.yml
Original file line number Diff line number Diff line change
Expand Up @@ -21,12 +21,12 @@ jobs:
- name: Install dependencies
run: |
python -m pip install --upgrade pip
pip install setuptools wheel twine
pip install build setuptools wheel twine
- name: Build and publish
env:
TWINE_USERNAME: ${{ secrets.PYPI_USERNAME }}
TWINE_PASSWORD: ${{ secrets.PYPI_PASSWORD }}
run: |
python setup.py sdist bdist_wheel
python -m build
twine upload dist/*
2 changes: 1 addition & 1 deletion .github/workflows/python-request.yml
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@ jobs:
post-cleanup: 'all'
create-args: >-
blas
boto3
python=${{ matrix.python-version }}
flake8
pytest
Expand All @@ -62,7 +63,6 @@ jobs:
- name: Test with pytest
run: |
pip install --no-deps .
if [ -f requirements-dev.txt ]; then pip install -r requirements-dev.txt; fi
pytest --verbose --capture=no --cov=./ --cov-report=xml \
--username=${{ secrets.EARTHDATA_USERNAME }} \
--password=${{ secrets.EARTHDATA_PASSWORD }} \
Expand Down
1 change: 1 addition & 0 deletions MANIFEST.in
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ graft pyTMD/data
prune .github*
prune doc*
prune notebooks*
prune run*
prune test*
exclude *.cfg
exclude *.yml
Expand Down
3 changes: 0 additions & 3 deletions postBuild

This file was deleted.

102 changes: 101 additions & 1 deletion pyproject.toml
Original file line number Diff line number Diff line change
@@ -1,3 +1,103 @@
[build-system]
requires = ["setuptools", "setuptools_scm"]
requires = ["setuptools>=64", "setuptools_scm>=8"]
build-backend = "setuptools.build_meta"

[project]
name = "pyTMD"
description = "Tide Model Driver to read OTIS, ATLAS, GOT and FES formatted tidal solutions and make tidal predictions"
keywords = [
"Ocean Tides",
"Load Tides",
"Pole Tides",
"Solid Earth Tides",
"Tidal Prediction",
]
authors = [
{name = "Tyler Sutterley"},
{name = "Karen Alley"},
{name = "Kelly Brunt"},
{name = "Susan Howard"},
{name = "Laurie Padman"},
{name = "Matt Siegfried"},
{email = "[email protected]"}
]
maintainers = [{ name = "pyTMD contributors" }]
license = {file = "LICENSE"}
readme = "README.rst"

requires-python = "~=3.6"
dependencies = [
"lxml",
"netCDF4",
"numpy",
"pyproj",
"python-dateutil",
"scipy>=1.10.1",
"setuptools_scm",
"timescale>=0.0.3",
]

dynamic = ["version"]

classifiers=[
"Development Status :: 3 - Alpha",
"Intended Audience :: Science/Research",
"License :: OSI Approved :: MIT License",
"Operating System :: OS Independent",
"Programming Language :: Python :: 3",
"Programming Language :: Python :: 3.6",
"Programming Language :: Python :: 3.7",
"Programming Language :: Python :: 3.8",
"Programming Language :: Python :: 3.9",
"Programming Language :: Python :: 3.10",
"Programming Language :: Python :: 3.11",
"Programming Language :: Python :: 3.12",
"Topic :: Scientific/Engineering :: Physics",
]

[project.urls]
Homepage = "https://pyTMD.readthedocs.io"
Documentation = "https://pyTMD.readthedocs.io"
Repository = "https://github.com/tsutterley/pyTMD"
Issues = "https://github.com/tsutterley/pyTMD/issues"

[project.optional-dependencies]
doc = ["docutils", "fontconfig", "freetype", "graphviz", "numpydoc", "sphinx", "sphinx-argparse>=0.4", "sphinx_rtd_theme"]
all = ["cartopy", "gdal", "h5py", "ipyleaflet", "ipywidgets", "jplephem", "matplotlib", "mpi4py", "notebook", "pandas", "pyyaml"]
dev = ["flake8", "pytest>=4.6", "pytest-cov", "oct2py", "boto3"]

[tool.setuptools.packages.find]
exclude = ["test*", "run*"]

[tool.pytest.ini_options]
minversion = "6.0"
norecursedirs = ".git"
python_files = [
"test*.py"
]
testpaths = [
"test"
]

[tool.coverage.run]
branch = true
source = [
"pyTMD",
"test",
]
omit = [
"setup.py",
"conf.py",
"scripts/*",
"pyTMD/calc_astrol_longitudes.py",
"pyTMD/compute_tide_corrections.py",
"pyTMD/convert_crs.py",
"pyTMD/convert_ll_xy.py",
"pyTMD/load_constituent.py",
"pyTMD/load_nodal_corrections.py",
"test/def_to_json.py",
]

[tool.coverage.report]
show_missing = true
precision = 2
6 changes: 0 additions & 6 deletions requirements-dev.txt

This file was deleted.

8 changes: 0 additions & 8 deletions requirements.txt

This file was deleted.

27 changes: 0 additions & 27 deletions setup.cfg

This file was deleted.

89 changes: 1 addition & 88 deletions setup.py
Original file line number Diff line number Diff line change
@@ -1,29 +1,5 @@
import os
import sys
import logging
import subprocess
from setuptools import setup, find_packages

logging.basicConfig(stream=sys.stderr, level=logging.INFO)
log = logging.getLogger()

# package description and keywords
description = ('Tide Model Driver to read OTIS, ATLAS, GOT and FES '
'formatted tidal solutions and make tidal predictions')
keywords = 'Ocean Tides, Load Tides, Pole Tides, Tidal Prediction, OTIS, GOT, FES'
# get long_description from README.rst
with open('README.rst', mode='r', encoding='utf8') as fh:
long_description = fh.read()
long_description_content_type = "text/x-rst"

# install requirements and dependencies
on_rtd = os.environ.get('READTHEDOCS') == 'True'
if on_rtd:
install_requires = []
else:
# get install requirements
with open('requirements.txt', mode='r', encoding='utf8') as fh:
install_requires = [line.split().pop(0) for line in fh.read().splitlines()]
from setuptools import setup

# get version
with open('version.txt', mode='r', encoding='utf8') as fh:
Expand All @@ -32,45 +8,6 @@
# list of all scripts to be included with package
scripts=[os.path.join('scripts',f) for f in os.listdir('scripts') if f.endswith('.py')]

# run cmd from the command line
def check_output(cmd):
return subprocess.check_output(cmd).decode('utf')

# check if GDAL is installed
gdal_output = [None] * 4
try:
for i, flag in enumerate(("--cflags", "--libs", "--datadir", "--version")):
gdal_output[i] = check_output(['gdal-config', flag]).strip()
except Exception as exc:
log.warning('Failed to get options via gdal-config')
else:
log.info(f"GDAL version from via gdal-config: {gdal_output[3]}")
# if setting GDAL version from via gdal-config
if gdal_output[3] and ('gdal' in install_requires):
# add version information to gdal in install_requires
gdal_index = install_requires.index('gdal')
install_requires[gdal_index] = f'gdal=={gdal_output[3]}'
elif any(install_requires) and ('gdal' in install_requires):
# gdal version not found
gdal_index = install_requires.index('gdal')
install_requires.pop(gdal_index)

# check if HDF5 is installed
hdf5_output = [None] * 2
try:
for i, cmd in enumerate((["h5cc","-showconfig"], ["h5dump","--version"])):
hdf5_output[i] = check_output(cmd).strip()
# parse HDF5 version from h5dump
hdf5_version = hdf5_output[1].split().pop(2)
except Exception as exc:
log.warning('Failed to get HDF5 options')
else:
log.info(f"HDF5 version from via h5dump: {hdf5_version}")
# if the HDF5 version not found
if not any(hdf5_output) and ('h5py' in install_requires):
hdf5_index = install_requires.index('h5py')
install_requires.pop(hdf5_index)

# semantic version configuration for setuptools-scm
setup_requires = ["setuptools_scm"]
use_scm_version = {
Expand All @@ -82,30 +19,6 @@ def check_output(cmd):

setup(
name='pyTMD',
description=description,
long_description=long_description,
long_description_content_type=long_description_content_type,
url='https://github.com/tsutterley/pyTMD',
author='Tyler Sutterley',
author_email='[email protected]',
license='MIT',
classifiers=[
'Development Status :: 3 - Alpha',
'Intended Audience :: Science/Research',
'Topic :: Scientific/Engineering :: Physics',
'License :: OSI Approved :: MIT License',
'Programming Language :: Python :: 3',
'Programming Language :: Python :: 3.6',
'Programming Language :: Python :: 3.7',
'Programming Language :: Python :: 3.8',
'Programming Language :: Python :: 3.9',
'Programming Language :: Python :: 3.10',
],
keywords=keywords,
packages=find_packages(),
install_requires=install_requires,
setup_requires=setup_requires,
use_scm_version=use_scm_version,
scripts=scripts,
include_package_data=True,
)

0 comments on commit e6d8f4b

Please sign in to comment.