Migrate "pip-tools" -> "uv" and remove tox

pull/188/head
JensDiemer 2025-03-23 12:35:37 +01:00
rodzic f013895d10
commit e795779b4f
23 zmienionych plików z 2350 dodań i 2032 usunięć

Wyświetl plik

@ -12,12 +12,12 @@ on:
jobs: jobs:
test: test:
name: 'Python ${{ matrix.python-version }} Django ${{ matrix.django-version }}' name: 'Python ${{ matrix.python-version }}'
runs-on: ubuntu-latest runs-on: ubuntu-latest
strategy: strategy:
fail-fast: false fail-fast: false
matrix: matrix:
python-version: ['3.12', '3.11'] python-version: ['3.13', '3.12', '3.11']
steps: steps:
- name: Checkout - name: Checkout
run: | run: |
@ -32,7 +32,7 @@ jobs:
with: with:
python-version: '${{ matrix.python-version }}' python-version: '${{ matrix.python-version }}'
cache: 'pip' # caching pip dependencies cache: 'pip' # caching pip dependencies
cache-dependency-path: '**/requirements.*.txt' cache-dependency-path: 'uv.lock'
- name: 'Bootstrap' - name: 'Bootstrap'
# The first manage.py call will create the .venv # The first manage.py call will create the .venv
@ -47,7 +47,7 @@ jobs:
run: | run: |
./manage.py --help ./manage.py --help
- name: 'pip-audit' - name: 'Run pip-audit'
run: | run: |
./manage.py pip_audit ./manage.py pip_audit
@ -56,10 +56,10 @@ jobs:
PYTHONUNBUFFERED: 1 PYTHONUNBUFFERED: 1
PYTHONWARNINGS: always PYTHONWARNINGS: always
run: | run: |
./manage.py tox -e $(echo py${{ matrix.python-version }} | tr -d .) ./manage.py test
- name: 'Upload coverage report' - name: 'Upload coverage report'
uses: codecov/codecov-action@v4 uses: codecov/codecov-action@v5
# https://github.com/marketplace/actions/codecov # https://github.com/marketplace/actions/codecov
with: with:
fail_ci_if_error: false fail_ci_if_error: false

61
.gitignore vendored
Wyświetl plik

@ -2,8 +2,9 @@
*.egg-info *.egg-info
__pycache__ __pycache__
/dist/ /dist/
/coverage.json /build/
/coverage.xml /coverage.*
*.orig
!.github !.github
!.editorconfig !.editorconfig
@ -21,59 +22,13 @@ __pycache__
**/static/* **/static/*
**/media/* **/media/*
*.sqlite3 *.sqlite3
*.json
# Include "ignored" *.json:
!**/fixtures/*.json
# Django # Django
# Include all test snapshot files:
!**/*.snapshot.*
secret.txt secret.txt
# Coverage HTML Report files:
htmlcov
# Byte-compiled / optimized / DLL files
__pycache__/
*.py[cod]
*$py.class
# C extensions
*.so
# Distribution / packaging
.tox
.Python
env/
build/
develop-eggs/
dist/
downloads/
eggs/
lib/
lib64/
parts/
sdist/
var/
*.egg-info/
.installed.cfg
*.egg
# Installer logs
pip-log.txt
pip-delete-this-directory.txt
# Unit test / coverage reports
db.sqlite3
coverage_html/
coverage.xml
*,cover
# Translations
*.pot
# Django stuff:
*.log
# Sphinx documentation
docs/_build/
# PyBuilder
target/

Wyświetl plik

@ -1,12 +1,13 @@
# pre-commit plugin configuration # pre-commit plugin configuration
# See https://pre-commit.com for more information # See https://pre-commit.com for more information
default_install_hook_types: default_install_hook_types:
- pre-commit - prepare-commit-msg
- post-commit
- post-rewrite - post-rewrite
- pre-push - pre-push
repos: repos:
- repo: https://github.com/jedie/cli-base-utilities - repo: https://github.com/jedie/cli-base-utilities
rev: v0.11.0 rev: v0.17.0
hooks: hooks:
- id: update-readme-history - id: update-readme-history

Wyświetl plik

@ -1,7 +1,7 @@
GNU GENERAL PUBLIC LICENSE GNU GENERAL PUBLIC LICENSE
Version 3, 29 June 2007 Version 3, 29 June 2007
Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/> Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/>
Everyone is permitted to copy and distribute verbatim copies Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed. of this license document, but changing it is not allowed.
@ -645,7 +645,7 @@ the "copyright" line and a pointer to where the full notice is found.
GNU General Public License for more details. GNU General Public License for more details.
You should have received a copy of the GNU General Public License You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>. along with this program. If not, see <https://www.gnu.org/licenses/>.
Also add information on how to contact you by electronic and paper mail. Also add information on how to contact you by electronic and paper mail.
@ -664,11 +664,11 @@ might be different; for a GUI interface, you would use an "about box".
You should also get your employer (if you work as a programmer) or school, You should also get your employer (if you work as a programmer) or school,
if any, to sign a "copyright disclaimer" for the program, if necessary. if any, to sign a "copyright disclaimer" for the program, if necessary.
For more information on this, and how to apply and follow the GNU GPL, see For more information on this, and how to apply and follow the GNU GPL, see
<http://www.gnu.org/licenses/>. <https://www.gnu.org/licenses/>.
The GNU General Public License does not permit incorporating your program The GNU General Public License does not permit incorporating your program
into proprietary programs. If your program is a subroutine library, you into proprietary programs. If your program is a subroutine library, you
may consider it more useful to permit linking proprietary applications with may consider it more useful to permit linking proprietary applications with
the library. If this is what you want to do, use the GNU Lesser General the library. If this is what you want to do, use the GNU Lesser General
Public License instead of this License. But first, please read Public License instead of this License. But first, please read
<http://www.gnu.org/philosophy/why-not-lgpl.html>. <https://www.gnu.org/licenses/why-not-lgpl.html>.

Wyświetl plik

