From fdabd065b915295938e3a1a14372660c8757a8d6 Mon Sep 17 00:00:00 2001 From: iosefa Date: Fri, 20 Sep 2024 11:03:34 -1000 Subject: [PATCH 1/9] Add separate workflows for building and publishing Python package Introduced a new GitHub Actions workflow for publishing the Python package to PyPI. The existing workflow was updated to focus solely on building and testing the package using Miniconda and pytest. --- .github/workflows/main.yml | 38 +++++++++++++++++------------------ .github/workflows/publish.yml | 31 ++++++++++++++++++++++++++++ 2 files changed, 50 insertions(+), 19 deletions(-) create mode 100644 .github/workflows/publish.yml diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 2eaed6e..5d14754 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -1,37 +1,37 @@ -name: Publish Python Package +name: Build and Test Python Package on: push: - tags: - - 'v*.*.*' + branches: + - main + pull_request: + branches: + - main jobs: - release: + test: runs-on: ubuntu-latest steps: - name: Check out the repository uses: actions/checkout@v3 - - name: Set up Python - uses: actions/setup-python@v4 + - name: Install Miniconda + uses: conda-incubator/setup-miniconda@v2 with: - python-version: '3.x' + auto-update-conda: true + python-version: 3.8 - - name: Install build dependencies - run: | - python -m pip install --upgrade pip - pip install setuptools wheel twine + - name: Create Conda environment + run: conda create --name pyforestscan_env python=3.8 pdal - - name: Run tests + - name: Activate Conda environment + run: source activate pyforestscan_env + + - name: Install dependencies run: | pip install -r requirements.txt pip install -r requirements-dev.txt - pytest - - name: Publish to PyPI - env: - PYPI_TOKEN: ${{ secrets.PYPI_TOKEN }} - run: | - python setup.py sdist bdist_wheel - twine upload dist/* -u __token__ -p $PYPI_TOKEN \ No newline at end of file + - name: Run tests + run: pytest diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml new file mode 100644 index 0000000..14d2ebd --- /dev/null +++ b/.github/workflows/publish.yml @@ -0,0 +1,31 @@ +name: Publish Python Package + +on: + push: + tags: + - 'v*.*.*' + +jobs: + release: + runs-on: ubuntu-latest + + steps: + - name: Check out the repository + uses: actions/checkout@v3 + + - name: Set up Python + uses: actions/setup-python@v4 + with: + python-version: '3.x' + + - name: Install build dependencies + run: | + python -m pip install --upgrade pip + pip install setuptools wheel twine + + - name: Publish to PyPI + env: + PYPI_TOKEN: ${{ secrets.PYPI_TOKEN }} + run: | + python setup.py sdist bdist_wheel + twine upload dist/* -u __token__ -p $PYPI_TOKEN \ No newline at end of file From 4070abc980329fe5e1bc9375562fd68a433cd918 Mon Sep 17 00:00:00 2001 From: iosefa Date: Fri, 20 Sep 2024 11:06:21 -1000 Subject: [PATCH 2/9] Add conda-forge channel for environment setup Included the conda-forge channel in the conda setup to ensure consistent package versions. Updated both the `setup-conda` action and the conda environment creation command accordingly. --- .github/workflows/main.yml | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 5d14754..c03a1e1 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -21,9 +21,11 @@ jobs: with: auto-update-conda: true python-version: 3.8 + channels: conda-forge + activate-environment: pyforestscan_env - name: Create Conda environment - run: conda create --name pyforestscan_env python=3.8 pdal + run: conda create --name pyforestscan_env python=3.8 pdal -c conda-forge - name: Activate Conda environment run: source activate pyforestscan_env @@ -34,4 +36,4 @@ jobs: pip install -r requirements-dev.txt - name: Run tests - run: pytest + run: pytest \ No newline at end of file From 12e0ea2b6584b921f85ce9667f92374a0461ca8e Mon Sep 17 00:00:00 2001 From: iosefa Date: Fri, 20 Sep 2024 11:11:23 -1000 Subject: [PATCH 3/9] Simplify environment activation and dependency installation Combine steps for activating the Conda environment and installing dependencies into one. Update the test running step to activate the environment before running pytest. --- .github/workflows/main.yml | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index c03a1e1..fa2a4a4 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -22,18 +22,19 @@ jobs: auto-update-conda: true python-version: 3.8 channels: conda-forge - activate-environment: pyforestscan_env - name: Create Conda environment run: conda create --name pyforestscan_env python=3.8 pdal -c conda-forge - - name: Activate Conda environment - run: source activate pyforestscan_env - - - name: Install dependencies + - name: Activate Conda environment and install dependencies + shell: bash -l {0} run: | + conda activate pyforestscan_env pip install -r requirements.txt pip install -r requirements-dev.txt - name: Run tests - run: pytest \ No newline at end of file + shell: bash -l {0} + run: | + conda activate pyforestscan_env + pytest \ No newline at end of file From 0012e3f48e29a592f931b86310ca19c108ca47af Mon Sep 17 00:00:00 2001 From: iosefa Date: Fri, 20 Sep 2024 11:15:50 -1000 Subject: [PATCH 4/9] Update Python version to 3.9 Upgraded the Python version from 3.8 to 3.9 in the GitHub workflow, README, and setup.py files. This change ensures compatibility with the latest Python features and libraries. Deleted the unnecessary test_data/output.tif file. --- .github/workflows/main.yml | 4 ++-- README.md | 2 +- setup.py | 2 +- test_data/output.tif | Bin 40408 -> 0 bytes 4 files changed, 4 insertions(+), 4 deletions(-) delete mode 100644 test_data/output.tif diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index fa2a4a4..6203237 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -20,11 +20,11 @@ jobs: uses: conda-incubator/setup-miniconda@v2 with: auto-update-conda: true - python-version: 3.8 + python-version: 3.9 channels: conda-forge - name: Create Conda environment - run: conda create --name pyforestscan_env python=3.8 pdal -c conda-forge + run: conda create --name pyforestscan_env python=3.9 pdal -c conda-forge - name: Activate Conda environment and install dependencies shell: bash -l {0} diff --git a/README.md b/README.md index 339aa28..bf0326e 100644 --- a/README.md +++ b/README.md @@ -29,7 +29,7 @@ pip install pyforestscan > You MUST have installed PDAL to use PyForestScan. If you use conda to install PDAL, make sure you install pyforestscan in the conda environment with PDAL. See https://pdal.io/en/latest/ for more information. - PDAL >= 2.7 -- Python >= 3.8 +- Python >= 3.9 ## Quick Start diff --git a/setup.py b/setup.py index d6b45eb..11f66cc 100644 --- a/setup.py +++ b/setup.py @@ -21,7 +21,7 @@ "Operating System :: OS Independent", ], packages=setuptools.find_packages(), - python_requires=">=3.8", + python_requires=">=3.9", install_requires=[ 'rasterio>=1.3.11', 'pdal>=3.4.5', diff --git a/test_data/output.tif b/test_data/output.tif deleted file mode 100644 index ed14ca1fb7eea20ce48172fbae2b9d2f217a7f14..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 40408 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 Date: Fri, 20 Sep 2024 11:18:15 -1000 Subject: [PATCH 5/9] Update to Python 3.10 across workflow and documentation Switched the GitHub Actions workflow, README, and setup.py to require Python 3.10 instead of 3.9. This ensures consistency in the development environment and takes advantage of the latest features of Python. --- .github/workflows/main.yml | 4 ++-- README.md | 2 +- setup.py | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 6203237..e2ac6df 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -20,11 +20,11 @@ jobs: uses: conda-incubator/setup-miniconda@v2 with: auto-update-conda: true - python-version: 3.9 + python-version: 310 channels: conda-forge - name: Create Conda environment - run: conda create --name pyforestscan_env python=3.9 pdal -c conda-forge + run: conda create --name pyforestscan_env python=3.10 pdal -c conda-forge - name: Activate Conda environment and install dependencies shell: bash -l {0} diff --git a/README.md b/README.md index bf0326e..f418a07 100644 --- a/README.md +++ b/README.md @@ -29,7 +29,7 @@ pip install pyforestscan > You MUST have installed PDAL to use PyForestScan. If you use conda to install PDAL, make sure you install pyforestscan in the conda environment with PDAL. See https://pdal.io/en/latest/ for more information. - PDAL >= 2.7 -- Python >= 3.9 +- Python >= 3.10 ## Quick Start diff --git a/setup.py b/setup.py index 11f66cc..bbdd6e1 100644 --- a/setup.py +++ b/setup.py @@ -21,7 +21,7 @@ "Operating System :: OS Independent", ], packages=setuptools.find_packages(), - python_requires=">=3.9", + python_requires=">=3.10", install_requires=[ 'rasterio>=1.3.11', 'pdal>=3.4.5', From 0ac5e62f8ed31f1586b817b98c2594de784e8e0c Mon Sep 17 00:00:00 2001 From: iosefa Date: Fri, 20 Sep 2024 11:20:07 -1000 Subject: [PATCH 6/9] Fix Python version format in GitHub Actions workflow Updated the Python version specification from "310" to "3.10" in the GitHub Actions workflow configuration. This change ensures the correct Python version is used during the setup of the Conda environment. --- .github/workflows/main.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index e2ac6df..f3ba609 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -20,7 +20,7 @@ jobs: uses: conda-incubator/setup-miniconda@v2 with: auto-update-conda: true - python-version: 310 + python-version: 3.10 channels: conda-forge - name: Create Conda environment From cd6907f45213247a7da0aba3a496e8a26f8dc6af Mon Sep 17 00:00:00 2001 From: iosefa Date: Fri, 20 Sep 2024 11:22:12 -1000 Subject: [PATCH 7/9] Simplify Conda environment setup Combine Conda environment creation and dependency installation into a single step. This reduces the workflow steps and ensures a cleaner, more efficient setup process. --- .github/workflows/main.yml | 16 +++++----------- 1 file changed, 5 insertions(+), 11 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index f3ba609..7d7ee7a 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -23,18 +23,12 @@ jobs: python-version: 3.10 channels: conda-forge - - name: Create Conda environment - run: conda create --name pyforestscan_env python=3.10 pdal -c conda-forge - - - name: Activate Conda environment and install dependencies - shell: bash -l {0} + - name: Create and install dependencies in Conda environment run: | - conda activate pyforestscan_env - pip install -r requirements.txt - pip install -r requirements-dev.txt + conda create --name pyforestscan_env python=3.10 pdal -c conda-forge + conda run -n pyforestscan_env pip install -r requirements.txt + conda run -n pyforestscan_env pip install -r requirements-dev.txt - name: Run tests - shell: bash -l {0} run: | - conda activate pyforestscan_env - pytest \ No newline at end of file + conda run -n pyforestscan_env pytest \ No newline at end of file From 05a19f5459c0daea710990f8c77b4e516111f46b Mon Sep 17 00:00:00 2001 From: iosefa Date: Fri, 20 Sep 2024 11:25:21 -1000 Subject: [PATCH 8/9] Refactor Conda environment setup and activation in CI Separated conda environment creation from dependency installation. This allows for clearer steps and improves environment activation before running tests. --- .github/workflows/main.yml | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 7d7ee7a..ed53d2d 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -23,12 +23,19 @@ jobs: python-version: 3.10 channels: conda-forge - - name: Create and install dependencies in Conda environment + - name: Create Conda environment with Python 3.10 and PDAL run: | - conda create --name pyforestscan_env python=3.10 pdal -c conda-forge - conda run -n pyforestscan_env pip install -r requirements.txt - conda run -n pyforestscan_env pip install -r requirements-dev.txt + conda create --name pyforestscan_env python=3.10 pdal gdal -c conda-forge -v + + - name: Activate Conda environment and install dependencies + shell: bash -l {0} + run: | + conda activate pyforestscan_env + pip install -r requirements.txt + pip install -r requirements-dev.txt - name: Run tests + shell: bash -l {0} run: | - conda run -n pyforestscan_env pytest \ No newline at end of file + conda activate pyforestscan_env + pytest \ No newline at end of file From 7a72cbf33edca37fb4d25368f0955eadb21137d0 Mon Sep 17 00:00:00 2001 From: iosefa Date: Fri, 20 Sep 2024 11:31:11 -1000 Subject: [PATCH 9/9] Update Miniconda setup action to v3 in workflow Upgraded the `setup-miniconda` GitHub Action from version 2 to version 3. This ensures compatibility with the latest features and improvements. Also, standardized the `python-version` field to a string type. --- .github/workflows/main.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index ed53d2d..72e3b53 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -17,10 +17,10 @@ jobs: uses: actions/checkout@v3 - name: Install Miniconda - uses: conda-incubator/setup-miniconda@v2 + uses: conda-incubator/setup-miniconda@v3 with: auto-update-conda: true - python-version: 3.10 + python-version: "3.10" channels: conda-forge - name: Create Conda environment with Python 3.10 and PDAL