From e455236e282ae0d7b64cef6aee62c93425d7c165 Mon Sep 17 00:00:00 2001 From: John Seekins Date: Mon, 27 Oct 2025 17:58:58 -0600 Subject: [PATCH 01/16] start switch to lefthook and clean up switch Signed-off-by: John Seekins --- .config/mise.toml | 3 ++- .pre-commit-config.yaml | 18 ------------------ README.md | 8 +++++--- enrichers/general.py | 4 ++-- main.py | 7 +++++++ 5 files changed, 16 insertions(+), 24 deletions(-) diff --git a/.config/mise.toml b/.config/mise.toml index 470aebb..d967fdd 100644 --- a/.config/mise.toml +++ b/.config/mise.toml @@ -1,2 +1,3 @@ [tools] -python = "3.13.3" +python = "3.14.0" +lefthook = "latest" diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 09a5086..c87dc69 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -24,21 +24,3 @@ repos: - id: yamllint args: - "-c=.yamllint-config.yaml" - - - repo: local - hooks: - - id: ruff-format - language: system - name: Ruff Formatting - entry: uv run ruff format -q . - files: \.py$ - - id: ruff-check - name: Ruff Syntax checking - language: system - entry: uv run ruff check --fix -q - files: \.py$ - # - id: mypy - # name: MyPy type validation - # language: system - # entry: uv run mypy . - # files: \.py$ diff --git a/README.md b/README.md index d23856f..a50f5e6 100644 --- a/README.md +++ b/README.md @@ -78,7 +78,7 @@ Examples of the full setup for some OSes are below: eval "$(mise activate bash)" pip install --upgrade pip wheel uv uv sync - uv run pre-commit install + lefthook install pre-commit -f ``` Another command for installing mise in your session can also work (in bash): @@ -98,7 +98,7 @@ Another command for installing mise in your session can also work (in bash): eval "$(mise activate zsh)" pip install --upgrade pip wheel uv uv sync - uv run pre-commit install + lefthook install pre-commit -f ``` ## Todo / Known Issues @@ -115,7 +115,9 @@ seems wrong. ## Contributing & Code Standards -We have a [.pre-commit-config.yaml](.pre-commit-config.yaml) file which enforces some linting / formatting rules. +We have a [.lefthook.yml](.lefthook.yml) file which enforces some linting / formatting rules. + +We also rely on [ruff](https://docs.astral.sh/ruff/) and [mypy](https://www.mypy-lang.org/) for ensuring python coding standards. Pull requests and reviews are welcome on the main repo. For checking type safety use [mypy](https://github.com/python/mypy): diff --git a/enrichers/general.py b/enrichers/general.py index 9edd669..426d293 100644 --- a/enrichers/general.py +++ b/enrichers/general.py @@ -1,4 +1,4 @@ -from concurrent.futures import ProcessPoolExecutor +from concurrent.futures import ThreadPoolExecutor import copy from enrichers import ( openstreetmap, @@ -20,7 +20,7 @@ def enrich_facility_data(facilities_data: dict, workers: int = 3) -> dict: total = len(facilities_data["facilities"]) processed = 0 - with ProcessPoolExecutor(max_workers=workers) as pool: + with ThreadPoolExecutor(max_workers=workers) as pool: for res in pool.map(_enrich_facility, facilities_data["facilities"].items()): enriched_data["facilities"][res[0]] = res[1] # type: ignore [index] processed += 1 diff --git a/main.py b/main.py index 2496839..1a63a1f 100644 --- a/main.py +++ b/main.py @@ -127,6 +127,7 @@ def main() -> None: logger.error("Can't scrape and load existing data!") exit(1) + facilities_data = {} if args.scrape: facilities_data = facilities_scrape_wrapper( keep_sheet=not args.delete_sheets, @@ -139,6 +140,12 @@ def main() -> None: "Loaded %s existing facilities from local data. (Not scraping)", len(facilities_data["facilities"].keys()), # type: ignore [attr-defined] ) + elif args.enrich: + facilities_data = copy.deepcopy(default_data.facilities_data) + logger.warning( + "Did not supply --scrape or --load-existing. Proceeding with default data set (%s facilities)", + len(facilities_data["facilities"].keys()), # type: ignore [attr-defined] + ) if args.enrich: if not facilities_data: From 92920922633ce124856c63cfcc1559567cd933ff Mon Sep 17 00:00:00 2001 From: John Seekins Date: Mon, 27 Oct 2025 18:09:15 -0600 Subject: [PATCH 02/16] more lefthook work Signed-off-by: John Seekins --- .config/mise.toml | 5 ++++- .lefthook.yml | 18 ++++++++++++++++++ .pre-commit-config.yaml | 7 ------- enrichers/general.py | 4 ++-- 4 files changed, 24 insertions(+), 10 deletions(-) create mode 100644 .lefthook.yml diff --git a/.config/mise.toml b/.config/mise.toml index d967fdd..c6e9bfa 100644 --- a/.config/mise.toml +++ b/.config/mise.toml @@ -1,3 +1,6 @@ [tools] -python = "3.14.0" +python = "3.13.3" lefthook = "latest" +yamllint = "latest" +actionlint = "latest" +shellcheck = "latest" diff --git a/.lefthook.yml b/.lefthook.yml new file mode 100644 index 0000000..e8228ac --- /dev/null +++ b/.lefthook.yml @@ -0,0 +1,18 @@ +pre-commit: + jobs: + - name: yaml linting + run: yamllint -c .yamllint-config.yaml . + glob: "*.y*ml" + - name: Github Action linting + run: actionlint + include: + - ".github/workflows/*.y*ml" + - name: Ruff Formatting + run: uv run ruff format -q . + glob: "*.py" + - name: Ruff Syntax checking + run: uv run ruff check --fix -q + glob: "*.py" + - name: MyPy type validation + run: uv run mypy . + glob: "*.py" diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index c87dc69..b7cfc5f 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -17,10 +17,3 @@ repos: rev: v0.45.0 hooks: - id: markdownlint - - - repo: https://github.com/adrienverge/yamllint - rev: v1.37.1 - hooks: - - id: yamllint - args: - - "-c=.yamllint-config.yaml" diff --git a/enrichers/general.py b/enrichers/general.py index 426d293..9edd669 100644 --- a/enrichers/general.py +++ b/enrichers/general.py @@ -1,4 +1,4 @@ -from concurrent.futures import ThreadPoolExecutor +from concurrent.futures import ProcessPoolExecutor import copy from enrichers import ( openstreetmap, @@ -20,7 +20,7 @@ def enrich_facility_data(facilities_data: dict, workers: int = 3) -> dict: total = len(facilities_data["facilities"]) processed = 0 - with ThreadPoolExecutor(max_workers=workers) as pool: + with ProcessPoolExecutor(max_workers=workers) as pool: for res in pool.map(_enrich_facility, facilities_data["facilities"].items()): enriched_data["facilities"][res[0]] = res[1] # type: ignore [index] processed += 1 From 72e5d7980315d4bc5c1adab78f09c4febf8c7d63 Mon Sep 17 00:00:00 2001 From: John Seekins Date: Mon, 27 Oct 2025 18:18:45 -0600 Subject: [PATCH 03/16] more lefthook updates Signed-off-by: John Seekins --- .config/mise.toml | 1 + .lefthook.yml | 28 ++++++++++++++++++++++++---- 2 files changed, 25 insertions(+), 4 deletions(-) diff --git a/.config/mise.toml b/.config/mise.toml index c6e9bfa..549a973 100644 --- a/.config/mise.toml +++ b/.config/mise.toml @@ -4,3 +4,4 @@ lefthook = "latest" yamllint = "latest" actionlint = "latest" shellcheck = "latest" +markdownlint-cli2 = 'latest' diff --git a/.lefthook.yml b/.lefthook.yml index e8228ac..57ef038 100644 --- a/.lefthook.yml +++ b/.lefthook.yml @@ -1,18 +1,38 @@ +# Refer for explanation to following link: +# https://lefthook.dev/configuration/ pre-commit: + parallel: true jobs: + - name: markdown linting + run: markdownlint-cli2 --fix --config .markdownlint.json {staged_files} + glob: + - "*.md" + exclude: + - .github/pull_request_template.md + stage_fixed: true - name: yaml linting run: yamllint -c .yamllint-config.yaml . glob: "*.y*ml" - name: Github Action linting run: actionlint - include: + glob: - ".github/workflows/*.y*ml" - name: Ruff Formatting run: uv run ruff format -q . - glob: "*.py" + glob: + - "*.py" + stage_fixed: true - name: Ruff Syntax checking run: uv run ruff check --fix -q - glob: "*.py" + glob: + - "*.py" + stage_fixed: true - name: MyPy type validation run: uv run mypy . - glob: "*.py" + glob: + - "*.py" + +output: + - success + - failure + - summary From fc13d15909037a5f7e273dad09770a342d046ce8 Mon Sep 17 00:00:00 2001 From: John Seekins Date: Tue, 28 Oct 2025 07:43:17 -0600 Subject: [PATCH 04/16] additional lefthook configs Signed-off-by: John Seekins --- .config/mise.toml | 3 ++- .lefthook.yml | 31 ++++++++++++++++++++-- tools/.library.sh | 11 ++++++++ tools/check-file-format.sh | 29 +++++++++++++++++++++ tools/check-json.sh | 30 ++++++++++++++++++++++ tools/check-merge-conflicts.sh | 47 ++++++++++++++++++++++++++++++++++ 6 files changed, 148 insertions(+), 3 deletions(-) create mode 100755 tools/.library.sh create mode 100755 tools/check-file-format.sh create mode 100755 tools/check-json.sh create mode 100755 tools/check-merge-conflicts.sh diff --git a/.config/mise.toml b/.config/mise.toml index 549a973..c1d15a7 100644 --- a/.config/mise.toml +++ b/.config/mise.toml @@ -4,4 +4,5 @@ lefthook = "latest" yamllint = "latest" actionlint = "latest" shellcheck = "latest" -markdownlint-cli2 = 'latest' +markdownlint-cli2 = "latest" +jq = "latest" diff --git a/.lefthook.yml b/.lefthook.yml index 57ef038..1a50fe8 100644 --- a/.lefthook.yml +++ b/.lefthook.yml @@ -3,35 +3,62 @@ pre-commit: parallel: true jobs: + - name: shell script validation + run: shellcheck --shell=bash -x {staged_files} + glob: + - "*.sh" + - "*.zsh" + - "*.bash" + + - name: dockerfile linting + run: hadolint {staged_files} + glob: + - "Dockerfile" + - "**/Dockerfile" + - name: markdown linting run: markdownlint-cli2 --fix --config .markdownlint.json {staged_files} glob: - "*.md" - exclude: - - .github/pull_request_template.md stage_fixed: true + - name: yaml linting run: yamllint -c .yamllint-config.yaml . glob: "*.y*ml" + - name: Github Action linting run: actionlint glob: - ".github/workflows/*.y*ml" + - name: Ruff Formatting run: uv run ruff format -q . glob: - "*.py" stage_fixed: true + - name: Ruff Syntax checking run: uv run ruff check --fix -q glob: - "*.py" stage_fixed: true + - name: MyPy type validation run: uv run mypy . glob: - "*.py" + - name: json validation + run: tools/check-json.sh {staged_files} + glob: + - "*.json" + + - name: check for merge conflicts + run: tools/check-merge-conflicts.sh {staged_files} + + - name: check for file format + run: tools/check-file-format.sh {staged_files} + output: - success - failure diff --git a/tools/.library.sh b/tools/.library.sh new file mode 100755 index 0000000..40a2e1e --- /dev/null +++ b/tools/.library.sh @@ -0,0 +1,11 @@ +#!/usr/bin/env bash + +set -eo pipefail +LC_ALL=C +export LC_ALL + +function git_files { + FILES=$(git ls-files --exclude-standard) + FILES+=" $(git ls-files --exclude-standard --others)" + echo "${FILES}" +} diff --git a/tools/check-file-format.sh b/tools/check-file-format.sh new file mode 100755 index 0000000..78668d7 --- /dev/null +++ b/tools/check-file-format.sh @@ -0,0 +1,29 @@ +#!/usr/bin/env bash + +set -eou pipefail + +SCRIPT_DIR=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd ) +pushd "${SCRIPT_DIR}" > /dev/null || exit 1 +pushd "$(git rev-parse --show-toplevel)" > /dev/null || exit 1 + +. tools/.library.sh + +if [[ $# -eq 0 ]]; then + FILES=$(git_files | xargs) +else + FILES=$* +fi +exit_code=0 + +for fn in ${FILES}; do + if [[ "${fn}" == *".sh" || "${fn}" == *".zsh" || "${fn}" == *".bash" ]]; then + if [[ ! -x "${fn}" ]]; then + echo "${fn} is not executable, but probably should be" + exit_code=1 + fi + fi +done + +popd > /dev/null || exit 1 +popd > /dev/null || exit 1 +exit "${exit_code}" diff --git a/tools/check-json.sh b/tools/check-json.sh new file mode 100755 index 0000000..1c0e41a --- /dev/null +++ b/tools/check-json.sh @@ -0,0 +1,30 @@ +#!/usr/bin/env bash + +set -eou pipefail + +SCRIPT_DIR=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd ) +pushd "${SCRIPT_DIR}" > /dev/null || exit 1 +pushd "$(git rev-parse --show-toplevel)" > /dev/null || exit 1 + +. tools/.library.sh + +if [[ $# -eq 0 ]]; then + FILES=$(git_files | grep "json$" | xargs) +else + FILES=$* +fi + +exit_code=0 +for fn in ${FILES}; do + set +e + error=$(jq '.' "${fn}" 2>&1 > /dev/null) + set -e + if [[ -n "${error}" ]]; then + printf "Failure reading %s\n\t%s\n" "${fn}" "${error}" + exit_code=1 + fi +done + +popd > /dev/null || exit 1 +popd > /dev/null || exit 1 +exit "${exit_code}" diff --git a/tools/check-merge-conflicts.sh b/tools/check-merge-conflicts.sh new file mode 100755 index 0000000..5760c40 --- /dev/null +++ b/tools/check-merge-conflicts.sh @@ -0,0 +1,47 @@ +#!/usr/bin/env bash + +set -eou pipefail + +gitdir=$(git rev-parse --git-dir) +# if we aren't actively merging, there's no reason to check for conflict artifacts +if [[ ! -f "${gitdir}/MERGE_MSG" && ! -f "${gitdir}/MERGE_HEAD" && ! -f "${gitdir}/rebase-apply" && ! -f "${gitdir}/rebase-merge" ]]; then + exit 0 +fi + +SCRIPT_DIR=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd ) +pushd "${SCRIPT_DIR}" > /dev/null || exit 1 +pushd "$(git rev-parse --show-toplevel)" > /dev/null || exit 1 + +. tools/.library.sh + +if [[ $# -eq 0 ]]; then + FILES=$(git_files | xargs) +else + FILES=$* +fi + +patterns=( \ + "<<<<<<< "\ + "======= "\ + "=======\r\n" \ + "=======\n" \ + ">>>>>>> " \ +) + +exit_code=0 +for fn in ${FILES}; do + for pattern in "${patterns[@]}"; do + set +e + error=$(grep "${pattern}" "${fn}" 2>&1 > /dev/null) + set -e + if [[ -n "${error}" ]]; then + printf "%s may have merge conflict artifacts\n\t%s\n" "${fn}" "${error}" + exit_code=1 + break + fi + done +done + +popd > /dev/null || exit 1 +popd > /dev/null || exit 1 +exit "${exit_code}" From fae500d3cd76fd85b4b0d30f7fbc9fe484b63414 Mon Sep 17 00:00:00 2001 From: John Seekins Date: Tue, 28 Oct 2025 08:15:37 -0600 Subject: [PATCH 05/16] more file checks Signed-off-by: John Seekins --- .lefthook.yml | 7 ++- .pre-commit-config.yaml | 8 --- main.py | 0 tools/check-file-details.sh | 61 +++++++++++++++++++ ...eck-file-format.sh => check-whitespace.sh} | 17 ++++-- tools/find_missing_vera.py | 0 6 files changed, 77 insertions(+), 16 deletions(-) mode change 100644 => 100755 main.py create mode 100755 tools/check-file-details.sh rename tools/{check-file-format.sh => check-whitespace.sh} (69%) mode change 100644 => 100755 tools/find_missing_vera.py diff --git a/.lefthook.yml b/.lefthook.yml index 1a50fe8..3245055 100644 --- a/.lefthook.yml +++ b/.lefthook.yml @@ -56,8 +56,11 @@ pre-commit: - name: check for merge conflicts run: tools/check-merge-conflicts.sh {staged_files} - - name: check for file format - run: tools/check-file-format.sh {staged_files} + - name: check for bad file details + run: tools/check-file-details.sh {staged_files} + env: + - FILE_SIZE: 107374182400 + stage_fixed: true output: - success diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index b7cfc5f..fd27cd6 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -4,16 +4,8 @@ repos: - repo: https://github.com/pre-commit/pre-commit-hooks rev: v6.0.0 hooks: - - id: check-json - - id: trailing-whitespace - id: end-of-file-fixer - id: check-added-large-files args: - "--maxkb=5000" - - id: check-merge-conflict - id: check-symlinks - - - repo: https://github.com/igorshubovych/markdownlint-cli - rev: v0.45.0 - hooks: - - id: markdownlint diff --git a/main.py b/main.py old mode 100644 new mode 100755 diff --git a/tools/check-file-details.sh b/tools/check-file-details.sh new file mode 100755 index 0000000..748f7c9 --- /dev/null +++ b/tools/check-file-details.sh @@ -0,0 +1,61 @@ +#!/usr/bin/env bash + +set -eou pipefail + +SCRIPT_DIR=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd ) +pushd "${SCRIPT_DIR}" > /dev/null || exit 1 +pushd "$(git rev-parse --show-toplevel)" > /dev/null || exit 1 + +. tools/.library.sh + +if [[ $# -eq 0 ]]; then + FILES=$(git_files | xargs) +else + FILES=$* +fi +SHEBANG_FIXED=() +WHITESPACE_TO_FIX=() +FILE_SIZE=${FILE_SIZE:-5000} +TOO_BIG=() +exit_code=0 + +for fn in ${FILES}; do + set +e + shebang=$(grep -l "^#!/" "${fn}") + if [[ -n "${shebang}" && ! -x "${fn}" ]]; then + chmod +x "${fn}" + SHEBANG_FIXED+=("${fn}") + exit_code=1 + fi + set +e + # grep exits non-0 when it doesn't find anything + whitespace=$(grep -l ' +$' "${fn}") + set -e + if [[ -n "${whitespace}" ]]; then + WHITESPACE_TO_FIX+=("${whitespace}") + exit_code=1 + fi + size=$(stat --printf="%s" "${fn}") + if [[ "${size}" -gt "${FILE_SIZE}" ]]; then + TOO_BIG+=("${fn}: ${size}") + exit_code=1 + fi +done + +if [[ "${#SHEBANG_FIXED[@]}" -gt 0 ]]; then + echo "Fixed executable bit on:" + printf '\t%s\n' "${SHEBANG_FIXED[@]}" +fi +if [[ "${#WHITESPACE_TO_FIX[@]}" -gt 0 ]]; then + echo "Should clean whitespace on:" + printf '\t%s\n' "${WHITESPACE_TO_FIX[@]}" +fi + +if [[ "${#TOO_BIG[@]}" -gt 0 ]]; then + echo "Files larger than ${FILE_SIZE}:" + printf '\t%s\n' "${TOO_BIG[@]}" +fi + +popd > /dev/null || exit 1 +popd > /dev/null || exit 1 +exit "${exit_code}" diff --git a/tools/check-file-format.sh b/tools/check-whitespace.sh similarity index 69% rename from tools/check-file-format.sh rename to tools/check-whitespace.sh index 78668d7..c52c6b4 100755 --- a/tools/check-file-format.sh +++ b/tools/check-whitespace.sh @@ -13,17 +13,22 @@ if [[ $# -eq 0 ]]; then else FILES=$* fi -exit_code=0 +TO_FIX=() +exit_code=0 +set +e for fn in ${FILES}; do - if [[ "${fn}" == *".sh" || "${fn}" == *".zsh" || "${fn}" == *".bash" ]]; then - if [[ ! -x "${fn}" ]]; then - echo "${fn} is not executable, but probably should be" - exit_code=1 - fi + found=$(grep -l ' +$' "${fn}") + if [[ -n "${found}" ]]; then + TO_FIX+=("${found}") + exit_code=1 fi done +set -e +if [[ "${#TO_FIX[@]}" -gt 0 ]]; then + printf '%s\n' "${TO_FIX[@]}" +fi popd > /dev/null || exit 1 popd > /dev/null || exit 1 exit "${exit_code}" diff --git a/tools/find_missing_vera.py b/tools/find_missing_vera.py old mode 100644 new mode 100755 From 412786f1c5c7dcfba9e491206e58aa485ce6fbde Mon Sep 17 00:00:00 2001 From: John Seekins Date: Tue, 28 Oct 2025 08:17:03 -0600 Subject: [PATCH 06/16] remove file Signed-off-by: John Seekins --- .pre-commit-config.yaml | 11 ----------- 1 file changed, 11 deletions(-) delete mode 100644 .pre-commit-config.yaml diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml deleted file mode 100644 index fd27cd6..0000000 --- a/.pre-commit-config.yaml +++ /dev/null @@ -1,11 +0,0 @@ -# See https://pre-commit.com for more information -# See https://pre-commit.com/hooks.html for more hooks -repos: - - repo: https://github.com/pre-commit/pre-commit-hooks - rev: v6.0.0 - hooks: - - id: end-of-file-fixer - - id: check-added-large-files - args: - - "--maxkb=5000" - - id: check-symlinks From b664e070b60e46e95a104af738512483eb29878f Mon Sep 17 00:00:00 2001 From: John Seekins Date: Tue, 28 Oct 2025 08:20:46 -0600 Subject: [PATCH 07/16] reasonable file size default Signed-off-by: John Seekins --- .lefthook.yml | 2 -- tools/check-file-details.sh | 3 ++- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/.lefthook.yml b/.lefthook.yml index 3245055..1aee3aa 100644 --- a/.lefthook.yml +++ b/.lefthook.yml @@ -58,8 +58,6 @@ pre-commit: - name: check for bad file details run: tools/check-file-details.sh {staged_files} - env: - - FILE_SIZE: 107374182400 stage_fixed: true output: diff --git a/tools/check-file-details.sh b/tools/check-file-details.sh index 748f7c9..c4f7dd6 100755 --- a/tools/check-file-details.sh +++ b/tools/check-file-details.sh @@ -15,7 +15,8 @@ else fi SHEBANG_FIXED=() WHITESPACE_TO_FIX=() -FILE_SIZE=${FILE_SIZE:-5000} +# default to 5 MB +FILE_SIZE=${FILE_SIZE:-5000000} TOO_BIG=() exit_code=0 From c1b614211245e08c35f3f80ea0195ea58b953282 Mon Sep 17 00:00:00 2001 From: John Seekins Date: Tue, 28 Oct 2025 18:40:52 -0600 Subject: [PATCH 08/16] bump deps Signed-off-by: John Seekins --- uv.lock | 86 +++++++++++++++++++++++++++++++++------------------------ 1 file changed, 50 insertions(+), 36 deletions(-) diff --git a/uv.lock b/uv.lock index b0aaf54..0a34f86 100644 --- a/uv.lock +++ b/uv.lock @@ -334,24 +334,38 @@ wheels = [ [[package]] name = "pyarrow" -version = "21.0.0" +version = "22.0.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/ef/c2/ea068b8f00905c06329a3dfcd40d0fcc2b7d0f2e355bdb25b65e0a0e4cd4/pyarrow-21.0.0.tar.gz", hash = "sha256:5051f2dccf0e283ff56335760cbc8622cf52264d67e359d5569541ac11b6d5bc", size = 1133487, upload-time = "2025-07-18T00:57:31.761Z" } +sdist = { url = "https://files.pythonhosted.org/packages/30/53/04a7fdc63e6056116c9ddc8b43bc28c12cdd181b85cbeadb79278475f3ae/pyarrow-22.0.0.tar.gz", hash = "sha256:3d600dc583260d845c7d8a6db540339dd883081925da2bd1c5cb808f720b3cd9", size = 1151151, upload-time = "2025-10-24T12:30:00.762Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/16/ca/c7eaa8e62db8fb37ce942b1ea0c6d7abfe3786ca193957afa25e71b81b66/pyarrow-21.0.0-cp313-cp313-macosx_12_0_arm64.whl", hash = "sha256:e99310a4ebd4479bcd1964dff9e14af33746300cb014aa4a3781738ac63baf4a", size = 31154306, upload-time = "2025-07-18T00:56:04.42Z" }, - { url = "https://files.pythonhosted.org/packages/ce/e8/e87d9e3b2489302b3a1aea709aaca4b781c5252fcb812a17ab6275a9a484/pyarrow-21.0.0-cp313-cp313-macosx_12_0_x86_64.whl", hash = "sha256:d2fe8e7f3ce329a71b7ddd7498b3cfac0eeb200c2789bd840234f0dc271a8efe", size = 32680622, upload-time = "2025-07-18T00:56:07.505Z" }, - { url = "https://files.pythonhosted.org/packages/84/52/79095d73a742aa0aba370c7942b1b655f598069489ab387fe47261a849e1/pyarrow-21.0.0-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:f522e5709379d72fb3da7785aa489ff0bb87448a9dc5a75f45763a795a089ebd", size = 41104094, upload-time = "2025-07-18T00:56:10.994Z" }, - { url = "https://files.pythonhosted.org/packages/89/4b/7782438b551dbb0468892a276b8c789b8bbdb25ea5c5eb27faadd753e037/pyarrow-21.0.0-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:69cbbdf0631396e9925e048cfa5bce4e8c3d3b41562bbd70c685a8eb53a91e61", size = 42825576, upload-time = "2025-07-18T00:56:15.569Z" }, - { url = "https://files.pythonhosted.org/packages/b3/62/0f29de6e0a1e33518dec92c65be0351d32d7ca351e51ec5f4f837a9aab91/pyarrow-21.0.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:731c7022587006b755d0bdb27626a1a3bb004bb56b11fb30d98b6c1b4718579d", size = 43368342, upload-time = "2025-07-18T00:56:19.531Z" }, - { url = "https://files.pythonhosted.org/packages/90/c7/0fa1f3f29cf75f339768cc698c8ad4ddd2481c1742e9741459911c9ac477/pyarrow-21.0.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:dc56bc708f2d8ac71bd1dcb927e458c93cec10b98eb4120206a4091db7b67b99", size = 45131218, upload-time = "2025-07-18T00:56:23.347Z" }, - { url = "https://files.pythonhosted.org/packages/01/63/581f2076465e67b23bc5a37d4a2abff8362d389d29d8105832e82c9c811c/pyarrow-21.0.0-cp313-cp313-win_amd64.whl", hash = "sha256:186aa00bca62139f75b7de8420f745f2af12941595bbbfa7ed3870ff63e25636", size = 26087551, upload-time = "2025-07-18T00:56:26.758Z" }, - { url = "https://files.pythonhosted.org/packages/c9/ab/357d0d9648bb8241ee7348e564f2479d206ebe6e1c47ac5027c2e31ecd39/pyarrow-21.0.0-cp313-cp313t-macosx_12_0_arm64.whl", hash = "sha256:a7a102574faa3f421141a64c10216e078df467ab9576684d5cd696952546e2da", size = 31290064, upload-time = "2025-07-18T00:56:30.214Z" }, - { url = "https://files.pythonhosted.org/packages/3f/8a/5685d62a990e4cac2043fc76b4661bf38d06efed55cf45a334b455bd2759/pyarrow-21.0.0-cp313-cp313t-macosx_12_0_x86_64.whl", hash = "sha256:1e005378c4a2c6db3ada3ad4c217b381f6c886f0a80d6a316fe586b90f77efd7", size = 32727837, upload-time = "2025-07-18T00:56:33.935Z" }, - { url = "https://files.pythonhosted.org/packages/fc/de/c0828ee09525c2bafefd3e736a248ebe764d07d0fd762d4f0929dbc516c9/pyarrow-21.0.0-cp313-cp313t-manylinux_2_28_aarch64.whl", hash = "sha256:65f8e85f79031449ec8706b74504a316805217b35b6099155dd7e227eef0d4b6", size = 41014158, upload-time = "2025-07-18T00:56:37.528Z" }, - { url = "https://files.pythonhosted.org/packages/6e/26/a2865c420c50b7a3748320b614f3484bfcde8347b2639b2b903b21ce6a72/pyarrow-21.0.0-cp313-cp313t-manylinux_2_28_x86_64.whl", hash = "sha256:3a81486adc665c7eb1a2bde0224cfca6ceaba344a82a971ef059678417880eb8", size = 42667885, upload-time = "2025-07-18T00:56:41.483Z" }, - { url = "https://files.pythonhosted.org/packages/0a/f9/4ee798dc902533159250fb4321267730bc0a107d8c6889e07c3add4fe3a5/pyarrow-21.0.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:fc0d2f88b81dcf3ccf9a6ae17f89183762c8a94a5bdcfa09e05cfe413acf0503", size = 43276625, upload-time = "2025-07-18T00:56:48.002Z" }, - { url = "https://files.pythonhosted.org/packages/5a/da/e02544d6997037a4b0d22d8e5f66bc9315c3671371a8b18c79ade1cefe14/pyarrow-21.0.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:6299449adf89df38537837487a4f8d3bd91ec94354fdd2a7d30bc11c48ef6e79", size = 44951890, upload-time = "2025-07-18T00:56:52.568Z" }, - { url = "https://files.pythonhosted.org/packages/e5/4e/519c1bc1876625fe6b71e9a28287c43ec2f20f73c658b9ae1d485c0c206e/pyarrow-21.0.0-cp313-cp313t-win_amd64.whl", hash = "sha256:222c39e2c70113543982c6b34f3077962b44fca38c0bd9e68bb6781534425c10", size = 26371006, upload-time = "2025-07-18T00:56:56.379Z" }, + { url = "https://files.pythonhosted.org/packages/a6/d6/d0fac16a2963002fc22c8fa75180a838737203d558f0ed3b564c4a54eef5/pyarrow-22.0.0-cp313-cp313-macosx_12_0_arm64.whl", hash = "sha256:e6e95176209257803a8b3d0394f21604e796dadb643d2f7ca21b66c9c0b30c9a", size = 34204629, upload-time = "2025-10-24T10:06:20.274Z" }, + { url = "https://files.pythonhosted.org/packages/c6/9c/1d6357347fbae062ad3f17082f9ebc29cc733321e892c0d2085f42a2212b/pyarrow-22.0.0-cp313-cp313-macosx_12_0_x86_64.whl", hash = "sha256:001ea83a58024818826a9e3f89bf9310a114f7e26dfe404a4c32686f97bd7901", size = 35985783, upload-time = "2025-10-24T10:06:27.301Z" }, + { url = "https://files.pythonhosted.org/packages/ff/c0/782344c2ce58afbea010150df07e3a2f5fdad299cd631697ae7bd3bac6e3/pyarrow-22.0.0-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:ce20fe000754f477c8a9125543f1936ea5b8867c5406757c224d745ed033e691", size = 45020999, upload-time = "2025-10-24T10:06:35.387Z" }, + { url = "https://files.pythonhosted.org/packages/1b/8b/5362443737a5307a7b67c1017c42cd104213189b4970bf607e05faf9c525/pyarrow-22.0.0-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:e0a15757fccb38c410947df156f9749ae4a3c89b2393741a50521f39a8cf202a", size = 47724601, upload-time = "2025-10-24T10:06:43.551Z" }, + { url = "https://files.pythonhosted.org/packages/69/4d/76e567a4fc2e190ee6072967cb4672b7d9249ac59ae65af2d7e3047afa3b/pyarrow-22.0.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:cedb9dd9358e4ea1d9bce3665ce0797f6adf97ff142c8e25b46ba9cdd508e9b6", size = 48001050, upload-time = "2025-10-24T10:06:52.284Z" }, + { url = "https://files.pythonhosted.org/packages/01/5e/5653f0535d2a1aef8223cee9d92944cb6bccfee5cf1cd3f462d7cb022790/pyarrow-22.0.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:252be4a05f9d9185bb8c18e83764ebcfea7185076c07a7a662253af3a8c07941", size = 50307877, upload-time = "2025-10-24T10:07:02.405Z" }, + { url = "https://files.pythonhosted.org/packages/2d/f8/1d0bd75bf9328a3b826e24a16e5517cd7f9fbf8d34a3184a4566ef5a7f29/pyarrow-22.0.0-cp313-cp313-win_amd64.whl", hash = "sha256:a4893d31e5ef780b6edcaf63122df0f8d321088bb0dee4c8c06eccb1ca28d145", size = 27977099, upload-time = "2025-10-24T10:08:07.259Z" }, + { url = "https://files.pythonhosted.org/packages/90/81/db56870c997805bf2b0f6eeeb2d68458bf4654652dccdcf1bf7a42d80903/pyarrow-22.0.0-cp313-cp313t-macosx_12_0_arm64.whl", hash = "sha256:f7fe3dbe871294ba70d789be16b6e7e52b418311e166e0e3cba9522f0f437fb1", size = 34336685, upload-time = "2025-10-24T10:07:11.47Z" }, + { url = "https://files.pythonhosted.org/packages/1c/98/0727947f199aba8a120f47dfc229eeb05df15bcd7a6f1b669e9f882afc58/pyarrow-22.0.0-cp313-cp313t-macosx_12_0_x86_64.whl", hash = "sha256:ba95112d15fd4f1105fb2402c4eab9068f0554435e9b7085924bcfaac2cc306f", size = 36032158, upload-time = "2025-10-24T10:07:18.626Z" }, + { url = "https://files.pythonhosted.org/packages/96/b4/9babdef9c01720a0785945c7cf550e4acd0ebcd7bdd2e6f0aa7981fa85e2/pyarrow-22.0.0-cp313-cp313t-manylinux_2_28_aarch64.whl", hash = "sha256:c064e28361c05d72eed8e744c9605cbd6d2bb7481a511c74071fd9b24bc65d7d", size = 44892060, upload-time = "2025-10-24T10:07:26.002Z" }, + { url = "https://files.pythonhosted.org/packages/f8/ca/2f8804edd6279f78a37062d813de3f16f29183874447ef6d1aadbb4efa0f/pyarrow-22.0.0-cp313-cp313t-manylinux_2_28_x86_64.whl", hash = "sha256:6f9762274496c244d951c819348afbcf212714902742225f649cf02823a6a10f", size = 47504395, upload-time = "2025-10-24T10:07:34.09Z" }, + { url = "https://files.pythonhosted.org/packages/b9/f0/77aa5198fd3943682b2e4faaf179a674f0edea0d55d326d83cb2277d9363/pyarrow-22.0.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:a9d9ffdc2ab696f6b15b4d1f7cec6658e1d788124418cb30030afbae31c64746", size = 48066216, upload-time = "2025-10-24T10:07:43.528Z" }, + { url = "https://files.pythonhosted.org/packages/79/87/a1937b6e78b2aff18b706d738c9e46ade5bfcf11b294e39c87706a0089ac/pyarrow-22.0.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:ec1a15968a9d80da01e1d30349b2b0d7cc91e96588ee324ce1b5228175043e95", size = 50288552, upload-time = "2025-10-24T10:07:53.519Z" }, + { url = "https://files.pythonhosted.org/packages/60/ae/b5a5811e11f25788ccfdaa8f26b6791c9807119dffcf80514505527c384c/pyarrow-22.0.0-cp313-cp313t-win_amd64.whl", hash = "sha256:bba208d9c7decf9961998edf5c65e3ea4355d5818dd6cd0f6809bec1afb951cc", size = 28262504, upload-time = "2025-10-24T10:08:00.932Z" }, + { url = "https://files.pythonhosted.org/packages/bd/b0/0fa4d28a8edb42b0a7144edd20befd04173ac79819547216f8a9f36f9e50/pyarrow-22.0.0-cp314-cp314-macosx_12_0_arm64.whl", hash = "sha256:9bddc2cade6561f6820d4cd73f99a0243532ad506bc510a75a5a65a522b2d74d", size = 34224062, upload-time = "2025-10-24T10:08:14.101Z" }, + { url = "https://files.pythonhosted.org/packages/0f/a8/7a719076b3c1be0acef56a07220c586f25cd24de0e3f3102b438d18ae5df/pyarrow-22.0.0-cp314-cp314-macosx_12_0_x86_64.whl", hash = "sha256:e70ff90c64419709d38c8932ea9fe1cc98415c4f87ea8da81719e43f02534bc9", size = 35990057, upload-time = "2025-10-24T10:08:21.842Z" }, + { url = "https://files.pythonhosted.org/packages/89/3c/359ed54c93b47fb6fe30ed16cdf50e3f0e8b9ccfb11b86218c3619ae50a8/pyarrow-22.0.0-cp314-cp314-manylinux_2_28_aarch64.whl", hash = "sha256:92843c305330aa94a36e706c16209cd4df274693e777ca47112617db7d0ef3d7", size = 45068002, upload-time = "2025-10-24T10:08:29.034Z" }, + { url = "https://files.pythonhosted.org/packages/55/fc/4945896cc8638536ee787a3bd6ce7cec8ec9acf452d78ec39ab328efa0a1/pyarrow-22.0.0-cp314-cp314-manylinux_2_28_x86_64.whl", hash = "sha256:6dda1ddac033d27421c20d7a7943eec60be44e0db4e079f33cc5af3b8280ccde", size = 47737765, upload-time = "2025-10-24T10:08:38.559Z" }, + { url = "https://files.pythonhosted.org/packages/cd/5e/7cb7edeb2abfaa1f79b5d5eb89432356155c8426f75d3753cbcb9592c0fd/pyarrow-22.0.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:84378110dd9a6c06323b41b56e129c504d157d1a983ce8f5443761eb5256bafc", size = 48048139, upload-time = "2025-10-24T10:08:46.784Z" }, + { url = "https://files.pythonhosted.org/packages/88/c6/546baa7c48185f5e9d6e59277c4b19f30f48c94d9dd938c2a80d4d6b067c/pyarrow-22.0.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:854794239111d2b88b40b6ef92aa478024d1e5074f364033e73e21e3f76b25e0", size = 50314244, upload-time = "2025-10-24T10:08:55.771Z" }, + { url = "https://files.pythonhosted.org/packages/3c/79/755ff2d145aafec8d347bf18f95e4e81c00127f06d080135dfc86aea417c/pyarrow-22.0.0-cp314-cp314-win_amd64.whl", hash = "sha256:b883fe6fd85adad7932b3271c38ac289c65b7337c2c132e9569f9d3940620730", size = 28757501, upload-time = "2025-10-24T10:09:59.891Z" }, + { url = "https://files.pythonhosted.org/packages/0e/d2/237d75ac28ced3147912954e3c1a174df43a95f4f88e467809118a8165e0/pyarrow-22.0.0-cp314-cp314t-macosx_12_0_arm64.whl", hash = "sha256:7a820d8ae11facf32585507c11f04e3f38343c1e784c9b5a8b1da5c930547fe2", size = 34355506, upload-time = "2025-10-24T10:09:02.953Z" }, + { url = "https://files.pythonhosted.org/packages/1e/2c/733dfffe6d3069740f98e57ff81007809067d68626c5faef293434d11bd6/pyarrow-22.0.0-cp314-cp314t-macosx_12_0_x86_64.whl", hash = "sha256:c6ec3675d98915bf1ec8b3c7986422682f7232ea76cad276f4c8abd5b7319b70", size = 36047312, upload-time = "2025-10-24T10:09:10.334Z" }, + { url = "https://files.pythonhosted.org/packages/7c/2b/29d6e3782dc1f299727462c1543af357a0f2c1d3c160ce199950d9ca51eb/pyarrow-22.0.0-cp314-cp314t-manylinux_2_28_aarch64.whl", hash = "sha256:3e739edd001b04f654b166204fc7a9de896cf6007eaff33409ee9e50ceaff754", size = 45081609, upload-time = "2025-10-24T10:09:18.61Z" }, + { url = "https://files.pythonhosted.org/packages/8d/42/aa9355ecc05997915af1b7b947a7f66c02dcaa927f3203b87871c114ba10/pyarrow-22.0.0-cp314-cp314t-manylinux_2_28_x86_64.whl", hash = "sha256:7388ac685cab5b279a41dfe0a6ccd99e4dbf322edfb63e02fc0443bf24134e91", size = 47703663, upload-time = "2025-10-24T10:09:27.369Z" }, + { url = "https://files.pythonhosted.org/packages/ee/62/45abedde480168e83a1de005b7b7043fd553321c1e8c5a9a114425f64842/pyarrow-22.0.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:f633074f36dbc33d5c05b5dc75371e5660f1dbf9c8b1d95669def05e5425989c", size = 48066543, upload-time = "2025-10-24T10:09:34.908Z" }, + { url = "https://files.pythonhosted.org/packages/84/e9/7878940a5b072e4f3bf998770acafeae13b267f9893af5f6d4ab3904b67e/pyarrow-22.0.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:4c19236ae2402a8663a2c8f21f1870a03cc57f0bef7e4b6eb3238cc82944de80", size = 50288838, upload-time = "2025-10-24T10:09:44.394Z" }, + { url = "https://files.pythonhosted.org/packages/7b/03/f335d6c52b4a4761bcc83499789a1e2e16d9d201a58c327a9b5cc9a41bd9/pyarrow-22.0.0-cp314-cp314t-win_amd64.whl", hash = "sha256:0c34fe18094686194f204a3b1787a27456897d8a2d62caf84b61e8dfbc0252ae", size = 29185594, upload-time = "2025-10-24T10:09:53.111Z" }, ] [[package]] @@ -407,28 +421,28 @@ wheels = [ [[package]] name = "ruff" -version = "0.14.1" +version = "0.14.2" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/9e/58/6ca66896635352812de66f71cdf9ff86b3a4f79071ca5730088c0cd0fc8d/ruff-0.14.1.tar.gz", hash = "sha256:1dd86253060c4772867c61791588627320abcb6ed1577a90ef432ee319729b69", size = 5513429, upload-time = "2025-10-16T18:05:41.766Z" } +sdist = { url = "https://files.pythonhosted.org/packages/ee/34/8218a19b2055b80601e8fd201ec723c74c7fe1ca06d525a43ed07b6d8e85/ruff-0.14.2.tar.gz", hash = "sha256:98da787668f239313d9c902ca7c523fe11b8ec3f39345553a51b25abc4629c96", size = 5539663, upload-time = "2025-10-23T19:37:00.956Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/8d/39/9cc5ab181478d7a18adc1c1e051a84ee02bec94eb9bdfd35643d7c74ca31/ruff-0.14.1-py3-none-linux_armv6l.whl", hash = "sha256:083bfc1f30f4a391ae09c6f4f99d83074416b471775b59288956f5bc18e82f8b", size = 12445415, upload-time = "2025-10-16T18:04:48.227Z" }, - { url = "https://files.pythonhosted.org/packages/ef/2e/1226961855ccd697255988f5a2474890ac7c5863b080b15bd038df820818/ruff-0.14.1-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:f6fa757cd717f791009f7669fefb09121cc5f7d9bd0ef211371fad68c2b8b224", size = 12784267, upload-time = "2025-10-16T18:04:52.515Z" }, - { url = "https://files.pythonhosted.org/packages/c1/ea/fd9e95863124ed159cd0667ec98449ae461de94acda7101f1acb6066da00/ruff-0.14.1-py3-none-macosx_11_0_arm64.whl", hash = "sha256:d6191903d39ac156921398e9c86b7354d15e3c93772e7dbf26c9fcae59ceccd5", size = 11781872, upload-time = "2025-10-16T18:04:55.396Z" }, - { url = "https://files.pythonhosted.org/packages/1e/5a/e890f7338ff537dba4589a5e02c51baa63020acfb7c8cbbaea4831562c96/ruff-0.14.1-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ed04f0e04f7a4587244e5c9d7df50e6b5bf2705d75059f409a6421c593a35896", size = 12226558, upload-time = "2025-10-16T18:04:58.166Z" }, - { url = "https://files.pythonhosted.org/packages/a6/7a/8ab5c3377f5bf31e167b73651841217542bcc7aa1c19e83030835cc25204/ruff-0.14.1-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5c9e6cf6cd4acae0febbce29497accd3632fe2025c0c583c8b87e8dbdeae5f61", size = 12187898, upload-time = "2025-10-16T18:05:01.455Z" }, - { url = "https://files.pythonhosted.org/packages/48/8d/ba7c33aa55406955fc124e62c8259791c3d42e3075a71710fdff9375134f/ruff-0.14.1-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a6fa2458527794ecdfbe45f654e42c61f2503a230545a91af839653a0a93dbc6", size = 12939168, upload-time = "2025-10-16T18:05:04.397Z" }, - { url = "https://files.pythonhosted.org/packages/b4/c2/70783f612b50f66d083380e68cbd1696739d88e9b4f6164230375532c637/ruff-0.14.1-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:39f1c392244e338b21d42ab29b8a6392a722c5090032eb49bb4d6defcdb34345", size = 14386942, upload-time = "2025-10-16T18:05:07.102Z" }, - { url = "https://files.pythonhosted.org/packages/48/44/cd7abb9c776b66d332119d67f96acf15830d120f5b884598a36d9d3f4d83/ruff-0.14.1-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7382fa12a26cce1f95070ce450946bec357727aaa428983036362579eadcc5cf", size = 13990622, upload-time = "2025-10-16T18:05:09.882Z" }, - { url = "https://files.pythonhosted.org/packages/eb/56/4259b696db12ac152fe472764b4f78bbdd9b477afd9bc3a6d53c01300b37/ruff-0.14.1-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dd0bf2be3ae8521e1093a487c4aa3b455882f139787770698530d28ed3fbb37c", size = 13431143, upload-time = "2025-10-16T18:05:13.46Z" }, - { url = "https://files.pythonhosted.org/packages/e0/35/266a80d0eb97bd224b3265b9437bd89dde0dcf4faf299db1212e81824e7e/ruff-0.14.1-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cabcaa9ccf8089fb4fdb78d17cc0e28241520f50f4c2e88cb6261ed083d85151", size = 13132844, upload-time = "2025-10-16T18:05:16.1Z" }, - { url = "https://files.pythonhosted.org/packages/65/6e/d31ce218acc11a8d91ef208e002a31acf315061a85132f94f3df7a252b18/ruff-0.14.1-py3-none-manylinux_2_31_riscv64.whl", hash = "sha256:747d583400f6125ec11a4c14d1c8474bf75d8b419ad22a111a537ec1a952d192", size = 13401241, upload-time = "2025-10-16T18:05:19.395Z" }, - { url = "https://files.pythonhosted.org/packages/9f/b5/dbc4221bf0b03774b3b2f0d47f39e848d30664157c15b965a14d890637d2/ruff-0.14.1-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:5a6e74c0efd78515a1d13acbfe6c90f0f5bd822aa56b4a6d43a9ffb2ae6e56cd", size = 12132476, upload-time = "2025-10-16T18:05:22.163Z" }, - { url = "https://files.pythonhosted.org/packages/98/4b/ac99194e790ccd092d6a8b5f341f34b6e597d698e3077c032c502d75ea84/ruff-0.14.1-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:0ea6a864d2fb41a4b6d5b456ed164302a0d96f4daac630aeba829abfb059d020", size = 12139749, upload-time = "2025-10-16T18:05:25.162Z" }, - { url = "https://files.pythonhosted.org/packages/47/26/7df917462c3bb5004e6fdfcc505a49e90bcd8a34c54a051953118c00b53a/ruff-0.14.1-py3-none-musllinux_1_2_i686.whl", hash = "sha256:0826b8764f94229604fa255918d1cc45e583e38c21c203248b0bfc9a0e930be5", size = 12544758, upload-time = "2025-10-16T18:05:28.018Z" }, - { url = "https://files.pythonhosted.org/packages/64/d0/81e7f0648e9764ad9b51dd4be5e5dac3fcfff9602428ccbae288a39c2c22/ruff-0.14.1-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:cbc52160465913a1a3f424c81c62ac8096b6a491468e7d872cb9444a860bc33d", size = 13221811, upload-time = "2025-10-16T18:05:30.707Z" }, - { url = "https://files.pythonhosted.org/packages/c3/07/3c45562c67933cc35f6d5df4ca77dabbcd88fddaca0d6b8371693d29fd56/ruff-0.14.1-py3-none-win32.whl", hash = "sha256:e037ea374aaaff4103240ae79168c0945ae3d5ae8db190603de3b4012bd1def6", size = 12319467, upload-time = "2025-10-16T18:05:33.261Z" }, - { url = "https://files.pythonhosted.org/packages/02/88/0ee4ca507d4aa05f67e292d2e5eb0b3e358fbcfe527554a2eda9ac422d6b/ruff-0.14.1-py3-none-win_amd64.whl", hash = "sha256:59d599cdff9c7f925a017f6f2c256c908b094e55967f93f2821b1439928746a1", size = 13401123, upload-time = "2025-10-16T18:05:35.984Z" }, - { url = "https://files.pythonhosted.org/packages/b8/81/4b6387be7014858d924b843530e1b2a8e531846807516e9bea2ee0936bf7/ruff-0.14.1-py3-none-win_arm64.whl", hash = "sha256:e3b443c4c9f16ae850906b8d0a707b2a4c16f8d2f0a7fe65c475c5886665ce44", size = 12436636, upload-time = "2025-10-16T18:05:38.995Z" }, + { url = "https://files.pythonhosted.org/packages/16/dd/23eb2db5ad9acae7c845700493b72d3ae214dce0b226f27df89216110f2b/ruff-0.14.2-py3-none-linux_armv6l.whl", hash = "sha256:7cbe4e593505bdec5884c2d0a4d791a90301bc23e49a6b1eb642dd85ef9c64f1", size = 12533390, upload-time = "2025-10-23T19:36:18.044Z" }, + { url = "https://files.pythonhosted.org/packages/5a/8c/5f9acff43ddcf3f85130d0146d0477e28ccecc495f9f684f8f7119b74c0d/ruff-0.14.2-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:8d54b561729cee92f8d89c316ad7a3f9705533f5903b042399b6ae0ddfc62e11", size = 12887187, upload-time = "2025-10-23T19:36:22.664Z" }, + { url = "https://files.pythonhosted.org/packages/99/fa/047646491479074029665022e9f3dc6f0515797f40a4b6014ea8474c539d/ruff-0.14.2-py3-none-macosx_11_0_arm64.whl", hash = "sha256:5c8753dfa44ebb2cde10ce5b4d2ef55a41fb9d9b16732a2c5df64620dbda44a3", size = 11925177, upload-time = "2025-10-23T19:36:24.778Z" }, + { url = "https://files.pythonhosted.org/packages/15/8b/c44cf7fe6e59ab24a9d939493a11030b503bdc2a16622cede8b7b1df0114/ruff-0.14.2-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3d0bbeffb8d9f4fccf7b5198d566d0bad99a9cb622f1fc3467af96cb8773c9e3", size = 12358285, upload-time = "2025-10-23T19:36:26.979Z" }, + { url = "https://files.pythonhosted.org/packages/45/01/47701b26254267ef40369aea3acb62a7b23e921c27372d127e0f3af48092/ruff-0.14.2-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:7047f0c5a713a401e43a88d36843d9c83a19c584e63d664474675620aaa634a8", size = 12303832, upload-time = "2025-10-23T19:36:29.192Z" }, + { url = "https://files.pythonhosted.org/packages/2d/5c/ae7244ca4fbdf2bee9d6405dcd5bc6ae51ee1df66eb7a9884b77b8af856d/ruff-0.14.2-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3bf8d2f9aa1602599217d82e8e0af7fd33e5878c4d98f37906b7c93f46f9a839", size = 13036995, upload-time = "2025-10-23T19:36:31.861Z" }, + { url = "https://files.pythonhosted.org/packages/27/4c/0860a79ce6fd4c709ac01173f76f929d53f59748d0dcdd662519835dae43/ruff-0.14.2-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:1c505b389e19c57a317cf4b42db824e2fca96ffb3d86766c1c9f8b96d32048a7", size = 14512649, upload-time = "2025-10-23T19:36:33.915Z" }, + { url = "https://files.pythonhosted.org/packages/7f/7f/d365de998069720a3abfc250ddd876fc4b81a403a766c74ff9bde15b5378/ruff-0.14.2-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a307fc45ebd887b3f26b36d9326bb70bf69b01561950cdcc6c0bdf7bb8e0f7cc", size = 14088182, upload-time = "2025-10-23T19:36:36.983Z" }, + { url = "https://files.pythonhosted.org/packages/6c/ea/d8e3e6b209162000a7be1faa41b0a0c16a133010311edc3329753cc6596a/ruff-0.14.2-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:61ae91a32c853172f832c2f40bd05fd69f491db7289fb85a9b941ebdd549781a", size = 13599516, upload-time = "2025-10-23T19:36:39.208Z" }, + { url = "https://files.pythonhosted.org/packages/fa/ea/c7810322086db68989fb20a8d5221dd3b79e49e396b01badca07b433ab45/ruff-0.14.2-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc1967e40286f63ee23c615e8e7e98098dedc7301568bd88991f6e544d8ae096", size = 13272690, upload-time = "2025-10-23T19:36:41.453Z" }, + { url = "https://files.pythonhosted.org/packages/a9/39/10b05acf8c45786ef501d454e00937e1b97964f846bf28883d1f9619928a/ruff-0.14.2-py3-none-manylinux_2_31_riscv64.whl", hash = "sha256:2877f02119cdebf52a632d743a2e302dea422bfae152ebe2f193d3285a3a65df", size = 13496497, upload-time = "2025-10-23T19:36:43.61Z" }, + { url = "https://files.pythonhosted.org/packages/59/a1/1f25f8301e13751c30895092485fada29076e5e14264bdacc37202e85d24/ruff-0.14.2-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:e681c5bc777de5af898decdcb6ba3321d0d466f4cb43c3e7cc2c3b4e7b843a05", size = 12266116, upload-time = "2025-10-23T19:36:45.625Z" }, + { url = "https://files.pythonhosted.org/packages/5c/fa/0029bfc9ce16ae78164e6923ef392e5f173b793b26cc39aa1d8b366cf9dc/ruff-0.14.2-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:e21be42d72e224736f0c992cdb9959a2fa53c7e943b97ef5d081e13170e3ffc5", size = 12281345, upload-time = "2025-10-23T19:36:47.618Z" }, + { url = "https://files.pythonhosted.org/packages/a5/ab/ece7baa3c0f29b7683be868c024f0838770c16607bea6852e46b202f1ff6/ruff-0.14.2-py3-none-musllinux_1_2_i686.whl", hash = "sha256:b8264016f6f209fac16262882dbebf3f8be1629777cf0f37e7aff071b3e9b92e", size = 12629296, upload-time = "2025-10-23T19:36:49.789Z" }, + { url = "https://files.pythonhosted.org/packages/a4/7f/638f54b43f3d4e48c6a68062794e5b367ddac778051806b9e235dfb7aa81/ruff-0.14.2-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:5ca36b4cb4db3067a3b24444463ceea5565ea78b95fe9a07ca7cb7fd16948770", size = 13371610, upload-time = "2025-10-23T19:36:51.882Z" }, + { url = "https://files.pythonhosted.org/packages/8d/35/3654a973ebe5b32e1fd4a08ed2d46755af7267da7ac710d97420d7b8657d/ruff-0.14.2-py3-none-win32.whl", hash = "sha256:41775927d287685e08f48d8eb3f765625ab0b7042cc9377e20e64f4eb0056ee9", size = 12415318, upload-time = "2025-10-23T19:36:53.961Z" }, + { url = "https://files.pythonhosted.org/packages/71/30/3758bcf9e0b6a4193a6f51abf84254aba00887dfa8c20aba18aa366c5f57/ruff-0.14.2-py3-none-win_amd64.whl", hash = "sha256:0df3424aa5c3c08b34ed8ce099df1021e3adaca6e90229273496b839e5a7e1af", size = 13565279, upload-time = "2025-10-23T19:36:56.578Z" }, + { url = "https://files.pythonhosted.org/packages/2e/5d/aa883766f8ef9ffbe6aa24f7192fb71632f31a30e77eb39aa2b0dc4290ac/ruff-0.14.2-py3-none-win_arm64.whl", hash = "sha256:ea9d635e83ba21569fbacda7e78afbfeb94911c9434aff06192d9bc23fd5495a", size = 12554956, upload-time = "2025-10-23T19:36:58.714Z" }, ] [[package]] From 49b6638b4553ed1230b469915ff329a6fa8dd1c2 Mon Sep 17 00:00:00 2001 From: John Seekins Date: Tue, 28 Oct 2025 21:52:01 -0600 Subject: [PATCH 09/16] remove un-used packages Signed-off-by: John Seekins --- .config/mise.toml | 1 - .lefthook.yml | 6 --- pyproject.toml | 1 - uv.lock | 122 ---------------------------------------------- 4 files changed, 130 deletions(-) diff --git a/.config/mise.toml b/.config/mise.toml index c1d15a7..858198c 100644 --- a/.config/mise.toml +++ b/.config/mise.toml @@ -4,5 +4,4 @@ lefthook = "latest" yamllint = "latest" actionlint = "latest" shellcheck = "latest" -markdownlint-cli2 = "latest" jq = "latest" diff --git a/.lefthook.yml b/.lefthook.yml index 1aee3aa..eec8311 100644 --- a/.lefthook.yml +++ b/.lefthook.yml @@ -10,12 +10,6 @@ pre-commit: - "*.zsh" - "*.bash" - - name: dockerfile linting - run: hadolint {staged_files} - glob: - - "Dockerfile" - - "**/Dockerfile" - - name: markdown linting run: markdownlint-cli2 --fix --config .markdownlint.json {staged_files} glob: diff --git a/pyproject.toml b/pyproject.toml index 5eb7e15..bd830cd 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -17,7 +17,6 @@ dependencies = [ [dependency-groups] dev = [ "mypy>=1.17.1", - "pre-commit>=4.3.0", "ruff>=0.12.12", "types-beautifulsoup4>=4.12.0.20250516", "types-requests>=2.32.4.20250809", diff --git a/uv.lock b/uv.lock index 0a34f86..8befaa5 100644 --- a/uv.lock +++ b/uv.lock @@ -24,15 +24,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/e4/37/af0d2ef3967ac0d6113837b44a4f0bfe1328c2b9763bd5b1744520e5cfed/certifi-2025.10.5-py3-none-any.whl", hash = "sha256:0f212c2744a9bb6de0c56639a6f68afe01ecd92d91f14ae897c4fe7bbeeef0de", size = 163286, upload-time = "2025-10-05T04:12:14.03Z" }, ] -[[package]] -name = "cfgv" -version = "3.4.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/11/74/539e56497d9bd1d484fd863dd69cbbfa653cd2aa27abfe35653494d85e94/cfgv-3.4.0.tar.gz", hash = "sha256:e52591d4c5f5dead8e0f673fb16db7949d2cfb3f7da4582893288f0ded8fe560", size = 7114, upload-time = "2023-08-12T20:38:17.776Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/c5/55/51844dd50c4fc7a33b653bfaba4c2456f06955289ca770a5dbd5fd267374/cfgv-3.4.0-py2.py3-none-any.whl", hash = "sha256:b7265b1f29fd3316bfcd2b330d63d024f2bfd8bcb8b0272f8e19a504856c48f9", size = 7249, upload-time = "2023-08-12T20:38:16.269Z" }, -] - [[package]] name = "charset-normalizer" version = "3.4.4" @@ -74,15 +65,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/0a/4c/925909008ed5a988ccbb72dcc897407e5d6d3bd72410d69e051fc0c14647/charset_normalizer-3.4.4-py3-none-any.whl", hash = "sha256:7a32c560861a02ff789ad905a2fe94e3f840803362c84fecf1851cb4cf3dc37f", size = 53402, upload-time = "2025-10-14T04:42:31.76Z" }, ] -[[package]] -name = "distlib" -version = "0.4.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/96/8e/709914eb2b5749865801041647dc7f4e6d00b549cfe88b65ca192995f07c/distlib-0.4.0.tar.gz", hash = "sha256:feec40075be03a04501a973d81f633735b4b69f98b05450592310c0f401a4e0d", size = 614605, upload-time = "2025-07-17T16:52:00.465Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/33/6b/e0547afaf41bf2c42e52430072fa5658766e3d65bd4b03a563d1b6336f57/distlib-0.4.0-py2.py3-none-any.whl", hash = "sha256:9659f7d87e46584a30b5780e43ac7a2143098441670ff0a49d5f9034c54a6c16", size = 469047, upload-time = "2025-07-17T16:51:58.613Z" }, -] - [[package]] name = "fastexcel" version = "0.16.0" @@ -96,15 +78,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/9c/2e/805c2d0e799710e4937d084d9c37821bafa129eda1de62c3279a042ca56d/fastexcel-0.16.0-cp39-abi3-win_amd64.whl", hash = "sha256:04c2b6fea7292e26d76a458f9095f4ec260c864c90be7a7161d20ca81cf77fd8", size = 2819876, upload-time = "2025-09-22T12:34:38.716Z" }, ] -[[package]] -name = "filelock" -version = "3.20.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/58/46/0028a82567109b5ef6e4d2a1f04a583fb513e6cf9527fcdd09afd817deeb/filelock-3.20.0.tar.gz", hash = "sha256:711e943b4ec6be42e1d4e6690b48dc175c822967466bb31c0c293f34334c13f4", size = 18922, upload-time = "2025-10-08T18:03:50.056Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/76/91/7216b27286936c16f5b4d0c530087e4a54eead683e6b0b73dd0c64844af6/filelock-3.20.0-py3-none-any.whl", hash = "sha256:339b4732ffda5cd79b13f4e2711a31b0365ce445d95d243bb996273d072546a2", size = 16054, upload-time = "2025-10-08T18:03:48.35Z" }, -] - [[package]] name = "ice-detention-scraper" version = "1.0.0" @@ -122,7 +95,6 @@ dependencies = [ [package.dev-dependencies] dev = [ { name = "mypy" }, - { name = "pre-commit" }, { name = "ruff" }, { name = "types-beautifulsoup4" }, { name = "types-requests" }, @@ -142,21 +114,11 @@ requires-dist = [ [package.metadata.requires-dev] dev = [ { name = "mypy", specifier = ">=1.17.1" }, - { name = "pre-commit", specifier = ">=4.3.0" }, { name = "ruff", specifier = ">=0.12.12" }, { name = "types-beautifulsoup4", specifier = ">=4.12.0.20250516" }, { name = "types-requests", specifier = ">=2.32.4.20250809" }, ] -[[package]] -name = "identify" -version = "2.6.15" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/ff/e7/685de97986c916a6d93b3876139e00eef26ad5bbbd61925d670ae8013449/identify-2.6.15.tar.gz", hash = "sha256:e4f4864b96c6557ef2a1e1c951771838f4edc9df3a72ec7118b338801b11c7bf", size = 99311, upload-time = "2025-10-02T17:43:40.631Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/0f/1c/e5fd8f973d4f375adb21565739498e2e9a1e54c858a97b9a8ccfdc81da9b/identify-2.6.15-py2.py3-none-any.whl", hash = "sha256:1181ef7608e00704db228516541eb83a88a9f94433a8c80bb9b5bd54b1d81757", size = 99183, upload-time = "2025-10-02T17:43:39.137Z" }, -] - [[package]] name = "idna" version = "3.11" @@ -263,15 +225,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/79/7b/2c79738432f5c924bef5071f933bcc9efd0473bac3b4aa584a6f7c1c8df8/mypy_extensions-1.1.0-py3-none-any.whl", hash = "sha256:1be4cccdb0f2482337c4743e60421de3a356cd97508abadd57d47403e94f5505", size = 4963, upload-time = "2025-04-22T14:54:22.983Z" }, ] -[[package]] -name = "nodeenv" -version = "1.9.1" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/43/16/fc88b08840de0e0a72a2f9d8c6bae36be573e475a6326ae854bcc549fc45/nodeenv-1.9.1.tar.gz", hash = "sha256:6ec12890a2dab7946721edbfbcd91f3319c6ccc9aec47be7c7e6b7011ee6645f", size = 47437, upload-time = "2024-06-04T18:44:11.171Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/d2/1d/1b658dbd2b9fa9c4c9f32accbfc0205d532c8c6194dc0f2a4c0428e7128a/nodeenv-1.9.1-py2.py3-none-any.whl", hash = "sha256:ba11c9782d29c27c70ffbdda2d7415098754709be8a7056d79a737cd901155c9", size = 22314, upload-time = "2024-06-04T18:44:08.352Z" }, -] - [[package]] name = "pathspec" version = "0.12.1" @@ -281,15 +234,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/cc/20/ff623b09d963f88bfde16306a54e12ee5ea43e9b597108672ff3a408aad6/pathspec-0.12.1-py3-none-any.whl", hash = "sha256:a0d503e138a4c123b27490a4f7beda6a01c6f288df0e4a8b79c7eb0dc7b4cc08", size = 31191, upload-time = "2023-12-10T22:30:43.14Z" }, ] -[[package]] -name = "platformdirs" -version = "4.5.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/61/33/9611380c2bdb1225fdef633e2a9610622310fed35ab11dac9620972ee088/platformdirs-4.5.0.tar.gz", hash = "sha256:70ddccdd7c99fc5942e9fc25636a8b34d04c24b335100223152c2803e4063312", size = 21632, upload-time = "2025-10-08T17:44:48.791Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/73/cb/ac7874b3e5d58441674fb70742e6c374b28b0c7cb988d37d991cde47166c/platformdirs-4.5.0-py3-none-any.whl", hash = "sha256:e578a81bb873cbb89a41fcc904c7ef523cc18284b7e3b3ccf06aca1403b7ebd3", size = 18651, upload-time = "2025-10-08T17:44:47.223Z" }, -] - [[package]] name = "polars" version = "1.34.0" @@ -316,22 +260,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/a3/31/84efa27aa3478c8670bac1a720c8b1aee5c58c9c657c980e5e5c47fde883/polars_runtime_32-1.34.0-cp39-abi3-win_arm64.whl", hash = "sha256:f9ed1765378dfe0bcd1ac5ec570dd9eab27ea728bbc980cc9a76eebc55586559", size = 35873216, upload-time = "2025-10-02T18:30:17.439Z" }, ] -[[package]] -name = "pre-commit" -version = "4.3.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "cfgv" }, - { name = "identify" }, - { name = "nodeenv" }, - { name = "pyyaml" }, - { name = "virtualenv" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/ff/29/7cf5bbc236333876e4b41f56e06857a87937ce4bf91e117a6991a2dbb02a/pre_commit-4.3.0.tar.gz", hash = "sha256:499fe450cc9d42e9d58e606262795ecb64dd05438943c62b66f6a8673da30b16", size = 193792, upload-time = "2025-08-09T18:56:14.651Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/5b/a5/987a405322d78a73b66e39e4a90e4ef156fd7141bf71df987e50717c321b/pre_commit-4.3.0-py2.py3-none-any.whl", hash = "sha256:2b0747ad7e6e967169136edffee14c16e148a778a54e4f967921aa1ebf2308d8", size = 220965, upload-time = "2025-08-09T18:56:13.192Z" }, -] - [[package]] name = "pyarrow" version = "22.0.0" @@ -368,42 +296,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/7b/03/f335d6c52b4a4761bcc83499789a1e2e16d9d201a58c327a9b5cc9a41bd9/pyarrow-22.0.0-cp314-cp314t-win_amd64.whl", hash = "sha256:0c34fe18094686194f204a3b1787a27456897d8a2d62caf84b61e8dfbc0252ae", size = 29185594, upload-time = "2025-10-24T10:09:53.111Z" }, ] -[[package]] -name = "pyyaml" -version = "6.0.3" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/05/8e/961c0007c59b8dd7729d542c61a4d537767a59645b82a0b521206e1e25c2/pyyaml-6.0.3.tar.gz", hash = "sha256:d76623373421df22fb4cf8817020cbb7ef15c725b9d5e45f17e189bfc384190f", size = 130960, upload-time = "2025-09-25T21:33:16.546Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/d1/11/0fd08f8192109f7169db964b5707a2f1e8b745d4e239b784a5a1dd80d1db/pyyaml-6.0.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:8da9669d359f02c0b91ccc01cac4a67f16afec0dac22c2ad09f46bee0697eba8", size = 181669, upload-time = "2025-09-25T21:32:23.673Z" }, - { url = "https://files.pythonhosted.org/packages/b1/16/95309993f1d3748cd644e02e38b75d50cbc0d9561d21f390a76242ce073f/pyyaml-6.0.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:2283a07e2c21a2aa78d9c4442724ec1eb15f5e42a723b99cb3d822d48f5f7ad1", size = 173252, upload-time = "2025-09-25T21:32:25.149Z" }, - { url = "https://files.pythonhosted.org/packages/50/31/b20f376d3f810b9b2371e72ef5adb33879b25edb7a6d072cb7ca0c486398/pyyaml-6.0.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ee2922902c45ae8ccada2c5b501ab86c36525b883eff4255313a253a3160861c", size = 767081, upload-time = "2025-09-25T21:32:26.575Z" }, - { url = "https://files.pythonhosted.org/packages/49/1e/a55ca81e949270d5d4432fbbd19dfea5321eda7c41a849d443dc92fd1ff7/pyyaml-6.0.3-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:a33284e20b78bd4a18c8c2282d549d10bc8408a2a7ff57653c0cf0b9be0afce5", size = 841159, upload-time = "2025-09-25T21:32:27.727Z" }, - { url = "https://files.pythonhosted.org/packages/74/27/e5b8f34d02d9995b80abcef563ea1f8b56d20134d8f4e5e81733b1feceb2/pyyaml-6.0.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0f29edc409a6392443abf94b9cf89ce99889a1dd5376d94316ae5145dfedd5d6", size = 801626, upload-time = "2025-09-25T21:32:28.878Z" }, - { url = "https://files.pythonhosted.org/packages/f9/11/ba845c23988798f40e52ba45f34849aa8a1f2d4af4b798588010792ebad6/pyyaml-6.0.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:f7057c9a337546edc7973c0d3ba84ddcdf0daa14533c2065749c9075001090e6", size = 753613, upload-time = "2025-09-25T21:32:30.178Z" }, - { url = "https://files.pythonhosted.org/packages/3d/e0/7966e1a7bfc0a45bf0a7fb6b98ea03fc9b8d84fa7f2229e9659680b69ee3/pyyaml-6.0.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:eda16858a3cab07b80edaf74336ece1f986ba330fdb8ee0d6c0d68fe82bc96be", size = 794115, upload-time = "2025-09-25T21:32:31.353Z" }, - { url = "https://files.pythonhosted.org/packages/de/94/980b50a6531b3019e45ddeada0626d45fa85cbe22300844a7983285bed3b/pyyaml-6.0.3-cp313-cp313-win32.whl", hash = "sha256:d0eae10f8159e8fdad514efdc92d74fd8d682c933a6dd088030f3834bc8e6b26", size = 137427, upload-time = "2025-09-25T21:32:32.58Z" }, - { url = "https://files.pythonhosted.org/packages/97/c9/39d5b874e8b28845e4ec2202b5da735d0199dbe5b8fb85f91398814a9a46/pyyaml-6.0.3-cp313-cp313-win_amd64.whl", hash = "sha256:79005a0d97d5ddabfeeea4cf676af11e647e41d81c9a7722a193022accdb6b7c", size = 154090, upload-time = "2025-09-25T21:32:33.659Z" }, - { url = "https://files.pythonhosted.org/packages/73/e8/2bdf3ca2090f68bb3d75b44da7bbc71843b19c9f2b9cb9b0f4ab7a5a4329/pyyaml-6.0.3-cp313-cp313-win_arm64.whl", hash = "sha256:5498cd1645aa724a7c71c8f378eb29ebe23da2fc0d7a08071d89469bf1d2defb", size = 140246, upload-time = "2025-09-25T21:32:34.663Z" }, - { url = "https://files.pythonhosted.org/packages/9d/8c/f4bd7f6465179953d3ac9bc44ac1a8a3e6122cf8ada906b4f96c60172d43/pyyaml-6.0.3-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:8d1fab6bb153a416f9aeb4b8763bc0f22a5586065f86f7664fc23339fc1c1fac", size = 181814, upload-time = "2025-09-25T21:32:35.712Z" }, - { url = "https://files.pythonhosted.org/packages/bd/9c/4d95bb87eb2063d20db7b60faa3840c1b18025517ae857371c4dd55a6b3a/pyyaml-6.0.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:34d5fcd24b8445fadc33f9cf348c1047101756fd760b4dacb5c3e99755703310", size = 173809, upload-time = "2025-09-25T21:32:36.789Z" }, - { url = "https://files.pythonhosted.org/packages/92/b5/47e807c2623074914e29dabd16cbbdd4bf5e9b2db9f8090fa64411fc5382/pyyaml-6.0.3-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:501a031947e3a9025ed4405a168e6ef5ae3126c59f90ce0cd6f2bfc477be31b7", size = 766454, upload-time = "2025-09-25T21:32:37.966Z" }, - { url = "https://files.pythonhosted.org/packages/02/9e/e5e9b168be58564121efb3de6859c452fccde0ab093d8438905899a3a483/pyyaml-6.0.3-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:b3bc83488de33889877a0f2543ade9f70c67d66d9ebb4ac959502e12de895788", size = 836355, upload-time = "2025-09-25T21:32:39.178Z" }, - { url = "https://files.pythonhosted.org/packages/88/f9/16491d7ed2a919954993e48aa941b200f38040928474c9e85ea9e64222c3/pyyaml-6.0.3-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c458b6d084f9b935061bc36216e8a69a7e293a2f1e68bf956dcd9e6cbcd143f5", size = 794175, upload-time = "2025-09-25T21:32:40.865Z" }, - { url = "https://files.pythonhosted.org/packages/dd/3f/5989debef34dc6397317802b527dbbafb2b4760878a53d4166579111411e/pyyaml-6.0.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:7c6610def4f163542a622a73fb39f534f8c101d690126992300bf3207eab9764", size = 755228, upload-time = "2025-09-25T21:32:42.084Z" }, - { url = "https://files.pythonhosted.org/packages/d7/ce/af88a49043cd2e265be63d083fc75b27b6ed062f5f9fd6cdc223ad62f03e/pyyaml-6.0.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:5190d403f121660ce8d1d2c1bb2ef1bd05b5f68533fc5c2ea899bd15f4399b35", size = 789194, upload-time = "2025-09-25T21:32:43.362Z" }, - { url = "https://files.pythonhosted.org/packages/23/20/bb6982b26a40bb43951265ba29d4c246ef0ff59c9fdcdf0ed04e0687de4d/pyyaml-6.0.3-cp314-cp314-win_amd64.whl", hash = "sha256:4a2e8cebe2ff6ab7d1050ecd59c25d4c8bd7e6f400f5f82b96557ac0abafd0ac", size = 156429, upload-time = "2025-09-25T21:32:57.844Z" }, - { url = "https://files.pythonhosted.org/packages/f4/f4/a4541072bb9422c8a883ab55255f918fa378ecf083f5b85e87fc2b4eda1b/pyyaml-6.0.3-cp314-cp314-win_arm64.whl", hash = "sha256:93dda82c9c22deb0a405ea4dc5f2d0cda384168e466364dec6255b293923b2f3", size = 143912, upload-time = "2025-09-25T21:32:59.247Z" }, - { url = "https://files.pythonhosted.org/packages/7c/f9/07dd09ae774e4616edf6cda684ee78f97777bdd15847253637a6f052a62f/pyyaml-6.0.3-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:02893d100e99e03eda1c8fd5c441d8c60103fd175728e23e431db1b589cf5ab3", size = 189108, upload-time = "2025-09-25T21:32:44.377Z" }, - { url = "https://files.pythonhosted.org/packages/4e/78/8d08c9fb7ce09ad8c38ad533c1191cf27f7ae1effe5bb9400a46d9437fcf/pyyaml-6.0.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:c1ff362665ae507275af2853520967820d9124984e0f7466736aea23d8611fba", size = 183641, upload-time = "2025-09-25T21:32:45.407Z" }, - { url = "https://files.pythonhosted.org/packages/7b/5b/3babb19104a46945cf816d047db2788bcaf8c94527a805610b0289a01c6b/pyyaml-6.0.3-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6adc77889b628398debc7b65c073bcb99c4a0237b248cacaf3fe8a557563ef6c", size = 831901, upload-time = "2025-09-25T21:32:48.83Z" }, - { url = "https://files.pythonhosted.org/packages/8b/cc/dff0684d8dc44da4d22a13f35f073d558c268780ce3c6ba1b87055bb0b87/pyyaml-6.0.3-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:a80cb027f6b349846a3bf6d73b5e95e782175e52f22108cfa17876aaeff93702", size = 861132, upload-time = "2025-09-25T21:32:50.149Z" }, - { url = "https://files.pythonhosted.org/packages/b1/5e/f77dc6b9036943e285ba76b49e118d9ea929885becb0a29ba8a7c75e29fe/pyyaml-6.0.3-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:00c4bdeba853cc34e7dd471f16b4114f4162dc03e6b7afcc2128711f0eca823c", size = 839261, upload-time = "2025-09-25T21:32:51.808Z" }, - { url = "https://files.pythonhosted.org/packages/ce/88/a9db1376aa2a228197c58b37302f284b5617f56a5d959fd1763fb1675ce6/pyyaml-6.0.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:66e1674c3ef6f541c35191caae2d429b967b99e02040f5ba928632d9a7f0f065", size = 805272, upload-time = "2025-09-25T21:32:52.941Z" }, - { url = "https://files.pythonhosted.org/packages/da/92/1446574745d74df0c92e6aa4a7b0b3130706a4142b2d1a5869f2eaa423c6/pyyaml-6.0.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:16249ee61e95f858e83976573de0f5b2893b3677ba71c9dd36b9cf8be9ac6d65", size = 829923, upload-time = "2025-09-25T21:32:54.537Z" }, - { url = "https://files.pythonhosted.org/packages/f0/7a/1c7270340330e575b92f397352af856a8c06f230aa3e76f86b39d01b416a/pyyaml-6.0.3-cp314-cp314t-win_amd64.whl", hash = "sha256:4ad1906908f2f5ae4e5a8ddfce73c320c2a1429ec52eafd27138b7f1cbe341c9", size = 174062, upload-time = "2025-09-25T21:32:55.767Z" }, - { url = "https://files.pythonhosted.org/packages/f1/12/de94a39c2ef588c7e6455cfbe7343d3b2dc9d6b6b2f40c4c6565744c873d/pyyaml-6.0.3-cp314-cp314t-win_arm64.whl", hash = "sha256:ebc55a14a21cb14062aa4162f906cd962b28e2e9ea38f9b4391244cd8de4ae0b", size = 149341, upload-time = "2025-09-25T21:32:56.828Z" }, -] - [[package]] name = "requests" version = "2.32.5" @@ -505,20 +397,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/a7/c2/fe1e52489ae3122415c51f387e221dd0773709bad6c6cdaa599e8a2c5185/urllib3-2.5.0-py3-none-any.whl", hash = "sha256:e6b01673c0fa6a13e374b50871808eb3bf7046c4b125b216f6bf1cc604cff0dc", size = 129795, upload-time = "2025-06-18T14:07:40.39Z" }, ] -[[package]] -name = "virtualenv" -version = "20.35.3" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "distlib" }, - { name = "filelock" }, - { name = "platformdirs" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/a4/d5/b0ccd381d55c8f45d46f77df6ae59fbc23d19e901e2d523395598e5f4c93/virtualenv-20.35.3.tar.gz", hash = "sha256:4f1a845d131133bdff10590489610c98c168ff99dc75d6c96853801f7f67af44", size = 6002907, upload-time = "2025-10-10T21:23:33.178Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/27/73/d9a94da0e9d470a543c1b9d3ccbceb0f59455983088e727b8a1824ed90fb/virtualenv-20.35.3-py3-none-any.whl", hash = "sha256:63d106565078d8c8d0b206d48080f938a8b25361e19432d2c9db40d2899c810a", size = 5981061, upload-time = "2025-10-10T21:23:30.433Z" }, -] - [[package]] name = "xlsxwriter" version = "3.2.9" From 7d9062ecfa86fa7fd6d5ee3291c2aa5b002b3e0e Mon Sep 17 00:00:00 2001 From: John Seekins Date: Tue, 28 Oct 2025 21:55:58 -0600 Subject: [PATCH 10/16] add missing dep for markdownlint-cli2 to work Signed-off-by: John Seekins --- .config/mise.toml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.config/mise.toml b/.config/mise.toml index 858198c..89f0b53 100644 --- a/.config/mise.toml +++ b/.config/mise.toml @@ -1,7 +1,9 @@ [tools] python = "3.13.3" +node = "latest" lefthook = "latest" yamllint = "latest" actionlint = "latest" shellcheck = "latest" +markdownlint-cli2 = "latest" jq = "latest" From d0e26f129c28f34efff0692de87ba418d7b4c537 Mon Sep 17 00:00:00 2001 From: John Seekins Date: Wed, 29 Oct 2025 07:52:03 -0600 Subject: [PATCH 11/16] warnings indented more consistently Signed-off-by: John Seekins --- main.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/main.py b/main.py index 1a63a1f..f944e8a 100755 --- a/main.py +++ b/main.py @@ -121,7 +121,7 @@ def main() -> None: # todo. temporary notice for debug arguments. if args.debug_wikipedia or args.debug_wikidata or args.debug_osm: logger.warning( - "Warning: --debug-wikipedia, --debug-wikidata and --debug-osm are currently not implemented as command line options." + " Warning: --debug-wikipedia, --debug-wikidata and --debug-osm are currently not implemented as command line options." ) if args.scrape and args.load_existing: logger.error("Can't scrape and load existing data!") @@ -143,13 +143,13 @@ def main() -> None: elif args.enrich: facilities_data = copy.deepcopy(default_data.facilities_data) logger.warning( - "Did not supply --scrape or --load-existing. Proceeding with default data set (%s facilities)", + " Did not supply --scrape or --load-existing. Proceeding with default data set (%s facilities)", len(facilities_data["facilities"].keys()), # type: ignore [attr-defined] ) if args.enrich: if not facilities_data: - logger.warning("No facility data available for enrichment.") + logger.warning(" No facility data available for enrichment.") return facilities_data = enrich_facility_data(facilities_data, args.enrich_workers) @@ -160,7 +160,7 @@ def main() -> None: export_to_file(facilities_data, output_filename, args.file_type) print_summary(facilities_data) else: - logger.warning("No data to export!") + logger.warning(" No data to export!") if __name__ == "__main__": From 005be10d36cab88c5ea4615703e3aed0dacfed18 Mon Sep 17 00:00:00 2001 From: John Seekins Date: Sat, 1 Nov 2025 13:08:24 -0600 Subject: [PATCH 12/16] update deps more Signed-off-by: John Seekins --- uv.lock | 62 ++++++++++++++++++++++++++++----------------------------- 1 file changed, 31 insertions(+), 31 deletions(-) diff --git a/uv.lock b/uv.lock index 8befaa5..0ff0156 100644 --- a/uv.lock +++ b/uv.lock @@ -236,28 +236,28 @@ wheels = [ [[package]] name = "polars" -version = "1.34.0" +version = "1.35.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "polars-runtime-32" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/a1/3e/35fcf5bf51404371bb172b289a5065778dc97adca4416e199c294125eb05/polars-1.34.0.tar.gz", hash = "sha256:5de5f871027db4b11bcf39215a2d6b13b4a80baf8a55c5862d4ebedfd5cd4013", size = 684309, upload-time = "2025-10-02T18:31:04.396Z" } +sdist = { url = "https://files.pythonhosted.org/packages/9b/5b/3caad788d93304026cbf0ab4c37f8402058b64a2f153b9c62f8b30f5d2ee/polars-1.35.1.tar.gz", hash = "sha256:06548e6d554580151d6ca7452d74bceeec4640b5b9261836889b8e68cfd7a62e", size = 694881, upload-time = "2025-10-30T12:12:52.294Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/6b/80/1791ac226bb989bef30fe8fde752b2021b6ec5dfd6e880262596aedf4c05/polars-1.34.0-py3-none-any.whl", hash = "sha256:40d2f357b4d9e447ad28bd2c9923e4318791a7c18eb68f31f1fbf11180f41391", size = 772686, upload-time = "2025-10-02T18:29:59.492Z" }, + { url = "https://files.pythonhosted.org/packages/9f/4c/21a227b722534404241c2a76beceb7463469d50c775a227fc5c209eb8adc/polars-1.35.1-py3-none-any.whl", hash = "sha256:c29a933f28aa330d96a633adbd79aa5e6a6247a802a720eead9933f4613bdbf4", size = 783598, upload-time = "2025-10-30T12:11:54.668Z" }, ] [[package]] name = "polars-runtime-32" -version = "1.34.0" +version = "1.35.1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/02/10/1189afb14cc47ed215ccf7fbd00ed21c48edfd89e51c16f8628a33ae4b1b/polars_runtime_32-1.34.0.tar.gz", hash = "sha256:ebe6f865128a0d833f53a3f6828360761ad86d1698bceb22bef9fd999500dc1c", size = 2634491, upload-time = "2025-10-02T18:31:05.502Z" } +sdist = { url = "https://files.pythonhosted.org/packages/df/3e/19c252e8eb4096300c1a36ec3e50a27e5fa9a1ccaf32d3927793c16abaee/polars_runtime_32-1.35.1.tar.gz", hash = "sha256:f6b4ec9cd58b31c87af1b8c110c9c986d82345f1d50d7f7595b5d447a19dc365", size = 2696218, upload-time = "2025-10-30T12:12:53.479Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/97/35/bc4f1a9dcef61845e8e4e5d2318470b002b93a3564026f0643f562761ecb/polars_runtime_32-1.34.0-cp39-abi3-macosx_10_12_x86_64.whl", hash = "sha256:2878f9951e91121afe60c25433ef270b9a221e6ebf3de5f6642346b38cab3f03", size = 39655423, upload-time = "2025-10-02T18:30:02.846Z" }, - { url = "https://files.pythonhosted.org/packages/a6/bb/d655a103e75b7c81c47a3c2d276be0200c0c15cfb6fd47f17932ddcf7519/polars_runtime_32-1.34.0-cp39-abi3-macosx_11_0_arm64.whl", hash = "sha256:fbc329c7d34a924228cc5dcdbbd4696d94411a3a5b15ad8bb868634c204e1951", size = 35986049, upload-time = "2025-10-02T18:30:05.848Z" }, - { url = "https://files.pythonhosted.org/packages/9e/ce/11ca850b7862cb43605e5d86cdf655614376e0a059871cf8305af5406554/polars_runtime_32-1.34.0-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:93fa51d88a2d12ea996a5747aad5647d22a86cce73c80f208e61f487b10bc448", size = 40261269, upload-time = "2025-10-02T18:30:08.48Z" }, - { url = "https://files.pythonhosted.org/packages/d8/25/77d12018c35489e19f7650b40679714a834effafc25d61e8dcee7c4fafce/polars_runtime_32-1.34.0-cp39-abi3-manylinux_2_24_aarch64.whl", hash = "sha256:79e4d696392c6d8d51f4347f0b167c52eef303c9d87093c0c68e8651198735b7", size = 37049077, upload-time = "2025-10-02T18:30:11.162Z" }, - { url = "https://files.pythonhosted.org/packages/e2/75/c30049d45ea1365151f86f650ed5354124ff3209f0abe588664c8eb13a31/polars_runtime_32-1.34.0-cp39-abi3-win_amd64.whl", hash = "sha256:2501d6b29d9001ea5ea2fd9b598787e10ddf45d8c4a87c2bead75159e8a15711", size = 40105782, upload-time = "2025-10-02T18:30:14.597Z" }, - { url = "https://files.pythonhosted.org/packages/a3/31/84efa27aa3478c8670bac1a720c8b1aee5c58c9c657c980e5e5c47fde883/polars_runtime_32-1.34.0-cp39-abi3-win_arm64.whl", hash = "sha256:f9ed1765378dfe0bcd1ac5ec570dd9eab27ea728bbc980cc9a76eebc55586559", size = 35873216, upload-time = "2025-10-02T18:30:17.439Z" }, + { url = "https://files.pythonhosted.org/packages/08/2c/da339459805a26105e9d9c2f07e43ca5b8baeee55acd5457e6881487a79a/polars_runtime_32-1.35.1-cp39-abi3-macosx_10_12_x86_64.whl", hash = "sha256:6f051a42f6ae2f26e3bc2cf1f170f2120602976e2a3ffb6cfba742eecc7cc620", size = 40525100, upload-time = "2025-10-30T12:11:58.098Z" }, + { url = "https://files.pythonhosted.org/packages/27/70/a0733568b3533481924d2ce68b279ab3d7334e5fa6ed259f671f650b7c5e/polars_runtime_32-1.35.1-cp39-abi3-macosx_11_0_arm64.whl", hash = "sha256:c2232f9cf05ba59efc72d940b86c033d41fd2d70bf2742e8115ed7112a766aa9", size = 36701908, upload-time = "2025-10-30T12:12:02.166Z" }, + { url = "https://files.pythonhosted.org/packages/46/54/6c09137bef9da72fd891ba58c2962cc7c6c5cad4649c0e668d6b344a9d7b/polars_runtime_32-1.35.1-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:42f9837348557fd674477ea40a6ac8a7e839674f6dd0a199df24be91b026024c", size = 41317692, upload-time = "2025-10-30T12:12:04.928Z" }, + { url = "https://files.pythonhosted.org/packages/22/55/81c5b266a947c339edd7fbaa9e1d9614012d02418453f48b76cc177d3dd9/polars_runtime_32-1.35.1-cp39-abi3-manylinux_2_24_aarch64.whl", hash = "sha256:c873aeb36fed182d5ebc35ca17c7eb193fe83ae2ea551ee8523ec34776731390", size = 37853058, upload-time = "2025-10-30T12:12:08.342Z" }, + { url = "https://files.pythonhosted.org/packages/6c/58/be8b034d559eac515f52408fd6537be9bea095bc0388946a4e38910d3d50/polars_runtime_32-1.35.1-cp39-abi3-win_amd64.whl", hash = "sha256:35cde9453ca7032933f0e58e9ed4388f5a1e415dd0db2dd1e442c81d815e630c", size = 41289554, upload-time = "2025-10-30T12:12:11.104Z" }, + { url = "https://files.pythonhosted.org/packages/f4/7f/e0111b9e2a1169ea82cde3ded9c92683e93c26dfccd72aee727996a1ac5b/polars_runtime_32-1.35.1-cp39-abi3-win_arm64.whl", hash = "sha256:fd77757a6c9eb9865c4bfb7b07e22225207c6b7da382bd0b9bd47732f637105d", size = 36958878, upload-time = "2025-10-30T12:12:15.206Z" }, ] [[package]] @@ -313,28 +313,28 @@ wheels = [ [[package]] name = "ruff" -version = "0.14.2" +version = "0.14.3" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/ee/34/8218a19b2055b80601e8fd201ec723c74c7fe1ca06d525a43ed07b6d8e85/ruff-0.14.2.tar.gz", hash = "sha256:98da787668f239313d9c902ca7c523fe11b8ec3f39345553a51b25abc4629c96", size = 5539663, upload-time = "2025-10-23T19:37:00.956Z" } +sdist = { url = "https://files.pythonhosted.org/packages/75/62/50b7727004dfe361104dfbf898c45a9a2fdfad8c72c04ae62900224d6ecf/ruff-0.14.3.tar.gz", hash = "sha256:4ff876d2ab2b161b6de0aa1f5bd714e8e9b4033dc122ee006925fbacc4f62153", size = 5558687, upload-time = "2025-10-31T00:26:26.878Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/16/dd/23eb2db5ad9acae7c845700493b72d3ae214dce0b226f27df89216110f2b/ruff-0.14.2-py3-none-linux_armv6l.whl", hash = "sha256:7cbe4e593505bdec5884c2d0a4d791a90301bc23e49a6b1eb642dd85ef9c64f1", size = 12533390, upload-time = "2025-10-23T19:36:18.044Z" }, - { url = "https://files.pythonhosted.org/packages/5a/8c/5f9acff43ddcf3f85130d0146d0477e28ccecc495f9f684f8f7119b74c0d/ruff-0.14.2-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:8d54b561729cee92f8d89c316ad7a3f9705533f5903b042399b6ae0ddfc62e11", size = 12887187, upload-time = "2025-10-23T19:36:22.664Z" }, - { url = "https://files.pythonhosted.org/packages/99/fa/047646491479074029665022e9f3dc6f0515797f40a4b6014ea8474c539d/ruff-0.14.2-py3-none-macosx_11_0_arm64.whl", hash = "sha256:5c8753dfa44ebb2cde10ce5b4d2ef55a41fb9d9b16732a2c5df64620dbda44a3", size = 11925177, upload-time = "2025-10-23T19:36:24.778Z" }, - { url = "https://files.pythonhosted.org/packages/15/8b/c44cf7fe6e59ab24a9d939493a11030b503bdc2a16622cede8b7b1df0114/ruff-0.14.2-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3d0bbeffb8d9f4fccf7b5198d566d0bad99a9cb622f1fc3467af96cb8773c9e3", size = 12358285, upload-time = "2025-10-23T19:36:26.979Z" }, - { url = "https://files.pythonhosted.org/packages/45/01/47701b26254267ef40369aea3acb62a7b23e921c27372d127e0f3af48092/ruff-0.14.2-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:7047f0c5a713a401e43a88d36843d9c83a19c584e63d664474675620aaa634a8", size = 12303832, upload-time = "2025-10-23T19:36:29.192Z" }, - { url = "https://files.pythonhosted.org/packages/2d/5c/ae7244ca4fbdf2bee9d6405dcd5bc6ae51ee1df66eb7a9884b77b8af856d/ruff-0.14.2-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3bf8d2f9aa1602599217d82e8e0af7fd33e5878c4d98f37906b7c93f46f9a839", size = 13036995, upload-time = "2025-10-23T19:36:31.861Z" }, - { url = "https://files.pythonhosted.org/packages/27/4c/0860a79ce6fd4c709ac01173f76f929d53f59748d0dcdd662519835dae43/ruff-0.14.2-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:1c505b389e19c57a317cf4b42db824e2fca96ffb3d86766c1c9f8b96d32048a7", size = 14512649, upload-time = "2025-10-23T19:36:33.915Z" }, - { url = "https://files.pythonhosted.org/packages/7f/7f/d365de998069720a3abfc250ddd876fc4b81a403a766c74ff9bde15b5378/ruff-0.14.2-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a307fc45ebd887b3f26b36d9326bb70bf69b01561950cdcc6c0bdf7bb8e0f7cc", size = 14088182, upload-time = "2025-10-23T19:36:36.983Z" }, - { url = "https://files.pythonhosted.org/packages/6c/ea/d8e3e6b209162000a7be1faa41b0a0c16a133010311edc3329753cc6596a/ruff-0.14.2-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:61ae91a32c853172f832c2f40bd05fd69f491db7289fb85a9b941ebdd549781a", size = 13599516, upload-time = "2025-10-23T19:36:39.208Z" }, - { url = "https://files.pythonhosted.org/packages/fa/ea/c7810322086db68989fb20a8d5221dd3b79e49e396b01badca07b433ab45/ruff-0.14.2-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc1967e40286f63ee23c615e8e7e98098dedc7301568bd88991f6e544d8ae096", size = 13272690, upload-time = "2025-10-23T19:36:41.453Z" }, - { url = "https://files.pythonhosted.org/packages/a9/39/10b05acf8c45786ef501d454e00937e1b97964f846bf28883d1f9619928a/ruff-0.14.2-py3-none-manylinux_2_31_riscv64.whl", hash = "sha256:2877f02119cdebf52a632d743a2e302dea422bfae152ebe2f193d3285a3a65df", size = 13496497, upload-time = "2025-10-23T19:36:43.61Z" }, - { url = "https://files.pythonhosted.org/packages/59/a1/1f25f8301e13751c30895092485fada29076e5e14264bdacc37202e85d24/ruff-0.14.2-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:e681c5bc777de5af898decdcb6ba3321d0d466f4cb43c3e7cc2c3b4e7b843a05", size = 12266116, upload-time = "2025-10-23T19:36:45.625Z" }, - { url = "https://files.pythonhosted.org/packages/5c/fa/0029bfc9ce16ae78164e6923ef392e5f173b793b26cc39aa1d8b366cf9dc/ruff-0.14.2-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:e21be42d72e224736f0c992cdb9959a2fa53c7e943b97ef5d081e13170e3ffc5", size = 12281345, upload-time = "2025-10-23T19:36:47.618Z" }, - { url = "https://files.pythonhosted.org/packages/a5/ab/ece7baa3c0f29b7683be868c024f0838770c16607bea6852e46b202f1ff6/ruff-0.14.2-py3-none-musllinux_1_2_i686.whl", hash = "sha256:b8264016f6f209fac16262882dbebf3f8be1629777cf0f37e7aff071b3e9b92e", size = 12629296, upload-time = "2025-10-23T19:36:49.789Z" }, - { url = "https://files.pythonhosted.org/packages/a4/7f/638f54b43f3d4e48c6a68062794e5b367ddac778051806b9e235dfb7aa81/ruff-0.14.2-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:5ca36b4cb4db3067a3b24444463ceea5565ea78b95fe9a07ca7cb7fd16948770", size = 13371610, upload-time = "2025-10-23T19:36:51.882Z" }, - { url = "https://files.pythonhosted.org/packages/8d/35/3654a973ebe5b32e1fd4a08ed2d46755af7267da7ac710d97420d7b8657d/ruff-0.14.2-py3-none-win32.whl", hash = "sha256:41775927d287685e08f48d8eb3f765625ab0b7042cc9377e20e64f4eb0056ee9", size = 12415318, upload-time = "2025-10-23T19:36:53.961Z" }, - { url = "https://files.pythonhosted.org/packages/71/30/3758bcf9e0b6a4193a6f51abf84254aba00887dfa8c20aba18aa366c5f57/ruff-0.14.2-py3-none-win_amd64.whl", hash = "sha256:0df3424aa5c3c08b34ed8ce099df1021e3adaca6e90229273496b839e5a7e1af", size = 13565279, upload-time = "2025-10-23T19:36:56.578Z" }, - { url = "https://files.pythonhosted.org/packages/2e/5d/aa883766f8ef9ffbe6aa24f7192fb71632f31a30e77eb39aa2b0dc4290ac/ruff-0.14.2-py3-none-win_arm64.whl", hash = "sha256:ea9d635e83ba21569fbacda7e78afbfeb94911c9434aff06192d9bc23fd5495a", size = 12554956, upload-time = "2025-10-23T19:36:58.714Z" }, + { url = "https://files.pythonhosted.org/packages/ce/8e/0c10ff1ea5d4360ab8bfca4cb2c9d979101a391f3e79d2616c9bf348cd26/ruff-0.14.3-py3-none-linux_armv6l.whl", hash = "sha256:876b21e6c824f519446715c1342b8e60f97f93264012de9d8d10314f8a79c371", size = 12535613, upload-time = "2025-10-31T00:25:44.302Z" }, + { url = "https://files.pythonhosted.org/packages/d3/c8/6724f4634c1daf52409fbf13fefda64aa9c8f81e44727a378b7b73dc590b/ruff-0.14.3-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:b6fd8c79b457bedd2abf2702b9b472147cd860ed7855c73a5247fa55c9117654", size = 12855812, upload-time = "2025-10-31T00:25:47.793Z" }, + { url = "https://files.pythonhosted.org/packages/de/03/db1bce591d55fd5f8a08bb02517fa0b5097b2ccabd4ea1ee29aa72b67d96/ruff-0.14.3-py3-none-macosx_11_0_arm64.whl", hash = "sha256:71ff6edca490c308f083156938c0c1a66907151263c4abdcb588602c6e696a14", size = 11944026, upload-time = "2025-10-31T00:25:49.657Z" }, + { url = "https://files.pythonhosted.org/packages/0b/75/4f8dbd48e03272715d12c87dc4fcaaf21b913f0affa5f12a4e9c6f8a0582/ruff-0.14.3-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:786ee3ce6139772ff9272aaf43296d975c0217ee1b97538a98171bf0d21f87ed", size = 12356818, upload-time = "2025-10-31T00:25:51.949Z" }, + { url = "https://files.pythonhosted.org/packages/ec/9b/506ec5b140c11d44a9a4f284ea7c14ebf6f8b01e6e8917734a3325bff787/ruff-0.14.3-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:cd6291d0061811c52b8e392f946889916757610d45d004e41140d81fb6cd5ddc", size = 12336745, upload-time = "2025-10-31T00:25:54.248Z" }, + { url = "https://files.pythonhosted.org/packages/c7/e1/c560d254048c147f35e7f8131d30bc1f63a008ac61595cf3078a3e93533d/ruff-0.14.3-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a497ec0c3d2c88561b6d90f9c29f5ae68221ac00d471f306fa21fa4264ce5fcd", size = 13101684, upload-time = "2025-10-31T00:25:56.253Z" }, + { url = "https://files.pythonhosted.org/packages/a5/32/e310133f8af5cd11f8cc30f52522a3ebccc5ea5bff4b492f94faceaca7a8/ruff-0.14.3-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:e231e1be58fc568950a04fbe6887c8e4b85310e7889727e2b81db205c45059eb", size = 14535000, upload-time = "2025-10-31T00:25:58.397Z" }, + { url = "https://files.pythonhosted.org/packages/a2/a1/7b0470a22158c6d8501eabc5e9b6043c99bede40fa1994cadf6b5c2a61c7/ruff-0.14.3-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:469e35872a09c0e45fecf48dd960bfbce056b5db2d5e6b50eca329b4f853ae20", size = 14156450, upload-time = "2025-10-31T00:26:00.889Z" }, + { url = "https://files.pythonhosted.org/packages/0a/96/24bfd9d1a7f532b560dcee1a87096332e461354d3882124219bcaff65c09/ruff-0.14.3-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3d6bc90307c469cb9d28b7cfad90aaa600b10d67c6e22026869f585e1e8a2db0", size = 13568414, upload-time = "2025-10-31T00:26:03.291Z" }, + { url = "https://files.pythonhosted.org/packages/a7/e7/138b883f0dfe4ad5b76b58bf4ae675f4d2176ac2b24bdd81b4d966b28c61/ruff-0.14.3-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0e2f8a0bbcffcfd895df39c9a4ecd59bb80dca03dc43f7fb63e647ed176b741e", size = 13315293, upload-time = "2025-10-31T00:26:05.708Z" }, + { url = "https://files.pythonhosted.org/packages/33/f4/c09bb898be97b2eb18476b7c950df8815ef14cf956074177e9fbd40b7719/ruff-0.14.3-py3-none-manylinux_2_31_riscv64.whl", hash = "sha256:678fdd7c7d2d94851597c23ee6336d25f9930b460b55f8598e011b57c74fd8c5", size = 13539444, upload-time = "2025-10-31T00:26:08.09Z" }, + { url = "https://files.pythonhosted.org/packages/9c/aa/b30a1db25fc6128b1dd6ff0741fa4abf969ded161599d07ca7edd0739cc0/ruff-0.14.3-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:1ec1ac071e7e37e0221d2f2dbaf90897a988c531a8592a6a5959f0603a1ecf5e", size = 12252581, upload-time = "2025-10-31T00:26:10.297Z" }, + { url = "https://files.pythonhosted.org/packages/da/13/21096308f384d796ffe3f2960b17054110a9c3828d223ca540c2b7cc670b/ruff-0.14.3-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:afcdc4b5335ef440d19e7df9e8ae2ad9f749352190e96d481dc501b753f0733e", size = 12307503, upload-time = "2025-10-31T00:26:12.646Z" }, + { url = "https://files.pythonhosted.org/packages/cb/cc/a350bac23f03b7dbcde3c81b154706e80c6f16b06ff1ce28ed07dc7b07b0/ruff-0.14.3-py3-none-musllinux_1_2_i686.whl", hash = "sha256:7bfc42f81862749a7136267a343990f865e71fe2f99cf8d2958f684d23ce3dfa", size = 12675457, upload-time = "2025-10-31T00:26:15.044Z" }, + { url = "https://files.pythonhosted.org/packages/cb/76/46346029fa2f2078826bc88ef7167e8c198e58fe3126636e52f77488cbba/ruff-0.14.3-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:a65e448cfd7e9c59fae8cf37f9221585d3354febaad9a07f29158af1528e165f", size = 13403980, upload-time = "2025-10-31T00:26:17.81Z" }, + { url = "https://files.pythonhosted.org/packages/9f/a4/35f1ef68c4e7b236d4a5204e3669efdeefaef21f0ff6a456792b3d8be438/ruff-0.14.3-py3-none-win32.whl", hash = "sha256:f3d91857d023ba93e14ed2d462ab62c3428f9bbf2b4fbac50a03ca66d31991f7", size = 12500045, upload-time = "2025-10-31T00:26:20.503Z" }, + { url = "https://files.pythonhosted.org/packages/03/15/51960ae340823c9859fb60c63301d977308735403e2134e17d1d2858c7fb/ruff-0.14.3-py3-none-win_amd64.whl", hash = "sha256:d7b7006ac0756306db212fd37116cce2bd307e1e109375e1c6c106002df0ae5f", size = 13594005, upload-time = "2025-10-31T00:26:22.533Z" }, + { url = "https://files.pythonhosted.org/packages/b7/73/4de6579bac8e979fca0a77e54dec1f1e011a0d268165eb8a9bc0982a6564/ruff-0.14.3-py3-none-win_arm64.whl", hash = "sha256:26eb477ede6d399d898791d01961e16b86f02bc2486d0d1a7a9bb2379d055dc1", size = 12590017, upload-time = "2025-10-31T00:26:24.52Z" }, ] [[package]] From 7065410c39da730d1605be8c202691814082d152 Mon Sep 17 00:00:00 2001 From: John Seekins Date: Sat, 1 Nov 2025 13:16:34 -0600 Subject: [PATCH 13/16] support multiple file output types and handle missing AOR Signed-off-by: John Seekins --- ice_scrapers/field_offices.py | 5 ++++- main.py | 7 +++++-- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/ice_scrapers/field_offices.py b/ice_scrapers/field_offices.py index 7ee9fe5..041c8ba 100644 --- a/ice_scrapers/field_offices.py +++ b/ice_scrapers/field_offices.py @@ -120,7 +120,10 @@ def _extract_single_office(element: BeautifulSoup, page_url: str) -> dict: field_office = element.select_one(".views-field-title") if field_office: office["field_office"] = field_office.text.strip() - office["id"] = field_office_to_aor[office["field_office"]] + try: + office["id"] = field_office_to_aor[office["field_office"]] + except Exception: + logger.warning("Could not attach %s as a field office! Maybe update AORs?", office["field_office"]) address = element.select_one(".address-line1") if address: office["address"]["street"] = address.text.strip() diff --git a/main.py b/main.py index f944e8a..23841b9 100755 --- a/main.py +++ b/main.py @@ -55,7 +55,6 @@ def main() -> None: ) parser.add_argument( "--file-type", - default="csv", choices=supported_output_types, help="type of file to export", ) @@ -157,7 +156,11 @@ def main() -> None: output_filename = args.output_file_name if args.enrich and not output_filename.endswith("_enriched"): output_filename = f"{output_filename}_enriched" - export_to_file(facilities_data, output_filename, args.file_type) + if not args.file_type: + for ftype in supported_output_types: + export_to_file(facilities_data, output_filename, ftype) + else: + export_to_file(facilities_data, output_filename, args.file_type) print_summary(facilities_data) else: logger.warning(" No data to export!") From e151dfdda9f48aadb6b2f2d091fee85dc708c3d6 Mon Sep 17 00:00:00 2001 From: John Seekins Date: Sat, 1 Nov 2025 13:39:21 -0600 Subject: [PATCH 14/16] correct field office name Signed-off-by: John Seekins --- ice_scrapers/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ice_scrapers/__init__.py b/ice_scrapers/__init__.py index 4db00c4..97d3786 100644 --- a/ice_scrapers/__init__.py +++ b/ice_scrapers/__init__.py @@ -115,7 +115,7 @@ "HLG": "Harlingen Field Office", "HOU": "Houston Field Office", "LOS": "Los Angeles Field Office", - "MIA": "Miami Field Office", + "MIA": "Miramar Sub Office", "NEW": "Newark Field Office", "NOL": "New Orleans Field Office", "NYC": "New York City Field Office", From 957fc9d0cf64d272066500fd26de8cd7c9d4fdc8 Mon Sep 17 00:00:00 2001 From: John Seekins Date: Sat, 1 Nov 2025 13:46:26 -0600 Subject: [PATCH 15/16] ignore all output types correctly and write to a folder instead of the git root Signed-off-by: John Seekins --- .gitignore | 6 ++++++ file_utils.py | 12 +++++++----- utils.py | 3 +++ 3 files changed, 16 insertions(+), 5 deletions(-) diff --git a/.gitignore b/.gitignore index 08f5ebc..1794471 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,11 @@ __pycache__/ *.csv +**/.csv *.json +**/*.json *.xlsx +**/.xlsx *.xlsx# +**/.xlsx# +*.parquet +**/.parquet diff --git a/file_utils.py b/file_utils.py index f9a536c..f1af968 100644 --- a/file_utils.py +++ b/file_utils.py @@ -1,9 +1,11 @@ import copy import json +import os from schemas import enrichment_print_schema from utils import ( convert_to_dataframe, logger, + output_folder, ) import xlsxwriter # type: ignore [import-untyped] @@ -16,8 +18,9 @@ def export_to_file( if not facilities_data or not facilities_data.get("facilities", []): logger.warning("No data to export!") return "" - - full_name = f"{filename}.{file_type}" + # make sure the folder we're dropping files into exists + os.makedirs(output_folder, exist_ok=True) + full_name = f"{output_folder}/{filename}.{file_type}" if file_type in ["csv", "xlsx", "parquet"]: writer = convert_to_dataframe(facilities_data["facilities"]) match file_type: @@ -36,10 +39,9 @@ def export_to_file( json.dump(facilities_data, f_out, indent=2, sort_keys=True, default=str) logger.info( - "%s file '%s.%s' created successfully with %s facilities.", - file_type, - filename, + "%s file '%s' created successfully with %s facilities.", file_type, + full_name, len(facilities_data["facilities"]), ) return filename diff --git a/utils.py b/utils.py index 093a50e..8749ec8 100644 --- a/utils.py +++ b/utils.py @@ -1,10 +1,12 @@ # For general helpers, regexes, or shared logic (e.g. phone/address parsing functions). import logging +import os import polars import requests from requests.adapters import HTTPAdapter import urllib3 +SCRIPTDIR = os.path.dirname(os.path.realpath(__file__)) logger = logging.getLogger(__name__) logger.setLevel(logging.INFO) logger.addHandler(logging.StreamHandler()) @@ -20,6 +22,7 @@ session.mount("http://", _adapter) session.headers.update(default_headers) +output_folder = f"{SCRIPTDIR}/output/" default_timestamp = "1970-01-01T00:00:00-+0000" timestamp_format = "%Y-%m-%dT%H:%M:%S-%z" From 39949bd4be67628a149bfda951a2fff5c0578039 Mon Sep 17 00:00:00 2001 From: John Seekins Date: Sun, 2 Nov 2025 12:13:16 -0700 Subject: [PATCH 16/16] vera license is weird, don't collect by default. Also clean up some types Signed-off-by: John Seekins --- ice_scrapers/field_offices.py | 2 +- ice_scrapers/spreadsheet_load.py | 3 +-- ice_scrapers/utils.py | 9 ++++---- ice_scrapers/vera_data.py | 5 ++--- main.py | 35 +++++++++++++++++--------------- schemas.py | 2 +- 6 files changed, 28 insertions(+), 28 deletions(-) diff --git a/ice_scrapers/field_offices.py b/ice_scrapers/field_offices.py index 041c8ba..ee44de4 100644 --- a/ice_scrapers/field_offices.py +++ b/ice_scrapers/field_offices.py @@ -41,7 +41,7 @@ def scrape_field_offices() -> dict: return office_data -def _scrape_page(page_url: str) -> list: +def _scrape_page(page_url: str) -> list[dict]: """Scrape a single page of facilities using BeautifulSoup""" logger.debug(" Fetching: %s", page_url) try: diff --git a/ice_scrapers/spreadsheet_load.py b/ice_scrapers/spreadsheet_load.py index d67797b..05277e6 100644 --- a/ice_scrapers/spreadsheet_load.py +++ b/ice_scrapers/spreadsheet_load.py @@ -17,7 +17,6 @@ facility_schema, field_office_schema, ) -from typing import Tuple from utils import ( logger, session, @@ -59,7 +58,7 @@ ] -def _download_sheet(keep_sheet: bool = True, force_download: bool = True) -> Tuple[polars.DataFrame, str]: +def _download_sheet(keep_sheet: bool = True, force_download: bool = True) -> tuple[polars.DataFrame, str]: """Download the detention stats sheet from ice.gov""" resp = session.get(base_xlsx_url, timeout=120) resp.raise_for_status() diff --git a/ice_scrapers/utils.py b/ice_scrapers/utils.py index 400dcf0..b8f5124 100644 --- a/ice_scrapers/utils.py +++ b/ice_scrapers/utils.py @@ -1,6 +1,5 @@ from bs4 import BeautifulSoup import re -from typing import Tuple from utils import ( logger, session, @@ -35,7 +34,7 @@ def special_facilities(facility: dict) -> dict: return facility -def repair_name(name: str, locality: str) -> Tuple[str, bool]: +def repair_name(name: str, locality: str) -> tuple[str, bool]: """Even facility names are occasionally bad""" matches = [ {"match": "ALEXANDRIA STAGING FACILI", "replace": "Alexandria Staging Facility", "locality": "ALEXANDRIA"}, @@ -96,7 +95,7 @@ def repair_name(name: str, locality: str) -> Tuple[str, bool]: return name, cleaned -def repair_street(street: str, locality: str = "") -> Tuple[str, bool]: +def repair_street(street: str, locality: str = "") -> tuple[str, bool]: """Generally, we'll let the spreadsheet win arguments just to be consistent""" street_filters = [ # address mismatch between site and spreadsheet @@ -217,7 +216,7 @@ def repair_street(street: str, locality: str = "") -> Tuple[str, bool]: return street, cleaned -def repair_zip(zip_code: int, locality: str) -> Tuple[str, bool]: +def repair_zip(zip_code: int, locality: str) -> tuple[str, bool]: """ Excel does a cool thing where it strips leading 0s Also, many zip codes are mysteriously discordant @@ -248,7 +247,7 @@ def repair_zip(zip_code: int, locality: str) -> Tuple[str, bool]: return zcode, cleaned -def repair_locality(locality: str, administrative_area: str) -> Tuple[str, bool]: +def repair_locality(locality: str, administrative_area: str) -> tuple[str, bool]: """ There is no consistency with any address. How the post office ever successfully delivered a letter is beyond me diff --git a/ice_scrapers/vera_data.py b/ice_scrapers/vera_data.py index 95ad0b2..05b3ca2 100644 --- a/ice_scrapers/vera_data.py +++ b/ice_scrapers/vera_data.py @@ -3,7 +3,6 @@ import os import polars from schemas import facility_schema -from typing import Tuple from utils import ( logger, session, @@ -17,7 +16,7 @@ filename = f"{SCRIPT_DIR}{os.sep}vera_facilities.csv" -def _vera_name_fixes(name: str, city: str) -> Tuple[str, bool]: +def _vera_name_fixes(name: str, city: str) -> tuple[str, bool]: """Match Vera names with ice.gov names""" matches = [ {"match": "Adams County", "replace": "Adams County Courthouse", "city": "Ritzville"}, @@ -199,7 +198,7 @@ def _vera_name_fixes(name: str, city: str) -> Tuple[str, bool]: return name, fixed -def _vera_city_fixes(city: str, state: str) -> Tuple[str, bool]: +def _vera_city_fixes(city: str, state: str) -> tuple[str, bool]: """There are a few cases where getting a state match requires some munging""" matches = [ {"match": "Saipan", "replace": "Susupe, Saipan", "city": "MP"}, diff --git a/main.py b/main.py index 23841b9..b95430f 100755 --- a/main.py +++ b/main.py @@ -35,76 +35,79 @@ def main() -> None: description="ICE Detention Facilities Data Scraper and Enricher", formatter_class=ArgumentDefaultsHelpFormatter, ) - parser.add_argument( + _ = parser.add_argument( "--scrape", action="store_true", default=False, help="Scrape initial facility data from ICE.gov", ) - parser.add_argument( + _ = parser.add_argument( "--enrich", action="store_true", default=False, help="enrich collected data", ) - parser.add_argument( + _ = parser.add_argument( "--load-existing", action="store_true", default=False, help="load data from local files", ) - parser.add_argument( + _ = parser.add_argument( "--file-type", choices=supported_output_types, + type=str, help="type of file to export", ) - parser.add_argument( + _ = parser.add_argument( "--output-file-name", "-o", default="ice_detention_facilities", + type=str, help="The file we'll write data out to (excluding the suffix)", ) - parser.add_argument( + _ = parser.add_argument( "--debug", action="store_true", help="Full debug information and logging", ) - parser.add_argument( + _ = parser.add_argument( "--enrich-workers", type=int, default=3, help="Number of concurrent processes to allow while enriching data", ) # todo these need more attention, but should now be accepted as command line options now. - parser.add_argument( + _ = parser.add_argument( "--debug-wikipedia", action="store_true", help="Add another column on export for Wikipedia debugging details and redirects", ) - parser.add_argument( + _ = parser.add_argument( "--debug-wikidata", action="store_true", help="Add another column on export for Wikidata debugging details and redirects", ) - parser.add_argument( + _ = parser.add_argument( "--debug-osm", action="store_true", help="Add another column on export for OpenStreetMap debugging details and redirects", ) - parser.add_argument( + _ = parser.add_argument( "--skip-downloads", action="store_true", help="Skip downloading sheet data", ) - parser.add_argument( + _ = parser.add_argument( "--delete-sheets", action="store_true", help="Remove any sheets we downloaded", ) - parser.add_argument( - "--skip-vera", + _ = parser.add_argument( + "--use-vera", action="store_true", - help="Don't collect vera.org data", + default=False, + help="Collect vera.org data", ) args = parser.parse_args() @@ -131,7 +134,7 @@ def main() -> None: facilities_data = facilities_scrape_wrapper( keep_sheet=not args.delete_sheets, force_download=not args.skip_downloads, - skip_vera=args.skip_vera, + skip_vera=not args.use_vera, ) elif args.load_existing: facilities_data = copy.deepcopy(default_data.facilities_data) diff --git a/schemas.py b/schemas.py index b2d85cf..a262ce5 100644 --- a/schemas.py +++ b/schemas.py @@ -124,4 +124,4 @@ "wikidata_found": 0, } -supported_output_types: list = ["csv", "json", "parquet", "xlsx"] +supported_output_types: list[str] = ["csv", "json", "parquet", "xlsx"]