diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index a7d096af..bf260959 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -14,7 +14,7 @@ on: required: false default: '' publish: - description: 'Set to "false" to skip publishing to PyPI' + description: 'Publish package to PyPI' required: false default: 'true' @@ -29,7 +29,7 @@ jobs: build-app-packages: strategy: matrix: - os: [ubuntu-latest, macos-latest, windows-latest] + os: [ubuntu-latest, macos-13, windows-latest] fail-fast: false defaults: run: @@ -46,7 +46,7 @@ jobs: # Install binary + python dependencies - name: Install system packages - if: ${{ matrix.os == 'ubuntu-latest' }} + if: startsWith(matrix.os, 'ubuntu') run: sudo apt-get install -y '^libxcb.*-dev' libegl-dev libwebp-dev libpng16-16 libx11-xcb-dev rpm - name: Cache python packages id: cache @@ -57,7 +57,7 @@ jobs: - name: Install python packages if: steps.cache.outputs.cache-hit != 'true' run: | - poetry install -v --without dev + poetry install -v --only main poetry run pip install -U pyinstaller setuptools - name: Build pyinstaller package @@ -65,7 +65,7 @@ jobs: # Include taxon FTS db, compress, and set platform name - name: Finish pyinstaller package (Linux) - if: ${{ matrix.os == 'ubuntu-latest' }} + if: startsWith(matrix.os, 'ubuntu') run: | ASSETS=dist/naturtag/_internal/assets/data tar -xvzf $ASSETS/taxonomy.tar.gz --directory $ASSETS/ @@ -74,7 +74,7 @@ jobs: echo "DIST_NAME=linux" >> $GITHUB_ENV - name: Finish pyinstaller package (macOS) - if: ${{ matrix.os == 'macos-latest' }} + if: startsWith(matrix.os, 'macos') run: | ASSETS=dist/naturtag.app/Contents/Resources/assets/data tar -xvzf $ASSETS/taxonomy.tar.gz --directory $ASSETS/ @@ -83,7 +83,7 @@ jobs: echo "DIST_NAME=macos" >> $GITHUB_ENV - name: Finish pyinstaller package (Windows) - if: ${{ matrix.os == 'windows-latest' }} + if: startsWith(matrix.os, 'windows') run: | ASSETS=dist/naturtag/_internal/assets/data tar -xvzf $ASSETS/taxonomy.tar.gz --directory $ASSETS/ @@ -93,7 +93,7 @@ jobs: # Build deb, snap, and rpm packages - name: Build Linux packages with FPM - if : ${{ matrix.os == 'ubuntu-latest' }} + if : startsWith(matrix.os, 'ubuntu') run: | export GEM_HOME="$(ruby -e 'puts Gem.user_dir')" export PATH="$PATH:$GEM_HOME/bin" @@ -103,7 +103,7 @@ jobs: # Build dmg package - name: Build disk image (macOS) - if: ${{ matrix.os == 'macos-latest' }} + if: startsWith(matrix.os, 'macos') run: | brew install create-dmg cd packaging @@ -117,14 +117,14 @@ jobs: path: naturtag-${{ env.DIST_NAME }}.tar.gz - name: Upload disk image (macOS) - if: ${{ matrix.os == 'macos-latest' }} + if: startsWith(matrix.os, 'macos') uses: actions/upload-artifact@v4 with: name: naturtag.dmg path: dist/naturtag.dmg - name: Upload FPM workflow artifacts (Linux) - if : ${{ matrix.os == 'ubuntu-latest' }} + if : startsWith(matrix.os, 'ubuntu') uses: actions/upload-artifact@v4 with: name: naturtag-fpm @@ -148,6 +148,10 @@ jobs: uses: softprops/action-gh-release@v2 with: files: 'naturtag*' + body: | + See changelog for release details: https://github.com/pyinat/naturtag/blob/main/HISTORY.md + See docs for installation instructions: https://naturtag.readthedocs.io/en/stable/installation.html + draft: true # Publish python package to PyPI release-pypi-package: diff --git a/HISTORY.md b/HISTORY.md index bb5a8132..4be5c180 100644 --- a/HISTORY.md +++ b/HISTORY.md @@ -28,6 +28,7 @@ * In refresh mode, check for taxonomy changes and update tags with the new taxon (1:1 changes only) **Database:** +* Update packaged taxonomy db with iNaturalist data from June 2024 * Include data for most commonly observed taxa with PyInstaller packages and platform-specific installers * Pre-compute ancestor IDs, child IDs, iconic taxon, observation count, and leaf taxon count based on RG observations from GBIF export diff --git a/assets/data/taxonomy.tar.gz b/assets/data/taxonomy.tar.gz index 86faf4d8..d14022ed 100644 Binary files a/assets/data/taxonomy.tar.gz and b/assets/data/taxonomy.tar.gz differ diff --git a/packaging/README.md b/packaging/README.md index 26d1e0da..f3677eb5 100644 --- a/packaging/README.md +++ b/packaging/README.md @@ -9,13 +9,25 @@ This directory contains scripts and config for building Naturtag packages in the * Taxonomy full text search database (optional download) # Release steps + +## Build taxonomy db * Locally build full taxonomy FTS database with `build_taxon_db.py`. For reference, see: * [pyinaturalist_convert.dwca](https://pyinaturalist-convert.readthedocs.io/en/stable/modules/dwca.html) * [pyinaturalist_convert.taxonomy](https://pyinaturalist-convert.readthedocs.io/en/stable/modules/taxonomy.html) * [pyinaturalist_convert.fts](https://pyinaturalist-convert.readthedocs.io/en/stable/modules/fts.html) * Export subset of db (English language, common species only) with `export_taxa.sh` * Commit to repo under `assets/data/taxonomy.tar.gz` +* Export full db with `export_taxa_full.sh` + * This will create a file `taxonomy-full.tar.gz` to upload later + +## Windows Installer * Update version in `pyproject.toml` and Actual Installer config (`naturtag.aip`) +* On a Windows machine or VM, build the project locally and create an installer with Actual Installer. +* See steps in `build_win.ps1` for details (not fully automated; requires GUI interaction) + +## Release * Create and push new git tag. This will trigger jobs to build packages and create a new GitHub release. -* Export full db with `export_taxa_full.sh` - * After the release jobs complete, manually upload this to the release assets +* Most release assets will be built by the CI job, except for the following, which must be uploaded manually: + * Full taxonomy db (`taxonomy-full.tar.gz`) + * Windows installer (`naturtag-installer.exe`) +* Publish the GitHub release (by default, it will be created in draft mode) \ No newline at end of file diff --git a/packaging/build_win.ps1 b/packaging/build_win.ps1 index 70d6a6ae..87714e39 100644 --- a/packaging/build_win.ps1 +++ b/packaging/build_win.ps1 @@ -1,16 +1,17 @@ # Build pyinstaller package prior to creating Windows installer -# Create virtualenv -# python -m venv $env:USERPROFILE\.virtualenvs\naturtag +# Create virtualenv (if needed) +# python3.11 -m venv $env:USERPROFILE\.virtualenvs\naturtag -# Install poetry +# Install poetry (if needed) # Invoke-WebRequest -Uri https://install.python-poetry.org -OutFile install-poetry.py # python install-poetry.py --preview # ~\AppData\Roaming\Python\Scripts\poetry.exe config virtualenvs.create false # Install dependencies . ~\.virtualenvs\naturtag\Scripts\activate.ps1 -poetry install -v --no-dev +poetry self update +poetry install -v --only main pip install -U setuptools pyinstaller pyinstaller -y packaging\naturtag.spec @@ -19,6 +20,3 @@ pyinstaller -y packaging\naturtag.spec # 2. Run installer # 3. Open Naturtag and test basic features Invoke-Item packaging\naturtag.aip - -# Launch InstallForge -# Invoke-Item packaging\naturtag.ifp diff --git a/packaging/naturtag.aip b/packaging/naturtag.aip index 247a9595..e9f6f830 100644 --- a/packaging/naturtag.aip +++ b/packaging/naturtag.aip @@ -1,13 +1,17 @@ [Setup] -AIVersion=9.3 +AIVersion=10.0 AIEdition=1 GUID={01329D81-576C-42FE-9850-9C4C03F161FB} AppName=Naturtag +AppEdition= AppVersion=v0.8.0-beta +GetVerFromExe=0 AppDescription= CompanyName= WebSite=https://naturtag.readthedocs.io SupportLink=https://naturtag.readthedocs.io +Copyright=Copyright © 2024 Jordan Cook +GetCopyrightFromExe=0 InstallLevel=1 UpgradeMode=0 IfInstalled=0 @@ -51,12 +55,15 @@ UninstallCloseMainExe=1 UninstallCloseApp=0 UninstallCloseAppFile=File.exe UninstallCloseAppText=App +UninstallForceCloseApp=0 Updater=1 UpdateURL=https://raw.githubusercontent.com/pyinat/naturtag/main/packaging/latest.txt CheckUpdateBefore=0 CheckUpdaterTitle=0 -CheckUseDownloader=0 AllowChangeUpdate=0 +GetVerFrom=2 +UpdateMethod=0 +CheckUseDownloader=0 AutoCheckUpdate=0 UpdateFrequency=2 AutoSilentUpdate=0 @@ -67,6 +74,7 @@ CheckUpdatePassParam=0 CheckUpdaterParam=?id= UpdaterParameters= LaunchOnStatup=0 +RegisterAppPath=0 SelectFolderMode=0 AltInstallDir=\ DataExtractParam=-o"" -aoa @@ -99,18 +107,22 @@ HideOtherLanguages=0 QueryText=0 QueryTextName= QueryTextReq=0 +QueryTextDis=0 QueryTextHide=0 QueryCustom=0 QueryCustomName= QueryCustomReq=0 +QueryCustomDis=0 QueryCustomHide=0 QueryCustomType=0 QueryCustomMustExists=0 QueryKey=0 QueryKeyName=Key: QueryKeyReq=0 +QueryKeyDis=0 QueryKeyHide=0 QueryKeyHideReg=0 +QueryKeyHidePass=0 KeysCount=0 InfoCustomBox=0 InfoCustomBoxReq=0 @@ -120,6 +132,7 @@ CustomComboBoxName= CustomComboBoxItems= CustomComboDefItem= ComboBoxDisableOnUpgrade=0 +ComboBoxUpdateInstallDir=0 CustomComponents=0 CustomComponentsText= CustomComponentsDesc= @@ -139,8 +152,8 @@ CustomActionCommand= CustomActionChecked=0 CustomActionAdmin=0 TotalFiles=2 -SourceDirFiles=1050 -SourceDirSize=162253011 +SourceDirFiles=472 +SourceDirSize=168013728 [GUI] FontName=Verdana diff --git a/packaging/naturtag.spec b/packaging/naturtag.spec index 48ded376..cc711a7e 100644 --- a/packaging/naturtag.spec +++ b/packaging/naturtag.spec @@ -1,6 +1,7 @@ from pathlib import Path from PyInstaller.compat import is_darwin, is_linux, is_win +from PyInstaller.utils.hooks import copy_metadata BUILD_PY_VERSION = '3.11' PROJECT_NAME = 'naturtag' @@ -17,9 +18,16 @@ VENV_DIR = CI_VENV_DIR if CI_VENV_DIR.is_dir() else LOCAL_VENV_DIR LIB_DIR_WIN = VENV_DIR / 'Lib' / 'site-packages' / 'pyexiv2' / 'lib' LIB_DIR_NIX = VENV_DIR / 'lib' / f'python{BUILD_PY_VERSION}' / 'site-packages' / 'pyexiv2' / 'lib' -# Define platform-specific dependencies binaries = [] +datas = [ + (str(ICONS_DIR / '*.ico'), 'assets/icons'), + (str(ICONS_DIR / '*.png'), 'assets/icons'), + (str(ASSETS_DATA_DIR / '*.qss'), 'assets/data'), + (str(ASSETS_DATA_DIR / '*.tar.gz'), 'assets/data'), +] hiddenimports = [] + +# Define platform-specific dependencies if is_win: binaries = [ (str(LIB_DIR_WIN / 'exiv2.dll'), '.'), @@ -39,16 +47,14 @@ elif is_linux: else: raise NotImplementedError +# Ensure package metadata is available for importlib.metadata +datas += copy_metadata('naturtag') + a = Analysis( [str(PACKAGE_DIR / 'app' / 'app.py')], pathex=[str(PROJECT_DIR)], binaries=binaries, - datas=[ - (str(ICONS_DIR / '*.ico'), 'assets/icons'), - (str(ICONS_DIR / '*.png'), 'assets/icons'), - (str(ASSETS_DATA_DIR / '*.qss'), 'assets/data'), - (str(ASSETS_DATA_DIR / '*.tar.gz'), 'assets/data'), - ], + datas=datas, hiddenimports=hiddenimports, hookspath=[], hooksconfig={}, diff --git a/poetry.lock b/poetry.lock index d86d4bd2..f64d920b 100644 --- a/poetry.lock +++ b/poetry.lock @@ -390,63 +390,63 @@ development = ["black", "flake8", "mypy", "pytest", "types-colorama"] [[package]] name = "coverage" -version = "7.5.3" +version = "7.5.4" description = "Code coverage measurement for Python" optional = false python-versions = ">=3.8" files = [ - {file = "coverage-7.5.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:a6519d917abb15e12380406d721e37613e2a67d166f9fb7e5a8ce0375744cd45"}, - {file = "coverage-7.5.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:aea7da970f1feccf48be7335f8b2ca64baf9b589d79e05b9397a06696ce1a1ec"}, - {file = "coverage-7.5.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:923b7b1c717bd0f0f92d862d1ff51d9b2b55dbbd133e05680204465f454bb286"}, - {file = "coverage-7.5.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:62bda40da1e68898186f274f832ef3e759ce929da9a9fd9fcf265956de269dbc"}, - {file = "coverage-7.5.3-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d8b7339180d00de83e930358223c617cc343dd08e1aa5ec7b06c3a121aec4e1d"}, - {file = "coverage-7.5.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:25a5caf742c6195e08002d3b6c2dd6947e50efc5fc2c2205f61ecb47592d2d83"}, - {file = "coverage-7.5.3-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:05ac5f60faa0c704c0f7e6a5cbfd6f02101ed05e0aee4d2822637a9e672c998d"}, - {file = "coverage-7.5.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:239a4e75e09c2b12ea478d28815acf83334d32e722e7433471fbf641c606344c"}, - {file = "coverage-7.5.3-cp310-cp310-win32.whl", hash = "sha256:a5812840d1d00eafae6585aba38021f90a705a25b8216ec7f66aebe5b619fb84"}, - {file = "coverage-7.5.3-cp310-cp310-win_amd64.whl", hash = "sha256:33ca90a0eb29225f195e30684ba4a6db05dbef03c2ccd50b9077714c48153cac"}, - {file = "coverage-7.5.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:f81bc26d609bf0fbc622c7122ba6307993c83c795d2d6f6f6fd8c000a770d974"}, - {file = "coverage-7.5.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:7cec2af81f9e7569280822be68bd57e51b86d42e59ea30d10ebdbb22d2cb7232"}, - {file = "coverage-7.5.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:55f689f846661e3f26efa535071775d0483388a1ccfab899df72924805e9e7cd"}, - {file = "coverage-7.5.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:50084d3516aa263791198913a17354bd1dc627d3c1639209640b9cac3fef5807"}, - {file = "coverage-7.5.3-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:341dd8f61c26337c37988345ca5c8ccabeff33093a26953a1ac72e7d0103c4fb"}, - {file = "coverage-7.5.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:ab0b028165eea880af12f66086694768f2c3139b2c31ad5e032c8edbafca6ffc"}, - {file = "coverage-7.5.3-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:5bc5a8c87714b0c67cfeb4c7caa82b2d71e8864d1a46aa990b5588fa953673b8"}, - {file = "coverage-7.5.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:38a3b98dae8a7c9057bd91fbf3415c05e700a5114c5f1b5b0ea5f8f429ba6614"}, - {file = "coverage-7.5.3-cp311-cp311-win32.whl", hash = "sha256:fcf7d1d6f5da887ca04302db8e0e0cf56ce9a5e05f202720e49b3e8157ddb9a9"}, - {file = "coverage-7.5.3-cp311-cp311-win_amd64.whl", hash = "sha256:8c836309931839cca658a78a888dab9676b5c988d0dd34ca247f5f3e679f4e7a"}, - {file = "coverage-7.5.3-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:296a7d9bbc598e8744c00f7a6cecf1da9b30ae9ad51c566291ff1314e6cbbed8"}, - {file = "coverage-7.5.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:34d6d21d8795a97b14d503dcaf74226ae51eb1f2bd41015d3ef332a24d0a17b3"}, - {file = "coverage-7.5.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8e317953bb4c074c06c798a11dbdd2cf9979dbcaa8ccc0fa4701d80042d4ebf1"}, - {file = "coverage-7.5.3-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:705f3d7c2b098c40f5b81790a5fedb274113373d4d1a69e65f8b68b0cc26f6db"}, - {file = "coverage-7.5.3-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b1196e13c45e327d6cd0b6e471530a1882f1017eb83c6229fc613cd1a11b53cd"}, - {file = "coverage-7.5.3-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:015eddc5ccd5364dcb902eaecf9515636806fa1e0d5bef5769d06d0f31b54523"}, - {file = "coverage-7.5.3-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:fd27d8b49e574e50caa65196d908f80e4dff64d7e592d0c59788b45aad7e8b35"}, - {file = "coverage-7.5.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:33fc65740267222fc02975c061eb7167185fef4cc8f2770267ee8bf7d6a42f84"}, - {file = "coverage-7.5.3-cp312-cp312-win32.whl", hash = "sha256:7b2a19e13dfb5c8e145c7a6ea959485ee8e2204699903c88c7d25283584bfc08"}, - {file = "coverage-7.5.3-cp312-cp312-win_amd64.whl", hash = "sha256:0bbddc54bbacfc09b3edaec644d4ac90c08ee8ed4844b0f86227dcda2d428fcb"}, - {file = "coverage-7.5.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:f78300789a708ac1f17e134593f577407d52d0417305435b134805c4fb135adb"}, - {file = "coverage-7.5.3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:b368e1aee1b9b75757942d44d7598dcd22a9dbb126affcbba82d15917f0cc155"}, - {file = "coverage-7.5.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f836c174c3a7f639bded48ec913f348c4761cbf49de4a20a956d3431a7c9cb24"}, - {file = "coverage-7.5.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:244f509f126dc71369393ce5fea17c0592c40ee44e607b6d855e9c4ac57aac98"}, - {file = "coverage-7.5.3-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c4c2872b3c91f9baa836147ca33650dc5c172e9273c808c3c3199c75490e709d"}, - {file = "coverage-7.5.3-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:dd4b3355b01273a56b20c219e74e7549e14370b31a4ffe42706a8cda91f19f6d"}, - {file = "coverage-7.5.3-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:f542287b1489c7a860d43a7d8883e27ca62ab84ca53c965d11dac1d3a1fab7ce"}, - {file = "coverage-7.5.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:75e3f4e86804023e991096b29e147e635f5e2568f77883a1e6eed74512659ab0"}, - {file = "coverage-7.5.3-cp38-cp38-win32.whl", hash = "sha256:c59d2ad092dc0551d9f79d9d44d005c945ba95832a6798f98f9216ede3d5f485"}, - {file = "coverage-7.5.3-cp38-cp38-win_amd64.whl", hash = "sha256:fa21a04112c59ad54f69d80e376f7f9d0f5f9123ab87ecd18fbb9ec3a2beed56"}, - {file = "coverage-7.5.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:f5102a92855d518b0996eb197772f5ac2a527c0ec617124ad5242a3af5e25f85"}, - {file = "coverage-7.5.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:d1da0a2e3b37b745a2b2a678a4c796462cf753aebf94edcc87dcc6b8641eae31"}, - {file = "coverage-7.5.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8383a6c8cefba1b7cecc0149415046b6fc38836295bc4c84e820872eb5478b3d"}, - {file = "coverage-7.5.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9aad68c3f2566dfae84bf46295a79e79d904e1c21ccfc66de88cd446f8686341"}, - {file = "coverage-7.5.3-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2e079c9ec772fedbade9d7ebc36202a1d9ef7291bc9b3a024ca395c4d52853d7"}, - {file = "coverage-7.5.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:bde997cac85fcac227b27d4fb2c7608a2c5f6558469b0eb704c5726ae49e1c52"}, - {file = "coverage-7.5.3-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:990fb20b32990b2ce2c5f974c3e738c9358b2735bc05075d50a6f36721b8f303"}, - {file = "coverage-7.5.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:3d5a67f0da401e105753d474369ab034c7bae51a4c31c77d94030d59e41df5bd"}, - {file = "coverage-7.5.3-cp39-cp39-win32.whl", hash = "sha256:e08c470c2eb01977d221fd87495b44867a56d4d594f43739a8028f8646a51e0d"}, - {file = "coverage-7.5.3-cp39-cp39-win_amd64.whl", hash = "sha256:1d2a830ade66d3563bb61d1e3c77c8def97b30ed91e166c67d0632c018f380f0"}, - {file = "coverage-7.5.3-pp38.pp39.pp310-none-any.whl", hash = "sha256:3538d8fb1ee9bdd2e2692b3b18c22bb1c19ffbefd06880f5ac496e42d7bb3884"}, - {file = "coverage-7.5.3.tar.gz", hash = "sha256:04aefca5190d1dc7a53a4c1a5a7f8568811306d7a8ee231c42fb69215571944f"}, + {file = "coverage-7.5.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:6cfb5a4f556bb51aba274588200a46e4dd6b505fb1a5f8c5ae408222eb416f99"}, + {file = "coverage-7.5.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2174e7c23e0a454ffe12267a10732c273243b4f2d50d07544a91198f05c48f47"}, + {file = "coverage-7.5.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2214ee920787d85db1b6a0bd9da5f8503ccc8fcd5814d90796c2f2493a2f4d2e"}, + {file = "coverage-7.5.4-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1137f46adb28e3813dec8c01fefadcb8c614f33576f672962e323b5128d9a68d"}, + {file = "coverage-7.5.4-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b385d49609f8e9efc885790a5a0e89f2e3ae042cdf12958b6034cc442de428d3"}, + {file = "coverage-7.5.4-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:b4a474f799456e0eb46d78ab07303286a84a3140e9700b9e154cfebc8f527016"}, + {file = "coverage-7.5.4-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:5cd64adedf3be66f8ccee418473c2916492d53cbafbfcff851cbec5a8454b136"}, + {file = "coverage-7.5.4-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:e564c2cf45d2f44a9da56f4e3a26b2236504a496eb4cb0ca7221cd4cc7a9aca9"}, + {file = "coverage-7.5.4-cp310-cp310-win32.whl", hash = "sha256:7076b4b3a5f6d2b5d7f1185fde25b1e54eb66e647a1dfef0e2c2bfaf9b4c88c8"}, + {file = "coverage-7.5.4-cp310-cp310-win_amd64.whl", hash = "sha256:018a12985185038a5b2bcafab04ab833a9a0f2c59995b3cec07e10074c78635f"}, + {file = "coverage-7.5.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:db14f552ac38f10758ad14dd7b983dbab424e731588d300c7db25b6f89e335b5"}, + {file = "coverage-7.5.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:3257fdd8e574805f27bb5342b77bc65578e98cbc004a92232106344053f319ba"}, + {file = "coverage-7.5.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3a6612c99081d8d6134005b1354191e103ec9705d7ba2754e848211ac8cacc6b"}, + {file = "coverage-7.5.4-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d45d3cbd94159c468b9b8c5a556e3f6b81a8d1af2a92b77320e887c3e7a5d080"}, + {file = "coverage-7.5.4-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ed550e7442f278af76d9d65af48069f1fb84c9f745ae249c1a183c1e9d1b025c"}, + {file = "coverage-7.5.4-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:7a892be37ca35eb5019ec85402c3371b0f7cda5ab5056023a7f13da0961e60da"}, + {file = "coverage-7.5.4-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:8192794d120167e2a64721d88dbd688584675e86e15d0569599257566dec9bf0"}, + {file = "coverage-7.5.4-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:820bc841faa502e727a48311948e0461132a9c8baa42f6b2b84a29ced24cc078"}, + {file = "coverage-7.5.4-cp311-cp311-win32.whl", hash = "sha256:6aae5cce399a0f065da65c7bb1e8abd5c7a3043da9dceb429ebe1b289bc07806"}, + {file = "coverage-7.5.4-cp311-cp311-win_amd64.whl", hash = "sha256:d2e344d6adc8ef81c5a233d3a57b3c7d5181f40e79e05e1c143da143ccb6377d"}, + {file = "coverage-7.5.4-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:54317c2b806354cbb2dc7ac27e2b93f97096912cc16b18289c5d4e44fc663233"}, + {file = "coverage-7.5.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:042183de01f8b6d531e10c197f7f0315a61e8d805ab29c5f7b51a01d62782747"}, + {file = "coverage-7.5.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a6bb74ed465d5fb204b2ec41d79bcd28afccf817de721e8a807d5141c3426638"}, + {file = "coverage-7.5.4-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b3d45ff86efb129c599a3b287ae2e44c1e281ae0f9a9bad0edc202179bcc3a2e"}, + {file = "coverage-7.5.4-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5013ed890dc917cef2c9f765c4c6a8ae9df983cd60dbb635df8ed9f4ebc9f555"}, + {file = "coverage-7.5.4-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:1014fbf665fef86cdfd6cb5b7371496ce35e4d2a00cda501cf9f5b9e6fced69f"}, + {file = "coverage-7.5.4-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:3684bc2ff328f935981847082ba4fdc950d58906a40eafa93510d1b54c08a66c"}, + {file = "coverage-7.5.4-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:581ea96f92bf71a5ec0974001f900db495488434a6928a2ca7f01eee20c23805"}, + {file = "coverage-7.5.4-cp312-cp312-win32.whl", hash = "sha256:73ca8fbc5bc622e54627314c1a6f1dfdd8db69788f3443e752c215f29fa87a0b"}, + {file = "coverage-7.5.4-cp312-cp312-win_amd64.whl", hash = "sha256:cef4649ec906ea7ea5e9e796e68b987f83fa9a718514fe147f538cfeda76d7a7"}, + {file = "coverage-7.5.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:cdd31315fc20868c194130de9ee6bfd99755cc9565edff98ecc12585b90be882"}, + {file = "coverage-7.5.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:02ff6e898197cc1e9fa375581382b72498eb2e6d5fc0b53f03e496cfee3fac6d"}, + {file = "coverage-7.5.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d05c16cf4b4c2fc880cb12ba4c9b526e9e5d5bb1d81313d4d732a5b9fe2b9d53"}, + {file = "coverage-7.5.4-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c5986ee7ea0795a4095ac4d113cbb3448601efca7f158ec7f7087a6c705304e4"}, + {file = "coverage-7.5.4-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5df54843b88901fdc2f598ac06737f03d71168fd1175728054c8f5a2739ac3e4"}, + {file = "coverage-7.5.4-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:ab73b35e8d109bffbda9a3e91c64e29fe26e03e49addf5b43d85fc426dde11f9"}, + {file = "coverage-7.5.4-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:aea072a941b033813f5e4814541fc265a5c12ed9720daef11ca516aeacd3bd7f"}, + {file = "coverage-7.5.4-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:16852febd96acd953b0d55fc842ce2dac1710f26729b31c80b940b9afcd9896f"}, + {file = "coverage-7.5.4-cp38-cp38-win32.whl", hash = "sha256:8f894208794b164e6bd4bba61fc98bf6b06be4d390cf2daacfa6eca0a6d2bb4f"}, + {file = "coverage-7.5.4-cp38-cp38-win_amd64.whl", hash = "sha256:e2afe743289273209c992075a5a4913e8d007d569a406ffed0bd080ea02b0633"}, + {file = "coverage-7.5.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b95c3a8cb0463ba9f77383d0fa8c9194cf91f64445a63fc26fb2327e1e1eb088"}, + {file = "coverage-7.5.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:3d7564cc09dd91b5a6001754a5b3c6ecc4aba6323baf33a12bd751036c998be4"}, + {file = "coverage-7.5.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:44da56a2589b684813f86d07597fdf8a9c6ce77f58976727329272f5a01f99f7"}, + {file = "coverage-7.5.4-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e16f3d6b491c48c5ae726308e6ab1e18ee830b4cdd6913f2d7f77354b33f91c8"}, + {file = "coverage-7.5.4-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dbc5958cb471e5a5af41b0ddaea96a37e74ed289535e8deca404811f6cb0bc3d"}, + {file = "coverage-7.5.4-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:a04e990a2a41740b02d6182b498ee9796cf60eefe40cf859b016650147908029"}, + {file = "coverage-7.5.4-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:ddbd2f9713a79e8e7242d7c51f1929611e991d855f414ca9996c20e44a895f7c"}, + {file = "coverage-7.5.4-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:b1ccf5e728ccf83acd313c89f07c22d70d6c375a9c6f339233dcf792094bcbf7"}, + {file = "coverage-7.5.4-cp39-cp39-win32.whl", hash = "sha256:56b4eafa21c6c175b3ede004ca12c653a88b6f922494b023aeb1e836df953ace"}, + {file = "coverage-7.5.4-cp39-cp39-win_amd64.whl", hash = "sha256:65e528e2e921ba8fd67d9055e6b9f9e34b21ebd6768ae1c1723f4ea6ace1234d"}, + {file = "coverage-7.5.4-pp38.pp39.pp310-none-any.whl", hash = "sha256:79b356f3dd5b26f3ad23b35c75dbdaf1f9e2450b6bcefc6d0825ea0aa3f86ca5"}, + {file = "coverage-7.5.4.tar.gz", hash = "sha256:a44963520b069e12789d0faea4e9fdb1e410cdc4aab89d94f7f55cbb7fef0353"}, ] [package.dependencies] @@ -723,13 +723,13 @@ files = [ [[package]] name = "importlib-metadata" -version = "7.2.0" +version = "8.0.0" description = "Read metadata from Python packages" optional = false python-versions = ">=3.8" files = [ - {file = "importlib_metadata-7.2.0-py3-none-any.whl", hash = "sha256:04e4aad329b8b948a5711d394fa8759cb80f009225441b4f2a02bd4d8e5f426c"}, - {file = "importlib_metadata-7.2.0.tar.gz", hash = "sha256:3ff4519071ed42740522d494d04819b666541b9752c43012f85afb2cc220fcc6"}, + {file = "importlib_metadata-8.0.0-py3-none-any.whl", hash = "sha256:15584cf2b1bf449d98ff8a6ff1abef57bf20f3ac6454f431736cd3e660921b2f"}, + {file = "importlib_metadata-8.0.0.tar.gz", hash = "sha256:188bd24e4c346d3f0a933f275c2fec67050326a856b9a359881d7c2a697e8812"}, ] [package.dependencies] @@ -1809,13 +1809,13 @@ jeepney = ">=0.6" [[package]] name = "setuptools" -version = "70.1.0" +version = "70.1.1" description = "Easily download, build, install, upgrade, and uninstall Python packages" optional = false python-versions = ">=3.8" files = [ - {file = "setuptools-70.1.0-py3-none-any.whl", hash = "sha256:d9b8b771455a97c8a9f3ab3448ebe0b29b5e105f1228bba41028be116985a267"}, - {file = "setuptools-70.1.0.tar.gz", hash = "sha256:01a1e793faa5bd89abc851fa15d0a0db26f160890c7102cd8dce643e886b47f5"}, + {file = "setuptools-70.1.1-py3-none-any.whl", hash = "sha256:a58a8fde0541dab0419750bcc521fbdf8585f6e5cb41909df3a472ef7b81ca95"}, + {file = "setuptools-70.1.1.tar.gz", hash = "sha256:937a48c7cdb7a21eb53cd7f9b59e525503aa8abaf3584c730dc5f7a5bec3a650"}, ] [package.extras] @@ -2316,4 +2316,4 @@ docs = ["furo", "linkify-it-py", "myst-parser", "sphinx", "sphinx-autodoc-typehi [metadata] lock-version = "2.0" python-versions = ">=3.10,<3.12" -content-hash = "8f6b3ed457a36930e118b0341bb41746f827d6ea2b54cf19dcdd9636a06ddca0" +content-hash = "7d137ba6ff95551cc94bf58da95ec1fa8be48fadaae95b09bb6107b777ffe8e5" diff --git a/pyproject.toml b/pyproject.toml index 44c85f06..3084d92f 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -40,7 +40,7 @@ attrs = '>=21.2' click = '>=8.0' click-help-colors = '>=0.9' pillow = '>=10.0' -pyexiv2 = '>=2.6.2' +pyexiv2 = '>=2.10' pyinaturalist = '>=0.19' pyinaturalist-convert = '>=0.6.2' pyside6 = '^6.6.0'