From 7e5e645993019209fa01df40981053e11ccda9bc Mon Sep 17 00:00:00 2001 From: Tod Haren Date: Sat, 23 May 2026 05:24:17 +0000 Subject: [PATCH] Refactor and update CI workflow - Add 'dev' workflow - Cleanup redundant and conflicting dependencies - Refactor workflow to use cibuildwheel - Add PyTest running prior to publishing - Add PyPI publishing: dev branch to TestPyPI - Restructure repository for a "src" layout - Put cibuildwheel test configuration in pyproject.toml - Remove remnant distutils import --- .github/workflows/python-package.yml | 187 +++++-- README.md | 9 + meson.build | 44 +- meson_options.txt | 4 +- pixi.lock | 495 +++++++++--------- pyfvs/pyfvs.cfg | 39 -- pyproject.toml | 52 +- requirements.txt | 2 - {api => src/api}/carbon_data.f90 | 0 {api => src/api}/downwood_data.f90 | 0 {api => src/api}/fvs_api.f90 | 0 {api => src/api}/fvs_step.f90 | 0 {api => src/api}/globals.f90 | 0 {api => src/api}/globals.f90.in | 0 {api => src/api}/inventory_trees.f90 | 0 {api => src/api}/morts_wrap.f90 | 0 {api => src/api}/prtrls_wrap.f90 | 0 {api => src/api}/snag_data.f90 | 0 {api => src/api}/tree_data.f90 | 0 {api => src/api}/variant/pn/morts_fvs.f | 0 {api => src/api}/variant/wc/morts_fvs.f | 0 {api => src/api}/version.f90 | 0 {pyfvs => src/pyfvs}/README.md | 0 {pyfvs => src/pyfvs}/README.txt | 0 {pyfvs => src/pyfvs}/__init__.py | 0 {pyfvs => src/pyfvs}/__main__.py | 0 {pyfvs => src/pyfvs}/config_default.yaml | 0 {pyfvs => src/pyfvs}/fvs.py | 1 - {pyfvs => src/pyfvs}/keywords/__init__.py | 0 {pyfvs => src/pyfvs}/keywords/_fields.py | 0 {pyfvs => src/pyfvs}/keywords/_utils.py | 0 {pyfvs => src/pyfvs}/keywords/eventmonitor.py | 0 {pyfvs => src/pyfvs}/keywords/keywords.py | 0 {pyfvs => src/pyfvs}/meson.build | 16 +- {pyfvs => src/pyfvs}/variants.py.in | 0 35 files changed, 471 insertions(+), 378 deletions(-) delete mode 100644 pyfvs/pyfvs.cfg rename {api => src/api}/carbon_data.f90 (100%) rename {api => src/api}/downwood_data.f90 (100%) rename {api => src/api}/fvs_api.f90 (100%) rename {api => src/api}/fvs_step.f90 (100%) rename {api => src/api}/globals.f90 (100%) rename {api => src/api}/globals.f90.in (100%) rename {api => src/api}/inventory_trees.f90 (100%) rename {api => src/api}/morts_wrap.f90 (100%) rename {api => src/api}/prtrls_wrap.f90 (100%) rename {api => src/api}/snag_data.f90 (100%) rename {api => src/api}/tree_data.f90 (100%) rename {api => src/api}/variant/pn/morts_fvs.f (100%) rename {api => src/api}/variant/wc/morts_fvs.f (100%) rename {api => src/api}/version.f90 (100%) rename {pyfvs => src/pyfvs}/README.md (100%) rename {pyfvs => src/pyfvs}/README.txt (100%) rename {pyfvs => src/pyfvs}/__init__.py (100%) rename {pyfvs => src/pyfvs}/__main__.py (100%) rename {pyfvs => src/pyfvs}/config_default.yaml (100%) rename {pyfvs => src/pyfvs}/fvs.py (99%) rename {pyfvs => src/pyfvs}/keywords/__init__.py (100%) rename {pyfvs => src/pyfvs}/keywords/_fields.py (100%) rename {pyfvs => src/pyfvs}/keywords/_utils.py (100%) rename {pyfvs => src/pyfvs}/keywords/eventmonitor.py (100%) rename {pyfvs => src/pyfvs}/keywords/keywords.py (100%) rename {pyfvs => src/pyfvs}/meson.build (66%) rename {pyfvs => src/pyfvs}/variants.py.in (100%) diff --git a/.github/workflows/python-package.yml b/.github/workflows/python-package.yml index 41df41fe1..befd8e68f 100644 --- a/.github/workflows/python-package.yml +++ b/.github/workflows/python-package.yml @@ -1,29 +1,28 @@ -# This workflow will install Python dependencies, run tests and lint with a variety of Python versions -# For more information see: https://docs.github.com/en/actions/automating-builds-and-tests/building-and-testing-python +# This workflow builds binary wheels using cibuildwheel and a source distribution. +# cibuildwheel handles manylinux and Windows wheel building across Python versions. +# Publishes to TestPyPI on pushes to dev, and PyPI on pushes to main. name: Build Packages on: push: - branches: [ "main" ] + branches: [ "main", "dev" ] pull_request: - branches: [ "main" ] + branches: [ "main", "dev" ] jobs: - build: - + make-wheels: + name: Build wheels on ${{ matrix.os }} (compiler ${{ matrix.compiler-version }}) runs-on: ${{ matrix.os }} strategy: fail-fast: false matrix: - python-version: ["3.10","3.11","3.12","3.13"] - os: [ubuntu-latest, windows-latest] #, macos-latest] - compiler: [gcc] - compiler-version: [13, 15] - exclude: - - os: windows-latest - compiler-version: 15 + include: - os: ubuntu-latest + compiler: gcc + compiler-version: 15 + - os: windows-latest + compiler: gcc compiler-version: 13 steps: @@ -31,55 +30,147 @@ jobs: uses: fortran-lang/setup-fortran@v1 id: setup-fortran with: - compiler: ${{ matrix.toolchain.compiler }} - version: ${{ matrix.toolchain.version }} + compiler: ${{ matrix.compiler }} + version: ${{ matrix.compiler-version }} - name: Checkout - uses: actions/checkout@v5 + uses: actions/checkout@v6 with: submodules: recursive - - - name: Set up Python ${{ matrix.python-version }} - uses: actions/setup-python@v5 - with: - python-version: ${{ matrix.python-version }} - architecture: 'x64' - cache: 'pip' - - - name: show-versions + fetch-depth: 0 + + - name: Show compiler versions run: | gcc --version gfortran --version - - - name: Install dependencies - run: | - python -m pip install --upgrade pip - python -m pip install click numpy pandas matplotlib build wheel setuptools setuptools_scm meson-python pytest ninja - - name: Install Patchelf - if: runner.os == 'Linux' - run: | - python -m pip install patchelf - - - name: Build and package - run: | - python -m build --no-isolation - - - name: Store Wheel - uses: actions/upload-artifact@v4 + - name: Build wheels + uses: pypa/cibuildwheel@v3.4.1 + env: + # Build for Python 3.10–3.13, 64-bit only + CIBW_BUILD: cp310-* cp311-* cp312-* cp313-* cp314-* + CIBW_SKIP: "*-win32 *-manylinux_i686 *-musllinux*" + CIBW_ARCHS_LINUX: x86_64 + CIBW_ARCHS_WINDOWS: AMD64 + + # Use manylinux_2_28 to get a gfortran-15-capable image + CIBW_MANYLINUX_X86_64_IMAGE: quay.io/pypa/manylinux_2_28_x86_64 + + # Install build dependencies inside the wheel-build environment + CIBW_BEFORE_BUILD_LINUX: | + dnf install -y gcc-gfortran ninja-build && + pip install click numpy pandas build wheel setuptools setuptools_scm meson-python ninja patchelf + + CIBW_BEFORE_BUILD_WINDOWS: | + pip install click numpy pandas build wheel setuptools setuptools_scm meson-python ninja + + CIBW_BUILD_FRONTEND: "build" + CIBW_BUILD_VERBOSITY: 1 + + with: + output-dir: dist + + - name: Store wheels + uses: actions/upload-artifact@v7 with: - name: pyfvs-${{ runner.os }}-py${{ matrix.python-version }}-wheels + name: pyfvs-${{ matrix.os }}-wheels path: dist/*.whl if-no-files-found: warn overwrite: true - - - name: Store Sdist - uses: actions/upload-artifact@v4 + + make-sdist: + name: Build source distribution + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v6 + with: + submodules: recursive + fetch-depth: 0 + + - name: Set up Python + uses: actions/setup-python@v6 + with: + python-version: "3.13" + architecture: x64 + cache: pip + + - name: Install build dependencies + run: | + python -m pip install --upgrade pip + python -m pip install click numpy pandas build wheel \ + setuptools setuptools_scm meson-python ninja patchelf + + - name: Create sdist + run: python -m build --sdist --no-isolation + + - name: Store sdist + uses: actions/upload-artifact@v7 with: name: pyfvs-sdist path: dist/*.tar.gz if-no-files-found: warn overwrite: true -# - name: Test with pytest -# run: | -# pytest + + publish-testpypi: + name: Publish to TestPyPI (dev branch) + if: github.event_name == 'push' && github.ref == 'refs/heads/dev' + needs: [ make-wheels, make-sdist ] + runs-on: ubuntu-latest + environment: + name: testpypi + url: https://test.pypi.org/p/pyfvs + permissions: + id-token: write # Required for OIDC trusted publishing + + steps: + - name: Download all wheels + uses: actions/download-artifact@v4 + with: + pattern: pyfvs-*-wheels + path: dist + merge-multiple: true + + - name: Download sdist + uses: actions/download-artifact@v4 + with: + name: pyfvs-sdist + path: dist + + - name: Publish to TestPyPI + uses: pypa/gh-action-pypi-publish@release/v1 + with: + repository-url: https://test.pypi.org/legacy/ + skip-existing: true + verbose: true + + publish-pypi: + name: Publish to PyPI (main branch) + if: github.event_name == 'push' && github.ref == 'refs/heads/main' + needs: [ make-wheels, make-sdist ] + runs-on: ubuntu-latest + environment: + name: pypi + url: https://pypi.org/p/pyfvs + permissions: + id-token: write # Required for OIDC trusted publishing + + steps: + - name: Download all wheels + uses: actions/download-artifact@v4 + with: + pattern: pyfvs-*-wheels + path: dist + merge-multiple: true + + - name: Download sdist + uses: actions/download-artifact@v4 + with: + name: pyfvs-sdist + path: dist + + - name: Publish to PyPI + uses: pypa/gh-action-pypi-publish@release/v1 + with: + skip-existing: true + verbose: true \ No newline at end of file diff --git a/README.md b/README.md index c517aebe7..39e996026 100644 --- a/README.md +++ b/README.md @@ -16,6 +16,15 @@ Python wrappers and utilities for using the Forest Vegetation Simulator The PyFVS [FVS source code](https://github.com/forest-modeling/ForestVegetationSimulator/tree/open-dev) is forked from the [USFS FVS GitHub](https://github.com/USDAForestService/ForestVegetationSimulator) repository, [open-dev](https://github.com/USDAForestService/ForestVegetationSimulator/tree/open-dev) branch + _____ ______ __ __ _____ + | __ \ | ____|\ \ / / / ____| + | |__) | _ _ | |__ \ \ / / | (____ + | ___/ | | | | | __| \ \/ / \___ \ + | | | |__| | | | \ / ____) | + |_| \____ | |_| \/ |______/ + __/ | + |___/ + ## Documentation Check out the new AI generated documentation [wiki](https://deepwiki.com/forest-modeling/PyFVS). diff --git a/meson.build b/meson.build index c60dbfb45..cf2c5c666 100644 --- a/meson.build +++ b/meson.build @@ -358,8 +358,8 @@ foreach variant : variants variant_args += '-DFVS_MORTS_WRAP' # Add the wrappers to the file lists - f_sources += 'api/variant/@0@/morts_fvs.f'.format(variant) - f90_sources += 'api/morts_wrap.f90' + f_sources += 'src/api/variant/@0@/morts_fvs.f'.format(variant) + f90_sources += 'src/api/morts_wrap.f90' endif @@ -368,7 +368,7 @@ foreach variant : variants conf_data = configuration_data() conf_data.set('variant', variant) configure_file( - input: 'api/globals.f90.in', + input: 'src/api/globals.f90.in', output: variant + '_globals.f90', configuration: conf_data ) @@ -377,26 +377,26 @@ foreach variant : variants f90_sources += join_paths(meson.project_build_root(), variant + '_globals.f90') # Additional API files to compile - # f90_sources += 'api/apisubs.f90' - - f90_sources += 'api/version.f90' - f90_sources += 'api/fvs_api.f90' - # f90_sources += 'api/sim_monitor.f90' - # f90_sources += 'api/initialize.f90' - f90_sources += 'api/inventory_trees.f90' - f90_sources += 'api/fvs_step.f90' - f90_sources += 'api/tree_data.f90' - f90_sources += 'api/snag_data.f90' - f90_sources += 'api/carbon_data.f90' - f90_sources += 'api/downwood_data.f90' - # f90_sources += 'api/step_tregro.f90' - f90_sources += 'api/prtrls_wrap.f90' - # f90_sources += 'api/stop_wrap.f90' - # f90_sources += 'api/foo.f90' - # f90_sources += 'api/test.f90' + # f90_sources += 'src/api/apisubs.f90' + + f90_sources += 'src/api/version.f90' + f90_sources += 'src/api/fvs_api.f90' + # f90_sources += 'src/api/sim_monitor.f90' + # f90_sources += 'src/api/initialize.f90' + f90_sources += 'src/api/inventory_trees.f90' + f90_sources += 'src/api/fvs_step.f90' + f90_sources += 'src/api/tree_data.f90' + f90_sources += 'src/api/snag_data.f90' + f90_sources += 'src/api/carbon_data.f90' + f90_sources += 'src/api/downwood_data.f90' + # f90_sources += 'src/api/step_tregro.f90' + f90_sources += 'src/api/prtrls_wrap.f90' + # f90_sources += 'src/api/stop_wrap.f90' + # f90_sources += 'src/api/foo.f90' + # f90_sources += 'src/api/test.f90' # ## TODO: Auto-generate F90 includes from F77 - # f90_inc_dirs += 'api/gen/@0@/include'.format(variant) + # f90_inc_dirs += 'src/api/gen/@0@/include'.format(variant) # # Add the include folders as a dependency to trigger # inc_dep = declare_dependency( @@ -537,4 +537,4 @@ foreach variant : variants # End variant loop endforeach -subdir('pyfvs') +subdir('src/pyfvs') diff --git a/meson_options.txt b/meson_options.txt index 1bb80dc6c..575929a96 100644 --- a/meson_options.txt +++ b/meson_options.txt @@ -1,9 +1,9 @@ option('fvsvariants', type: 'array', choices: ['pn','wc','so','op','oc','ec','ca','nc','bm','ie','ci','ak','ws'], #,'em','tt','cr','ut','ls','cs','sn','ne'], - value: ['pn','wc','so','op','oc','ec','ca','nc','bm','ie','ci','ak','ws'], #,'em','tt','cr','ut','ls','cs','sn','ne'], + # value: ['pn','wc','so','op','oc','ec','ca','nc','bm','ie','ci','ak','ws'], #,'em','tt','cr','ut','ls','cs','sn','ne'], # value: ['pn','wc','so','op','oc','ec','ca','nc','bm'], # value: ['ie','ci','ak',], - # value: ['pn',], + value: ['pn',], # value: ['ws',], description: 'FVS variants to build' ) \ No newline at end of file diff --git a/pixi.lock b/pixi.lock index c0c54ffc5..0178333e5 100644 --- a/pixi.lock +++ b/pixi.lock @@ -12,45 +12,45 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-20_gnu.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/binutils_impl_linux-64-2.45.1-default_hfdba357_102.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hda65f42_9.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/conda-gcc-specs-15.2.0-h53410ce_18.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/gcc-15.2.0-h0dff253_18.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/gcc_impl_linux-64-15.2.0-he420e7e_18.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/gfortran-15.2.0-h834e499_7.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/gfortran_impl_linux-64-15.2.0-h281d09f_18.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/gxx-15.2.0-h834e499_7.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/gxx_impl_linux-64-15.2.0-hda75c37_18.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/conda-gcc-specs-15.2.0-h53410ce_19.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gcc-15.2.0-h0dff253_19.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gcc_impl_linux-64-15.2.0-he0086c7_19.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gfortran-15.2.0-h76987e4_19.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gfortran_impl_linux-64-15.2.0-h281d09f_19.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gxx-15.2.0-h76987e4_19.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gxx_impl_linux-64-15.2.0-hda75c37_19.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.45.1-default_hbd61a6d_102.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libblas-3.11.0-6_h4a7cf45_openblas.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.11.0-6_h0358290_openblas.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.8.0-hecca717_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libblas-3.11.0-7_h4a7cf45_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.11.0-7_h0358290_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.8.1-hecca717_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.5.2-h3435931_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.2.0-he0feb66_18.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran-15.2.0-h69a702a_18.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-15.2.0-h68bc16d_18.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.2.0-he0feb66_18.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.11.0-6_h47877c9_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.2.0-he0feb66_19.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran-15.2.0-h69a702a_19.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-15.2.0-h68bc16d_19.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.2.0-he0feb66_19.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.11.0-7_h47877c9_openblas.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.3-hb03c661_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libmpdec-4.0.0-hb03c661_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.32-pthreads_h94d23a6_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libsanitizer-15.2.0-h90f66d4_18.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.33-pthreads_h94d23a6_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libsanitizer-15.2.0-h90f66d4_19.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.53.1-h0c1763c_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.2.0-h934c35e_18.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.42-h5347b49_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.2.0-h934c35e_19.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.42.1-h5347b49_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.2-h25fd6f3_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.6-hdb14827_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/ninja-1.13.2-h171cf75_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/numpy-2.4.3-py313hf6604e3_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/openpyxl-3.1.5-py313ha4be090_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/numpy-2.4.6-py314h2b28147_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/openpyxl-3.1.5-py314hf3b76af_3.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.2-h35e630c_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/pandas-3.0.2-py313hbfd7664_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.13.13-h6add32d_100_cp313.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.3-py313h3dea7bd_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pandas-3.0.3-py314hb4ffadd_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.14.5-habeac84_100_cp314.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.3-py314h67df5f8_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.3-h853b02a_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h366c992_103.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-h280c20c_3.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb78ec9c_6.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.4.22-hbd8a1cb_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/click-8.3.3-pyhc90fa1f_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.5.20-hbd8a1cb_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/click-8.4.0-pyhc90fa1f_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/confuse-2.2.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/et_xmlfile-2.0.0-pyhd8ed1ab_1.conda @@ -58,8 +58,8 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.8.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/kernel-headers_linux-64-4.18.0-he073ed8_9.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/libgcc-devel_linux-64-15.2.0-hcc6f6b0_118.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/libstdcxx-devel_linux-64-15.2.0-hd446a21_118.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/libgcc-devel_linux-64-15.2.0-hcc6f6b0_119.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/libstdcxx-devel_linux-64-15.2.0-hd446a21_119.conda - conda: https://conda.anaconda.org/conda-forge/noarch/meson-1.11.1-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/meson-python-0.19.0-pyh7e86bf3_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.2-pyhc364b38_0.conda @@ -69,7 +69,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/pyproject-metadata-0.11.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-9.0.3-pyhc364b38_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.13-8_cp313.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.14-8_cp314.conda - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-82.0.1-pyh332efcf_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-scm-9.2.2-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools_scm-9.2.2-hd8ed1ab_0.conda @@ -80,7 +80,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/wheel-0.47.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-4.1.0-pyhcf101f3_0.conda - pypi: https://files.pythonhosted.org/packages/0d/fe/6bea5c9162869c5beba5d9c8abbed835ec85bf1ec1fba05a3822325c45f3/build-1.5.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/bd/24/12818598c362d7f300f18e74db45963dbcb85150324092410c8b49405e42/pyproject_hooks-1.2.0-py3-none-any.whl packages: @@ -121,59 +121,59 @@ packages: purls: [] size: 260182 timestamp: 1771350215188 -- conda: https://conda.anaconda.org/conda-forge/linux-64/conda-gcc-specs-15.2.0-h53410ce_18.conda - sha256: 031dc4af908cf604039f0a02b0ce86c52609bb1adedeeb66f0d9f23894339095 - md5: bdc9bf8cb0635231c4a14cc1b4f3b19f +- conda: https://conda.anaconda.org/conda-forge/linux-64/conda-gcc-specs-15.2.0-h53410ce_19.conda + sha256: 1a53d0bd9d8197a7dc57f9b154e24d908ade29934e0a450ee6e40294d0a237f9 + md5: 3b482cadfc77f094c8b3016166292dfb depends: - gcc_impl_linux-64 >=15.2.0,<15.2.1.0a0 license: GPL-3.0-only WITH GCC-exception-3.1 license_family: GPL purls: [] - size: 31688 - timestamp: 1771378484515 -- conda: https://conda.anaconda.org/conda-forge/linux-64/gcc-15.2.0-h0dff253_18.conda - sha256: 2b9dd26eb0c1d4ff93a1c87ff3a7fa81454f9b73c29aa7cdb439d067b03f7ced - md5: 9a992f62edc4c3858cf5838360643b41 + size: 31857 + timestamp: 1778269225076 +- conda: https://conda.anaconda.org/conda-forge/linux-64/gcc-15.2.0-h0dff253_19.conda + sha256: 54a0d9ee655ba83b78b7a796f12224b26c24943d8970559ecc47ccd6c2b0fa72 + md5: 18ec2ee87e4f532afa459ce8ea9a6b02 depends: - conda-gcc-specs - - gcc_impl_linux-64 15.2.0 he420e7e_18 + - gcc_impl_linux-64 15.2.0 he0086c7_19 license: BSD-3-Clause license_family: BSD purls: [] - size: 29458 - timestamp: 1771378644331 -- conda: https://conda.anaconda.org/conda-forge/linux-64/gcc_impl_linux-64-15.2.0-he420e7e_18.conda - sha256: a088cfd3ae6fa83815faa8703bc9d21cc915f17bd1b51aac9c16ddf678da21e4 - md5: cf56b6d74f580b91fd527e10d9a2e324 + size: 29561 + timestamp: 1778269371353 +- conda: https://conda.anaconda.org/conda-forge/linux-64/gcc_impl_linux-64-15.2.0-he0086c7_19.conda + sha256: a48400ec4b73369c1c59babe4ad35821b63a88bba0ec40a80cea5f8c53a26b83 + md5: e3be72048d3c4a78b8e27ec48ba06252 depends: - binutils_impl_linux-64 >=2.45 - libgcc >=15.2.0 - - libgcc-devel_linux-64 15.2.0 hcc6f6b0_118 + - libgcc-devel_linux-64 15.2.0 hcc6f6b0_119 - libgomp >=15.2.0 - - libsanitizer 15.2.0 h90f66d4_18 + - libsanitizer 15.2.0 h90f66d4_19 - libstdcxx >=15.2.0 - - libstdcxx-devel_linux-64 15.2.0 hd446a21_118 + - libstdcxx-devel_linux-64 15.2.0 hd446a21_119 - sysroot_linux-64 license: GPL-3.0-only WITH GCC-exception-3.1 license_family: GPL purls: [] - size: 81814135 - timestamp: 1771378369317 -- conda: https://conda.anaconda.org/conda-forge/linux-64/gfortran-15.2.0-h834e499_7.conda - sha256: a5277a67ae468bd4e40c6b16562e75570ef78ff552668b8cc923ac41da6e2519 - md5: 874a0d5dd4125089d5d162475632c511 - depends: - - gcc 15.2.0.* - - gcc_impl_linux-64 15.2.0.* - - gfortran_impl_linux-64 15.2.0.* + size: 81180457 + timestamp: 1778269124617 +- conda: https://conda.anaconda.org/conda-forge/linux-64/gfortran-15.2.0-h76987e4_19.conda + sha256: c28bad33cd4f2a9bf446b31d9a97239523ceac8f3df687cdedf57a1757fc627d + md5: 719d4005440d547e84a412cef5bbf923 + depends: + - gcc 15.2.0 h0dff253_19 + - gcc_impl_linux-64 15.2.0 he0086c7_19 + - gfortran_impl_linux-64 15.2.0 h281d09f_19 license: BSD-3-Clause license_family: BSD purls: [] - size: 30494 - timestamp: 1759968625766 -- conda: https://conda.anaconda.org/conda-forge/linux-64/gfortran_impl_linux-64-15.2.0-h281d09f_18.conda - sha256: 737c191cc768822d3d2ace8650e0cbec5edc4b48c63024876d0e6b0b5f120be2 - md5: d19ccc223bcd1d4e3f6b5884b7b58add + size: 28912 + timestamp: 1778269380630 +- conda: https://conda.anaconda.org/conda-forge/linux-64/gfortran_impl_linux-64-15.2.0-h281d09f_19.conda + sha256: 2f6a962bfcb74b8262dc0af5cf0716acbd96f769a0443dd231d1041c222b0ca6 + md5: 5d4fdb7935b8aa1cdb2e22ef8958101e depends: - gcc_impl_linux-64 >=15.2.0 - libgcc >=15.2.0 @@ -183,32 +183,32 @@ packages: license: GPL-3.0-only WITH GCC-exception-3.1 license_family: GPL purls: [] - size: 20044877 - timestamp: 1771378561135 -- conda: https://conda.anaconda.org/conda-forge/linux-64/gxx-15.2.0-h834e499_7.conda - sha256: daa8be8e1ee8b01a4f632e421ff0fb7dcbf6aabfb036fc67f61495775fb576b8 - md5: d9e0c692abcf86b9b259825454b0ae40 - depends: - - gcc 15.2.0.* - - gxx_impl_linux-64 15.2.0.* + size: 20041854 + timestamp: 1778269291096 +- conda: https://conda.anaconda.org/conda-forge/linux-64/gxx-15.2.0-h76987e4_19.conda + sha256: b00817919d7b2d68e3299031c5332855576ae086ac80032aa0a78b7f6f12dae4 + md5: 327876a856b3a45001cfb9a855efa65f + depends: + - gcc 15.2.0 h0dff253_19 + - gxx_impl_linux-64 15.2.0 hda75c37_19 license: BSD-3-Clause license_family: BSD purls: [] - size: 30506 - timestamp: 1759968643632 -- conda: https://conda.anaconda.org/conda-forge/linux-64/gxx_impl_linux-64-15.2.0-hda75c37_18.conda - sha256: 48946f1f43d699b68123fb39329ef5acf3d9cbf8f96bdb8fb14b6197f5402825 - md5: e39123ab71f2e4cf989aa6aa5fafdaaf - depends: - - gcc_impl_linux-64 15.2.0 he420e7e_18 - - libstdcxx-devel_linux-64 15.2.0 hd446a21_118 + size: 28945 + timestamp: 1778269389494 +- conda: https://conda.anaconda.org/conda-forge/linux-64/gxx_impl_linux-64-15.2.0-hda75c37_19.conda + sha256: 3f5288346b9fe233352443b3c2e31f1fde845e39d3e96475fc05ec2e782af158 + md5: 9d41f3899b512199af0a4bb939b83e21 + depends: + - gcc_impl_linux-64 15.2.0 he0086c7_19 + - libstdcxx-devel_linux-64 15.2.0 hd446a21_119 - sysroot_linux-64 - tzdata license: GPL-3.0-only WITH GCC-exception-3.1 license_family: GPL purls: [] - size: 15587873 - timestamp: 1771378609722 + size: 16356816 + timestamp: 1778269332159 - conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.45.1-default_hbd61a6d_102.conda sha256: 3d584956604909ff5df353767f3a2a2f60e07d070b328d109f30ac40cd62df6c md5: 18335a698559cdbcd86150a48bf54ba6 @@ -222,52 +222,52 @@ packages: purls: [] size: 728002 timestamp: 1774197446916 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libblas-3.11.0-6_h4a7cf45_openblas.conda - build_number: 6 - sha256: 7bfe936dbb5db04820cf300a9cc1f5ee8d5302fc896c2d66e30f1ee2f20fbfd6 - md5: 6d6d225559bfa6e2f3c90ee9c03d4e2e +- conda: https://conda.anaconda.org/conda-forge/linux-64/libblas-3.11.0-7_h4a7cf45_openblas.conda + build_number: 7 + sha256: 081c850f99bc355821fac9c6e3727d40b3f8ce3beb50a5437cf03726b611ff39 + md5: 955b44e8b00b7f7ef4ce0130cef12394 depends: - - libopenblas >=0.3.32,<0.3.33.0a0 - - libopenblas >=0.3.32,<1.0a0 + - libopenblas >=0.3.33,<0.3.34.0a0 + - libopenblas >=0.3.33,<1.0a0 constrains: - - blas 2.306 openblas - - liblapack 3.11.0 6*_openblas - - liblapacke 3.11.0 6*_openblas - - libcblas 3.11.0 6*_openblas - - mkl <2026 + - libcblas 3.11.0 7*_openblas + - blas 2.307 openblas + - liblapack 3.11.0 7*_openblas + - liblapacke 3.11.0 7*_openblas + - mkl <2027 license: BSD-3-Clause license_family: BSD purls: [] - size: 18621 - timestamp: 1774503034895 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.11.0-6_h0358290_openblas.conda - build_number: 6 - sha256: 57edafa7796f6fa3ebbd5367692dd4c7f552be42109c2dd1a7c89b55089bf374 - md5: 36ae340a916635b97ac8a0655ace2a35 - depends: - - libblas 3.11.0 6_h4a7cf45_openblas + size: 18716 + timestamp: 1778489854108 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.11.0-7_h0358290_openblas.conda + build_number: 7 + sha256: 956ae0bb1ec8b0c3663d75b151aceb0521b54e513bf97f621a035f9c87037970 + md5: 0675639dc24cb0032f199e7ff68e4633 + depends: + - libblas 3.11.0 7_h4a7cf45_openblas constrains: - - blas 2.306 openblas - - liblapack 3.11.0 6*_openblas - - liblapacke 3.11.0 6*_openblas + - liblapacke 3.11.0 7*_openblas + - blas 2.307 openblas + - liblapack 3.11.0 7*_openblas license: BSD-3-Clause license_family: BSD purls: [] - size: 18622 - timestamp: 1774503050205 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.8.0-hecca717_0.conda - sha256: ea33c40977ea7a2c3658c522230058395bc2ee0d89d99f0711390b6a1ee80d12 - md5: a3b390520c563d78cc58974de95a03e5 + size: 18675 + timestamp: 1778489861559 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.8.1-hecca717_0.conda + sha256: 363018b25fdb5534c79783d912bd4b685a3547f4fc5996357ad548899b0ee8e7 + md5: 93764a5ca80616e9c10106cdaec92f74 depends: - __glibc >=2.17,<3.0.a0 - libgcc >=14 constrains: - - expat 2.8.0.* + - expat 2.8.1.* license: MIT license_family: MIT purls: [] - size: 77241 - timestamp: 1777846112704 + size: 77294 + timestamp: 1779278686680 - conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.5.2-h3435931_0.conda sha256: 31f19b6a88ce40ebc0d5a992c131f57d919f73c0b92cd1617a5bec83f6e961e6 md5: a360c33a5abe61c07959e449fa1453eb @@ -279,35 +279,35 @@ packages: purls: [] size: 58592 timestamp: 1769456073053 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.2.0-he0feb66_18.conda - sha256: faf7d2017b4d718951e3a59d081eb09759152f93038479b768e3d612688f83f5 - md5: 0aa00f03f9e39fb9876085dee11a85d4 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.2.0-he0feb66_19.conda + sha256: 8e0a3b5e41272e5678499b5dfc4cddb673f9e935de01eb0767ce857001229f46 + md5: 57736f29cc2b0ec0b6c2952d3f101b6a depends: - __glibc >=2.17,<3.0.a0 - _openmp_mutex >=4.5 constrains: - - libgcc-ng ==15.2.0=*_18 - - libgomp 15.2.0 he0feb66_18 + - libgcc-ng ==15.2.0=*_19 + - libgomp 15.2.0 he0feb66_19 license: GPL-3.0-only WITH GCC-exception-3.1 license_family: GPL purls: [] - size: 1041788 - timestamp: 1771378212382 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran-15.2.0-h69a702a_18.conda - sha256: d2c9fad338fd85e4487424865da8e74006ab2e2475bd788f624d7a39b2a72aee - md5: 9063115da5bc35fdc3e1002e69b9ef6e + size: 1041084 + timestamp: 1778269013026 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran-15.2.0-h69a702a_19.conda + sha256: 561a42758ef25b9ce308c4e2cf56daee4f06138385a17e29a492cd928e00be6f + md5: 42bf7eca1a951735fa06c0e3c0d5c8e6 depends: - - libgfortran5 15.2.0 h68bc16d_18 + - libgfortran5 15.2.0 h68bc16d_19 constrains: - - libgfortran-ng ==15.2.0=*_18 + - libgfortran-ng ==15.2.0=*_19 license: GPL-3.0-only WITH GCC-exception-3.1 license_family: GPL purls: [] - size: 27523 - timestamp: 1771378269450 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-15.2.0-h68bc16d_18.conda - sha256: 539b57cf50ec85509a94ba9949b7e30717839e4d694bc94f30d41c9d34de2d12 - md5: 646855f357199a12f02a87382d429b75 + size: 27655 + timestamp: 1778269042954 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-15.2.0-h68bc16d_19.conda + sha256: 057978bb69fea29ed715a9b98adf71015c31baecc4aeb2bfc20d4fd5d83579d4 + md5: 85072b0ad177c966294f129b7c04a2d5 depends: - __glibc >=2.17,<3.0.a0 - libgcc >=15.2.0 @@ -316,33 +316,33 @@ packages: license: GPL-3.0-only WITH GCC-exception-3.1 license_family: GPL purls: [] - size: 2482475 - timestamp: 1771378241063 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.2.0-he0feb66_18.conda - sha256: 21337ab58e5e0649d869ab168d4e609b033509de22521de1bfed0c031bfc5110 - md5: 239c5e9546c38a1e884d69effcf4c882 + size: 2483673 + timestamp: 1778269025089 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.2.0-he0feb66_19.conda + sha256: 5abe4ab9d93f6c9757d654f1969ae2267d4505315c1f2f8fe705fd60af084f1b + md5: faac990cb7aedc7f3a2224f2c9b0c26c depends: - __glibc >=2.17,<3.0.a0 license: GPL-3.0-only WITH GCC-exception-3.1 license_family: GPL purls: [] - size: 603262 - timestamp: 1771378117851 -- conda: https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.11.0-6_h47877c9_openblas.conda - build_number: 6 - sha256: 371f517eb7010b21c6cc882c7606daccebb943307cb9a3bf2c70456a5c024f7d - md5: 881d801569b201c2e753f03c84b85e15 - depends: - - libblas 3.11.0 6_h4a7cf45_openblas + size: 603817 + timestamp: 1778268942614 +- conda: https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.11.0-7_h47877c9_openblas.conda + build_number: 7 + sha256: 96962084921f197c9ad13fb7f8b324f2351d50ff3d8d962148751ad532f54a01 + md5: 6569b4f273740e25dc0dc7e3232c2a6c + depends: + - libblas 3.11.0 7_h4a7cf45_openblas constrains: - - blas 2.306 openblas - - liblapacke 3.11.0 6*_openblas - - libcblas 3.11.0 6*_openblas + - liblapacke 3.11.0 7*_openblas + - libcblas 3.11.0 7*_openblas + - blas 2.307 openblas license: BSD-3-Clause license_family: BSD purls: [] - size: 18624 - timestamp: 1774503065378 + size: 18694 + timestamp: 1778489869038 - conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.3-hb03c661_0.conda sha256: ec30e52a3c1bf7d0425380a189d209a52baa03f22fb66dd3eb587acaa765bd6d md5: b88d90cad08e6bc8ad540cb310a761fb @@ -366,24 +366,24 @@ packages: purls: [] size: 92400 timestamp: 1769482286018 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.32-pthreads_h94d23a6_0.conda - sha256: 6dc30b28f32737a1c52dada10c8f3a41bc9e021854215efca04a7f00487d09d9 - md5: 89d61bc91d3f39fda0ca10fcd3c68594 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.33-pthreads_h94d23a6_0.conda + sha256: 3d9aa85648e5e18a6d66db98b8c4317cc426721ad7a220aa86330d1ccedc8903 + md5: 2d3278b721e40468295ca755c3b84070 depends: - __glibc >=2.17,<3.0.a0 - libgcc >=14 - libgfortran - libgfortran5 >=14.3.0 constrains: - - openblas >=0.3.32,<0.3.33.0a0 + - openblas >=0.3.33,<0.3.34.0a0 license: BSD-3-Clause license_family: BSD purls: [] - size: 5928890 - timestamp: 1774471724897 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libsanitizer-15.2.0-h90f66d4_18.conda - sha256: 0329e23d54a567c259adc962a62172eaa55e6ca33c105ef67b4f3cdb4ef70eaa - md5: ff754fbe790d4e70cf38aea3668c3cb3 + size: 5931919 + timestamp: 1776993658641 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libsanitizer-15.2.0-h90f66d4_19.conda + sha256: 7a58892a52739ce4c0f7109de9e91b4353104748eb04fc6441d88e8af444ba99 + md5: 67eef12ce33f7ff99900c212d7076fc2 depends: - __glibc >=2.17,<3.0.a0 - libgcc >=15.2.0 @@ -391,8 +391,8 @@ packages: license: GPL-3.0-only WITH GCC-exception-3.1 license_family: GPL purls: [] - size: 8095113 - timestamp: 1771378289674 + size: 7930689 + timestamp: 1778269054623 - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.53.1-h0c1763c_0.conda sha256: 54cdcd3214313b62c2a8ee277e6f42150d9b748264c1b70d958bf735e420ef8d md5: 7dc38adcbf71e6b38748e919e16e0dce @@ -404,30 +404,30 @@ packages: purls: [] size: 954962 timestamp: 1777986471789 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.2.0-h934c35e_18.conda - sha256: 78668020064fdaa27e9ab65cd2997e2c837b564ab26ce3bf0e58a2ce1a525c6e - md5: 1b08cd684f34175e4514474793d44bcb +- conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.2.0-h934c35e_19.conda + sha256: dff1058c76ec6b8759e41cefa2508162d00e4a5e6721aa68ec3fd10094e702dc + md5: 5794b3bdc38177caf969dabd3af08549 depends: - __glibc >=2.17,<3.0.a0 - - libgcc 15.2.0 he0feb66_18 + - libgcc 15.2.0 he0feb66_19 constrains: - - libstdcxx-ng ==15.2.0=*_18 + - libstdcxx-ng ==15.2.0=*_19 license: GPL-3.0-only WITH GCC-exception-3.1 license_family: GPL purls: [] - size: 5852330 - timestamp: 1771378262446 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.42-h5347b49_0.conda - sha256: bc1b08c92626c91500fd9f26f2c797f3eb153b627d53e9c13cd167f1e12b2829 - md5: 38ffe67b78c9d4de527be8315e5ada2c + size: 5852044 + timestamp: 1778269036376 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.42.1-h5347b49_0.conda + sha256: 3f0edf1280e2f6684a986f821eaa3e123d2694a00b31b96ca0d4a4c12c129231 + md5: 7d0a66598195ef00b6efc55aefc7453b depends: - __glibc >=2.17,<3.0.a0 - libgcc >=14 license: BSD-3-Clause license_family: BSD purls: [] - size: 40297 - timestamp: 1775052476770 + size: 40163 + timestamp: 1779118517630 - conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.2-h25fd6f3_2.conda sha256: 55044c403570f0dc26e6364de4dc5368e5f3fc7ff103e867c487e2b5ab2bcda9 md5: d87ff7921124eccd67248aa483c23fec @@ -462,40 +462,40 @@ packages: purls: [] size: 186323 timestamp: 1763688260928 -- conda: https://conda.anaconda.org/conda-forge/linux-64/numpy-2.4.3-py313hf6604e3_0.conda - sha256: bcf75998ea3ae133df3580fb427d1054b006b093799430f499fd7ce8207d34c7 - md5: c4a9d2e77eb9fee983a70cf5f047c202 +- conda: https://conda.anaconda.org/conda-forge/linux-64/numpy-2.4.6-py314h2b28147_0.conda + sha256: bc61ae892973751a6b0e6ecea57ed6d7053224bddcb007165d6ceb1d7344ad47 + md5: f49b5f950379e0b97c35ca97682f7c6a depends: - python - libstdcxx >=14 - libgcc >=14 - __glibc >=2.17,<3.0.a0 - - python_abi 3.13.* *_cp313 - - libcblas >=3.9.0,<4.0a0 - liblapack >=3.9.0,<4.0a0 + - python_abi 3.14.* *_cp314 - libblas >=3.9.0,<4.0a0 + - libcblas >=3.9.0,<4.0a0 constrains: - numpy-base <0a0 license: BSD-3-Clause license_family: BSD purls: - - pkg:pypi/numpy?source=hash-mapping - size: 8857056 - timestamp: 1773839226294 -- conda: https://conda.anaconda.org/conda-forge/linux-64/openpyxl-3.1.5-py313ha4be090_3.conda - sha256: ee3e071cbc0be5600747631b41da17349be6fd25c982c9a9644cda3953bbf8b5 - md5: 993d27015ca7aa1de3f4a471a9b5309e + - pkg:pypi/numpy?source=compressed-mapping + size: 8928909 + timestamp: 1779169198391 +- conda: https://conda.anaconda.org/conda-forge/linux-64/openpyxl-3.1.5-py314hf3b76af_3.conda + sha256: 7a6c2355af80e8d1e9a851347dc4f5e737a21da8ebeb7f6e4b9889eb8a0186a2 + md5: bc90b1901f01e0772c74e24b6f931137 depends: - et_xmlfile - libgcc >=14 - - python >=3.13,<3.14.0a0 - - python_abi 3.13.* *_cp313 + - python >=3.14,<3.15.0a0 + - python_abi 3.14.* *_cp314 license: MIT license_family: MIT purls: - pkg:pypi/openpyxl?source=hash-mapping - size: 484606 - timestamp: 1769122088626 + size: 488593 + timestamp: 1769122083134 - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.2-h35e630c_0.conda sha256: c0ef482280e38c71a08ad6d71448194b719630345b0c9c60744a2010e8a8e0cb md5: da1b85b6a87e141f5140bb9924cecab0 @@ -508,18 +508,18 @@ packages: purls: [] size: 3167099 timestamp: 1775587756857 -- conda: https://conda.anaconda.org/conda-forge/linux-64/pandas-3.0.2-py313hbfd7664_0.conda - sha256: 6aa7b7b234805c673fd63ef60432362e6cc130a3ae09b5ed2b40d74a2bd6c7bb - md5: 6a036e42f4e47720804f35d1897336a1 +- conda: https://conda.anaconda.org/conda-forge/linux-64/pandas-3.0.3-py314hb4ffadd_0.conda + sha256: 8e4b161f3f7fbdf17f842b518ff3794b6af9378a90d095719d7153360d126dc1 + md5: bc2e1390314b1269e66fb1966fbcae5d depends: - python - numpy >=1.26.0 - python-dateutil >=2.8.2 - - libgcc >=14 - libstdcxx >=14 + - libgcc >=14 - __glibc >=2.17,<3.0.a0 - numpy >=1.23,<3 - - python_abi 3.13.* *_cp313 + - python_abi 3.14.* *_cp314 constrains: - adbc-driver-postgresql >=1.2.0 - adbc-driver-sqlite >=1.2.0 @@ -563,50 +563,51 @@ packages: license_family: BSD purls: - pkg:pypi/pandas?source=hash-mapping - size: 14980998 - timestamp: 1774916581833 -- conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.13.13-h6add32d_100_cp313.conda + size: 15303815 + timestamp: 1778602611222 +- conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.14.5-habeac84_100_cp314.conda build_number: 100 - sha256: 7f77eb57648f545c1f58e10035d0d9d66b0a0efb7c4b58d3ed89ec7269afdde1 - md5: 05051be49267378d2fcd12931e319ac3 + sha256: 55eed9bf2a3f6e90311276f0834737fe7c2d9ec3e5e2e557507858df4c7521e6 + md5: da92e59ff92f2d5ede4f612af20f583f depends: - __glibc >=2.17,<3.0.a0 - bzip2 >=1.0.8,<2.0a0 - ld_impl_linux-64 >=2.36.1 - - libexpat >=2.7.5,<3.0a0 + - libexpat >=2.8.0,<3.0a0 - libffi >=3.5.2,<3.6.0a0 - libgcc >=14 - - liblzma >=5.8.2,<6.0a0 + - liblzma >=5.8.3,<6.0a0 - libmpdec >=4.0.0,<5.0a0 - - libsqlite >=3.52.0,<4.0a0 - - libuuid >=2.42,<3.0a0 + - libsqlite >=3.53.1,<4.0a0 + - libuuid >=2.42.1,<3.0a0 - libzlib >=1.3.2,<2.0a0 - - ncurses >=6.5,<7.0a0 + - ncurses >=6.6,<7.0a0 - openssl >=3.5.6,<4.0a0 - - python_abi 3.13.* *_cp313 + - python_abi 3.14.* *_cp314 - readline >=8.3,<9.0a0 - tk >=8.6.13,<8.7.0a0 - tzdata + - zstd >=1.5.7,<1.6.0a0 license: Python-2.0 purls: [] - size: 37358322 - timestamp: 1775614712638 - python_site_packages_path: lib/python3.13/site-packages -- conda: https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.3-py313h3dea7bd_1.conda - sha256: ef7df29b38ef04ec67a8888a4aa039973eaa377e8c4b59a7be0a1c50cd7e4ac6 - md5: f256753e840c3cd3766488c9437a8f8b + size: 36745188 + timestamp: 1779236923603 + python_site_packages_path: lib/python3.14/site-packages +- conda: https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.3-py314h67df5f8_1.conda + sha256: b318fb070c7a1f89980ef124b80a0b5ccf3928143708a85e0053cde0169c699d + md5: 2035f68f96be30dc60a5dfd7452c7941 depends: - __glibc >=2.17,<3.0.a0 - libgcc >=14 - - python >=3.13,<3.14.0a0 - - python_abi 3.13.* *_cp313 + - python >=3.14,<3.15.0a0 + - python_abi 3.14.* *_cp314 - yaml >=0.2.5,<0.3.0a0 license: MIT license_family: MIT purls: - - pkg:pypi/pyyaml?source=compressed-mapping - size: 201616 - timestamp: 1770223543730 + - pkg:pypi/pyyaml?source=hash-mapping + size: 202391 + timestamp: 1770223462836 - conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.3-h853b02a_0.conda sha256: 12ffde5a6f958e285aa22c191ca01bbd3d6e710aa852e00618fa6ddc59149002 md5: d7d95fc8287ea7bf33e0e7116d2b95ec @@ -655,18 +656,18 @@ packages: purls: [] size: 601375 timestamp: 1764777111296 -- conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.4.22-hbd8a1cb_0.conda - sha256: c9dbcc8039a52023660d6d1bbf87594a93dd69c6ac5a2a44323af2c92976728d - md5: e18ad67cf881dcadee8b8d9e2f8e5f73 +- conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.5.20-hbd8a1cb_0.conda + sha256: 9812a303a1395e1dafbd92e5bc8a1ff6013bcbba0a09c7f03a8d23e43560aa9b + md5: 489b8e97e666c93f68fdb35c3c9b957f depends: - __unix license: ISC purls: [] - size: 131039 - timestamp: 1776865545798 -- conda: https://conda.anaconda.org/conda-forge/noarch/click-8.3.3-pyhc90fa1f_0.conda - sha256: 37a5d8b10ea3516e2c42f870c9c351b9f7b31ff48c66d83490039f417e1e5228 - md5: 2266262ce8a425ecb6523d765f79b303 + size: 129868 + timestamp: 1779289852439 +- conda: https://conda.anaconda.org/conda-forge/noarch/click-8.4.0-pyhc90fa1f_0.conda + sha256: 99ab8ef815c4520cce3a7482c2513f377c14348206857661d84c76a55e030f97 + md5: 003767c47f1f0a474c4de268b57839c3 depends: - __unix - python @@ -675,8 +676,8 @@ packages: license_family: BSD purls: - pkg:pypi/click?source=compressed-mapping - size: 100048 - timestamp: 1777219902525 + size: 104631 + timestamp: 1779108494556 - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda sha256: ab29d57dc70786c1269633ba3dff20288b81664d3ff8d21af995742e2bb03287 md5: 962b9857ee8e7018c22f2776ffa0b2d7 @@ -733,7 +734,7 @@ packages: license: Apache-2.0 license_family: APACHE purls: - - pkg:pypi/importlib-metadata?source=compressed-mapping + - pkg:pypi/importlib-metadata?source=hash-mapping size: 34387 timestamp: 1773931568510 - conda: https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda @@ -757,26 +758,26 @@ packages: purls: [] size: 1278712 timestamp: 1765578681495 -- conda: https://conda.anaconda.org/conda-forge/noarch/libgcc-devel_linux-64-15.2.0-hcc6f6b0_118.conda - sha256: af69fc5852908d26e5b630b270982ac792506551dd6af1614bf0370dd5ab5746 - md5: 5d3a96d55f1be45fef88ee23155effd9 +- conda: https://conda.anaconda.org/conda-forge/noarch/libgcc-devel_linux-64-15.2.0-hcc6f6b0_119.conda + sha256: 38a557eba305468ac1f90ac85e50d8defd76141cb0b8a43b2fc1aca71dd5d5f2 + md5: 683fcb168e1df9a21fa80d5aa2d9330b depends: - __unix license: GPL-3.0-only WITH GCC-exception-3.1 license_family: GPL purls: [] - size: 3085932 - timestamp: 1771378098166 -- conda: https://conda.anaconda.org/conda-forge/noarch/libstdcxx-devel_linux-64-15.2.0-hd446a21_118.conda - sha256: 138ee40ba770abf4556ee9981879da9e33299f406a450831b48c1c397d7d0833 - md5: a50630d1810916fc252b2152f1dc9d6d + size: 3095909 + timestamp: 1778268932148 +- conda: https://conda.anaconda.org/conda-forge/noarch/libstdcxx-devel_linux-64-15.2.0-hd446a21_119.conda + sha256: a2385f3611d5cd25378f9cf2367183320731709c067ddd08d43330d3170f15b8 + md5: bcfe7eae40158c3e355d2f9d3ed41230 depends: - __unix license: GPL-3.0-only WITH GCC-exception-3.1 license_family: GPL purls: [] - size: 20669511 - timestamp: 1771378139786 + size: 20765069 + timestamp: 1778268963689 - conda: https://conda.anaconda.org/conda-forge/noarch/meson-1.11.1-pyhcf101f3_0.conda sha256: 1cd625d7358edba307e8a4d10ed15ce7c59a1dc0296b678c2111b0d76c594915 md5: ced6358cc61d7e381e68fc128f7b63db @@ -816,7 +817,7 @@ packages: license: Apache-2.0 license_family: APACHE purls: - - pkg:pypi/packaging?source=compressed-mapping + - pkg:pypi/packaging?source=hash-mapping size: 91574 timestamp: 1777103621679 - conda: https://conda.anaconda.org/conda-forge/noarch/pip-26.1.1-pyh145f28c_0.conda @@ -827,7 +828,7 @@ packages: license: MIT license_family: MIT purls: - - pkg:pypi/pip?source=compressed-mapping + - pkg:pypi/pip?source=hash-mapping size: 1199678 timestamp: 1777924078252 - conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.6.0-pyhf9edf01_1.conda @@ -839,7 +840,7 @@ packages: license: MIT license_family: MIT purls: - - pkg:pypi/pluggy?source=compressed-mapping + - pkg:pypi/pluggy?source=hash-mapping size: 25877 timestamp: 1764896838868 - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.20.0-pyhd8ed1ab_0.conda @@ -850,7 +851,7 @@ packages: license: BSD-2-Clause license_family: BSD purls: - - pkg:pypi/pygments?source=compressed-mapping + - pkg:pypi/pygments?source=hash-mapping size: 893031 timestamp: 1774796815820 - conda: https://conda.anaconda.org/conda-forge/noarch/pyproject-metadata-0.11.0-pyhd8ed1ab_0.conda @@ -883,7 +884,7 @@ packages: license: MIT license_family: MIT purls: - - pkg:pypi/pytest?source=compressed-mapping + - pkg:pypi/pytest?source=hash-mapping size: 299984 timestamp: 1775644472530 - conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda @@ -899,17 +900,17 @@ packages: - pkg:pypi/python-dateutil?source=hash-mapping size: 233310 timestamp: 1751104122689 -- conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.13-8_cp313.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.14-8_cp314.conda build_number: 8 - sha256: 210bffe7b121e651419cb196a2a63687b087497595c9be9d20ebe97dd06060a7 - md5: 94305520c52a4aa3f6c2b1ff6008d9f8 + sha256: ad6d2e9ac39751cc0529dd1566a26751a0bf2542adb0c232533d32e176e21db5 + md5: 0539938c55b6b1a59b560e843ad864a4 constrains: - - python 3.13.* *_cp313 + - python 3.14.* *_cp314 license: BSD-3-Clause license_family: BSD purls: [] - size: 7002 - timestamp: 1752805902938 + size: 6989 + timestamp: 1752805904792 - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-82.0.1-pyh332efcf_0.conda sha256: 82088a6e4daa33329a30bc26dc19a98c7c1d3f05c0f73ce9845d4eab4924e9e1 md5: 8e194e7b992f99a5015edbd4ebd38efd @@ -1021,12 +1022,12 @@ packages: license: MIT license_family: MIT purls: - - pkg:pypi/wheel?source=compressed-mapping + - pkg:pypi/wheel?source=hash-mapping size: 33491 timestamp: 1776878563806 -- conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.1-pyhcf101f3_0.conda - sha256: 523616c0530d305d2216c2b4a8dfd3872628b60083255b89c5e0d8c42e738cca - md5: e1c36c6121a7c9c76f2f148f1e83b983 +- conda: https://conda.anaconda.org/conda-forge/noarch/zipp-4.1.0-pyhcf101f3_0.conda + sha256: 210bd31c22bb88f5e2a167df24c95bb5f152b2ada7502f9b8c49d1f5366db423 + md5: ba3dcdc8584155c97c648ae9c044b7a3 depends: - python >=3.10 - python @@ -1034,8 +1035,8 @@ packages: license_family: MIT purls: - pkg:pypi/zipp?source=compressed-mapping - size: 24461 - timestamp: 1776131454755 + size: 24190 + timestamp: 1779159948016 - pypi: https://files.pythonhosted.org/packages/0d/fe/6bea5c9162869c5beba5d9c8abbed835ec85bf1ec1fba05a3822325c45f3/build-1.5.0-py3-none-any.whl name: build version: 1.5.0 diff --git a/pyfvs/pyfvs.cfg b/pyfvs/pyfvs.cfg deleted file mode 100644 index 718b70ab1..000000000 --- a/pyfvs/pyfvs.cfg +++ /dev/null @@ -1,39 +0,0 @@ -{ - 'fvs_lib':{ - 'fvslib_path':'../../bin/build/Open-FVS/python/lib' - } - - ,'logging':{ - 'version':1 - ,'disable_existing_loggers':True - ,'incremental':False - ,'formatters':{ - 'file':{ - 'format' : '%(asctime)s %(levelname)-8s %(name)-15s %(message)s' - ,'datefmt' : '%Y-%m-%d %H:%M:%S' - } - } - - ,'handlers':{ - 'console':{ - 'class':'logging.StreamHandler' - ,'level':'NOTSET' - ,'stream':'ext://sys.stdout' - } - ,'file':{ - 'class':'logging.FileHandler' - ,'filename':'./pyfvs.log' - ,'mode':'w' - ,'level':'NOTSET' - ,'formatter':'file' - } - } - ,'loggers':{ - 'pyfvs':{ - 'level':'INFO' - ,'handlers':['console','file',] - ,'propagate':False - } - } - } - } \ No newline at end of file diff --git a/pyproject.toml b/pyproject.toml index 293d950aa..2c7c86b80 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -7,9 +7,10 @@ requires = [ "meson", "meson-python>=0.15", "numpy", -# "ninja", + "ninja", "patchelf ; platform_system != 'Windows'", ## Only linux??? -# "cython" +# "cython", + "build" ] build-backend = "mesonpy" @@ -22,9 +23,17 @@ authors = [ license = {file="LICENSE.txt"} readme = {file="README.md", content-type="text/markdown"} keywords = ["Forest Modeling", "FVS"] +requires-python = ">=3.10" dynamic = ["version"] -dependencies = ["build>=1.5.0,<2"] + +dependencies = [ + "confuse>=2.0.0,<3", + "click>=8.0.0,<9", + "pandas>=2.2.2,<4", + "numpy>=2.1.0,<3", + "typing-extensions" # required by confuse + ] [project.urls] repository = "https://github.com/forest-modeling/PyFVS" @@ -32,6 +41,15 @@ repository = "https://github.com/forest-modeling/PyFVS" [project.scripts] pyfvs = "pyfvs.__main__:cli" +[dependency-groups] +test = [ + "pytest>=9.0.3,<10", + "openpyxl>=3.1.5,<4" +] +dev = [ + "pytest>=9.0.3,<10", +] + [tool.setuptools] packages = ["pyfvs",] @@ -40,7 +58,8 @@ packages = ["pyfvs",] # check out https://github.com/pypa/setuptools_scm version_scheme = "post-release" # version_scheme = "guess-next-dev" -version_file = "pyfvs/_version.py" +local_scheme = "no-local-version" +version_file = "src/pyfvs/_version.py" [tool.devpy] package = 'pyfvs' # used by pytest @@ -51,31 +70,44 @@ addopts = [ "--import-mode=importlib", ] +[tool.cibuildwheel] +test-requires = ["pytest","openpyxl"] +test-command = "pytest {project}/tests" + [tool.pixi.workspace] channels = ["conda-forge"] platforms = ["linux-64"] [tool.pixi.tasks] -build-dev = "python -m pip install --no-build-isolation -e ." +dev = "python -m pip install -e . --no-build-isolation --verbose" +build = "python -m build --no-isolation --verbose" [tool.pixi.dependencies] -python = "3.13.*" -numpy = ">=2.4.3,<3" -click = ">=8.3.3,<9" +# Python runtime and build tools +python = "3.14.*" +# Build system dependencies wheel = ">=0.47.0,<0.48" meson = ">=1.11.1,<2" meson-python = ">=0.19.0,<0.20" setuptools = ">=82.0.1,<83" setuptools_scm = ">=9.2.2,<10" +ninja = ">=1.13.2,<2" +pip = ">=26.1.1,<27" +# Compilers and toolchain gcc = ">=15.2.0,<15.3" gxx = ">=15.2.0,<15.3" gfortran = ">=15.2.0,<15.3" +# Project runtime and dev dependencies (pinned for reproducibility) +# These should be kept in sync with [project] dependencies and [dependency-groups] +numpy = ">=2.4.3,<3" pandas = ">=3.0.2,<4" -ninja = ">=1.13.2,<2" -pip = ">=26.1.1,<27" +click = ">=8.3.3,<9" confuse = ">=2.2.0,<3" pytest = ">=9.0.3,<10" openpyxl = ">=3.1.5,<4" +[tool.pixi.pypi-dependencies] +build = ">=1.5.0,<2" + [target.linux-64.dependencies] patchelf = ">=0.17.2,<0.18" diff --git a/requirements.txt b/requirements.txt index b26bb8efa..54bf1420b 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,6 +1,4 @@ numpy pandas -openpyxl -matplotlib click confuse diff --git a/api/carbon_data.f90 b/src/api/carbon_data.f90 similarity index 100% rename from api/carbon_data.f90 rename to src/api/carbon_data.f90 diff --git a/api/downwood_data.f90 b/src/api/downwood_data.f90 similarity index 100% rename from api/downwood_data.f90 rename to src/api/downwood_data.f90 diff --git a/api/fvs_api.f90 b/src/api/fvs_api.f90 similarity index 100% rename from api/fvs_api.f90 rename to src/api/fvs_api.f90 diff --git a/api/fvs_step.f90 b/src/api/fvs_step.f90 similarity index 100% rename from api/fvs_step.f90 rename to src/api/fvs_step.f90 diff --git a/api/globals.f90 b/src/api/globals.f90 similarity index 100% rename from api/globals.f90 rename to src/api/globals.f90 diff --git a/api/globals.f90.in b/src/api/globals.f90.in similarity index 100% rename from api/globals.f90.in rename to src/api/globals.f90.in diff --git a/api/inventory_trees.f90 b/src/api/inventory_trees.f90 similarity index 100% rename from api/inventory_trees.f90 rename to src/api/inventory_trees.f90 diff --git a/api/morts_wrap.f90 b/src/api/morts_wrap.f90 similarity index 100% rename from api/morts_wrap.f90 rename to src/api/morts_wrap.f90 diff --git a/api/prtrls_wrap.f90 b/src/api/prtrls_wrap.f90 similarity index 100% rename from api/prtrls_wrap.f90 rename to src/api/prtrls_wrap.f90 diff --git a/api/snag_data.f90 b/src/api/snag_data.f90 similarity index 100% rename from api/snag_data.f90 rename to src/api/snag_data.f90 diff --git a/api/tree_data.f90 b/src/api/tree_data.f90 similarity index 100% rename from api/tree_data.f90 rename to src/api/tree_data.f90 diff --git a/api/variant/pn/morts_fvs.f b/src/api/variant/pn/morts_fvs.f similarity index 100% rename from api/variant/pn/morts_fvs.f rename to src/api/variant/pn/morts_fvs.f diff --git a/api/variant/wc/morts_fvs.f b/src/api/variant/wc/morts_fvs.f similarity index 100% rename from api/variant/wc/morts_fvs.f rename to src/api/variant/wc/morts_fvs.f diff --git a/api/version.f90 b/src/api/version.f90 similarity index 100% rename from api/version.f90 rename to src/api/version.f90 diff --git a/pyfvs/README.md b/src/pyfvs/README.md similarity index 100% rename from pyfvs/README.md rename to src/pyfvs/README.md diff --git a/pyfvs/README.txt b/src/pyfvs/README.txt similarity index 100% rename from pyfvs/README.txt rename to src/pyfvs/README.txt diff --git a/pyfvs/__init__.py b/src/pyfvs/__init__.py similarity index 100% rename from pyfvs/__init__.py rename to src/pyfvs/__init__.py diff --git a/pyfvs/__main__.py b/src/pyfvs/__main__.py similarity index 100% rename from pyfvs/__main__.py rename to src/pyfvs/__main__.py diff --git a/pyfvs/config_default.yaml b/src/pyfvs/config_default.yaml similarity index 100% rename from pyfvs/config_default.yaml rename to src/pyfvs/config_default.yaml diff --git a/pyfvs/fvs.py b/src/pyfvs/fvs.py similarity index 99% rename from pyfvs/fvs.py rename to src/pyfvs/fvs.py index b4f7fcd00..7c5469b9a 100644 --- a/pyfvs/fvs.py +++ b/src/pyfvs/fvs.py @@ -10,7 +10,6 @@ """ from dataclasses import field -from distutils.log import debug import os import sys import re diff --git a/pyfvs/keywords/__init__.py b/src/pyfvs/keywords/__init__.py similarity index 100% rename from pyfvs/keywords/__init__.py rename to src/pyfvs/keywords/__init__.py diff --git a/pyfvs/keywords/_fields.py b/src/pyfvs/keywords/_fields.py similarity index 100% rename from pyfvs/keywords/_fields.py rename to src/pyfvs/keywords/_fields.py diff --git a/pyfvs/keywords/_utils.py b/src/pyfvs/keywords/_utils.py similarity index 100% rename from pyfvs/keywords/_utils.py rename to src/pyfvs/keywords/_utils.py diff --git a/pyfvs/keywords/eventmonitor.py b/src/pyfvs/keywords/eventmonitor.py similarity index 100% rename from pyfvs/keywords/eventmonitor.py rename to src/pyfvs/keywords/eventmonitor.py diff --git a/pyfvs/keywords/keywords.py b/src/pyfvs/keywords/keywords.py similarity index 100% rename from pyfvs/keywords/keywords.py rename to src/pyfvs/keywords/keywords.py diff --git a/pyfvs/meson.build b/src/pyfvs/meson.build similarity index 66% rename from pyfvs/meson.build rename to src/pyfvs/meson.build index b05ed62bc..2e6120284 100644 --- a/pyfvs/meson.build +++ b/src/pyfvs/meson.build @@ -1,6 +1,8 @@ # Generate the variants file conf_data = configuration_data() +pyfvs_install_dir = py3.get_install_dir() / 'pyfvs' + # stringify the variant library dictionary libs_str = '{' foreach k,v : variant_libs @@ -14,7 +16,7 @@ configure_file( output: 'variants.py', configuration: conf_data, install: true, - install_dir: py3.get_install_dir() / 'pyfvs' + install_dir: pyfvs_install_dir ) python_sources = [ @@ -31,18 +33,18 @@ py3.install_sources( install_subdir( 'keywords', - install_dir: py3.get_install_dir() / 'pyfvs', + install_dir: pyfvs_install_dir, exclude_directories : ['__pycache__'] ) install_data( - project_folder / 'pyfvs/config_default.yaml', - install_dir: py3.get_install_dir() / 'pyfvs', + 'config_default.yaml', + install_dir: pyfvs_install_dir, ) ## FIXME: Filter out all the extraneous files -# exclude_files = run_command(py3,'-c', 'import os.path as pth,glob;f=glob.glob("../pyfvs/test/*");print(";".join([pth.basename(p) for p in f if pth.isfile(p) and not pth.splitext(p)[-1] in (".py",".ini")]))').stdout().strip().split(';') -# exclude_dirs = run_command(py3,'-c', 'import os.path as pth,glob;f=glob.glob("../pyfvs/test/*");print(";".join([pth.basename(p) for p in f if pth.isdir(p) and not pth.splitext(p)[-1] in ("rmrs","reg_test")]))').stdout().strip().split(';') +# exclude_files = run_command(py3,'-c', 'import os.path as pth,glob;f=glob.glob("../../tests");print(";".join([pth.basename(p) for p in f if pth.isfile(p) and not pth.splitext(p)[-1] in (".py",".ini")]))').stdout().strip().split(';') +# exclude_dirs = run_command(py3,'-c', 'import os.path as pth,glob;f=glob.glob("../../tests/*");print(";".join([pth.basename(p) for p in f if pth.isdir(p) and not pth.splitext(p)[-1] in ("rmrs","reg_test")]))').stdout().strip().split(';') # exclude_files += '.pytest_cache' # Because Python interprets this dir as a file??? # message('Exclude Files') @@ -52,7 +54,7 @@ install_data( # install_subdir( # 'test', -# install_dir: py3.get_install_dir() / 'pyfvs', +# install_dir: pyfvs_install_dir, # # exclude_files: exclude_files, # exclude_directories : ['__pycache__','.pytest_cache','notebooks'], #,'reg_test','fia_test','api_test'] # # exclude_directories: exclude_dirs, diff --git a/pyfvs/variants.py.in b/src/pyfvs/variants.py.in similarity index 100% rename from pyfvs/variants.py.in rename to src/pyfvs/variants.py.in