update build and release scripts to use uv

This commit is contained in:
Nick Sweeting 2024-10-05 01:17:23 -07:00
parent ce2e19a429
commit e29aff12bf
No known key found for this signature in database
10 changed files with 1292 additions and 2094 deletions

View file

@ -9,7 +9,7 @@ set -o errexit
set -o errtrace
set -o nounset
set -o pipefail
IFS=$'\n'
IFS=$' '
REPO_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && cd .. && pwd )"
cd "$REPO_DIR"
@ -18,15 +18,34 @@ which docker > /dev/null || exit 1
which jq > /dev/null || exit 1
# which pdm > /dev/null || exit 1
SUPPORTED_PLATFORMS="linux/amd64,linux/arm64"
TAG_NAME="${1:-$(git rev-parse --abbrev-ref HEAD)}"
declare -a TAG_NAMES="$*"
BRANCH_NAME="${1:-$(git rev-parse --abbrev-ref HEAD)}"
VERSION="$(jq -r '.version' < "$REPO_DIR/package.json")"
SHORT_VERSION="$(echo "$VERSION" | perl -pe 's/(\d+)\.(\d+)\.(\d+)/$1.$2/g')"
GIT_SHA=sha-"$(git rev-parse --short HEAD)"
SELECTED_PLATFORMS="${2:-$SUPPORTED_PLATFORMS}"
SELECTED_PLATFORMS="linux/amd64,linux/arm64"
echo "[+] Building Docker image: tag=$TAG_NAME version=$SHORT_VERSION arch=$SELECTED_PLATFORMS"
# if not already in TAG_NAMES, add GIT_SHA and BRANCH_NAME
if ! echo "${TAG_NAMES[@]}" | grep -q "$GIT_SHA"; then
TAG_NAMES+=("$GIT_SHA")
fi
if ! echo "${TAG_NAMES[@]}" | grep -q "$BRANCH_NAME"; then
TAG_NAMES+=("$BRANCH_NAME")
fi
if ! echo "${TAG_NAMES[@]}" | grep -q "$VERSION"; then
TAG_NAMES+=("$VERSION")
fi
echo "[+] Building Docker image for $SELECTED_PLATFORMS: branch=$BRANCH_NAME version=$VERSION tags=${TAG_NAMES[*]}"
declare -a FULL_TAG_NAMES
# for each tag in TAG_NAMES, add archivebox/archivebox:tag and nikisweeting/archivebox:tag to FULL_TAG_NAMES
for TAG_NAME in "${TAG_NAMES[@]}"; do
[[ "$TAG_NAME" == "" ]] && continue
FULL_TAG_NAMES+=("-t archivebox/archivebox:$TAG_NAME")
FULL_TAG_NAMES+=("-t nikisweeting/archivebox:$TAG_NAME")
FULL_TAG_NAMES+=("-t ghcr.io/archivebox/archivebox:$TAG_NAME")
done
echo "${FULL_TAG_NAMES[@]}"
function check_platforms() {
INSTALLED_PLATFORMS="$(docker buildx inspect | grep 'Platforms:' )"
@ -72,30 +91,13 @@ check_platforms || (recreate_builder && check_platforms) || exit 1
# Make sure pyproject.toml, pdm{.dev}.lock, requirements{-dev}.txt, package{-lock}.json are all up-to-date
echo "[!] Make sure you've run ./bin/lock_pkgs.sh recently!"
sleep 1
# bash ./bin/lock_pkgs.sh
# echo "[!] Make sure you've run ./bin/lock_pkgs.sh recently!"
bash ./bin/lock_pkgs.sh
echo "[+] Building archivebox:$VERSION docker image..."
# docker builder prune
# docker build . --no-cache -t archivebox-dev \
# replace --load with --push to deploy
docker buildx build --platform "$SELECTED_PLATFORMS" --load . \
-t archivebox/archivebox:$TAG_NAME \
-t archivebox/archivebox:$GIT_SHA \
-t nikisweeting/archivebox:$TAG_NAME \
-t nikisweeting/archivebox:$GIT_SHA \
-t ghcr.io/archivebox/archivebox:$TAG_NAME \
-t ghcr.io/archivebox/archivebox:$GIT_SHA
# -t archivebox/archivebox \
# -t archivebox/archivebox:$VERSION \
# -t archivebox/archivebox:$SHORT_VERSION \
# -t archivebox/archivebox:latest \
# -t nikisweeting/archivebox \
# -t nikisweeting/archivebox:$VERSION \
# -t nikisweeting/archivebox:$SHORT_VERSION \
# -t nikisweeting/archivebox:latest \
# -t ghcr.io/archivebox/archivebox:$VERSION \
# -t ghcr.io/archivebox/archivebox:$SHORT_VERSION \
# -t ghcr.io/archivebox/archivebox:latest
# shellcheck disable=SC2068
docker buildx build --platform "$SELECTED_PLATFORMS" --load . ${FULL_TAG_NAMES[@]}

View file

@ -26,8 +26,8 @@ git pull
cd "$REPO_DIR"
echo "[+] Building docs"
sphinx-apidoc -o docs archivebox
cd "$REPO_DIR/docs"
make clean
make html
# open docs/_build/html/index.html to see the output
cd "$REPO_DIR"

View file

@ -11,21 +11,15 @@ set -o pipefail
IFS=$'\n'
REPO_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && cd .. && pwd )"
if [[ -f "$REPO_DIR/.venv/bin/activate" ]]; then
source "$REPO_DIR/.venv/bin/activate"
else
echo "[!] Warning: No virtualenv presesnt in $REPO_DIR/.venv, creating one now..."
python3 -m venv --system-site-packages --symlinks $REPO_DIR/.venv
fi
cd "$REPO_DIR"
# Generate pdm.lock, requirements.txt, and package-lock.json
bash ./bin/lock_pkgs.sh
source .venv/bin/activate
echo "[+] Building sdist, bdist_wheel, and egg_info"
rm -Rf build dist
pdm build
uv build
cp dist/* ./pip_dist/
echo

View file

@ -32,52 +32,40 @@ echo
echo "[*] Cleaning up old lockfiles and build files"
deactivate 2>/dev/null || true
rm -Rf build dist
rm -f pdm.lock
rm -f pdm.dev.lock
rm -f uv.lock
rm -f requirements.txt
rm -f requirements-dev.txt
rm -f package-lock.json
rm -f archivebox/package.json
rm -f archivebox/package-lock.json
rm -Rf ./.venv
rm -Rf ./node_modules
rm -Rf ./archivebox/node_modules
# rm -Rf ./.venv
# rm -Rf ./node_modules
# rm -Rf ./archivebox/node_modules
echo
echo
echo "[+] Generating dev & prod requirements.txt & pdm.lock from pyproject.toml..."
pip install --upgrade pip setuptools
pdm self update >/dev/null 2>&1 || true
pdm venv create 3.12
uv venv --python 3.12
source .venv/bin/activate
echo
echo "pyproject.toml: archivebox $(grep 'version = ' pyproject.toml | awk '{print $3}' | jq -r)"
echo "$(which python): $(python --version | head -n 1)"
echo "$(which pdm): $(pdm --version | head -n 1)"
pdm info --env
pdm info
echo "$(which uv): $(uv --version | head -n 1)"
echo
# https://pdm-project.org/latest/usage/lockfile/
# prod
pdm lock --group=':all' --production --lockfile pdm.lock --python="==3.12.*" --platform=linux
pdm lock --group=':all' --production --lockfile pdm.lock --python="==3.12.*" --platform=macos --append
pdm sync --group=':all' --production --lockfile pdm.lock --clean
pdm export --group=':all' --production --lockfile pdm.lock --without-hashes -o requirements.txt
# cp ./pdm.lock ./pip_dist/
# cp ./requirements.txt ./pip_dist/
# dev
pdm lock --group=':all' --dev --lockfile pdm.dev.lock --python="==3.12.*" --platform=linux
pdm lock --group=':all' --dev --lockfile pdm.dev.lock --python="==3.12.*" --platform=macos --append
pdm sync --group=':all' --dev --lockfile pdm.dev.lock --clean
pdm export --group=':all' --dev --lockfile pdm.dev.lock --without-hashes -o requirements-dev.txt
# cp ./pdm.dev.lock ./pip_dist/
# cp ./requirements-dev.txt ./pip_dist/
uv lock
uv pip compile pyproject.toml --all-extras -o requirements.txt >/dev/null
uv sync --all-extras --frozen 2>/dev/null
echo
echo "[+] Generating package-lock.json from package.json..."
npm install -g npm
npm config set fund false --location=global &
npm config set fund false &
npm config set audit false --location=global &
npm config set audit false &
echo
echo "package.json: archivebox $(jq -r '.version' package.json)"
echo
@ -85,7 +73,7 @@ echo "$(which node): $(node --version | head -n 1)"
echo "$(which npm): $(npm --version | head -n 1)"
echo
npm install --package-lock-only
npm install --package-lock-only --prefer-offline
cp package.json archivebox/package.json
cp package-lock.json archivebox/package-lock.json
@ -93,10 +81,8 @@ echo
echo "[√] Finished. Don't forget to commit the new lockfiles:"
echo
ls "pyproject.toml" | cat
ls "pdm.lock" | cat
ls "pdm.dev.lock" | cat
ls "requirements.txt" | cat
ls "requirements-dev.txt" | cat
ls "uv.lock" | cat
echo
ls "package.json" | cat
ls "package-lock.json" | cat

View file

@ -8,43 +8,47 @@ set -o errexit
set -o errtrace
set -o nounset
set -o pipefail
IFS=$'\n'
IFS=$' '
REPO_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && cd .. && pwd )"
cd "$REPO_DIR"
SUPPORTED_PLATFORMS="linux/amd64,linux/arm64" # no longer supported: linux/arm/v7
TAG_NAME="${1:-$(git rev-parse --abbrev-ref HEAD)}"
declare -a TAG_NAMES="$*"
BRANCH_NAME="${1:-$(git rev-parse --abbrev-ref HEAD)}"
VERSION="$(jq -r '.version' < "$REPO_DIR/package.json")"
SHORT_VERSION="$(echo "$VERSION" | perl -pe 's/(\d+)\.(\d+)\.(\d+)/$1.$2/g')"
GIT_SHA=sha-"$(git rev-parse --short HEAD)"
SELECTED_PLATFORMS="${2:-$SUPPORTED_PLATFORMS}"
SELECTED_PLATFORMS="linux/amd64,linux/arm64"
# if not already in TAG_NAMES, add GIT_SHA and BRANCH_NAME
if ! echo "${TAG_NAMES[@]}" | grep -q "$GIT_SHA"; then
TAG_NAMES+=("$GIT_SHA")
fi
if ! echo "${TAG_NAMES[@]}" | grep -q "$BRANCH_NAME"; then
TAG_NAMES+=("$BRANCH_NAME")
fi
if ! echo "${TAG_NAMES[@]}" | grep -q "$VERSION"; then
TAG_NAMES+=("$VERSION")
fi
echo "[+] Building + releasing Docker image for $SELECTED_PLATFORMS: branch=$BRANCH_NAME version=$VERSION tags=${TAG_NAMES[*]}"
declare -a FULL_TAG_NAMES
# for each tag in TAG_NAMES, add archivebox/archivebox:tag and nikisweeting/archivebox:tag to FULL_TAG_NAMES
for TAG_NAME in "${TAG_NAMES[@]}"; do
[[ "$TAG_NAME" == "" ]] && continue
FULL_TAG_NAMES+=("-t archivebox/archivebox:$TAG_NAME")
FULL_TAG_NAMES+=("-t nikisweeting/archivebox:$TAG_NAME")
FULL_TAG_NAMES+=("-t ghcr.io/archivebox/archivebox:$TAG_NAME")
done
echo "${FULL_TAG_NAMES[@]}"
./bin/lock_pkgs.sh
# echo "[*] Logging in to Docker Hub & Github Container Registry"
# docker login --username=nikisweeting
# docker login ghcr.io --username=pirate
# echo "[^] Building docker image"
# ./bin/build_docker.sh "$TAG_NAME" "$SELECTED_PLATFORMS"
echo "[^] Uploading docker image"
docker buildx build --platform "$SELECTED_PLATFORMS" --push . \
-t archivebox/archivebox:"$TAG_NAME" \
-t archivebox/archivebox:"$GIT_SHA" \
-t nikisweeting/archivebox:"$TAG_NAME" \
-t nikisweeting/archivebox:"$GIT_SHA" \
-t ghcr.io/archivebox/archivebox:"$TAG_NAME" \
-t ghcr.io/archivebox/archivebox:"$GIT_SHA"
# -t archivebox/archivebox \
# -t archivebox/archivebox:$VERSION \
# -t archivebox/archivebox:$SHORT_VERSION \
# -t archivebox/archivebox:latest \
# -t nikisweeting/archivebox \
# -t nikisweeting/archivebox:$VERSION \
# -t nikisweeting/archivebox:$SHORT_VERSION \
# -t nikisweeting/archivebox:latest \
# -t ghcr.io/archivebox/archivebox:$VERSION \
# -t ghcr.io/archivebox/archivebox:$SHORT_VERSION \
# shellcheck disable=SC2068
docker buildx build --platform "$SELECTED_PLATFORMS" --push . ${FULL_TAG_NAMES[@]}

View file

@ -14,8 +14,5 @@ REPO_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && cd .. && p
cd "$REPO_DIR"
source "$REPO_DIR/.venv/bin/activate"
echo "[^] Publishing to Test PyPI..."
pdm publish --repository testpypi
echo "[^] Publishing to PyPI..."
pdm publish --no-build
uv publish

1855
pdm.lock

File diff suppressed because it is too large Load diff

View file

@ -110,23 +110,19 @@ all = [
"archivebox[sonic,ldap]"
]
# pdm lock --group=':all' --dev
# pdm install -G:all --dev
# pdm update --dev --unconstrained
[tool.pdm.dev-dependencies]
build = [
[tool.uv]
dev-dependencies = [
### BUILD
# "pdm", # usually installed by apt/brew, dont double-install with pip
"pip>=24.2",
"setuptools>=75.1.0",
"wheel>=0.44.0",
"homebrew-pypi-poet>=0.10.0", # for: generating archivebox.rb brewfile list of python packages
]
docs = [
### DOCS
"recommonmark>=0.7.1",
"sphinx",
"sphinx-rtd-theme>=2.0.0",
]
debug = [
### DEBUGGING
"django-debug-toolbar>=4.4.6",
"djdt_flamegraph>=0.2.13",
"ipdb>=0.13.13",
@ -136,12 +132,10 @@ debug = [
"opentelemetry-instrumentation-sqlite3>=0.47b0",
"viztracer", # usage: viztracer ../.venv/bin/archivebox manage check
# "snakeviz", # usage: python -m cProfile -o flamegraph.prof ../.venv/bin/archivebox manage check
]
test = [
### TESTING
"pytest>=8.3.3",
"bottle>=0.13.1",
]
lint = [
### LINTING
"ruff>=0.6.6",
"flake8>=7.1.1",
"mypy>=1.11.2",

View file

@ -1,127 +1,336 @@
# This file is @generated by PDM.
# Please do not edit it manually.
annotated-types==0.7.0; python_version == "3.12"
anyio==4.6.0; python_version == "3.12"
asgiref==3.8.1; python_version == "3.12"
asttokens==2.4.1; python_version == "3.12"
atomicwrites==1.4.1; python_version == "3.12"
attrs==24.2.0; python_version == "3.12"
autobahn==24.4.2; python_version == "3.12"
automat==24.8.1; python_version == "3.12"
base32-crockford==0.3.0; python_version == "3.12"
beautifulsoup4==4.12.3; python_version == "3.12"
brotli==1.1.0; implementation_name == "cpython" and python_version == "3.12"
brotlicffi==1.1.0.0; implementation_name != "cpython" and python_version == "3.12"
bx-django-utils==79; python_version == "3.12"
bx-py-utils==104; python_version == "3.12"
certifi==2024.8.30; python_version == "3.12"
cffi==1.17.1; platform_python_implementation != "PyPy" and python_version == "3.12" or implementation_name != "cpython" and python_version == "3.12"
channels[daphne]==4.1.0; python_version == "3.12"
charset-normalizer==3.3.2; python_version == "3.12"
constantly==23.10.4; python_version == "3.12"
croniter==3.0.3; python_version == "3.12"
cryptography==43.0.1; python_version == "3.12"
daphne==4.1.2; python_version == "3.12"
dateparser==1.2.0; python_version == "3.12"
decorator==5.1.1; python_version == "3.12"
django==5.1.1; python_version == "3.12"
django-admin-data-views==0.4.1; python_version == "3.12"
django-auth-ldap==4.8.0; python_version == "3.12"
django-charid-field==0.4; python_version == "3.12"
django-extensions==3.2.3; python_version == "3.12"
django-huey==1.2.1; python_version == "3.12"
django-huey-monitor==0.9.0; python_version == "3.12"
django-jsonform==2.23.0; python_version == "3.12"
django-ninja==1.3.0; python_version == "3.12"
django-object-actions==4.3.0; python_version == "3.12"
django-pydantic-field==0.3.10; python_version == "3.12"
django-settings-holder==0.1.2; python_version == "3.12"
django-signal-webhooks==0.3.0; python_version == "3.12"
django-stubs==5.1.0; python_version == "3.12"
django-stubs-ext==5.1.0; python_version == "3.12"
django-taggit==1.3.0; python_version == "3.12"
et-xmlfile==1.1.0; python_version == "3.12"
executing==2.1.0; python_version == "3.12"
feedparser==6.0.11; python_version == "3.12"
ftfy==6.2.3; python_version == "3.12"
h11==0.14.0; python_version == "3.12"
httpcore==1.0.6; python_version == "3.12"
httpx==0.27.2; python_version == "3.12"
huey==2.5.2; python_version == "3.12"
hyperlink==21.0.0; python_version == "3.12"
idna==3.10; python_version == "3.12"
incremental==24.7.2; python_version == "3.12"
ipython==8.28.0; python_version == "3.12"
jedi==0.19.1; python_version == "3.12"
mailchecker==6.0.11; python_version == "3.12"
markdown-it-py==3.0.0; python_version == "3.12"
matplotlib-inline==0.1.7; python_version == "3.12"
mdurl==0.1.2; python_version == "3.12"
mutagen==1.47.0; python_version == "3.12"
mypy-extensions==1.0.0; python_version == "3.12"
openpyxl==3.1.5; python_version == "3.12"
parso==0.8.4; python_version == "3.12"
pexpect==4.9.0; (sys_platform != "win32" and sys_platform != "emscripten") and python_version == "3.12"
phonenumbers==8.13.47; python_version == "3.12"
pluggy==1.5.0; python_version == "3.12"
prompt-toolkit==3.0.48; python_version == "3.12"
psutil==6.0.0; python_version == "3.12"
ptyprocess==0.7.0; (sys_platform != "win32" and sys_platform != "emscripten") and python_version == "3.12"
pure-eval==0.2.3; python_version == "3.12"
py-machineid==0.6.0; python_version == "3.12"
pyasn1==0.6.1; python_version == "3.12"
pyasn1-modules==0.4.1; python_version == "3.12"
pycparser==2.22; platform_python_implementation != "PyPy" and python_version == "3.12" or implementation_name != "cpython" and python_version == "3.12"
pycryptodomex==3.21.0; python_version == "3.12"
pydantic==2.9.2; python_version == "3.12"
pydantic-core==2.23.4; python_version == "3.12"
pydantic-pkgr==0.4.4; python_version == "3.12"
pydantic-settings==2.5.2; python_version == "3.12"
pygments==2.18.0; python_version == "3.12"
pyopenssl==24.2.1; python_version == "3.12"
python-benedict[html,toml,xls,xml,yaml]==0.33.2; python_version == "3.12"
python-benedict[io,parse]==0.33.2; python_version == "3.12"
python-benedict[xml]==0.33.2; python_version == "3.12"
python-crontab==3.2.0; python_version == "3.12"
python-dateutil==2.9.0.post0; python_version == "3.12"
python-dotenv==1.0.1; python_version == "3.12"
python-fsutil==0.14.1; python_version == "3.12"
python-ldap==3.4.4; python_version == "3.12"
python-slugify==8.0.4; python_version == "3.12"
python-stdnum==1.20; python_version == "3.12"
pytz==2024.2; python_version == "3.12"
pyyaml==6.0.2; python_version == "3.12"
regex==2024.9.11; python_version == "3.12"
requests==2.32.3; python_version == "3.12"
rich==13.9.2; python_version == "3.12"
rich-argparse==1.5.2; python_version == "3.12"
service-identity==24.1.0; python_version == "3.12"
setuptools==75.1.0; python_version == "3.12"
sgmllib3k==1.0.0; python_version == "3.12"
six==1.16.0; python_version == "3.12"
sniffio==1.3.1; python_version == "3.12"
sonic-client==1.0.0; python_version == "3.12"
soupsieve==2.6; python_version == "3.12"
sqlparse==0.5.1; python_version == "3.12"
stack-data==0.6.3; python_version == "3.12"
supervisor==4.2.5; python_version == "3.12"
text-unidecode==1.3; python_version == "3.12"
toml==0.10.2; python_version == "3.12"
traitlets==5.14.3; python_version == "3.12"
twisted[tls]==24.7.0; python_version == "3.12"
txaio==23.1.1; python_version == "3.12"
typeid-python==0.3.1; python_version == "3.12"
types-pyyaml==6.0.12.20240917; python_version == "3.12"
typing-extensions==4.12.2; python_version == "3.12"
tzlocal==5.2; python_version == "3.12"
ulid-py==1.1.0; python_version == "3.12"
urllib3==2.2.3; python_version == "3.12"
uuid6==2024.7.10; python_version == "3.12"
w3lib==2.2.1; python_version == "3.12"
wcwidth==0.2.13; python_version == "3.12"
websockets==13.1; python_version == "3.12"
xlrd==2.0.1; python_version == "3.12"
xmltodict==0.13.0; python_version == "3.12"
yt-dlp==2024.9.27; python_version == "3.12"
zope-interface==7.0.3; python_version == "3.12"
# This file was autogenerated by uv via the following command:
# uv pip compile pyproject.toml --all-extras -o requirements.txt
annotated-types==0.7.0
# via pydantic
anyio==4.6.0
# via httpx
asgiref==3.8.1
# via
# channels
# daphne
# django
# django-signal-webhooks
# django-stubs
asttokens==2.4.1
# via stack-data
atomicwrites==1.4.1
# via archivebox (pyproject.toml)
attrs==24.2.0
# via
# service-identity
# twisted
autobahn==24.4.2
# via daphne
automat==24.8.1
# via twisted
base32-crockford==0.3.0
# via archivebox (pyproject.toml)
beautifulsoup4==4.12.3
# via python-benedict
brotli==1.1.0
# via yt-dlp
bx-django-utils==79
# via django-huey-monitor
bx-py-utils==104
# via
# bx-django-utils
# django-huey-monitor
certifi==2024.8.30
# via
# httpcore
# httpx
# requests
# yt-dlp
cffi==1.17.1
# via cryptography
channels==4.1.0
# via archivebox (pyproject.toml)
charset-normalizer==3.3.2
# via requests
constantly==23.10.4
# via twisted
croniter==3.0.3
# via archivebox (pyproject.toml)
cryptography==43.0.1
# via
# autobahn
# django-signal-webhooks
# pyopenssl
# service-identity
daphne==4.1.2
# via channels
dateparser==1.2.0
# via archivebox (pyproject.toml)
decorator==5.1.1
# via ipython
django==5.1.1
# via
# archivebox (pyproject.toml)
# bx-django-utils
# channels
# django-admin-data-views
# django-auth-ldap
# django-charid-field
# django-extensions
# django-huey
# django-huey-monitor
# django-jsonform
# django-ninja
# django-pydantic-field
# django-signal-webhooks
# django-stubs
# django-stubs-ext
# django-taggit
django-admin-data-views==0.4.1
# via archivebox (pyproject.toml)
django-auth-ldap==4.8.0
# via archivebox (pyproject.toml)
django-charid-field==0.4
# via archivebox (pyproject.toml)
django-extensions==3.2.3
# via archivebox (pyproject.toml)
django-huey==1.2.1
# via archivebox (pyproject.toml)
django-huey-monitor==0.9.0
# via archivebox (pyproject.toml)
django-jsonform==2.23.0
# via archivebox (pyproject.toml)
django-ninja==1.3.0
# via archivebox (pyproject.toml)
django-object-actions==4.3.0
# via archivebox (pyproject.toml)
django-pydantic-field==0.3.10
# via archivebox (pyproject.toml)
django-settings-holder==0.1.2
# via
# django-admin-data-views
# django-signal-webhooks
django-signal-webhooks==0.3.0
# via archivebox (pyproject.toml)
django-stubs==5.1.0
# via archivebox (pyproject.toml)
django-stubs-ext==5.1.0
# via django-stubs
django-taggit==1.3.0
# via archivebox (pyproject.toml)
et-xmlfile==1.1.0
# via openpyxl
executing==2.1.0
# via stack-data
feedparser==6.0.11
# via archivebox (pyproject.toml)
ftfy==6.2.3
# via python-benedict
h11==0.14.0
# via httpcore
httpcore==1.0.6
# via httpx
httpx==0.27.2
# via django-signal-webhooks
huey==2.5.2
# via
# django-huey
# django-huey-monitor
hyperlink==21.0.0
# via
# autobahn
# twisted
idna==3.10
# via
# anyio
# httpx
# hyperlink
# requests
# twisted
incremental==24.7.2
# via twisted
ipython==8.28.0
# via archivebox (pyproject.toml)
jedi==0.19.1
# via ipython
mailchecker==6.0.11
# via python-benedict
markdown-it-py==3.0.0
# via rich
matplotlib-inline==0.1.7
# via ipython
mdurl==0.1.2
# via markdown-it-py
mutagen==1.47.0
# via yt-dlp
mypy-extensions==1.0.0
# via archivebox (pyproject.toml)
openpyxl==3.1.5
# via python-benedict
parso==0.8.4
# via jedi
pexpect==4.9.0
# via ipython
phonenumbers==8.13.47
# via python-benedict
pluggy==1.5.0
# via archivebox (pyproject.toml)
prompt-toolkit==3.0.48
# via ipython
psutil==6.0.0
# via archivebox (pyproject.toml)
ptyprocess==0.7.0
# via pexpect
pure-eval==0.2.3
# via stack-data
py-machineid==0.6.0
# via archivebox (pyproject.toml)
pyasn1==0.6.1
# via
# pyasn1-modules
# python-ldap
# service-identity
pyasn1-modules==0.4.1
# via
# python-ldap
# service-identity
pycparser==2.22
# via cffi
pycryptodomex==3.21.0
# via yt-dlp
pydantic==2.9.2
# via
# django-ninja
# django-pydantic-field
# pydantic-pkgr
# pydantic-settings
pydantic-core==2.23.4
# via
# pydantic
# pydantic-pkgr
pydantic-pkgr==0.4.4
# via archivebox (pyproject.toml)
pydantic-settings==2.5.2
# via archivebox (pyproject.toml)
pygments==2.18.0
# via
# ipython
# rich
pyopenssl==24.2.1
# via twisted
python-benedict==0.33.2
# via archivebox (pyproject.toml)
python-crontab==3.2.0
# via archivebox (pyproject.toml)
python-dateutil==2.9.0.post0
# via
# croniter
# dateparser
# python-benedict
# python-crontab
python-dotenv==1.0.1
# via pydantic-settings
python-fsutil==0.14.1
# via python-benedict
python-ldap==3.4.4
# via
# archivebox (pyproject.toml)
# django-auth-ldap
python-slugify==8.0.4
# via python-benedict
python-stdnum==1.20
# via bx-django-utils
pytz==2024.2
# via
# croniter
# dateparser
pyyaml==6.0.2
# via python-benedict
regex==2024.9.11
# via dateparser
requests==2.32.3
# via
# archivebox (pyproject.toml)
# python-benedict
# yt-dlp
rich==13.9.2
# via
# archivebox (pyproject.toml)
# rich-argparse
rich-argparse==1.5.2
# via archivebox (pyproject.toml)
service-identity==24.1.0
# via twisted
setuptools==75.1.0
# via
# archivebox (pyproject.toml)
# autobahn
# incremental
# supervisor
# zope-interface
sgmllib3k==1.0.0
# via feedparser
six==1.16.0
# via
# asttokens
# python-dateutil
sniffio==1.3.1
# via
# anyio
# httpx
sonic-client==1.0.0
# via archivebox (pyproject.toml)
soupsieve==2.6
# via beautifulsoup4
sqlparse==0.5.1
# via django
stack-data==0.6.3
# via ipython
supervisor==4.2.5
# via archivebox (pyproject.toml)
text-unidecode==1.3
# via python-slugify
toml==0.10.2
# via python-benedict
traitlets==5.14.3
# via
# ipython
# matplotlib-inline
twisted==24.7.0
# via daphne
txaio==23.1.1
# via autobahn
typeid-python==0.3.1
# via archivebox (pyproject.toml)
types-pyyaml==6.0.12.20240917
# via django-stubs
typing-extensions==4.12.2
# via
# django-pydantic-field
# django-stubs
# django-stubs-ext
# pydantic
# pydantic-core
# pydantic-pkgr
# twisted
tzlocal==5.2
# via dateparser
ulid-py==1.1.0
# via archivebox (pyproject.toml)
urllib3==2.2.3
# via
# requests
# yt-dlp
uuid6==2024.7.10
# via typeid-python
w3lib==2.2.1
# via archivebox (pyproject.toml)
wcwidth==0.2.13
# via
# ftfy
# prompt-toolkit
websockets==13.1
# via yt-dlp
xlrd==2.0.1
# via python-benedict
xmltodict==0.13.0
# via python-benedict
yt-dlp==2024.9.27
# via archivebox (pyproject.toml)
zope-interface==7.0.3
# via twisted

869
uv.lock

File diff suppressed because it is too large Load diff