From 4d5550ad855e6bcfd22e0ebe0549490c6b6abd0e Mon Sep 17 00:00:00 2001 From: Hayden <64056131+hay-kot@users.noreply.github.com> Date: Sun, 1 Jan 2023 14:47:27 -0800 Subject: [PATCH] chore: mypy, ruff, extract, openapi, and recipes-scraper updates (#1968) * bump ruff and mypy * mypy fixes * bump and fix openapi * drop debug statement * bump extruct * bump recipes-scrapers --- .pre-commit-config.yaml | 2 +- mealie/app.py | 1 - mealie/core/security/security.py | 2 +- mealie/db/models/_model_base.py | 2 +- mealie/db/models/recipe/recipe.py | 12 +- mealie/db/models/users/users.py | 2 +- mealie/pkgs/img/minify.py | 4 +- mealie/repos/repository_generic.py | 19 +- mealie/repos/repository_recipes.py | 4 +- mealie/repos/seed/_abstract_seeder.py | 2 +- mealie/routes/_base/controller.py | 4 +- mealie/routes/_base/mixins.py | 6 +- .../routes/groups/controller_group_reports.py | 2 +- mealie/routes/shared/__init__.py | 4 +- mealie/routes/users/images.py | 2 +- mealie/services/backups_v2/backup_v2.py | 2 +- mealie/services/email/email_service.py | 2 +- mealie/services/exporter/_abc_exporter.py | 2 +- mealie/services/recipe/recipe_data_service.py | 2 +- mealie/services/recipe/recipe_service.py | 2 +- mealie/services/recipe/template_service.py | 2 +- mealie/services/scraper/cleaner.py | 2 +- mealie/services/scraper/recipe_scraper.py | 2 +- .../server_tasks/background_executory.py | 3 - poetry.lock | 207 ++++++++++-------- pyproject.toml | 10 +- tests/unit_tests/test_open_api.py | 4 +- 27 files changed, 173 insertions(+), 135 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index e102fb7e..2577ea4d 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -15,6 +15,6 @@ repos: hooks: - id: black - repo: https://github.com/charliermarsh/ruff-pre-commit - rev: v0.0.202 + rev: v0.0.205 hooks: - id: ruff diff --git a/mealie/app.py b/mealie/app.py index 84a34147..0687273d 100644 --- a/mealie/app.py +++ b/mealie/app.py @@ -113,7 +113,6 @@ def main(): reload=True, reload_dirs=["mealie"], reload_delay=2, - debug=True, log_level="info", use_colors=True, log_config=None, diff --git a/mealie/core/security/security.py b/mealie/core/security/security.py index b0871b82..e75c09ab 100644 --- a/mealie/core/security/security.py +++ b/mealie/core/security/security.py @@ -18,7 +18,7 @@ class UserLockedOut(Exception): ... -def create_access_token(data: dict, expires_delta: timedelta = None) -> str: +def create_access_token(data: dict, expires_delta: timedelta | None = None) -> str: settings = get_app_settings() to_encode = data.copy() diff --git a/mealie/db/models/_model_base.py b/mealie/db/models/_model_base.py index 5a39dcfe..7063f30c 100644 --- a/mealie/db/models/_model_base.py +++ b/mealie/db/models/_model_base.py @@ -23,7 +23,7 @@ class BaseMixins: self.__init__(*args, **kwarg) @classmethod - def get_ref(cls, match_value: str, match_attr: str = None, session: Session = None): + def get_ref(cls, match_value: str, match_attr: str | None = None, session: Session | None = None): match_attr = match_attr or cls.Config.get_attr # type: ignore if match_value is None or session is None: diff --git a/mealie/db/models/recipe/recipe.py b/mealie/db/models/recipe/recipe.py index 2e001855..648011a6 100644 --- a/mealie/db/models/recipe/recipe.py +++ b/mealie/db/models/recipe/recipe.py @@ -136,12 +136,12 @@ class RecipeModel(SqlAlchemyBase, BaseMixins): def __init__( self, session, - assets: list = None, - notes: list[dict] = None, - nutrition: dict = None, - recipe_ingredient: list[dict] = None, - recipe_instructions: list[dict] = None, - settings: dict = None, + assets: list | None = None, + notes: list[dict] | None = None, + nutrition: dict | None = None, + recipe_ingredient: list[dict] | None = None, + recipe_instructions: list[dict] | None = None, + settings: dict | None = None, **_, ) -> None: self.nutrition = Nutrition(**nutrition) if nutrition else Nutrition() diff --git a/mealie/db/models/users/users.py b/mealie/db/models/users/users.py index f77fcf56..747aefcd 100644 --- a/mealie/db/models/users/users.py +++ b/mealie/db/models/users/users.py @@ -71,7 +71,7 @@ class User(SqlAlchemyBase, BaseMixins): } @auto_init() - def __init__(self, session, full_name, password, group: str = None, **kwargs) -> None: + def __init__(self, session, full_name, password, group: str | None = None, **kwargs) -> None: if group is None: settings = get_app_settings() group = settings.DEFAULT_GROUP diff --git a/mealie/pkgs/img/minify.py b/mealie/pkgs/img/minify.py index 0504a1bd..23c3eb06 100644 --- a/mealie/pkgs/img/minify.py +++ b/mealie/pkgs/img/minify.py @@ -35,7 +35,7 @@ class MinifierOptions: class ABCMinifier(ABC): - def __init__(self, purge=False, opts: MinifierOptions = None, logger: Logger = None): + def __init__(self, purge=False, opts: MinifierOptions | None = None, logger: Logger | None = None): self._purge = purge self._opts = opts or MinifierOptions() self._logger = logger or Logger("Minifier") @@ -60,7 +60,7 @@ class ABCMinifier(ABC): class PillowMinifier(ABCMinifier): @staticmethod - def to_webp(image_file: Path, dest: Path = None, quality: int = 100) -> Path: + def to_webp(image_file: Path, dest: Path | None = None, quality: int = 100) -> Path: """ Converts an image to the webp format in-place. The original image is not removed By default, the quality is set to 100. diff --git a/mealie/repos/repository_generic.py b/mealie/repos/repository_generic.py index 8c10cb11..2ca2ce64 100644 --- a/mealie/repos/repository_generic.py +++ b/mealie/repos/repository_generic.py @@ -64,7 +64,12 @@ class RepositoryGeneric(Generic[Schema, Model]): return {**dct, **kwargs} def get_all( - self, limit: int = None, order_by: str = None, order_descending: bool = True, start=0, override=None + self, + limit: int | None = None, + order_by: str | None = None, + order_descending: bool = True, + start=0, + override=None, ) -> list[Schema]: self.logger.warning('"get_all" method is deprecated; use "page_all" instead') @@ -95,9 +100,9 @@ class RepositoryGeneric(Generic[Schema, Model]): self, query_by: dict[str, str | bool | int | UUID4], start=0, - limit: int = None, + limit: int | None = None, override_schema=None, - order_by: str = None, + order_by: str | None = None, ) -> list[Schema]: # sourcery skip: remove-unnecessary-cast eff_schema = override_schema or self.schema @@ -112,7 +117,7 @@ class RepositoryGeneric(Generic[Schema, Model]): return [eff_schema.from_orm(x) for x in q.offset(start).limit(limit).all()] - def _query_one(self, match_value: str | int | UUID4, match_key: str = None) -> Model: + def _query_one(self, match_value: str | int | UUID4, match_key: str | None = None) -> Model: """ Query the sql database for one item an return the sql alchemy model object. If no match key is provided the primary_key attribute will be used. @@ -123,7 +128,9 @@ class RepositoryGeneric(Generic[Schema, Model]): fltr = self._filter_builder(**{match_key: match_value}) return self._query().filter_by(**fltr).one() - def get_one(self, value: str | int | UUID4, key: str = None, any_case=False, override_schema=None) -> Schema | None: + def get_one( + self, value: str | int | UUID4, key: str | None = None, any_case=False, override_schema=None + ) -> Schema | None: key = key or self.primary_key q = self.session.query(self.model) @@ -220,7 +227,7 @@ class RepositoryGeneric(Generic[Schema, Model]): def _count_attribute( self, attribute_name: str, - attr_match: str = None, + attr_match: str | None = None, count=True, override_schema=None, ) -> int | list[Schema]: # sourcery skip: assign-if-exp diff --git a/mealie/repos/repository_recipes.py b/mealie/repos/repository_recipes.py index 790a0b50..0f780ee7 100644 --- a/mealie/repos/repository_recipes.py +++ b/mealie/repos/repository_recipes.py @@ -42,7 +42,7 @@ class RepositoryRecipes(RepositoryGeneric[Recipe, RecipeModel]): def by_group(self, group_id: UUID) -> "RepositoryRecipes": return super().by_group(group_id) # type: ignore - def get_all_public(self, limit: int = None, order_by: str = None, start=0, override_schema=None): + def get_all_public(self, limit: int | None = None, order_by: str | None = None, start=0, override_schema=None): eff_schema = override_schema or self.schema if order_by: @@ -69,7 +69,7 @@ class RepositoryRecipes(RepositoryGeneric[Recipe, RecipeModel]): .all() ] - def update_image(self, slug: str, _: str = None) -> int: + def update_image(self, slug: str, _: str | None = None) -> int: entry: RecipeModel = self._query_one(match_value=slug) entry.image = randint(0, 255) self.session.commit() diff --git a/mealie/repos/seed/_abstract_seeder.py b/mealie/repos/seed/_abstract_seeder.py index 14878c97..6f06d371 100644 --- a/mealie/repos/seed/_abstract_seeder.py +++ b/mealie/repos/seed/_abstract_seeder.py @@ -13,7 +13,7 @@ class AbstractSeeder(ABC): Abstract class for seeding data. """ - def __init__(self, db: AllRepositories, logger: Logger = None, group_id: UUID4 = None): + def __init__(self, db: AllRepositories, logger: Logger | None = None, group_id: UUID4 | None = None): """ Initialize the abstract seeder. :param db_conn: Database connection. diff --git a/mealie/routes/_base/controller.py b/mealie/routes/_base/controller.py index 551ec6d9..e5b02940 100644 --- a/mealie/routes/_base/controller.py +++ b/mealie/routes/_base/controller.py @@ -36,7 +36,7 @@ def controller(router: APIRouter, *urls: str) -> Callable[[type[T]], type[T]]: return decorator -def _cbv(router: APIRouter, cls: type[T], *urls: str, instance: Any = None) -> type[T]: +def _cbv(router: APIRouter, cls: type[T], *urls: str, instance: Any | None = None) -> type[T]: """ Replaces any methods of the provided class `cls` that are endpoints of routes in `router` with updated function calls that will properly inject an instance of `cls`. @@ -46,7 +46,7 @@ def _cbv(router: APIRouter, cls: type[T], *urls: str, instance: Any = None) -> t return cls -def _init_cbv(cls: type[Any], instance: Any = None) -> None: +def _init_cbv(cls: type[Any], instance: Any | None = None) -> None: """ Idempotently modifies the provided `cls`, performing the following modifications: * The `__init__` function is updated to set any class-annotated dependencies as instance attributes diff --git a/mealie/routes/_base/mixins.py b/mealie/routes/_base/mixins.py index 6729117a..240564a1 100644 --- a/mealie/routes/_base/mixins.py +++ b/mealie/routes/_base/mixins.py @@ -34,8 +34,8 @@ class HttpRepo(Generic[C, R, U]): self, repo: RepositoryGeneric, logger: Logger, - exception_msgs: Callable[[type[Exception]], str] = None, - default_message: str = None, + exception_msgs: Callable[[type[Exception]], str] | None = None, + default_message: str | None = None, ) -> None: self.repo = repo @@ -72,7 +72,7 @@ class HttpRepo(Generic[C, R, U]): return item - def get_one(self, item_id: int | str | UUID4, key: str = None) -> R: + def get_one(self, item_id: int | str | UUID4, key: str | None = None) -> R: item = self.repo.get_one(item_id, key) if not item: diff --git a/mealie/routes/groups/controller_group_reports.py b/mealie/routes/groups/controller_group_reports.py index a7a6d4cb..65ce2a0b 100644 --- a/mealie/routes/groups/controller_group_reports.py +++ b/mealie/routes/groups/controller_group_reports.py @@ -33,7 +33,7 @@ class GroupReportsController(BaseUserController): ) @router.get("", response_model=list[ReportSummary]) - def get_all(self, report_type: ReportCategory = None): + def get_all(self, report_type: ReportCategory | None = None): return self.repo.multi_query({"group_id": self.group_id, "category": report_type}, limit=9999) @router.get("/{item_id}", response_model=ReportOut) diff --git a/mealie/routes/shared/__init__.py b/mealie/routes/shared/__init__.py index 1294fb6a..4baabe88 100644 --- a/mealie/routes/shared/__init__.py +++ b/mealie/routes/shared/__init__.py @@ -22,7 +22,7 @@ class RecipeSharedController(BaseUserController): return HttpRepo[RecipeShareTokenSave, RecipeShareToken, RecipeShareTokenCreate](self.repo, self.logger) @router.get("", response_model=list[RecipeShareTokenSummary]) - def get_all(self, recipe_id: UUID4 = None): + def get_all(self, recipe_id: UUID4 | None = None): if recipe_id: return self.repo.multi_query({"recipe_id": recipe_id}, override_schema=RecipeShareTokenSummary) else: @@ -38,5 +38,5 @@ class RecipeSharedController(BaseUserController): return self.mixins.get_one(item_id) @router.delete("/{item_id}") - def delete_one(self, item_id: UUID4 = None) -> None: + def delete_one(self, item_id: UUID4 | None = None) -> None: return self.mixins.delete_one(item_id) diff --git a/mealie/routes/users/images.py b/mealie/routes/users/images.py index 6be6496a..2f68a6b1 100644 --- a/mealie/routes/users/images.py +++ b/mealie/routes/users/images.py @@ -37,5 +37,5 @@ class UserImageController(BaseUserController): self.repos.users.patch(id, {"cache_key": cache.new_key()}) - if not dest.is_file: + if not dest.is_file(): raise HTTPException(status.HTTP_500_INTERNAL_SERVER_ERROR) diff --git a/mealie/services/backups_v2/backup_v2.py b/mealie/services/backups_v2/backup_v2.py index 00233f3a..1b9885c5 100644 --- a/mealie/services/backups_v2/backup_v2.py +++ b/mealie/services/backups_v2/backup_v2.py @@ -14,7 +14,7 @@ class BackupSchemaMismatch(Exception): class BackupV2(BaseService): - def __init__(self, db_url: str = None) -> None: + def __init__(self, db_url: str | None = None) -> None: super().__init__() # type - one of these has to be a string diff --git a/mealie/services/email/email_service.py b/mealie/services/email/email_service.py index c93ee1f2..b9766127 100644 --- a/mealie/services/email/email_service.py +++ b/mealie/services/email/email_service.py @@ -28,7 +28,7 @@ class EmailTemplate(BaseModel): class EmailService(BaseService): - def __init__(self, sender: ABCEmailSender = None) -> None: + def __init__(self, sender: ABCEmailSender | None = None) -> None: self.templates_dir = CWD / "templates" self.default_template = self.templates_dir / "default.html" self.sender: ABCEmailSender = sender or DefaultEmailSender() diff --git a/mealie/services/exporter/_abc_exporter.py b/mealie/services/exporter/_abc_exporter.py index 2e375275..fcd37154 100644 --- a/mealie/services/exporter/_abc_exporter.py +++ b/mealie/services/exporter/_abc_exporter.py @@ -79,7 +79,7 @@ class ABCExporter(BaseService): zip (zipfile.ZipFile): """ - def func(source_dir: Path, dest_dir: str, ignore_ext: set[str] = None) -> None: + def func(source_dir: Path, dest_dir: str, ignore_ext: set[str] | None = None) -> None: ignore_ext = ignore_ext or set() for source_file in source_dir.iterdir(): diff --git a/mealie/services/recipe/recipe_data_service.py b/mealie/services/recipe/recipe_data_service.py index c21ead0a..13a3f71c 100644 --- a/mealie/services/recipe/recipe_data_service.py +++ b/mealie/services/recipe/recipe_data_service.py @@ -51,7 +51,7 @@ class InvalidDomainError(Exception): class RecipeDataService(BaseService): minifier: img.ABCMinifier - def __init__(self, recipe_id: UUID4, group_id: UUID4 = None) -> None: + def __init__(self, recipe_id: UUID4, group_id: UUID4 | None = None) -> None: """ RecipeDataService is a service that consolidates the reading/writing actions related to assets, and images for a recipe. diff --git a/mealie/services/recipe/recipe_service.py b/mealie/services/recipe/recipe_service.py index a2fa9c9d..3df22c39 100644 --- a/mealie/services/recipe/recipe_service.py +++ b/mealie/services/recipe/recipe_service.py @@ -84,7 +84,7 @@ class RecipeService(BaseService): self.logger.info(f"Recipe Directory Removed: {recipe.slug}") @staticmethod - def _recipe_creation_factory(user: PrivateUser, name: str, additional_attrs: dict = None) -> Recipe: + def _recipe_creation_factory(user: PrivateUser, name: str, additional_attrs: dict | None = None) -> Recipe: """ The main creation point for recipes. The factor method returns an instance of the Recipe Schema class with the appropriate defaults set. Recipes should not be created diff --git a/mealie/services/recipe/template_service.py b/mealie/services/recipe/template_service.py index 5649be88..3242c4ac 100644 --- a/mealie/services/recipe/template_service.py +++ b/mealie/services/recipe/template_service.py @@ -96,7 +96,7 @@ class TemplateService(BaseService): return save_path - def _render_jinja2(self, recipe: Recipe, j2_template: str = None) -> Path: + def _render_jinja2(self, recipe: Recipe, j2_template: str | None = None) -> Path: """ Renders a Jinja2 Template in a temporary directory and returns the path to the file. diff --git a/mealie/services/scraper/cleaner.py b/mealie/services/scraper/cleaner.py index f490e7bf..63c94aa3 100644 --- a/mealie/services/scraper/cleaner.py +++ b/mealie/services/scraper/cleaner.py @@ -229,7 +229,7 @@ def _sanitize_instruction_text(line: str | dict) -> str: return clean_line -def clean_ingredients(ingredients: list | str | None, default: list = None) -> list[str]: +def clean_ingredients(ingredients: list | str | None, default: list | None = None) -> list[str]: """ ingredient attempts to parse the ingredients field from a recipe and return a list of diff --git a/mealie/services/scraper/recipe_scraper.py b/mealie/services/scraper/recipe_scraper.py index 78edee12..ceb3e346 100644 --- a/mealie/services/scraper/recipe_scraper.py +++ b/mealie/services/scraper/recipe_scraper.py @@ -12,7 +12,7 @@ class RecipeScraper: # List of recipe scrapers. Note that order matters scrapers: list[type[ABCScraperStrategy]] - def __init__(self, scrapers: list[type[ABCScraperStrategy]] = None) -> None: + def __init__(self, scrapers: list[type[ABCScraperStrategy]] | None = None) -> None: if scrapers is None: scrapers = [ RecipeScraperPackage, diff --git a/mealie/services/server_tasks/background_executory.py b/mealie/services/server_tasks/background_executory.py index 57e076da..f6463722 100644 --- a/mealie/services/server_tasks/background_executory.py +++ b/mealie/services/server_tasks/background_executory.py @@ -20,9 +20,6 @@ class BackgroundExecutor: self.repos = repos self.background_tasks = bg - def populate_item(self, _: int) -> ServerTask: - pass - def dispatch(self, task_name: ServerTaskNames, func: Callable, *args: Any, **kwargs: Any) -> ServerTask: """The dispatch function is a wrapper around the BackgroundTasks class in Starlett. It directly calls the add_task function and your task will be run in the background. This function all passes the id required diff --git a/poetry.lock b/poetry.lock index c7503dbe..db671660 100644 --- a/poetry.lock +++ b/poetry.lock @@ -433,14 +433,14 @@ test = ["pytest (>=6)"] [[package]] name = "extruct" -version = "0.13.0" +version = "0.14.0" description = "Extract embedded metadata from HTML markup" category = "main" optional = false python-versions = "*" files = [ - {file = "extruct-0.13.0-py2.py3-none-any.whl", hash = "sha256:fe19b9aefdb4dfbf828c2b082b81a363a03a44c7591c2d6b62ca225cb8f8c0be"}, - {file = "extruct-0.13.0.tar.gz", hash = "sha256:50a5b5bac4c5e19ecf682bf63a28fde0b1bb57433df7057371f60b58c94a2c64"}, + {file = "extruct-0.14.0-py2.py3-none-any.whl", hash = "sha256:22739b23a7fd66239137838b8cde7b15ce838ad7a0e0721dba86058df206a2da"}, + {file = "extruct-0.14.0.tar.gz", hash = "sha256:4c74a3f0c6829252fa40b3a1c7364c966265fd4c0f0dbcef019d1b839e3434bf"}, ] [package.dependencies] @@ -449,8 +449,7 @@ jstyleson = "*" lxml = "*" mf2py = "*" pyrdfa3 = "*" -rdflib = "*" -rdflib-jsonld = "*" +rdflib = {version = ">=6.0.0", markers = "python_version >= \"3.7\""} six = "*" w3lib = "*" @@ -798,6 +797,22 @@ docs = ["jaraco.packaging (>=9)", "rst.linker (>=1.9)", "sphinx"] perf = ["ipython"] testing = ["flufl.flake8", "importlib-resources (>=1.3)", "packaging", "pyfakefs", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-flake8", "pytest-mypy (>=0.9.1)", "pytest-perf (>=0.9.2)"] +[[package]] +name = "importlib-resources" +version = "5.10.2" +description = "Read resources from Python packages" +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + {file = "importlib_resources-5.10.2-py3-none-any.whl", hash = "sha256:7d543798b0beca10b6a01ac7cafda9f822c54db9e8376a6bf57e0cbd74d486b6"}, + {file = "importlib_resources-5.10.2.tar.gz", hash = "sha256:e4a96c8cc0339647ff9a5e0550d9f276fc5a01ffa276012b58ec108cfd7b8484"}, +] + +[package.extras] +docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] +testing = ["flake8 (<5)", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-flake8", "pytest-mypy (>=0.9.1)"] + [[package]] name = "iniconfig" version = "1.1.1" @@ -881,6 +896,24 @@ pyrsistent = ">=0.14.0,<0.17.0 || >0.17.0,<0.17.1 || >0.17.1,<0.17.2 || >0.17.2" format = ["fqdn", "idna", "isoduration", "jsonpointer (>1.13)", "rfc3339-validator", "rfc3987", "uri-template", "webcolors (>=1.11)"] format-nongpl = ["fqdn", "idna", "isoduration", "jsonpointer (>1.13)", "rfc3339-validator", "rfc3986-validator (>0.1.0)", "uri-template", "webcolors (>=1.11)"] +[[package]] +name = "jsonschema-spec" +version = "0.1.2" +description = "JSONSchema Spec with object-oriented paths" +category = "dev" +optional = false +python-versions = ">=3.7.0,<4.0.0" +files = [ + {file = "jsonschema-spec-0.1.2.tar.gz", hash = "sha256:780a22d517cdc857d9714a80d8349c546945063f20853ea32ba7f85bc643ec7d"}, + {file = "jsonschema_spec-0.1.2-py3-none-any.whl", hash = "sha256:1e525177574c23ae0f55cd62382632a083a0339928f0ca846a975a4da9851cec"}, +] + +[package.dependencies] +jsonschema = ">=4.0.0,<5.0.0" +pathable = ">=0.4.1,<0.5.0" +PyYAML = ">=5.1" +typing-extensions = ">=4.3.0,<5.0.0" + [[package]] name = "jstyleson" version = "0.0.2" @@ -1211,35 +1244,42 @@ files = [ [[package]] name = "mypy" -version = "0.960" +version = "0.991" description = "Optional static typing for Python" category = "dev" optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" files = [ - {file = "mypy-0.960-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:3a3e525cd76c2c4f90f1449fd034ba21fcca68050ff7c8397bb7dd25dd8b8248"}, - {file = "mypy-0.960-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:7a76dc4f91e92db119b1be293892df8379b08fd31795bb44e0ff84256d34c251"}, - {file = "mypy-0.960-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ffdad80a92c100d1b0fe3d3cf1a4724136029a29afe8566404c0146747114382"}, - {file = "mypy-0.960-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:7d390248ec07fa344b9f365e6ed9d205bd0205e485c555bed37c4235c868e9d5"}, - {file = "mypy-0.960-cp310-cp310-win_amd64.whl", hash = "sha256:925aa84369a07846b7f3b8556ccade1f371aa554f2bd4fb31cb97a24b73b036e"}, - {file = "mypy-0.960-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:239d6b2242d6c7f5822163ee082ef7a28ee02e7ac86c35593ef923796826a385"}, - {file = "mypy-0.960-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:f1ba54d440d4feee49d8768ea952137316d454b15301c44403db3f2cb51af024"}, - {file = "mypy-0.960-cp36-cp36m-win_amd64.whl", hash = "sha256:cb7752b24528c118a7403ee955b6a578bfcf5879d5ee91790667c8ea511d2085"}, - {file = "mypy-0.960-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:826a2917c275e2ee05b7c7b736c1e6549a35b7ea5a198ca457f8c2ebea2cbecf"}, - {file = "mypy-0.960-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:3eabcbd2525f295da322dff8175258f3fc4c3eb53f6d1929644ef4d99b92e72d"}, - {file = "mypy-0.960-cp37-cp37m-win_amd64.whl", hash = "sha256:f47322796c412271f5aea48381a528a613f33e0a115452d03ae35d673e6064f8"}, - {file = "mypy-0.960-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:2c7f8bb9619290836a4e167e2ef1f2cf14d70e0bc36c04441e41487456561409"}, - {file = "mypy-0.960-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:fbfb873cf2b8d8c3c513367febde932e061a5f73f762896826ba06391d932b2a"}, - {file = "mypy-0.960-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:cc537885891382e08129d9862553b3d00d4be3eb15b8cae9e2466452f52b0117"}, - {file = "mypy-0.960-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:481f98c6b24383188c928f33dd2f0776690807e12e9989dd0419edd5c74aa53b"}, - {file = "mypy-0.960-cp38-cp38-win_amd64.whl", hash = "sha256:29dc94d9215c3eb80ac3c2ad29d0c22628accfb060348fd23d73abe3ace6c10d"}, - {file = "mypy-0.960-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:33d53a232bb79057f33332dbbb6393e68acbcb776d2f571ba4b1d50a2c8ba873"}, - {file = "mypy-0.960-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:8d645e9e7f7a5da3ec3bbcc314ebb9bb22c7ce39e70367830eb3c08d0140b9ce"}, - {file = "mypy-0.960-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:85cf2b14d32b61db24ade8ac9ae7691bdfc572a403e3cb8537da936e74713275"}, - {file = "mypy-0.960-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:a85a20b43fa69efc0b955eba1db435e2ffecb1ca695fe359768e0503b91ea89f"}, - {file = "mypy-0.960-cp39-cp39-win_amd64.whl", hash = "sha256:0ebfb3f414204b98c06791af37a3a96772203da60636e2897408517fcfeee7a8"}, - {file = "mypy-0.960-py3-none-any.whl", hash = "sha256:bfd4f6536bd384c27c392a8b8f790fd0ed5c0cf2f63fc2fed7bce56751d53026"}, - {file = "mypy-0.960.tar.gz", hash = "sha256:d4fccf04c1acf750babd74252e0f2db6bd2ac3aa8fe960797d9f3ef41cf2bfd4"}, + {file = "mypy-0.991-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:7d17e0a9707d0772f4a7b878f04b4fd11f6f5bcb9b3813975a9b13c9332153ab"}, + {file = "mypy-0.991-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0714258640194d75677e86c786e80ccf294972cc76885d3ebbb560f11db0003d"}, + {file = "mypy-0.991-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:0c8f3be99e8a8bd403caa8c03be619544bc2c77a7093685dcf308c6b109426c6"}, + {file = "mypy-0.991-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc9ec663ed6c8f15f4ae9d3c04c989b744436c16d26580eaa760ae9dd5d662eb"}, + {file = "mypy-0.991-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:4307270436fd7694b41f913eb09210faff27ea4979ecbcd849e57d2da2f65305"}, + {file = "mypy-0.991-cp310-cp310-win_amd64.whl", hash = "sha256:901c2c269c616e6cb0998b33d4adbb4a6af0ac4ce5cd078afd7bc95830e62c1c"}, + {file = "mypy-0.991-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:d13674f3fb73805ba0c45eb6c0c3053d218aa1f7abead6e446d474529aafc372"}, + {file = "mypy-0.991-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:1c8cd4fb70e8584ca1ed5805cbc7c017a3d1a29fb450621089ffed3e99d1857f"}, + {file = "mypy-0.991-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:209ee89fbb0deed518605edddd234af80506aec932ad28d73c08f1400ef80a33"}, + {file = "mypy-0.991-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:37bd02ebf9d10e05b00d71302d2c2e6ca333e6c2a8584a98c00e038db8121f05"}, + {file = "mypy-0.991-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:26efb2fcc6b67e4d5a55561f39176821d2adf88f2745ddc72751b7890f3194ad"}, + {file = "mypy-0.991-cp311-cp311-win_amd64.whl", hash = "sha256:3a700330b567114b673cf8ee7388e949f843b356a73b5ab22dd7cff4742a5297"}, + {file = "mypy-0.991-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:1f7d1a520373e2272b10796c3ff721ea1a0712288cafaa95931e66aa15798813"}, + {file = "mypy-0.991-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:641411733b127c3e0dab94c45af15fea99e4468f99ac88b39efb1ad677da5711"}, + {file = "mypy-0.991-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:3d80e36b7d7a9259b740be6d8d906221789b0d836201af4234093cae89ced0cd"}, + {file = "mypy-0.991-cp37-cp37m-win_amd64.whl", hash = "sha256:e62ebaad93be3ad1a828a11e90f0e76f15449371ffeecca4a0a0b9adc99abcef"}, + {file = "mypy-0.991-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:b86ce2c1866a748c0f6faca5232059f881cda6dda2a893b9a8373353cfe3715a"}, + {file = "mypy-0.991-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:ac6e503823143464538efda0e8e356d871557ef60ccd38f8824a4257acc18d93"}, + {file = "mypy-0.991-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:0cca5adf694af539aeaa6ac633a7afe9bbd760df9d31be55ab780b77ab5ae8bf"}, + {file = "mypy-0.991-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a12c56bf73cdab116df96e4ff39610b92a348cc99a1307e1da3c3768bbb5b135"}, + {file = "mypy-0.991-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:652b651d42f155033a1967739788c436491b577b6a44e4c39fb340d0ee7f0d70"}, + {file = "mypy-0.991-cp38-cp38-win_amd64.whl", hash = "sha256:4175593dc25d9da12f7de8de873a33f9b2b8bdb4e827a7cae952e5b1a342e243"}, + {file = "mypy-0.991-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:98e781cd35c0acf33eb0295e8b9c55cdbef64fcb35f6d3aa2186f289bed6e80d"}, + {file = "mypy-0.991-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6d7464bac72a85cb3491c7e92b5b62f3dcccb8af26826257760a552a5e244aa5"}, + {file = "mypy-0.991-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:c9166b3f81a10cdf9b49f2d594b21b31adadb3d5e9db9b834866c3258b695be3"}, + {file = "mypy-0.991-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b8472f736a5bfb159a5e36740847808f6f5b659960115ff29c7cecec1741c648"}, + {file = "mypy-0.991-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:5e80e758243b97b618cdf22004beb09e8a2de1af481382e4d84bc52152d1c476"}, + {file = "mypy-0.991-cp39-cp39-win_amd64.whl", hash = "sha256:74e259b5c19f70d35fcc1ad3d56499065c601dfe94ff67ae48b85596b9ec1461"}, + {file = "mypy-0.991-py3-none-any.whl", hash = "sha256:de32edc9b0a7e67c2775e574cb061a537660e51210fbf6006b0b36ea695ae9bb"}, + {file = "mypy-0.991.tar.gz", hash = "sha256:3c0165ba8f354a6d9881809ef29f1a9318a236a6d81c690094c5df32107bde06"}, ] [package.dependencies] @@ -1249,6 +1289,7 @@ typing-extensions = ">=3.10" [package.extras] dmypy = ["psutil (>=4.0)"] +install-types = ["pip"] python2 = ["typed-ast (>=1.4.0,<2)"] reports = ["lxml"] @@ -1298,18 +1339,19 @@ signedtoken = ["cryptography (>=3.0.0)", "pyjwt (>=2.0.0,<3)"] [[package]] name = "openapi-schema-validator" -version = "0.2.3" +version = "0.3.4" description = "OpenAPI schema validation for Python" category = "dev" optional = false python-versions = ">=3.7.0,<4.0.0" files = [ - {file = "openapi-schema-validator-0.2.3.tar.gz", hash = "sha256:2c64907728c3ef78e23711c8840a423f0b241588c9ed929855e4b2d1bb0cf5f2"}, - {file = "openapi_schema_validator-0.2.3-py3-none-any.whl", hash = "sha256:9bae709212a19222892cabcc60cafd903cbf4b220223f48583afa3c0e3cc6fc4"}, + {file = "openapi-schema-validator-0.3.4.tar.gz", hash = "sha256:7cf27585dd7970b7257cefe48e1a3a10d4e34421831bdb472d96967433bc27bd"}, + {file = "openapi_schema_validator-0.3.4-py3-none-any.whl", hash = "sha256:34fbd14b7501abe25e64d7b4624a9db02cde1a578d285b3da6f34b290cdf0b3a"}, ] [package.dependencies] -jsonschema = ">=3.0.0,<5.0.0" +attrs = ">=19.2.0" +jsonschema = ">=4.0.0,<5.0.0" [package.extras] isodate = ["isodate"] @@ -1318,21 +1360,23 @@ strict-rfc3339 = ["strict-rfc3339"] [[package]] name = "openapi-spec-validator" -version = "0.4.0" -description = "OpenAPI 2.0 (aka Swagger) and OpenAPI 3.0 spec validator" +version = "0.5.1" +description = "OpenAPI 2.0 (aka Swagger) and OpenAPI 3 spec validator" category = "dev" optional = false python-versions = ">=3.7.0,<4.0.0" files = [ - {file = "openapi-spec-validator-0.4.0.tar.gz", hash = "sha256:97f258850afc97b048f7c2653855e0f88fa66ac103c2be5077c7960aca2ad49a"}, - {file = "openapi_spec_validator-0.4.0-py3-none-any.whl", hash = "sha256:06900ac4d546a1df3642a779da0055be58869c598e3042a2fef067cfd99d04d0"}, + {file = "openapi-spec-validator-0.5.1.tar.gz", hash = "sha256:8248634bad1f23cac5d5a34e193ab36e23914057ca69e91a1ede5af75552c465"}, + {file = "openapi_spec_validator-0.5.1-py3-none-any.whl", hash = "sha256:4a8aee1e45b1ac868e07ab25e18828fe9837baddd29a8e20fdb3d3c61c8eea3d"}, ] [package.dependencies] -jsonschema = ">=3.2.0,<5.0.0" -openapi-schema-validator = ">=0.2.0,<0.3.0" +importlib-resources = ">=5.8.0,<6.0.0" +jsonschema = ">=4.0.0,<5.0.0" +jsonschema-spec = ">=0.1.1,<0.2.0" +lazy-object-proxy = ">=1.7.1,<2.0.0" +openapi-schema-validator = ">=0.3.2,<0.4.0" PyYAML = ">=5.1" -setuptools = "*" [package.extras] requests = ["requests"] @@ -1355,10 +1399,7 @@ files = [ {file = "orjson-3.8.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:b68a42a31f8429728183c21fb440c21de1b62e5378d0d73f280e2d894ef8942e"}, {file = "orjson-3.8.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:ff13410ddbdda5d4197a4a4c09969cb78c722a67550f0a63c02c07aadc624833"}, {file = "orjson-3.8.0-cp310-none-win_amd64.whl", hash = "sha256:2d81e6e56bbea44be0222fb53f7b255b4e7426290516771592738ca01dbd053b"}, - {file = "orjson-3.8.0-cp311-cp311-macosx_10_7_x86_64.whl", hash = "sha256:200eae21c33f1f8b02a11f5d88d76950cd6fd986d88f1afe497a8ae2627c49aa"}, - {file = "orjson-3.8.0-cp311-cp311-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl", hash = "sha256:9529990f3eab54b976d327360aa1ff244a4b12cb5e4c5b3712fcdd96e8fe56d4"}, {file = "orjson-3.8.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:e2defd9527651ad39ec20ae03c812adf47ef7662bdd6bc07dabb10888d70dc62"}, - {file = "orjson-3.8.0-cp311-none-win_amd64.whl", hash = "sha256:b21c7af0ff6228ca7105f54f0800636eb49201133e15ddb80ac20c1ce973ef07"}, {file = "orjson-3.8.0-cp37-cp37m-macosx_10_7_x86_64.whl", hash = "sha256:9e6ac22cec72d5b39035b566e4b86c74b84866f12b5b0b6541506a080fb67d6d"}, {file = "orjson-3.8.0-cp37-cp37m-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl", hash = "sha256:e2f4a5542f50e3d336a18cb224fc757245ca66b1fd0b70b5dd4471b8ff5f2b0e"}, {file = "orjson-3.8.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e1418feeb8b698b9224b1f024555895169d481604d5d884498c1838d7412794c"}, @@ -1425,6 +1466,18 @@ bcrypt = ["bcrypt (>=3.1.0)"] build-docs = ["cloud-sptheme (>=1.10.1)", "sphinx (>=1.6)", "sphinxcontrib-fulltoc (>=1.2.0)"] totp = ["cryptography"] +[[package]] +name = "pathable" +version = "0.4.3" +description = "Object-oriented paths" +category = "dev" +optional = false +python-versions = ">=3.7.0,<4.0.0" +files = [ + {file = "pathable-0.4.3-py3-none-any.whl", hash = "sha256:cdd7b1f9d7d5c8b8d3315dbf5a86b2596053ae845f056f57d97c0eefff84da14"}, + {file = "pathable-0.4.3.tar.gz", hash = "sha256:5c869d315be50776cc8a993f3af43e0c60dc01506b399643f919034ebf4cdcab"}, +] + [[package]] name = "pathspec" version = "0.9.0" @@ -1571,7 +1624,6 @@ python-versions = ">=3.6" files = [ {file = "psycopg2-binary-2.9.3.tar.gz", hash = "sha256:761df5313dc15da1502b21453642d7599d26be88bff659382f8f9747c7ebea4e"}, {file = "psycopg2_binary-2.9.3-cp310-cp310-macosx_10_14_x86_64.macosx_10_9_intel.macosx_10_9_x86_64.macosx_10_10_intel.macosx_10_10_x86_64.whl", hash = "sha256:539b28661b71da7c0e428692438efbcd048ca21ea81af618d845e06ebfd29478"}, - {file = "psycopg2_binary-2.9.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2f2534ab7dc7e776a263b463a16e189eb30e85ec9bbe1bff9e78dae802608932"}, {file = "psycopg2_binary-2.9.3-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6e82d38390a03da28c7985b394ec3f56873174e2c88130e6966cb1c946508e65"}, {file = "psycopg2_binary-2.9.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:57804fc02ca3ce0dbfbef35c4b3a4a774da66d66ea20f4bda601294ad2ea6092"}, {file = "psycopg2_binary-2.9.3-cp310-cp310-manylinux_2_24_aarch64.whl", hash = "sha256:083a55275f09a62b8ca4902dd11f4b33075b743cf0d360419e2051a8a5d5ff76"}, @@ -1605,7 +1657,6 @@ files = [ {file = "psycopg2_binary-2.9.3-cp37-cp37m-win32.whl", hash = "sha256:adf20d9a67e0b6393eac162eb81fb10bc9130a80540f4df7e7355c2dd4af9fba"}, {file = "psycopg2_binary-2.9.3-cp37-cp37m-win_amd64.whl", hash = "sha256:2f9ffd643bc7349eeb664eba8864d9e01f057880f510e4681ba40a6532f93c71"}, {file = "psycopg2_binary-2.9.3-cp38-cp38-macosx_10_14_x86_64.macosx_10_9_intel.macosx_10_9_x86_64.macosx_10_10_intel.macosx_10_10_x86_64.whl", hash = "sha256:def68d7c21984b0f8218e8a15d514f714d96904265164f75f8d3a70f9c295667"}, - {file = "psycopg2_binary-2.9.3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:e6aa71ae45f952a2205377773e76f4e3f27951df38e69a4c95440c779e013560"}, {file = "psycopg2_binary-2.9.3-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dffc08ca91c9ac09008870c9eb77b00a46b3378719584059c034b8945e26b272"}, {file = "psycopg2_binary-2.9.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:280b0bb5cbfe8039205c7981cceb006156a675362a00fe29b16fbc264e242834"}, {file = "psycopg2_binary-2.9.3-cp38-cp38-manylinux_2_24_aarch64.whl", hash = "sha256:af9813db73395fb1fc211bac696faea4ca9ef53f32dc0cfa27e4e7cf766dcf24"}, @@ -1617,7 +1668,6 @@ files = [ {file = "psycopg2_binary-2.9.3-cp38-cp38-win32.whl", hash = "sha256:6472a178e291b59e7f16ab49ec8b4f3bdada0a879c68d3817ff0963e722a82ce"}, {file = "psycopg2_binary-2.9.3-cp38-cp38-win_amd64.whl", hash = "sha256:35168209c9d51b145e459e05c31a9eaeffa9a6b0fd61689b48e07464ffd1a83e"}, {file = "psycopg2_binary-2.9.3-cp39-cp39-macosx_10_14_x86_64.macosx_10_9_intel.macosx_10_9_x86_64.macosx_10_10_intel.macosx_10_10_x86_64.whl", hash = "sha256:47133f3f872faf28c1e87d4357220e809dfd3fa7c64295a4a148bcd1e6e34ec9"}, - {file = "psycopg2_binary-2.9.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:b3a24a1982ae56461cc24f6680604fffa2c1b818e9dc55680da038792e004d18"}, {file = "psycopg2_binary-2.9.3-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:91920527dea30175cc02a1099f331aa8c1ba39bf8b7762b7b56cbf54bc5cce42"}, {file = "psycopg2_binary-2.9.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:887dd9aac71765ac0d0bac1d0d4b4f2c99d5f5c1382d8b770404f0f3d0ce8a39"}, {file = "psycopg2_binary-2.9.3-cp39-cp39-manylinux_2_24_aarch64.whl", hash = "sha256:1f14c8b0942714eb3c74e1e71700cbbcb415acbc311c730370e70c578a44a25c"}, @@ -2068,31 +2118,16 @@ docs = ["sphinx (<5)", "sphinxcontrib-apidoc"] html = ["html5lib"] tests = ["berkeleydb", "html5lib", "networkx", "pytest", "pytest-cov", "pytest-subtests"] -[[package]] -name = "rdflib-jsonld" -version = "0.6.2" -description = "rdflib extension adding JSON-LD parser and serializer" -category = "main" -optional = false -python-versions = "*" -files = [ - {file = "rdflib-jsonld-0.6.2.tar.gz", hash = "sha256:107cd3019d41354c31687e64af5e3fd3c3e3fa5052ce635f5ce595fd31853a63"}, - {file = "rdflib_jsonld-0.6.2-py2.py3-none-any.whl", hash = "sha256:011afe67672353ca9978ab9a4bee964dff91f14042f2d8a28c22a573779d2f8b"}, -] - -[package.dependencies] -rdflib = ">=5.0.0" - [[package]] name = "recipe-scrapers" -version = "14.24.0" +version = "14.26.0" description = "Python package, scraping recipes from all over the internet" category = "main" optional = false python-versions = ">=3.6" files = [ - {file = "recipe_scrapers-14.24.0-py3-none-any.whl", hash = "sha256:1eed9d9010a771387a37aaec27b7c199cb3c4e74c6b9afaa00f1af6f43dc3e26"}, - {file = "recipe_scrapers-14.24.0.tar.gz", hash = "sha256:37ad2b8c113b4d530450ccb7406330e105ccad0dbc5666eb6fafa5ef4e16c408"}, + {file = "recipe_scrapers-14.26.0-py3-none-any.whl", hash = "sha256:bfda2cfa55c5169353cc3440c67cb874f0ef677fc99933263ec8bb9fe76bf360"}, + {file = "recipe_scrapers-14.26.0.tar.gz", hash = "sha256:f5ffdba502e023ac06c8fad1346744a4a155e7851543c160a1e776ae82b4b1d5"}, ] [package.dependencies] @@ -2196,28 +2231,28 @@ pyasn1 = ">=0.1.3" [[package]] name = "ruff" -version = "0.0.202" +version = "0.0.206" description = "An extremely fast Python linter, written in Rust." category = "dev" optional = false python-versions = ">=3.7" files = [ - {file = "ruff-0.0.202-py3-none-macosx_10_7_x86_64.whl", hash = "sha256:4b79d4ba3530aee5f1de3add3096df7bd483bb3a8c8933f61fe0b16d2dbbf3d2"}, - {file = "ruff-0.0.202-py3-none-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl", hash = "sha256:81502b86d0608549f0cd8e5f6fb66a29f365013cdf3dfdaa6521d9307c01e614"}, - {file = "ruff-0.0.202-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:baa5b92ab3dcf5355545adec731d64598663e5c38a94710a1a971fafdbd8ccb1"}, - {file = "ruff-0.0.202-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:91f38496b3194ce1335cc50f4a439e55a66fa12615d0b57c0867f9136249472c"}, - {file = "ruff-0.0.202-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c6003f9ecc1cc10c5cad5f71072a4d98e10af6f73de148218323429996dd7c69"}, - {file = "ruff-0.0.202-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:d34d9b8f495ad3f1333819a3cbfbcbf9c96c4637b132038cd0f0786bc48e354d"}, - {file = "ruff-0.0.202-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:52fea12733b056b74ef7d0991d1f6bdf700fa0d4c15adec91dafba14a7718a3a"}, - {file = "ruff-0.0.202-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0b54a64ece6e8c7113cfa26368fe55864ddf286ae18cbb02e7c5ed39e7a27c92"}, - {file = "ruff-0.0.202-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:16d3708a2b758fa1b2ec2755e8850bc1e8327e1b4c15bdca7c19eb449077fdf5"}, - {file = "ruff-0.0.202-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:d62322974cb8a37d5b352c0337936284002b681ab4ca164dcf97a5c5c173e0a7"}, - {file = "ruff-0.0.202-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:eeb114e0b26ad92dcd31dc62610a66a76cbf151a7822f5624eb8faf0461fae1a"}, - {file = "ruff-0.0.202-py3-none-musllinux_1_2_i686.whl", hash = "sha256:adcf5dc49eba84ae037c47809b6069d6d4606f14bab1bb64086843a9dcbf2c01"}, - {file = "ruff-0.0.202-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:d7dd2d7850a88f482fd8144fdd9beeb179b2411c5203938979401a0f1ca53ea2"}, - {file = "ruff-0.0.202-py3-none-win32.whl", hash = "sha256:76f4cff5f8d39b594e9384a947a9733e847373babbe4bcaba06caa6484ade6a4"}, - {file = "ruff-0.0.202-py3-none-win_amd64.whl", hash = "sha256:68563fe0783265e694005adb81291b207fbf617635f35f34af5b481b713babfe"}, - {file = "ruff-0.0.202.tar.gz", hash = "sha256:cf9efa3a2d1a5072bae9e9c2dd453373c3169a0433809af1a0834472ea6d2fa0"}, + {file = "ruff-0.0.206-py3-none-macosx_10_7_x86_64.whl", hash = "sha256:47fa81b999d960464e37135c5863cb0be97a05ba6ad8c5baa8163e5a0d7d2e20"}, + {file = "ruff-0.0.206-py3-none-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl", hash = "sha256:457829500cec96d307b6dd537e983e148cf3788454ccda83aeef459dcdeccce3"}, + {file = "ruff-0.0.206-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b186fdb99b10a8d5ac112e8c10000eff61c3cc248ce9b87f80abf6e32408746d"}, + {file = "ruff-0.0.206-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:b978f206135cf02d89a51d29b2134eecfb8c05e2533dc75c6554b29a5e7e0844"}, + {file = "ruff-0.0.206-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:632233444d597e02982dfdd1d34eab03943e9c6e042f0dfafab40a3ceb18a6fd"}, + {file = "ruff-0.0.206-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:b70baa8904ff9e11859082eb691d7e087d8637f1bb569512f76a8b2cfb8b3eb6"}, + {file = "ruff-0.0.206-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d64f8452e71fadf9995dee7517a55f251c5a3c87879e08d231af5ef5b7abf076"}, + {file = "ruff-0.0.206-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:66e198b71bd6f39b8adac5d2dcf47d8a3be8860d71680f36c7b7caba4e823ed0"}, + {file = "ruff-0.0.206-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:821b5cee2f5ebf27950580a7a09c1baeedd1659e0c85742ef085356f2ffe6035"}, + {file = "ruff-0.0.206-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:85ab420465395f8e6a5057f8acd7990297fa23a7e20f667ff4d73479f8fd5ca5"}, + {file = "ruff-0.0.206-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:7c4cd2842cecb52464cb3d8b5386beeca029e6b7940d2720d5adaf9da94323b3"}, + {file = "ruff-0.0.206-py3-none-musllinux_1_2_i686.whl", hash = "sha256:9064d59f83d1ddd4b45f1bc565846cf067bf4d0f3e8db5a73f14cc38a2403c49"}, + {file = "ruff-0.0.206-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:cfd8977c264b3975e6cd893b62a20ee2cab6a1893cb0eda8418e0ef062a284c3"}, + {file = "ruff-0.0.206-py3-none-win32.whl", hash = "sha256:c333f4062fd8c86a903f0e11780b529d786981b70de2d65102ee1765949592cd"}, + {file = "ruff-0.0.206-py3-none-win_amd64.whl", hash = "sha256:6e758ff7c9981b91113d6a0f44183ab5dbe33ee5a5ca2ec7db5a22f03f9568eb"}, + {file = "ruff-0.0.206.tar.gz", hash = "sha256:b79b6ffac6ca713c5cad6e661495e77e1821d87c3fedd02139d13a857a6de92a"}, ] [[package]] @@ -2324,7 +2359,7 @@ greenlet = {version = "!=0.4.17", markers = "python_version >= \"3\" and (platfo [package.extras] aiomysql = ["aiomysql", "greenlet (!=0.4.17)"] -aiosqlite = ["aiosqlite", "greenlet (!=0.4.17)", "typing-extensions (!=3.10.0.1)"] +aiosqlite = ["aiosqlite", "greenlet (!=0.4.17)", "typing_extensions (!=3.10.0.1)"] asyncio = ["greenlet (!=0.4.17)"] asyncmy = ["asyncmy (>=0.2.3,!=0.2.4)", "greenlet (!=0.4.17)"] mariadb-connector = ["mariadb (>=1.0.1)"] @@ -2334,14 +2369,14 @@ mssql-pyodbc = ["pyodbc"] mypy = ["mypy (>=0.910)", "sqlalchemy2-stubs"] mysql = ["mysqlclient (>=1.4.0)", "mysqlclient (>=1.4.0,<2)"] mysql-connector = ["mysql-connector-python"] -oracle = ["cx-oracle (>=7)", "cx-oracle (>=7,<8)"] +oracle = ["cx_oracle (>=7)", "cx_oracle (>=7,<8)"] postgresql = ["psycopg2 (>=2.7)"] postgresql-asyncpg = ["asyncpg", "greenlet (!=0.4.17)"] postgresql-pg8000 = ["pg8000 (>=1.16.6,!=1.29.0)"] postgresql-psycopg2binary = ["psycopg2-binary"] postgresql-psycopg2cffi = ["psycopg2cffi"] pymysql = ["pymysql", "pymysql (<1)"] -sqlcipher = ["sqlcipher3-binary"] +sqlcipher = ["sqlcipher3_binary"] [[package]] name = "starlette" @@ -2877,4 +2912,4 @@ pgsql = ["psycopg2-binary"] [metadata] lock-version = "2.0" python-versions = "^3.10" -content-hash = "b851bcf3e7e5e6f05ded62dad6d0657a2036f670121af2e21993fda2853575d1" +content-hash = "c294d55f8315eee1f58117354af0d73b0ff63c95629d784fd22969dca055c79a" diff --git a/pyproject.toml b/pyproject.toml index c242af45..216539e3 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -19,7 +19,7 @@ aniso8601 = "7.0.0" appdirs = "1.4.4" apprise = "^1.2.0" bcrypt = "^4.0.1" -extruct = "^0.13.0" +extruct = "^0.14.0" fastapi = "^0.88.0" gunicorn = "^20.1.0" lxml = "^4.7.1" @@ -36,7 +36,7 @@ python-jose = "^3.3.0" python-ldap = "^3.3.1" python-multipart = "^0.0.5" python-slugify = "^6.1.2" -recipe-scrapers = "^14.24.0" +recipe-scrapers = "^14.26.0" requests = "^2.25.1" tzdata = "^2022.7" uvicorn = {extras = ["standard"], version = "^0.20.0"} @@ -47,14 +47,14 @@ black = "^21.12b0" coverage = "^7.0" coveragepy-lcov = "^0.1.1" mkdocs-material = "^8.2.3" -mypy = "^0.960" -openapi-spec-validator = "^0.4.0" +mypy = "^0.991" +openapi-spec-validator = "^0.5.0" pre-commit = "^2.20.0" pydantic-to-typescript = "^1.0.7" pylint = "^2.6.0" pytest = "^7.2.0" rich = "^13.0.0" -ruff = "^0.0.202" +ruff = "^0.0.206" types-PyYAML = "^6.0.4" types-python-dateutil = "^2.8.18" types-python-slugify = "^6.0.0" diff --git a/tests/unit_tests/test_open_api.py b/tests/unit_tests/test_open_api.py index a7d97de3..e681c59d 100644 --- a/tests/unit_tests/test_open_api.py +++ b/tests/unit_tests/test_open_api.py @@ -1,8 +1,8 @@ -from openapi_spec_validator import validate_v3_spec +from openapi_spec_validator import openapi_v30_spec_validator, validate_spec from mealie.app import app def test_validate_open_api_spec(): open_api = app.openapi() - validate_v3_spec(open_api) + validate_spec(open_api, validator=openapi_v30_spec_validator)