Compare commits

...

14 Commits

Author SHA1 Message Date
Hayden
b54cdf6425 fix: sync locales in user registration validation (#3278)
* Add ability to inject into Python files

* Update outdated references to gen_global_components.py

* Add code gen for registration locale validation

* sort validators

* update for pydantic 2

* run generator again

---------

Co-authored-by: Gasper Gril <gasper@gril.si>
Co-authored-by: Michael Genson <71845777+michael-genson@users.noreply.github.com>
2024-03-10 09:58:52 -08:00
Hayden
02da2114f9 New Crowdin updates (#3277)
* New translations en-us.json (Spanish)

* New translations en-us.json (Swedish)

* New translations en-us.json (English, United Kingdom)

* New translations en-us.json (Polish)

* New translations en-us.json (Romanian)

* New translations en-us.json (French)

* New translations en-us.json (Afrikaans)

* New translations en-us.json (Arabic)

* New translations en-us.json (Bulgarian)

* New translations en-us.json (Catalan)

* New translations en-us.json (Czech)

* New translations en-us.json (Danish)

* New translations en-us.json (German)

* New translations en-us.json (Greek)

* New translations en-us.json (Finnish)

* New translations en-us.json (Hebrew)

* New translations en-us.json (Hungarian)

* New translations en-us.json (Italian)

* New translations en-us.json (Japanese)

* New translations en-us.json (Korean)

* New translations en-us.json (Lithuanian)

* New translations en-us.json (Dutch)

* New translations en-us.json (Norwegian)

* New translations en-us.json (Portuguese)

* New translations en-us.json (Russian)

* New translations en-us.json (Slovak)

* New translations en-us.json (Slovenian)

* New translations en-us.json (Serbian (Cyrillic))

* New translations en-us.json (Turkish)

* New translations en-us.json (Ukrainian)

* New translations en-us.json (Chinese Simplified)

* New translations en-us.json (Chinese Traditional)

* New translations en-us.json (Vietnamese)

* New translations en-us.json (Galician)

* New translations en-us.json (Icelandic)

* New translations en-us.json (Portuguese, Brazilian)

* New translations en-us.json (Croatian)

* New translations en-us.json (Latvian)

* New translations en-us.json (French, Canada)
2024-03-10 15:01:47 +01:00
boc-the-git
a67533a778 Merge pull request #3276 from mealie-recipes/renovate/apprise-1.x-lockfile
fix(deps): update dependency apprise to v1.7.4
2024-03-10 21:37:15 +11:00
renovate[bot]
59ad834c12 fix(deps): update dependency apprise to v1.7.4 2024-03-09 23:19:43 +00:00
Michael Genson
315d5b370e fix: bump ruff (#3275)
* bump ruff

* updated deprecated cli usage

* fixed deprecated pyproject layout

* fixed .format string

* fixed another deprecated setting
2024-03-09 18:40:08 +00:00
Michael Genson
130813ffe4 fix: Make Meal Planner Notes Not Clickable (#3274)
* selectively remove recipe card components when there is no recipe

* copied changes to regular card
2024-03-09 09:29:41 -09:00
renovate[bot]
65ddb7c9e2 chore(deps): update dependency pytest to v8.1.1 (#3244)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-03-09 11:55:16 -06:00
renovate[bot]
dbe29e15ae fix(deps): update dependency uvicorn to ^0.28.0 (#3273)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-03-09 16:36:18 +00:00
boc-the-git
980b3c634b Change "New" to "Add" (#3271) 2024-03-09 10:26:55 -06:00
renovate[bot]
457d8c93ce chore(deps): update dependency mypy to v1.9.0 (#3270)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-03-08 13:22:54 -06:00
Hayden
23aad6358c New Crowdin updates (#3269)
* New translations en-us.json (French)

* New translations en-us.json (Italian)

* New translations en-us.json (Slovenian)

* New translations en-us.json (Turkish)

* New translations en-us.json (Ukrainian)
2024-03-08 14:05:19 +01:00
boc-the-git
7c896361f2 Merge pull request #3268 from mealie-recipes/docs/newrelease-update-version-v1.3.1
docs(auto): Update image tag, for release v1.3.1
2024-03-08 19:26:51 +11:00
boc-the-git
5b7f5738e3 Add a comment to kick PR3268 along, and for future reference 2024-03-08 19:20:31 +11:00
boc-the-git
5bfcb80c98 Update image tag, for release v1.3.1 2024-03-08 02:50:52 +00:00
63 changed files with 280 additions and 217 deletions

View File

@@ -68,6 +68,9 @@ jobs:
- name: Create Pull Request
uses: peter-evans/create-pull-request@v6
# This doesn't currently work for us because it creates the PR but the workflows don't run.
# TODO: Provide a personal access token as a parameter here, that solves that problem.
# https://github.com/peter-evans/create-pull-request
with:
commit-message: "Update image tag, for release ${{ github.event.release.tag_name }}"
branch: "docs/newrelease-update-version-${{ github.event.release.tag_name }}"

View File

@@ -110,7 +110,7 @@ tasks:
py:lint:
desc: runs python linter
cmds:
- poetry run ruff mealie
- poetry run ruff check mealie
py:check:
desc: runs all linters, type checkers, and formatters

View File

@@ -3,8 +3,8 @@ from pathlib import Path
from fastapi import FastAPI
from jinja2 import Template
from pydantic import BaseModel
from utils import PROJECT_DIR, CodeTemplates, HTTPRequest, RouteObject
from pydantic import BaseModel, ConfigDict
from utils import PROJECT_DIR, CodeTemplates, HTTPRequest, RouteObject, RequestType
CWD = Path(__file__).parent
@@ -12,23 +12,25 @@ OUTFILE = PROJECT_DIR / "tests" / "utils" / "api_routes" / "__init__.py"
class PathObject(BaseModel):
model_config = ConfigDict(arbitrary_types_allowed=True)
route_object: RouteObject
http_verbs: list[HTTPRequest]
class Config:
arbitrary_types_allowed = True
def get_path_objects(app: FastAPI):
paths = []
for key, value in app.openapi().items():
if key == "paths":
for key, value in value.items():
for key, value2 in value.items():
verbs = []
for k, v in value2.items():
verbs.append(HTTPRequest(request_type=k, **v))
paths.append(
PathObject(
route_object=RouteObject(key),
http_verbs=[HTTPRequest(request_type=k, **v) for k, v in value.items()],
http_verbs=verbs,
)
)

View File

@@ -5,7 +5,7 @@ from pathlib import Path
import dotenv
import requests
from jinja2 import Template
from pydantic import Extra
from pydantic import ConfigDict
from requests import Response
from utils import CodeDest, CodeKeys, inject_inline, log
@@ -56,7 +56,7 @@ LOCALE_DATA: dict[str, LocaleData] = {
"zh-TW": LocaleData(name="繁體中文 (Chinese traditional)"),
}
LOCALE_TEMPLATE = """// This Code is auto generated by gen_global_components.py
LOCALE_TEMPLATE = """// This Code is auto generated by gen_ts_locales.py
export const LOCALES = [{% for locale in locales %}
{
name: "{{ locale.name }}",
@@ -70,6 +70,8 @@ export const LOCALES = [{% for locale in locales %}
class TargetLanguage(MealieModel):
model_config = ConfigDict(populate_by_name=True, extra="allow")
id: str
name: str
locale: str
@@ -78,10 +80,6 @@ class TargetLanguage(MealieModel):
twoLettersCode: str
progress: float = 0.0
class Config:
extra = Extra.allow
allow_population_by_field_name = True
class CrowdinApi:
project_name = "Mealie"
@@ -152,6 +150,7 @@ PROJECT_DIR = Path(__file__).parent.parent.parent
datetime_dir = PROJECT_DIR / "frontend" / "lang" / "dateTimeFormats"
locales_dir = PROJECT_DIR / "frontend" / "lang" / "messages"
nuxt_config = PROJECT_DIR / "frontend" / "nuxt.config.js"
reg_valid = PROJECT_DIR / "mealie" / "schema" / "_mealie" / "validators.py"
"""
This snippet walks the message and dat locales directories and generates the import information
@@ -175,6 +174,19 @@ def inject_nuxt_values():
inject_inline(nuxt_config, CodeKeys.nuxt_local_dates, all_date_locales)
def inject_registration_validation_values():
all_langs = []
for match in locales_dir.glob("*.json"):
lang_string = f'"{match.stem}",'
all_langs.append(lang_string)
# sort
all_langs.sort()
log.debug(f"injecting locales into user registration validation -> {reg_valid}")
inject_inline(reg_valid, CodeKeys.nuxt_local_messages, all_langs)
def generate_locales_ts_file():
api = CrowdinApi("")
models = api.get_languages()
@@ -193,6 +205,7 @@ def main():
generate_locales_ts_file()
inject_nuxt_values()
inject_registration_validation_values()
if __name__ == "__main__":

View File

@@ -6,7 +6,7 @@ from utils import log
# ============================================================
template = """// This Code is auto generated by gen_global_components.py
template = """// This Code is auto generated by gen_ts_types.py
{% for name in global %}import {{ name }} from "@/components/global/{{ name }}.vue";
{% endfor %}{% for name in layout %}import {{ name }} from "@/components/layout/{{ name }}.vue";
{% endfor %}

View File

@@ -1,9 +1,8 @@
import re
from enum import Enum
from typing import Optional
from humps import camelize
from pydantic import BaseModel, Extra, Field
from pydantic import BaseModel, ConfigDict, Field
from slugify import slugify
@@ -34,33 +33,30 @@ class ParameterIn(str, Enum):
class RouterParameter(BaseModel):
model_config = ConfigDict(extra="allow")
required: bool = False
name: str
location: ParameterIn = Field(..., alias="in")
class Config:
extra = Extra.allow
class RequestBody(BaseModel):
required: bool = False
model_config = ConfigDict(extra="allow")
class Config:
extra = Extra.allow
required: bool = False
class HTTPRequest(BaseModel):
model_config = ConfigDict(extra="allow", populate_by_name=True)
request_type: RequestType
description: str = ""
summary: str
requestBody: Optional[RequestBody]
request_body: RequestBody | None = None
parameters: list[RouterParameter] = []
tags: list[str] | None = []
class Config:
extra = Extra.allow
def list_as_js_object_string(self, parameters, braces=True):
if len(parameters) == 0:
return ""
@@ -71,11 +67,11 @@ class HTTPRequest(BaseModel):
return ", ".join(parameters)
def payload(self):
return "payload" if self.requestBody else ""
return "payload" if self.request_body else ""
def function_args(self):
all_params = [p.name for p in self.parameters]
if self.requestBody:
if self.request_body:
all_params.append("payload")
return self.list_as_js_object_string(all_params)

View File

@@ -50,7 +50,7 @@ class CodeSlicer:
self._next_line += 1
def get_indentation_of_string(line: str, comment_char: str = "//") -> str:
def get_indentation_of_string(line: str, comment_char: str = "//|#") -> str:
return re.sub(rf"{comment_char}.*", "", line).removesuffix("\n")

View File

@@ -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.1.0 # (3)
image: ghcr.io/mealie-recipes/mealie:v1.3.1 # (3)
container_name: mealie
ports:
- "9925:9000" # (1)

View File

@@ -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.1.0 # (3)
image: ghcr.io/mealie-recipes/mealie:v1.3.1 # (3)
container_name: mealie
ports:
- "9925:9000" # (1)

View File

@@ -3,8 +3,9 @@
<v-hover v-slot="{ hover }" :open-delay="50">
<v-card
:class="{ 'on-hover': hover }"
:style="{ cursor }"
:elevation="hover ? 12 : 2"
:to="route ? recipeRoute : ''"
:to="recipeRoute"
:min-height="imageHeight + 75"
@click="$emit('click')"
>
@@ -33,7 +34,7 @@
</v-card-title>
<slot name="actions">
<v-card-actions class="px-1">
<v-card-actions v-if="showRecipeContent" class="px-1">
<RecipeFavoriteBadge v-if="isOwnGroup" class="absolute" :slug="slug" show-always />
<RecipeRating class="pb-1" :value="rating" :name="name" :slug="slug" :small="true" />
@@ -101,10 +102,6 @@ export default defineComponent({
required: false,
default: "abc123",
},
route: {
type: Boolean,
default: true,
},
tags: {
type: Array,
default: () => [],
@@ -123,14 +120,18 @@ export default defineComponent({
const { isOwnGroup } = useLoggedInState();
const route = useRoute();
const groupSlug = computed(() => route.value.params.groupSlug || $auth.user?.groupSlug || "")
const groupSlug = computed(() => route.value.params.groupSlug || $auth.user?.groupSlug || "");
const showRecipeContent = computed(() => props.recipeId && props.slug);
const recipeRoute = computed<string>(() => {
return `/g/${groupSlug.value}/r/${props.slug}`;
return showRecipeContent.value ? `/g/${groupSlug.value}/r/${props.slug}` : "";
});
const cursor = computed(() => showRecipeContent.value ? "pointer" : "auto");
return {
isOwnGroup,
recipeRoute,
showRecipeContent,
cursor,
};
},
});

View File

@@ -3,6 +3,7 @@
<v-card
:ripple="false"
:class="isFlat ? 'mx-auto flat' : 'mx-auto'"
:style="{ cursor }"
hover
:to="$listeners.selected ? undefined : recipeRoute"
@click="$emit('selected')"
@@ -37,8 +38,9 @@
</v-list-item-subtitle>
<div class="d-flex flex-wrap justify-end align-center">
<slot name="actions">
<RecipeFavoriteBadge v-if="isOwnGroup" :slug="slug" show-always />
<RecipeFavoriteBadge v-if="isOwnGroup && showRecipeContent" :slug="slug" show-always />
<v-rating
v-if="showRecipeContent"
color="secondary"
:class="isOwnGroup ? 'ml-auto' : 'ml-auto pb-2'"
background-color="secondary lighten-3"
@@ -52,7 +54,7 @@
<!-- If we're not logged-in, no items display, so we hide this menu -->
<!-- We also add padding to the v-rating above to compensate -->
<RecipeContextMenu
v-if="isOwnGroup"
v-if="isOwnGroup && showRecipeContent"
:slug="slug"
:menu-icon="$globals.icons.dotsHorizontal"
:name="name"
@@ -113,10 +115,6 @@ export default defineComponent({
required: false,
default: "abc123",
},
route: {
type: Boolean,
default: true,
},
recipeId: {
type: String,
required: true,
@@ -135,14 +133,19 @@ export default defineComponent({
const { isOwnGroup } = useLoggedInState();
const route = useRoute();
const groupSlug = computed(() => route.value.params.groupSlug || $auth.user?.groupSlug || "")
const groupSlug = computed(() => route.value.params.groupSlug || $auth.user?.groupSlug || "");
const showRecipeContent = computed(() => props.recipeId && props.slug);
const recipeRoute = computed<string>(() => {
return `/g/${groupSlug.value}/r/${props.slug}`;
return showRecipeContent.value ? `/g/${groupSlug.value}/r/${props.slug}` : "";
});
const cursor = computed(() => showRecipeContent.value ? "pointer" : "auto");
return {
isOwnGroup,
recipeRoute,
showRecipeContent,
cursor,
};
},
});

View File

@@ -45,7 +45,6 @@
:rating="recipe.rating"
:image="recipe.image"
:recipe-id="recipe.id"
:route="true"
v-on="$listeners.selected ? { selected: () => handleSelect(recipe) } : {}"
/>
</v-card>

View File

@@ -24,7 +24,7 @@
</div>
<div v-if="edit" class="d-flex justify-end">
<BaseButton class="ml-auto my-2" @click="addNote"> {{ $t("general.new") }}</BaseButton>
<BaseButton class="ml-auto my-2" @click="addNote"> {{ $t("general.add") }}</BaseButton>
</div>
</div>
</template>

View File

@@ -51,7 +51,7 @@
/>
<div v-if="isEditForm" class="d-flex">
<RecipeDialogBulkAdd class="ml-auto my-2 mr-1" @bulk-data="addStep" />
<BaseButton class="my-2" @click="addStep()"> {{ $t("general.new") }}</BaseButton>
<BaseButton class="my-2" @click="addStep()"> {{ $t("general.add") }}</BaseButton>
</div>
<div v-if="!$vuetify.breakpoint.mdAndUp">
<RecipePageOrganizers :recipe="recipe" />

View File

@@ -47,7 +47,7 @@
<span>{{ parserToolTip }}</span>
</v-tooltip>
<RecipeDialogBulkAdd class="mx-1 mb-1" @bulk-data="addIngredient" />
<BaseButton class="mb-1" @click="addIngredient" > {{ $t("general.new") }} </BaseButton>
<BaseButton class="mb-1" @click="addIngredient" > {{ $t("general.add") }} </BaseButton>
</div>
</div>
</template>

View File

@@ -1,9 +1,9 @@
// This Code is auto generated by gen_global_components.py
// This Code is auto generated by gen_ts_locales.py
export const LOCALES = [
{
name: "繁體中文 (Chinese traditional)",
value: "zh-TW",
progress: 30,
progress: 29,
dir: "ltr",
},
{
@@ -15,7 +15,7 @@ export const LOCALES = [
{
name: "Tiếng Việt (Vietnamese)",
value: "vi-VN",
progress: 1,
progress: 0,
dir: "ltr",
},
{
@@ -27,43 +27,43 @@ export const LOCALES = [
{
name: "Türkçe (Turkish)",
value: "tr-TR",
progress: 53,
progress: 62,
dir: "ltr",
},
{
name: "Svenska (Swedish)",
value: "sv-SE",
progress: 94,
progress: 99,
dir: "ltr",
},
{
name: "српски (Serbian)",
value: "sr-SP",
progress: 32,
progress: 31,
dir: "ltr",
},
{
name: "Slovenian",
value: "sl-SI",
progress: 47,
progress: 49,
dir: "ltr",
},
{
name: "Slovak",
value: "sk-SK",
progress: 93,
progress: 91,
dir: "ltr",
},
{
name: "Pусский (Russian)",
value: "ru-RU",
progress: 98,
progress: 99,
dir: "ltr",
},
{
name: "Română (Romanian)",
value: "ro-RO",
progress: 42,
progress: 44,
dir: "ltr",
},
{
@@ -75,19 +75,19 @@ export const LOCALES = [
{
name: "Português do Brasil (Brazilian Portuguese)",
value: "pt-BR",
progress: 97,
progress: 95,
dir: "ltr",
},
{
name: "Polski (Polish)",
value: "pl-PL",
progress: 98,
progress: 100,
dir: "ltr",
},
{
name: "Norsk (Norwegian)",
value: "no-NO",
progress: 99,
progress: 97,
dir: "ltr",
},
{
@@ -99,25 +99,25 @@ export const LOCALES = [
{
name: "Latvian",
value: "lv-LV",
progress: 1,
progress: 0,
dir: "ltr",
},
{
name: "Lithuanian",
value: "lt-LT",
progress: 93,
progress: 91,
dir: "ltr",
},
{
name: "한국어 (Korean)",
value: "ko-KR",
progress: 5,
progress: 3,
dir: "ltr",
},
{
name: "日本語 (Japanese)",
value: "ja-JP",
progress: 12,
progress: 11,
dir: "ltr",
},
{
@@ -135,25 +135,25 @@ export const LOCALES = [
{
name: "Magyar (Hungarian)",
value: "hu-HU",
progress: 100,
progress: 98,
dir: "ltr",
},
{
name: "Croatian",
value: "hr-HR",
progress: 93,
progress: 91,
dir: "ltr",
},
{
name: "עברית (Hebrew)",
value: "he-IL",
progress: 97,
progress: 98,
dir: "rtl",
},
{
name: "Galician",
value: "gl-ES",
progress: 1,
progress: 3,
dir: "ltr",
},
{
@@ -165,19 +165,19 @@ export const LOCALES = [
{
name: "French, Canada",
value: "fr-CA",
progress: 97,
progress: 95,
dir: "ltr",
},
{
name: "Suomi (Finnish)",
value: "fi-FI",
progress: 91,
progress: 89,
dir: "ltr",
},
{
name: "Español (Spanish)",
value: "es-ES",
progress: 79,
progress: 93,
dir: "ltr",
},
{
@@ -189,13 +189,13 @@ export const LOCALES = [
{
name: "British English",
value: "en-GB",
progress: 3,
progress: 2,
dir: "ltr",
},
{
name: "Ελληνικά (Greek)",
value: "el-GR",
progress: 34,
progress: 33,
dir: "ltr",
},
{
@@ -219,7 +219,7 @@ export const LOCALES = [
{
name: "Català (Catalan)",
value: "ca-ES",
progress: 75,
progress: 74,
dir: "ltr",
},
{
@@ -231,13 +231,13 @@ export const LOCALES = [
{
name: "العربية (Arabic)",
value: "ar-SA",
progress: 20,
progress: 18,
dir: "rtl",
},
{
name: "Afrikaans (Afrikaans)",
value: "af-ZA",
progress: 92,
progress: 90,
dir: "ltr",
},
]

View File

@@ -80,6 +80,7 @@
"recipe-events": "Recipe Events"
},
"general": {
"add": "Add",
"cancel": "Kanselleer",
"clear": "Maak skoon",
"close": "Maak toe",

View File

@@ -80,6 +80,7 @@
"recipe-events": "Recipe Events"
},
"general": {
"add": "Add",
"cancel": "إلغاء",
"clear": "مسح",
"close": "إغلاق",

View File

@@ -80,6 +80,7 @@
"recipe-events": "Събития на рецептата"
},
"general": {
"add": "Add",
"cancel": "Откажи",
"clear": "Изчисти",
"close": "Затвори",

View File

@@ -80,6 +80,7 @@
"recipe-events": "Esdeveniments de receptes"
},
"general": {
"add": "Add",
"cancel": "Anuŀla",
"clear": "Neteja",
"close": "Tanca",

View File

@@ -80,6 +80,7 @@
"recipe-events": "Recipe Events"
},
"general": {
"add": "Add",
"cancel": "Zrušit",
"clear": "Vymazat",
"close": "Zavřít",

View File

@@ -80,6 +80,7 @@
"recipe-events": "Hændelser for opskrifter"
},
"general": {
"add": "Add",
"cancel": "Annuller",
"clear": "Ryd",
"close": "Luk",

View File

@@ -80,6 +80,7 @@
"recipe-events": "Rezept-Ereignisse"
},
"general": {
"add": "Add",
"cancel": "Abbrechen",
"clear": "Zurücksetzen",
"close": "Schließen",

View File

@@ -80,6 +80,7 @@
"recipe-events": "Recipe Events"
},
"general": {
"add": "Add",
"cancel": "Άκυρο",
"clear": "Εκκαθάριση",
"close": "Κλείσιμο",

View File

@@ -80,6 +80,7 @@
"recipe-events": "Recipe Events"
},
"general": {
"add": "Add",
"cancel": "Cancel",
"clear": "Clear",
"close": "Close",

View File

@@ -80,6 +80,7 @@
"recipe-events": "Recipe Events"
},
"general": {
"add": "Add",
"cancel": "Cancel",
"clear": "Clear",
"close": "Close",

View File

@@ -80,6 +80,7 @@
"recipe-events": "Eventos de receta"
},
"general": {
"add": "Add",
"cancel": "Cancelar",
"clear": "Eliminar",
"close": "Cerrar",

View File

@@ -80,6 +80,7 @@
"recipe-events": "Recipe Events"
},
"general": {
"add": "Add",
"cancel": "Peruuta",
"clear": "Tyhjennä",
"close": "Sulje",

View File

@@ -80,6 +80,7 @@
"recipe-events": "Événements de recette"
},
"general": {
"add": "Ajouter",
"cancel": "Annuler",
"clear": "Effacer",
"close": "Fermer",
@@ -142,7 +143,7 @@
"save": "Sauvegarder",
"settings": "Paramètres",
"share": "Partager",
"show-all": "Show All",
"show-all": "Tout afficher",
"shuffle": "Mélanger",
"sort": "Trier",
"sort-alphabetically": "Alphabétique",

View File

@@ -80,6 +80,7 @@
"recipe-events": "Événements de recette"
},
"general": {
"add": "Ajouter",
"cancel": "Annuler",
"clear": "Effacer",
"close": "Fermer",
@@ -142,7 +143,7 @@
"save": "Sauvegarder",
"settings": "Paramètres",
"share": "Partager",
"show-all": "Show All",
"show-all": "Tout afficher",
"shuffle": "Aléatoire",
"sort": "Trier",
"sort-alphabetically": "Alphabétique",

View File

@@ -80,6 +80,7 @@
"recipe-events": "Recipe Events"
},
"general": {
"add": "Add",
"cancel": "Cancel",
"clear": "Clear",
"close": "Close",

View File

@@ -80,6 +80,7 @@
"recipe-events": "אירועי מתכון"
},
"general": {
"add": "Add",
"cancel": "ביטול",
"clear": "נקה",
"close": "סגירה",

View File

@@ -80,6 +80,7 @@
"recipe-events": "Recipe Events"
},
"general": {
"add": "Add",
"cancel": "Odustani",
"clear": "Očisti",
"close": "Zatvori",

View File

@@ -80,6 +80,7 @@
"recipe-events": "Recept esemény"
},
"general": {
"add": "Add",
"cancel": "Mégsem",
"clear": "Törlés",
"close": "Bezár",

View File

@@ -80,6 +80,7 @@
"recipe-events": "Recipe Events"
},
"general": {
"add": "Add",
"cancel": "Cancel",
"clear": "Clear",
"close": "Close",

View File

@@ -80,6 +80,7 @@
"recipe-events": "Eventi di ricette"
},
"general": {
"add": "Aggiungi",
"cancel": "Cancella",
"clear": "Resetta",
"close": "Chiudi",
@@ -142,7 +143,7 @@
"save": "Salva",
"settings": "Impostazioni",
"share": "Condividi",
"show-all": "Show All",
"show-all": "Mostra tutto",
"shuffle": "Casuale",
"sort": "Ordina",
"sort-alphabetically": "Alfabetico",

View File

@@ -80,6 +80,7 @@
"recipe-events": "Recipe Events"
},
"general": {
"add": "Add",
"cancel": "キャンセル",
"clear": "クリア",
"close": "閉じる",

View File

@@ -80,6 +80,7 @@
"recipe-events": "Recipe Events"
},
"general": {
"add": "Add",
"cancel": "Cancel",
"clear": "Clear",
"close": "Close",

View File

@@ -80,6 +80,7 @@
"recipe-events": "Recipe Events"
},
"general": {
"add": "Add",
"cancel": "Atšaukti",
"clear": "Išvalyti",
"close": "Uždaryti",

View File

@@ -80,6 +80,7 @@
"recipe-events": "Recipe Events"
},
"general": {
"add": "Add",
"cancel": "Cancel",
"clear": "Clear",
"close": "Close",

View File

@@ -80,6 +80,7 @@
"recipe-events": "Recept gebeurtenissen"
},
"general": {
"add": "Voeg toe",
"cancel": "Annuleren",
"clear": "Wissen",
"close": "Sluiten",

View File

@@ -80,6 +80,7 @@
"recipe-events": "Oppskriftshendelser"
},
"general": {
"add": "Add",
"cancel": "Avbryt",
"clear": "Tøm",
"close": "Lukk",

View File

@@ -77,9 +77,10 @@
"tag-events": "Zdarzenia tagów",
"category-events": "Wydarzenia kategorii",
"when-a-new-user-joins-your-group": "Kiedy nowy użytkownik dołączy do Twojej grupy",
"recipe-events": "Recipe Events"
"recipe-events": "Zdarzenia Przepisów"
},
"general": {
"add": "Dodaj",
"cancel": "Anuluj",
"clear": "Wyczyść",
"close": "Zamknij",
@@ -142,7 +143,7 @@
"save": "Zapisz",
"settings": "Ustawienia",
"share": "Udostępnij",
"show-all": "Show All",
"show-all": "Pokaż wszystko",
"shuffle": "Pomieszaj",
"sort": "Sortuj",
"sort-alphabetically": "Alfabetyczne",
@@ -495,8 +496,8 @@
"cook-mode": "Tryb Gotowania",
"link-ingredients": "Podłącz składniki",
"merge-above": "Scal z powyższym",
"move-to-bottom": "Move To Bottom",
"move-to-top": "Move To Top",
"move-to-bottom": "Przesuń na sam dół",
"move-to-top": "Przesuń na samą górę",
"reset-scale": "Zresetuj Skalę",
"decrease-scale-label": "Zmniejsz Skalę o 1",
"increase-scale-label": "Zwiększ Skalę o 1",
@@ -602,7 +603,7 @@
"import-summary": "Podsumowanie importu",
"partial-backup": "Częściowa kopia zapasowa",
"unable-to-delete-backup": "Nie można usunąć kopii zapasowej.",
"experimental-description": "Backups are total snapshots of the database and data directory of the site. This includes all data and cannot be set to exclude subsets of data. You can think of this as a snapshot of Mealie at a specific time. These serve as a database agnostic way to export and import data, or back up the site to an external location.",
"experimental-description": "Kopie zapasowe to całkowite zrzuty bazy danych i katalogu danych witryny. Obejmują one wszystkie dane i nie można nic ustawić, aby wykluczyć podzbiory danych. Traktuj je jako stan całego Mealie w określonym momencie czasu. Backupy to agnostyczny sposób eksportowania i importowania danych oraz sposób na zrobienie kopii witryny do zewnętrznej lokalizacji.",
"backup-restore": "Przywróć kopie",
"back-restore-description": "Przywracanie tej kopii zapasowej nadpisze wszystkie aktualne dane w bazie danych i w katalogu danych i zastąpi je zawartością tej kopii zapasowej. {cannot-be-undone} Jeśli przywrócenie zakończy się pomyślnie, zostaniesz wylogowany.",
"cannot-be-undone": "Tej czynności nie można cofnąć - należy zachować ostrożność.",
@@ -872,7 +873,7 @@
"you-are-not-allowed-to-create-a-user": "Nie masz uprawnień do tworzenia użytkowników",
"you-are-not-allowed-to-delete-this-user": "Nie masz uprawnień do usuwania użytkowników",
"enable-advanced-content": "Włącz zaawansowane ustawienia",
"enable-advanced-content-description": "Włącza funkcje zaawansowane takie jak skalowanie przepisów, klucze API, webhooki i zarządzanie danymi. Nie mart się, opcję tą można później zmienić",
"enable-advanced-content-description": "Włącza zaawansowane funkcje, takie jak skalowanie receptur, klucze API, Webhooki i zarządzanie danymi. Nie martw się, zawsze możesz to zmienić później",
"favorite-recipes": "Ulubione przepisy",
"email-or-username": "E-mail lub nazwa użytkownika",
"remember-me": "Zapamiętaj",
@@ -949,7 +950,7 @@
"example-unit-singular": "np. Łyżka stołowa",
"example-unit-plural": "np. Łyżki stołowe",
"example-unit-abbreviation-singular": "na przykład: Łyżka stołowa",
"example-unit-abbreviation-plural": "ex: Tbsps"
"example-unit-abbreviation-plural": "na przykład: Łyżka stołowa"
},
"labels": {
"seed-dialog-text": "Wypełnij bazę zwyczajowymi etykietami dla wybranego języka.",

View File

@@ -80,6 +80,7 @@
"recipe-events": "Eventos da Receita"
},
"general": {
"add": "Add",
"cancel": "Cancelar",
"clear": "Limpar",
"close": "Fechar",

View File

@@ -80,6 +80,7 @@
"recipe-events": "Eventos de receita"
},
"general": {
"add": "Adicionar",
"cancel": "Cancelar",
"clear": "Limpar",
"close": "Fechar",

View File

@@ -80,6 +80,7 @@
"recipe-events": "Evenimente rețetă"
},
"general": {
"add": "Add",
"cancel": "Anulează",
"clear": "Șterge",
"close": "Închide",

View File

@@ -80,6 +80,7 @@
"recipe-events": "События Рецепта"
},
"general": {
"add": "Add",
"cancel": "Отмена",
"clear": "Очистить",
"close": "Закрыть",

View File

@@ -80,6 +80,7 @@
"recipe-events": "Recipe Events"
},
"general": {
"add": "Add",
"cancel": "Zrušiť",
"clear": "Vymazať",
"close": "Zavrieť",

View File

@@ -80,6 +80,7 @@
"recipe-events": "Recipe Events"
},
"general": {
"add": "Add",
"cancel": "Prekliči",
"clear": "Počisti",
"close": "Zapri",
@@ -142,7 +143,7 @@
"save": "Shrani",
"settings": "Nastavitve",
"share": "Deli",
"show-all": "Show All",
"show-all": "Prikaži vse",
"shuffle": "Naključno",
"sort": "Razvrsti",
"sort-alphabetically": "Po abecedi",
@@ -198,8 +199,8 @@
"export-all": "Izvozi vse",
"refresh": "Osveži",
"upload-file": "Naloži datoteko",
"created-on-date": "Created on: {0}",
"unsaved-changes": "You have unsaved changes. Do you want to save before leaving? Okay to save, Cancel to discard changes.",
"created-on-date": "Ustvarjeno dne: {0}",
"unsaved-changes": "Imate neohranjene spremembe. Ali želite shraniti pred odhodom? V redu, če želite shraniti, Prekliči, če želite zavreči spremembe.",
"clipboard-copy-failure": "Failed to copy to the clipboard.",
"confirm-delete-generic-items": "Are you sure you want to delete the following items?"
},
@@ -294,8 +295,8 @@
"type-any": "Katerikoli",
"day-any": "Katerikoli",
"editor": "Editor",
"meal-recipe": "Meal Recipe",
"meal-title": "Meal Title",
"meal-recipe": "Recept za obrok",
"meal-title": "Naslov obroka",
"meal-note": "Meal Note",
"note-only": "Note Only",
"random-meal": "Random Meal",
@@ -354,8 +355,8 @@
"tag-all-recipes": "Tag all recipes with {tag-name} tag",
"nextcloud-text": "Nextcloud recipes can be imported from a zip file that contains the data stored in Nextcloud. See the example folder structure below to ensure your recipes are able to be imported.",
"chowdown-text": "Mealie natively supports the chowdown repository format. Download the code repository as a .zip file and upload it below",
"recipe-1": "Recipe 1",
"recipe-2": "Recipe 2",
"recipe-1": "Recept 1",
"recipe-2": "Recept 2",
"paprika-text": "Mealie can import recipes from the Paprika application. Export your recipes from paprika, rename the export extension to .zip and upload it below.",
"mealie-text": "Mealie can import recipes from the Mealie application from a pre v1.0 release. Export your recipes from your old instance, and upload the zip file below. Note that only recipes can be imported from the export.",
"plantoeat": {
@@ -531,7 +532,7 @@
"select-one-of-the-various-ways-to-create-a-recipe": "Select one of the various ways to create a recipe",
"looking-for-migrations": "Looking For Migrations?",
"import-with-url": "Import with URL",
"create-recipe": "Create Recipe",
"create-recipe": "Ustvari recept",
"import-with-zip": "Import with .zip",
"create-recipe-from-an-image": "Create recipe from an image",
"bulk-url-import": "Bulk URL Import",

View File

@@ -80,6 +80,7 @@
"recipe-events": "Recipe Events"
},
"general": {
"add": "Add",
"cancel": "Откажи",
"clear": "Обриши",
"close": "Затвори",

View File

@@ -80,6 +80,7 @@
"recipe-events": "Recepthändelser"
},
"general": {
"add": "Add",
"cancel": "Avbryt",
"clear": "Rensa",
"close": "Stäng",

View File

@@ -80,6 +80,7 @@
"recipe-events": "Recipe Events"
},
"general": {
"add": "Ekle",
"cancel": "İptal",
"clear": "Temizle",
"close": "Kapat",
@@ -142,7 +143,7 @@
"save": "Kaydet",
"settings": "Ayarlar",
"share": "Paylaş",
"show-all": "Show All",
"show-all": "Tümünü Göster",
"shuffle": "Karıştır",
"sort": "Sırala",
"sort-alphabetically": "Alfabetik",

View File

@@ -80,6 +80,7 @@
"recipe-events": "Події рецепту"
},
"general": {
"add": "Додати",
"cancel": "Скасувати",
"clear": "Очистити",
"close": "Закрити",
@@ -142,7 +143,7 @@
"save": "Зберегти",
"settings": "Налаштування",
"share": "Поділитись",
"show-all": "Show All",
"show-all": "Показати все",
"shuffle": "Перемішати",
"sort": "Сортувати",
"sort-alphabetically": "За алфавітом",

View File

@@ -80,6 +80,7 @@
"recipe-events": "Recipe Events"
},
"general": {
"add": "Add",
"cancel": "Cancel",
"clear": "Clear",
"close": "Close",

View File

@@ -80,6 +80,7 @@
"recipe-events": "食谱事件"
},
"general": {
"add": "添加",
"cancel": "取消",
"clear": "清空",
"close": "关闭",
@@ -142,7 +143,7 @@
"save": "保存",
"settings": "设定",
"share": "分享",
"show-all": "Show All",
"show-all": "全部显示",
"shuffle": "随机",
"sort": "排序",
"sort-alphabetically": "按字母顺序排序",

View File

@@ -80,6 +80,7 @@
"recipe-events": "Recipe Events"
},
"general": {
"add": "Add",
"cancel": "取消",
"clear": "清除",
"close": "關閉",

View File

@@ -38,7 +38,6 @@
:key="mealplan.id"
:recipe-id="mealplan.recipe ? mealplan.recipe.id : ''"
class="mb-2"
:route="mealplan.recipe ? true : false"
:rating="mealplan.recipe ? mealplan.recipe.rating : 0"
:slug="mealplan.recipe ? mealplan.recipe.slug : mealplan.title"
:description="mealplan.recipe ? mealplan.recipe.description : mealplan.text"

View File

@@ -107,7 +107,7 @@
<template #icon> {{ $globals.icons.tags }} </template>
{{ $t('shopping-list.reorder-labels') }}
</BaseButton>
<BaseButton create @click="createEditorOpen = true" />
<BaseButton create @click="createEditorOpen = true" > {{ $t('general.add') }} </BaseButton>
</div>
<!-- Action Bar -->

View File

@@ -1,4 +1,4 @@
// This Code is auto generated by gen_global_components.py
// This Code is auto generated by gen_ts_types.py
import AdvancedOnly from "@/components/global/AdvancedOnly.vue";
import AppButtonCopy from "@/components/global/AppButtonCopy.vue";
import AppButtonUpload from "@/components/global/AppButtonUpload.vue";

View File

@@ -24,11 +24,8 @@ def search_user(conn: LDAPObject, username: str) -> list[tuple[str, dict[str, li
id_attribute=settings.LDAP_ID_ATTRIBUTE, mail_attribute=settings.LDAP_MAIL_ATTRIBUTE, input=username
)
# Don't assume the provided search filter has (|({id_attribute}={input})({mail_attribute}={input}))
search_filter = "(&(|({id_attribute}={input})({mail_attribute}={input})){filter})".format(
id_attribute=settings.LDAP_ID_ATTRIBUTE,
mail_attribute=settings.LDAP_MAIL_ATTRIBUTE,
input=username,
filter=user_filter,
search_filter = (
f"(&(|({settings.LDAP_ID_ATTRIBUTE}={username})({settings.LDAP_MAIL_ATTRIBUTE}={username})){user_filter})"
)
user_entry: list[tuple[str, dict[str, list[bytes]]]] | None = None

View File

@@ -1,38 +1,47 @@
def validate_locale(locale: str) -> bool:
valid = {
"el-GR",
"it-IT",
"ko-KR",
"es-ES",
"ja-JP",
"zh-CN",
"tr-TR",
"ar-SA",
"hu-HU",
"pt-PT",
"no-NO",
"sv-SE",
"ro-RO",
"sk-SK",
"uk-UA",
"fr-CA",
"pl-PL",
"da-DK",
"pt-BR",
"de-DE",
"ca-ES",
"sr-SP",
"cs-CZ",
"fr-FR",
"zh-TW",
# CODE_GEN_ID: MESSAGE_LOCALES
"af-ZA",
"ru-RU",
"he-IL",
"nl-NL",
"en-US",
"ar-SA",
"bg-BG",
"ca-ES",
"cs-CZ",
"da-DK",
"de-DE",
"el-GR",
"en-GB",
"en-US",
"es-ES",
"fi-FI",
"fr-CA",
"fr-FR",
"gl-ES",
"he-IL",
"hr-HR",
"hu-HU",
"is-IS",
"it-IT",
"ja-JP",
"ko-KR",
"lt-LT",
"lv-LV",
"nl-NL",
"no-NO",
"pl-PL",
"pt-BR",
"pt-PT",
"ro-RO",
"ru-RU",
"sk-SK",
"sl-SI",
"sr-SP",
"sv-SE",
"tr-TR",
"uk-UA",
"vi-VN",
"zh-CN",
"zh-TW",
# END: MESSAGE_LOCALES
}
return locale in valid

118
poetry.lock generated
View File

@@ -89,13 +89,13 @@ files = [
[[package]]
name = "apprise"
version = "1.7.3"
version = "1.7.4"
description = "Push Notifications that work with just about every platform!"
optional = false
python-versions = ">=3.6"
files = [
{file = "apprise-1.7.3-py3-none-any.whl", hash = "sha256:d071ff2a12dd57c783edc0aab375e8606f2fb527b1e3afbc8750f0190c8928f4"},
{file = "apprise-1.7.3.tar.gz", hash = "sha256:31e2a639407bb8d266249fc075ff317e9d34ff5951c6e16bfeefddc2af5fe84c"},
{file = "apprise-1.7.4-py3-none-any.whl", hash = "sha256:71edb0f29532c0c35b6c52d882880f1649f8bd1bdc97c7480fda3e1358603325"},
{file = "apprise-1.7.4.tar.gz", hash = "sha256:ef5e830051140d4228a759c5bc2d6857bcc7f8664df3e44f30f64617ce0c7a73"},
]
[package.dependencies]
@@ -1270,38 +1270,38 @@ files = [
[[package]]
name = "mypy"
version = "1.8.0"
version = "1.9.0"
description = "Optional static typing for Python"
optional = false
python-versions = ">=3.8"
files = [
{file = "mypy-1.8.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:485a8942f671120f76afffff70f259e1cd0f0cfe08f81c05d8816d958d4577d3"},
{file = "mypy-1.8.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:df9824ac11deaf007443e7ed2a4a26bebff98d2bc43c6da21b2b64185da011c4"},
{file = "mypy-1.8.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2afecd6354bbfb6e0160f4e4ad9ba6e4e003b767dd80d85516e71f2e955ab50d"},
{file = "mypy-1.8.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:8963b83d53ee733a6e4196954502b33567ad07dfd74851f32be18eb932fb1cb9"},
{file = "mypy-1.8.0-cp310-cp310-win_amd64.whl", hash = "sha256:e46f44b54ebddbeedbd3d5b289a893219065ef805d95094d16a0af6630f5d410"},
{file = "mypy-1.8.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:855fe27b80375e5c5878492f0729540db47b186509c98dae341254c8f45f42ae"},
{file = "mypy-1.8.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:4c886c6cce2d070bd7df4ec4a05a13ee20c0aa60cb587e8d1265b6c03cf91da3"},
{file = "mypy-1.8.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d19c413b3c07cbecf1f991e2221746b0d2a9410b59cb3f4fb9557f0365a1a817"},
{file = "mypy-1.8.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:9261ed810972061388918c83c3f5cd46079d875026ba97380f3e3978a72f503d"},
{file = "mypy-1.8.0-cp311-cp311-win_amd64.whl", hash = "sha256:51720c776d148bad2372ca21ca29256ed483aa9a4cdefefcef49006dff2a6835"},
{file = "mypy-1.8.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:52825b01f5c4c1c4eb0db253ec09c7aa17e1a7304d247c48b6f3599ef40db8bd"},
{file = "mypy-1.8.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:f5ac9a4eeb1ec0f1ccdc6f326bcdb464de5f80eb07fb38b5ddd7b0de6bc61e55"},
{file = "mypy-1.8.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:afe3fe972c645b4632c563d3f3eff1cdca2fa058f730df2b93a35e3b0c538218"},
{file = "mypy-1.8.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:42c6680d256ab35637ef88891c6bd02514ccb7e1122133ac96055ff458f93fc3"},
{file = "mypy-1.8.0-cp312-cp312-win_amd64.whl", hash = "sha256:720a5ca70e136b675af3af63db533c1c8c9181314d207568bbe79051f122669e"},
{file = "mypy-1.8.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:028cf9f2cae89e202d7b6593cd98db6759379f17a319b5faf4f9978d7084cdc6"},
{file = "mypy-1.8.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:4e6d97288757e1ddba10dd9549ac27982e3e74a49d8d0179fc14d4365c7add66"},
{file = "mypy-1.8.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7f1478736fcebb90f97e40aff11a5f253af890c845ee0c850fe80aa060a267c6"},
{file = "mypy-1.8.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:42419861b43e6962a649068a61f4a4839205a3ef525b858377a960b9e2de6e0d"},
{file = "mypy-1.8.0-cp38-cp38-win_amd64.whl", hash = "sha256:2b5b6c721bd4aabaadead3a5e6fa85c11c6c795e0c81a7215776ef8afc66de02"},
{file = "mypy-1.8.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:5c1538c38584029352878a0466f03a8ee7547d7bd9f641f57a0f3017a7c905b8"},
{file = "mypy-1.8.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:4ef4be7baf08a203170f29e89d79064463b7fc7a0908b9d0d5114e8009c3a259"},
{file = "mypy-1.8.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7178def594014aa6c35a8ff411cf37d682f428b3b5617ca79029d8ae72f5402b"},
{file = "mypy-1.8.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:ab3c84fa13c04aeeeabb2a7f67a25ef5d77ac9d6486ff33ded762ef353aa5592"},
{file = "mypy-1.8.0-cp39-cp39-win_amd64.whl", hash = "sha256:99b00bc72855812a60d253420d8a2eae839b0afa4938f09f4d2aa9bb4654263a"},
{file = "mypy-1.8.0-py3-none-any.whl", hash = "sha256:538fd81bb5e430cc1381a443971c0475582ff9f434c16cd46d2c66763ce85d9d"},
{file = "mypy-1.8.0.tar.gz", hash = "sha256:6ff8b244d7085a0b425b56d327b480c3b29cafbd2eff27316a004f9a7391ae07"},
{file = "mypy-1.9.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:f8a67616990062232ee4c3952f41c779afac41405806042a8126fe96e098419f"},
{file = "mypy-1.9.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:d357423fa57a489e8c47b7c85dfb96698caba13d66e086b412298a1a0ea3b0ed"},
{file = "mypy-1.9.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:49c87c15aed320de9b438ae7b00c1ac91cd393c1b854c2ce538e2a72d55df150"},
{file = "mypy-1.9.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:48533cdd345c3c2e5ef48ba3b0d3880b257b423e7995dada04248725c6f77374"},
{file = "mypy-1.9.0-cp310-cp310-win_amd64.whl", hash = "sha256:4d3dbd346cfec7cb98e6cbb6e0f3c23618af826316188d587d1c1bc34f0ede03"},
{file = "mypy-1.9.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:653265f9a2784db65bfca694d1edd23093ce49740b2244cde583aeb134c008f3"},
{file = "mypy-1.9.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:3a3c007ff3ee90f69cf0a15cbcdf0995749569b86b6d2f327af01fd1b8aee9dc"},
{file = "mypy-1.9.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2418488264eb41f69cc64a69a745fad4a8f86649af4b1041a4c64ee61fc61129"},
{file = "mypy-1.9.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:68edad3dc7d70f2f17ae4c6c1b9471a56138ca22722487eebacfd1eb5321d612"},
{file = "mypy-1.9.0-cp311-cp311-win_amd64.whl", hash = "sha256:85ca5fcc24f0b4aeedc1d02f93707bccc04733f21d41c88334c5482219b1ccb3"},
{file = "mypy-1.9.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:aceb1db093b04db5cd390821464504111b8ec3e351eb85afd1433490163d60cd"},
{file = "mypy-1.9.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:0235391f1c6f6ce487b23b9dbd1327b4ec33bb93934aa986efe8a9563d9349e6"},
{file = "mypy-1.9.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d4d5ddc13421ba3e2e082a6c2d74c2ddb3979c39b582dacd53dd5d9431237185"},
{file = "mypy-1.9.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:190da1ee69b427d7efa8aa0d5e5ccd67a4fb04038c380237a0d96829cb157913"},
{file = "mypy-1.9.0-cp312-cp312-win_amd64.whl", hash = "sha256:fe28657de3bfec596bbeef01cb219833ad9d38dd5393fc649f4b366840baefe6"},
{file = "mypy-1.9.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:e54396d70be04b34f31d2edf3362c1edd023246c82f1730bbf8768c28db5361b"},
{file = "mypy-1.9.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:5e6061f44f2313b94f920e91b204ec600982961e07a17e0f6cd83371cb23f5c2"},
{file = "mypy-1.9.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:81a10926e5473c5fc3da8abb04119a1f5811a236dc3a38d92015cb1e6ba4cb9e"},
{file = "mypy-1.9.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:b685154e22e4e9199fc95f298661deea28aaede5ae16ccc8cbb1045e716b3e04"},
{file = "mypy-1.9.0-cp38-cp38-win_amd64.whl", hash = "sha256:5d741d3fc7c4da608764073089e5f58ef6352bedc223ff58f2f038c2c4698a89"},
{file = "mypy-1.9.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:587ce887f75dd9700252a3abbc9c97bbe165a4a630597845c61279cf32dfbf02"},
{file = "mypy-1.9.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:f88566144752999351725ac623471661c9d1cd8caa0134ff98cceeea181789f4"},
{file = "mypy-1.9.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:61758fabd58ce4b0720ae1e2fea5cfd4431591d6d590b197775329264f86311d"},
{file = "mypy-1.9.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:e49499be624dead83927e70c756970a0bc8240e9f769389cdf5714b0784ca6bf"},
{file = "mypy-1.9.0-cp39-cp39-win_amd64.whl", hash = "sha256:571741dc4194b4f82d344b15e8837e8c5fcc462d66d076748142327626a1b6e9"},
{file = "mypy-1.9.0-py3-none-any.whl", hash = "sha256:a260627a570559181a9ea5de61ac6297aa5af202f06fd7ab093ce74e7181e43e"},
{file = "mypy-1.9.0.tar.gz", hash = "sha256:3cc5da0127e6a478cddd906068496a97a7618a21ce9b54bde5bf7e539c7af974"},
]
[package.dependencies]
@@ -1949,13 +1949,13 @@ rdflib = "*"
[[package]]
name = "pytest"
version = "8.0.2"
version = "8.1.1"
description = "pytest: simple powerful testing with Python"
optional = false
python-versions = ">=3.8"
files = [
{file = "pytest-8.0.2-py3-none-any.whl", hash = "sha256:edfaaef32ce5172d5466b5127b42e0d6d35ebbe4453f0e3505d96afd93f6b096"},
{file = "pytest-8.0.2.tar.gz", hash = "sha256:d4051d623a2e0b7e51960ba963193b09ce6daeb9759a451844a21e4ddedfc1bd"},
{file = "pytest-8.1.1-py3-none-any.whl", hash = "sha256:2a8386cfc11fa9d2c50ee7b2a57e7d898ef90470a7a34c4b949ff59662bb78b7"},
{file = "pytest-8.1.1.tar.gz", hash = "sha256:ac978141a75948948817d360297b7aae0fcb9d6ff6bc9ec6d514b85d5a65c044"},
]
[package.dependencies]
@@ -1963,11 +1963,11 @@ colorama = {version = "*", markers = "sys_platform == \"win32\""}
exceptiongroup = {version = ">=1.0.0rc8", markers = "python_version < \"3.11\""}
iniconfig = "*"
packaging = "*"
pluggy = ">=1.3.0,<2.0"
tomli = {version = ">=1.0.0", markers = "python_version < \"3.11\""}
pluggy = ">=1.4,<2.0"
tomli = {version = ">=1", markers = "python_version < \"3.11\""}
[package.extras]
testing = ["argcomplete", "attrs (>=19.2.0)", "hypothesis (>=3.56)", "mock", "nose", "pygments (>=2.7.2)", "requests", "setuptools", "xmlschema"]
testing = ["argcomplete", "attrs (>=19.2)", "hypothesis (>=3.56)", "mock", "pygments (>=2.7.2)", "requests", "setuptools", "xmlschema"]
[[package]]
name = "pytest-asyncio"
@@ -2468,28 +2468,28 @@ pyasn1 = ">=0.1.3"
[[package]]
name = "ruff"
version = "0.3.0"
version = "0.3.2"
description = "An extremely fast Python linter and code formatter, written in Rust."
optional = false
python-versions = ">=3.7"
files = [
{file = "ruff-0.3.0-py3-none-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:7deb528029bacf845bdbb3dbb2927d8ef9b4356a5e731b10eef171e3f0a85944"},
{file = "ruff-0.3.0-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:e1e0d4381ca88fb2b73ea0766008e703f33f460295de658f5467f6f229658c19"},
{file = "ruff-0.3.0-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2f7dbba46e2827dfcb0f0cc55fba8e96ba7c8700e0a866eb8cef7d1d66c25dcb"},
{file = "ruff-0.3.0-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:23dbb808e2f1d68eeadd5f655485e235c102ac6f12ad31505804edced2a5ae77"},
{file = "ruff-0.3.0-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3ef655c51f41d5fa879f98e40c90072b567c666a7114fa2d9fe004dffba00932"},
{file = "ruff-0.3.0-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:d0d3d7ef3d4f06433d592e5f7d813314a34601e6c5be8481cccb7fa760aa243e"},
{file = "ruff-0.3.0-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b08b356d06a792e49a12074b62222f9d4ea2a11dca9da9f68163b28c71bf1dd4"},
{file = "ruff-0.3.0-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9343690f95710f8cf251bee1013bf43030072b9f8d012fbed6ad702ef70d360a"},
{file = "ruff-0.3.0-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a1f3ed501a42f60f4dedb7805fa8d4534e78b4e196f536bac926f805f0743d49"},
{file = "ruff-0.3.0-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:cc30a9053ff2f1ffb505a585797c23434d5f6c838bacfe206c0e6cf38c921a1e"},
{file = "ruff-0.3.0-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:5da894a29ec018a8293d3d17c797e73b374773943e8369cfc50495573d396933"},
{file = "ruff-0.3.0-py3-none-musllinux_1_2_i686.whl", hash = "sha256:755c22536d7f1889be25f2baf6fedd019d0c51d079e8417d4441159f3bcd30c2"},
{file = "ruff-0.3.0-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:dd73fe7f4c28d317855da6a7bc4aa29a1500320818dd8f27df95f70a01b8171f"},
{file = "ruff-0.3.0-py3-none-win32.whl", hash = "sha256:19eacceb4c9406f6c41af806418a26fdb23120dfe53583df76d1401c92b7c14b"},
{file = "ruff-0.3.0-py3-none-win_amd64.whl", hash = "sha256:128265876c1d703e5f5e5a4543bd8be47c73a9ba223fd3989d4aa87dd06f312f"},
{file = "ruff-0.3.0-py3-none-win_arm64.whl", hash = "sha256:e3a4a6d46aef0a84b74fcd201a4401ea9a6cd85614f6a9435f2d33dd8cefbf83"},
{file = "ruff-0.3.0.tar.gz", hash = "sha256:0886184ba2618d815067cf43e005388967b67ab9c80df52b32ec1152ab49f53a"},
{file = "ruff-0.3.2-py3-none-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:77f2612752e25f730da7421ca5e3147b213dca4f9a0f7e0b534e9562c5441f01"},
{file = "ruff-0.3.2-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:9966b964b2dd1107797be9ca7195002b874424d1d5472097701ae8f43eadef5d"},
{file = "ruff-0.3.2-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b83d17ff166aa0659d1e1deaf9f2f14cbe387293a906de09bc4860717eb2e2da"},
{file = "ruff-0.3.2-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:bb875c6cc87b3703aeda85f01c9aebdce3d217aeaca3c2e52e38077383f7268a"},
{file = "ruff-0.3.2-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:be75e468a6a86426430373d81c041b7605137a28f7014a72d2fc749e47f572aa"},
{file = "ruff-0.3.2-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:967978ac2d4506255e2f52afe70dda023fc602b283e97685c8447d036863a302"},
{file = "ruff-0.3.2-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1231eacd4510f73222940727ac927bc5d07667a86b0cbe822024dd00343e77e9"},
{file = "ruff-0.3.2-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2c6d613b19e9a8021be2ee1d0e27710208d1603b56f47203d0abbde906929a9b"},
{file = "ruff-0.3.2-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c8439338a6303585d27b66b4626cbde89bb3e50fa3cae86ce52c1db7449330a7"},
{file = "ruff-0.3.2-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:de8b480d8379620cbb5ea466a9e53bb467d2fb07c7eca54a4aa8576483c35d36"},
{file = "ruff-0.3.2-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:b74c3de9103bd35df2bb05d8b2899bf2dbe4efda6474ea9681280648ec4d237d"},
{file = "ruff-0.3.2-py3-none-musllinux_1_2_i686.whl", hash = "sha256:f380be9fc15a99765c9cf316b40b9da1f6ad2ab9639e551703e581a5e6da6745"},
{file = "ruff-0.3.2-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:0ac06a3759c3ab9ef86bbeca665d31ad3aa9a4b1c17684aadb7e61c10baa0df4"},
{file = "ruff-0.3.2-py3-none-win32.whl", hash = "sha256:9bd640a8f7dd07a0b6901fcebccedadeb1a705a50350fb86b4003b805c81385a"},
{file = "ruff-0.3.2-py3-none-win_amd64.whl", hash = "sha256:0c1bdd9920cab5707c26c8b3bf33a064a4ca7842d91a99ec0634fec68f9f4037"},
{file = "ruff-0.3.2-py3-none-win_arm64.whl", hash = "sha256:5f65103b1d76e0d600cabd577b04179ff592064eaa451a70a81085930e907d0b"},
{file = "ruff-0.3.2.tar.gz", hash = "sha256:fa78ec9418eb1ca3db392811df3376b46471ae93792a81af2d1cbb0e5dcb5142"},
]
[[package]]
@@ -2776,13 +2776,13 @@ socks = ["PySocks (>=1.5.6,!=1.5.7,<2.0)"]
[[package]]
name = "uvicorn"
version = "0.27.1"
version = "0.28.0"
description = "The lightning-fast ASGI server."
optional = false
python-versions = ">=3.8"
files = [
{file = "uvicorn-0.27.1-py3-none-any.whl", hash = "sha256:5c89da2f3895767472a35556e539fd59f7edbe9b1e9c0e1c99eebeadc61838e4"},
{file = "uvicorn-0.27.1.tar.gz", hash = "sha256:3d9a267296243532db80c83a959a3400502165ade2c1338dea4e67915fd4745a"},
{file = "uvicorn-0.28.0-py3-none-any.whl", hash = "sha256:6623abbbe6176204a4226e67607b4d52cc60ff62cda0ff177613645cefa2ece1"},
{file = "uvicorn-0.28.0.tar.gz", hash = "sha256:cab4473b5d1eaeb5a0f6375ac4bc85007ffc75c3cc1768816d9e5d589857b067"},
]
[package.dependencies]
@@ -3040,4 +3040,4 @@ pgsql = ["psycopg2-binary"]
[metadata]
lock-version = "2.0"
python-versions = "^3.10"
content-hash = "9576c2fb9e9274b65b13e01fd962d59dafd9a1d2f054e8b0407b3e6c0695d0bb"
content-hash = "fe771c620ec99c7392b8269f206e2d99ae492988002b8814fa44f1dba1bafe28"

View File

@@ -38,7 +38,7 @@ python-slugify = "^8.0.0"
recipe-scrapers = "^14.53.0"
requests = "^2.31.0"
tzdata = "^2023.4"
uvicorn = { extras = ["standard"], version = "^0.27.0" }
uvicorn = { extras = ["standard"], version = "^0.28.0" }
beautifulsoup4 = "^4.11.2"
isodate = "^0.6.1"
text-unidecode = "^1.3"
@@ -112,22 +112,7 @@ strict_optional = true
[tool.ruff]
line-length = 120
output-format = "text"
# Enable Pyflakes `E` and `F` codes by default.
ignore = ["F403", "TID252", "B008"]
select = [
"E", # pycodestyles
"F", # pyflakes
"I", # isort
"T", # flake8-print
"UP", # pyupgrade
"B", # flake8-bugbear
# "ANN", # flake8-annotations
# "C", # McCabe complexity
# "RUF", # Ruff specific
# "BLE", # blind-except
]
output-format = "concise"
# Exclude a variety of commonly ignored directories.
exclude = [
@@ -155,9 +140,25 @@ exclude = [
# Assume Python 3.10.
target-version = "py310"
[tool.ruff.per-file-ignores]
[tool.ruff.lint]
# Enable Pyflakes `E` and `F` codes by default.
ignore = ["F403", "TID252", "B008"]
select = [
"E", # pycodestyles
"F", # pyflakes
"I", # isort
"T", # flake8-print
"UP", # pyupgrade
"B", # flake8-bugbear
# "ANN", # flake8-annotations
# "C", # McCabe complexity
# "RUF", # Ruff specific
# "BLE", # blind-except
]
[tool.ruff.lint.per-file-ignores]
"__init__.py" = ["E402", "E501"]
[tool.ruff.mccabe]
[tool.ruff.lint.mccabe]
# Unlike Flake8, default to a complexity level of 10.
max-complexity = 10