diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 72d6d665a..8a36797a8 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -12,7 +12,7 @@ repos: exclude: ^tests/data/ - repo: https://github.com/astral-sh/ruff-pre-commit # Ruff version. - rev: v0.9.3 + rev: v0.9.4 hooks: - id: ruff - id: ruff-format diff --git a/docs/mkdocs.yml b/docs/mkdocs.yml index 0351da02a..68110a2c2 100644 --- a/docs/mkdocs.yml +++ b/docs/mkdocs.yml @@ -85,12 +85,13 @@ nav: - OpenID Connect: "documentation/getting-started/authentication/oidc-v2.md" - Community Guides: + - Bring API without internet exposure: "documentation/community-guide/bring-api.md" + - Automate Backups with n8n: "documentation/community-guide/n8n-backup-automation.md" + - Bulk Url Import: "documentation/community-guide/bulk-url-import.md" + - Home Assistant: "documentation/community-guide/home-assistant.md" + - Import Bookmarklet: "documentation/community-guide/import-recipe-bookmarklet.md" - iOS Shortcuts: "documentation/community-guide/ios.md" - Reverse Proxy (SWAG): "documentation/community-guide/swag.md" - - Home Assistant: "documentation/community-guide/home-assistant.md" - - Bulk Url Import: "documentation/community-guide/bulk-url-import.md" - - Import Bookmarklet: "documentation/community-guide/import-recipe-bookmarklet.md" - - Automate Backups with n8n: "documentation/community-guide/n8n-backup-automation.md" - API Reference: "api/redoc.md" diff --git a/frontend/components/Domain/Recipe/RecipeCardSection.vue b/frontend/components/Domain/Recipe/RecipeCardSection.vue index fe201bd25..64fb9c0b3 100644 --- a/frontend/components/Domain/Recipe/RecipeCardSection.vue +++ b/frontend/components/Domain/Recipe/RecipeCardSection.vue @@ -236,14 +236,17 @@ export default defineComponent({ }); async function fetchRecipes(pageCount = 1) { + const orderDir = props.query?.orderDirection || preferences.value.orderDirection; + const orderByNullPosition = props.query?.orderByNullPosition || orderDir === "asc" ? "first" : "last"; return await fetchMore( page.value, perPage * pageCount, props.query?.orderBy || preferences.value.orderBy, - props.query?.orderDirection || preferences.value.orderDirection, + orderDir, + orderByNullPosition, props.query, // we use a computed queryFilter to filter out recipes that have a null value for the property we're sorting by - queryFilter.value + queryFilter.value, ); } diff --git a/frontend/composables/recipes/use-recipes.ts b/frontend/composables/recipes/use-recipes.ts index aef1c0c1c..9286968f3 100644 --- a/frontend/composables/recipes/use-recipes.ts +++ b/frontend/composables/recipes/use-recipes.ts @@ -2,7 +2,7 @@ import { useAsync, useRouter, ref } from "@nuxtjs/composition-api"; import { useAsyncKey } from "../use-utils"; import { usePublicExploreApi } from "~/composables/api/api-client"; import { useUserApi } from "~/composables/api"; -import { Recipe } from "~/lib/api/types/recipe"; +import { OrderByNullPosition, Recipe } from "~/lib/api/types/recipe"; import { RecipeSearchQuery } from "~/lib/api/user/recipes/recipe"; export const allRecipes = ref([]); @@ -11,12 +11,14 @@ export const recentRecipes = ref([]); function getParams( orderBy: string | null = null, orderDirection = "desc", + orderByNullPosition: OrderByNullPosition | null = null, query: RecipeSearchQuery | null = null, queryFilter: string | null = null ) { return { orderBy, orderDirection, + orderByNullPosition, paginationSeed: query?._searchSeed, // propagate searchSeed to stabilize random order pagination searchSeed: query?._searchSeed, // unused, but pass it along for completeness of data search: query?.search, @@ -47,6 +49,7 @@ export const useLazyRecipes = function (publicGroupSlug: string | null = null) { perPage: number, orderBy: string | null = null, orderDirection = "desc", + orderByNullPosition: OrderByNullPosition | null = null, query: RecipeSearchQuery | null = null, queryFilter: string | null = null, ) { @@ -54,7 +57,7 @@ export const useLazyRecipes = function (publicGroupSlug: string | null = null) { const { data, error } = await api.recipes.getAll( page, perPage, - getParams(orderBy, orderDirection, query, queryFilter), + getParams(orderBy, orderDirection, orderByNullPosition, query, queryFilter), ); if (error?.response?.status === 404) { @@ -88,7 +91,7 @@ export const useLazyRecipes = function (publicGroupSlug: string | null = null) { } async function getRandom(query: RecipeSearchQuery | null = null, queryFilter: string | null = null) { - const { data } = await api.recipes.getAll(1, 1, getParams("random", "desc", query, queryFilter)); + const { data } = await api.recipes.getAll(1, 1, getParams("random", "desc", null, query, queryFilter)); if (data?.items.length) { return data.items[0]; } diff --git a/frontend/lang/messages/es-ES.json b/frontend/lang/messages/es-ES.json index 093f5d87e..e20401ec5 100644 --- a/frontend/lang/messages/es-ES.json +++ b/frontend/lang/messages/es-ES.json @@ -469,7 +469,7 @@ "categories": "Categorías", "cholesterol-content": "Colesterol", "comment-action": "Comentar", - "comment": "Comentar", + "comment": "Comentario", "comments": "Comentarios", "delete-confirmation": "¿Estás seguro de eliminar esta receta?", "delete-recipe": "Borrar receta", diff --git a/frontend/lang/messages/fi-FI.json b/frontend/lang/messages/fi-FI.json index 1c655a837..c8198295c 100644 --- a/frontend/lang/messages/fi-FI.json +++ b/frontend/lang/messages/fi-FI.json @@ -23,7 +23,7 @@ "support": "Tuki", "version": "Versio", "unknown-version": "tuntematon", - "sponsor": "Yhteistyökumppani" + "sponsor": "Sponsori" }, "asset": { "assets": "Liitteet", @@ -72,7 +72,7 @@ "enable-notifier": "Ota ilmoittaja käyttöön", "what-events": "Mistä tapahtumista tulisi ilmoittaa?", "user-events": "Käyttäjän tapahtumat", - "mealplan-events": "Ateriasuunnittelun tapahtumat", + "mealplan-events": "Ateriasuunnitelman Tapahtumat", "when-a-user-in-your-group-creates-a-new-mealplan": "Kun ryhmäsi käyttäjä tekee ateriasuunnitelman", "shopping-list-events": "Ostoslistatapahtumat", "cookbook-events": "Keittokirjatapahtumat", @@ -277,7 +277,7 @@ "admin-group-management-text": "Muutokset tähän ryhmään tulevat näkymään välittömästi.", "group-id-value": "Ryhmän tunniste: {0}", "total-households": "Kotitaloudet Yhteensä", - "you-must-select-a-group-before-selecting-a-household": "You must select a group before selecting a household" + "you-must-select-a-group-before-selecting-a-household": "Sinun tulee valita ryhmä ennen kuin valitset kotitalouden" }, "household": { "household": "Kotitalous", @@ -518,7 +518,7 @@ "save-recipe-before-use": "Tallenna resepti ennen käyttöä", "section-title": "Osion otsikko", "servings": "Annokset", - "serves-amount": "Serves {amount}", + "serves-amount": "{amount} annosta", "share-recipe-message": "Halusin jakaa reseptin {0} kanssasi.", "show-nutrition-values": "Näytä ravintoarvot", "sodium-content": "Natrium", @@ -532,7 +532,7 @@ "no-recipe": "Ei reseptiä", "locked-by-owner": "Omistajan lukitsema", "join-the-conversation": "Liity keskusteluun", - "add-recipe-to-mealplan": "Lisää resepti ateriasuunnitelmaan", + "add-recipe-to-mealplan": "Lisää resepti Ateriasuunnitelmaan", "entry-type": "Merkinnän tyyppi", "date-format-hint": "KK/PP/VVVV-muoto", "date-format-hint-yyyy-mm-dd": "VVVV-KK-PP-muoto", @@ -546,9 +546,9 @@ "failed-to-add-recipes-to-list": "Luetteloon lisääminen epäonnistui", "failed-to-add-recipe-to-mealplan": "Reseptiä ei voitu lisätä ateriasuunnitelmaan", "failed-to-add-to-list": "Luetteloon lisääminen epäonnistui", - "yield": "Sato", - "yields-amount-with-text": "Yields {amount} {text}", - "yield-text": "Yield Text", + "yield": "Tuotto", + "yields-amount-with-text": "Tuottaa {amount} {text}", + "yield-text": "Tuotosteksti", "quantity": "Määrä", "choose-unit": "Valitse Yksikkö", "press-enter-to-create": "Luo painamalla Enter", @@ -637,9 +637,9 @@ "recipe-debugger-use-openai-description": "Käytä OpenAI:ta kaavinkirjaston sijaan tulosten jäsentämiseen. Luodessa reseptiä URL:n kautta tämä tehdään ilman eri kysymystä, kun kaavinkirjasto ei toimi, mutta voit kokeilla sitä tässä manuaalisesti.", "debug": "Vianhaku", "tree-view": "Puunäkymä", - "recipe-servings": "Recipe Servings", - "recipe-yield": "Reseptin tekijä", - "recipe-yield-text": "Recipe Yield Text", + "recipe-servings": "Reseptin annokset", + "recipe-yield": "Reseptin tuotto", + "recipe-yield-text": "Reseptin tuotosteksti", "unit": "Yksikkö", "upload-image": "Lataa kuva", "screen-awake": "Pidä näyttö aina päällä", @@ -661,25 +661,25 @@ "missing-food": "Luo puuttuva ruoka: {food}", "no-food": "Ei ruokaa" }, - "reset-servings-count": "Reset Servings Count", - "not-linked-ingredients": "Additional Ingredients" + "reset-servings-count": "Palauta Annoksien Määrä", + "not-linked-ingredients": "Muut ainesosat" }, "recipe-finder": { - "recipe-finder": "Recipe Finder", - "recipe-finder-description": "Search for recipes based on ingredients you have on hand. You can also filter by tools you have available, and set a maximum number of missing ingredients or tools.", - "selected-ingredients": "Selected Ingredients", - "no-ingredients-selected": "No ingredients selected", - "missing": "Missing", - "no-recipes-found": "No recipes found", - "no-recipes-found-description": "Try adding more ingredients to your search or adjusting your filters", - "include-ingredients-on-hand": "Include Ingredients On Hand", - "include-tools-on-hand": "Include Tools On Hand", - "max-missing-ingredients": "Max Missing Ingredients", - "max-missing-tools": "Max Missing Tools", - "selected-tools": "Selected Tools", - "other-filters": "Other Filters", - "ready-to-make": "Ready to Make", - "almost-ready-to-make": "Almost Ready to Make" + "recipe-finder": "Reseptin etsijä", + "recipe-finder-description": "Etsi sopivia reseptejä saatavilla olevien ainesosien perusteella. Voit myös suodattaa tulokset saatavilla olevien ruoanvalmistusvälineiden perusteella, ja asettaa enimmäismäärän puuttuvia ainesosia tai välineitä.", + "selected-ingredients": "Valitut ainesosat", + "no-ingredients-selected": "Ei valittuja ainesosia", + "missing": "Puuttuu", + "no-recipes-found": "Reseptejä ei löytynyt", + "no-recipes-found-description": "Kokeile lisätä enemmän ainesosia hakuun tai säätää suodattimia", + "include-ingredients-on-hand": "Sisällytä saatavilla olevat ainesosat", + "include-tools-on-hand": "Sisällytä saatavilla olevat välineet", + "max-missing-ingredients": "Puuttuvien ainesten enimmäismäärä", + "max-missing-tools": "Puuttuvien välineiden enimmäismäärä", + "selected-tools": "Valitut välineet", + "other-filters": "Muut suodattimet", + "ready-to-make": "Valmis tekemään", + "almost-ready-to-make": "Melkein valmis tekemään" }, "search": { "advanced-search": "Tarkennettu haku", @@ -690,7 +690,7 @@ "or": "Tai", "has-any": "On Mikä Tahansa", "has-all": "On Kaikki", - "clear-selection": "Clear Selection", + "clear-selection": "Tyhjennä valinnat", "results": "Tulokset", "search": "Hae", "search-mealie": "Hae Mealiestä (paina /)", @@ -884,7 +884,7 @@ "are-you-sure-you-want-to-check-all-items": "Haluatko varmasti valita kaikki kohteet?", "are-you-sure-you-want-to-uncheck-all-items": "Haluatko varmasti poistaa kaikki valinnat?", "are-you-sure-you-want-to-delete-checked-items": "Haluatko varmasti poistaa kaikki valitut kohteet?", - "no-shopping-lists-found": "No Shopping Lists Found" + "no-shopping-lists-found": "Ostoslistoja ei löytynyt" }, "sidebar": { "all-recipes": "Reseptit", @@ -981,7 +981,7 @@ "register": "Rekisteröidy", "reset-password": "Palauta salasana", "sign-in": "Kirjaudu", - "total-mealplans": "Ateriasuunnitelmia", + "total-mealplans": "Ateriasuunnitelma Yhteensä", "total-users": "Käyttäjien määrä", "upload-photo": "Tuo kuva", "use-8-characters-or-more-for-your-password": "Salasanan pituuden on oltava vähintään kahdeksan merkkiä", @@ -1030,7 +1030,7 @@ "administrator": "Ylläpitäjä", "user-can-invite-other-to-group": "Käyttäjä voi kutsua muita ryhmään", "user-can-manage-group": "Käyttäjä voi hallita ryhmää", - "user-can-manage-household": "User can manage household", + "user-can-manage-household": "Käyttäjä voi hallita kotitaloutta", "user-can-organize-group-data": "Käyttäjä voi järjestellä ryhmän tietoja", "enable-advanced-features": "Salli edistyneemmät ominaisuudet", "it-looks-like-this-is-your-first-time-logging-in": "Tämä vaikuttaa olevan ensimmäinen kirjautumisesi.", @@ -1213,7 +1213,7 @@ "result": "Valittu teksti tulee näkymään aiemmin valitun kentän sisällä." }, "pan-and-zoom-mode": "Kääntö- ja zoomaustila", - "pan-and-zoom-desc": "Select pan and zoom by clicking the icon. This mode allows to zoom inside the image and move around to make using big images easier.", + "pan-and-zoom-desc": "Valitse panorointi ja zoomaus klikkaamalla kuvaketta. Tämä tila mahdollistaa zoomauksen kuvan sisällä ja liikkumisen niin, että isojen kuvien käyttö on helpompaa.", "split-text-mode": "Jaa tekstitila", "split-modes": { "line-mode": "Rivitila (oletus)", @@ -1232,37 +1232,37 @@ "summary-title": "Yhteenveto", "button-label-get-summary": "Hae Yhteenveto", "button-label-open-details": "Tiedot", - "info-description-data-dir-size": "Datahakemiston Koko", + "info-description-data-dir-size": "Datahakemiston koko", "info-description-log-file-size": "Lokitiedoston Koko", - "info-description-cleanable-directories": "Siivottavat Hakemistot", - "info-description-cleanable-images": "Siivottavat Kuvat", + "info-description-cleanable-directories": "Siivottavat hakemistot", + "info-description-cleanable-images": "Siivottavat kuvat", "storage": { - "title-temporary-directory": "Väliaikainen Hakemisto (.temp)", + "title-temporary-directory": "Väliaikainen hakemisto (.temp)", "title-backups-directory": "Varmuuskopiointihakemisto (varmuuskopiot)", - "title-groups-directory": "Ryhmien Hakemisto (ryhmät)", + "title-groups-directory": "Ryhmien hakemisto (ryhmät)", "title-recipes-directory": "Reseptihakemisto (reseptit)", "title-user-directory": "Käyttäjähakemisto (käyttäjä)" }, "action-delete-log-files-name": "Poista Lokitiedostot", "action-delete-log-files-description": "Poistaa kaikki lokitiedostot", - "action-clean-directories-name": "Puhdista Hakemistot", + "action-clean-directories-name": "Puhdista hakemistot", "action-clean-directories-description": "Poistaa kaikki reseptikansiot, jotka eivät ole kelvollisia UUID-koodeja", "action-clean-temporary-files-name": "Poista väliaikaiset tiedostot", "action-clean-temporary-files-description": "Poistaa kaikki tiedostot ja kansiot .temp kansiosta", - "action-clean-images-name": "Puhdista Kuvat", + "action-clean-images-name": "Puhdista kuvat", "action-clean-images-description": "Poistaa kaikki kuvat, jotka eivät pääty .webp", - "actions-description": "Maintenance actions are {destructive_in_bold} and should be used with caution. Performing any of these actions is {irreversible_in_bold}.", - "actions-description-destructive": "lopullinen", - "actions-description-irreversible": "peruuttamaton", + "actions-description": "Huoltotoimenpiteet ovat {destructive_in_bold} ja niitä tulisi käyttää varoen. Kaikkien näiden toimenpiteiden suorittaminen on {irreversible_in_bold}.", + "actions-description-destructive": "tuhoisia", + "actions-description-irreversible": "peruuttamatonta", "logs-action-refresh": "Päivitä lokit", "logs-page-title": "Mealie- Lokit", - "logs-tail-lines-label": "Tail Lines" + "logs-tail-lines-label": "Loppurivit" }, "mainentance": { "actions-title": "Toiminnot" }, "ingredients-natural-language-processor": "Ingredients Natural Language Processor", - "ingredients-natural-language-processor-explanation": "Mealie uses Conditional Random Fields (CRFs) for parsing and processing ingredients. The model used for ingredients is based off a data set of over 100,000 ingredients from a dataset compiled by the New York Times. Note that as the model is trained in English only, you may have varied results when using the model in other languages. This page is a playground for testing the model.", + "ingredients-natural-language-processor-explanation": "Mealie käyttää Conditional Random Fields (CRF) ainesosien jäsentämiseen ja prosessointiin. Ainesosien osalta käytetty malli perustuu yli 100000 ainesosan aineistoon New York Timesin kokoamasta aineistosta. Huomaa, että koska malli on koulutettu vain englanniksi, mallilla voi olla vaihtelevia tuloksia, kun käytät mallia muilla kielillä. Tämä sivu on mallin testaamiseen tarkoitettu leikkipaikka.", "ingredients-natural-language-processor-explanation-2": "Se ei ole täydellinen, mutta se tuottaa hyviä tuloksia yleensä ja on hyvä lähtökohta manuaalisesti jäsentää ainesosia yksittäisiin kenttiin. Vaihtoehtoisesti voit myös käyttää Brute-prosessori, joka käyttää kuvion täsmäystekniikkaa tunnistamaan ainesosia.", "nlp": "NLP", "brute": "Brute", @@ -1279,24 +1279,24 @@ "setup": { "first-time-setup": "Ensiasetukset", "welcome-to-mealie-get-started": "Tervetuloa Mealieen! Aloitetaan", - "already-set-up-bring-to-homepage": "I'm already set up, just bring me to the homepage", - "common-settings-for-new-sites": "Here are some common settings for new sites", - "setup-complete": "Setup Complete!", + "already-set-up-bring-to-homepage": "Olen jo valmis, vie minut kotisivulle", + "common-settings-for-new-sites": "Tässä muutamia yleisiä asetuksia uusille sivustoille", + "setup-complete": "Asennus valmis.", "here-are-a-few-things-to-help-you-get-started": "Näillä muutamilla asioilla pääset alkuun", "restore-from-v1-backup": "Onko sinulla varmuuskopio aiemmasta Mealie v1 -instanssista? Palauta se tästä.", "manage-profile-or-get-invite-link": "Hallitse profiiliasi tai hanki kutsulinkki muille." }, - "debug-openai-services": "Debug OpenAI Services", - "debug-openai-services-description": "Use this page to debug OpenAI services. You can test your OpenAI connection and see the results here. If you have image services enabled, you can also provide an image.", - "run-test": "Run Test", - "test-results": "Test Results", - "group-delete-note": "Groups with users or households cannot be deleted", - "household-delete-note": "Households with users cannot be deleted" + "debug-openai-services": "Debuggaa OpenAI-palveluita", + "debug-openai-services-description": "Käytä tätä sivua OpenAI-palveluiden debuggaamiseen. Voit testata OpenAI-yhteytesi ja nähdä tulokset täällä. Jos kuvapalvelut ovat käytössä, voit myös antaa kuvan.", + "run-test": "Suorita testi", + "test-results": "Testitulokset", + "group-delete-note": "Ryhmiä, joilla on käyttäjiä tai kotitalouksia, ei voi poistaa", + "household-delete-note": "Kotitalouksia, joissa on käyttäjiä, ei voi poistaa" }, "profile": { "welcome-user": "👋 Tervetuloa, {0}!", "description": "Hallitse profiiliasi, reseptejäsi ja ryhmäasetuksiasi.", - "invite-link": "Invite Link", + "invite-link": "", "get-invite-link": "Hanki Kutsulinkki", "get-public-link": "Julkinen linkki", "account-summary": "Tilin Yhteenveto", @@ -1345,9 +1345,9 @@ }, "cookbook": { "cookbooks": "Keittokirjat", - "description": "Cookbooks are another way to organize recipes by creating cross sections of recipes, organizers, and other filters. Creating a cookbook will add an entry to the side-bar and all the recipes with the filters chosen will be displayed in the cookbook.", - "hide-cookbooks-from-other-households": "Hide Cookbooks from Other Households", - "hide-cookbooks-from-other-households-description": "When enabled, only cookbooks from your household will appear on the sidebar", + "description": "Keittokirjat ovat toinen tapa järjestää reseptejä luomalla poikkileikkauksia resepteistä, järjestäjistä, sekä muista suodattimista. Keittokirjan luominen lisää merkinnän sivupalkkiin, ja kaikki reseptit näkyvät keittokirjassa valittujen suodatinten mukaisesti.", + "hide-cookbooks-from-other-households": "Piilota keittokirjat muista kotitalouksista", + "hide-cookbooks-from-other-households-description": "Kun käytössä, sivupalkissa näkyy vain oman kotitaloutesi keittokirjoja", "public-cookbook": "Julkinen Keittokirja", "public-cookbook-description": "Julkisia keittokirjoja voidaan jakaa ei-Mealien käyttäjille, ja ne näkyvät ryhmäsi sivulla.", "filter-options": "Suodatuksen asetukset", @@ -1363,25 +1363,25 @@ }, "query-filter": { "logical-operators": { - "and": "AND", - "or": "OR" + "and": "JA", + "or": "TAI" }, "relational-operators": { - "equals": "equals", - "does-not-equal": "does not equal", - "is-greater-than": "is greater than", - "is-greater-than-or-equal-to": "is greater than or equal to", - "is-less-than": "is less than", - "is-less-than-or-equal-to": "is less than or equal to" + "equals": "on yhtä kuin", + "does-not-equal": "ei ole yhtä kuin", + "is-greater-than": "on suurempi kuin", + "is-greater-than-or-equal-to": "on suurempi tai yhtäsuuri kuin", + "is-less-than": "on vähemmän kuin", + "is-less-than-or-equal-to": "on vähemmän tai yhtäsuuri kuin" }, "relational-keywords": { - "is": "is", - "is-not": "is not", - "is-one-of": "is one of", - "is-not-one-of": "is not one of", - "contains-all-of": "contains all of", - "is-like": "is like", - "is-not-like": "is not like" + "is": "on", + "is-not": "ei ole", + "is-one-of": "on yksi näistä", + "is-not-one-of": "ei ole yksi näistä", + "contains-all-of": "sisältää kaikki nämä", + "is-like": "on kuin", + "is-not-like": "ei ole kuin" } } } diff --git a/frontend/lang/messages/it-IT.json b/frontend/lang/messages/it-IT.json index 87ebe9907..e8699f68a 100644 --- a/frontend/lang/messages/it-IT.json +++ b/frontend/lang/messages/it-IT.json @@ -517,7 +517,7 @@ "saturated-fat-content": "Grassi saturi", "save-recipe-before-use": "Salva la ricetta prima dell'uso", "section-title": "Titolo Sezione", - "servings": "Portate", + "servings": "Porzioni", "serves-amount": "Porzioni {amount}", "share-recipe-message": "Volevo condividere la mia {0} ricetta con te.", "show-nutrition-values": "Mostra Valori Nutrizionali", @@ -546,9 +546,9 @@ "failed-to-add-recipes-to-list": "Impossibile aggiungere la ricetta alla lista", "failed-to-add-recipe-to-mealplan": "Impossibile aggiungere la ricetta al piano alimentare", "failed-to-add-to-list": "Errore durante l'aggiunta alla lista", - "yield": "Porzioni", - "yields-amount-with-text": "Rendimenti {amount} {text}", - "yield-text": "Testo di rendimento", + "yield": "Quantità prodotta", + "yields-amount-with-text": "Quantità prodotta: {amount} {text}", + "yield-text": "Unità della quantità prodotta", "quantity": "Quantità", "choose-unit": "Scegli Unità", "press-enter-to-create": "Premi invio per creare", diff --git a/frontend/lang/messages/lt-LT.json b/frontend/lang/messages/lt-LT.json index 609b3c903..660263e29 100644 --- a/frontend/lang/messages/lt-LT.json +++ b/frontend/lang/messages/lt-LT.json @@ -121,7 +121,7 @@ "loading": "Kraunasi", "loading-events": "Užkrovimo įvykiai", "loading-recipe": "Receptai kraunasi...", - "loading-ocr-data": "Loading OCR data...", + "loading-ocr-data": "Įkeliami OCR duomenys...", "loading-recipes": "Receptai kraunasi", "message": "Pranešimas", "monday": "Pirmadienis", @@ -210,14 +210,14 @@ "upload-file": "Įkelti failą", "created-on-date": "Sukurta: {0}", "unsaved-changes": "You have unsaved changes. Do you want to save before leaving? Okay to save, Cancel to discard changes.", - "clipboard-copy-failure": "Failed to copy to the clipboard.", + "clipboard-copy-failure": "Nepavyko nukopijuoti į iškarpinę.", "confirm-delete-generic-items": "Are you sure you want to delete the following items?", "organizers": "Organizers", "caution": "Caution", - "show-advanced": "Show Advanced", - "add-field": "Add Field", - "date-created": "Date Created", - "date-updated": "Date Updated" + "show-advanced": "Rodyti plačiau", + "add-field": "Pridėti lauką", + "date-created": "Sukūrimo data", + "date-updated": "Atnaujinimo data" }, "group": { "are-you-sure-you-want-to-delete-the-group": "Ar tikrai norite ištrinti {groupName}?", @@ -322,7 +322,7 @@ "mealplan-update-failed": "Mitybos plano atnaujinti nepavyko", "mealplan-updated": "Mitybos planas atnaujintas", "mealplan-households-description": "If no household is selected, recipes can be added from any household", - "any-category": "Any Category", + "any-category": "Bet kuri kategorija", "any-tag": "Any Tag", "any-household": "Any Household", "no-meal-plan-defined-yet": "Nėra nustatytų mitybos planų", diff --git a/frontend/lang/messages/ru-RU.json b/frontend/lang/messages/ru-RU.json index c956176fa..54bffd8b6 100644 --- a/frontend/lang/messages/ru-RU.json +++ b/frontend/lang/messages/ru-RU.json @@ -601,7 +601,7 @@ "create-recipe-from-an-image-description": "Create a recipe by uploading an image of it. Mealie will attempt to extract the text from the image using AI and create a recipe from it.", "crop-and-rotate-the-image": "Crop and rotate the image so that only the text is visible, and it's in the correct orientation.", "create-from-image": "Create from Image", - "should-translate-description": "Translate the recipe into my language", + "should-translate-description": "Перевести рецепт на мой язык", "please-wait-image-procesing": "Подождите, идет обработка изображения.", "bulk-url-import": "Массовый импорт по URL", "debug-scraper": "Отладка сканирования", @@ -611,16 +611,16 @@ "scrape-recipe-description": "Отсканировать рецепт по ссылке. Предоставьте ссылку на страницу, которую вы хотите отсканировать, и Mealie попытается вырезать рецепт с этого сайта и добавить его в свою коллекцию.", "scrape-recipe-have-a-lot-of-recipes": "Хотите отсканировать несколько рецептов за раз?", "scrape-recipe-suggest-bulk-importer": "Воспользуйтесь массовым импортом", - "scrape-recipe-have-raw-html-or-json-data": "Have raw HTML or JSON data?", + "scrape-recipe-have-raw-html-or-json-data": "У Вас есть данные HTML или JSON?", "scrape-recipe-you-can-import-from-raw-data-directly": "You can import from raw data directly", "import-original-keywords-as-tags": "Импортировать исходные ключевые слова как теги", "stay-in-edit-mode": "Остаться в режиме редактирования", "import-from-zip": "Импорт из архива", "import-from-zip-description": "Импорт одного рецепта, который был экспортирован из другого экземпляра Mealie.", - "import-from-html-or-json": "Import from HTML or JSON", + "import-from-html-or-json": "Импортировать из HTML или JSON", "import-from-html-or-json-description": "Import a single recipe from raw HTML or JSON. This is useful if you have a recipe from a site that Mealie can't scrape normally, or from some other external source.", "json-import-format-description-colon": "To import via JSON, it must be in valid format:", - "json-editor": "JSON Editor", + "json-editor": "Редактор JSON", "zip-files-must-have-been-exported-from-mealie": ".zip файлы должны быть экспортированы из Mealie", "create-a-recipe-by-uploading-a-scan": "Создайте рецепт, загрузив скан.", "upload-a-png-image-from-a-recipe-book": "Загрузить png изображение из книги рецептов", @@ -661,16 +661,16 @@ "missing-food": "Create missing food: {food}", "no-food": "Нет еды" }, - "reset-servings-count": "Reset Servings Count", - "not-linked-ingredients": "Additional Ingredients" + "reset-servings-count": "Сбросить количество порций", + "not-linked-ingredients": "Дополнительные ингредиенты" }, "recipe-finder": { - "recipe-finder": "Recipe Finder", + "recipe-finder": "Поиск рецептов", "recipe-finder-description": "Search for recipes based on ingredients you have on hand. You can also filter by tools you have available, and set a maximum number of missing ingredients or tools.", - "selected-ingredients": "Selected Ingredients", + "selected-ingredients": "Выбранные ингредиенты", "no-ingredients-selected": "No ingredients selected", "missing": "Missing", - "no-recipes-found": "No recipes found", + "no-recipes-found": "Рецепты не найдены", "no-recipes-found-description": "Try adding more ingredients to your search or adjusting your filters", "include-ingredients-on-hand": "Include Ingredients On Hand", "include-tools-on-hand": "Include Tools On Hand", @@ -881,10 +881,10 @@ "completed-on": "Выполнено в {date}", "you-are-offline": "Вы не в сети", "you-are-offline-description": "Not all features are available while offline. You can still add, modify, and remove items, but you will not be able to sync your changes to the server until you are back online.", - "are-you-sure-you-want-to-check-all-items": "Are you sure you want to check all items?", + "are-you-sure-you-want-to-check-all-items": "Вы уверены, что хотите выбрать все элементы?", "are-you-sure-you-want-to-uncheck-all-items": "Are you sure you want to uncheck all items?", "are-you-sure-you-want-to-delete-checked-items": "Are you sure you want to delete all checked items?", - "no-shopping-lists-found": "No Shopping Lists Found" + "no-shopping-lists-found": "Списки покупок не найдены" }, "sidebar": { "all-recipes": "Все рецепты", @@ -1286,17 +1286,17 @@ "restore-from-v1-backup": "Have a backup from a previous instance of Mealie v1? You can restore it here.", "manage-profile-or-get-invite-link": "Manage your own profile, or grab an invite link to share with others." }, - "debug-openai-services": "Debug OpenAI Services", + "debug-openai-services": "Отладка OpenAI сервисов", "debug-openai-services-description": "Use this page to debug OpenAI services. You can test your OpenAI connection and see the results here. If you have image services enabled, you can also provide an image.", - "run-test": "Run Test", - "test-results": "Test Results", + "run-test": "Запустить тест", + "test-results": "Результаты тестов", "group-delete-note": "Groups with users or households cannot be deleted", "household-delete-note": "Households with users cannot be deleted" }, "profile": { "welcome-user": "👋 Добро пожаловать, {0}!", "description": "Управление настройками профиля, рецептов и группы.", - "invite-link": "Invite Link", + "invite-link": "Ссылка-приглашение", "get-invite-link": "Получить ссылку для приглашения", "get-public-link": "Получить публичную ссылку", "account-summary": "Cведения об учетной записи", diff --git a/frontend/lib/api/types/user.ts b/frontend/lib/api/types/user.ts index 855f64e7b..a29586b3a 100644 --- a/frontend/lib/api/types/user.ts +++ b/frontend/lib/api/types/user.ts @@ -93,6 +93,12 @@ export interface GroupSummary { slug: string; preferences?: ReadGroupPreferences | null; } +export interface LongLiveTokenCreateResponse { + name: string; + id: number; + createdAt?: string | null; + token: string; +} export interface LongLiveTokenIn { name: string; integrationId?: string; @@ -130,7 +136,6 @@ export interface PrivateUser { lockedAt?: string | null; } export interface LongLiveTokenOut { - token: string; name: string; id: number; createdAt?: string | null; diff --git a/frontend/lib/api/user/recipes/recipe.ts b/frontend/lib/api/user/recipes/recipe.ts index bfc930167..b022efaac 100644 --- a/frontend/lib/api/user/recipes/recipe.ts +++ b/frontend/lib/api/user/recipes/recipe.ts @@ -84,6 +84,7 @@ export type RecipeSearchQuery = { page?: number; perPage?: number; orderBy?: string; + orderByNullPosition?: "first" | "last"; _searchSeed?: string; }; diff --git a/mealie/lang/messages/fi-FI.json b/mealie/lang/messages/fi-FI.json index 2629786a5..786bf0412 100644 --- a/mealie/lang/messages/fi-FI.json +++ b/mealie/lang/messages/fi-FI.json @@ -4,18 +4,18 @@ }, "recipe": { "unique-name-error": "Reseptien nimien täytyy olla yksilöllisiä", - "recipe-created": "Recipe Created", + "recipe-created": "Resepti luotu", "recipe-defaults": { - "ingredient-note": "1 kuppi jauhoja", - "step-text": "Recipe steps as well as other fields in the recipe page support markdown syntax.\n\n**Add a link**\n\n[My Link](https://demo.mealie.io)\n" + "ingredient-note": "1 kupillinen jauhoja", + "step-text": "Reseptin vaiheet sekä muut kentät reseptisivulla tukevat markdown-syntaksia.\n\n**Lisää linkki**\n\n[Oma linkki](https://demo.mealie.io)\n" }, "servings-text": { - "makes": "Makes", - "serves": "Serves", - "serving": "Serving", - "servings": "Servings", - "yield": "Yield", - "yields": "Yields" + "makes": "Tekee", + "serves": "Annoksia", + "serving": "Annos", + "servings": "Annosta", + "yield": "Tuotto", + "yields": "Tuottaa" } }, "mealplan": { @@ -25,7 +25,7 @@ "user-updated": "Käyttäjä päivitetty", "password-updated": "Salasana päivitetty", "invalid-current-password": "Nykyinen salasana ei kelpaa", - "ldap-update-password-unavailable": "Salasanaa ei voitu päivittää. Käyttäjä hallinnoi LDAP:ia." + "ldap-update-password-unavailable": "Salasanaa ei voitu päivittää, sillä käyttäjä on LDAP-hakemiston alainen" }, "group": { "report-deleted": "Raportti poistettu." @@ -56,25 +56,25 @@ }, "emails": { "password": { - "subject": "Mealie Forgot Password", - "header_text": "Forgot Password", - "message_top": "You have requested to reset your password.", - "message_bottom": "Please click the button above to reset your password.", - "button_text": "Reset Password" + "subject": "Mealie Unohtunut salasana", + "header_text": "Unohdin salasanan", + "message_top": "Olet pyytänyt salasanasi nollausta.", + "message_bottom": "Klikkaa yllä olevaa painiketta nollataksesi salasanasi.", + "button_text": "Nollaa salasana" }, "invitation": { - "subject": "Invitation to join Mealie", - "header_text": "You're Invited!", - "message_top": "You have been invited to join Mealie.", - "message_bottom": "Please click the button above to accept the invitation.", - "button_text": "Accept Invitation" + "subject": "Kutsu liittyä Mealieen", + "header_text": "Sinut on kutsuttu.", + "message_top": "Sinut on kutsuttu liittymään Mealieen.", + "message_bottom": "Ole hyvä ja klikkaa yllä olevaa painiketta hyväksyäksesi kutsun.", + "button_text": "Hyväksy kutsu" }, "test": { - "subject": "Mealie Test Email", - "header_text": "Test Email", - "message_top": "This is a test email.", - "message_bottom": "Please click the button above to test the email.", - "button_text": "Open Mealie" + "subject": "Mealie Testiviesti", + "header_text": "Testiviesti", + "message_top": "Tämä on testiviesti.", + "message_bottom": "Ole hyvä ja klikkaa yllä olevaa painiketta testataksesi sähköpostia.", + "button_text": "Avaa Mealie" } } } diff --git a/mealie/lang/messages/fr-BE.json b/mealie/lang/messages/fr-BE.json index b366817c9..636aa96bd 100644 --- a/mealie/lang/messages/fr-BE.json +++ b/mealie/lang/messages/fr-BE.json @@ -4,18 +4,18 @@ }, "recipe": { "unique-name-error": "Les noms de recette doivent être uniques", - "recipe-created": "Recipe Created", + "recipe-created": "Recette créée", "recipe-defaults": { "ingredient-note": "100 g de farine", "step-text": "Les étapes de la recette ainsi que les autres champs de la page de recette supportent la syntaxe markdown.\n\n**Ajouter un lien**\n\n[Mon lien](https://demo.mealie.io)\n" }, "servings-text": { - "makes": "Makes", - "serves": "Serves", - "serving": "Serving", - "servings": "Servings", - "yield": "Yield", - "yields": "Yields" + "makes": "Fait", + "serves": "Pour", + "serving": "Portion", + "servings": "Portions", + "yield": "Quantité", + "yields": "Produit" } }, "mealplan": { diff --git a/mealie/lang/messages/fr-CA.json b/mealie/lang/messages/fr-CA.json index aab002be4..7ea38bd2e 100644 --- a/mealie/lang/messages/fr-CA.json +++ b/mealie/lang/messages/fr-CA.json @@ -4,18 +4,18 @@ }, "recipe": { "unique-name-error": "Les noms de recette doivent être uniques", - "recipe-created": "Recipe Created", + "recipe-created": "Recette créée", "recipe-defaults": { "ingredient-note": "1 tasse de Farine", "step-text": "Les étapes de la recette ainsi que les autres champs de la page de recette supportent la syntaxe markdown.\n\n**Ajouter un lien**\n\n[Mon lien](https://demo.mealie.io)\n" }, "servings-text": { - "makes": "Makes", - "serves": "Serves", - "serving": "Serving", - "servings": "Servings", - "yield": "Yield", - "yields": "Yields" + "makes": "Fait", + "serves": "Pour", + "serving": "Portion", + "servings": "Portions", + "yield": "Quantité", + "yields": "Produit" } }, "mealplan": { diff --git a/mealie/lang/messages/lt-LT.json b/mealie/lang/messages/lt-LT.json index d137056bc..26293b918 100644 --- a/mealie/lang/messages/lt-LT.json +++ b/mealie/lang/messages/lt-LT.json @@ -4,7 +4,7 @@ }, "recipe": { "unique-name-error": "Receptų pavadinimai turi būti unikalūs", - "recipe-created": "Recipe Created", + "recipe-created": "Receptas sukurtas", "recipe-defaults": { "ingredient-note": "1 Cup Flour", "step-text": "Recipe steps as well as other fields in the recipe page support markdown syntax.\n\n**Add a link**\n\n[My Link](https://demo.mealie.io)\n" @@ -13,7 +13,7 @@ "makes": "Makes", "serves": "Serves", "serving": "Serving", - "servings": "Servings", + "servings": "Porcijos", "yield": "Yield", "yields": "Yields" } @@ -46,13 +46,13 @@ "generic-deleted": "{name} ištrintas" }, "datetime": { - "year": "year|years", - "day": "day|days", - "hour": "hour|hours", - "minute": "minute|minutes", - "second": "second|seconds", - "millisecond": "millisecond|milliseconds", - "microsecond": "microsecond|microseconds" + "year": "metai|metai", + "day": "diena|dienos", + "hour": "valanda|valandos", + "minute": "minutė|minutės", + "second": "sekundė|sekundės", + "millisecond": "milisekundė|milisekundės", + "microsecond": "mikrosekundė|mikrosekundės" }, "emails": { "password": { @@ -67,12 +67,12 @@ "header_text": "You're Invited!", "message_top": "You have been invited to join Mealie.", "message_bottom": "Please click the button above to accept the invitation.", - "button_text": "Accept Invitation" + "button_text": "Priimti pakvietimą" }, "test": { "subject": "Mealie Test Email", "header_text": "Test Email", - "message_top": "This is a test email.", + "message_top": "Tai bandomasis el. laiškas.", "message_bottom": "Please click the button above to test the email.", "button_text": "Open Mealie" } diff --git a/mealie/lang/messages/ru-RU.json b/mealie/lang/messages/ru-RU.json index 540a829d5..0dd6dd34a 100644 --- a/mealie/lang/messages/ru-RU.json +++ b/mealie/lang/messages/ru-RU.json @@ -4,7 +4,7 @@ }, "recipe": { "unique-name-error": "Название рецепта должно быть уникальным", - "recipe-created": "Recipe Created", + "recipe-created": "Рецепт создан", "recipe-defaults": { "ingredient-note": "1 Чашка муки", "step-text": "Шаги рецепта, как и другие поля на странице рецепта, поддерживают синтаксис Markdown.\n\n**Добавить ссылку**\n\n[Моя Ссылка](https://demo.mealie.io)\n" @@ -12,8 +12,8 @@ "servings-text": { "makes": "Makes", "serves": "Serves", - "serving": "Serving", - "servings": "Servings", + "serving": "Порция", + "servings": "Порции", "yield": "Yield", "yields": "Yields" } diff --git a/mealie/repos/seed/resources/foods/locales/el-GR.json b/mealie/repos/seed/resources/foods/locales/el-GR.json index 2a511a642..30012e071 100644 --- a/mealie/repos/seed/resources/foods/locales/el-GR.json +++ b/mealie/repos/seed/resources/foods/locales/el-GR.json @@ -337,7 +337,7 @@ }, "jackfruit": { "name": "τζάκφρουτ", - "plural_name": "jackfruits" + "plural_name": "τζάκφρουτ" }, "jaggery": { "name": "ζάχαρη jaggery" @@ -364,7 +364,7 @@ "name": "κούμαρα" }, "leavening-agents": { - "name": "leavening agents" + "name": "διογκωτικά" }, "leek": { "name": "πράσο", diff --git a/mealie/repos/seed/resources/foods/locales/fi-FI.json b/mealie/repos/seed/resources/foods/locales/fi-FI.json index 38a5cdbad..efb15cbdc 100644 --- a/mealie/repos/seed/resources/foods/locales/fi-FI.json +++ b/mealie/repos/seed/resources/foods/locales/fi-FI.json @@ -3,73 +3,73 @@ "name": "koristekurpitsa" }, "alfalfa-sprouts": { - "name": "alfalfaidut" + "name": "alfalfaituja" }, "anchovies": { - "name": "anjovikset" + "name": "anjoviksia" }, "apples": { "name": "omenat", - "plural_name": "apples" + "plural_name": "omenaa" }, "artichoke": { - "name": "artisokka" + "name": "artisokkaa" }, "arugula": { "name": "rukola" }, "asparagus": { - "name": "parsa" + "name": "parsaa" }, "avocado": { "name": "avokado", - "plural_name": "avocado" + "plural_name": "avokadoa" }, "bacon": { - "name": "pekoni" + "name": "pekonia" }, "baking-powder": { - "name": "leivinjauhe" + "name": "leivinjauhetta" }, "baking-soda": { - "name": "ruokasooda" + "name": "ruokasoodaa" }, "baking-sugar": { - "name": "leivontasokeri" + "name": "leivontasokeria" }, "bar-sugar": { "name": "sirosokeri" }, "basil": { - "name": "basilika" + "name": "basilikaa" }, "beans": { "name": "pavut" }, "bell-peppers": { "name": "paprika", - "plural_name": "bell peppers" + "plural_name": "paprikaa" }, "blackberries": { - "name": "karhunvatukat" + "name": "karhunvatukoita" }, "bok-choy": { - "name": "paksoi" + "name": "paksoita" }, "brassicas": { "name": "kaalit" }, "bread": { - "name": "leipä" + "name": "leipää" }, "breadfruit": { - "name": "leipäpuun hedelmä" + "name": "leipäpuun hedelmää" }, "broccoflower": { "name": "parsakukkakaali" }, "broccoli": { - "name": "parsakaali" + "name": "parsakaalia" }, "broccoli-rabe": { "name": "varsiparsakaali" @@ -78,7 +78,7 @@ "name": "broccolini" }, "brown-sugar": { - "name": "fariinisokeri" + "name": "fariinisokeria" }, "brussels-sprouts": { "name": "ruusukaalit" @@ -94,7 +94,7 @@ }, "cabbage": { "name": "kaali", - "plural_name": "cabbages" + "plural_name": "kaalia" }, "cactus-edible": { "name": "kaktus, syötävä" @@ -116,7 +116,7 @@ }, "carrot": { "name": "porkkana", - "plural_name": "carrots" + "plural_name": "porkkanaa" }, "caster-sugar": { "name": "castersokeri" @@ -129,7 +129,7 @@ }, "cauliflower": { "name": "kukkakaali", - "plural_name": "cauliflowers" + "plural_name": "kukkakaalia" }, "cayenne-pepper": { "name": "cayenne-pippuri" @@ -154,7 +154,7 @@ }, "chilli-peppers": { "name": "chilipaprikat", - "plural_name": "chilli peppers" + "plural_name": "chilipippuria" }, "chinese-leaves": { "name": "kiinankaali" @@ -176,7 +176,7 @@ }, "coconut": { "name": "kookospähkinä", - "plural_name": "coconuts" + "plural_name": "kookospähkinää" }, "coconut-milk": { "name": "kookosmaito" @@ -198,7 +198,7 @@ }, "corn": { "name": "maissi", - "plural_name": "corns" + "plural_name": "maissia" }, "corn-syrup": { "name": "maissisiirappi" @@ -214,7 +214,7 @@ }, "cucumber": { "name": "kurkku", - "plural_name": "cucumbers" + "plural_name": "kurkkua" }, "cumin": { "name": "kumina" @@ -240,15 +240,15 @@ }, "eggplant": { "name": "munakoiso", - "plural_name": "eggplants" + "plural_name": "munakoisoa" }, "eggs": { "name": "munat", - "plural_name": "eggs" + "plural_name": "kananmunaa" }, "endive": { "name": "endiivit", - "plural_name": "endives" + "plural_name": "endiiviä" }, "fats": { "name": "rasvat" @@ -292,7 +292,7 @@ }, "garlic": { "name": "valkosipuli", - "plural_name": "garlics" + "plural_name": "valkosipuleja" }, "gem-squash": { "name": "kurpitsa" @@ -317,7 +317,7 @@ }, "green-onion": { "name": "vihreä sipuli", - "plural_name": "green onions" + "plural_name": "vihreää sipulia" }, "heart-of-palm": { "name": "palmun sydän", @@ -337,7 +337,7 @@ }, "jackfruit": { "name": "jakkihedelmä", - "plural_name": "jackfruits" + "plural_name": "jakkihedelmää" }, "jaggery": { "name": "raakasokeri" @@ -368,7 +368,7 @@ }, "leek": { "name": "purjo", - "plural_name": "leeks" + "plural_name": "purjoa" }, "legumes": { "name": "palkokasvit" @@ -384,7 +384,7 @@ }, "liver": { "name": "maksa", - "plural_name": "livers" + "plural_name": "maksaa" }, "maize": { "name": "maissi" @@ -403,7 +403,7 @@ }, "mushroom": { "name": "sieni", - "plural_name": "mushrooms" + "plural_name": "sientä" }, "mussels": { "name": "sinisimpukka" @@ -425,13 +425,13 @@ }, "octopuses": { "name": "mustekalat", - "plural_name": "octopuses" + "plural_name": "mustekalaa" }, "oils": { "name": "öljyt" }, "okra": { - "name": "okra" + "name": "okraa" }, "olive": { "name": "oliivi" @@ -450,10 +450,10 @@ }, "oranges": { "name": "appelsiinit", - "plural_name": "oranges" + "plural_name": "appelsiinia" }, "oregano": { - "name": "oregano" + "name": "oreganoa" }, "oysters": { "name": "osterit" @@ -462,40 +462,40 @@ "name": "panch puran" }, "paprika": { - "name": "paprika" + "name": "paprikajauhetta" }, "parsley": { "name": "persilja" }, "parsnip": { "name": "palsternakka", - "plural_name": "parsnips" + "plural_name": "palsternakkaa" }, "pear": { "name": "päärynä", - "plural_name": "pears" + "plural_name": "päärynää" }, "peas": { "name": "herneet" }, "pepper": { "name": "pippuri", - "plural_name": "peppers" + "plural_name": "pippuria" }, "pineapple": { "name": "ananas", - "plural_name": "pineapples" + "plural_name": "ananasta" }, "plantain": { "name": "keittobanaani", - "plural_name": "plantains" + "plural_name": "keittobanaania" }, "poppy-seeds": { "name": "unikonsiemenet" }, "potato": { "name": "peruna", - "plural_name": "potatoes" + "plural_name": "perunaa" }, "poultry": { "name": "siipikarja" @@ -505,14 +505,14 @@ }, "pumpkin": { "name": "kurpitsa", - "plural_name": "pumpkins" + "plural_name": "kurpitsaa" }, "pumpkin-seeds": { "name": "kurpitsansiemen" }, "radish": { "name": "retiisi", - "plural_name": "radishes" + "plural_name": "retiisiä" }, "raw-sugar": { "name": "raakasokeri" @@ -543,7 +543,7 @@ }, "scallion": { "name": "vihersipuli", - "plural_name": "scallions" + "plural_name": "kevätsipulia" }, "seafood": { "name": "merenelävät" @@ -556,7 +556,7 @@ }, "shallot": { "name": "salottisipuli", - "plural_name": "shallots" + "plural_name": "salottisipulia" }, "skate": { "name": "skate-kala" @@ -585,7 +585,7 @@ }, "spring-onion": { "name": "kevätsipuli", - "plural_name": "spring onions" + "plural_name": "kevätsipulia" }, "squash": { "name": "kurpitsa", @@ -602,7 +602,7 @@ }, "sunchoke": { "name": "maa-artisokka", - "plural_name": "sunchokes" + "plural_name": "maa-artisokkaa" }, "sunflower-seeds": { "name": "auringonkukansiemenet" @@ -612,35 +612,35 @@ }, "sweet-potato": { "name": "bataatti", - "plural_name": "sweet potatoes" + "plural_name": "bataattia" }, "sweetcorn": { "name": "maissi", - "plural_name": "sweetcorns" + "plural_name": "sokerimaissia" }, "sweeteners": { "name": "makeutusaineet" }, "tahini": { - "name": "tahini" + "name": "tahinia" }, "taro": { "name": "taaro", - "plural_name": "taroes" + "plural_name": "taaroa" }, "teff": { "name": "teff" }, "tomato": { "name": "tomaatti", - "plural_name": "tomatoes" + "plural_name": "tomaattia" }, "trout": { "name": "taimen" }, "tubers": { "name": "mukulat", - "plural_name": "tubers" + "plural_name": "mukulaa" }, "tuna": { "name": "tonnikala" @@ -650,7 +650,7 @@ }, "turnip": { "name": "nauris", - "plural_name": "turnips" + "plural_name": "naurista" }, "unrefined-sugar": { "name": "puhdistamaton sokeri" @@ -666,11 +666,11 @@ }, "watermelon": { "name": "vesimeloni", - "plural_name": "watermelons" + "plural_name": "vesimelonia" }, "white-mushroom": { "name": "herkkusieni", - "plural_name": "white mushrooms" + "plural_name": "herkkusientä" }, "white-sugar": { "name": "valkoinen sokeri" @@ -680,13 +680,13 @@ }, "yam": { "name": "hillo", - "plural_name": "yams" + "plural_name": "jamssia" }, "yeast": { "name": "hiiva" }, "zucchini": { "name": "kesäkurpitsa", - "plural_name": "zucchinis" + "plural_name": "kesäkurpitsaa" } } \ No newline at end of file diff --git a/mealie/repos/seed/resources/foods/locales/fr-CA.json b/mealie/repos/seed/resources/foods/locales/fr-CA.json index d455f64e8..2e2c85eff 100644 --- a/mealie/repos/seed/resources/foods/locales/fr-CA.json +++ b/mealie/repos/seed/resources/foods/locales/fr-CA.json @@ -54,7 +54,7 @@ "name": "mûres" }, "bok-choy": { - "name": "bok choy" + "name": "pakchoï" }, "brassicas": { "name": "crucifères" @@ -100,7 +100,7 @@ "name": "cactus, comestible" }, "calabrese": { - "name": "calabrese" + "name": "brocoli calabrese" }, "cane-sugar": { "name": "sucre de canne" diff --git a/mealie/repos/seed/resources/foods/locales/pl-PL.json b/mealie/repos/seed/resources/foods/locales/pl-PL.json index ef6946813..3dc5df473 100644 --- a/mealie/repos/seed/resources/foods/locales/pl-PL.json +++ b/mealie/repos/seed/resources/foods/locales/pl-PL.json @@ -221,7 +221,7 @@ }, "daikon": { "name": "rzodkiew japońska", - "plural_name": "daikons" + "plural_name": "rzodkwie japońskie" }, "dairy-products-and-dairy-substitutes": { "name": "przetwory i substytuty mleczne" @@ -321,7 +321,7 @@ }, "heart-of-palm": { "name": "serce palmy", - "plural_name": "heart of palms" + "plural_name": "serca palm" }, "hemp": { "name": "konopia" diff --git a/mealie/repos/seed/resources/foods/locales/ru-RU.json b/mealie/repos/seed/resources/foods/locales/ru-RU.json index 00285647f..a2fa9a207 100644 --- a/mealie/repos/seed/resources/foods/locales/ru-RU.json +++ b/mealie/repos/seed/resources/foods/locales/ru-RU.json @@ -261,7 +261,7 @@ }, "fiddlehead-fern": { "name": "побеги папоротника", - "plural_name": "fiddlehead ferns" + "plural_name": "побеги папоротника" }, "fish": { "name": "рыба" @@ -337,7 +337,7 @@ }, "jackfruit": { "name": "джекфрут", - "plural_name": "jackfruits" + "plural_name": "джекфрут" }, "jaggery": { "name": "джаггери" @@ -469,7 +469,7 @@ }, "parsnip": { "name": "пастернак", - "plural_name": "parsnips" + "plural_name": "пастернак" }, "pear": { "name": "груша", @@ -512,7 +512,7 @@ }, "radish": { "name": "редис", - "plural_name": "radishes" + "plural_name": "редис" }, "raw-sugar": { "name": "нерафинированный сахар" @@ -585,11 +585,11 @@ }, "spring-onion": { "name": "зелёный лук", - "plural_name": "spring onions" + "plural_name": "зелёный лук" }, "squash": { "name": "тыква", - "plural_name": "squashes" + "plural_name": "кабачки" }, "squash-family": { "name": "тыквы" @@ -640,7 +640,7 @@ }, "tubers": { "name": "клубни", - "plural_name": "tubers" + "plural_name": "клубни" }, "tuna": { "name": "тунец" @@ -650,7 +650,7 @@ }, "turnip": { "name": "репа", - "plural_name": "turnips" + "plural_name": "репа" }, "unrefined-sugar": { "name": "нерафинированный сахар" @@ -666,7 +666,7 @@ }, "watermelon": { "name": "арбуз", - "plural_name": "watermelons" + "plural_name": "арбузы" }, "white-mushroom": { "name": "белый гриб", @@ -687,6 +687,6 @@ }, "zucchini": { "name": "цуккини", - "plural_name": "zucchinis" + "plural_name": "цуккини" } } \ No newline at end of file diff --git a/mealie/repos/seed/resources/labels/locales/fi-FI.json b/mealie/repos/seed/resources/labels/locales/fi-FI.json index 0a5359827..2d8d2a140 100644 --- a/mealie/repos/seed/resources/labels/locales/fi-FI.json +++ b/mealie/repos/seed/resources/labels/locales/fi-FI.json @@ -1,9 +1,9 @@ [ { - "name": "Tuote" + "name": "HeVi" }, { - "name": "Vilja" + "name": "Viljat" }, { "name": "Hedelmät" @@ -21,16 +21,16 @@ "name": "Juomat" }, { - "name": "Paistetut" + "name": "Leivonnaiset" }, { - "name": "Tölkitetyt" + "name": "Säilykkeet" }, { - "name": "Mausteet" + "name": "Maustekastikkeet" }, { - "name": "Makeiset" + "name": "Konditoriatuotteet" }, { "name": "Maitotuotteet" @@ -39,16 +39,16 @@ "name": "Pakasteet" }, { - "name": "Terveelliset" + "name": "Terveysruoka" }, { - "name": "Kotitaloudet" + "name": "Kotitalous" }, { "name": "Lihatuotteet" }, { - "name": "Pienpurtavat" + "name": "Välipalat" }, { "name": "Mausteet" diff --git a/mealie/repos/seed/resources/units/locales/fi-FI.json b/mealie/repos/seed/resources/units/locales/fi-FI.json index 09dd2aca4..baf293b18 100644 --- a/mealie/repos/seed/resources/units/locales/fi-FI.json +++ b/mealie/repos/seed/resources/units/locales/fi-FI.json @@ -1,140 +1,140 @@ { "teaspoon": { - "name": "teelusikka", - "plural_name": "teaspoons", + "name": "teelusikallinen", + "plural_name": "teelusikallista", "description": "", "abbreviation": "tl" }, "tablespoon": { - "name": "ruokalusikka", - "plural_name": "tablespoons", + "name": "ruokalusikallinen", + "plural_name": "ruokalusikallista", "description": "", "abbreviation": "rkl" }, "cup": { - "name": "kuppi", - "plural_name": "cups", + "name": "kupillinen", + "plural_name": "kupillista", "description": "", - "abbreviation": "c" + "abbreviation": "k" }, "fluid-ounce": { "name": "nesteunssi", - "plural_name": "fluid ounces", + "plural_name": "nesteunssia", "description": "", "abbreviation": "fl oz" }, "pint": { - "name": "tuoppi", - "plural_name": "pints", + "name": "pintti", + "plural_name": "pinttiä", "description": "", "abbreviation": "pt" }, "quart": { - "name": "kvartti", - "plural_name": "quarts", + "name": "vartti", + "plural_name": "varttia", "description": "", "abbreviation": "qt" }, "gallon": { "name": "gallona", - "plural_name": "gallons", + "plural_name": "gallonaa", "description": "", "abbreviation": "gal" }, "milliliter": { "name": "millilitra", - "plural_name": "milliliters", + "plural_name": "millilitraa", "description": "", "abbreviation": "ml" }, "liter": { "name": "litra", - "plural_name": "liters", + "plural_name": "litraa", "description": "", "abbreviation": "l" }, "pound": { "name": "pauna", - "plural_name": "pounds", + "plural_name": "paunaa", "description": "", "abbreviation": "lb", "plural_abbreviation": "lbs" }, "ounce": { "name": "unssi", - "plural_name": "ounces", + "plural_name": "unssia", "description": "", "abbreviation": "oz" }, "gram": { "name": "gramma", - "plural_name": "grams", + "plural_name": "grammaa", "description": "", "abbreviation": "g" }, "kilogram": { "name": "kilogramma", - "plural_name": "kilograms", + "plural_name": "kilogrammaa", "description": "", "abbreviation": "kg" }, "milligram": { "name": "milligramma", - "plural_name": "milligrams", + "plural_name": "milligrammaa", "description": "", "abbreviation": "mg" }, "splash": { "name": "tilkka", - "plural_name": "splashes", + "plural_name": "tilkkaa", "description": "", "abbreviation": "" }, "dash": { "name": "ripaus", - "plural_name": "dashes", + "plural_name": "ripausta", "description": "", "abbreviation": "" }, "serving": { "name": "annos", - "plural_name": "servings", + "plural_name": "annosta", "description": "", "abbreviation": "" }, "head": { "name": "pää", - "plural_name": "heads", + "plural_name": "päätä", "description": "", "abbreviation": "" }, "clove": { "name": "kynsi", - "plural_name": "cloves", + "plural_name": "kynttä", "description": "", "abbreviation": "" }, "can": { - "name": "tölkki", - "plural_name": "cans", + "name": "tölkillinen", + "plural_name": "tölkillistä", "description": "", "abbreviation": "" }, "bunch": { - "name": "bunch", - "plural_name": "bunches", + "name": "nippu", + "plural_name": "nippua", "description": "", "abbreviation": "" }, "pack": { - "name": "pack", - "plural_name": "packs", + "name": "pakkaus", + "plural_name": "pakkausta", "description": "", "abbreviation": "" }, "pinch": { - "name": "pinch", - "plural_name": "pinches", + "name": "hyppysellinen", + "plural_name": "hyppysellistä", "description": "", "abbreviation": "" } diff --git a/mealie/repos/seed/resources/units/locales/lt-LT.json b/mealie/repos/seed/resources/units/locales/lt-LT.json index ac7b8bb3d..ba2f7fad5 100644 --- a/mealie/repos/seed/resources/units/locales/lt-LT.json +++ b/mealie/repos/seed/resources/units/locales/lt-LT.json @@ -49,7 +49,7 @@ }, "liter": { "name": "litras", - "plural_name": "liters", + "plural_name": "litrų", "description": "", "abbreviation": "l" }, @@ -68,19 +68,19 @@ }, "gram": { "name": "gramas", - "plural_name": "grams", + "plural_name": "gramų", "description": "", "abbreviation": "g" }, "kilogram": { "name": "kilogramas", - "plural_name": "kilograms", + "plural_name": "kilogramų", "description": "", "abbreviation": "kg" }, "milligram": { "name": "miligramas", - "plural_name": "milligrams", + "plural_name": "miligramų", "description": "", "abbreviation": "mg" }, @@ -98,7 +98,7 @@ }, "serving": { "name": "porcijos", - "plural_name": "servings", + "plural_name": "porcijų", "description": "", "abbreviation": "" }, diff --git a/mealie/routes/users/api_tokens.py b/mealie/routes/users/api_tokens.py index 8b8f31766..63c814db0 100644 --- a/mealie/routes/users/api_tokens.py +++ b/mealie/routes/users/api_tokens.py @@ -5,14 +5,20 @@ from fastapi import HTTPException, status from mealie.core.security import create_access_token from mealie.routes._base import BaseUserController, controller from mealie.routes._base.routers import UserAPIRouter -from mealie.schema.user import CreateToken, DeleteTokenResponse, LongLiveTokenIn, LongLiveTokenInDB, LongLiveTokenOut +from mealie.schema.user import ( + CreateToken, + DeleteTokenResponse, + LongLiveTokenCreateResponse, + LongLiveTokenIn, + LongLiveTokenInDB, +) router = UserAPIRouter(prefix="/users", tags=["Users: Tokens"]) @controller(router) class UserApiTokensController(BaseUserController): - @router.post("/api-tokens", status_code=status.HTTP_201_CREATED, response_model=LongLiveTokenOut) + @router.post("/api-tokens", status_code=status.HTTP_201_CREATED, response_model=LongLiveTokenCreateResponse) def create_api_token( self, token_params: LongLiveTokenIn, diff --git a/mealie/schema/user/__init__.py b/mealie/schema/user/__init__.py index 8dce0c179..76db2ec95 100644 --- a/mealie/schema/user/__init__.py +++ b/mealie/schema/user/__init__.py @@ -10,6 +10,7 @@ from .user import ( GroupInDB, GroupPagination, GroupSummary, + LongLiveTokenCreateResponse, LongLiveTokenIn, LongLiveTokenInDB, LongLiveTokenOut, @@ -57,6 +58,7 @@ __all__ = [ "GroupInDB", "GroupPagination", "GroupSummary", + "LongLiveTokenCreateResponse", "LongLiveTokenIn", "LongLiveTokenInDB", "LongLiveTokenOut", diff --git a/mealie/schema/user/user.py b/mealie/schema/user/user.py index f4e1228b4..b05c5e8f0 100644 --- a/mealie/schema/user/user.py +++ b/mealie/schema/user/user.py @@ -31,7 +31,6 @@ class LongLiveTokenIn(MealieModel): class LongLiveTokenOut(MealieModel): - token: str name: str id: int created_at: datetime | None = None @@ -42,6 +41,12 @@ class LongLiveTokenOut(MealieModel): return [joinedload(LongLiveToken.user)] +class LongLiveTokenCreateResponse(LongLiveTokenOut): + """Should ONLY be used when creating a new token, as the token field is sensitive""" + + token: str + + class CreateToken(LongLiveTokenIn): user_id: UUID4 token: str diff --git a/poetry.lock b/poetry.lock index eaaaa6119..99a4f7f25 100644 --- a/poetry.lock +++ b/poetry.lock @@ -118,13 +118,13 @@ files = [ [[package]] name = "authlib" -version = "1.4.0" +version = "1.4.1" description = "The ultimate Python library in building OAuth and OpenID Connect servers and clients." optional = false python-versions = ">=3.9" files = [ - {file = "Authlib-1.4.0-py2.py3-none-any.whl", hash = "sha256:4bb20b978c8b636222b549317c1815e1fe62234fc1c5efe8855d84aebf3a74e3"}, - {file = "authlib-1.4.0.tar.gz", hash = "sha256:1c1e6608b5ed3624aeeee136ca7f8c120d6f51f731aa152b153d54741840e1f2"}, + {file = "Authlib-1.4.1-py2.py3-none-any.whl", hash = "sha256:edc29c3f6a3e72cd9e9f45fff67fc663a2c364022eb0371c003f22d5405915c1"}, + {file = "authlib-1.4.1.tar.gz", hash = "sha256:30ead9ea4993cdbab821dc6e01e818362f92da290c04c7f6a1940f86507a790d"}, ] [package.dependencies] @@ -607,13 +607,13 @@ cli = ["requests"] [[package]] name = "fastapi" -version = "0.115.7" +version = "0.115.8" description = "FastAPI framework, high performance, easy to learn, fast to code, ready for production" optional = false python-versions = ">=3.8" files = [ - {file = "fastapi-0.115.7-py3-none-any.whl", hash = "sha256:eb6a8c8bf7f26009e8147111ff15b5177a0e19bb4a45bc3486ab14804539d21e"}, - {file = "fastapi-0.115.7.tar.gz", hash = "sha256:0f106da6c01d88a6786b3248fb4d7a940d071f6f488488898ad5d354b25ed015"}, + {file = "fastapi-0.115.8-py3-none-any.whl", hash = "sha256:753a96dd7e036b34eeef8babdfcfe3f28ff79648f86551eb36bfc1b0bf4a8cbf"}, + {file = "fastapi-0.115.8.tar.gz", hash = "sha256:0ce9111231720190473e222cdf0f07f7206ad7e53ea02beb1d2dc36e2f0741e9"}, ] [package.dependencies] @@ -1451,13 +1451,13 @@ pyyaml = ">=5.1" [[package]] name = "mkdocs-material" -version = "9.5.50" +version = "9.6.2" description = "Documentation that simply works" optional = false python-versions = ">=3.8" files = [ - {file = "mkdocs_material-9.5.50-py3-none-any.whl", hash = "sha256:f24100f234741f4d423a9d672a909d859668a4f404796be3cf035f10d6050385"}, - {file = "mkdocs_material-9.5.50.tar.gz", hash = "sha256:ae5fe16f3d7c9ccd05bb6916a7da7420cf99a9ce5e33debd9d40403a090d5825"}, + {file = "mkdocs_material-9.6.2-py3-none-any.whl", hash = "sha256:71d90dbd63b393ad11a4d90151dfe3dcbfcd802c0f29ce80bebd9bbac6abc753"}, + {file = "mkdocs_material-9.6.2.tar.gz", hash = "sha256:a3de1c5d4c745f10afa78b1a02f917b9dce0808fb206adc0f5bb48b58c1ca21f"}, ] [package.dependencies] @@ -1491,49 +1491,43 @@ files = [ [[package]] name = "mypy" -version = "1.14.1" +version = "1.15.0" description = "Optional static typing for Python" optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" files = [ - {file = "mypy-1.14.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:52686e37cf13d559f668aa398dd7ddf1f92c5d613e4f8cb262be2fb4fedb0fcb"}, - {file = "mypy-1.14.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:1fb545ca340537d4b45d3eecdb3def05e913299ca72c290326be19b3804b39c0"}, - {file = "mypy-1.14.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:90716d8b2d1f4cd503309788e51366f07c56635a3309b0f6a32547eaaa36a64d"}, - {file = "mypy-1.14.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2ae753f5c9fef278bcf12e1a564351764f2a6da579d4a81347e1d5a15819997b"}, - {file = "mypy-1.14.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:e0fe0f5feaafcb04505bcf439e991c6d8f1bf8b15f12b05feeed96e9e7bf1427"}, - {file = "mypy-1.14.1-cp310-cp310-win_amd64.whl", hash = "sha256:7d54bd85b925e501c555a3227f3ec0cfc54ee8b6930bd6141ec872d1c572f81f"}, - {file = "mypy-1.14.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:f995e511de847791c3b11ed90084a7a0aafdc074ab88c5a9711622fe4751138c"}, - {file = "mypy-1.14.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d64169ec3b8461311f8ce2fd2eb5d33e2d0f2c7b49116259c51d0d96edee48d1"}, - {file = "mypy-1.14.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ba24549de7b89b6381b91fbc068d798192b1b5201987070319889e93038967a8"}, - {file = "mypy-1.14.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:183cf0a45457d28ff9d758730cd0210419ac27d4d3f285beda038c9083363b1f"}, - {file = "mypy-1.14.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:f2a0ecc86378f45347f586e4163d1769dd81c5a223d577fe351f26b179e148b1"}, - {file = "mypy-1.14.1-cp311-cp311-win_amd64.whl", hash = "sha256:ad3301ebebec9e8ee7135d8e3109ca76c23752bac1e717bc84cd3836b4bf3eae"}, - {file = "mypy-1.14.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:30ff5ef8519bbc2e18b3b54521ec319513a26f1bba19a7582e7b1f58a6e69f14"}, - {file = "mypy-1.14.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:cb9f255c18052343c70234907e2e532bc7e55a62565d64536dbc7706a20b78b9"}, - {file = "mypy-1.14.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8b4e3413e0bddea671012b063e27591b953d653209e7a4fa5e48759cda77ca11"}, - {file = "mypy-1.14.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:553c293b1fbdebb6c3c4030589dab9fafb6dfa768995a453d8a5d3b23784af2e"}, - {file = "mypy-1.14.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:fad79bfe3b65fe6a1efaed97b445c3d37f7be9fdc348bdb2d7cac75579607c89"}, - {file = "mypy-1.14.1-cp312-cp312-win_amd64.whl", hash = "sha256:8fa2220e54d2946e94ab6dbb3ba0a992795bd68b16dc852db33028df2b00191b"}, - {file = "mypy-1.14.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:92c3ed5afb06c3a8e188cb5da4984cab9ec9a77ba956ee419c68a388b4595255"}, - {file = "mypy-1.14.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:dbec574648b3e25f43d23577309b16534431db4ddc09fda50841f1e34e64ed34"}, - {file = "mypy-1.14.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8c6d94b16d62eb3e947281aa7347d78236688e21081f11de976376cf010eb31a"}, - {file = "mypy-1.14.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d4b19b03fdf54f3c5b2fa474c56b4c13c9dbfb9a2db4370ede7ec11a2c5927d9"}, - {file = "mypy-1.14.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:0c911fde686394753fff899c409fd4e16e9b294c24bfd5e1ea4675deae1ac6fd"}, - {file = "mypy-1.14.1-cp313-cp313-win_amd64.whl", hash = "sha256:8b21525cb51671219f5307be85f7e646a153e5acc656e5cebf64bfa076c50107"}, - {file = "mypy-1.14.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:7084fb8f1128c76cd9cf68fe5971b37072598e7c31b2f9f95586b65c741a9d31"}, - {file = "mypy-1.14.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:8f845a00b4f420f693f870eaee5f3e2692fa84cc8514496114649cfa8fd5e2c6"}, - {file = "mypy-1.14.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:44bf464499f0e3a2d14d58b54674dee25c031703b2ffc35064bd0df2e0fac319"}, - {file = "mypy-1.14.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c99f27732c0b7dc847adb21c9d47ce57eb48fa33a17bc6d7d5c5e9f9e7ae5bac"}, - {file = "mypy-1.14.1-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:bce23c7377b43602baa0bd22ea3265c49b9ff0b76eb315d6c34721af4cdf1d9b"}, - {file = "mypy-1.14.1-cp38-cp38-win_amd64.whl", hash = "sha256:8edc07eeade7ebc771ff9cf6b211b9a7d93687ff892150cb5692e4f4272b0837"}, - {file = "mypy-1.14.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:3888a1816d69f7ab92092f785a462944b3ca16d7c470d564165fe703b0970c35"}, - {file = "mypy-1.14.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:46c756a444117c43ee984bd055db99e498bc613a70bbbc120272bd13ca579fbc"}, - {file = "mypy-1.14.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:27fc248022907e72abfd8e22ab1f10e903915ff69961174784a3900a8cba9ad9"}, - {file = "mypy-1.14.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:499d6a72fb7e5de92218db961f1a66d5f11783f9ae549d214617edab5d4dbdbb"}, - {file = "mypy-1.14.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:57961db9795eb566dc1d1b4e9139ebc4c6b0cb6e7254ecde69d1552bf7613f60"}, - {file = "mypy-1.14.1-cp39-cp39-win_amd64.whl", hash = "sha256:07ba89fdcc9451f2ebb02853deb6aaaa3d2239a236669a63ab3801bbf923ef5c"}, - {file = "mypy-1.14.1-py3-none-any.whl", hash = "sha256:b66a60cc4073aeb8ae00057f9c1f64d49e90f918fbcef9a977eb121da8b8f1d1"}, - {file = "mypy-1.14.1.tar.gz", hash = "sha256:7ec88144fe9b510e8475ec2f5f251992690fcf89ccb4500b214b4226abcd32d6"}, + {file = "mypy-1.15.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:979e4e1a006511dacf628e36fadfecbcc0160a8af6ca7dad2f5025529e082c13"}, + {file = "mypy-1.15.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c4bb0e1bd29f7d34efcccd71cf733580191e9a264a2202b0239da95984c5b559"}, + {file = "mypy-1.15.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:be68172e9fd9ad8fb876c6389f16d1c1b5f100ffa779f77b1fb2176fcc9ab95b"}, + {file = "mypy-1.15.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c7be1e46525adfa0d97681432ee9fcd61a3964c2446795714699a998d193f1a3"}, + {file = "mypy-1.15.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:2e2c2e6d3593f6451b18588848e66260ff62ccca522dd231cd4dd59b0160668b"}, + {file = "mypy-1.15.0-cp310-cp310-win_amd64.whl", hash = "sha256:6983aae8b2f653e098edb77f893f7b6aca69f6cffb19b2cc7443f23cce5f4828"}, + {file = "mypy-1.15.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:2922d42e16d6de288022e5ca321cd0618b238cfc5570e0263e5ba0a77dbef56f"}, + {file = "mypy-1.15.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:2ee2d57e01a7c35de00f4634ba1bbf015185b219e4dc5909e281016df43f5ee5"}, + {file = "mypy-1.15.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:973500e0774b85d9689715feeffcc980193086551110fd678ebe1f4342fb7c5e"}, + {file = "mypy-1.15.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5a95fb17c13e29d2d5195869262f8125dfdb5c134dc8d9a9d0aecf7525b10c2c"}, + {file = "mypy-1.15.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:1905f494bfd7d85a23a88c5d97840888a7bd516545fc5aaedff0267e0bb54e2f"}, + {file = "mypy-1.15.0-cp311-cp311-win_amd64.whl", hash = "sha256:c9817fa23833ff189db061e6d2eff49b2f3b6ed9856b4a0a73046e41932d744f"}, + {file = "mypy-1.15.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:aea39e0583d05124836ea645f412e88a5c7d0fd77a6d694b60d9b6b2d9f184fd"}, + {file = "mypy-1.15.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:2f2147ab812b75e5b5499b01ade1f4a81489a147c01585cda36019102538615f"}, + {file = "mypy-1.15.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ce436f4c6d218a070048ed6a44c0bbb10cd2cc5e272b29e7845f6a2f57ee4464"}, + {file = "mypy-1.15.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8023ff13985661b50a5928fc7a5ca15f3d1affb41e5f0a9952cb68ef090b31ee"}, + {file = "mypy-1.15.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:1124a18bc11a6a62887e3e137f37f53fbae476dc36c185d549d4f837a2a6a14e"}, + {file = "mypy-1.15.0-cp312-cp312-win_amd64.whl", hash = "sha256:171a9ca9a40cd1843abeca0e405bc1940cd9b305eaeea2dda769ba096932bb22"}, + {file = "mypy-1.15.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:93faf3fdb04768d44bf28693293f3904bbb555d076b781ad2530214ee53e3445"}, + {file = "mypy-1.15.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:811aeccadfb730024c5d3e326b2fbe9249bb7413553f15499a4050f7c30e801d"}, + {file = "mypy-1.15.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:98b7b9b9aedb65fe628c62a6dc57f6d5088ef2dfca37903a7d9ee374d03acca5"}, + {file = "mypy-1.15.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c43a7682e24b4f576d93072216bf56eeff70d9140241f9edec0c104d0c515036"}, + {file = "mypy-1.15.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:baefc32840a9f00babd83251560e0ae1573e2f9d1b067719479bfb0e987c6357"}, + {file = "mypy-1.15.0-cp313-cp313-win_amd64.whl", hash = "sha256:b9378e2c00146c44793c98b8d5a61039a048e31f429fb0eb546d93f4b000bedf"}, + {file = "mypy-1.15.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:e601a7fa172c2131bff456bb3ee08a88360760d0d2f8cbd7a75a65497e2df078"}, + {file = "mypy-1.15.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:712e962a6357634fef20412699a3655c610110e01cdaa6180acec7fc9f8513ba"}, + {file = "mypy-1.15.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f95579473af29ab73a10bada2f9722856792a36ec5af5399b653aa28360290a5"}, + {file = "mypy-1.15.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8f8722560a14cde92fdb1e31597760dc35f9f5524cce17836c0d22841830fd5b"}, + {file = "mypy-1.15.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:1fbb8da62dc352133d7d7ca90ed2fb0e9d42bb1a32724c287d3c76c58cbaa9c2"}, + {file = "mypy-1.15.0-cp39-cp39-win_amd64.whl", hash = "sha256:d10d994b41fb3497719bbf866f227b3489048ea4bbbb5015357db306249f7980"}, + {file = "mypy-1.15.0-py3-none-any.whl", hash = "sha256:5469affef548bd1895d86d3bf10ce2b44e33d86923c29e4d675b3e323437ea3e"}, + {file = "mypy-1.15.0.tar.gz", hash = "sha256:404534629d51d3efea5c800ee7c42b72a6554d6c400e6a79eafe15d11341fd43"}, ] [package.dependencies] @@ -1590,13 +1584,13 @@ signedtoken = ["cryptography (>=3.0.0)", "pyjwt (>=2.0.0,<3)"] [[package]] name = "openai" -version = "1.60.1" +version = "1.61.0" description = "The official Python library for the openai API" optional = false python-versions = ">=3.8" files = [ - {file = "openai-1.60.1-py3-none-any.whl", hash = "sha256:714181ec1c452353d456f143c22db892de7b373e3165063d02a2b798ed575ba1"}, - {file = "openai-1.60.1.tar.gz", hash = "sha256:beb1541dfc38b002bd629ab68b0d6fe35b870c5f4311d9bc4404d85af3214d5e"}, + {file = "openai-1.61.0-py3-none-any.whl", hash = "sha256:e8c512c0743accbdbe77f3429a1490d862f8352045de8dc81969301eb4a4f666"}, + {file = "openai-1.61.0.tar.gz", hash = "sha256:216f325a24ed8578e929b0f1b3fb2052165f3b04b0461818adaa51aa29c71f8a"}, ] [package.dependencies] @@ -2274,20 +2268,20 @@ tests = ["coverage[toml] (==5.0.4)", "pytest (>=6.0.0,<7.0.0)"] [[package]] name = "pylint" -version = "3.3.3" +version = "3.3.4" description = "python code static checker" optional = false python-versions = ">=3.9.0" files = [ - {file = "pylint-3.3.3-py3-none-any.whl", hash = "sha256:26e271a2bc8bce0fc23833805a9076dd9b4d5194e2a02164942cb3cdc37b4183"}, - {file = "pylint-3.3.3.tar.gz", hash = "sha256:07c607523b17e6d16e2ae0d7ef59602e332caa762af64203c24b41c27139f36a"}, + {file = "pylint-3.3.4-py3-none-any.whl", hash = "sha256:289e6a1eb27b453b08436478391a48cd53bb0efb824873f949e709350f3de018"}, + {file = "pylint-3.3.4.tar.gz", hash = "sha256:74ae7a38b177e69a9b525d0794bd8183820bfa7eb68cc1bee6e8ed22a42be4ce"}, ] [package.dependencies] astroid = ">=3.3.8,<=3.4.0-dev0" colorama = {version = ">=0.4.5", markers = "sys_platform == \"win32\""} dill = {version = ">=0.3.7", markers = "python_version >= \"3.12\""} -isort = ">=4.2.5,<5.13.0 || >5.13.0,<6" +isort = ">=4.2.5,<5.13.0 || >5.13.0,<7" mccabe = ">=0.6,<0.8" platformdirs = ">=2.2.0" tomlkit = ">=0.10.1" @@ -2366,13 +2360,13 @@ dev = ["argcomplete", "attrs (>=19.2)", "hypothesis (>=3.56)", "mock", "pygments [[package]] name = "pytest-asyncio" -version = "0.25.2" +version = "0.25.3" description = "Pytest support for asyncio" optional = false python-versions = ">=3.9" files = [ - {file = "pytest_asyncio-0.25.2-py3-none-any.whl", hash = "sha256:0d0bb693f7b99da304a0634afc0a4b19e49d5e0de2d670f38dc4bfa5727c5075"}, - {file = "pytest_asyncio-0.25.2.tar.gz", hash = "sha256:3f8ef9a98f45948ea91a0ed3dc4268b5326c0e7bce73892acc654df4262ad45f"}, + {file = "pytest_asyncio-0.25.3-py3-none-any.whl", hash = "sha256:9e89518e0f9bd08928f97a3482fdc4e244df17529460bc038291ccaf8f85c7c3"}, + {file = "pytest_asyncio-0.25.3.tar.gz", hash = "sha256:fc1da2cf9f125ada7e710b4ddad05518d4cee187ae9412e9ac9271003497f07a"}, ] [package.dependencies] @@ -2530,99 +2524,99 @@ pyyaml = "*" [[package]] name = "rapidfuzz" -version = "3.11.0" +version = "3.12.1" description = "rapid fuzzy string matching" optional = false python-versions = ">=3.9" files = [ - {file = "rapidfuzz-3.11.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:eb8a54543d16ab1b69e2c5ed96cabbff16db044a50eddfc028000138ca9ddf33"}, - {file = "rapidfuzz-3.11.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:231c8b2efbd7f8d2ecd1ae900363ba168b8870644bb8f2b5aa96e4a7573bde19"}, - {file = "rapidfuzz-3.11.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:54e7f442fb9cca81e9df32333fb075ef729052bcabe05b0afc0441f462299114"}, - {file = "rapidfuzz-3.11.0-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:906f1f2a1b91c06599b3dd1be207449c5d4fc7bd1e1fa2f6aef161ea6223f165"}, - {file = "rapidfuzz-3.11.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8ed59044aea9eb6c663112170f2399b040d5d7b162828b141f2673e822093fa8"}, - {file = "rapidfuzz-3.11.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1cb1965a28b0fa64abdee130c788a0bc0bb3cf9ef7e3a70bf055c086c14a3d7e"}, - {file = "rapidfuzz-3.11.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0b488b244931d0291412917e6e46ee9f6a14376625e150056fe7c4426ef28225"}, - {file = "rapidfuzz-3.11.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:f0ba13557fec9d5ffc0a22826754a7457cc77f1b25145be10b7bb1d143ce84c6"}, - {file = "rapidfuzz-3.11.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:3871fa7dfcef00bad3c7e8ae8d8fd58089bad6fb21f608d2bf42832267ca9663"}, - {file = "rapidfuzz-3.11.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:b2669eafee38c5884a6e7cc9769d25c19428549dcdf57de8541cf9e82822e7db"}, - {file = "rapidfuzz-3.11.0-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:ffa1bb0e26297b0f22881b219ffc82a33a3c84ce6174a9d69406239b14575bd5"}, - {file = "rapidfuzz-3.11.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:45b15b8a118856ac9caac6877f70f38b8a0d310475d50bc814698659eabc1cdb"}, - {file = "rapidfuzz-3.11.0-cp310-cp310-win32.whl", hash = "sha256:22033677982b9c4c49676f215b794b0404073f8974f98739cb7234e4a9ade9ad"}, - {file = "rapidfuzz-3.11.0-cp310-cp310-win_amd64.whl", hash = "sha256:be15496e7244361ff0efcd86e52559bacda9cd975eccf19426a0025f9547c792"}, - {file = "rapidfuzz-3.11.0-cp310-cp310-win_arm64.whl", hash = "sha256:714a7ba31ba46b64d30fccfe95f8013ea41a2e6237ba11a805a27cdd3bce2573"}, - {file = "rapidfuzz-3.11.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:8724a978f8af7059c5323d523870bf272a097478e1471295511cf58b2642ff83"}, - {file = "rapidfuzz-3.11.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:8b63cb1f2eb371ef20fb155e95efd96e060147bdd4ab9fc400c97325dfee9fe1"}, - {file = "rapidfuzz-3.11.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:82497f244aac10b20710448645f347d862364cc4f7d8b9ba14bd66b5ce4dec18"}, - {file = "rapidfuzz-3.11.0-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:339607394941801e6e3f6c1ecd413a36e18454e7136ed1161388de674f47f9d9"}, - {file = "rapidfuzz-3.11.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:84819390a36d6166cec706b9d8f0941f115f700b7faecab5a7e22fc367408bc3"}, - {file = "rapidfuzz-3.11.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:eea8d9e20632d68f653455265b18c35f90965e26f30d4d92f831899d6682149b"}, - {file = "rapidfuzz-3.11.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5b659e1e2ea2784a9a397075a7fc395bfa4fe66424042161c4bcaf6e4f637b38"}, - {file = "rapidfuzz-3.11.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:1315cd2a351144572e31fe3df68340d4b83ddec0af8b2e207cd32930c6acd037"}, - {file = "rapidfuzz-3.11.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:a7743cca45b4684c54407e8638f6d07b910d8d811347b9d42ff21262c7c23245"}, - {file = "rapidfuzz-3.11.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:5bb636b0150daa6d3331b738f7c0f8b25eadc47f04a40e5c23c4bfb4c4e20ae3"}, - {file = "rapidfuzz-3.11.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:42f4dd264ada7a9aa0805ea0da776dc063533917773cf2df5217f14eb4429eae"}, - {file = "rapidfuzz-3.11.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:51f24cb39e64256221e6952f22545b8ce21cacd59c0d3e367225da8fc4b868d8"}, - {file = "rapidfuzz-3.11.0-cp311-cp311-win32.whl", hash = "sha256:aaf391fb6715866bc14681c76dc0308f46877f7c06f61d62cc993b79fc3c4a2a"}, - {file = "rapidfuzz-3.11.0-cp311-cp311-win_amd64.whl", hash = "sha256:ebadd5b8624d8ad503e505a99b8eb26fe3ea9f8e9c2234e805a27b269e585842"}, - {file = "rapidfuzz-3.11.0-cp311-cp311-win_arm64.whl", hash = "sha256:d895998fec712544c13cfe833890e0226585cf0391dd3948412441d5d68a2b8c"}, - {file = "rapidfuzz-3.11.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:f382fec4a7891d66fb7163c90754454030bb9200a13f82ee7860b6359f3f2fa8"}, - {file = "rapidfuzz-3.11.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:dfaefe08af2a928e72344c800dcbaf6508e86a4ed481e28355e8d4b6a6a5230e"}, - {file = "rapidfuzz-3.11.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:92ebb7c12f682b5906ed98429f48a3dd80dd0f9721de30c97a01473d1a346576"}, - {file = "rapidfuzz-3.11.0-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9a1b3ebc62d4bcdfdeba110944a25ab40916d5383c5e57e7c4a8dc0b6c17211a"}, - {file = "rapidfuzz-3.11.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9c6d7fea39cb33e71de86397d38bf7ff1a6273e40367f31d05761662ffda49e4"}, - {file = "rapidfuzz-3.11.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:99aebef8268f2bc0b445b5640fd3312e080bd17efd3fbae4486b20ac00466308"}, - {file = "rapidfuzz-3.11.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4469307f464ae3089acf3210b8fc279110d26d10f79e576f385a98f4429f7d97"}, - {file = "rapidfuzz-3.11.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:eb97c53112b593f89a90b4f6218635a9d1eea1d7f9521a3b7d24864228bbc0aa"}, - {file = "rapidfuzz-3.11.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:ef8937dae823b889c0273dfa0f0f6c46a3658ac0d851349c464d1b00e7ff4252"}, - {file = "rapidfuzz-3.11.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:d95f9e9f3777b96241d8a00d6377cc9c716981d828b5091082d0fe3a2924b43e"}, - {file = "rapidfuzz-3.11.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:b1d67d67f89e4e013a5295e7523bc34a7a96f2dba5dd812c7c8cb65d113cbf28"}, - {file = "rapidfuzz-3.11.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:d994cf27e2f874069884d9bddf0864f9b90ad201fcc9cb2f5b82bacc17c8d5f2"}, - {file = "rapidfuzz-3.11.0-cp312-cp312-win32.whl", hash = "sha256:ba26d87fe7fcb56c4a53b549a9e0e9143f6b0df56d35fe6ad800c902447acd5b"}, - {file = "rapidfuzz-3.11.0-cp312-cp312-win_amd64.whl", hash = "sha256:b1f7efdd7b7adb32102c2fa481ad6f11923e2deb191f651274be559d56fc913b"}, - {file = "rapidfuzz-3.11.0-cp312-cp312-win_arm64.whl", hash = "sha256:ed78c8e94f57b44292c1a0350f580e18d3a3c5c0800e253f1583580c1b417ad2"}, - {file = "rapidfuzz-3.11.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:e60814edd0c9b511b5f377d48b9782b88cfe8be07a98f99973669299c8bb318a"}, - {file = "rapidfuzz-3.11.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:3f28952da055dbfe75828891cd3c9abf0984edc8640573c18b48c14c68ca5e06"}, - {file = "rapidfuzz-3.11.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5e8f93bc736020351a6f8e71666e1f486bb8bd5ce8112c443a30c77bfde0eb68"}, - {file = "rapidfuzz-3.11.0-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:76a4a11ba8f678c9e5876a7d465ab86def047a4fcc043617578368755d63a1bc"}, - {file = "rapidfuzz-3.11.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:dc0e0d41ad8a056a9886bac91ff9d9978e54a244deb61c2972cc76b66752de9c"}, - {file = "rapidfuzz-3.11.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5e8ea35f2419c7d56b3e75fbde2698766daedb374f20eea28ac9b1f668ef4f74"}, - {file = "rapidfuzz-3.11.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cd340bbd025302276b5aa221dccfe43040c7babfc32f107c36ad783f2ffd8775"}, - {file = "rapidfuzz-3.11.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:494eef2c68305ab75139034ea25328a04a548d297712d9cf887bf27c158c388b"}, - {file = "rapidfuzz-3.11.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:5a167344c1d6db06915fb0225592afdc24d8bafaaf02de07d4788ddd37f4bc2f"}, - {file = "rapidfuzz-3.11.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:8c7af25bda96ac799378ac8aba54a8ece732835c7b74cfc201b688a87ed11152"}, - {file = "rapidfuzz-3.11.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:d2a0f7e17f33e7890257367a1662b05fecaf56625f7dbb6446227aaa2b86448b"}, - {file = "rapidfuzz-3.11.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4d0d26c7172bdb64f86ee0765c5b26ea1dc45c52389175888ec073b9b28f4305"}, - {file = "rapidfuzz-3.11.0-cp313-cp313-win32.whl", hash = "sha256:6ad02bab756751c90fa27f3069d7b12146613061341459abf55f8190d899649f"}, - {file = "rapidfuzz-3.11.0-cp313-cp313-win_amd64.whl", hash = "sha256:b1472986fd9c5d318399a01a0881f4a0bf4950264131bb8e2deba9df6d8c362b"}, - {file = "rapidfuzz-3.11.0-cp313-cp313-win_arm64.whl", hash = "sha256:c408f09649cbff8da76f8d3ad878b64ba7f7abdad1471efb293d2c075e80c822"}, - {file = "rapidfuzz-3.11.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:1bac4873f6186f5233b0084b266bfb459e997f4c21fc9f029918f44a9eccd304"}, - {file = "rapidfuzz-3.11.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:4f9f12c2d0aa52b86206d2059916153876a9b1cf9dfb3cf2f344913167f1c3d4"}, - {file = "rapidfuzz-3.11.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8dd501de6f7a8f83557d20613b58734d1cb5f0be78d794cde64fe43cfc63f5f2"}, - {file = "rapidfuzz-3.11.0-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4416ca69af933d4a8ad30910149d3db6d084781d5c5fdedb713205389f535385"}, - {file = "rapidfuzz-3.11.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f0821b9bdf18c5b7d51722b906b233a39b17f602501a966cfbd9b285f8ab83cd"}, - {file = "rapidfuzz-3.11.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d0edecc3f90c2653298d380f6ea73b536944b767520c2179ec5d40b9145e47aa"}, - {file = "rapidfuzz-3.11.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4513dd01cee11e354c31b75f652d4d466c9440b6859f84e600bdebfccb17735a"}, - {file = "rapidfuzz-3.11.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:d9727b85511b912571a76ce53c7640ba2c44c364e71cef6d7359b5412739c570"}, - {file = "rapidfuzz-3.11.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:ab9eab33ee3213f7751dc07a1a61b8d9a3d748ca4458fffddd9defa6f0493c16"}, - {file = "rapidfuzz-3.11.0-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:6b01c1ddbb054283797967ddc5433d5c108d680e8fa2684cf368be05407b07e4"}, - {file = "rapidfuzz-3.11.0-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:3857e335f97058c4b46fa39ca831290b70de554a5c5af0323d2f163b19c5f2a6"}, - {file = "rapidfuzz-3.11.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:d98a46cf07c0c875d27e8a7ed50f304d83063e49b9ab63f21c19c154b4c0d08d"}, - {file = "rapidfuzz-3.11.0-cp39-cp39-win32.whl", hash = "sha256:c36539ed2c0173b053dafb221458812e178cfa3224ade0960599bec194637048"}, - {file = "rapidfuzz-3.11.0-cp39-cp39-win_amd64.whl", hash = "sha256:ec8d7d8567e14af34a7911c98f5ac74a3d4a743cd848643341fc92b12b3784ff"}, - {file = "rapidfuzz-3.11.0-cp39-cp39-win_arm64.whl", hash = "sha256:62171b270ecc4071be1c1f99960317db261d4c8c83c169e7f8ad119211fe7397"}, - {file = "rapidfuzz-3.11.0-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:f06e3c4c0a8badfc4910b9fd15beb1ad8f3b8fafa8ea82c023e5e607b66a78e4"}, - {file = "rapidfuzz-3.11.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:fe7aaf5a54821d340d21412f7f6e6272a9b17a0cbafc1d68f77f2fc11009dcd5"}, - {file = "rapidfuzz-3.11.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:25398d9ac7294e99876a3027ffc52c6bebeb2d702b1895af6ae9c541ee676702"}, - {file = "rapidfuzz-3.11.0-pp310-pypy310_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9a52eea839e4bdc72c5e60a444d26004da00bb5bc6301e99b3dde18212e41465"}, - {file = "rapidfuzz-3.11.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2c87319b0ab9d269ab84f6453601fd49b35d9e4a601bbaef43743f26fabf496c"}, - {file = "rapidfuzz-3.11.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:3048c6ed29d693fba7d2a7caf165f5e0bb2b9743a0989012a98a47b975355cca"}, - {file = "rapidfuzz-3.11.0-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:b04f29735bad9f06bb731c214f27253bd8bedb248ef9b8a1b4c5bde65b838454"}, - {file = "rapidfuzz-3.11.0-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:7864e80a0d4e23eb6194254a81ee1216abdc53f9dc85b7f4d56668eced022eb8"}, - {file = "rapidfuzz-3.11.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3794df87313dfb56fafd679b962e0613c88a293fd9bd5dd5c2793d66bf06a101"}, - {file = "rapidfuzz-3.11.0-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d71da0012face6f45432a11bc59af19e62fac5a41f8ce489e80c0add8153c3d1"}, - {file = "rapidfuzz-3.11.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ff38378346b7018f42cbc1f6d1d3778e36e16d8595f79a312b31e7c25c50bd08"}, - {file = "rapidfuzz-3.11.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:6668321f90aa02a5a789d4e16058f2e4f2692c5230252425c3532a8a62bc3424"}, - {file = "rapidfuzz-3.11.0.tar.gz", hash = "sha256:a53ca4d3f52f00b393fab9b5913c5bafb9afc27d030c8a1db1283da6917a860f"}, + {file = "rapidfuzz-3.12.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:dbb7ea2fd786e6d66f225ef6eef1728832314f47e82fee877cb2a793ebda9579"}, + {file = "rapidfuzz-3.12.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:1ae41361de05762c1eaa3955e5355de7c4c6f30d1ef1ea23d29bf738a35809ab"}, + {file = "rapidfuzz-3.12.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dc3c39e0317e7f68ba01bac056e210dd13c7a0abf823e7b6a5fe7e451ddfc496"}, + {file = "rapidfuzz-3.12.1-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:69f2520296f1ae1165b724a3aad28c56fd0ac7dd2e4cff101a5d986e840f02d4"}, + {file = "rapidfuzz-3.12.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:34dcbf5a7daecebc242f72e2500665f0bde9dd11b779246c6d64d106a7d57c99"}, + {file = "rapidfuzz-3.12.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:773ab37fccf6e0513891f8eb4393961ddd1053c6eb7e62eaa876e94668fc6d31"}, + {file = "rapidfuzz-3.12.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3ecf0e6de84c0bc2c0f48bc03ba23cef2c5f1245db7b26bc860c11c6fd7a097c"}, + {file = "rapidfuzz-3.12.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:4dc2ebad4adb29d84a661f6a42494df48ad2b72993ff43fad2b9794804f91e45"}, + {file = "rapidfuzz-3.12.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:8389d98b9f54cb4f8a95f1fa34bf0ceee639e919807bb931ca479c7a5f2930bf"}, + {file = "rapidfuzz-3.12.1-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:165bcdecbfed9978962da1d3ec9c191b2ff9f1ccc2668fbaf0613a975b9aa326"}, + {file = "rapidfuzz-3.12.1-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:129d536740ab0048c1a06ccff73c683f282a2347c68069affae8dbc423a37c50"}, + {file = "rapidfuzz-3.12.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:1b67e390261ffe98ec86c771b89425a78b60ccb610c3b5874660216fcdbded4b"}, + {file = "rapidfuzz-3.12.1-cp310-cp310-win32.whl", hash = "sha256:a66520180d3426b9dc2f8d312f38e19bc1fc5601f374bae5c916f53fa3534a7d"}, + {file = "rapidfuzz-3.12.1-cp310-cp310-win_amd64.whl", hash = "sha256:82260b20bc7a76556cecb0c063c87dad19246a570425d38f8107b8404ca3ac97"}, + {file = "rapidfuzz-3.12.1-cp310-cp310-win_arm64.whl", hash = "sha256:3a860d103bbb25c69c2e995fdf4fac8cb9f77fb69ec0a00469d7fd87ff148f46"}, + {file = "rapidfuzz-3.12.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6d9afad7b16d01c9e8929b6a205a18163c7e61b6cd9bcf9c81be77d5afc1067a"}, + {file = "rapidfuzz-3.12.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:bb424ae7240f2d2f7d8dda66a61ebf603f74d92f109452c63b0dbf400204a437"}, + {file = "rapidfuzz-3.12.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:42149e6d13bd6d06437d2a954dae2184dadbbdec0fdb82dafe92860d99f80519"}, + {file = "rapidfuzz-3.12.1-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:760ac95d788f2964b73da01e0bdffbe1bf2ad8273d0437565ce9092ae6ad1fbc"}, + {file = "rapidfuzz-3.12.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2cf27e8e4bf7bf9d92ef04f3d2b769e91c3f30ba99208c29f5b41e77271a2614"}, + {file = "rapidfuzz-3.12.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:00ceb8ff3c44ab0d6014106c71709c85dee9feedd6890eff77c814aa3798952b"}, + {file = "rapidfuzz-3.12.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b8b61c558574fbc093d85940c3264c08c2b857b8916f8e8f222e7b86b0bb7d12"}, + {file = "rapidfuzz-3.12.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:346a2d8f17224e99f9ef988606c83d809d5917d17ad00207237e0965e54f9730"}, + {file = "rapidfuzz-3.12.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:d60d1db1b7e470e71ae096b6456e20ec56b52bde6198e2dbbc5e6769fa6797dc"}, + {file = "rapidfuzz-3.12.1-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:2477da227e266f9c712f11393182c69a99d3c8007ea27f68c5afc3faf401cc43"}, + {file = "rapidfuzz-3.12.1-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:8499c7d963ddea8adb6cffac2861ee39a1053e22ca8a5ee9de1197f8dc0275a5"}, + {file = "rapidfuzz-3.12.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:12802e5c4d8ae104fb6efeeb436098325ce0dca33b461c46e8df015c84fbef26"}, + {file = "rapidfuzz-3.12.1-cp311-cp311-win32.whl", hash = "sha256:e1061311d07e7cdcffa92c9b50c2ab4192907e70ca01b2e8e1c0b6b4495faa37"}, + {file = "rapidfuzz-3.12.1-cp311-cp311-win_amd64.whl", hash = "sha256:c6e4ed63e204daa863a802eec09feea5448617981ba5d150f843ad8e3ae071a4"}, + {file = "rapidfuzz-3.12.1-cp311-cp311-win_arm64.whl", hash = "sha256:920733a28c3af47870835d59ca9879579f66238f10de91d2b4b3f809d1ebfc5b"}, + {file = "rapidfuzz-3.12.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:f6235b57ae3faa3f85cb3f90c9fee49b21bd671b76e90fc99e8ca2bdf0b5e4a3"}, + {file = "rapidfuzz-3.12.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:af4585e5812632c357fee5ab781c29f00cd06bea58f8882ff244cc4906ba6c9e"}, + {file = "rapidfuzz-3.12.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5942dc4460e5030c5f9e1d4c9383de2f3564a2503fe25e13e89021bcbfea2f44"}, + {file = "rapidfuzz-3.12.1-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0b31ab59e1a0df5afc21f3109b6cfd77b34040dbf54f1bad3989f885cfae1e60"}, + {file = "rapidfuzz-3.12.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:97c885a7a480b21164f57a706418c9bbc9a496ec6da087e554424358cadde445"}, + {file = "rapidfuzz-3.12.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2d844c0587d969ce36fbf4b7cbf0860380ffeafc9ac5e17a7cbe8abf528d07bb"}, + {file = "rapidfuzz-3.12.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a93c95dce8917bf428064c64024de43ffd34ec5949dd4425780c72bd41f9d969"}, + {file = "rapidfuzz-3.12.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:834f6113d538af358f39296604a1953e55f8eeffc20cb4caf82250edbb8bf679"}, + {file = "rapidfuzz-3.12.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:a940aa71a7f37d7f0daac186066bf6668d4d3b7e7ef464cb50bc7ba89eae1f51"}, + {file = "rapidfuzz-3.12.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:ec9eaf73501c9a7de2c6938cb3050392e2ee0c5ca3921482acf01476b85a7226"}, + {file = "rapidfuzz-3.12.1-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:3c5ec360694ac14bfaeb6aea95737cf1a6cf805b5fe8ea7fd28814706c7fa838"}, + {file = "rapidfuzz-3.12.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:6b5e176524653ac46f1802bdd273a4b44a5f8d0054ed5013a8e8a4b72f254599"}, + {file = "rapidfuzz-3.12.1-cp312-cp312-win32.whl", hash = "sha256:6f463c6f1c42ec90e45d12a6379e18eddd5cdf74138804d8215619b6f4d31cea"}, + {file = "rapidfuzz-3.12.1-cp312-cp312-win_amd64.whl", hash = "sha256:b894fa2b30cd6498a29e5c470cb01c6ea898540b7e048a0342775a5000531334"}, + {file = "rapidfuzz-3.12.1-cp312-cp312-win_arm64.whl", hash = "sha256:43bb17056c5d1332f517b888c4e57846c4b5f936ed304917eeb5c9ac85d940d4"}, + {file = "rapidfuzz-3.12.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:97f824c15bc6933a31d6e3cbfa90188ba0e5043cf2b6dd342c2b90ee8b3fd47c"}, + {file = "rapidfuzz-3.12.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:a973b3f5cabf931029a3ae4a0f72e3222e53d412ea85fc37ddc49e1774f00fbf"}, + {file = "rapidfuzz-3.12.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:df7880e012228722dec1be02b9ef3898ed023388b8a24d6fa8213d7581932510"}, + {file = "rapidfuzz-3.12.1-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9c78582f50e75e6c2bc38c791ed291cb89cf26a3148c47860c1a04d6e5379c8e"}, + {file = "rapidfuzz-3.12.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2d7d9e6a04d8344b0198c96394c28874086888d0a2b2f605f30d1b27b9377b7d"}, + {file = "rapidfuzz-3.12.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5620001fd4d6644a2f56880388179cc8f3767670f0670160fcb97c3b46c828af"}, + {file = "rapidfuzz-3.12.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0666ab4c52e500af7ba5cc17389f5d15c0cdad06412c80312088519fdc25686d"}, + {file = "rapidfuzz-3.12.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:27b4d440fa50b50c515a91a01ee17e8ede719dca06eef4c0cccf1a111a4cfad3"}, + {file = "rapidfuzz-3.12.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:83dccfd5a754f2a0e8555b23dde31f0f7920601bfa807aa76829391ea81e7c67"}, + {file = "rapidfuzz-3.12.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:b572b634740e047c53743ed27a1bb3b4f93cf4abbac258cd7af377b2c4a9ba5b"}, + {file = "rapidfuzz-3.12.1-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:7fa7b81fb52902d5f78dac42b3d6c835a6633b01ddf9b202a3ca8443be4b2d6a"}, + {file = "rapidfuzz-3.12.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:b1d4fbff980cb6baef4ee675963c081f7b5d6580a105d6a4962b20f1f880e1fb"}, + {file = "rapidfuzz-3.12.1-cp313-cp313-win32.whl", hash = "sha256:3fe8da12ea77271097b303fa7624cfaf5afd90261002314e3b0047d36f4afd8d"}, + {file = "rapidfuzz-3.12.1-cp313-cp313-win_amd64.whl", hash = "sha256:6f7e92fc7d2a7f02e1e01fe4f539324dfab80f27cb70a30dd63a95445566946b"}, + {file = "rapidfuzz-3.12.1-cp313-cp313-win_arm64.whl", hash = "sha256:e31be53d7f4905a6a038296d8b773a79da9ee9f0cd19af9490c5c5a22e37d2e5"}, + {file = "rapidfuzz-3.12.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:bef5c91d5db776523530073cda5b2a276283258d2f86764be4a008c83caf7acd"}, + {file = "rapidfuzz-3.12.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:841e0c2a5fbe8fc8b9b1a56e924c871899932c0ece7fbd970aa1c32bfd12d4bf"}, + {file = "rapidfuzz-3.12.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:046fc67f3885d94693a2151dd913aaf08b10931639cbb953dfeef3151cb1027c"}, + {file = "rapidfuzz-3.12.1-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b4d2d39b2e76c17f92edd6d384dc21fa020871c73251cdfa017149358937a41d"}, + {file = "rapidfuzz-3.12.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c5857dda85165b986c26a474b22907db6b93932c99397c818bcdec96340a76d5"}, + {file = "rapidfuzz-3.12.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4c26cd1b9969ea70dbf0dbda3d2b54ab4b2e683d0fd0f17282169a19563efeb1"}, + {file = "rapidfuzz-3.12.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bf56ea4edd69005786e6c80a9049d95003aeb5798803e7a2906194e7a3cb6472"}, + {file = "rapidfuzz-3.12.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:fbe7580b5fb2db8ebd53819171ff671124237a55ada3f64d20fc9a149d133960"}, + {file = "rapidfuzz-3.12.1-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:018506a53c3b20dcbda8c93d4484b9eb1764c93d5ea16be103cf6b0d8b11d860"}, + {file = "rapidfuzz-3.12.1-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:325c9c71b737fcd32e2a4e634c430c07dd3d374cfe134eded3fe46e4c6f9bf5d"}, + {file = "rapidfuzz-3.12.1-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:930756639643e3aa02d3136b6fec74e5b9370a24f8796e1065cd8a857a6a6c50"}, + {file = "rapidfuzz-3.12.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:0acbd27543b158cb915fde03877383816a9e83257832818f1e803bac9b394900"}, + {file = "rapidfuzz-3.12.1-cp39-cp39-win32.whl", hash = "sha256:80ff9283c54d7d29b2d954181e137deee89bec62f4a54675d8b6dbb6b15d3e03"}, + {file = "rapidfuzz-3.12.1-cp39-cp39-win_amd64.whl", hash = "sha256:fd37e53f0ed239d0cec27b250cec958982a8ba252ce64aa5e6052de3a82fa8db"}, + {file = "rapidfuzz-3.12.1-cp39-cp39-win_arm64.whl", hash = "sha256:4a4422e4f73a579755ab60abccb3ff148b5c224b3c7454a13ca217dfbad54da6"}, + {file = "rapidfuzz-3.12.1-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:b7cba636c32a6fc3a402d1cb2c70c6c9f8e6319380aaf15559db09d868a23e56"}, + {file = "rapidfuzz-3.12.1-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:b79286738a43e8df8420c4b30a92712dec6247430b130f8e015c3a78b6d61ac2"}, + {file = "rapidfuzz-3.12.1-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8dc1937198e7ff67e217e60bfa339f05da268d91bb15fec710452d11fe2fdf60"}, + {file = "rapidfuzz-3.12.1-pp310-pypy310_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b85817a57cf8db32dd5d2d66ccfba656d299b09eaf86234295f89f91be1a0db2"}, + {file = "rapidfuzz-3.12.1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:04283c6f3e79f13a784f844cd5b1df4f518ad0f70c789aea733d106c26e1b4fb"}, + {file = "rapidfuzz-3.12.1-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:a718f740553aad5f4daef790191511da9c6eae893ee1fc2677627e4b624ae2db"}, + {file = "rapidfuzz-3.12.1-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:cbdf145c7e4ebf2e81c794ed7a582c4acad19e886d5ad6676086369bd6760753"}, + {file = "rapidfuzz-3.12.1-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:0d03ad14a26a477be221fddc002954ae68a9e2402b9d85433f2d0a6af01aa2bb"}, + {file = "rapidfuzz-3.12.1-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f1187aeae9c89e838d2a0a2b954b4052e4897e5f62e5794ef42527bf039d469e"}, + {file = "rapidfuzz-3.12.1-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bd47dfb1bca9673a48b923b3d988b7668ee8efd0562027f58b0f2b7abf27144c"}, + {file = "rapidfuzz-3.12.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:187cdb402e223264eebed2fe671e367e636a499a7a9c82090b8d4b75aa416c2a"}, + {file = "rapidfuzz-3.12.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:d6899b41bf6c30282179f77096c1939f1454836440a8ab05b48ebf7026a3b590"}, + {file = "rapidfuzz-3.12.1.tar.gz", hash = "sha256:6a98bbca18b4a37adddf2d8201856441c26e9c981d8895491b5bc857b5f780eb"}, ] [package.extras] @@ -2832,29 +2826,29 @@ jupyter = ["ipywidgets (>=7.5.1,<9)"] [[package]] name = "ruff" -version = "0.9.3" +version = "0.9.4" description = "An extremely fast Python linter and code formatter, written in Rust." optional = false python-versions = ">=3.7" files = [ - {file = "ruff-0.9.3-py3-none-linux_armv6l.whl", hash = "sha256:7f39b879064c7d9670197d91124a75d118d00b0990586549949aae80cdc16624"}, - {file = "ruff-0.9.3-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:a187171e7c09efa4b4cc30ee5d0d55a8d6c5311b3e1b74ac5cb96cc89bafc43c"}, - {file = "ruff-0.9.3-py3-none-macosx_11_0_arm64.whl", hash = "sha256:c59ab92f8e92d6725b7ded9d4a31be3ef42688a115c6d3da9457a5bda140e2b4"}, - {file = "ruff-0.9.3-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2dc153c25e715be41bb228bc651c1e9b1a88d5c6e5ed0194fa0dfea02b026439"}, - {file = "ruff-0.9.3-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:646909a1e25e0dc28fbc529eab8eb7bb583079628e8cbe738192853dbbe43af5"}, - {file = "ruff-0.9.3-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5a5a46e09355695fbdbb30ed9889d6cf1c61b77b700a9fafc21b41f097bfbba4"}, - {file = "ruff-0.9.3-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:c4bb09d2bbb394e3730d0918c00276e79b2de70ec2a5231cd4ebb51a57df9ba1"}, - {file = "ruff-0.9.3-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:96a87ec31dc1044d8c2da2ebbed1c456d9b561e7d087734336518181b26b3aa5"}, - {file = "ruff-0.9.3-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9bb7554aca6f842645022fe2d301c264e6925baa708b392867b7a62645304df4"}, - {file = "ruff-0.9.3-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cabc332b7075a914ecea912cd1f3d4370489c8018f2c945a30bcc934e3bc06a6"}, - {file = "ruff-0.9.3-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:33866c3cc2a575cbd546f2cd02bdd466fed65118e4365ee538a3deffd6fcb730"}, - {file = "ruff-0.9.3-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:006e5de2621304c8810bcd2ee101587712fa93b4f955ed0985907a36c427e0c2"}, - {file = "ruff-0.9.3-py3-none-musllinux_1_2_i686.whl", hash = "sha256:ba6eea4459dbd6b1be4e6bfc766079fb9b8dd2e5a35aff6baee4d9b1514ea519"}, - {file = "ruff-0.9.3-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:90230a6b8055ad47d3325e9ee8f8a9ae7e273078a66401ac66df68943ced029b"}, - {file = "ruff-0.9.3-py3-none-win32.whl", hash = "sha256:eabe5eb2c19a42f4808c03b82bd313fc84d4e395133fb3fc1b1516170a31213c"}, - {file = "ruff-0.9.3-py3-none-win_amd64.whl", hash = "sha256:040ceb7f20791dfa0e78b4230ee9dce23da3b64dd5848e40e3bf3ab76468dcf4"}, - {file = "ruff-0.9.3-py3-none-win_arm64.whl", hash = "sha256:800d773f6d4d33b0a3c60e2c6ae8f4c202ea2de056365acfa519aa48acf28e0b"}, - {file = "ruff-0.9.3.tar.gz", hash = "sha256:8293f89985a090ebc3ed1064df31f3b4b56320cdfcec8b60d3295bddb955c22a"}, + {file = "ruff-0.9.4-py3-none-linux_armv6l.whl", hash = "sha256:64e73d25b954f71ff100bb70f39f1ee09e880728efb4250c632ceed4e4cdf706"}, + {file = "ruff-0.9.4-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:6ce6743ed64d9afab4fafeaea70d3631b4d4b28b592db21a5c2d1f0ef52934bf"}, + {file = "ruff-0.9.4-py3-none-macosx_11_0_arm64.whl", hash = "sha256:54499fb08408e32b57360f6f9de7157a5fec24ad79cb3f42ef2c3f3f728dfe2b"}, + {file = "ruff-0.9.4-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:37c892540108314a6f01f105040b5106aeb829fa5fb0561d2dcaf71485021137"}, + {file = "ruff-0.9.4-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:de9edf2ce4b9ddf43fd93e20ef635a900e25f622f87ed6e3047a664d0e8f810e"}, + {file = "ruff-0.9.4-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:87c90c32357c74f11deb7fbb065126d91771b207bf9bfaaee01277ca59b574ec"}, + {file = "ruff-0.9.4-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:56acd6c694da3695a7461cc55775f3a409c3815ac467279dfa126061d84b314b"}, + {file = "ruff-0.9.4-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e0c93e7d47ed951b9394cf352d6695b31498e68fd5782d6cbc282425655f687a"}, + {file = "ruff-0.9.4-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1d4c8772670aecf037d1bf7a07c39106574d143b26cfe5ed1787d2f31e800214"}, + {file = "ruff-0.9.4-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bfc5f1d7afeda8d5d37660eeca6d389b142d7f2b5a1ab659d9214ebd0e025231"}, + {file = "ruff-0.9.4-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:faa935fc00ae854d8b638c16a5f1ce881bc3f67446957dd6f2af440a5fc8526b"}, + {file = "ruff-0.9.4-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:a6c634fc6f5a0ceae1ab3e13c58183978185d131a29c425e4eaa9f40afe1e6d6"}, + {file = "ruff-0.9.4-py3-none-musllinux_1_2_i686.whl", hash = "sha256:433dedf6ddfdec7f1ac7575ec1eb9844fa60c4c8c2f8887a070672b8d353d34c"}, + {file = "ruff-0.9.4-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:d612dbd0f3a919a8cc1d12037168bfa536862066808960e0cc901404b77968f0"}, + {file = "ruff-0.9.4-py3-none-win32.whl", hash = "sha256:db1192ddda2200671f9ef61d9597fcef89d934f5d1705e571a93a67fb13a4402"}, + {file = "ruff-0.9.4-py3-none-win_amd64.whl", hash = "sha256:05bebf4cdbe3ef75430d26c375773978950bbf4ee3c95ccb5448940dc092408e"}, + {file = "ruff-0.9.4-py3-none-win_arm64.whl", hash = "sha256:585792f1e81509e38ac5123492f8875fbc36f3ede8185af0a26df348e5154f41"}, + {file = "ruff-0.9.4.tar.gz", hash = "sha256:6907ee3529244bb0ed066683e075f09285b38dd5b4039370df6ff06041ca19e7"}, ] [[package]] diff --git a/tests/integration_tests/user_tests/test_user_api_token.py b/tests/integration_tests/user_tests/test_user_api_token.py index 1fb03695c..44635addb 100644 --- a/tests/integration_tests/user_tests/test_user_api_token.py +++ b/tests/integration_tests/user_tests/test_user_api_token.py @@ -17,6 +17,25 @@ def long_live_token(api_client: TestClient, admin_token): def test_api_token_creation(api_client: TestClient, admin_token): response = api_client.post(api_routes.users_api_tokens, json={"name": "Test API Token"}, headers=admin_token) assert response.status_code == 201 + assert response.json()["token"] + + +def test_api_token_private(api_client: TestClient, admin_token): + response = api_client.post(api_routes.users_api_tokens, json={"name": "Test API Token"}, headers=admin_token) + assert response.status_code == 201 + + response = api_client.get(api_routes.users, headers=admin_token, params={"perPage": -1}) + assert response.status_code == 200 + for user in response.json()["items"]: + for user_token in user["tokens"] or []: + assert "token" not in user_token + + response = api_client.get(api_routes.users_self, headers=admin_token) + assert response.status_code == 200 + response_json = response.json() + assert response_json["tokens"] + for user_token in response_json["tokens"]: + assert "token" not in user_token def test_use_token(api_client: TestClient, long_live_token):