Merge branch 'pre-release/1.3.0' into develop
This commit is contained in:
commit
c48b62da94
|
@ -0,0 +1,108 @@
|
|||
{
|
||||
"Callout": {
|
||||
"prefix": "callout",
|
||||
"description": "Add a callout to highlight information",
|
||||
"body": [
|
||||
":::{${1|attention,caution,danger,error,hint,important,note,seealso,tip,warning|}} ${2:Optional title}",
|
||||
"${0:${TM_SELECTED_TEXT}}",
|
||||
":::"
|
||||
],
|
||||
},
|
||||
"Code tabs": {
|
||||
"prefix": "code-tabs",
|
||||
"description": "Insert a set of code tabs",
|
||||
"body": [
|
||||
":::{tab-set-code}",
|
||||
"",
|
||||
"$0",
|
||||
"",
|
||||
":::"
|
||||
]
|
||||
},
|
||||
"Tab set": {
|
||||
"prefix": "tab-set",
|
||||
"description": "Insert a group of generic tabs",
|
||||
"body": [
|
||||
"::::{tab-set}",
|
||||
":::{tab-item} ${1:Tab title}",
|
||||
"$2",
|
||||
":::",
|
||||
"",
|
||||
":::{tab-item} ${3:Tab title}",
|
||||
"$0",
|
||||
":::",
|
||||
"",
|
||||
"::::"
|
||||
]
|
||||
},
|
||||
"Insert fragment": {
|
||||
"prefix": "insert fragment",
|
||||
"description": "Insert reusable text from another file",
|
||||
"body": [
|
||||
":::{include} ${1:full path to file}",
|
||||
":start-after: ${2:the text to start after}",
|
||||
":end-before: ${0:the text to end before}",
|
||||
":::"
|
||||
]
|
||||
},
|
||||
"Dropdown": {
|
||||
"prefix": "insert dropdown",
|
||||
"description": "Insert a dropdown (accordion)",
|
||||
"body": [
|
||||
":::{dropdown} ${1:title}",
|
||||
"${0:${TM_SELECTED_TEXT}}",
|
||||
":::"
|
||||
]
|
||||
},
|
||||
"Versioning": {
|
||||
"prefix": "version change",
|
||||
"description": "Specify when a feature was added, changed, or deprecated",
|
||||
"body": [
|
||||
":::{${1|versionadded,versionchanged,deprecated|}} ${2:v4.32.0}",
|
||||
"${0:${TM_SELECTED_TEXT}}",
|
||||
":::"
|
||||
]
|
||||
},
|
||||
"List table": {
|
||||
"prefix": "list table",
|
||||
"description": "Insert a table defined as a set of lists",
|
||||
"body": [
|
||||
":::{list-table} ${1:Optional title}",
|
||||
":header-rows: ${2:Number of header rows}",
|
||||
"",
|
||||
"* - ${3: First row column 1}",
|
||||
" - ${4: First row column 2}",
|
||||
"* - ${5: Second row column 1}",
|
||||
" - ${0: Second row column 2}",
|
||||
":::"
|
||||
]
|
||||
},
|
||||
"Guilabel": {
|
||||
"prefix": "guilabel",
|
||||
"description": "Format text as a GUI label (e.g. a button label or interface label",
|
||||
"body": [
|
||||
"{guilabel}`${0:${TM_SELECTED_TEXT}}`"
|
||||
]
|
||||
},
|
||||
"File": {
|
||||
"prefix": "file",
|
||||
"description": "Format text as a file name or path",
|
||||
"body": [
|
||||
"{file}`${0:${TM_SELECTED_TEXT}}`"
|
||||
]
|
||||
},
|
||||
"Increase indent": {
|
||||
"prefix": "increase indent",
|
||||
"description": "Increase the indentation of all selected colon or backtick fences",
|
||||
"body": [
|
||||
"${TM_SELECTED_TEXT/((?<c>[`:])\\k<c>{2,})/$1$2/gm}"
|
||||
]
|
||||
},
|
||||
"Deprecation warning": {
|
||||
"prefix": "insert deprecation warning",
|
||||
"description": "Inserts an inline deprecation badge. Useful in tables of parameters",
|
||||
"body": [
|
||||
"{bdg-warning}`Deprecated`"
|
||||
]
|
||||
}
|
||||
}
|
22
CHANGELOG.md
22
CHANGELOG.md
|
@ -9,6 +9,22 @@ This changelog is viewable on the web at https://docs.funkwhale.audio/changelog.
|
|||
|
||||
<!-- towncrier -->
|
||||
|
||||
## 1.3.0-rc6 (2023-05-12)
|
||||
|
||||
Updates since 1.3.0-rc5
|
||||
|
||||
- Add systemd update instructions to Debian upgrade instructions (#1966)
|
||||
- Fix broken links in CHANGELOG (#1976)
|
||||
- Add generic upgrade instructions to Docker postgres documentation (#2049)
|
||||
- Added Nginx regeneration instructions to Debian update guide (#2050)
|
||||
- Fixed mobile player element widths (#2054)
|
||||
- Allow summary field of actors to be blank. This leaves actors valid that have a blank (`""`) summary field and allows follows from those.
|
||||
- Fix front album tracks count translation
|
||||
- Prefer str over dict for the CACHE_URL api setting\
|
||||
This fix the ability to reuse the CACHE_URL with other settings such as\
|
||||
CELERY_BROKER_URL.\
|
||||
Move api docker hardcoded env vars in the settings module\
|
||||
|
||||
## 1.3.0-rc5 (2023-03-26)
|
||||
|
||||
Updates since 1.3.0-rc4
|
||||
|
@ -98,7 +114,7 @@ Update instructions:
|
|||
|
||||
After this you can continue to use the **docker compose** syntax for all Docker management tasks.
|
||||
|
||||
- Upgrade Postgres to version 15. [Make sure to migrate!](https://docs.funkwhale.audio/administrator_documentation/upgrade_docs/docker.html#upgrade-the-postgres-container)
|
||||
- Upgrade Postgres to version 15. [Make sure to migrate!](https://docs.funkwhale.audio/administrator/upgrade/docker.html#upgrade-the-postgres-container)
|
||||
- With this update Funkwhale starts using poetry to maintain its dependencies. We therefore recommend
|
||||
removing the old virtualenv by running `rm -rf /srv/funkwhale/virtualenv`.
|
||||
|
||||
|
@ -685,9 +701,7 @@ Committers:
|
|||
|
||||
Upgrade instructions are available at https://docs.funkwhale.audio/admin/upgrading.html
|
||||
|
||||
Due to a bug in our CI Pipeline frontend artifacts are not available at
|
||||
https://dev.funkwhale.audio/funkwhale/funkwhale/builds/artifacts/1.2.0/download?job=build_front as they would usually.
|
||||
Please use this URL to get your frontend build: https://dev.funkwhale.audio/funkwhale/funkwhale/-/jobs/81069/artifacts/download
|
||||
Due to a bug in our CI Pipeline, you need to download the frontend artifact here: https://dev.funkwhale.audio/funkwhale/funkwhale/-/jobs/81069/artifacts/download
|
||||
|
||||
If you are running the All-in-One-Container since a longer time, you probably need to manually migrate your database information. If that's the case, you will get a message like this:
|
||||
|
||||
|
|
|
@ -114,8 +114,6 @@ WORKDIR /app
|
|||
RUN set -eux; \
|
||||
pip3 install --no-deps --editable .
|
||||
|
||||
ENV CACHE_URL="redis://redis:6379/0"
|
||||
ENV CELERY_BROKER_URL="redis://redis:6379/0"
|
||||
ENV IS_DOCKER_SETUP=true
|
||||
|
||||
CMD ["./docker/server.sh"]
|
||||
|
|
|
@ -14,6 +14,7 @@ APPS_DIR = ROOT_DIR.path("funkwhale_api")
|
|||
env = environ.Env()
|
||||
ENV = env
|
||||
LOGLEVEL = env("LOGLEVEL", default="info").upper()
|
||||
IS_DOCKER_SETUP = env.bool("IS_DOCKER_SETUP", False)
|
||||
|
||||
|
||||
if env("FUNKWHALE_SENTRY_DSN", default=None) is not None:
|
||||
|
@ -374,7 +375,7 @@ vars().update(EMAIL_CONFIG)
|
|||
# The `_database_url_docker` variable will only by used as default for DATABASE_URL
|
||||
# in the context of a docker deployment.
|
||||
_database_url_docker = None
|
||||
if env.bool("IS_DOCKER_SETUP", False) and env.str("DATABASE_URL", None) is None:
|
||||
if IS_DOCKER_SETUP and env.str("DATABASE_URL", None) is None:
|
||||
warnings.warn(
|
||||
DeprecationWarning(
|
||||
"the automatically generated 'DATABASE_URL' configuration in the docker "
|
||||
|
@ -803,8 +804,11 @@ if AUTH_LDAP_ENABLED:
|
|||
# SLUGLIFIER
|
||||
AUTOSLUG_SLUGIFY_FUNCTION = "slugify.slugify"
|
||||
|
||||
CACHE_DEFAULT = "redis://127.0.0.1:6379/0"
|
||||
CACHE_URL = env.cache_url("CACHE_URL", default=CACHE_DEFAULT)
|
||||
CACHE_URL_DEFAULT = "redis://127.0.0.1:6379/0"
|
||||
if IS_DOCKER_SETUP:
|
||||
CACHE_URL_DEFAULT = "redis://redis:6379/0"
|
||||
|
||||
CACHE_URL = env.str("CACHE_URL", default=CACHE_URL_DEFAULT)
|
||||
"""
|
||||
The URL of your redis server. For example:
|
||||
|
||||
|
@ -818,17 +822,25 @@ If you're using password auth (the extra slash is important)
|
|||
.. note::
|
||||
|
||||
If you want to use Redis over unix sockets, you also need to update
|
||||
:attr:`CELERY_BROKER_URL`
|
||||
:attr:`CELERY_BROKER_URL`, because the scheme differ from the one used by
|
||||
:attr:`CACHE_URL`.
|
||||
|
||||
"""
|
||||
CACHES = {
|
||||
"default": CACHE_URL,
|
||||
"default": {
|
||||
"BACKEND": "django_redis.cache.RedisCache",
|
||||
"LOCATION": CACHE_URL,
|
||||
"OPTIONS": {
|
||||
"CLIENT_CLASS": "funkwhale_api.common.cache.RedisClient",
|
||||
"IGNORE_EXCEPTIONS": True, # mimics memcache behavior.
|
||||
# http://niwinz.github.io/django-redis/latest/#_memcached_exceptions_behavior
|
||||
},
|
||||
},
|
||||
"local": {
|
||||
"BACKEND": "django.core.cache.backends.locmem.LocMemCache",
|
||||
"LOCATION": "local-cache",
|
||||
},
|
||||
}
|
||||
CACHES["default"]["BACKEND"] = "django_redis.cache.RedisCache"
|
||||
|
||||
CHANNEL_LAYERS = {
|
||||
"default": {
|
||||
|
@ -837,17 +849,12 @@ CHANNEL_LAYERS = {
|
|||
}
|
||||
}
|
||||
|
||||
CACHES["default"]["OPTIONS"] = {
|
||||
"CLIENT_CLASS": "funkwhale_api.common.cache.RedisClient",
|
||||
"IGNORE_EXCEPTIONS": True, # mimics memcache behavior.
|
||||
# http://niwinz.github.io/django-redis/latest/#_memcached_exceptions_behavior
|
||||
}
|
||||
CACHEOPS_DURATION = env("CACHEOPS_DURATION", default=0)
|
||||
CACHEOPS_ENABLED = bool(CACHEOPS_DURATION)
|
||||
|
||||
if CACHEOPS_ENABLED:
|
||||
INSTALLED_APPS += ("cacheops",)
|
||||
CACHEOPS_REDIS = env("CACHE_URL", default=CACHE_DEFAULT)
|
||||
CACHEOPS_REDIS = CACHE_URL
|
||||
CACHEOPS_PREFIX = lambda _: "cacheops" # noqa
|
||||
CACHEOPS_DEFAULTS = {"timeout": CACHEOPS_DURATION}
|
||||
CACHEOPS = {
|
||||
|
@ -858,9 +865,7 @@ if CACHEOPS_ENABLED:
|
|||
|
||||
# CELERY
|
||||
INSTALLED_APPS += ("funkwhale_api.taskapp.celery.CeleryConfig",)
|
||||
CELERY_BROKER_URL = env(
|
||||
"CELERY_BROKER_URL", default=env("CACHE_URL", default=CACHE_DEFAULT)
|
||||
)
|
||||
CELERY_BROKER_URL = env.str("CELERY_BROKER_URL", default=CACHE_URL)
|
||||
"""
|
||||
The celery task broker URL. Defaults to :attr:`CACHE_URL`.
|
||||
You don't need to tweak this unless you want
|
||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1 @@
|
|||
Add systemd update instructions to Debian upgrade instructions (#1966)
|
|
@ -0,0 +1 @@
|
|||
Fix broken links in CHANGELOG (#1976)
|
|
@ -0,0 +1 @@
|
|||
Add generic upgrade instructions to Docker postgres documentation (#2049)
|
|
@ -0,0 +1 @@
|
|||
Added Nginx regeneration instructions to Debian update guide (#2050)
|
|
@ -0,0 +1 @@
|
|||
Fixed mobile player element widths (#2054)
|
|
@ -0,0 +1 @@
|
|||
Fix front album tracks count translation
|
|
@ -0,0 +1,4 @@
|
|||
Prefer str over dict for the CACHE_URL api setting
|
||||
|
||||
This fix the ability to reuse the CACHE_URL with other settings such as
|
||||
CELERY_BROKER_URL.
|
|
@ -0,0 +1 @@
|
|||
Move api docker hardcoded env vars in the settings module
|
|
@ -1,5 +1,5 @@
|
|||
FROM python:3.11
|
||||
|
||||
RUN apt-get update && apt-get install -y graphviz
|
||||
RUN pip install sphinx livereload sphinx_rtd_theme django-environ django myst-parser sphinx-design sphinxcontrib-mermaid
|
||||
RUN pip install sphinx livereload sphinx_rtd_theme django-environ django myst-parser sphinx-design sphinx-multiversion sphinxcontrib-mermaid sphinx-copybutton
|
||||
WORKDIR /app/docs
|
||||
|
|
|
@ -316,49 +316,62 @@ That's it! systemd keeps these services running and starts them up in the correc
|
|||
|
||||
Funkwhale uses a reverse proxy to serve content to users. We use [Nginx](https://nginx.com) to serve this proxy. Follow this guide to install an Nginx configuration using details from your `.env` file.
|
||||
|
||||
1. Install Nginx.
|
||||
:::{note} Before you begin
|
||||
Nginx isn't preinstalled on Debian. You can install it by running the following commands:
|
||||
|
||||
```{code-block} sh
|
||||
sudo apt-get update
|
||||
sudo apt-get install nginx
|
||||
```console
|
||||
$ sudo apt update
|
||||
$ sudo apt install nginx
|
||||
```
|
||||
|
||||
2. Download the Nginx templates from Funkwhale.
|
||||
:::
|
||||
|
||||
```{code-block} sh
|
||||
sudo curl -L -o /etc/nginx/funkwhale_proxy.conf "https://dev.funkwhale.audio/funkwhale/funkwhale/raw/$FUNKWHALE_VERSION/deploy/funkwhale_proxy.conf"
|
||||
sudo curl -L -o /etc/nginx/sites-available/funkwhale.template "https://dev.funkwhale.audio/funkwhale/funkwhale/raw/$FUNKWHALE_VERSION/deploy/nginx.template"
|
||||
% Nginx update instructions
|
||||
|
||||
1. Log in to a root shell to make changes to the config files
|
||||
|
||||
```console
|
||||
$ sudo su
|
||||
```
|
||||
|
||||
3. Create an Nginx template with details from your `.env` file.
|
||||
2. Download the new Nginx templates from Funkwhale
|
||||
|
||||
```{code-block} sh
|
||||
# Log in to a root shell.
|
||||
```console
|
||||
# curl -L -o /etc/nginx/funkwhale_proxy.conf "https://dev.funkwhale.audio/funkwhale/funkwhale/raw/$FUNKWHALE_VERSION/deploy/funkwhale_proxy.conf"
|
||||
# curl -L -o /etc/nginx/sites-available/funkwhale.template "https://dev.funkwhale.audio/funkwhale/funkwhale/raw/$FUNKWHALE_VERSION/deploy/nginx.template"
|
||||
```
|
||||
|
||||
sudo su
|
||||
3. Update the Nginx configuration with details from your {file}`.env` file
|
||||
|
||||
# Create an Nginx configuration using the Funkwhale template with details from your `.env` file.
|
||||
|
||||
set -a && source /srv/funkwhale/config/.env && set +a
|
||||
```console
|
||||
# set -a && source /srv/funkwhale/config/.env && set +a
|
||||
envsubst "`env | awk -F = '{printf \" $%s\", $$1}'`" \
|
||||
< /etc/nginx/sites-available/funkwhale.template \
|
||||
> /etc/nginx/sites-available/funkwhale.conf
|
||||
|
||||
# Enable the configuration so that Nginx serves it.
|
||||
|
||||
ln -s /etc/nginx/sites-available/funkwhale.conf /etc/nginx/sites-enabled/
|
||||
|
||||
# Exit the root shell.
|
||||
|
||||
exit
|
||||
```
|
||||
|
||||
That's it! You've created your Nginx file. Run the following command to check the `.env` details populated correctly.
|
||||
4. Check the configuration file to make sure the template values have been updated properly
|
||||
|
||||
```{code-block} sh
|
||||
grep '${' /etc/nginx/sites-enabled/funkwhale.conf
|
||||
```console
|
||||
# grep '${' /etc/nginx/sites-available/funkwhale.conf
|
||||
```
|
||||
|
||||
% Instructions end
|
||||
|
||||
5. Create a symbolic link to the {file}`sites-enabled` directory to enable your configuration
|
||||
|
||||
```console
|
||||
# ln -s /etc/nginx/sites-available/funkwhale.conf /etc/nginx/sites-enabled/
|
||||
```
|
||||
|
||||
6. Reload Nginx
|
||||
|
||||
```console
|
||||
# systemctl reload nginx
|
||||
```
|
||||
|
||||
That's it! You've created your Nginx file.
|
||||
|
||||
## 10. Set up TLS
|
||||
|
||||
To enable your users to connect to your pod securely, you need to set up {abbr}`TLS (Transport Layer Security)`. To do this, we recommend using [certbot](https://certbot.eff.org/).
|
||||
|
|
|
@ -167,51 +167,64 @@ That's it! Your Funkwhale pod is now up and running.
|
|||
|
||||
## 5. Set up your reverse proxy
|
||||
|
||||
Funkwhale requires a reverse proxy to serve content to users. We recommend using [Nginx](https://nginx.com) to handle requests to your container. To do this:
|
||||
Funkwhale requires a reverse proxy to serve content to users. We recommend using [Nginx](https://nginx.com) to handle requests to your container. Follow this guide to install an Nginx configuration using details from your `.env` file.
|
||||
|
||||
1. Install Nginx.
|
||||
:::{note} Before you begin
|
||||
Nginx isn't preinstalled on Debian. You can install it by running the following commands:
|
||||
|
||||
```{code-block} sh
|
||||
sudo apt-get update
|
||||
sudo apt-get install nginx
|
||||
```console
|
||||
$ sudo apt update
|
||||
$ sudo apt install nginx
|
||||
```
|
||||
|
||||
2. Download the Nginx templates from Funkwhale.
|
||||
:::
|
||||
|
||||
```{code-block} sh
|
||||
sudo curl -L -o /etc/nginx/funkwhale_proxy.conf "https://dev.funkwhale.audio/funkwhale/funkwhale/raw/$FUNKWHALE_VERSION/deploy/funkwhale_proxy.conf"
|
||||
sudo curl -L -o /etc/nginx/sites-available/funkwhale.template "https://dev.funkwhale.audio/funkwhale/funkwhale/raw/$FUNKWHALE_VERSION/deploy/docker.proxy.template"
|
||||
% Nginx update instructions
|
||||
|
||||
1. Log in to a root shell to make changes to the config files
|
||||
|
||||
```console
|
||||
$ sudo su
|
||||
```
|
||||
|
||||
3. Create an Nginx template with details from your `.env` file.
|
||||
2. Download the new Nginx templates from Funkwhale
|
||||
|
||||
```{code-block} sh
|
||||
# Log in to a root shell.
|
||||
```console
|
||||
# curl -L -o /etc/nginx/funkwhale_proxy.conf "https://dev.funkwhale.audio/funkwhale/funkwhale/raw/$FUNKWHALE_VERSION/deploy/funkwhale_proxy.conf"
|
||||
# curl -L -o /etc/nginx/sites-available/funkwhale.template "https://dev.funkwhale.audio/funkwhale/funkwhale/raw/$FUNKWHALE_VERSION/deploy/docker.proxy.template"
|
||||
```
|
||||
|
||||
sudo su
|
||||
3. Update the Nginx configuration with details from your {file}`.env` file
|
||||
|
||||
# Create an Nginx configuration using the Funkwhale template with details from your `.env` file.
|
||||
|
||||
set -a && source /srv/funkwhale/.env && set +a
|
||||
```console
|
||||
# set -a && source /srv/funkwhale/config/.env && set +a
|
||||
envsubst "`env | awk -F = '{printf \" $%s\", $$1}'`" \
|
||||
< /etc/nginx/sites-available/funkwhale.template \
|
||||
> /etc/nginx/sites-available/funkwhale.conf
|
||||
|
||||
# Enable the configuration so that Nginx serves it.
|
||||
|
||||
ln -s /etc/nginx/sites-available/funkwhale.conf /etc/nginx/sites-enabled/
|
||||
|
||||
# Exit the root shell.
|
||||
|
||||
exit
|
||||
```
|
||||
|
||||
That's it! You've created your Nginx file. Run the following command to check the `.env` details populated correctly.
|
||||
4. Check the configuration file to make sure the template values have been updated properly
|
||||
|
||||
```{code-block} sh
|
||||
grep '${' /etc/nginx/sites-enabled/funkwhale.conf
|
||||
```console
|
||||
# grep '${' /etc/nginx/sites-available/funkwhale.conf
|
||||
```
|
||||
|
||||
% Instructions end
|
||||
|
||||
5. Create a symbolic link to the {file}`sites-enabled` directory to enable your configuration
|
||||
|
||||
```console
|
||||
# ln -s /etc/nginx/sites-available/funkwhale.conf /etc/nginx/sites-enabled/
|
||||
```
|
||||
|
||||
6. Reload Nginx
|
||||
|
||||
```console
|
||||
# systemctl reload nginx
|
||||
```
|
||||
|
||||
That's it! You've created your Nginx file.
|
||||
|
||||
### Override default Nginx templates
|
||||
|
||||
The frontend container ships default Nginx templates which serve content to the reverse proxy. These files read variables from your `.env` file to correctly serve content. In some cases, you might want to override these defaults. To do this:
|
||||
|
|
|
@ -112,20 +112,20 @@ Check the file and remove any duplicated settings after copying.
|
|||
|
||||
1. Start up your new database container.
|
||||
|
||||
```{code-block} sh
|
||||
sudo docker compose up -d postgres
|
||||
```console
|
||||
# docker compose up -d postgres
|
||||
```
|
||||
|
||||
2. Import your database dump into the new container.
|
||||
|
||||
```{code-block} sh
|
||||
cat db_dump.sql | sudo docker compose exec -T postgres psql -U postgres
|
||||
```console
|
||||
# cat db_dump.sql | docker compose exec -T postgres psql -U postgres
|
||||
```
|
||||
|
||||
3. Run the database migrations.
|
||||
|
||||
```{code-block} sh
|
||||
sudo docker compose run --rm api funkwhale-manage migrate
|
||||
```console
|
||||
# docker compose run --rm api funkwhale-manage migrate
|
||||
```
|
||||
|
||||
## Start your Funkwhale instance
|
||||
|
|
|
@ -6,20 +6,20 @@ If you installed Funkwhale following the [Debian guide](../installation/debian.m
|
|||
|
||||
1. Stop the Funkwhale services.
|
||||
|
||||
```{code-block} sh
|
||||
sudo systemctl stop funkwhale.target
|
||||
```console
|
||||
# systemctl stop funkwhale.target
|
||||
```
|
||||
|
||||
2. Navigate to your Funkwhale directory.
|
||||
|
||||
```{code-block} sh
|
||||
cd /srv/funkwhale
|
||||
```console
|
||||
# cd /srv/funkwhale
|
||||
```
|
||||
|
||||
3. Remove the old files.
|
||||
|
||||
```{code-block} sh
|
||||
sudo rm -Rf api/* front/* venv
|
||||
```console
|
||||
# rm -Rf api/* front/* venv
|
||||
```
|
||||
|
||||
## Download Funkwhale
|
||||
|
@ -31,35 +31,60 @@ If you installed Funkwhale following the [Debian guide](../installation/debian.m
|
|||
```
|
||||
|
||||
2. Follow the [Download Funkwhale](../installation/debian.md#3-download-funkwhale) instructions in the installation guide.
|
||||
|
||||
3. Follow the [Install the Funkwhale API](../installation/debian.md#4-install-the-funkwhale-api) instructions in the installation guide.
|
||||
|
||||
## Upgrade your systemd unit files
|
||||
|
||||
To make sure you receive any updates made to unit files, download the latest versions from the repo.
|
||||
|
||||
```console
|
||||
# curl -L -o "/etc/systemd/system/funkwhale.target" "https://dev.funkwhale.audio/funkwhale/funkwhale/raw/$FUNKWHALE_VERSION/deploy/funkwhale.target"
|
||||
# curl -L -o "/etc/systemd/system/funkwhale-server.service" "https://dev.funkwhale.audio/funkwhale/funkwhale/raw/$FUNKWHALE_VERSION/deploy/funkwhale-server.service"
|
||||
# curl -L -o "/etc/systemd/system/funkwhale-worker.service" "https://dev.funkwhale.audio/funkwhale/funkwhale/raw/$FUNKWHALE_VERSION/deploy/funkwhale-worker.service"
|
||||
# curl -L -o "/etc/systemd/system/funkwhale-beat.service" "https://dev.funkwhale.audio/funkwhale/funkwhale/raw/$FUNKWHALE_VERSION/deploy/funkwhale-beat.service"
|
||||
```
|
||||
|
||||
## Update your reverse proxy configuration
|
||||
|
||||
To ensure your reverse proxy is up-to-date with changes, you should regenerate your Nginx configuration with each upgrade. To do this:
|
||||
|
||||
:::{include} /administrator/installation/debian.md
|
||||
:start-after: Nginx update instructions
|
||||
:end-before: Instructions end
|
||||
:::
|
||||
|
||||
Once you've updated your configuration, reload Nginx.
|
||||
|
||||
```console
|
||||
# systemctl reload nginx
|
||||
```
|
||||
|
||||
## Update your Funkwhale instance
|
||||
|
||||
Once you have downloaded the new files, you can update your Funkwhale instance. To do this:
|
||||
|
||||
1. Install or upgrade all OS dependencies using the dependencies script.
|
||||
|
||||
```{code-block} sh
|
||||
sudo api/install_os_dependencies.sh install
|
||||
```console
|
||||
# api/install_os_dependencies.sh install
|
||||
```
|
||||
|
||||
2. Collect the new static files to serve.
|
||||
|
||||
```{code-block} sh
|
||||
sudo venv/bin/funkwhale-manage collectstatic --no-input
|
||||
```console
|
||||
# venv/bin/funkwhale-manage collectstatic --no-input
|
||||
```
|
||||
|
||||
3. Apply new database migrations.
|
||||
|
||||
```{code-block} sh
|
||||
sudo -u funkwhale venv/bin/funkwhale-manage migrate
|
||||
```console
|
||||
# sudo -u funkwhale venv/bin/funkwhale-manage migrate
|
||||
```
|
||||
|
||||
4. Restart the Funkwhale services.
|
||||
|
||||
```{code-block} sh
|
||||
sudo systemctl start funkwhale.target
|
||||
```console
|
||||
# systemctl start funkwhale.target
|
||||
```
|
||||
|
||||
That's it! You've updated your Funkwhale pod. You should now see the new version running in your web browser.
|
||||
|
|
|
@ -62,62 +62,86 @@ exit
|
|||
|
||||
That’s it! You’ve updated your Funkwhale pod. You should now see the new version running in your web browser.
|
||||
|
||||
## Upgrade the postgres container
|
||||
## Update your reverse proxy configuration
|
||||
|
||||
Funkwhale depends on postgres for its database container. To upgrade postgres, you need to export your database and import it into the new container.
|
||||
To ensure your reverse proxy is up-to-date with changes, you should regenerate your Nginx configuration with each upgrade. To do this:
|
||||
|
||||
To upgrade postgres on Docker we use the [`postgres-upgrade`](https://hub.docker.com/r/tianon/postgres-upgrade/) container. This Docker container automates the process of upgrading between major versions of postgres. Use these commands to upgrade your postgres container:
|
||||
:::{include} /administrator/installation/docker.md
|
||||
:start-after: Nginx update instructions
|
||||
:end-before: Instructions end
|
||||
:::
|
||||
|
||||
1. Export your current postgres version number. You can find this in your `docker-compose.yml` file.
|
||||
Once you've updated your configuration, reload Nginx.
|
||||
|
||||
```{code-block} sh
|
||||
export OLD_POSTGRES=13
|
||||
```console
|
||||
# systemctl reload nginx
|
||||
```
|
||||
|
||||
2. Export the major version number you want to upgrade to.
|
||||
## Upgrade the Postgres container
|
||||
|
||||
```{code-block} sh
|
||||
export NEW_POSTGRES=14
|
||||
Funkwhale depends on Postgres for its database container. To upgrade Postgres, you need to export your database and import it into a new container to update the schema.
|
||||
|
||||
To update your Postgres container, follow these steps:
|
||||
|
||||
1. Stop all Funkwhale services
|
||||
|
||||
```console
|
||||
# docker compose down
|
||||
```
|
||||
|
||||
3. Stop the postgres container. This means no data changes while you are upgrading.
|
||||
2. Create a backup of your Funkwhale database. We will import this into the new postgres container later.
|
||||
|
||||
```{code-block} sh
|
||||
sudo docker compose stop postgres
|
||||
```console
|
||||
# docker compose exec -i postgres pg_dump -U postgres postgres > db_dump.sql
|
||||
```
|
||||
|
||||
4. Run the migration using the `postgres-upgrade` container. This creates a new version of the database in the `/srv/funkwhale/data/postgres-new` directory.
|
||||
3. Move the {file}`data/postgres` directory to another location to back it up
|
||||
|
||||
```{code-block} sh
|
||||
sudo -E docker run --rm \
|
||||
-v $(pwd)/data/postgres:/var/lib/postgresql/${OLD_POSTGRES}/data \
|
||||
-v $(pwd)/data/postgres-new:/var/lib/postgresql/${NEW_POSTGRES}/data \
|
||||
tianon/postgres-upgrade:${OLD_POSTGRES}-to-${NEW_POSTGRES}
|
||||
```console
|
||||
$ mv data/postgres data/postgres.bak
|
||||
```
|
||||
|
||||
5. Re-add the access control rules required by Funkwhale.
|
||||
4. Create a new {file}`data/postgres` directory to house your data
|
||||
|
||||
```{code-block} sh
|
||||
echo "host all all all trust" | sudo tee -a ./data/postgres-new/pg_hba.conf
|
||||
```console
|
||||
$ mkdir data/postgres
|
||||
```
|
||||
|
||||
6. Swap your old database out with your new database.
|
||||
5. Edit the {file}`docker-compose.yml` file in an editor of your choice.
|
||||
|
||||
```{code-block} sh
|
||||
mv ./data/postgres ./data/postgres-old
|
||||
mv ./data/postgres-new ./data/postgres
|
||||
```console
|
||||
$ nano docker-compose.yml
|
||||
```
|
||||
|
||||
7. Pull the new postgres version.
|
||||
6. Update the version number in the `image` section of the `postgres` service to the major version you want to use. In this example, Postgres version `15` is used.
|
||||
|
||||
```{code-block} sh
|
||||
sudo docker compose pull
|
||||
{emphasize-lines="9"}
|
||||
|
||||
```yaml
|
||||
version: "3"
|
||||
|
||||
services:
|
||||
postgres:
|
||||
restart: unless-stopped
|
||||
env_file: .env
|
||||
environment:
|
||||
- "POSTGRES_HOST_AUTH_METHOD=trust"
|
||||
image: postgres:15-alpine
|
||||
volumes:
|
||||
- ./data/postgres:/var/lib/postgresql/data
|
||||
```
|
||||
|
||||
8. Restart your containers.
|
||||
7. Save the file and close your editor
|
||||
|
||||
```{code-block} sh
|
||||
sudo docker compose up -d
|
||||
```
|
||||
Once you've updated your Postgres containers, you need to migrate your database. To do this:
|
||||
|
||||
That's it! Your Funkwhale pod is now running the new version of postgres. The old database is available in `/srv/funkwhale/data/postgres-old`. You can back this up and remove it from your server once you've confirmed everything is working.
|
||||
:::{include} /administrator/migration.md
|
||||
:start-line: 112
|
||||
:end-line: 129
|
||||
:::
|
||||
|
||||
:::{seealso}
|
||||
You can use the [`postgres-upgrade` container](https://hub.docker.com/r/tianon/postgres-upgrade/) to automate some of the upgrade procedure on **AMD64** Docker deployments.
|
||||
:::
|
||||
|
||||
That's it! Your Funkwhale pod is now running the new version of Postgres. The old database is available in `/srv/funkwhale/data/postgres-old`. You can back this up and remove it from your server once you've confirmed everything is working.
|
||||
|
|
|
@ -51,6 +51,7 @@ extensions = [
|
|||
"myst_parser",
|
||||
"sphinx_design",
|
||||
"sphinxcontrib.mermaid",
|
||||
"sphinx_copybutton",
|
||||
]
|
||||
autodoc_mock_imports = [
|
||||
"celery",
|
||||
|
@ -74,7 +75,7 @@ source_suffix = ".rst"
|
|||
root_doc = "index"
|
||||
|
||||
# Enable colon fences
|
||||
myst_enable_extensions = ["colon_fence"]
|
||||
myst_enable_extensions = ["colon_fence", "attrs_block"]
|
||||
|
||||
# Autogenerate anchors
|
||||
|
||||
|
@ -249,3 +250,7 @@ def setup(app):
|
|||
# Internationalization settings
|
||||
locale_dirs = ["locales/"]
|
||||
gettext_compact = False
|
||||
|
||||
# Don't copy prompts with copybutton
|
||||
|
||||
copybutton_exclude = ".linenos, .gp"
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
# This file is automatically @generated by Poetry 1.4.1 and should not be changed by hand.
|
||||
# This file is automatically @generated by Poetry 1.4.2 and should not be changed by hand.
|
||||
|
||||
[[package]]
|
||||
name = "aiohttp"
|
||||
|
@ -228,22 +228,22 @@ files = [
|
|||
|
||||
[[package]]
|
||||
name = "attrs"
|
||||
version = "22.2.0"
|
||||
version = "23.1.0"
|
||||
description = "Classes Without Boilerplate"
|
||||
category = "main"
|
||||
optional = false
|
||||
python-versions = ">=3.6"
|
||||
python-versions = ">=3.7"
|
||||
files = [
|
||||
{file = "attrs-22.2.0-py3-none-any.whl", hash = "sha256:29e95c7f6778868dbd49170f98f8818f78f3dc5e0e37c0b1f474e3561b240836"},
|
||||
{file = "attrs-22.2.0.tar.gz", hash = "sha256:c9227bfc2f01993c03f68db37d1d15c9690188323c067c641f1a35ca58185f99"},
|
||||
{file = "attrs-23.1.0-py3-none-any.whl", hash = "sha256:1f28b4522cdc2fb4256ac1a020c78acf9cba2c6b461ccd2c126f3aa8e8335d04"},
|
||||
{file = "attrs-23.1.0.tar.gz", hash = "sha256:6279836d581513a26f1bf235f9acd333bc9115683f14f7e8fae46c98fc50e015"},
|
||||
]
|
||||
|
||||
[package.extras]
|
||||
cov = ["attrs[tests]", "coverage-enable-subprocess", "coverage[toml] (>=5.3)"]
|
||||
dev = ["attrs[docs,tests]"]
|
||||
docs = ["furo", "myst-parser", "sphinx", "sphinx-notfound-page", "sphinxcontrib-towncrier", "towncrier", "zope.interface"]
|
||||
tests = ["attrs[tests-no-zope]", "zope.interface"]
|
||||
tests-no-zope = ["cloudpickle", "cloudpickle", "hypothesis", "hypothesis", "mypy (>=0.971,<0.990)", "mypy (>=0.971,<0.990)", "pympler", "pympler", "pytest (>=4.3.0)", "pytest (>=4.3.0)", "pytest-mypy-plugins", "pytest-mypy-plugins", "pytest-xdist[psutil]", "pytest-xdist[psutil]"]
|
||||
cov = ["attrs[tests]", "coverage[toml] (>=5.3)"]
|
||||
dev = ["attrs[docs,tests]", "pre-commit"]
|
||||
docs = ["furo", "myst-parser", "sphinx", "sphinx-notfound-page", "sphinxcontrib-towncrier", "towncrier", "zope-interface"]
|
||||
tests = ["attrs[tests-no-zope]", "zope-interface"]
|
||||
tests-no-zope = ["cloudpickle", "hypothesis", "mypy (>=1.1.1)", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "pytest-xdist[psutil]"]
|
||||
|
||||
[[package]]
|
||||
name = "autobahn"
|
||||
|
@ -383,18 +383,18 @@ dev = ["Sphinx (==4.3.2)", "black (==22.3.0)", "build (==0.8.0)", "flake8 (==4.0
|
|||
|
||||
[[package]]
|
||||
name = "boto3"
|
||||
version = "1.26.99"
|
||||
version = "1.26.108"
|
||||
description = "The AWS SDK for Python"
|
||||
category = "main"
|
||||
optional = false
|
||||
python-versions = ">= 3.7"
|
||||
files = [
|
||||
{file = "boto3-1.26.99-py3-none-any.whl", hash = "sha256:536d9e7a074f4f16cc87b426f91b3079edd5c6927541a04f7e3fa28c53293532"},
|
||||
{file = "boto3-1.26.99.tar.gz", hash = "sha256:d9fd57d6e98fd919cdbd613428f685e05b48c71477fda1aa7fbf51867262c7d1"},
|
||||
{file = "boto3-1.26.108-py3-none-any.whl", hash = "sha256:27fd0fedfdcab0bbb672b0dd18844049b86de15dccf042488c6420f1101e8a10"},
|
||||
{file = "boto3-1.26.108.tar.gz", hash = "sha256:22bb45185eaf0e4548a08d35ec11b910d55fa14f5ccd1048d1b95c8615afcc53"},
|
||||
]
|
||||
|
||||
[package.dependencies]
|
||||
botocore = ">=1.29.99,<1.30.0"
|
||||
botocore = ">=1.29.108,<1.30.0"
|
||||
jmespath = ">=0.7.1,<2.0.0"
|
||||
s3transfer = ">=0.6.0,<0.7.0"
|
||||
|
||||
|
@ -403,14 +403,14 @@ crt = ["botocore[crt] (>=1.21.0,<2.0a0)"]
|
|||
|
||||
[[package]]
|
||||
name = "botocore"
|
||||
version = "1.29.106"
|
||||
version = "1.29.133"
|
||||
description = "Low-level, data-driven core of boto 3."
|
||||
category = "main"
|
||||
optional = false
|
||||
python-versions = ">= 3.7"
|
||||
files = [
|
||||
{file = "botocore-1.29.106-py3-none-any.whl", hash = "sha256:d50df9a39da1b0e475727c6c2ba141b44d9df527d3dc1936b264ee4cb1525ab7"},
|
||||
{file = "botocore-1.29.106.tar.gz", hash = "sha256:eaaa669fe33a0ef2e9d345a98ed0befac1ea33395d63620913c1bb738c387d4d"},
|
||||
{file = "botocore-1.29.133-py3-none-any.whl", hash = "sha256:b266185d7414a559952569005009a400de50af91fd3da44f05cf05b00946c4a7"},
|
||||
{file = "botocore-1.29.133.tar.gz", hash = "sha256:7b38e540f73c921d8cb0ac72794072000af9e10758c04ba7f53d5629cc52fa87"},
|
||||
]
|
||||
|
||||
[package.dependencies]
|
||||
|
@ -490,14 +490,14 @@ zstd = ["zstandard"]
|
|||
|
||||
[[package]]
|
||||
name = "certifi"
|
||||
version = "2022.12.7"
|
||||
version = "2023.5.7"
|
||||
description = "Python package for providing Mozilla's CA Bundle."
|
||||
category = "main"
|
||||
optional = false
|
||||
python-versions = ">=3.6"
|
||||
files = [
|
||||
{file = "certifi-2022.12.7-py3-none-any.whl", hash = "sha256:4ad3232f5e926d6718ec31cfc1fcadfde020920e278684144551c91769c7bc18"},
|
||||
{file = "certifi-2022.12.7.tar.gz", hash = "sha256:35824b4c3a97115964b408844d64aa14db1cc518f6562e8d7261699d1350a9e3"},
|
||||
{file = "certifi-2023.5.7-py3-none-any.whl", hash = "sha256:c6c2e98f5c7869efca1f8916fed228dd91539f9f1b444c314c06eef02980c716"},
|
||||
{file = "certifi-2023.5.7.tar.gz", hash = "sha256:0f0d56dc5a6ad56fd4ba36484d6cc34451e1c6548c61daad8c320169f91eddc7"},
|
||||
]
|
||||
|
||||
[[package]]
|
||||
|
@ -600,25 +600,25 @@ tests = ["async-timeout", "coverage (>=4.5,<5.0)", "pytest", "pytest-asyncio", "
|
|||
|
||||
[[package]]
|
||||
name = "channels-redis"
|
||||
version = "4.0.0"
|
||||
version = "4.1.0"
|
||||
description = "Redis-backed ASGI channel layer implementation"
|
||||
category = "main"
|
||||
optional = false
|
||||
python-versions = ">=3.7"
|
||||
files = [
|
||||
{file = "channels_redis-4.0.0-py3-none-any.whl", hash = "sha256:81b59d68f53313e1aa891f23591841b684abb936b42e4d1a966d9e4dc63a95ec"},
|
||||
{file = "channels_redis-4.0.0.tar.gz", hash = "sha256:122414f29f525f7b9e0c9d59cdcfc4dc1b0eecba16fbb6a1c23f1d9b58f49dcb"},
|
||||
{file = "channels_redis-4.1.0-py3-none-any.whl", hash = "sha256:3696f5b9fe367ea495d402ba83d7c3c99e8ca0e1354ff8d913535976ed0abf73"},
|
||||
{file = "channels_redis-4.1.0.tar.gz", hash = "sha256:6bd4f75f4ab4a7db17cee495593ace886d7e914c66f8214a1f247ff6659c073a"},
|
||||
]
|
||||
|
||||
[package.dependencies]
|
||||
asgiref = ">=3.2.10,<4"
|
||||
channels = "*"
|
||||
msgpack = ">=1.0,<2.0"
|
||||
redis = ">=4.2.0"
|
||||
redis = ">=4.5.3"
|
||||
|
||||
[package.extras]
|
||||
cryptography = ["cryptography (>=1.3.0)"]
|
||||
tests = ["async-timeout", "cryptography (>=1.3.0)", "pytest", "pytest-asyncio"]
|
||||
tests = ["async-timeout", "cryptography (>=1.3.0)", "pytest", "pytest-asyncio", "pytest-timeout"]
|
||||
|
||||
[[package]]
|
||||
name = "charset-normalizer"
|
||||
|
@ -1053,14 +1053,14 @@ six = "*"
|
|||
|
||||
[[package]]
|
||||
name = "django-environ"
|
||||
version = "0.9.0"
|
||||
version = "0.10.0"
|
||||
description = "A package that allows you to utilize 12factor inspired environment variables to configure your Django application."
|
||||
category = "main"
|
||||
optional = false
|
||||
python-versions = ">=3.4,<4"
|
||||
python-versions = ">=3.5,<4"
|
||||
files = [
|
||||
{file = "django-environ-0.9.0.tar.gz", hash = "sha256:bff5381533056328c9ac02f71790bd5bf1cea81b1beeb648f28b81c9e83e0a21"},
|
||||
{file = "django_environ-0.9.0-py2.py3-none-any.whl", hash = "sha256:f21a5ef8cc603da1870bbf9a09b7e5577ab5f6da451b843dbcc721a7bca6b3d9"},
|
||||
{file = "django-environ-0.10.0.tar.gz", hash = "sha256:b3559a91439c9d774a9e0c1ced872364772c612cdf6dc919506a2b13f7a77225"},
|
||||
{file = "django_environ-0.10.0-py2.py3-none-any.whl", hash = "sha256:510f8c9c1d0a38b0815f91504270c29440a0cf44fab07f55942fa8d31bbb9be6"},
|
||||
]
|
||||
|
||||
[package.extras]
|
||||
|
@ -1189,14 +1189,14 @@ files = [
|
|||
|
||||
[[package]]
|
||||
name = "drf-spectacular"
|
||||
version = "0.25.1"
|
||||
version = "0.26.1"
|
||||
description = "Sane and flexible OpenAPI 3 schema generation for Django REST framework"
|
||||
category = "main"
|
||||
optional = false
|
||||
python-versions = ">=3.6"
|
||||
files = [
|
||||
{file = "drf-spectacular-0.25.1.tar.gz", hash = "sha256:789696f9845ef2397c52f66154aec6d96411baf6aa09a5d40c5f0b0e99f6b3d8"},
|
||||
{file = "drf_spectacular-0.25.1-py3-none-any.whl", hash = "sha256:d58684e702f5ad436c5bd1735d46df0e123e64de883092d38f1debb9fa4a03c9"},
|
||||
{file = "drf-spectacular-0.26.1.tar.gz", hash = "sha256:1599a204bf9cc6be7ef3e509859885a38d4f871fe287a1f191479868afd9e234"},
|
||||
{file = "drf_spectacular-0.26.1-py3-none-any.whl", hash = "sha256:6df86ff6c2dc663792e5ff618643bf41d2ac9dc6fb5d1b0f273e2778bab951e5"},
|
||||
]
|
||||
|
||||
[package.dependencies]
|
||||
|
@ -1228,33 +1228,49 @@ sgmllib3k = "*"
|
|||
|
||||
[[package]]
|
||||
name = "frozendict"
|
||||
version = "2.3.6"
|
||||
version = "2.3.8"
|
||||
description = "A simple immutable dictionary"
|
||||
category = "main"
|
||||
optional = false
|
||||
python-versions = ">=3.6"
|
||||
files = [
|
||||
{file = "frozendict-2.3.6-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:2178f8cc97d4ca8736df2fea0ca18094e259db086b560e5905ecac7f0894adc5"},
|
||||
{file = "frozendict-2.3.6-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1e3255b0f33a65b558d99d067c1dbedc6f30effe66967d5b201c7fcffb20a86e"},
|
||||
{file = "frozendict-2.3.6-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:8e25079fe3e11ca1360b8435f4a848c851b3c657b3ba3577a6627bfe6628705f"},
|
||||
{file = "frozendict-2.3.6-cp310-cp310-win_amd64.whl", hash = "sha256:caed7300322a47ceeaa00a311f902cbbeb7a3d1c8955487de3ea0ad618048325"},
|
||||
{file = "frozendict-2.3.6-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:a31827dbe892172e1b000ffe22d577986c863e790cc7d51ba8c7fff4f44ac7cf"},
|
||||
{file = "frozendict-2.3.6-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d73b4cca476f3d51f1b11264a41e0c3dbc20a53fb6b1d0878e01cc0b71fa16ce"},
|
||||
{file = "frozendict-2.3.6-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:1b4abc85e4788c2fe434851971a5fde4b079ed369965a21911e485dde97c08f4"},
|
||||
{file = "frozendict-2.3.6-cp36-cp36m-win_amd64.whl", hash = "sha256:9c312b6dfe6a3b6b910637442989119d38bac417486c44a0ed402a80a4f5890e"},
|
||||
{file = "frozendict-2.3.6-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:a9def8ad754a405f0d982fe59e4f47bccd760ddcb472bfe0149f07410245f3d7"},
|
||||
{file = "frozendict-2.3.6-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c8d49faff6eb3f2678dff4d3c83fcb49ccebb13d8360389a0b8941d3e1ee8a93"},
|
||||
{file = "frozendict-2.3.6-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:d310b7ea4fdfe70935d3e9193c8711689914b35300b7234137760c7cdbf257e1"},
|
||||
{file = "frozendict-2.3.6-cp37-cp37m-win_amd64.whl", hash = "sha256:63745ca9a3ffb98f7c6a742afb10cd998e8fcd4f59b40c0c7c0e5795e2092cc8"},
|
||||
{file = "frozendict-2.3.6-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:bd420cad2ec3223b3210c3b5a30fdc4842021ff037ae3c00e5ba6dd48731b753"},
|
||||
{file = "frozendict-2.3.6-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4ea7c9fe1661a0f4135179bc056d5d90f197df5602532d224507c301b1cbda5e"},
|
||||
{file = "frozendict-2.3.6-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:6e52018dc4a8ceaabe420fba4b3c003e8c0391d2efe5c164008ff791e61471d6"},
|
||||
{file = "frozendict-2.3.6-cp38-cp38-win_amd64.whl", hash = "sha256:5b7bbbeabdafa31d7abfea68d8d532994767e56a137855f6dafdcbbc1dc924a8"},
|
||||
{file = "frozendict-2.3.6-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:638d056ddff3e96f288176fcd18330ee68cc38f39ee67e10e43f4ee57552ed82"},
|
||||
{file = "frozendict-2.3.6-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b722fca999b1d14e277e095214d2296e355f6f17d7727c17a4aa95882738184a"},
|
||||
{file = "frozendict-2.3.6-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:9c8314f5b8812cb7bc6001595e5cc521dffe220a8789d942a3f946660cc45672"},
|
||||
{file = "frozendict-2.3.6-cp39-cp39-win_amd64.whl", hash = "sha256:d1e36e820fd2cae4e26935a4b82ccaa2eef8d347709d1c27e3b7608744f72f83"},
|
||||
{file = "frozendict-2.3.6.tar.gz", hash = "sha256:14e376fb0c8fe0b11b77872a84356dfa191b24a240be66bf5ec66d9b0d203bb8"},
|
||||
{file = "frozendict-2.3.8-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d188d062084fba0e4bf32719ff7380b26c050b932ff164043ce82ab90587c52b"},
|
||||
{file = "frozendict-2.3.8-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:f2a4e818ac457f6354401dcb631527af25e5a20fcfc81e6b5054b45fc245caca"},
|
||||
{file = "frozendict-2.3.8-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9a506d807858fa961aaa5b48dab6154fdc6bd045bbe9310788bbff141bb42d13"},
|
||||
{file = "frozendict-2.3.8-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:750632cc890d8ee9484fe6d31b261159144b6efacc08e1317fe46accd1410373"},
|
||||
{file = "frozendict-2.3.8-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:7ee5fe2658a8ac9a57f748acaf563f6a47f80b8308cbf0a04fac0ba057d41f75"},
|
||||
{file = "frozendict-2.3.8-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:23c4bb46e6b8246e1e7e49b5593c2bc09221db0d8f31f7c092be8dfb42b9e620"},
|
||||
{file = "frozendict-2.3.8-cp310-cp310-win_amd64.whl", hash = "sha256:c31abc8acea309b132dde441856829f6003a3d242da8b54bce4c0f2a3c8c63f0"},
|
||||
{file = "frozendict-2.3.8-cp310-cp310-win_arm64.whl", hash = "sha256:9ea5520e85447ff8d4681e181941e482662817ccba921b7cb3f87922056d892a"},
|
||||
{file = "frozendict-2.3.8-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:f83fed36497af9562ead5e9fb8443224ba2781786bd3b92b1087cb7d0ff20135"},
|
||||
{file = "frozendict-2.3.8-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e27c5c1d29d0eda7979253ec88abc239da1313b38f39f4b16984db3b3e482300"},
|
||||
{file = "frozendict-2.3.8-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e4c785de7f1a13f15963945f400656b18f057c2fc76c089dacf127a2bb188c03"},
|
||||
{file = "frozendict-2.3.8-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:8cf35ddd25513428ec152614def9696afb93ae5ec0eb54fa6aa6206eda77ac4c"},
|
||||
{file = "frozendict-2.3.8-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:ffc684773de7c88724788fa9787d0016fd75830412d58acbd9ed1a04762c675b"},
|
||||
{file = "frozendict-2.3.8-cp36-cp36m-win_amd64.whl", hash = "sha256:4c258aab9c8488338634f2ec670ef049dbf0ab0e7a2fa9bc2c7b5009cb614801"},
|
||||
{file = "frozendict-2.3.8-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:47fc26468407fdeb428cfc89495b7921419e670355c21b383765482fdf6c5c14"},
|
||||
{file = "frozendict-2.3.8-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6ea638228692db2bf94bce40ea4b25f4077588497b516bd16576575560094bd9"},
|
||||
{file = "frozendict-2.3.8-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7a75bf87e76c4386caecdbdd02a99e53ad43a6b5c38fb3d5a634a9fc9ce41462"},
|
||||
{file = "frozendict-2.3.8-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:ed5a6c5c7a0f57269577c2a338a6002949aea21a23b7b7d06da7e7dced8b605b"},
|
||||
{file = "frozendict-2.3.8-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:d086440328a465dea9bef2dbad7548d75d1a0a0d21f43a08c03e1ec79ac5240e"},
|
||||
{file = "frozendict-2.3.8-cp37-cp37m-win_amd64.whl", hash = "sha256:0bc4767e2f83db5b701c787e22380296977368b0c57e485ca71b2eedfa11c4a3"},
|
||||
{file = "frozendict-2.3.8-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:638cf363d3cbca31a341503cf2219eac52a5f5140449676fae3d9644cd3c5487"},
|
||||
{file = "frozendict-2.3.8-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:2b2fd8ce36277919b36e3c834d2389f3cd7ac068ae730c312671dd4439a5dd65"},
|
||||
{file = "frozendict-2.3.8-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3957d52f1906b0c85f641a1911d214255873f6408ab4e5ad657cc27a247fb145"},
|
||||
{file = "frozendict-2.3.8-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:72cfe08ab8ae524e54848fa90b22d02c1b1ecfb3064438696bcaa4b953f18772"},
|
||||
{file = "frozendict-2.3.8-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:4742e76c4111bd09198d3ab66cef94be8506212311338f9182d6ef5f5cb60493"},
|
||||
{file = "frozendict-2.3.8-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:313ed8d9ba6bac35d7635cd9580ee5721a0fb016f4d2d20f0efa05dbecbdb1be"},
|
||||
{file = "frozendict-2.3.8-cp38-cp38-win_amd64.whl", hash = "sha256:d3c6ce943946c2a61501c8cf116fff0892d11dd579877eb36e2aea2c27fddfef"},
|
||||
{file = "frozendict-2.3.8-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:f0f573dc4861dd7ec9e055c8cceaf45355e894e749f621f199aab7b311ac4bdb"},
|
||||
{file = "frozendict-2.3.8-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:2b3435e5f1ca5ae68a5e95e64b09d6d5c645cadd6b87569a0b3019dd248c8d00"},
|
||||
{file = "frozendict-2.3.8-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:145afd033ebfade28416093335261b8ec1af5cccc593482309e7add062ec8668"},
|
||||
{file = "frozendict-2.3.8-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:da98427de26b5a2865727947480cbb53860089c4d195baa29c539da811cea617"},
|
||||
{file = "frozendict-2.3.8-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:5e82befa7c385a668d569cebbebbdf49cee6fea4083f08e869a1b08cfb640a9f"},
|
||||
{file = "frozendict-2.3.8-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:80abe81d36e889ceec665e06ec764a7638000fa3e7be09786ac4d3ddc64b76db"},
|
||||
{file = "frozendict-2.3.8-cp39-cp39-win_amd64.whl", hash = "sha256:8ccc94ac781710db44e142e1a11ff9b31d02c032c01c6868d51fcbef73086225"},
|
||||
{file = "frozendict-2.3.8-cp39-cp39-win_arm64.whl", hash = "sha256:e72dbc1bcc2203cef38d205f692396f5505921a5680f66aa9a7e8bb71fd38f28"},
|
||||
{file = "frozendict-2.3.8-py311-none-any.whl", hash = "sha256:ba41a7ed019bd03b62d63ed3f8dea35b8243d1936f7c9ed4b5298ca45a01928e"},
|
||||
{file = "frozendict-2.3.8.tar.gz", hash = "sha256:5526559eca8f1780a4ee5146896f59afc31435313560208dd394a3a5e537d3ff"},
|
||||
]
|
||||
|
||||
[[package]]
|
||||
|
@ -1368,10 +1384,10 @@ aiohttp = "==3.8.4"
|
|||
arrow = "==1.2.3"
|
||||
backports-zoneinfo = {version = "==0.2.1", markers = "python_version < \"3.9\""}
|
||||
bleach = "==5.0.1"
|
||||
boto3 = "==1.26.99"
|
||||
boto3 = "==1.26.108"
|
||||
celery = "==5.2.7"
|
||||
channels = {version = "==4.0.0", extras = ["daphne"]}
|
||||
channels-redis = "==4.0.0"
|
||||
channels-redis = "==4.1.0"
|
||||
click = "==8.1.3"
|
||||
cryptography = "==38.0.4"
|
||||
dj-rest-auth = {version = "2.2.8", extras = ["with-social"]}
|
||||
|
@ -1383,14 +1399,14 @@ django-cacheops = "==6.1"
|
|||
django-cleanup = "==6.0.0"
|
||||
django-cors-headers = "==3.13.0"
|
||||
django-dynamic-preferences = "==1.14.0"
|
||||
django-environ = "==0.9.0"
|
||||
django-environ = "==0.10.0"
|
||||
django-filter = "==22.1"
|
||||
django-oauth-toolkit = "2.2.0"
|
||||
django-redis = "==5.2.0"
|
||||
django-storages = "==1.13.2"
|
||||
django-versatileimagefield = "==2.2"
|
||||
djangorestframework = "==3.14.0"
|
||||
drf-spectacular = "==0.25.1"
|
||||
drf-spectacular = "==0.26.1"
|
||||
feedparser = "==6.0.10"
|
||||
gunicorn = "==20.1.0"
|
||||
ipython = "==7.34.0"
|
||||
|
@ -1406,7 +1422,7 @@ pydub = "==0.25.1"
|
|||
pyld = "==2.0.3"
|
||||
python-ldap = "==3.4.3"
|
||||
python-magic = "==0.4.27"
|
||||
redis = "==4.4.2"
|
||||
redis = "==4.5.4"
|
||||
requests = "==2.28.2"
|
||||
requests-http-message-signatures = "==0.3.1"
|
||||
sentry-sdk = "==1.19.1"
|
||||
|
@ -1547,14 +1563,14 @@ files = [
|
|||
|
||||
[[package]]
|
||||
name = "importlib-metadata"
|
||||
version = "6.1.0"
|
||||
version = "6.6.0"
|
||||
description = "Read metadata from Python packages"
|
||||
category = "main"
|
||||
optional = false
|
||||
python-versions = ">=3.7"
|
||||
files = [
|
||||
{file = "importlib_metadata-6.1.0-py3-none-any.whl", hash = "sha256:ff80f3b5394912eb1b108fcfd444dc78b7f1f3e16b16188054bd01cb9cb86f09"},
|
||||
{file = "importlib_metadata-6.1.0.tar.gz", hash = "sha256:43ce9281e097583d758c2c708c4376371261a02c34682491a8e98352365aad20"},
|
||||
{file = "importlib_metadata-6.6.0-py3-none-any.whl", hash = "sha256:43dd286a2cd8995d5eaef7fee2066340423b818ed3fd70adf0bad5f1fac53fed"},
|
||||
{file = "importlib_metadata-6.6.0.tar.gz", hash = "sha256:92501cdf9cc66ebd3e612f1b4f0c0765dfa42f0fa38ffb319b6bd84dd675d705"},
|
||||
]
|
||||
|
||||
[package.dependencies]
|
||||
|
@ -2238,14 +2254,14 @@ signedtoken = ["cryptography (>=3.0.0)", "pyjwt (>=2.0.0,<3)"]
|
|||
|
||||
[[package]]
|
||||
name = "packaging"
|
||||
version = "23.0"
|
||||
version = "23.1"
|
||||
description = "Core utilities for Python packages"
|
||||
category = "main"
|
||||
optional = false
|
||||
python-versions = ">=3.7"
|
||||
files = [
|
||||
{file = "packaging-23.0-py3-none-any.whl", hash = "sha256:714ac14496c3e68c99c29b00845f7a2b85f3bb6f1078fd9f72fd20f0570002b2"},
|
||||
{file = "packaging-23.0.tar.gz", hash = "sha256:b6ad297f8907de0fa2fe1ccbd26fdaf387f5f47c7275fedf8cce89f99446cf97"},
|
||||
{file = "packaging-23.1-py3-none-any.whl", hash = "sha256:994793af429502c4ea2ebf6bf664629d07c1a9fe974af92966e4b8d2df7edc61"},
|
||||
{file = "packaging-23.1.tar.gz", hash = "sha256:a392980d2b6cffa644431898be54b0045151319d1e7ec34f0cfed48767dd334f"},
|
||||
]
|
||||
|
||||
[[package]]
|
||||
|
@ -2454,30 +2470,30 @@ files = [
|
|||
|
||||
[[package]]
|
||||
name = "pyasn1"
|
||||
version = "0.4.8"
|
||||
description = "ASN.1 types and codecs"
|
||||
version = "0.5.0"
|
||||
description = "Pure-Python implementation of ASN.1 types and DER/BER/CER codecs (X.208)"
|
||||
category = "main"
|
||||
optional = false
|
||||
python-versions = "*"
|
||||
python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,>=2.7"
|
||||
files = [
|
||||
{file = "pyasn1-0.4.8-py2.py3-none-any.whl", hash = "sha256:39c7e2ec30515947ff4e87fb6f456dfc6e84857d34be479c9d4a4ba4bf46aa5d"},
|
||||
{file = "pyasn1-0.4.8.tar.gz", hash = "sha256:aef77c9fb94a3ac588e87841208bdec464471d9871bd5050a287cc9a475cd0ba"},
|
||||
{file = "pyasn1-0.5.0-py2.py3-none-any.whl", hash = "sha256:87a2121042a1ac9358cabcaf1d07680ff97ee6404333bacca15f76aa8ad01a57"},
|
||||
{file = "pyasn1-0.5.0.tar.gz", hash = "sha256:97b7290ca68e62a832558ec3976f15cbf911bf5d7c7039d8b861c2a0ece69fde"},
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "pyasn1-modules"
|
||||
version = "0.2.8"
|
||||
description = "A collection of ASN.1-based protocols modules."
|
||||
version = "0.3.0"
|
||||
description = "A collection of ASN.1-based protocols modules"
|
||||
category = "main"
|
||||
optional = false
|
||||
python-versions = "*"
|
||||
python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,>=2.7"
|
||||
files = [
|
||||
{file = "pyasn1-modules-0.2.8.tar.gz", hash = "sha256:905f84c712230b2c592c19470d3ca8d552de726050d1d1716282a1f6146be65e"},
|
||||
{file = "pyasn1_modules-0.2.8-py2.py3-none-any.whl", hash = "sha256:a50b808ffeb97cb3601dd25981f6b016cbb3d31fbf57a8b8a87428e6158d0c74"},
|
||||
{file = "pyasn1_modules-0.3.0-py2.py3-none-any.whl", hash = "sha256:d3ccd6ed470d9ffbc716be08bd90efbd44d0734bc9303818f7336070984a162d"},
|
||||
{file = "pyasn1_modules-0.3.0.tar.gz", hash = "sha256:5bd01446b736eb9d31512a30d46c1ac3395d676c6f3cafa4c03eb54b9925631c"},
|
||||
]
|
||||
|
||||
[package.dependencies]
|
||||
pyasn1 = ">=0.4.6,<0.5.0"
|
||||
pyasn1 = ">=0.4.6,<0.6.0"
|
||||
|
||||
[[package]]
|
||||
name = "pycparser"
|
||||
|
@ -2505,14 +2521,14 @@ files = [
|
|||
|
||||
[[package]]
|
||||
name = "pygments"
|
||||
version = "2.14.0"
|
||||
version = "2.15.1"
|
||||
description = "Pygments is a syntax highlighting package written in Python."
|
||||
category = "main"
|
||||
optional = false
|
||||
python-versions = ">=3.6"
|
||||
python-versions = ">=3.7"
|
||||
files = [
|
||||
{file = "Pygments-2.14.0-py3-none-any.whl", hash = "sha256:fa7bd7bd2771287c0de303af8bfdfc731f51bd2c6a47ab69d117138893b82717"},
|
||||
{file = "Pygments-2.14.0.tar.gz", hash = "sha256:b3ed06a9e8ac9a9aae5a6f5dbe78a8a58655d17b43b93c078f094ddc476ae297"},
|
||||
{file = "Pygments-2.15.1-py3-none-any.whl", hash = "sha256:db2db3deb4b4179f399a09054b023b6a586b76499d36965813c71aa8ed7b5fd1"},
|
||||
{file = "Pygments-2.15.1.tar.gz", hash = "sha256:8ace4d3c1dd481894b2005f560ead0f9f19ee64fe983366be1a21e171d12775c"},
|
||||
]
|
||||
|
||||
[package.extras]
|
||||
|
@ -2736,18 +2752,18 @@ files = [
|
|||
|
||||
[[package]]
|
||||
name = "redis"
|
||||
version = "4.4.2"
|
||||
version = "4.5.4"
|
||||
description = "Python client for Redis database and key-value store"
|
||||
category = "main"
|
||||
optional = false
|
||||
python-versions = ">=3.7"
|
||||
files = [
|
||||
{file = "redis-4.4.2-py3-none-any.whl", hash = "sha256:e6206448e2f8a432871d07d432c13ed6c2abcf6b74edb436c99752b1371be387"},
|
||||
{file = "redis-4.4.2.tar.gz", hash = "sha256:a010f6cb7378065040a02839c3f75c7e0fb37a87116fb4a95be82a95552776c7"},
|
||||
{file = "redis-4.5.4-py3-none-any.whl", hash = "sha256:2c19e6767c474f2e85167909061d525ed65bea9301c0770bb151e041b7ac89a2"},
|
||||
{file = "redis-4.5.4.tar.gz", hash = "sha256:73ec35da4da267d6847e47f68730fdd5f62e2ca69e3ef5885c6a78a9374c3893"},
|
||||
]
|
||||
|
||||
[package.dependencies]
|
||||
async-timeout = ">=4.0.2"
|
||||
async-timeout = {version = ">=4.0.2", markers = "python_version <= \"3.11.2\""}
|
||||
|
||||
[package.extras]
|
||||
hiredis = ["hiredis (>=1.0.0)"]
|
||||
|
@ -2812,14 +2828,14 @@ rsa = ["oauthlib[signedtoken] (>=3.0.0)"]
|
|||
|
||||
[[package]]
|
||||
name = "s3transfer"
|
||||
version = "0.6.0"
|
||||
version = "0.6.1"
|
||||
description = "An Amazon S3 Transfer Manager"
|
||||
category = "main"
|
||||
optional = false
|
||||
python-versions = ">= 3.7"
|
||||
files = [
|
||||
{file = "s3transfer-0.6.0-py3-none-any.whl", hash = "sha256:06176b74f3a15f61f1b4f25a1fc29a4429040b7647133a463da8fa5bd28d5ecd"},
|
||||
{file = "s3transfer-0.6.0.tar.gz", hash = "sha256:2ed07d3866f523cc561bf4a00fc5535827981b117dd7876f036b0c1aca42c947"},
|
||||
{file = "s3transfer-0.6.1-py3-none-any.whl", hash = "sha256:3c0da2d074bf35d6870ef157158641178a4204a6e689e82546083e31e0311346"},
|
||||
{file = "s3transfer-0.6.1.tar.gz", hash = "sha256:640bb492711f4c0c0905e1f62b6aaeb771881935ad27884852411f8e9cacbca9"},
|
||||
]
|
||||
|
||||
[package.dependencies]
|
||||
|
@ -2897,14 +2913,14 @@ tests = ["coverage[toml] (>=5.0.2)", "pytest"]
|
|||
|
||||
[[package]]
|
||||
name = "setuptools"
|
||||
version = "67.6.1"
|
||||
version = "67.7.2"
|
||||
description = "Easily download, build, install, upgrade, and uninstall Python packages"
|
||||
category = "main"
|
||||
optional = false
|
||||
python-versions = ">=3.7"
|
||||
files = [
|
||||
{file = "setuptools-67.6.1-py3-none-any.whl", hash = "sha256:e728ca814a823bf7bf60162daf9db95b93d532948c4c0bea762ce62f60189078"},
|
||||
{file = "setuptools-67.6.1.tar.gz", hash = "sha256:257de92a9d50a60b8e22abfcbb771571fde0dbf3ec234463212027a4eeecbe9a"},
|
||||
{file = "setuptools-67.7.2-py3-none-any.whl", hash = "sha256:23aaf86b85ca52ceb801d32703f12d77517b2556af839621c641fca11287952b"},
|
||||
{file = "setuptools-67.7.2.tar.gz", hash = "sha256:f104fa03692a2602fa0fec6c6a9e63b6c8a968de13e17c026957dd1f53d80990"},
|
||||
]
|
||||
|
||||
[package.extras]
|
||||
|
@ -2995,6 +3011,25 @@ docs = ["sphinxcontrib-websupport"]
|
|||
lint = ["docutils-stubs", "flake8 (>=3.5.0)", "flake8-bugbear", "flake8-comprehensions", "flake8-simplify", "isort", "mypy (>=0.981)", "sphinx-lint", "types-requests", "types-typed-ast"]
|
||||
test = ["cython", "html5lib", "pytest (>=4.6)", "typed_ast"]
|
||||
|
||||
[[package]]
|
||||
name = "sphinx-copybutton"
|
||||
version = "0.5.2"
|
||||
description = "Add a copy button to each of your code cells."
|
||||
category = "main"
|
||||
optional = false
|
||||
python-versions = ">=3.7"
|
||||
files = [
|
||||
{file = "sphinx-copybutton-0.5.2.tar.gz", hash = "sha256:4cf17c82fb9646d1bc9ca92ac280813a3b605d8c421225fd9913154103ee1fbd"},
|
||||
{file = "sphinx_copybutton-0.5.2-py3-none-any.whl", hash = "sha256:fb543fd386d917746c9a2c50360c7905b605726b9355cd26e9974857afeae06e"},
|
||||
]
|
||||
|
||||
[package.dependencies]
|
||||
sphinx = ">=1.8"
|
||||
|
||||
[package.extras]
|
||||
code-style = ["pre-commit (==2.12.1)"]
|
||||
rtd = ["ipython", "myst-nb", "sphinx", "sphinx-book-theme", "sphinx-examples"]
|
||||
|
||||
[[package]]
|
||||
name = "sphinx-design"
|
||||
version = "0.3.0"
|
||||
|
@ -3168,16 +3203,21 @@ test = ["pytest"]
|
|||
|
||||
[[package]]
|
||||
name = "sqlparse"
|
||||
version = "0.4.3"
|
||||
version = "0.4.4"
|
||||
description = "A non-validating SQL parser."
|
||||
category = "main"
|
||||
optional = false
|
||||
python-versions = ">=3.5"
|
||||
files = [
|
||||
{file = "sqlparse-0.4.3-py3-none-any.whl", hash = "sha256:0323c0ec29cd52bceabc1b4d9d579e311f3e4961b98d174201d5622a23b85e34"},
|
||||
{file = "sqlparse-0.4.3.tar.gz", hash = "sha256:69ca804846bb114d2ec380e4360a8a340db83f0ccf3afceeb1404df028f57268"},
|
||||
{file = "sqlparse-0.4.4-py3-none-any.whl", hash = "sha256:5430a4fe2ac7d0f93e66f1efc6e1338a41884b7ddf2a350cedd20ccc4d9d28f3"},
|
||||
{file = "sqlparse-0.4.4.tar.gz", hash = "sha256:d446183e84b8349fa3061f0fe7f06ca94ba65b426946ffebe6e3e8295332420c"},
|
||||
]
|
||||
|
||||
[package.extras]
|
||||
dev = ["build", "flake8"]
|
||||
doc = ["sphinx"]
|
||||
test = ["pytest", "pytest-cov"]
|
||||
|
||||
[[package]]
|
||||
name = "traitlets"
|
||||
version = "5.9.0"
|
||||
|
@ -3533,82 +3573,82 @@ files = [
|
|||
|
||||
[[package]]
|
||||
name = "websockets"
|
||||
version = "11.0"
|
||||
version = "11.0.3"
|
||||
description = "An implementation of the WebSocket Protocol (RFC 6455 & 7692)"
|
||||
category = "main"
|
||||
optional = false
|
||||
python-versions = ">=3.7"
|
||||
files = [
|
||||
{file = "websockets-11.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:269e3547877a6ca55f62acdf291b256b01bc3469535e892af36afd3e17de284a"},
|
||||
{file = "websockets-11.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:70a4e03d2416c1dad16ccfab97c975192337c6481b07167c90221f1926893e1e"},
|
||||
{file = "websockets-11.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:4100dc8566ea3b9c0528dee73284be524ab053aebd77e3fc7439a90e0d57745b"},
|
||||
{file = "websockets-11.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a8e0505c556b2b48078291b300d930f2fb8ba81d1e36379b637c060cfa561ae4"},
|
||||
{file = "websockets-11.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1d5bc68cec8269b4b52ab6d1d8690f56dba35f7bcb83a5487518406300f81cf1"},
|
||||
{file = "websockets-11.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:067ac1f6153fc5218afc4563491dcbdb7384895cfc588a0afee962ca77fe0b58"},
|
||||
{file = "websockets-11.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:910c84c0cfe4f872905b6ebe1866c579582070331abcb7a58621935eca95c18a"},
|
||||
{file = "websockets-11.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:df0f7769450ca67a53182f917910e2b0b6dd3f8268f88cbfe54ee6be96812889"},
|
||||
{file = "websockets-11.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:fe23605f5c351773b6fb82fcf680549980d63e126fab5213ed875686c0cec25d"},
|
||||
{file = "websockets-11.0-cp310-cp310-win32.whl", hash = "sha256:eb2e7cd654a05c36fccf726385c64a0e1027997d05ba0859f4d84c3d87db1623"},
|
||||
{file = "websockets-11.0-cp310-cp310-win_amd64.whl", hash = "sha256:fb26c333751a1e3805ecc416a85dcfa3657676b185acd515fd6992f0cea898ef"},
|
||||
{file = "websockets-11.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:b4a939963bae1055f14976ef2cf53e797c1997f8835ca9cf23060afc3e7d6718"},
|
||||
{file = "websockets-11.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:d7fc189fb632f8b31af8a5b32105919662a1bbaac20912320482415b7fed9c96"},
|
||||
{file = "websockets-11.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:6e3cfc890f1326c95fd7d4cc50f2bd496d3f014fb2da36b4525a10f226be565d"},
|
||||
{file = "websockets-11.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9093f4c72c23ed5e475970c6a37e77c4f3a8856223421b9eb405b9fb2170629f"},
|
||||
{file = "websockets-11.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5c56547f97bc76293522ccfcfbdde12442420f1a2c0218ff45d733a0030046df"},
|
||||
{file = "websockets-11.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ffb406b4449d4fa41ebc47faa3b9153a082f6fe0e4a0891f596a5ddb69fdeccd"},
|
||||
{file = "websockets-11.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:8fad76be2c5e36fb3620ad507ac8004e9f358f5c4a9a1b756dbe7918d58884a0"},
|
||||
{file = "websockets-11.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:17eb1988d320e2f1f20e4a3523f1068a0bb08318ab123962fc99fd90c90ab0d6"},
|
||||
{file = "websockets-11.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:9873288db9c673a2ba9c0f7b59a130576c50fc75f3336a706fff686009c41631"},
|
||||
{file = "websockets-11.0-cp311-cp311-win32.whl", hash = "sha256:cf4ef6343478bf63098d3060fe06baf54d9c011b4b1b05e65e7957091cc87ef4"},
|
||||
{file = "websockets-11.0-cp311-cp311-win_amd64.whl", hash = "sha256:713cd5fc1fd40436495c90a259274e1a4a39416c65447a256434941ddaf2f424"},
|
||||
{file = "websockets-11.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:649ddddcbafd318d427b843425c92b1c035660c32507645c472c77356226cf07"},
|
||||
{file = "websockets-11.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:564c53d84b95da527e96778f2cc873ef186038924abee601f9e8f12ebda9ad46"},
|
||||
{file = "websockets-11.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:66d8df2db9801063e4093efe01458b1705c9f76382ad32617c005eeeb201a730"},
|
||||
{file = "websockets-11.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bbcd876ed166a82d250fcf012b729315489e9d653cb659c2e013c19daba2eb8f"},
|
||||
{file = "websockets-11.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:cb00963b49d343210ebbdbe69a35004fbecad73da2158e83d481cd2a6716cf19"},
|
||||
{file = "websockets-11.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:3d6f7c2f822e439f47f3492ee3e48c87c7d134d619a42c6dba1a318504501bfb"},
|
||||
{file = "websockets-11.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:c4b2ae9c0f1acec5d2f8000eb496eebb9db19055a63716ee166cf0694b945982"},
|
||||
{file = "websockets-11.0-cp37-cp37m-win32.whl", hash = "sha256:2b363e0f9b4247a0c7482e22c70ef39fb3259a14f7c0791c9200b93145f60b4b"},
|
||||
{file = "websockets-11.0-cp37-cp37m-win_amd64.whl", hash = "sha256:3d372c3426f165a0a22be9250526b1cd12e3556e80b4b2afaa6fd6649c99b086"},
|
||||
{file = "websockets-11.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:7eb914d37e0574246c63b995f9ca8d7bb7c2f2d53a8d4e9b00200ea856aa43c4"},
|
||||
{file = "websockets-11.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:a8717a5f3a00cde308e2971064bd5fcb14e0cc08f8234b97f4eb92b505ea95d4"},
|
||||
{file = "websockets-11.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:a17151722349c4af221616cca2f28e79237738bfbc53e7155240e2a8a7cc02f4"},
|
||||
{file = "websockets-11.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a4b60686d9b2ba500847c045595eb5887f4cca7102b4615773b6f490aa611107"},
|
||||
{file = "websockets-11.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:eededf25ef6b838e650eeeb1511804b82e9ece566fe6cdc11aa909d2992dcdaf"},
|
||||
{file = "websockets-11.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7587f339f016f0e1b0b6f013e98c83e382c5929774f2b8234c1b2d3f01dd1339"},
|
||||
{file = "websockets-11.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:26369646078e16e7364729ed3e3b1a4315ab1a22ca3c48b4e25dea48fcc1a881"},
|
||||
{file = "websockets-11.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:92f51fbe87381ff76c1791dd44d599152b400f1adfa8453613f1ff6857200ee7"},
|
||||
{file = "websockets-11.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:b5bb04a77c326d727c0b986c37a76147916d79db95629267307d1be47788a020"},
|
||||
{file = "websockets-11.0-cp38-cp38-win32.whl", hash = "sha256:50ac95111009178e58b9a25aa51702cdaad4ed843b98eb9b58d69b323ccb224e"},
|
||||
{file = "websockets-11.0-cp38-cp38-win_amd64.whl", hash = "sha256:7a4076cd6a3678def988668fc4b1779da598e1e5c9fa26319af5499f00c23e1c"},
|
||||
{file = "websockets-11.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:26559e8a385f71ce2a58f3bb1d005ddd3db7d3328ddbfbff1034f4039d46c4ec"},
|
||||
{file = "websockets-11.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:f10d283697dec8d91fa983eb8e217c9cac27bc1032057768129b89780009318e"},
|
||||
{file = "websockets-11.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:f74efe229e078bf5595e207e9a7b135ff37a10858263ed86be66003c4c98d47b"},
|
||||
{file = "websockets-11.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f048c88bfcc5bf0e038630cfb970b2c479f913819fd9653db920eef3b105a2b1"},
|
||||
{file = "websockets-11.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ceab6c1827fa14ad10c6b0806941d577b21d17012a3648787ac2b946182285b4"},
|
||||
{file = "websockets-11.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:817227e23897808c4bb621da7f57b1f83ee18345bdc44f5c9c1bbd3a094a73f6"},
|
||||
{file = "websockets-11.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:6fdcc17348d8697c1f88bba38680cca94131f2a9db727a61fe067284e1e59e8d"},
|
||||
{file = "websockets-11.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:8b21ad915b747075f29fe2fa5590111d98988d6730d2cd212acfe52bbe6a2545"},
|
||||
{file = "websockets-11.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:9ae401ad881d5329062b9b2d8160f0b2a147430974f2a3f32e6cedadddc2d634"},
|
||||
{file = "websockets-11.0-cp39-cp39-win32.whl", hash = "sha256:ee84660927293f449760badfe010e06409edb99d72e1910e2e404d2eeff6990f"},
|
||||
{file = "websockets-11.0-cp39-cp39-win_amd64.whl", hash = "sha256:2b4e704a9dac1faf4994e63dceae9e2f504913ff0f865bd3e5a097cbd5874a8f"},
|
||||
{file = "websockets-11.0-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:c2d6429c9bcd70ed8126a1f9ca6069e4ab95c96a3cc141fc84ce02917f7b45ec"},
|
||||
{file = "websockets-11.0-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ff3f67567862a853af2c0db362ede8249be50c576cd9eaf380736c6fce840414"},
|
||||
{file = "websockets-11.0-pp37-pypy37_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b86ce3d17bcc4b6556b2a2e1277beed74ff6b1de23f002f9763e9875e8ba361d"},
|
||||
{file = "websockets-11.0-pp37-pypy37_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:59c4b458cc09ea6470a5eee98b06ccaa84f2a193b92e337a879612614df0f8eb"},
|
||||
{file = "websockets-11.0-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:e5e21aeb350906dfcff321bfa6c60541a1d05cadb6d431ecf9d6376365be60d4"},
|
||||
{file = "websockets-11.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:8731189f6985b239a6c34a353c36b45cb3c9fed1c287fbcf7f61df9e4a7ac392"},
|
||||
{file = "websockets-11.0-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ee3aa7660ae0d3a4e47517bb5a545b9a02ff7b9632a640f617e755990ef65f66"},
|
||||
{file = "websockets-11.0-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:027aabfd053715ce0f5f6fc5107e5093e05b3c94fa555fb65375aa09cb845a66"},
|
||||
{file = "websockets-11.0-pp38-pypy38_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1e8c729aa179ef105f096cad12070aef230be9e2ae509eb47c3cdd9257213c14"},
|
||||
{file = "websockets-11.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:ff607c6e16409ac83f1ae59cc96167fead577bc652e8dff48f7458ce082372ff"},
|
||||
{file = "websockets-11.0-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:ca3d7c08f472c40f28bb9fb99610d28dc97137612ab5308f80dac7ce79f87fe1"},
|
||||
{file = "websockets-11.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3f179deef8288dd8ec227d644ba5b711609093b634008643561f6d9c74938c3c"},
|
||||
{file = "websockets-11.0-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:269d33f1573a31130da9afd63a2558f60131522d3fe86d0aa2d1612ad065d27c"},
|
||||
{file = "websockets-11.0-pp39-pypy39_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eb0b306c1180d0268341447982b415aca7c072c84b4a59688dbc1d7d2ec25df9"},
|
||||
{file = "websockets-11.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:6ae209f11e433575e17d5d6e61a2f77ceda53b4bce07df55af614aa1d618e2e7"},
|
||||
{file = "websockets-11.0-py3-none-any.whl", hash = "sha256:6ebd971b9b2c0aaa2188c472016e4dad93108b3db425a33ad584bdc41b22026d"},
|
||||
{file = "websockets-11.0.tar.gz", hash = "sha256:19d638549c470f5fd3b67b52b2a08f2edba5a04e05323a706937e35f5f19d056"},
|
||||
{file = "websockets-11.0.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:3ccc8a0c387629aec40f2fc9fdcb4b9d5431954f934da3eaf16cdc94f67dbfac"},
|
||||
{file = "websockets-11.0.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d67ac60a307f760c6e65dad586f556dde58e683fab03323221a4e530ead6f74d"},
|
||||
{file = "websockets-11.0.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:84d27a4832cc1a0ee07cdcf2b0629a8a72db73f4cf6de6f0904f6661227f256f"},
|
||||
{file = "websockets-11.0.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ffd7dcaf744f25f82190856bc26ed81721508fc5cbf2a330751e135ff1283564"},
|
||||
{file = "websockets-11.0.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7622a89d696fc87af8e8d280d9b421db5133ef5b29d3f7a1ce9f1a7bf7fcfa11"},
|
||||
{file = "websockets-11.0.3-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bceab846bac555aff6427d060f2fcfff71042dba6f5fca7dc4f75cac815e57ca"},
|
||||
{file = "websockets-11.0.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:54c6e5b3d3a8936a4ab6870d46bdd6ec500ad62bde9e44462c32d18f1e9a8e54"},
|
||||
{file = "websockets-11.0.3-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:41f696ba95cd92dc047e46b41b26dd24518384749ed0d99bea0a941ca87404c4"},
|
||||
{file = "websockets-11.0.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:86d2a77fd490ae3ff6fae1c6ceaecad063d3cc2320b44377efdde79880e11526"},
|
||||
{file = "websockets-11.0.3-cp310-cp310-win32.whl", hash = "sha256:2d903ad4419f5b472de90cd2d40384573b25da71e33519a67797de17ef849b69"},
|
||||
{file = "websockets-11.0.3-cp310-cp310-win_amd64.whl", hash = "sha256:1d2256283fa4b7f4c7d7d3e84dc2ece74d341bce57d5b9bf385df109c2a1a82f"},
|
||||
{file = "websockets-11.0.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:e848f46a58b9fcf3d06061d17be388caf70ea5b8cc3466251963c8345e13f7eb"},
|
||||
{file = "websockets-11.0.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:aa5003845cdd21ac0dc6c9bf661c5beddd01116f6eb9eb3c8e272353d45b3288"},
|
||||
{file = "websockets-11.0.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:b58cbf0697721120866820b89f93659abc31c1e876bf20d0b3d03cef14faf84d"},
|
||||
{file = "websockets-11.0.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:660e2d9068d2bedc0912af508f30bbeb505bbbf9774d98def45f68278cea20d3"},
|
||||
{file = "websockets-11.0.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c1f0524f203e3bd35149f12157438f406eff2e4fb30f71221c8a5eceb3617b6b"},
|
||||
{file = "websockets-11.0.3-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:def07915168ac8f7853812cc593c71185a16216e9e4fa886358a17ed0fd9fcf6"},
|
||||
{file = "websockets-11.0.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:b30c6590146e53149f04e85a6e4fcae068df4289e31e4aee1fdf56a0dead8f97"},
|
||||
{file = "websockets-11.0.3-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:619d9f06372b3a42bc29d0cd0354c9bb9fb39c2cbc1a9c5025b4538738dbffaf"},
|
||||
{file = "websockets-11.0.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:01f5567d9cf6f502d655151645d4e8b72b453413d3819d2b6f1185abc23e82dd"},
|
||||
{file = "websockets-11.0.3-cp311-cp311-win32.whl", hash = "sha256:e1459677e5d12be8bbc7584c35b992eea142911a6236a3278b9b5ce3326f282c"},
|
||||
{file = "websockets-11.0.3-cp311-cp311-win_amd64.whl", hash = "sha256:e7837cb169eca3b3ae94cc5787c4fed99eef74c0ab9506756eea335e0d6f3ed8"},
|
||||
{file = "websockets-11.0.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:9f59a3c656fef341a99e3d63189852be7084c0e54b75734cde571182c087b152"},
|
||||
{file = "websockets-11.0.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2529338a6ff0eb0b50c7be33dc3d0e456381157a31eefc561771ee431134a97f"},
|
||||
{file = "websockets-11.0.3-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:34fd59a4ac42dff6d4681d8843217137f6bc85ed29722f2f7222bd619d15e95b"},
|
||||
{file = "websockets-11.0.3-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:332d126167ddddec94597c2365537baf9ff62dfcc9db4266f263d455f2f031cb"},
|
||||
{file = "websockets-11.0.3-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:6505c1b31274723ccaf5f515c1824a4ad2f0d191cec942666b3d0f3aa4cb4007"},
|
||||
{file = "websockets-11.0.3-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:f467ba0050b7de85016b43f5a22b46383ef004c4f672148a8abf32bc999a87f0"},
|
||||
{file = "websockets-11.0.3-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:9d9acd80072abcc98bd2c86c3c9cd4ac2347b5a5a0cae7ed5c0ee5675f86d9af"},
|
||||
{file = "websockets-11.0.3-cp37-cp37m-win32.whl", hash = "sha256:e590228200fcfc7e9109509e4d9125eace2042fd52b595dd22bbc34bb282307f"},
|
||||
{file = "websockets-11.0.3-cp37-cp37m-win_amd64.whl", hash = "sha256:b16fff62b45eccb9c7abb18e60e7e446998093cdcb50fed33134b9b6878836de"},
|
||||
{file = "websockets-11.0.3-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:fb06eea71a00a7af0ae6aefbb932fb8a7df3cb390cc217d51a9ad7343de1b8d0"},
|
||||
{file = "websockets-11.0.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:8a34e13a62a59c871064dfd8ffb150867e54291e46d4a7cf11d02c94a5275bae"},
|
||||
{file = "websockets-11.0.3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:4841ed00f1026dfbced6fca7d963c4e7043aa832648671b5138008dc5a8f6d99"},
|
||||
{file = "websockets-11.0.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1a073fc9ab1c8aff37c99f11f1641e16da517770e31a37265d2755282a5d28aa"},
|
||||
{file = "websockets-11.0.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:68b977f21ce443d6d378dbd5ca38621755f2063d6fdb3335bda981d552cfff86"},
|
||||
{file = "websockets-11.0.3-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e1a99a7a71631f0efe727c10edfba09ea6bee4166a6f9c19aafb6c0b5917d09c"},
|
||||
{file = "websockets-11.0.3-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:bee9fcb41db2a23bed96c6b6ead6489702c12334ea20a297aa095ce6d31370d0"},
|
||||
{file = "websockets-11.0.3-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:4b253869ea05a5a073ebfdcb5cb3b0266a57c3764cf6fe114e4cd90f4bfa5f5e"},
|
||||
{file = "websockets-11.0.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:1553cb82942b2a74dd9b15a018dce645d4e68674de2ca31ff13ebc2d9f283788"},
|
||||
{file = "websockets-11.0.3-cp38-cp38-win32.whl", hash = "sha256:f61bdb1df43dc9c131791fbc2355535f9024b9a04398d3bd0684fc16ab07df74"},
|
||||
{file = "websockets-11.0.3-cp38-cp38-win_amd64.whl", hash = "sha256:03aae4edc0b1c68498f41a6772d80ac7c1e33c06c6ffa2ac1c27a07653e79d6f"},
|
||||
{file = "websockets-11.0.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:777354ee16f02f643a4c7f2b3eff8027a33c9861edc691a2003531f5da4f6bc8"},
|
||||
{file = "websockets-11.0.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:8c82f11964f010053e13daafdc7154ce7385ecc538989a354ccc7067fd7028fd"},
|
||||
{file = "websockets-11.0.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:3580dd9c1ad0701169e4d6fc41e878ffe05e6bdcaf3c412f9d559389d0c9e016"},
|
||||
{file = "websockets-11.0.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6f1a3f10f836fab6ca6efa97bb952300b20ae56b409414ca85bff2ad241d2a61"},
|
||||
{file = "websockets-11.0.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:df41b9bc27c2c25b486bae7cf42fccdc52ff181c8c387bfd026624a491c2671b"},
|
||||
{file = "websockets-11.0.3-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:279e5de4671e79a9ac877427f4ac4ce93751b8823f276b681d04b2156713b9dd"},
|
||||
{file = "websockets-11.0.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:1fdf26fa8a6a592f8f9235285b8affa72748dc12e964a5518c6c5e8f916716f7"},
|
||||
{file = "websockets-11.0.3-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:69269f3a0b472e91125b503d3c0b3566bda26da0a3261c49f0027eb6075086d1"},
|
||||
{file = "websockets-11.0.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:97b52894d948d2f6ea480171a27122d77af14ced35f62e5c892ca2fae9344311"},
|
||||
{file = "websockets-11.0.3-cp39-cp39-win32.whl", hash = "sha256:c7f3cb904cce8e1be667c7e6fef4516b98d1a6a0635a58a57528d577ac18a128"},
|
||||
{file = "websockets-11.0.3-cp39-cp39-win_amd64.whl", hash = "sha256:c792ea4eabc0159535608fc5658a74d1a81020eb35195dd63214dcf07556f67e"},
|
||||
{file = "websockets-11.0.3-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:f2e58f2c36cc52d41f2659e4c0cbf7353e28c8c9e63e30d8c6d3494dc9fdedcf"},
|
||||
{file = "websockets-11.0.3-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:de36fe9c02995c7e6ae6efe2e205816f5f00c22fd1fbf343d4d18c3d5ceac2f5"},
|
||||
{file = "websockets-11.0.3-pp37-pypy37_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0ac56b661e60edd453585f4bd68eb6a29ae25b5184fd5ba51e97652580458998"},
|
||||
{file = "websockets-11.0.3-pp37-pypy37_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e052b8467dd07d4943936009f46ae5ce7b908ddcac3fda581656b1b19c083d9b"},
|
||||
{file = "websockets-11.0.3-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:42cc5452a54a8e46a032521d7365da775823e21bfba2895fb7b77633cce031bb"},
|
||||
{file = "websockets-11.0.3-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:e6316827e3e79b7b8e7d8e3b08f4e331af91a48e794d5d8b099928b6f0b85f20"},
|
||||
{file = "websockets-11.0.3-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8531fdcad636d82c517b26a448dcfe62f720e1922b33c81ce695d0edb91eb931"},
|
||||
{file = "websockets-11.0.3-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c114e8da9b475739dde229fd3bc6b05a6537a88a578358bc8eb29b4030fac9c9"},
|
||||
{file = "websockets-11.0.3-pp38-pypy38_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e063b1865974611313a3849d43f2c3f5368093691349cf3c7c8f8f75ad7cb280"},
|
||||
{file = "websockets-11.0.3-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:92b2065d642bf8c0a82d59e59053dd2fdde64d4ed44efe4870fa816c1232647b"},
|
||||
{file = "websockets-11.0.3-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:0ee68fe502f9031f19d495dae2c268830df2760c0524cbac5d759921ba8c8e82"},
|
||||
{file = "websockets-11.0.3-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dcacf2c7a6c3a84e720d1bb2b543c675bf6c40e460300b628bab1b1efc7c034c"},
|
||||
{file = "websockets-11.0.3-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b67c6f5e5a401fc56394f191f00f9b3811fe843ee93f4a70df3c389d1adf857d"},
|
||||
{file = "websockets-11.0.3-pp39-pypy39_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1d5023a4b6a5b183dc838808087033ec5df77580485fc533e7dab2567851b0a4"},
|
||||
{file = "websockets-11.0.3-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:ed058398f55163a79bb9f06a90ef9ccc063b204bb346c4de78efc5d15abfe602"},
|
||||
{file = "websockets-11.0.3-py3-none-any.whl", hash = "sha256:6681ba9e7f8f3b19440921e99efbb40fc89f26cd71bf539e45d8c8a25c976dc6"},
|
||||
{file = "websockets-11.0.3.tar.gz", hash = "sha256:88fc51d9a26b10fc331be344f1781224a375b78488fc343620184e95a4b27016"},
|
||||
]
|
||||
|
||||
[[package]]
|
||||
|
@ -3698,86 +3738,86 @@ files = [
|
|||
|
||||
[[package]]
|
||||
name = "yarl"
|
||||
version = "1.8.2"
|
||||
version = "1.9.2"
|
||||
description = "Yet another URL library"
|
||||
category = "main"
|
||||
optional = false
|
||||
python-versions = ">=3.7"
|
||||
files = [
|
||||
{file = "yarl-1.8.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:bb81f753c815f6b8e2ddd2eef3c855cf7da193b82396ac013c661aaa6cc6b0a5"},
|
||||
{file = "yarl-1.8.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:47d49ac96156f0928f002e2424299b2c91d9db73e08c4cd6742923a086f1c863"},
|
||||
{file = "yarl-1.8.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:3fc056e35fa6fba63248d93ff6e672c096f95f7836938241ebc8260e062832fe"},
|
||||
{file = "yarl-1.8.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:58a3c13d1c3005dbbac5c9f0d3210b60220a65a999b1833aa46bd6677c69b08e"},
|
||||
{file = "yarl-1.8.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:10b08293cda921157f1e7c2790999d903b3fd28cd5c208cf8826b3b508026996"},
|
||||
{file = "yarl-1.8.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:de986979bbd87272fe557e0a8fcb66fd40ae2ddfe28a8b1ce4eae22681728fef"},
|
||||
{file = "yarl-1.8.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c4fcfa71e2c6a3cb568cf81aadc12768b9995323186a10827beccf5fa23d4f8"},
|
||||
{file = "yarl-1.8.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ae4d7ff1049f36accde9e1ef7301912a751e5bae0a9d142459646114c70ecba6"},
|
||||
{file = "yarl-1.8.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:bf071f797aec5b96abfc735ab97da9fd8f8768b43ce2abd85356a3127909d146"},
|
||||
{file = "yarl-1.8.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:74dece2bfc60f0f70907c34b857ee98f2c6dd0f75185db133770cd67300d505f"},
|
||||
{file = "yarl-1.8.2-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:df60a94d332158b444301c7f569659c926168e4d4aad2cfbf4bce0e8fb8be826"},
|
||||
{file = "yarl-1.8.2-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:63243b21c6e28ec2375f932a10ce7eda65139b5b854c0f6b82ed945ba526bff3"},
|
||||
{file = "yarl-1.8.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:cfa2bbca929aa742b5084fd4663dd4b87c191c844326fcb21c3afd2d11497f80"},
|
||||
{file = "yarl-1.8.2-cp310-cp310-win32.whl", hash = "sha256:b05df9ea7496df11b710081bd90ecc3a3db6adb4fee36f6a411e7bc91a18aa42"},
|
||||
{file = "yarl-1.8.2-cp310-cp310-win_amd64.whl", hash = "sha256:24ad1d10c9db1953291f56b5fe76203977f1ed05f82d09ec97acb623a7976574"},
|
||||
{file = "yarl-1.8.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:2a1fca9588f360036242f379bfea2b8b44cae2721859b1c56d033adfd5893634"},
|
||||
{file = "yarl-1.8.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:f37db05c6051eff17bc832914fe46869f8849de5b92dc4a3466cd63095d23dfd"},
|
||||
{file = "yarl-1.8.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:77e913b846a6b9c5f767b14dc1e759e5aff05502fe73079f6f4176359d832581"},
|
||||
{file = "yarl-1.8.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0978f29222e649c351b173da2b9b4665ad1feb8d1daa9d971eb90df08702668a"},
|
||||
{file = "yarl-1.8.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:388a45dc77198b2460eac0aca1efd6a7c09e976ee768b0d5109173e521a19daf"},
|
||||
{file = "yarl-1.8.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2305517e332a862ef75be8fad3606ea10108662bc6fe08509d5ca99503ac2aee"},
|
||||
{file = "yarl-1.8.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:42430ff511571940d51e75cf42f1e4dbdded477e71c1b7a17f4da76c1da8ea76"},
|
||||
{file = "yarl-1.8.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3150078118f62371375e1e69b13b48288e44f6691c1069340081c3fd12c94d5b"},
|
||||
{file = "yarl-1.8.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:c15163b6125db87c8f53c98baa5e785782078fbd2dbeaa04c6141935eb6dab7a"},
|
||||
{file = "yarl-1.8.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:4d04acba75c72e6eb90745447d69f84e6c9056390f7a9724605ca9c56b4afcc6"},
|
||||
{file = "yarl-1.8.2-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:e7fd20d6576c10306dea2d6a5765f46f0ac5d6f53436217913e952d19237efc4"},
|
||||
{file = "yarl-1.8.2-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:75c16b2a900b3536dfc7014905a128a2bea8fb01f9ee26d2d7d8db0a08e7cb2c"},
|
||||
{file = "yarl-1.8.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:6d88056a04860a98341a0cf53e950e3ac9f4e51d1b6f61a53b0609df342cc8b2"},
|
||||
{file = "yarl-1.8.2-cp311-cp311-win32.whl", hash = "sha256:fb742dcdd5eec9f26b61224c23baea46c9055cf16f62475e11b9b15dfd5c117b"},
|
||||
{file = "yarl-1.8.2-cp311-cp311-win_amd64.whl", hash = "sha256:8c46d3d89902c393a1d1e243ac847e0442d0196bbd81aecc94fcebbc2fd5857c"},
|
||||
{file = "yarl-1.8.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:ceff9722e0df2e0a9e8a79c610842004fa54e5b309fe6d218e47cd52f791d7ef"},
|
||||
{file = "yarl-1.8.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3f6b4aca43b602ba0f1459de647af954769919c4714706be36af670a5f44c9c1"},
|
||||
{file = "yarl-1.8.2-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1684a9bd9077e922300ecd48003ddae7a7474e0412bea38d4631443a91d61077"},
|
||||
{file = "yarl-1.8.2-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ebb78745273e51b9832ef90c0898501006670d6e059f2cdb0e999494eb1450c2"},
|
||||
{file = "yarl-1.8.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3adeef150d528ded2a8e734ebf9ae2e658f4c49bf413f5f157a470e17a4a2e89"},
|
||||
{file = "yarl-1.8.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:57a7c87927a468e5a1dc60c17caf9597161d66457a34273ab1760219953f7f4c"},
|
||||
{file = "yarl-1.8.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:efff27bd8cbe1f9bd127e7894942ccc20c857aa8b5a0327874f30201e5ce83d0"},
|
||||
{file = "yarl-1.8.2-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:a783cd344113cb88c5ff7ca32f1f16532a6f2142185147822187913eb989f739"},
|
||||
{file = "yarl-1.8.2-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:705227dccbe96ab02c7cb2c43e1228e2826e7ead880bb19ec94ef279e9555b5b"},
|
||||
{file = "yarl-1.8.2-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:34c09b43bd538bf6c4b891ecce94b6fa4f1f10663a8d4ca589a079a5018f6ed7"},
|
||||
{file = "yarl-1.8.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:a48f4f7fea9a51098b02209d90297ac324241bf37ff6be6d2b0149ab2bd51b37"},
|
||||
{file = "yarl-1.8.2-cp37-cp37m-win32.whl", hash = "sha256:0414fd91ce0b763d4eadb4456795b307a71524dbacd015c657bb2a39db2eab89"},
|
||||
{file = "yarl-1.8.2-cp37-cp37m-win_amd64.whl", hash = "sha256:d881d152ae0007809c2c02e22aa534e702f12071e6b285e90945aa3c376463c5"},
|
||||
{file = "yarl-1.8.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:5df5e3d04101c1e5c3b1d69710b0574171cc02fddc4b23d1b2813e75f35a30b1"},
|
||||
{file = "yarl-1.8.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:7a66c506ec67eb3159eea5096acd05f5e788ceec7b96087d30c7d2865a243918"},
|
||||
{file = "yarl-1.8.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:2b4fa2606adf392051d990c3b3877d768771adc3faf2e117b9de7eb977741229"},
|
||||
{file = "yarl-1.8.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1e21fb44e1eff06dd6ef971d4bdc611807d6bd3691223d9c01a18cec3677939e"},
|
||||
{file = "yarl-1.8.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:93202666046d9edadfe9f2e7bf5e0782ea0d497b6d63da322e541665d65a044e"},
|
||||
{file = "yarl-1.8.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:fc77086ce244453e074e445104f0ecb27530d6fd3a46698e33f6c38951d5a0f1"},
|
||||
{file = "yarl-1.8.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:64dd68a92cab699a233641f5929a40f02a4ede8c009068ca8aa1fe87b8c20ae3"},
|
||||
{file = "yarl-1.8.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1b372aad2b5f81db66ee7ec085cbad72c4da660d994e8e590c997e9b01e44901"},
|
||||
{file = "yarl-1.8.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:e6f3515aafe0209dd17fb9bdd3b4e892963370b3de781f53e1746a521fb39fc0"},
|
||||
{file = "yarl-1.8.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:dfef7350ee369197106805e193d420b75467b6cceac646ea5ed3049fcc950a05"},
|
||||
{file = "yarl-1.8.2-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:728be34f70a190566d20aa13dc1f01dc44b6aa74580e10a3fb159691bc76909d"},
|
||||
{file = "yarl-1.8.2-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:ff205b58dc2929191f68162633d5e10e8044398d7a45265f90a0f1d51f85f72c"},
|
||||
{file = "yarl-1.8.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:baf211dcad448a87a0d9047dc8282d7de59473ade7d7fdf22150b1d23859f946"},
|
||||
{file = "yarl-1.8.2-cp38-cp38-win32.whl", hash = "sha256:272b4f1599f1b621bf2aabe4e5b54f39a933971f4e7c9aa311d6d7dc06965165"},
|
||||
{file = "yarl-1.8.2-cp38-cp38-win_amd64.whl", hash = "sha256:326dd1d3caf910cd26a26ccbfb84c03b608ba32499b5d6eeb09252c920bcbe4f"},
|
||||
{file = "yarl-1.8.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:f8ca8ad414c85bbc50f49c0a106f951613dfa5f948ab69c10ce9b128d368baf8"},
|
||||
{file = "yarl-1.8.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:418857f837347e8aaef682679f41e36c24250097f9e2f315d39bae3a99a34cbf"},
|
||||
{file = "yarl-1.8.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ae0eec05ab49e91a78700761777f284c2df119376e391db42c38ab46fd662b77"},
|
||||
{file = "yarl-1.8.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:009a028127e0a1755c38b03244c0bea9d5565630db9c4cf9572496e947137a87"},
|
||||
{file = "yarl-1.8.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3edac5d74bb3209c418805bda77f973117836e1de7c000e9755e572c1f7850d0"},
|
||||
{file = "yarl-1.8.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:da65c3f263729e47351261351b8679c6429151ef9649bba08ef2528ff2c423b2"},
|
||||
{file = "yarl-1.8.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0ef8fb25e52663a1c85d608f6dd72e19bd390e2ecaf29c17fb08f730226e3a08"},
|
||||
{file = "yarl-1.8.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bcd7bb1e5c45274af9a1dd7494d3c52b2be5e6bd8d7e49c612705fd45420b12d"},
|
||||
{file = "yarl-1.8.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:44ceac0450e648de86da8e42674f9b7077d763ea80c8ceb9d1c3e41f0f0a9951"},
|
||||
{file = "yarl-1.8.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:97209cc91189b48e7cfe777237c04af8e7cc51eb369004e061809bcdf4e55220"},
|
||||
{file = "yarl-1.8.2-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:48dd18adcf98ea9cd721a25313aef49d70d413a999d7d89df44f469edfb38a06"},
|
||||
{file = "yarl-1.8.2-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:e59399dda559688461762800d7fb34d9e8a6a7444fd76ec33220a926c8be1516"},
|
||||
{file = "yarl-1.8.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:d617c241c8c3ad5c4e78a08429fa49e4b04bedfc507b34b4d8dceb83b4af3588"},
|
||||
{file = "yarl-1.8.2-cp39-cp39-win32.whl", hash = "sha256:cb6d48d80a41f68de41212f3dfd1a9d9898d7841c8f7ce6696cf2fd9cb57ef83"},
|
||||
{file = "yarl-1.8.2-cp39-cp39-win_amd64.whl", hash = "sha256:6604711362f2dbf7160df21c416f81fac0de6dbcf0b5445a2ef25478ecc4c778"},
|
||||
{file = "yarl-1.8.2.tar.gz", hash = "sha256:49d43402c6e3013ad0978602bf6bf5328535c48d192304b91b97a3c6790b1562"},
|
||||
{file = "yarl-1.9.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:8c2ad583743d16ddbdf6bb14b5cd76bf43b0d0006e918809d5d4ddf7bde8dd82"},
|
||||
{file = "yarl-1.9.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:82aa6264b36c50acfb2424ad5ca537a2060ab6de158a5bd2a72a032cc75b9eb8"},
|
||||
{file = "yarl-1.9.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c0c77533b5ed4bcc38e943178ccae29b9bcf48ffd1063f5821192f23a1bd27b9"},
|
||||
{file = "yarl-1.9.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ee4afac41415d52d53a9833ebae7e32b344be72835bbb589018c9e938045a560"},
|
||||
{file = "yarl-1.9.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9bf345c3a4f5ba7f766430f97f9cc1320786f19584acc7086491f45524a551ac"},
|
||||
{file = "yarl-1.9.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2a96c19c52ff442a808c105901d0bdfd2e28575b3d5f82e2f5fd67e20dc5f4ea"},
|
||||
{file = "yarl-1.9.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:891c0e3ec5ec881541f6c5113d8df0315ce5440e244a716b95f2525b7b9f3608"},
|
||||
{file = "yarl-1.9.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c3a53ba34a636a256d767c086ceb111358876e1fb6b50dfc4d3f4951d40133d5"},
|
||||
{file = "yarl-1.9.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:566185e8ebc0898b11f8026447eacd02e46226716229cea8db37496c8cdd26e0"},
|
||||
{file = "yarl-1.9.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:2b0738fb871812722a0ac2154be1f049c6223b9f6f22eec352996b69775b36d4"},
|
||||
{file = "yarl-1.9.2-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:32f1d071b3f362c80f1a7d322bfd7b2d11e33d2adf395cc1dd4df36c9c243095"},
|
||||
{file = "yarl-1.9.2-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:e9fdc7ac0d42bc3ea78818557fab03af6181e076a2944f43c38684b4b6bed8e3"},
|
||||
{file = "yarl-1.9.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:56ff08ab5df8429901ebdc5d15941b59f6253393cb5da07b4170beefcf1b2528"},
|
||||
{file = "yarl-1.9.2-cp310-cp310-win32.whl", hash = "sha256:8ea48e0a2f931064469bdabca50c2f578b565fc446f302a79ba6cc0ee7f384d3"},
|
||||
{file = "yarl-1.9.2-cp310-cp310-win_amd64.whl", hash = "sha256:50f33040f3836e912ed16d212f6cc1efb3231a8a60526a407aeb66c1c1956dde"},
|
||||
{file = "yarl-1.9.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:646d663eb2232d7909e6601f1a9107e66f9791f290a1b3dc7057818fe44fc2b6"},
|
||||
{file = "yarl-1.9.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:aff634b15beff8902d1f918012fc2a42e0dbae6f469fce134c8a0dc51ca423bb"},
|
||||
{file = "yarl-1.9.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a83503934c6273806aed765035716216cc9ab4e0364f7f066227e1aaea90b8d0"},
|
||||
{file = "yarl-1.9.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b25322201585c69abc7b0e89e72790469f7dad90d26754717f3310bfe30331c2"},
|
||||
{file = "yarl-1.9.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:22a94666751778629f1ec4280b08eb11815783c63f52092a5953faf73be24191"},
|
||||
{file = "yarl-1.9.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8ec53a0ea2a80c5cd1ab397925f94bff59222aa3cf9c6da938ce05c9ec20428d"},
|
||||
{file = "yarl-1.9.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:159d81f22d7a43e6eabc36d7194cb53f2f15f498dbbfa8edc8a3239350f59fe7"},
|
||||
{file = "yarl-1.9.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:832b7e711027c114d79dffb92576acd1bd2decc467dec60e1cac96912602d0e6"},
|
||||
{file = "yarl-1.9.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:95d2ecefbcf4e744ea952d073c6922e72ee650ffc79028eb1e320e732898d7e8"},
|
||||
{file = "yarl-1.9.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:d4e2c6d555e77b37288eaf45b8f60f0737c9efa3452c6c44626a5455aeb250b9"},
|
||||
{file = "yarl-1.9.2-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:783185c75c12a017cc345015ea359cc801c3b29a2966c2655cd12b233bf5a2be"},
|
||||
{file = "yarl-1.9.2-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:b8cc1863402472f16c600e3e93d542b7e7542a540f95c30afd472e8e549fc3f7"},
|
||||
{file = "yarl-1.9.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:822b30a0f22e588b32d3120f6d41e4ed021806418b4c9f0bc3048b8c8cb3f92a"},
|
||||
{file = "yarl-1.9.2-cp311-cp311-win32.whl", hash = "sha256:a60347f234c2212a9f0361955007fcf4033a75bf600a33c88a0a8e91af77c0e8"},
|
||||
{file = "yarl-1.9.2-cp311-cp311-win_amd64.whl", hash = "sha256:be6b3fdec5c62f2a67cb3f8c6dbf56bbf3f61c0f046f84645cd1ca73532ea051"},
|
||||
{file = "yarl-1.9.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:38a3928ae37558bc1b559f67410df446d1fbfa87318b124bf5032c31e3447b74"},
|
||||
{file = "yarl-1.9.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ac9bb4c5ce3975aeac288cfcb5061ce60e0d14d92209e780c93954076c7c4367"},
|
||||
{file = "yarl-1.9.2-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3da8a678ca8b96c8606bbb8bfacd99a12ad5dd288bc6f7979baddd62f71c63ef"},
|
||||
{file = "yarl-1.9.2-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:13414591ff516e04fcdee8dc051c13fd3db13b673c7a4cb1350e6b2ad9639ad3"},
|
||||
{file = "yarl-1.9.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bf74d08542c3a9ea97bb8f343d4fcbd4d8f91bba5ec9d5d7f792dbe727f88938"},
|
||||
{file = "yarl-1.9.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6e7221580dc1db478464cfeef9b03b95c5852cc22894e418562997df0d074ccc"},
|
||||
{file = "yarl-1.9.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:494053246b119b041960ddcd20fd76224149cfea8ed8777b687358727911dd33"},
|
||||
{file = "yarl-1.9.2-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:52a25809fcbecfc63ac9ba0c0fb586f90837f5425edfd1ec9f3372b119585e45"},
|
||||
{file = "yarl-1.9.2-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:e65610c5792870d45d7b68c677681376fcf9cc1c289f23e8e8b39c1485384185"},
|
||||
{file = "yarl-1.9.2-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:1b1bba902cba32cdec51fca038fd53f8beee88b77efc373968d1ed021024cc04"},
|
||||
{file = "yarl-1.9.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:662e6016409828ee910f5d9602a2729a8a57d74b163c89a837de3fea050c7582"},
|
||||
{file = "yarl-1.9.2-cp37-cp37m-win32.whl", hash = "sha256:f364d3480bffd3aa566e886587eaca7c8c04d74f6e8933f3f2c996b7f09bee1b"},
|
||||
{file = "yarl-1.9.2-cp37-cp37m-win_amd64.whl", hash = "sha256:6a5883464143ab3ae9ba68daae8e7c5c95b969462bbe42e2464d60e7e2698368"},
|
||||
{file = "yarl-1.9.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:5610f80cf43b6202e2c33ba3ec2ee0a2884f8f423c8f4f62906731d876ef4fac"},
|
||||
{file = "yarl-1.9.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:b9a4e67ad7b646cd6f0938c7ebfd60e481b7410f574c560e455e938d2da8e0f4"},
|
||||
{file = "yarl-1.9.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:83fcc480d7549ccebe9415d96d9263e2d4226798c37ebd18c930fce43dfb9574"},
|
||||
{file = "yarl-1.9.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5fcd436ea16fee7d4207c045b1e340020e58a2597301cfbcfdbe5abd2356c2fb"},
|
||||
{file = "yarl-1.9.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:84e0b1599334b1e1478db01b756e55937d4614f8654311eb26012091be109d59"},
|
||||
{file = "yarl-1.9.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3458a24e4ea3fd8930e934c129b676c27452e4ebda80fbe47b56d8c6c7a63a9e"},
|
||||
{file = "yarl-1.9.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:838162460b3a08987546e881a2bfa573960bb559dfa739e7800ceeec92e64417"},
|
||||
{file = "yarl-1.9.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f4e2d08f07a3d7d3e12549052eb5ad3eab1c349c53ac51c209a0e5991bbada78"},
|
||||
{file = "yarl-1.9.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:de119f56f3c5f0e2fb4dee508531a32b069a5f2c6e827b272d1e0ff5ac040333"},
|
||||
{file = "yarl-1.9.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:149ddea5abf329752ea5051b61bd6c1d979e13fbf122d3a1f9f0c8be6cb6f63c"},
|
||||
{file = "yarl-1.9.2-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:674ca19cbee4a82c9f54e0d1eee28116e63bc6fd1e96c43031d11cbab8b2afd5"},
|
||||
{file = "yarl-1.9.2-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:9b3152f2f5677b997ae6c804b73da05a39daa6a9e85a512e0e6823d81cdad7cc"},
|
||||
{file = "yarl-1.9.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:5415d5a4b080dc9612b1b63cba008db84e908b95848369aa1da3686ae27b6d2b"},
|
||||
{file = "yarl-1.9.2-cp38-cp38-win32.whl", hash = "sha256:f7a3d8146575e08c29ed1cd287068e6d02f1c7bdff8970db96683b9591b86ee7"},
|
||||
{file = "yarl-1.9.2-cp38-cp38-win_amd64.whl", hash = "sha256:63c48f6cef34e6319a74c727376e95626f84ea091f92c0250a98e53e62c77c72"},
|
||||
{file = "yarl-1.9.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:75df5ef94c3fdc393c6b19d80e6ef1ecc9ae2f4263c09cacb178d871c02a5ba9"},
|
||||
{file = "yarl-1.9.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:c027a6e96ef77d401d8d5a5c8d6bc478e8042f1e448272e8d9752cb0aff8b5c8"},
|
||||
{file = "yarl-1.9.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:f3b078dbe227f79be488ffcfc7a9edb3409d018e0952cf13f15fd6512847f3f7"},
|
||||
{file = "yarl-1.9.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:59723a029760079b7d991a401386390c4be5bfec1e7dd83e25a6a0881859e716"},
|
||||
{file = "yarl-1.9.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b03917871bf859a81ccb180c9a2e6c1e04d2f6a51d953e6a5cdd70c93d4e5a2a"},
|
||||
{file = "yarl-1.9.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c1012fa63eb6c032f3ce5d2171c267992ae0c00b9e164efe4d73db818465fac3"},
|
||||
{file = "yarl-1.9.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a74dcbfe780e62f4b5a062714576f16c2f3493a0394e555ab141bf0d746bb955"},
|
||||
{file = "yarl-1.9.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8c56986609b057b4839968ba901944af91b8e92f1725d1a2d77cbac6972b9ed1"},
|
||||
{file = "yarl-1.9.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:2c315df3293cd521033533d242d15eab26583360b58f7ee5d9565f15fee1bef4"},
|
||||
{file = "yarl-1.9.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:b7232f8dfbd225d57340e441d8caf8652a6acd06b389ea2d3222b8bc89cbfca6"},
|
||||
{file = "yarl-1.9.2-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:53338749febd28935d55b41bf0bcc79d634881195a39f6b2f767870b72514caf"},
|
||||
{file = "yarl-1.9.2-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:066c163aec9d3d073dc9ffe5dd3ad05069bcb03fcaab8d221290ba99f9f69ee3"},
|
||||
{file = "yarl-1.9.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:8288d7cd28f8119b07dd49b7230d6b4562f9b61ee9a4ab02221060d21136be80"},
|
||||
{file = "yarl-1.9.2-cp39-cp39-win32.whl", hash = "sha256:b124e2a6d223b65ba8768d5706d103280914d61f5cae3afbc50fc3dfcc016623"},
|
||||
{file = "yarl-1.9.2-cp39-cp39-win_amd64.whl", hash = "sha256:61016e7d582bc46a5378ffdd02cd0314fb8ba52f40f9cf4d9a5e7dbef88dee18"},
|
||||
{file = "yarl-1.9.2.tar.gz", hash = "sha256:04ab9d4b9f587c06d801c2abfe9317b77cdf996c65a90d5e84ecc45010823571"},
|
||||
]
|
||||
|
||||
[package.dependencies]
|
||||
|
@ -3851,4 +3891,4 @@ testing = ["coverage (>=5.0.3)", "zope.event", "zope.testing"]
|
|||
[metadata]
|
||||
lock-version = "2.0"
|
||||
python-versions = "^3.8"
|
||||
content-hash = "d83c7f834086b51767b0a447dcfec83d0531474d1119672db56275d1b8e31709"
|
||||
content-hash = "be4da5013e5048931e893faae2e12a0737dcc0bfabcbc116eb275737ab1e8d8b"
|
||||
|
|
|
@ -16,8 +16,9 @@ sphinxcontrib-mermaid = "0.7.1"
|
|||
myst-parser = "==1.0.0"
|
||||
|
||||
django = "==3.2.18"
|
||||
django-environ = "==0.9.0"
|
||||
django-environ = "==0.10.0"
|
||||
funkwhale-api = {path = "../api"}
|
||||
sphinx-copybutton = "==0.5.2"
|
||||
|
||||
[tool.poetry.dev-dependencies]
|
||||
|
||||
|
|
|
@ -50,3 +50,5 @@ developers/plugins.html, ../developer/plugins/index.html
|
|||
developers/authentication.html, ../developer/api/authentication.html
|
||||
documentation/index.html, ../contributor/documentation.html
|
||||
translators.html, ../contributor/translation.html
|
||||
federation.html, ../developer/federation/index.html
|
||||
upgrading.html, ../administrator/upgrade/index.html
|
||||
|
|
|
@ -11,7 +11,7 @@
|
|||
"serve": "vite preview",
|
||||
"test": "vitest run",
|
||||
"test:unit": "vitest run",
|
||||
"lint": "eslint --ext .ts,.js,.vue,.json,.html src public/embed.html",
|
||||
"lint": "eslint --ext .ts,.js,.vue,.json,.html src test public/embed.html",
|
||||
"lint:tsc": "vue-tsc --noEmit",
|
||||
"fix-fomantic-css": "scripts/fix-fomantic-css.sh",
|
||||
"postinstall": "yarn run fix-fomantic-css"
|
||||
|
@ -77,6 +77,7 @@
|
|||
"@vue/eslint-config-typescript": "11.0.2",
|
||||
"@vue/test-utils": "2.2.7",
|
||||
"@vue/tsconfig": "0.1.3",
|
||||
"axios-mock-adapter": "1.21.4",
|
||||
"eslint": "8.30.0",
|
||||
"eslint-config-standard": "17.0.0",
|
||||
"eslint-plugin-html": "7.1.0",
|
||||
|
@ -96,6 +97,7 @@
|
|||
"vite": "4.0.4",
|
||||
"vite-plugin-pwa": "0.14.4",
|
||||
"vite-plugin-vue-inspector": "1.1.4",
|
||||
"standardized-audio-context-mock": "9.6.18",
|
||||
"vitest": "0.25.8",
|
||||
"vue-tsc": "1.0.24",
|
||||
"workbox-core": "6.5.4",
|
||||
|
|
|
@ -105,16 +105,17 @@ const openMenu = () => {
|
|||
// little magic to ensure the menu is always visible in the viewport
|
||||
// By default, try to display it on the right if there is enough room
|
||||
const menu = dropdown.value.find('.menu')
|
||||
if (menu.hasClass('visible')) return
|
||||
const viewportOffset = menu.get(0)?.getBoundingClientRect() ?? { right: 0, left: 0 }
|
||||
const viewportWidth = document.documentElement.clientWidth
|
||||
const rightOverflow = viewportOffset.right - viewportWidth
|
||||
const leftOverflow = -viewportOffset.left
|
||||
|
||||
if (rightOverflow > 0) {
|
||||
menu.css({ cssText: `left: ${-rightOverflow - 5}px !important;` })
|
||||
} else if (leftOverflow > 0) {
|
||||
menu.css({ cssText: `right: -${leftOverflow + 5}px !important;` })
|
||||
}
|
||||
menu.css({
|
||||
cssText: rightOverflow > 0
|
||||
? `left: ${-rightOverflow - 5}px !important;`
|
||||
: `right: ${-leftOverflow + 5}px !important;`
|
||||
})
|
||||
}
|
||||
</script>
|
||||
|
||||
|
|
|
@ -257,10 +257,10 @@ const remove = async () => {
|
|||
</template>
|
||||
<template v-if="totalTracks > 0">
|
||||
<span v-if="isSerie">
|
||||
{{ $t('components.library.AlbumBase.meta.episodes', {episode_count: totalTracks}) }}
|
||||
{{ $t('components.library.AlbumBase.meta.episodes', totalTracks) }}
|
||||
</span>
|
||||
<span v-else>
|
||||
{{ $t('components.library.AlbumBase.meta.tracks', {tracks_count: totalTracks}) }}
|
||||
{{ $t('components.library.AlbumBase.meta.tracks', totalTracks) }}
|
||||
</span>
|
||||
<span class="middle middledot symbol" />
|
||||
</template>
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
<script setup lang="ts">
|
||||
import type { Notification, LibraryFollow } from '~/types'
|
||||
|
||||
import { computed, ref, watchEffect } from 'vue'
|
||||
import { computed, ref, watchEffect, watch } from 'vue'
|
||||
import { useI18n } from 'vue-i18n'
|
||||
import { useStore } from '~/store'
|
||||
|
||||
|
@ -30,7 +30,7 @@ const notificationData = computed(() => {
|
|||
|
||||
if (activity.type === 'Follow') {
|
||||
if (activity.object && activity.object.type === 'music.Library') {
|
||||
const detailUrl = { name: 'content.libraries.detail', params: { id: activity.object.uuid } }
|
||||
const detailUrl = { name: 'library.detail.edit', params: { id: activity.object.uuid } }
|
||||
|
||||
if (activity.related_object?.approved === null) {
|
||||
return {
|
||||
|
@ -76,7 +76,7 @@ const notificationData = computed(() => {
|
|||
})
|
||||
|
||||
const read = ref(false)
|
||||
watchEffect(async () => {
|
||||
watch(read, async () => {
|
||||
await axios.patch(`federation/inbox/${item.value.id}/`, { is_read: read.value })
|
||||
|
||||
item.value.is_read = read.value
|
||||
|
@ -92,11 +92,13 @@ const handleAction = (handler?: () => void) => {
|
|||
const approveLibraryFollow = async (follow: LibraryFollow) => {
|
||||
await axios.post(`federation/follows/library/${follow.uuid}/accept/`)
|
||||
follow.approved = true
|
||||
item.value.is_read = true
|
||||
}
|
||||
|
||||
const rejectLibraryFollow = async (follow: LibraryFollow) => {
|
||||
await axios.post(`federation/follows/library/${follow.uuid}/reject/`)
|
||||
follow.approved = false
|
||||
item.value.is_read = true
|
||||
}
|
||||
</script>
|
||||
|
||||
|
|
|
@ -92,7 +92,7 @@ const queue = computed<QueueTrack[]>(() => {
|
|||
})
|
||||
|
||||
// Current Index
|
||||
export const currentIndex = useClamp(useStorage('queue:index', 0), 0, () => tracks.value.length - 1)
|
||||
export const currentIndex = useClamp(useStorage('queue:index', 0), 0, () => Math.max(0, tracks.value.length - 1))
|
||||
export const currentTrack = computed(() => queue.value[currentIndex.value])
|
||||
|
||||
// Use Queue
|
||||
|
@ -257,6 +257,13 @@ export const useQueue = createGlobalState(() => {
|
|||
list.value.splice(to, 0, id)
|
||||
|
||||
const current = currentIndex.value
|
||||
|
||||
// NOTE: We're batching the changes to avoid reactivity issues related to the currentIndex being clamped at list length
|
||||
const listCopy = list.value.slice()
|
||||
const [id] = listCopy.splice(from, 1)
|
||||
listCopy.splice(to, 0, id)
|
||||
list.value = listCopy
|
||||
|
||||
if (current === from) {
|
||||
currentIndex.value = to
|
||||
return
|
||||
|
@ -327,6 +334,8 @@ export const useQueue = createGlobalState(() => {
|
|||
const lastTracks = [...tracks.value]
|
||||
tracks.value.length = 0
|
||||
await delMany(lastTracks)
|
||||
|
||||
currentIndex.value = 0
|
||||
}
|
||||
|
||||
// Radio queue populating
|
||||
|
|
|
@ -172,7 +172,7 @@
|
|||
"next": "Další skladba",
|
||||
"pause": "Pozastavit",
|
||||
"play": "Hrát",
|
||||
"populatingRadio": "Načítání stopy rádia...",
|
||||
"populatingRadio": "Načítání skladby rádia...",
|
||||
"previous": "Předchozí skladba",
|
||||
"queue": "Fronta",
|
||||
"remove": "Odstranit",
|
||||
|
@ -183,9 +183,11 @@
|
|||
},
|
||||
"message": {
|
||||
"automaticPlay": "Další skladba se automaticky spustí za několik sekund…",
|
||||
"radio": "Nové skladby se přidají automaticky."
|
||||
"radio": "Nové skladby se přidají automaticky.",
|
||||
"webglUnsupported": "Váš prohlížeč nejspíš nepodporuje WebGL2."
|
||||
},
|
||||
"meta": {
|
||||
"end": "Konec",
|
||||
"queuePosition": "Skladba { index } z { length }",
|
||||
"startTime": "00:00",
|
||||
"unknownAlbum": "Neznámé Album",
|
||||
|
@ -1032,7 +1034,7 @@
|
|||
"series": "Série"
|
||||
},
|
||||
"meta": {
|
||||
"tracks": "{ n } stopa | { n } stopy"
|
||||
"tracks": "Žádné skladby | {n} skladba | {n} skladeb"
|
||||
},
|
||||
"option": {
|
||||
"none": "Žádné"
|
||||
|
@ -1095,7 +1097,7 @@
|
|||
"UploadMetadataForm": {
|
||||
"label": {
|
||||
"description": "Popis",
|
||||
"image": "Data stopy",
|
||||
"image": "Přebal skladby",
|
||||
"position": "Pozice",
|
||||
"tags": "Tagy",
|
||||
"title": "Název"
|
||||
|
@ -1429,7 +1431,7 @@
|
|||
},
|
||||
"meta": {
|
||||
"episodes": "{ n } interpret | { n } interpreti",
|
||||
"tracks": "{ n } stopa | { n } stopy"
|
||||
"tracks": "Žádné skladby | {n} skladba | {n} skladeb"
|
||||
},
|
||||
"title": "Album"
|
||||
},
|
||||
|
@ -1440,7 +1442,7 @@
|
|||
"header": {
|
||||
"episodes": "Epizody",
|
||||
"libraries": "Knihovny uživatele",
|
||||
"tracks": "Stopy"
|
||||
"tracks": "Skladby"
|
||||
},
|
||||
"meta": {
|
||||
"volume": "Hlasitost { number }"
|
||||
|
@ -1553,7 +1555,7 @@
|
|||
"header": {
|
||||
"album": "Alba tohoto interpreta",
|
||||
"library": "Knihovny uživatele",
|
||||
"track": "Stopy od tohoto interpreta"
|
||||
"track": "Nové skladby od tohoto interpreta"
|
||||
},
|
||||
"link": {
|
||||
"filter": "Přehled filtrů"
|
||||
|
@ -1866,7 +1868,7 @@
|
|||
"TagDetail": {
|
||||
"header": {
|
||||
"channels": "Kanály",
|
||||
"tracks": "Stopy"
|
||||
"tracks": "Skladby"
|
||||
},
|
||||
"link": {
|
||||
"albums": "Alba",
|
||||
|
@ -1953,7 +1955,7 @@
|
|||
"TrackEdit": {
|
||||
"header": {
|
||||
"edit": "Upravit tuto stopu",
|
||||
"suggest": "Navrhněte úpravu u této stopy"
|
||||
"suggest": "Navrhnout úpravu této skladby"
|
||||
},
|
||||
"message": {
|
||||
"remote": " Tento objekt je spravován jiným serverem, nemůžete ho upravovat."
|
||||
|
@ -1971,7 +1973,7 @@
|
|||
"header": {
|
||||
"builder": "Výroba rádia",
|
||||
"created": "Rádio vytvořeno",
|
||||
"matches": "{ n } stopa odpovídá zadaným filtrům | { n } stopy odpovídají zadaným filtrům",
|
||||
"matches": "0 stop odpovídajících zadaným filtrům | { n } skladba odpovídající zadaným filtrům | { n } skladeb odpovídajích zadaným filtrům",
|
||||
"updated": "Rádio aktualizováno"
|
||||
},
|
||||
"label": {
|
||||
|
@ -2004,7 +2006,7 @@
|
|||
"cancelButton": "Zrušit",
|
||||
"excludeLabel": "Vyloučit",
|
||||
"matchingTracks": "0 skladeb odpovídajících filtru | {n} skladba odpovídající filtru | {n} skladeb odpovídajících filtru",
|
||||
"matchingTracksModalHeader": "Stopy které odpovídají filtru",
|
||||
"matchingTracksModalHeader": "Skladby odpovídající filtru",
|
||||
"removeButton": "Odstranit"
|
||||
}
|
||||
}
|
||||
|
@ -2044,7 +2046,7 @@
|
|||
"creationDate": "Datum vytvoření",
|
||||
"domain": "Doména",
|
||||
"name": "Název",
|
||||
"tracks": "Stopy"
|
||||
"tracks": "Skladby"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -2087,7 +2089,7 @@
|
|||
"domain": "Doména",
|
||||
"name": "Název",
|
||||
"releaseDate": "Datum vydání",
|
||||
"tracks": "Stopy"
|
||||
"tracks": "Skladby"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -2130,7 +2132,7 @@
|
|||
"creationDate": "Datum vytvoření",
|
||||
"domain": "Doména",
|
||||
"name": "Název",
|
||||
"tracks": "Stopy"
|
||||
"tracks": "Skladby"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -2237,7 +2239,7 @@
|
|||
"artists": "Interpreti",
|
||||
"creationDate": "Datum vytvoření",
|
||||
"name": "Název",
|
||||
"tracks": "Stopy"
|
||||
"tracks": "Skladby"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -2745,7 +2747,7 @@
|
|||
},
|
||||
"warning": {
|
||||
"createFilter": {
|
||||
"listIntro": "Neuvidíte stopy, alba a uživatelskou aktivitu spojenou s tímto interpretem:",
|
||||
"listIntro": "Neuvidíte skladby, alba a uživatelskou aktivitu spojenou s tímto interpretem:",
|
||||
"listItem1": "V oblíbených a historii poslechu jiných uživatelů",
|
||||
"listItem2": "Ve widgetu \"Poslední přidané\"",
|
||||
"listItem3": "Ve výpisu interpretů a alb",
|
||||
|
@ -2809,15 +2811,15 @@
|
|||
"playlists": {
|
||||
"Card": {
|
||||
"meta": {
|
||||
"tracks": "{ n } stopa | { n } stopy"
|
||||
"tracks": "Žádné skladby | {n} skladba | {n} skladeb"
|
||||
}
|
||||
},
|
||||
"Editor": {
|
||||
"button": {
|
||||
"addDuplicate": "Přesto přidat",
|
||||
"clear": "Vyčistit playlist",
|
||||
"copy": "Kopírovat stopy ve frontě do playlistu",
|
||||
"insertFromQueue": "Vložit z fronty ({ n } stopa) | Vložit z fronty ({ n } stopy)"
|
||||
"copy": "Kopírovat skladby ve frontě do playlistu",
|
||||
"insertFromQueue": "Vložit z fronty ({ n } skladba) | Vložit z fronty ({ n } skladeb"
|
||||
},
|
||||
"error": {
|
||||
"sync": "Došlo k chybě při ukládání změn"
|
||||
|
@ -2837,13 +2839,13 @@
|
|||
"modal": {
|
||||
"clearPlaylist": {
|
||||
"content": {
|
||||
"warning": "Odstraní nevratně všechny stopy z tohoto playlistu."
|
||||
"warning": "Odstraní nevratně všechny skladby z tohoto playlistu."
|
||||
},
|
||||
"header": "Přejete si vyprázdnit seznam skladeb \"{ playlist }\"?"
|
||||
}
|
||||
},
|
||||
"warning": {
|
||||
"duplicate": "Některé stopy ve frontě se v tomto playlistu již nacházejí:"
|
||||
"duplicate": "Některé skladby ve frontě se v tomto playlistu již nacházejí:"
|
||||
}
|
||||
},
|
||||
"Form": {
|
||||
|
@ -2878,17 +2880,17 @@
|
|||
},
|
||||
"header": {
|
||||
"addFailure": "Stopu nelze přidat do playlistu",
|
||||
"addToPlaylist": "Přidat do seznamu skladeb…",
|
||||
"addToPlaylist": "Přidat do seznamu skladeb",
|
||||
"available": "Dostupné playlisty",
|
||||
"manage": "Spravovat playlisty",
|
||||
"noResults": "Stopy které odpovídají filtru",
|
||||
"noResults": "Žádné výsledky odpovídající filtru",
|
||||
"track": "{title}, od interpreta {artist}"
|
||||
},
|
||||
"label": {
|
||||
"filter": "Název filtru"
|
||||
},
|
||||
"placeholder": {
|
||||
"filterPlaylist": "Zadejte název seznamu skladeb…"
|
||||
"filterPlaylist": "Zadejte název seznamu skladeb"
|
||||
},
|
||||
"table": {
|
||||
"edit": {
|
||||
|
@ -2896,7 +2898,7 @@
|
|||
"edit": "Upravit",
|
||||
"lastModification": "Poslední změna",
|
||||
"name": "Název",
|
||||
"tracks": "Stopy"
|
||||
"tracks": "Skladby"
|
||||
}
|
||||
}
|
||||
},
|
||||
|
@ -2954,7 +2956,7 @@
|
|||
"composables": {
|
||||
"audio": {
|
||||
"usePlayOptions": {
|
||||
"addToQueueMessage": "{ n } stopa byla přidána do fronty | { n } stopy byly přidány do fronty"
|
||||
"addToQueueMessage": "{n} skladeb bylo přidáno do fronty | { n } skladba byla přidána do fronty | { n } skladeb bylo přidány do fronty"
|
||||
}
|
||||
},
|
||||
"locale": {
|
||||
|
@ -3043,7 +3045,7 @@
|
|||
"receivedMessages": "Přijaté zprávy",
|
||||
"releaseDate": "Datum vydání",
|
||||
"size": "Velikost",
|
||||
"trackTitle": "Název stopy",
|
||||
"trackTitle": "Název skladby",
|
||||
"uploads": "Nahrané soubory",
|
||||
"username": "Uživatelské jméno",
|
||||
"users": "Uživatelé"
|
||||
|
@ -3291,7 +3293,7 @@
|
|||
"radios": "Rádia",
|
||||
"series": "Série",
|
||||
"tags": "Tagy",
|
||||
"tracks": "Stopy"
|
||||
"tracks": "Skladby"
|
||||
}
|
||||
},
|
||||
"admin": {
|
||||
|
@ -3324,7 +3326,7 @@
|
|||
"table": {
|
||||
"activity": {
|
||||
"edits": "Úpravy",
|
||||
"favorited": "Oblíbené stopy",
|
||||
"favorited": "Oblíbené skladby",
|
||||
"firstSeen": "Prvně viděno",
|
||||
"linkedReports": "Odkazy na hlášení",
|
||||
"listenings": "Poslechy",
|
||||
|
@ -3334,7 +3336,7 @@
|
|||
"albums": "Alba",
|
||||
"cachedSize": "Velikost v cache",
|
||||
"totalSize": "Celková velikost",
|
||||
"tracks": "Stopy",
|
||||
"tracks": "Skladby",
|
||||
"uploads": "Nahrané soubory"
|
||||
},
|
||||
"channelData": {
|
||||
|
@ -3360,7 +3362,7 @@
|
|||
"invitations": "Pozvánky",
|
||||
"libraries": "Knihovny",
|
||||
"tags": "Tagy",
|
||||
"tracks": "Stopy",
|
||||
"tracks": "Skladby",
|
||||
"uploads": "Nahrané soubory",
|
||||
"users": "Uživatelé"
|
||||
}
|
||||
|
@ -3405,7 +3407,7 @@
|
|||
"musicbrainz": "Otevřít na MusicBrainz",
|
||||
"remoteProfile": "Otevřít vzdálený profil",
|
||||
"reports": "Odkazy na hlášení",
|
||||
"tracks": "Stopy",
|
||||
"tracks": "Skladby",
|
||||
"uploads": "Nahrané soubory"
|
||||
},
|
||||
"modal": {
|
||||
|
@ -3418,7 +3420,7 @@
|
|||
},
|
||||
"table": {
|
||||
"activity": {
|
||||
"favorited": "Oblíbené stopy",
|
||||
"favorited": "Oblíbené skladby",
|
||||
"firstSeen": "Prvně viděno",
|
||||
"listenings": "Poslechy",
|
||||
"playlists": "Playlisty"
|
||||
|
@ -3459,7 +3461,7 @@
|
|||
"musicbrainz": "Otevřít na MusicBrainz",
|
||||
"remoteProfile": "Otevřít vzdálený profil",
|
||||
"reports": "Odkazy na hlášení",
|
||||
"tracks": "Stopy",
|
||||
"tracks": "Skladby",
|
||||
"uploads": "Nahrané soubory"
|
||||
},
|
||||
"modal": {
|
||||
|
@ -3472,7 +3474,7 @@
|
|||
},
|
||||
"table": {
|
||||
"activity": {
|
||||
"favorited": "Oblíbené stopy",
|
||||
"favorited": "Oblíbené skladby",
|
||||
"firstSeen": "Prvně viděno",
|
||||
"listenings": "Poslechy",
|
||||
"playlists": "Playlisty"
|
||||
|
@ -3498,7 +3500,7 @@
|
|||
"edits": "Úpravy",
|
||||
"libraries": "Knihovny",
|
||||
"tags": "Tagy",
|
||||
"tracks": "Stopy",
|
||||
"tracks": "Skladby",
|
||||
"uploads": "Nahrané soubory"
|
||||
},
|
||||
"menu": {
|
||||
|
@ -3530,7 +3532,7 @@
|
|||
"domain": "Doména",
|
||||
"remoteProfile": "Otevřít vzdálený profil",
|
||||
"reports": "Odkazy na hlášení",
|
||||
"tracks": "Stopy",
|
||||
"tracks": "Skladby",
|
||||
"uploads": "Nahrané soubory",
|
||||
"visibility": "Viditelnost"
|
||||
},
|
||||
|
@ -3574,7 +3576,7 @@
|
|||
"artists": "Interpreti",
|
||||
"django": "Zobrazit v administraci Django",
|
||||
"localProfile": "Otevřít místní profil",
|
||||
"tracks": "Stopy"
|
||||
"tracks": "Skladby"
|
||||
},
|
||||
"modal": {
|
||||
"delete": {
|
||||
|
@ -3602,7 +3604,7 @@
|
|||
"header": {
|
||||
"activity": "Aktivita",
|
||||
"local": "Místní",
|
||||
"trackData": "Data stopy"
|
||||
"trackData": "Data skladby"
|
||||
},
|
||||
"link": {
|
||||
"album": "Album",
|
||||
|
@ -3628,7 +3630,7 @@
|
|||
},
|
||||
"table": {
|
||||
"activity": {
|
||||
"favorited": "Oblíbené stopy",
|
||||
"favorited": "Oblíbené skladby",
|
||||
"firstSeen": "Prvně viděno",
|
||||
"listenings": "Poslechy",
|
||||
"playlists": "Playlisty"
|
||||
|
@ -3728,7 +3730,7 @@
|
|||
"openProfile": "Otevřít profil",
|
||||
"remoteProfile": "Otevřít vzdálený profil",
|
||||
"requests": "Požádat o heslo",
|
||||
"tracks": "Stopy",
|
||||
"tracks": "Skladby",
|
||||
"uploads": "Nahrané soubory"
|
||||
},
|
||||
"notApplicable": "N/A",
|
||||
|
@ -3798,7 +3800,7 @@
|
|||
"policy": "Zásady moderování vám pomáhají řídit interakci mezi vaší instancí a danou doménou nebo účtem"
|
||||
},
|
||||
"header": {
|
||||
"activePolicy": "Na tuto doménu jsou aplikována specifická pravidla moderace",
|
||||
"activePolicy": "Tato doména podléhá specifickým moderačním pravidlům",
|
||||
"activity": "Aktivita",
|
||||
"audioContent": "Obsah audia",
|
||||
"instanceData": "Data instance",
|
||||
|
@ -3811,15 +3813,15 @@
|
|||
"django": "Zobrazit v administraci Django",
|
||||
"knownAccounts": "Známé účty",
|
||||
"libraries": "Knihovny",
|
||||
"tracks": "Stopy",
|
||||
"tracks": "Skladby",
|
||||
"uploads": "Nahrané soubory",
|
||||
"website": "Otevřít web"
|
||||
},
|
||||
"notApplicable": "N/A",
|
||||
"table": {
|
||||
"activity": {
|
||||
"emittedFollows": "Vydaná sledování knihovny",
|
||||
"emittedMessages": "Vydané zprávy",
|
||||
"emittedFollows": "Vyslaná sledování knihovny",
|
||||
"emittedMessages": "Vyslané zprávy",
|
||||
"firstSeen": "Prvně viděno",
|
||||
"receivedFollows": "Přijatá sledování knihovny"
|
||||
},
|
||||
|
@ -3894,7 +3896,7 @@
|
|||
},
|
||||
"RequestsList": {
|
||||
"header": {
|
||||
"userRequests": "Uživatelské příručky"
|
||||
"userRequests": "Žádosti o registraci"
|
||||
},
|
||||
"label": {
|
||||
"search": "Hledat",
|
||||
|
@ -3905,7 +3907,7 @@
|
|||
"all": "Vše",
|
||||
"approved": "Schváleno",
|
||||
"pending": "Čeká",
|
||||
"refused": "Pozastaveno"
|
||||
"refused": "Odmítnuto"
|
||||
}
|
||||
},
|
||||
"ordering": {
|
||||
|
@ -3917,9 +3919,9 @@
|
|||
"label": "Řazení"
|
||||
},
|
||||
"placeholder": {
|
||||
"search": "Hledat pomocí uživatelského jména"
|
||||
"search": "Hledat podle uživatelského jména"
|
||||
},
|
||||
"title": "Uživatelské příručky"
|
||||
"title": "Žádosti o registraci"
|
||||
}
|
||||
},
|
||||
"users": {
|
||||
|
@ -3938,13 +3940,13 @@
|
|||
"auth": {
|
||||
"Callback": {
|
||||
"header": {
|
||||
"loggingIn": "Načítání knihoven…"
|
||||
"loggingIn": "Přihlašování…"
|
||||
}
|
||||
},
|
||||
"EmailConfirm": {
|
||||
"header": {
|
||||
"failure": "Nepovedlo se ověřit vaší emailovou adresu",
|
||||
"success": "Emailová adresa potvrzena"
|
||||
"failure": "Nepovedlo se ověřit vaši e-mailovou adresu",
|
||||
"success": "E-mailová adresa potvrzena"
|
||||
},
|
||||
"label": {
|
||||
"confirmationCode": "Potvrzovací kód"
|
||||
|
@ -3956,24 +3958,24 @@
|
|||
"message": {
|
||||
"success": "Nyní můžete službu využívat bez omezení"
|
||||
},
|
||||
"title": "Potvrďte svou emailovou adresu"
|
||||
"title": "Potvrďte svou e-mailovou adresu"
|
||||
},
|
||||
"Login": {
|
||||
"header": {
|
||||
"login": "Přihlásit k vašemu Funkwhale účtu"
|
||||
"login": "Přihlásit se k vašemu Funkwhale účtu"
|
||||
},
|
||||
"title": "Přihlásit se"
|
||||
},
|
||||
"PasswordReset": {
|
||||
"button": {
|
||||
"requestReset": "Požádat o resetování hesla"
|
||||
"requestReset": "Požádat o obnovení hesla"
|
||||
},
|
||||
"header": {
|
||||
"failure": "Chyba při žádosti o reset hesla",
|
||||
"reset": "Resetovat heslo"
|
||||
"failure": "Chyba při žádosti o obnovení hesla",
|
||||
"reset": "Obnovit heslo"
|
||||
},
|
||||
"help": {
|
||||
"form": "Použijte tento formulář pro žádost o reset hesla. Na zadanou adresu bude odeslán email s instrukcemi pro změnu vašeho hesla."
|
||||
"form": "Použijte tento formulář pro požádání o obnovení hesla. Na zadanou adresu bude odeslán e-mail s instrukcemi pro obnovu vašeho hesla."
|
||||
},
|
||||
"label": {
|
||||
"email": "Emailová adresa účtu"
|
||||
|
@ -3982,9 +3984,9 @@
|
|||
"back": "Zpět na přihlášení"
|
||||
},
|
||||
"placeholder": {
|
||||
"email": "Zadejte emailovou adresu spojenou s vaším účtem"
|
||||
"email": "Zadejte e-mailovou adresu spojenou s vaším účtem"
|
||||
},
|
||||
"title": "Resetovat heslo"
|
||||
"title": "Obnovit heslo"
|
||||
},
|
||||
"PasswordResetConfirm": {
|
||||
"button": {
|
||||
|
@ -4002,17 +4004,17 @@
|
|||
"login": "Pokračovat k přihlášení"
|
||||
},
|
||||
"message": {
|
||||
"requestSent": "Pokud je emailová adresa zadaná v předchozím kroku validní a náleží k uživatelskému účtu, obdržíte během několika minut email s pokyny pro reset hesla.",
|
||||
"requestSent": "Pokud je e-mailová adresa zadaná v předchozím kroku platná a náleží nějakému uživatelskému účtu, obdržíte během několika minut e-mail s pokyny pro obnovení hesla.",
|
||||
"success": "Vaše heslo bylo úspěšně změněno."
|
||||
},
|
||||
"title": "Změňte své heslo"
|
||||
"title": "Změna hesla"
|
||||
},
|
||||
"Plugins": {
|
||||
"title": "Spravovat playlisty"
|
||||
"title": "Spravovat pluginy"
|
||||
},
|
||||
"ProfileActivity": {
|
||||
"header": {
|
||||
"playlists": "Playlisty",
|
||||
"playlists": "Seznamy skladeb",
|
||||
"recentlyFavorited": "Poslední oblíbené",
|
||||
"recentlyListened": "Poslední poslechnuté"
|
||||
}
|
||||
|
@ -4023,33 +4025,33 @@
|
|||
},
|
||||
"link": {
|
||||
"activity": "Aktivita",
|
||||
"domainView": "Členem od { date }",
|
||||
"domainView": "Zobrazit na {domain}",
|
||||
"moderation": "Otevřít v rozhraní pro moderaci",
|
||||
"overview": "Náhled"
|
||||
},
|
||||
"title": "Profil { username }"
|
||||
"title": "Profil uživatele { username }"
|
||||
},
|
||||
"ProfileOverview": {
|
||||
"button": {
|
||||
"cancel": "Zrušit",
|
||||
"createChannel": "Vytvořit novou knihovnu",
|
||||
"next": "Další stopa",
|
||||
"previous": "Předchozí stopa"
|
||||
"createChannel": "Vytvořit kanál",
|
||||
"next": "Další krok",
|
||||
"previous": "Předchozí krok"
|
||||
},
|
||||
"header": {
|
||||
"channels": "Kanály",
|
||||
"libraries": "Knihovny uživatele",
|
||||
"sharedLibraries": "Toto album se vyskytuje v následujících knihovnách"
|
||||
"sharedLibraries": "Tento uživatel sdílel následující knihovny"
|
||||
},
|
||||
"link": {
|
||||
"addNew": "Přidat obsah"
|
||||
"addNew": "Přidat nový"
|
||||
},
|
||||
"modal": {
|
||||
"createChannel": {
|
||||
"artist": {
|
||||
"header": "Jméno interpreta"
|
||||
"header": "Kanál interpreta"
|
||||
},
|
||||
"header": "Vytvořit novou knihovnu",
|
||||
"header": "Vytvořit kanál",
|
||||
"podcast": {
|
||||
"header": "Podcastový kanál"
|
||||
}
|
||||
|
@ -4072,36 +4074,36 @@
|
|||
"edit": "Upravit…",
|
||||
"embed": "Vložit",
|
||||
"play": "Přehrát",
|
||||
"updateChannel": "Aktualizovat aplikaci",
|
||||
"updateChannel": "Aktualizovat kanál",
|
||||
"upload": "Nahrát"
|
||||
},
|
||||
"header": {
|
||||
"artistChannel": "Jméno interpreta",
|
||||
"artistChannel": "Kanál interpreta",
|
||||
"podcastChannel": "Podcastový kanál"
|
||||
},
|
||||
"link": {
|
||||
"channelEpisodes": "Všechny díly",
|
||||
"channelOverview": "Náhled",
|
||||
"channelTracks": "Stopy",
|
||||
"domainView": "Členem od { date }",
|
||||
"channelOverview": "Přehled",
|
||||
"channelTracks": "Skladby",
|
||||
"domainView": "Zobrazit na {domain}",
|
||||
"mirrored": "Zrcadleno z {domain}",
|
||||
"moderation": "Otevřít v rozhraní pro moderaci"
|
||||
},
|
||||
"meta": {
|
||||
"episodes": "{ n } interpret | { n } interpreti",
|
||||
"listenings": "{ n } poslech | { n } poslechy",
|
||||
"subscribers": "{ n } oblíbená | { n } oblíbené",
|
||||
"tracks": "{ n } stopa | { n } stopy"
|
||||
"episodes": "Žádné díly | {n} díl | {n} dílů",
|
||||
"listenings": "Neposlechnuto | { n } poslech | { n } poslechů",
|
||||
"subscribers": "Žádní odběratelé | {n} odběratel | {n} odběratelů",
|
||||
"tracks": "Žádné skladby | {n} skladba | {n} skladeb"
|
||||
},
|
||||
"modal": {
|
||||
"delete": {
|
||||
"content": {
|
||||
"warning": "Knihovna bude odstraněna, společně se souvisejícími nahranými soubory a sledováními. Tato akce je nevratná."
|
||||
"warning": "Kanál bude odstraněn, společně se souvisejícími nahranými soubory a sledováními. Tato akce je nevratná."
|
||||
},
|
||||
"header": "Odstranit tuto poznámku?"
|
||||
"header": "Odstranit tento kanál?"
|
||||
},
|
||||
"embed": {
|
||||
"header": "Vložit díla tohoto interpreta do webové stránky"
|
||||
"header": "Vložit díla tohoto interpreta na vaše webové stránky"
|
||||
},
|
||||
"subscribe": {
|
||||
"fediverse": {
|
||||
|
@ -4111,7 +4113,7 @@
|
|||
"header": "Odebírat na Fediverse"
|
||||
},
|
||||
"funkwhale": {
|
||||
"header": "Použití Funkwhale"
|
||||
"header": "Odebírat na Funkwhale"
|
||||
},
|
||||
"header": "Odebírat tento kanál",
|
||||
"rss": {
|
||||
|
@ -4127,23 +4129,23 @@
|
|||
"DetailOverview": {
|
||||
"header": {
|
||||
"albums": "Alba",
|
||||
"latestEpisodes": "Nejnovější díly",
|
||||
"latestTracks": "Další stopa",
|
||||
"latestEpisodes": "Poslední díly",
|
||||
"latestTracks": "Poslední skladby",
|
||||
"series": "Série",
|
||||
"uploadsFailure": "Některé nahrávky se nepodařilo publikovat",
|
||||
"uploadsProcessing": "Nahrávky se zpracovávájí",
|
||||
"uploadsSuccess": "Heslo úspěšně změněno"
|
||||
"uploadsSuccess": "Nahrávky úspěšně publikovány"
|
||||
},
|
||||
"link": {
|
||||
"addAlbum": "Přidat obsah",
|
||||
"erroredUploads": "Knihovny a nahrané soubory",
|
||||
"addAlbum": "Přidat nové",
|
||||
"erroredUploads": "Zobrazit nahrávky s chybami",
|
||||
"skippedUploads": "Zobrazit přeskočené nahrávky"
|
||||
},
|
||||
"message": {
|
||||
"processing": "Vaše nahrávky se zpracovávájí a budou publikovány brzy."
|
||||
"processing": "Vaše nahrávky se zpracovávájí a budou brzy publikovány."
|
||||
},
|
||||
"meta": {
|
||||
"progress": "Knihovny a nahrané soubory"
|
||||
"progress": "Zpracované nahrávky: {finished}/{total}"
|
||||
}
|
||||
},
|
||||
"SubscriptionsList": {
|
||||
|
@ -4152,15 +4154,15 @@
|
|||
"subscribe": "Odebírat"
|
||||
},
|
||||
"link": {
|
||||
"addNew": "Přidat obsah"
|
||||
"addNew": "Přidat nový"
|
||||
},
|
||||
"modal": {
|
||||
"subscription": {
|
||||
"header": "Popis"
|
||||
"header": "Odběr"
|
||||
}
|
||||
},
|
||||
"placeholder": {
|
||||
"search": "Filtrovat pomocí názvu…"
|
||||
"search": "Filtrovat dle názvu…"
|
||||
},
|
||||
"title": "Odebírané Kanály"
|
||||
}
|
||||
|
@ -4169,7 +4171,7 @@
|
|||
"Base": {
|
||||
"link": {
|
||||
"libraries": "Knihovny",
|
||||
"tracks": "Stopy"
|
||||
"tracks": "Skladby"
|
||||
},
|
||||
"menu": {
|
||||
"secondary": "Podmenu"
|
||||
|
@ -4210,7 +4212,7 @@
|
|||
"details": "Úpravy knihovny"
|
||||
},
|
||||
"meta": {
|
||||
"tracks": "{ n } stopa | { n } stopy"
|
||||
"tracks": "Žádné skladby | {n} skladba | {n} skladeb"
|
||||
}
|
||||
},
|
||||
"FilesTable": {
|
||||
|
@ -4391,7 +4393,7 @@
|
|||
"meta": {
|
||||
"failedTracks": "Neúspěšné skladby: {tracks}",
|
||||
"lastUpdate": "Poslední aktualizace: ",
|
||||
"tracks": "{ n } stopa | { n } stopy"
|
||||
"tracks": "Žádné skladby | {n} skladba | {n} skladeb"
|
||||
},
|
||||
"modal": {
|
||||
"unfollow": {
|
||||
|
@ -4440,25 +4442,25 @@
|
|||
"library": {
|
||||
"DetailAlbums": {
|
||||
"empty": {
|
||||
"follow": "Ukončením sledování této knihovny ztratíte přístup k jejímu obsahu.",
|
||||
"upload": "Tato knihovna je prázdna, měli byste sem něco nahrát!"
|
||||
"follow": "Nejspíš budete muset sledovat tuto knihovnu pro zobrzení jejího obsahu.",
|
||||
"upload": "Tato knihovna je prázdná, měli byste sem něco nahrát!"
|
||||
}
|
||||
},
|
||||
"DetailOverview": {
|
||||
"empty": {
|
||||
"follow": "Ukončením sledování této knihovny ztratíte přístup k jejímu obsahu.",
|
||||
"upload": "Tato knihovna je prázdna, měli byste sem něco nahrát!"
|
||||
"follow": "Nejspíš budete muset sledovat tuto knihovnu pro zobrzení jejího obsahu.",
|
||||
"upload": "Tato knihovna je prázdná, měli byste sem něco nahrát!"
|
||||
}
|
||||
},
|
||||
"DetailTracks": {
|
||||
"empty": {
|
||||
"follow": "Ukončením sledování této knihovny ztratíte přístup k jejímu obsahu.",
|
||||
"upload": "Tato knihovna je prázdna, měli byste sem něco nahrát!"
|
||||
"follow": "Nejspíš budete muset sledovat tuto knihovnu pro zobrzení jejího obsahu.",
|
||||
"upload": "Tato knihovna je prázdná, měli byste sem něco nahrát!"
|
||||
}
|
||||
},
|
||||
"Edit": {
|
||||
"button": {
|
||||
"accept": "Akceptovat",
|
||||
"accept": "Přijmout",
|
||||
"reject": "Odmítnout"
|
||||
},
|
||||
"empty": {
|
||||
|
@ -4466,7 +4468,7 @@
|
|||
},
|
||||
"header": {
|
||||
"followers": "Sledující",
|
||||
"libraryContents": "Úpravy knihovny"
|
||||
"libraryContents": "Obsah knihovny"
|
||||
},
|
||||
"loading": {
|
||||
"followers": "Načítání sledujících…"
|
||||
|
@ -4480,7 +4482,7 @@
|
|||
"user": "Uživatel"
|
||||
},
|
||||
"status": {
|
||||
"accepted": "Akceptováno",
|
||||
"accepted": "Přijato",
|
||||
"pending": "Čeká na schválení",
|
||||
"rejected": "Odmítnuto"
|
||||
}
|
||||
|
@ -4493,10 +4495,10 @@
|
|||
"upload": "Nahrát"
|
||||
},
|
||||
"description": {
|
||||
"sharingLink": "Sdílejte tento odkaz s ostatními, aby mohli požádat o přístup k vaší knihovně."
|
||||
"sharingLink": "Sdílejte tento odkaz s ostatními, aby mohli požádat o přístup k vaší knihovně vložením do vyhledávacího pole na jejich podu."
|
||||
},
|
||||
"label": {
|
||||
"instance": "Odmítnuto",
|
||||
"instance": "Omezeno",
|
||||
"private": "Soukromé",
|
||||
"public": "Veřejné",
|
||||
"sharingLink": "Odkaz pro sdílení"
|
||||
|
@ -4504,13 +4506,13 @@
|
|||
"link": {
|
||||
"albums": "Alba",
|
||||
"artists": "Interpreti",
|
||||
"domain": "Členem od { date }",
|
||||
"domain": "Zobrazit na {domain}",
|
||||
"moderation": "Otevřít v rozhraní pro moderaci",
|
||||
"owner": "Přihlášen jako { username }",
|
||||
"tracks": "Stopy"
|
||||
"owner": "Vlastněno uživatelem { username }",
|
||||
"tracks": "Skladby"
|
||||
},
|
||||
"meta": {
|
||||
"tracks": "{ n } stopa | { n } stopy"
|
||||
"tracks": "Žádné skladby | { n } skladba | { n } skladeb"
|
||||
},
|
||||
"title": "Knihovna",
|
||||
"tooltip": {
|
||||
|
@ -4524,21 +4526,21 @@
|
|||
"Detail": {
|
||||
"button": {
|
||||
"cancel": "Zrušit",
|
||||
"confirm": "Odstranit playlist",
|
||||
"confirm": "Odstranit seznam skladeb",
|
||||
"delete": "Odstranit",
|
||||
"edit": "Upravit",
|
||||
"embed": "Vložit",
|
||||
"playAll": "Přehrát vše",
|
||||
"stopEdit": "Zastavit rádio"
|
||||
"stopEdit": "Přestat upravovat"
|
||||
},
|
||||
"empty": {
|
||||
"noTracks": "Přetáhněte myší řádky pro změnu pořadí stop v playlistu"
|
||||
"noTracks": "V tomto seznamu skladeb zatím nejsou žádné skladby"
|
||||
},
|
||||
"header": {
|
||||
"tracks": "Stopy"
|
||||
"tracks": "Skladby"
|
||||
},
|
||||
"meta": {
|
||||
"tracks": "Playlist obsahující { n } stopu, od { username } | Playlist obsahující { n } stopy, od { username }"
|
||||
"tracks": "Seznam skladeb obsahující { n } skladbu, od { username } | Seznam skladeb obsahující { n } skladeb, od { username }"
|
||||
},
|
||||
"modal": {
|
||||
"delete": {
|
||||
|
@ -4548,23 +4550,23 @@
|
|||
"header": "Opravdu chcete odstranit seznam skladeb \"{ playlist }\"?"
|
||||
},
|
||||
"embed": {
|
||||
"header": "Vložit tento playlist do webové stránky"
|
||||
"header": "Vložit tento playlist na vaši webovou stránku"
|
||||
}
|
||||
},
|
||||
"title": "Playlist"
|
||||
"title": "Seznam skladeb"
|
||||
},
|
||||
"List": {
|
||||
"button": {
|
||||
"create": "Vytvořit playlist",
|
||||
"manage": "Spravovat vaše playlisty",
|
||||
"create": "Vytvořit seznam skladeb",
|
||||
"manage": "Spravovat vaše seznamy skladeb",
|
||||
"search": "Hledat"
|
||||
},
|
||||
"empty": {
|
||||
"noResults": "Žádný interpret neodpovídá zadání"
|
||||
"noResults": "Žádný výsledek odpovídající dotazu"
|
||||
},
|
||||
"header": {
|
||||
"browse": "Procházení playlistů",
|
||||
"playlists": "Playlisty"
|
||||
"browse": "Procházení seznamů skladeb",
|
||||
"playlists": "Seznamy skladeb"
|
||||
},
|
||||
"label": {
|
||||
"search": "Hledat"
|
||||
|
@ -4581,7 +4583,7 @@
|
|||
"results": "Výsledků na stránku"
|
||||
},
|
||||
"placeholder": {
|
||||
"search": "Zadejte název playlistu…"
|
||||
"search": "Zadejte název seznamu skladeb…"
|
||||
}
|
||||
}
|
||||
},
|
||||
|
@ -4593,11 +4595,11 @@
|
|||
"edit": "Upravit…"
|
||||
},
|
||||
"empty": {
|
||||
"noTracks": "Stopu nelze přidat do playlistu"
|
||||
"noTracks": "Do tohoto rádia nebyly zatím přidány žádné skladby"
|
||||
},
|
||||
"header": {
|
||||
"radio": "Rádio obsahující {tracks} skladeb, vytvořil ",
|
||||
"tracks": "Stopy"
|
||||
"tracks": "Skladby"
|
||||
},
|
||||
"modal": {
|
||||
"delete": {
|
||||
|
|
|
@ -183,9 +183,11 @@
|
|||
},
|
||||
"message": {
|
||||
"automaticPlay": "Der nächste Titel wird automatisch in wenigen Sekunden wiedergegeben…",
|
||||
"radio": "Neue Titel werden hier automatisch hinzugefügt."
|
||||
"radio": "Neue Titel werden hier automatisch hinzugefügt.",
|
||||
"webglUnsupported": "Leider unterstützt dein Browser kein WebGL2."
|
||||
},
|
||||
"meta": {
|
||||
"end": "Ende",
|
||||
"queuePosition": "Titel { index } von { length }",
|
||||
"startTime": "00:00",
|
||||
"unknownAlbum": "Unbekanntes Album",
|
||||
|
@ -2922,9 +2924,11 @@
|
|||
"radios": {
|
||||
"Button": {
|
||||
"startArtistsRadio": "Start Künstler*innen Radio",
|
||||
"startPlaylistsRadio": "Starte Wiedergabelistenradio",
|
||||
"startRadio": "Radio abspielen",
|
||||
"startTagsRadio": "Starte Tag Radio",
|
||||
"stopArtistsRadio": "Stoppe Künstler*innen Radio",
|
||||
"stopPlaylistsRadio": "Stoppe Wiedergabelistenradio",
|
||||
"stopRadio": "Radio ausschalten",
|
||||
"stopTagsRadio": "Stoppe Tag Radio"
|
||||
},
|
||||
|
@ -3196,6 +3200,9 @@
|
|||
}
|
||||
}
|
||||
},
|
||||
"useErrorHandler": {
|
||||
"unexpectedError": "Ein unerwarteter Fehler ist aufgetreten."
|
||||
},
|
||||
"useThemeList": {
|
||||
"darkTheme": "Dunkel",
|
||||
"lightTheme": "Hell"
|
||||
|
|
|
@ -222,7 +222,7 @@
|
|||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: space-between;
|
||||
min-width: 10em;
|
||||
min-width: 8em;
|
||||
z-index: 2;
|
||||
> .control.button {
|
||||
padding: 0.5em;
|
||||
|
|
|
@ -291,6 +291,7 @@
|
|||
align-items: center;
|
||||
justify-content: center;
|
||||
text-align: center;
|
||||
max-width: 100vw;
|
||||
|
||||
.ui.header {
|
||||
width: 100%;
|
||||
|
@ -462,6 +463,12 @@
|
|||
align-items: center;
|
||||
}
|
||||
|
||||
.title.ellipsis {
|
||||
@include media("<tablet") {
|
||||
max-width: 35vw;
|
||||
}
|
||||
}
|
||||
|
||||
// NOTE: Taken from semantic ui
|
||||
&.active {
|
||||
background: #E0E0E0;
|
||||
|
|
|
@ -35,6 +35,7 @@
|
|||
vertical-align: middle;
|
||||
}
|
||||
&.sidebar {
|
||||
z-index: 10000 !important;
|
||||
overflow-y: visible !important;
|
||||
background: var(--sidebar-background);
|
||||
z-index: 1;
|
||||
|
|
|
@ -150,7 +150,7 @@
|
|||
|
||||
.track-row,
|
||||
.track-table {
|
||||
padding: 0.5em;
|
||||
padding: 0.5em !important; /* Overwrite fomantic ui padding rules */
|
||||
> div:not(.mobile) {
|
||||
padding: 0.25em;
|
||||
margin-right: 0.25em;
|
||||
|
|
|
@ -4,7 +4,7 @@ import type { Notification } from '~/types'
|
|||
import moment from 'moment'
|
||||
import axios from 'axios'
|
||||
|
||||
import { ref, reactive, computed, watch, markRaw } from 'vue'
|
||||
import { ref, reactive, computed, watch } from 'vue'
|
||||
import { useI18n } from 'vue-i18n'
|
||||
import { useStore } from '~/store'
|
||||
|
||||
|
@ -38,7 +38,7 @@ const fetchData = async () => {
|
|||
try {
|
||||
const response = await axios.get('federation/inbox/', { params: filters })
|
||||
notifications.count = response.data.count
|
||||
notifications.results = response.data.results.map(markRaw)
|
||||
notifications.results = response.data.results
|
||||
} catch (error) {
|
||||
useErrorHandler(error as Error)
|
||||
}
|
||||
|
@ -50,7 +50,7 @@ watch(filters, fetchData, { immediate: true })
|
|||
|
||||
useWebSocketHandler('inbox.item_added', (event) => {
|
||||
notifications.count += 1
|
||||
notifications.results.unshift(markRaw((event.item)))
|
||||
notifications.results.unshift(event.item)
|
||||
})
|
||||
|
||||
const instanceSupportMessageDelay = ref(60)
|
||||
|
@ -136,7 +136,8 @@ const markAllAsRead = async () => {
|
|||
<option :value="90">
|
||||
{{ $t('views.Notifications.option.delay.90') }}
|
||||
</option>
|
||||
<option :value="null">
|
||||
<!-- NOTE: Postpone notification 100 years, so that the user never sees it -->
|
||||
<option :value="36500">
|
||||
{{ $t('views.Notifications.option.delay.never') }}
|
||||
</option>
|
||||
</select>
|
||||
|
@ -200,7 +201,8 @@ const markAllAsRead = async () => {
|
|||
<option :value="90">
|
||||
{{ $t('views.Notifications.option.delay.90') }}
|
||||
</option>
|
||||
<option :value="null">
|
||||
<!-- NOTE: Postpone notification 100 years, so that the user never sees it -->
|
||||
<option :value="36500">
|
||||
{{ $t('views.Notifications.option.delay.never') }}
|
||||
</option>
|
||||
</select>
|
||||
|
|
|
@ -0,0 +1,6 @@
|
|||
import { AudioContext } from 'standardized-audio-context-mock'
|
||||
import { vi } from 'vitest'
|
||||
|
||||
vi.mock('standardized-audio-context', () => ({
|
||||
AudioContext
|
||||
}))
|
|
@ -0,0 +1,14 @@
|
|||
import { config } from '@vue/test-utils'
|
||||
import { createI18n } from 'vue-i18n'
|
||||
import en from '~/locales/en_US.json'
|
||||
|
||||
const i18n = createI18n({
|
||||
legacy: false,
|
||||
locale: 'en',
|
||||
messages: {
|
||||
en
|
||||
}
|
||||
})
|
||||
|
||||
config.global.plugins ??= []
|
||||
config.global.plugins.push(i18n)
|
|
@ -0,0 +1,231 @@
|
|||
import { useQueue } from '~/composables/audio/queue'
|
||||
import type { Track } from '~/types'
|
||||
|
||||
const { tracks, enqueue, dequeue, clear, reorder, currentIndex } = useQueue()
|
||||
|
||||
describe('currentIndex', () => {
|
||||
beforeEach(async () => {
|
||||
await clear()
|
||||
await enqueue(
|
||||
{ id: 1, uploads: [] } as any as Track,
|
||||
{ id: 2, uploads: [] } as any as Track,
|
||||
{ id: 3, uploads: [] } as any as Track
|
||||
)
|
||||
})
|
||||
|
||||
describe('clamp', () => {
|
||||
it('should be clamped to queue size', () => {
|
||||
currentIndex.value = 100
|
||||
expect(currentIndex.value).toBe(2)
|
||||
|
||||
currentIndex.value = -100
|
||||
expect(currentIndex.value).toBe(0)
|
||||
})
|
||||
|
||||
it('should be clamped to queue size after enqueue', async () => {
|
||||
await enqueue({ id: 4, uploads: [] } as any as Track)
|
||||
|
||||
currentIndex.value = 100
|
||||
expect(currentIndex.value).toBe(3)
|
||||
|
||||
currentIndex.value = -100
|
||||
expect(currentIndex.value).toBe(0)
|
||||
})
|
||||
|
||||
it('should be clamped to queue size after clear', async () => {
|
||||
await clear()
|
||||
expect(currentIndex.value).toBe(0)
|
||||
|
||||
currentIndex.value = 100
|
||||
expect(currentIndex.value).toBe(0)
|
||||
|
||||
currentIndex.value = -100
|
||||
expect(currentIndex.value).toBe(0)
|
||||
})
|
||||
|
||||
it('should update currentIndex after removal of last track', async () => {
|
||||
await dequeue(2)
|
||||
|
||||
currentIndex.value = 100
|
||||
expect(currentIndex.value).toBe(1)
|
||||
|
||||
currentIndex.value = -100
|
||||
expect(currentIndex.value).toBe(0)
|
||||
})
|
||||
|
||||
it('should update currentIndex after removal of last track', async () => {
|
||||
currentIndex.value = 2
|
||||
tracks.value.splice(2, 1)
|
||||
expect(currentIndex.value).toBe(1)
|
||||
|
||||
currentIndex.value = 100
|
||||
expect(currentIndex.value).toBe(1)
|
||||
|
||||
currentIndex.value = -100
|
||||
expect(currentIndex.value).toBe(0)
|
||||
})
|
||||
|
||||
it('should update currentIndex after removal of middle track', async () => {
|
||||
currentIndex.value = 2
|
||||
tracks.value.splice(1, 1)
|
||||
expect(currentIndex.value).toBe(1)
|
||||
|
||||
currentIndex.value = 100
|
||||
expect(currentIndex.value).toBe(1)
|
||||
|
||||
currentIndex.value = -100
|
||||
expect(currentIndex.value).toBe(0)
|
||||
})
|
||||
})
|
||||
})
|
||||
|
||||
describe('Ordered queue', () => {
|
||||
beforeEach(async () => {
|
||||
await clear()
|
||||
await enqueue(
|
||||
{ id: 1, uploads: [] } as any as Track,
|
||||
{ id: 2, uploads: [] } as any as Track,
|
||||
{ id: 3, uploads: [] } as any as Track
|
||||
)
|
||||
})
|
||||
|
||||
describe('first track is playing', () => {
|
||||
beforeEach(() => {
|
||||
currentIndex.value = 0
|
||||
})
|
||||
|
||||
it('reorder current track to the middle', () => {
|
||||
reorder(0, 1)
|
||||
expect(tracks.value).toEqual([2, 1, 3])
|
||||
expect(currentIndex.value).toBe(1)
|
||||
})
|
||||
|
||||
it('reorder current track to the end', () => {
|
||||
reorder(0, 2)
|
||||
expect(tracks.value).toEqual([2, 3, 1])
|
||||
expect(currentIndex.value).toBe(2)
|
||||
})
|
||||
|
||||
it('reorder middle track to the beginning', () => {
|
||||
reorder(1, 0)
|
||||
expect(tracks.value).toEqual([2, 1, 3])
|
||||
expect(currentIndex.value).toBe(1)
|
||||
})
|
||||
|
||||
it('reorder middle track to the end', () => {
|
||||
reorder(1, 2)
|
||||
expect(tracks.value).toEqual([1, 3, 2])
|
||||
expect(currentIndex.value).toBe(0)
|
||||
})
|
||||
|
||||
it('reorder last track to the beginning', () => {
|
||||
reorder(2, 0)
|
||||
expect(tracks.value).toEqual([3, 1, 2])
|
||||
expect(currentIndex.value).toBe(1)
|
||||
})
|
||||
|
||||
it('reorder last track to the middle', () => {
|
||||
reorder(2, 1)
|
||||
expect(tracks.value).toEqual([1, 3, 2])
|
||||
expect(currentIndex.value).toBe(0)
|
||||
})
|
||||
})
|
||||
|
||||
describe('middle track is playing', () => {
|
||||
beforeEach(() => {
|
||||
currentIndex.value = 1
|
||||
})
|
||||
|
||||
it('reorder current track to the beginning', () => {
|
||||
reorder(1, 0)
|
||||
expect(tracks.value).toEqual([2, 1, 3])
|
||||
expect(currentIndex.value).toBe(0)
|
||||
})
|
||||
|
||||
it('reorder current track to the end', () => {
|
||||
reorder(1, 2)
|
||||
expect(tracks.value).toEqual([1, 3, 2])
|
||||
expect(currentIndex.value).toBe(2)
|
||||
})
|
||||
|
||||
it('reorder first track to the middle', () => {
|
||||
reorder(0, 1)
|
||||
expect(tracks.value).toEqual([2, 1, 3])
|
||||
expect(currentIndex.value).toBe(0)
|
||||
})
|
||||
|
||||
it('reorder first track to the end', () => {
|
||||
reorder(0, 2)
|
||||
expect(tracks.value).toEqual([2, 3, 1])
|
||||
expect(currentIndex.value).toBe(0)
|
||||
})
|
||||
|
||||
it('reorder last track to the beginning', () => {
|
||||
reorder(2, 0)
|
||||
expect(tracks.value).toEqual([3, 1, 2])
|
||||
expect(currentIndex.value).toBe(2)
|
||||
})
|
||||
|
||||
it('reorder last track to the middle', () => {
|
||||
reorder(2, 1)
|
||||
expect(tracks.value).toEqual([1, 3, 2])
|
||||
expect(currentIndex.value).toBe(2)
|
||||
})
|
||||
})
|
||||
|
||||
describe('last track is playing', () => {
|
||||
beforeEach(() => {
|
||||
currentIndex.value = 2
|
||||
})
|
||||
|
||||
it('reorder current track to the beginning', () => {
|
||||
reorder(2, 0)
|
||||
expect(tracks.value).toEqual([3, 1, 2])
|
||||
expect(currentIndex.value).toBe(0)
|
||||
})
|
||||
|
||||
it('reorder current track to the middle', () => {
|
||||
reorder(2, 1)
|
||||
expect(tracks.value).toEqual([1, 3, 2])
|
||||
expect(currentIndex.value).toBe(1)
|
||||
})
|
||||
|
||||
it('reorder first track to the middle', () => {
|
||||
reorder(0, 1)
|
||||
expect(tracks.value).toEqual([2, 1, 3])
|
||||
expect(currentIndex.value).toBe(2)
|
||||
})
|
||||
|
||||
it('reorder first track to the end', () => {
|
||||
reorder(0, 2)
|
||||
expect(tracks.value).toEqual([2, 3, 1])
|
||||
expect(currentIndex.value).toBe(1)
|
||||
})
|
||||
|
||||
it('reorder middle track to the beginning', () => {
|
||||
reorder(1, 0)
|
||||
expect(tracks.value).toEqual([2, 1, 3])
|
||||
expect(currentIndex.value).toBe(2)
|
||||
})
|
||||
|
||||
it('reorder middle track to the end', () => {
|
||||
reorder(1, 2)
|
||||
expect(tracks.value).toEqual([1, 3, 2])
|
||||
expect(currentIndex.value).toBe(1)
|
||||
})
|
||||
})
|
||||
})
|
||||
|
||||
// TODO: Add tests for the shuffled queue
|
||||
// describe('Shuffled queue', () => {
|
||||
// beforeEach(async () => {
|
||||
// await clear()
|
||||
// await enqueue(
|
||||
// { id: 1, uploads: [] } as any as Track,
|
||||
// { id: 2, uploads: [] } as any as Track,
|
||||
// { id: 3, uploads: [] } as any as Track,
|
||||
// )
|
||||
//
|
||||
// shuffle()
|
||||
// })
|
||||
// })
|
|
@ -3,7 +3,8 @@ import AlbumDetail from '~/views/admin/library/AlbumDetail.vue'
|
|||
import SanitizedHtml from '~/components/SanitizedHtml.vue'
|
||||
import HumanDate from '~/components/common/HumanDate.vue'
|
||||
|
||||
import moxios from 'moxios'
|
||||
import MockAdapter from 'axios-mock-adapter'
|
||||
import axios from 'axios'
|
||||
|
||||
import { shallowMount } from '@vue/test-utils'
|
||||
import { sleep } from '?/utils'
|
||||
|
@ -11,23 +12,15 @@ import { sleep } from '?/utils'
|
|||
import router from '~/router'
|
||||
import store from '~/store'
|
||||
|
||||
beforeEach(() => moxios.install())
|
||||
afterEach(() => moxios.uninstall())
|
||||
const axiosMock = new MockAdapter(axios)
|
||||
|
||||
describe('views/admin/library', () => {
|
||||
describe('Album details', () => {
|
||||
it('displays default cover', async () => {
|
||||
const album = { cover: null, artist: { id: 1 }, title: 'dummy', id: 1, creation_date: '2020-01-01' }
|
||||
|
||||
moxios.stubRequest('manage/library/albums/1/', {
|
||||
status: 200,
|
||||
response: album
|
||||
})
|
||||
|
||||
moxios.stubRequest('manage/library/albums/1/stats/', {
|
||||
status: 200,
|
||||
response: {}
|
||||
})
|
||||
axiosMock.onGet('manage/library/albums/1/').reply(200, album)
|
||||
axiosMock.onGet('manage/library/albums/1/stats/').reply(200, {})
|
||||
|
||||
const wrapper = shallowMount(AlbumDetail, {
|
||||
props: { id: 1 },
|
||||
|
|
|
@ -7,6 +7,9 @@ import { visualizer } from 'rollup-plugin-visualizer'
|
|||
|
||||
import manifest from './pwa-manifest.json'
|
||||
import Inspector from 'vite-plugin-vue-inspector'
|
||||
import { defineConfig } from 'vite'
|
||||
|
||||
|
||||
|
||||
const port = +(process.env.VUE_PORT ?? 8080)
|
||||
|
||||
|
@ -78,6 +81,10 @@ export default defineConfig(({ mode }) => ({
|
|||
src: './src',
|
||||
all: true,
|
||||
reporter: ['text', 'cobertura']
|
||||
}
|
||||
},
|
||||
setupFiles: [
|
||||
'./test/setup/mock-audio-context.ts',
|
||||
'./test/setup/mock-vue-i18n.ts',
|
||||
]
|
||||
}
|
||||
}))
|
||||
|
|
1241
front/yarn.lock
1241
front/yarn.lock
File diff suppressed because it is too large
Load Diff
Loading…
Reference in New Issue