diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index a2387bc5..8013fcae 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -12,47 +12,20 @@ on: jobs: tests: - - runs-on: ubuntu-latest + runs-on: ${{ matrix.os }} strategy: matrix: - python-version: [3.7, 3.8, 3.9, '3.10'] - - steps: - - name: Checkout changes - uses: actions/checkout@v2 - - - name: Set up Python ${{ matrix.python-version }} - uses: actions/setup-python@main - with: - python-version: ${{ matrix.python-version }} + python-version: [3.8, 3.9, "3.10", "3.11", "3.12"] + os: [ubuntu-latest, macos-latest, windows-latest] - - name: Use cache - id: cache-env - uses: actions/cache@v2 - with: - path: env - key: ${{ runner.os }}-env-${{ matrix.python-version }}-${{ hashFiles('requirements.txt', 'requirements-tests.txt') }} - - - name: Setup requirements - run: | - python -m venv env - env/bin/pip install -e .[tests] - if: steps.cache-env.outputs.cache-hit != 'true' - - - name: Test with pytest - run: env/bin/pytest tests - - notify: - runs-on: ubuntu-latest - needs: tests steps: - - - name: Notify Success - uses: archive/github-actions-slack@master - with: - slack-channel: C2CRL4C4V - slack-text: Tests are passed *[${{ github.repository }}] (${{ github.ref }})* https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }} - slack-bot-user-oauth-access-token: ${{ secrets.SLACK_BOT_TOKEN }} - slack-optional-as_user: false - slack-optional-icon_emoji: ":white_check_mark:" + - uses: actions/checkout@v4 + - name: Setup PDM + uses: pdm-project/setup-pdm@v3 + with: + python-version: ${{ matrix.python-version }} + cache: true + - name: Install dependencies + run: pdm install + - name: Run tests + run: pdm run pytest diff --git a/.gitignore b/.gitignore index d76abf41..dbdca6d8 100644 --- a/.gitignore +++ b/.gitignore @@ -16,3 +16,4 @@ dist docs/_build .pytest_cache +.pdm-python diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml new file mode 100644 index 00000000..dabee6a6 --- /dev/null +++ b/.pre-commit-config.yaml @@ -0,0 +1,48 @@ +repos: + - repo: https://github.com/asottile/pyupgrade + rev: v3.15.0 + hooks: + - id: pyupgrade + args: + - --py38-plus + - repo: https://github.com/hadialqattan/pycln + rev: v2.3.0 + hooks: + - id: pycln + - repo: https://github.com/PyCQA/isort + rev: 5.12.0 + hooks: + - id: isort + - repo: https://github.com/jvllmr/pyaphid + rev: v0.3.1 + hooks: + - id: pyaphid + - repo: https://github.com/psf/black + rev: 23.11.0 + hooks: + - id: black + - repo: https://github.com/asottile/yesqa + rev: v1.5.0 + hooks: + - id: yesqa + - repo: https://github.com/astral-sh/ruff-pre-commit + rev: "v0.1.5" + hooks: + - id: ruff + - repo: https://github.com/pre-commit/mirrors-prettier + rev: v3.0.3 + hooks: + - id: prettier + additional_dependencies: [prettier@latest, prettier-plugin-toml@latest] + - repo: https://github.com/pre-commit/mirrors-mypy + rev: "v1.7.0" + hooks: + - id: mypy + exclude: ^tests/.* + - repo: https://github.com/pre-commit/pre-commit-hooks + rev: v4.5.0 + hooks: + - id: check-yaml + - id: end-of-file-fixer + - id: trailing-whitespace + - id: check-toml diff --git a/.travis.yml b/.travis.yml deleted file mode 100644 index db62956b..00000000 --- a/.travis.yml +++ /dev/null @@ -1,64 +0,0 @@ -language: python - -python: - - 2.7 - - 3.6 - -env: - - TOXENV=cov - -matrix: - include: - - python: 2.7 - env: TOXENV=py27-d11 - - - python: 3.6 - env: TOXENV=py36-d11 - - python: 3.6 - env: TOXENV=py36-d21 - -matrix: - exlcude: - - python: 2.7 - env: - - python 3.5 - env: - - python: 3.6 - env: - - include: - - python: 2.7 - env: TOXENV=py27-d9 - - python: 2.7 - env: TOXENV=py27-d10 - - - python: 3.5 - env: TOXENV=py35-d9 - - python: 3.5 - env: TOXENV=py35-d10 - - python: 3.5 - env: TOXENV=py35-d11 - - - python: 3.6 - env: TOXENV=py36-d10 - - python: 3.6 - env: TOXENV=py36-d11 - - python: 3.6 - env: TOXENV=py36-d20 - -branches: - only: - - master - - develop - -install: pip install --quiet tox - - -script: tox -e ${TOXENV} - - -after_script: - - if [ $TOXENV == "cov" ]; then - pip install --quiet coveralls; - coveralls; - fi diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 00000000..0c3ee866 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,12 @@ +{ + "editor.formatOnSave": true, + "python.defaultInterpreterPath": ".venv/bin/python", + "python.terminal.activateEnvInCurrentTerminal": true, + "python.languageServer": "Pylance", + "[python]": { + "editor.defaultFormatter": "ms-python.black-formatter" + }, + "python.testing.pytestEnabled": true, + "python.analysis.inlayHints.functionReturnTypes": true, + "python.analysis.inlayHints.variableTypes": true +} diff --git a/Changelog b/Changelog index 81c93c92..ac9fb93f 100644 --- a/Changelog +++ b/Changelog @@ -1,3 +1,6 @@ +2022-07-10 + * Add support for type annotations, typing.TypedDict and dataclasses + 2022-03-23 * Django: Support for UUIDField diff --git a/LICENSE b/LICENSE index 0486fe57..8b6a2eba 100644 --- a/LICENSE +++ b/LICENSE @@ -1,4 +1,8 @@ -Copyright (c) 2013 by klen . +All changes made by the fork are licensed by: + Copyright (c) 2013 by Jan Vollmer . + +Everything prior to the fork keeps the original license by: + Copyright (c) 2013 by klen . Some rights reserved. diff --git a/README.rst b/README.rst index f033f4d4..f3e24a68 100644 --- a/README.rst +++ b/README.rst @@ -1,6 +1,13 @@ -.. image:: https://raw.github.com/klen/mixer/develop/docs/_static/logo.png +.. image:: https://raw.github.com/jvllmr/mixer/develop/docs/_static/logo.png :width: 100px + +.. important:: + + This is a fork of https://github.com/klen/mixer that aims to maintain integrations with the newest library versions. + It also improves Developer Experience by being fully typed. + + The **Mixer** is a helper to generate instances of Django or SQLAlchemy models. It's useful for testing and fixture replacement. Fast and convenient test-data generation. @@ -18,20 +25,20 @@ Mixer supports: .. _badges: -.. image:: https://github.com/klen/mixer/workflows/tests/badge.svg?style=flat-square - :target: https://github.com/klen/mixer/actions +.. image:: https://github.com/jvllmr/mixer/workflows/tests/badge.svg?style=flat-square + :target: https://github.com/jvllmr/mixer/actions :alt: Tests Status -.. image:: http://img.shields.io/pypi/v/mixer.svg?style=flat-square - :target: https://pypi.python.org/pypi/mixer +.. image:: http://img.shields.io/pypi/v/mixer2.svg?style=flat-square + :target: https://pypi.python.org/pypi/mixer2 :alt: Version -.. image:: http://img.shields.io/pypi/dm/mixer.svg?style=flat-square - :target: https://pypi.python.org/pypi/mixer +.. image:: http://img.shields.io/pypi/dm/mixer2.svg?style=flat-square + :target: https://pypi.python.org/pypi/mixer2 :alt: Downloads -.. image:: http://img.shields.io/pypi/l/mixer.svg?style=flat-square - :target: https://pypi.python.org/pypi/mixer +.. image:: http://img.shields.io/pypi/l/mixer2.svg?style=flat-square + :target: https://pypi.python.org/pypi/mixer2 :alt: License .. _documentation: @@ -56,7 +63,7 @@ documentation enhancements and/or fixes are awesome and most welcome.** Requirements ============= -- Python 3.7+ +- Python 3.8+ - Django (3.0, 3.1) for Django ORM support; - Flask-SQLALchemy for SQLAlchemy ORM support and integration as Flask application; - Faker >= 0.7.3 @@ -70,7 +77,7 @@ Installation **Mixer** should be installed using pip: :: - pip install mixer + pip install mixer2 Usage @@ -91,7 +98,7 @@ Quick example: .. code-block:: python - from mixer.backend.django import mixer + from mixer2.backend.django import mixer from customapp.models import User, UserMessage # Generate a random user @@ -122,7 +129,7 @@ Quick example: .. code-block:: python - from mixer.backend.flask import mixer + from mixer2.backend.flask import mixer from models import User, UserMessage mixer.init_app(self.app) @@ -156,7 +163,7 @@ For support this scheme, just create your own mixer class, like this: .. code-block:: python - from mixer.backend.sqlalchemy import Mixer + from mixer2.backend.sqlalchemy import Mixer class MyOwnMixer(Mixer): @@ -174,7 +181,7 @@ Example of initialization: .. code-block:: python - from mixer.backend.sqlalchemy import Mixer + from mixer2.backend.sqlalchemy import Mixer ENGINE = create_engine('sqlite:///:memory:') BASE = declarative_base() @@ -194,7 +201,7 @@ Example usage: .. code-block:: python - from mixer.backend.mongoengine import mixer + from mixer2.backend.mongoengine import mixer class User(Document): created_at = DateTimeField(default=datetime.datetime.now) @@ -217,7 +224,7 @@ Example usage: .. code-block:: python - from mixer.backend.marshmallow import mixer + from mixer2.backend.marshmallow import mixer import marshmallow as ma class User(ma.Schema): @@ -240,7 +247,7 @@ Quick example: .. code-block:: python - from mixer.main import mixer + from mixer2.main import mixer class Test: one = int @@ -255,6 +262,29 @@ Quick example: scheme = mixer.blend(Scheme, prop__one=1) +Type annotations, typing.TypedDict and python dataclasses +------------ +Example: + +.. code-block:: python + + from mixer2.backend.annotated import mixer + from typing import TypedDict + + class Test: + one: int + two: int + name: str + + class Scheme(TypedDict): + name: str + money: int + male: bool + prop: Test + + scheme = mixer.blend(Scheme, name="John", male=True) # {"name": "John", "male": True, ...} + +It works the same with python dataclasses. DB commits ---------- @@ -264,7 +294,7 @@ database. For preventing this behavior init `mixer` manually: .. code-block:: python - from mixer.backend.django import Mixer + from mixer2.backend.django import Mixer mixer = Mixer(commit=False) @@ -273,7 +303,7 @@ Or you can temporary switch context use the mixer as context manager: .. code-block:: python - from mixer.backend.django import mixer + from mixer2.backend.django import mixer # Will be save to db user1 = mixer.blend('auth.user') @@ -293,7 +323,7 @@ Quick example: .. code-block:: python - from mixer.main import mixer + from mixer2.main import mixer class Test: id = int @@ -317,7 +347,7 @@ Also, you can make your own factory for field types: .. code-block:: python - from mixer.backend.django import Mixer, GenFactory + from mixer2.backend.django import Mixer, GenFactory def get_func(*args, **kwargs): return "Always same" @@ -336,7 +366,7 @@ You can add middleware layers to process generation: .. code-block:: python - from mixer.backend.django import mixer + from mixer2.backend.django import mixer # Register middleware to model @mixer.middleware('auth.user') @@ -362,7 +392,7 @@ creating your own mixer: .. code-block:: python - from mixer.backend.django import Mixer + from mixer2.backend.django import Mixer mixer = Mixer(locale='it') mixer.faker.name() ## u'Acchisio Conte' diff --git a/mixer/_compat.py b/mixer/_compat.py index ff195d60..4bbb674a 100644 --- a/mixer/_compat.py +++ b/mixer/_compat.py @@ -10,19 +10,16 @@ import sys PY2 = sys.version_info[0] == 2 -_identity = lambda x: x - +_identity = lambda x: x # noqa: E731 if not PY2: text_type = str string_types = (str,) - integer_types = (int, ) - - iterkeys = lambda d: iter(d.keys()) - itervalues = lambda d: iter(d.values()) - iteritems = lambda d: iter(d.items()) + integer_types = (int,) - from io import StringIO + iterkeys = lambda d: iter(d.keys()) # noqa: E731 + itervalues = lambda d: iter(d.values()) # noqa: E731 + iteritems = lambda d: iter(d.items()) # noqa: E731 def reraise(tp, value, tb=None): if value.__traceback__ is not tb: @@ -32,21 +29,21 @@ def reraise(tp, value, tb=None): implements_to_string = _identity else: - text_type = unicode - string_types = (str, unicode) - integer_types = (int, long) + text_type = unicode # noqa + string_types = (str, unicode) # noqa + integer_types = (int, long) # noqa - iterkeys = lambda d: d.iterkeys() - itervalues = lambda d: d.itervalues() - iteritems = lambda d: d.iteritems() + iterkeys = lambda d: d.iterkeys() # noqa: E731 + itervalues = lambda d: d.itervalues() # noqa: E731 + iteritems = lambda d: d.iteritems() # noqa: E731 - from cStringIO import StringIO + from cStringIO import StringIO # noqa: F401 - exec('def reraise(tp, value, tb=None):\n raise tp, value, tb') + exec("def reraise(tp, value, tb=None):\n raise tp, value, tb") def implements_to_string(cls): cls.__unicode__ = cls.__str__ - cls.__str__ = lambda x: x.__unicode__().encode('utf-8') + cls.__str__ = lambda x: x.__unicode__().encode("utf-8") return cls @@ -63,11 +60,13 @@ def with_metaclass(meta, *bases): class metaclass(meta): __call__ = type.__call__ __init__ = type.__init__ + def __new__(cls, name, this_bases, d): if this_bases is None: return type.__new__(cls, name, (), d) return meta(name, bases, d) - return metaclass('temporary_class', None, {}) + + return metaclass("temporary_class", None, {}) # Certain versions of pypy have a bug where clearing the exception stack @@ -76,12 +75,15 @@ def __new__(cls, name, this_bases, d): # is necessary because pypy seems to forget to check if an exception # happend until the next bytecode instruction? BROKEN_PYPY_CTXMGR_EXIT = False -if hasattr(sys, 'pypy_version_info'): - class _Mgr(object): +if hasattr(sys, "pypy_version_info"): + + class _Mgr: def __enter__(self): return self + def __exit__(self, *args): sys.exc_clear() + try: try: with _Mgr(): @@ -94,12 +96,11 @@ def __exit__(self, *args): pass try: - from collections import OrderedDict + from collections import OrderedDict # nopycln: import except ImportError: - from UserDict import DictMixin - - class OrderedDict(dict, DictMixin): + from UserDict import DictMixin # type: ignore + class OrderedDict(dict, DictMixin): # type: ignore null = object() def __init__(self, *args, **kwargs): @@ -140,23 +141,24 @@ def keys(self): iteritems = DictMixin.iteritems try: - from importlib import import_module + from importlib import import_module # nopycln: import except ImportError: def _resolve_name(name, package, level): """Return the absolute name of the module to be imported.""" - if not hasattr(package, 'rindex'): + if not hasattr(package, "rindex"): raise ValueError("'package' not set to a string") dot = len(package) - for x in xrange(level, 1, -1): + for x in xrange(level, 1, -1): # noqa: F821 try: - dot = package.rindex('.', 0, dot) + dot = package.rindex(".", 0, dot) except ValueError: - raise ValueError("attempted relative import beyond top-level " - "package") - return "%s.%s" % (package[:dot], name) + raise ValueError( # type: ignore + "attempted relative import beyond top-level " "package" + ) + return f"{package[:dot]}.{name}" - def import_module(name, package=None): + def import_module(name, package=None): # type: ignore """Import a module. The 'package' argument is required when performing a relative import. It @@ -164,12 +166,12 @@ def import_module(name, package=None): relative import to an absolute import. """ - if name.startswith('.'): + if name.startswith("."): if not package: raise TypeError("relative imports require the 'package' argument") level = 0 for character in name: - if character != '.': + if character != ".": break level += 1 name = _resolve_name(name[level:], package, level) diff --git a/mixer/backend/annotated.py b/mixer/backend/annotated.py new file mode 100644 index 00000000..ad7f4825 --- /dev/null +++ b/mixer/backend/annotated.py @@ -0,0 +1,48 @@ +import dataclasses +import random +import typing + +import typing_extensions + +import mixer.mix_types as t + +from ..main import GenFactory as BaseGenFactory +from ..main import Mixer as BaseMixer +from ..main import TypeMixer as BaseTypeMixer + + +class GenFactory(BaseGenFactory): + @classmethod + def cls_to_simple(cls, fcls): + if hasattr(fcls, "__origin__"): + if fcls.__origin__ == typing.Union: + return random.choice(fcls.__args__) + + return super().cls_to_simple(fcls) + + +class TypeMixer(BaseTypeMixer): + factory = GenFactory + + def populate_target(self, values): + if issubclass(self.__scheme, dict) or dataclasses.is_dataclass(self.__scheme): + return self.__scheme(**{k: v for k, v in values}) + + return super().populate_target(values) + + def __load_fields(self): + for fname, type_ in typing_extensions.get_type_hints(self.__scheme).items(): + if fname.startswith("_"): + continue + + yield fname, t.Field( + type_, + fname, + ) + + +class Mixer(BaseMixer): + type_mixer_cls = TypeMixer + + +mixer = Mixer() diff --git a/mixer/backend/flask.py b/mixer/backend/flask.py index d22a79e4..c917265d 100644 --- a/mixer/backend/flask.py +++ b/mixer/backend/flask.py @@ -9,19 +9,26 @@ user = mixer.blend('path.to.models.User') """ -from __future__ import absolute_import +from __future__ import annotations from .sqlalchemy import TypeMixer, Mixer as BaseMixer +import typing + + +if typing.TYPE_CHECKING: + from flask_sqlalchemy import SQLAlchemy + from flask import Flask + class Mixer(BaseMixer): - """ Init application. """ + """Init application.""" type_mixer_cls = TypeMixer def __init__(self, app=None, commit=True, **kwargs): - """ Initialize the SQLAlchemy Mixer. + """Initialize the SQLAlchemy Mixer. :param fake: (True) Generate fake data instead of random data. :param app: Flask application @@ -29,12 +36,12 @@ def __init__(self, app=None, commit=True, **kwargs): """ super(Mixer, self).__init__(**kwargs) - self.params['commit'] = commit + self.params["commit"] = commit if app: self.init_app(app) - def init_app(self, app): - """ Init application. + def init_app(self, app: Flask): + """Init application. This callback can be used to initialize an application for the use with this mixer setup. @@ -42,13 +49,16 @@ def init_app(self, app): :param app: Flask application """ - assert app.extensions and app.extensions[ - 'sqlalchemy'], "Flask-SQLAlchemy must be inialized before Mixer." - db = app.extensions['sqlalchemy'].db - self.params['session'] = db.session + assert ( + app.extensions and app.extensions["sqlalchemy"] + ), "Flask-SQLAlchemy must be inialized before Mixer." + db: SQLAlchemy = app.extensions["sqlalchemy"] + if hasattr(db, "db"): + db = db.db + self.params["session"] = db.session # register extension with app - app.extensions['mixer'] = self + app.extensions["mixer"] = self # Default mixer diff --git a/mixer/backend/sqlalchemy.py b/mixer/backend/sqlalchemy.py index 4ad4e4c0..c659f9ba 100644 --- a/mixer/backend/sqlalchemy.py +++ b/mixer/backend/sqlalchemy.py @@ -7,47 +7,66 @@ import decimal from sqlalchemy import func from sqlalchemy.ext.compiler import compiles + # from sqlalchemy.orm.interfaces import MANYTOONE from sqlalchemy.orm.collections import InstrumentedList from sqlalchemy.orm.attributes import InstrumentedAttribute from sqlalchemy.sql import expression from sqlalchemy.sql.type_api import TypeDecorator + try: from sqlalchemy.orm.relationships import RelationshipProperty except ImportError: from sqlalchemy.orm.properties import RelationshipProperty from sqlalchemy.types import ( - BIGINT, BOOLEAN, BigInteger, Boolean, CHAR, DATE, DATETIME, DECIMAL, Date, - DateTime, FLOAT, Float, INT, INTEGER, Integer, NCHAR, NVARCHAR, NUMERIC, - Numeric, SMALLINT, SmallInteger, String, TEXT, TIME, Text, Time, Unicode, - UnicodeText, VARCHAR, Enum) + BIGINT, + BOOLEAN, + BigInteger, + Boolean, + CHAR, + DATE, + DATETIME, + DECIMAL, + Date, + DateTime, + FLOAT, + Float, + INT, + INTEGER, + Integer, + NCHAR, + NVARCHAR, + NUMERIC, + Numeric, + SMALLINT, + SmallInteger, + String, + TEXT, + TIME, + Text, + Time, + Unicode, + UnicodeText, + VARCHAR, + Enum, +) from .. import mix_types as t from ..main import ( - SKIP_VALUE, LOGGER, TypeMixer as BaseTypeMixer, GenFactory as BaseFactory, - Mixer as BaseMixer, partial, faker) - - -class random(expression.FunctionElement): - type = Numeric() - name = 'random' + SKIP_VALUE, + LOGGER, + TypeMixer as BaseTypeMixer, + GenFactory as BaseFactory, + Mixer as BaseMixer, + partial, + faker, +) +from sqlalchemy import func as sa_func -@compiles(random) -def rand_random(element, compiler, **kw): - return 'RAND()' - -@compiles(random, 'postgresql') -@compiles(random, 'sqlite') -def random_random(element, compiler, **kw): - return 'RANDOM()' - -@compiles(random, 'oracle') -def oracle_random(element, compiler, **kw): - return 'DBMS_RANDOM.VALUE' class GenFactory(BaseFactory): - """ Map a sqlalchemy classes to simple types. """ + """Map a sqlalchemy classes to simple types.""" types = { (String, VARCHAR, Unicode, NVARCHAR, NCHAR, CHAR): str, @@ -63,24 +82,22 @@ class GenFactory(BaseFactory): (SmallInteger, SMALLINT): t.SmallInteger, } - generators = { - Enum: None - } + generators = {Enum: None} class TypeMixer(BaseTypeMixer): - """ TypeMixer for SQLAlchemy. """ + """TypeMixer for SQLAlchemy.""" factory = GenFactory def __init__(self, cls, **params): - """ Init TypeMixer and save the mapper. """ + """Init TypeMixer and save the mapper.""" super(TypeMixer, self).__init__(cls, **params) self.mapper = self.__scheme._sa_class_manager.mapper def postprocess(self, target, postprocess_values): - """ Fill postprocess values. """ + """Fill postprocess values.""" mixed = [] for name, deffered in postprocess_values: @@ -90,7 +107,9 @@ def postprocess(self, target, postprocess_values): if isinstance(value, t.Mix): mixed.append((name, value)) continue - if isinstance(getattr(target, name), InstrumentedList) and not isinstance(value, list): + if isinstance(getattr(target, name), InstrumentedList) and not isinstance( + value, list + ): value = [value] setattr(target, name, value) @@ -104,7 +123,7 @@ def postprocess(self, target, postprocess_values): @staticmethod def get_default(field): - """ Get default value from field. + """Get default value from field. :return value: A default value or NO_VALUE @@ -123,29 +142,33 @@ def get_default(field): if column.default.is_callable: return column.default.arg(None) - return getattr(column.default, 'arg', SKIP_VALUE) + return getattr(column.default, "arg", SKIP_VALUE) def gen_select(self, field_name, select): - """ Select exists value from database. + """Select exists value from database. :param field_name: Name of field for generation. :return : None or (name, value) for later use """ - if not self.__mixer or not self.__mixer.params.get('session'): + if not self.__mixer or not self.__mixer.params.get("session"): return field_name, SKIP_VALUE relation = self.mapper.get_property(field_name) - session = self.__mixer.params.get('session') - value = session.query( - relation.mapper.class_ - ).filter(*select.choices).order_by(random()).first() + session = self.__mixer.params.get("session") + + value = ( + session.query(relation.mapper.class_) + .filter(*select.choices) + .order_by(sa_func.random()) + .first() + ) return self.get_value(field_name, value) @staticmethod def is_unique(field): - """ Return True is field's value should be a unique. + """Return True is field's value should be a unique. :return bool: @@ -161,7 +184,7 @@ def is_unique(field): return scheme.unique def is_required(self, field): - """ Return True is field's value should be defined. + """Return True is field's value should be defined. :return bool: @@ -175,13 +198,16 @@ def is_required(self, field): # According to the SQLAlchemy docs, autoincrement "only has an effect for columns which are # Integer derived (i.e. INT, SMALLINT, BIGINT) [and] Part of the primary key [...]". - autoincrement = column.autoincrement and column.primary_key and \ - isinstance(column.type, Integer) + autoincrement = ( + column.autoincrement + and column.primary_key + and isinstance(column.type, Integer) + ) return not (column.nullable or autoincrement) def get_value(self, field_name, field_value): - """ Get `value` as `field_name`. + """Get `value` as `field_name`. :return : None or (name, value) for later use @@ -192,8 +218,8 @@ def get_value(self, field_name, field_value): return super(TypeMixer, self).get_value(field_name, field_value) - def make_fabric(self, column, field_name=None, fake=False, kwargs=None): # noqa - """ Make values fabric for column. + def make_fabric(self, column, field_name=None, fake=False, kwargs=None): # noqa + """Make values fabric for column. :param column: SqlAlchemy column :param field_name: Field name @@ -213,7 +239,9 @@ def make_fabric(self, column, field_name=None, fake=False, kwargs=None): # noqa if isinstance(column, RelationshipProperty): Mixer = type(self) Model = column.mapper.class_ - mixer = Mixer( Model, mixer=self.__mixer, fake=self.__fake, factory=self.__factory) + mixer = Mixer( + Model, mixer=self.__mixer, fake=self.__fake, factory=self.__factory + ) return partial(mixer.blend, **kwargs) ftype = type(column.type) @@ -227,26 +255,28 @@ def make_fabric(self, column, field_name=None, fake=False, kwargs=None): # noqa if stype is str: fab = super(TypeMixer, self).make_fabric( - stype, field_name=field_name, fake=fake, kwargs=kwargs) - return lambda: fab()[:column.type.length] + stype, field_name=field_name, fake=fake, kwargs=kwargs + ) + return lambda: fab()[: column.type.length] if ftype is Enum: return partial(faker.random_element, column.type.enums) return super(TypeMixer, self).make_fabric( - stype, field_name=field_name, fake=fake, kwargs=kwargs) + stype, field_name=field_name, fake=fake, kwargs=kwargs + ) def guard(self, *args, **kwargs): - """ Look objects in database. + """Look objects in database. :returns: A finded object or False """ try: - session = self.__mixer.params.get('session') + session = self.__mixer.params.get("session") assert session except (AttributeError, AssertionError): - raise ValueError('Cannot make request to DB.') + raise ValueError("Cannot make request to DB.") qs = session.query(self.mapper).filter(*args, **kwargs) count = qs.count() @@ -260,32 +290,34 @@ def guard(self, *args, **kwargs): return False def reload(self, obj): - """ Reload object from database. """ + """Reload object from database.""" try: - session = self.__mixer.params.get('session') + session = self.__mixer.params.get("session") session.expire(obj) session.refresh(obj) return obj except (AttributeError, AssertionError): - raise ValueError('Cannot make request to DB.') + raise ValueError("Cannot make request to DB.") def populate_target(self, values): target = self.__scheme() for n, v in values: - if isinstance(getattr(target, n, None), InstrumentedList) and not isinstance(v, list): + if isinstance( + getattr(target, n, None), InstrumentedList + ) and not isinstance(v, list): v = [v] setattr(target, n, v) return target def __load_fields(self): - """ Prepare SQLALchemyTypeMixer. + """Prepare SQLALchemyTypeMixer. Select columns and relations for data generation. """ mapper = self.__scheme._sa_class_manager.mapper relations = set() - if hasattr(mapper, 'relationships'): + if hasattr(mapper, "relationships"): for rel in mapper.relationships: fkeys = any(c.foreign_keys for c in rel.local_columns) if not fkeys: @@ -300,7 +332,7 @@ def __load_fields(self): class Mixer(BaseMixer): - """ Integration with SQLAlchemy. """ + """Integration with SQLAlchemy.""" type_mixer_cls = TypeMixer @@ -313,17 +345,17 @@ def __init__(self, session=None, commit=True, **params): """ super(Mixer, self).__init__(**params) - self.params['session'] = session - self.params['commit'] = bool(session) and commit + self.params["session"] = session + self.params["commit"] = bool(session) and commit def postprocess(self, target): - """ Save objects in db. + """Save objects in db. :return value: A generated value """ - if self.params.get('commit'): - session = self.params.get('session') + if self.params.get("commit"): + session = self.params.get("session") if not session: LOGGER.warning("'commit' set true but session not initialized.") else: diff --git a/mixer/factory.py b/mixer/factory.py index 2d5b02b8..8845c62f 100644 --- a/mixer/factory.py +++ b/mixer/factory.py @@ -1,17 +1,18 @@ """ Mixer factories. """ -import typing import datetime import decimal import inspect +import typing -from . import _compat as _, mix_types as t +from . import _compat as _ +from . import mix_types as t from ._faker import faker class GenFactoryMeta(type): - """ Precache generators. """ + """Precache generators.""" def __new__(mcs, name, bases, params): generators = dict() @@ -24,8 +25,8 @@ def __new__(mcs, name, bases, params): fakers.update(cls.fakers) types.update(cls.types) - fakers.update(params.get('fakers', dict())) - types.update(params.get('types', dict())) + fakers.update(params.get("fakers", dict())) + types.update(params.get("types", dict())) types = dict(mcs.__flat_keys(types)) @@ -35,14 +36,14 @@ def __new__(mcs, name, bases, params): if factory: generators[atype] = factory - generators.update(params.get('generators', dict())) + generators.update(params.get("generators", dict())) generators = dict(mcs.__flat_keys(generators)) - params['generators'] = generators - params['fakers'] = fakers - params['types'] = types + params["generators"] = generators + params["fakers"] = fakers + params["types"] = types - return super(GenFactoryMeta, mcs).__new__(mcs, name, bases, params) + return super().__new__(mcs, name, bases, params) @staticmethod def __flat_keys(d): @@ -54,9 +55,9 @@ def __flat_keys(d): yield key, value -class GenFactory(_.with_metaclass(GenFactoryMeta)): +class GenFactory(_.with_metaclass(GenFactoryMeta)): # type: ignore - """ Make generators for types. """ + """Make generators for types.""" generators = { bool: faker.pybool, @@ -88,46 +89,46 @@ class GenFactory(_.with_metaclass(GenFactoryMeta)): t.URL: faker.url, t.UUID: faker.uuid, t.JSON: faker.json, - type(None): '', + type(None): lambda: None, } fakers = { - ('address', str): faker.street_address, - ('body', str): faker.text, - ('category', str): faker.genre, - ('city', str): faker.city, - ('company', str): faker.company, - ('content', str): faker.text, - ('country', str): faker.country, - ('description', str): faker.text, - ('domain', str): faker.domain_name, - ('email', str): faker.email, - ('first_name', str): faker.first_name, - ('firstname', str): faker.first_name, - ('genre', str): faker.genre, - ('last_name', str): faker.last_name, - ('lastname', str): faker.last_name, - ('lat', float): faker.latitude, - ('latitude', float): faker.latitude, - ('login', str): faker.user_name, - ('lon', float): faker.longitude, - ('longitude', float): faker.longitude, - ('name', str): faker.name, - ('percent', decimal.Decimal): faker.percent_decimal, - ('percent', int): faker.percent, - ('phone', str): faker.phone_number, - ('site', str): faker.url, - ('slug', str): faker.slug, - ('street', str): faker.street_name, - ('time_zone', str): faker.timezone, - ('timezone', str): faker.timezone, - ('title', str): faker.title, - ('url', str): faker.uri, - ('url', t.URL): faker.uri, - ('username', str): faker.user_name, - ('uuid', None): faker.uuid, - ('json', None): faker.json, - ('jsonb', None): faker.json, + ("address", str): faker.street_address, + ("body", str): faker.text, + ("category", str): faker.genre, + ("city", str): faker.city, + ("company", str): faker.company, + ("content", str): faker.text, + ("country", str): faker.country, + ("description", str): faker.text, + ("domain", str): faker.domain_name, + ("email", str): faker.email, + ("first_name", str): faker.first_name, + ("firstname", str): faker.first_name, + ("genre", str): faker.genre, + ("last_name", str): faker.last_name, + ("lastname", str): faker.last_name, + ("lat", float): faker.latitude, + ("latitude", float): faker.latitude, + ("login", str): faker.user_name, + ("lon", float): faker.longitude, + ("longitude", float): faker.longitude, + ("name", str): faker.name, + ("percent", decimal.Decimal): faker.percent_decimal, + ("percent", int): faker.percent, + ("phone", str): faker.phone_number, + ("site", str): faker.url, + ("slug", str): faker.slug, + ("street", str): faker.street_name, + ("time_zone", str): faker.timezone, + ("timezone", str): faker.timezone, + ("title", str): faker.title, + ("url", str): faker.uri, + ("url", t.URL): faker.uri, + ("username", str): faker.user_name, + ("uuid", None): faker.uuid, + ("json", None): faker.json, + ("jsonb", None): faker.json, } types = { @@ -137,7 +138,7 @@ class GenFactory(_.with_metaclass(GenFactoryMeta)): @classmethod def cls_to_simple(cls, fcls): - """ Translate class to one of simple base types. + """Translate class to one of simple base types. :return type: A simple type for generation @@ -157,17 +158,17 @@ def cls_to_simple(cls, fcls): @staticmethod def name_to_simple(fname): - """ Translate name to one of simple base names. + """Translate name to one of simple base names. :return str: """ - fname = fname or '' + fname = fname or "" return fname.lower().strip() @classmethod def get_fabric(cls, fcls, fname=None, fake=False): - """ Make a objects fabric based on class and name. + """Make a objects fabric based on class and name. :return function: diff --git a/mixer/main.py b/mixer/main.py index 176f89d5..835190e4 100644 --- a/mixer/main.py +++ b/mixer/main.py @@ -9,37 +9,34 @@ :license: BSD, see LICENSE for more details. """ -from __future__ import absolute_import, unicode_literals - -import warnings -from types import GeneratorType import logging import traceback +import warnings from collections import defaultdict from contextlib import contextmanager from copy import deepcopy from functools import partial -from types import FunctionType, MethodType, BuiltinFunctionType +from types import BuiltinFunctionType, FunctionType, GeneratorType, MethodType -from . import mix_types as t, _compat as _ -from .factory import GenFactory +from . import _compat as _ +from . import mix_types as t from ._faker import faker - +from .factory import GenFactory SKIP_VALUE = object() LOGLEVEL = logging.WARN -LOGGER = logging.getLogger('mixer') +LOGGER = logging.getLogger("mixer") if not LOGGER.handlers and not LOGGER.root.handlers: LOGGER.addHandler(logging.StreamHandler()) class TypeMixerMeta(type): - """ Cache typemixers by scheme. """ + """Cache typemixers by scheme.""" - mixers = dict() + mixers = dict() # type: ignore def __call__(cls, cls_type, mixer=None, factory=None, fake=True): backup = cls_type @@ -47,27 +44,28 @@ def __call__(cls, cls_type, mixer=None, factory=None, fake=True): cls_type = cls.__load_cls(cls_type) assert cls_type except (AttributeError, AssertionError, LookupError): - raise ValueError('Invalid scheme: %s' % backup) + raise ValueError("Invalid scheme: %s" % backup) key = (mixer, cls_type, fake, factory) if key not in cls.mixers: - cls.mixers[key] = super(TypeMixerMeta, cls).__call__( - cls_type, mixer=mixer, factory=factory, fake=fake) + cls.mixers[key] = super().__call__( + cls_type, mixer=mixer, factory=factory, fake=fake + ) return cls.mixers[key] @staticmethod def __load_cls(cls_type): if isinstance(cls_type, _.string_types): - mod, cls_type = cls_type.rsplit('.', 1) + mod, cls_type = cls_type.rsplit(".", 1) mod = _.import_module(mod) cls_type = getattr(mod, cls_type) return cls_type -class TypeMixer(_.with_metaclass(TypeMixerMeta)): +class TypeMixer(_.with_metaclass(TypeMixerMeta)): # type: ignore - """ Generate objects by scheme. """ + """Generate objects by scheme.""" factory = GenFactory @@ -88,10 +86,10 @@ def __init__(self, cls, mixer=None, factory=None, fake=True): self.__fields = _.OrderedDict(self.__load_fields()) def __repr__(self): - return "".format(self.__scheme) + return f"" def blend(self, **values): - """ Generate object. + """Generate object. :param **values: Predefined fields :return value: a generated value @@ -101,8 +99,8 @@ def blend(self, **values): # Prepare relations for key, params in values.items(): - if '__' in key: - name, value = key.split('__', 1) + if "__" in key: + name, value = key.split("__", 1) if name not in defaults: defaults[name] = t.Field(None, name) defaults[name].params.update({value: params}) @@ -139,11 +137,11 @@ def blend(self, **values): target = self.postprocess(target, postprocess_values) - LOGGER.info('Blended: %s [%s]', target, self.__scheme) # noqa + LOGGER.info("Blended: %s [%s]", target, self.__scheme) return target def postprocess(self, target, postprocess_values): - """ Run the code after a generation. """ + """Run the code after a generation.""" if self.__mixer: target = self.__mixer.postprocess(target) @@ -153,14 +151,14 @@ def postprocess(self, target, postprocess_values): return target def populate_target(self, values): - """ Populate a target by values. """ + """Populate a target by values.""" target = self.__scheme() for name, value in values: setattr(target, name, value) return target def get_value(self, name, value): - """ Prepare value for field with name. + """Prepare value for field with name. :return : (name, value) or None @@ -174,7 +172,7 @@ def get_value(self, name, value): return name, value def gen_field(self, field): - """ Generate value by field. + """Generate value by field. :param field: Instance of :class:`Field` @@ -193,7 +191,7 @@ def gen_field(self, field): return self.gen_value(field.name, field, unique=unique) def gen_random(self, field_name, random): - """ Generate a random value for field with `field_name`. + """Generate a random value for field with `field_name`. :param field_name: Name of field for generation. :param random: Instance of :class:`~mixer.main.Random`. @@ -212,7 +210,7 @@ def gen_random(self, field_name, random): gen_select = gen_random def gen_fake(self, field_name, fake): - """ Generate a fake value for field with `field_name`. + """Generate a fake value for field with `field_name`. :param field_name: Name of field for generation. :param fake: Instance of :class:`~mixer.main.Fake`. @@ -226,7 +224,7 @@ def gen_fake(self, field_name, fake): return self.gen_value(field_name, fake, fake=True) def gen_value(self, field_name, field, fake=None, unique=False): - """ Generate values from basic types. + """Generate values from basic types. :return : (name, value) for later use @@ -243,8 +241,10 @@ def gen_value(self, field_name, field, fake=None, unique=False): value = None except Exception as exc: LOGGER.exception(exc) - raise ValueError("Generation for %s (%s) has been stopped. Exception: %s" % ( - field_name, self.__scheme.__name__, exc)) + raise ValueError( + "Generation for %s (%s) has been stopped. Exception: %s" + % (field_name, self.__scheme.__name__, exc) + ) if unique and value is not SKIP_VALUE: counter = 0 @@ -253,7 +253,9 @@ def gen_value(self, field_name, field, fake=None, unique=False): value = fab() counter += 1 if counter > 100: - raise RuntimeError("Cannot generate a unique value for %s" % field_name) + raise RuntimeError( + "Cannot generate a unique value for %s" % field_name + ) self.__gen_values[field_name].add(value) except TypeError: pass @@ -261,7 +263,7 @@ def gen_value(self, field_name, field, fake=None, unique=False): return self.get_value(field_name, value) def get_fabric(self, field, field_name=None, fake=None): - """ Get an objects fabric for field and cache it. + """Get an objects fabric for field and cache it. :param field: Field for looking a fabric :param field_name: Name of field for generation @@ -283,8 +285,8 @@ def get_fabric(self, field, field_name=None, fake=None): return self.__fabrics[key] - def make_fabric(self, scheme, field_name=None, fake=None, kwargs=None): # noqa - """ Make a fabric for scheme. + def make_fabric(self, scheme, field_name=None, fake=None, kwargs=None): # noqa + """Make a fabric for scheme. :param field_class: Class for looking a fabric :param scheme: Scheme for generation @@ -297,8 +299,12 @@ def make_fabric(self, scheme, field_name=None, fake=None, kwargs=None): # noqa fab = self.__factory.get_fabric(scheme, field_name, fake) if not fab: - return partial(type(self)(scheme, mixer=self.__mixer, fake=self.__fake, - factory=self.__factory).blend, **kwargs) + return partial( + type(self)( + scheme, mixer=self.__mixer, fake=self.__fake, factory=self.__factory + ).blend, + **kwargs, + ) if kwargs: return partial(fab, **kwargs) @@ -306,7 +312,7 @@ def make_fabric(self, scheme, field_name=None, fake=None, kwargs=None): # noqa return fab def register(self, field_name, func, fake=None): - """ Register function as fabric for the field. + """Register function as fabric for the field. :param field_name: Name of field for generation :param func: Function for data generation @@ -342,7 +348,7 @@ def func(): @staticmethod def is_unique(field): - """ Return True is field's value should be a unique. + """Return True is field's value should be a unique. :return bool: @@ -351,7 +357,7 @@ def is_unique(field): @staticmethod def is_required(field): - """ Return True is field's value should be defined. + """Return True is field's value should be defined. :return bool: @@ -360,7 +366,7 @@ def is_required(field): @staticmethod def get_default(field): - """ Return a default value for the field if it exists. + """Return a default value for the field if it exists. :return value: @@ -369,7 +375,7 @@ def get_default(field): @staticmethod def guard(*args, **kwargs): - """ Look in storage. + """Look in storage. :returns: False @@ -377,13 +383,13 @@ def guard(*args, **kwargs): return False def reload(self, obj): - """ Reload the object from storage. """ + """Reload the object from storage.""" return deepcopy(obj) def __load_fields(self): - """ Return scheme's fields. """ + """Return scheme's fields.""" for fname in dir(self.__scheme): - if fname.startswith('_'): + if fname.startswith("_"): continue prop = getattr(self.__scheme, fname) yield fname, t.Field(prop, fname) @@ -391,7 +397,7 @@ def __load_fields(self): class ProxyMixer: - """ A Mixer's proxy. Using for generate more than one object. + """A Mixer's proxy. Using for generate more than one object. :: @@ -405,7 +411,7 @@ def __init__(self, mixer, count=5, guards=None): self.guards = guards def blend(self, scheme, **values): - """ Call :meth:`Mixer.blend` a few times. And stack results to list. + """Call :meth:`Mixer.blend` a few times. And stack results to list. :returns: A list of generated objects. @@ -413,12 +419,10 @@ def blend(self, scheme, **values): result = [] if self.guards: - return self.mixer._guard(scheme, self.guards, **values) # noqa + return self.mixer._guard(scheme, self.guards, **values) - for _ in range(self.count): - result.append( - self.mixer.blend(scheme, **values) - ) + for _ in range(self.count): # noqa: F402 + result.append(self.mixer.blend(scheme, **values)) return result def __getattr__(self, name): @@ -427,7 +431,6 @@ def __getattr__(self, name): # Support depricated attributes class _MetaMixer(type): - FAKE = property(lambda cls: t.Fake()) MIX = property(lambda cls: t.Mix()) RANDOM = property(lambda cls: t.Random()) @@ -435,9 +438,9 @@ class _MetaMixer(type): SKIP = property(lambda cls: SKIP_VALUE) -class Mixer(_.with_metaclass(_MetaMixer)): +class Mixer(_.with_metaclass(_MetaMixer)): # type: ignore - """ This class is using for integration to an application. + """This class is using for integration to an application. :param fake: (True) Generate fake data instead of random data. :param factory: (:class:`~mixer.main.GenFactory`) Fabric's factory @@ -461,8 +464,15 @@ class SomeScheme: # generator's controller class type_mixer_cls = TypeMixer - def __init__(self, fake=True, factory=None, loglevel=LOGLEVEL, - silence=False, locale=faker.locale, **params): + def __init__( + self, + fake=True, + factory=None, + loglevel=LOGLEVEL, + silence=False, + locale=faker.locale, + **params, + ): """Initialize the Mixer instance. :param fake: (True) Generate fake data instead of random data. @@ -474,20 +484,25 @@ def __init__(self, fake=True, factory=None, loglevel=LOGLEVEL, """ self.params = params self.faker = faker - self.__init_params__(fake=fake, loglevel=loglevel, silence=silence, locale=locale) + self.__init_params__( + fake=fake, loglevel=loglevel, silence=silence, locale=locale + ) self.__factory = factory or self.type_mixer_cls.factory def __getattr__(self, name): - if name in ['f', 'g', 'fake', 'random', 'mix', 'select']: - warnings.warn('"mixer.%s" is depricated, use "mixer.%s" instead.' - % (name, name.upper()), stacklevel=2) + if name in ["f", "g", "fake", "random", "mix", "select"]: + warnings.warn( + '"mixer.%s" is depricated, use "mixer.%s" instead.' + % (name, name.upper()), + stacklevel=2, + ) name = name.upper() return getattr(self, name) raise AttributeError("Attribute %s not found." % name) @property def SKIP(self, *args, **kwargs): - """ Do not generate a field. + """Do not generate a field. :: # Don't generate field 'somefield' @@ -500,7 +515,7 @@ def SKIP(self, *args, **kwargs): @property def FAKE(self, *args, **kwargs): - """ Force generation of fake values. See :class:`~mixer.main.Fake`. + """Force generation of fake values. See :class:`~mixer.main.Fake`. :returns: Fake object @@ -509,7 +524,7 @@ def FAKE(self, *args, **kwargs): @property def RANDOM(self, *args, **kwargs): - """ Force generation of random values. See :class:`~mixer.main.Random`. + """Force generation of random values. See :class:`~mixer.main.Random`. :returns: Random object @@ -518,7 +533,7 @@ def RANDOM(self, *args, **kwargs): @property def SELECT(self, *args, **kwargs): - """ Select data from a storage. See :class:`~mixer.main.Select`. + """Select data from a storage. See :class:`~mixer.main.Select`. :returns: Select object @@ -527,7 +542,7 @@ def SELECT(self, *args, **kwargs): @property def MIX(self, *args, **kwargs): - """ Point to mixed object from future. See :class:`~mixer.main.Mix`. + """Point to mixed object from future. See :class:`~mixer.main.Mix`. :returns: Mix object @@ -538,12 +553,11 @@ def __init_params__(self, locale=None, **params): self.params.update(params) if locale: faker.locale = locale - self.params['locale'] = faker.locale - LOGGER.setLevel(self.params.get('loglevel')) + self.params["locale"] = faker.locale + LOGGER.setLevel(self.params.get("loglevel")) def __repr__(self): - return "".format( - 'fake' if self.params.get('fake') else 'rand') + return "".format("fake" if self.params.get("fake") else "rand") def blend(self, scheme, **values): """Generate instance of `scheme`. @@ -567,35 +581,35 @@ def blend(self, scheme, **values): try: return type_mixer.blend(**values) except Exception as e: - if self.params.get('silence'): + if self.params.get("silence"): return None if e.args: - e.args = ('Mixer (%s): %s' % (scheme, e.args[0]),) + e.args[1:] + e.args = (f"Mixer ({scheme}): {e.args[0]}",) + e.args[1:] LOGGER.error(traceback.format_exc()) raise def get_typemixer(self, scheme): - """ Return a cached typemixer instance. + """Return a cached typemixer instance. :return TypeMixer: """ return self.type_mixer_cls( - scheme, mixer=self, - fake=self.params.get('fake'), factory=self.__factory) + scheme, mixer=self, fake=self.params.get("fake"), factory=self.__factory + ) @staticmethod def postprocess(target): - """ Run the code after generation. + """Run the code after generation. :return target: """ return target - @staticmethod # noqa + @staticmethod def sequence(*args): - """ Create a sequence for predefined values. + """Create a sequence for predefined values. It makes a infinity loop with given function where does increment the counter on each iteration. @@ -643,10 +657,11 @@ def sequence(*args): """ if len(args) > 1: + def gen(): while True: - for o in args: - yield o + yield from args + return gen() func = args and args[0] or None @@ -654,17 +669,18 @@ def gen(): func = func.format elif func is None: - func = lambda x: x + func = lambda x: x # noqa: E731 def gen2(): counter = 0 while True: yield func(counter) counter += 1 + return gen2() def cycle(self, count=5): - """ Generate a few objects. The syntastic sugar for cycles. + """Generate a few objects. The syntastic sugar for cycles. :param count: List of objects or integer. :returns: ProxyMixer @@ -683,7 +699,7 @@ def cycle(self, count=5): return ProxyMixer(self, count) def middleware(self, scheme): - """ Middleware decorator. + """Middleware decorator. You could add the middleware layers to generation process: :: @@ -702,8 +718,8 @@ def encrypt_password(user): """ type_mixer = self.type_mixer_cls( - scheme, mixer=self, fake=self.params.get('fake'), - factory=self.__factory) + scheme, mixer=self, fake=self.params.get("fake"), factory=self.__factory + ) def wrapper(middleware): type_mixer.middlewares.append(middleware) @@ -712,15 +728,14 @@ def wrapper(middleware): return wrapper def unregister_middleware(self, scheme, middleware): - """Remove middleware from scheme - """ + """Remove middleware from scheme""" type_mixer = self.type_mixer_cls( - scheme, mixer=self, fake=self.params.get('fake'), - factory=self.__factory) + scheme, mixer=self, fake=self.params.get("fake"), factory=self.__factory + ) type_mixer.middlewares.remove(middleware) def register(self, scheme, **params): - """ Manualy register a function as value's generator for class.field. + """Manualy register a function as value's generator for class.field. :param scheme: Scheme for generation (class or class path) :param params: Kwargs with generator's definitions (field_name=field_generator) @@ -745,9 +760,10 @@ def func(): test.title == 'Always same' """ - fake = self.params.get('fake') + fake = self.params.get("fake") type_mixer = self.type_mixer_cls( - scheme, mixer=self, fake=fake, factory=self.__factory) + scheme, mixer=self, fake=fake, factory=self.__factory + ) for field_name, func in params.items(): type_mixer.register(field_name, func, fake=fake) @@ -758,7 +774,7 @@ def func(): @contextmanager def ctx(self, **params): - """ Redifine params for current mixer as context. + """Redifine params for current mixer as context. :: @@ -768,8 +784,8 @@ def ctx(self, **params): self.assertFalse(Hole.objects.count()) """ - _params = dict((k, v) for k, v in self.params.items() if k in params) - _params['locale'] = self.faker.locale + _params = {k: v for k, v in self.params.items() if k in params} + _params["locale"] = self.faker.locale try: self.__init_params__(**params) @@ -778,7 +794,7 @@ def ctx(self, **params): self.__init_params__(**_params) def reload(self, *objs): - """ Reload the objects from storage. """ + """Reload the objects from storage.""" results = [] for obj in objs: scheme = type(obj) @@ -788,7 +804,7 @@ def reload(self, *objs): return results if len(results) > 1 else results[0] def guard(self, *args, **kwargs): - """ Abstract method. In some backends used for prevent object creation. + """Abstract method. In some backends used for prevent object creation. :returns: A Proxy to mixer @@ -800,7 +816,7 @@ def _guard(self, scheme, guards, **values): args, kwargs = guards seek = type_mixer.guard(*args, **kwargs) if seek: - LOGGER.info('Finded: %s [%s]', seek, type(seek)) # noqa + LOGGER.info("Finded: %s [%s]", seek, type(seek)) return seek return self.blend(scheme, **values) diff --git a/noxfile.py b/noxfile.py new file mode 100644 index 00000000..2c3c78b4 --- /dev/null +++ b/noxfile.py @@ -0,0 +1,11 @@ +import os + +import nox + +os.environ.update({"PDM_IGNORE_SAVED_PYTHON": "1"}) + + +@nox.session +def tests(session): + session.run_always("pdm", "install", "-G", "all", external=True) + session.run("pytest") diff --git a/pdm.lock b/pdm.lock new file mode 100644 index 00000000..6c2854fe --- /dev/null +++ b/pdm.lock @@ -0,0 +1,1127 @@ +# This file is @generated by PDM. +# It is not intended for manual editing. + +[[package]] +name = "argcomplete" +version = "3.1.4" +requires_python = ">=3.8" +summary = "Bash tab completion for argparse" + +[[package]] +name = "asgiref" +version = "3.7.2" +requires_python = ">=3.7" +summary = "ASGI specs, helper code, and adapters" +dependencies = [ + "typing-extensions>=4; python_version < \"3.11\"", +] + +[[package]] +name = "backports-zoneinfo" +version = "0.2.1" +requires_python = ">=3.6" +summary = "Backport of the standard library zoneinfo module" + +[[package]] +name = "black" +version = "23.11.0" +requires_python = ">=3.8" +summary = "The uncompromising code formatter." +dependencies = [ + "click>=8.0.0", + "mypy-extensions>=0.4.3", + "packaging>=22.0", + "pathspec>=0.9.0", + "platformdirs>=2", + "tomli>=1.1.0; python_version < \"3.11\"", + "typing-extensions>=4.0.1; python_version < \"3.11\"", +] + +[[package]] +name = "blinker" +version = "1.7.0" +requires_python = ">=3.8" +summary = "Fast, simple object-to-object and broadcast signaling" + +[[package]] +name = "cachetools" +version = "5.3.2" +requires_python = ">=3.7" +summary = "Extensible memoizing collections and decorators" + +[[package]] +name = "cfgv" +version = "3.4.0" +requires_python = ">=3.8" +summary = "Validate configuration and produce human readable error messages." + +[[package]] +name = "chardet" +version = "5.2.0" +requires_python = ">=3.7" +summary = "Universal encoding detector for Python 3" + +[[package]] +name = "click" +version = "8.1.7" +requires_python = ">=3.7" +summary = "Composable command line interface toolkit" +dependencies = [ + "colorama; platform_system == \"Windows\"", +] + +[[package]] +name = "colorama" +version = "0.4.6" +requires_python = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" +summary = "Cross-platform colored terminal text." + +[[package]] +name = "colorlog" +version = "6.7.0" +requires_python = ">=3.6" +summary = "Add colours to the output of Python's logging module." +dependencies = [ + "colorama; sys_platform == \"win32\"", +] + +[[package]] +name = "distlib" +version = "0.3.7" +summary = "Distribution utilities" + +[[package]] +name = "django" +version = "4.2.7" +requires_python = ">=3.8" +summary = "A high-level Python web framework that encourages rapid development and clean, pragmatic design." +dependencies = [ + "asgiref<4,>=3.6.0", + "backports-zoneinfo; python_version < \"3.9\"", + "sqlparse>=0.3.1", + "tzdata; sys_platform == \"win32\"", +] + +[[package]] +name = "dnspython" +version = "2.4.2" +requires_python = ">=3.8,<4.0" +summary = "DNS toolkit" + +[[package]] +name = "exceptiongroup" +version = "1.1.3" +requires_python = ">=3.7" +summary = "Backport of PEP 654 (exception groups)" + +[[package]] +name = "faker" +version = "12.0.1" +requires_python = ">=3.6" +summary = "Faker is a Python package that generates fake data for you." +dependencies = [ + "python-dateutil>=2.4", +] + +[[package]] +name = "filelock" +version = "3.13.1" +requires_python = ">=3.8" +summary = "A platform independent file lock." + +[[package]] +name = "flask" +version = "3.0.0" +requires_python = ">=3.8" +summary = "A simple framework for building complex web applications." +dependencies = [ + "Jinja2>=3.1.2", + "Werkzeug>=3.0.0", + "blinker>=1.6.2", + "click>=8.1.3", + "importlib-metadata>=3.6.0; python_version < \"3.10\"", + "itsdangerous>=2.1.2", +] + +[[package]] +name = "flask-sqlalchemy" +version = "3.1.1" +requires_python = ">=3.8" +summary = "Add SQLAlchemy support to your Flask application." +dependencies = [ + "flask>=2.2.5", + "sqlalchemy>=2.0.16", +] + +[[package]] +name = "greenlet" +version = "3.0.1" +requires_python = ">=3.7" +summary = "Lightweight in-process concurrent programming" + +[[package]] +name = "identify" +version = "2.5.31" +requires_python = ">=3.8" +summary = "File identification library for Python" + +[[package]] +name = "importlib-metadata" +version = "6.8.0" +requires_python = ">=3.8" +summary = "Read metadata from Python packages" +dependencies = [ + "zipp>=0.5", +] + +[[package]] +name = "iniconfig" +version = "2.0.0" +requires_python = ">=3.7" +summary = "brain-dead simple config-ini parsing" + +[[package]] +name = "isort" +version = "5.12.0" +requires_python = ">=3.8.0" +summary = "A Python utility / library to sort Python imports." + +[[package]] +name = "itsdangerous" +version = "2.1.2" +requires_python = ">=3.7" +summary = "Safely pass data to untrusted environments and back." + +[[package]] +name = "jinja2" +version = "3.1.2" +requires_python = ">=3.7" +summary = "A very fast and expressive template engine." +dependencies = [ + "MarkupSafe>=2.0", +] + +[[package]] +name = "markupsafe" +version = "2.1.3" +requires_python = ">=3.7" +summary = "Safely add untrusted strings to HTML/XML markup." + +[[package]] +name = "marshmallow" +version = "3.20.1" +requires_python = ">=3.8" +summary = "A lightweight library for converting complex datatypes to and from native Python datatypes." +dependencies = [ + "packaging>=17.0", +] + +[[package]] +name = "mongoengine" +version = "0.27.0" +requires_python = ">=3.7" +summary = "MongoEngine is a Python Object-Document Mapper for working with MongoDB." +dependencies = [ + "pymongo<5.0,>=3.4", +] + +[[package]] +name = "mypy" +version = "1.7.0" +requires_python = ">=3.8" +summary = "Optional static typing for Python" +dependencies = [ + "mypy-extensions>=1.0.0", + "tomli>=1.1.0; python_version < \"3.11\"", + "typing-extensions>=4.1.0", +] + +[[package]] +name = "mypy-extensions" +version = "1.0.0" +requires_python = ">=3.5" +summary = "Type system extensions for programs checked with the mypy type checker." + +[[package]] +name = "nodeenv" +version = "1.8.0" +requires_python = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*" +summary = "Node.js virtual environment builder" +dependencies = [ + "setuptools", +] + +[[package]] +name = "nox" +version = "2023.4.22" +requires_python = ">=3.7" +summary = "Flexible test automation." +dependencies = [ + "argcomplete<4.0,>=1.9.4", + "colorlog<7.0.0,>=2.6.1", + "packaging>=20.9", + "virtualenv>=14", +] + +[[package]] +name = "packaging" +version = "23.2" +requires_python = ">=3.7" +summary = "Core utilities for Python packages" + +[[package]] +name = "pathspec" +version = "0.11.2" +requires_python = ">=3.7" +summary = "Utility library for gitignore style pattern matching of file paths." + +[[package]] +name = "peewee" +version = "3.17.0" +summary = "a little orm" + +[[package]] +name = "platformdirs" +version = "3.11.0" +requires_python = ">=3.7" +summary = "A small Python package for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." + +[[package]] +name = "pluggy" +version = "1.3.0" +requires_python = ">=3.8" +summary = "plugin and hook calling mechanisms for python" + +[[package]] +name = "pony" +version = "0.7.17" +summary = "Pony Object-Relational Mapper" + +[[package]] +name = "pre-commit" +version = "3.5.0" +requires_python = ">=3.8" +summary = "A framework for managing and maintaining multi-language pre-commit hooks." +dependencies = [ + "cfgv>=2.0.0", + "identify>=1.0.0", + "nodeenv>=0.11.1", + "pyyaml>=5.1", + "virtualenv>=20.10.0", +] + +[[package]] +name = "psycopg2-binary" +version = "2.9.9" +requires_python = ">=3.7" +summary = "psycopg2 - Python-PostgreSQL Database Adapter" + +[[package]] +name = "pymongo" +version = "4.6.0" +requires_python = ">=3.7" +summary = "Python driver for MongoDB " +dependencies = [ + "dnspython<3.0.0,>=1.16.0", +] + +[[package]] +name = "pyproject-api" +version = "1.6.1" +requires_python = ">=3.8" +summary = "API to interact with the python pyproject.toml based projects" +dependencies = [ + "packaging>=23.1", + "tomli>=2.0.1; python_version < \"3.11\"", +] + +[[package]] +name = "pytest" +version = "7.4.3" +requires_python = ">=3.7" +summary = "pytest: simple powerful testing with Python" +dependencies = [ + "colorama; sys_platform == \"win32\"", + "exceptiongroup>=1.0.0rc8; python_version < \"3.11\"", + "iniconfig", + "packaging", + "pluggy<2.0,>=0.12", + "tomli>=1.0.0; python_version < \"3.11\"", +] + +[[package]] +name = "python-dateutil" +version = "2.8.2" +requires_python = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" +summary = "Extensions to the standard Python datetime module" +dependencies = [ + "six>=1.5", +] + +[[package]] +name = "pyyaml" +version = "6.0.1" +requires_python = ">=3.6" +summary = "YAML parser and emitter for Python" + +[[package]] +name = "ruff" +version = "0.1.5" +requires_python = ">=3.7" +summary = "An extremely fast Python linter and code formatter, written in Rust." + +[[package]] +name = "setuptools" +version = "68.2.2" +requires_python = ">=3.8" +summary = "Easily download, build, install, upgrade, and uninstall Python packages" + +[[package]] +name = "six" +version = "1.16.0" +requires_python = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" +summary = "Python 2 and 3 compatibility utilities" + +[[package]] +name = "sqlalchemy" +version = "2.0.23" +requires_python = ">=3.7" +summary = "Database Abstraction Library" +dependencies = [ + "greenlet!=0.4.17; platform_machine == \"aarch64\" or (platform_machine == \"ppc64le\" or (platform_machine == \"x86_64\" or (platform_machine == \"amd64\" or (platform_machine == \"AMD64\" or (platform_machine == \"win32\" or platform_machine == \"WIN32\")))))", + "typing-extensions>=4.2.0", +] + +[[package]] +name = "sqlparse" +version = "0.4.4" +requires_python = ">=3.5" +summary = "A non-validating SQL parser." + +[[package]] +name = "tomli" +version = "2.0.1" +requires_python = ">=3.7" +summary = "A lil' TOML parser" + +[[package]] +name = "tox" +version = "4.11.3" +requires_python = ">=3.8" +summary = "tox is a generic virtualenv management and test command line tool" +dependencies = [ + "cachetools>=5.3.1", + "chardet>=5.2", + "colorama>=0.4.6", + "filelock>=3.12.3", + "packaging>=23.1", + "platformdirs>=3.10", + "pluggy>=1.3", + "pyproject-api>=1.6.1", + "tomli>=2.0.1; python_version < \"3.11\"", + "virtualenv>=20.24.3", +] + +[[package]] +name = "typing-extensions" +version = "4.8.0" +requires_python = ">=3.8" +summary = "Backported and Experimental Type Hints for Python 3.8+" + +[[package]] +name = "tzdata" +version = "2023.3" +requires_python = ">=2" +summary = "Provider of IANA time zone data" + +[[package]] +name = "virtualenv" +version = "20.24.6" +requires_python = ">=3.7" +summary = "Virtual Python Environment builder" +dependencies = [ + "distlib<1,>=0.3.7", + "filelock<4,>=3.12.2", + "platformdirs<4,>=3.9.1", +] + +[[package]] +name = "werkzeug" +version = "3.0.1" +requires_python = ">=3.8" +summary = "The comprehensive WSGI web application library." +dependencies = [ + "MarkupSafe>=2.1.1", +] + +[[package]] +name = "zipp" +version = "3.17.0" +requires_python = ">=3.8" +summary = "Backport of pathlib-compatible object wrapper for zip files" + +[metadata] +lock_version = "4.2" +cross_platform = true +groups = ["default", "all", "dev", "django", "flask", "marshmallow", "mongoengine", "peewee", "pony"] +content_hash = "sha256:a2dc024e33a08f586a3df82ebc691db6a5712e717df972a6efe18a282d2a29d5" + +[metadata.files] +"argcomplete 3.1.4" = [ + {url = "https://files.pythonhosted.org/packages/2f/91/0901d7692aa4615e131f8134769fab468d63990817dbec395fb57702dbdd/argcomplete-3.1.4-py3-none-any.whl", hash = "sha256:fbe56f8cda08aa9a04b307d8482ea703e96a6a801611acb4be9bf3942017989f"}, + {url = "https://files.pythonhosted.org/packages/48/28/2a56c0fccc0bb07bd369bbb2b2a1452743f84acb08145eaccc11b3e6fa74/argcomplete-3.1.4.tar.gz", hash = "sha256:72558ba729e4c468572609817226fb0a6e7e9a0a7d477b882be168c0b4a62b94"}, +] +"asgiref 3.7.2" = [ + {url = "https://files.pythonhosted.org/packages/12/19/64e38c1c2cbf0da9635b7082bbdf0e89052e93329279f59759c24a10cc96/asgiref-3.7.2.tar.gz", hash = "sha256:9e0ce3aa93a819ba5b45120216b23878cf6e8525eb3848653452b4192b92afed"}, + {url = "https://files.pythonhosted.org/packages/9b/80/b9051a4a07ad231558fcd8ffc89232711b4e618c15cb7a392a17384bbeef/asgiref-3.7.2-py3-none-any.whl", hash = "sha256:89b2ef2247e3b562a16eef663bc0e2e703ec6468e2fa8a5cd61cd449786d4f6e"}, +] +"backports-zoneinfo 0.2.1" = [ + {url = "https://files.pythonhosted.org/packages/1a/ab/3e941e3fcf1b7d3ab3d0233194d99d6a0ed6b24f8f956fc81e47edc8c079/backports.zoneinfo-0.2.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:7b0a64cda4145548fed9efc10322770f929b944ce5cee6c0dfe0c87bf4c0c8c9"}, + {url = "https://files.pythonhosted.org/packages/1c/96/baaca3ad1b06d97138d42a225e4d4d27cd1586b646740f771706cd2d812c/backports.zoneinfo-0.2.1-cp37-cp37m-win32.whl", hash = "sha256:e55b384612d93be96506932a786bbcde5a2db7a9e6a4bb4bffe8b733f5b9036b"}, + {url = "https://files.pythonhosted.org/packages/28/d5/e2f3d6a52870045afd8c37b2681c47fd0b98679cd4851e349bfd7e19cfd7/backports.zoneinfo-0.2.1-cp36-cp36m-win_amd64.whl", hash = "sha256:8439c030a11780786a2002261569bdf362264f605dfa4d65090b64b05c9f79a7"}, + {url = "https://files.pythonhosted.org/packages/33/1c/9357061860f5d3a09e1877aa4cf7c004c55eec40a1036761144ef24d8a1d/backports.zoneinfo-0.2.1-cp36-cp36m-macosx_10_14_x86_64.whl", hash = "sha256:da6013fd84a690242c310d77ddb8441a559e9cb3d3d59ebac9aca1a57b2e18bc"}, + {url = "https://files.pythonhosted.org/packages/4a/6d/eca004eeadcbf8bd64cc96feb9e355536147f0577420b44d80c7cac70767/backports.zoneinfo-0.2.1-cp38-cp38-macosx_10_14_x86_64.whl", hash = "sha256:8961c0f32cd0336fb8e8ead11a1f8cd99ec07145ec2931122faaac1c8f7fd987"}, + {url = "https://files.pythonhosted.org/packages/4c/7e/ed8af95bed90eeccfb4a4fe6ec424bc7a79e1aa983e54dd1d9062d9fa20b/backports.zoneinfo-0.2.1-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:5c144945a7752ca544b4b78c8c41544cdfaf9786f25fe5ffb10e838e19a27570"}, + {url = "https://files.pythonhosted.org/packages/6c/99/513f2c4dd41522eefc42feb86854f6cf3b1add9c175c14d90c070775e484/backports.zoneinfo-0.2.1-cp37-cp37m-win_amd64.whl", hash = "sha256:a76b38c52400b762e48131494ba26be363491ac4f9a04c1b7e92483d169f6582"}, + {url = "https://files.pythonhosted.org/packages/74/a1/323f86a5ca5a559d452affb879512365a0473529398bfcf2d712a40ae088/backports.zoneinfo-0.2.1-cp37-cp37m-macosx_10_14_x86_64.whl", hash = "sha256:f04e857b59d9d1ccc39ce2da1021d196e47234873820cbeaad210724b1ee28ac"}, + {url = "https://files.pythonhosted.org/packages/78/cc/e27fd6493bbce8dbea7e6c1bc861fe3d3bc22c4f7c81f4c3befb8ff5bfaf/backports.zoneinfo-0.2.1-cp38-cp38-win_amd64.whl", hash = "sha256:4a0f800587060bf8880f954dbef70de6c11bbe59c673c3d818921f042f9954a6"}, + {url = "https://files.pythonhosted.org/packages/ad/85/475e514c3140937cf435954f78dedea1861aeab7662d11de232bdaa90655/backports.zoneinfo-0.2.1.tar.gz", hash = "sha256:fadbfe37f74051d024037f223b8e001611eac868b5c5b06144ef4d8b799862f2"}, + {url = "https://files.pythonhosted.org/packages/c0/34/5fdb0a3a28841d215c255be8fc60b8666257bb6632193c86fd04b63d4a31/backports.zoneinfo-0.2.1-cp38-cp38-win32.whl", hash = "sha256:1b13e654a55cd45672cb54ed12148cd33628f672548f373963b0bff67b217328"}, + {url = "https://files.pythonhosted.org/packages/c1/8f/9b1b920a6a95652463143943fa3b8c000cb0b932ab463764a6f2a2416560/backports.zoneinfo-0.2.1-cp38-cp38-manylinux1_i686.whl", hash = "sha256:e81b76cace8eda1fca50e345242ba977f9be6ae3945af8d46326d776b4cf78d1"}, + {url = "https://files.pythonhosted.org/packages/d1/04/8f2fed9c0cb9c88442fc8d6372cb0f5738fb05a65b45e2d371fbc8a15087/backports.zoneinfo-0.2.1-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:17746bd546106fa389c51dbea67c8b7c8f0d14b5526a579ca6ccf5ed72c526cf"}, + {url = "https://files.pythonhosted.org/packages/d4/79/249bd3c4f794741f04f1e0ff33ad3cca9b2d1f4299b73f78d0d9bc9ec8dc/backports.zoneinfo-0.2.1-cp36-cp36m-win32.whl", hash = "sha256:e8236383a20872c0cdf5a62b554b27538db7fa1bbec52429d8d106effbaeca08"}, + {url = "https://files.pythonhosted.org/packages/ef/9a/8de8f379d5b3961a517762cc051b366de3f7d4d3a2250120e7a71e25fab4/backports.zoneinfo-0.2.1-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:89a48c0d158a3cc3f654da4c2de1ceba85263fafb861b98b59040a5086259722"}, + {url = "https://files.pythonhosted.org/packages/f9/04/33e910faffe91a5680d68a064162525779259ae5de3b0c0c5bd9c4e900e0/backports.zoneinfo-0.2.1-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:1c5742112073a563c81f786e77514969acb58649bcdf6cdf0b4ed31a348d4546"}, +] +"black 23.11.0" = [ + {url = "https://files.pythonhosted.org/packages/05/f5/02e8453d4afcd595a125267e1842d7ee1777671b1232e0af53d697ae2e66/black-23.11.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:4c44b7211a3a0570cc097e81135faa5f261264f4dfaa22bd5ee2875a4e773bd6"}, + {url = "https://files.pythonhosted.org/packages/37/0b/2cf6d012a3cdb3f76d5c4e0c311b39f311a265d7dda315800ae34fb639c6/black-23.11.0-cp311-cp311-win_amd64.whl", hash = "sha256:58e5f4d08a205b11800332920e285bd25e1a75c54953e05502052738fe16b3b5"}, + {url = "https://files.pythonhosted.org/packages/3b/d8/ea841502c79d85675e56c40d77de59aae44e311f17b463815d6a9659608c/black-23.11.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:cf57719e581cfd48c4efe28543fea3d139c6b6f1238b3f0102a9c73992cbb479"}, + {url = "https://files.pythonhosted.org/packages/42/8d/b47852614eca99e1178c7598f033fffc8e5a4687549b749216ebe0f24b6f/black-23.11.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5133f5507007ba08d8b7b263c7aa0f931af5ba88a29beacc4b2dc23fcefe9c06"}, + {url = "https://files.pythonhosted.org/packages/46/0a/964b242c01b8dbadec60afd2f1d3e08ad574315d34a33a692e96f121a32b/black-23.11.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:760415ccc20f9e8747084169110ef75d545f3b0932ee21368f63ac0fee86b221"}, + {url = "https://files.pythonhosted.org/packages/4e/09/75c374a20c458230ed8288d1e68ba38ecf508e948b8bf8980e8b0fd4c3b1/black-23.11.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:698c1e0d5c43354ec5d6f4d914d0d553a9ada56c85415700b81dc90125aac244"}, + {url = "https://files.pythonhosted.org/packages/70/b9/70ad156cf04ed53d6e671efea412a4515167ce75559815a59a64330f8964/black-23.11.0-cp38-cp38-win_amd64.whl", hash = "sha256:fc7f6a44d52747e65a02558e1d807c82df1d66ffa80a601862040a43ec2e3142"}, + {url = "https://files.pythonhosted.org/packages/75/1a/d0cfb2ae52ebfe7eeeb4b23090bff5ad9e071015c0373da9790f0e4a790b/black-23.11.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d136ef5b418c81660ad847efe0e55c58c8208b77a57a28a503a5f345ccf01394"}, + {url = "https://files.pythonhosted.org/packages/75/3a/e165fdb926e88acfface56a3a4267b20cc08015a141d75247d4f00c62509/black-23.11.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:dbea0bb8575c6b6303cc65017b46351dc5953eea5c0a59d7b7e3a2d2f433a911"}, + {url = "https://files.pythonhosted.org/packages/85/a1/00b6bbc478f455bd6102eb542ab6a8f25ecc357c91db65e6fa246678f3fb/black-23.11.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2a9acad1451632021ee0d146c8765782a0c3846e0e0ea46659d7c4f89d9b212b"}, + {url = "https://files.pythonhosted.org/packages/9a/14/5aabe44a3f8058f02d595a68755150e2cda89103a1f73e7406fb730887dd/black-23.11.0-cp39-cp39-win_amd64.whl", hash = "sha256:421f3e44aa67138ab1b9bfbc22ee3780b22fa5b291e4db8ab7eee95200726b07"}, + {url = "https://files.pythonhosted.org/packages/b9/7d/527c9ae32ef45c3828daf5854dcffcb324da77a37ee2d379ef79d24612ee/black-23.11.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:412f56bab20ac85927f3a959230331de5614aecda1ede14b373083f62ec24e6f"}, + {url = "https://files.pythonhosted.org/packages/be/fb/8a670d2a246a351d7662e785d85a636c1c60b5800d175421cdfcb2a59b1d/black-23.11.0-py3-none-any.whl", hash = "sha256:54caaa703227c6e0c87b76326d0862184729a69b73d3b7305b6288e1d830067e"}, + {url = "https://files.pythonhosted.org/packages/c0/54/8b5090ef893cabfc6c261625e944aa03669639f52f2ee7e2e25273be32e5/black-23.11.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:250d7e60f323fcfc8ea6c800d5eba12f7967400eb6c2d21ae85ad31c204fb1f4"}, + {url = "https://files.pythonhosted.org/packages/ce/59/b0c04cd9ddccb19660ba92c6ebb559face8533b12f04003b912c5c38f5db/black-23.11.0-cp310-cp310-win_amd64.whl", hash = "sha256:6c1cac07e64433f646a9a838cdc00c9768b3c362805afc3fce341af0e6a9ae9f"}, + {url = "https://files.pythonhosted.org/packages/ec/ba/c10c1f4048bc9eb26f68b230144e5f18f3b8cf6223738ceb14aabd3ec13b/black-23.11.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:7f622b6822f02bfaf2a5cd31fdb7cd86fcf33dab6ced5185c35f5db98260b055"}, + {url = "https://files.pythonhosted.org/packages/ef/21/c2d38c7c98a089fd0f7e1a8be16c07f141ed57339b3082737de90db0ca59/black-23.11.0.tar.gz", hash = "sha256:4c68855825ff432d197229846f971bc4d6666ce90492e5b02013bcaca4d9ab05"}, + {url = "https://files.pythonhosted.org/packages/f4/19/1673913daabd47bfe346ea7ace04ba5e3daaf625ac42478d9d491a741c40/black-23.11.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:45aa1d4675964946e53ab81aeec7a37613c1cb71647b5394779e6efb79d6d187"}, +] +"blinker 1.7.0" = [ + {url = "https://files.pythonhosted.org/packages/a1/13/6df5fc090ff4e5d246baf1f45fe9e5623aa8565757dfa5bd243f6a545f9e/blinker-1.7.0.tar.gz", hash = "sha256:e6820ff6fa4e4d1d8e2747c2283749c3f547e4fee112b98555cdcdae32996182"}, + {url = "https://files.pythonhosted.org/packages/fa/2a/7f3714cbc6356a0efec525ce7a0613d581072ed6eb53eb7b9754f33db807/blinker-1.7.0-py3-none-any.whl", hash = "sha256:c3f865d4d54db7abc53758a01601cf343fe55b84c1de4e3fa910e420b438d5b9"}, +] +"cachetools 5.3.2" = [ + {url = "https://files.pythonhosted.org/packages/10/21/1b6880557742c49d5b0c4dcf0cf544b441509246cdd71182e0847ac859d5/cachetools-5.3.2.tar.gz", hash = "sha256:086ee420196f7b2ab9ca2db2520aca326318b68fe5ba8bc4d49cca91add450f2"}, + {url = "https://files.pythonhosted.org/packages/a2/91/2d843adb9fbd911e0da45fbf6f18ca89d07a087c3daa23e955584f90ebf4/cachetools-5.3.2-py3-none-any.whl", hash = "sha256:861f35a13a451f94e301ce2bec7cac63e881232ccce7ed67fab9b5df4d3beaa1"}, +] +"cfgv 3.4.0" = [ + {url = "https://files.pythonhosted.org/packages/11/74/539e56497d9bd1d484fd863dd69cbbfa653cd2aa27abfe35653494d85e94/cfgv-3.4.0.tar.gz", hash = "sha256:e52591d4c5f5dead8e0f673fb16db7949d2cfb3f7da4582893288f0ded8fe560"}, + {url = "https://files.pythonhosted.org/packages/c5/55/51844dd50c4fc7a33b653bfaba4c2456f06955289ca770a5dbd5fd267374/cfgv-3.4.0-py2.py3-none-any.whl", hash = "sha256:b7265b1f29fd3316bfcd2b330d63d024f2bfd8bcb8b0272f8e19a504856c48f9"}, +] +"chardet 5.2.0" = [ + {url = "https://files.pythonhosted.org/packages/38/6f/f5fbc992a329ee4e0f288c1fe0e2ad9485ed064cac731ed2fe47dcc38cbf/chardet-5.2.0-py3-none-any.whl", hash = "sha256:e1cf59446890a00105fe7b7912492ea04b6e6f06d4b742b2c788469e34c82970"}, + {url = "https://files.pythonhosted.org/packages/f3/0d/f7b6ab21ec75897ed80c17d79b15951a719226b9fababf1e40ea74d69079/chardet-5.2.0.tar.gz", hash = "sha256:1b3b6ff479a8c414bc3fa2c0852995695c4a026dcd6d0633b2dd092ca39c1cf7"}, +] +"click 8.1.7" = [ + {url = "https://files.pythonhosted.org/packages/00/2e/d53fa4befbf2cfa713304affc7ca780ce4fc1fd8710527771b58311a3229/click-8.1.7-py3-none-any.whl", hash = "sha256:ae74fb96c20a0277a1d615f1e4d73c8414f5a98db8b799a7931d1582f3390c28"}, + {url = "https://files.pythonhosted.org/packages/96/d3/f04c7bfcf5c1862a2a5b845c6b2b360488cf47af55dfa79c98f6a6bf98b5/click-8.1.7.tar.gz", hash = "sha256:ca9853ad459e787e2192211578cc907e7594e294c7ccc834310722b41b9ca6de"}, +] +"colorama 0.4.6" = [ + {url = "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"}, + {url = "https://files.pythonhosted.org/packages/d8/53/6f443c9a4a8358a93a6792e2acffb9d9d5cb0a5cfd8802644b7b1c9a02e4/colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, +] +"colorlog 6.7.0" = [ + {url = "https://files.pythonhosted.org/packages/58/43/a363c213224448f9e194d626221123ce00e3fb3d87c0c22aed52b620bdd1/colorlog-6.7.0-py2.py3-none-any.whl", hash = "sha256:0d33ca236784a1ba3ff9c532d4964126d8a2c44f1f0cb1d2b0728196f512f662"}, + {url = "https://files.pythonhosted.org/packages/78/6b/4e5481ddcdb9c255b2715f54c863629f1543e97bc8c309d1c5c131ad14f2/colorlog-6.7.0.tar.gz", hash = "sha256:bd94bd21c1e13fac7bd3153f4bc3a7dc0eb0974b8bc2fdf1a989e474f6e582e5"}, +] +"distlib 0.3.7" = [ + {url = "https://files.pythonhosted.org/packages/29/34/63be59bdf57b3a8a8dcc252ef45c40f3c018777dc8843d45dd9b869868f0/distlib-0.3.7.tar.gz", hash = "sha256:9dafe54b34a028eafd95039d5e5d4851a13734540f1331060d31c9916e7147a8"}, + {url = "https://files.pythonhosted.org/packages/43/a0/9ba967fdbd55293bacfc1507f58e316f740a3b231fc00e3d86dc39bc185a/distlib-0.3.7-py2.py3-none-any.whl", hash = "sha256:2e24928bc811348f0feb63014e97aaae3037f2cf48712d51ae61df7fd6075057"}, +] +"django 4.2.7" = [ + {url = "https://files.pythonhosted.org/packages/2d/6d/e87236e3c7b2f5911d132034177aebb605f3953910cc429df8061b13bf10/Django-4.2.7-py3-none-any.whl", hash = "sha256:e1d37c51ad26186de355cbcec16613ebdabfa9689bbade9c538835205a8abbe9"}, + {url = "https://files.pythonhosted.org/packages/5c/62/0c6ab2f3ac9a242b4562b6be1c418685fa7d1ccb8ca302cdb97e0b23cf4b/Django-4.2.7.tar.gz", hash = "sha256:8e0f1c2c2786b5c0e39fe1afce24c926040fad47c8ea8ad30aaf1188df29fc41"}, +] +"dnspython 2.4.2" = [ + {url = "https://files.pythonhosted.org/packages/65/2d/372a20e52a87b2ba0160997575809806111a72e18aa92738daccceb8d2b9/dnspython-2.4.2.tar.gz", hash = "sha256:8dcfae8c7460a2f84b4072e26f1c9f4101ca20c071649cb7c34e8b6a93d58984"}, + {url = "https://files.pythonhosted.org/packages/f6/b4/0a9bee52c50f226a3cbfb54263d02bb421c7f2adc136520729c2c689c1e5/dnspython-2.4.2-py3-none-any.whl", hash = "sha256:57c6fbaaeaaf39c891292012060beb141791735dbb4004798328fc2c467402d8"}, +] +"exceptiongroup 1.1.3" = [ + {url = "https://files.pythonhosted.org/packages/ad/83/b71e58666f156a39fb29417e4c8ca4bc7400c0dd4ed9e8842ab54dc8c344/exceptiongroup-1.1.3-py3-none-any.whl", hash = "sha256:343280667a4585d195ca1cf9cef84a4e178c4b6cf2274caef9859782b567d5e3"}, + {url = "https://files.pythonhosted.org/packages/c2/e1/5561ad26f99b7779c28356f73f69a8b468ef491d0f6adf20d7ed0ac98ec1/exceptiongroup-1.1.3.tar.gz", hash = "sha256:097acd85d473d75af5bb98e41b61ff7fe35efe6675e4f9370ec6ec5126d160e9"}, +] +"faker 12.0.1" = [ + {url = "https://files.pythonhosted.org/packages/89/f2/ea1966e890603e172b7f3bebde614813a24986390799d4dd43960aeffd18/Faker-12.0.1.tar.gz", hash = "sha256:aa7103805ae793277abbb85da9f6f05e76a1a295a9384a8e17c2fba2b3a690cb"}, + {url = "https://files.pythonhosted.org/packages/ae/10/9a650725c310f61160909637446c18b92db7585ddf3326bc0767b850075e/Faker-12.0.1-py3-none-any.whl", hash = "sha256:1dc2811f20e163892fefe7006f2ce00778f8099a40aee265bfa60a13400de63d"}, +] +"filelock 3.13.1" = [ + {url = "https://files.pythonhosted.org/packages/70/70/41905c80dcfe71b22fb06827b8eae65781783d4a14194bce79d16a013263/filelock-3.13.1.tar.gz", hash = "sha256:521f5f56c50f8426f5e03ad3b281b490a87ef15bc6c526f168290f0c7148d44e"}, + {url = "https://files.pythonhosted.org/packages/81/54/84d42a0bee35edba99dee7b59a8d4970eccdd44b99fe728ed912106fc781/filelock-3.13.1-py3-none-any.whl", hash = "sha256:57dbda9b35157b05fb3e58ee91448612eb674172fab98ee235ccb0b5bee19a1c"}, +] +"flask 3.0.0" = [ + {url = "https://files.pythonhosted.org/packages/36/42/015c23096649b908c809c69388a805a571a3bea44362fe87e33fc3afa01f/flask-3.0.0-py3-none-any.whl", hash = "sha256:21128f47e4e3b9d597a3e8521a329bf56909b690fcc3fa3e477725aa81367638"}, + {url = "https://files.pythonhosted.org/packages/d8/09/c1a7354d3925a3c6c8cfdebf4245bae67d633ffda1ba415add06ffc839c5/flask-3.0.0.tar.gz", hash = "sha256:cfadcdb638b609361d29ec22360d6070a77d7463dcb3ab08d2c2f2f168845f58"}, +] +"flask-sqlalchemy 3.1.1" = [ + {url = "https://files.pythonhosted.org/packages/1d/6a/89963a5c6ecf166e8be29e0d1bf6806051ee8fe6c82e232842e3aeac9204/flask_sqlalchemy-3.1.1-py3-none-any.whl", hash = "sha256:4ba4be7f419dc72f4efd8802d69974803c37259dd42f3913b0dcf75c9447e0a0"}, + {url = "https://files.pythonhosted.org/packages/91/53/b0a9fcc1b1297f51e68b69ed3b7c3c40d8c45be1391d77ae198712914392/flask_sqlalchemy-3.1.1.tar.gz", hash = "sha256:e4b68bb881802dda1a7d878b2fc84c06d1ee57fb40b874d3dc97dabfa36b8312"}, +] +"greenlet 3.0.1" = [ + {url = "https://files.pythonhosted.org/packages/02/72/36fb2c35547fdf473629579fc35d9a2034592ea3f01710702d81ef596e16/greenlet-3.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:52e93b28db27ae7d208748f45d2db8a7b6a380e0d703f099c949d0f0d80b70e9"}, + {url = "https://files.pythonhosted.org/packages/06/6d/214cfb83e02ea10eefa71e5df028cc83fe7850783d5832142dfb7eb6bb6f/greenlet-3.0.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:ce85c43ae54845272f6f9cd8320d034d7a946e9773c693b27d620edec825e376"}, + {url = "https://files.pythonhosted.org/packages/07/e2/91bf652b49f4a7cce91c63e4fe0da518153a52e5f33660f76f971c50ad0e/greenlet-3.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:22f79120a24aeeae2b4471c711dcf4f8c736a2bb2fabad2a67ac9a55ea72523c"}, + {url = "https://files.pythonhosted.org/packages/13/7e/3d6c8ab4a868cbe13acdc7fa2589e6848a16e10a9d47a97aa9493fa0d9c3/greenlet-3.0.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b8ba29306c5de7717b5761b9ea74f9c72b9e2b834e24aa984da99cbfc70157fd"}, + {url = "https://files.pythonhosted.org/packages/19/74/f853d9ba23292692c5c2c9ae998381d9096ca3749a55f6035b6746bb919b/greenlet-3.0.1-cp39-cp39-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:85d2b77e7c9382f004b41d9c72c85537fac834fb141b0296942d52bf03fe4a3d"}, + {url = "https://files.pythonhosted.org/packages/1b/10/095ac4f9c3d74d672ea5059eaddf245108371498ff348d23dd91992184ce/greenlet-3.0.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:599daf06ea59bfedbec564b1692b0166a0045f32b6f0933b0dd4df59a854caf2"}, + {url = "https://files.pythonhosted.org/packages/1c/c8/a2cef8f16e5a05fa9ee1f31ad2ed99d59a656fab8e753e377467aafe6761/greenlet-3.0.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8bef097455dea90ffe855286926ae02d8faa335ed8e4067326257cb571fc1445"}, + {url = "https://files.pythonhosted.org/packages/27/e8/250efdec9edf15019b2eda9b6f823988924a1196ae454ce8cdd5862147dd/greenlet-3.0.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dc4d815b794fd8868c4d67602692c21bf5293a75e4b607bb92a11e821e2b859a"}, + {url = "https://files.pythonhosted.org/packages/28/1c/ae9064db808a13be14c765214d502a87a840112d5b9761ad60f2299bfd2c/greenlet-3.0.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:5805e71e5b570d490938d55552f5a9e10f477c19400c38bf1d5190d760691846"}, + {url = "https://files.pythonhosted.org/packages/2a/7d/12ec053d20a7fd011eab850c3ab9cbe27444128ae570b8f99a6ee0a84215/greenlet-3.0.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:87c8ceb0cf8a5a51b8008b643844b7f4a8264a2c13fcbcd8a8316161725383fe"}, + {url = "https://files.pythonhosted.org/packages/2d/a1/507e15c307139a3506bd250d5ccdb16df5535a8ea88c13915522ef6d45df/greenlet-3.0.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:6e6061bf1e9565c29002e3c601cf68569c450be7fc3f7336671af7ddb4657166"}, + {url = "https://files.pythonhosted.org/packages/3b/20/da6746e1efbb114740b6e1671ee0d35a5ff39e49f6a1c169e8328d47b7c8/greenlet-3.0.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:f7bfb769f7efa0eefcd039dd19d843a4fbfbac52f1878b1da2ed5793ec9b1a65"}, + {url = "https://files.pythonhosted.org/packages/3e/82/cac626c3ab768a69f86ccf022d2541f7d79910c9c64ea16e7bc9cf49433d/greenlet-3.0.1-cp38-cp38-win32.whl", hash = "sha256:0b6f9f8ca7093fd4433472fd99b5650f8a26dcd8ba410e14094c1e44cd3ceddd"}, + {url = "https://files.pythonhosted.org/packages/3e/87/88d45172c2fe19052d782bf616ce5a2a92604823320b7cd59ea2dd9ad41d/greenlet-3.0.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:19075157a10055759066854a973b3d1325d964d498a805bb68a1f9af4aaef8ec"}, + {url = "https://files.pythonhosted.org/packages/42/85/32e38abd5f046d56c9ff762c66ddd763cee17daccefa6f22fdae7f7e6472/greenlet-3.0.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:91e6c7db42638dc45cf2e13c73be16bf83179f7859b07cfc139518941320be96"}, + {url = "https://files.pythonhosted.org/packages/42/9a/43296ec8df72087986de68f17740f7bbd87ec636187e788aeaf42923aa3c/greenlet-3.0.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ea6b8aa9e08eea388c5f7a276fabb1d4b6b9d6e4ceb12cc477c3d352001768a9"}, + {url = "https://files.pythonhosted.org/packages/4c/2d/e8aae301e29ad6574b79b8442f0ed961005646dc61367f207f3e3a3aaade/greenlet-3.0.1-cp37-cp37m-win32.whl", hash = "sha256:b489c36d1327868d207002391f662a1d163bdc8daf10ab2e5f6e41b9b96de3b1"}, + {url = "https://files.pythonhosted.org/packages/54/45/fc48910a3e35866eb65dab82c94bf4e24541e8ff0ed1424f9940d3fcfeb3/greenlet-3.0.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:329c5a2e5a0ee942f2992c5e3ff40be03e75f745f48847f118a3cfece7a28546"}, + {url = "https://files.pythonhosted.org/packages/54/df/718c9b3e90edba70fa919bb3aaa5c3c8dabf3a8252ad1e93d33c348e5ca4/greenlet-3.0.1.tar.gz", hash = "sha256:816bd9488a94cba78d93e1abb58000e8266fa9cc2aa9ccdd6eb0696acb24005b"}, + {url = "https://files.pythonhosted.org/packages/56/4a/b4245b371aef65b59bfde97106038f05b90c0cb8521f27d7225310161bbc/greenlet-3.0.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4eddd98afc726f8aee1948858aed9e6feeb1758889dfd869072d4465973f6bfd"}, + {url = "https://files.pythonhosted.org/packages/5a/02/1af39bb1c3a5cbeae5522384bf94e9930a1c630fbef128098ac338f3de7a/greenlet-3.0.1-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:337322096d92808f76ad26061a8f5fccb22b0809bea39212cd6c406f6a7060d2"}, + {url = "https://files.pythonhosted.org/packages/5b/ee/3b61723db7690e1168f4ed1af98ea595bcc843c6221d13846d6cc390b2cb/greenlet-3.0.1-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2847e5d7beedb8d614186962c3d774d40d3374d580d2cbdab7f184580a39d234"}, + {url = "https://files.pythonhosted.org/packages/64/d2/8ecf5e4b69ad8b9780f31727e6b074ad9093224a163952a8b373dd26b283/greenlet-3.0.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3fcc780ae8edbb1d050d920ab44790201f027d59fdbd21362340a85c79066a74"}, + {url = "https://files.pythonhosted.org/packages/68/6d/ef8c5988a8276ef81a006f5cf5620027d2b286ffb2b25dbf545c16433a50/greenlet-3.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:990066bff27c4fcf3b69382b86f4c99b3652bab2a7e685d968cd4d0cfc6f67c6"}, + {url = "https://files.pythonhosted.org/packages/69/19/35256503ad385a5e375cb45bf848750c625701ab9137069e7f7af86caaa5/greenlet-3.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:89ee2e967bd7ff85d84a2de09df10e021c9b38c7d91dead95b406ed6350c6997"}, + {url = "https://files.pythonhosted.org/packages/6a/80/0055dba3e637f9802190b371adbff42ef55cf3ba5b78683d8b43a3f81efa/greenlet-3.0.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:55d62807f1c5a1682075c62436702aaba941daa316e9161e4b6ccebbbf38bda3"}, + {url = "https://files.pythonhosted.org/packages/6b/bd/033343cf60d27702d3be9edba9dbc8392594e6c4a6eede337dbb40e0c4b2/greenlet-3.0.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:97e7ac860d64e2dcba5c5944cfc8fa9ea185cd84061c623536154d5a89237884"}, + {url = "https://files.pythonhosted.org/packages/6d/97/20468d6778405d74638820ddd394146308c89e12be7fa541704a289122a0/greenlet-3.0.1-cp37-cp37m-win_amd64.whl", hash = "sha256:f33f3258aae89da191c6ebaa3bc517c6c4cbc9b9f689e5d8452f7aedbb913fa8"}, + {url = "https://files.pythonhosted.org/packages/72/2e/af8a579a8420886d345a26b171275e3f33d0e9a5a5379400aabb55ddad35/greenlet-3.0.1-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:dbd4c177afb8a8d9ba348d925b0b67246147af806f0b104af4d24f144d461cd5"}, + {url = "https://files.pythonhosted.org/packages/73/10/dbed72dde668f65e14d53bc82ead548c77cab072ed87aed5b3a65c311859/greenlet-3.0.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:daa7197b43c707462f06d2c693ffdbb5991cbb8b80b5b984007de431493a319c"}, + {url = "https://files.pythonhosted.org/packages/73/f2/f66764fda8e31e742fb7ee2bfaef83fd856681c6da504d8784d2e58f2dac/greenlet-3.0.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:d57e20ba591727da0c230ab2c3f200ac9d6d333860d85348816e1dca4cc4792e"}, + {url = "https://files.pythonhosted.org/packages/84/f1/20ca83426ce40bf02eb91b62c96f422298bb2b877c091a722ad12dde1c6b/greenlet-3.0.1-cp39-cp39-win32.whl", hash = "sha256:cf868e08690cb89360eebc73ba4be7fb461cfbc6168dd88e2fbbe6f31812cd57"}, + {url = "https://files.pythonhosted.org/packages/8b/8e/6a3f249bc964216b4d09978898607871df806482ec8289b261f69b89858d/greenlet-3.0.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b9934adbd0f6e476f0ecff3c94626529f344f57b38c9a541f87098710b18af0a"}, + {url = "https://files.pythonhosted.org/packages/8c/47/8f87a47c71417f35a4e4e7d84e7c793207d5c38edfe94a757466d4ce8c0c/greenlet-3.0.1-cp38-cp38-macosx_11_0_universal2.whl", hash = "sha256:d2905ce1df400360463c772b55d8e2518d0e488a87cdea13dd2c71dcb2a1fa16"}, + {url = "https://files.pythonhosted.org/packages/97/4f/2b064573c7b15a10ff15534d12e78a66793ece6821f2f84f7654a96b4732/greenlet-3.0.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0a02d259510b3630f330c86557331a3b0e0c79dac3d166e449a39363beaae174"}, + {url = "https://files.pythonhosted.org/packages/9c/7e/4d0b68222429b757351b534a021efc8e167ec8ef06c04201e7df1e2023a8/greenlet-3.0.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:696d8e7d82398e810f2b3622b24e87906763b6ebfd90e361e88eb85b0e554dc8"}, + {url = "https://files.pythonhosted.org/packages/a2/08/aab4e6e2747b96445a7bc7aef0fc152e237f6624e043b897ae302deaab85/greenlet-3.0.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:d923ff276f1c1f9680d32832f8d6c040fe9306cbfb5d161b0911e9634be9ef0a"}, + {url = "https://files.pythonhosted.org/packages/af/64/7c601dc6e20dfb855bf81654a81daf71522a4c66af2a576a25373d10871f/greenlet-3.0.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:19bbdf1cce0346ef7341705d71e2ecf6f41a35c311137f29b8a2dc2341374565"}, + {url = "https://files.pythonhosted.org/packages/b0/44/22b51624026a9cdf2160eb1ec2bb22dd6de00bc9afefbd63eb57808af79c/greenlet-3.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:28e89e232c7593d33cac35425b58950789962011cc274aa43ef8865f2e11f46d"}, + {url = "https://files.pythonhosted.org/packages/b1/62/1501a7dd0ac305a3f2c4d5ac9e526a71e96070cb1c27a6d2d7fd11c65d38/greenlet-3.0.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1757936efea16e3f03db20efd0cd50a1c86b06734f9f7338a90c4ba85ec2ad5a"}, + {url = "https://files.pythonhosted.org/packages/b7/c1/bf937378fd918599a3b51f55bf049e5df59eac6557380a30f3e78da56b7e/greenlet-3.0.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e9d21aaa84557d64209af04ff48e0ad5e28c5cca67ce43444e939579d085da72"}, + {url = "https://files.pythonhosted.org/packages/c3/32/650b140a872beb87cdfa81b0c64ac5c476fc3d91b12b5d12e6ccc4cdcd9c/greenlet-3.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:ac4a39d1abae48184d420aa8e5e63efd1b75c8444dd95daa3e03f6c6310e9619"}, + {url = "https://files.pythonhosted.org/packages/c6/c9/b420a38f36723716386f8cd1b0fe0423697c7358c8b5a4bfb1e96153ec80/greenlet-3.0.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8d11ebbd679e927593978aa44c10fc2092bc454b7d13fdc958d3e9d508aba7d0"}, + {url = "https://files.pythonhosted.org/packages/c7/f7/cbb801142b544f94b66d66a2686d5df8f1cc461875934c439285ad9545fc/greenlet-3.0.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:80ac992f25d10aaebe1ee15df45ca0d7571d0f70b645c08ec68733fb7a020206"}, + {url = "https://files.pythonhosted.org/packages/c8/80/afc87c588335e10aa5674896fb87339b7e9dbce0b8ffddace91f8e0c576c/greenlet-3.0.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d6a8c9d4f8692917a3dc7eb25a6fb337bff86909febe2f793ec1928cd97bedfc"}, + {url = "https://files.pythonhosted.org/packages/cc/6a/048622708daaeb3a808b48b180cd62d0d181d788897ed655c268561583c4/greenlet-3.0.1-cp38-cp38-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:eabe7090db68c981fca689299c2d116400b553f4b713266b130cfc9e2aa9c5a9"}, + {url = "https://files.pythonhosted.org/packages/ce/76/257d50829841cb13b163764cdef35197c8a0bd351ad94fc05795ca28fb21/greenlet-3.0.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:b2c02d2ad98116e914d4f3155ffc905fd0c025d901ead3f6ed07385e19122c94"}, + {url = "https://files.pythonhosted.org/packages/d0/ea/011598ab312a1caf413cd8d12675342e2a7a74d3b8bfac3f2a051649aba4/greenlet-3.0.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:f89e21afe925fcfa655965ca8ea10f24773a1791400989ff32f467badfe4a064"}, + {url = "https://files.pythonhosted.org/packages/da/ab/7cc6502628565d70dce2edb619d87554d65ac4e2f17c805a5a45bfaefa5c/greenlet-3.0.1-cp310-cp310-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b641161c302efbb860ae6b081f406839a8b7d5573f20a455539823802c655f63"}, + {url = "https://files.pythonhosted.org/packages/e2/be/779ccd3759b56f3a7db64d312c26a168181f2d212b6b00a9f52840bf68f7/greenlet-3.0.1-cp37-cp37m-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:41bdeeb552d814bcd7fb52172b304898a35818107cc8778b5101423c9017b3de"}, + {url = "https://files.pythonhosted.org/packages/e4/a2/4aef74022a8c756dfd5c55dc850041ee999dbca46792dda11b6c00d29543/greenlet-3.0.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:fa24255ae3c0ab67e613556375a4341af04a084bd58764731972bcbc8baeba36"}, + {url = "https://files.pythonhosted.org/packages/ea/c7/56afa98869fc4d927890ccdbc9c57fa66f0e02a3c0860271d36ab1567357/greenlet-3.0.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:20107edf7c2c3644c67c12205dc60b1bb11d26b2610b276f97d666110d1b511d"}, + {url = "https://files.pythonhosted.org/packages/ec/e4/ccd3e98a227154d370facbb147eb54ed91cc113e362c66de89e2127bae4f/greenlet-3.0.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:60d5772e8195f4e9ebf74046a9121bbb90090f6550f81d8956a05387ba139353"}, + {url = "https://files.pythonhosted.org/packages/f0/cb/897fcbd1359e50cd6bdd7f7aa5da57cd0c7eeb5d97cb59c7bafc6f8c9cdf/greenlet-3.0.1-cp312-cp312-win_amd64.whl", hash = "sha256:b2d3337dcfaa99698aa2377c81c9ca72fcd89c07e7eb62ece3f23a3fe89b2ce4"}, + {url = "https://files.pythonhosted.org/packages/f4/db/d3c54d1fb04814ee8f1a67613406086a5be946c658bf5d256f3fdd555315/greenlet-3.0.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:f2f6d303f3dee132b322a14cd8765287b8f86cdc10d2cb6a6fae234ea488888e"}, + {url = "https://files.pythonhosted.org/packages/fd/18/61c3c50983acf32495f2f99e28d36efc1d876081d920c47175195f188ed0/greenlet-3.0.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9fbc5b8f3dfe24784cee8ce0be3da2d8a79e46a276593db6868382d9c50d97b1"}, + {url = "https://files.pythonhosted.org/packages/ff/84/08e7e5b1d44772b6ea7e0b98ec7e8504a15d5ec8f32cdb89577afdb0c23b/greenlet-3.0.1-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:100f78a29707ca1525ea47388cec8a049405147719f47ebf3895e7509c6446aa"}, +] +"identify 2.5.31" = [ + {url = "https://files.pythonhosted.org/packages/31/43/5c1a4102b72ee57476b8fd4e49a65fdbea79742413a7a024216fb05f486d/identify-2.5.31.tar.gz", hash = "sha256:7736b3c7a28233637e3c36550646fc6389bedd74ae84cb788200cc8e2dd60b75"}, + {url = "https://files.pythonhosted.org/packages/46/02/2581c37256119d65e6f1f47b62dd51dd3136d6b207bb49a8885a0d45c41a/identify-2.5.31-py2.py3-none-any.whl", hash = "sha256:90199cb9e7bd3c5407a9b7e81b4abec4bb9d249991c79439ec8af740afc6293d"}, +] +"importlib-metadata 6.8.0" = [ + {url = "https://files.pythonhosted.org/packages/33/44/ae06b446b8d8263d712a211e959212083a5eda2bf36d57ca7415e03f6f36/importlib_metadata-6.8.0.tar.gz", hash = "sha256:dbace7892d8c0c4ac1ad096662232f831d4e64f4c4545bd53016a3e9d4654743"}, + {url = "https://files.pythonhosted.org/packages/cc/37/db7ba97e676af155f5fcb1a35466f446eadc9104e25b83366e8088c9c926/importlib_metadata-6.8.0-py3-none-any.whl", hash = "sha256:3ebb78df84a805d7698245025b975d9d67053cd94c79245ba4b3eb694abe68bb"}, +] +"iniconfig 2.0.0" = [ + {url = "https://files.pythonhosted.org/packages/d7/4b/cbd8e699e64a6f16ca3a8220661b5f83792b3017d0f79807cb8708d33913/iniconfig-2.0.0.tar.gz", hash = "sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3"}, + {url = "https://files.pythonhosted.org/packages/ef/a6/62565a6e1cf69e10f5727360368e451d4b7f58beeac6173dc9db836a5b46/iniconfig-2.0.0-py3-none-any.whl", hash = "sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374"}, +] +"isort 5.12.0" = [ + {url = "https://files.pythonhosted.org/packages/0a/63/4036ae70eea279c63e2304b91ee0ac182f467f24f86394ecfe726092340b/isort-5.12.0-py3-none-any.whl", hash = "sha256:f84c2818376e66cf843d497486ea8fed8700b340f308f076c6fb1229dff318b6"}, + {url = "https://files.pythonhosted.org/packages/a9/c4/dc00e42c158fc4dda2afebe57d2e948805c06d5169007f1724f0683010a9/isort-5.12.0.tar.gz", hash = "sha256:8bef7dde241278824a6d83f44a544709b065191b95b6e50894bdc722fcba0504"}, +] +"itsdangerous 2.1.2" = [ + {url = "https://files.pythonhosted.org/packages/68/5f/447e04e828f47465eeab35b5d408b7ebaaaee207f48b7136c5a7267a30ae/itsdangerous-2.1.2-py3-none-any.whl", hash = "sha256:2c2349112351b88699d8d4b6b075022c0808887cb7ad10069318a8b0bc88db44"}, + {url = "https://files.pythonhosted.org/packages/7f/a1/d3fb83e7a61fa0c0d3d08ad0a94ddbeff3731c05212617dff3a94e097f08/itsdangerous-2.1.2.tar.gz", hash = "sha256:5dbbc68b317e5e42f327f9021763545dc3fc3bfe22e6deb96aaf1fc38874156a"}, +] +"jinja2 3.1.2" = [ + {url = "https://files.pythonhosted.org/packages/7a/ff/75c28576a1d900e87eb6335b063fab47a8ef3c8b4d88524c4bf78f670cce/Jinja2-3.1.2.tar.gz", hash = "sha256:31351a702a408a9e7595a8fc6150fc3f43bb6bf7e319770cbc0db9df9437e852"}, + {url = "https://files.pythonhosted.org/packages/bc/c3/f068337a370801f372f2f8f6bad74a5c140f6fda3d9de154052708dd3c65/Jinja2-3.1.2-py3-none-any.whl", hash = "sha256:6088930bfe239f0e6710546ab9c19c9ef35e29792895fed6e6e31a023a182a61"}, +] +"markupsafe 2.1.3" = [ + {url = "https://files.pythonhosted.org/packages/03/06/e72e88f81f8c91d4f488d21712d2d403fd644e3172eaadc302094377bc22/MarkupSafe-2.1.3-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:2ef12179d3a291be237280175b542c07a36e7f60718296278d8593d21ca937d4"}, + {url = "https://files.pythonhosted.org/packages/03/65/3473d2cb84bb2cda08be95b97fc4f53e6bcd701a2d50ba7b7c905e1e9273/MarkupSafe-2.1.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:ab4a0df41e7c16a1392727727e7998a467472d0ad65f3ad5e6e765015df08636"}, + {url = "https://files.pythonhosted.org/packages/10/b3/c2b0a61cc0e1d50dd8a1b663ba4866c667cb58fb35f12475001705001680/MarkupSafe-2.1.3-cp38-cp38-win32.whl", hash = "sha256:ceb01949af7121f9fc39f7d27f91be8546f3fb112c608bc4029aef0bab86a2a5"}, + {url = "https://files.pythonhosted.org/packages/11/40/ea7f85e2681d29bc9301c757257de561923924f24de1802d9c3baa396bb4/MarkupSafe-2.1.3-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:14ff806850827afd6b07a5f32bd917fb7f45b046ba40c57abdb636674a8b559c"}, + {url = "https://files.pythonhosted.org/packages/12/b3/d9ed2c0971e1435b8a62354b18d3060b66c8cb1d368399ec0b9baa7c0ee5/MarkupSafe-2.1.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:65c1a9bcdadc6c28eecee2c119465aebff8f7a584dd719facdd9e825ec61ab52"}, + {url = "https://files.pythonhosted.org/packages/20/1d/713d443799d935f4d26a4f1510c9e61b1d288592fb869845e5cc92a1e055/MarkupSafe-2.1.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:cd0f502fe016460680cd20aaa5a76d241d6f35a1c3350c474bac1273803893fa"}, + {url = "https://files.pythonhosted.org/packages/22/81/b5659e2b6ae1516495a22f87370419c1d79c8d853315e6cbe5172fc01a06/MarkupSafe-2.1.3-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:7ef3cb2ebbf91e330e3bb937efada0edd9003683db6b57bb108c4001f37a02ea"}, + {url = "https://files.pythonhosted.org/packages/32/d4/ce98c4ca713d91c4a17c1a184785cc00b9e9c25699d618956c2b9999500a/MarkupSafe-2.1.3-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:df0be2b576a7abbf737b1575f048c23fb1d769f267ec4358296f31c2479db8f9"}, + {url = "https://files.pythonhosted.org/packages/3a/72/9f683a059bde096776e8acf9aa34cbbba21ddc399861fe3953790d4f2cde/MarkupSafe-2.1.3-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:aa57bd9cf8ae831a362185ee444e15a93ecb2e344c8e52e4d721ea3ab6ef1823"}, + {url = "https://files.pythonhosted.org/packages/3c/c8/74d13c999cbb49e3460bf769025659a37ef4a8e884de629720ab4e42dcdb/MarkupSafe-2.1.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:c9c804664ebe8f83a211cace637506669e7890fec1b4195b505c214e50dd4eb7"}, + {url = "https://files.pythonhosted.org/packages/41/f1/bc770c37ecd58638c18f8ec85df205dacb818ccf933692082fd93010a4bc/MarkupSafe-2.1.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8f9293864fe09b8149f0cc42ce56e3f0e54de883a9de90cd427f191c346eb2e1"}, + {url = "https://files.pythonhosted.org/packages/43/70/f24470f33b2035b035ef0c0ffebf57006beb2272cf3df068fc5154e04ead/MarkupSafe-2.1.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e4dd52d80b8c83fdce44e12478ad2e85c64ea965e75d66dbeafb0a3e77308fcc"}, + {url = "https://files.pythonhosted.org/packages/43/ad/7246ae594aac948b17408c0ff0f9ff0bc470bdbe9c672a754310db64b237/MarkupSafe-2.1.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:282c2cb35b5b673bbcadb33a585408104df04f14b2d9b01d4c345a3b92861c2c"}, + {url = "https://files.pythonhosted.org/packages/44/44/dbaf65876e258facd65f586dde158387ab89963e7f2235551afc9c2e24c2/MarkupSafe-2.1.3-cp312-cp312-win_amd64.whl", hash = "sha256:1b8dd8c3fd14349433c79fa8abeb573a55fc0fdd769133baac1f5e07abf54aeb"}, + {url = "https://files.pythonhosted.org/packages/44/53/93405d37bb04a10c43b1bdd6f548097478d494d7eadb4b364e3e1337f0cc/MarkupSafe-2.1.3-cp311-cp311-win32.whl", hash = "sha256:dd15ff04ffd7e05ffcb7fe79f1b98041b8ea30ae9234aed2a9168b5797c3effb"}, + {url = "https://files.pythonhosted.org/packages/47/26/932140621773bfd4df3223fbdd9e78de3477f424f0d2987c313b1cb655ff/MarkupSafe-2.1.3-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:aa7bd130efab1c280bed0f45501b7c8795f9fdbeb02e965371bbef3523627779"}, + {url = "https://files.pythonhosted.org/packages/49/74/bf95630aab0a9ed6a67556cd4e54f6aeb0e74f4cb0fd2f229154873a4be4/MarkupSafe-2.1.3-cp312-cp312-win32.whl", hash = "sha256:715d3562f79d540f251b99ebd6d8baa547118974341db04f5ad06d5ea3eb8007"}, + {url = "https://files.pythonhosted.org/packages/4d/e4/77bb622d6a37aeb51ee55857100986528b7f47d6dbddc35f9b404622ed50/MarkupSafe-2.1.3-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:b7ff0f54cb4ff66dd38bebd335a38e2c22c41a8ee45aa608efc890ac3e3931bc"}, + {url = "https://files.pythonhosted.org/packages/4f/13/cf36eff21600fb21d5bd8c4c1b6ff0b7cc0ff37b955017210cfc6f367972/MarkupSafe-2.1.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cb0932dc158471523c9637e807d9bfb93e06a95cbf010f1a38b98623b929ef2b"}, + {url = "https://files.pythonhosted.org/packages/51/94/9a04085114ff2c24f7424dbc890a281d73c5a74ea935dc2e69c66a3bd558/MarkupSafe-2.1.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:47d4f1c5f80fc62fdd7777d0d40a2e9dda0a05883ab11374334f6c4de38adffd"}, + {url = "https://files.pythonhosted.org/packages/62/9b/4908a57acf39d8811836bc6776b309c2e07d63791485589acf0b6d7bc0c6/MarkupSafe-2.1.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6b2b56950d93e41f33b4223ead100ea0fe11f8e6ee5f641eb753ce4b77a7042b"}, + {url = "https://files.pythonhosted.org/packages/68/8d/c33c43c499c19f4b51181e196c9a497010908fc22c5de33551e298aa6a21/MarkupSafe-2.1.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9dcdfd0eaf283af041973bff14a2e143b8bd64e069f4c383416ecd79a81aab58"}, + {url = "https://files.pythonhosted.org/packages/6a/86/654dc431513cd4417dfcead8102f22bece2d6abf2f584f0e1cc1524f7b94/MarkupSafe-2.1.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:8023faf4e01efadfa183e863fefde0046de576c6f14659e8782065bcece22198"}, + {url = "https://files.pythonhosted.org/packages/6d/7c/59a3248f411813f8ccba92a55feaac4bf360d29e2ff05ee7d8e1ef2d7dbf/MarkupSafe-2.1.3.tar.gz", hash = "sha256:af598ed32d6ae86f1b747b82783958b1a4ab8f617b06fe68795c7f026abbdcad"}, + {url = "https://files.pythonhosted.org/packages/71/61/f5673d7aac2cf7f203859008bb3fc2b25187aa330067c5e9955e5c5ebbab/MarkupSafe-2.1.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:962f82a3086483f5e5f64dbad880d31038b698494799b097bc59c2edf392fce6"}, + {url = "https://files.pythonhosted.org/packages/74/a3/54fc60ee2da3ab6d68b1b2daf4897297c597840212ee126e68a4eb89fcd7/MarkupSafe-2.1.3-cp38-cp38-win_amd64.whl", hash = "sha256:1b40069d487e7edb2676d3fbdb2b0829ffa2cd63a2ec26c4938b2d34391b4ecc"}, + {url = "https://files.pythonhosted.org/packages/7d/48/6ba4db436924698ca22109325969e00be459d417830dafec3c1001878b57/MarkupSafe-2.1.3-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ca379055a47383d02a5400cb0d110cef0a776fc644cda797db0c5696cfd7e18e"}, + {url = "https://files.pythonhosted.org/packages/84/a8/c4aebb8a14a1d39d5135eb8233a0b95831cdc42c4088358449c3ed657044/MarkupSafe-2.1.3-cp310-cp310-win_amd64.whl", hash = "sha256:1577735524cdad32f9f694208aa75e422adba74f1baee7551620e43a3141f559"}, + {url = "https://files.pythonhosted.org/packages/89/5a/ee546f2aa73a1d6fcfa24272f356fe06d29acca81e76b8d32ca53e429a2e/MarkupSafe-2.1.3-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:f698de3fd0c4e6972b92290a45bd9b1536bffe8c6759c62471efaa8acb4c37bc"}, + {url = "https://files.pythonhosted.org/packages/8b/bb/72ca339b012054a84753accabe3258e0baf6e34bd0ab6e3670b9a65f679d/MarkupSafe-2.1.3-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:69c0f17e9f5a7afdf2cc9fb2d1ce6aabdb3bafb7f38017c0b77862bcec2bbad8"}, + {url = "https://files.pythonhosted.org/packages/8d/66/4a46c7f1402e0377a8b220fd4b53cc4f1b2337ab0d97f06e23acd1f579d1/MarkupSafe-2.1.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8afafd99945ead6e075b973fefa56379c5b5c53fd8937dad92c662da5d8fd5ee"}, + {url = "https://files.pythonhosted.org/packages/96/e4/4db3b1abc5a1fe7295aa0683eafd13832084509c3b8236f3faf8dd4eff75/MarkupSafe-2.1.3-cp310-cp310-win32.whl", hash = "sha256:10bbfe99883db80bdbaff2dcf681dfc6533a614f700da1287707e8a5d78a8431"}, + {url = "https://files.pythonhosted.org/packages/9b/c1/9f44da5ca74f95116c644892152ca6514ecdc34c8297a3f40d886147863d/MarkupSafe-2.1.3-cp37-cp37m-win_amd64.whl", hash = "sha256:787003c0ddb00500e49a10f2844fac87aa6ce977b90b0feaaf9de23c22508b24"}, + {url = "https://files.pythonhosted.org/packages/9d/78/92f15eb9b1e8f1668a9787ba103cf6f8d19a9efed8150245404836145c24/MarkupSafe-2.1.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ffcc3f7c66b5f5b7931a5aa68fc9cecc51e685ef90282f4a82f0f5e9b704ad11"}, + {url = "https://files.pythonhosted.org/packages/a2/b2/624042cb58cc6b3529a6c3a7b7d230766e3ecb768cba118ba7befd18ed6f/MarkupSafe-2.1.3-cp39-cp39-win_amd64.whl", hash = "sha256:3fd4abcb888d15a94f32b75d8fd18ee162ca0c064f35b11134be77050296d6ba"}, + {url = "https://files.pythonhosted.org/packages/a2/f7/9175ad1b8152092f7c3b78c513c1bdfe9287e0564447d1c2d3d1a2471540/MarkupSafe-2.1.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b076b6226fb84157e3f7c971a47ff3a679d837cf338547532ab866c57930dbee"}, + {url = "https://files.pythonhosted.org/packages/a6/56/f1d4ee39e898a9e63470cbb7fae1c58cce6874f25f54220b89213a47f273/MarkupSafe-2.1.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:68e78619a61ecf91e76aa3e6e8e33fc4894a2bebe93410754bd28fce0a8a4f9f"}, + {url = "https://files.pythonhosted.org/packages/a8/12/fd9ef3e09a7312d60467c71037283553ff2acfcd950159cd4c3ca9558af4/MarkupSafe-2.1.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:8e254ae696c88d98da6555f5ace2279cf7cd5b3f52be2b5cf97feafe883b58d2"}, + {url = "https://files.pythonhosted.org/packages/ab/20/f59423543a8422cb8c69a579ebd0ef2c9dafa70cc8142b7372b5b4073caa/MarkupSafe-2.1.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:0a4e4a1aff6c7ac4cd55792abf96c915634c2b97e3cc1c7129578aa68ebd754e"}, + {url = "https://files.pythonhosted.org/packages/b2/0d/cbaade3ee8efbd5ce2fb72b48cc51479ebf3d4ce2c54dcb6557d3ea6a950/MarkupSafe-2.1.3-cp37-cp37m-win32.whl", hash = "sha256:8758846a7e80910096950b67071243da3e5a20ed2546e6392603c096778d48e0"}, + {url = "https://files.pythonhosted.org/packages/b2/27/07e5aa9f93314dc65ad2ad9b899656dee79b70a9425ee199dd5a4c4cf2cd/MarkupSafe-2.1.3-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:504b320cd4b7eff6f968eddf81127112db685e81f7e36e75f9f84f0df46041c3"}, + {url = "https://files.pythonhosted.org/packages/bb/82/f88ccb3ca6204a4536cf7af5abdad7c3657adac06ab33699aa67279e0744/MarkupSafe-2.1.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:5bbe06f8eeafd38e5d0a4894ffec89378b6c6a625ff57e3028921f8ff59318ac"}, + {url = "https://files.pythonhosted.org/packages/be/bb/08b85bc194034efbf572e70c3951549c8eca0ada25363afc154386b5390a/MarkupSafe-2.1.3-cp311-cp311-win_amd64.whl", hash = "sha256:134da1eca9ec0ae528110ccc9e48041e0828d79f24121a1a146161103c76e686"}, + {url = "https://files.pythonhosted.org/packages/bf/b7/c5ba9b7ad9ad21fc4a60df226615cf43ead185d328b77b0327d603d00cc5/MarkupSafe-2.1.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:525808b8019e36eb524b8c68acdd63a37e75714eac50e988180b169d64480a00"}, + {url = "https://files.pythonhosted.org/packages/c0/c7/171f5ac6b065e1425e8fabf4a4dfbeca76fd8070072c6a41bd5c07d90d8b/MarkupSafe-2.1.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3c0fae6c3be832a0a0473ac912810b2877c8cb9d76ca48de1ed31e1c68386575"}, + {url = "https://files.pythonhosted.org/packages/c9/80/f08e782943ee7ae6e9438851396d00a869f5b50ea8c6e1f40385f3e95771/MarkupSafe-2.1.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:42de32b22b6b804f42c5d98be4f7e5e977ecdd9ee9b660fda1a3edf03b11792d"}, + {url = "https://files.pythonhosted.org/packages/d2/a1/4ae49dd1520c7b891ea4963258aab08fb2554c564781ecb2a9c4afdf9cb1/MarkupSafe-2.1.3-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:c011a4149cfbcf9f03994ec2edffcb8b1dc2d2aede7ca243746df97a5d41ce48"}, + {url = "https://files.pythonhosted.org/packages/d5/c1/1177f712d4ab91eb67f79d763a7b5f9c5851ee3077d6b4eee15e23b6b93e/MarkupSafe-2.1.3-cp39-cp39-win32.whl", hash = "sha256:fec21693218efe39aa7f8599346e90c705afa52c5b31ae019b2e57e8f6542bb2"}, + {url = "https://files.pythonhosted.org/packages/de/63/cb7e71984e9159ec5f45b5e81e896c8bdd0e45fe3fc6ce02ab497f0d790e/MarkupSafe-2.1.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:05fb21170423db021895e1ea1e1f3ab3adb85d1c2333cbc2310f2a26bc77272e"}, + {url = "https://files.pythonhosted.org/packages/de/e2/32c14301bb023986dff527a49325b6259cab4ebb4633f69de54af312fc45/MarkupSafe-2.1.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8c41976a29d078bb235fea9b2ecd3da465df42a562910f9022f1a03107bd02be"}, + {url = "https://files.pythonhosted.org/packages/e5/dd/49576e803c0d974671e44fa78049217fcc68af3662a24f831525ed30e6c7/MarkupSafe-2.1.3-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9402b03f1a1b4dc4c19845e5c749e3ab82d5078d16a2a4c2cd2df62d57bb0707"}, + {url = "https://files.pythonhosted.org/packages/e6/5c/8ab8f67bbbbf90fe88f887f4fa68123435c5415531442e8aefef1e118d5c/MarkupSafe-2.1.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d080e0a5eb2529460b30190fcfcc4199bd7f827663f858a226a81bc27beaa97e"}, + {url = "https://files.pythonhosted.org/packages/e7/33/54d29854716725d7826079b8984dd235fac76dab1c32321e555d493e61f5/MarkupSafe-2.1.3-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:9aad3c1755095ce347e26488214ef77e0485a3c34a50c5a5e2471dff60b9dd9c"}, + {url = "https://files.pythonhosted.org/packages/ec/53/fcb3214bd370185e223b209ce6bb010fb887ea57173ca4f75bd211b24e10/MarkupSafe-2.1.3-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1f67c7038d560d92149c060157d623c542173016c4babc0c1913cca0564b9939"}, + {url = "https://files.pythonhosted.org/packages/f4/a0/103f94793c3bf829a18d2415117334ece115aeca56f2df1c47fa02c6dbd6/MarkupSafe-2.1.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:338ae27d6b8745585f87218a3f23f1512dbf52c26c28e322dbe54bcede54ccb9"}, + {url = "https://files.pythonhosted.org/packages/f7/9c/86cbd8e0e1d81f0ba420f20539dd459c50537c7751e28102dbfee2b6f28c/MarkupSafe-2.1.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e09031c87a1e51556fdcb46e5bd4f59dfb743061cf93c4d6831bf894f125eb57"}, + {url = "https://files.pythonhosted.org/packages/f8/33/e9e83b214b5f8d9a60b26e60051734e7657a416e5bce7d7f1c34e26badad/MarkupSafe-2.1.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:2c1b19b3aaacc6e57b7e25710ff571c24d6c3613a45e905b1fde04d691b98ee0"}, + {url = "https://files.pythonhosted.org/packages/fa/bb/12fb5964c4a766eb98155dd31ec070adc8a69a395564ffc1e7b34d91335a/MarkupSafe-2.1.3-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:56d9f2ecac662ca1611d183feb03a3fa4406469dafe241673d521dd5ae92a155"}, + {url = "https://files.pythonhosted.org/packages/fe/09/c31503cb8150cf688c1534a7135cc39bb9092f8e0e6369ec73494d16ee0e/MarkupSafe-2.1.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:ad9e82fb8f09ade1c3e1b996a6337afac2b8b9e365f926f5a61aacc71adc5b3c"}, + {url = "https://files.pythonhosted.org/packages/fe/21/2eff1de472ca6c99ec3993eab11308787b9879af9ca8bbceb4868cf4f2ca/MarkupSafe-2.1.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bfce63a9e7834b12b87c64d6b155fdd9b3b96191b6bd334bf37db7ff1fe457f2"}, +] +"marshmallow 3.20.1" = [ + {url = "https://files.pythonhosted.org/packages/e4/e0/3e49c0f91f3e8954806c1076f4eae2c95a9d3ed2546f267c683b877d327b/marshmallow-3.20.1.tar.gz", hash = "sha256:5d2371bbe42000f2b3fb5eaa065224df7d8f8597bc19a1bbfa5bfe7fba8da889"}, + {url = "https://files.pythonhosted.org/packages/ed/3c/cebfdcad015240014ff08b883d1c0c427f2ba45ae8c6572851b6ef136cad/marshmallow-3.20.1-py3-none-any.whl", hash = "sha256:684939db93e80ad3561392f47be0230743131560a41c5110684c16e21ade0a5c"}, +] +"mongoengine 0.27.0" = [ + {url = "https://files.pythonhosted.org/packages/0a/16/4fac4a2f18b4a9b4c9010cf6e961868de93b78d136e415b69739abc169ca/mongoengine-0.27.0-py3-none-any.whl", hash = "sha256:c3523b8f886052f3deb200b3218bcc13e4b781661e3bea38587cc936c80ea358"}, + {url = "https://files.pythonhosted.org/packages/f9/b3/8f368e8c925887adbd4c729ce12977c00ab53dfe0e53e84255a22c157983/mongoengine-0.27.0.tar.gz", hash = "sha256:8f38df7834dc4b192d89f2668dcf3091748d12f74d55648ce77b919167a4a49b"}, +] +"mypy 1.7.0" = [ + {url = "https://files.pythonhosted.org/packages/02/6b/0c3ed92bb4909f04a5e5eaf828f980dcb25d069933d6b387c8f5020b6384/mypy-1.7.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:0e81ffd120ee24959b449b647c4b2fbfcf8acf3465e082b8d58fd6c4c2b27e46"}, + {url = "https://files.pythonhosted.org/packages/0b/ad/1fe4b7856c778fee5ce923e81f279a553f6ad8ee9f365ec6bb2d6d5c056a/mypy-1.7.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:bf7a2f0a6907f231d5e41adba1a82d7d88cf1f61a70335889412dec99feeb0f8"}, + {url = "https://files.pythonhosted.org/packages/0f/ae/6cbe1b93fef3b0e3b7b26df4a9f8f840f6fdfc46da87f56fa4447a3135cd/mypy-1.7.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:c1b06b4b109e342f7dccc9efda965fc3970a604db70f8560ddfdee7ef19afb05"}, + {url = "https://files.pythonhosted.org/packages/10/7d/3a4f97b5d4f8c22ae04ff8fc730d779dbddbec5734f0e51e041a622f7f63/mypy-1.7.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b633f188fc5ae1b6edca39dae566974d7ef4e9aaaae00bc36efe1f855e5173ac"}, + {url = "https://files.pythonhosted.org/packages/10/f1/498e3782f997200d6525ef114dcb7a67ba84f48eeef772b984704fc7ceb4/mypy-1.7.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fc9fe455ad58a20ec68599139ed1113b21f977b536a91b42bef3ffed5cce7391"}, + {url = "https://files.pythonhosted.org/packages/28/b8/878e59fec853b546ae8b7fc606cc8e980f6cab8c9f1a13113332ab96d0f8/mypy-1.7.0-cp312-cp312-win_amd64.whl", hash = "sha256:d01921dbd691c4061a3e2ecdbfbfad029410c5c2b1ee88946bf45c62c6c91210"}, + {url = "https://files.pythonhosted.org/packages/36/41/bd8e7087ac2d837d00b50defbb25e48f4acad407f811e7ba1409244bb0bf/mypy-1.7.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:185cff9b9a7fec1f9f7d8352dff8a4c713b2e3eea9c6c4b5ff7f0edf46b91e41"}, + {url = "https://files.pythonhosted.org/packages/36/65/2164a0556f43cb1a7707c58999915a87bc40b23a2058740ed9312ff644bc/mypy-1.7.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d93e76c2256aa50d9c82a88e2f569232e9862c9982095f6d54e13509f01222fc"}, + {url = "https://files.pythonhosted.org/packages/41/6e/f54b63169cd45a37f5b1c08c6c16b556d80a617073a624d2e713b92583a2/mypy-1.7.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a79cdc12a02eb526d808a32a934c6fe6df07b05f3573d210e41808020aed8b5d"}, + {url = "https://files.pythonhosted.org/packages/43/70/54386836ca19525f5771b563471dd11ab5b810e84481053d47770e9e265d/mypy-1.7.0-cp311-cp311-win_amd64.whl", hash = "sha256:f29386804c3577c83d76520abf18cfcd7d68264c7e431c5907d250ab502658ee"}, + {url = "https://files.pythonhosted.org/packages/43/8a/6994b778cf9e16593792aeaf3ad429f952b357d34578b0a9370dcdba2d69/mypy-1.7.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:87c076c174e2c7ef8ab416c4e252d94c08cd4980a10967754f91571070bf5fbe"}, + {url = "https://files.pythonhosted.org/packages/5d/67/7b6cb695051a3165a9b821e527706858cdad40911d8bbbf6c5697d5daa42/mypy-1.7.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f65f385a6f43211effe8c682e8ec3f55d79391f70a201575def73d08db68ead1"}, + {url = "https://files.pythonhosted.org/packages/65/40/c2acf79897e8e2f2070f9dc1d58888657ed1b140c2e71e06f1c7a621b27b/mypy-1.7.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:551d4a0cdcbd1d2cccdcc7cb516bb4ae888794929f5b040bb51aae1846062901"}, + {url = "https://files.pythonhosted.org/packages/68/af/0173719000e9c6e2a1075d9509384904885ab21301f2ac6c8551a1c35cca/mypy-1.7.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:d0fa29919d2e720c8dbaf07d5578f93d7b313c3e9954c8ec05b6d83da592e5d9"}, + {url = "https://files.pythonhosted.org/packages/71/c8/dd3bee454333df813c97938a64c516e838ca5bc17ef35a74ceeb0f31869d/mypy-1.7.0.tar.gz", hash = "sha256:1e280b5697202efa698372d2f39e9a6713a0395a756b1c6bd48995f8d72690dc"}, + {url = "https://files.pythonhosted.org/packages/75/19/98aae7d1aae154667fd663dc5b537e4ddcfa2403a4a998708a3240018469/mypy-1.7.0-cp310-cp310-win_amd64.whl", hash = "sha256:1fe46e96ae319df21359c8db77e1aecac8e5949da4773c0274c0ef3d8d1268a9"}, + {url = "https://files.pythonhosted.org/packages/78/ad/2b1159c5165147556a4468edd7dff43f71ade3d90c6dd7971a304fcdc9ce/mypy-1.7.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:6cb8d5f6d0fcd9e708bb190b224089e45902cacef6f6915481806b0c77f7786d"}, + {url = "https://files.pythonhosted.org/packages/84/88/4a28c79315fd11f37447644fc316daf9d302bd87b4d75e6ce646724e253e/mypy-1.7.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:cddee95dea7990e2215576fae95f6b78a8c12f4c089d7e4367564704e99118d3"}, + {url = "https://files.pythonhosted.org/packages/9a/a6/c3ac417f44e56c189342b970c2d4e5451a25dbe444d34d78b03f88d0a9b5/mypy-1.7.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:55d28d7963bef00c330cb6461db80b0b72afe2f3c4e2963c99517cf06454e665"}, + {url = "https://files.pythonhosted.org/packages/9e/33/c030115aad2bdfec08b49f4d8f89034c65622d2eb1a522cea14d0082bef8/mypy-1.7.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:d6ed9a3997b90c6f891138e3f83fb8f475c74db4ccaa942a1c7bf99e83a989a1"}, + {url = "https://files.pythonhosted.org/packages/a3/a8/1509b1898e5c41fd0c4a852e0f1f8be6f40decd96cc14762d4ea9efbe42e/mypy-1.7.0-cp38-cp38-win_amd64.whl", hash = "sha256:2b53655a295c1ed1af9e96b462a736bf083adba7b314ae775563e3fb4e6795f5"}, + {url = "https://files.pythonhosted.org/packages/af/0d/60b9ea5674c96efa4064bc0a9e11088f3ce238747ac70d0299451465c37c/mypy-1.7.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:df67fbeb666ee8828f675fee724cc2cbd2e4828cc3df56703e02fe6a421b7401"}, + {url = "https://files.pythonhosted.org/packages/c6/20/f25ced189f0cf15bcdb4b63b461b177ed3370d08b3603d038b8d6dfcdc1e/mypy-1.7.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a3637c03f4025f6405737570d6cbfa4f1400eb3c649317634d273687a09ffc2f"}, + {url = "https://files.pythonhosted.org/packages/d3/eb/0ae996945a220bd65884e1c92e73d1c9e983e3474b31d006347d1052e12a/mypy-1.7.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:5da84d7bf257fd8f66b4f759a904fd2c5a765f70d8b52dde62b521972a0a2357"}, + {url = "https://files.pythonhosted.org/packages/d5/e6/cb80b16e01a48fb03b7c4189d5f4ac586983cdf5f48dafd5d36763b0badf/mypy-1.7.0-cp39-cp39-win_amd64.whl", hash = "sha256:870bd1ffc8a5862e593185a4c169804f2744112b4a7c55b93eb50f48e7a77010"}, + {url = "https://files.pythonhosted.org/packages/e8/f0/91ef152fbdfafd4a1ad936d411125b28a0f3f817f006dc17106835d92f17/mypy-1.7.0-py3-none-any.whl", hash = "sha256:96650d9a4c651bc2a4991cf46f100973f656d69edc7faf91844e87fe627f7e96"}, + {url = "https://files.pythonhosted.org/packages/ef/47/5e9f8a602f41c6928e48c445bb84b9c4f847f90e246550f653f9d00a2168/mypy-1.7.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:7a7b1e399c47b18feb6f8ad4a3eef3813e28c1e871ea7d4ea5d444b2ac03c418"}, +] +"mypy-extensions 1.0.0" = [ + {url = "https://files.pythonhosted.org/packages/2a/e2/5d3f6ada4297caebe1a2add3b126fe800c96f56dbe5d1988a2cbe0b267aa/mypy_extensions-1.0.0-py3-none-any.whl", hash = "sha256:4392f6c0eb8a5668a69e23d168ffa70f0be9ccfd32b5cc2d26a34ae5b844552d"}, + {url = "https://files.pythonhosted.org/packages/98/a4/1ab47638b92648243faf97a5aeb6ea83059cc3624972ab6b8d2316078d3f/mypy_extensions-1.0.0.tar.gz", hash = "sha256:75dbf8955dc00442a438fc4d0666508a9a97b6bd41aa2f0ffe9d2f2725af0782"}, +] +"nodeenv 1.8.0" = [ + {url = "https://files.pythonhosted.org/packages/1a/e6/6d2ead760a9ddb35e65740fd5a57e46aadd7b0c49861ab24f94812797a1c/nodeenv-1.8.0-py2.py3-none-any.whl", hash = "sha256:df865724bb3c3adc86b3876fa209771517b0cfe596beff01a92700e0e8be4cec"}, + {url = "https://files.pythonhosted.org/packages/48/92/8e83a37d3f4e73c157f9fcf9fb98ca39bd94701a469dc093b34dca31df65/nodeenv-1.8.0.tar.gz", hash = "sha256:d51e0c37e64fbf47d017feac3145cdbb58836d7eee8c6f6d3b6880c5456227d2"}, +] +"nox 2023.4.22" = [ + {url = "https://files.pythonhosted.org/packages/d9/c8/6e8e7412cb690fbfc993fb00e75b438e6982d2a247f29645d7daf75d013a/nox-2023.4.22-py3-none-any.whl", hash = "sha256:0b1adc619c58ab4fa57d6ab2e7823fe47a32e70202f287d78474adcc7bda1891"}, + {url = "https://files.pythonhosted.org/packages/e7/3b/529fa8920b18b92085ed5923caee4aee112c65a7af99b34bd5a868b82e3e/nox-2023.4.22.tar.gz", hash = "sha256:46c0560b0dc609d7d967dc99e22cb463d3c4caf54a5fda735d6c11b5177e3a9f"}, +] +"packaging 23.2" = [ + {url = "https://files.pythonhosted.org/packages/ec/1a/610693ac4ee14fcdf2d9bf3c493370e4f2ef7ae2e19217d7a237ff42367d/packaging-23.2-py3-none-any.whl", hash = "sha256:8c491190033a9af7e1d931d0b5dacc2ef47509b34dd0de67ed209b5203fc88c7"}, + {url = "https://files.pythonhosted.org/packages/fb/2b/9b9c33ffed44ee921d0967086d653047286054117d584f1b1a7c22ceaf7b/packaging-23.2.tar.gz", hash = "sha256:048fb0e9405036518eaaf48a55953c750c11e1a1b68e0dd1a9d62ed0c092cfc5"}, +] +"pathspec 0.11.2" = [ + {url = "https://files.pythonhosted.org/packages/a0/2a/bd167cdf116d4f3539caaa4c332752aac0b3a0cc0174cdb302ee68933e81/pathspec-0.11.2.tar.gz", hash = "sha256:e0d8d0ac2f12da61956eb2306b69f9469b42f4deb0f3cb6ed47b9cce9996ced3"}, + {url = "https://files.pythonhosted.org/packages/b4/2a/9b1be29146139ef459188f5e420a66e835dda921208db600b7037093891f/pathspec-0.11.2-py3-none-any.whl", hash = "sha256:1d6ed233af05e679efb96b1851550ea95bbb64b7c490b0f5aa52996c11e92a20"}, +] +"peewee 3.17.0" = [ + {url = "https://files.pythonhosted.org/packages/6a/30/a727bb1420076b3c14b60911d111f0fc0449d31a1123a1ad18878a7a4e40/peewee-3.17.0.tar.gz", hash = "sha256:3a56967f28a43ca7a4287f4803752aeeb1a57a08dee2e839b99868181dfb5df8"}, +] +"platformdirs 3.11.0" = [ + {url = "https://files.pythonhosted.org/packages/56/29/3ec311dc18804409ecf0d2b09caa976f3ae6215559306b5b530004e11156/platformdirs-3.11.0-py3-none-any.whl", hash = "sha256:e9d171d00af68be50e9202731309c4e658fd8bc76f55c11c7dd760d023bda68e"}, + {url = "https://files.pythonhosted.org/packages/d3/e3/aa14d6b2c379fbb005993514988d956f1b9fdccd9cbe78ec0dbe5fb79bf5/platformdirs-3.11.0.tar.gz", hash = "sha256:cf8ee52a3afdb965072dcc652433e0c7e3e40cf5ea1477cd4b3b1d2eb75495b3"}, +] +"pluggy 1.3.0" = [ + {url = "https://files.pythonhosted.org/packages/05/b8/42ed91898d4784546c5f06c60506400548db3f7a4b3fb441cba4e5c17952/pluggy-1.3.0-py3-none-any.whl", hash = "sha256:d89c696a773f8bd377d18e5ecda92b7a3793cbe66c87060a6fb58c7b6e1061f7"}, + {url = "https://files.pythonhosted.org/packages/36/51/04defc761583568cae5fd533abda3d40164cbdcf22dee5b7126ffef68a40/pluggy-1.3.0.tar.gz", hash = "sha256:cf61ae8f126ac6f7c451172cf30e3e43d3ca77615509771b3a984a0730651e12"}, +] +"pony 0.7.17" = [ + {url = "https://files.pythonhosted.org/packages/75/85/98364c3fae233e5d41754a2a6b33425a95f5f9686ac156b26d648f0b8777/pony-0.7.17-py3-none-any.whl", hash = "sha256:c37e9b44f975d147b79cf56925b16b0e40b2b47ba5958d0c01579f37a5a24f7c"}, + {url = "https://files.pythonhosted.org/packages/8a/f5/da8d34d321c879a606eef4afe5eead40c5480ac433dbae2e65f94e14fa22/pony-0.7.17.tar.gz", hash = "sha256:b72172d57abd5e0846cd8d71231572da20f526327bf0d33348a9276f624d8aa7"}, +] +"pre-commit 3.5.0" = [ + {url = "https://files.pythonhosted.org/packages/04/b3/4ae08d21eb097162f5aad37f4585f8069a86402ed7f5362cc9ae097f9572/pre_commit-3.5.0.tar.gz", hash = "sha256:5804465c675b659b0862f07907f96295d490822a450c4c40e747d0b1c6ebcb32"}, + {url = "https://files.pythonhosted.org/packages/6c/75/526915fedf462e05eeb1c75ceaf7e3f9cde7b5ce6f62740fe5f7f19a0050/pre_commit-3.5.0-py2.py3-none-any.whl", hash = "sha256:841dc9aef25daba9a0238cd27984041fa0467b4199fc4852e27950664919f660"}, +] +"psycopg2-binary 2.9.9" = [ + {url = "https://files.pythonhosted.org/packages/04/37/2429360ac5547378202db14eec0dde76edbe1f6627df5a43c7e164922859/psycopg2_binary-2.9.9-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2d423c8d8a3c82d08fe8af900ad5b613ce3632a1249fd6a223941d0735fce493"}, + {url = "https://files.pythonhosted.org/packages/0a/7c/6aaf8c3cb05d86d2c3f407b95bac0c71a43f2718e38c1091972aacb5e1b2/psycopg2_binary-2.9.9-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:c2470da5418b76232f02a2fcd2229537bb2d5a7096674ce61859c3229f2eb202"}, + {url = "https://files.pythonhosted.org/packages/0a/b7/3046fd37fdf84c1945741d16fa7536ddcf8576bad6d77ee2891c5255dce3/psycopg2_binary-2.9.9-cp39-cp39-win32.whl", hash = "sha256:9dba73be7305b399924709b91682299794887cbbd88e38226ed9f6712eabee90"}, + {url = "https://files.pythonhosted.org/packages/0e/6d/e97245eabff29d7c2de5fc1fc17cf7ef427beee93d20a5ae114c6e6718bd/psycopg2_binary-2.9.9-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:0c009475ee389757e6e34611d75f6e4f05f0cf5ebb76c6037508318e1a1e0d7e"}, + {url = "https://files.pythonhosted.org/packages/14/33/12818c157e333cb9d9e6753d1b2463b6f60dbc1fade115f8e4dc5c52cac4/psycopg2_binary-2.9.9-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:911dda9c487075abd54e644ccdf5e5c16773470a6a5d3826fda76699410066fb"}, + {url = "https://files.pythonhosted.org/packages/18/ca/da384fd47233e300e3e485c90e7aab5d7def896d1281239f75901faf87d4/psycopg2_binary-2.9.9-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:b0605eaed3eb239e87df0d5e3c6489daae3f7388d455d0c0b4df899519c6a38d"}, + {url = "https://files.pythonhosted.org/packages/19/57/9f172b900795ea37246c78b5f52e00f4779984370855b3e161600156906d/psycopg2_binary-2.9.9-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6e6f98446430fdf41bd36d4faa6cb409f5140c1c2cf58ce0bbdaf16af7d3f119"}, + {url = "https://files.pythonhosted.org/packages/19/7a/e806ed82d954b9ec29b62f12ae8929da8910cde5ab7e919ec0983e56672d/psycopg2_binary-2.9.9-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ead20f7913a9c1e894aebe47cccf9dc834e1618b7aa96155d2091a626e59c972"}, + {url = "https://files.pythonhosted.org/packages/24/1b/99b948254604838de668d81cc39a294a987721120c67963e00d47a290f7f/psycopg2_binary-2.9.9-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:34eccd14566f8fe14b2b95bb13b11572f7c7d5c36da61caf414d23b91fcc5d94"}, + {url = "https://files.pythonhosted.org/packages/24/bf/4856c4985823ef094fc5a52eeb194f038dfbc57921f1d091853efc8e01b4/psycopg2_binary-2.9.9-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d3f82c171b4ccd83bbaf35aa05e44e690113bd4f3b7b6cc54d2219b132f3ae55"}, + {url = "https://files.pythonhosted.org/packages/25/1f/7ae31759142999a8d06b3e250c1346c4abcdcada8fa884376775dc1de686/psycopg2_binary-2.9.9-cp311-cp311-win_amd64.whl", hash = "sha256:b76bedd166805480ab069612119ea636f5ab8f8771e640ae103e05a4aae3e417"}, + {url = "https://files.pythonhosted.org/packages/2e/49/9550febcc90105089bb89881b8cba73db227b9685cfddaae2479791a2379/psycopg2_binary-2.9.9-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1873aade94b74715be2246321c8650cabf5a0d098a95bab81145ffffa4c13876"}, + {url = "https://files.pythonhosted.org/packages/3b/76/e46dae1b2273814ef80231f86d59cadf94ec36fd757045ed713c5b75cde7/psycopg2_binary-2.9.9-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:b58b4710c7f4161b5e9dcbe73bb7c62d65670a87df7bcce9e1faaad43e715245"}, + {url = "https://files.pythonhosted.org/packages/3b/92/b463556409cdc12791cd8b1dae0072bf8efe817ef68b7ea3d9cf7d0e5656/psycopg2_binary-2.9.9-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:77853062a2c45be16fd6b8d6de2a99278ee1d985a7bd8b103e97e41c034006d2"}, + {url = "https://files.pythonhosted.org/packages/3e/06/7d0085889cba209185f1a52d646c4dbdbd9075345f4ca685bacf08d30755/psycopg2_binary-2.9.9-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:30dcc86377618a4c8f3b72418df92e77be4254d8f89f14b8e8f57d6d43603c0f"}, + {url = "https://files.pythonhosted.org/packages/41/af/bce37630c525d2b9cf93f930110fc98616d6aca308d59b833b83b3a38176/psycopg2_binary-2.9.9-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:d2997c458c690ec2bc6b0b7ecbafd02b029b7b4283078d3b32a852a7ce3ddd98"}, + {url = "https://files.pythonhosted.org/packages/42/46/c4170e77d71e76c1fe52ddc0d90f5e33f7afb72451e550268aba99675624/psycopg2_binary-2.9.9-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:03ef7df18daf2c4c07e2695e8cfd5ee7f748a1d54d802330985a78d2a5a6dca9"}, + {url = "https://files.pythonhosted.org/packages/48/10/320b014e2fda509dc16409f76815ad0229e4fcec5ed229e64f7f917cc23f/psycopg2_binary-2.9.9-cp38-cp38-win_amd64.whl", hash = "sha256:a6cdcc3ede532f4a4b96000b6362099591ab4a3e913d70bcbac2b56c872446f7"}, + {url = "https://files.pythonhosted.org/packages/4c/dc/a5d52ac82bd581bc18dbba2e7540cea458d85a0a72e3a58df7d9bfd8e133/psycopg2_binary-2.9.9-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:275ff571376626195ab95a746e6a04c7df8ea34638b99fc11160de91f2fef503"}, + {url = "https://files.pythonhosted.org/packages/50/66/fa53d2d3d92f6e1ef469d92afc6a4fe3f6e8a9a04b687aa28fb1f1d954ee/psycopg2_binary-2.9.9-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8f8544b092a29a6ddd72f3556a9fcf249ec412e10ad28be6a0c0d948924f2212"}, + {url = "https://files.pythonhosted.org/packages/56/a2/7851c68fe8768f3c9c246198b6356ee3e4a8a7f6820cc798443faada3400/psycopg2_binary-2.9.9-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:57fede879f08d23c85140a360c6a77709113efd1c993923c59fde17aa27599fe"}, + {url = "https://files.pythonhosted.org/packages/5b/ae/4a40f97bed02725b6c8b095fbe0587acda9f350f424d3d154acbf4d4c9aa/psycopg2_binary-2.9.9-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:a148c5d507bb9b4f2030a2025c545fccb0e1ef317393eaba42e7eabd28eb6041"}, + {url = "https://files.pythonhosted.org/packages/5e/4c/9233e0e206634a5387f3ab40f334a5325fb8bef2ca4e12ee7dbdeaf96afc/psycopg2_binary-2.9.9-cp310-cp310-win_amd64.whl", hash = "sha256:876801744b0dee379e4e3c38b76fc89f88834bb15bf92ee07d94acd06ec890a0"}, + {url = "https://files.pythonhosted.org/packages/5f/e9/115e4f4f86d4aa5c300fdc90ac3d3e74401b4060d782281fe5b47d6c832d/psycopg2_binary-2.9.9-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:18d0ef97766055fec15b5de2c06dd8e7654705ce3e5e5eed3b6651a1d2a9a152"}, + {url = "https://files.pythonhosted.org/packages/62/2a/c0530b59d7e0d09824bc2102ecdcec0456b8ca4d47c0caa82e86fce3ed4c/psycopg2_binary-2.9.9-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2e5afae772c00980525f6d6ecf7cbca55676296b580c0e6abb407f15f3706996"}, + {url = "https://files.pythonhosted.org/packages/63/41/815d19767e2adb1a585213b801c954f46102f305c352c4a4f96287342d44/psycopg2_binary-2.9.9-cp310-cp310-win32.whl", hash = "sha256:3f78fd71c4f43a13d342be74ebbc0666fe1f555b8837eb113cb7416856c79682"}, + {url = "https://files.pythonhosted.org/packages/65/04/d0266fd446cb65384ce5442bc08449fd0b5d3419494574f020275f9e2273/psycopg2_binary-2.9.9-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3a58c98a7e9c021f357348867f537017057c2ed7f77337fd914d0bedb35dace7"}, + {url = "https://files.pythonhosted.org/packages/65/4f/083f6b652b7fbecec1dc10bc9d1ffb66efd63611a25dddd0b4c1ef043ba6/psycopg2_binary-2.9.9-cp37-cp37m-win_amd64.whl", hash = "sha256:281309265596e388ef483250db3640e5f414168c5a67e9c665cafce9492eda2f"}, + {url = "https://files.pythonhosted.org/packages/66/41/fd79b2baf3079938f3c447e1a6087b10d09d2f0c54513e27a6872797f841/psycopg2_binary-2.9.9-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0a602ea5aff39bb9fac6308e9c9d82b9a35c2bf288e184a816002c9fae930b77"}, + {url = "https://files.pythonhosted.org/packages/68/a2/67732accfffdb6696dc9523f82e91823e8cb1cc311f1c4ce006d2bb85016/psycopg2_binary-2.9.9-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:31a34c508c003a4347d389a9e6fcc2307cc2150eb516462a7a17512130de109e"}, + {url = "https://files.pythonhosted.org/packages/6b/ae/05d1e52e8535ef3c73fa327e179d982b903e2c08987fa0e2167842c153a7/psycopg2_binary-2.9.9-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:ebdc36bea43063116f0486869652cb2ed7032dbc59fbcb4445c4862b5c1ecf7f"}, + {url = "https://files.pythonhosted.org/packages/6f/ee/3ba07c6dc7c3294e717e94720da1597aedc82a10b1b180203ce183d4631a/psycopg2_binary-2.9.9-cp312-cp312-win32.whl", hash = "sha256:64cf30263844fa208851ebb13b0732ce674d8ec6a0c86a4e160495d299ba3c93"}, + {url = "https://files.pythonhosted.org/packages/70/a7/2cd2c9d5e23b556c11e3b7da41895808d9b056f8f34f50de4375a35b4951/psycopg2_binary-2.9.9-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:8dbf6d1bc73f1d04ec1734bae3b4fb0ee3cb2a493d35ede9badbeb901fb40f6f"}, + {url = "https://files.pythonhosted.org/packages/70/bb/aec2646a705a09079d008ce88073401cd61fc9b04f92af3eb282caa3a2ec/psycopg2_binary-2.9.9-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:cb16c65dcb648d0a43a2521f2f0a2300f40639f6f8c1ecbc662141e4e3e1ee07"}, + {url = "https://files.pythonhosted.org/packages/72/3d/acab427845198794aafd963dd073ee35810e2c52606e8a28c12db39821fb/psycopg2_binary-2.9.9-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c6af2a6d4b7ee9615cbb162b0738f6e1fd1f5c3eda7e5da17861eacf4c717ea7"}, + {url = "https://files.pythonhosted.org/packages/73/17/ba28bb0022db5e2015a82d2df1c4b0d419c37fa07a588b3aff3adc4939f6/psycopg2_binary-2.9.9-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:bc7bb56d04601d443f24094e9e31ae6deec9ccb23581f75343feebaf30423359"}, + {url = "https://files.pythonhosted.org/packages/7a/1f/a6cf0cdf944253f7c45d90fbc876cc8bed5cc9942349306245715c0d88d6/psycopg2_binary-2.9.9-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1ea665f8ce695bcc37a90ee52de7a7980be5161375d42a0b6c6abedbf0d81f0f"}, + {url = "https://files.pythonhosted.org/packages/7b/08/9c66c269b0d417a0af9fb969535f0371b8c538633535a7a6a5ca3f9231e2/psycopg2_binary-2.9.9-cp312-cp312-win_amd64.whl", hash = "sha256:81ff62668af011f9a48787564ab7eded4e9fb17a4a6a74af5ffa6a457400d2ab"}, + {url = "https://files.pythonhosted.org/packages/7c/ae/cedd56e1f4a2b0e37213283caf3733a875c4c76f3372241e19c0d2a87355/psycopg2_binary-2.9.9-cp311-cp311-win32.whl", hash = "sha256:dc4926288b2a3e9fd7b50dc6a1909a13bbdadfc67d93f3374d984e56f885579d"}, + {url = "https://files.pythonhosted.org/packages/81/0b/3adf561107c865928455891156d1dde5325253f7f4316fe56cd2c3f73570/psycopg2_binary-2.9.9-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:143072318f793f53819048fdfe30c321890af0c3ec7cb1dfc9cc87aa88241de2"}, + {url = "https://files.pythonhosted.org/packages/82/69/c25f8bd5c189cee89bc00e16b49a84f930b3b4c2cfec953a26c99076a586/psycopg2_binary-2.9.9-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:72dffbd8b4194858d0941062a9766f8297e8868e1dd07a7b36212aaa90f49472"}, + {url = "https://files.pythonhosted.org/packages/83/50/a054076c6358753661cd1da59f4dabc03e83d51690371f3fd1edb9e2cf72/psycopg2_binary-2.9.9-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:83791a65b51ad6ee6cf0845634859d69a038ea9b03d7b26e703f94c7e93dbcf9"}, + {url = "https://files.pythonhosted.org/packages/88/d8/3bbedf39ab90d64d7a6f04e3f3744c74f46f55bd305cc2db3aa12e9c5667/psycopg2_binary-2.9.9-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:246b123cc54bb5361588acc54218c8c9fb73068bf227a4a531d8ed56fa3ca7d6"}, + {url = "https://files.pythonhosted.org/packages/92/57/96576e07132d7f7a1ac1df939575e6fdd8951aea337ee152b586bb51a971/psycopg2_binary-2.9.9-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:78151aa3ec21dccd5cdef6c74c3e73386dcdfaf19bced944169697d7ac7482fc"}, + {url = "https://files.pythonhosted.org/packages/94/62/6f8d281e279a71f20d1670f4de97d116b1d90948eb16c3c41ac305f94a30/psycopg2_binary-2.9.9-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:60989127da422b74a04345096c10d416c2b41bd7bf2a380eb541059e4e999980"}, + {url = "https://files.pythonhosted.org/packages/94/68/1176fc14ea76861b7b8360be5176e87fb20d5091b137c76570eb4e237324/psycopg2_binary-2.9.9-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:c77e3d1862452565875eb31bdb45ac62502feabbd53429fdc39a1cc341d681ba"}, + {url = "https://files.pythonhosted.org/packages/97/17/0a4dab7369047d2d381acc79383f046b1208481b9da867b60a03d82adb31/psycopg2_binary-2.9.9-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8359bf4791968c5a78c56103702000105501adb557f3cf772b2c207284273984"}, + {url = "https://files.pythonhosted.org/packages/97/18/7dfc189f70a170d7a7f9fbdda00e450f46a04420b3a06c0c7017e6017889/psycopg2_binary-2.9.9-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:f9b5571d33660d5009a8b3c25dc1db560206e2d2f89d3df1cb32d72c0d117d52"}, + {url = "https://files.pythonhosted.org/packages/9a/6f/b593ca17c14907e35ea1077e372ce47b4e721002bd272577880d2541d331/psycopg2_binary-2.9.9-cp37-cp37m-win32.whl", hash = "sha256:68fc1f1ba168724771e38bee37d940d2865cb0f562380a1fb1ffb428b75cb692"}, + {url = "https://files.pythonhosted.org/packages/9c/02/826dc5cdfc9515423ec912ba00cc2e4eb09f69e0339b177c9c742f2a09a2/psycopg2_binary-2.9.9-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0ef4854e82c09e84cc63084a9e4ccd6d9b154f1dbdd283efb92ecd0b5e2b8c84"}, + {url = "https://files.pythonhosted.org/packages/a3/96/3153069df1378d398dcbd6968d4da89735bb63dccbb13a435bc65291c59c/psycopg2_binary-2.9.9-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:323ba25b92454adb36fa425dc5cf6f8f19f78948cbad2e7bc6cdf7b0d7982e59"}, + {url = "https://files.pythonhosted.org/packages/a5/ac/702d300f3df169b9d0cbef0340d9f34a78bc18dc2dbafbcb39ff0f165cf8/psycopg2_binary-2.9.9-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:ee825e70b1a209475622f7f7b776785bd68f34af6e7a46e2e42f27b659b5bc26"}, + {url = "https://files.pythonhosted.org/packages/a7/d0/5f2db14e7b53552276ab613399a83f83f85b173a862d3f20580bc7231139/psycopg2_binary-2.9.9-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:8532fd6e6e2dc57bcb3bc90b079c60de896d2128c5d9d6f24a63875a95a088cf"}, + {url = "https://files.pythonhosted.org/packages/ba/69/e38aeaace3a87dda1c152c039c72181fdcbff0787d5d2466944b663c4a57/psycopg2_binary-2.9.9-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:729177eaf0aefca0994ce4cffe96ad3c75e377c7b6f4efa59ebf003b6d398716"}, + {url = "https://files.pythonhosted.org/packages/ba/7e/c91f4c1e364444c8f59e82501f600019717f265ae4092057cece02d2d945/psycopg2_binary-2.9.9-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:4686818798f9194d03c9129a4d9a702d9e113a89cb03bffe08c6cf799e053291"}, + {url = "https://files.pythonhosted.org/packages/bc/0d/486e3fa27f39a00168abfcf14a3d8444f437f4b755cc34316da1124f293d/psycopg2_binary-2.9.9-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ed1184ab8f113e8d660ce49a56390ca181f2981066acc27cf637d5c1e10ce46e"}, + {url = "https://files.pythonhosted.org/packages/bc/14/76879e83245d8dc72812fb71fb3e710fa7482a05c4b1788b41b22e9fffcc/psycopg2_binary-2.9.9-cp38-cp38-win32.whl", hash = "sha256:804d99b24ad523a1fe18cc707bf741670332f7c7412e9d49cb5eab67e886b9b5"}, + {url = "https://files.pythonhosted.org/packages/c1/d3/30a58e2399ad0d7830bb2c3c07b2e937e2ea8fe53e1d9e4b95d03d995362/psycopg2_binary-2.9.9-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:2293b001e319ab0d869d660a704942c9e2cce19745262a8aba2115ef41a0a42a"}, + {url = "https://files.pythonhosted.org/packages/c2/05/81e8bc7fca95574c9323e487d9ce1b58a4cfcc17f89b8fe843af46361211/psycopg2_binary-2.9.9-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f7fc5a5acafb7d6ccca13bfa8c90f8c51f13d8fb87d95656d3950f0158d3ce53"}, + {url = "https://files.pythonhosted.org/packages/c5/22/0b832bc8a83d8fed74c5a45fbacf4a6e6eb66bcb0cd3836fca9a709f25f4/psycopg2_binary-2.9.9-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:ac05fb791acf5e1a3e39402641827780fe44d27e72567a000412c648a85ba860"}, + {url = "https://files.pythonhosted.org/packages/cb/35/009b43d67a7010b789690a46d49521fd435ce33ce722fe8d7ac7efe35c21/psycopg2_binary-2.9.9-cp39-cp39-win_amd64.whl", hash = "sha256:f7ae5d65ccfbebdfa761585228eb4d0df3a8b15cfb53bd953e713e09fbb12957"}, + {url = "https://files.pythonhosted.org/packages/cb/bd/e5fb2aa9737e50c0ffb9c3851710055eafedd4c8628c6ef9863bb2e9c434/psycopg2_binary-2.9.9-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:ca08decd2697fdea0aea364b370b1249d47336aec935f87b8bbfd7da5b2ee9c1"}, + {url = "https://files.pythonhosted.org/packages/ce/85/62825cabc6aad53104b7b6d12eb2ad74737d268630032d07b74d4444cb72/psycopg2_binary-2.9.9-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:977646e05232579d2e7b9c59e21dbe5261f403a88417f6a6512e70d3f8a046be"}, + {url = "https://files.pythonhosted.org/packages/da/e0/073f50a65093a0bd087aff95754bdd61e8ef24d6ea29f47ea97575d4a784/psycopg2_binary-2.9.9-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:ca49a8119c6cbd77375ae303b0cfd8c11f011abbbd64601167ecca18a87e7cdd"}, + {url = "https://files.pythonhosted.org/packages/dc/d0/512a73da2253c1904366155fd2c7ddf6d4e04a4eb434c90a18af8ce3d24b/psycopg2_binary-2.9.9-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:1236ed0952fbd919c100bc839eaa4a39ebc397ed1c08a97fc45fee2a595aa1b3"}, + {url = "https://files.pythonhosted.org/packages/e9/b0/9ca2b8e01a0912c9a14234fd5df7a241a1e44778c5797bf4b8eaa8dc3d3a/psycopg2_binary-2.9.9-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:b6356793b84728d9d50ead16ab43c187673831e9d4019013f1402c41b1db9b27"}, + {url = "https://files.pythonhosted.org/packages/eb/08/bf324316b7e135a5bc82a850109095177a89e9624a08bcefa78f4b25a10d/psycopg2_binary-2.9.9-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:420f9bbf47a02616e8554e825208cb947969451978dceb77f95ad09c37791dae"}, + {url = "https://files.pythonhosted.org/packages/ed/be/6c787962d706e55a528ef1693dd7251de657ae60e4d9d767ed61e8e2975c/psycopg2_binary-2.9.9-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:75723c3c0fbbf34350b46a3199eb50638ab22a0228f93fb472ef4d9becc2382b"}, + {url = "https://files.pythonhosted.org/packages/f0/85/dff2170a1e6748b7068a4523ea9fef8373572c4cd283cffb4802f871a556/psycopg2_binary-2.9.9-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:15208be1c50b99203fe88d15695f22a5bed95ab3f84354c494bcb1d08557df67"}, + {url = "https://files.pythonhosted.org/packages/f4/bc/f273a15ccdbd479a1c60d1efd50bd2c96bab2b17c2d0760408e033c08165/psycopg2_binary-2.9.9-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:4154ad09dac630a0f13f37b583eae260c6aa885d67dfbccb5b02c33f31a6d420"}, + {url = "https://files.pythonhosted.org/packages/f7/98/c2fedcbf0a9607519a010dcf88571138b2251062dbde3610cdba5ba1eee1/psycopg2_binary-2.9.9-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c332c8d69fb64979ebf76613c66b985414927a40f8defa16cf1bc028b7b0a7b0"}, + {url = "https://files.pythonhosted.org/packages/fc/07/e720e53bfab016ebcc34241695ccc06a9e3d91ba19b40ca81317afbdc440/psycopg2-binary-2.9.9.tar.gz", hash = "sha256:7f01846810177d829c7692f1f5ada8096762d9172af1b1a28d4ab5b77c923c1c"}, +] +"pymongo 4.6.0" = [ + {url = "https://files.pythonhosted.org/packages/03/d5/a525dbb69daf78239c19ad5415a27f67994a2700aaf936201b88bdbbf704/pymongo-4.6.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a8f7f9feecae53fa18d6a3ea7c75f9e9a1d4d20e5c3f9ce3fba83f07bcc4eee2"}, + {url = "https://files.pythonhosted.org/packages/06/24/46f1fe8a86ea57edc959fada9d451a622f0ea6f0c2028a0550993c1b3e21/pymongo-4.6.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:eb438a8bf6b695bf50d57e6a059ff09652a07968b2041178b3744ea785fcef9b"}, + {url = "https://files.pythonhosted.org/packages/06/dd/6127762f0e1a32f411daf7219352b0cc14968224c99f41d72b0228597f71/pymongo-4.6.0-cp39-cp39-manylinux2014_ppc64le.whl", hash = "sha256:0634994b026336195778e5693583c060418d4ab453eff21530422690a97e1ee8"}, + {url = "https://files.pythonhosted.org/packages/08/df/724a51039810e7e437f8ae9d3fb484977d8513483fbf2215b05ed47437b2/pymongo-4.6.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:1c63e3a2e8fb815c4b1f738c284a4579897e37c3cfd95fdb199229a1ccfb638a"}, + {url = "https://files.pythonhosted.org/packages/0b/a2/fac08405fa1e1251876ba0930200136fa6ea64ad523ed06aaf6f3d53e8f0/pymongo-4.6.0-cp310-cp310-manylinux2014_i686.whl", hash = "sha256:a0be99b599da95b7a90a918dd927b20c434bea5e1c9b3efc6a3c6cd67c23f813"}, + {url = "https://files.pythonhosted.org/packages/0f/cf/47df0eef18ecb6e1ac426e6b7a273d77236f166afacc5d8c36b34705fb31/pymongo-4.6.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:39a1cd5d383b37285641d5a7a86be85274466ae336a61b51117155936529f9b3"}, + {url = "https://files.pythonhosted.org/packages/11/e8/5bc11eb7c32328deb010ca3b5fa3cbdff44c9a220f92f8a8d0d900c02a87/pymongo-4.6.0-cp39-cp39-manylinux2014_s390x.whl", hash = "sha256:ad4f66fbb893b55f96f03020e67dcab49ffde0177c6565ccf9dec4fdf974eb61"}, + {url = "https://files.pythonhosted.org/packages/1a/d2/1f81709e0694fce984312e9aff7d39f04433940ac1630c2d83666ce03863/pymongo-4.6.0-cp37-cp37m-manylinux2014_i686.whl", hash = "sha256:82e620842e12e8cb4050d2643a81c8149361cd82c0a920fa5a15dc4ca8a4000f"}, + {url = "https://files.pythonhosted.org/packages/1e/bb/cd6dbac7ae8361b47660fd5509589f22d92fb2c5af65548f4a8211ad467e/pymongo-4.6.0-cp37-cp37m-win32.whl", hash = "sha256:09c7de516b08c57647176b9fc21d929d628e35bcebc7422220c89ae40b62126a"}, + {url = "https://files.pythonhosted.org/packages/1f/b5/bdef4f9b1918519112eed664e8a481ab144222dbba18bbbbf9c8eae44b58/pymongo-4.6.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4a0269811661ba93c472c8a60ea82640e838c2eb148d252720a09b5123f2c2fe"}, + {url = "https://files.pythonhosted.org/packages/24/b8/b896d967982da551a4d43847c2ad850c1b62bb83e7ee8e6c9e03e88a2f74/pymongo-4.6.0-cp37-cp37m-manylinux2014_ppc64le.whl", hash = "sha256:6b18276f14b4b6d92e707ab6db19b938e112bd2f1dc3f9f1a628df58e4fd3f0d"}, + {url = "https://files.pythonhosted.org/packages/24/cb/c1824d7c5946c7750a4ce3e2b118b03b88975915f1d060f1f3ec5d9f49d7/pymongo-4.6.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3ec6c20385c5a58e16b1ea60c5e4993ea060540671d7d12664f385f2fb32fe79"}, + {url = "https://files.pythonhosted.org/packages/28/9b/998101ee984a63a5ba973eeecb5e9a013fd03c2f0c82220eba2754dd7426/pymongo-4.6.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5717a308a703dda2886a5796a07489c698b442f5e409cf7dc2ac93de8d61d764"}, + {url = "https://files.pythonhosted.org/packages/29/bd/659454b2a1a78ba94fc47b3e7d5e5ba74e1896a602d2d3b9ce1c38da3917/pymongo-4.6.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6d6a1b1361f118e7fefa17ae3114e77f10ee1b228b20d50c47c9f351346180c8"}, + {url = "https://files.pythonhosted.org/packages/2c/f7/fadb03eb3e27346f88221374696339d07f899f44f44a855d23e0510e7cc1/pymongo-4.6.0-cp38-cp38-manylinux2014_s390x.whl", hash = "sha256:a4dc1319d0c162919ee7f4ee6face076becae2abbd351cc14f1fe70af5fb20d9"}, + {url = "https://files.pythonhosted.org/packages/33/ec/1d9d930429f1515c4af041526384e5a7656d035f34a4bda1811bd4beebf6/pymongo-4.6.0-cp39-cp39-manylinux1_i686.whl", hash = "sha256:e16ade71c93f6814d095d25cd6d28a90d63511ea396bd96e9ffcb886b278baaa"}, + {url = "https://files.pythonhosted.org/packages/34/74/e7dcb3ebe651a7da357124f8d21103a99f443531fb932ceb16fc52d3f49a/pymongo-4.6.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:af425f323fce1b07755edd783581e7283557296946212f5b1a934441718e7528"}, + {url = "https://files.pythonhosted.org/packages/35/e4/da05c4f7546b6ecfb0e304e5c415b912f43adc4b9d3a55e51f4b4d044c37/pymongo-4.6.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1ec71ac633b126c0775ed4604ca8f56c3540f5c21a1220639f299e7a544b55f9"}, + {url = "https://files.pythonhosted.org/packages/37/1a/bcf9bcf8191f913a845e7dea211d00a614bc263300c88e49c5d5389b04e6/pymongo-4.6.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:49f2af6cf82509b15093ce3569229e0d53c90ad8ae2eef940652d4cf1f81e045"}, + {url = "https://files.pythonhosted.org/packages/37/d8/2a36ae6e5a2ca6ee0ab1c259860807c1b0046fb09f127c7f855eaa217623/pymongo-4.6.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e3db7d833a7c38c317dc95b54e27f1d27012e031b45a7c24e360b53197d5f6e7"}, + {url = "https://files.pythonhosted.org/packages/47/5c/cf9d4bce29272bf6829be17972124a36eae3efe2a8bd82916167ba9b60e2/pymongo-4.6.0-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:fe03bf25fae4b95d8afe40004a321df644400fdcba4c8e5e1a19c1085b740888"}, + {url = "https://files.pythonhosted.org/packages/47/eb/d9a32f59e26b4146e29c8134f305c7eae3c7b51f5c8525f427fddb97980c/pymongo-4.6.0-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:cc94f9fea17a5af8cf1a343597711a26b0117c0b812550d99934acb89d526ed2"}, + {url = "https://files.pythonhosted.org/packages/4d/d0/1e668020cb21f5c15ad3c6ae9755eb20ef7336e526f76a81a7a89c63fe0f/pymongo-4.6.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:e5e193f89f4f8c1fe273f9a6e6df915092c9f2af6db2d1afb8bd53855025c11f"}, + {url = "https://files.pythonhosted.org/packages/50/10/99e99377b08273b6e26de3998312cca019ed9a2e9215c0d600796c060d81/pymongo-4.6.0-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:325701ae7b56daa5b0692305b7cb505ca50f80a1288abb32ff420a8a209b01ca"}, + {url = "https://files.pythonhosted.org/packages/50/16/d5b3e2d5d23e81bfd0a1bc04a038f7075992ebffa361f789880a155a2c61/pymongo-4.6.0-cp311-cp311-win_amd64.whl", hash = "sha256:6695d7136a435c1305b261a9ddb9b3ecec9863e05aab3935b96038145fd3a977"}, + {url = "https://files.pythonhosted.org/packages/55/35/5193729f4fbc4f31207f39994e86d448349f9c76f4888b396545285f7f1a/pymongo-4.6.0-cp310-cp310-manylinux2014_x86_64.whl", hash = "sha256:b4ad70d7cac4ca0c7b31444a0148bd3af01a2662fa12b1ad6f57cd4a04e21766"}, + {url = "https://files.pythonhosted.org/packages/5a/89/d70748baeb316eeb2cd464ee33354b9ce4346787388eb9e23b284daf6500/pymongo-4.6.0-cp310-cp310-win_amd64.whl", hash = "sha256:8adf014f2779992eba3b513e060d06f075f0ab2fb3ad956f413a102312f65cdf"}, + {url = "https://files.pythonhosted.org/packages/5b/65/574534f1d89f9500cb30f338ad4f18f3fb6a9e488d910a308948887346f2/pymongo-4.6.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:7b0e6361754ac596cd16bfc6ed49f69ffcd9b60b7bc4bcd3ea65c6a83475e4ff"}, + {url = "https://files.pythonhosted.org/packages/5c/81/d812def5735185178ef675a9178830bee19eb215f427cacf810b3eeb1304/pymongo-4.6.0-cp38-cp38-win32.whl", hash = "sha256:806e094e9e85d8badc978af8c95b69c556077f11844655cb8cd2d1758769e521"}, + {url = "https://files.pythonhosted.org/packages/5e/97/6fc527b749f4af354042c43b7032d0734923be2dad6c8ffdd28b469b8e93/pymongo-4.6.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d3077a31633beef77d057c6523f5de7271ddef7bde5e019285b00c0cc9cac1e3"}, + {url = "https://files.pythonhosted.org/packages/60/14/94e45dd53d5e23b5f06f960e8eb9d2821bd66d73aef032c40193a23f13c6/pymongo-4.6.0-cp39-cp39-win_amd64.whl", hash = "sha256:107a234dc55affc5802acb3b6d83cbb8c87355b38a9457fcd8806bdeb8bce161"}, + {url = "https://files.pythonhosted.org/packages/62/eb/4feb857b0ae14db129dc4b5f5fc5b9571f555652a272cec8d69fd310b495/pymongo-4.6.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8ab6bcc8e424e07c1d4ba6df96f7fb963bcb48f590b9456de9ebd03b88084fe8"}, + {url = "https://files.pythonhosted.org/packages/68/09/14608ee0ddf47841127845b1ee20a0fbde2e743f42014be43c74c9a70325/pymongo-4.6.0-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:055f5c266e2767a88bb585d01137d9c7f778b0195d3dbf4a487ef0638be9b651"}, + {url = "https://files.pythonhosted.org/packages/69/6e/29b29aa6db66183eea3450a4c06b1854af08d04acb1776a5e4798f6dc158/pymongo-4.6.0-cp310-cp310-win32.whl", hash = "sha256:b14dd73f595199f4275bed4fb509277470d9b9059310537e3b3daba12b30c157"}, + {url = "https://files.pythonhosted.org/packages/6c/74/1a93fd93ce20f3692925e3726331bb4407d27ad191989940d67b21bff661/pymongo-4.6.0-cp310-cp310-manylinux2014_ppc64le.whl", hash = "sha256:9b0f98481ad5dc4cb430a60bbb8869f05505283b9ae1c62bdb65eb5e020ee8e3"}, + {url = "https://files.pythonhosted.org/packages/6d/10/a0b23244507d2f3569cf3ba31e3fa22a88fa0984c74a7409f77909183e34/pymongo-4.6.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:a49aca4d961823b2846b739380c847e8964ff7ae0f0a683992b9d926054f0d6d"}, + {url = "https://files.pythonhosted.org/packages/6d/19/1de1148cafca6f224c82a8203eaacddef9688faef6253c92f2608727039d/pymongo-4.6.0-cp38-cp38-macosx_11_0_universal2.whl", hash = "sha256:2f8c04277d879146eacda920476e93d520eff8bec6c022ac108cfa6280d84348"}, + {url = "https://files.pythonhosted.org/packages/75/ab/42ac7cb402fda2b10d1cacb36be26678aa6ea451c53e0ef81aecc400f160/pymongo-4.6.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:db082f728160369d9a6ed2e722438291558fc15ce06d0a7d696a8dad735c236b"}, + {url = "https://files.pythonhosted.org/packages/77/a1/77118a49d6e7be68e7aafe8701d8c1e0001b474a826e34edd381cea7f0d5/pymongo-4.6.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:85f2cdc400ee87f5952ebf2a117488f2525a3fb2e23863a8efe3e4ee9e54e4d1"}, + {url = "https://files.pythonhosted.org/packages/78/4e/da01b5c5a50cb811118c369fa070e8fdd248281b336fe3e209c12741a0a6/pymongo-4.6.0-cp37-cp37m-win_amd64.whl", hash = "sha256:81dd1308bd5630d2bb5980f00aa163b986b133f1e9ed66c66ce2a5bc3572e891"}, + {url = "https://files.pythonhosted.org/packages/7c/71/aca165b8096ab26d0ed7be53d7c59b6e942c0a778949540216c5d5561542/pymongo-4.6.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3729b8db02063da50eeb3db88a27670d85953afb9a7f14c213ac9e3dca93034b"}, + {url = "https://files.pythonhosted.org/packages/7c/ad/c71273f95550d8b59b1d6aa9c31a968bb9b128bb66e785f5e1ca1ee5007a/pymongo-4.6.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f28ae33dc5a0b9cee06e95fd420e42155d83271ab75964baf747ce959cac5f52"}, + {url = "https://files.pythonhosted.org/packages/7e/b2/630ec44e106fd3bc8ca3f67449aa1dac6b779797859562f8f996ab4f4b4d/pymongo-4.6.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2973f113e079fb98515722cd728e1820282721ec9fd52830e4b73cabdbf1eb28"}, + {url = "https://files.pythonhosted.org/packages/7f/49/a50718f3fa8ae8b55c29dc34470c001b50f81ded95209ff6649b880b3536/pymongo-4.6.0-cp310-cp310-manylinux2014_s390x.whl", hash = "sha256:256c503a75bd71cf7fb9ebf889e7e222d49c6036a48aad5a619f98a0adf0e0d7"}, + {url = "https://files.pythonhosted.org/packages/83/81/e08a170fcf20ba6f2d21865f247d368c717d070f508963517a56c798a3ae/pymongo-4.6.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2d2be5c9c3488fa8a70f83ed925940f488eac2837a996708d98a0e54a861f212"}, + {url = "https://files.pythonhosted.org/packages/87/3c/d97623ef457d56a06625dd625395321a741f78aecb7874d28f4f82d6a237/pymongo-4.6.0-cp37-cp37m-manylinux2014_x86_64.whl", hash = "sha256:3919708594b86d0f5cdc713eb6fccd3f9b9532af09ea7a5d843c933825ef56c4"}, + {url = "https://files.pythonhosted.org/packages/89/a8/0d32e276c755c4de66c965b1b1db9cfea1bde5dfe70fca0204c284e2381f/pymongo-4.6.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ebf02c32afa6b67e5861a27183dd98ed88419a94a2ab843cc145fb0bafcc5b28"}, + {url = "https://files.pythonhosted.org/packages/89/ee/4f091e6459dd1744cce7d31a787716dbc1f92adb09f69268a7658adb097d/pymongo-4.6.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b80a4ee19b3442c57c38afa978adca546521a8822d663310b63ae2a7d7b13f3a"}, + {url = "https://files.pythonhosted.org/packages/95/56/a2099d9a0fe2bcbc678a435c924de2ccfc4169528893fccf782abe8fd341/pymongo-4.6.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:c011bd5ad03cc096f99ffcfdd18a1817354132c1331bed7a837a25226659845f"}, + {url = "https://files.pythonhosted.org/packages/9c/a3/5332137c391e4c290a49d764a17af12e1b6dce1f050baa6e5b82a4624c61/pymongo-4.6.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:518c90bdd6e842c446d01a766b9136fec5ec6cc94f3b8c3f8b4a332786ee6b64"}, + {url = "https://files.pythonhosted.org/packages/a2/93/ca259196c7fbb05f87dde3a68da99a874f590ebcb560c85ea6be5e08f133/pymongo-4.6.0-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1e4ed21029d80c4f62605ab16398fe1ce093fff4b5f22d114055e7d9fbc4adb0"}, + {url = "https://files.pythonhosted.org/packages/a6/fd/f7214e5d751ed1fffa668acb1d4b74139cc5c6d282e42b3f3ea8a5331754/pymongo-4.6.0-cp38-cp38-win_amd64.whl", hash = "sha256:1394c4737b325166a65ae7c145af1ebdb9fb153ebedd37cf91d676313e4a67b8"}, + {url = "https://files.pythonhosted.org/packages/a7/3c/9f1ad55fbaccf111fc2c3c7309c67035c4dbaed47af92dec3a78d16fe17d/pymongo-4.6.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:ba51129fcc510824b6ca6e2ce1c27e3e4d048b6e35d3ae6f7e517bed1b8b25ce"}, + {url = "https://files.pythonhosted.org/packages/a8/d0/a83a48fe8b4007361b4f01a031617c4d234c8f7ba2eff1d6c2c25fff5c60/pymongo-4.6.0-cp37-cp37m-manylinux2014_s390x.whl", hash = "sha256:680fa0fc719e1a3dcb81130858368f51d83667d431924d0bcf249644bce8f303"}, + {url = "https://files.pythonhosted.org/packages/b0/be/97c0863129bb03d7af86075e9d8f3240c0a45a29b982f7e8c6262c2d6c2c/pymongo-4.6.0-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:747c84f4e690fbe6999c90ac97246c95d31460d890510e4a3fa61b7d2b87aa34"}, + {url = "https://files.pythonhosted.org/packages/b2/3c/9877560f57a7d1839cd74a06f0ecb5ab2812283b8f88339bffc4e2b116a3/pymongo-4.6.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:a8273e1abbcff1d7d29cbbb1ea7e57d38be72f1af3c597c854168508b91516c2"}, + {url = "https://files.pythonhosted.org/packages/b4/5e/11fad226acae56ef8cfee205bf491f4d50f9c12c5bf3294680006d04de54/pymongo-4.6.0.tar.gz", hash = "sha256:fb1c56d891f9e34303c451998ef62ba52659648bb0d75b03c5e4ac223a3342c2"}, + {url = "https://files.pythonhosted.org/packages/b4/7b/14e55c74694b0abb4fdc9f18104cc79512172292dc4e80bbb5ab0a84d668/pymongo-4.6.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6bafea6061d63059d8bc2ffc545e2f049221c8a4457d236c5cd6a66678673eab"}, + {url = "https://files.pythonhosted.org/packages/b8/e4/cd6e15e1bb5b3044d77cfe4fe61f4f17d6b364fabbda5d0cbe9f618b66e8/pymongo-4.6.0-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:ccd785fafa1c931deff6a7116e9a0d402d59fabe51644b0d0c268295ff847b25"}, + {url = "https://files.pythonhosted.org/packages/b9/bc/e9f5851974753698fb9c157a5bf96ef1320463d42d005fcdae3c63e9bce3/pymongo-4.6.0-cp310-cp310-manylinux2014_aarch64.whl", hash = "sha256:2972dd1f1285866aba027eff2f4a2bbf8aa98563c2ced14cb34ee5602b36afdf"}, + {url = "https://files.pythonhosted.org/packages/bb/91/52a1b0a5b203aa7651c92dc62a561432bde2fef7db28c9c0f8155e11bbb1/pymongo-4.6.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ecd9e1fa97aa11bf67472220285775fa15e896da108f425e55d23d7540a712ce"}, + {url = "https://files.pythonhosted.org/packages/c5/2c/c90b4b82bec2e871c2e887ab983df9c149a1e93e0e026c1d8ee45bef7b27/pymongo-4.6.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d16a534da0e39785687b7295e2fcf9a339f4a20689024983d11afaa4657f8507"}, + {url = "https://files.pythonhosted.org/packages/c5/6a/7a356bbe85aceee14299af5fa8947bfb8c55fb131476220c3627891a6258/pymongo-4.6.0-cp312-cp312-win_amd64.whl", hash = "sha256:014e7049dd019a6663747ca7dae328943e14f7261f7c1381045dfc26a04fa330"}, + {url = "https://files.pythonhosted.org/packages/c6/c1/da0920b6bb4791300ab9e88cfcfa9dcb3f8062fff808bb2d12b514dec817/pymongo-4.6.0-cp311-cp311-win32.whl", hash = "sha256:7fc2bb8a74dcfcdd32f89528e38dcbf70a3a6594963d60dc9595e3b35b66e414"}, + {url = "https://files.pythonhosted.org/packages/cc/d3/8e1475d40c0fa939b367eb2c8099479227dcc6d28f308f56d9033df65804/pymongo-4.6.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:d603edea1ff7408638b2504905c032193b7dcee7af269802dbb35bc8c3310ed5"}, + {url = "https://files.pythonhosted.org/packages/d1/3b/4513e077aea0114f2548942295655722ddc14fe5d743def62e7c2d6f6c82/pymongo-4.6.0-cp39-cp39-manylinux2014_i686.whl", hash = "sha256:21812453354b151200034750cd30b0140e82ec2a01fd4357390f67714a1bfbde"}, + {url = "https://files.pythonhosted.org/packages/de/cf/e9ce043417f309cdb82d84dda363111aa252e32ec0e7c28f93ee532b0363/pymongo-4.6.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ef67fedd863ffffd4adfd46d9d992b0f929c7f61a8307366d664d93517f2c78e"}, + {url = "https://files.pythonhosted.org/packages/e1/7d/a19ec2c7d1bb9090c1052062e7de90508031026123aa4275ae3fea0d8754/pymongo-4.6.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:05c30fd35cc97f14f354916b45feea535d59060ef867446b5c3c7f9b609dd5dc"}, + {url = "https://files.pythonhosted.org/packages/e2/e7/44f649615355878067f33453a594a4193518349d47e0e990abb0d506d564/pymongo-4.6.0-cp312-cp312-win32.whl", hash = "sha256:47aa128be2e66abd9d1a9b0437c62499d812d291f17b55185cb4aa33a5f710a4"}, + {url = "https://files.pythonhosted.org/packages/e3/52/2e73dc8c26f89a9a24a51b7e700252f302a499aa4e83a00ecc8934e6e7e7/pymongo-4.6.0-cp39-cp39-manylinux2014_x86_64.whl", hash = "sha256:2703a9f8f5767986b4f51c259ff452cc837c5a83c8ed5f5361f6e49933743b2f"}, + {url = "https://files.pythonhosted.org/packages/e3/ad/08558895e438483aa5e61ff534dc8a215ddfe2c2c8e43146fdc3d50f83f6/pymongo-4.6.0-cp38-cp38-manylinux2014_ppc64le.whl", hash = "sha256:10a379fb60f1b2406ae57b8899bacfe20567918c8e9d2d545e1b93628fcf2050"}, + {url = "https://files.pythonhosted.org/packages/e9/a4/af20aabc70d0c290ce95fea0e27f1ce9046961b243ccbc1e45ddb1e131bf/pymongo-4.6.0-cp310-cp310-manylinux1_i686.whl", hash = "sha256:5e63146dbdb1eac207464f6e0cfcdb640c9c5ff0f57b754fa96fe252314a1dc6"}, + {url = "https://files.pythonhosted.org/packages/f0/1f/39e7616a07f682e39a144fa31e59dbe6291a88bbe4d2f6324af5a1ea515e/pymongo-4.6.0-cp38-cp38-manylinux2014_x86_64.whl", hash = "sha256:ddef295aaf80cefb0c1606f1995899efcb17edc6b327eb6589e234e614b87756"}, + {url = "https://files.pythonhosted.org/packages/f0/3d/2955238d8250779c4bf3621cbdcb82517fb23ec9a2baf24b9c810c487006/pymongo-4.6.0-cp39-cp39-win32.whl", hash = "sha256:a09bfb51953930e7e838972ddf646c5d5f984992a66d79da6ba7f6a8d8a890cd"}, + {url = "https://files.pythonhosted.org/packages/f0/98/c036233e9babc2bf87461ac7b2989d3557bb600996855c8d61e045a9875d/pymongo-4.6.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:7e3b0127b260d4abae7b62203c4c7ef0874c901b55155692353db19de4b18bc4"}, + {url = "https://files.pythonhosted.org/packages/f1/60/8ee2501067426f611279c8267359f16fc6f28b890eea48c7b3cb308c383f/pymongo-4.6.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:128b1485753106c54af481789cdfea12b90a228afca0b11fb3828309a907e10e"}, + {url = "https://files.pythonhosted.org/packages/f3/d3/57a810740e6c7480ea29c7aa3989c2beda34aed399667290698a53cb0ae0/pymongo-4.6.0-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:288c21ab9531b037f7efa4e467b33176bc73a0c27223c141b822ab4a0e66ff2a"}, + {url = "https://files.pythonhosted.org/packages/f6/00/631bed6b95bf666173d454a201e808c178eabd13085cba02e0bea67daf67/pymongo-4.6.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:79f41576b3022c2fe9780ae3e44202b2438128a25284a8ddfa038f0785d87019"}, + {url = "https://files.pythonhosted.org/packages/f9/02/7d226bc35a465df902dfb1bf46784a02f630bcaeade981aae77e944e4d42/pymongo-4.6.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9bea9138b0fc6e2218147e9c6ce1ff76ff8e29dc00bb1b64842bd1ca107aee9f"}, + {url = "https://files.pythonhosted.org/packages/fb/c8/34293fc9f36918e1e37cf74027ae4b3e3ed3d7685f9d9fe635c7d00921ef/pymongo-4.6.0-cp38-cp38-manylinux1_i686.whl", hash = "sha256:5802acc012bbb4bce4dff92973dff76482f30ef35dd4cb8ab5b0e06aa8f08c80"}, + {url = "https://files.pythonhosted.org/packages/ff/26/20a80e477a8ecb8f8dea622c87a0b1c17b2bd9398bfb24250efd36128fab/pymongo-4.6.0-cp38-cp38-manylinux2014_i686.whl", hash = "sha256:2ca0ba501898b2ec31e6c3acf90c31910944f01d454ad8e489213a156ccf1bda"}, +] +"pyproject-api 1.6.1" = [ + {url = "https://files.pythonhosted.org/packages/1b/c6/b39e42e1d721dcb35be6a7d35157795398193ec0b78a034c110bd0ab3e48/pyproject_api-1.6.1.tar.gz", hash = "sha256:1817dc018adc0d1ff9ca1ed8c60e1623d5aaca40814b953af14a9cf9a5cae538"}, + {url = "https://files.pythonhosted.org/packages/cf/b4/39eea50542e50e93876ebc09c4349a9c9eee9f6b9c9d30f88c7dc5433db8/pyproject_api-1.6.1-py3-none-any.whl", hash = "sha256:4c0116d60476b0786c88692cf4e325a9814965e2469c5998b830bba16b183675"}, +] +"pytest 7.4.3" = [ + {url = "https://files.pythonhosted.org/packages/38/d4/174f020da50c5afe9f5963ad0fc5b56a4287e3586e3de5b3c8bce9c547b4/pytest-7.4.3.tar.gz", hash = "sha256:d989d136982de4e3b29dabcc838ad581c64e8ed52c11fbe86ddebd9da0818cd5"}, + {url = "https://files.pythonhosted.org/packages/f3/8c/f16efd81ca8e293b2cc78f111190a79ee539d0d5d36ccd49975cb3beac60/pytest-7.4.3-py3-none-any.whl", hash = "sha256:0d009c083ea859a71b76adf7c1d502e4bc170b80a8ef002da5806527b9591fac"}, +] +"python-dateutil 2.8.2" = [ + {url = "https://files.pythonhosted.org/packages/36/7a/87837f39d0296e723bb9b62bbb257d0355c7f6128853c78955f57342a56d/python_dateutil-2.8.2-py2.py3-none-any.whl", hash = "sha256:961d03dc3453ebbc59dbdea9e4e11c5651520a876d0f4db161e8674aae935da9"}, + {url = "https://files.pythonhosted.org/packages/4c/c4/13b4776ea2d76c115c1d1b84579f3764ee6d57204f6be27119f13a61d0a9/python-dateutil-2.8.2.tar.gz", hash = "sha256:0123cacc1627ae19ddf3c27a5de5bd67ee4586fbdd6440d9748f8abb483d3e86"}, +] +"pyyaml 6.0.1" = [ + {url = "https://files.pythonhosted.org/packages/02/74/b2320ebe006b6a521cf929c78f12a220b9db319b38165023623ed195654b/PyYAML-6.0.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:50550eb667afee136e9a77d6dc71ae76a44df8b3e51e41b77f6de2932bfe0f47"}, + {url = "https://files.pythonhosted.org/packages/03/5c/c4671451b2f1d76ebe352c0945d4cd13500adb5d05f5a51ee296d80152f7/PyYAML-6.0.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:e7d73685e87afe9f3b36c799222440d6cf362062f78be1013661b00c5c6f678b"}, + {url = "https://files.pythonhosted.org/packages/03/f7/4f8b71f3ce8cfb2c06e814aeda5b26ecc62ecb5cf85f5c8898be34e6eb6a/PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1fe35611261b29bd1de0070f0b2f47cb6ff71fa6595c077e42bd0c419fa27b98"}, + {url = "https://files.pythonhosted.org/packages/06/92/e0224aa6ebf9dc54a06a4609da37da40bb08d126f5535d81bff6b417b2ae/PyYAML-6.0.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:062582fca9fabdd2c8b54a3ef1c978d786e0f6b3a1510e0ac93ef59e0ddae2bc"}, + {url = "https://files.pythonhosted.org/packages/07/91/45dfd0ef821a7f41d9d0136ea3608bb5b1653e42fd56a7970532cb5c003f/PyYAML-6.0.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:326c013efe8048858a6d312ddd31d56e468118ad4cdeda36c719bf5bb6192290"}, + {url = "https://files.pythonhosted.org/packages/0d/46/62ae77677e532c0af6c81ddd6f3dbc16bdcc1208b077457354442d220bfb/PyYAML-6.0.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:49a183be227561de579b4a36efbb21b3eab9651dd81b1858589f796549873dd6"}, + {url = "https://files.pythonhosted.org/packages/0e/88/21b2f16cb2123c1e9375f2c93486e35fdc86e63f02e274f0e99c589ef153/PyYAML-6.0.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:c8098ddcc2a85b61647b2590f825f3db38891662cfc2fc776415143f599bb859"}, + {url = "https://files.pythonhosted.org/packages/1e/ae/964ccb88a938f20ece5754878f182cfbd846924930d02d29d06af8d4c69e/PyYAML-6.0.1-cp37-cp37m-win_amd64.whl", hash = "sha256:4fb147e7a67ef577a588a0e2c17b6db51dda102c71de36f8549b6816a96e1867"}, + {url = "https://files.pythonhosted.org/packages/24/62/7fcc372442ec8ea331da18c24b13710e010c5073ab851ef36bf9dacb283f/PyYAML-6.0.1-cp39-cp39-win32.whl", hash = "sha256:faca3bdcf85b2fc05d06ff3fbc1f83e1391b3e724afa3feba7d13eeab355484c"}, + {url = "https://files.pythonhosted.org/packages/24/97/9b59b43431f98d01806b288532da38099cc6f2fea0f3d712e21e269c0279/PyYAML-6.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:fd1592b3fdf65fff2ad0004b5e363300ef59ced41c2e6b3a99d4089fa8c5435d"}, + {url = "https://files.pythonhosted.org/packages/27/d5/fb4f7a3c96af89c214387af42c76117d2c2a0a40576e217632548a6e1aff/PyYAML-6.0.1-cp36-cp36m-win_amd64.whl", hash = "sha256:f22ac1c3cac4dbc50079e965eba2c1058622631e526bd9afd45fedd49ba781fa"}, + {url = "https://files.pythonhosted.org/packages/28/09/55f715ddbf95a054b764b547f617e22f1d5e45d83905660e9a088078fe67/PyYAML-6.0.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f003ed9ad21d6a4713f0a9b5a7a0a79e08dd0f221aff4525a2be4c346ee60aab"}, + {url = "https://files.pythonhosted.org/packages/29/0f/9782fa5b10152abf033aec56a601177ead85ee03b57781f2d9fced09eefc/PyYAML-6.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:1e2722cc9fbb45d9b87631ac70924c11d3a401b2d7f410cc0e3bbf249f2dca62"}, + {url = "https://files.pythonhosted.org/packages/29/61/bf33c6c85c55bc45a29eee3195848ff2d518d84735eb0e2d8cb42e0d285e/PyYAML-6.0.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ba336e390cd8e4d1739f42dfe9bb83a3cc2e80f567d8805e11b46f4a943f5515"}, + {url = "https://files.pythonhosted.org/packages/2b/9f/fbade56564ad486809c27b322d0f7e6a89c01f6b4fe208402e90d4443a99/PyYAML-6.0.1-cp312-cp312-win_amd64.whl", hash = "sha256:0d3304d8c0adc42be59c5f8a4d9e3d7379e6955ad754aa9d6ab7a398b59dd1df"}, + {url = "https://files.pythonhosted.org/packages/2e/97/3e0e089ee85e840f4b15bfa00e4e63d84a3691ababbfea92d6f820ea6f21/PyYAML-6.0.1-cp312-cp312-win32.whl", hash = "sha256:d483d2cdf104e7c9fa60c544d92981f12ad66a457afae824d146093b8c294c54"}, + {url = "https://files.pythonhosted.org/packages/40/da/a175a35cf5583580e90ac3e2a3dbca90e43011593ae62ce63f79d7b28d92/PyYAML-6.0.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:04ac92ad1925b2cff1db0cfebffb6ffc43457495c9b3c39d3fcae417d7125dc5"}, + {url = "https://files.pythonhosted.org/packages/41/9a/1c4c51f1a0d2b6fd805973701ab0ec84d5e622c5aaa573b0e1157f132809/PyYAML-6.0.1-cp36-cp36m-win32.whl", hash = "sha256:fca0e3a251908a499833aa292323f32437106001d436eca0e6e7833256674585"}, + {url = "https://files.pythonhosted.org/packages/4a/4b/c71ef18ef83c82f99e6da8332910692af78ea32bd1d1d76c9787dfa36aea/PyYAML-6.0.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b786eecbdf8499b9ca1d697215862083bd6d2a99965554781d0d8d1ad31e13a0"}, + {url = "https://files.pythonhosted.org/packages/4d/f1/08f06159739254c8947899c9fc901241614195db15ba8802ff142237664c/PyYAML-6.0.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:596106435fa6ad000c2991a98fa58eeb8656ef2325d7e158344fb33864ed87e3"}, + {url = "https://files.pythonhosted.org/packages/4f/78/77b40157b6cb5f2d3d31a3d9b2efd1ba3505371f76730d267e8b32cf4b7f/PyYAML-6.0.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8d4e9c88387b0f5c7d5f281e55304de64cf7f9c0021a3525bd3b1c542da3b0e4"}, + {url = "https://files.pythonhosted.org/packages/57/c5/5d09b66b41d549914802f482a2118d925d876dc2a35b2d127694c1345c34/PyYAML-6.0.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9eb6caa9a297fc2c2fb8862bc5370d0303ddba53ba97e71f08023b6cd73d16a8"}, + {url = "https://files.pythonhosted.org/packages/5b/07/10033a403b23405a8fc48975444463d3d10a5c2736b7eb2550b07b367429/PyYAML-6.0.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:fd66fc5d0da6d9815ba2cebeb4205f95818ff4b79c3ebe268e75d961704af52f"}, + {url = "https://files.pythonhosted.org/packages/5e/94/7d5ee059dfb92ca9e62f4057dcdec9ac08a9e42679644854dc01177f8145/PyYAML-6.0.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:42f8152b8dbc4fe7d96729ec2b99c7097d656dc1213a3229ca5383f973a5ed6d"}, + {url = "https://files.pythonhosted.org/packages/62/2a/df7727c52e151f9e7b852d7d1580c37bd9e39b2f29568f0f81b29ed0abc2/PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:afd7e57eddb1a54f0f1a974bc4391af8bcce0b444685d936840f125cf046d5bd"}, + {url = "https://files.pythonhosted.org/packages/73/9c/766e78d1efc0d1fca637a6b62cea1b4510a7fb93617eb805223294fef681/PyYAML-6.0.1-cp311-cp311-win32.whl", hash = "sha256:1635fd110e8d85d55237ab316b5b011de701ea0f29d07611174a1b42f1444741"}, + {url = "https://files.pythonhosted.org/packages/7b/5e/efd033ab7199a0b2044dab3b9f7a4f6670e6a52c089de572e928d2873b06/PyYAML-6.0.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d2b04aac4d386b172d5b9692e2d2da8de7bfb6c387fa4f801fbf6fb2e6ba4673"}, + {url = "https://files.pythonhosted.org/packages/7d/39/472f2554a0f1e825bd7c5afc11c817cd7a2f3657460f7159f691fbb37c51/PyYAML-6.0.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc1bf2925a1ecd43da378f4db9e4f799775d6367bdb94671027b73b393a7c42c"}, + {url = "https://files.pythonhosted.org/packages/7f/5d/2779ea035ba1e533c32ed4a249b4e0448f583ba10830b21a3cddafe11a4e/PyYAML-6.0.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1d4c7e777c441b20e32f52bd377e0c409713e8bb1386e1099c2415f26e479595"}, + {url = "https://files.pythonhosted.org/packages/84/02/404de95ced348b73dd84f70e15a41843d817ff8c1744516bf78358f2ffd2/PyYAML-6.0.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:40df9b996c2b73138957fe23a16a4f0ba614f4c0efce1e9406a184b6d07fa3a9"}, + {url = "https://files.pythonhosted.org/packages/84/4d/82704d1ab9290b03da94e6425f5e87396b999fd7eb8e08f3a92c158402bf/PyYAML-6.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:510c9deebc5c0225e8c96813043e62b680ba2f9c50a08d3724c7f28a747d1486"}, + {url = "https://files.pythonhosted.org/packages/96/06/4beb652c0fe16834032e54f0956443d4cc797fe645527acee59e7deaa0a2/PyYAML-6.0.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d858aa552c999bc8a8d57426ed01e40bef403cd8ccdd0fc5f6f04a00414cac2a"}, + {url = "https://files.pythonhosted.org/packages/ac/6c/967d91a8edf98d2b2b01d149bd9e51b8f9fb527c98d80ebb60c6b21d60c4/PyYAML-6.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5773183b6446b2c99bb77e77595dd486303b4faab2b086e7b17bc6bef28865f6"}, + {url = "https://files.pythonhosted.org/packages/b3/34/65bb4b2d7908044963ebf614fe0fdb080773fc7030d7e39c8d3eddcd4257/PyYAML-6.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:bf07ee2fef7014951eeb99f56f39c9bb4af143d8aa3c21b1677805985307da34"}, + {url = "https://files.pythonhosted.org/packages/b4/33/720548182ffa8344418126017aa1d4ab4aeec9a2275f04ce3f3573d8ace8/PyYAML-6.0.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c22bec3fbe2524cde73d7ada88f6566758a8f7227bfbf93a408a9d86bcc12a0"}, + {url = "https://files.pythonhosted.org/packages/b6/a0/b6700da5d49e9fed49dc3243d3771b598dad07abb37cc32e524607f96adc/PyYAML-6.0.1-cp310-cp310-win32.whl", hash = "sha256:bd4af7373a854424dabd882decdc5579653d7868b8fb26dc7d0e99f823aa5924"}, + {url = "https://files.pythonhosted.org/packages/ba/91/090818dfa62e85181f3ae23dd1e8b7ea7f09684864a900cab72d29c57346/PyYAML-6.0.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:81e0b275a9ecc9c0c0c07b4b90ba548307583c125f54d5b6946cfee6360c733d"}, + {url = "https://files.pythonhosted.org/packages/bc/06/1b305bf6aa704343be85444c9d011f626c763abb40c0edc1cad13bfd7f86/PyYAML-6.0.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:855fb52b0dc35af121542a76b9a84f8d1cd886ea97c84703eaa6d88e37a2ad28"}, + {url = "https://files.pythonhosted.org/packages/c1/39/47ed4d65beec9ce07267b014be85ed9c204fa373515355d3efa62d19d892/PyYAML-6.0.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:28c119d996beec18c05208a8bd78cbe4007878c6dd15091efb73a30e90539696"}, + {url = "https://files.pythonhosted.org/packages/c7/d1/02baa09d39b1bb1ebaf0d850d106d1bdcb47c91958557f471153c49dc03b/PyYAML-6.0.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:b1275ad35a5d18c62a7220633c913e1b42d44b46ee12554e5fd39c70a243d6a3"}, + {url = "https://files.pythonhosted.org/packages/c8/6b/6600ac24725c7388255b2f5add93f91e58a5d7efaf4af244fdbcc11a541b/PyYAML-6.0.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7e07cbde391ba96ab58e532ff4803f79c4129397514e1413a7dc761ccd755735"}, + {url = "https://files.pythonhosted.org/packages/cc/5c/fcabd17918348c7db2eeeb0575705aaf3f7ab1657f6ce29b2e31737dd5d1/PyYAML-6.0.1-cp37-cp37m-win32.whl", hash = "sha256:9046c58c4395dff28dd494285c82ba00b546adfc7ef001486fbf0324bc174fba"}, + {url = "https://files.pythonhosted.org/packages/cd/e5/af35f7ea75cf72f2cd079c95ee16797de7cd71f29ea7c68ae5ce7be1eda0/PyYAML-6.0.1.tar.gz", hash = "sha256:bfdf460b1736c775f2ba9f6a92bca30bc2095067b8a9d77876d1fad6cc3b4a43"}, + {url = "https://files.pythonhosted.org/packages/d6/6a/439d1a6f834b9a9db16332ce16c4a96dd0e3970b65fe08cbecd1711eeb77/PyYAML-6.0.1-cp38-cp38-win32.whl", hash = "sha256:184c5108a2aca3c5b3d3bf9395d50893a7ab82a38004c8f61c258d4428e80206"}, + {url = "https://files.pythonhosted.org/packages/d7/8f/db62b0df635b9008fe90aa68424e99cee05e68b398740c8a666a98455589/PyYAML-6.0.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:baa90d3f661d43131ca170712d903e6295d1f7a0f595074f151c0aed377c9b9c"}, + {url = "https://files.pythonhosted.org/packages/e1/a1/27bfac14b90adaaccf8c8289f441e9f76d94795ec1e7a8f134d9f2cb3d0b/PyYAML-6.0.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a0cd17c15d3bb3fa06978b4e8958dcdc6e0174ccea823003a106c7d4d7899ac5"}, + {url = "https://files.pythonhosted.org/packages/e5/31/ba812efa640a264dbefd258986a5e4e786230cb1ee4a9f54eb28ca01e14a/PyYAML-6.0.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:18aeb1bf9a78867dc38b259769503436b7c72f7a1f1f4c93ff9a17de54319b27"}, + {url = "https://files.pythonhosted.org/packages/ec/0d/26fb23e8863e0aeaac0c64e03fd27367ad2ae3f3cccf3798ee98ce160368/PyYAML-6.0.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6965a7bc3cf88e5a1c3bd2e0b5c22f8d677dc88a455344035f03399034eb3007"}, + {url = "https://files.pythonhosted.org/packages/f1/26/55e4f21db1f72eaef092015d9017c11510e7e6301c62a6cfee91295d13c6/PyYAML-6.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:69b023b2b4daa7548bcfbd4aa3da05b3a74b772db9e23b982788168117739938"}, + {url = "https://files.pythonhosted.org/packages/fe/88/def2e57fe740544f2eefb1645f1d6e0094f56c00f4eade708140b6137ead/PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:704219a11b772aea0d8ecd7058d0082713c3562b4e271b849ad7dc4a5c90c13c"}, +] +"ruff 0.1.5" = [ + {url = "https://files.pythonhosted.org/packages/28/fd/53511e2a3cd5627706e34572e9af0f61e645126d90995f1e2071364aefb2/ruff-0.1.5-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:f20dc5e5905ddb407060ca27267c7174f532375c08076d1a953cf7bb016f5a24"}, + {url = "https://files.pythonhosted.org/packages/2e/07/648e71f330cac7954268df52ad72196a6dc18a60b263af73577641c7ac25/ruff-0.1.5-py3-none-win_arm64.whl", hash = "sha256:82bfcb9927e88c1ed50f49ac6c9728dab3ea451212693fe40d08d314663e412f"}, + {url = "https://files.pythonhosted.org/packages/54/db/834a231e191517b0d7911147fbcb92a2206c9f74d43dd23870d81849c5fc/ruff-0.1.5-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:aafb9d2b671ed934998e881e2c0f5845a4295e84e719359c71c39a5363cccc91"}, + {url = "https://files.pythonhosted.org/packages/59/e1/8267e29a09b59df28b4472ae4807d8db60b8e9672c5acf343e1eedc97330/ruff-0.1.5-py3-none-macosx_10_7_x86_64.whl", hash = "sha256:32d47fc69261c21a4c48916f16ca272bf2f273eb635d91c65d5cd548bf1f3d96"}, + {url = "https://files.pythonhosted.org/packages/59/e8/4839e31304c9a030fb04ae0c304c488b0bd942d3589f8314e86901138fed/ruff-0.1.5-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:a8c11206b47f283cbda399a654fd0178d7a389e631f19f51da15cbe631480c5b"}, + {url = "https://files.pythonhosted.org/packages/66/21/4b5bbf5cb3b9d5d1213f345eb932db0c94471d5000d602b80e2ee967c853/ruff-0.1.5-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a4894dddb476597a0ba4473d72a23151b8b3b0b5f958f2cf4d3f1c572cdb7af7"}, + {url = "https://files.pythonhosted.org/packages/75/d1/018dc8535a3c2083e888b9ad32169dccca5ebd486d4fc30e29e1c488334e/ruff-0.1.5-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:721f4b9d3b4161df8dc9f09aa8562e39d14e55a4dbaa451a8e55bdc9590e20f4"}, + {url = "https://files.pythonhosted.org/packages/79/9d/d057e791cebac3e9af27fa4b3c78daf09c7ff35a344943c0d1dd25155cc4/ruff-0.1.5-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bb408e3a2ad8f6881d0f2e7ad70cddb3ed9f200eb3517a91a245bbe27101d379"}, + {url = "https://files.pythonhosted.org/packages/81/b6/bd72889302e8503bfa87d190afbb6f6c7ac1345d680071e990328929c359/ruff-0.1.5-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:b2c205827b3f8c13b4a432e9585750b93fd907986fe1aec62b2a02cf4401eee6"}, + {url = "https://files.pythonhosted.org/packages/88/54/549cff12b6e98e873fcb5b4cf85418c5f8ca53d473f2084dd5616695e925/ruff-0.1.5-py3-none-win_amd64.whl", hash = "sha256:c21fe20ee7d76206d290a76271c1af7a5096bc4c73ab9383ed2ad35f852a0087"}, + {url = "https://files.pythonhosted.org/packages/a1/2e/acf77283eb23154ed2220c70d84018a179267c58b63fa944938d0f599892/ruff-0.1.5-py3-none-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl", hash = "sha256:171276c1df6c07fa0597fb946139ced1c2978f4f0b8254f201281729981f3c17"}, + {url = "https://files.pythonhosted.org/packages/a1/73/40b0188a03de86b24909e665274c8bc667c609c4f0a775fcc324fd5a23b5/ruff-0.1.5-py3-none-musllinux_1_2_i686.whl", hash = "sha256:9b97fd6da44d6cceb188147b68db69a5741fbc736465b5cea3928fdac0bc1aeb"}, + {url = "https://files.pythonhosted.org/packages/ae/cf/95e9a2930c1a220fb2c5769d746901eea4576cc46f1200f0178a42a863ba/ruff-0.1.5-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a00a7ec893f665ed60008c70fe9eeb58d210e6b4d83ec6654a9904871f982a2a"}, + {url = "https://files.pythonhosted.org/packages/d1/2b/3a25a022bff4114206fa52c071275ee2b97aa7be7aad9559f60f6b96db39/ruff-0.1.5-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:fa29e67b3284b9a79b1a85ee66e293a94ac6b7bb068b307a8a373c3d343aa8ec"}, + {url = "https://files.pythonhosted.org/packages/dc/2e/c7f7e235fd12543ddd9f8218d59ee4b017a504d43b6a5584eebe96410ff3/ruff-0.1.5-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:17ef33cd0bb7316ca65649fc748acc1406dfa4da96a3d0cde6d52f2e866c7b39"}, + {url = "https://files.pythonhosted.org/packages/e7/f9/0453128f11c9ec0ec48ea125237634be3a1b8c4835282ab648373d8e6ff2/ruff-0.1.5.tar.gz", hash = "sha256:5cbec0ef2ae1748fb194f420fb03fb2c25c3258c86129af7172ff8f198f125ab"}, + {url = "https://files.pythonhosted.org/packages/fb/f1/f50c6ee75d53df3f763eb067213d2411a9d8fcc98740a84bc88c7c00aea9/ruff-0.1.5-py3-none-win32.whl", hash = "sha256:f80c73bba6bc69e4fdc73b3991db0b546ce641bdcd5b07210b8ad6f64c79f1ab"}, +] +"setuptools 68.2.2" = [ + {url = "https://files.pythonhosted.org/packages/bb/26/7945080113158354380a12ce26873dd6c1ebd88d47f5bc24e2c5bb38c16a/setuptools-68.2.2-py3-none-any.whl", hash = "sha256:b454a35605876da60632df1a60f736524eb73cc47bbc9f3f1ef1b644de74fd2a"}, + {url = "https://files.pythonhosted.org/packages/ef/cc/93f7213b2ab5ed383f98ce8020e632ef256b406b8569606c3f160ed8e1c9/setuptools-68.2.2.tar.gz", hash = "sha256:4ac1475276d2f1c48684874089fefcd83bd7162ddaafb81fac866ba0db282a87"}, +] +"six 1.16.0" = [ + {url = "https://files.pythonhosted.org/packages/71/39/171f1c67cd00715f190ba0b100d606d440a28c93c7714febeca8b79af85e/six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"}, + {url = "https://files.pythonhosted.org/packages/d9/5a/e7c31adbe875f2abbb91bd84cf2dc52d792b5a01506781dbcf25c91daf11/six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"}, +] +"sqlalchemy 2.0.23" = [ + {url = "https://files.pythonhosted.org/packages/12/61/ee1619cea002a94e954c353c2e93a4da85cb1106a24a7c66d5794301e84e/SQLAlchemy-2.0.23-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f508ba8f89e0a5ecdfd3761f82dda2a3d7b678a626967608f4273e0dba8f07ac"}, + {url = "https://files.pythonhosted.org/packages/17/60/8cfa64fe57a8e9a5cca61027519e7fb44b0e9124a9cb0509708f30d38cc1/SQLAlchemy-2.0.23-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c80c38bd2ea35b97cbf7c21aeb129dcbebbf344ee01a7141016ab7b851464f8e"}, + {url = "https://files.pythonhosted.org/packages/1d/40/9c7169cb4dc66c0a2d4cf5ff016faab417d30a1d2deea57780b329dd4fe5/SQLAlchemy-2.0.23-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:0666031df46b9badba9bed00092a1ffa3aa063a5e68fa244acd9f08070e936d3"}, + {url = "https://files.pythonhosted.org/packages/29/b2/70b88e4e6dac15dd2f380e18b7c2144b4334ac1587d6a7cc031297fac96c/SQLAlchemy-2.0.23-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7e0dc9031baa46ad0dd5a269cb7a92a73284d1309228be1d5935dac8fb3cae24"}, + {url = "https://files.pythonhosted.org/packages/2c/a4/f1978e5a12cbe7aa7043d2094b0d793287307e36e0bc351daea8b8cfa376/SQLAlchemy-2.0.23-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:14aebfe28b99f24f8a4c1346c48bc3d63705b1f919a24c27471136d2f219f02d"}, + {url = "https://files.pythonhosted.org/packages/2d/ca/1ad0106300c9cbd14e2b88bffe9f52f03ce2abe48f3b88747e520180014e/SQLAlchemy-2.0.23-cp310-cp310-win_amd64.whl", hash = "sha256:87a3d6b53c39cd173990de2f5f4b83431d534a74f0e2f88bd16eabb5667e65c6"}, + {url = "https://files.pythonhosted.org/packages/2f/4e/cbbb63dc6eb55138311a949ab4221e69a0aff8d95bf294fd948727392a14/SQLAlchemy-2.0.23-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:d0f7fb0c7527c41fa6fcae2be537ac137f636a41b4c5a4c58914541e2f436b45"}, + {url = "https://files.pythonhosted.org/packages/35/63/0ee6deb8409e6159ad7fccf89c9f36040666f63887f4147d716ae5b97d06/SQLAlchemy-2.0.23-cp38-cp38-win32.whl", hash = "sha256:42ede90148b73fe4ab4a089f3126b2cfae8cfefc955c8174d697bb46210c8306"}, + {url = "https://files.pythonhosted.org/packages/36/29/15a839fa2faf9d588afd7d0ea4ed9c323232bc682dbb683daaca3fbec0f6/SQLAlchemy-2.0.23-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:cc1d21576f958c42d9aec68eba5c1a7d715e5fc07825a629015fe8e3b0657fb0"}, + {url = "https://files.pythonhosted.org/packages/36/70/202467dc568aa211d234acedab908ca4e09dfbb6b8eedc91217c2e9208ac/SQLAlchemy-2.0.23-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:e599a51acf3cc4d31d1a0cf248d8f8d863b6386d2b6782c5074427ebb7803bda"}, + {url = "https://files.pythonhosted.org/packages/39/7f/3030a3af7f96434fd756ae31a586b23fdd0a07df0ec4a648336ade7edde3/SQLAlchemy-2.0.23-cp37-cp37m-win32.whl", hash = "sha256:f48ed89dd11c3c586f45e9eec1e437b355b3b6f6884ea4a4c3111a3358fd0c18"}, + {url = "https://files.pythonhosted.org/packages/3c/eb/66fc0910c7ca5617b7c042bb4bc345226ad015ce5fc6543f453bffb6e47b/SQLAlchemy-2.0.23-cp37-cp37m-win_amd64.whl", hash = "sha256:1e018aba8363adb0599e745af245306cb8c46b9ad0a6fc0a86745b6ff7d940fc"}, + {url = "https://files.pythonhosted.org/packages/4d/e0/d9551da0fc8c01c5a8342b7b30a7552329abf7a2a4a60411dd004e4b4501/SQLAlchemy-2.0.23-cp312-cp312-win32.whl", hash = "sha256:42d0b0290a8fb0165ea2c2781ae66e95cca6e27a2fbe1016ff8db3112ac1e846"}, + {url = "https://files.pythonhosted.org/packages/53/30/339fd68c0200a8f70d9198ca250c2ba0e4683ba11ba42423f300a041dfc9/SQLAlchemy-2.0.23-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:787af80107fb691934a01889ca8f82a44adedbf5ef3d6ad7d0f0b9ac557e0c34"}, + {url = "https://files.pythonhosted.org/packages/53/ce/d7262dcc228f66c4d805c8975f71deca581e8a56b46612eb35708ec5cb51/SQLAlchemy-2.0.23-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:638c2c0b6b4661a4fd264f6fb804eccd392745c5887f9317feb64bb7cb03b3ea"}, + {url = "https://files.pythonhosted.org/packages/55/b6/928ed9857b9974d40741bc1cd07f569f38904d13a5fa61fc782f3245e130/SQLAlchemy-2.0.23-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9585b646ffb048c0250acc7dad92536591ffe35dba624bb8fd9b471e25212a35"}, + {url = "https://files.pythonhosted.org/packages/5a/e4/f8b9828117adb533891c4d6872a6f1a047b6049faf44db6a3c502e88acd7/SQLAlchemy-2.0.23-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:63bfc3acc970776036f6d1d0e65faa7473be9f3135d37a463c5eba5efcdb24c8"}, + {url = "https://files.pythonhosted.org/packages/5c/1c/6de9e2c94b61a666cf05143a66b35f4608c066175573a81acd42f96fadcc/SQLAlchemy-2.0.23-cp38-cp38-win_amd64.whl", hash = "sha256:964971b52daab357d2c0875825e36584d58f536e920f2968df8d581054eada4b"}, + {url = "https://files.pythonhosted.org/packages/5c/b2/4914a76c35952d899dc5f4385c55fab15b718e9aff68c8104a8d193c23bd/SQLAlchemy-2.0.23-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:bd45a5b6c68357578263d74daab6ff9439517f87da63442d244f9f23df56138d"}, + {url = "https://files.pythonhosted.org/packages/5c/e4/f2b196d8779c09c32337ff1e17d6edd57547fe674413b3a82e42a370a65c/SQLAlchemy-2.0.23-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:7c424983ab447dab126c39d3ce3be5bee95700783204a72549c3dceffe0fc8f4"}, + {url = "https://files.pythonhosted.org/packages/5c/e7/d363abf1882ef31e780821b27bda4750d31fd46149da6b3741e99b23f873/SQLAlchemy-2.0.23-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4895a63e2c271ffc7a81ea424b94060f7b3b03b4ea0cd58ab5bb676ed02f4221"}, + {url = "https://files.pythonhosted.org/packages/5e/fb/3cd382bdd402154832b2142d93b0ddedcfa4c6ecb8120690e11e5086de33/SQLAlchemy-2.0.23-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:64ac935a90bc479fee77f9463f298943b0e60005fe5de2aa654d9cdef46c54df"}, + {url = "https://files.pythonhosted.org/packages/62/20/3a0cbfbb17b311c6323769c09ec559a2324e09871a2f66d6040bec930031/SQLAlchemy-2.0.23-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:616fe7bcff0a05098f64b4478b78ec2dfa03225c23734d83d6c169eb41a93e55"}, + {url = "https://files.pythonhosted.org/packages/62/7f/0155fe62b6054c0642bcf187088d9faaa66c1d057ee2c0038a2a673ca2ae/SQLAlchemy-2.0.23-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:aeb397de65a0a62f14c257f36a726945a7f7bb60253462e8602d9b97b5cbe204"}, + {url = "https://files.pythonhosted.org/packages/67/e7/7c77fd5290646f929b499992607cf1bc940573098a593080fcc8f7e13a08/SQLAlchemy-2.0.23-cp311-cp311-win_amd64.whl", hash = "sha256:9ca922f305d67605668e93991aaf2c12239c78207bca3b891cd51a4515c72e22"}, + {url = "https://files.pythonhosted.org/packages/7c/1f/d34a789e188c754560f54893f9a559c432af3b3ef6d9401d406f10d6c1ab/SQLAlchemy-2.0.23-cp39-cp39-win_amd64.whl", hash = "sha256:f3420d00d2cb42432c1d0e44540ae83185ccbbc67a6054dcc8ab5387add6620b"}, + {url = "https://files.pythonhosted.org/packages/90/00/f588b08bb2ce214df96e7a045ddf9ffafab6bfac75e6c75f0a50fb9f8d2a/SQLAlchemy-2.0.23-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:75eefe09e98043cff2fb8af9796e20747ae870c903dc61d41b0c2e55128f958d"}, + {url = "https://files.pythonhosted.org/packages/90/63/981fb1f20f1705e0bd31153a68d0fdf59a3ae6e41baa8b410a9f0d5aa901/SQLAlchemy-2.0.23-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:a86cb7063e2c9fb8e774f77fbf8475516d270a3e989da55fa05d08089d77f8c4"}, + {url = "https://files.pythonhosted.org/packages/97/9b/bb6a4c80c2e62719330fcdb57f024329fb2a2ce17664ddabcc74d2cda812/SQLAlchemy-2.0.23-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:967c0b71156f793e6662dd839da54f884631755275ed71f1539c95bbada9aaab"}, + {url = "https://files.pythonhosted.org/packages/9b/41/e92e465f91aeeea7974a77549edc6736544cf881448ddb4b133903d008fe/SQLAlchemy-2.0.23-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:0e680527245895aba86afbd5bef6c316831c02aa988d1aad83c47ffe92655e74"}, + {url = "https://files.pythonhosted.org/packages/9c/af/c61d98f6c21f35b13f22259e38b47669afe960a348e2c01ce262f183dcbe/SQLAlchemy-2.0.23-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6463aa765cf02b9247e38b35853923edbf2f6fd1963df88706bc1d02410a5577"}, + {url = "https://files.pythonhosted.org/packages/a4/90/9bc93131211b628e4339700713647aeecbc194e66ac6de869711c631b0cd/SQLAlchemy-2.0.23-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:683ef58ca8eea4747737a1c35c11372ffeb84578d3aab8f3e10b1d13d66f2bc4"}, + {url = "https://files.pythonhosted.org/packages/a6/da/49d4f9cd352259fa29c5110b78458c5046058b4fe27caf8644ebf11d8df7/SQLAlchemy-2.0.23-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4af79c06825e2836de21439cb2a6ce22b2ca129bad74f359bddd173f39582bf5"}, + {url = "https://files.pythonhosted.org/packages/a9/a3/9afc2bf14c5892640c15d050bd9c9bfefead29cb041560734dff13bf0890/SQLAlchemy-2.0.23-py3-none-any.whl", hash = "sha256:31952bbc527d633b9479f5f81e8b9dfada00b91d6baba021a869095f1a97006d"}, + {url = "https://files.pythonhosted.org/packages/aa/1c/0b66318368b1c9ef51c5c8560530b8ef842164e10eea08cacb06739388e0/SQLAlchemy-2.0.23-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c14eba45983d2f48f7546bb32b47937ee2cafae353646295f0e99f35b14286ab"}, + {url = "https://files.pythonhosted.org/packages/ac/40/efe4320de1de9af3b6e538f89e2f1d56f83209fddbec77bafa06ee4f42c6/SQLAlchemy-2.0.23-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:89a01238fcb9a8af118eaad3ffcc5dedaacbd429dc6fdc43fe430d3a941ff965"}, + {url = "https://files.pythonhosted.org/packages/b7/a8/4495f521f8ac6bde513436867755788c9efe632cb2a2e9d5add880e889bb/SQLAlchemy-2.0.23-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:fd54601ef9cc455a0c61e5245f690c8a3ad67ddb03d3b91c361d076def0b4c60"}, + {url = "https://files.pythonhosted.org/packages/be/67/7c054e93e1cca2d04ed69548ebf21134ace9c74efd008f936aa371a001be/SQLAlchemy-2.0.23-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:d5578e6863eeb998980c212a39106ea139bdc0b3f73291b96e27c929c90cd8e1"}, + {url = "https://files.pythonhosted.org/packages/c3/3c/a79b9541de3eb2efeaa785b2f11acbcf6e16cc118c2791aa27ed23a448f8/SQLAlchemy-2.0.23-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:c4722f3bc3c1c2fcc3702dbe0016ba31148dd6efcd2a2fd33c1b4897c6a19693"}, + {url = "https://files.pythonhosted.org/packages/c3/b4/93e0a6743ae3657ce3681d5f19ba5b9cde918f3489f47818d60615320abc/SQLAlchemy-2.0.23-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3e983fa42164577d073778d06d2cc5d020322425a509a08119bdcee70ad856bf"}, + {url = "https://files.pythonhosted.org/packages/c7/55/d1d2ad054fb7e9188681d56df40ed81c2c198314a805b180b0ec99019da1/SQLAlchemy-2.0.23-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:62d9e964870ea5ade4bc870ac4004c456efe75fb50404c03c5fd61f8bc669a72"}, + {url = "https://files.pythonhosted.org/packages/d0/35/baf485da71f15b37d8d8e926d471490ed7b9c0ce1bd82da58f7d46509107/SQLAlchemy-2.0.23-cp311-cp311-win32.whl", hash = "sha256:b41f5d65b54cdf4934ecede2f41b9c60c9f785620416e8e6c48349ab18643855"}, + {url = "https://files.pythonhosted.org/packages/d3/8a/321205f6ab88307618650f916f7c04f51864cd716c9583a25230ace70dc3/SQLAlchemy-2.0.23-cp312-cp312-win_amd64.whl", hash = "sha256:227135ef1e48165f37590b8bfc44ed7ff4c074bf04dc8d6f8e7f1c14a94aa6ca"}, + {url = "https://files.pythonhosted.org/packages/da/9b/ba3591423ad1d62f0f98132040aba67ae460073ecbfa956df63014f89580/SQLAlchemy-2.0.23-cp39-cp39-win32.whl", hash = "sha256:0a8c6aa506893e25a04233bc721c6b6cf844bafd7250535abb56cb6cc1368884"}, + {url = "https://files.pythonhosted.org/packages/e0/32/6e168c00cd90037d37d6ce238fc2b18ea6c9591d1ca42a7cfdce8139675b/SQLAlchemy-2.0.23-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:5f94aeb99f43729960638e7468d4688f6efccb837a858b34574e01143cf11f89"}, + {url = "https://files.pythonhosted.org/packages/e7/25/cfcc50c21cb133ae44f9aba61b48285451b6ecb882af291fe9da6445f4da/SQLAlchemy-2.0.23-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e3b5036aa326dc2df50cba3c958e29b291a80f604b1afa4c8ce73e78e1c9f01d"}, + {url = "https://files.pythonhosted.org/packages/ed/9b/002a02bae5b464d557197e5a241bdc5d88d1aa6ef9373841fee61019243d/SQLAlchemy-2.0.23-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:d4041ad05b35f1f4da481f6b811b4af2f29e83af253bf37c3c4582b2c68934ab"}, + {url = "https://files.pythonhosted.org/packages/ee/46/a3196db7ffd2609c7935798730e21bed8806d9bf4401921587dac4be0747/SQLAlchemy-2.0.23.tar.gz", hash = "sha256:c1bda93cbbe4aa2aa0aa8655c5aeda505cd219ff3e8da91d1d329e143e4aff69"}, + {url = "https://files.pythonhosted.org/packages/f2/e0/fa52d06ed2ad85d6f3c61133559c7bc174e7dc6d3987a633ae9bbbd716bc/SQLAlchemy-2.0.23-cp310-cp310-win32.whl", hash = "sha256:cabafc7837b6cec61c0e1e5c6d14ef250b675fa9c3060ed8a7e38653bd732ff8"}, +] +"sqlparse 0.4.4" = [ + {url = "https://files.pythonhosted.org/packages/65/16/10f170ec641ed852611b6c9441b23d10b5702ab5288371feab3d36de2574/sqlparse-0.4.4.tar.gz", hash = "sha256:d446183e84b8349fa3061f0fe7f06ca94ba65b426946ffebe6e3e8295332420c"}, + {url = "https://files.pythonhosted.org/packages/98/5a/66d7c9305baa9f11857f247d4ba761402cea75db6058ff850ed7128957b7/sqlparse-0.4.4-py3-none-any.whl", hash = "sha256:5430a4fe2ac7d0f93e66f1efc6e1338a41884b7ddf2a350cedd20ccc4d9d28f3"}, +] +"tomli 2.0.1" = [ + {url = "https://files.pythonhosted.org/packages/97/75/10a9ebee3fd790d20926a90a2547f0bf78f371b2f13aa822c759680ca7b9/tomli-2.0.1-py3-none-any.whl", hash = "sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc"}, + {url = "https://files.pythonhosted.org/packages/c0/3f/d7af728f075fb08564c5949a9c95e44352e23dee646869fa104a3b2060a3/tomli-2.0.1.tar.gz", hash = "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f"}, +] +"tox 4.11.3" = [ + {url = "https://files.pythonhosted.org/packages/c9/48/7744b1a3ebf2ae5e3bf6a23e8f9775476ae770061fa912db1c966a720fbf/tox-4.11.3.tar.gz", hash = "sha256:5039f68276461fae6a9452a3b2c7295798f00a0e92edcd9a3b78ba1a73577951"}, + {url = "https://files.pythonhosted.org/packages/f5/f9/963052e8b825645c54262dce7b7c88691505e3b9ee10a3e3667711eaaf21/tox-4.11.3-py3-none-any.whl", hash = "sha256:599af5e5bb0cad0148ac1558a0b66f8fff219ef88363483b8d92a81e4246f28f"}, +] +"typing-extensions 4.8.0" = [ + {url = "https://files.pythonhosted.org/packages/1f/7a/8b94bb016069caa12fc9f587b28080ac33b4fbb8ca369b98bc0a4828543e/typing_extensions-4.8.0.tar.gz", hash = "sha256:df8e4339e9cb77357558cbdbceca33c303714cf861d1eef15e1070055ae8b7ef"}, + {url = "https://files.pythonhosted.org/packages/24/21/7d397a4b7934ff4028987914ac1044d3b7d52712f30e2ac7a2ae5bc86dd0/typing_extensions-4.8.0-py3-none-any.whl", hash = "sha256:8f92fc8806f9a6b641eaa5318da32b44d401efaac0f6678c9bc448ba3605faa0"}, +] +"tzdata 2023.3" = [ + {url = "https://files.pythonhosted.org/packages/70/e5/81f99b9fced59624562ab62a33df639a11b26c582be78864b339dafa420d/tzdata-2023.3.tar.gz", hash = "sha256:11ef1e08e54acb0d4f95bdb1be05da659673de4acbd21bf9c69e94cc5e907a3a"}, + {url = "https://files.pythonhosted.org/packages/d5/fb/a79efcab32b8a1f1ddca7f35109a50e4a80d42ac1c9187ab46522b2407d7/tzdata-2023.3-py2.py3-none-any.whl", hash = "sha256:7e65763eef3120314099b6939b5546db7adce1e7d6f2e179e3df563c70511eda"}, +] +"virtualenv 20.24.6" = [ + {url = "https://files.pythonhosted.org/packages/7f/19/1f0eddcb9acf00a95793ce83417f69e0fd106c192121360af499cd6fde39/virtualenv-20.24.6-py3-none-any.whl", hash = "sha256:520d056652454c5098a00c0f073611ccbea4c79089331f60bf9d7ba247bb7381"}, + {url = "https://files.pythonhosted.org/packages/8d/e9/f4550b3af1b5c71d42913430d325ca270ace65896bfd8ba04472566709cc/virtualenv-20.24.6.tar.gz", hash = "sha256:02ece4f56fbf939dbbc33c0715159951d6bf14aaf5457b092e4548e1382455af"}, +] +"werkzeug 3.0.1" = [ + {url = "https://files.pythonhosted.org/packages/0d/cc/ff1904eb5eb4b455e442834dabf9427331ac0fa02853bf83db817a7dd53d/werkzeug-3.0.1.tar.gz", hash = "sha256:507e811ecea72b18a404947aded4b3390e1db8f826b494d76550ef45bb3b1dcc"}, + {url = "https://files.pythonhosted.org/packages/c3/fc/254c3e9b5feb89ff5b9076a23218dafbc99c96ac5941e900b71206e6313b/werkzeug-3.0.1-py3-none-any.whl", hash = "sha256:90a285dc0e42ad56b34e696398b8122ee4c681833fb35b8334a095d82c56da10"}, +] +"zipp 3.17.0" = [ + {url = "https://files.pythonhosted.org/packages/58/03/dd5ccf4e06dec9537ecba8fcc67bbd4ea48a2791773e469e73f94c3ba9a6/zipp-3.17.0.tar.gz", hash = "sha256:84e64a1c28cf7e91ed2078bb8cc8c259cb19b76942096c8d7b84947690cabaf0"}, + {url = "https://files.pythonhosted.org/packages/d9/66/48866fc6b158c81cc2bfecc04c480f105c6040e8b077bc54c634b4a67926/zipp-3.17.0-py3-none-any.whl", hash = "sha256:0e923e726174922dce09c53c59ad483ff7bbb8e572e00c7f7c46b88556409f31"}, +] diff --git a/pyproject.toml b/pyproject.toml new file mode 100644 index 00000000..928e8953 --- /dev/null +++ b/pyproject.toml @@ -0,0 +1,79 @@ + +[project] +name = "mixer2" +version = "7.3.0" +description = "A maintenance fork of klen/mixer Version 7" +url = "https://github.com/jvllmr/mixer" +authors = [ + {name = "Klen", email = "horneds@gmail.com"}, + {name = "Jan Vollmer", email = "jan@vllmr.dev"}, +] +maintainers = [ + {name = "Jan Vollmer", email = "jan@vllmr.dev"}, +] +license = {text = "BSD"} +license_files = ["LICENSE"] +dependencies = [ + "Faker<12.1,>=5.4.0", + "typing-extensions>=4.8.0", +] +requires-python = ">=3.8" +readme = "README.rst" + + +classifiers = [ + "Development Status :: 5 - Production/Stable", + "Intended Audience :: Developers", + "License :: OSI Approved :: BSD License", + "Programming Language :: Python", + "Programming Language :: Python :: 3", + "Programming Language :: Python :: 3.7", + "Programming Language :: Python :: 3.8", + "Programming Language :: Python :: 3.9", + "Programming Language :: Python :: 3.10", + "Programming Language :: Python :: 3.11", + "Programming Language :: Python :: 3.12", + "Topic :: Software Development :: Libraries :: Python Modules", + "Topic :: Software Development :: Testing", + "Topic :: Utilities" + +] + +[project.urls] +Source = "https://github.com/jvllmr/mixer" +Documentation = "https://mixer.readthedocs.org" +Issues = "https://github.com/jvllmr/mixer/issues" + +[build-system] +requires = ["pdm-backend"] +build-backend = "pdm.backend" + +[project.optional-dependencies] +flask = ["Flask>=1.0", "flask-sqlalchemy>=2.1"] +marshmallow = ["Marshmallow>=3.9"] +mongoengine = ["mongoengine>=0.10.1"] +peewee = ["peewee>=3.7.0"] +pony = ["pony>=0.7"] +django = ["Django>=3.0"] +all = ["mixer2[flask,marshmallow,mongoengine,peewee,pony,django]"] + +[tool.pdm.dev-dependencies] +dev = [ + "pytest>=7.4.3", + "psycopg2-binary>=2.9.9", + "tox>=4.11.3", + "mypy>=1.7.0", + "black>=23.11.0", + "ruff>=0.1.5", + "isort>=5.12.0", + "nox>=2023.4.22", + "setuptools>=68.2.2", + "pre-commit>=3.5.0", +] + +[tool.pytest.ini_options] +addopts = "-xsv" + + +[tool.isort] +profile = "black" diff --git a/requirements-tests.txt b/requirements-tests.txt deleted file mode 100644 index 2cc75280..00000000 --- a/requirements-tests.txt +++ /dev/null @@ -1,11 +0,0 @@ -Django >= 3.0 -Flask >= 1.0 -Marshmallow >= 3.9 -SQLAlchemy >= 1.1.4 -flask-sqlalchemy >= 2.1 -mongoengine >= 0.10.1 -peewee >= 3.7.0 -pony >= 0.7 -psycopg2-binary >= 2.8.4 - -pytest diff --git a/requirements.txt b/requirements.txt deleted file mode 100644 index 602a7af9..00000000 --- a/requirements.txt +++ /dev/null @@ -1 +0,0 @@ -Faker >= 5.4.0, < 12.1 diff --git a/setup.cfg b/setup.cfg deleted file mode 100644 index 6d41f894..00000000 --- a/setup.cfg +++ /dev/null @@ -1,53 +0,0 @@ -[metadata] -name = mixer -version = attr: mixer.__version__ -url = https://github.com/klen/mixer -description = Mixer -- Is a fixtures replacement. Supported Django ORM, SqlAlchemy ORM, Mongoengine ODM and custom python objects. -long_description = file: README.rst -description_file = README.rst -license = BSD -license_files = LICENSE -keywords = django, flask, sqlalchemy, testing, mock, stub, mongoengine, data -project_urls = - Documentation = https://mixer.readthedocs.org - Source code = https://github.com/klen/mixer - Issue tracker = https://github.com/klen/mixer -author = Kirill Klenov -author_email = horneds@gmail.com -classifiers = - Development Status :: 5 - Production/Stable - Intended Audience :: Developers - License :: OSI Approved :: BSD License - Programming Language :: Python - Programming Language :: Python :: 3 - Programming Language :: Python :: 3.7 - Programming Language :: Python :: 3.8 - Programming Language :: Python :: 3.9 - Topic :: Software Development :: Libraries :: Python Modules - Topic :: Software Development :: Testing - Topic :: Utilities - -[options] -python_requires = >= 3.7 -zip_safe = False - -[wheel] -python-tag = py37 - -[tool:pytest] -addopts = -xsv - -[pylama:tests/*] -ignore = D - -[tox:tox] -envlist = py37,py38,py39,py310 - -[testenv] -deps = -e .[tests] -commands = - pytest tests - -[testenv:pypy37] -commands = - pytest tests diff --git a/setup.py b/setup.py index 69392d80..c23c3b87 100644 --- a/setup.py +++ b/setup.py @@ -1,36 +1,3 @@ -#!/usr/bin/env python - -""" mixer -- Generate tests data. - -mixer -- Description - -""" -from os import path as op - from setuptools import setup - -def _read(fname): - try: - return open(op.join(op.dirname(__file__), fname)).read() - except IOError: - return '' - - -install_requires = [ - d for d in _read('requirements.txt').split('\n') - if d and not d.startswith('#')] - -tests_requires = [ - d for d in _read('requirements-tests.txt').split('\n') - if d and not d.startswith('#')] - - -setup( - packages=['mixer', 'mixer.backend'], - include_package_data=True, - install_requires=install_requires, - extras_require={'tests': tests_requires}, -) - -# lint_ignore=F0401 +setup(name="mixer2") diff --git a/tests/test_annotated.py b/tests/test_annotated.py new file mode 100644 index 00000000..5d7b0700 --- /dev/null +++ b/tests/test_annotated.py @@ -0,0 +1,64 @@ +from __future__ import annotations +import typing as t +import typing_extensions as te +from mixer.backend.annotated import Mixer +from dataclasses import dataclass + + +class Test: + one: int + two: int + name: str + title: str + body: str + price: t.Optional[int] + something: t.Union[int, str] + choices: list + parts: set + scheme: dict + + +def test_factory(): + from mixer.backend.annotated import GenFactory + + g = GenFactory() + test = g.get_fabric(t.Optional[int]) + assert isinstance(test(), (int, type(None))) + + test = g.get_fabric(t.Union[str, int]) + assert isinstance(test(), (str, int)) + + +def test_annotated(): + mixer = Mixer() + test = mixer.blend(Test) + assert isinstance(test.price, (int, type(None))) + assert isinstance(test.something, (int, str)) + + +def test_typed_dict(): + class TestDict(te.TypedDict): + one: int + two: int + name: str + + mixer = Mixer() + test = mixer.blend(TestDict) + + assert isinstance(test, dict) + assert "one" in test and "two" in test and "name" in test + assert isinstance(test["one"], int) and isinstance(test["two"], int) and isinstance(test["name"], str) + + +def test_dataclass(): + @dataclass + class TestDataclass: + one: int + two: int + name: str + + mixer = Mixer() + test = mixer.blend(TestDataclass) + + assert isinstance(test, TestDataclass) + assert isinstance(test.one, int) and isinstance(test.two, int) and isinstance(test.name, str) diff --git a/tests/test_main.py b/tests/test_main.py index 5f9b4c71..649c080b 100644 --- a/tests/test_main.py +++ b/tests/test_main.py @@ -1,15 +1,20 @@ """ Test mixer base functionality. """ +from __future__ import annotations import datetime import pytest from decimal import Decimal from mixer.main import Mixer, TypeMixer +from mixer.backend.annotated import ( + Mixer as AnnotationMixer, + TypeMixer as AnnotationTypeMixer, +) class Test: - """ Model scheme for base tests. """ + """Model scheme for base tests.""" one = int two = int @@ -22,8 +27,36 @@ class Test: scheme = dict +class AnnotationTest: + one: int + two: int + name: str + title: str + body: str + price: Decimal + choices: list + parts: set + scheme: dict + + +class Scheme: + id = int + name = str + money = int + male = bool + prop = Test + + +class AnnotationScheme: + id: int + name: str + money: int + male: bool + prop: AnnotationTest + + def test_factory(): - """ Test base generator's factory. """ + """Test base generator's factory.""" from mixer.main import GenFactory g = GenFactory() @@ -34,59 +67,59 @@ def test_factory(): assert test() in (True, False) -def test_typemixer_meta(): - """ Tests that typemixer is a singleton for current class. """ - mixer1 = TypeMixer(Test) - mixer2 = TypeMixer(Test, fake=False) - mixer3 = TypeMixer(Test, fake=False) +@pytest.mark.parametrize( + "typemixer_cls, scheme", [(TypeMixer, Test), (AnnotationTypeMixer, AnnotationTest)] +) +def test_typemixer_meta(typemixer_cls, scheme): + """Tests that typemixer is a singleton for current class.""" + mixer1 = typemixer_cls(scheme) + mixer2 = typemixer_cls(scheme, fake=False) + mixer3 = typemixer_cls(scheme, fake=False) assert mixer1 is not mixer2 assert mixer2 is mixer3 -def test_typemixer(): +@pytest.mark.parametrize( + "mixer", [TypeMixer(Scheme), AnnotationTypeMixer(AnnotationScheme)] +) +def test_typemixer(mixer): - class Scheme: - id = int - name = str - money = int - male = bool - prop = Test - - mixer = TypeMixer(Scheme) - test = mixer.blend(prop__two=2, prop__one=1, prop__name='sigil', name='RJ') + test = mixer.blend(prop__two=2, prop__one=1, prop__name="sigil", name="RJ") assert test.male in (True, False) - assert test.name == 'RJ' + assert test.name == "RJ" assert test.prop.two == 2 - assert test.prop.name == 'sigil' + assert test.prop.name == "sigil" - test = mixer.blend(prop__two=4, unknown=lambda: '?') + test = mixer.blend(prop__two=4, unknown=lambda: "?") assert test.prop.two == 4 - assert test.unknown == '?' + assert test.unknown == "?" -def test_fake(): - from mixer.main import mixer +@pytest.mark.parametrize( + "mixer, scheme", [(Mixer(), Test), (AnnotationMixer(), AnnotationTest)] +) +def test_fake(mixer, scheme): - test = mixer.blend(Test, name=mixer.FAKE, title=mixer.FAKE) - assert ' ' in test.name - assert ' ' in test.title + test = mixer.blend(scheme, name=mixer.FAKE, title=mixer.FAKE) + assert " " in test.name + assert " " in test.title - test = mixer.blend(Test, name=mixer.FAKE(bool)) + test = mixer.blend(scheme, name=mixer.FAKE(bool)) assert test.name in (True, False) -def test_random(): +@pytest.mark.parametrize("mixer", [TypeMixer(Test), AnnotationTypeMixer(Test)]) +def test_random(mixer): from mixer._compat import string_types - mixer = TypeMixer(Test) test = mixer.blend(name=mixer.RANDOM) assert isinstance(test.name, string_types) test = mixer.blend(name=mixer.RANDOM(int)) assert isinstance(test.name, int) - names = ['john_', 'kenn_', 'lenny_'] + names = ["john_", "kenn_", "lenny_"] test = mixer.blend(name=mixer.RANDOM(*names)) assert test.name in names @@ -94,10 +127,7 @@ def test_random(): def test_mix(): from mixer.main import mixer - lama = type('One', tuple(), dict( - two=int, - one=type('Two', tuple(), dict(two=2.1)) - )) + lama = type("One", tuple(), dict(two=int, one=type("Two", tuple(), dict(two=2.1)))) mix = mixer.MIX.one.two assert mix & lama == 2.1 @@ -109,82 +139,92 @@ def test_mix(): assert test.two == test.one.two -def test_mixer(): - mixer = Mixer() +@pytest.mark.parametrize( + "mixer, scheme", [(Mixer(), Test), (AnnotationMixer(), AnnotationTest)] +) +def test_mixer(mixer, scheme): assert Mixer.SKIP == mixer.SKIP try: Mixer.SKIP = 111 - raise AssertionError('test are failed') + raise AssertionError("test are failed") except AttributeError: pass try: mixer.SKIP = 111 - raise AssertionError('test are failed') + raise AssertionError("test are failed") except AttributeError: pass - gen = ('test{0}'.format(i) for i in range(500)) - test = mixer.blend('tests.test_main.Test', name=gen) - assert test.name == 'test0' + gen = ("test{0}".format(i) for i in range(500)) + test = mixer.blend(f"tests.test_main.{scheme.__name__}", name=gen) + assert test.name == "test0" - name_gen = mixer.sequence(lambda c: 'test' + str(c)) - test = mixer.blend(Test, name=name_gen) - test = mixer.blend(Test, name=name_gen) - test = mixer.blend(Test, name=name_gen) - assert test.name == 'test2' + name_gen = mixer.sequence(lambda c: "test" + str(c)) + test = mixer.blend(scheme, name=name_gen) + test = mixer.blend(scheme, name=name_gen) + test = mixer.blend(scheme, name=name_gen) + assert test.name == "test2" - name_gen = mixer.sequence('test{0}') - test = mixer.blend(Test, name=name_gen) - test = mixer.blend(Test, name=name_gen) - assert test.name == 'test1' + name_gen = mixer.sequence("test{0}") + test = mixer.blend(scheme, name=name_gen) + test = mixer.blend(scheme, name=name_gen) + assert test.name == "test1" name_gen = mixer.sequence() - test = mixer.blend(Test, name=name_gen) - test = mixer.blend(Test, name=name_gen) + test = mixer.blend(scheme, name=name_gen) + test = mixer.blend(scheme, name=name_gen) assert test.name == 1 - mixer.register('tests.test_main.Test', - name='Michel', one=lambda: 'ID', unknown="No error here") - test = mixer.blend(Test) - assert test.one == 'ID' - assert test.name == 'Michel' + mixer.register( + f"tests.test_main.{scheme.__name__}", + name="Michel", + one=lambda: "ID", + unknown="No error here", + ) + test = mixer.blend(scheme) + assert test.one == "ID" + assert test.name == "Michel" -def test_mixer_cycle(): - mixer = Mixer() - test = mixer.cycle(3).blend(Test) +@pytest.mark.parametrize( + "mixer, scheme", [(Mixer(), Test), (AnnotationMixer(), AnnotationTest)] +) +def test_mixer_cycle(mixer, scheme): + test = mixer.cycle(3).blend(scheme) assert len(test) == 3 - assert test[0].__class__ == Test + assert test[0].__class__ == scheme - test = mixer.cycle(3).blend(Test, name=mixer.sequence('lama{0}')) - assert test[2].name == 'lama2' + test = mixer.cycle(3).blend(scheme, name=mixer.sequence("lama{0}")) + assert test[2].name == "lama2" -def test_mixer_default(): - from mixer.main import mixer +@pytest.mark.parametrize( + "mixer, scheme", [(Mixer(), Test), (AnnotationMixer(), AnnotationTest)] +) +def test_mixer_default(mixer, scheme): - test = mixer.blend(Test) + test = mixer.blend(scheme) assert test.name -def test_invalid_scheme(): - from mixer.main import mixer +@pytest.mark.parametrize("mixer", [Mixer(), AnnotationMixer()]) +def test_invalid_scheme(mixer): with pytest.raises(ValueError): - mixer.blend('tests.test_main.Unknown') + mixer.blend("tests.test_main.Unknown") -def test_sequence(): - from mixer.main import mixer +@pytest.mark.parametrize("mixer", [Mixer(), AnnotationMixer()]) +def test_sequence(mixer): gen = mixer.sequence() assert next(gen) == 0 assert next(gen) == 1 - gen = mixer.sequence('test - {0}') - assert next(gen) == 'test - 0' - assert next(gen) == 'test - 1' + gen = mixer.sequence("test - {0}") + assert next(gen) == "test - 0" + assert next(gen) == "test - 1" gen = mixer.sequence(lambda c: c + 2) assert next(gen) == 2 @@ -196,23 +236,25 @@ def test_sequence(): assert next(gen) == 4 -def test_custom(): - mixer = Mixer() - - @mixer.middleware(Test) - def postprocess(x): # noqa - x.name += ' Done' +@pytest.mark.parametrize( + "mixer_cls, scheme", [(Mixer, Test), (AnnotationMixer, AnnotationTest)] +) +def test_custom(mixer_cls, scheme): + mixer = mixer_cls() + @mixer.middleware(scheme) + def postprocess(x): # noqa + x.name += " Done" return x mixer.register( - Test, - name='Mike', + scheme, + name="Mike", one=mixer.faker.pyfloat, body=mixer.faker.date_time, ) - test = mixer.blend(Test) - assert test.name == 'Mike Done' + test = mixer.blend(scheme) + assert test.name == "Mike Done" assert isinstance(test.one, float) assert isinstance(test.body, datetime.datetime) @@ -221,69 +263,75 @@ def postprocess(x): # noqa class MyFactory(GenFactory): generators = {str: lambda: "Always same"} - mixer = Mixer(factory=MyFactory, fake=False) - test = mixer.blend(Test) + mixer = mixer_cls(factory=MyFactory, fake=False) + test = mixer.blend(scheme) assert test.name == "Always same" - -def test_ctx(): +@pytest.mark.parametrize( + "mixer, scheme", [(Mixer(), Test), (AnnotationMixer(), AnnotationTest)] +) +def test_ctx(mixer,scheme): from mixer.main import LOGGER - mixer = Mixer() + level = LOGGER.level - with mixer.ctx(loglevel='INFO'): - mixer.blend(Test) + with mixer.ctx(loglevel="INFO"): + mixer.blend(scheme) assert LOGGER.level != level dw = mixer.faker.day_of_week() - assert dw[0] in 'MTWFS' + assert dw[0] in "MTWFS" - with mixer.ctx(locale='ru'): + with mixer.ctx(locale="ru"): dw = mixer.faker.day_of_week() - assert dw[0] in 'ПВСЧ' + assert dw[0] in "ПВСЧ" assert LOGGER.level == level +@pytest.mark.parametrize( + "mixer", [Mixer(), AnnotationMixer()] +) +def test_locale(mixer): + mixer.faker.locale = "ru" -def test_locale(): - mixer = Mixer() - mixer.faker.locale = 'ru' - - with mixer.ctx(locale='it'): + with mixer.ctx(locale="it"): mixer.faker.name() - assert mixer.faker.locale == 'ru_RU' + assert mixer.faker.locale == "ru_RU" - with mixer.ctx(loglevel='INFO'): + with mixer.ctx(loglevel="INFO"): mixer.faker.name() - assert mixer.faker.locale == 'ru_RU' - + assert mixer.faker.locale == "ru_RU" -def test_silence(): - mixer = Mixer() +@pytest.mark.parametrize( + "mixer, scheme", [(Mixer(), Test), (AnnotationMixer(), AnnotationTest)] +) +def test_silence(mixer, scheme): + class CustomException(Exception): pass - @mixer.middleware(Test) - def falsed(test): # noqa - raise CustomException('Unhandled') + @mixer.middleware(scheme) + def falsed(test): # noqa + raise CustomException("Unhandled") with pytest.raises(CustomException): - mixer.blend(Test) + mixer.blend(scheme) with mixer.ctx(silence=True): - mixer.blend(Test) - - mixer.unregister_middleware(Test, falsed) - mixer.blend(Test) # does not raise any exceptions + mixer.blend(scheme) + mixer.unregister_middleware(scheme, falsed) + mixer.blend(scheme) # does not raise any exceptions -def test_guard(): - mixer = Mixer() - test = mixer.guard().blend(Test) +@pytest.mark.parametrize( + "mixer, scheme", [(Mixer(), Test), (AnnotationMixer(), AnnotationTest)] +) +def test_guard(mixer, scheme): + test = mixer.guard().blend(scheme) assert test @@ -293,10 +341,11 @@ def test_skip(): assert test.one is not mixer.SKIP assert test.one is int - -def test_reload(): - mixer = Mixer() - test = mixer.blend(Test) +@pytest.mark.parametrize( + "mixer, scheme", [(Mixer(), Test), (AnnotationMixer(), AnnotationTest)] +) +def test_reload(mixer, scheme): + test = mixer.blend(scheme) test2 = mixer.reload(test) assert test is not test2 assert test.name == test2.name diff --git a/tests/test_sqlalchemy.py b/tests/test_sqlalchemy.py index 764518e5..0499fc56 100644 --- a/tests/test_sqlalchemy.py +++ b/tests/test_sqlalchemy.py @@ -1,5 +1,3 @@ -from __future__ import absolute_import - from datetime import datetime from random import randrange @@ -14,20 +12,19 @@ SmallInteger, String, create_engine, - types + types, ) from sqlalchemy.dialects import mssql, mysql, oracle, postgresql, sqlite -from sqlalchemy.ext.declarative import declarative_base -from sqlalchemy.orm import relation, relationship, scoped_session, sessionmaker -from sqlalchemy.util import text_type -ENGINE = create_engine('sqlite:///:memory:') +from sqlalchemy.orm import relationship, scoped_session, sessionmaker, declarative_base + +ENGINE = create_engine("sqlite:///:memory:") BASE = declarative_base() SESSION = scoped_session(sessionmaker(bind=ENGINE)) class Profile(BASE): - __tablename__ = 'profile' + __tablename__ = "profile" id = Column(Integer, primary_key=True) name = Column(String(20), nullable=False) @@ -36,7 +33,7 @@ class Profile(BASE): class ProfileNonIncremental(BASE): - __tablename__ = 'profile_nonincremental' + __tablename__ = "profile_nonincremental" id = Column(Integer, primary_key=True, autoincrement=False, nullable=False) name = Column(String(20), nullable=False) @@ -49,29 +46,30 @@ class AugmentedType(types.TypeDecorator): class User(BASE): - __tablename__ = 'user' + __tablename__ = "user" id = Column(Integer, primary_key=True) name = Column(String(10), nullable=False) - role = Column(String(10), default='client', nullable=False) - score = Column(SmallInteger, name='points', default=50, nullable=False) + role = Column(String(10), default="client", nullable=False) + score = Column(SmallInteger, name="points", default=50, nullable=False) updated_at = Column(Boolean) created_at = Column(DateTime, default=datetime.utcnow, nullable=False) - enum = Column(Enum('one', 'two'), nullable=False) + enum = Column(Enum("one", "two"), nullable=False) random = Column(Integer, default=lambda: randrange(993, 995)) - profile_id = Column(Integer, ForeignKey('profile.id'), nullable=False) + profile_id = Column(Integer, ForeignKey("profile.id"), nullable=False) profile_id_nonincremental = Column( - Integer, ForeignKey('profile_nonincremental.id'), nullable=False) - augmented = Column(AugmentedType, default='augmented', nullable=False) + Integer, ForeignKey("profile_nonincremental.id"), nullable=False + ) + augmented = Column(AugmentedType, default="augmented", nullable=False) class Role(BASE): - __tablename__ = 'role' + __tablename__ = "role" name = Column(String(20), primary_key=True) user_id = Column(Integer, ForeignKey(User.id), nullable=False) - user = relation(User) + user = relationship(User) BASE.metadata.create_all(ENGINE) @@ -93,18 +91,18 @@ def test_typemixer(): assert 993 <= user.random < 995 assert user.score == 50 assert 2 < len(user.name) <= 10 - assert user.role == 'client' + assert user.role == "client" assert user.updated_at is None assert user.profile assert user.profile.user == user - assert user.enum in ('one', 'two') - assert user.augmented == 'augmented' + assert user.enum in ("one", "two") + assert user.augmented == "augmented" - user = mixer.blend(name='John', updated_at=mixer.RANDOM) - assert user.name == 'John' + user = mixer.blend(name="John", updated_at=mixer.RANDOM) + assert user.name == "John" assert user.updated_at in (True, False) - mixer = TypeMixer('tests.test_sqlalchemy.Role') + mixer = TypeMixer("tests.test_sqlalchemy.Role") role = mixer.blend() assert role.user assert role.user_id == role.user.id @@ -114,16 +112,16 @@ def test_mixer(session): from mixer.backend.sqlalchemy import Mixer mixer = Mixer(session=session, commit=True) - p = mixer.blend('tests.test_sqlalchemy.ProfileNonIncremental', id=5) - role = mixer.blend('tests.test_sqlalchemy.Role', user__profile_id_nonincremental=p) + p = mixer.blend("tests.test_sqlalchemy.ProfileNonIncremental", id=5) + role = mixer.blend("tests.test_sqlalchemy.Role", user__profile_id_nonincremental=p) assert role and role.user - role = mixer.blend(Role, user__name='test2') - assert role.user.name == 'test2' + role = mixer.blend(Role, user__name="test2") + assert role.user.name == "test2" - profile = mixer.blend('tests.test_sqlalchemy.Profile') - user = mixer.blend(User, profile__name='test') - assert user.profile.name == 'test' + profile = mixer.blend("tests.test_sqlalchemy.Profile") + user = mixer.blend(User, profile__name="test") + assert user.profile.name == "test" user = mixer.blend(User, profile=profile) assert user.profile == profile @@ -131,20 +129,20 @@ def test_mixer(session): user = mixer.blend(User, score=mixer.RANDOM) assert user.score != 50 - user = mixer.blend(User, username=lambda: 'callable_value') - assert user.username == 'callable_value' + user = mixer.blend(User, username=lambda: "callable_value") + assert user.username == "callable_value" def test_cycle(session): from mixer.backend.sqlalchemy import Mixer mixer = Mixer(session=session, commit=True) - profile1 = mixer.blend('tests.test_sqlalchemy.Profile', name='first') - profile2 = mixer.blend('tests.test_sqlalchemy.Profile', name='second') + profile1 = mixer.blend("tests.test_sqlalchemy.Profile", name="first") + profile2 = mixer.blend("tests.test_sqlalchemy.Profile", name="second") users = mixer.cycle(2).blend(User, profile=(p for p in (profile1, profile2))) assert len(users) == 2 - assert users[0].profile.name == 'first' - assert users[1].profile.name == 'second' + assert users[0].profile.name == "first" + assert users[1].profile.name == "second" def test_select(session): @@ -164,7 +162,7 @@ def test_select(session): def test_random(): from mixer.backend.sqlalchemy import mixer - values = ('mixer', 'is', 'fun') + values = ("mixer", "is", "fun") user = mixer.blend(User, name=mixer.RANDOM(*values)) assert user.name in values @@ -180,12 +178,12 @@ def test_guard(session): from mixer.backend.sqlalchemy import Mixer, mixer with pytest.raises(ValueError): - mixer.guard(User.name == 'maxi').blend(User) + mixer.guard(User.name == "maxi").blend(User) mixer = Mixer(session=session, commit=True) - u1 = mixer.guard(User.name == 'maxi').blend(User, name='maxi') - u2 = mixer.guard(User.name == 'maxi').blend(User) + u1 = mixer.guard(User.name == "maxi").blend(User, name="maxi") + u2 = mixer.guard(User.name == "maxi").blend(User) assert u1 assert u1 == u2 @@ -196,10 +194,10 @@ def test_reload(session): mixer = Mixer(session=session, commit=True) u1 = mixer.blend(User) - u1.name = 'wrong name' + u1.name = "wrong name" u2 = mixer.reload(u1) assert u2 == u1 - assert u2.name != 'wrong name' + assert u2.name != "wrong name" def test_mix22(session): @@ -218,13 +216,14 @@ def test_nonincremental_primary_key(session): def test_postgresql(): + from sqlalchemy.dialects.postgresql import JSONB, UUID + from mixer.backend.sqlalchemy import TypeMixer - from sqlalchemy.dialects.postgresql import UUID, JSONB base = declarative_base() class Test(base): - __tablename__ = 'test' + __tablename__ = "test" id = Column(Integer, primary_key=True) uuid = Column(UUID, nullable=False) @@ -233,16 +232,3 @@ class Test(base): mixer = TypeMixer(Test) test = mixer.blend() assert test.uuid - - -@pytest.mark.parametrize('dialect, expected', [ - (mssql.dialect(), 'RAND()'), - (mysql.dialect(), 'RAND()'), - (oracle.dialect(), 'DBMS_RANDOM.VALUE'), - (postgresql.dialect(), 'RANDOM()'), - (sqlite.dialect(), 'RANDOM()'), -]) -def test_random_compiled(dialect, expected): - from mixer.backend.sqlalchemy import random - compiled = random().compile(dialect=dialect) - assert text_type(compiled) == expected