From 943d65a2acd850820de742d1a6d4197946d1c8bc Mon Sep 17 00:00:00 2001 From: boc-the-git <3479092+boc-the-git@users.noreply.github.com> Date: Fri, 19 Jan 2024 22:21:48 +1100 Subject: [PATCH 01/11] feat: Stale action tweaks (#3005) * Increase operations-per-run for greater throughput * Populate some default values for ease of reference * Remove quotes from "bug: confirmed" label --- .github/workflows/stale.yml | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) 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 From 6acadbc52b7568b557aca5c10ec55e24cf3b3bd0 Mon Sep 17 00:00:00 2001 From: Kuchenpirat <24235032+Kuchenpirat@users.noreply.github.com> Date: Fri, 19 Jan 2024 16:10:31 +0100 Subject: [PATCH 02/11] Fix conditional check in createBackup function (#3006) --- frontend/pages/admin/backups.vue | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 { From d17e46ee50cba69826bae9814ebbb76d0f57c696 Mon Sep 17 00:00:00 2001 From: Kuchenpirat <24235032+Kuchenpirat@users.noreply.github.com> Date: Fri, 19 Jan 2024 17:01:37 +0100 Subject: [PATCH 03/11] chore(docs): change docker-compose to docker compose (#3007) * update docker compose * fix swag docker compose indentation * and again.... * indentation for the second docker compose in the swag guide --- .github/ISSUE_TEMPLATE/bug-report.yaml | 2 +- .../documentation/community-guide/swag.md | 90 +++++++++---------- .../installation/installation-checklist.md | 2 +- .../documentation/getting-started/updating.md | 6 +- docs/docs/overrides/api.html | 2 +- makefile | 2 +- 6 files changed, 51 insertions(+), 53 deletions(-) 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/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..1215feed75df 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). diff --git a/docs/docs/documentation/getting-started/updating.md b/docs/docs/documentation/getting-started/updating.md index 72eca9fb717d..0df5e7954cc9 100644 --- a/docs/docs/documentation/getting-started/updating.md +++ b/docs/docs/documentation/getting-started/updating.md @@ -19,6 +19,6 @@ 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` +- 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..fab1210515da 100644 --- a/docs/docs/overrides/api.html +++ b/docs/docs/overrides/api.html @@ -14,7 +14,7 @@
diff --git a/makefile b/makefile index 7bbdfbe81316..1c9118353de8 100644 --- a/makefile +++ b/makefile @@ -123,7 +123,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 From 10ba4d2d7f3f44a98878e49a80008bd70cc30ef4 Mon Sep 17 00:00:00 2001 From: Michael Genson <71845777+michael-genson@users.noreply.github.com> Date: Fri, 19 Jan 2024 10:56:36 -0600 Subject: [PATCH 04/11] feat: RTL Support for RTL Languages (Hebrew, Arabic) (#2832) * add language direction to locale generation * apply language direction when setting language --------- Co-authored-by: boc-the-git <3479092+boc-the-git@users.noreply.github.com> --- dev/code-generation/gen_ts_locales.py | 87 +++++++++++-------- .../use-locales/available-locales.ts | 39 +++++++++ .../composables/use-locales/use-locales.ts | 21 ++++- 3 files changed, 110 insertions(+), 37 deletions(-) diff --git a/dev/code-generation/gen_ts_locales.py b/dev/code-generation/gen_ts_locales.py index 451918c3038e..5b8b1535a767 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,6 +73,7 @@ class TargetLanguage(MealieModel): id: str name: str locale: str + dir: str threeLettersCode: str twoLettersCode: str progress: float = 0.0 @@ -103,15 +112,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/frontend/composables/use-locales/available-locales.ts b/frontend/composables/use-locales/available-locales.ts index d0737020e5c7..a03b17fb8666 100644 --- a/frontend/composables/use-locales/available-locales.ts +++ b/frontend/composables/use-locales/available-locales.ts @@ -4,195 +4,234 @@ export const LOCALES = [ name: "繁體中文 (Chinese traditional)", value: "zh-TW", progress: 28, + dir: "ltr", }, { name: "简体中文 (Chinese simplified)", value: "zh-CN", progress: 65, + dir: "ltr", }, { name: "Tiếng Việt (Vietnamese)", value: "vi-VN", progress: 2, + dir: "ltr", }, { name: "Українська (Ukrainian)", value: "uk-UA", progress: 99, + dir: "ltr", }, { name: "Türkçe (Turkish)", value: "tr-TR", progress: 50, + dir: "ltr", }, { name: "Svenska (Swedish)", value: "sv-SE", progress: 71, + dir: "ltr", }, { name: "српски (Serbian)", value: "sr-SP", progress: 4, + dir: "ltr", }, { name: "Slovenian", value: "sl-SI", progress: 49, + dir: "ltr", }, { name: "Slovak", value: "sk-SK", progress: 97, + dir: "ltr", }, { name: "Pусский (Russian)", value: "ru-RU", progress: 99, + dir: "ltr", }, { name: "Română (Romanian)", value: "ro-RO", progress: 32, + dir: "ltr", }, { name: "Português (Portuguese)", value: "pt-PT", progress: 99, + dir: "ltr", }, { name: "Português do Brasil (Brazilian Portuguese)", value: "pt-BR", progress: 98, + dir: "ltr", }, { name: "Polski (Polish)", value: "pl-PL", progress: 97, + dir: "ltr", }, { name: "Norsk (Norwegian)", value: "no-NO", progress: 85, + dir: "ltr", }, { name: "Nederlands (Dutch)", value: "nl-NL", progress: 98, + dir: "ltr", }, { name: "Latvian", value: "lv-LV", progress: 1, + dir: "ltr", }, { name: "Lithuanian", value: "lt-LT", progress: 97, + dir: "ltr", }, { name: "한국어 (Korean)", value: "ko-KR", progress: 5, + dir: "ltr", }, { name: "日本語 (Japanese)", value: "ja-JP", progress: 11, + dir: "ltr", }, { name: "Italiano (Italian)", value: "it-IT", progress: 96, + dir: "ltr", }, { name: "Magyar (Hungarian)", value: "hu-HU", progress: 99, + dir: "ltr", }, { name: "Croatian", value: "hr-HR", progress: 97, + dir: "ltr", }, { name: "עברית (Hebrew)", value: "he-IL", progress: 99, + dir: "rtl", }, { name: "Galician", value: "gl-ES", progress: 1, + dir: "ltr", }, { name: "Français (French)", value: "fr-FR", progress: 99, + dir: "ltr", }, { name: "French, Canada", value: "fr-CA", progress: 97, + dir: "ltr", }, { name: "Suomi (Finnish)", value: "fi-FI", progress: 95, + dir: "ltr", }, { name: "Español (Spanish)", value: "es-ES", progress: 76, + dir: "ltr", }, { name: "American English", value: "en-US", progress: 100.0, + dir: "ltr", }, { name: "British English", value: "en-GB", progress: 4, + dir: "ltr", }, { name: "Ελληνικά (Greek)", value: "el-GR", progress: 35, + dir: "ltr", }, { name: "Deutsch (German)", value: "de-DE", progress: 99, + dir: "ltr", }, { name: "Dansk (Danish)", value: "da-DK", progress: 100, + dir: "ltr", }, { name: "Čeština (Czech)", value: "cs-CZ", progress: 66, + dir: "ltr", }, { name: "Català (Catalan)", value: "ca-ES", progress: 61, + dir: "ltr", }, { name: "Bulgarian", value: "bg-BG", progress: 99, + dir: "ltr", }, { name: "العربية (Arabic)", value: "ar-SA", progress: 16, + dir: "rtl", }, { name: "Afrikaans (Afrikaans)", value: "af-ZA", progress: 96, + 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(); From 7e9c8b9e431d8a0624bdb943c3e840ea1f9594a3 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 19 Jan 2024 23:32:41 +0000 Subject: [PATCH 05/11] chore(deps): update dependency ruff to v0.1.14 (#3009) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- poetry.lock | 37 +++++++++++++++++++------------------ 1 file changed, 19 insertions(+), 18 deletions(-) diff --git a/poetry.lock b/poetry.lock index 3daaae680d50..ab333ed3be56 100644 --- a/poetry.lock +++ b/poetry.lock @@ -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]] From 0602d0bf007aae0d9114fa6730e9ece80ca56222 Mon Sep 17 00:00:00 2001 From: Hayden <64056131+hay-kot@users.noreply.github.com> Date: Sat, 20 Jan 2024 10:20:11 -0600 Subject: [PATCH 06/11] note on network attached drives (#3013) --- .../docs/documentation/getting-started/installation/sqlite.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/docs/docs/documentation/getting-started/installation/sqlite.md b/docs/docs/documentation/getting-started/installation/sqlite.md index 2487cb2ae533..9404c8a197d2 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 plannin 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) From 8d8a1015801b78f68b89b1e6354dca8c53c86df0 Mon Sep 17 00:00:00 2001 From: Hayden <64056131+hay-kot@users.noreply.github.com> Date: Sat, 20 Jan 2024 10:34:57 -0600 Subject: [PATCH 07/11] chore: code gen (#3012) * code-gen * remove old generator commands * remove old docker stuff --- dev/code-generation/gen_ts_locales.py | 3 +- .../use-locales/available-locales.ts | 72 ++++++++++--------- frontend/lib/api/admin/admin-about.ts | 6 +- frontend/lib/api/types/admin.ts | 3 - frontend/nuxt.config.js | 1 + makefile | 7 -- tests/utils/api_routes/__init__.py | 2 - 7 files changed, 43 insertions(+), 51 deletions(-) diff --git a/dev/code-generation/gen_ts_locales.py b/dev/code-generation/gen_ts_locales.py index 5b8b1535a767..397d2b79a495 100644 --- a/dev/code-generation/gen_ts_locales.py +++ b/dev/code-generation/gen_ts_locales.py @@ -73,13 +73,14 @@ class TargetLanguage(MealieModel): id: str name: str locale: str - dir: 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: diff --git a/frontend/composables/use-locales/available-locales.ts b/frontend/composables/use-locales/available-locales.ts index a03b17fb8666..a00b0641d5da 100644 --- a/frontend/composables/use-locales/available-locales.ts +++ b/frontend/composables/use-locales/available-locales.ts @@ -3,97 +3,97 @@ 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", }, { @@ -105,7 +105,7 @@ export const LOCALES = [ { name: "Lithuanian", value: "lt-LT", - progress: 97, + progress: 93, dir: "ltr", }, { @@ -117,31 +117,37 @@ export const LOCALES = [ { 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", }, { @@ -153,7 +159,7 @@ export const LOCALES = [ { name: "Français (French)", value: "fr-FR", - progress: 99, + progress: 100, dir: "ltr", }, { @@ -165,13 +171,13 @@ export const LOCALES = [ { 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", }, { @@ -183,37 +189,37 @@ export const LOCALES = [ { 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", }, { @@ -225,13 +231,13 @@ export const LOCALES = [ { 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/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/makefile b/makefile index 1c9118353de8..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 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" From f0bbe796ce40ef32a4a00eecdfb0efe4eef9da07 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Sat, 20 Jan 2024 07:42:34 -0900 Subject: [PATCH 08/11] fix(deps): update dependency pydantic to v1.10.14 (#3008) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Co-authored-by: Hayden <64056131+hay-kot@users.noreply.github.com> --- poetry.lock | 74 ++++++++++++++++++++++++++--------------------------- 1 file changed, 37 insertions(+), 37 deletions(-) diff --git a/poetry.lock b/poetry.lock index ab333ed3be56..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] From 4e66d5fb92f48e8d5d81a9d869b40dee21f2fc81 Mon Sep 17 00:00:00 2001 From: Carter Mintey Date: Sat, 20 Jan 2024 19:15:21 +0000 Subject: [PATCH 09/11] remove docs mentioning the impending v1 release --- .../getting-started/installation/installation-checklist.md | 2 -- .../documentation/getting-started/installation/postgres.md | 2 +- .../documentation/getting-started/installation/sqlite.md | 4 ++-- docs/docs/documentation/getting-started/introduction.md | 6 ------ docs/docs/overrides/api.html | 2 +- 5 files changed, 4 insertions(+), 12 deletions(-) diff --git a/docs/docs/documentation/getting-started/installation/installation-checklist.md b/docs/docs/documentation/getting-started/installation/installation-checklist.md index 1215feed75df..5c16abefdd0e 100644 --- a/docs/docs/documentation/getting-started/installation/installation-checklist.md +++ b/docs/docs/documentation/getting-started/installation/installation-checklist.md @@ -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..d28149a628c9 100644 --- a/docs/docs/documentation/getting-started/installation/postgres.md +++ b/docs/docs/documentation/getting-started/installation/postgres.md @@ -9,7 +9,7 @@ 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:latest container_name: mealie ports: - "9925:9000" diff --git a/docs/docs/documentation/getting-started/installation/sqlite.md b/docs/docs/documentation/getting-started/installation/sqlite.md index 9404c8a197d2..125a47eb1c9e 100644 --- a/docs/docs/documentation/getting-started/installation/sqlite.md +++ b/docs/docs/documentation/getting-started/installation/sqlite.md @@ -1,7 +1,7 @@ # Installing with SQLite !!! Warning - If you're plannin 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 + 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. @@ -13,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:latest container_name: mealie ports: - "9925:9000" # (1) 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/overrides/api.html b/docs/docs/overrides/api.html index fab1210515da..0453ef08a823 100644 --- a/docs/docs/overrides/api.html +++ b/docs/docs/overrides/api.html @@ -14,7 +14,7 @@
From 5d08647196f83cb4b3f46847e3ca84c130e0c725 Mon Sep 17 00:00:00 2001 From: boc-the-git <3479092+boc-the-git@users.noreply.github.com> Date: Sun, 21 Jan 2024 21:34:34 +1100 Subject: [PATCH 10/11] docs: Docker image versions (#3019) * fix: Add the need to change image tag * Minor tidying * Advice to use specific tag, not latest * Advice to use specific tag, not latest * Revert mistake * Reword Co-authored-by: Kuchenpirat <24235032+Kuchenpirat@users.noreply.github.com> --------- Co-authored-by: Kuchenpirat <24235032+Kuchenpirat@users.noreply.github.com> --- docs/docs/contributors/developers-guide/maintainers.md | 2 +- .../documentation/getting-started/installation/postgres.md | 7 ++++--- .../documentation/getting-started/installation/sqlite.md | 3 ++- docs/docs/documentation/getting-started/updating.md | 1 + 4 files changed, 8 insertions(+), 5 deletions(-) diff --git a/docs/docs/contributors/developers-guide/maintainers.md b/docs/docs/contributors/developers-guide/maintainers.md index f62c940848af..aa128f9b1716 100644 --- a/docs/docs/contributors/developers-guide/maintainers.md +++ b/docs/docs/contributors/developers-guide/maintainers.md @@ -40,7 +40,7 @@ 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 diff --git a/docs/docs/documentation/getting-started/installation/postgres.md b/docs/docs/documentation/getting-started/installation/postgres.md index d28149a628c9..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:latest + 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 125a47eb1c9e..10a054688c60 100644 --- a/docs/docs/documentation/getting-started/installation/sqlite.md +++ b/docs/docs/documentation/getting-started/installation/sqlite.md @@ -13,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:latest + image: ghcr.io/mealie-recipes/mealie:v1.0.0 # (3) container_name: mealie ports: - "9925:9000" # (1) @@ -43,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/updating.md b/docs/docs/documentation/getting-started/updating.md index 0df5e7954cc9..6917bc35bb9c 100644 --- a/docs/docs/documentation/getting-started/updating.md +++ b/docs/docs/documentation/getting-started/updating.md @@ -20,5 +20,6 @@ If you are upgrading from pre-v1.0.0 to v1.0.0, make sure you read [Migrating to For all setups using Docker the updating process looks something like this - 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` From 26dfc54d2366c5b9c4488af73d356b8c1b8664b2 Mon Sep 17 00:00:00 2001 From: Hayden <64056131+hay-kot@users.noreply.github.com> Date: Mon, 22 Jan 2024 01:40:12 -0600 Subject: [PATCH 11/11] docs: new notes on releasing mealie (#3025) * new notes on releasing mealie --------- Co-authored-by: Michael Genson <71845777+michael-genson@users.noreply.github.com> --- .../developers-guide/maintainers.md | 28 ++++++++++++++++--- 1 file changed, 24 insertions(+), 4 deletions(-) diff --git a/docs/docs/contributors/developers-guide/maintainers.md b/docs/docs/contributors/developers-guide/maintainers.md index aa128f9b1716..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. @@ -44,14 +44,34 @@ Mealie is published via GitHub actions to the GitHub container registry with the ### 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)