Use uv for dependency management
This commit is contained in:
parent
e9e8fc351c
commit
d05e29b5e0
10 changed files with 99 additions and 78 deletions
|
|
@ -5,7 +5,7 @@ stages:
|
|||
- release
|
||||
|
||||
variables:
|
||||
PIP_CACHE_DIR: "$CI_PROJECT_DIR/.cache/pip"
|
||||
UV_CACHE_DIR: "$CI_PROJECT_DIR/.cache/uv"
|
||||
DJANGO_SETTINGS_MODULE: "newsreader.conf.gitlab"
|
||||
POSTGRES_HOST: "$POSTGRES_HOST"
|
||||
POSTGRES_DB: "$POSTGRES_NAME"
|
||||
|
|
@ -17,7 +17,7 @@ cache:
|
|||
key: "$CI_COMMIT_REF_SLUG"
|
||||
paths:
|
||||
- env/
|
||||
- .cache/pip
|
||||
- .cache/uv
|
||||
- node_modules/
|
||||
|
||||
include:
|
||||
|
|
|
|||
15
Makefile
15
Makefile
|
|
@ -3,22 +3,19 @@
|
|||
#
|
||||
# Build dependencies
|
||||
build:
|
||||
pip-compile \
|
||||
--resolver=backtracking \
|
||||
uv pip compile \
|
||||
--output-file=requirements/base.txt \
|
||||
pyproject.toml
|
||||
|
||||
# testing
|
||||
pip-compile \
|
||||
--resolver=backtracking \
|
||||
uv pip compile \
|
||||
--extra=testing \
|
||||
--output-file=requirements/testing.txt \
|
||||
requirements/base.txt \
|
||||
pyproject.toml
|
||||
|
||||
# development
|
||||
pip-compile \
|
||||
--resolver=backtracking \
|
||||
uv pip compile \
|
||||
--extra=testing \
|
||||
--extra=development \
|
||||
--output-file=requirements/development.txt \
|
||||
|
|
@ -27,8 +24,7 @@ build:
|
|||
pyproject.toml
|
||||
|
||||
# ci
|
||||
pip-compile \
|
||||
--resolver=backtracking \
|
||||
uv pip compile \
|
||||
--extra=testing \
|
||||
--extra=ci \
|
||||
--output-file=requirements/ci.txt \
|
||||
|
|
@ -37,8 +33,7 @@ build:
|
|||
pyproject.toml
|
||||
|
||||
# production
|
||||
pip-compile \
|
||||
--resolver=backtracking \
|
||||
uv pip compile \
|
||||
--extra=production \
|
||||
--output-file=requirements/production.txt \
|
||||
requirements/base.txt \
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
static:
|
||||
stage: build
|
||||
image: node:16-bullseye
|
||||
image: node:latest
|
||||
before_script:
|
||||
- npm install
|
||||
script:
|
||||
|
|
|
|||
|
|
@ -1,12 +1,16 @@
|
|||
python-linting:
|
||||
stage: lint
|
||||
image: python:3.9-bullseye
|
||||
image: python:3.11
|
||||
before_script:
|
||||
- pip install -r requirements/ci.txt
|
||||
- uv pip install --requirement requirements/ci.txt
|
||||
script:
|
||||
- isort src/ --check-only
|
||||
- black src/ --line-length 88 --check
|
||||
- autoflake src/ --check --recursive --remove-all-unused-imports --ignore-init-module-imports
|
||||
- isort --check-only src/
|
||||
- black --line-length 88 --check src/
|
||||
- autoflake --check \
|
||||
--recursive \
|
||||
--remove-all-unused-imports \
|
||||
--ignore-init-module-imports \
|
||||
src/
|
||||
only:
|
||||
refs:
|
||||
- development
|
||||
|
|
@ -14,7 +18,7 @@ python-linting:
|
|||
|
||||
javascript-linting:
|
||||
stage: lint
|
||||
image: node:16-bullseye
|
||||
image: node:latest
|
||||
before_script:
|
||||
- npm install
|
||||
script:
|
||||
|
|
|
|||
|
|
@ -4,15 +4,15 @@ python-tests:
|
|||
services:
|
||||
- postgres:15
|
||||
- memcached:1.5.22
|
||||
image: python:3.9-bullseye
|
||||
image: python:3.11
|
||||
before_script:
|
||||
- pip install -r requirements/ci.txt
|
||||
- uv pip install --requirement requirements/ci.txt
|
||||
script:
|
||||
- coverage run ./src/manage.py test newsreader
|
||||
|
||||
javascript-tests:
|
||||
stage: test
|
||||
image: node:16-bullseye
|
||||
image: node:latest
|
||||
before_script:
|
||||
- npm install
|
||||
script:
|
||||
|
|
|
|||
|
|
@ -1,9 +1,5 @@
|
|||
#
|
||||
# This file is autogenerated by pip-compile with Python 3.9
|
||||
# by the following command:
|
||||
#
|
||||
# pip-compile --output-file=requirements/base.txt --resolver=backtracking pyproject.toml
|
||||
#
|
||||
# This file was autogenerated by uv via the following command:
|
||||
# uv pip compile --output-file=requirements/base.txt pyproject.toml
|
||||
amqp==5.1.1
|
||||
# via kombu
|
||||
asgiref==3.7.2
|
||||
|
|
@ -16,8 +12,8 @@ bleach==6.0.0
|
|||
# via newsreader (pyproject.toml)
|
||||
celery==5.3.1
|
||||
# via
|
||||
# django-celery-beat
|
||||
# newsreader (pyproject.toml)
|
||||
# django-celery-beat
|
||||
certifi==2023.5.7
|
||||
# via requests
|
||||
charset-normalizer==3.1.0
|
||||
|
|
@ -38,12 +34,12 @@ cron-descriptor==1.4.0
|
|||
# via django-celery-beat
|
||||
django==3.2.19
|
||||
# via
|
||||
# newsreader (pyproject.toml)
|
||||
# django-axes
|
||||
# django-celery-beat
|
||||
# django-timezone-field
|
||||
# djangorestframework
|
||||
# drf-yasg
|
||||
# newsreader (pyproject.toml)
|
||||
django-axes==6.0.4
|
||||
# via newsreader (pyproject.toml)
|
||||
django-celery-beat==2.5.0
|
||||
|
|
@ -104,6 +100,8 @@ requests==2.31.0
|
|||
# requests-oauthlib
|
||||
requests-oauthlib==1.3.1
|
||||
# via newsreader (pyproject.toml)
|
||||
setuptools==72.1.0
|
||||
# via django-axes
|
||||
sgmllib3k==1.0.0
|
||||
# via feedparser
|
||||
six==1.16.0
|
||||
|
|
@ -138,6 +136,3 @@ wcwidth==0.2.6
|
|||
# prompt-toolkit
|
||||
webencodings==0.5.1
|
||||
# via bleach
|
||||
|
||||
# The following packages are considered to be unsafe in a requirements file:
|
||||
# setuptools
|
||||
|
|
|
|||
|
|
@ -1,9 +1,5 @@
|
|||
#
|
||||
# This file is autogenerated by pip-compile with Python 3.9
|
||||
# by the following command:
|
||||
#
|
||||
# pip-compile --extra=ci --extra=testing --output-file=requirements/ci.txt --resolver=backtracking pyproject.toml requirements/base.txt requirements/testing.txt
|
||||
#
|
||||
# This file was autogenerated by uv via the following command:
|
||||
# uv pip compile --extra=testing --extra=ci --output-file=requirements/ci.txt requirements/base.txt requirements/testing.txt pyproject.toml
|
||||
amqp==5.1.1
|
||||
# via
|
||||
# -r requirements/base.txt
|
||||
|
|
@ -21,6 +17,7 @@ autoflake==2.2.0
|
|||
beautifulsoup4==4.12.2
|
||||
# via
|
||||
# -r requirements/base.txt
|
||||
# -r requirements/testing.txt
|
||||
# newsreader (pyproject.toml)
|
||||
billiard==4.1.0
|
||||
# via
|
||||
|
|
@ -34,12 +31,14 @@ black==23.3.0
|
|||
bleach==6.0.0
|
||||
# via
|
||||
# -r requirements/base.txt
|
||||
# -r requirements/testing.txt
|
||||
# newsreader (pyproject.toml)
|
||||
celery==5.3.1
|
||||
# via
|
||||
# -r requirements/base.txt
|
||||
# django-celery-beat
|
||||
# -r requirements/testing.txt
|
||||
# newsreader (pyproject.toml)
|
||||
# django-celery-beat
|
||||
certifi==2023.5.7
|
||||
# via
|
||||
# -r requirements/base.txt
|
||||
|
|
@ -84,27 +83,32 @@ cron-descriptor==1.4.0
|
|||
django==3.2.19
|
||||
# via
|
||||
# -r requirements/base.txt
|
||||
# -r requirements/testing.txt
|
||||
# newsreader (pyproject.toml)
|
||||
# django-axes
|
||||
# django-celery-beat
|
||||
# django-timezone-field
|
||||
# djangorestframework
|
||||
# drf-yasg
|
||||
# newsreader (pyproject.toml)
|
||||
django-axes==6.0.4
|
||||
# via
|
||||
# -r requirements/base.txt
|
||||
# -r requirements/testing.txt
|
||||
# newsreader (pyproject.toml)
|
||||
django-celery-beat==2.5.0
|
||||
# via
|
||||
# -r requirements/base.txt
|
||||
# -r requirements/testing.txt
|
||||
# newsreader (pyproject.toml)
|
||||
django-registration-redux==2.12
|
||||
# via
|
||||
# -r requirements/base.txt
|
||||
# -r requirements/testing.txt
|
||||
# newsreader (pyproject.toml)
|
||||
django-rest-framework==0.1.0
|
||||
# via
|
||||
# -r requirements/base.txt
|
||||
# -r requirements/testing.txt
|
||||
# newsreader (pyproject.toml)
|
||||
django-timezone-field==5.1
|
||||
# via
|
||||
|
|
@ -120,6 +124,7 @@ djangorestframework==3.14.0
|
|||
drf-yasg==1.21.6
|
||||
# via
|
||||
# -r requirements/base.txt
|
||||
# -r requirements/testing.txt
|
||||
# newsreader (pyproject.toml)
|
||||
factory-boy==3.2.1
|
||||
# via
|
||||
|
|
@ -132,6 +137,7 @@ faker==18.11.2
|
|||
feedparser==6.0.10
|
||||
# via
|
||||
# -r requirements/base.txt
|
||||
# -r requirements/testing.txt
|
||||
# newsreader (pyproject.toml)
|
||||
freezegun==1.2.2
|
||||
# via
|
||||
|
|
@ -140,6 +146,7 @@ freezegun==1.2.2
|
|||
ftfy==5.9
|
||||
# via
|
||||
# -r requirements/base.txt
|
||||
# -r requirements/testing.txt
|
||||
# newsreader (pyproject.toml)
|
||||
idna==3.4
|
||||
# via
|
||||
|
|
@ -163,6 +170,7 @@ kombu==5.3.1
|
|||
lxml==4.9.2
|
||||
# via
|
||||
# -r requirements/base.txt
|
||||
# -r requirements/testing.txt
|
||||
# newsreader (pyproject.toml)
|
||||
mypy-extensions==1.0.0
|
||||
# via
|
||||
|
|
@ -195,6 +203,7 @@ prompt-toolkit==3.0.38
|
|||
psycopg2==2.9.6
|
||||
# via
|
||||
# -r requirements/base.txt
|
||||
# -r requirements/testing.txt
|
||||
# newsreader (pyproject.toml)
|
||||
pyflakes==3.0.1
|
||||
# via
|
||||
|
|
@ -216,10 +225,12 @@ python-dateutil==2.8.2
|
|||
python-dotenv==0.21.1
|
||||
# via
|
||||
# -r requirements/base.txt
|
||||
# -r requirements/testing.txt
|
||||
# newsreader (pyproject.toml)
|
||||
python-memcached==1.59
|
||||
# via
|
||||
# -r requirements/base.txt
|
||||
# -r requirements/testing.txt
|
||||
# newsreader (pyproject.toml)
|
||||
pytz==2023.3
|
||||
# via
|
||||
|
|
@ -237,12 +248,19 @@ pyyaml==6.0
|
|||
requests==2.31.0
|
||||
# via
|
||||
# -r requirements/base.txt
|
||||
# -r requirements/testing.txt
|
||||
# newsreader (pyproject.toml)
|
||||
# requests-oauthlib
|
||||
requests-oauthlib==1.3.1
|
||||
# via
|
||||
# -r requirements/base.txt
|
||||
# -r requirements/testing.txt
|
||||
# newsreader (pyproject.toml)
|
||||
setuptools==72.1.0
|
||||
# via
|
||||
# -r requirements/base.txt
|
||||
# -r requirements/testing.txt
|
||||
# django-axes
|
||||
sgmllib3k==1.0.0
|
||||
# via
|
||||
# -r requirements/base.txt
|
||||
|
|
@ -315,6 +333,3 @@ webencodings==0.5.1
|
|||
# -r requirements/base.txt
|
||||
# -r requirements/testing.txt
|
||||
# bleach
|
||||
|
||||
# The following packages are considered to be unsafe in a requirements file:
|
||||
# setuptools
|
||||
|
|
|
|||
|
|
@ -1,9 +1,5 @@
|
|||
#
|
||||
# This file is autogenerated by pip-compile with Python 3.9
|
||||
# by the following command:
|
||||
#
|
||||
# pip-compile --extra=development --extra=testing --output-file=requirements/development.txt --resolver=backtracking pyproject.toml requirements/base.txt requirements/testing.txt
|
||||
#
|
||||
# This file was autogenerated by uv via the following command:
|
||||
# uv pip compile --extra=testing --extra=development --output-file=requirements/development.txt requirements/base.txt requirements/testing.txt pyproject.toml
|
||||
amqp==5.1.1
|
||||
# via
|
||||
# -r requirements/base.txt
|
||||
|
|
@ -21,6 +17,7 @@ autoflake==2.2.0
|
|||
beautifulsoup4==4.12.2
|
||||
# via
|
||||
# -r requirements/base.txt
|
||||
# -r requirements/testing.txt
|
||||
# newsreader (pyproject.toml)
|
||||
billiard==4.1.0
|
||||
# via
|
||||
|
|
@ -34,14 +31,16 @@ black==23.3.0
|
|||
bleach==6.0.0
|
||||
# via
|
||||
# -r requirements/base.txt
|
||||
# -r requirements/testing.txt
|
||||
# newsreader (pyproject.toml)
|
||||
build==0.10.0
|
||||
# via pip-tools
|
||||
celery==5.3.1
|
||||
# via
|
||||
# -r requirements/base.txt
|
||||
# django-celery-beat
|
||||
# -r requirements/testing.txt
|
||||
# newsreader (pyproject.toml)
|
||||
# django-celery-beat
|
||||
certifi==2023.5.7
|
||||
# via
|
||||
# -r requirements/base.txt
|
||||
|
|
@ -85,6 +84,8 @@ cron-descriptor==1.4.0
|
|||
django==3.2.19
|
||||
# via
|
||||
# -r requirements/base.txt
|
||||
# -r requirements/testing.txt
|
||||
# newsreader (pyproject.toml)
|
||||
# django-axes
|
||||
# django-celery-beat
|
||||
# django-debug-toolbar
|
||||
|
|
@ -92,14 +93,15 @@ django==3.2.19
|
|||
# django-timezone-field
|
||||
# djangorestframework
|
||||
# drf-yasg
|
||||
# newsreader (pyproject.toml)
|
||||
django-axes==6.0.4
|
||||
# via
|
||||
# -r requirements/base.txt
|
||||
# -r requirements/testing.txt
|
||||
# newsreader (pyproject.toml)
|
||||
django-celery-beat==2.5.0
|
||||
# via
|
||||
# -r requirements/base.txt
|
||||
# -r requirements/testing.txt
|
||||
# newsreader (pyproject.toml)
|
||||
django-debug-toolbar==4.1.0
|
||||
# via newsreader (pyproject.toml)
|
||||
|
|
@ -108,10 +110,12 @@ django-extensions==3.2.3
|
|||
django-registration-redux==2.12
|
||||
# via
|
||||
# -r requirements/base.txt
|
||||
# -r requirements/testing.txt
|
||||
# newsreader (pyproject.toml)
|
||||
django-rest-framework==0.1.0
|
||||
# via
|
||||
# -r requirements/base.txt
|
||||
# -r requirements/testing.txt
|
||||
# newsreader (pyproject.toml)
|
||||
django-timezone-field==5.1
|
||||
# via
|
||||
|
|
@ -127,6 +131,7 @@ djangorestframework==3.14.0
|
|||
drf-yasg==1.21.6
|
||||
# via
|
||||
# -r requirements/base.txt
|
||||
# -r requirements/testing.txt
|
||||
# newsreader (pyproject.toml)
|
||||
factory-boy==3.2.1
|
||||
# via
|
||||
|
|
@ -139,6 +144,7 @@ faker==18.11.2
|
|||
feedparser==6.0.10
|
||||
# via
|
||||
# -r requirements/base.txt
|
||||
# -r requirements/testing.txt
|
||||
# newsreader (pyproject.toml)
|
||||
freezegun==1.2.2
|
||||
# via
|
||||
|
|
@ -147,6 +153,7 @@ freezegun==1.2.2
|
|||
ftfy==5.9
|
||||
# via
|
||||
# -r requirements/base.txt
|
||||
# -r requirements/testing.txt
|
||||
# newsreader (pyproject.toml)
|
||||
idna==3.4
|
||||
# via
|
||||
|
|
@ -170,6 +177,7 @@ kombu==5.3.1
|
|||
lxml==4.9.2
|
||||
# via
|
||||
# -r requirements/base.txt
|
||||
# -r requirements/testing.txt
|
||||
# newsreader (pyproject.toml)
|
||||
mypy-extensions==1.0.0
|
||||
# via
|
||||
|
|
@ -191,6 +199,8 @@ pathspec==0.11.1
|
|||
# via
|
||||
# -r requirements/testing.txt
|
||||
# black
|
||||
pip==24.2
|
||||
# via pip-tools
|
||||
pip-tools==6.13.0
|
||||
# via newsreader (pyproject.toml)
|
||||
platformdirs==3.8.0
|
||||
|
|
@ -205,6 +215,7 @@ prompt-toolkit==3.0.38
|
|||
psycopg2==2.9.6
|
||||
# via
|
||||
# -r requirements/base.txt
|
||||
# -r requirements/testing.txt
|
||||
# newsreader (pyproject.toml)
|
||||
pyflakes==3.0.1
|
||||
# via
|
||||
|
|
@ -228,10 +239,12 @@ python-dateutil==2.8.2
|
|||
python-dotenv==0.21.1
|
||||
# via
|
||||
# -r requirements/base.txt
|
||||
# -r requirements/testing.txt
|
||||
# newsreader (pyproject.toml)
|
||||
python-memcached==1.59
|
||||
# via
|
||||
# -r requirements/base.txt
|
||||
# -r requirements/testing.txt
|
||||
# newsreader (pyproject.toml)
|
||||
pytz==2023.3
|
||||
# via
|
||||
|
|
@ -249,12 +262,20 @@ pyyaml==6.0
|
|||
requests==2.31.0
|
||||
# via
|
||||
# -r requirements/base.txt
|
||||
# -r requirements/testing.txt
|
||||
# newsreader (pyproject.toml)
|
||||
# requests-oauthlib
|
||||
requests-oauthlib==1.3.1
|
||||
# via
|
||||
# -r requirements/base.txt
|
||||
# -r requirements/testing.txt
|
||||
# newsreader (pyproject.toml)
|
||||
setuptools==72.1.0
|
||||
# via
|
||||
# -r requirements/base.txt
|
||||
# -r requirements/testing.txt
|
||||
# django-axes
|
||||
# pip-tools
|
||||
sgmllib3k==1.0.0
|
||||
# via
|
||||
# -r requirements/base.txt
|
||||
|
|
@ -332,7 +353,3 @@ webencodings==0.5.1
|
|||
# bleach
|
||||
wheel==0.40.0
|
||||
# via pip-tools
|
||||
|
||||
# The following packages are considered to be unsafe in a requirements file:
|
||||
# pip
|
||||
# setuptools
|
||||
|
|
|
|||
|
|
@ -1,9 +1,5 @@
|
|||
#
|
||||
# This file is autogenerated by pip-compile with Python 3.9
|
||||
# by the following command:
|
||||
#
|
||||
# pip-compile --extra=production --output-file=requirements/production.txt --resolver=backtracking pyproject.toml requirements/base.txt
|
||||
#
|
||||
# This file was autogenerated by uv via the following command:
|
||||
# uv pip compile --extra=production --output-file=requirements/production.txt requirements/base.txt pyproject.toml
|
||||
amqp==5.1.1
|
||||
# via
|
||||
# -r requirements/base.txt
|
||||
|
|
@ -27,8 +23,8 @@ bleach==6.0.0
|
|||
celery==5.3.1
|
||||
# via
|
||||
# -r requirements/base.txt
|
||||
# django-celery-beat
|
||||
# newsreader (pyproject.toml)
|
||||
# django-celery-beat
|
||||
certifi==2023.5.7
|
||||
# via
|
||||
# -r requirements/base.txt
|
||||
|
|
@ -64,12 +60,12 @@ cron-descriptor==1.4.0
|
|||
django==3.2.19
|
||||
# via
|
||||
# -r requirements/base.txt
|
||||
# newsreader (pyproject.toml)
|
||||
# django-axes
|
||||
# django-celery-beat
|
||||
# django-timezone-field
|
||||
# djangorestframework
|
||||
# drf-yasg
|
||||
# newsreader (pyproject.toml)
|
||||
django-axes==6.0.4
|
||||
# via
|
||||
# -r requirements/base.txt
|
||||
|
|
@ -180,6 +176,11 @@ requests-oauthlib==1.3.1
|
|||
# newsreader (pyproject.toml)
|
||||
sentry-sdk==1.26.0
|
||||
# via newsreader (pyproject.toml)
|
||||
setuptools==72.1.0
|
||||
# via
|
||||
# -r requirements/base.txt
|
||||
# django-axes
|
||||
# gunicorn
|
||||
sgmllib3k==1.0.0
|
||||
# via
|
||||
# -r requirements/base.txt
|
||||
|
|
@ -232,6 +233,3 @@ webencodings==0.5.1
|
|||
# via
|
||||
# -r requirements/base.txt
|
||||
# bleach
|
||||
|
||||
# The following packages are considered to be unsafe in a requirements file:
|
||||
# setuptools
|
||||
|
|
|
|||
|
|
@ -1,9 +1,5 @@
|
|||
#
|
||||
# This file is autogenerated by pip-compile with Python 3.9
|
||||
# by the following command:
|
||||
#
|
||||
# pip-compile --extra=testing --output-file=requirements/testing.txt --resolver=backtracking pyproject.toml requirements/base.txt
|
||||
#
|
||||
# This file was autogenerated by uv via the following command:
|
||||
# uv pip compile --extra=testing --output-file=requirements/testing.txt requirements/base.txt pyproject.toml
|
||||
amqp==5.1.1
|
||||
# via
|
||||
# -r requirements/base.txt
|
||||
|
|
@ -31,8 +27,8 @@ bleach==6.0.0
|
|||
celery==5.3.1
|
||||
# via
|
||||
# -r requirements/base.txt
|
||||
# django-celery-beat
|
||||
# newsreader (pyproject.toml)
|
||||
# django-celery-beat
|
||||
certifi==2023.5.7
|
||||
# via
|
||||
# -r requirements/base.txt
|
||||
|
|
@ -68,12 +64,12 @@ cron-descriptor==1.4.0
|
|||
django==3.2.19
|
||||
# via
|
||||
# -r requirements/base.txt
|
||||
# newsreader (pyproject.toml)
|
||||
# django-axes
|
||||
# django-celery-beat
|
||||
# django-timezone-field
|
||||
# djangorestframework
|
||||
# drf-yasg
|
||||
# newsreader (pyproject.toml)
|
||||
django-axes==6.0.4
|
||||
# via
|
||||
# -r requirements/base.txt
|
||||
|
|
@ -199,6 +195,10 @@ requests-oauthlib==1.3.1
|
|||
# via
|
||||
# -r requirements/base.txt
|
||||
# newsreader (pyproject.toml)
|
||||
setuptools==72.1.0
|
||||
# via
|
||||
# -r requirements/base.txt
|
||||
# django-axes
|
||||
sgmllib3k==1.0.0
|
||||
# via
|
||||
# -r requirements/base.txt
|
||||
|
|
@ -257,6 +257,3 @@ webencodings==0.5.1
|
|||
# via
|
||||
# -r requirements/base.txt
|
||||
# bleach
|
||||
|
||||
# The following packages are considered to be unsafe in a requirements file:
|
||||
# setuptools
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue