diff --git a/.github/workflows/regression.yml b/.github/workflows/regression.yml index eb82a89c2..d773b370e 100644 --- a/.github/workflows/regression.yml +++ b/.github/workflows/regression.yml @@ -24,14 +24,6 @@ jobs: with: python-version: '3.6' - - name: Install numpy - run: | - python3 -m pip install numpy - - - name: Install dependencies - run: | - python3 -m pip install -r requirements.txt - - name: Install OMAS run: | python3 -m pip install .[machine] diff --git a/.github/workflows/regression_no_munittest.yml b/.github/workflows/regression_no_munittest.yml index 31aef0dbc..5e90da075 100644 --- a/.github/workflows/regression_no_munittest.yml +++ b/.github/workflows/regression_no_munittest.yml @@ -19,14 +19,6 @@ jobs: with: python-version: '3.x' - - name: Install numpy - run: | - python3 -m pip install numpy - - - name: Install dependencies - run: | - python3 -m pip install -r requirements.txt - - name: Install OMAS run: | python3 -m pip install .[machine] diff --git a/MANIFEST.in b/MANIFEST.in deleted file mode 100644 index 42eb4101e..000000000 --- a/MANIFEST.in +++ /dev/null @@ -1 +0,0 @@ -include LICENSE.txt diff --git a/Makefile b/Makefile index d42447768..a5f79f518 100644 --- a/Makefile +++ b/Makefile @@ -87,7 +87,7 @@ tag: sdist: rm -rf dist - python3 setup.py sdist + python3 -m build --sdist pypi: sdist python3 -m twine upload --repository pypi dist/omas-$(VERSION).tar.gz diff --git a/omas/omas_utils.py b/omas/omas_utils.py index c64fba899..2b0623d16 100644 --- a/omas/omas_utils.py +++ b/omas/omas_utils.py @@ -5,6 +5,7 @@ from .omas_setup import * from .omas_setup import __version__ +from .omas_cython import * import sys # -------------------------------------------- @@ -864,23 +865,6 @@ def omas_global_quantities(imas_version=omas_rcparams['default_imas_version']): return _global_quantities[imas_version] -# only attempt cython if effective user owns this copy of omas -# disabled for Windows: need to add check for file ownership under Windows -if os.name == 'nt' or os.geteuid() != os.stat(__file__).st_uid: - with open(os.path.split(__file__)[0] + os.sep + 'omas_cython.pyx', 'r') as f: - exec(f.read(), globals()) -else: - try: - import pyximport - - pyximport.install(language_level=3) - from .omas_cython import * - except Exception as _excp: - warnings.warn('omas cython failed: ' + str(_excp)) - with open(os.path.split(__file__)[0] + os.sep + 'omas_cython.pyx', 'r') as f: - exec(f.read(), globals()) - - def l2ut(path): """ Formats IMAS time lists ['bla',0,'time_slice',5,'quantity'] with universal ODS path 'bla.0.time_slice.:.quantity' diff --git a/pyproject.toml b/pyproject.toml new file mode 100644 index 000000000..47048a04c --- /dev/null +++ b/pyproject.toml @@ -0,0 +1,63 @@ +[build-system] +requires = ["setuptools", "Cython"] +build-backend = "setuptools.build_meta" + +[tool.setuptools.packages.find] +where = ["."] +exclude = ["sphinx*"] + +[tool.setuptools.dynamic] +version = {file = "omas/version"} + +[project] +name = 'omas' +dynamic = ["version"] +description = 'Ordered Multidimensional Array Structures' +authors = [ + {name = 'Orso Meneghini', email = 'meneghini@fusion.gat.com'}, +] +classifiers = [ + 'Development Status :: 5 - Production/Stable', + 'Programming Language :: Python', + 'Programming Language :: Python :: 3', + 'Programming Language :: Python :: 3 :: Only', + 'License :: OSI Approved :: MIT License', +] +keywords = ["integrated modeling", "OMFIT", "IMAS", "ITER"] + +requires-python = '>=3.6' +dependencies = [ + 'numpy>=1.16.1', + 'uncertainties', + 'pint', + 'netCDF4', + 'boto3', + 'matplotlib', + 'scipy', + 'h5py', + 'pymongo', + 'dnspython', + 'xmltodict', + 'xarray', + 'setuptools>=41.2', + 'tqdm', +] +readme="README.md" + +[project.urls] +Homepage = 'https://gafusion.github.io/omas' +Source = 'https://github.com/gafusion/omas' + +[project.optional-dependencies] +machine = [ + 'omfit_classes', + 'pexpect', + 'fortranformat', + 'pygacode', +] +hdc = ['pyhdc'] +imas = ['imas'] +uda = ['pyuda'] +build_sdist = ['build'] +build_structures = ['bs4'] +build_documentation = ['Sphinx', 'sphinx-bootstrap-theme', 'sphinx-gallery', 'Pillow'] diff --git a/setup.py b/setup.py index 5552fc857..be0467842 100644 --- a/setup.py +++ b/setup.py @@ -1,128 +1,6 @@ -import os -import sys -import glob -import subprocess - -install_requires = [ - 'numpy>=1.16.1', - 'uncertainties', - 'pint', - 'netCDF4', - 'boto3', - 'matplotlib', - 'scipy', - 'h5py', - 'pymongo', - 'dnspython', - 'xmltodict', - 'xarray', - 'setuptools>=41.2', - 'tqdm', - 'Cython', -] - -extras_require = { - 'machine': [ - 'omfit_classes', - 'pexpect', - 'fortranformat', - 'pygacode', - ], - 'hdc': ['pyhdc'], - 'imas': ['imas'], - 'uda': ['pyuda'], - 'build_structures': ['bs4'], - 'build_documentation': ['Sphinx', 'sphinx-bootstrap-theme', 'sphinx-gallery', 'Pillow'], -} - -# Add .json IMAS structure files to the package -here = os.path.abspath(os.path.split(__file__)[0]) + os.sep - -# Automatically generate requirement.txt file if this is the OMAS repo and requirements.txt is missing -if os.path.exists(here + '.git') and not os.path.exists(here + 'requirements.txt'): - with open(here + 'requirements.txt', 'w') as f: - f.write('# Do not edit this file by hand, operate on setup.py instead\n#\n') - f.write('# usage: pip install -r requirements.txt\n\n') - for item in install_requires: - f.write(item.ljust(25) + '# required\n') - for requirement in extras_require: - f.write('\n') - for item in extras_require[requirement]: - f.write('# ' + item.ljust(25) + '# %s\n' % requirement) - -packages = ['omas', 'omas.examples', 'omas.samples', 'omas.tests', 'omas.utilities'] -package_data = { - 'omas': ['*.py', '*.pyx', 'version'], - 'omas.examples': ['*.py'], - 'omas.samples': ['*'], - 'omas.tests': ['*.py'], - 'omas.utilities': ['*.py'], -} - -machine_mappings_dir = here + os.sep + 'omas' + os.sep + 'machine_mappings' -for item in glob.glob(os.sep.join([here, 'omas', 'imas_structures', '*'])): - packages.append('omas.imas_structures.' + os.path.split(item)[1]) - package_data['omas.imas_structures.' + os.path.split(item)[1]] = ['*.json'] -for retry in [1, 2]: - if os.path.exists(here + '.git') and retry == 1: - try: - tmp = f'pushd {machine_mappings_dir}; git ls-files; popd' - machine_mappings_files = subprocess.check_output(tmp, shell=True).decode("utf-8").strip().split('\n')[2:-1] - machine_mappings_files = ['omas' + os.sep + 'machine_mappings' + os.sep + k for k in machine_mappings_files] - except subprocess.CalledProcessError: - pass - else: - print("setup.py machine_mappings_files based on git") - break - else: - machine_mappings_files = [] - for root, subdirs, files in os.walk(machine_mappings_dir): - root = root[len(machine_mappings_dir) + 1 :] - for file in reversed(files): - machine_mappings_files.append('omas' + os.sep + 'machine_mappings' + os.sep + root + os.sep + file) -dirs = {os.path.dirname(file): [] for file in sorted(machine_mappings_files)} -for file in machine_mappings_files: - dirs[os.path.dirname(file)].append(os.path.basename(file)) -for dir in dirs: - packages.append(dir.replace('/', '.')) - package_data[dir.replace('/', '.')] = dirs[dir] - -long_description = ''' -OMAS is a Python library designed to simplify the interface of third-party codes with the `ITER `_ Integrated Modeling and Analysis Suite (`IMAS `_). - -* It provides a **convenient Python API** - -* capable of storing data with **different file/database formats** - -* in a form that is **always compatible with the IMAS data model** - -Mapping the physics codes I/O to the IMAS data model is done in third party Python codes such as the `OMFIT framework `_. -''' - -print() -print('INFO: optional dependencies:') -from pprint import pprint - -pprint(extras_require) -print() -print('INFO: run the `imports_check.py` script to quickly verify that all Python dependencies for OMAS are installed') -print() - -from setuptools import setup +from setuptools import Extension, setup +from Cython.Build import cythonize setup( - name='omas', - version=open(here + 'omas/version', 'r').read().strip(), - description='Ordered Multidimensional Array Structures', - url='https://gafusion.github.io/omas', - author='Orso Meneghini', - license='MIT', - classifiers=['License :: OSI Approved :: MIT License', 'Programming Language :: Python :: 3'], - keywords='integrated modeling OMFIT IMAS ITER', - long_description=long_description, - long_description_content_type='text/markdown', - packages=packages, - package_data=package_data, - install_requires=install_requires, - extras_require=extras_require, + ext_modules = cythonize("omas/omas_cython.pyx") )