diff --git a/.github/ISSUE_TEMPLATE/bug-report.yaml b/.github/ISSUE_TEMPLATE/bug-report.yaml index f2810119acdd..9e7d1d1b4062 100644 --- a/.github/ISSUE_TEMPLATE/bug-report.yaml +++ b/.github/ISSUE_TEMPLATE/bug-report.yaml @@ -42,7 +42,7 @@ body: id: logs attributes: label: Please provide relevant logs - placeholder: For example from `docker-compose logs` or other system logs. + placeholder: For example from `docker compose logs` or other system logs. validations: required: true - type: textarea diff --git a/.github/workflows/stale.yml b/.github/workflows/stale.yml index c0d0614bf2dc..b59342b2f3e9 100644 --- a/.github/workflows/stale.yml +++ b/.github/workflows/stale.yml @@ -11,7 +11,7 @@ jobs: - uses: actions/stale@v9 with: stale-issue-label: 'stale' - exempt-issue-labels: 'pinned,security,early-stages,"bug: confirmed",feedback,task' + exempt-issue-labels: 'pinned,security,early-stages,bug: confirmed,feedback,task' stale-issue-message: 'This issue has been automatically marked as stale because it has not had recent activity. It will be closed if no further activity occurs. Thank you for your contributions.' days-before-issue-stale: 30 days-before-issue-close: 5 @@ -20,6 +20,21 @@ jobs: days-before-pr-stale: 45 # This stops a PR from ever getting closed automatically. days-before-pr-close: -1 + # If an issue/PR has a milestone, it's exempt from being marked as stale. + exempt-all-milestones: true # For initial implementation - this stops any actual updates happening. # We can review the output and then decide how to proceed. I will own this action. debug-only: true + # How many API calls will we allow the action to make, essentially. + # Doco: https://github.com/actions/stale?tab=readme-ov-file#operations-per-run + operations-per-run: 150 + ######################################################################## + # The below are just default values, but populating here for reference # + ######################################################################## + # Automatically remove the stale label when the issues or the pull requests are updated + remove-stale-when-updated: true + # The reason used when closing issues. Valid values are `completed` and `not_planned`. + close-issue-reason: 'not_planned' + # If true, PRs currently in draft will not be marked as stale automatically. + # We can mark them stale (after `days-before-pr-stale`), though we don't auto-close. + exempt-draft-pr: false diff --git a/dev/code-generation/gen_ts_locales.py b/dev/code-generation/gen_ts_locales.py index 451918c3038e..397d2b79a495 100644 --- a/dev/code-generation/gen_ts_locales.py +++ b/dev/code-generation/gen_ts_locales.py @@ -1,4 +1,5 @@ import pathlib +from dataclasses import dataclass from pathlib import Path import dotenv @@ -15,38 +16,44 @@ BASE = pathlib.Path(__file__).parent.parent.parent API_KEY = dotenv.get_key(BASE / ".env", "CROWDIN_API_KEY") -NAMES = { - "en-US": "American English", - "en-GB": "British English", - "af-ZA": "Afrikaans (Afrikaans)", - "ar-SA": "العربية (Arabic)", - "ca-ES": "Català (Catalan)", - "cs-CZ": "Čeština (Czech)", - "da-DK": "Dansk (Danish)", - "de-DE": "Deutsch (German)", - "el-GR": "Ελληνικά (Greek)", - "es-ES": "Español (Spanish)", - "fi-FI": "Suomi (Finnish)", - "fr-FR": "Français (French)", - "he-IL": "עברית (Hebrew)", - "hu-HU": "Magyar (Hungarian)", - "it-IT": "Italiano (Italian)", - "ja-JP": "日本語 (Japanese)", - "ko-KR": "한국어 (Korean)", - "no-NO": "Norsk (Norwegian)", - "nl-NL": "Nederlands (Dutch)", - "pl-PL": "Polski (Polish)", - "pt-BR": "Português do Brasil (Brazilian Portuguese)", - "pt-PT": "Português (Portuguese)", - "ro-RO": "Română (Romanian)", - "ru-RU": "Pусский (Russian)", - "sr-SP": "српски (Serbian)", - "sv-SE": "Svenska (Swedish)", - "tr-TR": "Türkçe (Turkish)", - "uk-UA": "Українська (Ukrainian)", - "vi-VN": "Tiếng Việt (Vietnamese)", - "zh-CN": "简体中文 (Chinese simplified)", - "zh-TW": "繁體中文 (Chinese traditional)", +@dataclass +class LocaleData: + name: str + dir: str = "ltr" + + +LOCALE_DATA: dict[str, LocaleData] = { + "en-US": LocaleData(name="American English"), + "en-GB": LocaleData(name="British English"), + "af-ZA": LocaleData(name="Afrikaans (Afrikaans)"), + "ar-SA": LocaleData(name="العربية (Arabic)", dir="rtl"), + "ca-ES": LocaleData(name="Català (Catalan)"), + "cs-CZ": LocaleData(name="Čeština (Czech)"), + "da-DK": LocaleData(name="Dansk (Danish)"), + "de-DE": LocaleData(name="Deutsch (German)"), + "el-GR": LocaleData(name="Ελληνικά (Greek)"), + "es-ES": LocaleData(name="Español (Spanish)"), + "fi-FI": LocaleData(name="Suomi (Finnish)"), + "fr-FR": LocaleData(name="Français (French)"), + "he-IL": LocaleData(name="עברית (Hebrew)", dir="rtl"), + "hu-HU": LocaleData(name="Magyar (Hungarian)"), + "it-IT": LocaleData(name="Italiano (Italian)"), + "ja-JP": LocaleData(name="日本語 (Japanese)"), + "ko-KR": LocaleData(name="한국어 (Korean)"), + "no-NO": LocaleData(name="Norsk (Norwegian)"), + "nl-NL": LocaleData(name="Nederlands (Dutch)"), + "pl-PL": LocaleData(name="Polski (Polish)"), + "pt-BR": LocaleData(name="Português do Brasil (Brazilian Portuguese)"), + "pt-PT": LocaleData(name="Português (Portuguese)"), + "ro-RO": LocaleData(name="Română (Romanian)"), + "ru-RU": LocaleData(name="Pусский (Russian)"), + "sr-SP": LocaleData(name="српски (Serbian)"), + "sv-SE": LocaleData(name="Svenska (Swedish)"), + "tr-TR": LocaleData(name="Türkçe (Turkish)"), + "uk-UA": LocaleData(name="Українська (Ukrainian)"), + "vi-VN": LocaleData(name="Tiếng Việt (Vietnamese)"), + "zh-CN": LocaleData(name="简体中文 (Chinese simplified)"), + "zh-TW": LocaleData(name="繁體中文 (Chinese traditional)"), } LOCALE_TEMPLATE = """// This Code is auto generated by gen_global_components.py @@ -55,6 +62,7 @@ export const LOCALES = [{% for locale in locales %} name: "{{ locale.name }}", value: "{{ locale.locale }}", progress: {{ locale.progress }}, + dir: "{{ locale.dir }}", },{% endfor %} ] @@ -65,12 +73,14 @@ class TargetLanguage(MealieModel): id: str name: str locale: str + dir: str = "ltr" threeLettersCode: str twoLettersCode: str progress: float = 0.0 class Config: extra = Extra.allow + allow_population_by_field_name = True class CrowdinApi: @@ -103,15 +113,23 @@ class CrowdinApi: models.insert( 0, TargetLanguage( - id="en-US", name="English", locale="en-US", threeLettersCode="en", twoLettersCode="en", progress=100 + id="en-US", + name="English", + locale="en-US", + dir="ltr", + threeLettersCode="en", + twoLettersCode="en", + progress=100, ), ) progress: list[dict] = self.get_progress()["data"] for model in models: - if model.locale in NAMES: - model.name = NAMES[model.locale] + if model.locale in LOCALE_DATA: + locale_data = LOCALE_DATA[model.locale] + model.name = locale_data.name + model.dir = locale_data.dir for p in progress: if p["data"]["languageId"] == model.id: diff --git a/docs/docs/contributors/developers-guide/maintainers.md b/docs/docs/contributors/developers-guide/maintainers.md index f62c940848af..e2ef9e610661 100644 --- a/docs/docs/contributors/developers-guide/maintainers.md +++ b/docs/docs/contributors/developers-guide/maintainers.md @@ -1,6 +1,6 @@ # Maintainers Guide -This is the start of the maintainers guide for Mealie developers. Those who have been invited to the GitHub organization and/or those who whish to play a bigger part in the Mealie developers community may find this helpful. +This is the start of the maintainers guide for Mealie developers. Those who have been invited to the GitHub organization and/or those who wish to play a bigger part in the Mealie developers community may find this helpful. ## Managing Issues @@ -13,7 +13,7 @@ After you've reviered an issue it will generally move into one of two states: `needs more info` -: The orignal post does not contain enough information, and if the reporter does not provide additional information, the issue will be automatically closed. +: The original post does not contain enough information, and if the reporter does not provide additional information, the issue will be automatically closed. Once you've reviewed an issue and moved it into another category, you should remove the triage label. @@ -40,18 +40,38 @@ Mealie is published via GitHub actions to the GitHub container registry with the : published when a new GitHub Release is created - [Actions File](https://github.com/mealie-recipes/mealie/blob/mealie-next/.github/workflows/release.yml) !!! note - Both the latest, and {version} tags will be the same container on the release of a new version + Both the latest, and {version} tags will be the same image on the release of a new version ### Process -Because we've built all our publishing effors on GitHub Actions we rely primarily on automations to perform our releases. As such creating a new build of Mealie is as simple as creating a new GitHub release. Here are the general steps we take to create a new release +Because we've built all our publishing efforts on GitHub Actions we rely primarily on automations to perform our releases. As such creating a new build of Mealie is as simple as creating a new GitHub release. Here are the general steps we take to create a new release 1. Navigate to the [Github Release Page](https://github.com/mealie-recipes/mealie/releases) and click the 'Draft a new release' button. 2. Choose a tag and increment the version according to the semver specification. i.e, **major** version for breaking changes, **minor** for feature updates, and **patch** for bug fixes. -3. Name the Release, usually just the tag is fine, however if there is a special feature you'd like to higlight this would be a great place to do it. +3. Name the Release, usually just the tag is fine, however if there is a special feature you'd like to highlight this would be a great place to do it. 4. Click the "Generate release notes" button which will pull in all the Git Commits as a changelog. For bug fix only releases this is sufficient, however if there are major features, or good quality of life improvements it's good to provide those prior to listing the full changelog. !!! tip Don't worry about setting the version number in the container or code, it's set during the build process and uses the tag you specified when drafting a new release. You can see how this is done in the [Actions File](https://github.com/mealie-recipes/mealie/blob/mealie-next/.github/workflows/partial-builder.yml#L35-L37) + +### Tags and Releases + +Mealie tries to adhere to a strict [Semver](https://semver.org/) policy. This means that we try to keep our releases as stable as possible, and only introduce breaking changes when absolutely necessary. As such we try to keep our releases as follows: + +- **Major** releases are reserved for breaking changes, and are not expected to be frequent. Ideally, we will remain at v1.x.x for the forseeable future. +- **Minor** releases are reserved for new features, and are expected to be frequent. +- **Patch** releases are reserved for bug fixes, and are expected to be frequent. + +Any maintainer who has privileges on GitHub to create a new release can create a release at any time they feel it is necessary. However, it is recommended that you reach out in the discord to other maintainers and get at least one other maintainer to approve the release. + +An important caveat to this is that we _may_ make breaking changes in a minor release if it is security related. In this case, the releaser should headline the release notes with the notice and impact of the breaking change, however we may not bump the major version depending on user impact. + +### Release Notes + +When drafting a new release, GitHub will automatically pull in all the commits since the last release. This is a great start. After pulling in all of the commits, you should add sections for + +- New Features - Any new features that are being introduced in this release (screenshots are great here) +- Bug Fixes - Significant bug fixes that are being introduced in this release, smaller bug fixes can be left out if they are noted in a commit message +- Breaking Changes - Any breaking changes that are being introduced in this release (should be rare) diff --git a/docs/docs/documentation/community-guide/swag.md b/docs/docs/documentation/community-guide/swag.md index 3751271e6648..682b205aa90d 100644 --- a/docs/docs/documentation/community-guide/swag.md +++ b/docs/docs/documentation/community-guide/swag.md @@ -5,7 +5,7 @@ -To make the setup of a Reverse Proxy much easier, Linuxserver.io developed [SWAG](https://github.com/linuxserver/docker-swag) +To make the setup of a Reverse Proxy much easier, Linuxserver.io developed [SWAG](https://github.com/linuxserver/docker-swag) SWAG - Secure Web Application Gateway (formerly known as letsencrypt, no relation to Let's Encrypt™) sets up an Nginx web server and reverse proxy with PHP support and a built-in certbot client that automates free SSL server certificate generation and renewal processes (Let's Encrypt and ZeroSSL). It also contains fail2ban for intrusion prevention. ## Step 1: Get a domain @@ -14,39 +14,38 @@ The first step is to grab a dynamic DNS if you don't have your own subdomain alr ## Step 2: Set-up SWAG -Then you will need to set up SWAG, the variables of the docker-compose are explained on the Github page of [SWAG](https://github.com/linuxserver/docker-swag). -This is an example of how to set it up using duckdns and docker-compose. +Then you will need to set up SWAG, the variables of the docker-compose.yaml file are explained on the Github page of [SWAG](https://github.com/linuxserver/docker-swag). +This is an example of how to set it up using duckdns and docker compose. -!!! example "docker-compose.yml" +!!! example "docker-compose.yaml" ```yaml version: "3.1" services: -swag: -image: ghcr.io/linuxserver/swag -container_name: swag -cap_add: -- NET_ADMIN -environment: -- PUID=1000 -- PGID=1000 -- TZ=Europe/Brussels -- URL= -- SUBDOMAINS=wildcard -- VALIDATION=duckdns -- CERTPROVIDER= #optional -- DNSPLUGIN= #optional -- DUCKDNSTOKEN= -- EMAIL= #optional -- ONLY_SUBDOMAINS=false #optional -- EXTRA_DOMAINS= #optional -- STAGING=false #optional -volumes: -- /etc/config/swag:/config -ports: -- 443:443 -- 80:80 #optional -restart: unless-stopped - + swag: + image: ghcr.io/linuxserver/swag + container_name: swag + cap_add: + - NET_ADMIN + environment: + - PUID=1000 + - PGID=1000 + - TZ=Europe/Brussels + - URL= + - SUBDOMAINS=wildcard + - VALIDATION=duckdns + - CERTPROVIDER= #optional + - DNSPLUGIN= #optional + - DUCKDNSTOKEN= + - EMAIL= #optional + - ONLY_SUBDOMAINS=false #optional + - EXTRA_DOMAINS= #optional + - STAGING=false #optional + volumes: + - /etc/config/swag:/config + ports: + - 443:443 + - 80:80 #optional + restart: unless-stopped ``` Don't forget to change the mydomain.duckns into your personal domain and the duckdnstoken into your token and remove the brackets. @@ -61,26 +60,25 @@ Alternatively, you can create a new file mealie.subdomain.conf in p !!! example "mealie.subdomain.conf" ```yaml - server { - listen 443 ssl http2; - listen [::]:443 ssl http2; +server { + listen 443 ssl http2; + listen [::]:443 ssl http2; - server_name mealie.*; + server_name mealie.*; - include /config/nginx/ssl.conf; + include /config/nginx/ssl.conf; - client_max_body_size 0; + client_max_body_size 0; - location / { - include /config/nginx/proxy.conf; - include /config/nginx/resolver.conf; - set $upstream_app mealie-frontend; - set $upstream_port 3000; - set $upstream_proto http; - proxy_pass $upstream_proto://$upstream_app:$upstream_port; - } - - } + location / { + include /config/nginx/proxy.conf; + include /config/nginx/resolver.conf; + set $upstream_app mealie-frontend; + set $upstream_port 3000; + set $upstream_proto http; + proxy_pass $upstream_proto://$upstream_app:$upstream_port; + } +} ``` ## Step 4: Port-forward port 443 diff --git a/docs/docs/documentation/getting-started/installation/installation-checklist.md b/docs/docs/documentation/getting-started/installation/installation-checklist.md index 7155987bb24a..5c16abefdd0e 100644 --- a/docs/docs/documentation/getting-started/installation/installation-checklist.md +++ b/docs/docs/documentation/getting-started/installation/installation-checklist.md @@ -72,7 +72,7 @@ After you've decided setup the files it's important to set a few ENV variables t After you've configured your database and updated the `docker-compose.yaml` files, you can start Mealie by running the following command in the directory where you've added your `docker-compose.yaml`. ```bash -$ docker-compose up -d +$ docker compose up -d ``` You should see the containers start up without error. You should now be able to access the Mealie frontend at [http://localhost:9925](http://localhost:9925). @@ -113,8 +113,6 @@ We also provide versioned containers that allow to pin to a specific release. Ea `ghcr.io/mealie-recipes/mealie:latest` -_Note: This tag is not yet available; it will be available with the v1 stable release_ - The latest tag provides the latest released image of Mealie. --- diff --git a/docs/docs/documentation/getting-started/installation/postgres.md b/docs/docs/documentation/getting-started/installation/postgres.md index 0720ef4314a9..7c106a9d6171 100644 --- a/docs/docs/documentation/getting-started/installation/postgres.md +++ b/docs/docs/documentation/getting-started/installation/postgres.md @@ -9,14 +9,14 @@ PostgreSQL might be considered if you need to support many concurrent users. In version: "3.7" services: mealie: - image: ghcr.io/mealie-recipes/mealie:v1.0.0-RC2 + image: ghcr.io/mealie-recipes/mealie:v1.0.0 # (3) container_name: mealie ports: - - "9925:9000" + - "9925:9000" # (1) deploy: resources: limits: - memory: 1000M # (1) + memory: 1000M # (2) depends_on: - postgres volumes: @@ -60,3 +60,4 @@ volumes: 1. To access the mealie interface you only need to expose port 9000 on the mealie container. Here we expose port 9925 on the host, but feel free to change this to any port you like. 2. Setting an explicit memory limit is recommended. Python can pre-allocate larger amounts of memory than is necessary if you have a machine with a lot of RAM. This can cause the container to idle at a high memory usage. Setting a memory limit will improve idle performance. +3. Whilst a 'latest' tag is available, the Mealie team advises specifying a specific version tag and consciously updating to newer versions when you have time to read the release notes and ensure you follow any manual actions required (which should be rare). diff --git a/docs/docs/documentation/getting-started/installation/sqlite.md b/docs/docs/documentation/getting-started/installation/sqlite.md index 2487cb2ae533..10a054688c60 100644 --- a/docs/docs/documentation/getting-started/installation/sqlite.md +++ b/docs/docs/documentation/getting-started/installation/sqlite.md @@ -1,5 +1,9 @@ # Installing with SQLite +!!! Warning + If you're planning on deploying and using Network Attached Storage with Mealie, you should use [Postgres](./postgres.md) instead of SQLite. SQLite is not designed to be used with Network Attached Storage and can cause data corruption, or locked database errors + + SQLite is a popular, open source, self-contained, zero-configuration database that is the ideal choice for Mealie when you have 1-20 Users. Below is a ready to use docker-compose.yaml file for deploying Mealie on your server. **For Environment Variable Configuration, see** [Backend Configuration](./backend-config.md) @@ -9,7 +13,7 @@ SQLite is a popular, open source, self-contained, zero-configuration database th version: "3.7" services: mealie: - image: ghcr.io/mealie-recipes/mealie:v1.0.0-RC2 + image: ghcr.io/mealie-recipes/mealie:v1.0.0 # (3) container_name: mealie ports: - "9925:9000" # (1) @@ -39,3 +43,4 @@ volumes: 1. To access the mealie interface you only need to expose port 9000 on the container. Here we expose port 9925 on the host, but feel free to change this to any port you like. 2. Setting an explicit memory limit is recommended. Python can pre-allocate larger amounts of memory than is necessary if you have a machine with a lot of RAM. This can cause the container to idle at a high memory usage. Setting a memory limit will improve idle performance. +3. Whilst a 'latest' tag is available, the Mealie team advises specifying a specific version tag and consciously updating to newer versions when you have time to read the release notes and ensure you follow any manual actions required (which should be rare). diff --git a/docs/docs/documentation/getting-started/introduction.md b/docs/docs/documentation/getting-started/introduction.md index 776d9312043f..010de5edf569 100644 --- a/docs/docs/documentation/getting-started/introduction.md +++ b/docs/docs/documentation/getting-started/introduction.md @@ -1,11 +1,5 @@ # About The Project -!!! warning "Mealie v1 Beta Release" - - This documentation is for the Mealie v1 Beta release and is not final. As such, it may contain incomplete or incorrect information. You should understand that installing Mealie v1 Beta is a work in progress and while we've committed to maintaining the database schema and provided migrations, we are still in the process of adding new features, and robust testing to ensure the application works as expected. - - You should likely find bugs, errors, and unfinished pages within the application. To find the current status of the release you can checkout the [project on github](https://github.com/mealie-recipes/mealie/projects/7) or reach out on discord. - Mealie is a self hosted recipe manager and meal planner with a RestAPI backend and a reactive frontend application built in Vue for a pleasant user experience for the whole family. Easily add recipes into your database by providing the url and Mealie will automatically import the relevant data or add a family recipe with the UI editor. Mealie also provides an API for interactions from 3rd party applications. [Remember to join the Discord](https://discord.gg/QuStdQGSGK) diff --git a/docs/docs/documentation/getting-started/updating.md b/docs/docs/documentation/getting-started/updating.md index 72eca9fb717d..6917bc35bb9c 100644 --- a/docs/docs/documentation/getting-started/updating.md +++ b/docs/docs/documentation/getting-started/updating.md @@ -19,6 +19,7 @@ If you are upgrading from pre-v1.0.0 to v1.0.0, make sure you read [Migrating to ## Docker For all setups using Docker the updating process looks something like this -- Stop the container using `docker-compose down` -- Pull the latest image using `docker-compose pull` -- Start the container again using `docker-compose up -d` +- Stop the container using `docker compose down` +- If you are not using the latest tag, change the version (image tag) in your docker-compose file +- Pull the latest image using `docker compose pull` +- Start the container again using `docker compose up -d` diff --git a/docs/docs/overrides/api.html b/docs/docs/overrides/api.html index 2d2576ae0aaf..0453ef08a823 100644 --- a/docs/docs/overrides/api.html +++ b/docs/docs/overrides/api.html @@ -14,7 +14,7 @@
diff --git a/frontend/composables/use-locales/available-locales.ts b/frontend/composables/use-locales/available-locales.ts index d0737020e5c7..a00b0641d5da 100644 --- a/frontend/composables/use-locales/available-locales.ts +++ b/frontend/composables/use-locales/available-locales.ts @@ -3,196 +3,241 @@ export const LOCALES = [ { name: "繁體中文 (Chinese traditional)", value: "zh-TW", - progress: 28, + progress: 30, + dir: "ltr", }, { name: "简体中文 (Chinese simplified)", value: "zh-CN", - progress: 65, + progress: 98, + dir: "ltr", }, { name: "Tiếng Việt (Vietnamese)", value: "vi-VN", - progress: 2, + progress: 1, + dir: "ltr", }, { name: "Українська (Ukrainian)", value: "uk-UA", - progress: 99, + progress: 100, + dir: "ltr", }, { name: "Türkçe (Turkish)", value: "tr-TR", - progress: 50, + progress: 53, + dir: "ltr", }, { name: "Svenska (Swedish)", value: "sv-SE", - progress: 71, + progress: 94, + dir: "ltr", }, { name: "српски (Serbian)", value: "sr-SP", - progress: 4, + progress: 32, + dir: "ltr", }, { name: "Slovenian", value: "sl-SI", - progress: 49, + progress: 47, + dir: "ltr", }, { name: "Slovak", value: "sk-SK", - progress: 97, + progress: 93, + dir: "ltr", }, { name: "Pусский (Russian)", value: "ru-RU", - progress: 99, + progress: 98, + dir: "ltr", }, { name: "Română (Romanian)", value: "ro-RO", - progress: 32, + progress: 42, + dir: "ltr", }, { name: "Português (Portuguese)", value: "pt-PT", - progress: 99, + progress: 100, + dir: "ltr", }, { name: "Português do Brasil (Brazilian Portuguese)", value: "pt-BR", - progress: 98, + progress: 97, + dir: "ltr", }, { name: "Polski (Polish)", value: "pl-PL", - progress: 97, + progress: 98, + dir: "ltr", }, { name: "Norsk (Norwegian)", value: "no-NO", - progress: 85, + progress: 99, + dir: "ltr", }, { name: "Nederlands (Dutch)", value: "nl-NL", - progress: 98, + progress: 100, + dir: "ltr", }, { name: "Latvian", value: "lv-LV", progress: 1, + dir: "ltr", }, { name: "Lithuanian", value: "lt-LT", - progress: 97, + progress: 93, + dir: "ltr", }, { name: "한국어 (Korean)", value: "ko-KR", progress: 5, + dir: "ltr", }, { name: "日本語 (Japanese)", value: "ja-JP", - progress: 11, + progress: 12, + dir: "ltr", }, { name: "Italiano (Italian)", value: "it-IT", - progress: 96, + progress: 100, + dir: "ltr", + }, + { + name: "Icelandic", + value: "is-IS", + progress: 0, + dir: "ltr", }, { name: "Magyar (Hungarian)", value: "hu-HU", - progress: 99, + progress: 100, + dir: "ltr", }, { name: "Croatian", value: "hr-HR", - progress: 97, + progress: 93, + dir: "ltr", }, { name: "עברית (Hebrew)", value: "he-IL", - progress: 99, + progress: 97, + dir: "rtl", }, { name: "Galician", value: "gl-ES", progress: 1, + dir: "ltr", }, { name: "Français (French)", value: "fr-FR", - progress: 99, + progress: 100, + dir: "ltr", }, { name: "French, Canada", value: "fr-CA", progress: 97, + dir: "ltr", }, { name: "Suomi (Finnish)", value: "fi-FI", - progress: 95, + progress: 91, + dir: "ltr", }, { name: "Español (Spanish)", value: "es-ES", - progress: 76, + progress: 79, + dir: "ltr", }, { name: "American English", value: "en-US", progress: 100.0, + dir: "ltr", }, { name: "British English", value: "en-GB", - progress: 4, + progress: 3, + dir: "ltr", }, { name: "Ελληνικά (Greek)", value: "el-GR", - progress: 35, + progress: 34, + dir: "ltr", }, { name: "Deutsch (German)", value: "de-DE", - progress: 99, + progress: 100, + dir: "ltr", }, { name: "Dansk (Danish)", value: "da-DK", - progress: 100, + progress: 98, + dir: "ltr", }, { name: "Čeština (Czech)", value: "cs-CZ", - progress: 66, + progress: 64, + dir: "ltr", }, { name: "Català (Catalan)", value: "ca-ES", - progress: 61, + progress: 75, + dir: "ltr", }, { name: "Bulgarian", value: "bg-BG", progress: 99, + dir: "ltr", }, { name: "العربية (Arabic)", value: "ar-SA", - progress: 16, + progress: 20, + dir: "rtl", }, { name: "Afrikaans (Afrikaans)", value: "af-ZA", - progress: 96, + progress: 92, + dir: "ltr", }, ] diff --git a/frontend/composables/use-locales/use-locales.ts b/frontend/composables/use-locales/use-locales.ts index 51af085099c7..f710260ff4a3 100644 --- a/frontend/composables/use-locales/use-locales.ts +++ b/frontend/composables/use-locales/use-locales.ts @@ -4,14 +4,31 @@ import { LOCALES } from "./available-locales"; export const useLocales = () => { const { i18n, $vuetify } = useContext(); + function getLocale(value: string) { + const currentLocale = LOCALES.filter((locale) => locale.value === value); + return currentLocale.length ? currentLocale[0] : null; + } + const locale = computed({ get() { - $vuetify.lang.current = i18n.locale; // dirty hack + // dirty hack + $vuetify.lang.current = i18n.locale; + const currentLocale = getLocale(i18n.locale); + if (currentLocale) { + $vuetify.rtl = currentLocale.dir === "rtl"; + } + return i18n.locale; }, set(value) { i18n.setLocale(value); - $vuetify.lang.current = value; // this does not persist after window reload :-( + + // this does not persist after window reload :-( + $vuetify.lang.current = value; + const currentLocale = getLocale(value); + if (currentLocale) { + $vuetify.rtl = currentLocale.dir === "rtl"; + } // Reload the page to update the language - not all strings are reactive window.location.reload(); diff --git a/frontend/lib/api/admin/admin-about.ts b/frontend/lib/api/admin/admin-about.ts index c736d3707473..83eb02a88f46 100644 --- a/frontend/lib/api/admin/admin-about.ts +++ b/frontend/lib/api/admin/admin-about.ts @@ -1,5 +1,5 @@ import { BaseAPI } from "../base/base-clients"; -import { AdminAboutInfo, DockerVolumeText, CheckAppConfig } from "~/lib/api/types/admin"; +import { AdminAboutInfo, CheckAppConfig } from "~/lib/api/types/admin"; const prefix = "/api"; @@ -24,10 +24,6 @@ export class AdminAboutAPI extends BaseAPI { return await this.requests.get(routes.check); } - async checkDocker() { - return await this.requests.get(routes.docker); - } - async getDockerValidateFileContents() { return await this.requests.get(routes.validationFile); } diff --git a/frontend/lib/api/types/admin.ts b/frontend/lib/api/types/admin.ts index e11d17f52f15..fe4225d2d7ce 100644 --- a/frontend/lib/api/types/admin.ts +++ b/frontend/lib/api/types/admin.ts @@ -151,9 +151,6 @@ export interface CustomPageOut { categories?: RecipeCategoryResponse[]; id: number; } -export interface DockerVolumeText { - text: string; -} export interface EmailReady { ready: boolean; } diff --git a/frontend/nuxt.config.js b/frontend/nuxt.config.js index 56e596e4259d..ce63574c4ba8 100644 --- a/frontend/nuxt.config.js +++ b/frontend/nuxt.config.js @@ -195,6 +195,7 @@ export default { { code: "fr-FR", file: "fr-FR.json" }, { code: "zh-TW", file: "zh-TW.json" }, { code: "af-ZA", file: "af-ZA.json" }, + { code: "is-IS", file: "is-IS.json" }, { code: "sl-SI", file: "sl-SI.json" }, { code: "ru-RU", file: "ru-RU.json" }, { code: "he-IL", file: "he-IL.json" }, diff --git a/frontend/pages/admin/backups.vue b/frontend/pages/admin/backups.vue index e3cf82d84c4a..3f253e907568 100644 --- a/frontend/pages/admin/backups.vue +++ b/frontend/pages/admin/backups.vue @@ -147,7 +147,7 @@ export default defineComponent({ async function createBackup() { const { data } = await adminApi.backups.create(); - if (!data?.error) { + if (data?.error === false) { refreshBackups(); alert.success(i18n.tc("settings.backup.backup-created")); } else { diff --git a/makefile b/makefile index 7bbdfbe81316..0dd70bf2d32f 100644 --- a/makefile +++ b/makefile @@ -28,9 +28,6 @@ docs: ## 📄 Start Mkdocs Development Server poetry run python dev/code-generation/gen_docs_api.py && \ cd docs && poetry run python -m mkdocs serve -code-gen: ## 🤖 Run Code-Gen Scripts - poetry run python dev/scripts/app_routes_gen.py - # ----------------------------------------------------------------------------- # Backend makefile @@ -55,7 +52,6 @@ setup-model: ## 🤖 Get the latest NLP CRF++ Model @echo Fetching NLP Model - CRF++ is still Required curl -L0 https://github.com/mealie-recipes/nlp-model/releases/download/v1.0.0/model.crfmodel --output ./mealie/services/parser_services/crfpp/model.crfmodel - clean-data: ## ⚠️ Removes All Developer Data for a fresh server start rm -r ./dev/data/recipes/ rm -r ./dev/data/users/ @@ -113,9 +109,6 @@ frontend: ## 🎬 Start Mealie Frontend Development Server frontend-build: ## 🏗 Build Frontend in frontend/dist cd frontend && yarn run build -frontend-generate: ## 🏗 Generate Code for Frontend - poetry run python dev/code-generation/gen_frontend_types.py - frontend-lint: ## 🧺 Run yarn lint cd frontend && yarn lint @@ -123,7 +116,7 @@ frontend-lint: ## 🧺 Run yarn lint # Docker makefile prod: ## 🐳 Build and Start Docker Production Stack - cd docker && docker compose -f docker-compose.yml -p mealie up --build + cd docker && docker compose -f docker compose.yml -p mealie up --build generate: poetry run python dev/code-generation/main.py diff --git a/poetry.lock b/poetry.lock index 3daaae680d50..6b982c68b841 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1685,47 +1685,47 @@ pyasn1 = ">=0.4.6,<0.5.0" [[package]] name = "pydantic" -version = "1.10.13" +version = "1.10.14" description = "Data validation and settings management using python type hints" optional = false python-versions = ">=3.7" files = [ - {file = "pydantic-1.10.13-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:efff03cc7a4f29d9009d1c96ceb1e7a70a65cfe86e89d34e4a5f2ab1e5693737"}, - {file = "pydantic-1.10.13-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:3ecea2b9d80e5333303eeb77e180b90e95eea8f765d08c3d278cd56b00345d01"}, - {file = "pydantic-1.10.13-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1740068fd8e2ef6eb27a20e5651df000978edce6da6803c2bef0bc74540f9548"}, - {file = "pydantic-1.10.13-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:84bafe2e60b5e78bc64a2941b4c071a4b7404c5c907f5f5a99b0139781e69ed8"}, - {file = "pydantic-1.10.13-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:bc0898c12f8e9c97f6cd44c0ed70d55749eaf783716896960b4ecce2edfd2d69"}, - {file = "pydantic-1.10.13-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:654db58ae399fe6434e55325a2c3e959836bd17a6f6a0b6ca8107ea0571d2e17"}, - {file = "pydantic-1.10.13-cp310-cp310-win_amd64.whl", hash = "sha256:75ac15385a3534d887a99c713aa3da88a30fbd6204a5cd0dc4dab3d770b9bd2f"}, - {file = "pydantic-1.10.13-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c553f6a156deb868ba38a23cf0df886c63492e9257f60a79c0fd8e7173537653"}, - {file = "pydantic-1.10.13-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:5e08865bc6464df8c7d61439ef4439829e3ab62ab1669cddea8dd00cd74b9ffe"}, - {file = "pydantic-1.10.13-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e31647d85a2013d926ce60b84f9dd5300d44535a9941fe825dc349ae1f760df9"}, - {file = "pydantic-1.10.13-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:210ce042e8f6f7c01168b2d84d4c9eb2b009fe7bf572c2266e235edf14bacd80"}, - {file = "pydantic-1.10.13-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:8ae5dd6b721459bfa30805f4c25880e0dd78fc5b5879f9f7a692196ddcb5a580"}, - {file = "pydantic-1.10.13-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:f8e81fc5fb17dae698f52bdd1c4f18b6ca674d7068242b2aff075f588301bbb0"}, - {file = "pydantic-1.10.13-cp311-cp311-win_amd64.whl", hash = "sha256:61d9dce220447fb74f45e73d7ff3b530e25db30192ad8d425166d43c5deb6df0"}, - {file = "pydantic-1.10.13-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:4b03e42ec20286f052490423682016fd80fda830d8e4119f8ab13ec7464c0132"}, - {file = "pydantic-1.10.13-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f59ef915cac80275245824e9d771ee939133be38215555e9dc90c6cb148aaeb5"}, - {file = "pydantic-1.10.13-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5a1f9f747851338933942db7af7b6ee8268568ef2ed86c4185c6ef4402e80ba8"}, - {file = "pydantic-1.10.13-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:97cce3ae7341f7620a0ba5ef6cf043975cd9d2b81f3aa5f4ea37928269bc1b87"}, - {file = "pydantic-1.10.13-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:854223752ba81e3abf663d685f105c64150873cc6f5d0c01d3e3220bcff7d36f"}, - {file = "pydantic-1.10.13-cp37-cp37m-win_amd64.whl", hash = "sha256:b97c1fac8c49be29486df85968682b0afa77e1b809aff74b83081cc115e52f33"}, - {file = "pydantic-1.10.13-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:c958d053453a1c4b1c2062b05cd42d9d5c8eb67537b8d5a7e3c3032943ecd261"}, - {file = "pydantic-1.10.13-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:4c5370a7edaac06daee3af1c8b1192e305bc102abcbf2a92374b5bc793818599"}, - {file = "pydantic-1.10.13-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7d6f6e7305244bddb4414ba7094ce910560c907bdfa3501e9db1a7fd7eaea127"}, - {file = "pydantic-1.10.13-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d3a3c792a58e1622667a2837512099eac62490cdfd63bd407993aaf200a4cf1f"}, - {file = "pydantic-1.10.13-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:c636925f38b8db208e09d344c7aa4f29a86bb9947495dd6b6d376ad10334fb78"}, - {file = "pydantic-1.10.13-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:678bcf5591b63cc917100dc50ab6caebe597ac67e8c9ccb75e698f66038ea953"}, - {file = "pydantic-1.10.13-cp38-cp38-win_amd64.whl", hash = "sha256:6cf25c1a65c27923a17b3da28a0bdb99f62ee04230c931d83e888012851f4e7f"}, - {file = "pydantic-1.10.13-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:8ef467901d7a41fa0ca6db9ae3ec0021e3f657ce2c208e98cd511f3161c762c6"}, - {file = "pydantic-1.10.13-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:968ac42970f57b8344ee08837b62f6ee6f53c33f603547a55571c954a4225691"}, - {file = "pydantic-1.10.13-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9849f031cf8a2f0a928fe885e5a04b08006d6d41876b8bbd2fc68a18f9f2e3fd"}, - {file = "pydantic-1.10.13-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:56e3ff861c3b9c6857579de282ce8baabf443f42ffba355bf070770ed63e11e1"}, - {file = "pydantic-1.10.13-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:9f00790179497767aae6bcdc36355792c79e7bbb20b145ff449700eb076c5f96"}, - {file = "pydantic-1.10.13-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:75b297827b59bc229cac1a23a2f7a4ac0031068e5be0ce385be1462e7e17a35d"}, - {file = "pydantic-1.10.13-cp39-cp39-win_amd64.whl", hash = "sha256:e70ca129d2053fb8b728ee7d1af8e553a928d7e301a311094b8a0501adc8763d"}, - {file = "pydantic-1.10.13-py3-none-any.whl", hash = "sha256:b87326822e71bd5f313e7d3bfdc77ac3247035ac10b0c0618bd99dcf95b1e687"}, - {file = "pydantic-1.10.13.tar.gz", hash = "sha256:32c8b48dcd3b2ac4e78b0ba4af3a2c2eb6048cb75202f0ea7b34feb740efc340"}, + {file = "pydantic-1.10.14-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:7f4fcec873f90537c382840f330b90f4715eebc2bc9925f04cb92de593eae054"}, + {file = "pydantic-1.10.14-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8e3a76f571970fcd3c43ad982daf936ae39b3e90b8a2e96c04113a369869dc87"}, + {file = "pydantic-1.10.14-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:82d886bd3c3fbeaa963692ef6b643159ccb4b4cefaf7ff1617720cbead04fd1d"}, + {file = "pydantic-1.10.14-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:798a3d05ee3b71967844a1164fd5bdb8c22c6d674f26274e78b9f29d81770c4e"}, + {file = "pydantic-1.10.14-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:23d47a4b57a38e8652bcab15a658fdb13c785b9ce217cc3a729504ab4e1d6bc9"}, + {file = "pydantic-1.10.14-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:f9f674b5c3bebc2eba401de64f29948ae1e646ba2735f884d1594c5f675d6f2a"}, + {file = "pydantic-1.10.14-cp310-cp310-win_amd64.whl", hash = "sha256:24a7679fab2e0eeedb5a8924fc4a694b3bcaac7d305aeeac72dd7d4e05ecbebf"}, + {file = "pydantic-1.10.14-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:9d578ac4bf7fdf10ce14caba6f734c178379bd35c486c6deb6f49006e1ba78a7"}, + {file = "pydantic-1.10.14-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:fa7790e94c60f809c95602a26d906eba01a0abee9cc24150e4ce2189352deb1b"}, + {file = "pydantic-1.10.14-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aad4e10efa5474ed1a611b6d7f0d130f4aafadceb73c11d9e72823e8f508e663"}, + {file = "pydantic-1.10.14-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1245f4f61f467cb3dfeced2b119afef3db386aec3d24a22a1de08c65038b255f"}, + {file = "pydantic-1.10.14-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:21efacc678a11114c765eb52ec0db62edffa89e9a562a94cbf8fa10b5db5c046"}, + {file = "pydantic-1.10.14-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:412ab4a3f6dbd2bf18aefa9f79c7cca23744846b31f1d6555c2ee2b05a2e14ca"}, + {file = "pydantic-1.10.14-cp311-cp311-win_amd64.whl", hash = "sha256:e897c9f35281f7889873a3e6d6b69aa1447ceb024e8495a5f0d02ecd17742a7f"}, + {file = "pydantic-1.10.14-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:d604be0f0b44d473e54fdcb12302495fe0467c56509a2f80483476f3ba92b33c"}, + {file = "pydantic-1.10.14-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a42c7d17706911199798d4c464b352e640cab4351efe69c2267823d619a937e5"}, + {file = "pydantic-1.10.14-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:596f12a1085e38dbda5cbb874d0973303e34227b400b6414782bf205cc14940c"}, + {file = "pydantic-1.10.14-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:bfb113860e9288d0886e3b9e49d9cf4a9d48b441f52ded7d96db7819028514cc"}, + {file = "pydantic-1.10.14-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:bc3ed06ab13660b565eed80887fcfbc0070f0aa0691fbb351657041d3e874efe"}, + {file = "pydantic-1.10.14-cp37-cp37m-win_amd64.whl", hash = "sha256:ad8c2bc677ae5f6dbd3cf92f2c7dc613507eafe8f71719727cbc0a7dec9a8c01"}, + {file = "pydantic-1.10.14-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:c37c28449752bb1f47975d22ef2882d70513c546f8f37201e0fec3a97b816eee"}, + {file = "pydantic-1.10.14-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:49a46a0994dd551ec051986806122767cf144b9702e31d47f6d493c336462597"}, + {file = "pydantic-1.10.14-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:53e3819bd20a42470d6dd0fe7fc1c121c92247bca104ce608e609b59bc7a77ee"}, + {file = "pydantic-1.10.14-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0fbb503bbbbab0c588ed3cd21975a1d0d4163b87e360fec17a792f7d8c4ff29f"}, + {file = "pydantic-1.10.14-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:336709883c15c050b9c55a63d6c7ff09be883dbc17805d2b063395dd9d9d0022"}, + {file = "pydantic-1.10.14-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:4ae57b4d8e3312d486e2498d42aed3ece7b51848336964e43abbf9671584e67f"}, + {file = "pydantic-1.10.14-cp38-cp38-win_amd64.whl", hash = "sha256:dba49d52500c35cfec0b28aa8b3ea5c37c9df183ffc7210b10ff2a415c125c4a"}, + {file = "pydantic-1.10.14-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:c66609e138c31cba607d8e2a7b6a5dc38979a06c900815495b2d90ce6ded35b4"}, + {file = "pydantic-1.10.14-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:d986e115e0b39604b9eee3507987368ff8148222da213cd38c359f6f57b3b347"}, + {file = "pydantic-1.10.14-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:646b2b12df4295b4c3148850c85bff29ef6d0d9621a8d091e98094871a62e5c7"}, + {file = "pydantic-1.10.14-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:282613a5969c47c83a8710cc8bfd1e70c9223feb76566f74683af889faadc0ea"}, + {file = "pydantic-1.10.14-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:466669501d08ad8eb3c4fecd991c5e793c4e0bbd62299d05111d4f827cded64f"}, + {file = "pydantic-1.10.14-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:13e86a19dca96373dcf3190fcb8797d40a6f12f154a244a8d1e8e03b8f280593"}, + {file = "pydantic-1.10.14-cp39-cp39-win_amd64.whl", hash = "sha256:08b6ec0917c30861e3fe71a93be1648a2aa4f62f866142ba21670b24444d7fd8"}, + {file = "pydantic-1.10.14-py3-none-any.whl", hash = "sha256:8ee853cd12ac2ddbf0ecbac1c289f95882b2d4482258048079d13be700aa114c"}, + {file = "pydantic-1.10.14.tar.gz", hash = "sha256:46f17b832fe27de7850896f3afee50ea682220dd218f7e9c88d436788419dca6"}, ] [package.dependencies] @@ -2013,6 +2013,7 @@ files = [ {file = "PyYAML-6.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:bf07ee2fef7014951eeb99f56f39c9bb4af143d8aa3c21b1677805985307da34"}, {file = "PyYAML-6.0.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:855fb52b0dc35af121542a76b9a84f8d1cd886ea97c84703eaa6d88e37a2ad28"}, {file = "PyYAML-6.0.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:40df9b996c2b73138957fe23a16a4f0ba614f4c0efce1e9406a184b6d07fa3a9"}, + {file = "PyYAML-6.0.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a08c6f0fe150303c1c6b71ebcd7213c2858041a7e01975da3a99aed1e7a378ef"}, {file = "PyYAML-6.0.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c22bec3fbe2524cde73d7ada88f6566758a8f7227bfbf93a408a9d86bcc12a0"}, {file = "PyYAML-6.0.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8d4e9c88387b0f5c7d5f281e55304de64cf7f9c0021a3525bd3b1c542da3b0e4"}, {file = "PyYAML-6.0.1-cp312-cp312-win32.whl", hash = "sha256:d483d2cdf104e7c9fa60c544d92981f12ad66a457afae824d146093b8c294c54"}, @@ -2374,28 +2375,28 @@ pyasn1 = ">=0.1.3" [[package]] name = "ruff" -version = "0.1.13" +version = "0.1.14" description = "An extremely fast Python linter and code formatter, written in Rust." optional = false python-versions = ">=3.7" files = [ - {file = "ruff-0.1.13-py3-none-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:e3fd36e0d48aeac672aa850045e784673449ce619afc12823ea7868fcc41d8ba"}, - {file = "ruff-0.1.13-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:9fb6b3b86450d4ec6a6732f9f60c4406061b6851c4b29f944f8c9d91c3611c7a"}, - {file = "ruff-0.1.13-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b13ba5d7156daaf3fd08b6b993360a96060500aca7e307d95ecbc5bb47a69296"}, - {file = "ruff-0.1.13-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:9ebb40442f7b531e136d334ef0851412410061e65d61ca8ce90d894a094feb22"}, - {file = "ruff-0.1.13-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:226b517f42d59a543d6383cfe03cccf0091e3e0ed1b856c6824be03d2a75d3b6"}, - {file = "ruff-0.1.13-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:5f0312ba1061e9b8c724e9a702d3c8621e3c6e6c2c9bd862550ab2951ac75c16"}, - {file = "ruff-0.1.13-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2f59bcf5217c661254bd6bc42d65a6fd1a8b80c48763cb5c2293295babd945dd"}, - {file = "ruff-0.1.13-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e6894b00495e00c27b6ba61af1fc666f17de6140345e5ef27dd6e08fb987259d"}, - {file = "ruff-0.1.13-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9a1600942485c6e66119da294c6294856b5c86fd6df591ce293e4a4cc8e72989"}, - {file = "ruff-0.1.13-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:ee3febce7863e231a467f90e681d3d89210b900d49ce88723ce052c8761be8c7"}, - {file = "ruff-0.1.13-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:dcaab50e278ff497ee4d1fe69b29ca0a9a47cd954bb17963628fa417933c6eb1"}, - {file = "ruff-0.1.13-py3-none-musllinux_1_2_i686.whl", hash = "sha256:f57de973de4edef3ad3044d6a50c02ad9fc2dff0d88587f25f1a48e3f72edf5e"}, - {file = "ruff-0.1.13-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:7a36fa90eb12208272a858475ec43ac811ac37e91ef868759770b71bdabe27b6"}, - {file = "ruff-0.1.13-py3-none-win32.whl", hash = "sha256:a623349a505ff768dad6bd57087e2461be8db58305ebd5577bd0e98631f9ae69"}, - {file = "ruff-0.1.13-py3-none-win_amd64.whl", hash = "sha256:f988746e3c3982bea7f824c8fa318ce7f538c4dfefec99cd09c8770bd33e6539"}, - {file = "ruff-0.1.13-py3-none-win_arm64.whl", hash = "sha256:6bbbc3042075871ec17f28864808540a26f0f79a4478c357d3e3d2284e832998"}, - {file = "ruff-0.1.13.tar.gz", hash = "sha256:e261f1baed6291f434ffb1d5c6bd8051d1c2a26958072d38dfbec39b3dda7352"}, + {file = "ruff-0.1.14-py3-none-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:96f76536df9b26622755c12ed8680f159817be2f725c17ed9305b472a757cdbb"}, + {file = "ruff-0.1.14-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:ab3f71f64498c7241123bb5a768544cf42821d2a537f894b22457a543d3ca7a9"}, + {file = "ruff-0.1.14-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7060156ecc572b8f984fd20fd8b0fcb692dd5d837b7606e968334ab7ff0090ab"}, + {file = "ruff-0.1.14-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:a53d8e35313d7b67eb3db15a66c08434809107659226a90dcd7acb2afa55faea"}, + {file = "ruff-0.1.14-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bea9be712b8f5b4ebed40e1949379cfb2a7d907f42921cf9ab3aae07e6fba9eb"}, + {file = "ruff-0.1.14-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:2270504d629a0b064247983cbc495bed277f372fb9eaba41e5cf51f7ba705a6a"}, + {file = "ruff-0.1.14-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:80258bb3b8909b1700610dfabef7876423eed1bc930fe177c71c414921898efa"}, + {file = "ruff-0.1.14-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:653230dd00aaf449eb5ff25d10a6e03bc3006813e2cb99799e568f55482e5cae"}, + {file = "ruff-0.1.14-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:87b3acc6c4e6928459ba9eb7459dd4f0c4bf266a053c863d72a44c33246bfdbf"}, + {file = "ruff-0.1.14-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:6b3dadc9522d0eccc060699a9816e8127b27addbb4697fc0c08611e4e6aeb8b5"}, + {file = "ruff-0.1.14-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:1c8eca1a47b4150dc0fbec7fe68fc91c695aed798532a18dbb1424e61e9b721f"}, + {file = "ruff-0.1.14-py3-none-musllinux_1_2_i686.whl", hash = "sha256:62ce2ae46303ee896fc6811f63d6dabf8d9c389da0f3e3f2bce8bc7f15ef5488"}, + {file = "ruff-0.1.14-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:b2027dde79d217b211d725fc833e8965dc90a16d0d3213f1298f97465956661b"}, + {file = "ruff-0.1.14-py3-none-win32.whl", hash = "sha256:722bafc299145575a63bbd6b5069cb643eaa62546a5b6398f82b3e4403329cab"}, + {file = "ruff-0.1.14-py3-none-win_amd64.whl", hash = "sha256:e3d241aa61f92b0805a7082bd89a9990826448e4d0398f0e2bc8f05c75c63d99"}, + {file = "ruff-0.1.14-py3-none-win_arm64.whl", hash = "sha256:269302b31ade4cde6cf6f9dd58ea593773a37ed3f7b97e793c8594b262466b67"}, + {file = "ruff-0.1.14.tar.gz", hash = "sha256:ad3f8088b2dfd884820289a06ab718cde7d38b94972212cc4ba90d5fbc9955f3"}, ] [[package]] diff --git a/tests/utils/api_routes/__init__.py b/tests/utils/api_routes/__init__.py index de1cf2c27e90..fbce3a4f8eb2 100644 --- a/tests/utils/api_routes/__init__.py +++ b/tests/utils/api_routes/__init__.py @@ -5,8 +5,6 @@ admin_about = "/api/admin/about" """`/api/admin/about`""" admin_about_check = "/api/admin/about/check" """`/api/admin/about/check`""" -admin_about_docker_validate = "/api/admin/about/docker/validate" -"""`/api/admin/about/docker/validate`""" admin_about_statistics = "/api/admin/about/statistics" """`/api/admin/about/statistics`""" admin_analytics = "/api/admin/analytics"