@ -166,6 +166,8 @@ To make a new release, do this:
[comment]: <> (✂✂✂ auto generated history start ✂✂✂) [comment]: <> (✂✂✂ auto generated history start ✂✂✂)
* [v0.21.0](https://github.com/jedie/PyInventory/compare/v0.20.1...v0.21.0)
* 2025-03-23 - Migrate "pip-tools" -> "uv" and remove tox
* [v0.20.1](https://github.com/jedie/PyInventory/compare/v0.20.0...v0.20.1) * [v0.20.1](https://github.com/jedie/PyInventory/compare/v0.20.0...v0.20.1)
* 2024-09-05 - switched to https://github.com/jazzband/django-tinymce/ * 2024-09-05 - switched to https://github.com/jazzband/django-tinymce/
* [v0.20.0](https://github.com/jedie/PyInventory/compare/v0.19.3...v0.20.0) * [v0.20.0](https://github.com/jedie/PyInventory/compare/v0.19.3...v0.20.0)
@ -181,12 +183,12 @@ To make a new release, do this:
* 2023-10-08 - Use playwrigth manage command from manage-django-project * 2023-10-08 - Use playwrigth manage command from manage-django-project
* 2023-09-24 - Update test snapshot files * 2023-09-24 - Update test snapshot files
* 2023-09-24 - Add playwright CLI wrapper command * 2023-09-24 - Add playwright CLI wrapper command
* [v0.19.2](https://github.com/jedie/PyInventory/compare/v0.19.1...v0.19.2)
* 2023-08-17 - Bugfix packaging by adding "requests" as normal dependencies
* 2023-08-17 - Bugfix packageing by adding "requests" as normal dependencies
<details><summary>Expand older history entries ...</summary> <details><summary>Expand older history entries ...</summary>
* [v0.19.2](https://github.com/jedie/PyInventory/compare/v0.19.1...v0.19.2)
* 2023-08-17 - Bugfix packaging by adding "requests" as normal dependencies
* 2023-08-17 - Bugfix packageing by adding "requests" as normal dependencies
* [v0.19.1](https://github.com/jedie/PyInventory/compare/v0.19.0...v0.19.1) * [v0.19.1](https://github.com/jedie/PyInventory/compare/v0.19.0...v0.19.1)
* 2023-08-17 - Update requirements * 2023-08-17 - Update requirements
* 2023-08-17 - Update from project template * 2023-08-17 - Update from project template

Wyświetl plik

@ -7,5 +7,6 @@
:license: GNU GPL v3 or above, see LICENSE for more details. :license: GNU GPL v3 or above, see LICENSE for more details.
""" """
__version__ = '0.20.1' # See https://packaging.python.org/en/latest/specifications/version-specifiers/
__version__ = '0.21.0'
__author__ = 'Jens Diemer <PyInventory@jensdiemer.de>' __author__ = 'Jens Diemer <PyInventory@jensdiemer.de>'

Wyświetl plik

@ -1,18 +1,10 @@
""" from django.apps import AppConfig as BaseAppConfig
https://docs.djangoproject.com/en/2.0/ref/applications/#configuring-applications-ref
created 14.20.2020 by Jens Diemer <opensource@jensdiemer.de>
:copyleft: 2020 by the PyInventory team, see AUTHORS for more details.
:license: GNU GPL v3 or above, see LICENSE for more details.
"""
from django.apps import AppConfig class AppConfig(BaseAppConfig):
name = 'inventory'
verbose_name = 'Inventory'
class InventoryConfig(AppConfig):
name = "inventory"
verbose_name = "Inventory"
def ready(self): def ready(self):
import inventory.checks # noqa
import inventory.signals # noqa import inventory.signals # noqa

Wyświetl plik

Wyświetl plik

@ -0,0 +1,55 @@
import os
import unittest.util
from pathlib import Path
import django
from bx_py_utils.test_utils.deny_requests import deny_any_real_request
from manage_django_project.config import project_info
from rich import print
from typeguard import install_import_hook
import inventory
# Check type annotations via typeguard in all tests:
install_import_hook(packages=('inventory', 'inventory_project'))
PROJECT_ROOT = Path(inventory.__file__).parent.parent
def pre_configure_tests() -> None:
print(f'Configure unittests via "load_tests Protocol" from {Path(__file__).relative_to(Path.cwd())}')
# Hacky way to display more "assert"-Context in failing tests:
_MIN_MAX_DIFF = unittest.util._MAX_LENGTH - unittest.util._MIN_DIFF_LEN
unittest.util._MAX_LENGTH = int(os.environ.get('UNITTEST_MAX_LENGTH', 300))
unittest.util._MIN_DIFF_LEN = unittest.util._MAX_LENGTH - _MIN_MAX_DIFF
# Deny any request via docket/urllib3 because tests they should mock all requests:
deny_any_real_request()
def init_django4unittests() -> None:
"""
Make it possible to run tests via:
.venv/bin/python -m unittest
by setup Django with test settings
"""
project_info.initialize()
DJANGO_SETTINGS_MODULE: str = project_info.config.test_settings
print(f'Force {DJANGO_SETTINGS_MODULE=}')
os.environ['DJANGO_SETTINGS_MODULE'] = DJANGO_SETTINGS_MODULE
django.setup()
def load_tests(loader, tests, pattern):
"""
Use unittest "load_tests Protocol" as a hook to setup test environment before running tests.
https://docs.python.org/3/library/unittest.html#load-tests-protocol
"""
pre_configure_tests()
init_django4unittests()
return loader.discover(start_dir=Path(__file__).parent, pattern=pattern)

Wyświetl plik

@ -1,12 +1,5 @@
from pathlib import Path
from bx_py_utils.path import assert_is_dir
import inventory import inventory
PACKAGE_ROOT = Path(inventory.__file__).parent.parent # Just the same version as the real project:
assert_is_dir(PACKAGE_ROOT / 'inventory')
__version__ = inventory.__version__ __version__ = inventory.__version__

Wyświetl plik

@ -26,8 +26,6 @@ INTERNAL_IPS = ('127.0.0.1', '0.0.0.0', 'localhost')
ALLOWED_HOSTS = INTERNAL_IPS ALLOWED_HOSTS = INTERNAL_IPS
SECURE_SSL_REDIRECT = False
DATABASES = { DATABASES = {
'default': { 'default': {
'ENGINE': 'django.db.backends.sqlite3', 'ENGINE': 'django.db.backends.sqlite3',

Wyświetl plik

@ -65,7 +65,8 @@ INSTALLED_APPS = [
'django_tools.serve_media_app.apps.UserMediaFilesConfig', 'django_tools.serve_media_app.apps.UserMediaFilesConfig',
# https://github.com/jedie/django-tools/tree/master/django_tools/model_version_protect # https://github.com/jedie/django-tools/tree/master/django_tools/model_version_protect
'django_tools.model_version_protect.apps.ModelVersionProtectConfig', 'django_tools.model_version_protect.apps.ModelVersionProtectConfig',
'inventory.apps.InventoryConfig', #
'inventory.apps.AppConfig',
] ]
ROOT_URLCONF = 'inventory_project.urls' ROOT_URLCONF = 'inventory_project.urls'

Wyświetl plik

@ -7,6 +7,9 @@ import os
from inventory_project.settings.prod import * # noqa from inventory_project.settings.prod import * # noqa
ALLOWED_HOSTS = ['testserver']
# _____________________________________________________________________________ # _____________________________________________________________________________
# Manage Django Project # Manage Django Project

Wyświetl plik

@ -1,31 +0,0 @@
import os
import unittest.util
from pathlib import Path
from bx_py_utils.test_utils.deny_requests import deny_any_real_request
from typeguard import install_import_hook
# Check type annotations via typeguard in all tests:
install_import_hook(packages=('inventory', 'inventory_project'))
def pre_configure_tests() -> None:
print(f'Configure unittests via "load_tests Protocol" from {Path(__file__).relative_to(Path.cwd())}')
# Hacky way to display more "assert"-Context in failing tests:
_MIN_MAX_DIFF = unittest.util._MAX_LENGTH - unittest.util._MIN_DIFF_LEN
unittest.util._MAX_LENGTH = int(os.environ.get('UNITTEST_MAX_LENGTH', 300))
unittest.util._MIN_DIFF_LEN = unittest.util._MAX_LENGTH - _MIN_MAX_DIFF
# Deny any request via docket/urllib3 because tests they should mock all requests:
deny_any_real_request()
def load_tests(loader, tests, pattern):
"""
Use unittest "load_tests Protocol" as a hook to setup test environment before running tests.
https://docs.python.org/3/library/unittest.html#load-tests-protocol
"""
pre_configure_tests()
return loader.discover(start_dir=Path(__file__).parent, pattern=pattern)

Wyświetl plik

@ -6,10 +6,10 @@
<form enctype="multipart/form-data" id="itemmodel_form" method="post" novalidate=""> <form enctype="multipart/form-data" id="itemmodel_form" method="post" novalidate="">
MockedCsrfTokenNode MockedCsrfTokenNode
<div> <div>
<fieldset aria-labelledby="fieldset-0-internals-0-heading" class="module aligned collapse"> <fieldset aria-labelledby="fieldset-0-0-heading" class="module aligned collapse">
<details> <details>
<summary> <summary>
<h2 class="fieldset-heading" id="fieldset-0-internals-0-heading"> <h2 class="fieldset-heading" id="fieldset-0-0-heading">
Internals Internals
</h2> </h2>
</summary> </summary>
@ -65,10 +65,10 @@
</div> </div>
</details> </details>
</fieldset> </fieldset>
<fieldset aria-labelledby="fieldset-0-meta-1-heading" class="module aligned collapse"> <fieldset aria-labelledby="fieldset-0-1-heading" class="module aligned collapse">
<details> <details>
<summary> <summary>
<h2 class="fieldset-heading" id="fieldset-0-meta-1-heading"> <h2 class="fieldset-heading" id="fieldset-0-1-heading">
Meta Meta
</h2> </h2>
</summary> </summary>
@ -108,8 +108,8 @@
</div> </div>
</details> </details>
</fieldset> </fieldset>
<fieldset aria-labelledby="fieldset-0-basic-2-heading" class="module aligned"> <fieldset aria-labelledby="fieldset-0-2-heading" class="module aligned">
<h2 class="fieldset-heading" id="fieldset-0-basic-2-heading"> <h2 class="fieldset-heading" id="fieldset-0-2-heading">
Basic Basic
</h2> </h2>
<div class="form-row field-kind"> <div class="form-row field-kind">
@ -268,10 +268,10 @@
</div> </div>
</div> </div>
</fieldset> </fieldset>
<fieldset aria-labelledby="fieldset-0-related-items-3-heading" class="module aligned collapse"> <fieldset aria-labelledby="fieldset-0-3-heading" class="module aligned collapse">
<details> <details>
<summary> <summary>
<h2 class="fieldset-heading" id="fieldset-0-related-items-3-heading"> <h2 class="fieldset-heading" id="fieldset-0-3-heading">
Related items Related items
</h2> </h2>
</summary> </summary>
@ -289,10 +289,10 @@
</div> </div>
</details> </details>
</fieldset> </fieldset>
<fieldset aria-labelledby="fieldset-0-lent-4-heading" class="module aligned collapse"> <fieldset aria-labelledby="fieldset-0-4-heading" class="module aligned collapse">
<details> <details>
<summary> <summary>
<h2 class="fieldset-heading" id="fieldset-0-lent-4-heading"> <h2 class="fieldset-heading" id="fieldset-0-4-heading">
Lent Lent
</h2> </h2>
</summary> </summary>
@ -344,10 +344,10 @@
</div> </div>
</details> </details>
</fieldset> </fieldset>
<fieldset aria-labelledby="fieldset-0-received-5-heading" class="module aligned collapse"> <fieldset aria-labelledby="fieldset-0-5-heading" class="module aligned collapse">
<details> <details>
<summary> <summary>
<h2 class="fieldset-heading" id="fieldset-0-received-5-heading"> <h2 class="fieldset-heading" id="fieldset-0-5-heading">
Received Received
</h2> </h2>
</summary> </summary>
@ -395,10 +395,10 @@
</div> </div>
</details> </details>
</fieldset> </fieldset>
<fieldset aria-labelledby="fieldset-0-handed-over-6-heading" class="module aligned collapse"> <fieldset aria-labelledby="fieldset-0-6-heading" class="module aligned collapse">
<details> <details>
<summary> <summary>
<h2 class="fieldset-heading" id="fieldset-0-handed-over-6-heading"> <h2 class="fieldset-heading" id="fieldset-0-6-heading">
Handed over Handed over
</h2> </h2>
</summary> </summary>

Wyświetl plik

@ -219,10 +219,10 @@
Version error: Overwrite version 2 with 1 is forbidden! Version error: Overwrite version 2 with 1 is forbidden!
</li> </li>
</ul> </ul>
<fieldset aria-labelledby="fieldset-0-internals-0-heading" class="module aligned collapse"> <fieldset aria-labelledby="fieldset-0-0-heading" class="module aligned collapse">
<details> <details>
<summary> <summary>
<h2 class="fieldset-heading" id="fieldset-0-internals-0-heading"> <h2 class="fieldset-heading" id="fieldset-0-0-heading">
Internals Internals
</h2> </h2>
</summary> </summary>
@ -288,10 +288,10 @@
</div> </div>
</details> </details>
</fieldset> </fieldset>
<fieldset aria-labelledby="fieldset-0-meta-1-heading" class="module aligned collapse"> <fieldset aria-labelledby="fieldset-0-1-heading" class="module aligned collapse">
<details> <details>
<summary> <summary>
<h2 class="fieldset-heading" id="fieldset-0-meta-1-heading"> <h2 class="fieldset-heading" id="fieldset-0-1-heading">
Meta Meta
</h2> </h2>
</summary> </summary>
@ -331,8 +331,8 @@
</div> </div>
</details> </details>
</fieldset> </fieldset>
<fieldset aria-labelledby="fieldset-0-basic-2-heading" class="module aligned"> <fieldset aria-labelledby="fieldset-0-2-heading" class="module aligned">
<h2 class="fieldset-heading" id="fieldset-0-basic-2-heading"> <h2 class="fieldset-heading" id="fieldset-0-2-heading">
Basic Basic
</h2> </h2>
<div class="form-row field-kind"> <div class="form-row field-kind">
@ -498,10 +498,10 @@
</div> </div>
</div> </div>
</fieldset> </fieldset>
<fieldset aria-labelledby="fieldset-0-related-items-3-heading" class="module aligned collapse"> <fieldset aria-labelledby="fieldset-0-3-heading" class="module aligned collapse">
<details> <details>
<summary> <summary>
<h2 class="fieldset-heading" id="fieldset-0-related-items-3-heading"> <h2 class="fieldset-heading" id="fieldset-0-3-heading">
Related items Related items
</h2> </h2>
</summary> </summary>
@ -542,10 +542,10 @@
</div> </div>
</details> </details>
</fieldset> </fieldset>
<fieldset aria-labelledby="fieldset-0-lent-4-heading" class="module aligned collapse"> <fieldset aria-labelledby="fieldset-0-4-heading" class="module aligned collapse">
<details> <details>
<summary> <summary>
<h2 class="fieldset-heading" id="fieldset-0-lent-4-heading"> <h2 class="fieldset-heading" id="fieldset-0-4-heading">
Lent Lent
</h2> </h2>
</summary> </summary>
@ -597,10 +597,10 @@
</div> </div>
</details> </details>
</fieldset> </fieldset>
<fieldset aria-labelledby="fieldset-0-received-5-heading" class="module aligned collapse"> <fieldset aria-labelledby="fieldset-0-5-heading" class="module aligned collapse">
<details> <details>
<summary> <summary>
<h2 class="fieldset-heading" id="fieldset-0-received-5-heading"> <h2 class="fieldset-heading" id="fieldset-0-5-heading">
Received Received
</h2> </h2>
</summary> </summary>
@ -648,10 +648,10 @@
</div> </div>
</details> </details>
</fieldset> </fieldset>
<fieldset aria-labelledby="fieldset-0-handed-over-6-heading" class="module aligned collapse"> <fieldset aria-labelledby="fieldset-0-6-heading" class="module aligned collapse">
<details> <details>
<summary> <summary>
<h2 class="fieldset-heading" id="fieldset-0-handed-over-6-heading"> <h2 class="fieldset-heading" id="fieldset-0-6-heading">
Handed over Handed over
</h2> </h2>
</summary> </summary>

Wyświetl plik

@ -6,10 +6,10 @@
<form enctype="multipart/form-data" id="memomodel_form" method="post" novalidate=""> <form enctype="multipart/form-data" id="memomodel_form" method="post" novalidate="">
MockedCsrfTokenNode MockedCsrfTokenNode
<div> <div>
<fieldset aria-labelledby="fieldset-0-internals-0-heading" class="module aligned collapse"> <fieldset aria-labelledby="fieldset-0-0-heading" class="module aligned collapse">
<details> <details>
<summary> <summary>
<h2 class="fieldset-heading" id="fieldset-0-internals-0-heading"> <h2 class="fieldset-heading" id="fieldset-0-0-heading">
Internals Internals
</h2> </h2>
</summary> </summary>
@ -65,10 +65,10 @@
</div> </div>
</details> </details>
</fieldset> </fieldset>
<fieldset aria-labelledby="fieldset-0-meta-1-heading" class="module aligned collapse"> <fieldset aria-labelledby="fieldset-0-1-heading" class="module aligned collapse">
<details> <details>
<summary> <summary>
<h2 class="fieldset-heading" id="fieldset-0-meta-1-heading"> <h2 class="fieldset-heading" id="fieldset-0-1-heading">
Meta Meta
</h2> </h2>
</summary> </summary>
@ -108,8 +108,8 @@
</div> </div>
</details> </details>
</fieldset> </fieldset>
<fieldset aria-labelledby="fieldset-0-basic-2-heading" class="module aligned"> <fieldset aria-labelledby="fieldset-0-2-heading" class="module aligned">
<h2 class="fieldset-heading" id="fieldset-0-basic-2-heading"> <h2 class="fieldset-heading" id="fieldset-0-2-heading">
Basic Basic
</h2> </h2>
<div class="form-row field-name"> <div class="form-row field-name">

Wyświetl plik

@ -34,15 +34,19 @@ dbshell makemessages sqlflush test
diffsettings makemigrations sqlmigrate testserver diffsettings makemigrations sqlmigrate testserver
dumpdata migrate sqlsequencereset dumpdata migrate sqlsequencereset
import_export
=============
export import
inventory inventory
========= =========
seed_data tree seed_data tree
manage_django_project manage_django_project
===================== =====================
code_style pip_audit publish update_req code_style nox project_info update_req
coverage playwright run_dev_server update_test_snapshot_files coverage pip_audit publish update_test_snapshot_files
install project_info tox install playwright run_dev_server
reversion reversion
========= =========

Wyświetl plik

@ -8,6 +8,7 @@
""" """
import hashlib import hashlib
import os
import shlex import shlex
import signal import signal
import subprocess import subprocess
@ -34,7 +35,7 @@ else:
sys.exit(-1) sys.exit(-1)
assert sys.version_info >= (3, 10), f'Python version {sys.version_info} is too old!' assert sys.version_info >= (3, 11), f'Python version {sys.version_info} is too old!'
if sys.platform == 'win32': # wtf if sys.platform == 'win32': # wtf
@ -51,9 +52,9 @@ VENV_PATH = BASE_PATH / '.venv'
BIN_PATH = VENV_PATH / BIN_NAME BIN_PATH = VENV_PATH / BIN_NAME
PYTHON_PATH = BIN_PATH / f'python3{FILE_EXT}' PYTHON_PATH = BIN_PATH / f'python3{FILE_EXT}'
PIP_PATH = BIN_PATH / f'pip{FILE_EXT}' PIP_PATH = BIN_PATH / f'pip{FILE_EXT}'
PIP_SYNC_PATH = BIN_PATH / f'pip-sync{FILE_EXT}' UV_PATH = BIN_PATH / f'uv{FILE_EXT}'
DEP_LOCK_PATH = BASE_PATH / 'requirements.dev.txt' DEP_LOCK_PATH = BASE_PATH / 'uv.lock'
DEP_HASH_PATH = VENV_PATH / '.dep_hash' DEP_HASH_PATH = VENV_PATH / '.dep_hash'
# script file defined in pyproject.toml as [console_scripts] # script file defined in pyproject.toml as [console_scripts]
@ -99,23 +100,26 @@ def main(argv):
builder = venv.EnvBuilder(symlinks=True, upgrade=True, with_pip=True) builder = venv.EnvBuilder(symlinks=True, upgrade=True, with_pip=True)
builder.create(env_dir=VENV_PATH) builder.create(env_dir=VENV_PATH)
# Set environment variable for uv to use '.venv-app' as project environment:
os.environ['UV_PROJECT_ENVIRONMENT'] = str(VENV_PATH.absolute())
if not PROJECT_SHELL_SCRIPT.is_file() or not venv_up2date(): if not PROJECT_SHELL_SCRIPT.is_file() or not venv_up2date():
# Update pip # Update pip
verbose_check_call(PYTHON_PATH, '-m', 'pip', 'install', '-U', 'pip') verbose_check_call(PYTHON_PATH, '-m', 'pip', 'install', '-U', 'pip')
# Install pip-tools # Install uv
verbose_check_call(PYTHON_PATH, '-m', 'pip', 'install', '-U', 'pip-tools') verbose_check_call(PYTHON_PATH, '-m', 'pip', 'install', '-U', 'uv')
# install requirements via "pip-sync" # install requirements
verbose_check_call(PIP_SYNC_PATH, str(DEP_LOCK_PATH)) verbose_check_call(UV_PATH, 'sync', '--frozen')
# install project # install project
verbose_check_call(PIP_PATH, 'install', '--no-deps', '-e', '.') verbose_check_call(PIP_PATH, 'install', '--no-deps', '-e', '.')
store_dep_hash()
# Activate git pre-commit hooks: # Activate git pre-commit hooks:
verbose_check_call(PYTHON_PATH, '-m', 'pre_commit', 'install') verbose_check_call(PYTHON_PATH, '-m', 'pre_commit', 'install')
verbose_check_call(PYTHON_PATH, '-m', 'pre_commit', 'autoupdate')
store_dep_hash()
signal.signal(signal.SIGINT, noop_sigint_handler) # ignore "Interrupt from keyboard" signals signal.signal(signal.SIGINT, noop_sigint_handler) # ignore "Interrupt from keyboard" signals

Wyświetl plik

@ -30,21 +30,21 @@ dependencies = [
"django-debug-toolbar", # http://django-debug-toolbar.readthedocs.io/en/stable/changes.html "django-debug-toolbar", # http://django-debug-toolbar.readthedocs.io/en/stable/changes.html
"bx_py_utils", # https://github.com/boxine/bx_py_utils "bx_py_utils", # https://github.com/boxine/bx_py_utils
"bx_django_utils", # https://github.com/boxine/bx_django_utils "bx_django_utils", # https://github.com/boxine/bx_django_utils
"django-axes", # https://github.com/jazzband/django-axes
] ]
[project.optional-dependencies] [dependency-groups]
dev = [ dev = [
"django-debug-toolbar", # http://django-debug-toolbar.readthedocs.io/en/stable/changes.html "django-debug-toolbar", # http://django-debug-toolbar.readthedocs.io/en/stable/changes.html
"manage_django_project", # https://github.com/jedie/manage_django_project "manage_django_project", # https://github.com/jedie/manage_django_project
# TODO: "autocron", # https://github.com/kbr/autocron # TODO: "autocron", # https://github.com/kbr/autocron
"cmd2_ext_test", # https://github.com/python-cmd2/cmd2/tree/master/plugins/ext_test "cmd2_ext_test", # https://github.com/python-cmd2/cmd2/tree/master/plugins/ext_test
"playwright", # https://playwright.dev/python/docs/intro
"beautifulsoup4", # https://www.crummy.com/software/BeautifulSoup/ "beautifulsoup4", # https://www.crummy.com/software/BeautifulSoup/
'lxml', # https://github.com/lxml/lxml 'lxml', # https://github.com/lxml/lxml
"uv", # https://github.com/astral-sh/uv
"playwright", # https://github.com/microsoft/playwright-python
"tblib", # https://github.com/ionelmc/python-tblib "tblib", # https://github.com/ionelmc/python-tblib
"pip-tools", # https://github.com/jazzband/pip-tools/
"tox", # https://github.com/tox-dev/tox
"coverage", # https://github.com/nedbat/coveragepy "coverage", # https://github.com/nedbat/coveragepy
"autopep8", # https://github.com/hhatto/autopep8 "autopep8", # https://github.com/hhatto/autopep8
"pyupgrade", # https://github.com/asottile/pyupgrade "pyupgrade", # https://github.com/asottile/pyupgrade
@ -56,8 +56,8 @@ dev = [
"pip-audit", # https://github.com/pypa/pip-audit "pip-audit", # https://github.com/pypa/pip-audit
"mypy", # https://github.com/python/mypy "mypy", # https://github.com/python/mypy
"twine", # https://github.com/pypa/twine "twine", # https://github.com/pypa/twine
"typeguard", # https://github.com/agronholm/typeguard/
"pre-commit", # https://github.com/pre-commit/pre-commit "pre-commit", # https://github.com/pre-commit/pre-commit
"typeguard", # https://github.com/agronholm/typeguard/
# https://github.com/akaihola/darker # https://github.com/akaihola/darker
# https://github.com/ikamensh/flynt # https://github.com/ikamensh/flynt
@ -68,11 +68,6 @@ dev = [
"model_bakery", # https://github.com/model-bakers/model_bakery "model_bakery", # https://github.com/model-bakers/model_bakery
"requests-mock", # https://github.com/jamielennox/requests-mock "requests-mock", # https://github.com/jamielennox/requests-mock
"django-override-storage", # https://github.com/danifus/django-override-storage "django-override-storage", # https://github.com/danifus/django-override-storage
# Work-a-round for: https://github.com/jazzband/pip-tools/issues/1866
# see also: https://github.com/jazzband/pip-tools/issues/994#issuecomment-1321226661
# backports.tarfile is needed for python <3.12
'backports.tarfile', # via jaraco-context -> keyring -> twine
] ]
[project.urls] [project.urls]
@ -151,7 +146,7 @@ branch = true
parallel = true parallel = true
concurrency = ["multiprocessing"] concurrency = ["multiprocessing"]
source = ['.'] source = ['.']
command_line = '-m inventory_project test --shuffle --parallel --buffer' command_line = '-m unittest --verbose --locals --buffer'
[tool.coverage.report] [tool.coverage.report]
omit = ['.*', '*/tests/*', '*/migrations/*'] omit = ['.*', '*/tests/*', '*/migrations/*']
@ -165,26 +160,6 @@ exclude_lines = [
'if __name__ == .__main__.:', 'if __name__ == .__main__.:',
] ]
[tool.tox] # https://tox.wiki/en/latest/config.html#pyproject-toml
legacy_tox_ini = """
[tox]
isolated_build = True
envlist = py{312,311}
skip_missing_interpreters = True
[testenv]
passenv = *
skip_install = true
commands_pre =
pip install -U pip
pip install -U pip-tools
pip-sync requirements.dev.txt
commands =
{envpython} -m coverage run --context='{envname}'
"""
[tool.mypy] [tool.mypy]
warn_unused_configs = true warn_unused_configs = true
ignore_missing_imports = true ignore_missing_imports = true
@ -201,6 +176,7 @@ cookiecutter_template = "https://github.com/jedie/cookiecutter_templates/"
cookiecutter_directory = "managed-django-project" cookiecutter_directory = "managed-django-project"
applied_migrations = [ applied_migrations = [
"141b3e4", # 2024-09-05T17:53:31+02:00 "141b3e4", # 2024-09-05T17:53:31+02:00
"a36dd75", # 2025-03-23T11:39:23+01:00
] ]
[manageprojects.cookiecutter_context.cookiecutter] [manageprojects.cookiecutter_context.cookiecutter]
@ -208,7 +184,7 @@ full_name = "Jens Diemer"
github_username = "jedie" github_username = "jedie"
author_email = "PyInventory@jensdiemer.de" author_email = "PyInventory@jensdiemer.de"
package_name = "inventory" package_name = "inventory"
package_version = "0.18.0" package_version = "0.21.0"
package_description = "Web based management to catalog things including state and location etc. using Python/Django." package_description = "Web based management to catalog things including state and location etc. using Python/Django."
package_url = "https://github.com/jedie/PyInventory" package_url = "https://github.com/jedie/PyInventory"
issues_url = "https://github.com/jedie/PyInventory/issues" issues_url = "https://github.com/jedie/PyInventory/issues"

Plik diff jest za duży Load Diff

Wyświetl plik

@ -1,340 +0,0 @@
#
# This file is autogenerated by pip-compile with Python 3.12
# by the following command:
#
# ./manage.py update_req
#
asgiref==3.8.1 \
--hash=sha256:3e1e3ecc849832fe52ccf2cb6686b7a55f82bb1d6aee72a58826471390335e47 \
--hash=sha256:c343bd80a0bec947a9860adb4c432ffa7db769836c64238fc34bdc3fec84d590
# via django
bleach==6.1.0 \
--hash=sha256:0a31f1837963c41d46bbf1331b8778e1308ea0791db03cc4e7357b97cf42a8fe \
--hash=sha256:3225f354cfc436b9789c66c4ee030194bee0568fbf9cbdad3bc8b5c26c5f12b6
# via django-tools
bx-django-utils==79 \
--hash=sha256:cb66087d4e9396281acf5a4394b749cff3062b66082d5726f6a8a342fdd35d0e \
--hash=sha256:d50b10ace24b0b363574542faecf04a81029e2fec6d6e6525fe063ed06238e04
# via
# PyInventory (pyproject.toml)
# django-tools
bx-py-utils==101 \
--hash=sha256:2aa295cde55da99b77f5f2f8b5bf8c0bec7e0046511832989ecbb1a43183cf75 \
--hash=sha256:eece1f0b1e3c091d38f3013984056b05f43c6a0fd716489cf337d89df802ab59
# via
# PyInventory (pyproject.toml)
# bx-django-utils
# django-tools
certifi==2024.8.30 \
--hash=sha256:922820b53db7a7257ffbda3f597266d435245903d80737e34f8a45ff3e3230d8 \
--hash=sha256:bec941d2aa8195e248a60b31ff9f0558284cf01a52591ceda73ea9afffd69fd9
# via requests
charset-normalizer==3.3.2 \
--hash=sha256:06435b539f889b1f6f4ac1758871aae42dc3a8c0e24ac9e60c2384973ad73027 \
--hash=sha256:06a81e93cd441c56a9b65d8e1d043daeb97a3d0856d177d5c90ba85acb3db087 \
--hash=sha256:0a55554a2fa0d408816b3b5cedf0045f4b8e1a6065aec45849de2d6f3f8e9786 \
--hash=sha256:0b2b64d2bb6d3fb9112bafa732def486049e63de9618b5843bcdd081d8144cd8 \
--hash=sha256:10955842570876604d404661fbccbc9c7e684caf432c09c715ec38fbae45ae09 \
--hash=sha256:122c7fa62b130ed55f8f285bfd56d5f4b4a5b503609d181f9ad85e55c89f4185 \
--hash=sha256:1ceae2f17a9c33cb48e3263960dc5fc8005351ee19db217e9b1bb15d28c02574 \
--hash=sha256:1d3193f4a680c64b4b6a9115943538edb896edc190f0b222e73761716519268e \
--hash=sha256:1f79682fbe303db92bc2b1136016a38a42e835d932bab5b3b1bfcfbf0640e519 \
--hash=sha256:2127566c664442652f024c837091890cb1942c30937add288223dc895793f898 \
--hash=sha256:22afcb9f253dac0696b5a4be4a1c0f8762f8239e21b99680099abd9b2b1b2269 \
--hash=sha256:25baf083bf6f6b341f4121c2f3c548875ee6f5339300e08be3f2b2ba1721cdd3 \
--hash=sha256:2e81c7b9c8979ce92ed306c249d46894776a909505d8f5a4ba55b14206e3222f \
--hash=sha256:3287761bc4ee9e33561a7e058c72ac0938c4f57fe49a09eae428fd88aafe7bb6 \
--hash=sha256:34d1c8da1e78d2e001f363791c98a272bb734000fcef47a491c1e3b0505657a8 \
--hash=sha256:37e55c8e51c236f95b033f6fb391d7d7970ba5fe7ff453dad675e88cf303377a \
--hash=sha256:3d47fa203a7bd9c5b6cee4736ee84ca03b8ef23193c0d1ca99b5089f72645c73 \
--hash=sha256:3e4d1f6587322d2788836a99c69062fbb091331ec940e02d12d179c1d53e25fc \
--hash=sha256:42cb296636fcc8b0644486d15c12376cb9fa75443e00fb25de0b8602e64c1714 \
--hash=sha256:45485e01ff4d3630ec0d9617310448a8702f70e9c01906b0d0118bdf9d124cf2 \
--hash=sha256:4a78b2b446bd7c934f5dcedc588903fb2f5eec172f3d29e52a9096a43722adfc \
--hash=sha256:4ab2fe47fae9e0f9dee8c04187ce5d09f48eabe611be8259444906793ab7cbce \
--hash=sha256:4d0d1650369165a14e14e1e47b372cfcb31d6ab44e6e33cb2d4e57265290044d \
--hash=sha256:549a3a73da901d5bc3ce8d24e0600d1fa85524c10287f6004fbab87672bf3e1e \
--hash=sha256:55086ee1064215781fff39a1af09518bc9255b50d6333f2e4c74ca09fac6a8f6 \
--hash=sha256:572c3763a264ba47b3cf708a44ce965d98555f618ca42c926a9c1616d8f34269 \
--hash=sha256:573f6eac48f4769d667c4442081b1794f52919e7edada77495aaed9236d13a96 \
--hash=sha256:5b4c145409bef602a690e7cfad0a15a55c13320ff7a3ad7ca59c13bb8ba4d45d \
--hash=sha256:6463effa3186ea09411d50efc7d85360b38d5f09b870c48e4600f63af490e56a \
--hash=sha256:65f6f63034100ead094b8744b3b97965785388f308a64cf8d7c34f2f2e5be0c4 \
--hash=sha256:663946639d296df6a2bb2aa51b60a2454ca1cb29835324c640dafb5ff2131a77 \
--hash=sha256:6897af51655e3691ff853668779c7bad41579facacf5fd7253b0133308cf000d \
--hash=sha256:68d1f8a9e9e37c1223b656399be5d6b448dea850bed7d0f87a8311f1ff3dabb0 \
--hash=sha256:6ac7ffc7ad6d040517be39eb591cac5ff87416c2537df6ba3cba3bae290c0fed \
--hash=sha256:6b3251890fff30ee142c44144871185dbe13b11bab478a88887a639655be1068 \
--hash=sha256:6c4caeef8fa63d06bd437cd4bdcf3ffefe6738fb1b25951440d80dc7df8c03ac \
--hash=sha256:6ef1d82a3af9d3eecdba2321dc1b3c238245d890843e040e41e470ffa64c3e25 \
--hash=sha256:753f10e867343b4511128c6ed8c82f7bec3bd026875576dfd88483c5c73b2fd8 \
--hash=sha256:7cd13a2e3ddeed6913a65e66e94b51d80a041145a026c27e6bb76c31a853c6ab \
--hash=sha256:7ed9e526742851e8d5cc9e6cf41427dfc6068d4f5a3bb03659444b4cabf6bc26 \
--hash=sha256:7f04c839ed0b6b98b1a7501a002144b76c18fb1c1850c8b98d458ac269e26ed2 \
--hash=sha256:802fe99cca7457642125a8a88a084cef28ff0cf9407060f7b93dca5aa25480db \
--hash=sha256:80402cd6ee291dcb72644d6eac93785fe2c8b9cb30893c1af5b8fdd753b9d40f \
--hash=sha256:8465322196c8b4d7ab6d1e049e4c5cb460d0394da4a27d23cc242fbf0034b6b5 \
--hash=sha256:86216b5cee4b06df986d214f664305142d9c76df9b6512be2738aa72a2048f99 \
--hash=sha256:87d1351268731db79e0f8e745d92493ee2841c974128ef629dc518b937d9194c \
--hash=sha256:8bdb58ff7ba23002a4c5808d608e4e6c687175724f54a5dade5fa8c67b604e4d \
--hash=sha256:8c622a5fe39a48f78944a87d4fb8a53ee07344641b0562c540d840748571b811 \
--hash=sha256:8d756e44e94489e49571086ef83b2bb8ce311e730092d2c34ca8f7d925cb20aa \
--hash=sha256:8f4a014bc36d3c57402e2977dada34f9c12300af536839dc38c0beab8878f38a \
--hash=sha256:9063e24fdb1e498ab71cb7419e24622516c4a04476b17a2dab57e8baa30d6e03 \
--hash=sha256:90d558489962fd4918143277a773316e56c72da56ec7aa3dc3dbbe20fdfed15b \
--hash=sha256:923c0c831b7cfcb071580d3f46c4baf50f174be571576556269530f4bbd79d04 \
--hash=sha256:95f2a5796329323b8f0512e09dbb7a1860c46a39da62ecb2324f116fa8fdc85c \
--hash=sha256:96b02a3dc4381e5494fad39be677abcb5e6634bf7b4fa83a6dd3112607547001 \
--hash=sha256:9f96df6923e21816da7e0ad3fd47dd8f94b2a5ce594e00677c0013018b813458 \
--hash=sha256:a10af20b82360ab00827f916a6058451b723b4e65030c5a18577c8b2de5b3389 \
--hash=sha256:a50aebfa173e157099939b17f18600f72f84eed3049e743b68ad15bd69b6bf99 \
--hash=sha256:a981a536974bbc7a512cf44ed14938cf01030a99e9b3a06dd59578882f06f985 \
--hash=sha256:a9a8e9031d613fd2009c182b69c7b2c1ef8239a0efb1df3f7c8da66d5dd3d537 \
--hash=sha256:ae5f4161f18c61806f411a13b0310bea87f987c7d2ecdbdaad0e94eb2e404238 \
--hash=sha256:aed38f6e4fb3f5d6bf81bfa990a07806be9d83cf7bacef998ab1a9bd660a581f \
--hash=sha256:b01b88d45a6fcb69667cd6d2f7a9aeb4bf53760d7fc536bf679ec94fe9f3ff3d \
--hash=sha256:b261ccdec7821281dade748d088bb6e9b69e6d15b30652b74cbbac25e280b796 \
--hash=sha256:b2b0a0c0517616b6869869f8c581d4eb2dd83a4d79e0ebcb7d373ef9956aeb0a \
--hash=sha256:b4a23f61ce87adf89be746c8a8974fe1c823c891d8f86eb218bb957c924bb143 \
--hash=sha256:bd8f7df7d12c2db9fab40bdd87a7c09b1530128315d047a086fa3ae3435cb3a8 \
--hash=sha256:beb58fe5cdb101e3a055192ac291b7a21e3b7ef4f67fa1d74e331a7f2124341c \
--hash=sha256:c002b4ffc0be611f0d9da932eb0f704fe2602a9a949d1f738e4c34c75b0863d5 \
--hash=sha256:c083af607d2515612056a31f0a8d9e0fcb5876b7bfc0abad3ecd275bc4ebc2d5 \
--hash=sha256:c180f51afb394e165eafe4ac2936a14bee3eb10debc9d9e4db8958fe36afe711 \
--hash=sha256:c235ebd9baae02f1b77bcea61bce332cb4331dc3617d254df3323aa01ab47bd4 \
--hash=sha256:cd70574b12bb8a4d2aaa0094515df2463cb429d8536cfb6c7ce983246983e5a6 \
--hash=sha256:d0eccceffcb53201b5bfebb52600a5fb483a20b61da9dbc885f8b103cbe7598c \
--hash=sha256:d965bba47ddeec8cd560687584e88cf699fd28f192ceb452d1d7ee807c5597b7 \
--hash=sha256:db364eca23f876da6f9e16c9da0df51aa4f104a972735574842618b8c6d999d4 \
--hash=sha256:ddbb2551d7e0102e7252db79ba445cdab71b26640817ab1e3e3648dad515003b \
--hash=sha256:deb6be0ac38ece9ba87dea880e438f25ca3eddfac8b002a2ec3d9183a454e8ae \
--hash=sha256:e06ed3eb3218bc64786f7db41917d4e686cc4856944f53d5bdf83a6884432e12 \
--hash=sha256:e27ad930a842b4c5eb8ac0016b0a54f5aebbe679340c26101df33424142c143c \
--hash=sha256:e537484df0d8f426ce2afb2d0f8e1c3d0b114b83f8850e5f2fbea0e797bd82ae \
--hash=sha256:eb00ed941194665c332bf8e078baf037d6c35d7c4f3102ea2d4f16ca94a26dc8 \
--hash=sha256:eb6904c354526e758fda7167b33005998fb68c46fbc10e013ca97f21ca5c8887 \
--hash=sha256:eb8821e09e916165e160797a6c17edda0679379a4be5c716c260e836e122f54b \
--hash=sha256:efcb3f6676480691518c177e3b465bcddf57cea040302f9f4e6e191af91174d4 \
--hash=sha256:f27273b60488abe721a075bcca6d7f3964f9f6f067c8c4c605743023d7d3944f \
--hash=sha256:f30c3cb33b24454a82faecaf01b19c18562b1e89558fb6c56de4d9118a032fd5 \
--hash=sha256:fb69256e180cb6c8a894fee62b3afebae785babc1ee98b81cdf68bbca1987f33 \
--hash=sha256:fd1abc0d89e30cc4e02e4064dc67fcc51bd941eb395c502aac3ec19fab46b519 \
--hash=sha256:ff8fa367d09b717b2a17a052544193ad76cd49979c805768879cb63d9ca50561
# via requests
colorlog==6.8.2 \
--hash=sha256:3e3e079a41feb5a1b64f978b5ea4f46040a94f11f0e8bbb8261e3dbbeca64d44 \
--hash=sha256:4dcbb62368e2800cb3c5abd348da7e53f6c362dda502ec27c560b2e58a66bd33
# via
# PyInventory (pyproject.toml)
# django-tools
diff-match-patch==20230430 \
--hash=sha256:953019cdb9c9d2c9e47b5b12bcff3cf4746fc4598eb406076fa1fc27e6a1f15c \
--hash=sha256:dce43505fb7b1b317de7195579388df0746d90db07015ed47a85e5e44930ef93
# via
# django-import-export
# django-reversion-compare
django==5.1.1 \
--hash=sha256:021ffb7fdab3d2d388bc8c7c2434eb9c1f6f4d09e6119010bbb1694dda286bc2 \
--hash=sha256:71603f27dac22a6533fb38d83072eea9ddb4017fead6f67f2562a40402d61c3f
# via
# PyInventory (pyproject.toml)
# bx-django-utils
# django-admin-sortable2
# django-dbbackup
# django-debug-toolbar
# django-import-export
# django-reversion
# django-reversion-compare
# django-tagulous
# django-tinymce
# django-tools
django-admin-sortable2==2.2.2 \
--hash=sha256:efb28eed633e3a008c6938a887096a9887a213628a39458dc748d654f8f12d5c \
--hash=sha256:fc6b62ac1e5f4c95001742d568a2c1ce371bafe9d79d809fc55779fba955e498
# via PyInventory (pyproject.toml)
django-dbbackup==4.2.1 \
--hash=sha256:157a2ec10d482345cd75092e510ac40d6e2ee6084604a1d17abe178c2f06bc69 \
--hash=sha256:b23265600ead0780ca781b1b4b594949aaa8a20d74f08701f91ee9d7eb1f08cd
# via PyInventory (pyproject.toml)
django-debug-toolbar==4.4.6 \
--hash=sha256:36e421cb908c2f0675e07f9f41e3d1d8618dc386392ec82d23bcfcd5d29c7044 \
--hash=sha256:3beb671c9ec44ffb817fad2780667f172bd1c067dbcabad6268ce39a81335f45
# via PyInventory (pyproject.toml)
django-import-export==4.1.1 \
--hash=sha256:16ecc5a9f0df46bde6eb278a3e65ebda0ee1db55656f36440e9fb83f40ab85a3 \
--hash=sha256:730ae2443a02b1ba27d8dba078a27ae9123adfcabb78161b4f130843607b3df9
# via PyInventory (pyproject.toml)
django-reversion==5.1.0 \
--hash=sha256:084d4f117d9e2b4e8dfdfaad83ebb34410a03eed6071c96089e6811fdea82ad3 \
--hash=sha256:3309821e5b6fceedcce6b6975f1a9c7fab6ae7c7d0e1276a90e345946fa0dcb8
# via django-reversion-compare
django-reversion-compare==0.17.0 \
--hash=sha256:02d13ed7994d24d505671d84a005c6f99d13ed92531fa457c63245b518f835ff \
--hash=sha256:bfb036f32943965d01132809f94b853531cf6c9e3607b8894149c82fe68eddaa
# via PyInventory (pyproject.toml)
django-tagulous==2.1.0 \
--hash=sha256:5ebba5a51f049f6df5f9d2a30eef431c0bf7cd35758aa0a42fc3351be4d239cd \
--hash=sha256:f629b54ad720052092785b0dce056dc6a68c7b63f8126075af9c25848b250bfd
# via PyInventory (pyproject.toml)
django-tinymce==4.1.0 \
--hash=sha256:02e3b70e940fd299f0fbef4315aee5c185664e1eb8cd396b176963954e4357c9 \
--hash=sha256:9804836e6d2b08de3b03a27c100f8c2e9633549913eff8b323678a10cd48b94e
# via PyInventory (pyproject.toml)
django-tools==0.56.2 \
--hash=sha256:29c25be814d74cd9f554d7d45bc205f5570e5feaa4232cbd09cc913c46b20c07 \
--hash=sha256:88a192f2873f0411b99ee1aba04f2779133284cd18a5c78976e8e4605ba5d7f7
# via PyInventory (pyproject.toml)
gunicorn==23.0.0 \
--hash=sha256:ec400d38950de4dfd418cff8328b2c8faed0edb0d517d3394e457c317908ca4d \
--hash=sha256:f014447a0101dc57e294f6c18ca6b40227a4c90e9bdb586042628030cba004ec
# via
# PyInventory (pyproject.toml)
# django-tools
icdiff==2.0.7 \
--hash=sha256:f05d1b3623223dd1c70f7848da7d699de3d9a2550b902a8234d9026292fb5762 \
--hash=sha256:f79a318891adbf59a45e3a7694f5e1f18c5407065264637072ac8363b759866f
# via django-tools
idna==3.8 \
--hash=sha256:050b4e5baadcd44d760cedbd2b8e639f2ff89bbc7a5730fcc662954303377aac \
--hash=sha256:d838c2c0ed6fced7693d5e8ab8e734d5f8fda53a039c0164afb0b82e771e3603
# via requests
markdown-it-py==3.0.0 \
--hash=sha256:355216845c60bd96232cd8d8c40e8f9765cc86f46880e43a8fd22dc1a1a8cab1 \
--hash=sha256:e3f60a94fa066dc52ec76661e37c851cb232d92f9886b15cb560aaada2df8feb
# via rich
mdurl==0.1.2 \
--hash=sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8 \
--hash=sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba
# via markdown-it-py
packaging==24.1 \
--hash=sha256:026ed72c8ed3fcce5bf8950572258698927fd1dbda10a5e981cdf0ac37f4f002 \
--hash=sha256:5b8f2217dbdbd2f7f384c41c628544e6d52f2d0f53c6d0c3ea61aa5d1d7ff124
# via gunicorn
pillow==10.4.0 \
--hash=sha256:02a2be69f9c9b8c1e97cf2713e789d4e398c751ecfd9967c18d0ce304efbf885 \
--hash=sha256:030abdbe43ee02e0de642aee345efa443740aa4d828bfe8e2eb11922ea6a21ea \
--hash=sha256:06b2f7898047ae93fad74467ec3d28fe84f7831370e3c258afa533f81ef7f3df \
--hash=sha256:0755ffd4a0c6f267cccbae2e9903d95477ca2f77c4fcf3a3a09570001856c8a5 \
--hash=sha256:0a9ec697746f268507404647e531e92889890a087e03681a3606d9b920fbee3c \
--hash=sha256:0ae24a547e8b711ccaaf99c9ae3cd975470e1a30caa80a6aaee9a2f19c05701d \
--hash=sha256:134ace6dc392116566980ee7436477d844520a26a4b1bd4053f6f47d096997fd \
--hash=sha256:166c1cd4d24309b30d61f79f4a9114b7b2313d7450912277855ff5dfd7cd4a06 \
--hash=sha256:1b5dea9831a90e9d0721ec417a80d4cbd7022093ac38a568db2dd78363b00908 \
--hash=sha256:1d846aea995ad352d4bdcc847535bd56e0fd88d36829d2c90be880ef1ee4668a \
--hash=sha256:1ef61f5dd14c300786318482456481463b9d6b91ebe5ef12f405afbba77ed0be \
--hash=sha256:297e388da6e248c98bc4a02e018966af0c5f92dfacf5a5ca22fa01cb3179bca0 \
--hash=sha256:298478fe4f77a4408895605f3482b6cc6222c018b2ce565c2b6b9c354ac3229b \
--hash=sha256:29dbdc4207642ea6aad70fbde1a9338753d33fb23ed6956e706936706f52dd80 \
--hash=sha256:2db98790afc70118bd0255c2eeb465e9767ecf1f3c25f9a1abb8ffc8cfd1fe0a \
--hash=sha256:32cda9e3d601a52baccb2856b8ea1fc213c90b340c542dcef77140dfa3278a9e \
--hash=sha256:37fb69d905be665f68f28a8bba3c6d3223c8efe1edf14cc4cfa06c241f8c81d9 \
--hash=sha256:416d3a5d0e8cfe4f27f574362435bc9bae57f679a7158e0096ad2beb427b8696 \
--hash=sha256:43efea75eb06b95d1631cb784aa40156177bf9dd5b4b03ff38979e048258bc6b \
--hash=sha256:4b35b21b819ac1dbd1233317adeecd63495f6babf21b7b2512d244ff6c6ce309 \
--hash=sha256:4d9667937cfa347525b319ae34375c37b9ee6b525440f3ef48542fcf66f2731e \
--hash=sha256:5161eef006d335e46895297f642341111945e2c1c899eb406882a6c61a4357ab \
--hash=sha256:543f3dc61c18dafb755773efc89aae60d06b6596a63914107f75459cf984164d \
--hash=sha256:551d3fd6e9dc15e4c1eb6fc4ba2b39c0c7933fa113b220057a34f4bb3268a060 \
--hash=sha256:59291fb29317122398786c2d44427bbd1a6d7ff54017075b22be9d21aa59bd8d \
--hash=sha256:5b001114dd152cfd6b23befeb28d7aee43553e2402c9f159807bf55f33af8a8d \
--hash=sha256:5b4815f2e65b30f5fbae9dfffa8636d992d49705723fe86a3661806e069352d4 \
--hash=sha256:5dc6761a6efc781e6a1544206f22c80c3af4c8cf461206d46a1e6006e4429ff3 \
--hash=sha256:5e84b6cc6a4a3d76c153a6b19270b3526a5a8ed6b09501d3af891daa2a9de7d6 \
--hash=sha256:6209bb41dc692ddfee4942517c19ee81b86c864b626dbfca272ec0f7cff5d9fb \
--hash=sha256:673655af3eadf4df6b5457033f086e90299fdd7a47983a13827acf7459c15d94 \
--hash=sha256:6c762a5b0997f5659a5ef2266abc1d8851ad7749ad9a6a5506eb23d314e4f46b \
--hash=sha256:7086cc1d5eebb91ad24ded9f58bec6c688e9f0ed7eb3dbbf1e4800280a896496 \
--hash=sha256:73664fe514b34c8f02452ffb73b7a92c6774e39a647087f83d67f010eb9a0cf0 \
--hash=sha256:76a911dfe51a36041f2e756b00f96ed84677cdeb75d25c767f296c1c1eda1319 \
--hash=sha256:780c072c2e11c9b2c7ca37f9a2ee8ba66f44367ac3e5c7832afcfe5104fd6d1b \
--hash=sha256:7928ecbf1ece13956b95d9cbcfc77137652b02763ba384d9ab508099a2eca856 \
--hash=sha256:7970285ab628a3779aecc35823296a7869f889b8329c16ad5a71e4901a3dc4ef \
--hash=sha256:7a8d4bade9952ea9a77d0c3e49cbd8b2890a399422258a77f357b9cc9be8d680 \
--hash=sha256:7c1ee6f42250df403c5f103cbd2768a28fe1a0ea1f0f03fe151c8741e1469c8b \
--hash=sha256:7dfecdbad5c301d7b5bde160150b4db4c659cee2b69589705b6f8a0c509d9f42 \
--hash=sha256:812f7342b0eee081eaec84d91423d1b4650bb9828eb53d8511bcef8ce5aecf1e \
--hash=sha256:866b6942a92f56300012f5fbac71f2d610312ee65e22f1aa2609e491284e5597 \
--hash=sha256:86dcb5a1eb778d8b25659d5e4341269e8590ad6b4e8b44d9f4b07f8d136c414a \
--hash=sha256:87dd88ded2e6d74d31e1e0a99a726a6765cda32d00ba72dc37f0651f306daaa8 \
--hash=sha256:8bc1a764ed8c957a2e9cacf97c8b2b053b70307cf2996aafd70e91a082e70df3 \
--hash=sha256:8d4d5063501b6dd4024b8ac2f04962d661222d120381272deea52e3fc52d3736 \
--hash=sha256:8f0aef4ef59694b12cadee839e2ba6afeab89c0f39a3adc02ed51d109117b8da \
--hash=sha256:930044bb7679ab003b14023138b50181899da3f25de50e9dbee23b61b4de2126 \
--hash=sha256:950be4d8ba92aca4b2bb0741285a46bfae3ca699ef913ec8416c1b78eadd64cd \
--hash=sha256:961a7293b2457b405967af9c77dcaa43cc1a8cd50d23c532e62d48ab6cdd56f5 \
--hash=sha256:9b885f89040bb8c4a1573566bbb2f44f5c505ef6e74cec7ab9068c900047f04b \
--hash=sha256:9f4727572e2918acaa9077c919cbbeb73bd2b3ebcfe033b72f858fc9fbef0026 \
--hash=sha256:a02364621fe369e06200d4a16558e056fe2805d3468350df3aef21e00d26214b \
--hash=sha256:a985e028fc183bf12a77a8bbf36318db4238a3ded7fa9df1b9a133f1cb79f8fc \
--hash=sha256:ac1452d2fbe4978c2eec89fb5a23b8387aba707ac72810d9490118817d9c0b46 \
--hash=sha256:b15e02e9bb4c21e39876698abf233c8c579127986f8207200bc8a8f6bb27acf2 \
--hash=sha256:b2724fdb354a868ddf9a880cb84d102da914e99119211ef7ecbdc613b8c96b3c \
--hash=sha256:bbc527b519bd3aa9d7f429d152fea69f9ad37c95f0b02aebddff592688998abe \
--hash=sha256:bcd5e41a859bf2e84fdc42f4edb7d9aba0a13d29a2abadccafad99de3feff984 \
--hash=sha256:bd2880a07482090a3bcb01f4265f1936a903d70bc740bfcb1fd4e8a2ffe5cf5a \
--hash=sha256:bee197b30783295d2eb680b311af15a20a8b24024a19c3a26431ff83eb8d1f70 \
--hash=sha256:bf2342ac639c4cf38799a44950bbc2dfcb685f052b9e262f446482afaf4bffca \
--hash=sha256:c76e5786951e72ed3686e122d14c5d7012f16c8303a674d18cdcd6d89557fc5b \
--hash=sha256:cbed61494057c0f83b83eb3a310f0bf774b09513307c434d4366ed64f4128a91 \
--hash=sha256:cfdd747216947628af7b259d274771d84db2268ca062dd5faf373639d00113a3 \
--hash=sha256:d7480af14364494365e89d6fddc510a13e5a2c3584cb19ef65415ca57252fb84 \
--hash=sha256:dbc6ae66518ab3c5847659e9988c3b60dc94ffb48ef9168656e0019a93dbf8a1 \
--hash=sha256:dc3e2db6ba09ffd7d02ae9141cfa0ae23393ee7687248d46a7507b75d610f4f5 \
--hash=sha256:dfe91cb65544a1321e631e696759491ae04a2ea11d36715eca01ce07284738be \
--hash=sha256:e4d49b85c4348ea0b31ea63bc75a9f3857869174e2bf17e7aba02945cd218e6f \
--hash=sha256:e4db64794ccdf6cb83a59d73405f63adbe2a1887012e308828596100a0b2f6cc \
--hash=sha256:e553cad5179a66ba15bb18b353a19020e73a7921296a7979c4a2b7f6a5cd57f9 \
--hash=sha256:e88d5e6ad0d026fba7bdab8c3f225a69f063f116462c49892b0149e21b6c0a0e \
--hash=sha256:ecd85a8d3e79cd7158dec1c9e5808e821feea088e2f69a974db5edf84dc53141 \
--hash=sha256:f5b92f4d70791b4a67157321c4e8225d60b119c5cc9aee8ecf153aace4aad4ef \
--hash=sha256:f5f0c3e969c8f12dd2bb7e0b15d5c468b51e5017e01e2e867335c81903046a22 \
--hash=sha256:f7baece4ce06bade126fb84b8af1c33439a76d8a6fd818970215e0560ca28c27 \
--hash=sha256:ff25afb18123cea58a591ea0244b92eb1e61a1fd497bf6d6384f09bc3262ec3e \
--hash=sha256:ff337c552345e95702c5fde3158acb0625111017d0e5f24bf3acdb9cc16b90d1
# via PyInventory (pyproject.toml)
pprintpp==0.4.0 \
--hash=sha256:b6b4dcdd0c0c0d75e4d7b2f21a9e933e5b2ce62b26e1a54537f9651ae5a5c01d \
--hash=sha256:ea826108e2c7f49dc6d66c752973c3fc9749142a798d6b254e1e301cfdbc6403
# via django-tools
pygments==2.18.0 \
--hash=sha256:786ff802f32e91311bff3889f6e9a86e81505fe99f2735bb6d60ae0c5004f199 \
--hash=sha256:b8e6aca0523f3ab76fee51799c488e38782ac06eafcf95e7ba832985c8e7b13a
# via rich
python-stdnum==1.20 \
--hash=sha256:111008e10391d54fb2afad2a10df70d5cb0c6c0a7ec82fec6f022cb8712961d3 \
--hash=sha256:ad2a2cf2eb025de408210235f36b4ae31252de3186240ccaa8126e117cb82690
# via bx-django-utils
pytz==2024.1 \
--hash=sha256:2a29735ea9c18baf14b448846bde5a48030ed267578472d8955cd0e7443a9812 \
--hash=sha256:328171f4e3623139da4983451950b28e95ac706e13f3f2630a879749e7a8b319
# via django-dbbackup
requests==2.32.3 \
--hash=sha256:55365417734eb18255590a9ff9eb97e9e1da868d4ccd6402399eaf68af20a760 \
--hash=sha256:70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6
# via PyInventory (pyproject.toml)
rich==13.8.0 \
--hash=sha256:2e85306a063b9492dffc86278197a60cbece75bcb766022f3436f567cae11bdc \
--hash=sha256:a5ac1f1cd448ade0d59cc3356f7db7a7ccda2c8cbae9c7a90c28ff463d3e91f4
# via django-reversion-compare
six==1.16.0 \
--hash=sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926 \
--hash=sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254
# via bleach
sqlparse==0.5.1 \
--hash=sha256:773dcbf9a5ab44a090f3441e2180efe2560220203dc2f8c0b0fa141e18b505e4 \
--hash=sha256:bb6b4df465655ef332548e24f08e205afc81b9ab86cb1c45657a7ff173a3a00e
# via
# django
# django-debug-toolbar
tablib==3.5.0 \
--hash=sha256:9821caa9eca6062ff7299fa645e737aecff982e6b2b42046928a6413c8dabfd9 \
--hash=sha256:f6661dfc45e1d4f51fa8a6239f9c8349380859a5bfaa73280645f046d6c96e33
# via django-import-export
urllib3==2.2.2 \
--hash=sha256:a448b2f64d686155468037e1ace9f2d2199776e17f0a46610480d311f73e3472 \
--hash=sha256:dd505485549a7a552833da5e6063639d0d177c04f23bc3864e41e5dc5f612168
# via requests
webencodings==0.5.1 \
--hash=sha256:a0af1213f3c2226497a97e2b3aa01a7e4bee4f403f95be16fc9acd2947514a78 \
--hash=sha256:b36a1c245f2d304965eb4e0a82848379241dc04b865afcc4aab16748587e1923
# via bleach

2194
uv.lock 100644

Plik diff jest za duży Load Diff