From 1641ecab36f172ac47a637e0c992d953396066cf Mon Sep 17 00:00:00 2001 From: Peter Weber Date: Tue, 10 Dec 2024 11:30:10 +0100 Subject: [PATCH] project: update dependencies * Bumps dependencies. * Allows python versions 3.9 - 3.12 Co-Authored-by: Peter Weber --- .editorconfig | 2 + .../workflows/continuous-integration-test.yml | 28 +- docs/conf.py | 109 +- invenio_sip2/__init__.py | 7 +- invenio_sip2/actions/__init__.py | 22 +- invenio_sip2/actions/actions.py | 340 +- invenio_sip2/actions/base.py | 24 +- invenio_sip2/api.py | 101 +- invenio_sip2/cli.py | 41 +- invenio_sip2/config.py | 1467 ++++---- invenio_sip2/datastore.py | 32 +- invenio_sip2/decorators.py | 9 +- invenio_sip2/ext.py | 159 +- invenio_sip2/handlers/__init__.py | 48 +- invenio_sip2/handlers/api_handlers.py | 76 +- invenio_sip2/handlers/base.py | 54 +- invenio_sip2/handlers/utils.py | 1 + invenio_sip2/helpers.py | 44 +- invenio_sip2/models.py | 468 +-- invenio_sip2/permissions.py | 6 +- invenio_sip2/proxies.py | 12 +- invenio_sip2/records/__init__.py | 2 +- invenio_sip2/records/record.py | 81 +- invenio_sip2/server.py | 158 +- invenio_sip2/utils.py | 42 +- invenio_sip2/version.py | 2 +- invenio_sip2/views/__init__.py | 4 +- invenio_sip2/views/rest.py | 67 +- invenio_sip2/views/views.py | 11 +- poetry.lock | 3144 +++++++++-------- pyproject.toml | 58 +- pytest.ini | 2 +- run-tests.sh | 5 +- tests/__init__.py | 18 + tests/conftest.py | 145 +- tests/fixtures/__init__.py | 18 + tests/fixtures/messages.py | 67 +- tests/fixtures/servers.py | 24 +- tests/test_actions.py | 83 +- tests/test_cli.py | 7 +- tests/test_datastore.py | 18 +- tests/test_examples_app.py | 13 +- tests/test_helpers.py | 15 +- tests/test_invenio_sip2.py | 11 +- tests/test_messages_api.py | 19 +- tests/test_models.py | 110 +- tests/test_server.py | 2 +- tests/test_utils.py | 43 +- tests/test_views.py | 2 +- tests/test_views_rest.py | 25 +- tests/utils.py | 167 +- 51 files changed, 3963 insertions(+), 3450 deletions(-) create mode 100644 tests/__init__.py create mode 100644 tests/fixtures/__init__.py diff --git a/.editorconfig b/.editorconfig index 272fd69..0e45cba 100644 --- a/.editorconfig +++ b/.editorconfig @@ -22,6 +22,8 @@ known_first_party = rero_ils multi_line_output = 2 default_section = THIRDPARTY skip = .eggs +# Needed for isort since version 4.3.10 +reverse_relative = true # RST files (used by sphinx) [*.rst] diff --git a/.github/workflows/continuous-integration-test.yml b/.github/workflows/continuous-integration-test.yml index b848833..76dd4a9 100644 --- a/.github/workflows/continuous-integration-test.yml +++ b/.github/workflows/continuous-integration-test.yml @@ -34,7 +34,7 @@ jobs: strategy: matrix: - python-version: [3.7, 3.8, 3.9] + python-version: ["3.9", "3.10", "3.11", "3.12"] requirements-level: [min, pypi] cache-service: [redis] # services: [release, devel] @@ -62,19 +62,16 @@ jobs: uses: actions/checkout@v2 - name: Set up Python ${{ matrix.python-version }} - uses: actions/setup-python@v2 + uses: actions/setup-python@v5 with: python-version: ${{ matrix.python-version }} - name: Install Poetry uses: snok/install-poetry@v1 - with: - version: 1.2.2 - name: Install dependencies run: | docker --version - docker-compose --version poetry install - name: Run tests @@ -93,24 +90,3 @@ jobs: pip install --upgrade coveralls coveralls -# coveralls: -# needs: [python-tests] -# runs-on: ubuntu-latest -# steps: -# - name: Cancel Previous Runs -# uses: styfle/cancel-workflow-action@0.5.0 -# with: -# access_token: ${{ github.token }} -# -# - name: Set up Python 3.6 -# uses: actions/setup-python@v2 -# with: -# python-version: 3.6 -# -# - name: Finished -# env: -# GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} -# COVERALLS_PARALLEL_FINISHED: true -# run: | -# pip install --upgrade coveralls -# coveralls --finish diff --git a/docs/conf.py b/docs/conf.py index 7d3eafc..c9d48cb 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -14,38 +14,41 @@ # Do not warn on external images. import os +import sys -suppress_warnings = ['image.nonlocal_uri'] +sys.path.insert(0, os.path.abspath("..")) + +suppress_warnings = ["image.nonlocal_uri"] # Add any Sphinx extension module names here, as strings. They can be # extensions coming with Sphinx (named 'sphinx.ext.*') or your custom # ones. extensions = [ - 'sphinx.ext.autodoc', - 'sphinx.ext.coverage', - 'sphinx.ext.doctest', - 'sphinx.ext.intersphinx', - 'sphinx.ext.viewcode', + "sphinx.ext.autodoc", + "sphinx.ext.coverage", + "sphinx.ext.doctest", + "sphinx.ext.intersphinx", + "sphinx.ext.viewcode", ] # Add any paths that contain templates here, relative to this directory. -templates_path = ['_templates'] +templates_path = ["_templates"] # The suffix(es) of source filenames. # You can specify multiple suffix as a list of string: # source_suffix = ['.rst', '.md'] -source_suffix = '.rst' +source_suffix = ".rst" # The encoding of source files. # source_encoding = 'utf-8-sig' # The master toctree document. -master_doc = 'index' +master_doc = "index" # General information about the project. -project = u'Invenio-SIP2' -copyright = u'2019, UCLouvain' -author = u'UCLouvain' +project = "Invenio-SIP2" +copyright = "2019, UCLouvain" +author = "UCLouvain" # The version info for the project you're documenting, acts as replacement for # |version| and |release|, also used in various other places throughout the @@ -55,11 +58,11 @@ # Get the version string. Cannot be done with import! module_data = {} -with open(os.path.join(os.path.dirname(__file__), '..', - 'invenio_sip2', 'version.py'), - 'rt') as file: +with open( + os.path.join(os.path.dirname(__file__), "..", "invenio_sip2", "version.py"), "rt" +) as file: exec(file.read(), module_data) - version = module_data['__version__'] + version = module_data["__version__"] # The full version, including alpha/beta/rc tags. release = version @@ -68,7 +71,7 @@ # # This is also used if you do content translation via gettext catalogs. # Usually you set "language" from the command line for these cases. -language = 'en' +language = "en" # There are two options for replacing |today|: either, you set today to some # non-false value, then it is used: @@ -96,7 +99,7 @@ # show_authors = False # The name of the Pygments (syntax highlighting) style to use. -pygments_style = 'sphinx' +pygments_style = "sphinx" # A list of ignored prefixes for module index sorting. # modindex_common_prefix = [] @@ -109,20 +112,19 @@ # -- Options for HTML output ---------------------------------------------- -html_theme = 'alabaster' +html_theme = "alabaster" html_theme_options = { - 'description': 'Library Selfcheck SIP2 module for invenio', - 'github_user': 'inveniosoftware-contrib', - 'github_repo': 'invenio-sip2', - 'github_button': False, - 'github_banner': True, - 'show_powered_by': False, - 'extra_nav_links': { - 'invenio-sip2@GitHub': - 'https://github.com/inveniosoftware-contrib/invenio-sip2', - 'invenio-sip2@PyPI': 'https://pypi.python.org/pypi/invenio-sip2/', - } + "description": "Library Selfcheck SIP2 module for invenio", + "github_user": "inveniosoftware-contrib", + "github_repo": "invenio-sip2", + "github_button": False, + "github_banner": True, + "show_powered_by": False, + "extra_nav_links": { + "invenio-sip2@GitHub": "https://github.com/inveniosoftware-contrib/invenio-sip2", + "invenio-sip2@PyPI": "https://pypi.python.org/pypi/invenio-sip2/", + }, } # The theme to use for HTML and HTML Help pages. See the documentation for @@ -172,12 +174,12 @@ # Custom sidebar templates, maps document names to template names. html_sidebars = { - '**': [ - 'about.html', - 'navigation.html', - 'relations.html', - 'searchbox.html', - 'donate.html', + "**": [ + "about.html", + "navigation.html", + "relations.html", + "searchbox.html", + "donate.html", ] } @@ -226,20 +228,17 @@ # html_search_scorer = 'scorer.js' # Output file base name for HTML help builder. -htmlhelp_basename = 'invenio-sip2_namedoc' +htmlhelp_basename = "invenio-sip2_namedoc" # -- Options for LaTeX output --------------------------------------------- latex_elements = { # The paper size ('letterpaper' or 'a4paper'). # 'papersize': 'letterpaper', - # The font size ('10pt', '11pt' or '12pt'). # 'pointsize': '10pt', - # Additional stuff for the LaTeX preamble. # 'preamble': '', - # Latex figure (float) alignment # 'figure_align': 'htbp', } @@ -248,8 +247,13 @@ # (source start file, target name, title, # author, documentclass [howto, manual, or own class]). latex_documents = [ - (master_doc, 'invenio-sip2.tex', u'invenio-sip2 Documentation', - u'UCLouvain', 'manual'), + ( + master_doc, + "invenio-sip2.tex", + "invenio-sip2 Documentation", + "UCLouvain", + "manual", + ), ] # The name of an image file (relative to this directory) to place at the top of @@ -277,10 +281,7 @@ # One entry per manual page. List of tuples # (source start file, name, description, authors, manual section). -man_pages = [ - (master_doc, 'invenio-sip2', u'invenio-sip2 Documentation', - [author], 1) -] +man_pages = [(master_doc, "invenio-sip2", "invenio-sip2 Documentation", [author], 1)] # If true, show URL addresses after external links. # man_show_urls = False @@ -292,9 +293,15 @@ # (source start file, target name, title, author, # dir menu entry, description, category) texinfo_documents = [ - (master_doc, 'invenio-sip2', u'Invenio-SIP2 Documentation', - author, 'invenio-sip2', 'Library Selfcheck SIP2 module for invenio', - 'Miscellaneous'), + ( + master_doc, + "invenio-sip2", + "Invenio-SIP2 Documentation", + author, + "invenio-sip2", + "Library Selfcheck SIP2 module for invenio", + "Miscellaneous", + ), ] # Documents to append as an appendix to all manuals. @@ -312,10 +319,10 @@ # Example configuration for intersphinx: refer to the Python standard library. intersphinx_mapping = { - 'python': ('https://docs.python.org/', None), + "python": ("https://docs.python.org/", None), # TODO: Configure external documentation references, eg: # 'Flask-Admin': ('https://flask-admin.readthedocs.io/en/latest/', None), } # Autodoc configuraton. -autoclass_content = 'both' +autoclass_content = "both" diff --git a/invenio_sip2/__init__.py b/invenio_sip2/__init__.py index b2910be..2ec592e 100644 --- a/invenio_sip2/__init__.py +++ b/invenio_sip2/__init__.py @@ -25,9 +25,4 @@ datastore = LocalProxy(lambda: current_sip2.datastore) -__all__ = ( - '__version__', - 'current_datastore', - 'current_sip2', - 'InvenioSIP2' -) +__all__ = ("__version__", "current_datastore", "current_sip2", "InvenioSIP2") diff --git a/invenio_sip2/actions/__init__.py b/invenio_sip2/actions/__init__.py index aae51ba..ae8923c 100644 --- a/invenio_sip2/actions/__init__.py +++ b/invenio_sip2/actions/__init__.py @@ -17,10 +17,24 @@ """Invenio-SIP2 actions module.""" -from invenio_sip2.actions.actions import AutomatedCirculationSystemStatus, \ - BlockPatron, Checkin, Checkout, EndPatronSession, FeePaid, Hold, \ - ItemInformation, ItemStatusUpdate, PatronEnable, PatronInformation, \ - PatronStatus, Renew, RenewAll, RequestResend, SelfCheckLogin +from invenio_sip2.actions.actions import ( + AutomatedCirculationSystemStatus, + BlockPatron, + Checkin, + Checkout, + EndPatronSession, + FeePaid, + Hold, + ItemInformation, + ItemStatusUpdate, + PatronEnable, + PatronInformation, + PatronStatus, + Renew, + RenewAll, + RequestResend, + SelfCheckLogin, +) __all__ = ( AutomatedCirculationSystemStatus, diff --git a/invenio_sip2/actions/actions.py b/invenio_sip2/actions/actions.py index 0b070ed..41fe432 100644 --- a/invenio_sip2/actions/actions.py +++ b/invenio_sip2/actions/actions.py @@ -21,18 +21,32 @@ from invenio_sip2.actions.base import Action from invenio_sip2.api import Message -from invenio_sip2.decorators import add_sequence_number, \ - check_selfcheck_authentication +from invenio_sip2.decorators import add_sequence_number, check_selfcheck_authentication from invenio_sip2.errors import SelfcheckCirculationError, SelfcheckError -from invenio_sip2.handlers import authorize_patron_handler, checkin_handler, \ - checkout_handler, enable_patron_handler, fee_paid_handler, hold_handler, \ - item_handler, patron_handler, patron_status_handler, renew_handler, \ - selfcheck_login_handler, system_status_handler, validate_patron_handler +from invenio_sip2.handlers import ( + authorize_patron_handler, + checkin_handler, + checkout_handler, + enable_patron_handler, + fee_paid_handler, + hold_handler, + item_handler, + patron_handler, + patron_status_handler, + renew_handler, + selfcheck_login_handler, + system_status_handler, + validate_patron_handler, +) from invenio_sip2.models import SelfcheckSummary from invenio_sip2.proxies import current_logger from invenio_sip2.proxies import current_sip2 as acs_system -from invenio_sip2.utils import ensure_i18n_language, get_circulation_status, \ - get_language_code, get_security_marker_type +from invenio_sip2.utils import ( + ensure_i18n_language, + get_circulation_status, + get_language_code, + get_security_marker_type, +) class SelfCheckLogin(Action): @@ -45,29 +59,29 @@ def execute(self, message, **kwargs): :param message: message receive from the client :return: message class representing the response of the current action """ - selfcheck_login = message.get_field_value('login_uid') - selfcheck_password = message.get_field_value('login_pwd') - client = kwargs.pop('client') - current_logger\ - .debug(f'[SelfCheckLogin]: args: {selfcheck_login},' - f' password: {selfcheck_password},' - f' client: {selfcheck_password}') + selfcheck_login = message.get_field_value("login_uid") + selfcheck_password = message.get_field_value("login_pwd") + client = kwargs.pop("client") + current_logger.debug( + f"[SelfCheckLogin]: args: {selfcheck_login}," + f" password: {selfcheck_password}," + f" client: {selfcheck_password}" + ) selfcheck_user = selfcheck_login_handler( - client.remote_app, selfcheck_login, selfcheck_password, - terminal_ip=client.get('ip_address') + client.remote_app, + selfcheck_login, + selfcheck_password, + terminal_ip=client.get("ip_address"), + ) + current_logger.debug( + f"[SelfCheckLogin]: handler response: " f"{selfcheck_user}" ) - current_logger\ - .debug(f'[SelfCheckLogin]: handler response: ' - f'{selfcheck_user}') if selfcheck_user: - language = selfcheck_user.get('library_language', - acs_system.sip2_language) - selfcheck_user['library_language'] = ensure_i18n_language(language) + language = selfcheck_user.get("library_language", acs_system.sip2_language) + selfcheck_user["library_language"] = ensure_i18n_language(language) client.update(selfcheck_user) - return self.prepare_message_response( - ok=str(int(client.is_authenticated)) - ) + return self.prepare_message_response(ok=str(int(client.is_authenticated))) class AutomatedCirculationSystemStatus(Action): @@ -83,13 +97,13 @@ def execute(self, message, client): :return: message class representing the response of the current action """ # TODO : calculate system status from remote app - status = system_status_handler(client.remote_app, - client.terminal, - institution_id=client.institution_id) - current_logger \ - .debug(f'[AutomatedCirculationSystemStatus]: ' - f'handler response: {status}') - client['status'] = status + status = system_status_handler( + client.remote_app, client.terminal, institution_id=client.institution_id + ) + current_logger.debug( + f"[AutomatedCirculationSystemStatus]: " f"handler response: {status}" + ) + client["status"] = status # prepare message based on required fields response_message = self.prepare_message_response( online_status=acs_system.support_online_status, @@ -102,15 +116,13 @@ def execute(self, message, client): retries_allowed=str(acs_system.retries_allowed), date_time_sync=acs_system.sip2_current_date, protocol_version=acs_system.supported_protocol, - supported_messages=str(acs_system.supported_messages( - client.remote_app)), - institution_id=client.institution_id + supported_messages=str(acs_system.supported_messages(client.remote_app)), + institution_id=client.institution_id, ) # add variable field if client.library_name: response_message.add_variable_field( - field_name='library_name', - field_value=client.library_name + field_name="library_name", field_value=client.library_name ) return response_message @@ -126,8 +138,10 @@ def __init__(self, command, message): def __str__(self): """String representation of Action class.""" - return f'{self.__class__.__name__}() message:{self.message}, ' \ - f'request:{self.command}' + return ( + f"{self.__class__.__name__}() message:{self.message}, " + f"request:{self.command}" + ) @check_selfcheck_authentication def execute(self, message, client): @@ -139,13 +153,10 @@ def execute(self, message, client): send tho the client """ last_response_message = client.last_response_message - request_msg = last_response_message.get('_sip2') + request_msg = last_response_message.get("_sip2") # strip the line terminator - request_msg = \ - request_msg[:len(request_msg) - len(acs_system.line_terminator)] - return Message( - request=request_msg - ) + request_msg = request_msg[: len(request_msg) - len(acs_system.line_terminator)] + return Message(request=request_msg) class PatronEnable(Action): @@ -160,7 +171,7 @@ def execute(self, message, client): :param client: the client :return: message class representing the response of the current action """ - patron_id = message.get_field_value('patron_id') + patron_id = message.get_field_value("patron_id") is_valid_patron = validate_patron_handler( client.remote_app, patron_id, institution_id=client.institution_id @@ -169,40 +180,40 @@ def execute(self, message, client): enabled_patron = enable_patron_handler( client.remote_app, patron_id, institution_id=client.institution_id ) - current_logger \ - .debug(f'[PatronEnable]: handler response: {enabled_patron}') + current_logger.debug(f"[PatronEnable]: handler response: {enabled_patron}") # prepare message based on required fields response_message = self.prepare_message_response( - patron_status=str(enabled_patron.get('patron_status')), - language=get_language_code(enabled_patron.get('language')), + patron_status=str(enabled_patron.get("patron_status")), + language=get_language_code(enabled_patron.get("language")), transaction_date=acs_system.sip2_current_date, institution_id=client.institution_id, patron_id=patron_id, - patron_name=enabled_patron.get('patron_name'), + patron_name=enabled_patron.get("patron_name"), ) response_message.add_variable_field( - field_name='valid_patron', - field_value='Y' if is_valid_patron else 'N' + field_name="valid_patron", field_value="Y" if is_valid_patron else "N" ) # check patron password - patron_password = message.get_field_value('patron_pwd') + patron_password = message.get_field_value("patron_pwd") if patron_password: is_authenticated = authorize_patron_handler( - client.remote_app, patron_id, patron_password, - institution_id=client.institution_id + client.remote_app, + patron_id, + patron_password, + institution_id=client.institution_id, ) response_message.add_variable_field( - field_name='valid_patron_pwd', - field_value='Y' if is_authenticated else 'N' + field_name="valid_patron_pwd", + field_value="Y" if is_authenticated else "N", ) # add optional fields for optional_field in self.optional_fields: response_message.add_field( field=optional_field, - field_value=enabled_patron.get(optional_field.name) + field_value=enabled_patron.get(optional_field.name), ) return response_message @@ -220,23 +231,21 @@ def execute(self, message, client): :param client: the client :return: message class representing the response of the current action """ - patron_id = message.get_field_value('patron_id') + patron_id = message.get_field_value("patron_id") patron_status = patron_status_handler( client.remote_app, patron_id, institution_id=client.institution_id ) - current_logger \ - .debug(f'[PatronStatus]: handler response: {patron_status}') + current_logger.debug(f"[PatronStatus]: handler response: {patron_status}") response_message = self.prepare_message_response( - patron_status=str(patron_status.get('patron_status')), - language=get_language_code(patron_status.get('language')), + patron_status=str(patron_status.get("patron_status")), + language=get_language_code(patron_status.get("language")), transaction_date=acs_system.sip2_current_date, ) # add optional fields for optional_field in self.optional_fields: response_message.add_field( - field=optional_field, - field_value=patron_status.get(optional_field.name) + field=optional_field, field_value=patron_status.get(optional_field.name) ) return response_message @@ -254,56 +263,57 @@ def execute(self, message, client): :param client: the client :return: message class representing the response of the current action """ - patron_id = message.get_field_value('patron_id') + patron_id = message.get_field_value("patron_id") patron_account = patron_handler( client.remote_app, patron_id, institution_id=client.institution_id ) - current_logger \ - .debug(f'[PatronInformation]: handler response: {patron_account}') + current_logger.debug(f"[PatronInformation]: handler response: {patron_account}") # TODO: better way to begin session # start patron session - client['patron_session'] = { - 'patron_id': patron_id, - 'language': message.i18n_language + client["patron_session"] = { + "patron_id": patron_id, + "language": message.i18n_language, } # prepare message based on required fields response_message = self.prepare_message_response( - patron_status=str(patron_account.get('patron_status')), - language=get_language_code(patron_account.get('language')), + patron_status=str(patron_account.get("patron_status")), + language=get_language_code(patron_account.get("language")), transaction_date=acs_system.sip2_current_date, hold_items_count=str(patron_account.hold_items_count), overdue_items_count=str(patron_account.overdue_items_count), charged_items_count=str(patron_account.charged_items_count), fine_items_count=str(patron_account.fine_items_count), recall_items_count=str(patron_account.recall_items_count), - unavailable_holds_count=str( - patron_account.unavailable_items_count), + unavailable_holds_count=str(patron_account.unavailable_items_count), institution_id=client.institution_id, patron_id=patron_id, - patron_name=patron_account.patron_name + patron_name=patron_account.patron_name, ) summary = SelfcheckSummary(message.summary) # add optional fields for optional_field in self.optional_fields: # TODO: use custom handler to get specified summary field. - if (optional_field.name in summary.fields and - summary.is_needed(optional_field.name)) or \ - optional_field.name not in summary.fields: + if ( + optional_field.name in summary.fields + and summary.is_needed(optional_field.name) + ) or optional_field.name not in summary.fields: response_message.add_field( field=optional_field, - field_value=patron_account.get(optional_field.name) + field_value=patron_account.get(optional_field.name), ) # check patron password - patron_password = message.get_field_value('patron_pwd') + patron_password = message.get_field_value("patron_pwd") if patron_password: is_authenticated = authorize_patron_handler( - client.remote_app, patron_account.patron_id, patron_password, - institution_id=client.institution_id + client.remote_app, + patron_account.patron_id, + patron_password, + institution_id=client.institution_id, ) response_message.add_variable_field( - field_name='valid_patron_pwd', - field_value='Y' if is_authenticated else 'N' + field_name="valid_patron_pwd", + field_value="Y" if is_authenticated else "N", ) return response_message @@ -328,7 +338,7 @@ def execute(self, message, client): end_session=True, transaction_date=acs_system.sip2_current_date, institution_id=client.institution_id, - patron_id=message.get_field_value('patron_id') + patron_id=message.get_field_value("patron_id"), ) # TODO: add optional fields @@ -350,36 +360,38 @@ def execute(self, message, client): """ patron_session = client.get_current_patron_session() if patron_session: - language = patron_session.get('language') + language = patron_session.get("language") else: language = client.library_language - item_identifier = message.get_field_value('item_id') + item_identifier = message.get_field_value("item_id") item_information = item_handler( client.remote_app, - item_identifier, terminal=client.terminal, + item_identifier, + terminal=client.terminal, language=language, - institution_id=client.institution_id + institution_id=client.institution_id, ) - current_logger \ - .debug(f'[ItemInformation]: handler response: {item_information}') + current_logger.debug(f"[ItemInformation]: handler response: {item_information}") # prepare message based on required fields response_message = self.prepare_message_response( circulation_status=get_circulation_status( - item_information.get('circulation_status')), + item_information.get("circulation_status") + ), security_marker=get_security_marker_type( - item_information.get('security_marker')), - fee_type=item_information.get('fee_type'), + item_information.get("security_marker") + ), + fee_type=item_information.get("fee_type"), transaction_date=acs_system.sip2_current_date, - item_id=item_information.get('item_id'), - title_id=item_information.get('title_id') + item_id=item_information.get("item_id"), + title_id=item_information.get("title_id"), ) # add optional fields for optional_field in self.optional_fields: response_message.add_field( field=optional_field, - field_value=item_information.get(optional_field.name) + field_value=item_information.get(optional_field.name), ) return response_message @@ -415,26 +427,31 @@ def execute(self, message, client, **kwargs): """ patron_session = client.get_current_patron_session() if patron_session: - language = patron_session.get('language') + language = patron_session.get("language") else: language = client.library_language - item_id = message.get_field_value('item_id') + item_id = message.get_field_value("item_id") try: # TODO: give the client to reduce the number of parameters. checkin = checkin_handler( - client.remote_app, client.transaction_user_id, item_id, + client.remote_app, + client.transaction_user_id, + item_id, institution_id=client.institution_id, terminal=client.terminal, - language=language + language=language, ) except SelfcheckCirculationError as error: checkin = error.data - current_app.logger.error('[{terminal}] {message}'.format( - terminal=client.terminal, - message=error), exc_info=True) + current_app.logger.error( + "[{terminal}] {message}".format( + terminal=client.terminal, message=error + ), + exc_info=True, + ) - current_logger.debug(f'[Checkin]: handler response: {checkin}') + current_logger.debug(f"[Checkin]: handler response: {checkin}") # prepare message based on required fields response_message = self.prepare_message_response( @@ -445,14 +462,13 @@ def execute(self, message, client, **kwargs): transaction_date=acs_system.sip2_current_date, institution_id=client.institution_id, item_id=item_id, - permanent_location=checkin.get('permanent_location'), + permanent_location=checkin.get("permanent_location"), ) # add optional fields for optional_field in self.optional_fields: response_message.add_field( - field=optional_field, - field_value=checkin.get(optional_field.name) + field=optional_field, field_value=checkin.get(optional_field.name) ) return response_message @@ -472,26 +488,27 @@ def execute(self, message, client, **kwargs): """ patron_session = client.get_current_patron_session() if patron_session: - language = patron_session.get('language') + language = patron_session.get("language") else: language = client.library_language - item_id = message.get_field_value('item_id') - patron_id = message.get_field_value('patron_id') + item_id = message.get_field_value("item_id") + patron_id = message.get_field_value("patron_id") try: checkout = checkout_handler( - client.remote_app, client.transaction_user_id, item_id, + client.remote_app, + client.transaction_user_id, + item_id, patron_id, institution_id=client.institution_id, terminal=client.terminal, - language=language + language=language, ) except SelfcheckCirculationError as error: checkout = error.data - current_app.logger.error('{message}'.format( - message=error), exc_info=True) + current_app.logger.error("{message}".format(message=error), exc_info=True) - current_logger.debug(f'[Checkout]: handler response: {checkout}') + current_logger.debug(f"[Checkout]: handler response: {checkout}") # prepare message based on required fields response_message = self.prepare_message_response( @@ -503,15 +520,14 @@ def execute(self, message, client, **kwargs): institution_id=client.institution_id, patron_id=patron_id, item_id=item_id, - title_id=checkout.get('title_id'), + title_id=checkout.get("title_id"), due_date=checkout.due_date, ) # add optional fields for optional_field in self.optional_fields: response_message.add_field( - field=optional_field, - field_value=checkout.get(optional_field.name) + field=optional_field, field_value=checkout.get(optional_field.name) ) return response_message @@ -531,41 +547,41 @@ def execute(self, message, client, **kwargs): """ patron_session = client.get_current_patron_session() if patron_session: - language = patron_session.get('language') + language = patron_session.get("language") else: language = client.library_language - patron_id = message.get_field_value('patron_id') + patron_id = message.get_field_value("patron_id") try: fee_paid = fee_paid_handler( - client.remote_app, client.transaction_user_id, patron_id, - message.get_fixed_field_value('fee_type'), - message.get_fixed_field_value('payment_type'), - message.get_fixed_field_value('currency_type'), - message.get_field_value('fee_amount'), + client.remote_app, + client.transaction_user_id, + patron_id, + message.get_fixed_field_value("fee_type"), + message.get_fixed_field_value("payment_type"), + message.get_fixed_field_value("currency_type"), + message.get_field_value("fee_amount"), institution_id=client.institution_id, terminal=client.terminal, - language=language + language=language, ) except SelfcheckError as error: fee_paid = error.data - current_app.logger.error('{message}'.format( - message=error), exc_info=True) + current_app.logger.error("{message}".format(message=error), exc_info=True) - current_logger.debug(f'[Fee paid]: handler response: {fee_paid}') + current_logger.debug(f"[Fee paid]: handler response: {fee_paid}") # prepare message based on required fields response_message = self.prepare_message_response( payment_accepted=fee_paid.is_accepted, transaction_date=acs_system.sip2_current_date, institution_id=client.institution_id, - patron_id=patron_id + patron_id=patron_id, ) # add optional fields for optional_field in self.optional_fields: response_message.add_field( - field=optional_field, - field_value=fee_paid.get(optional_field.name) + field=optional_field, field_value=fee_paid.get(optional_field.name) ) return response_message @@ -584,24 +600,29 @@ def execute(self, message, client, **kwargs): :return: message class representing the response of the current action """ patron_session = client.get_current_patron_session() - item_id = message.get_field_value('item_id') - patron_id = message.get_field_value('patron_id') + item_id = message.get_field_value("item_id") + patron_id = message.get_field_value("patron_id") try: hold = hold_handler( - client.remote_app, client.transaction_user_id, item_id, + client.remote_app, + client.transaction_user_id, + item_id, patron_id=patron_id, institution_id=client.institution_id, terminal=client.terminal, - language=patron_session.get('language'), + language=patron_session.get("language"), ) except SelfcheckCirculationError as error: hold = error.data - current_app.logger.error('[{terminal}] {message}'.format( - terminal=client.terminal, - message=error), exc_info=True) + current_app.logger.error( + "[{terminal}] {message}".format( + terminal=client.terminal, message=error + ), + exc_info=True, + ) - current_logger.debug(f'[Hold]: handler response: {hold}') + current_logger.debug(f"[Hold]: handler response: {hold}") # prepare message based on required fields response_message = self.prepare_message_response( @@ -616,8 +637,7 @@ def execute(self, message, client, **kwargs): # add optional fields for optional_field in self.optional_fields: response_message.add_field( - field=optional_field, - field_value=hold.get(optional_field.name) + field=optional_field, field_value=hold.get(optional_field.name) ) return response_message @@ -636,24 +656,29 @@ def execute(self, message, client, **kwargs): :return: message class representing the response of the current action """ patron_session = client.get_current_patron_session() - item_id = message.get_field_value('item_id') - patron_id = message.get_field_value('patron_id') + item_id = message.get_field_value("item_id") + patron_id = message.get_field_value("patron_id") try: renew = renew_handler( - client.remote_app, client.transaction_user_id, item_id, + client.remote_app, + client.transaction_user_id, + item_id, patron_id=patron_id, intitution_id=client.institution_id, terminal=client.terminal, - language=patron_session.get('language'), + language=patron_session.get("language"), ) except SelfcheckCirculationError as error: renew = error.data - current_app.logger.error('[{terminal}] {message}'.format( - terminal=client.terminal, - message=error), exc_info=True) + current_app.logger.error( + "[{terminal}] {message}".format( + terminal=client.terminal, message=error + ), + exc_info=True, + ) - current_logger.debug(f'[Renew]: handler response: {renew}') + current_logger.debug(f"[Renew]: handler response: {renew}") # prepare message based on required fields response_message = self.prepare_message_response( @@ -665,15 +690,14 @@ def execute(self, message, client, **kwargs): institution_id=client.institution_id, patron_id=patron_id, item_id=item_id, - title_id=renew.get('title_id'), - due_date=renew.get('due_date'), + title_id=renew.get("title_id"), + due_date=renew.get("due_date"), ) # add optional fields for optional_field in self.optional_fields: response_message.add_field( - field=optional_field, - field_value=renew.get(optional_field.name) + field=optional_field, field_value=renew.get(optional_field.name) ) return response_message diff --git a/invenio_sip2/actions/base.py b/invenio_sip2/actions/base.py index e664fec..a9232e1 100644 --- a/invenio_sip2/actions/base.py +++ b/invenio_sip2/actions/base.py @@ -28,9 +28,7 @@ def __init__(self, command, response, message, **kwargs): """Init action object.""" self.message = message self.command = command - self.response_type = acs_system.sip2_message_types.get_by_command( - response - ) + self.response_type = acs_system.sip2_message_types.get_by_command(response) self.validate_action() @property @@ -50,21 +48,13 @@ def validate_action(self): def prepare_message_response(self, **kwargs): """Prepare response message object based on defined fixed_field.""" - message = Message( - message_type=self.response_type - ) + message = Message(message_type=self.response_type) for required_field in self.required_fields: field_value = kwargs.pop(required_field.name) - message.add_field( - field=required_field, - field_value=field_value - ) + message.add_field(field=required_field, field_value=field_value) for optional_field in self.optional_fields: field_value = kwargs.pop(optional_field.name, None) - message.add_field( - field=optional_field, - field_value=field_value - ) + message.add_field(field=optional_field, field_value=field_value) # TODO: try to raise exception if required field does not exist return message @@ -74,5 +64,7 @@ def execute(self, **kwargs): def __str__(self): """String representation of Action class.""" - return f'{self.__class__.__name__}() message:{self.message}, ' \ - f'request:{self.command}, response:{self.response_type.command}' + return ( + f"{self.__class__.__name__}() message:{self.message}, " + f"request:{self.command}, response:{self.response_type.command}" + ) diff --git a/invenio_sip2/api.py b/invenio_sip2/api.py index 6383969..adc3e42 100644 --- a/invenio_sip2/api.py +++ b/invenio_sip2/api.py @@ -23,8 +23,7 @@ from pycountry import languages from invenio_sip2.errors import CommandNotFound -from invenio_sip2.helpers import MessageTypeFixedField, \ - MessageTypeVariableField +from invenio_sip2.helpers import MessageTypeFixedField, MessageTypeVariableField from invenio_sip2.models import SelfcheckLanguage from invenio_sip2.proxies import current_sip2 as acs_system from invenio_sip2.utils import generate_checksum @@ -35,8 +34,8 @@ def preprocess_field_value(func): @wraps(func) def inner(*args, **kwargs): - field = kwargs.get('field') - value = kwargs.get('field_value') + field = kwargs.get("field") + value = kwargs.get("field_value") if value is not None and field.callback: return func(*args, field=field, field_value=field.callback(value)) return func(*args, **kwargs) @@ -47,21 +46,21 @@ def inner(*args, **kwargs): class FieldMessage(object): """SIP2 variable field message class.""" - def __init__(self, field=None, field_value=''): + def __init__(self, field=None, field_value=""): """Constructor.""" self.field = field if field.length and len(field_value) < field.length: - self.field_value = '{value:{fill}>{width}}'.format( - value=str(field_value)[:field.length], + self.field_value = "{value:{fill}>{width}}".format( + value=str(field_value)[: field.length], fill=self.field.fill, - width=self.field.length + width=self.field.length, ) else: self.field_value = field_value def __str__(self): """String representation of FieldMessage object.""" - return self.field.field_id + (self.field_value or '') + return self.field.field_id + (self.field_value or "") class FixedFieldMessage(FieldMessage): @@ -86,22 +85,22 @@ def __init__(self, **kwargs): for key, value in kwargs.items(): setattr(self, key, value) - if hasattr(self, 'request'): + if hasattr(self, "request"): self.message_text = self.request try: - self.message_type = acs_system.sip2_message_types.\ - get_by_command(self.message_text[:2]) + self.message_type = acs_system.sip2_message_types.get_by_command( + self.message_text[:2] + ) self._parse_request() except CommandNotFound as err: - description = '{err} - request: {request}'.format( - err=err.description, - request=self.message_text + description = "{err} - request: {request}".format( + err=err.description, request=self.message_text ) raise CommandNotFound(message=description) def __str__(self): """String representation of Message object.""" - if hasattr(self, 'message_text'): + if hasattr(self, "message_text"): return self.message_text new_message = self.command @@ -111,12 +110,12 @@ def __str__(self): for variable_field in self.variable_fields: new_message += str(variable_field) - new_message += '|' + new_message += "|" if acs_system.is_error_detection_enabled: if self.sequence_number: - new_message += f'AY{self.sequence_number}' - new_message += 'AZ' + new_message += f"AY{self.sequence_number}" + new_message += "AZ" if not self.checksum: self.checksum = generate_checksum(new_message) new_message += self.checksum @@ -137,17 +136,17 @@ def i18n_language(self): return languages.get(name=language).alpha_2 except (ValueError, AttributeError): # return default language - return current_app.config.get('SIP2_DEFAULT_LANGUAGE') + return current_app.config.get("SIP2_DEFAULT_LANGUAGE") @property def language(self): """Shortcut for sip2 language code.""" - return self.get_fixed_field_value('language') + return self.get_fixed_field_value("language") @property def summary(self): """Shortcut for sip2 summary.""" - return self.get_fixed_field_value('summary') + return self.get_fixed_field_value("summary") def _parse_request(self): """Parse the request sent by the selfcheck.""" @@ -156,25 +155,28 @@ def _parse_request(self): error_txt = txt[-9:] field_sequence_id = error_txt[:2] field_checksum_id = error_txt[-6:-4] - if field_sequence_id == 'AY': + if field_sequence_id == "AY": # process sequence_number self.sequence_number = error_txt[2:3] - if field_checksum_id == 'AZ': + if field_checksum_id == "AZ": self.checksum = error_txt[-4:] - if acs_system.is_error_detection_enabled and self.sequence_number \ - and self.checksum: + if ( + acs_system.is_error_detection_enabled + and self.sequence_number + and self.checksum + ): txt = txt[:-9] # extract fixed fields from request for fixed_field in self.message_type.fixed_fields: # get fixed field value - value = txt[:fixed_field.length] + value = txt[: fixed_field.length] self.fixed_fields.append(FixedFieldMessage(fixed_field, value)) - txt = txt[fixed_field.length:] + txt = txt[fixed_field.length :] if not txt: return - for part in filter(None, txt.split('|')): + for part in filter(None, txt.split("|")): field_id = part[:2] field_value = part[2:] field = MessageTypeVariableField.find_by_field_id(field_id) @@ -184,9 +186,7 @@ def _parse_request(self): def get_fixed_field_by_name(self, field_name): """Get the FixedFieldMessage object by field name.""" for f in self.fixed_fields: - if f.field.field_id == MessageTypeFixedField.get( - field_name - ).field_id: + if f.field.field_id == MessageTypeFixedField.get(field_name).field_id: return f def get_variable_field_by_name(self, field_name): @@ -196,9 +196,7 @@ def get_variable_field_by_name(self, field_name): def get_variable_fields_by_name(self, field_name): """Get list of VariableFieldMessage object by field name.""" for f in self.variable_fields: - if f.field.field_id == MessageTypeVariableField.get( - field_name - ).field_id: + if f.field.field_id == MessageTypeVariableField.get(field_name).field_id: yield f def get_fixed_field_value(self, field_name): @@ -237,7 +235,7 @@ def add_variable_field(self, field_name, field_value): self.variable_fields.append( FieldMessage( field=MessageTypeVariableField.get(field_name), - field_value=str(field_value) + field_value=str(field_value), ) ) @@ -249,38 +247,37 @@ def add_variable_fields(self, field_name, field_values): def add_fixed_field(self, field, field_value): """Add fixed field to message.""" self.fixed_fields.append( - FixedFieldMessage( - field=field, - field_value=str(field_value) - ) + FixedFieldMessage(field=field, field_value=str(field_value)) ) def dumps(self): """Dumps message as dict.""" data = { - '_sip2': str(self), - 'message_type': { - 'command': self.message_type.command, - 'label': self.message_type.label - }} + "_sip2": str(self), + "message_type": { + "command": self.message_type.command, + "label": self.message_type.label, + }, + } # TODO: `_sip2` field is only use in backend. Try to mask it on # view or logging for fixed_field in self.fixed_fields: data[fixed_field.field.field_id] = fixed_field.field_value for variable_field in self.variable_fields: - if variable_field.field.name not in ['login_uid', - 'login_pwd', - 'patron_pwd']: + if variable_field.field.name not in [ + "login_uid", + "login_pwd", + "patron_pwd", + ]: if variable_field.field.is_multiple: field_list = data.get(variable_field.field.name, []) field_list.append(variable_field.field_value) data[variable_field.field.name] = field_list else: - data[variable_field.field.name] = \ - variable_field.field_value + data[variable_field.field.name] = variable_field.field_value if self.sequence_number: - data['sequence_number'] = self.sequence_number + data["sequence_number"] = self.sequence_number if self.checksum: - data['checksum'] = self.checksum + data["checksum"] = self.checksum return data diff --git a/invenio_sip2/cli.py b/invenio_sip2/cli.py index 9dbef94..5918d17 100644 --- a/invenio_sip2/cli.py +++ b/invenio_sip2/cli.py @@ -36,27 +36,34 @@ def selfcheck(): # TODO: create CLI to manage database -@selfcheck.command('start') -@click.argument('name') + +@selfcheck.command("start") +@click.argument("name") @click.option( - '-h', '--host', 'host', default='0.0.0.0', - help='Host address of the server.' + "-h", "--host", "host", default="0.0.0.0", help="Host address of the server." ) @click.option( - '-p', '--port', 'port', type=click.INT, default=3004, - help='Port that the server listen.' + "-p", + "--port", + "port", + type=click.INT, + default=3004, + help="Port that the server listen.", ) @click.option( - '-r', '--remote-app', 'remote', - help='remote ILS application name in your config', - required=True + "-r", + "--remote-app", + "remote", + help="remote ILS application name in your config", + required=True, ) @with_appcontext def start_socket_server(name, host, port, remote): """Start sockets server with unique name.""" try: - server = SocketServer(name=name, port=port, host=host, remote=remote, - process_id=os.getpid()) + server = SocketServer( + name=name, port=port, host=host, remote=remote, process_id=os.getpid() + ) server_thread = threading.Thread(target=server.run) server_thread.run() @@ -65,9 +72,9 @@ def start_socket_server(name, host, port, remote): raise e -@selfcheck.command('stop') -@click.argument('name') -@click.option('-d', '--delete', 'delete', is_flag=True, default=False) +@selfcheck.command("stop") +@click.argument("name") +@click.option("-d", "--delete", "delete", is_flag=True, default=False) @with_appcontext def stop_server(name, delete): """Stop sip2 server by unique name. @@ -79,14 +86,14 @@ def stop_server(name, delete): if server: if server.is_running: try: - pid = server.get('process_id') - p = psutil.Process(server.get('process_id')) + pid = server.get("process_id") + p = psutil.Process(server.get("process_id")) click.echo(f"stop {server.get('name')} (pid:{pid})") p.terminate() except NoSuchProcess as ex: server.down() else: - click.echo('server already stopped') + click.echo("server already stopped") if delete: server.delete() diff --git a/invenio_sip2/config.py b/invenio_sip2/config.py index a601c74..40f513a 100644 --- a/invenio_sip2/config.py +++ b/invenio_sip2/config.py @@ -113,28 +113,46 @@ from gettext import gettext as _ -from invenio_sip2.actions import AutomatedCirculationSystemStatus, \ - BlockPatron, Checkin, Checkout, EndPatronSession, FeePaid, Hold, \ - ItemInformation, ItemStatusUpdate, PatronEnable, PatronInformation, \ - PatronStatus, Renew, RenewAll, RequestResend, SelfCheckLogin +from invenio_sip2.actions import ( + AutomatedCirculationSystemStatus, + BlockPatron, + Checkin, + Checkout, + EndPatronSession, + FeePaid, + Hold, + ItemInformation, + ItemStatusUpdate, + PatronEnable, + PatronInformation, + PatronStatus, + Renew, + RenewAll, + RequestResend, + SelfCheckLogin, +) from invenio_sip2.models import SelfcheckSecurityMarkerType from invenio_sip2.permissions import default_permission_factory -from invenio_sip2.utils import convert_bool_to_char, convert_to_char, \ - get_media_type, parse_circulation_date +from invenio_sip2.utils import ( + convert_bool_to_char, + convert_to_char, + get_media_type, + parse_circulation_date, +) # I18N # ==== #: Default language -BABEL_DEFAULT_LANGUAGE = 'en' +BABEL_DEFAULT_LANGUAGE = "en" #: Default SIP2 language SIP2_DEFAULT_LANGUAGE = BABEL_DEFAULT_LANGUAGE # DATASTORE # ========= -SIP2_DATASTORE_HANDLER = 'invenio_sip2.datastore:Sip2RedisDatastore' -SIP2_DATASTORE_REDIS_PREFIX = 'sip2' -SIP2_DATASTORE_REDIS_URL = 'redis://localhost:16379/0' +SIP2_DATASTORE_HANDLER = "invenio_sip2.datastore:Sip2RedisDatastore" +SIP2_DATASTORE_REDIS_PREFIX = "sip2" +SIP2_DATASTORE_REDIS_URL = "redis://localhost:16379/0" # LOGGING # ======= @@ -175,19 +193,19 @@ SIP2_REMOTE_ACTION_HANDLERS = {} """Configuration of remote handlers.""" -SIP2_TEXT_ENCODING = 'UTF-8' +SIP2_TEXT_ENCODING = "UTF-8" """Message text charset encoding.""" -SIP2_LINE_TERMINATOR = '\r' +SIP2_LINE_TERMINATOR = "\r" """Message line separator.""" -SIP2_SOCKET_BUFFER_SIZE = '1024' +SIP2_SOCKET_BUFFER_SIZE = "1024" """Socket buffer size.""" SIP2_ERROR_DETECTION = True """Enable error detection on message.""" -SIP2_PROTOCOL = '2.00' +SIP2_PROTOCOL = "2.00" """SIP2 protocol version.""" SIP2_SUPPORT_CHECKIN = True @@ -214,10 +232,10 @@ SIP2_SUPPORT_STATUS_UPDATE = True """Support patron status updating by the selfcheck.""" -SIP2_DATE_FORMAT = '%Y%m%d %H%M%S' +SIP2_DATE_FORMAT = "%Y%m%d %H%M%S" """SIP2 date format for transaction.""" -SIP2_CIRCULATION_DATE_FORMAT = '%Y%m%d %H%M%S' +SIP2_CIRCULATION_DATE_FORMAT = "%Y%m%d %H%M%S" """SIP2 date format for circulation.""" SIP2_DEFAULT_SECURITY_MARKER = SelfcheckSecurityMarkerType.OTHER @@ -225,924 +243,913 @@ # Define message action. SIP2_MESSAGE_ACTIONS = { - '01': dict(message='block_patron', response='24', action=BlockPatron), - '09': dict(message='checkin', response='10', action=Checkin), - '11': dict(message='checkout', response='12', action=Checkout), - '15': dict(message='hold', response='16', action=Hold), - '17': dict(message='item_information', response='18', - action=ItemInformation), - '19': dict(message='item_status_update', response='20', - action=ItemStatusUpdate), - '23': dict(message='patron_request_status', response='24', - action=PatronStatus), - '25': dict(message='patron_enable', response='26', action=PatronEnable), - '29': dict(message='renew', response='30', action=Renew), - '35': dict(message='end_patron_session', response='36', - action=EndPatronSession), - '37': dict(message='fee_paid', response='38', action=FeePaid), - '63': dict(message='patron_information', response='64', - action=PatronInformation), - '65': dict(message='renew_all', response='66', action=RenewAll), - '93': dict(message='login', response='94', action=SelfCheckLogin), - '97': dict(message='request_resend', action=RequestResend), - '99': dict(message='sc_status', response='98', - action=AutomatedCirculationSystemStatus), + "01": dict(message="block_patron", response="24", action=BlockPatron), + "09": dict(message="checkin", response="10", action=Checkin), + "11": dict(message="checkout", response="12", action=Checkout), + "15": dict(message="hold", response="16", action=Hold), + "17": dict(message="item_information", response="18", action=ItemInformation), + "19": dict(message="item_status_update", response="20", action=ItemStatusUpdate), + "23": dict(message="patron_request_status", response="24", action=PatronStatus), + "25": dict(message="patron_enable", response="26", action=PatronEnable), + "29": dict(message="renew", response="30", action=Renew), + "35": dict(message="end_patron_session", response="36", action=EndPatronSession), + "37": dict(message="fee_paid", response="38", action=FeePaid), + "63": dict(message="patron_information", response="64", action=PatronInformation), + "65": dict(message="renew_all", response="66", action=RenewAll), + "93": dict(message="login", response="94", action=SelfCheckLogin), + "97": dict(message="request_resend", action=RequestResend), + "99": dict( + message="sc_status", response="98", action=AutomatedCirculationSystemStatus + ), } # Define message types SIP2_MESSAGE_TYPES = { - '01': dict( - label='Block patron', - handler='block_patron', + "01": dict( + label="Block patron", + handler="block_patron", required_fields=[ - 'card_retained', - 'transaction_date', - 'institution_id', - 'blocked_card_msg', - 'patron_id', - 'terminal_pwd', + "card_retained", + "transaction_date", + "institution_id", + "blocked_card_msg", + "patron_id", + "terminal_pwd", ], fixed_fields=[ - 'card_retained', - 'transaction_date', + "card_retained", + "transaction_date", ], variable_fields=[ - 'institution_id', - 'blocked_card_msg', - 'patron_id', - 'terminal_pwd', - ] + "institution_id", + "blocked_card_msg", + "patron_id", + "terminal_pwd", + ], ), - '09': dict( - label='Checkin', - handler='checkin', + "09": dict( + label="Checkin", + handler="checkin", required_fields=[ - 'no_block', - 'transaction_date', - 'return_date', - 'current_location', - 'institution_id', - 'item_id', - 'terminal_pwd', + "no_block", + "transaction_date", + "return_date", + "current_location", + "institution_id", + "item_id", + "terminal_pwd", ], fixed_fields=[ - 'no_block', - 'transaction_date', - 'return_date', + "no_block", + "transaction_date", + "return_date", ], variable_fields=[ - 'current_location', - 'institution_id', - 'item_id', - 'terminal_pwd', - 'item_properties', - 'cancel', + "current_location", + "institution_id", + "item_id", + "terminal_pwd", + "item_properties", + "cancel", ], ), - '10': dict( - label='Checkin response', - handler='checkin_response', + "10": dict( + label="Checkin response", + handler="checkin_response", required_fields=[ - 'ok', - 'resensitize', - 'magnetic_media', - 'alert', - 'transaction_date', - 'institution_id', - 'item_id', - 'permanent_location', + "ok", + "resensitize", + "magnetic_media", + "alert", + "transaction_date", + "institution_id", + "item_id", + "permanent_location", ], fixed_fields=[ - 'ok', - 'resensitize', - 'magnetic_media', - 'alert', - 'transaction_date', + "ok", + "resensitize", + "magnetic_media", + "alert", + "transaction_date", ], variable_fields=[ - 'institution_id', - 'item_id', - 'permanent_location', - 'title_id', - 'sort_bin', - 'patron_id', - 'media_type', - 'item_properties', - 'screen_messages', - 'print_line', + "institution_id", + "item_id", + "permanent_location", + "title_id", + "sort_bin", + "patron_id", + "media_type", + "item_properties", + "screen_messages", + "print_line", ], ), - '11': dict( - label='Checkout', - handler='checkout', + "11": dict( + label="Checkout", + handler="checkout", required_fields=[ - 'sc_renewal_policy', - 'no_block', - 'transaction_date', - 'nb_due_date', - 'institution_id', - 'patron_id', - 'item_id', - 'terminal_pwd', + "sc_renewal_policy", + "no_block", + "transaction_date", + "nb_due_date", + "institution_id", + "patron_id", + "item_id", + "terminal_pwd", ], fixed_fields=[ - 'sc_renewal_policy', - 'no_block', - 'transaction_date', - 'nb_due_date', + "sc_renewal_policy", + "no_block", + "transaction_date", + "nb_due_date", ], variable_fields=[ - 'institution_id', - 'patron_id', - 'item_id', - 'terminal_pwd', - 'item_properties', - 'patron_pwd', - 'fee_acknowledged', - 'cancel', + "institution_id", + "patron_id", + "item_id", + "terminal_pwd", + "item_properties", + "patron_pwd", + "fee_acknowledged", + "cancel", ], ), - '12': dict( - label='Checkout response', - handler='checkout_response', + "12": dict( + label="Checkout response", + handler="checkout_response", required_fields=[ - 'ok', - 'renewal_ok', - 'magnetic_media', - 'desensitize', - 'transaction_date', - 'institution_id', - 'patron_id', - 'item_id', - 'title_id', - 'due_date', + "ok", + "renewal_ok", + "magnetic_media", + "desensitize", + "transaction_date", + "institution_id", + "patron_id", + "item_id", + "title_id", + "due_date", ], fixed_fields=[ - 'ok', - 'renewal_ok', - 'magnetic_media', - 'desensitize', - 'transaction_date', + "ok", + "renewal_ok", + "magnetic_media", + "desensitize", + "transaction_date", ], variable_fields=[ - 'institution_id', - 'patron_id', - 'item_id', - 'title_id', - 'due_date', - 'fee_type', - 'security_inhibit', - 'currency_type', - 'fee_amount', - 'media_type', - 'item_properties', - 'transaction_id', - 'screen_messages', - 'print_line', + "institution_id", + "patron_id", + "item_id", + "title_id", + "due_date", + "fee_type", + "security_inhibit", + "currency_type", + "fee_amount", + "media_type", + "item_properties", + "transaction_id", + "screen_messages", + "print_line", ], ), - '15': dict( - label='Hold', - handler='hold', + "15": dict( + label="Hold", + handler="hold", required_fields=[ - 'hold_mode', - 'transaction_date', - 'institution_id', - 'patron_id', + "hold_mode", + "transaction_date", + "institution_id", + "patron_id", ], fixed_fields=[ - 'hold_mode', - 'transaction_date', + "hold_mode", + "transaction_date", ], variable_fields=[ - 'expiration_date', - 'pickup_location', - 'hold_type', - 'institution_id', - 'patron_id', - 'patron_pwd', - 'item_id', - 'title_id', - 'terminal_pwd', - 'fee_acknowledged', + "expiration_date", + "pickup_location", + "hold_type", + "institution_id", + "patron_id", + "patron_pwd", + "item_id", + "title_id", + "terminal_pwd", + "fee_acknowledged", ], ), - '16': dict( - label='Hold response', - handler='hold_response', + "16": dict( + label="Hold response", + handler="hold_response", required_fields=[ - 'ok', - 'available', - 'transaction_date', - 'institution_id', - 'patron_id', + "ok", + "available", + "transaction_date", + "institution_id", + "patron_id", ], fixed_fields=[ - 'ok', - 'available', - 'transaction_date', + "ok", + "available", + "transaction_date", ], variable_fields=[ - 'expiration_date', - 'queue_position', - 'pickup_location', - 'institution_id', - 'item_id', - 'title_id', - 'screen_messages', - 'print_line', + "expiration_date", + "queue_position", + "pickup_location", + "institution_id", + "item_id", + "title_id", + "screen_messages", + "print_line", ], ), - '17': dict( - label='Item information', - handler='item_information', + "17": dict( + label="Item information", + handler="item_information", required_fields=[ - 'transaction_date', - 'institution_id', - 'item_id', + "transaction_date", + "institution_id", + "item_id", ], fixed_fields=[ - 'transaction_date', + "transaction_date", ], variable_fields=[ - 'institution_id', - 'item_id', - 'terminal_pwd', - ] + "institution_id", + "item_id", + "terminal_pwd", + ], ), - '18': dict( - label='Item information response', - handler='item_information_response', + "18": dict( + label="Item information response", + handler="item_information_response", required_fields=[ - 'circulation_status', - 'security_marker', - 'fee_type', - 'transaction_date', - 'item_id', - 'title_id', + "circulation_status", + "security_marker", + "fee_type", + "transaction_date", + "item_id", + "title_id", ], fixed_fields=[ - 'circulation_status', - 'security_marker', - 'fee_type', - 'transaction_date', + "circulation_status", + "security_marker", + "fee_type", + "transaction_date", ], variable_fields=[ - 'hold_queue_length', - 'due_date', - 'recall_date', - 'hold_pickup_date', - 'item_id', - 'title_id', - 'owner', - 'currency_type', - 'fee_amount', - 'media_type', - 'permanent_location', - 'current_location', - 'item_properties', - 'screen_messages', - 'print_line', + "hold_queue_length", + "due_date", + "recall_date", + "hold_pickup_date", + "item_id", + "title_id", + "owner", + "currency_type", + "fee_amount", + "media_type", + "permanent_location", + "current_location", + "item_properties", + "screen_messages", + "print_line", ], ), - '19': dict( - label='Item status update', - handler='item_status_update', + "19": dict( + label="Item status update", + handler="item_status_update", required_fields=[ - 'transaction_date', - 'institution_id', - 'item_id', - 'item_properties', + "transaction_date", + "institution_id", + "item_id", + "item_properties", ], fixed_fields=[ - 'transaction_date', + "transaction_date", ], variable_fields=[ - 'institution_id', - 'item_id', - 'terminal_pwd', - 'item_properties' + "institution_id", + "item_id", + "terminal_pwd", + "item_properties", ], ), - '20': dict( - label='Item status update response', - handler='item_status_update_response', + "20": dict( + label="Item status update response", + handler="item_status_update_response", required_fields=[ - 'item_properties_ok', - 'transaction_date', + "item_properties_ok", + "transaction_date", ], fixed_fields=[ - 'item_properties_ok', - 'transaction_date', + "item_properties_ok", + "transaction_date", ], variable_fields=[ - 'item_id', - 'title_id', - 'item_properties', - 'screen_messages', - 'print_line', + "item_id", + "title_id", + "item_properties", + "screen_messages", + "print_line", ], ), - '23': dict( - label='Patron status', - handler='patron_status', + "23": dict( + label="Patron status", + handler="patron_status", required_fields=[ - 'language', - 'transaction_date', - 'institution_id', - 'patron_id', - 'terminal_pwd', - 'patron_pwd', + "language", + "transaction_date", + "institution_id", + "patron_id", + "terminal_pwd", + "patron_pwd", ], fixed_fields=[ - 'language', - 'transaction_date', + "language", + "transaction_date", ], variable_fields=[ - 'institution_id', - 'patron_id', - 'terminal_pwd', - 'patron_pwd', + "institution_id", + "patron_id", + "terminal_pwd", + "patron_pwd", ], ), - '24': dict( - label='Patron status response', - handler='patron_status_response', + "24": dict( + label="Patron status response", + handler="patron_status_response", required_fields=[ - 'patron_status', - 'language', - 'transaction_date', + "patron_status", + "language", + "transaction_date", ], fixed_fields=[ - 'patron_status', - 'language', - 'transaction_date', + "patron_status", + "language", + "transaction_date", ], variable_fields=[ - 'institution_id', - 'patron_id', - 'patron_name', - 'valid_patron', - 'valid_patron_pwd', - 'currency_type', - 'fee_amount', - 'screen_messages', - 'print_line', + "institution_id", + "patron_id", + "patron_name", + "valid_patron", + "valid_patron_pwd", + "currency_type", + "fee_amount", + "screen_messages", + "print_line", ], ), - '25': dict( - label='Patron enable', - handler='patron_enable', + "25": dict( + label="Patron enable", + handler="patron_enable", required_fields=[ - 'transaction_date', - 'institution_id', - 'patron_id', + "transaction_date", + "institution_id", + "patron_id", ], fixed_fields=[ - 'transaction_date', + "transaction_date", ], variable_fields=[ - 'institution_id', - 'patron_id', - 'terminal_pwd', - 'patron_pwd', + "institution_id", + "patron_id", + "terminal_pwd", + "patron_pwd", ], ), - '26': dict( - label='Patron enable response', - handler='patron_enable_response', + "26": dict( + label="Patron enable response", + handler="patron_enable_response", required_fields=[ - 'patron_status', - 'language', - 'transaction_date', - 'institution_id', - 'patron_id', - 'patron_name', + "patron_status", + "language", + "transaction_date", + "institution_id", + "patron_id", + "patron_name", ], fixed_fields=[ - 'patron_status', - 'language', - 'transaction_date', + "patron_status", + "language", + "transaction_date", ], variable_fields=[ - 'institution_id', - 'patron_id', - 'patron_name', - 'valid_patron', - 'valid_patron_pwd', - 'screen_messages', - 'print_line', + "institution_id", + "patron_id", + "patron_name", + "valid_patron", + "valid_patron_pwd", + "screen_messages", + "print_line", ], ), - '29': dict( - label='Renew', - handler='renew', + "29": dict( + label="Renew", + handler="renew", required_fields=[ - 'third_party_allowed', - 'no_block', - 'nb_due_date', - 'transaction_date', - 'institution_id', - 'patron_id', + "third_party_allowed", + "no_block", + "nb_due_date", + "transaction_date", + "institution_id", + "patron_id", ], fixed_fields=[ - 'third_party_allowed', - 'no_block', - 'nb_due_date', - 'transaction_date', + "third_party_allowed", + "no_block", + "nb_due_date", + "transaction_date", ], variable_fields=[ - 'institution_id', - 'patron_id', - 'patron_pwd', - 'item_id', - 'title_id', - 'terminal_pwd', - 'item_properties', - 'fee_acknowledged', + "institution_id", + "patron_id", + "patron_pwd", + "item_id", + "title_id", + "terminal_pwd", + "item_properties", + "fee_acknowledged", ], ), - '30': dict( - label='Renew response', - handler='renew_response', + "30": dict( + label="Renew response", + handler="renew_response", required_fields=[ - 'ok', - 'renewal_ok', - 'magnetic_media', - 'desensitize', - 'transaction_date', - 'institution_id', - 'patron_id', - 'item_id', - 'title_id', - 'due_date', + "ok", + "renewal_ok", + "magnetic_media", + "desensitize", + "transaction_date", + "institution_id", + "patron_id", + "item_id", + "title_id", + "due_date", ], fixed_fields=[ - 'ok', - 'renewal_ok', - 'magnetic_media', - 'desensitize', - 'transaction_date', + "ok", + "renewal_ok", + "magnetic_media", + "desensitize", + "transaction_date", ], variable_fields=[ - 'institution_id', - 'patron_id', - 'item_id', - 'title_id', - 'due_date', - 'fee_type', - 'security_inhibit', - 'currency_type', - 'fee_amount', - 'media_type', - 'item_properties', - 'transaction_id', - 'screen_messages', - 'print_line', + "institution_id", + "patron_id", + "item_id", + "title_id", + "due_date", + "fee_type", + "security_inhibit", + "currency_type", + "fee_amount", + "media_type", + "item_properties", + "transaction_id", + "screen_messages", + "print_line", ], ), - '35': dict( - label='End patron session', - handler='end_patron_session', + "35": dict( + label="End patron session", + handler="end_patron_session", required_fields=[ - 'transaction_date', - 'institution_id', - 'patron_id', + "transaction_date", + "institution_id", + "patron_id", ], fixed_fields=[ - 'transaction_date', + "transaction_date", ], variable_fields=[ - 'institution_id', - 'patron_id', - 'terminal_pwd', - 'patron_pwd', + "institution_id", + "patron_id", + "terminal_pwd", + "patron_pwd", ], ), - '36': dict( - label='End session response', - handler='end_session_response', + "36": dict( + label="End session response", + handler="end_session_response", required_fields=[ - 'end_session', - 'transaction_date', - 'institution_id', - 'patron_id', + "end_session", + "transaction_date", + "institution_id", + "patron_id", ], fixed_fields=[ - 'end_session', - 'transaction_date', + "end_session", + "transaction_date", ], variable_fields=[ - 'institution_id', - 'patron_id', - 'screen_messages', - 'print_line', + "institution_id", + "patron_id", + "screen_messages", + "print_line", ], ), - '37': dict( - label='Fee paid', - handler='fee_paid', + "37": dict( + label="Fee paid", + handler="fee_paid", required_fields=[ - 'transaction_date', - 'fee_type', - 'payment_type', - 'currency_type', - 'fee_amount', - 'institution_id', - 'patron_id', - 'terminal_pwd', - 'patron_pwd', + "transaction_date", + "fee_type", + "payment_type", + "currency_type", + "fee_amount", + "institution_id", + "patron_id", + "terminal_pwd", + "patron_pwd", ], fixed_fields=[ - 'transaction_date', - 'fee_type', - 'payment_type', - 'currency_type', + "transaction_date", + "fee_type", + "payment_type", + "currency_type", ], variable_fields=[ - 'fee_amount', - 'institution_id', - 'patron_id', - 'terminal_pwd', - 'patron_pwd', - 'fee_id', - 'transaction_id' - ] + "fee_amount", + "institution_id", + "patron_id", + "terminal_pwd", + "patron_pwd", + "fee_id", + "transaction_id", + ], ), - '38': dict( - label='Fee paid response', - handler='fee_paid_response', + "38": dict( + label="Fee paid response", + handler="fee_paid_response", required_fields=[ - 'transaction_date', - 'payment_accepted', - 'institution_id', - 'patron_id', + "transaction_date", + "payment_accepted", + "institution_id", + "patron_id", ], fixed_fields=[ - 'transaction_date', - 'payment_accepted', + "transaction_date", + "payment_accepted", ], variable_fields=[ - 'institution_id', - 'patron_id', - 'transaction_id', - 'screen_messages', - 'print_line', + "institution_id", + "patron_id", + "transaction_id", + "screen_messages", + "print_line", ], ), - '63': dict( - label='Patron information', - handler='patron_information', + "63": dict( + label="Patron information", + handler="patron_information", required_fields=[ - 'language', - 'transaction_date', - 'summary', - 'institution_id', - 'patron_id', + "language", + "transaction_date", + "summary", + "institution_id", + "patron_id", ], fixed_fields=[ - 'language', - 'transaction_date', - 'summary', + "language", + "transaction_date", + "summary", ], variable_fields=[ - 'institution_id', - 'patron_id', - 'terminal_pwd', - 'patron_pwd', - 'start_item', - 'end_item' + "institution_id", + "patron_id", + "terminal_pwd", + "patron_pwd", + "start_item", + "end_item", ], ), - '64': dict( - label='Patron information response', - handler='patron_information', + "64": dict( + label="Patron information response", + handler="patron_information", required_fields=[ - 'patron_status', - 'language', - 'transaction_date', - 'hold_items_count', - 'overdue_items_count', - 'charged_items_count', - 'fine_items_count', - 'recall_items_count', - 'unavailable_holds_count', - 'institution_id', - 'patron_id', - 'patron_name', + "patron_status", + "language", + "transaction_date", + "hold_items_count", + "overdue_items_count", + "charged_items_count", + "fine_items_count", + "recall_items_count", + "unavailable_holds_count", + "institution_id", + "patron_id", + "patron_name", ], fixed_fields=[ - 'patron_status', - 'language', - 'transaction_date', - 'hold_items_count', - 'overdue_items_count', - 'charged_items_count', - 'fine_items_count', - 'recall_items_count', - 'unavailable_holds_count', + "patron_status", + "language", + "transaction_date", + "hold_items_count", + "overdue_items_count", + "charged_items_count", + "fine_items_count", + "recall_items_count", + "unavailable_holds_count", ], variable_fields=[ - 'institution_id', - 'patron_id', - 'patron_name', - 'home_address', - 'home_phone', - 'email', - 'hold_items_limit', - 'overdue_items_limit', - 'charged_items_limit', - 'hold_items', - 'overdue_items', - 'fine_items', - 'charged_items', - 'recall_items', - 'unavailable_hold_items', - 'valid_patron', - 'valid_patron_pwd', - 'currency_type', - 'fee_amount', - 'fee_limit', - 'screen_messages', - 'print_line', + "institution_id", + "patron_id", + "patron_name", + "home_address", + "home_phone", + "email", + "hold_items_limit", + "overdue_items_limit", + "charged_items_limit", + "hold_items", + "overdue_items", + "fine_items", + "charged_items", + "recall_items", + "unavailable_hold_items", + "valid_patron", + "valid_patron_pwd", + "currency_type", + "fee_amount", + "fee_limit", + "screen_messages", + "print_line", ], ), - '65': dict( - label='Renew all', - handler='renew_all', + "65": dict( + label="Renew all", + handler="renew_all", required_fields=[ - 'transaction_date', + "transaction_date", ], fixed_fields=[ - 'transaction_date', + "transaction_date", ], variable_fields=[ - 'institution_id', - 'patron_id', - 'patron_pwd', - 'terminal_pwd', - 'fee_acknowledged', + "institution_id", + "patron_id", + "patron_pwd", + "terminal_pwd", + "fee_acknowledged", ], ), - '66': dict( - label='Renew all response', - handler='renew_all_response', + "66": dict( + label="Renew all response", + handler="renew_all_response", required_fields=[ - 'ok', - 'renewed_count', - 'unrenewed_count', - 'transaction_date', + "ok", + "renewed_count", + "unrenewed_count", + "transaction_date", ], fixed_fields=[ - 'ok', - 'renewed_count', - 'unrenewed_count', - 'transaction_date', + "ok", + "renewed_count", + "unrenewed_count", + "transaction_date", ], variable_fields=[ - 'institution_id', - 'renewed_items', - 'unrenewed_items', - 'screen_messages', - 'print_line', + "institution_id", + "renewed_items", + "unrenewed_items", + "screen_messages", + "print_line", ], ), - '93': dict( - label='Login', - handler='login', + "93": dict( + label="Login", + handler="login", required_fields=[ - 'uid_algorithm', - 'pwd_algorithm', - 'login_uid', - 'login_pwd', + "uid_algorithm", + "pwd_algorithm", + "login_uid", + "login_pwd", ], fixed_fields=[ - 'uid_algorithm', - 'pwd_algorithm', + "uid_algorithm", + "pwd_algorithm", ], variable_fields=[ - 'login_uid', - 'login_pwd', - 'location_code', + "login_uid", + "login_pwd", + "location_code", ], ), - '94': dict( - label='Login response', - required_fields=[ - 'ok' - ], - fixed_fields=[ - 'ok' - ], + "94": dict( + label="Login response", + required_fields=["ok"], + fixed_fields=["ok"], ), - '96': dict( - label='Request selfcheck resend', - handler='request_sc_resend', + "96": dict( + label="Request selfcheck resend", + handler="request_sc_resend", ), - '97': dict( - label='Request Automated Circulation System resend', - handler='request_acs_resend', + "97": dict( + label="Request Automated Circulation System resend", + handler="request_acs_resend", ), - '98': dict( - label='Automated Circulation System status', - handler='acs_status', + "98": dict( + label="Automated Circulation System status", + handler="acs_status", required_fields=[ - 'online_status', - 'checkin_ok', - 'checkout_ok', - 'acs_renewal_policy', - 'status_update_ok', - 'offline_ok', - 'timeout_period', - 'retries_allowed', - 'date_time_sync', - 'protocol_version', - 'institution_id', - 'supported_messages', + "online_status", + "checkin_ok", + "checkout_ok", + "acs_renewal_policy", + "status_update_ok", + "offline_ok", + "timeout_period", + "retries_allowed", + "date_time_sync", + "protocol_version", + "institution_id", + "supported_messages", ], fixed_fields=[ - 'online_status', - 'checkin_ok', - 'checkout_ok', - 'acs_renewal_policy', - 'status_update_ok', - 'offline_ok', - 'timeout_period', - 'retries_allowed', - 'date_time_sync', - 'protocol_version', + "online_status", + "checkin_ok", + "checkout_ok", + "acs_renewal_policy", + "status_update_ok", + "offline_ok", + "timeout_period", + "retries_allowed", + "date_time_sync", + "protocol_version", ], variable_fields=[ - 'institution_id', - 'library_name', - 'supported_messages', - 'terminal_location', - 'screen_messages', - 'print_line', + "institution_id", + "library_name", + "supported_messages", + "terminal_location", + "screen_messages", + "print_line", ], ), - '99': dict( - label='Selfcheck status', - handler='selfcheck_status', + "99": dict( + label="Selfcheck status", + handler="selfcheck_status", required_fields=[ - 'status_code', - 'max_print_width', - 'protocol_version', + "status_code", + "max_print_width", + "protocol_version", ], fixed_fields=[ - 'status_code', - 'max_print_width', - 'protocol_version', + "status_code", + "max_print_width", + "protocol_version", ], ), } # Define fixed fields SIP2_FIXED_FIELD_DEFINITION = dict( - available=dict(length=1, label=_('available'), - callback=convert_bool_to_char), - transaction_date=dict(length=18, label=_('transaction date')), - ok=dict(length=1, label=_('ok')), - uid_algorithm=dict(length=1, label=_('uid algorithm')), - pwd_algorithm=dict(length=1, label=_('pwd algorithm')), - fee_type=dict(length=2, label=_('fee type')), - payment_type=dict(length=2, label=_('payment type')), - currency_type=dict(length=3, label=_('currency type')), - payment_accepted=dict(length=1, label=_('payment accepted'), - callback=convert_bool_to_char), - circulation_status=dict(length=2, label=_('circulation status')), - security_marker=dict(length=2, label=_('security marker')), - language=dict(length=3, label=_('language')), - patron_status=dict(length=14, label=_('patron status')), - end_session=dict(length=1, label=_('End Session'), - callback=convert_bool_to_char), - summary=dict(length=10, label=_('summary')), - hold_mode=dict(length=1, label=_('hold mode')), - hold_items_count=dict(length=4, fill='0', label=_('hold items count')), - overdue_items_count=dict(length=4, fill='0', - label=_('overdue items count')), - charged_items_count=dict(length=4, fill='0', - label=_('charged items count')), - fine_items_count=dict(length=4, fill='0', label=_('fine items count')), - recall_items_count=dict(length=4, fill='0', label=_('recall items count')), - unavailable_holds_count=dict(length=4, fill='0', - label=_('unavailable holds count')), - sc_renewal_policy=dict(length=1, label=_('sc renewal policy')), - no_block=dict(length=1, label=_('no block')), - card_retained=dict(length=1, label=_('card retained')), - nb_due_date=dict(length=18, label=_('nb due date')), - third_party_allowed=dict(length=1, label=_('Third party allowed')), - renewal_ok=dict(length=1, label=_('renewal ok'), - callback=convert_bool_to_char), - unrenewed_count=dict(length=4, label=_('renewal ok')), - renewed_count=dict(length=4, label=_('renewal ok')), - magnetic_media=dict(length=1, label=_('magnetic media'), - callback=convert_to_char), - desensitize=dict(length=1, label=_('desensitize'), - callback=convert_to_char), - resensitize=dict(length=1, label=_('resensitize'), - callback=convert_bool_to_char), - return_date=dict(length=18, label=_('return date')), - alert=dict(length=1, label=_('alert'), callback=convert_bool_to_char), - status_code=dict(length=1, label=_('status code')), - max_print_width=dict(length=3, label=_('max print width')), - protocol_version=dict(length=4, label=_('protocol version')), - online_status=dict(length=1, label=_('on-line status')), - checkin_ok=dict(length=1, label=_('checkin ok')), - checkout_ok=dict(length=1, label=_('checkout ok')), - item_properties_ok=dict(length=1, label=_('item properties ok')), - acs_renewal_policy=dict(length=1, label=_('acs renewal policy')), - status_update_ok=dict(length=1, label=_('status update ok')), - offline_ok=dict(length=1, label=_('offline ok')), - timeout_period=dict(length=3, label=_('timeout period')), - retries_allowed=dict(length=3, label=_('retries allowed')), - date_time_sync=dict(length=18, label=_('date/time sync')), + available=dict(length=1, label=_("available"), callback=convert_bool_to_char), + transaction_date=dict(length=18, label=_("transaction date")), + ok=dict(length=1, label=_("ok")), + uid_algorithm=dict(length=1, label=_("uid algorithm")), + pwd_algorithm=dict(length=1, label=_("pwd algorithm")), + fee_type=dict(length=2, label=_("fee type")), + payment_type=dict(length=2, label=_("payment type")), + currency_type=dict(length=3, label=_("currency type")), + payment_accepted=dict( + length=1, label=_("payment accepted"), callback=convert_bool_to_char + ), + circulation_status=dict(length=2, label=_("circulation status")), + security_marker=dict(length=2, label=_("security marker")), + language=dict(length=3, label=_("language")), + patron_status=dict(length=14, label=_("patron status")), + end_session=dict(length=1, label=_("End Session"), callback=convert_bool_to_char), + summary=dict(length=10, label=_("summary")), + hold_mode=dict(length=1, label=_("hold mode")), + hold_items_count=dict(length=4, fill="0", label=_("hold items count")), + overdue_items_count=dict(length=4, fill="0", label=_("overdue items count")), + charged_items_count=dict(length=4, fill="0", label=_("charged items count")), + fine_items_count=dict(length=4, fill="0", label=_("fine items count")), + recall_items_count=dict(length=4, fill="0", label=_("recall items count")), + unavailable_holds_count=dict( + length=4, fill="0", label=_("unavailable holds count") + ), + sc_renewal_policy=dict(length=1, label=_("sc renewal policy")), + no_block=dict(length=1, label=_("no block")), + card_retained=dict(length=1, label=_("card retained")), + nb_due_date=dict(length=18, label=_("nb due date")), + third_party_allowed=dict(length=1, label=_("Third party allowed")), + renewal_ok=dict(length=1, label=_("renewal ok"), callback=convert_bool_to_char), + unrenewed_count=dict(length=4, label=_("renewal ok")), + renewed_count=dict(length=4, label=_("renewal ok")), + magnetic_media=dict(length=1, label=_("magnetic media"), callback=convert_to_char), + desensitize=dict(length=1, label=_("desensitize"), callback=convert_to_char), + resensitize=dict(length=1, label=_("resensitize"), callback=convert_bool_to_char), + return_date=dict(length=18, label=_("return date")), + alert=dict(length=1, label=_("alert"), callback=convert_bool_to_char), + status_code=dict(length=1, label=_("status code")), + max_print_width=dict(length=3, label=_("max print width")), + protocol_version=dict(length=4, label=_("protocol version")), + online_status=dict(length=1, label=_("on-line status")), + checkin_ok=dict(length=1, label=_("checkin ok")), + checkout_ok=dict(length=1, label=_("checkout ok")), + item_properties_ok=dict(length=1, label=_("item properties ok")), + acs_renewal_policy=dict(length=1, label=_("acs renewal policy")), + status_update_ok=dict(length=1, label=_("status update ok")), + offline_ok=dict(length=1, label=_("offline ok")), + timeout_period=dict(length=3, label=_("timeout period")), + retries_allowed=dict(length=3, label=_("retries allowed")), + date_time_sync=dict(length=18, label=_("date/time sync")), ) # Define variable fields SIP2_VARIABLE_FIELD_DEFINITION = dict( - patron_id=dict(field_id='AA', label=_('patron identifier')), - item_id=dict(field_id='AB', label=_('item identifier')), - terminal_pwd=dict(field_id='AC', label=_('terminal password')), - patron_pwd=dict(field_id='AD', label=_('patron password')), - patron_name=dict(field_id='AE', label=_('personal name')), - screen_messages=dict(field_id='AF', multiple=True, - label=_('screen message')), - print_line=dict(field_id='AG', multiple=True, label=_('print line')), - due_date=dict(field_id='AH', label=_('due date'), - callback=parse_circulation_date), - title_id=dict(field_id='AJ', label=_('title identifier')), - blocked_card_msg=dict(field_id='AL', label=_('blocked card msg')), - library_name=dict(field_id='AM', label=_('library name')), - terminal_location=dict(field_id='AN', label=_('terminal location')), - institution_id=dict(field_id='AO', label=_('institution id')), - current_location=dict(field_id='AP', label=_('current location')), - permanent_location=dict(field_id='AQ', label=_('permanent location')), - hold_items=dict(field_id='AS', multiple=True, label=_('hold items')), - overdue_items=dict(field_id='AT', multiple=True, label=_('overdue items')), - charged_items=dict(field_id='AU', multiple=True, label=_('charged items')), - fine_items=dict(field_id='AV', multiple=True, label=_('fine items')), - sequence_number=dict(field_id='AY', length=1, label=_('sequence number')), - checksum=dict(field_id='AZ', length=4, label=_('checksum')), - home_address=dict(field_id='BD', label=_('home address')), - email=dict(field_id='BE', label=_('e-mail address')), - home_phone=dict(field_id='BF', label=_('home phone number')), - owner=dict(field_id='BG', label=_('owner')), - currency_type=dict(field_id='BH', length=3, label=_('currency type')), - cancel=dict(field_id='BI', length=1, label=_('cancel')), - transaction_id=dict(field_id='BK', label=_('transaction id')), - valid_patron=dict(field_id='BL', length=1, label=_('valid patron'), - callback=convert_bool_to_char), - renewed_items=dict(field_id='BM', multiple=True, label=_('renewed items')), - unrenewed_items=dict(field_id='BN', multiple=True, - label=_('unrenewed items')), - fee_acknowledged=dict(field_id='BO', length=1, - label=_('fee acknowledged')), - start_item=dict(field_id='BP', label=_('start item')), - end_item=dict(field_id='BQ', label=_('end item')), - queue_position=dict(field_id='BR', label=_('queue position')), - pickup_location=dict(field_id='BS', label=_('pickup location')), - fee_type=dict(field_id='BT', length=2, label=_('fee type')), - recall_items=dict(field_id='BU', multiple=True, label=_('recall items')), - fee_amount=dict(field_id='BV', label=_('fee amount')), - expiration_date=dict(field_id='BW', length=18, label=_('expiration date')), - supported_messages=dict(field_id='BX', label=_('supported messages')), - hold_type=dict(field_id='BY', length=1, label=_('hold type')), - hold_items_limit=dict(field_id='BZ', length=4, fill='0', - label=_('hold items limit')), - overdue_items_limit=dict(field_id='CA', length=4, fill='0', - label=_('overdue items limit')), - charged_items_limit=dict(field_id='CB', length=4, fill='0', - label=_('charged items limit')), - fee_limit=dict(field_id='CC', label=_('fee limit')), - unavailable_hold_items=dict(field_id='CD', multiple=True, - label=_('unavailable hold items')), - hold_queue_length=dict(field_id='CF', label=_('hold queue length')), - fee_id=dict(field_id='CG', label=_('fee identifier')), - item_properties=dict(field_id='CH', label=_('item properties')), - security_inhibit=dict(field_id='CI', length=1, - label=_('security inhibit')), - recall_date=dict(field_id='CJ', length=18, label=_('recall date')), - media_type=dict(field_id='CK', length=3, label=_('media type'), - callback=get_media_type), - sort_bin=dict(field_id='CL', label=_('sort bin')), - hold_pickup_date=dict(field_id='CM', length=18, - label=_('hold pickup date')), - login_uid=dict(field_id='CN', label=_('login user id')), - login_pwd=dict(field_id='CO', label=_('login password')), - location_code=dict(field_id='CP', label=_('location code')), - valid_patron_pwd=dict(field_id='CQ', length=1, - label=_('valid patron password'), - callback=convert_bool_to_char), - patron_net_profile=dict(field_id='PI', label=_('patron internet profile')), - call_number=dict(field_id='CS', label=_('call number')), - collection_code=dict(field_id='CR', label=_('collection code')), - alert_type=dict(field_id='CV', label=_('alert type')), - hold_patron_id=dict(field_id='CY', label=_('hold patron id')), - hold_patron_name=dict(field_id='DA', label=_('hold patron name')), - destination_location=dict(field_id='CT', label=_('destination location')), - patron_expire=dict(field_id='PA', label=_('patron expire date')), - patron_birth_date=dict(field_id='PB', label=_('patron birth date')), - patron_class=dict(field_id='PC', label=_('patron class')), - register_login=dict(field_id='OR', label=_('register login')), + patron_id=dict(field_id="AA", label=_("patron identifier")), + item_id=dict(field_id="AB", label=_("item identifier")), + terminal_pwd=dict(field_id="AC", label=_("terminal password")), + patron_pwd=dict(field_id="AD", label=_("patron password")), + patron_name=dict(field_id="AE", label=_("personal name")), + screen_messages=dict(field_id="AF", multiple=True, label=_("screen message")), + print_line=dict(field_id="AG", multiple=True, label=_("print line")), + due_date=dict(field_id="AH", label=_("due date"), callback=parse_circulation_date), + title_id=dict(field_id="AJ", label=_("title identifier")), + blocked_card_msg=dict(field_id="AL", label=_("blocked card msg")), + library_name=dict(field_id="AM", label=_("library name")), + terminal_location=dict(field_id="AN", label=_("terminal location")), + institution_id=dict(field_id="AO", label=_("institution id")), + current_location=dict(field_id="AP", label=_("current location")), + permanent_location=dict(field_id="AQ", label=_("permanent location")), + hold_items=dict(field_id="AS", multiple=True, label=_("hold items")), + overdue_items=dict(field_id="AT", multiple=True, label=_("overdue items")), + charged_items=dict(field_id="AU", multiple=True, label=_("charged items")), + fine_items=dict(field_id="AV", multiple=True, label=_("fine items")), + sequence_number=dict(field_id="AY", length=1, label=_("sequence number")), + checksum=dict(field_id="AZ", length=4, label=_("checksum")), + home_address=dict(field_id="BD", label=_("home address")), + email=dict(field_id="BE", label=_("e-mail address")), + home_phone=dict(field_id="BF", label=_("home phone number")), + owner=dict(field_id="BG", label=_("owner")), + currency_type=dict(field_id="BH", length=3, label=_("currency type")), + cancel=dict(field_id="BI", length=1, label=_("cancel")), + transaction_id=dict(field_id="BK", label=_("transaction id")), + valid_patron=dict( + field_id="BL", length=1, label=_("valid patron"), callback=convert_bool_to_char + ), + renewed_items=dict(field_id="BM", multiple=True, label=_("renewed items")), + unrenewed_items=dict(field_id="BN", multiple=True, label=_("unrenewed items")), + fee_acknowledged=dict(field_id="BO", length=1, label=_("fee acknowledged")), + start_item=dict(field_id="BP", label=_("start item")), + end_item=dict(field_id="BQ", label=_("end item")), + queue_position=dict(field_id="BR", label=_("queue position")), + pickup_location=dict(field_id="BS", label=_("pickup location")), + fee_type=dict(field_id="BT", length=2, label=_("fee type")), + recall_items=dict(field_id="BU", multiple=True, label=_("recall items")), + fee_amount=dict(field_id="BV", label=_("fee amount")), + expiration_date=dict(field_id="BW", length=18, label=_("expiration date")), + supported_messages=dict(field_id="BX", label=_("supported messages")), + hold_type=dict(field_id="BY", length=1, label=_("hold type")), + hold_items_limit=dict( + field_id="BZ", length=4, fill="0", label=_("hold items limit") + ), + overdue_items_limit=dict( + field_id="CA", length=4, fill="0", label=_("overdue items limit") + ), + charged_items_limit=dict( + field_id="CB", length=4, fill="0", label=_("charged items limit") + ), + fee_limit=dict(field_id="CC", label=_("fee limit")), + unavailable_hold_items=dict( + field_id="CD", multiple=True, label=_("unavailable hold items") + ), + hold_queue_length=dict(field_id="CF", label=_("hold queue length")), + fee_id=dict(field_id="CG", label=_("fee identifier")), + item_properties=dict(field_id="CH", label=_("item properties")), + security_inhibit=dict(field_id="CI", length=1, label=_("security inhibit")), + recall_date=dict(field_id="CJ", length=18, label=_("recall date")), + media_type=dict( + field_id="CK", length=3, label=_("media type"), callback=get_media_type + ), + sort_bin=dict(field_id="CL", label=_("sort bin")), + hold_pickup_date=dict(field_id="CM", length=18, label=_("hold pickup date")), + login_uid=dict(field_id="CN", label=_("login user id")), + login_pwd=dict(field_id="CO", label=_("login password")), + location_code=dict(field_id="CP", label=_("location code")), + valid_patron_pwd=dict( + field_id="CQ", + length=1, + label=_("valid patron password"), + callback=convert_bool_to_char, + ), + patron_net_profile=dict(field_id="PI", label=_("patron internet profile")), + call_number=dict(field_id="CS", label=_("call number")), + collection_code=dict(field_id="CR", label=_("collection code")), + alert_type=dict(field_id="CV", label=_("alert type")), + hold_patron_id=dict(field_id="CY", label=_("hold patron id")), + hold_patron_name=dict(field_id="DA", label=_("hold patron name")), + destination_location=dict(field_id="CT", label=_("destination location")), + patron_expire=dict(field_id="PA", label=_("patron expire date")), + patron_birth_date=dict(field_id="PB", label=_("patron birth date")), + patron_class=dict(field_id="PC", label=_("patron class")), + register_login=dict(field_id="OR", label=_("register login")), ) diff --git a/invenio_sip2/datastore.py b/invenio_sip2/datastore.py index 1581746..70a4f4d 100644 --- a/invenio_sip2/datastore.py +++ b/invenio_sip2/datastore.py @@ -81,7 +81,7 @@ class Sip2RedisDatastore(Datastore): def __init__(self, app=None, **kwargs): """Initialize the datastore.""" app = app or current_app - redis_url = app.config['SIP2_DATASTORE_REDIS_URL'] + redis_url = app.config["SIP2_DATASTORE_REDIS_URL"] self.datastore = StrictRedis.from_url(redis_url) def get(self, id_, record_type=None): @@ -93,10 +93,7 @@ def get(self, id_, record_type=None): """ query = id_ if record_type: - query = '{record_type}:{id}*'.format( - record_type=record_type, - id=id_ - ) + query = "{record_type}:{id}*".format(record_type=record_type, id=id_) for key in self._query(query): return jsonpickle.decode(self.datastore.get(key)) @@ -133,29 +130,26 @@ def all(self, record_type=None): :param record_type: the object's type :return: list of stored objects """ - query = '*' + query = "*" if record_type: - query = '{record_type}:*'.format( - record_type=record_type - ) + query = "{record_type}:*".format(record_type=record_type) for key in self._query(query): yield jsonpickle.decode(self.datastore.get(key)) - def _query(self, query='*'): + def _query(self, query="*"): """Execute search query to datastore.""" return self.datastore.keys(query) - def search(self, search_term='*', index_type='*', filter_query=None): + def search(self, search_term="*", index_type="*", filter_query=None): """Search object in th datastore.""" - search_key = '{record_type}:{search_term}'.format( - record_type=index_type, - search_term=search_term + search_key = "{record_type}:{search_term}".format( + record_type=index_type, search_term=search_term ) if filter_query: - search_key += '_{filter}'.format( - filter=filter_query - ) + search_key += "_{filter}".format(filter=filter_query) - return [jsonpickle.decode(self.datastore.get(key)) - for key in self._query(search_key)] + return [ + jsonpickle.decode(self.datastore.get(key)) + for key in self._query(search_key) + ] diff --git a/invenio_sip2/decorators.py b/invenio_sip2/decorators.py index 3e1dbee..330f28b 100644 --- a/invenio_sip2/decorators.py +++ b/invenio_sip2/decorators.py @@ -30,7 +30,7 @@ def check_selfcheck_authentication(func): @wraps(func) def inner(*args, **kwargs): - client = kwargs.pop('client') + client = kwargs.pop("client") # TODO: maybe we can always call remote api to authenticate client if client and client.is_authenticated: return func(*args, client) @@ -45,11 +45,10 @@ def decorator(func): @wraps(func) def decorate_view(*args, **kwargs): if not current_user.is_authenticated: - return jsonify({'status': 'error: Unauthorized'}), 401 - check_permission( - current_app.config["SIP2_PERMISSIONS_FACTORY"](actions) - ) + return jsonify({"status": "error: Unauthorized"}), 401 + check_permission(current_app.config["SIP2_PERMISSIONS_FACTORY"](actions)) return func(*args, **kwargs) + return decorate_view return decorator diff --git a/invenio_sip2/ext.py b/invenio_sip2/ext.py index 556c752..092f62d 100644 --- a/invenio_sip2/ext.py +++ b/invenio_sip2/ext.py @@ -29,32 +29,30 @@ from invenio_sip2 import config, handlers from invenio_sip2.actions.actions import Action from invenio_sip2.errors import CommandNotFound -from invenio_sip2.helpers import MessageTypeFixedField, \ - MessageTypeVariableField +from invenio_sip2.helpers import MessageTypeFixedField, MessageTypeVariableField from invenio_sip2.models import SupportedMessages from invenio_sip2.utils import convert_bool_to_char from invenio_sip2.version import __version__ -logger = logging.getLogger('invenio-sip2') +logger = logging.getLogger("invenio-sip2") def load_fixed_field(app): """Load fixed field configuration.""" for name, field in app.config["SIP2_FIXED_FIELD_DEFINITION"].items(): - setattr(MessageTypeFixedField, name, MessageTypeFixedField( - name=name, - field=field - )) + setattr( + MessageTypeFixedField, name, MessageTypeFixedField(name=name, field=field) + ) def load_variable_field(app): """Load variable field configuration.""" - for name, field \ - in app.config["SIP2_VARIABLE_FIELD_DEFINITION"].items(): - setattr(MessageTypeVariableField, name, MessageTypeVariableField( - name=name, - field=field - )) + for name, field in app.config["SIP2_VARIABLE_FIELD_DEFINITION"].items(): + setattr( + MessageTypeVariableField, + name, + MessageTypeVariableField(name=name, field=field), + ) class InvenioSIP2(object): @@ -74,49 +72,46 @@ def init_app(self, app): self._state = _Sip2State(app) # Set SIP2 datastore - datastore_class = obj_or_import_string( - app.config['SIP2_DATASTORE_HANDLER'] - ) + datastore_class = obj_or_import_string(app.config["SIP2_DATASTORE_HANDLER"]) self.datastore = datastore_class(app) # Initialize logging - if app.config['SIP2_LOGGING_CONSOLE']: + if app.config["SIP2_LOGGING_CONSOLE"]: self.add_console_handler(app) - if app.config['SIP2_LOGGING_FS_LOGFILE']: + if app.config["SIP2_LOGGING_FS_LOGFILE"]: self.add_fs_handler(app) - app.extensions['invenio-sip2'] = self + app.extensions["invenio-sip2"] = self self.app = app def add_console_handler(self, app): """Add console handler to logger.""" handler = logging.StreamHandler() handler.setFormatter(self.get_logging_formatter()) - self._add_logger_handler(handler, - app.config['SIP2_LOGGING_CONSOLE_LEVEL']) + self._add_logger_handler(handler, app.config["SIP2_LOGGING_CONSOLE_LEVEL"]) def add_fs_handler(self, app): """Add file handler to logger.""" handler = RotatingFileHandler( - app.config['SIP2_LOGGING_FS_LOGFILE'], - backupCount=app.config['SIP2_LOGGING_FS_BACKUPCOUNT'], - maxBytes=app.config['SIP2_LOGGING_FS_MAXBYTES'], + app.config["SIP2_LOGGING_FS_LOGFILE"], + backupCount=app.config["SIP2_LOGGING_FS_BACKUPCOUNT"], + maxBytes=app.config["SIP2_LOGGING_FS_MAXBYTES"], delay=True, ) handler.setFormatter(self.get_logging_formatter()) - self._add_logger_handler(handler, app.config['SIP2_LOGGING_FS_LEVEL']) + self._add_logger_handler(handler, app.config["SIP2_LOGGING_FS_LEVEL"]) def init_config(self, app): """Initialize configuration.""" # Use theme's base template if theme is installed app.config.setdefault( - 'SIP2_BASE_TEMPLATE', - app.config.get('BASE_TEMPLATE', 'invenio_sip2/base.html') + "SIP2_BASE_TEMPLATE", + app.config.get("BASE_TEMPLATE", "invenio_sip2/base.html"), ) for k in dir(config): - if k.startswith('SIP2_'): + if k.startswith("SIP2_"): app.config.setdefault(k, getattr(config, k)) load_fixed_field(app) @@ -133,19 +128,17 @@ def _add_logger_handler(self, handler, level): @classmethod def get_logging_formatter(cls): """Return logging formatter.""" - log_format = \ - '%(asctime)s - %(name)s ({version}) - %(levelname)s - %(message)s'\ - .format(version=__version__) + log_format = ( + "%(asctime)s - %(name)s ({version}) - %(levelname)s - %(message)s".format( + version=__version__ + ) + ) return logging.Formatter(log_format) @cached_property def sip2(self): """Return the SIP2 action machine.""" - return _SIP2( - action_config=deepcopy( - current_app.config["SIP2_MESSAGE_ACTIONS"] - ) - ) + return _SIP2(action_config=deepcopy(current_app.config["SIP2_MESSAGE_ACTIONS"])) # TODO: reorganize extension implementation @cached_property @@ -157,94 +150,80 @@ def sip2_handlers(self): def sip2_message_types(self): """Message type configuration.""" return _Sip2MessageType( - message_type_config=deepcopy( - current_app.config['SIP2_MESSAGE_TYPES'] - ) + message_type_config=deepcopy(current_app.config["SIP2_MESSAGE_TYPES"]) ) @property def sip2_language(self): """Get default language from system.""" - return current_app.config['SIP2_DEFAULT_LANGUAGE'] + return current_app.config["SIP2_DEFAULT_LANGUAGE"] @property def sip2_current_date(self): """Get current date from system.""" return datetime.now(timezone.utc).strftime( - current_app.config['SIP2_DATE_FORMAT'] + current_app.config["SIP2_DATE_FORMAT"] ) @cached_property def supported_protocol(self): """Supported protocol by the automated circulation system.""" - return current_app.config['SIP2_PROTOCOL'] + return current_app.config["SIP2_PROTOCOL"] @cached_property def support_checkin(self): """Support of checkin by the automated circulation system.""" - return convert_bool_to_char( - current_app.config['SIP2_SUPPORT_CHECKIN'] - ) + return convert_bool_to_char(current_app.config["SIP2_SUPPORT_CHECKIN"]) @cached_property def support_checkout(self): """Support of checkout by the automated circulation system.""" - return convert_bool_to_char( - current_app.config['SIP2_SUPPORT_CHECKOUT'] - ) + return convert_bool_to_char(current_app.config["SIP2_SUPPORT_CHECKOUT"]) @cached_property def support_online_status(self): """Support of online status by the automated circulation system.""" - return convert_bool_to_char( - current_app.config['SIP2_SUPPORT_ONLINE_STATUS'] - ) + return convert_bool_to_char(current_app.config["SIP2_SUPPORT_ONLINE_STATUS"]) @cached_property def support_offline_status(self): """Support of offline status by the automated circulation system.""" - return convert_bool_to_char( - current_app.config['SIP2_SUPPORT_OFFLINE_STATUS'] - ) + return convert_bool_to_char(current_app.config["SIP2_SUPPORT_OFFLINE_STATUS"]) @cached_property def support_status_update(self): """Support of status update by the automated circulation system.""" - return convert_bool_to_char( - current_app.config['SIP2_SUPPORT_STATUS_UPDATE'] - ) + return convert_bool_to_char(current_app.config["SIP2_SUPPORT_STATUS_UPDATE"]) @cached_property def support_renewal_policy(self): """Support of renewal policy by the automated circulation system.""" - return convert_bool_to_char( - current_app.config['SIP2_SUPPORT_RENEWAL_POLICY'] - ) + return convert_bool_to_char(current_app.config["SIP2_SUPPORT_RENEWAL_POLICY"]) @cached_property def timeout_period(self): """Timeout period allowed by the automated circulation system.""" - return current_app.config['SIP2_TIMEOUT_PERIOD'] + return current_app.config["SIP2_TIMEOUT_PERIOD"] @cached_property def retries_allowed(self): """Number of retries allowed by the automated circulation system.""" - return current_app.config['SIP2_RETRIES_ALLOWED'] + return current_app.config["SIP2_RETRIES_ALLOWED"] @cached_property def line_terminator(self): """Line terminator used for message.""" - return current_app.config['SIP2_LINE_TERMINATOR'] + return current_app.config["SIP2_LINE_TERMINATOR"] @cached_property def text_encoding(self): """Message text charset encoding.""" - return current_app.config['SIP2_TEXT_ENCODING'] + return current_app.config["SIP2_TEXT_ENCODING"] @cached_property def is_error_detection_enabled(self): """Check if error detection is enabled.""" - return current_app.config['SIP2_ERROR_DETECTION'] + return current_app.config["SIP2_ERROR_DETECTION"] def supported_messages(self, remote_app): """Supported messages by the automated circulation system.""" @@ -259,7 +238,7 @@ def __init__(self, action_config): self.actions = {} for src_command, action in action_config.items(): self.actions.setdefault(src_command, []) - _cls = action.pop('action', Action) + _cls = action.pop("action", Action) instance = _cls(**dict(action, command=src_command)) self.actions[src_command] = instance @@ -267,7 +246,7 @@ def execute(self, msg, **kwargs): """Execute action on message.""" try: action = self.actions[msg.command] - logger.debug(f'[_SIP2] execute action: {action}') + logger.debug(f"[_SIP2] execute action: {action}") return action.execute(msg, **kwargs) except Exception: pass @@ -298,11 +277,11 @@ def __init__(self, command, **kwargs): self.optional_fields = [] self.fixed_fields = [] self.variable_fields = [] - self.label = kwargs.pop('label'), + self.label = (kwargs.pop("label"),) - required_fields = kwargs.pop('required_fields', []) - fixed_fields = kwargs.pop('fixed_fields', []) - variable_fields = kwargs.pop('variable_fields', []) + required_fields = kwargs.pop("required_fields", []) + fixed_fields = kwargs.pop("fixed_fields", []) + variable_fields = kwargs.pop("variable_fields", []) for required_field in required_fields: if required_field in fixed_fields: @@ -337,28 +316,25 @@ def __init__(self, app): self.supported_messages = {} # register api handlers - for remote, conf in app.config['SIP2_REMOTE_ACTION_HANDLERS'].items(): + for remote, conf in app.config["SIP2_REMOTE_ACTION_HANDLERS"].items(): supported_messages = SupportedMessages() # register login handler - if conf.get('login_handler'): + if conf.get("login_handler"): self.login_handler[remote] = handlers.make_api_handler( - conf.get('login_handler'), - with_data=True + conf.get("login_handler"), with_data=True ) - supported_messages.add_supported_message('login') + supported_messages.add_supported_message("login") - if conf.get('system_status_handler'): + if conf.get("system_status_handler"): self.system_status_handler[remote] = handlers.make_api_handler( - conf.get('system_status_handler'), - with_data=True + conf.get("system_status_handler"), with_data=True ) - supported_messages.add_supported_message('system_status') + supported_messages.add_supported_message("system_status") # register patron handlers patron_handlers = {} - for k, v in conf.get('patron_handlers', dict()).items(): - patron_handlers[k] = \ - handlers.make_api_handler(v, with_data=True) + for k, v in conf.get("patron_handlers", dict()).items(): + patron_handlers[k] = handlers.make_api_handler(v, with_data=True) supported_messages.add_supported_message(k) if patron_handlers: @@ -366,9 +342,8 @@ def __init__(self, app): # register item handlers item_handlers = {} - for k, v in conf.get('item_handlers', dict()).items(): - item_handlers[k] = \ - handlers.make_api_handler(v, with_data=True) + for k, v in conf.get("item_handlers", dict()).items(): + item_handlers[k] = handlers.make_api_handler(v, with_data=True) supported_messages.add_supported_message(k) if item_handlers: @@ -376,19 +351,17 @@ def __init__(self, app): # register circulation handlers circulation_handlers = {} - for k, v in conf.get('circulation_handlers', dict()).items(): - circulation_handlers[k] = \ - handlers.make_api_handler(v, with_data=True) + for k, v in conf.get("circulation_handlers", dict()).items(): + circulation_handlers[k] = handlers.make_api_handler(v, with_data=True) supported_messages.add_supported_message(k) if circulation_handlers: self.circulation_handlers[remote] = circulation_handlers - if conf.get('fee_paid_handler'): + if conf.get("fee_paid_handler"): self.fee_paid_handler[remote] = handlers.make_api_handler( - conf.get('fee_paid_handler'), - with_data=True + conf.get("fee_paid_handler"), with_data=True ) - supported_messages.add_supported_message('fee_paid') + supported_messages.add_supported_message("fee_paid") self.supported_messages[remote] = supported_messages diff --git a/invenio_sip2/handlers/__init__.py b/invenio_sip2/handlers/__init__.py index 9800040..28a9a0a 100644 --- a/invenio_sip2/handlers/__init__.py +++ b/invenio_sip2/handlers/__init__.py @@ -17,26 +17,36 @@ """Handlers for customizing sip2 api.""" -from invenio_sip2.handlers.api_handlers import authorize_patron_handler, \ - checkin_handler, checkout_handler, enable_patron_handler, \ - fee_paid_handler, hold_handler, item_handler, patron_handler, \ - patron_status_handler, renew_handler, selfcheck_login_handler, \ - system_status_handler, validate_patron_handler +from invenio_sip2.handlers.api_handlers import ( + authorize_patron_handler, + checkin_handler, + checkout_handler, + enable_patron_handler, + fee_paid_handler, + hold_handler, + item_handler, + patron_handler, + patron_status_handler, + renew_handler, + selfcheck_login_handler, + system_status_handler, + validate_patron_handler, +) from invenio_sip2.handlers.utils import make_api_handler __all__ = ( - 'make_api_handler', - 'selfcheck_login_handler', - 'system_status_handler', - 'validate_patron_handler', - 'authorize_patron_handler', - 'enable_patron_handler', - 'patron_handler', - 'patron_status_handler', - 'item_handler', - 'checkout_handler', - 'checkin_handler', - 'hold_handler', - 'renew_handler', - 'fee_paid_handler' + "make_api_handler", + "selfcheck_login_handler", + "system_status_handler", + "validate_patron_handler", + "authorize_patron_handler", + "enable_patron_handler", + "patron_handler", + "patron_status_handler", + "item_handler", + "checkout_handler", + "checkin_handler", + "hold_handler", + "renew_handler", + "fee_paid_handler", ) diff --git a/invenio_sip2/handlers/api_handlers.py b/invenio_sip2/handlers/api_handlers.py index d820d62..c470492 100644 --- a/invenio_sip2/handlers/api_handlers.py +++ b/invenio_sip2/handlers/api_handlers.py @@ -17,11 +17,18 @@ """Handlers for customizing SIP2 APIs.""" -from invenio_sip2.handlers.base import base_authorize_patron_handler, \ - base_circulation_handlers, base_enable_patron_handler, \ - base_fee_paid_handler, base_item_handler, base_patron_handler, \ - base_patron_status_handler, base_selfcheck_login_handler, \ - base_system_status_handler, base_validate_patron_handler +from invenio_sip2.handlers.base import ( + base_authorize_patron_handler, + base_circulation_handlers, + base_enable_patron_handler, + base_fee_paid_handler, + base_item_handler, + base_patron_handler, + base_patron_status_handler, + base_selfcheck_login_handler, + base_system_status_handler, + base_validate_patron_handler, +) def selfcheck_login_handler(remote, login, password, **kwargs): @@ -61,42 +68,59 @@ def patron_status_handler(remote, patron_identifier, **kwargs): def item_handler(remote, item_identifier, **kwargs): """Handle item information functionality.""" - return base_item_handler(remote, item_identifier, - **kwargs) + return base_item_handler(remote, item_identifier, **kwargs) -def checkout_handler(remote, user_id, item_identifier, patron_identifier, - *args, **kwargs): +def checkout_handler( + remote, user_id, item_identifier, patron_identifier, *args, **kwargs +): """Handle chekout an item functionality.""" - return base_circulation_handlers(remote, 'checkout', user_id, - item_identifier, patron_identifier, - *args, **kwargs) + return base_circulation_handlers( + remote, "checkout", user_id, item_identifier, patron_identifier, *args, **kwargs + ) def checkin_handler(remote, user_id, item_identifier, *args, **kwargs): """Handle checkin an item functionality.""" - return base_circulation_handlers(remote, 'checkin', user_id, - item_identifier, *args, **kwargs) + return base_circulation_handlers( + remote, "checkin", user_id, item_identifier, *args, **kwargs + ) -def hold_handler(remote, user_id, item_identifier, - *args, **kwargs): +def hold_handler(remote, user_id, item_identifier, *args, **kwargs): """Handle hold an item functionality.""" - return base_circulation_handlers(remote, 'hold', user_id, - item_identifier, *args, **kwargs) + return base_circulation_handlers( + remote, "hold", user_id, item_identifier, *args, **kwargs + ) -def renew_handler(remote, user_id, item_identifier, - *args, **kwargs): +def renew_handler(remote, user_id, item_identifier, *args, **kwargs): """Handle renew an item functionality.""" - return base_circulation_handlers(remote, 'renew', user_id, - item_identifier, *args, **kwargs) + return base_circulation_handlers( + remote, "renew", user_id, item_identifier, *args, **kwargs + ) -def fee_paid_handler(remote, user_id, patron_identifier, fee_type, - payment_type, currency_type, fee_amount, *args, **kwargs): +def fee_paid_handler( + remote, + user_id, + patron_identifier, + fee_type, + payment_type, + currency_type, + fee_amount, + *args, + **kwargs, +): """Handle fee paid functionality.""" return base_fee_paid_handler( - remote, user_id, patron_identifier, fee_type, payment_type, - currency_type, fee_amount, *args, **kwargs + remote, + user_id, + patron_identifier, + fee_type, + payment_type, + currency_type, + fee_amount, + *args, + **kwargs, ) diff --git a/invenio_sip2/handlers/base.py b/invenio_sip2/handlers/base.py index a67ed0a..8d3d2c1 100644 --- a/invenio_sip2/handlers/base.py +++ b/invenio_sip2/handlers/base.py @@ -51,11 +51,10 @@ def base_validate_patron_handler(remote, patron_identifier, **kwargs): returns: True if patron is valid else False """ handlers = acs_system.sip2_handlers.patron_handlers[remote] - return handlers['validate_patron'](patron_identifier, **kwargs) + return handlers["validate_patron"](patron_identifier, **kwargs) -def base_authorize_patron_handler(remote, patron_identifier, password, - **kwargs): +def base_authorize_patron_handler(remote, patron_identifier, password, **kwargs): """Handle authorize patron functionality. :param remote: remote ils @@ -64,7 +63,7 @@ def base_authorize_patron_handler(remote, patron_identifier, password, returns: True if patron password is valid else False """ handlers = acs_system.sip2_handlers.patron_handlers[remote] - return handlers['authorize_patron'](patron_identifier, password, **kwargs) + return handlers["authorize_patron"](patron_identifier, password, **kwargs) def base_enable_patron_handler(remote, patron_identifier, **kwargs): @@ -75,7 +74,7 @@ def base_enable_patron_handler(remote, patron_identifier, **kwargs): returns: login response """ handlers = acs_system.sip2_handlers.patron_handlers[remote] - return handlers['enable_patron'](patron_identifier, **kwargs) + return handlers["enable_patron"](patron_identifier, **kwargs) def base_patron_handler(remote, patron_identifier, **kwargs): @@ -86,7 +85,7 @@ def base_patron_handler(remote, patron_identifier, **kwargs): returns: Patron information """ handlers = acs_system.sip2_handlers.patron_handlers[remote] - return handlers['account'](patron_identifier, **kwargs) + return handlers["account"](patron_identifier, **kwargs) def base_patron_status_handler(remote, patron_identifier, **kwargs): @@ -97,10 +96,10 @@ def base_patron_status_handler(remote, patron_identifier, **kwargs): returns: Patron status """ handlers = acs_system.sip2_handlers.patron_handlers[remote] - return handlers['patron_status'](patron_identifier, **kwargs) + return handlers["patron_status"](patron_identifier, **kwargs) -def base_item_handler(remote, item_identifier, **kwargs): +def base_item_handler(remote, item_identifier, **kwargs): """Handle item information functionality. :param remote: remote ils @@ -108,11 +107,12 @@ def base_item_handler(remote, item_identifier, **kwargs): returns: Item information """ handlers = acs_system.sip2_handlers.item_handlers[remote] - return handlers['item'](item_identifier, **kwargs) + return handlers["item"](item_identifier, **kwargs) -def base_circulation_handlers(remote, handler, user_id, - item_or_patron_identifier, *args, **kwargs): +def base_circulation_handlers( + remote, handler, user_id, item_or_patron_identifier, *args, **kwargs +): """Handle checkout functionality. :param remote: remote ils @@ -123,14 +123,20 @@ def base_circulation_handlers(remote, handler, user_id, returns: Circulation handler """ handlers = acs_system.sip2_handlers.circulation_handlers[remote] - return handlers[handler]( - user_id, item_or_patron_identifier, *args, **kwargs - ) - - -def base_fee_paid_handler(remote, user_id, patron_identifier, fee_type, - payment_type, currency_type, fee_amount, *args, - **kwargs): + return handlers[handler](user_id, item_or_patron_identifier, *args, **kwargs) + + +def base_fee_paid_handler( + remote, + user_id, + patron_identifier, + fee_type, + payment_type, + currency_type, + fee_amount, + *args, + **kwargs, +): """Handle checkout functionality. :param remote: remote ils @@ -144,6 +150,12 @@ def base_fee_paid_handler(remote, user_id, patron_identifier, fee_type, """ handler = acs_system.sip2_handlers.fee_paid_handler[remote] return handler( - user_id, patron_identifier, fee_type, payment_type, currency_type, - fee_amount, *args, **kwargs + user_id, + patron_identifier, + fee_type, + payment_type, + currency_type, + fee_amount, + *args, + **kwargs, ) diff --git a/invenio_sip2/handlers/utils.py b/invenio_sip2/handlers/utils.py index cd3b5b7..6cae147 100644 --- a/invenio_sip2/handlers/utils.py +++ b/invenio_sip2/handlers/utils.py @@ -38,4 +38,5 @@ def inner(*args, **kwargs): return func(args[0], *args[1:], **kwargs) else: return func(*args, **kwargs) + return inner diff --git a/invenio_sip2/helpers.py b/invenio_sip2/helpers.py index 11e7789..fd6d0f1 100644 --- a/invenio_sip2/helpers.py +++ b/invenio_sip2/helpers.py @@ -27,20 +27,22 @@ def __init__(self, name, field): """Constructor.""" self.field_id = name self.name = name - self.label = field.get('label') - self.length = field.get('length') - self.callback = field.get('callback') - self.fill = field.get('fill', ' ') + self.label = field.get("label") + self.length = field.get("length") + self.callback = field.get("callback") + self.fill = field.get("fill", " ") def __str__(self): """String representation of fixed field.""" - return 'MessageTypeFixedField() field_id={field_id} ' \ - 'length={length} fill={fill} label={label}' \ - .format( + return ( + "MessageTypeFixedField() field_id={field_id} " + "length={length} fill={fill} label={label}".format( field_id=self.field_id, length=self.length, fill=self.fill, - label=self.label) + label=self.label, + ) + ) @classmethod def get(cls, name): @@ -58,27 +60,28 @@ class MessageTypeVariableField(object): def __init__(self, name, field): """Constructor.""" - self.field_id = field.get('field_id') + self.field_id = field.get("field_id") self.name = name - self.label = field.get('label') - self.length = field.get('length') - self.multiple = field.get('multiple', False) - self.callback = field.get('callback') - self.fill = field.get('fill', ' ') + self.label = field.get("label") + self.length = field.get("length") + self.multiple = field.get("multiple", False) + self.callback = field.get("callback") + self.fill = field.get("fill", " ") MessageTypeVariableField.field_id_map[self.field_id] = self def __str__(self): """String representation of variable field.""" - return 'MessageTypeVariableField() field_id={field_id} ' \ - 'length={length} fill={fill} label={label}'\ - .format( + return ( + "MessageTypeVariableField() field_id={field_id} " + "length={length} fill={fill} label={label}".format( field_id=self.field_id, length=self.length, fill=self.fill, multiple=self.multiple, - label=self.label + label=self.label, ) + ) @property def is_multiple(self): @@ -98,7 +101,8 @@ def find_by_field_id(cls, field_id): """Find variable field by field id.""" variable_field = cls.field_id_map.get(field_id) if variable_field is None: - msg = "field id '{field_id}' not in [{field_id_map}]" \ - .format(field_id=field_id, field_id_map=cls.field_id_map) + msg = "field id '{field_id}' not in [{field_id_map}]".format( + field_id=field_id, field_id_map=cls.field_id_map + ) raise UnknownFieldIdMessageError(message=msg) return variable_field diff --git a/invenio_sip2/models.py b/invenio_sip2/models.py index 9b39b9f..751e37f 100644 --- a/invenio_sip2/models.py +++ b/invenio_sip2/models.py @@ -25,37 +25,38 @@ class SupportedMessages: """Class to define supported mesages from handler config.""" handlers = [ - 'patron_status', - 'checkout', - 'checkin', - 'block_patron', - 'system_status', - 'request_resend', - 'login', - 'account', - 'end_patron_session', - 'fee_paid', - 'item', - 'item_status_update', - 'enable_patron', - 'hold', - 'renew', - 'renew_all', + "patron_status", + "checkout", + "checkin", + "block_patron", + "system_status", + "request_resend", + "login", + "account", + "end_patron_session", + "fee_paid", + "item", + "item_status_update", + "enable_patron", + "hold", + "renew", + "renew_all", ] def __init__(self): """Constructor.""" self.supported_messages = { - 'request_resend': True, - 'end_patron_session': True, + "request_resend": True, + "end_patron_session": True, } def __str__(self): """Sip2 string representation.""" - supported_messages_text = '' + supported_messages_text = "" for handler in self.handlers: - supported_messages_text += 'Y' \ - if handler in self.supported_messages else 'N' + supported_messages_text += ( + "Y" if handler in self.supported_messages else "N" + ) return supported_messages_text def add_supported_message(self, handler): @@ -67,20 +68,20 @@ def add_supported_message(self, handler): class PatronStatusTypes(Enum): """Enum class to list all possible patron status types.""" - CHARGE_PRIVILEGES_DENIED = 'charge_privileges_denied' - RENEWAL_PRIVILEGES_DENIED = 'renewal_privileges_denied' - RECALL_PRIVILEGES_DENIED = 'recall_privileges_denied' - HOLD_PRIVILEGES_DENIED = 'hold_privileges_denied' - CARD_REPORTED_LOST = 'card_reported_lost' - TOO_MANY_ITEMS_CHARGED = 'too_many_items_charged' - TOO_MANY_ITEMS_OVERDUE = 'too_many_items_overdue' - TOO_MANY_RENEWALS = 'too_many_renewals' - TOO_MANY_CLAIMS_OF_ITEMS_RETURNED = 'too_many_claims_of_items_returned' - TOO_MANY_ITEMS_LOST = 'too_many_items_lost' - EXCESSIVE_OUTSTANDING_FINES = 'excessive_outstanding_fines' - EXCESSIVE_OUTSTANDING_FEES = 'excessive_outstanding_fees' - RECALL_OVERDUE = 'recall_overdue' - TOO_MANY_ITEMS_BILLED = 'too_many_items_billed' + CHARGE_PRIVILEGES_DENIED = "charge_privileges_denied" + RENEWAL_PRIVILEGES_DENIED = "renewal_privileges_denied" + RECALL_PRIVILEGES_DENIED = "recall_privileges_denied" + HOLD_PRIVILEGES_DENIED = "hold_privileges_denied" + CARD_REPORTED_LOST = "card_reported_lost" + TOO_MANY_ITEMS_CHARGED = "too_many_items_charged" + TOO_MANY_ITEMS_OVERDUE = "too_many_items_overdue" + TOO_MANY_RENEWALS = "too_many_renewals" + TOO_MANY_CLAIMS_OF_ITEMS_RETURNED = "too_many_claims_of_items_returned" + TOO_MANY_ITEMS_LOST = "too_many_items_lost" + EXCESSIVE_OUTSTANDING_FINES = "excessive_outstanding_fines" + EXCESSIVE_OUTSTANDING_FEES = "excessive_outstanding_fees" + RECALL_OVERDUE = "recall_overdue" + TOO_MANY_ITEMS_BILLED = "too_many_items_billed" class PatronStatus(object): @@ -92,10 +93,11 @@ def __init__(self): def __str__(self): """Sip2 string representation.""" - patron_status_text = '' + patron_status_text = "" for status_type in PatronStatusTypes: - patron_status_text += 'Y' \ - if self.patron_status_types.get(status_type) else ' ' + patron_status_text += ( + "Y" if self.patron_status_types.get(status_type) else " " + ) return patron_status_text def add_patron_status_type(self, patron_status_type): @@ -107,7 +109,7 @@ def add_patron_status_type(self, patron_status_type): raise exception if patron status type does not exist. """ if patron_status_type not in PatronStatusTypes: - raise Exception(msg='patron status type does not exist') + raise Exception(msg="patron status type does not exist") self.patron_status_types[patron_status_type] = True @@ -115,8 +117,15 @@ def add_patron_status_type(self, patron_status_type): class SelfcheckEnablePatron(dict): """Class representing patron information handler response.""" - def __init__(self, patron_id, institution_id, patron_name='', - patron_status=None, language='und', **kwargs): + def __init__( + self, + patron_id, + institution_id, + patron_name="", + patron_status=None, + language="und", + **kwargs, + ): """Constructor. :param patron_id - patron identifier (e.g. id, barcode, ...) @@ -127,12 +136,12 @@ def __init__(self, patron_id, institution_id, patron_name='', :param kwargs - optional fields """ # required properties - self['patron_id'] = patron_id - self['patron_name'] = patron_name - self['patron_status'] = patron_status or PatronStatus() - self['institution_id'] = institution_id - self['language'] = language - self['screen_messages'] = [] + self["patron_id"] = patron_id + self["patron_name"] = patron_name + self["patron_status"] = patron_status or PatronStatus() + self["institution_id"] = institution_id + self["language"] = language + self["screen_messages"] = [] # optional properties for key, value in kwargs.items(): @@ -143,8 +152,15 @@ def __init__(self, patron_id, institution_id, patron_name='', class SelfcheckPatronStatus(dict): """Class representing patron information handler response.""" - def __init__(self, patron_id, institution_id, patron_name='', - patron_status=None, language='und', **kwargs): + def __init__( + self, + patron_id, + institution_id, + patron_name="", + patron_status=None, + language="und", + **kwargs, + ): """Constructor. :param patron_id - patron identifier (e.g. id, barcode, ...) @@ -155,12 +171,12 @@ def __init__(self, patron_id, institution_id, patron_name='', :param kwargs - optional fields """ # required properties - self['patron_id'] = patron_id - self['patron_name'] = patron_name - self['patron_status'] = patron_status or PatronStatus() - self['institution_id'] = institution_id - self['language'] = language - self['screen_messages'] = [] + self["patron_id"] = patron_id + self["patron_name"] = patron_name + self["patron_status"] = patron_status or PatronStatus() + self["institution_id"] = institution_id + self["language"] = language + self["screen_messages"] = [] # optional properties for key, value in kwargs.items(): @@ -171,8 +187,15 @@ def __init__(self, patron_id, institution_id, patron_name='', class SelfcheckPatronInformation(dict): """Class representing patron information handler response.""" - def __init__(self, patron_id, institution_id, patron_name='', - patron_status=None, language='und', **kwargs): + def __init__( + self, + patron_id, + institution_id, + patron_name="", + patron_status=None, + language="und", + **kwargs, + ): """Constructor. :param patron_id - patron identifier (e.g. id, barcode, ...) @@ -183,18 +206,18 @@ def __init__(self, patron_id, institution_id, patron_name='', :param kwargs - optional fields """ # required properties - self['patron_id'] = patron_id - self['patron_name'] = patron_name - self['patron_status'] = patron_status or PatronStatus() - self['institution_id'] = institution_id - self['language'] = language - self['hold_items'] = [] - self['overdue_items'] = [] - self['charged_items'] = [] - self['fine_items'] = [] - self['recall_items'] = [] - self['unavailable_hold_items'] = [] - self['screen_messages'] = [] + self["patron_id"] = patron_id + self["patron_name"] = patron_name + self["patron_status"] = patron_status or PatronStatus() + self["institution_id"] = institution_id + self["language"] = language + self["hold_items"] = [] + self["overdue_items"] = [] + self["charged_items"] = [] + self["fine_items"] = [] + self["recall_items"] = [] + self["unavailable_hold_items"] = [] + self["screen_messages"] = [] # optional properties for key, value in kwargs.items(): @@ -204,49 +227,56 @@ def __init__(self, patron_id, institution_id, patron_name='', @property def patron_id(self): """Shortcut for patron pid.""" - return self.get('patron_id') + return self.get("patron_id") @property def patron_name(self): """Shortcut for patron pid.""" - return self.get('patron_name') + return self.get("patron_name") @property def hold_items_count(self): """Shortcut for hold items count.""" - return len(self.get('hold_items', [])) + return len(self.get("hold_items", [])) @property def overdue_items_count(self): """Shortcut for overdue items count.""" - return len(self.get('overdue_items', [])) + return len(self.get("overdue_items", [])) @property def charged_items_count(self): """Shortcut for charged items count.""" - return len(self.get('charged_items', [])) + return len(self.get("charged_items", [])) @property def fine_items_count(self): """Shortcut for fine items count.""" - return len(self.get('fine_items', [])) + return len(self.get("fine_items", [])) @property def recall_items_count(self): """Shortcut for recall items count.""" - return len(self.get('recall_items', [])) + return len(self.get("recall_items", [])) @property def unavailable_items_count(self): """Shortcut for unavailable items count.""" - return len(self.get('unavailable_items', [])) + return len(self.get("unavailable_items", [])) class SelfcheckItemInformation(dict): """Class representing item information handler response.""" - def __init__(self, item_id, title_id=None, circulation_status=None, - fee_type=None, security_marker=None, **kwargs): + def __init__( + self, + item_id, + title_id=None, + circulation_status=None, + fee_type=None, + security_marker=None, + **kwargs, + ): """Constructor. :param patron_id - patron identifier (e.g. id, barcode, ...) @@ -256,14 +286,14 @@ def __init__(self, item_id, title_id=None, circulation_status=None, :param kwargs - optional fields """ # required properties - self['item_id'] = item_id - self['title_id'] = title_id or '' - self['circulation_status'] = circulation_status or \ - SelfcheckCirculationStatus.OTHER - self['fee_type'] = fee_type or SelfcheckFeeType.OTHER - self['security_marker'] = security_marker or \ - SelfcheckSecurityMarkerType.OTHER - self['screen_messages'] = [] + self["item_id"] = item_id + self["title_id"] = title_id or "" + self["circulation_status"] = ( + circulation_status or SelfcheckCirculationStatus.OTHER + ) + self["fee_type"] = fee_type or SelfcheckFeeType.OTHER + self["security_marker"] = security_marker or SelfcheckSecurityMarkerType.OTHER + self["screen_messages"] = [] # optional properties for key, value in kwargs.items(): @@ -274,8 +304,15 @@ def __init__(self, item_id, title_id=None, circulation_status=None, class SelfcheckCheckin(dict): """Class representing checkin handler response.""" - def __init__(self, permanent_location, checkin=False, alert=False, - magnetic_media='unknown', resensitize='unknown', **kwargs): + def __init__( + self, + permanent_location, + checkin=False, + alert=False, + magnetic_media="unknown", + resensitize="unknown", + **kwargs, + ): """Constructor. :param permanent_location - permanent_location of the item @@ -286,12 +323,12 @@ def __init__(self, permanent_location, checkin=False, alert=False, :param kwargs - optional fields """ # required properties - self['checkin'] = checkin - self['alert'] = alert - self['magnetic_media'] = magnetic_media - self['resensitize'] = resensitize - self['permanent_location'] = permanent_location - self['screen_messages'] = [] + self["checkin"] = checkin + self["alert"] = alert + self["magnetic_media"] = magnetic_media + self["resensitize"] = resensitize + self["permanent_location"] = permanent_location + self["screen_messages"] = [] # optional properties for key, value in kwargs.items(): @@ -301,29 +338,36 @@ def __init__(self, permanent_location, checkin=False, alert=False, @property def is_success(self): """Shortcut for checkin.""" - return self.get('checkin') + return self.get("checkin") @property def resensitize(self): """Shortcut for resensitize.""" - return self.get('resensitize') + return self.get("resensitize") @property def has_magnetic_media(self): """Shortcut for desensitize.""" - return self.get('magnetic_media') + return self.get("magnetic_media") @property def sound_alert(self): """Shortcut for alert.""" - return self.get('alert') + return self.get("alert") class SelfcheckCheckout(dict): """Class representing checkout handler response.""" - def __init__(self, title_id, checkout=False, renewal=False, - magnetic_media='unknown', desensitize='unknown', **kwargs): + def __init__( + self, + title_id, + checkout=False, + renewal=False, + magnetic_media="unknown", + desensitize="unknown", + **kwargs, + ): """Constructor. :param title_id - title_id (e.g. title, identifier, ...) @@ -334,12 +378,12 @@ def __init__(self, title_id, checkout=False, renewal=False, :param kwargs - optional fields """ # required properties - self['checkout'] = checkout - self['renewal'] = renewal - self['magnetic_media'] = magnetic_media - self['desensitize'] = desensitize - self['title_id'] = title_id - self['screen_messages'] = [] + self["checkout"] = checkout + self["renewal"] = renewal + self["magnetic_media"] = magnetic_media + self["desensitize"] = desensitize + self["title_id"] = title_id + self["screen_messages"] = [] # optional properties for key, value in kwargs.items(): @@ -349,27 +393,27 @@ def __init__(self, title_id, checkout=False, renewal=False, @property def is_success(self): """Shortcut for checkout ok.""" - return self.get('checkout') + return self.get("checkout") @property def is_renewal(self): """Shortcut for renewal ok.""" - return self.get('renewal') + return self.get("renewal") @property def due_date(self): """Shortcut for due date.""" - return self.get('due_date', '') + return self.get("due_date", "") @property def desensitize(self): """Shortcut for desensitize.""" - return self.get('desensitize') + return self.get("desensitize") @property def has_magnetic_media(self): """Shortcut for desensitize.""" - return self.get('magnetic_media') + return self.get("magnetic_media") class SelfcheckHold(dict): @@ -383,9 +427,9 @@ def __init__(self, hold=False, available=False, **kwargs): :param kwargs - optional fields """ # required properties - self['hold'] = hold - self['available'] = available - self['screen_messages'] = [] + self["hold"] = hold + self["available"] = available + self["screen_messages"] = [] # optional properties for key, value in kwargs.items(): @@ -395,19 +439,26 @@ def __init__(self, hold=False, available=False, **kwargs): @property def is_success(self): """Shortcut for hold ok.""" - return self.get('hold') + return self.get("hold") @property def is_available(self): """Shortcut for available.""" - return self.get('available') + return self.get("available") class SelfcheckRenew(dict): """Class representing renew handler response.""" - def __init__(self, title_id, success=False, renewal=False, - magnetic_media='unknown', desensitize='unknown', **kwargs): + def __init__( + self, + title_id, + success=False, + renewal=False, + magnetic_media="unknown", + desensitize="unknown", + **kwargs, + ): """Constructor. :param title_id: title_id (e.g. title, identifier, ...) @@ -423,13 +474,13 @@ def __init__(self, title_id, success=False, renewal=False, :param kwargs: optional fields """ # required properties - self['success'] = success - self['renewal'] = renewal - self['magnetic_media'] = magnetic_media - self['desensitize'] = desensitize - self['title_id'] = title_id - self['due_date'] = acs_system.sip2_current_date - self['screen_messages'] = [] + self["success"] = success + self["renewal"] = renewal + self["magnetic_media"] = magnetic_media + self["desensitize"] = desensitize + self["title_id"] = title_id + self["due_date"] = acs_system.sip2_current_date + self["screen_messages"] = [] # optional properties for key, value in kwargs.items(): @@ -439,27 +490,27 @@ def __init__(self, title_id, success=False, renewal=False, @property def is_success(self): """Shortcut for success operation.""" - return self.get('success') + return self.get("success") @property def is_renewal(self): """Shortcut for renewal ok.""" - return self.get('renewal') + return self.get("renewal") @property def due_date(self): """Shortcut for due date.""" - return self.get('due_date', '') + return self.get("due_date", "") @property def desensitize(self): """Shortcut for desensitize.""" - return self.get('desensitize') + return self.get("desensitize") @property def has_magnetic_media(self): """Shortcut for desensitize.""" - return self.get('magnetic_media') + return self.get("magnetic_media") class SelfcheckFeePaid(dict): @@ -474,8 +525,8 @@ def __init__(self, accepted=False, **kwargs): :param kwargs: optional fields """ # required properties - self['payment_accepted'] = accepted - self['screen_messages'] = [] + self["payment_accepted"] = accepted + self["screen_messages"] = [] # optional properties for key, value in kwargs.items(): @@ -485,41 +536,41 @@ def __init__(self, accepted=False, **kwargs): @property def is_accepted(self): """Shortcut for payment_accepted operation.""" - return self.get('payment_accepted', False) + return self.get("payment_accepted", False) class SelfcheckLanguage(Enum): """Enum class to list all available language.""" # SIP2 supported Language - UNKNOWN = '000' - ENGLISH = '001' - FRENCH = '002' - GERMAN = '003' - ITALIAN = '004' - DUTCH = '005' - SWEDISH = '006' - FINNISH = '007' - SPANISH = '008' - DANISH = '009' - PORTUGUESE = '010' - CANADIAN_FRENCH = '011' - NORWEGIAN = '012' - HEBREW = '013' - JAPANESE = '014' - RUSSIAN = '015' - ARABIC = '016' - POLISH = '017' - GREEK = '018' - CHINESE = '019' - KOREAN = '020' - NORTH_AMERICAN_SPANISH = '021' - TAMIL = '022' - MALAY = '023' - UNITED_KINGDOM = '024' - ICELANDIC = '025' - BELGIAN = '026' - TAIWANESE = '027' + UNKNOWN = "000" + ENGLISH = "001" + FRENCH = "002" + GERMAN = "003" + ITALIAN = "004" + DUTCH = "005" + SWEDISH = "006" + FINNISH = "007" + SPANISH = "008" + DANISH = "009" + PORTUGUESE = "010" + CANADIAN_FRENCH = "011" + NORWEGIAN = "012" + HEBREW = "013" + JAPANESE = "014" + RUSSIAN = "015" + ARABIC = "016" + POLISH = "017" + GREEK = "018" + CHINESE = "019" + KOREAN = "020" + NORTH_AMERICAN_SPANISH = "021" + TAMIL = "022" + MALAY = "023" + UNITED_KINGDOM = "024" + ICELANDIC = "025" + BELGIAN = "026" + TAIWANESE = "027" # ISO 639-2 common Language mapping und = UNKNOWN @@ -553,83 +604,84 @@ class SelfcheckLanguage(Enum): class SelfcheckSecurityMarkerType(object): """Class to handle all available security marker type.""" - OTHER = '00' - NONE = '01' - TATTLE_TAPE_SECURITY_STRIP = '02' - WHISPHER_TAPE = '03' + OTHER = "00" + NONE = "01" + TATTLE_TAPE_SECURITY_STRIP = "02" + WHISPHER_TAPE = "03" class SelfcheckFeeType(object): """Class to handle all available fee type.""" - OTHER = '01' - ADMINISTRATIVE = '02' - DAMAGE = '03' - OVERDUE = '04' - PROCESSING = '05' - RENTAL = '06' - REPLACEMENT = '07' - COMPUTER_ACCESS_CHARGE = '08' - HOLD_FEE = '09' + OTHER = "01" + ADMINISTRATIVE = "02" + DAMAGE = "03" + OVERDUE = "04" + PROCESSING = "05" + RENTAL = "06" + REPLACEMENT = "07" + COMPUTER_ACCESS_CHARGE = "08" + HOLD_FEE = "09" class SelfcheckPaymentType(object): """Class to handle all available payment type.""" - CASH = '00' - VISA = '01' - CREDIT_CARD = '02' + CASH = "00" + VISA = "01" + CREDIT_CARD = "02" class SelfcheckMediaType(object): """Class to handle all available media type.""" - OTHER = '000' - BOOK = '001' - MAGAZINE = '002' - BOUND_JOURNAL = '003' - AUDIO = '004' - VIDEO = '005' - CD_OR_CDROM = '006' - DISKETTE = '007' - BOOK_WHIT_DISKETTE = '008' - BOOK_WHIT_CD = '009' - BOOK_WHIT_AUDIO_TAPE = '010' + OTHER = "000" + BOOK = "001" + MAGAZINE = "002" + BOUND_JOURNAL = "003" + AUDIO = "004" + VIDEO = "005" + CD_OR_CDROM = "006" + DISKETTE = "007" + BOOK_WHIT_DISKETTE = "008" + BOOK_WHIT_CD = "009" + BOOK_WHIT_AUDIO_TAPE = "010" class SelfcheckCirculationStatus(object): """Class to handle all available circulation status of an item.""" - OTHER = '01' - ON_ORDER = '02' - AVAILABLE = '03' - CHARGED = '04' - CHARGED_RECALL = '05' # not to be recalled until earliest recall date - IN_PROCESS = '06' - RECALLED = '07' - WAITING_ON_HOLD_SHELF = '08' - WAITING_TO_RESHELF = '09' - IN_TRANSIT = '10' - CLAIMED_RETURNED = '11' - LOST = '12' - MISSING = '13' + OTHER = "01" + ON_ORDER = "02" + AVAILABLE = "03" + CHARGED = "04" + CHARGED_RECALL = "05" # not to be recalled until earliest recall date + IN_PROCESS = "06" + RECALLED = "07" + WAITING_ON_HOLD_SHELF = "08" + WAITING_TO_RESHELF = "09" + IN_TRANSIT = "10" + CLAIMED_RETURNED = "11" + LOST = "12" + MISSING = "13" class SelfcheckSummary: """Class representing summary.""" fields = [ - 'hold_items', - 'overdue_items', - 'charged_items', - 'fine_items', - 'recall_items', - 'unavailable_hold_items', + "hold_items", + "overdue_items", + "charged_items", + "fine_items", + "recall_items", + "unavailable_hold_items", ] def __init__(self, text): """Init.""" from .utils import decode_char_to_bool + self.hold_items = decode_char_to_bool(text[0]) self.overdue_items = decode_char_to_bool(text[1]) self.charged_items = decode_char_to_bool(text[2]) diff --git a/invenio_sip2/permissions.py b/invenio_sip2/permissions.py index dac0a11..f02dadf 100644 --- a/invenio_sip2/permissions.py +++ b/invenio_sip2/permissions.py @@ -21,12 +21,12 @@ from flask_login import current_user from invenio_access.permissions import Permission, SystemRoleNeed -admin_user = Permission(SystemRoleNeed('admin')) +admin_user = Permission(SystemRoleNeed("admin")) def deny_all(): """Deny all permission.""" - return type('Deny', (), {'can': lambda self: False})() + return type("Deny", (), {"can": lambda self: False})() def check_permission(permission): @@ -42,7 +42,7 @@ def check_permission(permission): def default_permission_factory(action): """Default api permission factory.""" - is_admin_user = ['api-monitoring'] + is_admin_user = ["api-monitoring"] if action in is_admin_user: return admin_user diff --git a/invenio_sip2/proxies.py b/invenio_sip2/proxies.py index e81c293..3e918db 100644 --- a/invenio_sip2/proxies.py +++ b/invenio_sip2/proxies.py @@ -22,16 +22,10 @@ from flask import current_app from werkzeug.local import LocalProxy -current_sip2 = LocalProxy( - lambda: current_app.extensions['invenio-sip2'] -) +current_sip2 = LocalProxy(lambda: current_app.extensions["invenio-sip2"]) -current_datastore = LocalProxy( - lambda: current_app.extensions['invenio-sip2'].datastore -) +current_datastore = LocalProxy(lambda: current_app.extensions["invenio-sip2"].datastore) """Helper proxy to get the current app sip2 extension.""" -current_logger = LocalProxy( - lambda: logging.getLogger('invenio-sip2') -) +current_logger = LocalProxy(lambda: logging.getLogger("invenio-sip2")) """Helper proxy to get the current logger.""" diff --git a/invenio_sip2/records/__init__.py b/invenio_sip2/records/__init__.py index a3b4f41..404de74 100644 --- a/invenio_sip2/records/__init__.py +++ b/invenio_sip2/records/__init__.py @@ -19,4 +19,4 @@ from invenio_sip2.records.record import Client, Server -__all__ = ('Client', 'Server') +__all__ = ("Client", "Server") diff --git a/invenio_sip2/records/record.py b/invenio_sip2/records/record.py index 41f7b12..0a53aff 100644 --- a/invenio_sip2/records/record.py +++ b/invenio_sip2/records/record.py @@ -50,9 +50,9 @@ def create(cls, data, id_=None, **kwargs): # TODO: check if record already exist and raise exception id_ = id_ or str(uuid4()) - data['id'] = id_ + data["id"] = id_ record = cls(data, **kwargs) - record['created'] = datetime.now(timezone.utc).isoformat() + record["created"] = datetime.now(timezone.utc).isoformat() datastore.add(record, id_=id_, **kwargs) return record @@ -60,14 +60,11 @@ def create(cls, data, id_=None, **kwargs): @property def id(self): """Shortcut for id.""" - return self.get('id', None) + return self.get("id", None) def get_key(self): """Get generated key for Sip2RecordMetadata object.""" - return '{record_type}:{id}'.format( - record_type=self.record_type, - id=self.id - ) + return "{record_type}:{id}".format(record_type=self.record_type, id=self.id) def update(self, data): """Update instance with dictionary data. @@ -76,17 +73,16 @@ def update(self, data): """ if self.id: super(Sip2RecordMetadata, self).update(data) - data['updated'] = datetime.now(timezone.utc).isoformat() + data["updated"] = datetime.now(timezone.utc).isoformat() datastore.update(self) def delete(self): """Delete record by uuid.""" datastore.delete(self) - def search(self, query='*', index_type=None, filter_query=None): + def search(self, query="*", index_type=None, filter_query=None): """Search record by query.""" - return datastore.search( - query, index_type=index_type, filter_query=filter_query) + return datastore.search(query, index_type=index_type, filter_query=filter_query) @classmethod def get_record_by_id(cls, id_): @@ -113,7 +109,7 @@ def dumps(self, **kwargs): class Server(Sip2RecordMetadata): """class for SIP2 server.""" - record_type = 'server' + record_type = "server" @property def number_of_clients(self): @@ -123,7 +119,7 @@ def number_of_clients(self): @property def is_running(self): """Check if server is running.""" - return self.get('status') == 'running' + return self.get("status") == "running" def delete(self): """Delete server and all attached clients.""" @@ -132,30 +128,25 @@ def delete(self): def get_clients(self): """Return clients.""" - filter_query = 'server:{server_id}'.format( - server_id=self.id - ) - return self.search( - index_type=Client.record_type, - filter_query=filter_query - ) + filter_query = "server:{server_id}".format(server_id=self.id) + return self.search(index_type=Client.record_type, filter_query=filter_query) def down(self): """Set server status to `Down` and clear all clients data.""" - self['status'] = 'down' - self['stopped_at'] = datetime.now(timezone.utc).isoformat() + self["status"] = "down" + self["stopped_at"] = datetime.now(timezone.utc).isoformat() with contextlib.suppress(KeyError): - del self['process_id'] + del self["process_id"] self.update(self) # clear all clients self.clear_all_clients() def up(self): """Set server status to `running` and clear all clients data.""" - self['status'] = 'running' - self['started_at'] = datetime.now(timezone.utc).isoformat() + self["status"] = "running" + self["started_at"] = datetime.now(timezone.utc).isoformat() with contextlib.suppress(KeyError): - del self['stopped_at'] + del self["stopped_at"] self.update(self) def clear_all_clients(self): @@ -176,7 +167,7 @@ def create(cls, data, id_=None, **kwargs): # check if server running if server.is_running: raise ServerAlreadyRunning( - 'server already running {id}'.format(id=server.id) + "server already running {id}".format(id=server.id) ) return server @@ -186,7 +177,7 @@ def create(cls, data, id_=None, **kwargs): def find_server(cls, **kwargs): """Find server depending kwargs.""" with contextlib.suppress(KeyError): - del kwargs['process_id'] + del kwargs["process_id"] for server in datastore.all(cls.record_type): if kwargs.items() <= server.items(): # true only if `first` is a subset of `second` @@ -196,20 +187,18 @@ def find_server(cls, **kwargs): class Client(Sip2RecordMetadata): """class for selfcheck client.""" - record_type = 'client' + record_type = "client" def get_key(self): """Get generated key for Client object.""" - return '{record_type}:{id}_server:{server_id}'.format( - record_type=self.record_type, - id=self.id, - server_id=self.server_id + return "{record_type}:{id}_server:{server_id}".format( + record_type=self.record_type, id=self.id, server_id=self.server_id ) @property def server_id(self): """Get server identifier.""" - return self.get('server').get('id') + return self.get("server").get("id") def get_server(self): """Get server object.""" @@ -218,58 +207,58 @@ def get_server(self): @property def remote_app(self): """Shortcut for remote app.""" - return self.get_server().get('remote_app') + return self.get_server().get("remote_app") @property def is_authenticated(self): """Shortcut to check if the selfcheck client is authenticated.""" - return self.get('authenticated', False) + return self.get("authenticated", False) @property def terminal(self): """Shortcut to terminal.""" - return self.get('terminal', self.get('ip_address')) + return self.get("terminal", self.get("ip_address")) @property def transaction_user_id(self): """Shortcut to user id.""" - return self.get('transaction_user_id') + return self.get("transaction_user_id") @property def institution_id(self): """Shortcut to institution id.""" - return self.get('institution_id') + return self.get("institution_id") @property def library_name(self): """Shortcut to library name.""" - return self.get('library_name') + return self.get("library_name") @property def library_language(self): """Shortcut for library language.""" - return self.get('library_language') + return self.get("library_language") def get_current_patron_session(self): """Shortcut to patron session.""" - return self.get('patron_session', None) + return self.get("patron_session", None) def clear_patron_session(self): """Shortcut to library name.""" with contextlib.suppress(KeyError): - del (self['patron_session']) + del self["patron_session"] @property def last_response_message(self): """Shortcut to user id.""" - return self.get('last_response', {}) + return self.get("last_response", {}) @property def last_request_message(self): """Shortcut to user id.""" - return self.get('last_request', {}) + return self.get("last_request", {}) @property def last_sequence_number(self): """Shortcut to user id.""" - return self.last_request_message.get('sequence_number') + return self.last_request_message.get("sequence_number") diff --git a/invenio_sip2/server.py b/invenio_sip2/server.py index ce7e37a..b3db181 100644 --- a/invenio_sip2/server.py +++ b/invenio_sip2/server.py @@ -39,29 +39,29 @@ class SocketServer: selector = selectors.DefaultSelector() - def __init__(self, name, host='0.0.0.0', port=3004, **kwargs): + def __init__(self, name, host="0.0.0.0", port=3004, **kwargs): """Constructor.""" self.server_name = name self.host = host self.port = port - self.remote_app = kwargs.pop('remote') - self.process_id = kwargs.pop('process_id') + self.remote_app = kwargs.pop("remote") + self.process_id = kwargs.pop("process_id") self.server = Server.create(data=vars(self)) - self.server['process_id'] = self.process_id + self.server["process_id"] = self.process_id sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # Avoid bind() exception: OSError: [Errno 48] Address already in use sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) sock.bind((self.host, self.port)) sock.listen() - logger.info('listening on {host}, {port}'.format( - port=self.port, - host=self.host - )) + logger.info( + "listening on {host}, {port}".format(port=self.port, host=self.host) + ) signal.signal(signal.SIGINT, self.handler_stop_signals) signal.signal(signal.SIGTERM, self.handler_stop_signals) sock.setblocking(False) self.selector.register( - sock, selectors.EVENT_READ | selectors.EVENT_WRITE, data=None) + sock, selectors.EVENT_READ | selectors.EVENT_WRITE, data=None + ) def run(self): """Run socket server.""" @@ -77,31 +77,24 @@ def run(self): try: message.process_events(mask) except (UnicodeDecodeError, CommandNotFound) as err: - logger.debug( - err, - exc_info=True - ) + logger.debug(err, exc_info=True) message.close() except RuntimeError as e: logger.debug( - f'message cannot be processed: {e}', - exc_info=True + f"message cannot be processed: {e}", exc_info=True ) message.close() except Exception as ex: logger.error( - f'message cannot be processed: {ex}', - exc_info=True + f"message cannot be processed: {ex}", exc_info=True ) message.close() except Exception as e: logger.error( - 'SIP2 server closed prematurely ({host}, {port}: {msg}'.format( - port=self.port, - host=self.host, - msg=e + "SIP2 server closed prematurely ({host}, {port}: {msg}".format( + port=self.port, host=self.host, msg=e ), - exc_info=True + exc_info=True, ) finally: self.close() @@ -109,13 +102,10 @@ def run(self): def accept_wrapper(self, sock): """Accept connection wrapper.""" connection, address = sock.accept() # Should be ready to read - logger.info('accepted connection from {address}'.format( - address=address - )) + logger.info("accepted connection from {address}".format(address=address)) connection.setblocking(False) - message = SocketEventListener( - self.server, self.selector, connection, address) + message = SocketEventListener(self.server, self.selector, connection, address) self.selector.register(connection, selectors.EVENT_READ, data=message) def close(self): @@ -140,8 +130,8 @@ def __init__(self, server, selector, sock, addr): self.selector = selector self.sock = sock self.addr = addr - self._recv_buffer = b'' - self._send_buffer = b'' + self._recv_buffer = b"" + self._send_buffer = b"" self.request = None self.response = None self.message = None @@ -154,25 +144,23 @@ def __init__(self, server, selector, sock, addr): def dumps(self): """Dumps record.""" data = { - 'server': { - 'id': self.server.id - }, - 'ip_address': self.addr[0], - 'socket': self.addr[1], + "server": {"id": self.server.id}, + "ip_address": self.addr[0], + "socket": self.addr[1], } if self.request: - data['last_request'] = self.request.dumps() + data["last_request"] = self.request.dumps() if self.response: - data['last_response'] = self.response.dumps() + data["last_response"] = self.response.dumps() return data def _set_selector_events_mask(self, mode): """Set selector to listen for events: mode is 'r', 'w', or 'rw'.""" - if mode == 'r': + if mode == "r": events = selectors.EVENT_READ - elif mode == 'w': + elif mode == "w": events = selectors.EVENT_WRITE - elif mode == 'rw': + elif mode == "rw": events = selectors.EVENT_READ | selectors.EVENT_WRITE else: raise ValueError(f"Invalid events mask mode {repr(mode)}.") @@ -188,39 +176,44 @@ def _read(self): pass else: if data: - log_prefix = f'request from {self.client.terminal} ' \ - f'({self.client.get("ip_address")}, ' \ + log_prefix = ( + f"request from {self.client.terminal} " + f'({self.client.get("ip_address")}, ' f'{self.client.get("socket")})' + ) request_msg = data.decode(encoding=self.message_encoding) # strip the line terminator - request_msg = \ - request_msg[:len(request_msg) - len(self.line_terminator)] + request_msg = request_msg[ + : len(request_msg) - len(self.line_terminator) + ] try: self.request = Message(request=request_msg) - request = self.request.dumps() if logger.level == \ - logging.DEBUG else request_msg + request = ( + self.request.dumps() + if logger.level == logging.DEBUG + else request_msg + ) - logger.info(f'{log_prefix}: {request}') + logger.info(f"{log_prefix}: {request}") if self.validate_message(request_msg): self._recv_buffer += data else: logger.error( - f'invalid checksum for: {request_msg}', - exc_info=True + f"invalid checksum for: {request_msg}", exc_info=True ) # prepare request selcheck resend message self.response = Message( - message_type=current_sip2.sip2_message_types - .get_by_command('96') + message_type=current_sip2.sip2_message_types.get_by_command( + "96" + ) ) # Set selector to listen for write events self._set_selector_events_mask("w") except CommandNotFound as e: - raise CommandNotFound( - message=f'{log_prefix} - {e.description}') + raise CommandNotFound(message=f"{log_prefix} - {e.description}") except Exception as err: - logger.info('{log_prefix} - {request_msg}') + logger.info("{log_prefix} - {request_msg}") raise Exception(err) else: raise RuntimeError("Peer closed.") @@ -263,36 +256,37 @@ def write(self): response = self.response.dumps() else: response = str(self.response) - logger.info(f'send to {self.client.terminal} ' - f'({self.client.get("ip_address")}, ' - f'{self.client.get("socket")}): {response}') + logger.info( + f"send to {self.client.terminal} " + f'({self.client.get("ip_address")}, ' + f'{self.client.get("socket")}): {response}' + ) self._write() def close(self): """Close the connection with selfcheck client.""" - logger.info('closing connection to {address}'.format( - address=self.addr - )) + logger.info("closing connection to {address}".format(address=self.addr)) try: self.selector.unregister(self.sock) except Exception as e: current_app.logger.error( - 'error: selector unregistered for {terminal}:{terminal_ip} ' - 'on {server}'.format( + "error: selector unregistered for {terminal}:{terminal_ip} " + "on {server}".format( terminal=self.client.terminal, - terminal_ip=self.client.get('ip_address'), - server=self.server.get('server_name') - ), e + terminal_ip=self.client.get("ip_address"), + server=self.server.get("server_name"), + ), + e, ) try: self.sock.close() except OSError as e: current_app.logger.error( - 'error: socket closing exception for {terminal}:{terminal_ip} ' - 'on {server}'.format( + "error: socket closing exception for {terminal}:{terminal_ip} " + "on {server}".format( terminal=self.client.terminal, - terminal_ip=self.client.get('ip_address'), - server=self.server.get('server_name') + terminal_ip=self.client.get("ip_address"), + server=self.server.get("server_name"), ) ) finally: @@ -302,11 +296,8 @@ def close(self): def process_request(self): """Processing of selfcheck message.""" - self.response = current_sip2.sip2.execute( - self.request, - client=self.client - ) - if self.request.command != '97': + self.response = current_sip2.sip2.execute(self.request, client=self.client) + if self.request.command != "97": self.client.update(self.dumps()) # Set selector to listen for write events, we're done reading. @@ -325,19 +316,22 @@ def validate_message(self, request_msg): if not self.error_detection: if self.request.sequence_number and self.request.checksum: logger.warning( - 'error detection is disabled but the request message ' - 'contains sequence number and checksum: {message}'.format( + "error detection is disabled but the request message " + "contains sequence number and checksum: {message}".format( message=self.request - )) + ) + ) return True if self.request.checksum: - return True \ - if self.request.command == '97' \ - else verify_sequence_number(self.client, self.request) \ + return ( + True + if self.request.command == "97" + else verify_sequence_number(self.client, self.request) and verify_checksum(request_msg) + ) logger.warning( - 'error detection is enabled but the request message ' - 'hasn\'t checksum: {message}'.format( - message=self.request)) + "error detection is enabled but the request message " + "hasn't checksum: {message}".format(message=self.request) + ) return True diff --git a/invenio_sip2/utils.py b/invenio_sip2/utils.py index e049e25..a75b86d 100644 --- a/invenio_sip2/utils.py +++ b/invenio_sip2/utils.py @@ -24,32 +24,36 @@ from flask import current_app from pycountry import languages -from invenio_sip2.models import SelfcheckCirculationStatus, \ - SelfcheckLanguage, SelfcheckMediaType, SelfcheckSecurityMarkerType +from invenio_sip2.models import ( + SelfcheckCirculationStatus, + SelfcheckLanguage, + SelfcheckMediaType, + SelfcheckSecurityMarkerType, +) from invenio_sip2.proxies import current_logger as logger from invenio_sip2.proxies import current_sip2 as acs_system def convert_bool_to_char(value=False): """Convert boolean to SIP2 char representation.""" - return 'Y' if value else 'N' + return "Y" if value else "N" -def convert_to_char(value='unknown'): +def convert_to_char(value="unknown"): """Convert value to SIP2 char representation.""" if isinstance(value, str): - return 'U' - return 'Y' if value else 'N' + return "U" + return "Y" if value else "N" -def decode_char_to_bool(value='N'): +def decode_char_to_bool(value="N"): """Decode SIP2 char representation to boolean.""" - return value == 'Y' + return value == "Y" def parse_circulation_date(date): """Converts a date of string format to a formatted date utc aware.""" - date_format = current_app.config.get('SIP2_CIRCULATION_DATE_FORMAT') + date_format = current_app.config.get("SIP2_CIRCULATION_DATE_FORMAT") try: if isinstance(date, datetime): if date.tzinfo is None: @@ -57,8 +61,8 @@ def parse_circulation_date(date): return date.strftime(date_format) return date_string_to_utc(date).strftime(date_format) except Exception: - logger.warning(f'parse circulation date error for: [{date}]') - return date or '' + logger.warning(f"parse circulation date error for: [{date}]") + return date or "" def date_string_to_utc(date): @@ -94,7 +98,7 @@ def get_security_marker_type(marker_type=None): try: return getattr(SelfcheckSecurityMarkerType, marker_type) except AttributeError: - return current_app.config.get('SIP2_DEFAULT_SECURITY_MARKER') + return current_app.config.get("SIP2_DEFAULT_SECURITY_MARKER") def get_media_type(media_type=None): @@ -121,7 +125,7 @@ def generate_checksum(message): """ # Calculate checksum checksum = sum([b for b in message.encode(acs_system.text_encoding)]) - return format((-checksum & 0xFFFF), 'X') + return format((-checksum & 0xFFFF), "X") def verify_checksum(message_str): @@ -137,7 +141,7 @@ def verify_checksum(message_str): # check minimum length of message # It should be 8 for request ACS resend and 11 for all other messaged - minimum_len = 8 if message_str[:2] == '97' else 11 + minimum_len = 8 if message_str[:2] == "97" else 11 if len(message_str) >= minimum_len: # sum all the byte values of each character in the message including # the checksum identifier @@ -161,8 +165,7 @@ def verify_sequence_number(client, message): # we need to return true in following cases : # 1. there is no last request message # 2. the message type is a resend request message - if not client.last_request_message \ - or message.command == '97': + if not client.last_request_message or message.command == "97": return True # get current sequence from tag AY @@ -170,6 +173,7 @@ def verify_sequence_number(client, message): # get sequence number from last request message last_sequence_number = client.last_sequence_number - return last_sequence_number and \ - (int(sequence)-1 == int(last_sequence_number) or - (int(last_sequence_number) == 9 and int(sequence) == 0)) + return last_sequence_number and ( + int(sequence) - 1 == int(last_sequence_number) + or (int(last_sequence_number) == 9 and int(sequence) == 0) + ) diff --git a/invenio_sip2/version.py b/invenio_sip2/version.py index 104e5c9..1126c06 100644 --- a/invenio_sip2/version.py +++ b/invenio_sip2/version.py @@ -17,4 +17,4 @@ """Version information for Invenio-SIP2.""" -__version__ = '0.6.23' +__version__ = "0.6.23" diff --git a/invenio_sip2/views/__init__.py b/invenio_sip2/views/__init__.py index 12ffd8e..296a1fa 100644 --- a/invenio_sip2/views/__init__.py +++ b/invenio_sip2/views/__init__.py @@ -21,6 +21,6 @@ from invenio_sip2.views.views import blueprint __all__ = ( - 'blueprint', - 'api_blueprint', + "blueprint", + "api_blueprint", ) diff --git a/invenio_sip2/views/rest.py b/invenio_sip2/views/rest.py index bab4965..73965a8 100644 --- a/invenio_sip2/views/rest.py +++ b/invenio_sip2/views/rest.py @@ -22,56 +22,54 @@ from invenio_sip2.decorators import need_permission from invenio_sip2.records import Client, Server -api_blueprint = Blueprint( - 'api_sip2', - __name__, - url_prefix='/monitoring/sip2' -) +api_blueprint = Blueprint("api_sip2", __name__, url_prefix="/monitoring/sip2") -@api_blueprint.route('/status', methods=['GET']) -@need_permission('api-monitoring') +@api_blueprint.route("/status", methods=["GET"]) +@need_permission("api-monitoring") def status(): """Display status for all SIP2 server.""" try: return jsonify(Monitoring.status()) except Exception as error: - return jsonify({'ERROR': str(error)}) + return jsonify({"ERROR": str(error)}) -@api_blueprint.route('/servers', methods=['GET']) -@need_permission('api-monitoring') +@api_blueprint.route("/servers", methods=["GET"]) +@need_permission("api-monitoring") def get_servers(): """Display all running SIP2 servers.""" try: - return jsonify({'servers': Server.get_all_records()}) + return jsonify({"servers": Server.get_all_records()}) except Exception as error: - return jsonify({'ERROR': str(error)}) + return jsonify({"ERROR": str(error)}) -@api_blueprint.route('/servers/', methods=['GET']) -@need_permission('api-monitoring') +@api_blueprint.route("/servers/", methods=["GET"]) +@need_permission("api-monitoring") def get_server(server_id): """Display all running SIP2 servers.""" try: server = Server.get_record_by_id(server_id) - server['clients'] = Monitoring.get_clients_by_server_id(server_id) - return jsonify({ - 'id': server.id, - 'metadata': server, - }) + server["clients"] = Monitoring.get_clients_by_server_id(server_id) + return jsonify( + { + "id": server.id, + "metadata": server, + } + ) except Exception as error: - return jsonify({'ERROR': str(error)}) + return jsonify({"ERROR": str(error)}) -@api_blueprint.route('/clients', methods=['GET']) -@need_permission('api-monitoring') +@api_blueprint.route("/clients", methods=["GET"]) +@need_permission("api-monitoring") def get_clients(): """Display all connected clients to server.""" try: - return jsonify({'clients': Client.get_all_records()}) + return jsonify({"clients": Client.get_all_records()}) except Exception as error: - return jsonify({'ERROR': str(error)}) + return jsonify({"ERROR": str(error)}) class Monitoring: @@ -82,20 +80,21 @@ def status(cls): """Check status for all servers.""" servers = cls.get_servers() result = { - 'servers': len(servers), - 'clients': len(Client.get_all_records()), - 'status': 'green' + "servers": len(servers), + "clients": len(Client.get_all_records()), + "status": "green", } - if result['servers']: + if result["servers"]: info = {} for server in servers: - info[server.id] = {'status': server.get('status')} - info[server.id]['nb_client'] = \ - cls.get_number_client_by_server(server.id) - if info[server.id]['status'] == 'down': - result['status'] = 'red' - result['servers_info'] = info + info[server.id] = {"status": server.get("status")} + info[server.id]["nb_client"] = cls.get_number_client_by_server( + server.id + ) + if info[server.id]["status"] == "down": + result["status"] = "red" + result["servers_info"] = info return result @classmethod diff --git a/invenio_sip2/views/views.py b/invenio_sip2/views/views.py index 633c3e4..fea369a 100644 --- a/invenio_sip2/views/views.py +++ b/invenio_sip2/views/views.py @@ -23,10 +23,10 @@ from invenio_sip2.records import Server blueprint = Blueprint( - 'invenio_sip2', + "invenio_sip2", __name__, - template_folder='../templates', - static_folder='../static', + template_folder="../templates", + static_folder="../static", ) @@ -35,5 +35,6 @@ def monitoring(): """Render a basic view.""" return render_template( "invenio_sip2/monitoring.html", - module_name=_('Invenio-SIP2'), - servers=list(Server.get_all_records())) + module_name=_("Invenio-SIP2"), + servers=list(Server.get_all_records()), + ) diff --git a/poetry.lock b/poetry.lock index 402f5d9..b02d588 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1,46 +1,47 @@ -# This file is automatically @generated by Poetry 1.8.2 and should not be changed by hand. +# This file is automatically @generated by Poetry 2.1.1 and should not be changed by hand. [[package]] name = "alabaster" -version = "0.7.13" -description = "A configurable sidebar-enabled Sphinx theme" +version = "0.7.16" +description = "A light, configurable Sphinx theme" optional = false -python-versions = ">=3.6" +python-versions = ">=3.9" +groups = ["dev"] files = [ - {file = "alabaster-0.7.13-py3-none-any.whl", hash = "sha256:1ee19aca801bbabb5ba3f5f258e4422dfa86f82f3e9cefb0859b283cdd7f62a3"}, - {file = "alabaster-0.7.13.tar.gz", hash = "sha256:a27a4a084d5e690e16e01e03ad2b2e552c61a65469419b907243193de1a84ae2"}, + {file = "alabaster-0.7.16-py3-none-any.whl", hash = "sha256:b46733c07dce03ae4e150330b975c75737fa60f0a7c591b6c8bf4928a28e2c92"}, + {file = "alabaster-0.7.16.tar.gz", hash = "sha256:75a8b99c28a5dad50dd7f8ccdd447a121ddb3892da9e53d1ca5cca3106d58d65"}, ] [[package]] name = "alembic" -version = "1.10.4" +version = "1.14.1" description = "A database migration tool for SQLAlchemy." optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" +groups = ["main"] files = [ - {file = "alembic-1.10.4-py3-none-any.whl", hash = "sha256:43942c3d4bf2620c466b91c0f4fca136fe51ae972394a0cc8b90810d664e4f5c"}, - {file = "alembic-1.10.4.tar.gz", hash = "sha256:295b54bbb92c4008ab6a7dcd1e227e668416d6f84b98b3c4446a2bc6214a556b"}, + {file = "alembic-1.14.1-py3-none-any.whl", hash = "sha256:1acdd7a3a478e208b0503cd73614d5e4c6efafa4e73518bb60e4f2846a37b1c5"}, + {file = "alembic-1.14.1.tar.gz", hash = "sha256:496e888245a53adf1498fcab31713a469c65836f8de76e01399aa1c3e90dd213"}, ] [package.dependencies] -importlib-metadata = {version = "*", markers = "python_version < \"3.9\""} -importlib-resources = {version = "*", markers = "python_version < \"3.9\""} Mako = "*" SQLAlchemy = ">=1.3.0" typing-extensions = ">=4" [package.extras] -tz = ["python-dateutil"] +tz = ["backports.zoneinfo ; python_version < \"3.9\"", "tzdata"] [[package]] name = "amqp" -version = "5.2.0" +version = "5.3.1" description = "Low-level AMQP client for Python (fork of amqplib)." optional = false python-versions = ">=3.6" +groups = ["main"] files = [ - {file = "amqp-5.2.0-py3-none-any.whl", hash = "sha256:827cb12fb0baa892aad844fd95258143bce4027fdac4fccddbc43330fd281637"}, - {file = "amqp-5.2.0.tar.gz", hash = "sha256:a1ecff425ad063ad42a486c902807d1482311481c8ad95a72694b2975e75f7fd"}, + {file = "amqp-5.3.1-py3-none-any.whl", hash = "sha256:43b3319e1b4e7d1251833a93d672b4af1e40f3d632d479b98661a95f117880a2"}, + {file = "amqp-5.3.1.tar.gz", hash = "sha256:cddc00c725449522023bad949f70fff7b48f0b1ade74d170a6f10ab044739432"}, ] [package.dependencies] @@ -48,49 +49,47 @@ vine = ">=5.0.0,<6.0.0" [[package]] name = "async-timeout" -version = "4.0.3" +version = "5.0.1" description = "Timeout context manager for asyncio programs" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" +groups = ["main"] +markers = "python_full_version < \"3.11.3\"" files = [ - {file = "async-timeout-4.0.3.tar.gz", hash = "sha256:4640d96be84d82d02ed59ea2b7105a0f7b33abe8703703cd0ab0bf87c427522f"}, - {file = "async_timeout-4.0.3-py3-none-any.whl", hash = "sha256:7405140ff1230c310e51dc27b3145b9092d659ce68ff733fb0cefe3ee42be028"}, + {file = "async_timeout-5.0.1-py3-none-any.whl", hash = "sha256:39e3809566ff85354557ec2398b55e096c8364bacac9405a7a1fa429e77fe76c"}, + {file = "async_timeout-5.0.1.tar.gz", hash = "sha256:d9321a7a3d5a6a5e187e824d2fa0793ce379a202935782d555d6e9d2735677d3"}, ] -[package.dependencies] -typing-extensions = {version = ">=3.6.5", markers = "python_version < \"3.8\""} - [[package]] name = "attrs" -version = "23.2.0" +version = "25.1.0" description = "Classes Without Boilerplate" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" +groups = ["dev"] files = [ - {file = "attrs-23.2.0-py3-none-any.whl", hash = "sha256:99b87a485a5820b23b879f04c2305b44b951b502fd64be915879d77a7e8fc6f1"}, - {file = "attrs-23.2.0.tar.gz", hash = "sha256:935dc3b529c262f6cf76e50877d35a4bd3c1de194fd41f47a2b7ae8f19971f30"}, + {file = "attrs-25.1.0-py3-none-any.whl", hash = "sha256:c75a69e28a550a7e93789579c22aa26b0f5b83b75dc4e08fe092980051e1090a"}, + {file = "attrs-25.1.0.tar.gz", hash = "sha256:1c97078a80c814273a76b2a298a932eb681c87415c11dee0a6921de7f1b02c3e"}, ] -[package.dependencies] -importlib-metadata = {version = "*", markers = "python_version < \"3.8\""} - [package.extras] -cov = ["attrs[tests]", "coverage[toml] (>=5.3)"] -dev = ["attrs[tests]", "pre-commit"] -docs = ["furo", "myst-parser", "sphinx", "sphinx-notfound-page", "sphinxcontrib-towncrier", "towncrier", "zope-interface"] -tests = ["attrs[tests-no-zope]", "zope-interface"] -tests-mypy = ["mypy (>=1.6)", "pytest-mypy-plugins"] -tests-no-zope = ["attrs[tests-mypy]", "cloudpickle", "hypothesis", "pympler", "pytest (>=4.3.0)", "pytest-xdist[psutil]"] +benchmark = ["cloudpickle ; platform_python_implementation == \"CPython\"", "hypothesis", "mypy (>=1.11.1) ; platform_python_implementation == \"CPython\" and python_version >= \"3.10\"", "pympler", "pytest (>=4.3.0)", "pytest-codspeed", "pytest-mypy-plugins ; platform_python_implementation == \"CPython\" and python_version >= \"3.10\"", "pytest-xdist[psutil]"] +cov = ["cloudpickle ; platform_python_implementation == \"CPython\"", "coverage[toml] (>=5.3)", "hypothesis", "mypy (>=1.11.1) ; platform_python_implementation == \"CPython\" and python_version >= \"3.10\"", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins ; platform_python_implementation == \"CPython\" and python_version >= \"3.10\"", "pytest-xdist[psutil]"] +dev = ["cloudpickle ; platform_python_implementation == \"CPython\"", "hypothesis", "mypy (>=1.11.1) ; platform_python_implementation == \"CPython\" and python_version >= \"3.10\"", "pre-commit-uv", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins ; platform_python_implementation == \"CPython\" and python_version >= \"3.10\"", "pytest-xdist[psutil]"] +docs = ["cogapp", "furo", "myst-parser", "sphinx", "sphinx-notfound-page", "sphinxcontrib-towncrier", "towncrier (<24.7)"] +tests = ["cloudpickle ; platform_python_implementation == \"CPython\"", "hypothesis", "mypy (>=1.11.1) ; platform_python_implementation == \"CPython\" and python_version >= \"3.10\"", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins ; platform_python_implementation == \"CPython\" and python_version >= \"3.10\"", "pytest-xdist[psutil]"] +tests-mypy = ["mypy (>=1.11.1) ; platform_python_implementation == \"CPython\" and python_version >= \"3.10\"", "pytest-mypy-plugins ; platform_python_implementation == \"CPython\" and python_version >= \"3.10\""] [[package]] name = "autoflake" -version = "2.1.1" +version = "2.3.1" description = "Removes unused imports and unused variables" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" +groups = ["dev"] files = [ - {file = "autoflake-2.1.1-py3-none-any.whl", hash = "sha256:94e330a2bcf5ac01384fb2bf98bea60c6383eaa59ea62be486e376622deba985"}, - {file = "autoflake-2.1.1.tar.gz", hash = "sha256:75524b48d42d6537041d91f17573b8a98cb645642f9f05c7fcc68de10b1cade3"}, + {file = "autoflake-2.3.1-py3-none-any.whl", hash = "sha256:3ae7495db9084b7b32818b4140e6dc4fc280b712fb414f5b8fe57b0a8e85a840"}, + {file = "autoflake-2.3.1.tar.gz", hash = "sha256:c98b75dc5b0a86459c4f01a1d32ac7eb4338ec4317a4469515ff1e687ecd909e"}, ] [package.dependencies] @@ -99,64 +98,61 @@ tomli = {version = ">=2.0.1", markers = "python_version < \"3.11\""} [[package]] name = "babel" -version = "2.14.0" +version = "2.17.0" description = "Internationalization utilities" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" +groups = ["main", "dev"] files = [ - {file = "Babel-2.14.0-py3-none-any.whl", hash = "sha256:efb1a25b7118e67ce3a259bed20545c29cb68be8ad2c784c83689981b7a57287"}, - {file = "Babel-2.14.0.tar.gz", hash = "sha256:6919867db036398ba21eb5c7a0f6b28ab8cbc3ae7a73a44ebe34ae74a4e7d363"}, + {file = "babel-2.17.0-py3-none-any.whl", hash = "sha256:4d0b53093fdfb4b21c92b5213dba5a1b23885afa8383709427046b21c366e5f2"}, + {file = "babel-2.17.0.tar.gz", hash = "sha256:0c54cffb19f690cdcc52a3b50bcbf71e07a808d1c80d549f2459b9d2cf0afb9d"}, ] -[package.dependencies] -pytz = {version = ">=2015.7", markers = "python_version < \"3.9\""} - [package.extras] -dev = ["freezegun (>=1.0,<2.0)", "pytest (>=6.0)", "pytest-cov"] +dev = ["backports.zoneinfo ; python_version < \"3.9\"", "freezegun (>=1.0,<2.0)", "jinja2 (>=3.0)", "pytest (>=6.0)", "pytest-cov", "pytz", "setuptools", "tzdata ; sys_platform == \"win32\""] [[package]] name = "billiard" -version = "3.6.4.0" +version = "4.2.1" description = "Python multiprocessing fork with improvements and bugfixes" optional = false -python-versions = "*" +python-versions = ">=3.7" +groups = ["main"] files = [ - {file = "billiard-3.6.4.0-py3-none-any.whl", hash = "sha256:87103ea78fa6ab4d5c751c4909bcff74617d985de7fa8b672cf8618afd5a875b"}, - {file = "billiard-3.6.4.0.tar.gz", hash = "sha256:299de5a8da28a783d51b197d496bef4f1595dd023a93a4f59dde1886ae905547"}, + {file = "billiard-4.2.1-py3-none-any.whl", hash = "sha256:40b59a4ac8806ba2c2369ea98d876bc6108b051c227baffd928c644d15d8f3cb"}, + {file = "billiard-4.2.1.tar.gz", hash = "sha256:12b641b0c539073fc8d3f5b8b7be998956665c4233c7c1fcd66a7e677c4fb36f"}, ] [[package]] name = "black" -version = "23.3.0" +version = "25.1.0" description = "The uncompromising code formatter." optional = false -python-versions = ">=3.7" -files = [ - {file = "black-23.3.0-cp310-cp310-macosx_10_16_arm64.whl", hash = "sha256:0945e13506be58bf7db93ee5853243eb368ace1c08a24c65ce108986eac65915"}, - {file = "black-23.3.0-cp310-cp310-macosx_10_16_universal2.whl", hash = "sha256:67de8d0c209eb5b330cce2469503de11bca4085880d62f1628bd9972cc3366b9"}, - {file = "black-23.3.0-cp310-cp310-macosx_10_16_x86_64.whl", hash = "sha256:7c3eb7cea23904399866c55826b31c1f55bbcd3890ce22ff70466b907b6775c2"}, - {file = "black-23.3.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:32daa9783106c28815d05b724238e30718f34155653d4d6e125dc7daec8e260c"}, - {file = "black-23.3.0-cp310-cp310-win_amd64.whl", hash = "sha256:35d1381d7a22cc5b2be2f72c7dfdae4072a3336060635718cc7e1ede24221d6c"}, - {file = "black-23.3.0-cp311-cp311-macosx_10_16_arm64.whl", hash = "sha256:a8a968125d0a6a404842fa1bf0b349a568634f856aa08ffaff40ae0dfa52e7c6"}, - {file = "black-23.3.0-cp311-cp311-macosx_10_16_universal2.whl", hash = "sha256:c7ab5790333c448903c4b721b59c0d80b11fe5e9803d8703e84dcb8da56fec1b"}, - {file = "black-23.3.0-cp311-cp311-macosx_10_16_x86_64.whl", hash = "sha256:a6f6886c9869d4daae2d1715ce34a19bbc4b95006d20ed785ca00fa03cba312d"}, - {file = "black-23.3.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6f3c333ea1dd6771b2d3777482429864f8e258899f6ff05826c3a4fcc5ce3f70"}, - {file = "black-23.3.0-cp311-cp311-win_amd64.whl", hash = "sha256:11c410f71b876f961d1de77b9699ad19f939094c3a677323f43d7a29855fe326"}, - {file = "black-23.3.0-cp37-cp37m-macosx_10_16_x86_64.whl", hash = "sha256:1d06691f1eb8de91cd1b322f21e3bfc9efe0c7ca1f0e1eb1db44ea367dff656b"}, - {file = "black-23.3.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:50cb33cac881766a5cd9913e10ff75b1e8eb71babf4c7104f2e9c52da1fb7de2"}, - {file = "black-23.3.0-cp37-cp37m-win_amd64.whl", hash = "sha256:e114420bf26b90d4b9daa597351337762b63039752bdf72bf361364c1aa05925"}, - {file = "black-23.3.0-cp38-cp38-macosx_10_16_arm64.whl", hash = "sha256:48f9d345675bb7fbc3dd85821b12487e1b9a75242028adad0333ce36ed2a6d27"}, - {file = "black-23.3.0-cp38-cp38-macosx_10_16_universal2.whl", hash = "sha256:714290490c18fb0126baa0fca0a54ee795f7502b44177e1ce7624ba1c00f2331"}, - {file = "black-23.3.0-cp38-cp38-macosx_10_16_x86_64.whl", hash = "sha256:064101748afa12ad2291c2b91c960be28b817c0c7eaa35bec09cc63aa56493c5"}, - {file = "black-23.3.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:562bd3a70495facf56814293149e51aa1be9931567474993c7942ff7d3533961"}, - {file = "black-23.3.0-cp38-cp38-win_amd64.whl", hash = "sha256:e198cf27888ad6f4ff331ca1c48ffc038848ea9f031a3b40ba36aced7e22f2c8"}, - {file = "black-23.3.0-cp39-cp39-macosx_10_16_arm64.whl", hash = "sha256:3238f2aacf827d18d26db07524e44741233ae09a584273aa059066d644ca7b30"}, - {file = "black-23.3.0-cp39-cp39-macosx_10_16_universal2.whl", hash = "sha256:f0bd2f4a58d6666500542b26354978218a9babcdc972722f4bf90779524515f3"}, - {file = "black-23.3.0-cp39-cp39-macosx_10_16_x86_64.whl", hash = "sha256:92c543f6854c28a3c7f39f4d9b7694f9a6eb9d3c5e2ece488c327b6e7ea9b266"}, - {file = "black-23.3.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3a150542a204124ed00683f0db1f5cf1c2aaaa9cc3495b7a3b5976fb136090ab"}, - {file = "black-23.3.0-cp39-cp39-win_amd64.whl", hash = "sha256:6b39abdfb402002b8a7d030ccc85cf5afff64ee90fa4c5aebc531e3ad0175ddb"}, - {file = "black-23.3.0-py3-none-any.whl", hash = "sha256:ec751418022185b0c1bb7d7736e6933d40bbb14c14a0abcf9123d1b159f98dd4"}, - {file = "black-23.3.0.tar.gz", hash = "sha256:1c7b8d606e728a41ea1ccbd7264677e494e87cf630e399262ced92d4a8dac940"}, +python-versions = ">=3.9" +groups = ["dev"] +files = [ + {file = "black-25.1.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:759e7ec1e050a15f89b770cefbf91ebee8917aac5c20483bc2d80a6c3a04df32"}, + {file = "black-25.1.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:0e519ecf93120f34243e6b0054db49c00a35f84f195d5bce7e9f5cfc578fc2da"}, + {file = "black-25.1.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:055e59b198df7ac0b7efca5ad7ff2516bca343276c466be72eb04a3bcc1f82d7"}, + {file = "black-25.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:db8ea9917d6f8fc62abd90d944920d95e73c83a5ee3383493e35d271aca872e9"}, + {file = "black-25.1.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:a39337598244de4bae26475f77dda852ea00a93bd4c728e09eacd827ec929df0"}, + {file = "black-25.1.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:96c1c7cd856bba8e20094e36e0f948718dc688dba4a9d78c3adde52b9e6c2299"}, + {file = "black-25.1.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:bce2e264d59c91e52d8000d507eb20a9aca4a778731a08cfff7e5ac4a4bb7096"}, + {file = "black-25.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:172b1dbff09f86ce6f4eb8edf9dede08b1fce58ba194c87d7a4f1a5aa2f5b3c2"}, + {file = "black-25.1.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:4b60580e829091e6f9238c848ea6750efed72140b91b048770b64e74fe04908b"}, + {file = "black-25.1.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:1e2978f6df243b155ef5fa7e558a43037c3079093ed5d10fd84c43900f2d8ecc"}, + {file = "black-25.1.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:3b48735872ec535027d979e8dcb20bf4f70b5ac75a8ea99f127c106a7d7aba9f"}, + {file = "black-25.1.0-cp312-cp312-win_amd64.whl", hash = "sha256:ea0213189960bda9cf99be5b8c8ce66bb054af5e9e861249cd23471bd7b0b3ba"}, + {file = "black-25.1.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:8f0b18a02996a836cc9c9c78e5babec10930862827b1b724ddfe98ccf2f2fe4f"}, + {file = "black-25.1.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:afebb7098bfbc70037a053b91ae8437c3857482d3a690fefc03e9ff7aa9a5fd3"}, + {file = "black-25.1.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:030b9759066a4ee5e5aca28c3c77f9c64789cdd4de8ac1df642c40b708be6171"}, + {file = "black-25.1.0-cp313-cp313-win_amd64.whl", hash = "sha256:a22f402b410566e2d1c950708c77ebf5ebd5d0d88a6a2e87c86d9fb48afa0d18"}, + {file = "black-25.1.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:a1ee0a0c330f7b5130ce0caed9936a904793576ef4d2b98c40835d6a65afa6a0"}, + {file = "black-25.1.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:f3df5f1bf91d36002b0a75389ca8663510cf0531cca8aa5c1ef695b46d98655f"}, + {file = "black-25.1.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d9e6827d563a2c820772b32ce8a42828dc6790f095f441beef18f96aa6f8294e"}, + {file = "black-25.1.0-cp39-cp39-win_amd64.whl", hash = "sha256:bacabb307dca5ebaf9c118d2d2f6903da0d62c9faa82bd21a33eecc319559355"}, + {file = "black-25.1.0-py3-none-any.whl", hash = "sha256:95e8176dae143ba9097f351d174fdaf0ccd29efb414b362ae3fd72bf0f710717"}, + {file = "black-25.1.0.tar.gz", hash = "sha256:33496d5cd1222ad73391352b4ae8da15253c5de89b93a80b3e2c8d9a19ec2666"}, ] [package.dependencies] @@ -166,311 +162,314 @@ packaging = ">=22.0" pathspec = ">=0.9.0" platformdirs = ">=2" tomli = {version = ">=1.1.0", markers = "python_version < \"3.11\""} -typed-ast = {version = ">=1.4.2", markers = "python_version < \"3.8\" and implementation_name == \"cpython\""} -typing-extensions = {version = ">=3.10.0.0", markers = "python_version < \"3.10\""} +typing-extensions = {version = ">=4.0.1", markers = "python_version < \"3.11\""} [package.extras] colorama = ["colorama (>=0.4.3)"] -d = ["aiohttp (>=3.7.4)"] +d = ["aiohttp (>=3.10)"] jupyter = ["ipython (>=7.8.0)", "tokenize-rt (>=3.2.0)"] uvloop = ["uvloop (>=0.15.2)"] [[package]] name = "blinker" -version = "1.6.3" +version = "1.9.0" description = "Fast, simple object-to-object and broadcast signaling" optional = false -python-versions = ">=3.7" +python-versions = ">=3.9" +groups = ["main", "dev"] files = [ - {file = "blinker-1.6.3-py3-none-any.whl", hash = "sha256:296320d6c28b006eb5e32d4712202dbcdcbf5dc482da298c2f44881c43884aaa"}, - {file = "blinker-1.6.3.tar.gz", hash = "sha256:152090d27c1c5c722ee7e48504b02d76502811ce02e1523553b4cf8c8b3d3a8d"}, + {file = "blinker-1.9.0-py3-none-any.whl", hash = "sha256:ba0efaa9080b619ff2f3459d1d500c57bddea4a6b424b60a91141db6fd2f08bc"}, + {file = "blinker-1.9.0.tar.gz", hash = "sha256:b4ce2265a7abece45e7cc896e98dbebe6cead56bcf805a3d23136d145f5445bf"}, ] [[package]] name = "build" -version = "1.1.1" +version = "1.2.2.post1" description = "A simple, correct Python build frontend" optional = false -python-versions = ">= 3.7" +python-versions = ">=3.8" +groups = ["dev"] files = [ - {file = "build-1.1.1-py3-none-any.whl", hash = "sha256:8ed0851ee76e6e38adce47e4bee3b51c771d86c64cf578d0c2245567ee200e73"}, - {file = "build-1.1.1.tar.gz", hash = "sha256:8eea65bb45b1aac2e734ba2cc8dad3a6d97d97901a395bd0ed3e7b46953d2a31"}, + {file = "build-1.2.2.post1-py3-none-any.whl", hash = "sha256:1d61c0887fa860c01971625baae8bdd338e517b836a2f70dd1f7aa3a6b2fc5b5"}, + {file = "build-1.2.2.post1.tar.gz", hash = "sha256:b36993e92ca9375a219c99e606a122ff365a760a2d4bba0caa09bd5278b608b7"}, ] [package.dependencies] colorama = {version = "*", markers = "os_name == \"nt\""} importlib-metadata = {version = ">=4.6", markers = "python_full_version < \"3.10.2\""} -packaging = ">=19.0" +packaging = ">=19.1" pyproject_hooks = "*" tomli = {version = ">=1.1.0", markers = "python_version < \"3.11\""} [package.extras] docs = ["furo (>=2023.08.17)", "sphinx (>=7.0,<8.0)", "sphinx-argparse-cli (>=1.5)", "sphinx-autodoc-typehints (>=1.10)", "sphinx-issues (>=3.0.0)"] -test = ["filelock (>=3)", "pytest (>=6.2.4)", "pytest-cov (>=2.12)", "pytest-mock (>=2)", "pytest-rerunfailures (>=9.1)", "pytest-xdist (>=1.34)", "setuptools (>=42.0.0)", "setuptools (>=56.0.0)", "setuptools (>=56.0.0)", "setuptools (>=67.8.0)", "wheel (>=0.36.0)"] -typing = ["importlib-metadata (>=5.1)", "mypy (>=1.5.0,<1.6.0)", "tomli", "typing-extensions (>=3.7.4.3)"] +test = ["build[uv,virtualenv]", "filelock (>=3)", "pytest (>=6.2.4)", "pytest-cov (>=2.12)", "pytest-mock (>=2)", "pytest-rerunfailures (>=9.1)", "pytest-xdist (>=1.34)", "setuptools (>=42.0.0) ; python_version < \"3.10\"", "setuptools (>=56.0.0) ; python_version == \"3.10\"", "setuptools (>=56.0.0) ; python_version == \"3.11\"", "setuptools (>=67.8.0) ; python_version >= \"3.12\"", "wheel (>=0.36.0)"] +typing = ["build[uv]", "importlib-metadata (>=5.1)", "mypy (>=1.9.0,<1.10.0)", "tomli", "typing-extensions (>=3.7.4.3)"] +uv = ["uv (>=0.1.18)"] virtualenv = ["virtualenv (>=20.0.35)"] -[[package]] -name = "cached-property" -version = "1.5.2" -description = "A decorator for caching properties in classes." -optional = false -python-versions = "*" -files = [ - {file = "cached-property-1.5.2.tar.gz", hash = "sha256:9fa5755838eecbb2d234c3aa390bd80fbd3ac6b6869109bfc1b499f7bd89a130"}, - {file = "cached_property-1.5.2-py2.py3-none-any.whl", hash = "sha256:df4f613cf7ad9a588cc381aaf4a512d26265ecebd5eb9e1ba12f1319eb85a6a0"}, -] - [[package]] name = "celery" -version = "5.2.7" +version = "5.4.0" description = "Distributed Task Queue." optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" +groups = ["main"] files = [ - {file = "celery-5.2.7-py3-none-any.whl", hash = "sha256:138420c020cd58d6707e6257b6beda91fd39af7afde5d36c6334d175302c0e14"}, - {file = "celery-5.2.7.tar.gz", hash = "sha256:fafbd82934d30f8a004f81e8f7a062e31413a23d444be8ee3326553915958c6d"}, + {file = "celery-5.4.0-py3-none-any.whl", hash = "sha256:369631eb580cf8c51a82721ec538684994f8277637edde2dfc0dacd73ed97f64"}, + {file = "celery-5.4.0.tar.gz", hash = "sha256:504a19140e8d3029d5acad88330c541d4c3f64c789d85f94756762d8bca7e706"}, ] [package.dependencies] -billiard = ">=3.6.4.0,<4.0" -click = ">=8.0.3,<9.0" -click-didyoumean = ">=0.0.3" +billiard = ">=4.2.0,<5.0" +click = ">=8.1.2,<9.0" +click-didyoumean = ">=0.3.0" click-plugins = ">=1.1.1" click-repl = ">=0.2.0" -importlib-metadata = {version = ">=1.4.0", markers = "python_version < \"3.8\""} -kombu = ">=5.2.3,<6.0" -pytz = ">=2021.3" -vine = ">=5.0.0,<6.0" - -[package.extras] -arangodb = ["pyArango (>=1.3.2)"] -auth = ["cryptography"] -azureblockblob = ["azure-storage-blob (==12.9.0)"] -brotli = ["brotli (>=1.0.0)", "brotlipy (>=0.7.0)"] -cassandra = ["cassandra-driver (<3.21.0)"] -consul = ["python-consul2"] -cosmosdbsql = ["pydocumentdb (==2.3.2)"] -couchbase = ["couchbase (>=3.0.0)"] -couchdb = ["pycouchdb"] -django = ["Django (>=1.11)"] -dynamodb = ["boto3 (>=1.9.178)"] -elasticsearch = ["elasticsearch"] -eventlet = ["eventlet (>=0.32.0)"] +kombu = ">=5.3.4,<6.0" +python-dateutil = ">=2.8.2" +tzdata = ">=2022.7" +vine = ">=5.1.0,<6.0" + +[package.extras] +arangodb = ["pyArango (>=2.0.2)"] +auth = ["cryptography (==42.0.5)"] +azureblockblob = ["azure-storage-blob (>=12.15.0)"] +brotli = ["brotli (>=1.0.0) ; platform_python_implementation == \"CPython\"", "brotlipy (>=0.7.0) ; platform_python_implementation == \"PyPy\""] +cassandra = ["cassandra-driver (>=3.25.0,<4)"] +consul = ["python-consul2 (==0.1.5)"] +cosmosdbsql = ["pydocumentdb (==2.3.5)"] +couchbase = ["couchbase (>=3.0.0) ; platform_python_implementation != \"PyPy\" and (platform_system != \"Windows\" or python_version < \"3.10\")"] +couchdb = ["pycouchdb (==1.14.2)"] +django = ["Django (>=2.2.28)"] +dynamodb = ["boto3 (>=1.26.143)"] +elasticsearch = ["elastic-transport (<=8.13.0)", "elasticsearch (<=8.13.0)"] +eventlet = ["eventlet (>=0.32.0) ; python_version < \"3.10\""] +gcs = ["google-cloud-storage (>=2.10.0)"] gevent = ["gevent (>=1.5.0)"] -librabbitmq = ["librabbitmq (>=1.5.0)"] -memcache = ["pylibmc"] -mongodb = ["pymongo[srv] (>=3.11.1)"] -msgpack = ["msgpack"] -pymemcache = ["python-memcached"] -pyro = ["pyro4"] -pytest = ["pytest-celery"] -redis = ["redis (>=3.4.1,!=4.0.0,!=4.0.1)"] -s3 = ["boto3 (>=1.9.125)"] +librabbitmq = ["librabbitmq (>=2.0.0) ; python_version < \"3.11\""] +memcache = ["pylibmc (==1.6.3) ; platform_system != \"Windows\""] +mongodb = ["pymongo[srv] (>=4.0.2)"] +msgpack = ["msgpack (==1.0.8)"] +pymemcache = ["python-memcached (>=1.61)"] +pyro = ["pyro4 (==4.82) ; python_version < \"3.11\""] +pytest = ["pytest-celery[all] (>=1.0.0)"] +redis = ["redis (>=4.5.2,!=4.5.5,<6.0.0)"] +s3 = ["boto3 (>=1.26.143)"] slmq = ["softlayer-messaging (>=1.0.3)"] -solar = ["ephem"] -sqlalchemy = ["sqlalchemy"] -sqs = ["kombu[sqs]"] -tblib = ["tblib (>=1.3.0)", "tblib (>=1.5.0)"] +solar = ["ephem (==4.1.5) ; platform_python_implementation != \"PyPy\""] +sqlalchemy = ["sqlalchemy (>=1.4.48,<2.1)"] +sqs = ["boto3 (>=1.26.143)", "kombu[sqs] (>=5.3.4)", "pycurl (>=7.43.0.5) ; sys_platform != \"win32\" and platform_python_implementation == \"CPython\"", "urllib3 (>=1.26.16)"] +tblib = ["tblib (>=1.3.0) ; python_version < \"3.8.0\"", "tblib (>=1.5.0) ; python_version >= \"3.8.0\""] yaml = ["PyYAML (>=3.10)"] zookeeper = ["kazoo (>=1.3.1)"] -zstd = ["zstandard"] +zstd = ["zstandard (==0.22.0)"] [[package]] name = "certifi" -version = "2024.2.2" +version = "2025.1.31" description = "Python package for providing Mozilla's CA Bundle." optional = false python-versions = ">=3.6" +groups = ["dev"] files = [ - {file = "certifi-2024.2.2-py3-none-any.whl", hash = "sha256:dc383c07b76109f368f6106eee2b593b04a011ea4d55f652c6ca24a754d1cdd1"}, - {file = "certifi-2024.2.2.tar.gz", hash = "sha256:0569859f95fc761b18b45ef421b1290a0f65f147e92a1e5eb3e635f9a5e4e66f"}, + {file = "certifi-2025.1.31-py3-none-any.whl", hash = "sha256:ca78db4565a652026a4db2bcdf68f2fb589ea80d0be70e03929ed730746b84fe"}, + {file = "certifi-2025.1.31.tar.gz", hash = "sha256:3d5da6925056f6f18f119200434a4780a94263f10d1c21d032a6f6b2baa20651"}, ] [[package]] name = "cffi" -version = "1.15.1" +version = "1.17.1" description = "Foreign Function Interface for Python calling C code." optional = false -python-versions = "*" -files = [ - {file = "cffi-1.15.1-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:a66d3508133af6e8548451b25058d5812812ec3798c886bf38ed24a98216fab2"}, - {file = "cffi-1.15.1-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:470c103ae716238bbe698d67ad020e1db9d9dba34fa5a899b5e21577e6d52ed2"}, - {file = "cffi-1.15.1-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:9ad5db27f9cabae298d151c85cf2bad1d359a1b9c686a275df03385758e2f914"}, - {file = "cffi-1.15.1-cp27-cp27m-win32.whl", hash = "sha256:b3bbeb01c2b273cca1e1e0c5df57f12dce9a4dd331b4fa1635b8bec26350bde3"}, - {file = "cffi-1.15.1-cp27-cp27m-win_amd64.whl", hash = "sha256:e00b098126fd45523dd056d2efba6c5a63b71ffe9f2bbe1a4fe1716e1d0c331e"}, - {file = "cffi-1.15.1-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:d61f4695e6c866a23a21acab0509af1cdfd2c013cf256bbf5b6b5e2695827162"}, - {file = "cffi-1.15.1-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:ed9cb427ba5504c1dc15ede7d516b84757c3e3d7868ccc85121d9310d27eed0b"}, - {file = "cffi-1.15.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:39d39875251ca8f612b6f33e6b1195af86d1b3e60086068be9cc053aa4376e21"}, - {file = "cffi-1.15.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:285d29981935eb726a4399badae8f0ffdff4f5050eaa6d0cfc3f64b857b77185"}, - {file = "cffi-1.15.1-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3eb6971dcff08619f8d91607cfc726518b6fa2a9eba42856be181c6d0d9515fd"}, - {file = "cffi-1.15.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:21157295583fe8943475029ed5abdcf71eb3911894724e360acff1d61c1d54bc"}, - {file = "cffi-1.15.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5635bd9cb9731e6d4a1132a498dd34f764034a8ce60cef4f5319c0541159392f"}, - {file = "cffi-1.15.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2012c72d854c2d03e45d06ae57f40d78e5770d252f195b93f581acf3ba44496e"}, - {file = "cffi-1.15.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd86c085fae2efd48ac91dd7ccffcfc0571387fe1193d33b6394db7ef31fe2a4"}, - {file = "cffi-1.15.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:fa6693661a4c91757f4412306191b6dc88c1703f780c8234035eac011922bc01"}, - {file = "cffi-1.15.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:59c0b02d0a6c384d453fece7566d1c7e6b7bae4fc5874ef2ef46d56776d61c9e"}, - {file = "cffi-1.15.1-cp310-cp310-win32.whl", hash = "sha256:cba9d6b9a7d64d4bd46167096fc9d2f835e25d7e4c121fb2ddfc6528fb0413b2"}, - {file = "cffi-1.15.1-cp310-cp310-win_amd64.whl", hash = "sha256:ce4bcc037df4fc5e3d184794f27bdaab018943698f4ca31630bc7f84a7b69c6d"}, - {file = "cffi-1.15.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3d08afd128ddaa624a48cf2b859afef385b720bb4b43df214f85616922e6a5ac"}, - {file = "cffi-1.15.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:3799aecf2e17cf585d977b780ce79ff0dc9b78d799fc694221ce814c2c19db83"}, - {file = "cffi-1.15.1-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a591fe9e525846e4d154205572a029f653ada1a78b93697f3b5a8f1f2bc055b9"}, - {file = "cffi-1.15.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3548db281cd7d2561c9ad9984681c95f7b0e38881201e157833a2342c30d5e8c"}, - {file = "cffi-1.15.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:91fc98adde3d7881af9b59ed0294046f3806221863722ba7d8d120c575314325"}, - {file = "cffi-1.15.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:94411f22c3985acaec6f83c6df553f2dbe17b698cc7f8ae751ff2237d96b9e3c"}, - {file = "cffi-1.15.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:03425bdae262c76aad70202debd780501fabeaca237cdfddc008987c0e0f59ef"}, - {file = "cffi-1.15.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:cc4d65aeeaa04136a12677d3dd0b1c0c94dc43abac5860ab33cceb42b801c1e8"}, - {file = "cffi-1.15.1-cp311-cp311-win32.whl", hash = "sha256:a0f100c8912c114ff53e1202d0078b425bee3649ae34d7b070e9697f93c5d52d"}, - {file = "cffi-1.15.1-cp311-cp311-win_amd64.whl", hash = "sha256:04ed324bda3cda42b9b695d51bb7d54b680b9719cfab04227cdd1e04e5de3104"}, - {file = "cffi-1.15.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:50a74364d85fd319352182ef59c5c790484a336f6db772c1a9231f1c3ed0cbd7"}, - {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e263d77ee3dd201c3a142934a086a4450861778baaeeb45db4591ef65550b0a6"}, - {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:cec7d9412a9102bdc577382c3929b337320c4c4c4849f2c5cdd14d7368c5562d"}, - {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4289fc34b2f5316fbb762d75362931e351941fa95fa18789191b33fc4cf9504a"}, - {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:173379135477dc8cac4bc58f45db08ab45d228b3363adb7af79436135d028405"}, - {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:6975a3fac6bc83c4a65c9f9fcab9e47019a11d3d2cf7f3c0d03431bf145a941e"}, - {file = "cffi-1.15.1-cp36-cp36m-win32.whl", hash = "sha256:2470043b93ff09bf8fb1d46d1cb756ce6132c54826661a32d4e4d132e1977adf"}, - {file = "cffi-1.15.1-cp36-cp36m-win_amd64.whl", hash = "sha256:30d78fbc8ebf9c92c9b7823ee18eb92f2e6ef79b45ac84db507f52fbe3ec4497"}, - {file = "cffi-1.15.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:198caafb44239b60e252492445da556afafc7d1e3ab7a1fb3f0584ef6d742375"}, - {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5ef34d190326c3b1f822a5b7a45f6c4535e2f47ed06fec77d3d799c450b2651e"}, - {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8102eaf27e1e448db915d08afa8b41d6c7ca7a04b7d73af6514df10a3e74bd82"}, - {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5df2768244d19ab7f60546d0c7c63ce1581f7af8b5de3eb3004b9b6fc8a9f84b"}, - {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a8c4917bd7ad33e8eb21e9a5bbba979b49d9a97acb3a803092cbc1133e20343c"}, - {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0e2642fe3142e4cc4af0799748233ad6da94c62a8bec3a6648bf8ee68b1c7426"}, - {file = "cffi-1.15.1-cp37-cp37m-win32.whl", hash = "sha256:e229a521186c75c8ad9490854fd8bbdd9a0c9aa3a524326b55be83b54d4e0ad9"}, - {file = "cffi-1.15.1-cp37-cp37m-win_amd64.whl", hash = "sha256:a0b71b1b8fbf2b96e41c4d990244165e2c9be83d54962a9a1d118fd8657d2045"}, - {file = "cffi-1.15.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:320dab6e7cb2eacdf0e658569d2575c4dad258c0fcc794f46215e1e39f90f2c3"}, - {file = "cffi-1.15.1-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1e74c6b51a9ed6589199c787bf5f9875612ca4a8a0785fb2d4a84429badaf22a"}, - {file = "cffi-1.15.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a5c84c68147988265e60416b57fc83425a78058853509c1b0629c180094904a5"}, - {file = "cffi-1.15.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3b926aa83d1edb5aa5b427b4053dc420ec295a08e40911296b9eb1b6170f6cca"}, - {file = "cffi-1.15.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:87c450779d0914f2861b8526e035c5e6da0a3199d8f1add1a665e1cbc6fc6d02"}, - {file = "cffi-1.15.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4f2c9f67e9821cad2e5f480bc8d83b8742896f1242dba247911072d4fa94c192"}, - {file = "cffi-1.15.1-cp38-cp38-win32.whl", hash = "sha256:8b7ee99e510d7b66cdb6c593f21c043c248537a32e0bedf02e01e9553a172314"}, - {file = "cffi-1.15.1-cp38-cp38-win_amd64.whl", hash = "sha256:00a9ed42e88df81ffae7a8ab6d9356b371399b91dbdf0c3cb1e84c03a13aceb5"}, - {file = "cffi-1.15.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:54a2db7b78338edd780e7ef7f9f6c442500fb0d41a5a4ea24fff1c929d5af585"}, - {file = "cffi-1.15.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:fcd131dd944808b5bdb38e6f5b53013c5aa4f334c5cad0c72742f6eba4b73db0"}, - {file = "cffi-1.15.1-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7473e861101c9e72452f9bf8acb984947aa1661a7704553a9f6e4baa5ba64415"}, - {file = "cffi-1.15.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6c9a799e985904922a4d207a94eae35c78ebae90e128f0c4e521ce339396be9d"}, - {file = "cffi-1.15.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3bcde07039e586f91b45c88f8583ea7cf7a0770df3a1649627bf598332cb6984"}, - {file = "cffi-1.15.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:33ab79603146aace82c2427da5ca6e58f2b3f2fb5da893ceac0c42218a40be35"}, - {file = "cffi-1.15.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5d598b938678ebf3c67377cdd45e09d431369c3b1a5b331058c338e201f12b27"}, - {file = "cffi-1.15.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:db0fbb9c62743ce59a9ff687eb5f4afbe77e5e8403d6697f7446e5f609976f76"}, - {file = "cffi-1.15.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:98d85c6a2bef81588d9227dde12db8a7f47f639f4a17c9ae08e773aa9c697bf3"}, - {file = "cffi-1.15.1-cp39-cp39-win32.whl", hash = "sha256:40f4774f5a9d4f5e344f31a32b5096977b5d48560c5592e2f3d2c4374bd543ee"}, - {file = "cffi-1.15.1-cp39-cp39-win_amd64.whl", hash = "sha256:70df4e3b545a17496c9b3f41f5115e69a4f2e77e94e1d2a8e1070bc0c38c8a3c"}, - {file = "cffi-1.15.1.tar.gz", hash = "sha256:d400bfb9a37b1351253cb402671cea7e89bdecc294e8016a707f6d1d8ac934f9"}, -] +python-versions = ">=3.8" +groups = ["main", "dev"] +files = [ + {file = "cffi-1.17.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:df8b1c11f177bc2313ec4b2d46baec87a5f3e71fc8b45dab2ee7cae86d9aba14"}, + {file = "cffi-1.17.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8f2cdc858323644ab277e9bb925ad72ae0e67f69e804f4898c070998d50b1a67"}, + {file = "cffi-1.17.1-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:edae79245293e15384b51f88b00613ba9f7198016a5948b5dddf4917d4d26382"}, + {file = "cffi-1.17.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:45398b671ac6d70e67da8e4224a065cec6a93541bb7aebe1b198a61b58c7b702"}, + {file = "cffi-1.17.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ad9413ccdeda48c5afdae7e4fa2192157e991ff761e7ab8fdd8926f40b160cc3"}, + {file = "cffi-1.17.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5da5719280082ac6bd9aa7becb3938dc9f9cbd57fac7d2871717b1feb0902ab6"}, + {file = "cffi-1.17.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2bb1a08b8008b281856e5971307cc386a8e9c5b625ac297e853d36da6efe9c17"}, + {file = "cffi-1.17.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:045d61c734659cc045141be4bae381a41d89b741f795af1dd018bfb532fd0df8"}, + {file = "cffi-1.17.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:6883e737d7d9e4899a8a695e00ec36bd4e5e4f18fabe0aca0efe0a4b44cdb13e"}, + {file = "cffi-1.17.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:6b8b4a92e1c65048ff98cfe1f735ef8f1ceb72e3d5f0c25fdb12087a23da22be"}, + {file = "cffi-1.17.1-cp310-cp310-win32.whl", hash = "sha256:c9c3d058ebabb74db66e431095118094d06abf53284d9c81f27300d0e0d8bc7c"}, + {file = "cffi-1.17.1-cp310-cp310-win_amd64.whl", hash = "sha256:0f048dcf80db46f0098ccac01132761580d28e28bc0f78ae0d58048063317e15"}, + {file = "cffi-1.17.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:a45e3c6913c5b87b3ff120dcdc03f6131fa0065027d0ed7ee6190736a74cd401"}, + {file = "cffi-1.17.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:30c5e0cb5ae493c04c8b42916e52ca38079f1b235c2f8ae5f4527b963c401caf"}, + {file = "cffi-1.17.1-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f75c7ab1f9e4aca5414ed4d8e5c0e303a34f4421f8a0d47a4d019ceff0ab6af4"}, + {file = "cffi-1.17.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a1ed2dd2972641495a3ec98445e09766f077aee98a1c896dcb4ad0d303628e41"}, + {file = "cffi-1.17.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:46bf43160c1a35f7ec506d254e5c890f3c03648a4dbac12d624e4490a7046cd1"}, + {file = "cffi-1.17.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a24ed04c8ffd54b0729c07cee15a81d964e6fee0e3d4d342a27b020d22959dc6"}, + {file = "cffi-1.17.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:610faea79c43e44c71e1ec53a554553fa22321b65fae24889706c0a84d4ad86d"}, + {file = "cffi-1.17.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:a9b15d491f3ad5d692e11f6b71f7857e7835eb677955c00cc0aefcd0669adaf6"}, + {file = "cffi-1.17.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:de2ea4b5833625383e464549fec1bc395c1bdeeb5f25c4a3a82b5a8c756ec22f"}, + {file = "cffi-1.17.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:fc48c783f9c87e60831201f2cce7f3b2e4846bf4d8728eabe54d60700b318a0b"}, + {file = "cffi-1.17.1-cp311-cp311-win32.whl", hash = "sha256:85a950a4ac9c359340d5963966e3e0a94a676bd6245a4b55bc43949eee26a655"}, + {file = "cffi-1.17.1-cp311-cp311-win_amd64.whl", hash = "sha256:caaf0640ef5f5517f49bc275eca1406b0ffa6aa184892812030f04c2abf589a0"}, + {file = "cffi-1.17.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:805b4371bf7197c329fcb3ead37e710d1bca9da5d583f5073b799d5c5bd1eee4"}, + {file = "cffi-1.17.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:733e99bc2df47476e3848417c5a4540522f234dfd4ef3ab7fafdf555b082ec0c"}, + {file = "cffi-1.17.1-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1257bdabf294dceb59f5e70c64a3e2f462c30c7ad68092d01bbbfb1c16b1ba36"}, + {file = "cffi-1.17.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:da95af8214998d77a98cc14e3a3bd00aa191526343078b530ceb0bd710fb48a5"}, + {file = "cffi-1.17.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d63afe322132c194cf832bfec0dc69a99fb9bb6bbd550f161a49e9e855cc78ff"}, + {file = "cffi-1.17.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f79fc4fc25f1c8698ff97788206bb3c2598949bfe0fef03d299eb1b5356ada99"}, + {file = "cffi-1.17.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b62ce867176a75d03a665bad002af8e6d54644fad99a3c70905c543130e39d93"}, + {file = "cffi-1.17.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:386c8bf53c502fff58903061338ce4f4950cbdcb23e2902d86c0f722b786bbe3"}, + {file = "cffi-1.17.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:4ceb10419a9adf4460ea14cfd6bc43d08701f0835e979bf821052f1805850fe8"}, + {file = "cffi-1.17.1-cp312-cp312-win32.whl", hash = "sha256:a08d7e755f8ed21095a310a693525137cfe756ce62d066e53f502a83dc550f65"}, + {file = "cffi-1.17.1-cp312-cp312-win_amd64.whl", hash = "sha256:51392eae71afec0d0c8fb1a53b204dbb3bcabcb3c9b807eedf3e1e6ccf2de903"}, + {file = "cffi-1.17.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f3a2b4222ce6b60e2e8b337bb9596923045681d71e5a082783484d845390938e"}, + {file = "cffi-1.17.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:0984a4925a435b1da406122d4d7968dd861c1385afe3b45ba82b750f229811e2"}, + {file = "cffi-1.17.1-cp313-cp313-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d01b12eeeb4427d3110de311e1774046ad344f5b1a7403101878976ecd7a10f3"}, + {file = "cffi-1.17.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:706510fe141c86a69c8ddc029c7910003a17353970cff3b904ff0686a5927683"}, + {file = "cffi-1.17.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:de55b766c7aa2e2a3092c51e0483d700341182f08e67c63630d5b6f200bb28e5"}, + {file = "cffi-1.17.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c59d6e989d07460165cc5ad3c61f9fd8f1b4796eacbd81cee78957842b834af4"}, + {file = "cffi-1.17.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd398dbc6773384a17fe0d3e7eeb8d1a21c2200473ee6806bb5e6a8e62bb73dd"}, + {file = "cffi-1.17.1-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:3edc8d958eb099c634dace3c7e16560ae474aa3803a5df240542b305d14e14ed"}, + {file = "cffi-1.17.1-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:72e72408cad3d5419375fc87d289076ee319835bdfa2caad331e377589aebba9"}, + {file = "cffi-1.17.1-cp313-cp313-win32.whl", hash = "sha256:e03eab0a8677fa80d646b5ddece1cbeaf556c313dcfac435ba11f107ba117b5d"}, + {file = "cffi-1.17.1-cp313-cp313-win_amd64.whl", hash = "sha256:f6a16c31041f09ead72d69f583767292f750d24913dadacf5756b966aacb3f1a"}, + {file = "cffi-1.17.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:636062ea65bd0195bc012fea9321aca499c0504409f413dc88af450b57ffd03b"}, + {file = "cffi-1.17.1-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c7eac2ef9b63c79431bc4b25f1cd649d7f061a28808cbc6c47b534bd789ef964"}, + {file = "cffi-1.17.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e221cf152cff04059d011ee126477f0d9588303eb57e88923578ace7baad17f9"}, + {file = "cffi-1.17.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:31000ec67d4221a71bd3f67df918b1f88f676f1c3b535a7eb473255fdc0b83fc"}, + {file = "cffi-1.17.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6f17be4345073b0a7b8ea599688f692ac3ef23ce28e5df79c04de519dbc4912c"}, + {file = "cffi-1.17.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0e2b1fac190ae3ebfe37b979cc1ce69c81f4e4fe5746bb401dca63a9062cdaf1"}, + {file = "cffi-1.17.1-cp38-cp38-win32.whl", hash = "sha256:7596d6620d3fa590f677e9ee430df2958d2d6d6de2feeae5b20e82c00b76fbf8"}, + {file = "cffi-1.17.1-cp38-cp38-win_amd64.whl", hash = "sha256:78122be759c3f8a014ce010908ae03364d00a1f81ab5c7f4a7a5120607ea56e1"}, + {file = "cffi-1.17.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b2ab587605f4ba0bf81dc0cb08a41bd1c0a5906bd59243d56bad7668a6fc6c16"}, + {file = "cffi-1.17.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:28b16024becceed8c6dfbc75629e27788d8a3f9030691a1dbf9821a128b22c36"}, + {file = "cffi-1.17.1-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1d599671f396c4723d016dbddb72fe8e0397082b0a77a4fab8028923bec050e8"}, + {file = "cffi-1.17.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ca74b8dbe6e8e8263c0ffd60277de77dcee6c837a3d0881d8c1ead7268c9e576"}, + {file = "cffi-1.17.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f7f5baafcc48261359e14bcd6d9bff6d4b28d9103847c9e136694cb0501aef87"}, + {file = "cffi-1.17.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:98e3969bcff97cae1b2def8ba499ea3d6f31ddfdb7635374834cf89a1a08ecf0"}, + {file = "cffi-1.17.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cdf5ce3acdfd1661132f2a9c19cac174758dc2352bfe37d98aa7512c6b7178b3"}, + {file = "cffi-1.17.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:9755e4345d1ec879e3849e62222a18c7174d65a6a92d5b346b1863912168b595"}, + {file = "cffi-1.17.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:f1e22e8c4419538cb197e4dd60acc919d7696e5ef98ee4da4e01d3f8cfa4cc5a"}, + {file = "cffi-1.17.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:c03e868a0b3bc35839ba98e74211ed2b05d2119be4e8a0f224fba9384f1fe02e"}, + {file = "cffi-1.17.1-cp39-cp39-win32.whl", hash = "sha256:e31ae45bc2e29f6b2abd0de1cc3b9d5205aa847cafaecb8af1476a609a2f6eb7"}, + {file = "cffi-1.17.1-cp39-cp39-win_amd64.whl", hash = "sha256:d016c76bdd850f3c626af19b0542c9677ba156e4ee4fccfdd7848803533ef662"}, + {file = "cffi-1.17.1.tar.gz", hash = "sha256:1c39c6016c32bc48dd54561950ebd6836e1670f2ae46128f67cf49e789c52824"}, +] +markers = {main = "platform_python_implementation != \"PyPy\"", dev = "os_name == \"nt\" and implementation_name != \"pypy\""} [package.dependencies] pycparser = "*" [[package]] name = "charset-normalizer" -version = "3.3.2" +version = "3.4.1" description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." optional = false -python-versions = ">=3.7.0" -files = [ - {file = "charset-normalizer-3.3.2.tar.gz", hash = "sha256:f30c3cb33b24454a82faecaf01b19c18562b1e89558fb6c56de4d9118a032fd5"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:25baf083bf6f6b341f4121c2f3c548875ee6f5339300e08be3f2b2ba1721cdd3"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:06435b539f889b1f6f4ac1758871aae42dc3a8c0e24ac9e60c2384973ad73027"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9063e24fdb1e498ab71cb7419e24622516c4a04476b17a2dab57e8baa30d6e03"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6897af51655e3691ff853668779c7bad41579facacf5fd7253b0133308cf000d"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1d3193f4a680c64b4b6a9115943538edb896edc190f0b222e73761716519268e"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cd70574b12bb8a4d2aaa0094515df2463cb429d8536cfb6c7ce983246983e5a6"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8465322196c8b4d7ab6d1e049e4c5cb460d0394da4a27d23cc242fbf0034b6b5"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a9a8e9031d613fd2009c182b69c7b2c1ef8239a0efb1df3f7c8da66d5dd3d537"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:beb58fe5cdb101e3a055192ac291b7a21e3b7ef4f67fa1d74e331a7f2124341c"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:e06ed3eb3218bc64786f7db41917d4e686cc4856944f53d5bdf83a6884432e12"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:2e81c7b9c8979ce92ed306c249d46894776a909505d8f5a4ba55b14206e3222f"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:572c3763a264ba47b3cf708a44ce965d98555f618ca42c926a9c1616d8f34269"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:fd1abc0d89e30cc4e02e4064dc67fcc51bd941eb395c502aac3ec19fab46b519"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-win32.whl", hash = "sha256:3d47fa203a7bd9c5b6cee4736ee84ca03b8ef23193c0d1ca99b5089f72645c73"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-win_amd64.whl", hash = "sha256:10955842570876604d404661fbccbc9c7e684caf432c09c715ec38fbae45ae09"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:802fe99cca7457642125a8a88a084cef28ff0cf9407060f7b93dca5aa25480db"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:573f6eac48f4769d667c4442081b1794f52919e7edada77495aaed9236d13a96"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:549a3a73da901d5bc3ce8d24e0600d1fa85524c10287f6004fbab87672bf3e1e"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f27273b60488abe721a075bcca6d7f3964f9f6f067c8c4c605743023d7d3944f"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1ceae2f17a9c33cb48e3263960dc5fc8005351ee19db217e9b1bb15d28c02574"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:65f6f63034100ead094b8744b3b97965785388f308a64cf8d7c34f2f2e5be0c4"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:753f10e867343b4511128c6ed8c82f7bec3bd026875576dfd88483c5c73b2fd8"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4a78b2b446bd7c934f5dcedc588903fb2f5eec172f3d29e52a9096a43722adfc"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e537484df0d8f426ce2afb2d0f8e1c3d0b114b83f8850e5f2fbea0e797bd82ae"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:eb6904c354526e758fda7167b33005998fb68c46fbc10e013ca97f21ca5c8887"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:deb6be0ac38ece9ba87dea880e438f25ca3eddfac8b002a2ec3d9183a454e8ae"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:4ab2fe47fae9e0f9dee8c04187ce5d09f48eabe611be8259444906793ab7cbce"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:80402cd6ee291dcb72644d6eac93785fe2c8b9cb30893c1af5b8fdd753b9d40f"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-win32.whl", hash = "sha256:7cd13a2e3ddeed6913a65e66e94b51d80a041145a026c27e6bb76c31a853c6ab"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-win_amd64.whl", hash = "sha256:663946639d296df6a2bb2aa51b60a2454ca1cb29835324c640dafb5ff2131a77"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:0b2b64d2bb6d3fb9112bafa732def486049e63de9618b5843bcdd081d8144cd8"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:ddbb2551d7e0102e7252db79ba445cdab71b26640817ab1e3e3648dad515003b"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:55086ee1064215781fff39a1af09518bc9255b50d6333f2e4c74ca09fac6a8f6"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8f4a014bc36d3c57402e2977dada34f9c12300af536839dc38c0beab8878f38a"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a10af20b82360ab00827f916a6058451b723b4e65030c5a18577c8b2de5b3389"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8d756e44e94489e49571086ef83b2bb8ce311e730092d2c34ca8f7d925cb20aa"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:90d558489962fd4918143277a773316e56c72da56ec7aa3dc3dbbe20fdfed15b"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6ac7ffc7ad6d040517be39eb591cac5ff87416c2537df6ba3cba3bae290c0fed"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:7ed9e526742851e8d5cc9e6cf41427dfc6068d4f5a3bb03659444b4cabf6bc26"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:8bdb58ff7ba23002a4c5808d608e4e6c687175724f54a5dade5fa8c67b604e4d"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:6b3251890fff30ee142c44144871185dbe13b11bab478a88887a639655be1068"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:b4a23f61ce87adf89be746c8a8974fe1c823c891d8f86eb218bb957c924bb143"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:efcb3f6676480691518c177e3b465bcddf57cea040302f9f4e6e191af91174d4"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-win32.whl", hash = "sha256:d965bba47ddeec8cd560687584e88cf699fd28f192ceb452d1d7ee807c5597b7"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-win_amd64.whl", hash = "sha256:96b02a3dc4381e5494fad39be677abcb5e6634bf7b4fa83a6dd3112607547001"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:95f2a5796329323b8f0512e09dbb7a1860c46a39da62ecb2324f116fa8fdc85c"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c002b4ffc0be611f0d9da932eb0f704fe2602a9a949d1f738e4c34c75b0863d5"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a981a536974bbc7a512cf44ed14938cf01030a99e9b3a06dd59578882f06f985"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3287761bc4ee9e33561a7e058c72ac0938c4f57fe49a09eae428fd88aafe7bb6"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:42cb296636fcc8b0644486d15c12376cb9fa75443e00fb25de0b8602e64c1714"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0a55554a2fa0d408816b3b5cedf0045f4b8e1a6065aec45849de2d6f3f8e9786"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:c083af607d2515612056a31f0a8d9e0fcb5876b7bfc0abad3ecd275bc4ebc2d5"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:87d1351268731db79e0f8e745d92493ee2841c974128ef629dc518b937d9194c"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:bd8f7df7d12c2db9fab40bdd87a7c09b1530128315d047a086fa3ae3435cb3a8"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:c180f51afb394e165eafe4ac2936a14bee3eb10debc9d9e4db8958fe36afe711"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:8c622a5fe39a48f78944a87d4fb8a53ee07344641b0562c540d840748571b811"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-win32.whl", hash = "sha256:db364eca23f876da6f9e16c9da0df51aa4f104a972735574842618b8c6d999d4"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-win_amd64.whl", hash = "sha256:86216b5cee4b06df986d214f664305142d9c76df9b6512be2738aa72a2048f99"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:6463effa3186ea09411d50efc7d85360b38d5f09b870c48e4600f63af490e56a"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:6c4caeef8fa63d06bd437cd4bdcf3ffefe6738fb1b25951440d80dc7df8c03ac"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:37e55c8e51c236f95b033f6fb391d7d7970ba5fe7ff453dad675e88cf303377a"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fb69256e180cb6c8a894fee62b3afebae785babc1ee98b81cdf68bbca1987f33"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ae5f4161f18c61806f411a13b0310bea87f987c7d2ecdbdaad0e94eb2e404238"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b2b0a0c0517616b6869869f8c581d4eb2dd83a4d79e0ebcb7d373ef9956aeb0a"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:45485e01ff4d3630ec0d9617310448a8702f70e9c01906b0d0118bdf9d124cf2"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:eb00ed941194665c332bf8e078baf037d6c35d7c4f3102ea2d4f16ca94a26dc8"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:2127566c664442652f024c837091890cb1942c30937add288223dc895793f898"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:a50aebfa173e157099939b17f18600f72f84eed3049e743b68ad15bd69b6bf99"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:4d0d1650369165a14e14e1e47b372cfcb31d6ab44e6e33cb2d4e57265290044d"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:923c0c831b7cfcb071580d3f46c4baf50f174be571576556269530f4bbd79d04"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:06a81e93cd441c56a9b65d8e1d043daeb97a3d0856d177d5c90ba85acb3db087"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-win32.whl", hash = "sha256:6ef1d82a3af9d3eecdba2321dc1b3c238245d890843e040e41e470ffa64c3e25"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-win_amd64.whl", hash = "sha256:eb8821e09e916165e160797a6c17edda0679379a4be5c716c260e836e122f54b"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:c235ebd9baae02f1b77bcea61bce332cb4331dc3617d254df3323aa01ab47bd4"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:5b4c145409bef602a690e7cfad0a15a55c13320ff7a3ad7ca59c13bb8ba4d45d"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:68d1f8a9e9e37c1223b656399be5d6b448dea850bed7d0f87a8311f1ff3dabb0"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:22afcb9f253dac0696b5a4be4a1c0f8762f8239e21b99680099abd9b2b1b2269"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e27ad930a842b4c5eb8ac0016b0a54f5aebbe679340c26101df33424142c143c"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1f79682fbe303db92bc2b1136016a38a42e835d932bab5b3b1bfcfbf0640e519"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b261ccdec7821281dade748d088bb6e9b69e6d15b30652b74cbbac25e280b796"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:122c7fa62b130ed55f8f285bfd56d5f4b4a5b503609d181f9ad85e55c89f4185"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:d0eccceffcb53201b5bfebb52600a5fb483a20b61da9dbc885f8b103cbe7598c"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:9f96df6923e21816da7e0ad3fd47dd8f94b2a5ce594e00677c0013018b813458"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:7f04c839ed0b6b98b1a7501a002144b76c18fb1c1850c8b98d458ac269e26ed2"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:34d1c8da1e78d2e001f363791c98a272bb734000fcef47a491c1e3b0505657a8"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:ff8fa367d09b717b2a17a052544193ad76cd49979c805768879cb63d9ca50561"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-win32.whl", hash = "sha256:aed38f6e4fb3f5d6bf81bfa990a07806be9d83cf7bacef998ab1a9bd660a581f"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-win_amd64.whl", hash = "sha256:b01b88d45a6fcb69667cd6d2f7a9aeb4bf53760d7fc536bf679ec94fe9f3ff3d"}, - {file = "charset_normalizer-3.3.2-py3-none-any.whl", hash = "sha256:3e4d1f6587322d2788836a99c69062fbb091331ec940e02d12d179c1d53e25fc"}, +python-versions = ">=3.7" +groups = ["dev"] +files = [ + {file = "charset_normalizer-3.4.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:91b36a978b5ae0ee86c394f5a54d6ef44db1de0815eb43de826d41d21e4af3de"}, + {file = "charset_normalizer-3.4.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7461baadb4dc00fd9e0acbe254e3d7d2112e7f92ced2adc96e54ef6501c5f176"}, + {file = "charset_normalizer-3.4.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e218488cd232553829be0664c2292d3af2eeeb94b32bea483cf79ac6a694e037"}, + {file = "charset_normalizer-3.4.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:80ed5e856eb7f30115aaf94e4a08114ccc8813e6ed1b5efa74f9f82e8509858f"}, + {file = "charset_normalizer-3.4.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b010a7a4fd316c3c484d482922d13044979e78d1861f0e0650423144c616a46a"}, + {file = "charset_normalizer-3.4.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4532bff1b8421fd0a320463030c7520f56a79c9024a4e88f01c537316019005a"}, + {file = "charset_normalizer-3.4.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:d973f03c0cb71c5ed99037b870f2be986c3c05e63622c017ea9816881d2dd247"}, + {file = "charset_normalizer-3.4.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:3a3bd0dcd373514dcec91c411ddb9632c0d7d92aed7093b8c3bbb6d69ca74408"}, + {file = "charset_normalizer-3.4.1-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:d9c3cdf5390dcd29aa8056d13e8e99526cda0305acc038b96b30352aff5ff2bb"}, + {file = "charset_normalizer-3.4.1-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:2bdfe3ac2e1bbe5b59a1a63721eb3b95fc9b6817ae4a46debbb4e11f6232428d"}, + {file = "charset_normalizer-3.4.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:eab677309cdb30d047996b36d34caeda1dc91149e4fdca0b1a039b3f79d9a807"}, + {file = "charset_normalizer-3.4.1-cp310-cp310-win32.whl", hash = "sha256:c0429126cf75e16c4f0ad00ee0eae4242dc652290f940152ca8c75c3a4b6ee8f"}, + {file = "charset_normalizer-3.4.1-cp310-cp310-win_amd64.whl", hash = "sha256:9f0b8b1c6d84c8034a44893aba5e767bf9c7a211e313a9605d9c617d7083829f"}, + {file = "charset_normalizer-3.4.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:8bfa33f4f2672964266e940dd22a195989ba31669bd84629f05fab3ef4e2d125"}, + {file = "charset_normalizer-3.4.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:28bf57629c75e810b6ae989f03c0828d64d6b26a5e205535585f96093e405ed1"}, + {file = "charset_normalizer-3.4.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f08ff5e948271dc7e18a35641d2f11a4cd8dfd5634f55228b691e62b37125eb3"}, + {file = "charset_normalizer-3.4.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:234ac59ea147c59ee4da87a0c0f098e9c8d169f4dc2a159ef720f1a61bbe27cd"}, + {file = "charset_normalizer-3.4.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fd4ec41f914fa74ad1b8304bbc634b3de73d2a0889bd32076342a573e0779e00"}, + {file = "charset_normalizer-3.4.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:eea6ee1db730b3483adf394ea72f808b6e18cf3cb6454b4d86e04fa8c4327a12"}, + {file = "charset_normalizer-3.4.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:c96836c97b1238e9c9e3fe90844c947d5afbf4f4c92762679acfe19927d81d77"}, + {file = "charset_normalizer-3.4.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:4d86f7aff21ee58f26dcf5ae81a9addbd914115cdebcbb2217e4f0ed8982e146"}, + {file = "charset_normalizer-3.4.1-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:09b5e6733cbd160dcc09589227187e242a30a49ca5cefa5a7edd3f9d19ed53fd"}, + {file = "charset_normalizer-3.4.1-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:5777ee0881f9499ed0f71cc82cf873d9a0ca8af166dfa0af8ec4e675b7df48e6"}, + {file = "charset_normalizer-3.4.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:237bdbe6159cff53b4f24f397d43c6336c6b0b42affbe857970cefbb620911c8"}, + {file = "charset_normalizer-3.4.1-cp311-cp311-win32.whl", hash = "sha256:8417cb1f36cc0bc7eaba8ccb0e04d55f0ee52df06df3ad55259b9a323555fc8b"}, + {file = "charset_normalizer-3.4.1-cp311-cp311-win_amd64.whl", hash = "sha256:d7f50a1f8c450f3925cb367d011448c39239bb3eb4117c36a6d354794de4ce76"}, + {file = "charset_normalizer-3.4.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:73d94b58ec7fecbc7366247d3b0b10a21681004153238750bb67bd9012414545"}, + {file = "charset_normalizer-3.4.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dad3e487649f498dd991eeb901125411559b22e8d7ab25d3aeb1af367df5efd7"}, + {file = "charset_normalizer-3.4.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c30197aa96e8eed02200a83fba2657b4c3acd0f0aa4bdc9f6c1af8e8962e0757"}, + {file = "charset_normalizer-3.4.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2369eea1ee4a7610a860d88f268eb39b95cb588acd7235e02fd5a5601773d4fa"}, + {file = "charset_normalizer-3.4.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc2722592d8998c870fa4e290c2eec2c1569b87fe58618e67d38b4665dfa680d"}, + {file = "charset_normalizer-3.4.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ffc9202a29ab3920fa812879e95a9e78b2465fd10be7fcbd042899695d75e616"}, + {file = "charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:804a4d582ba6e5b747c625bf1255e6b1507465494a40a2130978bda7b932c90b"}, + {file = "charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:0f55e69f030f7163dffe9fd0752b32f070566451afe180f99dbeeb81f511ad8d"}, + {file = "charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:c4c3e6da02df6fa1410a7680bd3f63d4f710232d3139089536310d027950696a"}, + {file = "charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:5df196eb874dae23dcfb968c83d4f8fdccb333330fe1fc278ac5ceeb101003a9"}, + {file = "charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:e358e64305fe12299a08e08978f51fc21fac060dcfcddd95453eabe5b93ed0e1"}, + {file = "charset_normalizer-3.4.1-cp312-cp312-win32.whl", hash = "sha256:9b23ca7ef998bc739bf6ffc077c2116917eabcc901f88da1b9856b210ef63f35"}, + {file = "charset_normalizer-3.4.1-cp312-cp312-win_amd64.whl", hash = "sha256:6ff8a4a60c227ad87030d76e99cd1698345d4491638dfa6673027c48b3cd395f"}, + {file = "charset_normalizer-3.4.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:aabfa34badd18f1da5ec1bc2715cadc8dca465868a4e73a0173466b688f29dda"}, + {file = "charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:22e14b5d70560b8dd51ec22863f370d1e595ac3d024cb8ad7d308b4cd95f8313"}, + {file = "charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8436c508b408b82d87dc5f62496973a1805cd46727c34440b0d29d8a2f50a6c9"}, + {file = "charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2d074908e1aecee37a7635990b2c6d504cd4766c7bc9fc86d63f9c09af3fa11b"}, + {file = "charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:955f8851919303c92343d2f66165294848d57e9bba6cf6e3625485a70a038d11"}, + {file = "charset_normalizer-3.4.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:44ecbf16649486d4aebafeaa7ec4c9fed8b88101f4dd612dcaf65d5e815f837f"}, + {file = "charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:0924e81d3d5e70f8126529951dac65c1010cdf117bb75eb02dd12339b57749dd"}, + {file = "charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:2967f74ad52c3b98de4c3b32e1a44e32975e008a9cd2a8cc8966d6a5218c5cb2"}, + {file = "charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:c75cb2a3e389853835e84a2d8fb2b81a10645b503eca9bcb98df6b5a43eb8886"}, + {file = "charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:09b26ae6b1abf0d27570633b2b078a2a20419c99d66fb2823173d73f188ce601"}, + {file = "charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:fa88b843d6e211393a37219e6a1c1df99d35e8fd90446f1118f4216e307e48cd"}, + {file = "charset_normalizer-3.4.1-cp313-cp313-win32.whl", hash = "sha256:eb8178fe3dba6450a3e024e95ac49ed3400e506fd4e9e5c32d30adda88cbd407"}, + {file = "charset_normalizer-3.4.1-cp313-cp313-win_amd64.whl", hash = "sha256:b1ac5992a838106edb89654e0aebfc24f5848ae2547d22c2c3f66454daa11971"}, + {file = "charset_normalizer-3.4.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f30bf9fd9be89ecb2360c7d94a711f00c09b976258846efe40db3d05828e8089"}, + {file = "charset_normalizer-3.4.1-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:97f68b8d6831127e4787ad15e6757232e14e12060bec17091b85eb1486b91d8d"}, + {file = "charset_normalizer-3.4.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7974a0b5ecd505609e3b19742b60cee7aa2aa2fb3151bc917e6e2646d7667dcf"}, + {file = "charset_normalizer-3.4.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fc54db6c8593ef7d4b2a331b58653356cf04f67c960f584edb7c3d8c97e8f39e"}, + {file = "charset_normalizer-3.4.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:311f30128d7d333eebd7896965bfcfbd0065f1716ec92bd5638d7748eb6f936a"}, + {file = "charset_normalizer-3.4.1-cp37-cp37m-musllinux_1_2_aarch64.whl", hash = "sha256:7d053096f67cd1241601111b698f5cad775f97ab25d81567d3f59219b5f1adbd"}, + {file = "charset_normalizer-3.4.1-cp37-cp37m-musllinux_1_2_i686.whl", hash = "sha256:807f52c1f798eef6cf26beb819eeb8819b1622ddfeef9d0977a8502d4db6d534"}, + {file = "charset_normalizer-3.4.1-cp37-cp37m-musllinux_1_2_ppc64le.whl", hash = "sha256:dccbe65bd2f7f7ec22c4ff99ed56faa1e9f785482b9bbd7c717e26fd723a1d1e"}, + {file = "charset_normalizer-3.4.1-cp37-cp37m-musllinux_1_2_s390x.whl", hash = "sha256:2fb9bd477fdea8684f78791a6de97a953c51831ee2981f8e4f583ff3b9d9687e"}, + {file = "charset_normalizer-3.4.1-cp37-cp37m-musllinux_1_2_x86_64.whl", hash = "sha256:01732659ba9b5b873fc117534143e4feefecf3b2078b0a6a2e925271bb6f4cfa"}, + {file = "charset_normalizer-3.4.1-cp37-cp37m-win32.whl", hash = "sha256:7a4f97a081603d2050bfaffdefa5b02a9ec823f8348a572e39032caa8404a487"}, + {file = "charset_normalizer-3.4.1-cp37-cp37m-win_amd64.whl", hash = "sha256:7b1bef6280950ee6c177b326508f86cad7ad4dff12454483b51d8b7d673a2c5d"}, + {file = "charset_normalizer-3.4.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:ecddf25bee22fe4fe3737a399d0d177d72bc22be6913acfab364b40bce1ba83c"}, + {file = "charset_normalizer-3.4.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8c60ca7339acd497a55b0ea5d506b2a2612afb2826560416f6894e8b5770d4a9"}, + {file = "charset_normalizer-3.4.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b7b2d86dd06bfc2ade3312a83a5c364c7ec2e3498f8734282c6c3d4b07b346b8"}, + {file = "charset_normalizer-3.4.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dd78cfcda14a1ef52584dbb008f7ac81c1328c0f58184bf9a84c49c605002da6"}, + {file = "charset_normalizer-3.4.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6e27f48bcd0957c6d4cb9d6fa6b61d192d0b13d5ef563e5f2ae35feafc0d179c"}, + {file = "charset_normalizer-3.4.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:01ad647cdd609225c5350561d084b42ddf732f4eeefe6e678765636791e78b9a"}, + {file = "charset_normalizer-3.4.1-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:619a609aa74ae43d90ed2e89bdd784765de0a25ca761b93e196d938b8fd1dbbd"}, + {file = "charset_normalizer-3.4.1-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:89149166622f4db9b4b6a449256291dc87a99ee53151c74cbd82a53c8c2f6ccd"}, + {file = "charset_normalizer-3.4.1-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:7709f51f5f7c853f0fb938bcd3bc59cdfdc5203635ffd18bf354f6967ea0f824"}, + {file = "charset_normalizer-3.4.1-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:345b0426edd4e18138d6528aed636de7a9ed169b4aaf9d61a8c19e39d26838ca"}, + {file = "charset_normalizer-3.4.1-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:0907f11d019260cdc3f94fbdb23ff9125f6b5d1039b76003b5b0ac9d6a6c9d5b"}, + {file = "charset_normalizer-3.4.1-cp38-cp38-win32.whl", hash = "sha256:ea0d8d539afa5eb2728aa1932a988a9a7af94f18582ffae4bc10b3fbdad0626e"}, + {file = "charset_normalizer-3.4.1-cp38-cp38-win_amd64.whl", hash = "sha256:329ce159e82018d646c7ac45b01a430369d526569ec08516081727a20e9e4af4"}, + {file = "charset_normalizer-3.4.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:b97e690a2118911e39b4042088092771b4ae3fc3aa86518f84b8cf6888dbdb41"}, + {file = "charset_normalizer-3.4.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:78baa6d91634dfb69ec52a463534bc0df05dbd546209b79a3880a34487f4b84f"}, + {file = "charset_normalizer-3.4.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1a2bc9f351a75ef49d664206d51f8e5ede9da246602dc2d2726837620ea034b2"}, + {file = "charset_normalizer-3.4.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:75832c08354f595c760a804588b9357d34ec00ba1c940c15e31e96d902093770"}, + {file = "charset_normalizer-3.4.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0af291f4fe114be0280cdd29d533696a77b5b49cfde5467176ecab32353395c4"}, + {file = "charset_normalizer-3.4.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0167ddc8ab6508fe81860a57dd472b2ef4060e8d378f0cc555707126830f2537"}, + {file = "charset_normalizer-3.4.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:2a75d49014d118e4198bcee5ee0a6f25856b29b12dbf7cd012791f8a6cc5c496"}, + {file = "charset_normalizer-3.4.1-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:363e2f92b0f0174b2f8238240a1a30142e3db7b957a5dd5689b0e75fb717cc78"}, + {file = "charset_normalizer-3.4.1-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:ab36c8eb7e454e34e60eb55ca5d241a5d18b2c6244f6827a30e451c42410b5f7"}, + {file = "charset_normalizer-3.4.1-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:4c0907b1928a36d5a998d72d64d8eaa7244989f7aaaf947500d3a800c83a3fd6"}, + {file = "charset_normalizer-3.4.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:04432ad9479fa40ec0f387795ddad4437a2b50417c69fa275e212933519ff294"}, + {file = "charset_normalizer-3.4.1-cp39-cp39-win32.whl", hash = "sha256:3bed14e9c89dcb10e8f3a29f9ccac4955aebe93c71ae803af79265c9ca5644c5"}, + {file = "charset_normalizer-3.4.1-cp39-cp39-win_amd64.whl", hash = "sha256:49402233c892a461407c512a19435d1ce275543138294f7ef013f0b63d5d3765"}, + {file = "charset_normalizer-3.4.1-py3-none-any.whl", hash = "sha256:d98b1668f06378c6dbefec3b92299716b931cd4e6061f3c875a71ced1780ab85"}, + {file = "charset_normalizer-3.4.1.tar.gz", hash = "sha256:44251f18cd68a75b56585dd00dae26183e102cd5e0f9f1466e6df5da2ed64ea3"}, ] [[package]] name = "check-manifest" -version = "0.49" +version = "0.50" description = "Check MANIFEST.in in a Python source package for completeness" optional = false python-versions = ">=3.7" +groups = ["dev"] files = [ - {file = "check-manifest-0.49.tar.gz", hash = "sha256:64a640445542cf226919657c7b78d02d9c1ca5b1c25d7e66e0e1ff325060f416"}, - {file = "check_manifest-0.49-py3-none-any.whl", hash = "sha256:058cd30057714c39b96ce4d83f254fc770e3145c7b1932b5940b4e3efb5521ef"}, + {file = "check_manifest-0.50-py3-none-any.whl", hash = "sha256:6ab3e3aa72a008da3314b432f4c768c9647b4d6d8032f9e1a4672a572118e48c"}, + {file = "check_manifest-0.50.tar.gz", hash = "sha256:d300f9f292986aa1a30424af44eb45c5644e0a810e392e62d553b24bb3393494"}, ] [package.dependencies] @@ -479,22 +478,22 @@ setuptools = "*" tomli = {version = "*", markers = "python_version < \"3.11\""} [package.extras] -test = ["mock (>=3.0.0)", "pytest"] +test = ["mock (>=3.0.0) ; python_version == \"3.7\"", "pytest", "wheel"] [[package]] name = "click" -version = "8.1.7" +version = "8.1.8" description = "Composable command line interface toolkit" optional = false python-versions = ">=3.7" +groups = ["main", "dev"] files = [ - {file = "click-8.1.7-py3-none-any.whl", hash = "sha256:ae74fb96c20a0277a1d615f1e4d73c8414f5a98db8b799a7931d1582f3390c28"}, - {file = "click-8.1.7.tar.gz", hash = "sha256:ca9853ad459e787e2192211578cc907e7594e294c7ccc834310722b41b9ca6de"}, + {file = "click-8.1.8-py3-none-any.whl", hash = "sha256:63c132bbbed01578a06712a2d1f497bb62d9c1c0d329b7903a866228027263b2"}, + {file = "click-8.1.8.tar.gz", hash = "sha256:ed53c9d8990d83c2a27deae68e4ee337473f6330c040a31d4225c9574d16096a"}, ] [package.dependencies] colorama = {version = "*", markers = "platform_system == \"Windows\""} -importlib-metadata = {version = "*", markers = "python_version < \"3.8\""} [[package]] name = "click-didyoumean" @@ -502,6 +501,7 @@ version = "0.3.1" description = "Enables git-like *did-you-mean* feature in click" optional = false python-versions = ">=3.6.2" +groups = ["main"] files = [ {file = "click_didyoumean-0.3.1-py3-none-any.whl", hash = "sha256:5c4bb6007cfea5f2fd6583a2fb6701a22a41eb98957e63d0fac41c10e7c3117c"}, {file = "click_didyoumean-0.3.1.tar.gz", hash = "sha256:4f82fdff0dbe64ef8ab2279bd6aa3f6a99c3b28c05aa09cbfc07c9d7fbb5a463"}, @@ -516,6 +516,7 @@ version = "1.1.1" description = "An extension module for click to enable registering CLI commands via setuptools entry-points." optional = false python-versions = "*" +groups = ["main"] files = [ {file = "click-plugins-1.1.1.tar.gz", hash = "sha256:46ab999744a9d831159c3411bb0c79346d94a444df9a3a3742e9ed63645f264b"}, {file = "click_plugins-1.1.1-py2.py3-none-any.whl", hash = "sha256:5d262006d3222f5057fd81e1623d4443e41dcda5dc815c06b442aa3c02889fc8"}, @@ -533,6 +534,7 @@ version = "0.3.0" description = "REPL plugin for Click" optional = false python-versions = ">=3.6" +groups = ["main"] files = [ {file = "click-repl-0.3.0.tar.gz", hash = "sha256:17849c23dba3d667247dc4defe1757fff98694e90fe37474f3feebb69ced26a9"}, {file = "click_repl-0.3.0-py3-none-any.whl", hash = "sha256:fb7e06deb8da8de86180a33a9da97ac316751c094c6899382da7feeeeb51b812"}, @@ -551,125 +553,127 @@ version = "0.4.6" description = "Cross-platform colored terminal text." optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" +groups = ["main", "dev"] files = [ {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"}, {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, ] +markers = {main = "platform_system == \"Windows\"", dev = "platform_system == \"Windows\" or sys_platform == \"win32\" or os_name == \"nt\""} [[package]] name = "coverage" -version = "7.2.7" +version = "7.6.12" description = "Code coverage measurement for Python" optional = false -python-versions = ">=3.7" -files = [ - {file = "coverage-7.2.7-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d39b5b4f2a66ccae8b7263ac3c8170994b65266797fb96cbbfd3fb5b23921db8"}, - {file = "coverage-7.2.7-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:6d040ef7c9859bb11dfeb056ff5b3872436e3b5e401817d87a31e1750b9ae2fb"}, - {file = "coverage-7.2.7-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ba90a9563ba44a72fda2e85302c3abc71c5589cea608ca16c22b9804262aaeb6"}, - {file = "coverage-7.2.7-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e7d9405291c6928619403db1d10bd07888888ec1abcbd9748fdaa971d7d661b2"}, - {file = "coverage-7.2.7-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:31563e97dae5598556600466ad9beea39fb04e0229e61c12eaa206e0aa202063"}, - {file = "coverage-7.2.7-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:ebba1cd308ef115925421d3e6a586e655ca5a77b5bf41e02eb0e4562a111f2d1"}, - {file = "coverage-7.2.7-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:cb017fd1b2603ef59e374ba2063f593abe0fc45f2ad9abdde5b4d83bd922a353"}, - {file = "coverage-7.2.7-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:d62a5c7dad11015c66fbb9d881bc4caa5b12f16292f857842d9d1871595f4495"}, - {file = "coverage-7.2.7-cp310-cp310-win32.whl", hash = "sha256:ee57190f24fba796e36bb6d3aa8a8783c643d8fa9760c89f7a98ab5455fbf818"}, - {file = "coverage-7.2.7-cp310-cp310-win_amd64.whl", hash = "sha256:f75f7168ab25dd93110c8a8117a22450c19976afbc44234cbf71481094c1b850"}, - {file = "coverage-7.2.7-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:06a9a2be0b5b576c3f18f1a241f0473575c4a26021b52b2a85263a00f034d51f"}, - {file = "coverage-7.2.7-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:5baa06420f837184130752b7c5ea0808762083bf3487b5038d68b012e5937dbe"}, - {file = "coverage-7.2.7-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fdec9e8cbf13a5bf63290fc6013d216a4c7232efb51548594ca3631a7f13c3a3"}, - {file = "coverage-7.2.7-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:52edc1a60c0d34afa421c9c37078817b2e67a392cab17d97283b64c5833f427f"}, - {file = "coverage-7.2.7-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:63426706118b7f5cf6bb6c895dc215d8a418d5952544042c8a2d9fe87fcf09cb"}, - {file = "coverage-7.2.7-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:afb17f84d56068a7c29f5fa37bfd38d5aba69e3304af08ee94da8ed5b0865833"}, - {file = "coverage-7.2.7-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:48c19d2159d433ccc99e729ceae7d5293fbffa0bdb94952d3579983d1c8c9d97"}, - {file = "coverage-7.2.7-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:0e1f928eaf5469c11e886fe0885ad2bf1ec606434e79842a879277895a50942a"}, - {file = "coverage-7.2.7-cp311-cp311-win32.whl", hash = "sha256:33d6d3ea29d5b3a1a632b3c4e4f4ecae24ef170b0b9ee493883f2df10039959a"}, - {file = "coverage-7.2.7-cp311-cp311-win_amd64.whl", hash = "sha256:5b7540161790b2f28143191f5f8ec02fb132660ff175b7747b95dcb77ac26562"}, - {file = "coverage-7.2.7-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:f2f67fe12b22cd130d34d0ef79206061bfb5eda52feb6ce0dba0644e20a03cf4"}, - {file = "coverage-7.2.7-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a342242fe22407f3c17f4b499276a02b01e80f861f1682ad1d95b04018e0c0d4"}, - {file = "coverage-7.2.7-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:171717c7cb6b453aebac9a2ef603699da237f341b38eebfee9be75d27dc38e01"}, - {file = "coverage-7.2.7-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:49969a9f7ffa086d973d91cec8d2e31080436ef0fb4a359cae927e742abfaaa6"}, - {file = "coverage-7.2.7-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:b46517c02ccd08092f4fa99f24c3b83d8f92f739b4657b0f146246a0ca6a831d"}, - {file = "coverage-7.2.7-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:a3d33a6b3eae87ceaefa91ffdc130b5e8536182cd6dfdbfc1aa56b46ff8c86de"}, - {file = "coverage-7.2.7-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:976b9c42fb2a43ebf304fa7d4a310e5f16cc99992f33eced91ef6f908bd8f33d"}, - {file = "coverage-7.2.7-cp312-cp312-win32.whl", hash = "sha256:8de8bb0e5ad103888d65abef8bca41ab93721647590a3f740100cd65c3b00511"}, - {file = "coverage-7.2.7-cp312-cp312-win_amd64.whl", hash = "sha256:9e31cb64d7de6b6f09702bb27c02d1904b3aebfca610c12772452c4e6c21a0d3"}, - {file = "coverage-7.2.7-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:58c2ccc2f00ecb51253cbe5d8d7122a34590fac9646a960d1430d5b15321d95f"}, - {file = "coverage-7.2.7-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d22656368f0e6189e24722214ed8d66b8022db19d182927b9a248a2a8a2f67eb"}, - {file = "coverage-7.2.7-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a895fcc7b15c3fc72beb43cdcbdf0ddb7d2ebc959edac9cef390b0d14f39f8a9"}, - {file = "coverage-7.2.7-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e84606b74eb7de6ff581a7915e2dab7a28a0517fbe1c9239eb227e1354064dcd"}, - {file = "coverage-7.2.7-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:0a5f9e1dbd7fbe30196578ca36f3fba75376fb99888c395c5880b355e2875f8a"}, - {file = "coverage-7.2.7-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:419bfd2caae268623dd469eff96d510a920c90928b60f2073d79f8fe2bbc5959"}, - {file = "coverage-7.2.7-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:2aee274c46590717f38ae5e4650988d1af340fe06167546cc32fe2f58ed05b02"}, - {file = "coverage-7.2.7-cp37-cp37m-win32.whl", hash = "sha256:61b9a528fb348373c433e8966535074b802c7a5d7f23c4f421e6c6e2f1697a6f"}, - {file = "coverage-7.2.7-cp37-cp37m-win_amd64.whl", hash = "sha256:b1c546aca0ca4d028901d825015dc8e4d56aac4b541877690eb76490f1dc8ed0"}, - {file = "coverage-7.2.7-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:54b896376ab563bd38453cecb813c295cf347cf5906e8b41d340b0321a5433e5"}, - {file = "coverage-7.2.7-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:3d376df58cc111dc8e21e3b6e24606b5bb5dee6024f46a5abca99124b2229ef5"}, - {file = "coverage-7.2.7-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5e330fc79bd7207e46c7d7fd2bb4af2963f5f635703925543a70b99574b0fea9"}, - {file = "coverage-7.2.7-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1e9d683426464e4a252bf70c3498756055016f99ddaec3774bf368e76bbe02b6"}, - {file = "coverage-7.2.7-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8d13c64ee2d33eccf7437961b6ea7ad8673e2be040b4f7fd4fd4d4d28d9ccb1e"}, - {file = "coverage-7.2.7-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:b7aa5f8a41217360e600da646004f878250a0d6738bcdc11a0a39928d7dc2050"}, - {file = "coverage-7.2.7-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:8fa03bce9bfbeeef9f3b160a8bed39a221d82308b4152b27d82d8daa7041fee5"}, - {file = "coverage-7.2.7-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:245167dd26180ab4c91d5e1496a30be4cd721a5cf2abf52974f965f10f11419f"}, - {file = "coverage-7.2.7-cp38-cp38-win32.whl", hash = "sha256:d2c2db7fd82e9b72937969bceac4d6ca89660db0a0967614ce2481e81a0b771e"}, - {file = "coverage-7.2.7-cp38-cp38-win_amd64.whl", hash = "sha256:2e07b54284e381531c87f785f613b833569c14ecacdcb85d56b25c4622c16c3c"}, - {file = "coverage-7.2.7-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:537891ae8ce59ef63d0123f7ac9e2ae0fc8b72c7ccbe5296fec45fd68967b6c9"}, - {file = "coverage-7.2.7-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:06fb182e69f33f6cd1d39a6c597294cff3143554b64b9825d1dc69d18cc2fff2"}, - {file = "coverage-7.2.7-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:201e7389591af40950a6480bd9edfa8ed04346ff80002cec1a66cac4549c1ad7"}, - {file = "coverage-7.2.7-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f6951407391b639504e3b3be51b7ba5f3528adbf1a8ac3302b687ecababf929e"}, - {file = "coverage-7.2.7-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6f48351d66575f535669306aa7d6d6f71bc43372473b54a832222803eb956fd1"}, - {file = "coverage-7.2.7-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:b29019c76039dc3c0fd815c41392a044ce555d9bcdd38b0fb60fb4cd8e475ba9"}, - {file = "coverage-7.2.7-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:81c13a1fc7468c40f13420732805a4c38a105d89848b7c10af65a90beff25250"}, - {file = "coverage-7.2.7-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:975d70ab7e3c80a3fe86001d8751f6778905ec723f5b110aed1e450da9d4b7f2"}, - {file = "coverage-7.2.7-cp39-cp39-win32.whl", hash = "sha256:7ee7d9d4822c8acc74a5e26c50604dff824710bc8de424904c0982e25c39c6cb"}, - {file = "coverage-7.2.7-cp39-cp39-win_amd64.whl", hash = "sha256:eb393e5ebc85245347950143969b241d08b52b88a3dc39479822e073a1a8eb27"}, - {file = "coverage-7.2.7-pp37.pp38.pp39-none-any.whl", hash = "sha256:b7b4c971f05e6ae490fef852c218b0e79d4e52f79ef0c8475566584a8fb3e01d"}, - {file = "coverage-7.2.7.tar.gz", hash = "sha256:924d94291ca674905fe9481f12294eb11f2d3d3fd1adb20314ba89e94f44ed59"}, +python-versions = ">=3.9" +groups = ["dev"] +files = [ + {file = "coverage-7.6.12-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:704c8c8c6ce6569286ae9622e534b4f5b9759b6f2cd643f1c1a61f666d534fe8"}, + {file = "coverage-7.6.12-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ad7525bf0241e5502168ae9c643a2f6c219fa0a283001cee4cf23a9b7da75879"}, + {file = "coverage-7.6.12-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:06097c7abfa611c91edb9e6920264e5be1d6ceb374efb4986f38b09eed4cb2fe"}, + {file = "coverage-7.6.12-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:220fa6c0ad7d9caef57f2c8771918324563ef0d8272c94974717c3909664e674"}, + {file = "coverage-7.6.12-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3688b99604a24492bcfe1c106278c45586eb819bf66a654d8a9a1433022fb2eb"}, + {file = "coverage-7.6.12-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:d1a987778b9c71da2fc8948e6f2656da6ef68f59298b7e9786849634c35d2c3c"}, + {file = "coverage-7.6.12-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:cec6b9ce3bd2b7853d4a4563801292bfee40b030c05a3d29555fd2a8ee9bd68c"}, + {file = "coverage-7.6.12-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:ace9048de91293e467b44bce0f0381345078389814ff6e18dbac8fdbf896360e"}, + {file = "coverage-7.6.12-cp310-cp310-win32.whl", hash = "sha256:ea31689f05043d520113e0552f039603c4dd71fa4c287b64cb3606140c66f425"}, + {file = "coverage-7.6.12-cp310-cp310-win_amd64.whl", hash = "sha256:676f92141e3c5492d2a1596d52287d0d963df21bf5e55c8b03075a60e1ddf8aa"}, + {file = "coverage-7.6.12-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:e18aafdfb3e9ec0d261c942d35bd7c28d031c5855dadb491d2723ba54f4c3015"}, + {file = "coverage-7.6.12-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:66fe626fd7aa5982cdebad23e49e78ef7dbb3e3c2a5960a2b53632f1f703ea45"}, + {file = "coverage-7.6.12-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0ef01d70198431719af0b1f5dcbefc557d44a190e749004042927b2a3fed0702"}, + {file = "coverage-7.6.12-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:07e92ae5a289a4bc4c0aae710c0948d3c7892e20fd3588224ebe242039573bf0"}, + {file = "coverage-7.6.12-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e695df2c58ce526eeab11a2e915448d3eb76f75dffe338ea613c1201b33bab2f"}, + {file = "coverage-7.6.12-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:d74c08e9aaef995f8c4ef6d202dbd219c318450fe2a76da624f2ebb9c8ec5d9f"}, + {file = "coverage-7.6.12-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:e995b3b76ccedc27fe4f477b349b7d64597e53a43fc2961db9d3fbace085d69d"}, + {file = "coverage-7.6.12-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:b1f097878d74fe51e1ddd1be62d8e3682748875b461232cf4b52ddc6e6db0bba"}, + {file = "coverage-7.6.12-cp311-cp311-win32.whl", hash = "sha256:1f7ffa05da41754e20512202c866d0ebfc440bba3b0ed15133070e20bf5aeb5f"}, + {file = "coverage-7.6.12-cp311-cp311-win_amd64.whl", hash = "sha256:e216c5c45f89ef8971373fd1c5d8d1164b81f7f5f06bbf23c37e7908d19e8558"}, + {file = "coverage-7.6.12-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:b172f8e030e8ef247b3104902cc671e20df80163b60a203653150d2fc204d1ad"}, + {file = "coverage-7.6.12-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:641dfe0ab73deb7069fb972d4d9725bf11c239c309ce694dd50b1473c0f641c3"}, + {file = "coverage-7.6.12-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0e549f54ac5f301e8e04c569dfdb907f7be71b06b88b5063ce9d6953d2d58574"}, + {file = "coverage-7.6.12-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:959244a17184515f8c52dcb65fb662808767c0bd233c1d8a166e7cf74c9ea985"}, + {file = "coverage-7.6.12-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bda1c5f347550c359f841d6614fb8ca42ae5cb0b74d39f8a1e204815ebe25750"}, + {file = "coverage-7.6.12-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:1ceeb90c3eda1f2d8c4c578c14167dbd8c674ecd7d38e45647543f19839dd6ea"}, + {file = "coverage-7.6.12-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:0f16f44025c06792e0fb09571ae454bcc7a3ec75eeb3c36b025eccf501b1a4c3"}, + {file = "coverage-7.6.12-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:b076e625396e787448d27a411aefff867db2bffac8ed04e8f7056b07024eed5a"}, + {file = "coverage-7.6.12-cp312-cp312-win32.whl", hash = "sha256:00b2086892cf06c7c2d74983c9595dc511acca00665480b3ddff749ec4fb2a95"}, + {file = "coverage-7.6.12-cp312-cp312-win_amd64.whl", hash = "sha256:7ae6eabf519bc7871ce117fb18bf14e0e343eeb96c377667e3e5dd12095e0288"}, + {file = "coverage-7.6.12-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:488c27b3db0ebee97a830e6b5a3ea930c4a6e2c07f27a5e67e1b3532e76b9ef1"}, + {file = "coverage-7.6.12-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:5d1095bbee1851269f79fd8e0c9b5544e4c00c0c24965e66d8cba2eb5bb535fd"}, + {file = "coverage-7.6.12-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0533adc29adf6a69c1baa88c3d7dbcaadcffa21afbed3ca7a225a440e4744bf9"}, + {file = "coverage-7.6.12-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:53c56358d470fa507a2b6e67a68fd002364d23c83741dbc4c2e0680d80ca227e"}, + {file = "coverage-7.6.12-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:64cbb1a3027c79ca6310bf101014614f6e6e18c226474606cf725238cf5bc2d4"}, + {file = "coverage-7.6.12-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:79cac3390bfa9836bb795be377395f28410811c9066bc4eefd8015258a7578c6"}, + {file = "coverage-7.6.12-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:9b148068e881faa26d878ff63e79650e208e95cf1c22bd3f77c3ca7b1d9821a3"}, + {file = "coverage-7.6.12-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:8bec2ac5da793c2685ce5319ca9bcf4eee683b8a1679051f8e6ec04c4f2fd7dc"}, + {file = "coverage-7.6.12-cp313-cp313-win32.whl", hash = "sha256:200e10beb6ddd7c3ded322a4186313d5ca9e63e33d8fab4faa67ef46d3460af3"}, + {file = "coverage-7.6.12-cp313-cp313-win_amd64.whl", hash = "sha256:2b996819ced9f7dbb812c701485d58f261bef08f9b85304d41219b1496b591ef"}, + {file = "coverage-7.6.12-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:299cf973a7abff87a30609879c10df0b3bfc33d021e1adabc29138a48888841e"}, + {file = "coverage-7.6.12-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:4b467a8c56974bf06e543e69ad803c6865249d7a5ccf6980457ed2bc50312703"}, + {file = "coverage-7.6.12-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2458f275944db8129f95d91aee32c828a408481ecde3b30af31d552c2ce284a0"}, + {file = "coverage-7.6.12-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0a9d8be07fb0832636a0f72b80d2a652fe665e80e720301fb22b191c3434d924"}, + {file = "coverage-7.6.12-cp313-cp313t-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:14d47376a4f445e9743f6c83291e60adb1b127607a3618e3185bbc8091f0467b"}, + {file = "coverage-7.6.12-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:b95574d06aa9d2bd6e5cc35a5bbe35696342c96760b69dc4287dbd5abd4ad51d"}, + {file = "coverage-7.6.12-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:ecea0c38c9079570163d663c0433a9af4094a60aafdca491c6a3d248c7432827"}, + {file = "coverage-7.6.12-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:2251fabcfee0a55a8578a9d29cecfee5f2de02f11530e7d5c5a05859aa85aee9"}, + {file = "coverage-7.6.12-cp313-cp313t-win32.whl", hash = "sha256:eb5507795caabd9b2ae3f1adc95f67b1104971c22c624bb354232d65c4fc90b3"}, + {file = "coverage-7.6.12-cp313-cp313t-win_amd64.whl", hash = "sha256:f60a297c3987c6c02ffb29effc70eadcbb412fe76947d394a1091a3615948e2f"}, + {file = "coverage-7.6.12-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:e7575ab65ca8399c8c4f9a7d61bbd2d204c8b8e447aab9d355682205c9dd948d"}, + {file = "coverage-7.6.12-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:8161d9fbc7e9fe2326de89cd0abb9f3599bccc1287db0aba285cb68d204ce929"}, + {file = "coverage-7.6.12-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3a1e465f398c713f1b212400b4e79a09829cd42aebd360362cd89c5bdc44eb87"}, + {file = "coverage-7.6.12-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f25d8b92a4e31ff1bd873654ec367ae811b3a943583e05432ea29264782dc32c"}, + {file = "coverage-7.6.12-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1a936309a65cc5ca80fa9f20a442ff9e2d06927ec9a4f54bcba9c14c066323f2"}, + {file = "coverage-7.6.12-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:aa6f302a3a0b5f240ee201297fff0bbfe2fa0d415a94aeb257d8b461032389bd"}, + {file = "coverage-7.6.12-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:f973643ef532d4f9be71dd88cf7588936685fdb576d93a79fe9f65bc337d9d73"}, + {file = "coverage-7.6.12-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:78f5243bb6b1060aed6213d5107744c19f9571ec76d54c99cc15938eb69e0e86"}, + {file = "coverage-7.6.12-cp39-cp39-win32.whl", hash = "sha256:69e62c5034291c845fc4df7f8155e8544178b6c774f97a99e2734b05eb5bed31"}, + {file = "coverage-7.6.12-cp39-cp39-win_amd64.whl", hash = "sha256:b01a840ecc25dce235ae4c1b6a0daefb2a203dba0e6e980637ee9c2f6ee0df57"}, + {file = "coverage-7.6.12-pp39.pp310-none-any.whl", hash = "sha256:7e39e845c4d764208e7b8f6a21c541ade741e2c41afabdfa1caa28687a3c98cf"}, + {file = "coverage-7.6.12-py3-none-any.whl", hash = "sha256:eb8668cfbc279a536c633137deeb9435d2962caec279c3f8cf8b91fff6ff8953"}, + {file = "coverage-7.6.12.tar.gz", hash = "sha256:48cfc4641d95d34766ad41d9573cc0f22a48aa88d22657a1fe01dca0dbae4de2"}, ] [package.dependencies] tomli = {version = "*", optional = true, markers = "python_full_version <= \"3.11.0a6\" and extra == \"toml\""} [package.extras] -toml = ["tomli"] +toml = ["tomli ; python_full_version <= \"3.11.0a6\""] [[package]] name = "cryptography" -version = "42.0.5" +version = "43.0.3" description = "cryptography is a package which provides cryptographic recipes and primitives to Python developers." optional = false python-versions = ">=3.7" -files = [ - {file = "cryptography-42.0.5-cp37-abi3-macosx_10_12_universal2.whl", hash = "sha256:a30596bae9403a342c978fb47d9b0ee277699fa53bbafad14706af51fe543d16"}, - {file = "cryptography-42.0.5-cp37-abi3-macosx_10_12_x86_64.whl", hash = "sha256:b7ffe927ee6531c78f81aa17e684e2ff617daeba7f189f911065b2ea2d526dec"}, - {file = "cryptography-42.0.5-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2424ff4c4ac7f6b8177b53c17ed5d8fa74ae5955656867f5a8affaca36a27abb"}, - {file = "cryptography-42.0.5-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:329906dcc7b20ff3cad13c069a78124ed8247adcac44b10bea1130e36caae0b4"}, - {file = "cryptography-42.0.5-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:b03c2ae5d2f0fc05f9a2c0c997e1bc18c8229f392234e8a0194f202169ccd278"}, - {file = "cryptography-42.0.5-cp37-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:f8837fe1d6ac4a8052a9a8ddab256bc006242696f03368a4009be7ee3075cdb7"}, - {file = "cryptography-42.0.5-cp37-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:0270572b8bd2c833c3981724b8ee9747b3ec96f699a9665470018594301439ee"}, - {file = "cryptography-42.0.5-cp37-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:b8cac287fafc4ad485b8a9b67d0ee80c66bf3574f655d3b97ef2e1082360faf1"}, - {file = "cryptography-42.0.5-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:16a48c23a62a2f4a285699dba2e4ff2d1cff3115b9df052cdd976a18856d8e3d"}, - {file = "cryptography-42.0.5-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:2bce03af1ce5a5567ab89bd90d11e7bbdff56b8af3acbbec1faded8f44cb06da"}, - {file = "cryptography-42.0.5-cp37-abi3-win32.whl", hash = "sha256:b6cd2203306b63e41acdf39aa93b86fb566049aeb6dc489b70e34bcd07adca74"}, - {file = "cryptography-42.0.5-cp37-abi3-win_amd64.whl", hash = "sha256:98d8dc6d012b82287f2c3d26ce1d2dd130ec200c8679b6213b3c73c08b2b7940"}, - {file = "cryptography-42.0.5-cp39-abi3-macosx_10_12_universal2.whl", hash = "sha256:5e6275c09d2badf57aea3afa80d975444f4be8d3bc58f7f80d2a484c6f9485c8"}, - {file = "cryptography-42.0.5-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e4985a790f921508f36f81831817cbc03b102d643b5fcb81cd33df3fa291a1a1"}, - {file = "cryptography-42.0.5-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7cde5f38e614f55e28d831754e8a3bacf9ace5d1566235e39d91b35502d6936e"}, - {file = "cryptography-42.0.5-cp39-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:7367d7b2eca6513681127ebad53b2582911d1736dc2ffc19f2c3ae49997496bc"}, - {file = "cryptography-42.0.5-cp39-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:cd2030f6650c089aeb304cf093f3244d34745ce0cfcc39f20c6fbfe030102e2a"}, - {file = "cryptography-42.0.5-cp39-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:a2913c5375154b6ef2e91c10b5720ea6e21007412f6437504ffea2109b5a33d7"}, - {file = "cryptography-42.0.5-cp39-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:c41fb5e6a5fe9ebcd58ca3abfeb51dffb5d83d6775405305bfa8715b76521922"}, - {file = "cryptography-42.0.5-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:3eaafe47ec0d0ffcc9349e1708be2aaea4c6dd4978d76bf6eb0cb2c13636c6fc"}, - {file = "cryptography-42.0.5-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:1b95b98b0d2af784078fa69f637135e3c317091b615cd0905f8b8a087e86fa30"}, - {file = "cryptography-42.0.5-cp39-abi3-win32.whl", hash = "sha256:1f71c10d1e88467126f0efd484bd44bca5e14c664ec2ede64c32f20875c0d413"}, - {file = "cryptography-42.0.5-cp39-abi3-win_amd64.whl", hash = "sha256:a011a644f6d7d03736214d38832e030d8268bcff4a41f728e6030325fea3e400"}, - {file = "cryptography-42.0.5-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:9481ffe3cf013b71b2428b905c4f7a9a4f76ec03065b05ff499bb5682a8d9ad8"}, - {file = "cryptography-42.0.5-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:ba334e6e4b1d92442b75ddacc615c5476d4ad55cc29b15d590cc6b86efa487e2"}, - {file = "cryptography-42.0.5-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:ba3e4a42397c25b7ff88cdec6e2a16c2be18720f317506ee25210f6d31925f9c"}, - {file = "cryptography-42.0.5-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:111a0d8553afcf8eb02a4fea6ca4f59d48ddb34497aa8706a6cf536f1a5ec576"}, - {file = "cryptography-42.0.5-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:cd65d75953847815962c84a4654a84850b2bb4aed3f26fadcc1c13892e1e29f6"}, - {file = "cryptography-42.0.5-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:e807b3188f9eb0eaa7bbb579b462c5ace579f1cedb28107ce8b48a9f7ad3679e"}, - {file = "cryptography-42.0.5-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:f12764b8fffc7a123f641d7d049d382b73f96a34117e0b637b80643169cec8ac"}, - {file = "cryptography-42.0.5-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:37dd623507659e08be98eec89323469e8c7b4c1407c85112634ae3dbdb926fdd"}, - {file = "cryptography-42.0.5.tar.gz", hash = "sha256:6fe07eec95dfd477eb9530aef5bead34fec819b3aaf6c5bd6d20565da607bfe1"}, +groups = ["main"] +files = [ + {file = "cryptography-43.0.3-cp37-abi3-macosx_10_9_universal2.whl", hash = "sha256:bf7a1932ac4176486eab36a19ed4c0492da5d97123f1406cf15e41b05e787d2e"}, + {file = "cryptography-43.0.3-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:63efa177ff54aec6e1c0aefaa1a241232dcd37413835a9b674b6e3f0ae2bfd3e"}, + {file = "cryptography-43.0.3-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7e1ce50266f4f70bf41a2c6dc4358afadae90e2a1e5342d3c08883df1675374f"}, + {file = "cryptography-43.0.3-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:443c4a81bb10daed9a8f334365fe52542771f25aedaf889fd323a853ce7377d6"}, + {file = "cryptography-43.0.3-cp37-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:74f57f24754fe349223792466a709f8e0c093205ff0dca557af51072ff47ab18"}, + {file = "cryptography-43.0.3-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:9762ea51a8fc2a88b70cf2995e5675b38d93bf36bd67d91721c309df184f49bd"}, + {file = "cryptography-43.0.3-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:81ef806b1fef6b06dcebad789f988d3b37ccaee225695cf3e07648eee0fc6b73"}, + {file = "cryptography-43.0.3-cp37-abi3-win32.whl", hash = "sha256:cbeb489927bd7af4aa98d4b261af9a5bc025bd87f0e3547e11584be9e9427be2"}, + {file = "cryptography-43.0.3-cp37-abi3-win_amd64.whl", hash = "sha256:f46304d6f0c6ab8e52770addfa2fc41e6629495548862279641972b6215451cd"}, + {file = "cryptography-43.0.3-cp39-abi3-macosx_10_9_universal2.whl", hash = "sha256:8ac43ae87929a5982f5948ceda07001ee5e83227fd69cf55b109144938d96984"}, + {file = "cryptography-43.0.3-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:846da004a5804145a5f441b8530b4bf35afbf7da70f82409f151695b127213d5"}, + {file = "cryptography-43.0.3-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0f996e7268af62598f2fc1204afa98a3b5712313a55c4c9d434aef49cadc91d4"}, + {file = "cryptography-43.0.3-cp39-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:f7b178f11ed3664fd0e995a47ed2b5ff0a12d893e41dd0494f406d1cf555cab7"}, + {file = "cryptography-43.0.3-cp39-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:c2e6fc39c4ab499049df3bdf567f768a723a5e8464816e8f009f121a5a9f4405"}, + {file = "cryptography-43.0.3-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:e1be4655c7ef6e1bbe6b5d0403526601323420bcf414598955968c9ef3eb7d16"}, + {file = "cryptography-43.0.3-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:df6b6c6d742395dd77a23ea3728ab62f98379eff8fb61be2744d4679ab678f73"}, + {file = "cryptography-43.0.3-cp39-abi3-win32.whl", hash = "sha256:d56e96520b1020449bbace2b78b603442e7e378a9b3bd68de65c782db1507995"}, + {file = "cryptography-43.0.3-cp39-abi3-win_amd64.whl", hash = "sha256:0c580952eef9bf68c4747774cde7ec1d85a6e61de97281f2dba83c7d2c806362"}, + {file = "cryptography-43.0.3-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:d03b5621a135bffecad2c73e9f4deb1a0f977b9a8ffe6f8e002bf6c9d07b918c"}, + {file = "cryptography-43.0.3-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:a2a431ee15799d6db9fe80c82b055bae5a752bef645bba795e8e52687c69efe3"}, + {file = "cryptography-43.0.3-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:281c945d0e28c92ca5e5930664c1cefd85efe80e5c0d2bc58dd63383fda29f83"}, + {file = "cryptography-43.0.3-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:f18c716be16bc1fea8e95def49edf46b82fccaa88587a45f8dc0ff6ab5d8e0a7"}, + {file = "cryptography-43.0.3-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:4a02ded6cd4f0a5562a8887df8b3bd14e822a90f97ac5e544c162899bc467664"}, + {file = "cryptography-43.0.3-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:53a583b6637ab4c4e3591a15bc9db855b8d9dee9a669b550f311480acab6eb08"}, + {file = "cryptography-43.0.3-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:1ec0bcf7e17c0c5669d881b1cd38c4972fade441b27bda1051665faaa89bdcaa"}, + {file = "cryptography-43.0.3-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:2ce6fae5bdad59577b44e4dfed356944fbf1d925269114c28be377692643b4ff"}, + {file = "cryptography-43.0.3.tar.gz", hash = "sha256:315b9001266a492a6ff443b61238f956b214dbec9910a081ba5b6646a055a805"}, ] [package.dependencies] @@ -682,66 +686,70 @@ nox = ["nox"] pep8test = ["check-sdist", "click", "mypy", "ruff"] sdist = ["build"] ssh = ["bcrypt (>=3.1.5)"] -test = ["certifi", "pretend", "pytest (>=6.2.0)", "pytest-benchmark", "pytest-cov", "pytest-xdist"] +test = ["certifi", "cryptography-vectors (==43.0.3)", "pretend", "pytest (>=6.2.0)", "pytest-benchmark", "pytest-cov", "pytest-xdist"] test-randomorder = ["pytest-randomly"] [[package]] name = "dnspython" -version = "2.3.0" +version = "2.7.0" description = "DNS toolkit" optional = false -python-versions = ">=3.7,<4.0" +python-versions = ">=3.9" +groups = ["main"] files = [ - {file = "dnspython-2.3.0-py3-none-any.whl", hash = "sha256:89141536394f909066cabd112e3e1a37e4e654db00a25308b0f130bc3152eb46"}, - {file = "dnspython-2.3.0.tar.gz", hash = "sha256:224e32b03eb46be70e12ef6d64e0be123a64e621ab4c0822ff6d450d52a540b9"}, + {file = "dnspython-2.7.0-py3-none-any.whl", hash = "sha256:b4c34b7d10b51bcc3a5071e7b8dee77939f1e878477eeecc965e9835f63c6c86"}, + {file = "dnspython-2.7.0.tar.gz", hash = "sha256:ce9c432eda0dc91cf618a5cedf1a4e142651196bbcd2c80e89ed5a907e5cfaf1"}, ] [package.extras] -curio = ["curio (>=1.2,<2.0)", "sniffio (>=1.1,<2.0)"] -dnssec = ["cryptography (>=2.6,<40.0)"] -doh = ["h2 (>=4.1.0)", "httpx (>=0.21.1)", "requests (>=2.23.0,<3.0.0)", "requests-toolbelt (>=0.9.1,<0.11.0)"] -doq = ["aioquic (>=0.9.20)"] -idna = ["idna (>=2.1,<4.0)"] -trio = ["trio (>=0.14,<0.23)"] -wmi = ["wmi (>=1.5.1,<2.0.0)"] +dev = ["black (>=23.1.0)", "coverage (>=7.0)", "flake8 (>=7)", "hypercorn (>=0.16.0)", "mypy (>=1.8)", "pylint (>=3)", "pytest (>=7.4)", "pytest-cov (>=4.1.0)", "quart-trio (>=0.11.0)", "sphinx (>=7.2.0)", "sphinx-rtd-theme (>=2.0.0)", "twine (>=4.0.0)", "wheel (>=0.42.0)"] +dnssec = ["cryptography (>=43)"] +doh = ["h2 (>=4.1.0)", "httpcore (>=1.0.0)", "httpx (>=0.26.0)"] +doq = ["aioquic (>=1.0.0)"] +idna = ["idna (>=3.7)"] +trio = ["trio (>=0.23)"] +wmi = ["wmi (>=1.5.1)"] [[package]] name = "docker-services-cli" -version = "0.8.0" +version = "0.10.1" description = "Python module to ease the creation and management of external services." optional = false -python-versions = ">=3.6" +python-versions = ">=3.8" +groups = ["dev"] files = [ - {file = "Docker-Services-CLI-0.8.0.tar.gz", hash = "sha256:9d8bcf0a49fa3b85034ad4d0dc7dc930cf29f71d4244abac7a5c55460ac183ef"}, - {file = "Docker_Services_CLI-0.8.0-py2.py3-none-any.whl", hash = "sha256:172b67f3aae4edfc70f65eddc825d24f798f90ed2380e342aa3ba6a1c1babcb3"}, + {file = "Docker-Services-CLI-0.10.1.tar.gz", hash = "sha256:a4e4725ad12f91bcebb7a7c8ddebd71d1370bc9786e64390e47fdf5fa95715b1"}, + {file = "Docker_Services_CLI-0.10.1-py2.py3-none-any.whl", hash = "sha256:a9d63c6daa3c01d10d579e7239d1dce484e52640556de1c3d026559578cdf847"}, ] [package.dependencies] click = ">=7.0" [package.extras] -tests = ["check-manifest (>=0.42)", "pytest (>=6,<7.2.0)", "pytest-black (>=0.3.0)", "pytest-cov (>=3.0.0)", "pytest-isort (>=3.0.0)", "pytest-pycodestyle (>=2.2.0)", "pytest-pydocstyle (>=2.2.3)", "sphinx (>=4.5)"] +tests = ["check-manifest (>=0.42)", "pytest (>=6,<7.2.0)", "pytest-black-ng (>=0.4.0)", "pytest-cov (>=3.0.0)", "pytest-isort (>=3.0.0)", "pytest-pycodestyle (>=2.2.0)", "pytest-pydocstyle (>=2.2.3)", "sphinx (>=4.5)"] [[package]] name = "docutils" -version = "0.19" +version = "0.21.2" description = "Docutils -- Python Documentation Utilities" optional = false -python-versions = ">=3.7" +python-versions = ">=3.9" +groups = ["dev"] files = [ - {file = "docutils-0.19-py3-none-any.whl", hash = "sha256:5e1de4d849fee02c63b040a4a3fd567f4ab104defd8a5511fbbc24a8a017efbc"}, - {file = "docutils-0.19.tar.gz", hash = "sha256:33995a6753c30b7f577febfc2c50411fec6aac7f7ffeb7c4cfe5991072dcf9e6"}, + {file = "docutils-0.21.2-py3-none-any.whl", hash = "sha256:dafca5b9e384f0e419294eb4d2ff9fa826435bf15f15b7bd45723e8ad76811b2"}, + {file = "docutils-0.21.2.tar.gz", hash = "sha256:3a6b18732edf182daa3cd12775bbb338cf5691468f91eeeb109deff6ebfa986f"}, ] [[package]] name = "email-validator" -version = "2.0.0.post2" +version = "2.2.0" description = "A robust email address syntax and deliverability validation library." optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" +groups = ["main"] files = [ - {file = "email_validator-2.0.0.post2-py3-none-any.whl", hash = "sha256:2466ba57cda361fb7309fd3d5a225723c788ca4bbad32a0ebd5373b99730285c"}, - {file = "email_validator-2.0.0.post2.tar.gz", hash = "sha256:1ff6e86044200c56ae23595695c54e9614f4a9551e0e393614f764860b3d7900"}, + {file = "email_validator-2.2.0-py3-none-any.whl", hash = "sha256:561977c2d73ce3611850a06fa56b414621e0c8faa9d66f2611407d87465da631"}, + {file = "email_validator-2.2.0.tar.gz", hash = "sha256:cb690f344c617a714f22e66ae771445a1ceb46821152df8e165c5f9a364582b7"}, ] [package.dependencies] @@ -749,72 +757,72 @@ dnspython = ">=2.0.0" idna = ">=2.0.0" [[package]] -name = "flask" -version = "2.2.5" -description = "A simple framework for building complex web applications." +name = "exceptiongroup" +version = "1.2.2" +description = "Backport of PEP 654 (exception groups)" optional = false python-versions = ">=3.7" +groups = ["dev"] +markers = "python_version < \"3.11\"" files = [ - {file = "Flask-2.2.5-py3-none-any.whl", hash = "sha256:58107ed83443e86067e41eff4631b058178191a355886f8e479e347fa1285fdf"}, - {file = "Flask-2.2.5.tar.gz", hash = "sha256:edee9b0a7ff26621bd5a8c10ff484ae28737a2410d99b0bb9a6850c7fb977aa0"}, + {file = "exceptiongroup-1.2.2-py3-none-any.whl", hash = "sha256:3111b9d131c238bec2f8f516e123e14ba243563fb135d3fe885990585aa7795b"}, + {file = "exceptiongroup-1.2.2.tar.gz", hash = "sha256:47c2edf7c6738fafb49fd34290706d1a1a2f4d1c6df275526b62cbb4aa5393cc"}, ] -[package.dependencies] -click = ">=8.0" -importlib-metadata = {version = ">=3.6.0", markers = "python_version < \"3.10\""} -itsdangerous = ">=2.0" -Jinja2 = ">=3.0" -Werkzeug = ">=2.2.2" - [package.extras] -async = ["asgiref (>=3.2)"] -dotenv = ["python-dotenv"] +test = ["pytest (>=6)"] [[package]] -name = "flask-admin" -version = "1.6.1" -description = "Simple and extensible admin interface framework for Flask" +name = "flask" +version = "3.1.0" +description = "A simple framework for building complex web applications." optional = false -python-versions = ">=3.6" +python-versions = ">=3.9" +groups = ["main", "dev"] files = [ - {file = "Flask-Admin-1.6.1.tar.gz", hash = "sha256:24cae2af832b6a611a01d7dc35f42d266c1d6c75a426b869d8cb241b78233369"}, - {file = "Flask_Admin-1.6.1-py3-none-any.whl", hash = "sha256:fd8190f1ec3355913a22739c46ed3623f1d82b8112cde324c60a6fc9b21c9406"}, + {file = "flask-3.1.0-py3-none-any.whl", hash = "sha256:d667207822eb83f1c4b50949b1623c8fc8d51f2341d65f72e1a1815397551136"}, + {file = "flask-3.1.0.tar.gz", hash = "sha256:5f873c5184c897c8d9d1b05df1e3d01b14910ce69607a117bd3277098a5836ac"}, ] [package.dependencies] -Flask = ">=0.7" -wtforms = "*" +blinker = ">=1.9" +click = ">=8.1.3" +importlib-metadata = {version = ">=3.6", markers = "python_version < \"3.10\""} +itsdangerous = ">=2.2" +Jinja2 = ">=3.1.2" +Werkzeug = ">=3.1" [package.extras] -aws = ["boto"] -azure = ["azure-storage-blob"] +async = ["asgiref (>=3.2)"] +dotenv = ["python-dotenv"] [[package]] name = "flask-alembic" -version = "2.0.1" -description = "Flask extension to integrate Alembic migrations" +version = "3.1.1" +description = "Integrate Alembic with Flask." optional = false -python-versions = "*" +python-versions = ">=3.9" +groups = ["main"] files = [ - {file = "Flask-Alembic-2.0.1.tar.gz", hash = "sha256:05a1e6f4148dbfcc9280a393373bfbd250af6f9f4f0ca9f744ef8f7376a3deec"}, - {file = "Flask_Alembic-2.0.1-py2.py3-none-any.whl", hash = "sha256:7e67740b0b08d58dcae0c701d56b56e60f5fa4af907bb82b4cb0469229ba94ff"}, + {file = "flask_alembic-3.1.1-py3-none-any.whl", hash = "sha256:1d0cda58518d4332d8563da555bee03107fe2169c7157f61a2e0759d0150209b"}, + {file = "flask_alembic-3.1.1.tar.gz", hash = "sha256:358a0ad8f74e2969273a8d89feaf5842f65cc909064b51fde4b51415790d92f4"}, ] [package.dependencies] -alembic = ">=0.8" -Flask = ">=0.10" -Flask-SQLAlchemy = "*" -SQLAlchemy = "*" +alembic = ">=1.13" +flask = ">=3.0" +sqlalchemy = ">=2.0" [[package]] name = "flask-babel" -version = "3.1.0" +version = "4.0.0" description = "Adds i18n/l10n support for Flask applications." optional = false -python-versions = ">=3.7,<4.0" +python-versions = ">=3.8,<4.0" +groups = ["main"] files = [ - {file = "flask_babel-3.1.0-py3-none-any.whl", hash = "sha256:deb3ee272d5adf97f5974ed09ab501243d63e7fb4a047501a00de4bd4aca4830"}, - {file = "flask_babel-3.1.0.tar.gz", hash = "sha256:be015772c5d7f046f3b99c508dcf618636eb93d21b713b356db79f3e79f69f39"}, + {file = "flask_babel-4.0.0-py3-none-any.whl", hash = "sha256:638194cf91f8b301380f36d70e2034c77ee25b98cb5d80a1626820df9a6d4625"}, + {file = "flask_babel-4.0.0.tar.gz", hash = "sha256:dbeab4027a3f4a87678a11686496e98e1492eb793cbdd77ab50f4e9a2602a593"}, ] [package.dependencies] @@ -829,6 +837,7 @@ version = "0.5.0" description = "\"Flask-CeleryExt is a simple integration layer between Celery and Flask.\"" optional = false python-versions = ">=3.6" +groups = ["main"] files = [ {file = "Flask-CeleryExt-0.5.0.tar.gz", hash = "sha256:a23a0293bbe8e134233119e003e83ce9fe4f2caaf3fc23d91e09d252c7beb6e5"}, {file = "Flask_CeleryExt-0.5.0-py2.py3-none-any.whl", hash = "sha256:9c4b5c3c157923c86f3c92980bf3a58d0949a2dbf5d3a14b87135bb20d19b71b"}, @@ -839,7 +848,7 @@ celery = ">=5.1.0" Flask = ">=2.2.0" [package.extras] -tests = ["Sphinx (>=4.2.0)", "check-manifest (>=0.42)", "coverage (>=5.3,<6)", "docker-services-cli (>=0.4.0)", "importlib-metadata (<5)", "msgpack-python (>=0.5.6)", "pytest (>=6,<7.2.0)", "pytest-black (>=0.3.12)", "pytest-cov (>=3.0.0)", "pytest-flask (>=1.2.0)", "pytest-isort (>=3.0.0)", "pytest-mock (>=2.0.0)", "pytest-pydocstyle (>=2.2.0)", "redis (>=4.1.4)"] +tests = ["Sphinx (>=4.2.0)", "check-manifest (>=0.42)", "coverage (>=5.3,<6)", "docker-services-cli (>=0.4.0)", "importlib-metadata (<5) ; python_version < \"3.8\"", "msgpack-python (>=0.5.6)", "pytest (>=6,<7.2.0)", "pytest-black (>=0.3.12)", "pytest-cov (>=3.0.0)", "pytest-flask (>=1.2.0)", "pytest-isort (>=3.0.0)", "pytest-mock (>=2.0.0)", "pytest-pydocstyle (>=2.2.0)", "redis (>=4.1.4)"] [[package]] name = "flask-collect-invenio" @@ -847,6 +856,7 @@ version = "1.4.0" description = "Flask-Collect-Invenio -- Collect static files in Flask application" optional = false python-versions = "*" +groups = ["main"] files = [ {file = "Flask-Collect-Invenio-1.4.0.tar.gz", hash = "sha256:52c8343773f6366bb1594905e5c8e1f92101ec06c20e966420237ddad2a7918a"}, {file = "Flask_Collect_Invenio-1.4.0-py2.py3-none-any.whl", hash = "sha256:cf969b7cddf27086ee19883e9660aeac2d455646cbad2a43799660b3cc0cbffb"}, @@ -862,13 +872,14 @@ tests = ["black (>=21.9b0)", "check-manifest (>=0.42)", "coverage (>=5.3,<6)", " [[package]] name = "flask-cors" -version = "4.0.0" +version = "5.0.0" description = "A Flask extension adding a decorator for CORS support" optional = false python-versions = "*" +groups = ["main"] files = [ - {file = "Flask-Cors-4.0.0.tar.gz", hash = "sha256:f268522fcb2f73e2ecdde1ef45e2fd5c71cc48fe03cffb4b441c6d1b40684eb0"}, - {file = "Flask_Cors-4.0.0-py2.py3-none-any.whl", hash = "sha256:bc3492bfd6368d27cfe79c7821df5a8a319e1a6d5eab277a3794be19bdc51783"}, + {file = "Flask_Cors-5.0.0-py2.py3-none-any.whl", hash = "sha256:b9e307d082a9261c100d8fb0ba909eec6a228ed1b60a8315fd85f783d61910bc"}, + {file = "flask_cors-5.0.0.tar.gz", hash = "sha256:5aadb4b950c4e93745034594d9f3ea6591f734bb3662e16e255ffbf5e89c88ef"}, ] [package.dependencies] @@ -876,12 +887,14 @@ Flask = ">=0.9" [[package]] name = "flask-kvsession-invenio" -version = "0.6.3" +version = "0.6.4" description = "Transparent server-side session support for flask" optional = false python-versions = "*" +groups = ["main"] files = [ - {file = "Flask-KVSession-Invenio-0.6.3.tar.gz", hash = "sha256:fe24405403fff9e3ab2c5a34d93362d63ada4c9e5e7afab850ea4f80efb92a85"}, + {file = "Flask_KVSession_Invenio-0.6.4-py3-none-any.whl", hash = "sha256:4c49a34bc3c1f4b53175d10514769818ec861febd129a3b545ebf9a8ad5d7bbb"}, + {file = "flask_kvsession_invenio-0.6.4.tar.gz", hash = "sha256:5f153ccdab2ec013b9be23e80faa995f872b8559c9bce6322e1a5cb260e3fde4"}, ] [package.dependencies] @@ -897,6 +910,7 @@ version = "0.6.3" description = "User authentication and session management for Flask." optional = false python-versions = ">=3.7" +groups = ["main"] files = [ {file = "Flask-Login-0.6.3.tar.gz", hash = "sha256:5e23d14a607ef12806c699590b89d0f0e0d67baeec599d75947bf9c147330333"}, {file = "Flask_Login-0.6.3-py3-none-any.whl", hash = "sha256:849b25b82a436bf830a054e74214074af59097171562ab10bfa999e6b78aae5d"}, @@ -912,6 +926,7 @@ version = "0.9.1" description = "Flask extension for sending email" optional = false python-versions = "*" +groups = ["main"] files = [ {file = "Flask-Mail-0.9.1.tar.gz", hash = "sha256:22e5eb9a940bf407bcf30410ecc3708f3c56cc44b29c34e1726fe85006935f41"}, ] @@ -922,17 +937,18 @@ Flask = "*" [[package]] name = "flask-menu" -version = "1.0.1" +version = "2.0.0" description = "\"Flask-Menu is a Flask extension that adds support for generating menus.\"" optional = false python-versions = ">=3.7" +groups = ["main"] files = [ - {file = "flask-menu-1.0.1.tar.gz", hash = "sha256:d161908630dc899040325746db0e9e47d8a08732f14bc17b599b32cf1be50b0a"}, - {file = "flask_menu-1.0.1-py3-none-any.whl", hash = "sha256:d34c92004c3149e07d4f4636e33bc0fbace7a2f9a75b64c055ef8cb8cb799c0a"}, + {file = "flask_menu-2.0.0-py3-none-any.whl", hash = "sha256:bd9a4c9c4241300aa05e3f27da7d8953f197d4591763a2e0495381b7d9713efa"}, + {file = "flask_menu-2.0.0.tar.gz", hash = "sha256:162b409e444bea4ab10f12ab1270dd3d62dc0bd1f3d43b3e964a931019f5d580"}, ] [package.dependencies] -Flask = ">=2.0.0,<2.3.0" +Flask = ">=2.0.0" [package.extras] tests = ["check-manifest (>=0.49)", "pytest-black-ng (>=0.3.0)", "pytest-cov (>=4.1.0)", "pytest-flask (>=1.2.0)", "pytest-isort (>=3.1.0)", "pytest-pydocstyle (>=2.3.2)", "sphinx (>=4.5)"] @@ -943,6 +959,7 @@ version = "0.4.0" description = "Identity management for flask" optional = false python-versions = "*" +groups = ["main"] files = [ {file = "Flask-Principal-0.4.0.tar.gz", hash = "sha256:f5d6134b5caebfdbb86f32d56d18ee44b080876a27269560a96ea35f75c99453"}, ] @@ -953,173 +970,209 @@ Flask = "*" [[package]] name = "flask-security-invenio" -version = "3.3.3" +version = "3.4.0" description = "\"Simple security for Flask apps.\"" optional = false python-versions = ">=3.6" +groups = ["main"] files = [ - {file = "Flask-Security-Invenio-3.3.3.tar.gz", hash = "sha256:f638c77f8e56a5f56ad5a133ae87b4751226aec9aa077e08b12f12be4d1e6798"}, - {file = "Flask_Security_Invenio-3.3.3-py2.py3-none-any.whl", hash = "sha256:b27aecd4c2294287d2c3341dfdcd0d5a431fcc2af7d77f86e8adfbb98728ab71"}, + {file = "Flask-Security-Invenio-3.4.0.tar.gz", hash = "sha256:8d8ad6e4ce2441fe6ae4c33f9ef0f2f5e0228f039667918c477fef63c877d50e"}, + {file = "Flask_Security_Invenio-3.4.0-py2.py3-none-any.whl", hash = "sha256:dc6b9095c1e145b43e3a7a9c945313da16fb298a5250414cc21405e301673cf6"}, ] [package.dependencies] email-validator = ">=1.0.5" -Flask = ">=1.1.4,<2.3.0" +Flask = ">=1.1.4" Flask-Babel = ">=2.0.0" Flask-Login = ">=0.4.1" Flask-Mail = ">=0.9.1" Flask-Principal = ">=0.4.0" Flask-WTF = ">=1.1.0" itsdangerous = ">=2.0" +markupsafe = ">=2.1.5" passlib = ">=1.7" speaklater = ">=1.3" [package.extras] -tests = ["Flask-SQLAlchemy (>=2.5.1)", "Flask-Sphinx-Themes (>=1.0.2)", "Werkzeug (>=1.0.1,<2.3.0)", "bcrypt (>=3.1.0)", "check-manifest (>=0.42)", "coverage (>=5.3,<6)", "mock (>=1.3.0)", "msgcheck (>=2.9)", "pytest (>=6,<7)", "pytest-cov (>=2.10.1)", "pytest-flask (>=1.0.0)", "pytest-isort (>=1.2.0)", "pytest-pycodestyle (>=2.2.0)", "pytest-pydocstyle (>=2.2.0)", "sphinx (>=4.2.0,<5)"] +tests = ["Flask-SQLAlchemy (>=2.5.1)", "Flask-Sphinx-Themes (>=1.0.2)", "bcrypt (>=3.1.0)", "check-manifest (>=0.42)", "coverage (>=5.3,<6)", "mock (>=1.3.0)", "msgcheck (>=2.9)", "pytest (>=6,<9)", "pytest-black-ng (>=0.4.0)", "pytest-cov (>=2.10.1)", "pytest-flask (>=1.0.0)", "pytest-isort (>=1.2.0)", "pytest-pycodestyle (>=2.2.0)", "pytest-pydocstyle (>=2.2.0)", "sphinx (>=4.2.0)"] [[package]] name = "flask-sqlalchemy" -version = "2.5.1" -description = "Adds SQLAlchemy support to your Flask application." +version = "3.1.1" +description = "Add SQLAlchemy support to your Flask application." optional = false -python-versions = ">= 2.7, != 3.0.*, != 3.1.*, != 3.2.*, != 3.3.*" +python-versions = ">=3.8" +groups = ["main"] files = [ - {file = "Flask-SQLAlchemy-2.5.1.tar.gz", hash = "sha256:2bda44b43e7cacb15d4e05ff3cc1f8bc97936cc464623424102bfc2c35e95912"}, - {file = "Flask_SQLAlchemy-2.5.1-py2.py3-none-any.whl", hash = "sha256:f12c3d4cc5cc7fdcc148b9527ea05671718c3ea45d50c7e732cceb33f574b390"}, + {file = "flask_sqlalchemy-3.1.1-py3-none-any.whl", hash = "sha256:4ba4be7f419dc72f4efd8802d69974803c37259dd42f3913b0dcf75c9447e0a0"}, + {file = "flask_sqlalchemy-3.1.1.tar.gz", hash = "sha256:e4b68bb881802dda1a7d878b2fc84c06d1ee57fb40b874d3dc97dabfa36b8312"}, ] [package.dependencies] -Flask = ">=0.10" -SQLAlchemy = ">=0.8.0" +flask = ">=2.2.5" +sqlalchemy = ">=2.0.16" [[package]] name = "flask-webpackext" -version = "1.0.2" +version = "2.0.0" description = "Webpack integration for Flask." optional = false -python-versions = "*" +python-versions = ">=3.7" +groups = ["main"] files = [ - {file = "flask-webpackext-1.0.2.tar.gz", hash = "sha256:36e4b2d19f3e12e0bb370248094e1631a0cf8e607e76ca8c437718395b90c7ad"}, - {file = "flask_webpackext-1.0.2-py2.py3-none-any.whl", hash = "sha256:6313903d5aad5f330cb14ce97e7fec22541da413d5fe71b33b1f1a2eb69e426f"}, + {file = "flask_webpackext-2.0.0-py2.py3-none-any.whl", hash = "sha256:7b9d382d13de23e722095727038201cdeca1f046f3c287eae81271e9336062d8"}, + {file = "flask_webpackext-2.0.0.tar.gz", hash = "sha256:7432c2e8d9039238f2f8476b004520278cd13ea3f802f9695536f273dce67f7e"}, ] [package.dependencies] Flask = ">=0.11" -pynpm = ">=0.1.1" -pywebpack = ">=1.0.0" +pywebpack = ">=2.1.0,<3.0.0" [package.extras] -all = ["Sphinx (>=1.5.1,<3)", "check-manifest (>=0.25)", "coverage (>=4.0)", "isort (>=4.3.21)", "pydocstyle (>=1.0.0)", "pytest (>=2.8.0)", "pytest-cache (>=1.0)", "pytest-cov (>=1.8.0)", "pytest-pep8 (>=1.0.6)", "sphinx-click (>=1.4.0)"] -docs = ["Sphinx (>=1.5.1,<3)", "sphinx-click (>=1.4.0)"] -tests = ["check-manifest (>=0.25)", "coverage (>=4.0)", "isort (>=4.3.21)", "pydocstyle (>=1.0.0)", "pytest (>=2.8.0)", "pytest-cache (>=1.0)", "pytest-cov (>=1.8.0)", "pytest-pep8 (>=1.0.6)"] +tests = ["check-manifest (>=0.25)", "coverage (>=4.0)", "isort (>=4.3.21)", "pydocstyle (>=1.0.0)", "pytest (>=2.8.0)", "pytest-black-ng (>=0.4.0)", "pytest-cache (>=1.0)", "pytest-cov (>=1.8.0)", "sphinx (>=4.5)", "sphinx-click (>=1.4.0)"] [[package]] name = "flask-wtf" -version = "1.1.1" +version = "1.2.2" description = "Form rendering, validation, and CSRF protection for Flask with WTForms." optional = false -python-versions = ">=3.7" +python-versions = ">=3.9" +groups = ["main"] files = [ - {file = "Flask-WTF-1.1.1.tar.gz", hash = "sha256:41c4244e9ae626d63bed42ae4785b90667b885b1535d5a4095e1f63060d12aa9"}, - {file = "Flask_WTF-1.1.1-py3-none-any.whl", hash = "sha256:7887d6f1ebb3e17bf648647422f0944c9a469d0fcf63e3b66fb9a83037e38b2c"}, + {file = "flask_wtf-1.2.2-py3-none-any.whl", hash = "sha256:e93160c5c5b6b571cf99300b6e01b72f9a101027cab1579901f8b10c5daf0b70"}, + {file = "flask_wtf-1.2.2.tar.gz", hash = "sha256:79d2ee1e436cf570bccb7d916533fa18757a2f18c290accffab1b9a0b684666b"}, ] [package.dependencies] -Flask = "*" +flask = "*" itsdangerous = "*" -WTForms = "*" +wtforms = "*" [package.extras] email = ["email-validator"] [[package]] name = "greenlet" -version = "3.0.3" +version = "3.1.1" description = "Lightweight in-process concurrent programming" optional = false python-versions = ">=3.7" -files = [ - {file = "greenlet-3.0.3-cp310-cp310-macosx_11_0_universal2.whl", hash = "sha256:9da2bd29ed9e4f15955dd1595ad7bc9320308a3b766ef7f837e23ad4b4aac31a"}, - {file = "greenlet-3.0.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d353cadd6083fdb056bb46ed07e4340b0869c305c8ca54ef9da3421acbdf6881"}, - {file = "greenlet-3.0.3-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:dca1e2f3ca00b84a396bc1bce13dd21f680f035314d2379c4160c98153b2059b"}, - {file = "greenlet-3.0.3-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3ed7fb269f15dc662787f4119ec300ad0702fa1b19d2135a37c2c4de6fadfd4a"}, - {file = "greenlet-3.0.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd4f49ae60e10adbc94b45c0b5e6a179acc1736cf7a90160b404076ee283cf83"}, - {file = "greenlet-3.0.3-cp310-cp310-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:73a411ef564e0e097dbe7e866bb2dda0f027e072b04da387282b02c308807405"}, - {file = "greenlet-3.0.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:7f362975f2d179f9e26928c5b517524e89dd48530a0202570d55ad6ca5d8a56f"}, - {file = "greenlet-3.0.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:649dde7de1a5eceb258f9cb00bdf50e978c9db1b996964cd80703614c86495eb"}, - {file = "greenlet-3.0.3-cp310-cp310-win_amd64.whl", hash = "sha256:68834da854554926fbedd38c76e60c4a2e3198c6fbed520b106a8986445caaf9"}, - {file = "greenlet-3.0.3-cp311-cp311-macosx_11_0_universal2.whl", hash = "sha256:b1b5667cced97081bf57b8fa1d6bfca67814b0afd38208d52538316e9422fc61"}, - {file = "greenlet-3.0.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:52f59dd9c96ad2fc0d5724107444f76eb20aaccb675bf825df6435acb7703559"}, - {file = "greenlet-3.0.3-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:afaff6cf5200befd5cec055b07d1c0a5a06c040fe5ad148abcd11ba6ab9b114e"}, - {file = "greenlet-3.0.3-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:fe754d231288e1e64323cfad462fcee8f0288654c10bdf4f603a39ed923bef33"}, - {file = "greenlet-3.0.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2797aa5aedac23af156bbb5a6aa2cd3427ada2972c828244eb7d1b9255846379"}, - {file = "greenlet-3.0.3-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b7f009caad047246ed379e1c4dbcb8b020f0a390667ea74d2387be2998f58a22"}, - {file = "greenlet-3.0.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:c5e1536de2aad7bf62e27baf79225d0d64360d4168cf2e6becb91baf1ed074f3"}, - {file = "greenlet-3.0.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:894393ce10ceac937e56ec00bb71c4c2f8209ad516e96033e4b3b1de270e200d"}, - {file = "greenlet-3.0.3-cp311-cp311-win_amd64.whl", hash = "sha256:1ea188d4f49089fc6fb283845ab18a2518d279c7cd9da1065d7a84e991748728"}, - {file = "greenlet-3.0.3-cp312-cp312-macosx_11_0_universal2.whl", hash = "sha256:70fb482fdf2c707765ab5f0b6655e9cfcf3780d8d87355a063547b41177599be"}, - {file = "greenlet-3.0.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d4d1ac74f5c0c0524e4a24335350edad7e5f03b9532da7ea4d3c54d527784f2e"}, - {file = "greenlet-3.0.3-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:149e94a2dd82d19838fe4b2259f1b6b9957d5ba1b25640d2380bea9c5df37676"}, - {file = "greenlet-3.0.3-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:15d79dd26056573940fcb8c7413d84118086f2ec1a8acdfa854631084393efcc"}, - {file = "greenlet-3.0.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:881b7db1ebff4ba09aaaeae6aa491daeb226c8150fc20e836ad00041bcb11230"}, - {file = "greenlet-3.0.3-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:fcd2469d6a2cf298f198f0487e0a5b1a47a42ca0fa4dfd1b6862c999f018ebbf"}, - {file = "greenlet-3.0.3-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:1f672519db1796ca0d8753f9e78ec02355e862d0998193038c7073045899f305"}, - {file = "greenlet-3.0.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:2516a9957eed41dd8f1ec0c604f1cdc86758b587d964668b5b196a9db5bfcde6"}, - {file = "greenlet-3.0.3-cp312-cp312-win_amd64.whl", hash = "sha256:bba5387a6975598857d86de9eac14210a49d554a77eb8261cc68b7d082f78ce2"}, - {file = "greenlet-3.0.3-cp37-cp37m-macosx_11_0_universal2.whl", hash = "sha256:5b51e85cb5ceda94e79d019ed36b35386e8c37d22f07d6a751cb659b180d5274"}, - {file = "greenlet-3.0.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:daf3cb43b7cf2ba96d614252ce1684c1bccee6b2183a01328c98d36fcd7d5cb0"}, - {file = "greenlet-3.0.3-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:99bf650dc5d69546e076f413a87481ee1d2d09aaaaaca058c9251b6d8c14783f"}, - {file = "greenlet-3.0.3-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2dd6e660effd852586b6a8478a1d244b8dc90ab5b1321751d2ea15deb49ed414"}, - {file = "greenlet-3.0.3-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e3391d1e16e2a5a1507d83e4a8b100f4ee626e8eca43cf2cadb543de69827c4c"}, - {file = "greenlet-3.0.3-cp37-cp37m-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e1f145462f1fa6e4a4ae3c0f782e580ce44d57c8f2c7aae1b6fa88c0b2efdb41"}, - {file = "greenlet-3.0.3-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:1a7191e42732df52cb5f39d3527217e7ab73cae2cb3694d241e18f53d84ea9a7"}, - {file = "greenlet-3.0.3-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:0448abc479fab28b00cb472d278828b3ccca164531daab4e970a0458786055d6"}, - {file = "greenlet-3.0.3-cp37-cp37m-win32.whl", hash = "sha256:b542be2440edc2d48547b5923c408cbe0fc94afb9f18741faa6ae970dbcb9b6d"}, - {file = "greenlet-3.0.3-cp37-cp37m-win_amd64.whl", hash = "sha256:01bc7ea167cf943b4c802068e178bbf70ae2e8c080467070d01bfa02f337ee67"}, - {file = "greenlet-3.0.3-cp38-cp38-macosx_11_0_universal2.whl", hash = "sha256:1996cb9306c8595335bb157d133daf5cf9f693ef413e7673cb07e3e5871379ca"}, - {file = "greenlet-3.0.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3ddc0f794e6ad661e321caa8d2f0a55ce01213c74722587256fb6566049a8b04"}, - {file = "greenlet-3.0.3-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c9db1c18f0eaad2f804728c67d6c610778456e3e1cc4ab4bbd5eeb8e6053c6fc"}, - {file = "greenlet-3.0.3-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7170375bcc99f1a2fbd9c306f5be8764eaf3ac6b5cb968862cad4c7057756506"}, - {file = "greenlet-3.0.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6b66c9c1e7ccabad3a7d037b2bcb740122a7b17a53734b7d72a344ce39882a1b"}, - {file = "greenlet-3.0.3-cp38-cp38-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:098d86f528c855ead3479afe84b49242e174ed262456c342d70fc7f972bc13c4"}, - {file = "greenlet-3.0.3-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:81bb9c6d52e8321f09c3d165b2a78c680506d9af285bfccbad9fb7ad5a5da3e5"}, - {file = "greenlet-3.0.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:fd096eb7ffef17c456cfa587523c5f92321ae02427ff955bebe9e3c63bc9f0da"}, - {file = "greenlet-3.0.3-cp38-cp38-win32.whl", hash = "sha256:d46677c85c5ba00a9cb6f7a00b2bfa6f812192d2c9f7d9c4f6a55b60216712f3"}, - {file = "greenlet-3.0.3-cp38-cp38-win_amd64.whl", hash = "sha256:419b386f84949bf0e7c73e6032e3457b82a787c1ab4a0e43732898a761cc9dbf"}, - {file = "greenlet-3.0.3-cp39-cp39-macosx_11_0_universal2.whl", hash = "sha256:da70d4d51c8b306bb7a031d5cff6cc25ad253affe89b70352af5f1cb68e74b53"}, - {file = "greenlet-3.0.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:086152f8fbc5955df88382e8a75984e2bb1c892ad2e3c80a2508954e52295257"}, - {file = "greenlet-3.0.3-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d73a9fe764d77f87f8ec26a0c85144d6a951a6c438dfe50487df5595c6373eac"}, - {file = "greenlet-3.0.3-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b7dcbe92cc99f08c8dd11f930de4d99ef756c3591a5377d1d9cd7dd5e896da71"}, - {file = "greenlet-3.0.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1551a8195c0d4a68fac7a4325efac0d541b48def35feb49d803674ac32582f61"}, - {file = "greenlet-3.0.3-cp39-cp39-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:64d7675ad83578e3fc149b617a444fab8efdafc9385471f868eb5ff83e446b8b"}, - {file = "greenlet-3.0.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:b37eef18ea55f2ffd8f00ff8fe7c8d3818abd3e25fb73fae2ca3b672e333a7a6"}, - {file = "greenlet-3.0.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:77457465d89b8263bca14759d7c1684df840b6811b2499838cc5b040a8b5b113"}, - {file = "greenlet-3.0.3-cp39-cp39-win32.whl", hash = "sha256:57e8974f23e47dac22b83436bdcf23080ade568ce77df33159e019d161ce1d1e"}, - {file = "greenlet-3.0.3-cp39-cp39-win_amd64.whl", hash = "sha256:c5ee858cfe08f34712f548c3c363e807e7186f03ad7a5039ebadb29e8c6be067"}, - {file = "greenlet-3.0.3.tar.gz", hash = "sha256:43374442353259554ce33599da8b692d5aa96f8976d567d4badf263371fbe491"}, +groups = ["main"] +markers = "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\"" +files = [ + {file = "greenlet-3.1.1-cp310-cp310-macosx_11_0_universal2.whl", hash = "sha256:0bbae94a29c9e5c7e4a2b7f0aae5c17e8e90acbfd3bf6270eeba60c39fce3563"}, + {file = "greenlet-3.1.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0fde093fb93f35ca72a556cf72c92ea3ebfda3d79fc35bb19fbe685853869a83"}, + {file = "greenlet-3.1.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:36b89d13c49216cadb828db8dfa6ce86bbbc476a82d3a6c397f0efae0525bdd0"}, + {file = "greenlet-3.1.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:94b6150a85e1b33b40b1464a3f9988dcc5251d6ed06842abff82e42632fac120"}, + {file = "greenlet-3.1.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:93147c513fac16385d1036b7e5b102c7fbbdb163d556b791f0f11eada7ba65dc"}, + {file = "greenlet-3.1.1-cp310-cp310-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:da7a9bff22ce038e19bf62c4dd1ec8391062878710ded0a845bcf47cc0200617"}, + {file = "greenlet-3.1.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:b2795058c23988728eec1f36a4e5e4ebad22f8320c85f3587b539b9ac84128d7"}, + {file = "greenlet-3.1.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:ed10eac5830befbdd0c32f83e8aa6288361597550ba669b04c48f0f9a2c843c6"}, + {file = "greenlet-3.1.1-cp310-cp310-win_amd64.whl", hash = "sha256:77c386de38a60d1dfb8e55b8c1101d68c79dfdd25c7095d51fec2dd800892b80"}, + {file = "greenlet-3.1.1-cp311-cp311-macosx_11_0_universal2.whl", hash = "sha256:e4d333e558953648ca09d64f13e6d8f0523fa705f51cae3f03b5983489958c70"}, + {file = "greenlet-3.1.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:09fc016b73c94e98e29af67ab7b9a879c307c6731a2c9da0db5a7d9b7edd1159"}, + {file = "greenlet-3.1.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d5e975ca70269d66d17dd995dafc06f1b06e8cb1ec1e9ed54c1d1e4a7c4cf26e"}, + {file = "greenlet-3.1.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3b2813dc3de8c1ee3f924e4d4227999285fd335d1bcc0d2be6dc3f1f6a318ec1"}, + {file = "greenlet-3.1.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e347b3bfcf985a05e8c0b7d462ba6f15b1ee1c909e2dcad795e49e91b152c383"}, + {file = "greenlet-3.1.1-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9e8f8c9cb53cdac7ba9793c276acd90168f416b9ce36799b9b885790f8ad6c0a"}, + {file = "greenlet-3.1.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:62ee94988d6b4722ce0028644418d93a52429e977d742ca2ccbe1c4f4a792511"}, + {file = "greenlet-3.1.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:1776fd7f989fc6b8d8c8cb8da1f6b82c5814957264d1f6cf818d475ec2bf6395"}, + {file = "greenlet-3.1.1-cp311-cp311-win_amd64.whl", hash = "sha256:48ca08c771c268a768087b408658e216133aecd835c0ded47ce955381105ba39"}, + {file = "greenlet-3.1.1-cp312-cp312-macosx_11_0_universal2.whl", hash = "sha256:4afe7ea89de619adc868e087b4d2359282058479d7cfb94970adf4b55284574d"}, + {file = "greenlet-3.1.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f406b22b7c9a9b4f8aa9d2ab13d6ae0ac3e85c9a809bd590ad53fed2bf70dc79"}, + {file = "greenlet-3.1.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c3a701fe5a9695b238503ce5bbe8218e03c3bcccf7e204e455e7462d770268aa"}, + {file = "greenlet-3.1.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2846930c65b47d70b9d178e89c7e1a69c95c1f68ea5aa0a58646b7a96df12441"}, + {file = "greenlet-3.1.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:99cfaa2110534e2cf3ba31a7abcac9d328d1d9f1b95beede58294a60348fba36"}, + {file = "greenlet-3.1.1-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1443279c19fca463fc33e65ef2a935a5b09bb90f978beab37729e1c3c6c25fe9"}, + {file = "greenlet-3.1.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:b7cede291382a78f7bb5f04a529cb18e068dd29e0fb27376074b6d0317bf4dd0"}, + {file = "greenlet-3.1.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:23f20bb60ae298d7d8656c6ec6db134bca379ecefadb0b19ce6f19d1f232a942"}, + {file = "greenlet-3.1.1-cp312-cp312-win_amd64.whl", hash = "sha256:7124e16b4c55d417577c2077be379514321916d5790fa287c9ed6f23bd2ffd01"}, + {file = "greenlet-3.1.1-cp313-cp313-macosx_11_0_universal2.whl", hash = "sha256:05175c27cb459dcfc05d026c4232f9de8913ed006d42713cb8a5137bd49375f1"}, + {file = "greenlet-3.1.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:935e943ec47c4afab8965954bf49bfa639c05d4ccf9ef6e924188f762145c0ff"}, + {file = "greenlet-3.1.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:667a9706c970cb552ede35aee17339a18e8f2a87a51fba2ed39ceeeb1004798a"}, + {file = "greenlet-3.1.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b8a678974d1f3aa55f6cc34dc480169d58f2e6d8958895d68845fa4ab566509e"}, + {file = "greenlet-3.1.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:efc0f674aa41b92da8c49e0346318c6075d734994c3c4e4430b1c3f853e498e4"}, + {file = "greenlet-3.1.1-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0153404a4bb921f0ff1abeb5ce8a5131da56b953eda6e14b88dc6bbc04d2049e"}, + {file = "greenlet-3.1.1-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:275f72decf9932639c1c6dd1013a1bc266438eb32710016a1c742df5da6e60a1"}, + {file = "greenlet-3.1.1-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:c4aab7f6381f38a4b42f269057aee279ab0fc7bf2e929e3d4abfae97b682a12c"}, + {file = "greenlet-3.1.1-cp313-cp313-win_amd64.whl", hash = "sha256:b42703b1cf69f2aa1df7d1030b9d77d3e584a70755674d60e710f0af570f3761"}, + {file = "greenlet-3.1.1-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f1695e76146579f8c06c1509c7ce4dfe0706f49c6831a817ac04eebb2fd02011"}, + {file = "greenlet-3.1.1-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7876452af029456b3f3549b696bb36a06db7c90747740c5302f74a9e9fa14b13"}, + {file = "greenlet-3.1.1-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4ead44c85f8ab905852d3de8d86f6f8baf77109f9da589cb4fa142bd3b57b475"}, + {file = "greenlet-3.1.1-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8320f64b777d00dd7ccdade271eaf0cad6636343293a25074cc5566160e4de7b"}, + {file = "greenlet-3.1.1-cp313-cp313t-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6510bf84a6b643dabba74d3049ead221257603a253d0a9873f55f6a59a65f822"}, + {file = "greenlet-3.1.1-cp313-cp313t-musllinux_1_1_aarch64.whl", hash = "sha256:04b013dc07c96f83134b1e99888e7a79979f1a247e2a9f59697fa14b5862ed01"}, + {file = "greenlet-3.1.1-cp313-cp313t-musllinux_1_1_x86_64.whl", hash = "sha256:411f015496fec93c1c8cd4e5238da364e1da7a124bcb293f085bf2860c32c6f6"}, + {file = "greenlet-3.1.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:47da355d8687fd65240c364c90a31569a133b7b60de111c255ef5b606f2ae291"}, + {file = "greenlet-3.1.1-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:98884ecf2ffb7d7fe6bd517e8eb99d31ff7855a840fa6d0d63cd07c037f6a981"}, + {file = "greenlet-3.1.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f1d4aeb8891338e60d1ab6127af1fe45def5259def8094b9c7e34690c8858803"}, + {file = "greenlet-3.1.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:db32b5348615a04b82240cc67983cb315309e88d444a288934ee6ceaebcad6cc"}, + {file = "greenlet-3.1.1-cp37-cp37m-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:dcc62f31eae24de7f8dce72134c8651c58000d3b1868e01392baea7c32c247de"}, + {file = "greenlet-3.1.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:1d3755bcb2e02de341c55b4fca7a745a24a9e7212ac953f6b3a48d117d7257aa"}, + {file = "greenlet-3.1.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:b8da394b34370874b4572676f36acabac172602abf054cbc4ac910219f3340af"}, + {file = "greenlet-3.1.1-cp37-cp37m-win32.whl", hash = "sha256:a0dfc6c143b519113354e780a50381508139b07d2177cb6ad6a08278ec655798"}, + {file = "greenlet-3.1.1-cp37-cp37m-win_amd64.whl", hash = "sha256:54558ea205654b50c438029505def3834e80f0869a70fb15b871c29b4575ddef"}, + {file = "greenlet-3.1.1-cp38-cp38-macosx_11_0_universal2.whl", hash = "sha256:346bed03fe47414091be4ad44786d1bd8bef0c3fcad6ed3dee074a032ab408a9"}, + {file = "greenlet-3.1.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dfc59d69fc48664bc693842bd57acfdd490acafda1ab52c7836e3fc75c90a111"}, + {file = "greenlet-3.1.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d21e10da6ec19b457b82636209cbe2331ff4306b54d06fa04b7c138ba18c8a81"}, + {file = "greenlet-3.1.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:37b9de5a96111fc15418819ab4c4432e4f3c2ede61e660b1e33971eba26ef9ba"}, + {file = "greenlet-3.1.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6ef9ea3f137e5711f0dbe5f9263e8c009b7069d8a1acea822bd5e9dae0ae49c8"}, + {file = "greenlet-3.1.1-cp38-cp38-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:85f3ff71e2e60bd4b4932a043fbbe0f499e263c628390b285cb599154a3b03b1"}, + {file = "greenlet-3.1.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:95ffcf719966dd7c453f908e208e14cde192e09fde6c7186c8f1896ef778d8cd"}, + {file = "greenlet-3.1.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:03a088b9de532cbfe2ba2034b2b85e82df37874681e8c470d6fb2f8c04d7e4b7"}, + {file = "greenlet-3.1.1-cp38-cp38-win32.whl", hash = "sha256:8b8b36671f10ba80e159378df9c4f15c14098c4fd73a36b9ad715f057272fbef"}, + {file = "greenlet-3.1.1-cp38-cp38-win_amd64.whl", hash = "sha256:7017b2be767b9d43cc31416aba48aab0d2309ee31b4dbf10a1d38fb7972bdf9d"}, + {file = "greenlet-3.1.1-cp39-cp39-macosx_11_0_universal2.whl", hash = "sha256:396979749bd95f018296af156201d6211240e7a23090f50a8d5d18c370084dc3"}, + {file = "greenlet-3.1.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ca9d0ff5ad43e785350894d97e13633a66e2b50000e8a183a50a88d834752d42"}, + {file = "greenlet-3.1.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f6ff3b14f2df4c41660a7dec01045a045653998784bf8cfcb5a525bdffffbc8f"}, + {file = "greenlet-3.1.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:94ebba31df2aa506d7b14866fed00ac141a867e63143fe5bca82a8e503b36437"}, + {file = "greenlet-3.1.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:73aaad12ac0ff500f62cebed98d8789198ea0e6f233421059fa68a5aa7220145"}, + {file = "greenlet-3.1.1-cp39-cp39-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:63e4844797b975b9af3a3fb8f7866ff08775f5426925e1e0bbcfe7932059a12c"}, + {file = "greenlet-3.1.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:7939aa3ca7d2a1593596e7ac6d59391ff30281ef280d8632fa03d81f7c5f955e"}, + {file = "greenlet-3.1.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:d0028e725ee18175c6e422797c407874da24381ce0690d6b9396c204c7f7276e"}, + {file = "greenlet-3.1.1-cp39-cp39-win32.whl", hash = "sha256:5e06afd14cbaf9e00899fae69b24a32f2196c19de08fcb9f4779dd4f004e5e7c"}, + {file = "greenlet-3.1.1-cp39-cp39-win_amd64.whl", hash = "sha256:3319aa75e0e0639bc15ff54ca327e8dc7a6fe404003496e3c6925cd3142e0e22"}, + {file = "greenlet-3.1.1.tar.gz", hash = "sha256:4ce3ac6cdb6adf7946475d7ef31777c26d94bccc377e070a7986bd2d5c515467"}, ] [package.extras] docs = ["Sphinx", "furo"] test = ["objgraph", "psutil"] +[[package]] +name = "h11" +version = "0.14.0" +description = "A pure-Python, bring-your-own-I/O implementation of HTTP/1.1" +optional = false +python-versions = ">=3.7" +groups = ["dev"] +files = [ + {file = "h11-0.14.0-py3-none-any.whl", hash = "sha256:e3fe4ac4b851c468cc8363d500db52c2ead036020723024a109d37346efaa761"}, + {file = "h11-0.14.0.tar.gz", hash = "sha256:8f19fbbe99e72420ff35c00b27a34cb9937e902a8b810e2c88300c6f0a3b699d"}, +] + [[package]] name = "idna" -version = "3.7" +version = "3.10" description = "Internationalized Domain Names in Applications (IDNA)" optional = false -python-versions = ">=3.5" +python-versions = ">=3.6" +groups = ["main", "dev"] files = [ - {file = "idna-3.7-py3-none-any.whl", hash = "sha256:82fee1fc78add43492d3a1898bfa6d8a904cc97d8427f683ed8e798d07761aa0"}, - {file = "idna-3.7.tar.gz", hash = "sha256:028ff3aadf0609c1fd278d8ea3089299412a7a8b9bd005dd08b9f8285bcb5cfc"}, + {file = "idna-3.10-py3-none-any.whl", hash = "sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3"}, + {file = "idna-3.10.tar.gz", hash = "sha256:12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9"}, ] +[package.extras] +all = ["flake8 (>=7.1.1)", "mypy (>=1.11.2)", "pytest (>=8.3.2)", "ruff (>=0.6.2)"] + [[package]] name = "imagesize" version = "1.4.1" description = "Getting image size from png/jpeg/jpeg2000/gif file" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +groups = ["dev"] files = [ {file = "imagesize-1.4.1-py2.py3-none-any.whl", hash = "sha256:0d8d18d08f840c19d0ee7ca1fd82490fdc3729b7ac93f49870406ddde8ef8d8b"}, {file = "imagesize-1.4.1.tar.gz", hash = "sha256:69150444affb9cb0d5cc5a92b3676f0b2fb7cd9ae39e947a5e11a36b4497cd4a"}, @@ -1127,41 +1180,46 @@ files = [ [[package]] name = "importlib-metadata" -version = "6.7.0" +version = "7.2.1" description = "Read metadata from Python packages" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" +groups = ["main", "dev"] files = [ - {file = "importlib_metadata-6.7.0-py3-none-any.whl", hash = "sha256:cb52082e659e97afc5dac71e79de97d8681de3aa07ff18578330904a9d18e5b5"}, - {file = "importlib_metadata-6.7.0.tar.gz", hash = "sha256:1aaf550d4f73e5d6783e7acb77aec43d49da8017410afae93822cc9cca98c4d4"}, + {file = "importlib_metadata-7.2.1-py3-none-any.whl", hash = "sha256:ffef94b0b66046dd8ea2d619b701fe978d9264d38f3998bc4c27ec3b146a87c8"}, + {file = "importlib_metadata-7.2.1.tar.gz", hash = "sha256:509ecb2ab77071db5137c655e24ceb3eee66e7bbc6574165d0d114d9fc4bbe68"}, ] [package.dependencies] -typing-extensions = {version = ">=3.6.4", markers = "python_version < \"3.8\""} zipp = ">=0.5" [package.extras] -docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] +doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] perf = ["ipython"] -testing = ["flufl.flake8", "importlib-resources (>=1.3)", "packaging", "pyfakefs", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-mypy (>=0.9.1)", "pytest-perf (>=0.9.2)", "pytest-ruff"] +test = ["flufl.flake8", "importlib-resources (>=1.3) ; python_version < \"3.9\"", "jaraco.test (>=5.4)", "packaging", "pyfakefs", "pytest (>=6,!=8.1.*)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy", "pytest-perf (>=0.9.2)", "pytest-ruff (>=0.2.1)"] [[package]] name = "importlib-resources" -version = "5.12.0" +version = "6.5.2" description = "Read resources from Python packages" optional = false -python-versions = ">=3.7" +python-versions = ">=3.9" +groups = ["main", "dev"] files = [ - {file = "importlib_resources-5.12.0-py3-none-any.whl", hash = "sha256:7b1deeebbf351c7578e09bf2f63fa2ce8b5ffec296e0d349139d43cca061a81a"}, - {file = "importlib_resources-5.12.0.tar.gz", hash = "sha256:4be82589bf5c1d7999aedf2a45159d10cb3ca4f19b2271f8792bc8e6da7b22f6"}, + {file = "importlib_resources-6.5.2-py3-none-any.whl", hash = "sha256:789cfdc3ed28c78b67a06acb8126751ced69a3d5f79c095a98298cd8a760ccec"}, + {file = "importlib_resources-6.5.2.tar.gz", hash = "sha256:185f87adef5bcc288449d98fb4fba07cea78bc036455dd44c5fc4a2fe78fed2c"}, ] [package.dependencies] zipp = {version = ">=3.1.0", markers = "python_version < \"3.10\""} [package.extras] -docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] -testing = ["flake8 (<5)", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-flake8", "pytest-mypy (>=0.9.1)"] +check = ["pytest-checkdocs (>=2.4)", "pytest-ruff (>=0.2.1) ; sys_platform != \"cygwin\""] +cover = ["pytest-cov"] +doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] +enabler = ["pytest-enabler (>=2.2)"] +test = ["jaraco.test (>=5.4)", "pytest (>=6,!=8.1.*)", "zipp (>=3.17)"] +type = ["pytest-mypy"] [[package]] name = "iniconfig" @@ -1169,6 +1227,7 @@ version = "2.0.0" description = "brain-dead simple config-ini parsing" optional = false python-versions = ">=3.7" +groups = ["dev"] files = [ {file = "iniconfig-2.0.0-py3-none-any.whl", hash = "sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374"}, {file = "iniconfig-2.0.0.tar.gz", hash = "sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3"}, @@ -1176,287 +1235,294 @@ files = [ [[package]] name = "invenio-access" -version = "2.0.0" +version = "4.0.0" description = "Invenio module for common role based access control." optional = false python-versions = ">=3.7" +groups = ["main"] files = [ - {file = "invenio-access-2.0.0.tar.gz", hash = "sha256:b2627255dc13dba29932e27a599a9e753f1cffa383012b581ffc213856c1aa54"}, - {file = "invenio_access-2.0.0-py2.py3-none-any.whl", hash = "sha256:d56ae0c2448b7a5c2bd85d81ae2e57ca6c65399ab3846bb9480d0911df42c565"}, + {file = "invenio_access-4.0.0-py2.py3-none-any.whl", hash = "sha256:9faf0ee20f6e28f5300f5f0ca01675249607befe1ac3ec34647473aae89c504d"}, + {file = "invenio_access-4.0.0.tar.gz", hash = "sha256:b8e7a1778b24b5dc690e9784e6d67ae421d86687a61dd11619ec332c362b5f66"}, ] [package.dependencies] -invenio-accounts = ">=3.0.0" -invenio-admin = ">=1.2.0" -invenio-base = ">=1.2.11" -invenio-i18n = ">=2.0.0" +invenio-accounts = ">=6.0.0,<7.0.0" +invenio-base = ">=2.0.0,<3.0.0" +invenio-i18n = ">=3.0.0,<4.0.0" [package.extras] -tests = ["cachelib (>=0.1)", "invenio-db[mysql,postgresql] (>=1.1.2)", "pytest-black (>=0.3.0,<0.3.10)", "pytest-invenio (>=1.4.1)", "redis (>=2.10.5)", "sphinx (>=4.5)"] +admin = ["invenio-admin (>=1.2.0,<2.0.0)"] +tests = ["cachelib (>=0.1)", "invenio-db[mysql,postgresql] (>=2.0.0,<3.0.0)", "pytest-black-ng (>=0.4.0)", "pytest-invenio (>=3.0.0,<4.0.0)", "redis (>=2.10.5)", "sphinx (>=4.5)"] [[package]] name = "invenio-accounts" -version = "5.0.1" +version = "6.0.0" description = "Invenio user management and authentication." optional = false python-versions = ">=3.7" +groups = ["main"] files = [ - {file = "invenio-accounts-5.0.1.tar.gz", hash = "sha256:487cb59b2e2776d986441da9aee092722ee63933eeada55b95d3f3ce117296c0"}, - {file = "invenio_accounts-5.0.1-py2.py3-none-any.whl", hash = "sha256:7e17240a102590b8e91643ec5b753d9dd51f929ab9197e5ec742039a463c07e8"}, + {file = "invenio_accounts-6.0.0-py2.py3-none-any.whl", hash = "sha256:8ac9429cdfc113a5dc3e06ec36b77a8727b9626f485ff2ffbc7d8f7df9f48067"}, + {file = "invenio_accounts-6.0.0.tar.gz", hash = "sha256:5aee749ba745787c5851fb4a548755a1c72f8f696798110cfe2ce4c1623b7d7d"}, ] [package.dependencies] cryptography = ">=3.0.0" Flask-KVSession-Invenio = ">=0.6.3" -Flask-Security-Invenio = ">=3.2.0" -invenio-celery = ">=1.2.3" -invenio-i18n = ">=2.0.0" -invenio-mail = ">=1.0.2" -invenio-rest = ">=1.2.4" -invenio-theme = ">=2.0.0" +Flask-Security-Invenio = ">=3.3.0" +invenio-celery = ">=2.0.0,<3.0.0" +invenio-i18n = ">=3.0.0,<4.0.0" +invenio-mail = ">=1.0.2,<3.0.0" +invenio-rest = ">=2.0.0,<3.0.0" +invenio-theme = ">=4.0.0,<5.0.0" maxminddb-geolite2 = ">=2017.404" pyjwt = ">=1.5.0" simplekv = ">=0.11.2" ua-parser = ">=0.7.3" [package.extras] -admin = ["invenio-admin (>=1.2.1)"] -mysql = ["invenio-db[mysql] (>=1.0.14)"] -postgresql = ["invenio-db[postgresql] (>=1.0.14)"] -sqlite = ["invenio-db (>=1.0.14)"] -tests = ["invenio-app (>=1.4.0)", "mock (>=1.3.0)", "pytest-black (>=0.3.0)", "pytest-invenio (>=2.1.4)", "sphinx (>=5,<6.0.0)"] - -[[package]] -name = "invenio-admin" -version = "1.4.0" -description = "\"Invenio module that adds administration panel to the system.\"" -optional = false -python-versions = ">=3.7" -files = [ - {file = "invenio-admin-1.4.0.tar.gz", hash = "sha256:2e257df24e300d992799d377a3ca7bbf64e7c7002a9b8890ee56667a2209d76a"}, - {file = "invenio_admin-1.4.0-py2.py3-none-any.whl", hash = "sha256:2c1138d5664c8d6e76bfb7378960b1945fb4af3dda325515aab68f33e1e5f4ae"}, -] - -[package.dependencies] -Flask-Admin = ">=1.5.6" -Flask-Menu = ">=0.5.0" -Flask-Principal = ">=0.4.0" -invenio-accounts = ">=1.2.1" -invenio-base = ">=1.2.9" -invenio-db = ">=1.0.9" -invenio-i18n = ">=2.0.0" - -[package.extras] -tests = ["invenio-access (>=1.0.0)", "invenio-theme (>=1.3.4)", "pytest-black (>=0.3.0,<0.3.10)", "pytest-invenio (>=1.4.3)", "sphinx (>=4.5)"] +admin = ["invenio-admin (>=1.2.1,<2.0.0)"] +mysql = ["invenio-db[mysql] (>=2.0.0,<3.0.0)"] +postgresql = ["invenio-db[postgresql] (>=2.0.0,<3.0.0)"] +sqlite = ["invenio-db (>=2.0.0,<3.0.0)"] +tests = ["invenio-app (>=2.0.0,<3.0.0)", "mock (>=1.3.0)", "pytest-black-ng (>=0.4.0)", "pytest-invenio (>=3.0.0,<4.0.0)", "sphinx (>=5,<6.0.0)"] [[package]] name = "invenio-assets" -version = "3.0.3" +version = "4.0.0" description = "Media assets management for Invenio." optional = false python-versions = ">=3.7" +groups = ["main"] files = [ - {file = "invenio-assets-3.0.3.tar.gz", hash = "sha256:620dffcaf228dd947aab9fc74f62bad20444a8f494ba2dda177c7b88e393c7d0"}, - {file = "invenio_assets-3.0.3-py2.py3-none-any.whl", hash = "sha256:578fb3b7fdc4c0cc34ee7e3be3dd49e880d3fbc225499b09d54cfedec92fb48d"}, + {file = "invenio_assets-4.0.0-py2.py3-none-any.whl", hash = "sha256:e1af01df678b3bbdd9c352c39710699df6d477e7a9fbcea7fe75b1c30cf07157"}, + {file = "invenio_assets-4.0.0.tar.gz", hash = "sha256:12e821fabd938bbc3081c07fa03cbbc95626ec0a036c7ae530e75ab16139d1d2"}, ] [package.dependencies] Flask-Collect-Invenio = ">=1.4.0,<2.0.0" -Flask-WebpackExt = ">=1.0.0,<2.0.0" -invenio-base = ">=1.2.5,<2.0.0" -pywebpack = ">=2.0.0,<3.0.0" +Flask-WebpackExt = ">=2.0.0,<3.0.0" +invenio-base = ">=2.0.0,<3.0.0" [package.extras] -tests = ["mock (>=1.3.0)", "pytest-black (>=0.3.0)", "pytest-invenio (>=1.4.0)", "sphinx (>=4.5)"] +tests = ["mock (>=1.3.0)", "pytest-black-ng (>=0.4.0)", "pytest-invenio (>=3.0.0,<4.0.0)", "sphinx (>=4.5)"] [[package]] name = "invenio-base" -version = "1.4.0" +version = "2.0.0" description = "\"Base package for building Invenio application factories.\"" optional = false python-versions = ">=3.7" +groups = ["main"] files = [ - {file = "invenio-base-1.4.0.tar.gz", hash = "sha256:4716a9874bd246d68cca2ddd49faa55e9c280bb68fc399d839d902982647784e"}, - {file = "invenio_base-1.4.0-py2.py3-none-any.whl", hash = "sha256:c18ad980c5f35079935a02d27e4307da6e7b6f5722cabcb88e9128e4c47a36e8"}, + {file = "invenio-base-2.0.0.tar.gz", hash = "sha256:555577563aa3f46da096f9643c5a55dc8a8c9bb70971aa43e46d196794606f6f"}, + {file = "invenio_base-2.0.0-py2.py3-none-any.whl", hash = "sha256:178beb22df4927acc7fffb197e586a2a4738c040d42b64bd76071f21e4bad544"}, ] [package.dependencies] blinker = ">=1.4" -Flask = ">=1.1.4,<2.3.0" +Flask = ">=3.0.0" importlib-metadata = ">=4.4" importlib-resources = ">=5.0" -itsdangerous = ">=1.1.0,<2.1.0" +itsdangerous = ">=2.1.0" MarkupSafe = ">=0.23" -watchdog = ">2.0.0,<2.3.0" -Werkzeug = ">=1.0.1,<2.3.0" +watchdog = ">2.0.0" +Werkzeug = ">=3.0.0" [package.extras] -tests = ["pytest-black (>=0.3.0,<0.3.10)", "pytest-invenio (>=1.4.2)", "sphinx (>=4.2.0)"] +tests = ["freezegun (>=1.5.1)", "pytest-black-ng (>=0.4.0)", "pytest-invenio (>=1.4.2)", "sphinx (>=4.2.0)"] [[package]] name = "invenio-celery" -version = "1.3.1" +version = "2.0.0" description = "\"Celery module for Invenio.\"" optional = false python-versions = ">=3.7" +groups = ["main"] files = [ - {file = "invenio-celery-1.3.1.tar.gz", hash = "sha256:d5c001ccd80a788159b5f643b7cd20312e65b75670f2c3f7bf09ddf29cda9b16"}, - {file = "invenio_celery-1.3.1-py2.py3-none-any.whl", hash = "sha256:b121f64c21329faad1a5e6deae06fe9949c0fab226bd4447502ac143e9202c3c"}, + {file = "invenio_celery-2.0.0-py2.py3-none-any.whl", hash = "sha256:ab361212ab7ab5514deb2ffe3b2305ac2b942e2c16f333bf6dbc18f1d9da38f8"}, + {file = "invenio_celery-2.0.0.tar.gz", hash = "sha256:69092dcdaf2467e8b5c012a1a3e2d98b5e14a540d62634ea2cfdfefce5dc61a1"}, ] [package.dependencies] -celery = ">=5.1.0,<5.4" +celery = ">=5.1.0,<5.5" Flask-CeleryExt = ">=0.3.4" -invenio-base = ">=1.2.5" +invenio-base = ">=2.0.0,<3.0.0" msgpack = ">=0.6.2" redis = ">=2.10.0" [package.extras] -tests = ["Sphinx (>=5.0.0,<6.0.0)", "pytest-black-ng (>=0.4.0)", "pytest-invenio (>=1.4.0)"] +tests = ["Sphinx (>=5.0.0,<6.0.0)", "pytest-black-ng (>=0.4.0)", "pytest-invenio (>=3.0.0,<4.0.0)"] [[package]] name = "invenio-db" -version = "1.1.5" +version = "2.0.0" description = "Database management for Invenio." optional = false python-versions = ">=3.7" +groups = ["main"] files = [ - {file = "invenio-db-1.1.5.tar.gz", hash = "sha256:c02120e22d22498fcd23c3761a1d160c177261c760c38ccfddb4d671fcb7ddef"}, - {file = "invenio_db-1.1.5-py2.py3-none-any.whl", hash = "sha256:cbbe6d53678a04e21afd8220498a9ddde041bf5c7afd66df00fb46907b109c13"}, + {file = "invenio-db-2.0.0.tar.gz", hash = "sha256:3f2dc12d95fc2febcc2b35cb3b4ec315dd9b3ec43b272a8028b8ba76a4167be3"}, + {file = "invenio_db-2.0.0-py2.py3-none-any.whl", hash = "sha256:d365af39517b5effae56dd311879f79217bee8a6fc9c92e399b7fb6aee7f4ad6"}, ] [package.dependencies] -alembic = ">=1.10.0,<1.11.0" -Flask-Alembic = ">=2.0.1" -Flask-SQLAlchemy = ">=2.1,<3.0.0" +alembic = ">=1.10.0" +Flask-Alembic = ">=3.0.0" +Flask-SQLAlchemy = ">=3.0" invenio-base = ">=1.2.10" -SQLAlchemy = {version = ">=1.2.18,<1.5.0", extras = ["asyncio"]} +SQLAlchemy = {version = ">=2.0.0", extras = ["asyncio"]} SQLAlchemy-Continuum = ">=1.3.12" -SQLAlchemy-Utils = ">=0.33.1,<0.39" +SQLAlchemy-Utils = ">=0.33.1" [package.extras] mysql = ["pymysql (>=0.10.1)"] postgresql = ["psycopg2-binary (>=2.8.6)"] -tests = ["Sphinx (>=4.5.0)", "cryptography (>=2.1.4)", "pytest-black (>=0.3.0)", "pytest-invenio (>=1.4.5)"] +tests = ["Sphinx (>=4.5.0)", "cryptography (>=2.1.4)", "pytest-black-ng (>=0.4.0)", "pytest-invenio (>=1.4.5)", "six (>=1.0.0)"] [[package]] name = "invenio-i18n" -version = "2.1.1" +version = "3.0.0" description = "Invenio internationalization (I18N) module." optional = false python-versions = ">=3.7" +groups = ["main"] files = [ - {file = "invenio-i18n-2.1.1.tar.gz", hash = "sha256:915e011a22acfe71e83a4c1bf8ab2a7a064d977b28ba631ede0e0ab2aa0cb592"}, - {file = "invenio_i18n-2.1.1-py2.py3-none-any.whl", hash = "sha256:057a2d67b3453a7dd2e7d70881074ed5c4dc983615472467cb6b5057366246fa"}, + {file = "invenio_i18n-3.0.0-py2.py3-none-any.whl", hash = "sha256:d06e02c14e07a09bf6989ac564c8cc17388382ebd2806c2fc18e8495421b767b"}, + {file = "invenio_i18n-3.0.0.tar.gz", hash = "sha256:81d55f1e96a8c1f9c777565d31af5fbd5c6cc5adebc1adb93f5ad2faa3e1bb2f"}, ] [package.dependencies] Babel = ">=2.8" Flask-Babel = ">=3.0.0" -invenio-base = ">=1.2.11" +invenio-base = ">=2.0.0,<3.0.0" +pytz = "<2024.2" + +[package.extras] +tests = ["Flask-Login (>=0.6.2)", "invenio-assets (>=4.0.0,<5.0.0)", "pytest-black-ng (>=0.4.0)", "pytest-invenio (>=3.0.0,<4.0.0)", "sphinx (>=4.5)"] + +[[package]] +name = "invenio-logging" +version = "4.0.2" +description = "\"Module providing logging capabilities.\"" +optional = false +python-versions = ">=3.8" +groups = ["main"] +files = [ + {file = "invenio_logging-4.0.2-py2.py3-none-any.whl", hash = "sha256:401aa84e82d7e180d1be4972f6f70e87aab2e7df7ce16ac477cde6d7a7c1263b"}, + {file = "invenio_logging-4.0.2.tar.gz", hash = "sha256:98a684469540dffcef93d0612bd9da47e25c33ad61a14c65943e130a2fce3667"}, +] + +[package.dependencies] +invenio-celery = ">=2.0.0,<3.0.0" +invenio-db = ">=2.0.0,<3.0.0" [package.extras] -tests = ["Flask-Login (>=0.6.2)", "invenio-assets (>=1.3.0,<2.0.0)", "pytest-black (>=0.3.0)", "pytest-invenio (>=1.4.6)", "sphinx (>=4.5)"] +sentry = ["sentry-sdk[flask] (>=1.0.0,<2.0.0)"] +tests = ["flask-login (>=0.6.1)", "httpretty (>=0.8.14)", "iniconfig (>=1.1.1)", "mock (>=1.3.0)", "pytest-black-ng (>=0.4.0)", "pytest-invenio (>=3.0.0,<4.0.0)", "sentry-sdk[flask] (>=1.0.0,<2.0.0)", "sphinx (>=4.5)"] [[package]] name = "invenio-mail" -version = "2.1.0" +version = "2.2.1" description = "Invenio-Mail is an integration layer between Invenio and Flask-Mail." optional = false python-versions = ">=3.7" +groups = ["main"] files = [ - {file = "invenio-mail-2.1.0.tar.gz", hash = "sha256:fe2e660faab86653288eb9732ce06702f2c9b0fefbabe9fea1aaf49efed708e9"}, - {file = "invenio_mail-2.1.0-py2.py3-none-any.whl", hash = "sha256:d31824cdfa7aff15e0ff67f20258cca87adc4548a4711d4b0bd6e318b30cfd2f"}, + {file = "invenio_mail-2.2.1-py2.py3-none-any.whl", hash = "sha256:80f5446880421189cf69e80cf1a654f651d3f597cdd8411ee136550e565dcdb0"}, + {file = "invenio_mail-2.2.1.tar.gz", hash = "sha256:893d57c34e2591cf08cb458cff005ec0c67868708fb1fef144ac589dca28ff1d"}, ] [package.dependencies] Flask = ">=0.11.1" -Flask-Mail = ">=0.9.1" +Flask-Mail = ">=0.9.1,<0.10.0" [package.extras] -tests = ["Flask-CeleryExt (>=0.2.2)", "pytest-black (>=0.3.0,<0.3.10)", "pytest-invenio (>=1.4.0)", "sphinx (>=4.5)"] +tests = ["Flask-CeleryExt (>=0.2.2)", "pytest-black-ng (>=0.4.0)", "pytest-invenio (>=2.1.0,<3.0.0)", "sphinx (>=4.5.0)"] [[package]] name = "invenio-rest" -version = "1.2.8" -description = "REST API module for Invenio." +version = "2.0.0" +description = "\"REST API module for Invenio.\"" optional = false -python-versions = "*" +python-versions = ">=3.7" +groups = ["main"] files = [ - {file = "invenio-rest-1.2.8.tar.gz", hash = "sha256:4bb0958dbbcb7cada2c8214afb349249eb562e602d767477b285afc9e9de479f"}, - {file = "invenio_rest-1.2.8-py2.py3-none-any.whl", hash = "sha256:80c348282715b4a40855f8ea04f3f3acbda7d4f37e8e60e81f91115e31f8883b"}, + {file = "invenio_rest-2.0.0-py2.py3-none-any.whl", hash = "sha256:4655f4385037b828f2c6784e1e00f148d0a4909b877b5d5b3154a56bd9a1e144"}, + {file = "invenio_rest-2.0.0.tar.gz", hash = "sha256:8f705f9e7452b82f52383f6de5739da3a361f55db3467391884857b7aa3ed6be"}, ] [package.dependencies] Flask-CORS = ">=2.1.0" -invenio-base = ">=1.2.5" -itsdangerous = ">=1.1,<2.1" +invenio-base = ">=2.0.0,<3.0.0" +invenio-logging = ">=4.0.0,<5.0.0" +itsdangerous = ">=2.2.0" marshmallow = ">=2.15.2" webargs = ">=5.5.0,<6.0.0" [package.extras] -all = ["Sphinx (==4.2.0)", "pytest-invenio (>=1.4.0)", "xmltodict (>=0.11.0)"] -docs = ["Sphinx (==4.2.0)"] -tests = ["Sphinx (==4.2.0)", "pytest-invenio (>=1.4.0)", "xmltodict (>=0.11.0)"] +tests = ["Sphinx (>=4.5.0)", "pytest-black-ng (>=0.4.0)", "pytest-invenio (>=3.0.0,<4.0.0)", "xmltodict (>=0.11.0)"] [[package]] name = "invenio-theme" -version = "3.1.0" +version = "4.1.0" description = "\"Invenio standard theme.\"" optional = false python-versions = ">=3.7" +groups = ["main"] files = [ - {file = "invenio-theme-3.1.0.tar.gz", hash = "sha256:1445db2b61fa5a22147b490a2c2c78aa86e5aa7ca9646cb1d443fec8545a4de8"}, - {file = "invenio_theme-3.1.0-py2.py3-none-any.whl", hash = "sha256:14dc8b37d9a06a092620228fc5d9878a735bea5a63b56dc4d69460a757ca2f31"}, + {file = "invenio_theme-4.1.0-py2.py3-none-any.whl", hash = "sha256:5973baf9a8bce028281ccb207acb20dd99f716331a334f851a971fe58f607153"}, + {file = "invenio_theme-4.1.0.tar.gz", hash = "sha256:79d7c87392751a41371f24f52aa7d5ab567a436a33034dc828c2cd5f02e5ddfa"}, ] [package.dependencies] Flask-Menu = ">=1.0.0" -invenio-assets = ">=1.2.7" -invenio-base = ">=1.2.5" -invenio-i18n = ">=2.0.0" +invenio-assets = ">=4.0.0,<5.0.0" +invenio-base = ">=2.0.0,<3.0.0" +invenio-i18n = ">=3.0.0,<4.0.0" jsmin = ">=3.0.0" [package.extras] -tests = ["Sphinx (>=5,<6)", "pytest-black-ng (>=0.4.0)", "pytest-invenio (>=1.4.2)"] +tests = ["Sphinx (>=5,<6)", "pytest-black-ng (>=0.4.0)", "pytest-invenio (>=3.0.0,<4.0.0)"] [[package]] name = "isort" -version = "5.11.5" +version = "6.0.0" description = "A Python utility / library to sort Python imports." optional = false -python-versions = ">=3.7.0" +python-versions = ">=3.9.0" +groups = ["dev"] files = [ - {file = "isort-5.11.5-py3-none-any.whl", hash = "sha256:ba1d72fb2595a01c7895a5128f9585a5cc4b6d395f1c8d514989b9a7eb2a8746"}, - {file = "isort-5.11.5.tar.gz", hash = "sha256:6be1f76a507cb2ecf16c7cf14a37e41609ca082330be4e3436a18ef74add55db"}, + {file = "isort-6.0.0-py3-none-any.whl", hash = "sha256:567954102bb47bb12e0fae62606570faacddd441e45683968c8d1734fb1af892"}, + {file = "isort-6.0.0.tar.gz", hash = "sha256:75d9d8a1438a9432a7d7b54f2d3b45cad9a4a0fdba43617d9873379704a8bdf1"}, ] [package.extras] -colors = ["colorama (>=0.4.3,<0.5.0)"] -pipfile-deprecated-finder = ["pip-shims (>=0.5.2)", "pipreqs", "requirementslib"] +colors = ["colorama"] plugins = ["setuptools"] -requirements-deprecated-finder = ["pip-api", "pipreqs"] [[package]] name = "itsdangerous" -version = "2.0.1" +version = "2.2.0" description = "Safely pass data to untrusted environments and back." optional = false -python-versions = ">=3.6" +python-versions = ">=3.8" +groups = ["main", "dev"] files = [ - {file = "itsdangerous-2.0.1-py3-none-any.whl", hash = "sha256:5174094b9637652bdb841a3029700391451bd092ba3db90600dea710ba28e97c"}, - {file = "itsdangerous-2.0.1.tar.gz", hash = "sha256:9e724d68fc22902a1435351f84c3fb8623f303fffcc566a4cb952df8c572cff0"}, + {file = "itsdangerous-2.2.0-py3-none-any.whl", hash = "sha256:c6242fc49e35958c8b15141343aa660db5fc54d4f13a1db01a3f5891b98700ef"}, + {file = "itsdangerous-2.2.0.tar.gz", hash = "sha256:e0050c0b7da1eea53ffaf149c0cfbb5c6e2e2b69c4bef22c81fa6eb73e5f6173"}, ] [[package]] name = "jinja2" -version = "3.1.3" +version = "3.1.5" description = "A very fast and expressive template engine." optional = false python-versions = ">=3.7" +groups = ["main", "dev"] files = [ - {file = "Jinja2-3.1.3-py3-none-any.whl", hash = "sha256:7d6d50dd97d52cbc355597bd845fabfbac3f551e1f99619e39a35ce8c370b5fa"}, - {file = "Jinja2-3.1.3.tar.gz", hash = "sha256:ac8bd6544d4bb2c9792bf3a159e80bba8fda7f07e81bc3aed565432d5925ba90"}, + {file = "jinja2-3.1.5-py3-none-any.whl", hash = "sha256:aba0f4dc9ed8013c424088f68a5c226f7d6097ed89b246d7749c2ec4175c6adb"}, + {file = "jinja2-3.1.5.tar.gz", hash = "sha256:8fefff8dc3034e27bb80d67c671eb8a9bc424c0ef4c0826edbff304cceff43bb"}, ] [package.dependencies] @@ -1471,75 +1537,78 @@ version = "3.0.1" description = "JavaScript minifier." optional = false python-versions = "*" +groups = ["main"] files = [ {file = "jsmin-3.0.1.tar.gz", hash = "sha256:c0959a121ef94542e807a674142606f7e90214a2b3d1eb17300244bbb5cc2bfc"}, ] [[package]] name = "jsonpickle" -version = "3.0.4" -description = "Serialize any Python object to JSON" +version = "4.0.2" +description = "jsonpickle encodes/decodes any Python object to/from JSON" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" +groups = ["main"] files = [ - {file = "jsonpickle-3.0.4-py3-none-any.whl", hash = "sha256:04ae7567a14269579e3af66b76bda284587458d7e8a204951ca8f71a3309952e"}, - {file = "jsonpickle-3.0.4.tar.gz", hash = "sha256:a1b14c8d6221cd8f394f2a97e735ea1d7edc927fbd135b26f2f8700657c8c62b"}, + {file = "jsonpickle-4.0.2-py3-none-any.whl", hash = "sha256:cd3c90d32a68dcaa7f0e4b918bda7d4bb61f3c03b182d82dae2caf9ded0ab6b3"}, + {file = "jsonpickle-4.0.2.tar.gz", hash = "sha256:3e650b9853adcdab9d9d62a88412b6d36e9a59ba423b01cacf0cd4ee80733aca"}, ] -[package.dependencies] -importlib-metadata = {version = "*", markers = "python_version < \"3.8\""} - [package.extras] -docs = ["furo", "rst.linker (>=1.9)", "sphinx"] -packaging = ["build", "twine"] -testing = ["bson", "ecdsa", "feedparser", "gmpy2", "numpy", "pandas", "pymongo", "pytest (>=3.5,!=3.7.3)", "pytest-benchmark", "pytest-benchmark[histogram]", "pytest-checkdocs (>=1.2.3)", "pytest-cov", "pytest-enabler (>=1.0.1)", "pytest-ruff (>=0.2.1)", "scikit-learn", "scipy", "scipy (>=1.9.3)", "simplejson", "sqlalchemy", "ujson"] +cov = ["pytest-cov"] +dev = ["black", "pyupgrade"] +docs = ["furo", "rst.linker (>=1.9)", "sphinx (>=3.5)"] +packaging = ["build", "setuptools (>=61.2)", "setuptools-scm[toml] (>=6.0)", "twine"] +testing = ["PyYAML", "atheris (>=2.3.0,<2.4.0) ; python_version < \"3.12\"", "bson", "ecdsa", "feedparser", "gmpy2", "numpy", "pandas", "pymongo", "pytest (>=6.0,!=8.1.*)", "pytest-benchmark", "pytest-benchmark[histogram]", "pytest-checkdocs (>=1.2.3)", "pytest-enabler (>=1.0.1)", "pytest-ruff (>=0.2.1)", "scikit-learn", "scipy (>=1.9.3) ; python_version > \"3.10\"", "scipy ; python_version <= \"3.10\"", "simplejson", "sqlalchemy", "ujson"] [[package]] name = "kombu" -version = "5.2.4" +version = "5.4.2" description = "Messaging library for Python." optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" +groups = ["main"] files = [ - {file = "kombu-5.2.4-py3-none-any.whl", hash = "sha256:8b213b24293d3417bcf0d2f5537b7f756079e3ea232a8386dcc89a59fd2361a4"}, - {file = "kombu-5.2.4.tar.gz", hash = "sha256:37cee3ee725f94ea8bb173eaab7c1760203ea53bbebae226328600f9d2799610"}, + {file = "kombu-5.4.2-py3-none-any.whl", hash = "sha256:14212f5ccf022fc0a70453bb025a1dcc32782a588c49ea866884047d66e14763"}, + {file = "kombu-5.4.2.tar.gz", hash = "sha256:eef572dd2fd9fc614b37580e3caeafdd5af46c1eff31e7fba89138cdb406f2cf"}, ] [package.dependencies] -amqp = ">=5.0.9,<6.0.0" -cached-property = {version = "*", markers = "python_version < \"3.8\""} -importlib-metadata = {version = ">=0.18", markers = "python_version < \"3.8\""} -vine = "*" +amqp = ">=5.1.1,<6.0.0" +typing-extensions = {version = "4.12.2", markers = "python_version < \"3.10\""} +tzdata = {version = "*", markers = "python_version >= \"3.9\""} +vine = "5.1.0" [package.extras] -azureservicebus = ["azure-servicebus (>=7.0.0)"] -azurestoragequeues = ["azure-storage-queue"] -consul = ["python-consul (>=0.6.0)"] -librabbitmq = ["librabbitmq (>=2.0.0)"] -mongodb = ["pymongo (>=3.3.0,<3.12.1)"] -msgpack = ["msgpack"] -pyro = ["pyro4"] +azureservicebus = ["azure-servicebus (>=7.10.0)"] +azurestoragequeues = ["azure-identity (>=1.12.0)", "azure-storage-queue (>=12.6.0)"] +confluentkafka = ["confluent-kafka (>=2.2.0)"] +consul = ["python-consul2 (==0.1.5)"] +librabbitmq = ["librabbitmq (>=2.0.0) ; python_version < \"3.11\""] +mongodb = ["pymongo (>=4.1.1)"] +msgpack = ["msgpack (==1.1.0)"] +pyro = ["pyro4 (==4.82)"] qpid = ["qpid-python (>=0.26)", "qpid-tools (>=0.26)"] -redis = ["redis (>=3.4.1,!=4.0.0,!=4.0.1)"] +redis = ["redis (>=4.5.2,!=4.5.5,!=5.0.2)"] slmq = ["softlayer-messaging (>=1.0.3)"] -sqlalchemy = ["sqlalchemy"] -sqs = ["boto3 (>=1.9.12)", "pycurl (>=7.44.1,<7.45.0)", "urllib3 (>=1.26.7)"] +sqlalchemy = ["sqlalchemy (>=1.4.48,<2.1)"] +sqs = ["boto3 (>=1.26.143)", "pycurl (>=7.43.0.5) ; sys_platform != \"win32\" and platform_python_implementation == \"CPython\"", "urllib3 (>=1.26.16)"] yaml = ["PyYAML (>=3.10)"] -zookeeper = ["kazoo (>=1.3.1)"] +zookeeper = ["kazoo (>=2.8.0)"] [[package]] name = "mako" -version = "1.2.4" +version = "1.3.9" description = "A super-fast templating language that borrows the best ideas from the existing templating languages." optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" +groups = ["main"] files = [ - {file = "Mako-1.2.4-py3-none-any.whl", hash = "sha256:c97c79c018b9165ac9922ae4f32da095ffd3c4e6872b45eded42926deea46818"}, - {file = "Mako-1.2.4.tar.gz", hash = "sha256:d60a3903dc3bb01a18ad6a89cdbe2e4eadc69c0bc8ef1e3773ba53d44c3f7a34"}, + {file = "Mako-1.3.9-py3-none-any.whl", hash = "sha256:95920acccb578427a9aa38e37a186b1e43156c87260d7ba18ca63aa4c7cbd3a1"}, + {file = "mako-1.3.9.tar.gz", hash = "sha256:b5d65ff3462870feec922dbccf38f6efb44e5714d7b593a656be86663d8600ac"}, ] [package.dependencies] -importlib-metadata = {version = "*", markers = "python_version < \"3.8\""} MarkupSafe = ">=0.9.2" [package.extras] @@ -1549,101 +1618,182 @@ testing = ["pytest"] [[package]] name = "markupsafe" -version = "2.1.5" +version = "3.0.2" description = "Safely add untrusted strings to HTML/XML markup." optional = false -python-versions = ">=3.7" -files = [ - {file = "MarkupSafe-2.1.5-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:a17a92de5231666cfbe003f0e4b9b3a7ae3afb1ec2845aadc2bacc93ff85febc"}, - {file = "MarkupSafe-2.1.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:72b6be590cc35924b02c78ef34b467da4ba07e4e0f0454a2c5907f473fc50ce5"}, - {file = "MarkupSafe-2.1.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e61659ba32cf2cf1481e575d0462554625196a1f2fc06a1c777d3f48e8865d46"}, - {file = "MarkupSafe-2.1.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2174c595a0d73a3080ca3257b40096db99799265e1c27cc5a610743acd86d62f"}, - {file = "MarkupSafe-2.1.5-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ae2ad8ae6ebee9d2d94b17fb62763125f3f374c25618198f40cbb8b525411900"}, - {file = "MarkupSafe-2.1.5-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:075202fa5b72c86ad32dc7d0b56024ebdbcf2048c0ba09f1cde31bfdd57bcfff"}, - {file = "MarkupSafe-2.1.5-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:598e3276b64aff0e7b3451b72e94fa3c238d452e7ddcd893c3ab324717456bad"}, - {file = "MarkupSafe-2.1.5-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:fce659a462a1be54d2ffcacea5e3ba2d74daa74f30f5f143fe0c58636e355fdd"}, - {file = "MarkupSafe-2.1.5-cp310-cp310-win32.whl", hash = "sha256:d9fad5155d72433c921b782e58892377c44bd6252b5af2f67f16b194987338a4"}, - {file = "MarkupSafe-2.1.5-cp310-cp310-win_amd64.whl", hash = "sha256:bf50cd79a75d181c9181df03572cdce0fbb75cc353bc350712073108cba98de5"}, - {file = "MarkupSafe-2.1.5-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:629ddd2ca402ae6dbedfceeba9c46d5f7b2a61d9749597d4307f943ef198fc1f"}, - {file = "MarkupSafe-2.1.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:5b7b716f97b52c5a14bffdf688f971b2d5ef4029127f1ad7a513973cfd818df2"}, - {file = "MarkupSafe-2.1.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6ec585f69cec0aa07d945b20805be741395e28ac1627333b1c5b0105962ffced"}, - {file = "MarkupSafe-2.1.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b91c037585eba9095565a3556f611e3cbfaa42ca1e865f7b8015fe5c7336d5a5"}, - {file = "MarkupSafe-2.1.5-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7502934a33b54030eaf1194c21c692a534196063db72176b0c4028e140f8f32c"}, - {file = "MarkupSafe-2.1.5-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:0e397ac966fdf721b2c528cf028494e86172b4feba51d65f81ffd65c63798f3f"}, - {file = "MarkupSafe-2.1.5-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:c061bb86a71b42465156a3ee7bd58c8c2ceacdbeb95d05a99893e08b8467359a"}, - {file = "MarkupSafe-2.1.5-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:3a57fdd7ce31c7ff06cdfbf31dafa96cc533c21e443d57f5b1ecc6cdc668ec7f"}, - {file = "MarkupSafe-2.1.5-cp311-cp311-win32.whl", hash = "sha256:397081c1a0bfb5124355710fe79478cdbeb39626492b15d399526ae53422b906"}, - {file = "MarkupSafe-2.1.5-cp311-cp311-win_amd64.whl", hash = "sha256:2b7c57a4dfc4f16f7142221afe5ba4e093e09e728ca65c51f5620c9aaeb9a617"}, - {file = "MarkupSafe-2.1.5-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:8dec4936e9c3100156f8a2dc89c4b88d5c435175ff03413b443469c7c8c5f4d1"}, - {file = "MarkupSafe-2.1.5-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:3c6b973f22eb18a789b1460b4b91bf04ae3f0c4234a0a6aa6b0a92f6f7b951d4"}, - {file = "MarkupSafe-2.1.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ac07bad82163452a6884fe8fa0963fb98c2346ba78d779ec06bd7a6262132aee"}, - {file = "MarkupSafe-2.1.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f5dfb42c4604dddc8e4305050aa6deb084540643ed5804d7455b5df8fe16f5e5"}, - {file = "MarkupSafe-2.1.5-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ea3d8a3d18833cf4304cd2fc9cbb1efe188ca9b5efef2bdac7adc20594a0e46b"}, - {file = "MarkupSafe-2.1.5-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:d050b3361367a06d752db6ead6e7edeb0009be66bc3bae0ee9d97fb326badc2a"}, - {file = "MarkupSafe-2.1.5-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:bec0a414d016ac1a18862a519e54b2fd0fc8bbfd6890376898a6c0891dd82e9f"}, - {file = "MarkupSafe-2.1.5-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:58c98fee265677f63a4385256a6d7683ab1832f3ddd1e66fe948d5880c21a169"}, - {file = "MarkupSafe-2.1.5-cp312-cp312-win32.whl", hash = "sha256:8590b4ae07a35970728874632fed7bd57b26b0102df2d2b233b6d9d82f6c62ad"}, - {file = "MarkupSafe-2.1.5-cp312-cp312-win_amd64.whl", hash = "sha256:823b65d8706e32ad2df51ed89496147a42a2a6e01c13cfb6ffb8b1e92bc910bb"}, - {file = "MarkupSafe-2.1.5-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:c8b29db45f8fe46ad280a7294f5c3ec36dbac9491f2d1c17345be8e69cc5928f"}, - {file = "MarkupSafe-2.1.5-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ec6a563cff360b50eed26f13adc43e61bc0c04d94b8be985e6fb24b81f6dcfdf"}, - {file = "MarkupSafe-2.1.5-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a549b9c31bec33820e885335b451286e2969a2d9e24879f83fe904a5ce59d70a"}, - {file = "MarkupSafe-2.1.5-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4f11aa001c540f62c6166c7726f71f7573b52c68c31f014c25cc7901deea0b52"}, - {file = "MarkupSafe-2.1.5-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:7b2e5a267c855eea6b4283940daa6e88a285f5f2a67f2220203786dfa59b37e9"}, - {file = "MarkupSafe-2.1.5-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:2d2d793e36e230fd32babe143b04cec8a8b3eb8a3122d2aceb4a371e6b09b8df"}, - {file = "MarkupSafe-2.1.5-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:ce409136744f6521e39fd8e2a24c53fa18ad67aa5bc7c2cf83645cce5b5c4e50"}, - {file = "MarkupSafe-2.1.5-cp37-cp37m-win32.whl", hash = "sha256:4096e9de5c6fdf43fb4f04c26fb114f61ef0bf2e5604b6ee3019d51b69e8c371"}, - {file = "MarkupSafe-2.1.5-cp37-cp37m-win_amd64.whl", hash = "sha256:4275d846e41ecefa46e2015117a9f491e57a71ddd59bbead77e904dc02b1bed2"}, - {file = "MarkupSafe-2.1.5-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:656f7526c69fac7f600bd1f400991cc282b417d17539a1b228617081106feb4a"}, - {file = "MarkupSafe-2.1.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:97cafb1f3cbcd3fd2b6fbfb99ae11cdb14deea0736fc2b0952ee177f2b813a46"}, - {file = "MarkupSafe-2.1.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1f3fbcb7ef1f16e48246f704ab79d79da8a46891e2da03f8783a5b6fa41a9532"}, - {file = "MarkupSafe-2.1.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fa9db3f79de01457b03d4f01b34cf91bc0048eb2c3846ff26f66687c2f6d16ab"}, - {file = "MarkupSafe-2.1.5-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ffee1f21e5ef0d712f9033568f8344d5da8cc2869dbd08d87c84656e6a2d2f68"}, - {file = "MarkupSafe-2.1.5-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:5dedb4db619ba5a2787a94d877bc8ffc0566f92a01c0ef214865e54ecc9ee5e0"}, - {file = "MarkupSafe-2.1.5-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:30b600cf0a7ac9234b2638fbc0fb6158ba5bdcdf46aeb631ead21248b9affbc4"}, - {file = "MarkupSafe-2.1.5-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:8dd717634f5a044f860435c1d8c16a270ddf0ef8588d4887037c5028b859b0c3"}, - {file = "MarkupSafe-2.1.5-cp38-cp38-win32.whl", hash = "sha256:daa4ee5a243f0f20d528d939d06670a298dd39b1ad5f8a72a4275124a7819eff"}, - {file = "MarkupSafe-2.1.5-cp38-cp38-win_amd64.whl", hash = "sha256:619bc166c4f2de5caa5a633b8b7326fbe98e0ccbfacabd87268a2b15ff73a029"}, - {file = "MarkupSafe-2.1.5-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:7a68b554d356a91cce1236aa7682dc01df0edba8d043fd1ce607c49dd3c1edcf"}, - {file = "MarkupSafe-2.1.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:db0b55e0f3cc0be60c1f19efdde9a637c32740486004f20d1cff53c3c0ece4d2"}, - {file = "MarkupSafe-2.1.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3e53af139f8579a6d5f7b76549125f0d94d7e630761a2111bc431fd820e163b8"}, - {file = "MarkupSafe-2.1.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:17b950fccb810b3293638215058e432159d2b71005c74371d784862b7e4683f3"}, - {file = "MarkupSafe-2.1.5-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4c31f53cdae6ecfa91a77820e8b151dba54ab528ba65dfd235c80b086d68a465"}, - {file = "MarkupSafe-2.1.5-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:bff1b4290a66b490a2f4719358c0cdcd9bafb6b8f061e45c7a2460866bf50c2e"}, - {file = "MarkupSafe-2.1.5-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:bc1667f8b83f48511b94671e0e441401371dfd0f0a795c7daa4a3cd1dde55bea"}, - {file = "MarkupSafe-2.1.5-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:5049256f536511ee3f7e1b3f87d1d1209d327e818e6ae1365e8653d7e3abb6a6"}, - {file = "MarkupSafe-2.1.5-cp39-cp39-win32.whl", hash = "sha256:00e046b6dd71aa03a41079792f8473dc494d564611a8f89bbbd7cb93295ebdcf"}, - {file = "MarkupSafe-2.1.5-cp39-cp39-win_amd64.whl", hash = "sha256:fa173ec60341d6bb97a89f5ea19c85c5643c1e7dedebc22f5181eb73573142c5"}, - {file = "MarkupSafe-2.1.5.tar.gz", hash = "sha256:d283d37a890ba4c1ae73ffadf8046435c76e7bc2247bbb63c00bd1a709c6544b"}, +python-versions = ">=3.9" +groups = ["main", "dev"] +files = [ + {file = "MarkupSafe-3.0.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:7e94c425039cde14257288fd61dcfb01963e658efbc0ff54f5306b06054700f8"}, + {file = "MarkupSafe-3.0.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9e2d922824181480953426608b81967de705c3cef4d1af983af849d7bd619158"}, + {file = "MarkupSafe-3.0.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:38a9ef736c01fccdd6600705b09dc574584b89bea478200c5fbf112a6b0d5579"}, + {file = "MarkupSafe-3.0.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bbcb445fa71794da8f178f0f6d66789a28d7319071af7a496d4d507ed566270d"}, + {file = "MarkupSafe-3.0.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:57cb5a3cf367aeb1d316576250f65edec5bb3be939e9247ae594b4bcbc317dfb"}, + {file = "MarkupSafe-3.0.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:3809ede931876f5b2ec92eef964286840ed3540dadf803dd570c3b7e13141a3b"}, + {file = "MarkupSafe-3.0.2-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:e07c3764494e3776c602c1e78e298937c3315ccc9043ead7e685b7f2b8d47b3c"}, + {file = "MarkupSafe-3.0.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:b424c77b206d63d500bcb69fa55ed8d0e6a3774056bdc4839fc9298a7edca171"}, + {file = "MarkupSafe-3.0.2-cp310-cp310-win32.whl", hash = "sha256:fcabf5ff6eea076f859677f5f0b6b5c1a51e70a376b0579e0eadef8db48c6b50"}, + {file = "MarkupSafe-3.0.2-cp310-cp310-win_amd64.whl", hash = "sha256:6af100e168aa82a50e186c82875a5893c5597a0c1ccdb0d8b40240b1f28b969a"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:9025b4018f3a1314059769c7bf15441064b2207cb3f065e6ea1e7359cb46db9d"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:93335ca3812df2f366e80509ae119189886b0f3c2b81325d39efdb84a1e2ae93"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2cb8438c3cbb25e220c2ab33bb226559e7afb3baec11c4f218ffa7308603c832"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a123e330ef0853c6e822384873bef7507557d8e4a082961e1defa947aa59ba84"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1e084f686b92e5b83186b07e8a17fc09e38fff551f3602b249881fec658d3eca"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:d8213e09c917a951de9d09ecee036d5c7d36cb6cb7dbaece4c71a60d79fb9798"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:5b02fb34468b6aaa40dfc198d813a641e3a63b98c2b05a16b9f80b7ec314185e"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:0bff5e0ae4ef2e1ae4fdf2dfd5b76c75e5c2fa4132d05fc1b0dabcd20c7e28c4"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-win32.whl", hash = "sha256:6c89876f41da747c8d3677a2b540fb32ef5715f97b66eeb0c6b66f5e3ef6f59d"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:70a87b411535ccad5ef2f1df5136506a10775d267e197e4cf531ced10537bd6b"}, + {file = "MarkupSafe-3.0.2-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:9778bd8ab0a994ebf6f84c2b949e65736d5575320a17ae8984a77fab08db94cf"}, + {file = "MarkupSafe-3.0.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:846ade7b71e3536c4e56b386c2a47adf5741d2d8b94ec9dc3e92e5e1ee1e2225"}, + {file = "MarkupSafe-3.0.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1c99d261bd2d5f6b59325c92c73df481e05e57f19837bdca8413b9eac4bd8028"}, + {file = "MarkupSafe-3.0.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e17c96c14e19278594aa4841ec148115f9c7615a47382ecb6b82bd8fea3ab0c8"}, + {file = "MarkupSafe-3.0.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:88416bd1e65dcea10bc7569faacb2c20ce071dd1f87539ca2ab364bf6231393c"}, + {file = "MarkupSafe-3.0.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:2181e67807fc2fa785d0592dc2d6206c019b9502410671cc905d132a92866557"}, + {file = "MarkupSafe-3.0.2-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:52305740fe773d09cffb16f8ed0427942901f00adedac82ec8b67752f58a1b22"}, + {file = "MarkupSafe-3.0.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:ad10d3ded218f1039f11a75f8091880239651b52e9bb592ca27de44eed242a48"}, + {file = "MarkupSafe-3.0.2-cp312-cp312-win32.whl", hash = "sha256:0f4ca02bea9a23221c0182836703cbf8930c5e9454bacce27e767509fa286a30"}, + {file = "MarkupSafe-3.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:8e06879fc22a25ca47312fbe7c8264eb0b662f6db27cb2d3bbbc74b1df4b9b87"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:ba9527cdd4c926ed0760bc301f6728ef34d841f405abf9d4f959c478421e4efd"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f8b3d067f2e40fe93e1ccdd6b2e1d16c43140e76f02fb1319a05cf2b79d99430"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:569511d3b58c8791ab4c2e1285575265991e6d8f8700c7be0e88f86cb0672094"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:15ab75ef81add55874e7ab7055e9c397312385bd9ced94920f2802310c930396"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f3818cb119498c0678015754eba762e0d61e5b52d34c8b13d770f0719f7b1d79"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:cdb82a876c47801bb54a690c5ae105a46b392ac6099881cdfb9f6e95e4014c6a"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:cabc348d87e913db6ab4aa100f01b08f481097838bdddf7c7a84b7575b7309ca"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:444dcda765c8a838eaae23112db52f1efaf750daddb2d9ca300bcae1039adc5c"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-win32.whl", hash = "sha256:bcf3e58998965654fdaff38e58584d8937aa3096ab5354d493c77d1fdd66d7a1"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-win_amd64.whl", hash = "sha256:e6a2a455bd412959b57a172ce6328d2dd1f01cb2135efda2e4576e8a23fa3b0f"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:b5a6b3ada725cea8a5e634536b1b01c30bcdcd7f9c6fff4151548d5bf6b3a36c"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:a904af0a6162c73e3edcb969eeeb53a63ceeb5d8cf642fade7d39e7963a22ddb"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4aa4e5faecf353ed117801a068ebab7b7e09ffb6e1d5e412dc852e0da018126c"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c0ef13eaeee5b615fb07c9a7dadb38eac06a0608b41570d8ade51c56539e509d"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d16a81a06776313e817c951135cf7340a3e91e8c1ff2fac444cfd75fffa04afe"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:6381026f158fdb7c72a168278597a5e3a5222e83ea18f543112b2662a9b699c5"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:3d79d162e7be8f996986c064d1c7c817f6df3a77fe3d6859f6f9e7be4b8c213a"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:131a3c7689c85f5ad20f9f6fb1b866f402c445b220c19fe4308c0b147ccd2ad9"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-win32.whl", hash = "sha256:ba8062ed2cf21c07a9e295d5b8a2a5ce678b913b45fdf68c32d95d6c1291e0b6"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-win_amd64.whl", hash = "sha256:e444a31f8db13eb18ada366ab3cf45fd4b31e4db1236a4448f68778c1d1a5a2f"}, + {file = "MarkupSafe-3.0.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:eaa0a10b7f72326f1372a713e73c3f739b524b3af41feb43e4921cb529f5929a"}, + {file = "MarkupSafe-3.0.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:48032821bbdf20f5799ff537c7ac3d1fba0ba032cfc06194faffa8cda8b560ff"}, + {file = "MarkupSafe-3.0.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1a9d3f5f0901fdec14d8d2f66ef7d035f2157240a433441719ac9a3fba440b13"}, + {file = "MarkupSafe-3.0.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:88b49a3b9ff31e19998750c38e030fc7bb937398b1f78cfa599aaef92d693144"}, + {file = "MarkupSafe-3.0.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cfad01eed2c2e0c01fd0ecd2ef42c492f7f93902e39a42fc9ee1692961443a29"}, + {file = "MarkupSafe-3.0.2-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:1225beacc926f536dc82e45f8a4d68502949dc67eea90eab715dea3a21c1b5f0"}, + {file = "MarkupSafe-3.0.2-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:3169b1eefae027567d1ce6ee7cae382c57fe26e82775f460f0b2778beaad66c0"}, + {file = "MarkupSafe-3.0.2-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:eb7972a85c54febfb25b5c4b4f3af4dcc731994c7da0d8a0b4a6eb0640e1d178"}, + {file = "MarkupSafe-3.0.2-cp39-cp39-win32.whl", hash = "sha256:8c4e8c3ce11e1f92f6536ff07154f9d49677ebaaafc32db9db4620bc11ed480f"}, + {file = "MarkupSafe-3.0.2-cp39-cp39-win_amd64.whl", hash = "sha256:6e296a513ca3d94054c2c881cc913116e90fd030ad1c656b3869762b754f5f8a"}, + {file = "markupsafe-3.0.2.tar.gz", hash = "sha256:ee55d3edf80167e48ea11a923c7386f4669df67d7994554387f84e7d8b0a2bf0"}, ] [[package]] name = "marshmallow" -version = "3.19.0" +version = "3.26.1" description = "A lightweight library for converting complex datatypes to and from native Python datatypes." optional = false -python-versions = ">=3.7" +python-versions = ">=3.9" +groups = ["main"] files = [ - {file = "marshmallow-3.19.0-py3-none-any.whl", hash = "sha256:93f0958568da045b0021ec6aeb7ac37c81bfcccbb9a0e7ed8559885070b3a19b"}, - {file = "marshmallow-3.19.0.tar.gz", hash = "sha256:90032c0fd650ce94b6ec6dc8dfeb0e3ff50c144586462c389b81a07205bedb78"}, + {file = "marshmallow-3.26.1-py3-none-any.whl", hash = "sha256:3350409f20a70a7e4e11a27661187b77cdcaeb20abca41c1454fe33636bea09c"}, + {file = "marshmallow-3.26.1.tar.gz", hash = "sha256:e6d8affb6cb61d39d26402096dc0aee12d5a26d490a121f118d2e81dc0719dc6"}, ] [package.dependencies] packaging = ">=17.0" [package.extras] -dev = ["flake8 (==5.0.4)", "flake8-bugbear (==22.10.25)", "mypy (==0.990)", "pre-commit (>=2.4,<3.0)", "pytest", "pytz", "simplejson", "tox"] -docs = ["alabaster (==0.7.12)", "autodocsumm (==0.2.9)", "sphinx (==5.3.0)", "sphinx-issues (==3.0.1)", "sphinx-version-warning (==1.1.2)"] -lint = ["flake8 (==5.0.4)", "flake8-bugbear (==22.10.25)", "mypy (==0.990)", "pre-commit (>=2.4,<3.0)"] -tests = ["pytest", "pytz", "simplejson"] +dev = ["marshmallow[tests]", "pre-commit (>=3.5,<5.0)", "tox"] +docs = ["autodocsumm (==0.2.14)", "furo (==2024.8.6)", "sphinx (==8.1.3)", "sphinx-copybutton (==0.5.2)", "sphinx-issues (==5.0.0)", "sphinxext-opengraph (==0.9.1)"] +tests = ["pytest", "simplejson"] [[package]] name = "maxminddb" -version = "2.4.0" +version = "2.6.3" description = "Reader for the MaxMind DB format" optional = false -python-versions = ">=3.7" -files = [ - {file = "maxminddb-2.4.0.tar.gz", hash = "sha256:81e54e53408bd502650e5969ccba16780af659ec1db1c44b2c997e4330a5ed96"}, +python-versions = ">=3.8" +groups = ["main"] +files = [ + {file = "maxminddb-2.6.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d69c5493c81f11bca90961b4dfa028c031aa8e7bb156653edf242a03dfc51561"}, + {file = "maxminddb-2.6.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:6cc002099c9e1637309df772789a36db9a4601c4623dd1ace8145d057358c20b"}, + {file = "maxminddb-2.6.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ef41bfe15692fe15e1799d600366a0faa3673a0d7d7dbe6a305ec3a5b6f07708"}, + {file = "maxminddb-2.6.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:46bdc8dc528a2f64ef34182bf40084e05410344d40097c1e93554d732dfb0e15"}, + {file = "maxminddb-2.6.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:98258a295149aadf96ed8d667468722b248fe47bb991891ad01cfa8cb9e9684a"}, + {file = "maxminddb-2.6.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:0dd55d2498d287b6cfd6b857deed9070e53c4b22a1acd69615e88dec92d95fb3"}, + {file = "maxminddb-2.6.3-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:e38a449890a976365da1f2c927ac076838aa2715b464593080075a18ae4e0dc8"}, + {file = "maxminddb-2.6.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:a70d46337c9497a5b3329d9c7fa7f45be33243ffad04924b8f06ffe41a136279"}, + {file = "maxminddb-2.6.3-cp310-cp310-win32.whl", hash = "sha256:45da7549c952f88da39c9f440cb3fa2abbd7472571597699467641af88512730"}, + {file = "maxminddb-2.6.3-cp310-cp310-win_amd64.whl", hash = "sha256:6c977da32cc72784980da1928a79d38b3e9fe83faa9a40ea9bae598a6bf2f7bb"}, + {file = "maxminddb-2.6.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:27ba5e22bd09fe324f0a4c5ed97e73c1c7c3ab7e3bae4e1e6fcaa15f175b9f5a"}, + {file = "maxminddb-2.6.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:fa36f1ca12fd3a37ad758afd0666457a749b2c4b16db0eb3f8c953f55ae6325d"}, + {file = "maxminddb-2.6.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:83d2324788a31a28bbb38b0dbdece5826f56db4df6e1538cf6f4b72f6a3da66c"}, + {file = "maxminddb-2.6.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d4bac2b7b7609bed8dcf6beef1ef4a1e411e9e39c311070ffc2ace80d6de6444"}, + {file = "maxminddb-2.6.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8868580f34b483d5b74edd4270db417e211906d57fb13bbeeb11ea8d5cd01829"}, + {file = "maxminddb-2.6.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:b29cea50b191784e2242227e0fac5bc985972b3849f97fe96c7f37fb7a7426d7"}, + {file = "maxminddb-2.6.3-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:4d470fc4f9c5ed8854a945dc5ea56b2f0644a5c3e5872d0e579d66a5a9238d7f"}, + {file = "maxminddb-2.6.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:2849357de35bfed0011ad1ff14a83c946273ae8c75a8867612d22f559df70e7d"}, + {file = "maxminddb-2.6.3-cp311-cp311-win32.whl", hash = "sha256:39254e173af7b0018c1508c2dd68ecda0c043032176140cfe917587e2d082f42"}, + {file = "maxminddb-2.6.3-cp311-cp311-win_amd64.whl", hash = "sha256:489c5ae835198a228380b83cc537a5ffb1911f1579d7545baf097e4a8eefcd9a"}, + {file = "maxminddb-2.6.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:2b0fef825b23df047876d2056cbb69fb8d8e4b965f744f674be75e16fb86a52e"}, + {file = "maxminddb-2.6.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:a38faf03db15cc285009c0ddaacd04071b84ebd8ff7d773f700c7def695a291c"}, + {file = "maxminddb-2.6.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:edab18a50470031fc8447bcd9285c9f5f952abef2b6db5579fe50665bdcda941"}, + {file = "maxminddb-2.6.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:415dd5de87adc7640d3da2a8e7cf19a313c1a715cb84a3433f0e3b2d27665319"}, + {file = "maxminddb-2.6.3-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d78a02b70ededb3ba7317c24266217d7b68283e3be04cad0c34ee446a0217ee0"}, + {file = "maxminddb-2.6.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:4b80275603bba6a95ed69d859d184dfa60bfd8e83cd4c8b722d7f7eaa9d95f8f"}, + {file = "maxminddb-2.6.3-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:a6868438d1771c0bd0bbc95d84480c1ae04df72a85879e1ada42762250a00f59"}, + {file = "maxminddb-2.6.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:efd875d43c4207fb90e10d582e4394d8a04f7b55c83c4d6bc0593a7be450e04f"}, + {file = "maxminddb-2.6.3-cp312-cp312-win32.whl", hash = "sha256:aadb9d12e887a1f52e8214e539e5d78338356fad4ef2a51931f6f7dbe56c2228"}, + {file = "maxminddb-2.6.3-cp312-cp312-win_amd64.whl", hash = "sha256:7d6024d1e40244b5549c5e6063af109399a2f89503a24916b5139c4d0657f1c8"}, + {file = "maxminddb-2.6.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:9580b2cd017185db07baacd9d629ca01f3fe6f236528681c88a0209725376e9c"}, + {file = "maxminddb-2.6.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:47828bed767b82c219ba7aa65f0cb03d7f7443d7270259ce931e133a40691d34"}, + {file = "maxminddb-2.6.3-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:77112cb1a2e381de42c443d1bf222c58b9da203183bb2008dd370c3d2a587a4e"}, + {file = "maxminddb-2.6.3-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:448d062e95242e3088df85fe7ed3f2890a9f4aea924bde336e9ff5d2337ca5fd"}, + {file = "maxminddb-2.6.3-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a59d72bf373c61da156fd43e2be6da802f68370a50a2205de84ee76916e05f9f"}, + {file = "maxminddb-2.6.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:e867852037a8a26a24cfcf31b697dce63d488e1617af244c2895568d8f6c7a31"}, + {file = "maxminddb-2.6.3-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:5a1586260eac831d61c2665b26ca1ae3ad00caca57c8031346767f4527025311"}, + {file = "maxminddb-2.6.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:6eb23f842a72ab3096f9f9b1c292f4feb55a8d758567cb6d77637c2257a3187c"}, + {file = "maxminddb-2.6.3-cp313-cp313-win32.whl", hash = "sha256:acf46e20709a27d2b519669888e3f53a37bc4204b98a0c690664c48ff8cb1364"}, + {file = "maxminddb-2.6.3-cp313-cp313-win_amd64.whl", hash = "sha256:3015afb00e6168837938dbe5fda40ace37442c22b292ccee27c1690fbf6078ed"}, + {file = "maxminddb-2.6.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:9d913971187326e59be8a63068128b6439f6717b13c7c451e6d9e1723286d9ff"}, + {file = "maxminddb-2.6.3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:89afed255ac3652db7f91d8f6b278a4c490c47283ddbff5589c22cfdef4b8453"}, + {file = "maxminddb-2.6.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:01b143a38ae38c71ebc9028d67bbcb05c1b954e0f3a28c508eaee46833807903"}, + {file = "maxminddb-2.6.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:deebf098c79ce031069fec1d7202cba0e766b3f12adbb631d16223174994724a"}, + {file = "maxminddb-2.6.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f49eefddad781e088969188c606b7988a7da27592590f6c4cc2b64fd2a85ff28"}, + {file = "maxminddb-2.6.3-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:da584edc3e4465f5417a48602ed7e2bee4f2a7a2b43fcf2c40728cfc9f9fd5aa"}, + {file = "maxminddb-2.6.3-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:e5a8cfe71db548aa9a520a3f7e92430b6b7900affadef3b0c83c530c759dd12f"}, + {file = "maxminddb-2.6.3-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:daa20961ad0fb550038c02dbf76a04e1c1958a3b899fa14a7c412aed67380812"}, + {file = "maxminddb-2.6.3-cp38-cp38-win32.whl", hash = "sha256:6480ca47db4d8d09296c268e8ff4e6f4c1d455773a67233c9f899dfa6af3e6c6"}, + {file = "maxminddb-2.6.3-cp38-cp38-win_amd64.whl", hash = "sha256:0348c8dadef9493dbcd45f032ae271c7fd2216ed4bb4bab0aff371ffc522f871"}, + {file = "maxminddb-2.6.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:1bc2edcef76ce54d4df04f58aec98f4df0377f37aae2217587bfecd663ed5c66"}, + {file = "maxminddb-2.6.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:1f0b78c40a12588e9e0ca0ffe5306b6dea028dcd21f2c120d1ceb328a3307a98"}, + {file = "maxminddb-2.6.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f06e9c908a9270e882f0d23f041a9674680a7a110412b453f902d22323f86d38"}, + {file = "maxminddb-2.6.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:46096646c284835c8a580ec2ccbf0d6d5398191531fa543bb0437983c75cb7ba"}, + {file = "maxminddb-2.6.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0d82fbddf3a88e6aa6181bd16bc08a6939d6353f97f143eeddec16bc5394e361"}, + {file = "maxminddb-2.6.3-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:6136dc8ad8c8f7e95a7d84174a990c1b47d5e641e3a3a8ae67d7bde625342dbb"}, + {file = "maxminddb-2.6.3-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:01773fee182cc36f6d38c277936accf7c85b8f4c20d13bb630666f6b3f087ad8"}, + {file = "maxminddb-2.6.3-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:890dd845e371f67edef7b19a2866191d9fff85faf88f4b4c416a0aaa37204416"}, + {file = "maxminddb-2.6.3-cp39-cp39-win32.whl", hash = "sha256:4e0865069ef76b4f3eb862c042b107088171cbf43fea3dcaae0dd7253effe6e3"}, + {file = "maxminddb-2.6.3-cp39-cp39-win_amd64.whl", hash = "sha256:7c3209d7a4b2f50d4b28a1d886d95b19094cdc840208e69dbbc40cae2c1cc65b"}, + {file = "maxminddb-2.6.3-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:b4729936fedb4793d9162b92d6de63e267e388c8938e19e700120b6df6a6ae6c"}, + {file = "maxminddb-2.6.3-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:6887315de47f3a9840df19f498a4e68723c160c9448d276c3ef454531555778e"}, + {file = "maxminddb-2.6.3-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:34943b4b724a35ef63ec40dcf894a100575d233b23b6cd4f8224017ea1195265"}, + {file = "maxminddb-2.6.3-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2d25acb42ef8829e8e3491b6b3b4ced9dbb4eea6c4ec24afdc4028051e7b8803"}, + {file = "maxminddb-2.6.3-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a23c7c88f9df0727a3e56f2385ec19fb5f61bb46dcbebb6ddc5c948cf0b73b0a"}, + {file = "maxminddb-2.6.3-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:85763c19246dce43044be58cb9119579c2efd0b85a7b79d865b741a698866488"}, + {file = "maxminddb-2.6.3-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:7c5d15a0546821a7e9104b71ca701c01462390d0a1bee5cad75f583cf26c400b"}, + {file = "maxminddb-2.6.3-pp38-pypy38_pp73-macosx_11_0_arm64.whl", hash = "sha256:de8415538d778ae4f4bb40e2cee9581e2d5c860abdbdbba1458953f5b314a6b0"}, + {file = "maxminddb-2.6.3-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:81340e52c743cdc3c0f4a9f45f9cf4e3c2ae87bf4bbb34613c5059a5b829eb65"}, + {file = "maxminddb-2.6.3-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0b140c1db0c218f485b033b51a086d98d57f55f4a4c2b1cb72fe6a5e1e57359a"}, + {file = "maxminddb-2.6.3-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8ec674a2c2e4b47ab9f582460670a5c1d7725b1cbf16e6cbb94de1ae51ee9edf"}, + {file = "maxminddb-2.6.3-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:e28622fd7c4ccd298c3f630161d0801182eb38038ca01319693a70264de40b89"}, + {file = "maxminddb-2.6.3-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:b09bb7bb98418a620b1ec1881d1594c02e715a68cdc925781de1e79b39cefe77"}, + {file = "maxminddb-2.6.3-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:a6597599cde3916730d69b023045e6c22ff1c076d9cad7fb63641d36d01e3e93"}, + {file = "maxminddb-2.6.3-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4e7e6d5f3c1aa6350303edab8f0dd471e616d69b5d47ff5ecbf2c7c82998b9c6"}, + {file = "maxminddb-2.6.3-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:536a39fb917a44b1cd037da624e3d11d49898b5579dfc00c4d7103a057dc51ab"}, + {file = "maxminddb-2.6.3-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a9ebd373a4ef69218bfbce93e9b97f583cfe681b28d4e32e0d64f76ded148fba"}, + {file = "maxminddb-2.6.3-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:e441478922c2d311b8bc96f35d6e78306802774149fc20d07d96cc5c3b57dd02"}, + {file = "maxminddb-2.6.3.tar.gz", hash = "sha256:d2c3806baa7aa047aa1bac7419e7e353db435f88f09d51106a84dbacf645d254"}, ] [[package]] @@ -1652,6 +1802,7 @@ version = "2018.703" description = "Provides access to the geolite2 database. This product includes GeoLite2 data created by MaxMind, available from http://www.maxmind.com/" optional = false python-versions = "*" +groups = ["main"] files = [ {file = "maxminddb-geolite2-2018.703.tar.gz", hash = "sha256:2bd118c5567f3a8323d6c5da23a6e6d52cfc09cd9987b54eb712cf6001a96e03"}, ] @@ -1665,6 +1816,7 @@ version = "5.1.0" description = "Rolling backport of unittest.mock for all Pythons" optional = false python-versions = ">=3.6" +groups = ["dev"] files = [ {file = "mock-5.1.0-py3-none-any.whl", hash = "sha256:18c694e5ae8a208cdb3d2c20a993ca1a7b0efa258c247a1e565150f477f83744"}, {file = "mock-5.1.0.tar.gz", hash = "sha256:5e96aad5ccda4718e0a229ed94b2024df75cc2d55575ba5762d31f5767b8767d"}, @@ -1677,74 +1829,76 @@ test = ["pytest", "pytest-cov"] [[package]] name = "msgpack" -version = "1.0.5" +version = "1.1.0" description = "MessagePack serializer" optional = false -python-versions = "*" -files = [ - {file = "msgpack-1.0.5-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:525228efd79bb831cf6830a732e2e80bc1b05436b086d4264814b4b2955b2fa9"}, - {file = "msgpack-1.0.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:4f8d8b3bf1ff2672567d6b5c725a1b347fe838b912772aa8ae2bf70338d5a198"}, - {file = "msgpack-1.0.5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:cdc793c50be3f01106245a61b739328f7dccc2c648b501e237f0699fe1395b81"}, - {file = "msgpack-1.0.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5cb47c21a8a65b165ce29f2bec852790cbc04936f502966768e4aae9fa763cb7"}, - {file = "msgpack-1.0.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e42b9594cc3bf4d838d67d6ed62b9e59e201862a25e9a157019e171fbe672dd3"}, - {file = "msgpack-1.0.5-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:55b56a24893105dc52c1253649b60f475f36b3aa0fc66115bffafb624d7cb30b"}, - {file = "msgpack-1.0.5-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:1967f6129fc50a43bfe0951c35acbb729be89a55d849fab7686004da85103f1c"}, - {file = "msgpack-1.0.5-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:20a97bf595a232c3ee6d57ddaadd5453d174a52594bf9c21d10407e2a2d9b3bd"}, - {file = "msgpack-1.0.5-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:d25dd59bbbbb996eacf7be6b4ad082ed7eacc4e8f3d2df1ba43822da9bfa122a"}, - {file = "msgpack-1.0.5-cp310-cp310-win32.whl", hash = "sha256:382b2c77589331f2cb80b67cc058c00f225e19827dbc818d700f61513ab47bea"}, - {file = "msgpack-1.0.5-cp310-cp310-win_amd64.whl", hash = "sha256:4867aa2df9e2a5fa5f76d7d5565d25ec76e84c106b55509e78c1ede0f152659a"}, - {file = "msgpack-1.0.5-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:9f5ae84c5c8a857ec44dc180a8b0cc08238e021f57abdf51a8182e915e6299f0"}, - {file = "msgpack-1.0.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:9e6ca5d5699bcd89ae605c150aee83b5321f2115695e741b99618f4856c50898"}, - {file = "msgpack-1.0.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:5494ea30d517a3576749cad32fa27f7585c65f5f38309c88c6d137877fa28a5a"}, - {file = "msgpack-1.0.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1ab2f3331cb1b54165976a9d976cb251a83183631c88076613c6c780f0d6e45a"}, - {file = "msgpack-1.0.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:28592e20bbb1620848256ebc105fc420436af59515793ed27d5c77a217477705"}, - {file = "msgpack-1.0.5-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fe5c63197c55bce6385d9aee16c4d0641684628f63ace85f73571e65ad1c1e8d"}, - {file = "msgpack-1.0.5-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:ed40e926fa2f297e8a653c954b732f125ef97bdd4c889f243182299de27e2aa9"}, - {file = "msgpack-1.0.5-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:b2de4c1c0538dcb7010902a2b97f4e00fc4ddf2c8cda9749af0e594d3b7fa3d7"}, - {file = "msgpack-1.0.5-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:bf22a83f973b50f9d38e55c6aade04c41ddda19b00c4ebc558930d78eecc64ed"}, - {file = "msgpack-1.0.5-cp311-cp311-win32.whl", hash = "sha256:c396e2cc213d12ce017b686e0f53497f94f8ba2b24799c25d913d46c08ec422c"}, - {file = "msgpack-1.0.5-cp311-cp311-win_amd64.whl", hash = "sha256:6c4c68d87497f66f96d50142a2b73b97972130d93677ce930718f68828b382e2"}, - {file = "msgpack-1.0.5-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:a2b031c2e9b9af485d5e3c4520f4220d74f4d222a5b8dc8c1a3ab9448ca79c57"}, - {file = "msgpack-1.0.5-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4f837b93669ce4336e24d08286c38761132bc7ab29782727f8557e1eb21b2080"}, - {file = "msgpack-1.0.5-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b1d46dfe3832660f53b13b925d4e0fa1432b00f5f7210eb3ad3bb9a13c6204a6"}, - {file = "msgpack-1.0.5-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:366c9a7b9057e1547f4ad51d8facad8b406bab69c7d72c0eb6f529cf76d4b85f"}, - {file = "msgpack-1.0.5-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:4c075728a1095efd0634a7dccb06204919a2f67d1893b6aa8e00497258bf926c"}, - {file = "msgpack-1.0.5-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:f933bbda5a3ee63b8834179096923b094b76f0c7a73c1cfe8f07ad608c58844b"}, - {file = "msgpack-1.0.5-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:36961b0568c36027c76e2ae3ca1132e35123dcec0706c4b7992683cc26c1320c"}, - {file = "msgpack-1.0.5-cp36-cp36m-win32.whl", hash = "sha256:b5ef2f015b95f912c2fcab19c36814963b5463f1fb9049846994b007962743e9"}, - {file = "msgpack-1.0.5-cp36-cp36m-win_amd64.whl", hash = "sha256:288e32b47e67f7b171f86b030e527e302c91bd3f40fd9033483f2cacc37f327a"}, - {file = "msgpack-1.0.5-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:137850656634abddfb88236008339fdaba3178f4751b28f270d2ebe77a563b6c"}, - {file = "msgpack-1.0.5-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0c05a4a96585525916b109bb85f8cb6511db1c6f5b9d9cbcbc940dc6b4be944b"}, - {file = "msgpack-1.0.5-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:56a62ec00b636583e5cb6ad313bbed36bb7ead5fa3a3e38938503142c72cba4f"}, - {file = "msgpack-1.0.5-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ef8108f8dedf204bb7b42994abf93882da1159728a2d4c5e82012edd92c9da9f"}, - {file = "msgpack-1.0.5-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:1835c84d65f46900920b3708f5ba829fb19b1096c1800ad60bae8418652a951d"}, - {file = "msgpack-1.0.5-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:e57916ef1bd0fee4f21c4600e9d1da352d8816b52a599c46460e93a6e9f17086"}, - {file = "msgpack-1.0.5-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:17358523b85973e5f242ad74aa4712b7ee560715562554aa2134d96e7aa4cbbf"}, - {file = "msgpack-1.0.5-cp37-cp37m-win32.whl", hash = "sha256:cb5aaa8c17760909ec6cb15e744c3ebc2ca8918e727216e79607b7bbce9c8f77"}, - {file = "msgpack-1.0.5-cp37-cp37m-win_amd64.whl", hash = "sha256:ab31e908d8424d55601ad7075e471b7d0140d4d3dd3272daf39c5c19d936bd82"}, - {file = "msgpack-1.0.5-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:b72d0698f86e8d9ddf9442bdedec15b71df3598199ba33322d9711a19f08145c"}, - {file = "msgpack-1.0.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:379026812e49258016dd84ad79ac8446922234d498058ae1d415f04b522d5b2d"}, - {file = "msgpack-1.0.5-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:332360ff25469c346a1c5e47cbe2a725517919892eda5cfaffe6046656f0b7bb"}, - {file = "msgpack-1.0.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:476a8fe8fae289fdf273d6d2a6cb6e35b5a58541693e8f9f019bfe990a51e4ba"}, - {file = "msgpack-1.0.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a9985b214f33311df47e274eb788a5893a761d025e2b92c723ba4c63936b69b1"}, - {file = "msgpack-1.0.5-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:48296af57cdb1d885843afd73c4656be5c76c0c6328db3440c9601a98f303d87"}, - {file = "msgpack-1.0.5-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:addab7e2e1fcc04bd08e4eb631c2a90960c340e40dfc4a5e24d2ff0d5a3b3edb"}, - {file = "msgpack-1.0.5-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:916723458c25dfb77ff07f4c66aed34e47503b2eb3188b3adbec8d8aa6e00f48"}, - {file = "msgpack-1.0.5-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:821c7e677cc6acf0fd3f7ac664c98803827ae6de594a9f99563e48c5a2f27eb0"}, - {file = "msgpack-1.0.5-cp38-cp38-win32.whl", hash = "sha256:1c0f7c47f0087ffda62961d425e4407961a7ffd2aa004c81b9c07d9269512f6e"}, - {file = "msgpack-1.0.5-cp38-cp38-win_amd64.whl", hash = "sha256:bae7de2026cbfe3782c8b78b0db9cbfc5455e079f1937cb0ab8d133496ac55e1"}, - {file = "msgpack-1.0.5-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:20c784e66b613c7f16f632e7b5e8a1651aa5702463d61394671ba07b2fc9e025"}, - {file = "msgpack-1.0.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:266fa4202c0eb94d26822d9bfd7af25d1e2c088927fe8de9033d929dd5ba24c5"}, - {file = "msgpack-1.0.5-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:18334484eafc2b1aa47a6d42427da7fa8f2ab3d60b674120bce7a895a0a85bdd"}, - {file = "msgpack-1.0.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:57e1f3528bd95cc44684beda696f74d3aaa8a5e58c816214b9046512240ef437"}, - {file = "msgpack-1.0.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:586d0d636f9a628ddc6a17bfd45aa5b5efaf1606d2b60fa5d87b8986326e933f"}, - {file = "msgpack-1.0.5-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a740fa0e4087a734455f0fc3abf5e746004c9da72fbd541e9b113013c8dc3282"}, - {file = "msgpack-1.0.5-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:3055b0455e45810820db1f29d900bf39466df96ddca11dfa6d074fa47054376d"}, - {file = "msgpack-1.0.5-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:a61215eac016f391129a013c9e46f3ab308db5f5ec9f25811e811f96962599a8"}, - {file = "msgpack-1.0.5-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:362d9655cd369b08fda06b6657a303eb7172d5279997abe094512e919cf74b11"}, - {file = "msgpack-1.0.5-cp39-cp39-win32.whl", hash = "sha256:ac9dd47af78cae935901a9a500104e2dea2e253207c924cc95de149606dc43cc"}, - {file = "msgpack-1.0.5-cp39-cp39-win_amd64.whl", hash = "sha256:06f5174b5f8ed0ed919da0e62cbd4ffde676a374aba4020034da05fab67b9164"}, - {file = "msgpack-1.0.5.tar.gz", hash = "sha256:c075544284eadc5cddc70f4757331d99dcbc16b2bbd4849d15f8aae4cf36d31c"}, +python-versions = ">=3.8" +groups = ["main"] +files = [ + {file = "msgpack-1.1.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:7ad442d527a7e358a469faf43fda45aaf4ac3249c8310a82f0ccff9164e5dccd"}, + {file = "msgpack-1.1.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:74bed8f63f8f14d75eec75cf3d04ad581da6b914001b474a5d3cd3372c8cc27d"}, + {file = "msgpack-1.1.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:914571a2a5b4e7606997e169f64ce53a8b1e06f2cf2c3a7273aa106236d43dd5"}, + {file = "msgpack-1.1.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c921af52214dcbb75e6bdf6a661b23c3e6417f00c603dd2070bccb5c3ef499f5"}, + {file = "msgpack-1.1.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d8ce0b22b890be5d252de90d0e0d119f363012027cf256185fc3d474c44b1b9e"}, + {file = "msgpack-1.1.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:73322a6cc57fcee3c0c57c4463d828e9428275fb85a27aa2aa1a92fdc42afd7b"}, + {file = "msgpack-1.1.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:e1f3c3d21f7cf67bcf2da8e494d30a75e4cf60041d98b3f79875afb5b96f3a3f"}, + {file = "msgpack-1.1.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:64fc9068d701233effd61b19efb1485587560b66fe57b3e50d29c5d78e7fef68"}, + {file = "msgpack-1.1.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:42f754515e0f683f9c79210a5d1cad631ec3d06cea5172214d2176a42e67e19b"}, + {file = "msgpack-1.1.0-cp310-cp310-win32.whl", hash = "sha256:3df7e6b05571b3814361e8464f9304c42d2196808e0119f55d0d3e62cd5ea044"}, + {file = "msgpack-1.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:685ec345eefc757a7c8af44a3032734a739f8c45d1b0ac45efc5d8977aa4720f"}, + {file = "msgpack-1.1.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:3d364a55082fb2a7416f6c63ae383fbd903adb5a6cf78c5b96cc6316dc1cedc7"}, + {file = "msgpack-1.1.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:79ec007767b9b56860e0372085f8504db5d06bd6a327a335449508bbee9648fa"}, + {file = "msgpack-1.1.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:6ad622bf7756d5a497d5b6836e7fc3752e2dd6f4c648e24b1803f6048596f701"}, + {file = "msgpack-1.1.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8e59bca908d9ca0de3dc8684f21ebf9a690fe47b6be93236eb40b99af28b6ea6"}, + {file = "msgpack-1.1.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5e1da8f11a3dd397f0a32c76165cf0c4eb95b31013a94f6ecc0b280c05c91b59"}, + {file = "msgpack-1.1.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:452aff037287acb1d70a804ffd022b21fa2bb7c46bee884dbc864cc9024128a0"}, + {file = "msgpack-1.1.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:8da4bf6d54ceed70e8861f833f83ce0814a2b72102e890cbdfe4b34764cdd66e"}, + {file = "msgpack-1.1.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:41c991beebf175faf352fb940bf2af9ad1fb77fd25f38d9142053914947cdbf6"}, + {file = "msgpack-1.1.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:a52a1f3a5af7ba1c9ace055b659189f6c669cf3657095b50f9602af3a3ba0fe5"}, + {file = "msgpack-1.1.0-cp311-cp311-win32.whl", hash = "sha256:58638690ebd0a06427c5fe1a227bb6b8b9fdc2bd07701bec13c2335c82131a88"}, + {file = "msgpack-1.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:fd2906780f25c8ed5d7b323379f6138524ba793428db5d0e9d226d3fa6aa1788"}, + {file = "msgpack-1.1.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:d46cf9e3705ea9485687aa4001a76e44748b609d260af21c4ceea7f2212a501d"}, + {file = "msgpack-1.1.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:5dbad74103df937e1325cc4bfeaf57713be0b4f15e1c2da43ccdd836393e2ea2"}, + {file = "msgpack-1.1.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:58dfc47f8b102da61e8949708b3eafc3504509a5728f8b4ddef84bd9e16ad420"}, + {file = "msgpack-1.1.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4676e5be1b472909b2ee6356ff425ebedf5142427842aa06b4dfd5117d1ca8a2"}, + {file = "msgpack-1.1.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:17fb65dd0bec285907f68b15734a993ad3fc94332b5bb21b0435846228de1f39"}, + {file = "msgpack-1.1.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a51abd48c6d8ac89e0cfd4fe177c61481aca2d5e7ba42044fd218cfd8ea9899f"}, + {file = "msgpack-1.1.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:2137773500afa5494a61b1208619e3871f75f27b03bcfca7b3a7023284140247"}, + {file = "msgpack-1.1.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:398b713459fea610861c8a7b62a6fec1882759f308ae0795b5413ff6a160cf3c"}, + {file = "msgpack-1.1.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:06f5fd2f6bb2a7914922d935d3b8bb4a7fff3a9a91cfce6d06c13bc42bec975b"}, + {file = "msgpack-1.1.0-cp312-cp312-win32.whl", hash = "sha256:ad33e8400e4ec17ba782f7b9cf868977d867ed784a1f5f2ab46e7ba53b6e1e1b"}, + {file = "msgpack-1.1.0-cp312-cp312-win_amd64.whl", hash = "sha256:115a7af8ee9e8cddc10f87636767857e7e3717b7a2e97379dc2054712693e90f"}, + {file = "msgpack-1.1.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:071603e2f0771c45ad9bc65719291c568d4edf120b44eb36324dcb02a13bfddf"}, + {file = "msgpack-1.1.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:0f92a83b84e7c0749e3f12821949d79485971f087604178026085f60ce109330"}, + {file = "msgpack-1.1.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:4a1964df7b81285d00a84da4e70cb1383f2e665e0f1f2a7027e683956d04b734"}, + {file = "msgpack-1.1.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:59caf6a4ed0d164055ccff8fe31eddc0ebc07cf7326a2aaa0dbf7a4001cd823e"}, + {file = "msgpack-1.1.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0907e1a7119b337971a689153665764adc34e89175f9a34793307d9def08e6ca"}, + {file = "msgpack-1.1.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:65553c9b6da8166e819a6aa90ad15288599b340f91d18f60b2061f402b9a4915"}, + {file = "msgpack-1.1.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:7a946a8992941fea80ed4beae6bff74ffd7ee129a90b4dd5cf9c476a30e9708d"}, + {file = "msgpack-1.1.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:4b51405e36e075193bc051315dbf29168d6141ae2500ba8cd80a522964e31434"}, + {file = "msgpack-1.1.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:b4c01941fd2ff87c2a934ee6055bda4ed353a7846b8d4f341c428109e9fcde8c"}, + {file = "msgpack-1.1.0-cp313-cp313-win32.whl", hash = "sha256:7c9a35ce2c2573bada929e0b7b3576de647b0defbd25f5139dcdaba0ae35a4cc"}, + {file = "msgpack-1.1.0-cp313-cp313-win_amd64.whl", hash = "sha256:bce7d9e614a04d0883af0b3d4d501171fbfca038f12c77fa838d9f198147a23f"}, + {file = "msgpack-1.1.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c40ffa9a15d74e05ba1fe2681ea33b9caffd886675412612d93ab17b58ea2fec"}, + {file = "msgpack-1.1.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f1ba6136e650898082d9d5a5217d5906d1e138024f836ff48691784bbe1adf96"}, + {file = "msgpack-1.1.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e0856a2b7e8dcb874be44fea031d22e5b3a19121be92a1e098f46068a11b0870"}, + {file = "msgpack-1.1.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:471e27a5787a2e3f974ba023f9e265a8c7cfd373632247deb225617e3100a3c7"}, + {file = "msgpack-1.1.0-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:646afc8102935a388ffc3914b336d22d1c2d6209c773f3eb5dd4d6d3b6f8c1cb"}, + {file = "msgpack-1.1.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:13599f8829cfbe0158f6456374e9eea9f44eee08076291771d8ae93eda56607f"}, + {file = "msgpack-1.1.0-cp38-cp38-win32.whl", hash = "sha256:8a84efb768fb968381e525eeeb3d92857e4985aacc39f3c47ffd00eb4509315b"}, + {file = "msgpack-1.1.0-cp38-cp38-win_amd64.whl", hash = "sha256:879a7b7b0ad82481c52d3c7eb99bf6f0645dbdec5134a4bddbd16f3506947feb"}, + {file = "msgpack-1.1.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:53258eeb7a80fc46f62fd59c876957a2d0e15e6449a9e71842b6d24419d88ca1"}, + {file = "msgpack-1.1.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:7e7b853bbc44fb03fbdba34feb4bd414322180135e2cb5164f20ce1c9795ee48"}, + {file = "msgpack-1.1.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:f3e9b4936df53b970513eac1758f3882c88658a220b58dcc1e39606dccaaf01c"}, + {file = "msgpack-1.1.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:46c34e99110762a76e3911fc923222472c9d681f1094096ac4102c18319e6468"}, + {file = "msgpack-1.1.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8a706d1e74dd3dea05cb54580d9bd8b2880e9264856ce5068027eed09680aa74"}, + {file = "msgpack-1.1.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:534480ee5690ab3cbed89d4c8971a5c631b69a8c0883ecfea96c19118510c846"}, + {file = "msgpack-1.1.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:8cf9e8c3a2153934a23ac160cc4cba0ec035f6867c8013cc6077a79823370346"}, + {file = "msgpack-1.1.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:3180065ec2abbe13a4ad37688b61b99d7f9e012a535b930e0e683ad6bc30155b"}, + {file = "msgpack-1.1.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:c5a91481a3cc573ac8c0d9aace09345d989dc4a0202b7fcb312c88c26d4e71a8"}, + {file = "msgpack-1.1.0-cp39-cp39-win32.whl", hash = "sha256:f80bc7d47f76089633763f952e67f8214cb7b3ee6bfa489b3cb6a84cfac114cd"}, + {file = "msgpack-1.1.0-cp39-cp39-win_amd64.whl", hash = "sha256:4d1b7ff2d6146e16e8bd665ac726a89c74163ef8cd39fa8c1087d4e52d3a2325"}, + {file = "msgpack-1.1.0.tar.gz", hash = "sha256:dd432ccc2c72b914e4cb77afce64aab761c1137cc698be3984eee260bcb2896e"}, ] [[package]] @@ -1753,20 +1907,37 @@ version = "1.0.0" description = "Type system extensions for programs checked with the mypy type checker." optional = false python-versions = ">=3.5" +groups = ["dev"] files = [ {file = "mypy_extensions-1.0.0-py3-none-any.whl", hash = "sha256:4392f6c0eb8a5668a69e23d168ffa70f0be9ccfd32b5cc2d26a34ae5b844552d"}, {file = "mypy_extensions-1.0.0.tar.gz", hash = "sha256:75dbf8955dc00442a438fc4d0666508a9a97b6bd41aa2f0ffe9d2f2725af0782"}, ] +[[package]] +name = "outcome" +version = "1.3.0.post0" +description = "Capture the outcome of Python function calls." +optional = false +python-versions = ">=3.7" +groups = ["dev"] +files = [ + {file = "outcome-1.3.0.post0-py2.py3-none-any.whl", hash = "sha256:e771c5ce06d1415e356078d3bdd68523f284b4ce5419828922b6871e65eda82b"}, + {file = "outcome-1.3.0.post0.tar.gz", hash = "sha256:9dcf02e65f2971b80047b377468e72a268e15c0af3cf1238e6ff14f7f91143b8"}, +] + +[package.dependencies] +attrs = ">=19.2.0" + [[package]] name = "packaging" -version = "24.0" +version = "24.2" description = "Core utilities for Python packages" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" +groups = ["main", "dev"] files = [ - {file = "packaging-24.0-py3-none-any.whl", hash = "sha256:2ddfb553fdf02fb784c234c7ba6ccc288296ceabec964ad2eae3777778130bc5"}, - {file = "packaging-24.0.tar.gz", hash = "sha256:eb82c5e3e56209074766e6885bb04b8c38a0c015d0a30036ebe7ece34c9989e9"}, + {file = "packaging-24.2-py3-none-any.whl", hash = "sha256:09abb1bccd265c01f4a3aa3f7a7db064b36514d2cba19a2f694fe6150451a759"}, + {file = "packaging-24.2.tar.gz", hash = "sha256:c228a6dc5e932d346bc5739379109d49e8853dd8223571c7c5b55260edc0b97f"}, ] [[package]] @@ -1775,6 +1946,7 @@ version = "1.7.4" description = "comprehensive password hashing framework supporting over 30 schemes" optional = false python-versions = "*" +groups = ["main"] files = [ {file = "passlib-1.7.4-py2.py3-none-any.whl", hash = "sha256:aa6bca462b8d8bda89c70b382f0c298a20b5560af6cbfa2dce410c0a2fb669f1"}, {file = "passlib-1.7.4.tar.gz", hash = "sha256:defd50f72b65c5402ab2c573830a6978e5f202ad0d984793c8dde2c4152ebe04"}, @@ -1788,60 +1960,59 @@ totp = ["cryptography"] [[package]] name = "pathspec" -version = "0.11.2" +version = "0.12.1" description = "Utility library for gitignore style pattern matching of file paths." optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" +groups = ["dev"] files = [ - {file = "pathspec-0.11.2-py3-none-any.whl", hash = "sha256:1d6ed233af05e679efb96b1851550ea95bbb64b7c490b0f5aa52996c11e92a20"}, - {file = "pathspec-0.11.2.tar.gz", hash = "sha256:e0d8d0ac2f12da61956eb2306b69f9469b42f4deb0f3cb6ed47b9cce9996ced3"}, + {file = "pathspec-0.12.1-py3-none-any.whl", hash = "sha256:a0d503e138a4c123b27490a4f7beda6a01c6f288df0e4a8b79c7eb0dc7b4cc08"}, + {file = "pathspec-0.12.1.tar.gz", hash = "sha256:a482d51503a1ab33b1c67a6c3813a26953dbdc71c31dacaef9a838c4e29f5712"}, ] [[package]] name = "platformdirs" -version = "4.0.0" -description = "A small Python package for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." +version = "4.3.6" +description = "A small Python package for determining appropriate platform-specific dirs, e.g. a `user data dir`." optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" +groups = ["dev"] files = [ - {file = "platformdirs-4.0.0-py3-none-any.whl", hash = "sha256:118c954d7e949b35437270383a3f2531e99dd93cf7ce4dc8340d3356d30f173b"}, - {file = "platformdirs-4.0.0.tar.gz", hash = "sha256:cb633b2bcf10c51af60beb0ab06d2f1d69064b43abf4c185ca6b28865f3f9731"}, + {file = "platformdirs-4.3.6-py3-none-any.whl", hash = "sha256:73e575e1408ab8103900836b97580d5307456908a03e92031bab39e4554cc3fb"}, + {file = "platformdirs-4.3.6.tar.gz", hash = "sha256:357fb2acbc885b0419afd3ce3ed34564c13c9b95c89360cd9563f73aa5e2b907"}, ] -[package.dependencies] -typing-extensions = {version = ">=4.7.1", markers = "python_version < \"3.8\""} - [package.extras] -docs = ["furo (>=2023.7.26)", "proselint (>=0.13)", "sphinx (>=7.1.1)", "sphinx-autodoc-typehints (>=1.24)"] -test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=7.4)", "pytest-cov (>=4.1)", "pytest-mock (>=3.11.1)"] +docs = ["furo (>=2024.8.6)", "proselint (>=0.14)", "sphinx (>=8.0.2)", "sphinx-autodoc-typehints (>=2.4)"] +test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=8.3.2)", "pytest-cov (>=5)", "pytest-mock (>=3.14)"] +type = ["mypy (>=1.11.2)"] [[package]] name = "pluggy" -version = "1.2.0" +version = "1.5.0" description = "plugin and hook calling mechanisms for python" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" +groups = ["dev"] files = [ - {file = "pluggy-1.2.0-py3-none-any.whl", hash = "sha256:c2fd55a7d7a3863cba1a013e4e2414658b1d07b6bc57b3919e0c63c9abb99849"}, - {file = "pluggy-1.2.0.tar.gz", hash = "sha256:d12f0c4b579b15f5e054301bb226ee85eeeba08ffec228092f8defbaa3a4c4b3"}, + {file = "pluggy-1.5.0-py3-none-any.whl", hash = "sha256:44e1ad92c8ca002de6377e165f3e0f1be63266ab4d554740532335b9d75ea669"}, + {file = "pluggy-1.5.0.tar.gz", hash = "sha256:2cffa88e94fdc978c4c574f15f9e59b7f4201d439195c3715ca9e2486f1d0cf1"}, ] -[package.dependencies] -importlib-metadata = {version = ">=0.12", markers = "python_version < \"3.8\""} - [package.extras] dev = ["pre-commit", "tox"] testing = ["pytest", "pytest-benchmark"] [[package]] name = "prompt-toolkit" -version = "3.0.43" +version = "3.0.50" description = "Library for building powerful interactive command lines in Python" optional = false -python-versions = ">=3.7.0" +python-versions = ">=3.8.0" +groups = ["main"] files = [ - {file = "prompt_toolkit-3.0.43-py3-none-any.whl", hash = "sha256:a11a29cb3bf0a28a387fe5122cdb649816a957cd9261dcedf8c9f1fef33eacf6"}, - {file = "prompt_toolkit-3.0.43.tar.gz", hash = "sha256:3527b7af26106cbc65a040bcc84839a3566ec1b051bb0bfe953631e704b0ff7d"}, + {file = "prompt_toolkit-3.0.50-py3-none-any.whl", hash = "sha256:9b6427eb19e479d98acff65196a307c555eb567989e6d88ebbb1b509d9779198"}, + {file = "prompt_toolkit-3.0.50.tar.gz", hash = "sha256:544748f3860a2623ca5cd6d2795e7a14f3d0e1c3c9728359013f79877fc89bab"}, ] [package.dependencies] @@ -1849,31 +2020,27 @@ wcwidth = "*" [[package]] name = "psutil" -version = "5.9.8" -description = "Cross-platform lib for process and system monitoring in Python." +version = "7.0.0" +description = "Cross-platform lib for process and system monitoring in Python. NOTE: the syntax of this script MUST be kept compatible with Python 2.7." optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*" +python-versions = ">=3.6" +groups = ["main"] files = [ - {file = "psutil-5.9.8-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:26bd09967ae00920df88e0352a91cff1a78f8d69b3ecabbfe733610c0af486c8"}, - {file = "psutil-5.9.8-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:05806de88103b25903dff19bb6692bd2e714ccf9e668d050d144012055cbca73"}, - {file = "psutil-5.9.8-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:611052c4bc70432ec770d5d54f64206aa7203a101ec273a0cd82418c86503bb7"}, - {file = "psutil-5.9.8-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:50187900d73c1381ba1454cf40308c2bf6f34268518b3f36a9b663ca87e65e36"}, - {file = "psutil-5.9.8-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:02615ed8c5ea222323408ceba16c60e99c3f91639b07da6373fb7e6539abc56d"}, - {file = "psutil-5.9.8-cp27-none-win32.whl", hash = "sha256:36f435891adb138ed3c9e58c6af3e2e6ca9ac2f365efe1f9cfef2794e6c93b4e"}, - {file = "psutil-5.9.8-cp27-none-win_amd64.whl", hash = "sha256:bd1184ceb3f87651a67b2708d4c3338e9b10c5df903f2e3776b62303b26cb631"}, - {file = "psutil-5.9.8-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:aee678c8720623dc456fa20659af736241f575d79429a0e5e9cf88ae0605cc81"}, - {file = "psutil-5.9.8-cp36-abi3-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8cb6403ce6d8e047495a701dc7c5bd788add903f8986d523e3e20b98b733e421"}, - {file = "psutil-5.9.8-cp36-abi3-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d06016f7f8625a1825ba3732081d77c94589dca78b7a3fc072194851e88461a4"}, - {file = "psutil-5.9.8-cp36-cp36m-win32.whl", hash = "sha256:7d79560ad97af658a0f6adfef8b834b53f64746d45b403f225b85c5c2c140eee"}, - {file = "psutil-5.9.8-cp36-cp36m-win_amd64.whl", hash = "sha256:27cc40c3493bb10de1be4b3f07cae4c010ce715290a5be22b98493509c6299e2"}, - {file = "psutil-5.9.8-cp37-abi3-win32.whl", hash = "sha256:bc56c2a1b0d15aa3eaa5a60c9f3f8e3e565303b465dbf57a1b730e7a2b9844e0"}, - {file = "psutil-5.9.8-cp37-abi3-win_amd64.whl", hash = "sha256:8db4c1b57507eef143a15a6884ca10f7c73876cdf5d51e713151c1236a0e68cf"}, - {file = "psutil-5.9.8-cp38-abi3-macosx_11_0_arm64.whl", hash = "sha256:d16bbddf0693323b8c6123dd804100241da461e41d6e332fb0ba6058f630f8c8"}, - {file = "psutil-5.9.8.tar.gz", hash = "sha256:6be126e3225486dff286a8fb9a06246a5253f4c7c53b475ea5f5ac934e64194c"}, + {file = "psutil-7.0.0-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:101d71dc322e3cffd7cea0650b09b3d08b8e7c4109dd6809fe452dfd00e58b25"}, + {file = "psutil-7.0.0-cp36-abi3-macosx_11_0_arm64.whl", hash = "sha256:39db632f6bb862eeccf56660871433e111b6ea58f2caea825571951d4b6aa3da"}, + {file = "psutil-7.0.0-cp36-abi3-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1fcee592b4c6f146991ca55919ea3d1f8926497a713ed7faaf8225e174581e91"}, + {file = "psutil-7.0.0-cp36-abi3-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4b1388a4f6875d7e2aff5c4ca1cc16c545ed41dd8bb596cefea80111db353a34"}, + {file = "psutil-7.0.0-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a5f098451abc2828f7dc6b58d44b532b22f2088f4999a937557b603ce72b1993"}, + {file = "psutil-7.0.0-cp36-cp36m-win32.whl", hash = "sha256:84df4eb63e16849689f76b1ffcb36db7b8de703d1bc1fe41773db487621b6c17"}, + {file = "psutil-7.0.0-cp36-cp36m-win_amd64.whl", hash = "sha256:1e744154a6580bc968a0195fd25e80432d3afec619daf145b9e5ba16cc1d688e"}, + {file = "psutil-7.0.0-cp37-abi3-win32.whl", hash = "sha256:ba3fcef7523064a6c9da440fc4d6bd07da93ac726b5733c29027d7dc95b39d99"}, + {file = "psutil-7.0.0-cp37-abi3-win_amd64.whl", hash = "sha256:4cf3d4eb1aa9b348dec30105c55cd9b7d4629285735a102beb4441e38db90553"}, + {file = "psutil-7.0.0.tar.gz", hash = "sha256:7be9c3eba38beccb6495ea33afd982a44074b78f28c434a1f51cc07fd315c456"}, ] [package.extras] -test = ["enum34", "ipaddress", "mock", "pywin32", "wmi"] +dev = ["abi3audit", "black (==24.10.0)", "check-manifest", "coverage", "packaging", "pylint", "pyperf", "pypinfo", "pytest", "pytest-cov", "pytest-xdist", "requests", "rstcheck", "ruff", "setuptools", "sphinx", "sphinx_rtd_theme", "toml-sort", "twine", "virtualenv", "vulture", "wheel"] +test = ["pytest", "pytest-xdist", "setuptools"] [[package]] name = "py" @@ -1881,6 +2048,7 @@ version = "1.11.0" description = "library with cross-python path, ini-parsing, io, code, log facilities" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +groups = ["dev"] files = [ {file = "py-1.11.0-py2.py3-none-any.whl", hash = "sha256:607c53218732647dff4acdfcd50cb62615cedf612e72d1724fb1a0cc6405b378"}, {file = "py-1.11.0.tar.gz", hash = "sha256:51c75c4126074b472f746a24399ad32f6053d1b34b68d2fa41e558e6f4a98719"}, @@ -1888,100 +2056,102 @@ files = [ [[package]] name = "pycodestyle" -version = "2.10.0" +version = "2.12.1" description = "Python style guide checker" optional = false -python-versions = ">=3.6" +python-versions = ">=3.8" +groups = ["dev"] files = [ - {file = "pycodestyle-2.10.0-py2.py3-none-any.whl", hash = "sha256:8a4eaf0d0495c7395bdab3589ac2db602797d76207242c17d470186815706610"}, - {file = "pycodestyle-2.10.0.tar.gz", hash = "sha256:347187bdb476329d98f695c213d7295a846d1152ff4fe9bacb8a9590b8ee7053"}, + {file = "pycodestyle-2.12.1-py2.py3-none-any.whl", hash = "sha256:46f0fb92069a7c28ab7bb558f05bfc0110dac69a0cd23c61ea0040283a9d78b3"}, + {file = "pycodestyle-2.12.1.tar.gz", hash = "sha256:6838eae08bbce4f6accd5d5572075c63626a15ee3e6f842df996bf62f6d73521"}, ] [[package]] name = "pycountry" -version = "22.3.5" +version = "24.6.1" description = "ISO country, subdivision, language, currency and script definitions and their translations" optional = false -python-versions = ">=3.6, <4" +python-versions = ">=3.8" +groups = ["main"] files = [ - {file = "pycountry-22.3.5.tar.gz", hash = "sha256:b2163a246c585894d808f18783e19137cb70a0c18fb36748dc01fc6f109c1646"}, + {file = "pycountry-24.6.1-py3-none-any.whl", hash = "sha256:f1a4fb391cd7214f8eefd39556d740adcc233c778a27f8942c8dca351d6ce06f"}, + {file = "pycountry-24.6.1.tar.gz", hash = "sha256:b61b3faccea67f87d10c1f2b0fc0be714409e8fcdcc1315613174f6466c10221"}, ] -[package.dependencies] -setuptools = "*" - [[package]] name = "pycparser" -version = "2.21" +version = "2.22" description = "C parser in Python" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +python-versions = ">=3.8" +groups = ["main", "dev"] files = [ - {file = "pycparser-2.21-py2.py3-none-any.whl", hash = "sha256:8ee45429555515e1f6b185e78100aea234072576aa43ab53aefcae078162fca9"}, - {file = "pycparser-2.21.tar.gz", hash = "sha256:e644fdec12f7872f86c58ff790da456218b10f863970249516d60a5eaca77206"}, + {file = "pycparser-2.22-py3-none-any.whl", hash = "sha256:c3702b6d3dd8c7abc1afa565d7e63d53a1d0bd86cdc24edd75470f4de499cfcc"}, + {file = "pycparser-2.22.tar.gz", hash = "sha256:491c8be9c040f5390f5bf44a5b07752bd07f56edf992381b05c701439eec10f6"}, ] +markers = {main = "platform_python_implementation != \"PyPy\"", dev = "os_name == \"nt\" and implementation_name != \"pypy\""} [[package]] name = "pydocstyle" -version = "6.1.1" +version = "6.3.0" description = "Python docstring style checker" optional = false python-versions = ">=3.6" +groups = ["dev"] files = [ - {file = "pydocstyle-6.1.1-py3-none-any.whl", hash = "sha256:6987826d6775056839940041beef5c08cc7e3d71d63149b48e36727f70144dc4"}, - {file = "pydocstyle-6.1.1.tar.gz", hash = "sha256:1d41b7c459ba0ee6c345f2eb9ae827cab14a7533a88c5c6f7e94923f72df92dc"}, + {file = "pydocstyle-6.3.0-py3-none-any.whl", hash = "sha256:118762d452a49d6b05e194ef344a55822987a462831ade91ec5c06fd2169d019"}, + {file = "pydocstyle-6.3.0.tar.gz", hash = "sha256:7ce43f0c0ac87b07494eb9c0b462c0b73e6ff276807f204d6b53edc72b7e44e1"}, ] [package.dependencies] -snowballstemmer = "*" +snowballstemmer = ">=2.2.0" [package.extras] -toml = ["toml"] +toml = ["tomli (>=1.2.3) ; python_version < \"3.11\""] [[package]] name = "pyflakes" -version = "3.0.1" +version = "3.2.0" description = "passive checker of Python programs" optional = false -python-versions = ">=3.6" +python-versions = ">=3.8" +groups = ["dev"] files = [ - {file = "pyflakes-3.0.1-py2.py3-none-any.whl", hash = "sha256:ec55bf7fe21fff7f1ad2f7da62363d749e2a470500eab1b555334b67aa1ef8cf"}, - {file = "pyflakes-3.0.1.tar.gz", hash = "sha256:ec8b276a6b60bd80defed25add7e439881c19e64850afd9b346283d4165fd0fd"}, + {file = "pyflakes-3.2.0-py2.py3-none-any.whl", hash = "sha256:84b5be138a2dfbb40689ca07e2152deb896a65c3a3e24c251c5c62489568074a"}, + {file = "pyflakes-3.2.0.tar.gz", hash = "sha256:1c61603ff154621fb2a9172037d84dca3500def8c8b630657d1701f026f8af3f"}, ] [[package]] name = "pygments" -version = "2.17.2" +version = "2.19.1" description = "Pygments is a syntax highlighting package written in Python." optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" +groups = ["dev"] files = [ - {file = "pygments-2.17.2-py3-none-any.whl", hash = "sha256:b27c2826c47d0f3219f29554824c30c5e8945175d888647acd804ddd04af846c"}, - {file = "pygments-2.17.2.tar.gz", hash = "sha256:da46cec9fd2de5be3a8a784f434e4c4ab670b4ff54d605c4c2717e9d49c4c367"}, + {file = "pygments-2.19.1-py3-none-any.whl", hash = "sha256:9ea1544ad55cecf4b8242fab6dd35a93bbce657034b0611ee383099054ab6d8c"}, + {file = "pygments-2.19.1.tar.gz", hash = "sha256:61c16d2a8576dc0649d9f39e089b5f02bcd27fba10d8fb4dcc28173f7a45151f"}, ] [package.extras] -plugins = ["importlib-metadata"] windows-terminal = ["colorama (>=0.4.6)"] [[package]] name = "pyjwt" -version = "2.8.0" +version = "2.10.1" description = "JSON Web Token implementation in Python" optional = false -python-versions = ">=3.7" +python-versions = ">=3.9" +groups = ["main"] files = [ - {file = "PyJWT-2.8.0-py3-none-any.whl", hash = "sha256:59127c392cc44c2da5bb3192169a91f429924e17aff6534d70fdc02ab3e04320"}, - {file = "PyJWT-2.8.0.tar.gz", hash = "sha256:57e28d156e3d5c10088e0c68abb90bfac3df82b40a71bd0daa20c65ccd5c23de"}, + {file = "PyJWT-2.10.1-py3-none-any.whl", hash = "sha256:dcdd193e30abefd5debf142f9adfcdd2b58004e644f25406ffaebd50bd98dacb"}, + {file = "pyjwt-2.10.1.tar.gz", hash = "sha256:3cc5772eb20009233caf06e9d8a0577824723b44e6648ee0a2aedb6cf9381953"}, ] -[package.dependencies] -typing-extensions = {version = "*", markers = "python_version <= \"3.7\""} - [package.extras] crypto = ["cryptography (>=3.4.0)"] -dev = ["coverage[toml] (==5.0.4)", "cryptography (>=3.4.0)", "pre-commit", "pytest (>=6.0.0,<7.0.0)", "sphinx (>=4.5.0,<5.0.0)", "sphinx-rtd-theme", "zope.interface"] -docs = ["sphinx (>=4.5.0,<5.0.0)", "sphinx-rtd-theme", "zope.interface"] +dev = ["coverage[toml] (==5.0.4)", "cryptography (>=3.4.0)", "pre-commit", "pytest (>=6.0.0,<7.0.0)", "sphinx", "sphinx-rtd-theme", "zope.interface"] +docs = ["sphinx", "sphinx-rtd-theme", "zope.interface"] tests = ["coverage[toml] (==5.0.4)", "pytest (>=6.0.0,<7.0.0)"] [[package]] @@ -1990,6 +2160,7 @@ version = "0.2.0" description = "\"Python interface to your NPM and package.json.\"" optional = false python-versions = ">=3.7" +groups = ["main"] files = [ {file = "pynpm-0.2.0-py2.py3-none-any.whl", hash = "sha256:a04d58e4c3d46be26eaae9abd1cf59109a7670c5edd9cacd90e1d3b3afdd77c0"}, {file = "pynpm-0.2.0.tar.gz", hash = "sha256:212a1e5f86fe8b790945dd856682c6dcd8eddc6f8803a51e7046fe427d7f801b"}, @@ -2000,38 +2171,51 @@ tests = ["pytest-black (>=0.3.0,<0.3.10)", "pytest-cache (>=1.0)", "pytest-inven [[package]] name = "pyproject-hooks" -version = "1.1.0" +version = "1.2.0" description = "Wrappers to call pyproject.toml-based build backend hooks." optional = false python-versions = ">=3.7" +groups = ["dev"] files = [ - {file = "pyproject_hooks-1.1.0-py3-none-any.whl", hash = "sha256:7ceeefe9aec63a1064c18d939bdc3adf2d8aa1988a510afec15151578b232aa2"}, - {file = "pyproject_hooks-1.1.0.tar.gz", hash = "sha256:4b37730834edbd6bd37f26ece6b44802fb1c1ee2ece0e54ddff8bfc06db86965"}, + {file = "pyproject_hooks-1.2.0-py3-none-any.whl", hash = "sha256:9e5c6bfa8dcc30091c74b0cf803c81fdd29d94f01992a7707bc97babb1141913"}, + {file = "pyproject_hooks-1.2.0.tar.gz", hash = "sha256:1e859bd5c40fae9448642dd871adf459e5e2084186e8d2c2a79a824c970da1f8"}, +] + +[[package]] +name = "pysocks" +version = "1.7.1" +description = "A Python SOCKS client module. See https://github.com/Anorov/PySocks for more information." +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +groups = ["dev"] +files = [ + {file = "PySocks-1.7.1-py27-none-any.whl", hash = "sha256:08e69f092cc6dbe92a0fdd16eeb9b9ffbc13cadfe5ca4c7bd92ffb078b293299"}, + {file = "PySocks-1.7.1-py3-none-any.whl", hash = "sha256:2725bd0a9925919b9b51739eea5f9e2bae91e83288108a9ad338b2e3a4435ee5"}, + {file = "PySocks-1.7.1.tar.gz", hash = "sha256:3f8804571ebe159c380ac6de37643bb4685970655d3bba243530d6558b799aa0"}, ] [[package]] name = "pytest" -version = "7.1.3" +version = "8.3.4" description = "pytest: simple powerful testing with Python" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" +groups = ["dev"] files = [ - {file = "pytest-7.1.3-py3-none-any.whl", hash = "sha256:1377bda3466d70b55e3f5cecfa55bb7cfcf219c7964629b967c37cf0bda818b7"}, - {file = "pytest-7.1.3.tar.gz", hash = "sha256:4f365fec2dff9c1162f834d9f18af1ba13062db0c708bf7b946f8a5c76180c39"}, + {file = "pytest-8.3.4-py3-none-any.whl", hash = "sha256:50e16d954148559c9a74109af1eaf0c945ba2d8f30f0a3d3335edde19788b6f6"}, + {file = "pytest-8.3.4.tar.gz", hash = "sha256:965370d062bce11e73868e0335abac31b4d3de0e82f4007408d242b4f8610761"}, ] [package.dependencies] -attrs = ">=19.2.0" colorama = {version = "*", markers = "sys_platform == \"win32\""} -importlib-metadata = {version = ">=0.12", markers = "python_version < \"3.8\""} +exceptiongroup = {version = ">=1.0.0rc8", markers = "python_version < \"3.11\""} iniconfig = "*" packaging = "*" -pluggy = ">=0.12,<2.0" -py = ">=1.8.2" -tomli = ">=1.0.0" +pluggy = ">=1.5,<2" +tomli = {version = ">=1", markers = "python_version < \"3.11\""} [package.extras] -testing = ["argcomplete", "hypothesis (>=3.56)", "mock", "nose", "pygments (>=2.7.2)", "requests", "xmlschema"] +dev = ["argcomplete", "attrs (>=19.2)", "hypothesis (>=3.56)", "mock", "pygments (>=2.7.2)", "requests", "setuptools", "xmlschema"] [[package]] name = "pytest-black-ng" @@ -2039,6 +2223,7 @@ version = "0.4.1" description = "A pytest plugin to enable format checking with black" optional = false python-versions = ">=3.5" +groups = ["dev"] files = [ {file = "pytest-black-ng-0.4.1.tar.gz", hash = "sha256:20c1d671b2535e5cf6f8fe03d175887a04f549cb2455264bbb81150c941bd701"}, {file = "pytest_black_ng-0.4.1-py3-none-any.whl", hash = "sha256:d4ef8945ff410e3cb915e82420a67256aaca4e9b60cc68c7da1cd3cc85c27315"}, @@ -2051,21 +2236,22 @@ toml = "*" [[package]] name = "pytest-cov" -version = "4.1.0" +version = "6.0.0" description = "Pytest plugin for measuring coverage." optional = false -python-versions = ">=3.7" +python-versions = ">=3.9" +groups = ["dev"] files = [ - {file = "pytest-cov-4.1.0.tar.gz", hash = "sha256:3904b13dfbfec47f003b8e77fd5b589cd11904a21ddf1ab38a64f204d6a10ef6"}, - {file = "pytest_cov-4.1.0-py3-none-any.whl", hash = "sha256:6ba70b9e97e69fcc3fb45bfeab2d0a138fb65c4d0d6a41ef33983ad114be8c3a"}, + {file = "pytest-cov-6.0.0.tar.gz", hash = "sha256:fde0b595ca248bb8e2d76f020b465f3b107c9632e6a1d1705f17834c89dcadc0"}, + {file = "pytest_cov-6.0.0-py3-none-any.whl", hash = "sha256:eee6f1b9e61008bd34975a4d5bab25801eb31898b032dd55addc93e96fcaaa35"}, ] [package.dependencies] -coverage = {version = ">=5.2.1", extras = ["toml"]} +coverage = {version = ">=7.5", extras = ["toml"]} pytest = ">=4.6" [package.extras] -testing = ["fields", "hunter", "process-tests", "pytest-xdist", "six", "virtualenv"] +testing = ["fields", "hunter", "process-tests", "pytest-xdist", "virtualenv"] [[package]] name = "pytest-flask" @@ -2073,6 +2259,7 @@ version = "1.3.0" description = "A set of py.test fixtures to test Flask applications." optional = false python-versions = ">=3.7" +groups = ["dev"] files = [ {file = "pytest-flask-1.3.0.tar.gz", hash = "sha256:58be1c97b21ba3c4d47e0a7691eb41007748506c36bf51004f78df10691fa95e"}, {file = "pytest_flask-1.3.0-py3-none-any.whl", hash = "sha256:c0e36e6b0fddc3b91c4362661db83fa694d1feb91fa505475be6732b5bc8c253"}, @@ -2088,75 +2275,77 @@ docs = ["Sphinx", "sphinx-rtd-theme"] [[package]] name = "pytest-github-actions-annotate-failures" -version = "0.2.0" +version = "0.3.0" description = "pytest plugin to annotate failed tests with a workflow command for GitHub Actions" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" +groups = ["dev"] files = [ - {file = "pytest-github-actions-annotate-failures-0.2.0.tar.gz", hash = "sha256:844ab626d389496e44f960b42f0a72cce29ae06d363426d17ea9ae1b4bef2288"}, - {file = "pytest_github_actions_annotate_failures-0.2.0-py3-none-any.whl", hash = "sha256:8bcef65fed503faaa0524b59cfeccc8995130972dd7b008d64193cc41b9cde85"}, + {file = "pytest_github_actions_annotate_failures-0.3.0-py3-none-any.whl", hash = "sha256:41ea558ba10c332c0bfc053daeee0c85187507b2034e990f21e4f7e5fef044cf"}, + {file = "pytest_github_actions_annotate_failures-0.3.0.tar.gz", hash = "sha256:d4c3177c98046c3900a7f8ddebb22ea54b9f6822201b5d3ab8fcdea51e010db7"}, ] [package.dependencies] -pytest = ">=4.0.0" +pytest = ">=6.0.0" [[package]] name = "pytest-invenio" -version = "2.2.0" +version = "3.0.0" description = "Pytest fixtures for Invenio." optional = false python-versions = ">=3.7" +groups = ["dev"] files = [ - {file = "pytest-invenio-2.2.0.tar.gz", hash = "sha256:4b896567ef67234331e794168fee12d13e4d4d1743ad912cd099772977aa0e98"}, - {file = "pytest_invenio-2.2.0-py2.py3-none-any.whl", hash = "sha256:29a131e785686c836c6d7be04e10c7b6345d0ca6996e3fe719d670bc3e70b8c6"}, + {file = "pytest_invenio-3.0.0-py2.py3-none-any.whl", hash = "sha256:e4ab188c6780df0a740b6d88496f13e2fd51e02f475bd4c00d100f3866707a25"}, + {file = "pytest_invenio-3.0.0.tar.gz", hash = "sha256:8ffe0bedf4b5af95a1d6561b394eb74df5bdbe7818e30a2203e86e0e70e40b70"}, ] [package.dependencies] check-manifest = ">=0.42" coverage = ">=5.3,<8" docker-services-cli = ">=0.4.0" -Flask = ">=1.1.4,<2.3.0" -importlib-metadata = ">=4.4" +importlib-metadata = ">=4.4,<8.0.0" importlib-resources = ">=5.0" -pytest = ">=6,<7.2.0" +pytest = ">=6,<9.0.0" pytest-cov = ">=3.0.0" pytest-flask = ">=1.2.0" pytest-github-actions-annotate-failures = ">=0.2.0" pytest-isort = ">=3.0.0" pytest-pycodestyle = ">=2.2.0" pytest-pydocstyle = ">=2.2.3" -selenium = ">=3.7.0,<4" +selenium = ">=3.7.0,<5" [package.extras] -elasticsearch7 = ["invenio-search[elasticsearch7] (>=2.1.0,<3.0.0)"] -opensearch1 = ["invenio-search[opensearch1] (>=2.1.0,<3.0.0)"] -opensearch2 = ["invenio-search[opensearch2] (>=2.1.0,<3.0.0)"] -tests = ["invenio-celery (>=1.2.4,<2.0.0)", "invenio-db (>=1.0.12,<2.0.0)", "invenio-files-rest (>=1.3.2,<2.0.0)", "invenio-mail (>=1.0.2,<2.0.0)", "invenio-search (>=2.1.0,<3.0.0)", "pytest-black (>=0.3.0)", "sphinx (>=4.5)"] +elasticsearch7 = ["invenio-search[elasticsearch7] (>=3.0.0,<4.0.0)"] +opensearch1 = ["invenio-search[opensearch1] (>=3.0.0,<4.0.0)"] +opensearch2 = ["invenio-search[opensearch2] (>=3.0.0,<4.0.0)"] +tests = ["invenio-celery (>=2.0.0,<3.0.0)", "invenio-db (>=2.0.0,<3.0.0)", "invenio-files-rest (>=3.0.0,<4.0.0)", "invenio-mail (>=1.0.2,<3.0.0)", "invenio-search (>=3.0.0,<4.0.0)", "pytest-black-ng (>=0.4.0)", "sphinx (>=4.5)"] [[package]] name = "pytest-isort" -version = "3.1.0" +version = "4.0.0" description = "py.test plugin to check import ordering using isort" optional = false -python-versions = ">=3.7,<4" +python-versions = ">=3.8,<4" +groups = ["dev"] files = [ - {file = "pytest_isort-3.1.0-py3-none-any.whl", hash = "sha256:13e68d84b35d4f79d20d3d165f491bffc9e4b9509f420381a4186118c4454bd3"}, - {file = "pytest_isort-3.1.0.tar.gz", hash = "sha256:067801dc5e54a474330d074d521c815948ff6d5cf0ed3b9d057b78216851186c"}, + {file = "pytest_isort-4.0.0-py3-none-any.whl", hash = "sha256:14bb3281bab587d6beb53129481e8885232249ec5cfeaf5d903a561ff0589620"}, + {file = "pytest_isort-4.0.0.tar.gz", hash = "sha256:00e99642e282b00b849cf9b49d9102a02ab8c4ec549ace57d7868b723713aaa9"}, ] [package.dependencies] -importlib-metadata = {version = "*", markers = "python_version < \"3.8\""} isort = ">=4.0" pytest = ">=5.0" [[package]] name = "pytest-pycodestyle" -version = "2.3.1" +version = "2.4.1" description = "pytest plugin to run pycodestyle" optional = false -python-versions = "~=3.7" +python-versions = "~=3.9" +groups = ["dev"] files = [ - {file = "pytest-pycodestyle-2.3.1.tar.gz", hash = "sha256:2901327b8e6beab90298a9803074483efe560e191bef81d9e18119b141222830"}, + {file = "pytest_pycodestyle-2.4.1.tar.gz", hash = "sha256:27cfebd52774ad55cceadce959913892b3b0989fc02400ef76a004a8b32ab5c9"}, ] [package.dependencies] @@ -2169,12 +2358,13 @@ tests = ["pytest-isort"] [[package]] name = "pytest-pydocstyle" -version = "2.3.2" +version = "2.4.0" description = "pytest plugin to run pydocstyle" optional = false -python-versions = "~=3.7" +python-versions = "~=3.9" +groups = ["dev"] files = [ - {file = "pytest-pydocstyle-2.3.2.tar.gz", hash = "sha256:a30b28d49607b2fcd7b24678ab6c4e27a288710a34b3a0f1f90f3497e88771c3"}, + {file = "pytest_pydocstyle-2.4.0.tar.gz", hash = "sha256:3770689778ad8d0de8cb51264f3d9b807c11d0ecc31f95e7025426eec126c4d2"}, ] [package.dependencies] @@ -2190,6 +2380,7 @@ version = "2.9.0.post0" description = "Extensions to the standard Python datetime module" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" +groups = ["main"] files = [ {file = "python-dateutil-2.9.0.post0.tar.gz", hash = "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3"}, {file = "python_dateutil-2.9.0.post0-py2.py3-none-any.whl", hash = "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427"}, @@ -2204,6 +2395,7 @@ version = "2024.1" description = "World timezone definitions, modern and historical" optional = false python-versions = "*" +groups = ["main"] files = [ {file = "pytz-2024.1-py2.py3-none-any.whl", hash = "sha256:328171f4e3623139da4983451950b28e95ac706e13f3f2630a879749e7a8b319"}, {file = "pytz-2024.1.tar.gz", hash = "sha256:2a29735ea9c18baf14b448846bde5a48030ed267578472d8955cd0e7443a9812"}, @@ -2211,16 +2403,18 @@ files = [ [[package]] name = "pywebpack" -version = "2.0.0" +version = "2.1.0" description = "Webpack integration layer for Python." optional = false python-versions = ">=3.7" +groups = ["main"] files = [ - {file = "pywebpack-2.0.0-py2.py3-none-any.whl", hash = "sha256:ec2362b948bfa273902265c7596ee66202b60ee2cfd07479231c916103389a6e"}, - {file = "pywebpack-2.0.0.tar.gz", hash = "sha256:676542a37ee29771e9930b9b44632c246d10635c0466ef2f7bf37ade5ed54198"}, + {file = "pywebpack-2.1.0-py2.py3-none-any.whl", hash = "sha256:d7ce2b0ce41ecd2809ae3cc7f8c4a8f927cf9f96da1340cd7e80b6b1dc5b55f9"}, + {file = "pywebpack-2.1.0.tar.gz", hash = "sha256:ecc6b731db3b9448822ecb236923912379782dd81c6a3fba7cae8fa368b8db6c"}, ] [package.dependencies] +importlib-metadata = "*" pynpm = ">=0.1.0" [package.extras] @@ -2228,33 +2422,33 @@ tests = ["pytest-black (>=0.3.0)", "pytest-cache (>=1.0)", "pytest-invenio (>=2. [[package]] name = "redis" -version = "5.0.4" +version = "5.2.1" description = "Python client for Redis database and key-value store" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" +groups = ["main"] files = [ - {file = "redis-5.0.4-py3-none-any.whl", hash = "sha256:7adc2835c7a9b5033b7ad8f8918d09b7344188228809c98df07af226d39dec91"}, - {file = "redis-5.0.4.tar.gz", hash = "sha256:ec31f2ed9675cc54c21ba854cfe0462e6faf1d83c8ce5944709db8a4700b9c61"}, + {file = "redis-5.2.1-py3-none-any.whl", hash = "sha256:ee7e1056b9aea0f04c6c2ed59452947f34c4940ee025f5dd83e6a6418b6989e4"}, + {file = "redis-5.2.1.tar.gz", hash = "sha256:16f2e22dff21d5125e8481515e386711a34cbec50f0e44413dd7d9c060a54e0f"}, ] [package.dependencies] async-timeout = {version = ">=4.0.3", markers = "python_full_version < \"3.11.3\""} -importlib-metadata = {version = ">=1.0", markers = "python_version < \"3.8\""} -typing-extensions = {version = "*", markers = "python_version < \"3.8\""} [package.extras] -hiredis = ["hiredis (>=1.0.0)"] -ocsp = ["cryptography (>=36.0.1)", "pyopenssl (==20.0.1)", "requests (>=2.26.0)"] +hiredis = ["hiredis (>=3.0.0)"] +ocsp = ["cryptography (>=36.0.1)", "pyopenssl (==23.2.1)", "requests (>=2.31.0)"] [[package]] name = "requests" -version = "2.31.0" +version = "2.32.3" description = "Python HTTP for Humans." optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" +groups = ["dev"] files = [ - {file = "requests-2.31.0-py3-none-any.whl", hash = "sha256:58cd2187c01e70e6e26505bca751777aa9f2ee0b7f4300988b709f44e013003f"}, - {file = "requests-2.31.0.tar.gz", hash = "sha256:942c5a758f98d790eaed1a29cb6eefc7ffb0d1cf7af05c3d2791656dbd6ad1e1"}, + {file = "requests-2.32.3-py3-none-any.whl", hash = "sha256:70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6"}, + {file = "requests-2.32.3.tar.gz", hash = "sha256:55365417734eb18255590a9ff9eb97e9e1da868d4ccd6402399eaf68af20a760"}, ] [package.dependencies] @@ -2269,139 +2463,163 @@ use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"] [[package]] name = "selenium" -version = "3.141.0" -description = "Python bindings for Selenium" +version = "4.28.1" +description = "Official Python bindings for Selenium WebDriver" optional = false -python-versions = "*" +python-versions = ">=3.9" +groups = ["dev"] files = [ - {file = "selenium-3.141.0-py2.py3-none-any.whl", hash = "sha256:2d7131d7bc5a5b99a2d9b04aaf2612c411b03b8ca1b1ee8d3de5845a9be2cb3c"}, - {file = "selenium-3.141.0.tar.gz", hash = "sha256:deaf32b60ad91a4611b98d8002757f29e6f2c2d5fcaf202e1c9ad06d6772300d"}, + {file = "selenium-4.28.1-py3-none-any.whl", hash = "sha256:4238847e45e24e4472cfcf3554427512c7aab9443396435b1623ef406fff1cc1"}, + {file = "selenium-4.28.1.tar.gz", hash = "sha256:0072d08670d7ec32db901bd0107695a330cecac9f196e3afb3fa8163026e022a"}, ] [package.dependencies] -urllib3 = "*" +certifi = ">=2021.10.8" +trio = ">=0.17,<1.0" +trio-websocket = ">=0.9,<1.0" +typing_extensions = ">=4.9,<5.0" +urllib3 = {version = ">=1.26,<3", extras = ["socks"]} +websocket-client = ">=1.8,<2.0" [[package]] name = "setuptools" -version = "68.0.0" +version = "75.8.0" description = "Easily download, build, install, upgrade, and uninstall Python packages" optional = false -python-versions = ">=3.7" +python-versions = ">=3.9" +groups = ["dev"] files = [ - {file = "setuptools-68.0.0-py3-none-any.whl", hash = "sha256:11e52c67415a381d10d6b462ced9cfb97066179f0e871399e006c4ab101fc85f"}, - {file = "setuptools-68.0.0.tar.gz", hash = "sha256:baf1fdb41c6da4cd2eae722e135500da913332ab3f2f5c7d33af9b492acb5235"}, + {file = "setuptools-75.8.0-py3-none-any.whl", hash = "sha256:e3982f444617239225d675215d51f6ba05f845d4eec313da4418fdbb56fb27e3"}, + {file = "setuptools-75.8.0.tar.gz", hash = "sha256:c5afc8f407c626b8313a86e10311dd3f661c6cd9c09d4bf8c15c0e11f9f2b0e6"}, ] [package.extras] -docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "pygments-github-lexers (==0.0.5)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-favicon", "sphinx-hoverxref (<2)", "sphinx-inline-tabs", "sphinx-lint", "sphinx-notfound-page (==0.8.3)", "sphinx-reredirects", "sphinxcontrib-towncrier"] -testing = ["build[virtualenv]", "filelock (>=3.4.0)", "flake8-2020", "ini2toml[lite] (>=0.9)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "pip (>=19.1)", "pip-run (>=8.8)", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-mypy (>=0.9.1)", "pytest-perf", "pytest-ruff", "pytest-timeout", "pytest-xdist", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel"] -testing-integration = ["build[virtualenv]", "filelock (>=3.4.0)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "pytest", "pytest-enabler", "pytest-xdist", "tomli", "virtualenv (>=13.0.0)", "wheel"] +check = ["pytest-checkdocs (>=2.4)", "pytest-ruff (>=0.2.1) ; sys_platform != \"cygwin\"", "ruff (>=0.8.0) ; sys_platform != \"cygwin\""] +core = ["importlib_metadata (>=6) ; python_version < \"3.10\"", "jaraco.collections", "jaraco.functools (>=4)", "jaraco.text (>=3.7)", "more_itertools", "more_itertools (>=8.8)", "packaging", "packaging (>=24.2)", "platformdirs (>=4.2.2)", "tomli (>=2.0.1) ; python_version < \"3.11\"", "wheel (>=0.43.0)"] +cover = ["pytest-cov"] +doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "pygments-github-lexers (==0.0.5)", "pyproject-hooks (!=1.1)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-favicon", "sphinx-inline-tabs", "sphinx-lint", "sphinx-notfound-page (>=1,<2)", "sphinx-reredirects", "sphinxcontrib-towncrier", "towncrier (<24.7)"] +enabler = ["pytest-enabler (>=2.2)"] +test = ["build[virtualenv] (>=1.0.3)", "filelock (>=3.4.0)", "ini2toml[lite] (>=0.14)", "jaraco.develop (>=7.21) ; python_version >= \"3.9\" and sys_platform != \"cygwin\"", "jaraco.envs (>=2.2)", "jaraco.path (>=3.7.2)", "jaraco.test (>=5.5)", "packaging (>=24.2)", "pip (>=19.1)", "pyproject-hooks (!=1.1)", "pytest (>=6,!=8.1.*)", "pytest-home (>=0.5)", "pytest-perf ; sys_platform != \"cygwin\"", "pytest-subprocess", "pytest-timeout", "pytest-xdist (>=3)", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel (>=0.44.0)"] +type = ["importlib_metadata (>=7.0.2) ; python_version < \"3.10\"", "jaraco.develop (>=7.21) ; sys_platform != \"cygwin\"", "mypy (==1.14.*)", "pytest-mypy"] [[package]] name = "simplejson" -version = "3.19.2" +version = "3.20.1" description = "Simple, fast, extensible JSON encoder/decoder for Python" optional = false -python-versions = ">=2.5, !=3.0.*, !=3.1.*, !=3.2.*" -files = [ - {file = "simplejson-3.19.2-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:3471e95110dcaf901db16063b2e40fb394f8a9e99b3fe9ee3acc6f6ef72183a2"}, - {file = "simplejson-3.19.2-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:3194cd0d2c959062b94094c0a9f8780ffd38417a5322450a0db0ca1a23e7fbd2"}, - {file = "simplejson-3.19.2-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:8a390e56a7963e3946ff2049ee1eb218380e87c8a0e7608f7f8790ba19390867"}, - {file = "simplejson-3.19.2-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:1537b3dd62d8aae644f3518c407aa8469e3fd0f179cdf86c5992792713ed717a"}, - {file = "simplejson-3.19.2-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:a8617625369d2d03766413bff9e64310feafc9fc4f0ad2b902136f1a5cd8c6b0"}, - {file = "simplejson-3.19.2-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:2c433a412e96afb9a3ce36fa96c8e61a757af53e9c9192c97392f72871e18e69"}, - {file = "simplejson-3.19.2-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:f1c70249b15e4ce1a7d5340c97670a95f305ca79f376887759b43bb33288c973"}, - {file = "simplejson-3.19.2-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:287e39ba24e141b046812c880f4619d0ca9e617235d74abc27267194fc0c7835"}, - {file = "simplejson-3.19.2-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:6f0a0b41dd05eefab547576bed0cf066595f3b20b083956b1405a6f17d1be6ad"}, - {file = "simplejson-3.19.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:2f98d918f7f3aaf4b91f2b08c0c92b1774aea113334f7cde4fe40e777114dbe6"}, - {file = "simplejson-3.19.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:7d74beca677623481810c7052926365d5f07393c72cbf62d6cce29991b676402"}, - {file = "simplejson-3.19.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:7f2398361508c560d0bf1773af19e9fe644e218f2a814a02210ac2c97ad70db0"}, - {file = "simplejson-3.19.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6ad331349b0b9ca6da86064a3599c425c7a21cd41616e175ddba0866da32df48"}, - {file = "simplejson-3.19.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:332c848f02d71a649272b3f1feccacb7e4f7e6de4a2e6dc70a32645326f3d428"}, - {file = "simplejson-3.19.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:25785d038281cd106c0d91a68b9930049b6464288cea59ba95b35ee37c2d23a5"}, - {file = "simplejson-3.19.2-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:18955c1da6fc39d957adfa346f75226246b6569e096ac9e40f67d102278c3bcb"}, - {file = "simplejson-3.19.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:11cc3afd8160d44582543838b7e4f9aa5e97865322844b75d51bf4e0e413bb3e"}, - {file = "simplejson-3.19.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:b01fda3e95d07a6148702a641e5e293b6da7863f8bc9b967f62db9461330562c"}, - {file = "simplejson-3.19.2-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:778331444917108fa8441f59af45886270d33ce8a23bfc4f9b192c0b2ecef1b3"}, - {file = "simplejson-3.19.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:9eb117db8d7ed733a7317c4215c35993b815bf6aeab67523f1f11e108c040672"}, - {file = "simplejson-3.19.2-cp310-cp310-win32.whl", hash = "sha256:39b6d79f5cbfa3eb63a869639cfacf7c41d753c64f7801efc72692c1b2637ac7"}, - {file = "simplejson-3.19.2-cp310-cp310-win_amd64.whl", hash = "sha256:5675e9d8eeef0aa06093c1ff898413ade042d73dc920a03e8cea2fb68f62445a"}, - {file = "simplejson-3.19.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:ed628c1431100b0b65387419551e822987396bee3c088a15d68446d92f554e0c"}, - {file = "simplejson-3.19.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:adcb3332979cbc941b8fff07181f06d2b608625edc0a4d8bc3ffc0be414ad0c4"}, - {file = "simplejson-3.19.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:08889f2f597ae965284d7b52a5c3928653a9406d88c93e3161180f0abc2433ba"}, - {file = "simplejson-3.19.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ef7938a78447174e2616be223f496ddccdbf7854f7bf2ce716dbccd958cc7d13"}, - {file = "simplejson-3.19.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a970a2e6d5281d56cacf3dc82081c95c1f4da5a559e52469287457811db6a79b"}, - {file = "simplejson-3.19.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:554313db34d63eac3b3f42986aa9efddd1a481169c12b7be1e7512edebff8eaf"}, - {file = "simplejson-3.19.2-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4d36081c0b1c12ea0ed62c202046dca11438bee48dd5240b7c8de8da62c620e9"}, - {file = "simplejson-3.19.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:a3cd18e03b0ee54ea4319cdcce48357719ea487b53f92a469ba8ca8e39df285e"}, - {file = "simplejson-3.19.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:66e5dc13bfb17cd6ee764fc96ccafd6e405daa846a42baab81f4c60e15650414"}, - {file = "simplejson-3.19.2-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:972a7833d4a1fcf7a711c939e315721a88b988553fc770a5b6a5a64bd6ebeba3"}, - {file = "simplejson-3.19.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:3e74355cb47e0cd399ead3477e29e2f50e1540952c22fb3504dda0184fc9819f"}, - {file = "simplejson-3.19.2-cp311-cp311-win32.whl", hash = "sha256:1dd4f692304854352c3e396e9b5f0a9c9e666868dd0bdc784e2ac4c93092d87b"}, - {file = "simplejson-3.19.2-cp311-cp311-win_amd64.whl", hash = "sha256:9300aee2a8b5992d0f4293d88deb59c218989833e3396c824b69ba330d04a589"}, - {file = "simplejson-3.19.2-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:b8d940fd28eb34a7084877747a60873956893e377f15a32ad445fe66c972c3b8"}, - {file = "simplejson-3.19.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:4969d974d9db826a2c07671273e6b27bc48e940738d768fa8f33b577f0978378"}, - {file = "simplejson-3.19.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:c594642d6b13d225e10df5c16ee15b3398e21a35ecd6aee824f107a625690374"}, - {file = "simplejson-3.19.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e2f5a398b5e77bb01b23d92872255e1bcb3c0c719a3be40b8df146570fe7781a"}, - {file = "simplejson-3.19.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:176a1b524a3bd3314ed47029a86d02d5a95cc0bee15bd3063a1e1ec62b947de6"}, - {file = "simplejson-3.19.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f3c7363a8cb8c5238878ec96c5eb0fc5ca2cb11fc0c7d2379863d342c6ee367a"}, - {file = "simplejson-3.19.2-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:346820ae96aa90c7d52653539a57766f10f33dd4be609206c001432b59ddf89f"}, - {file = "simplejson-3.19.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:de9a2792612ec6def556d1dc621fd6b2073aff015d64fba9f3e53349ad292734"}, - {file = "simplejson-3.19.2-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:1c768e7584c45094dca4b334af361e43b0aaa4844c04945ac7d43379eeda9bc2"}, - {file = "simplejson-3.19.2-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:9652e59c022e62a5b58a6f9948b104e5bb96d3b06940c6482588176f40f4914b"}, - {file = "simplejson-3.19.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:9c1a4393242e321e344213a90a1e3bf35d2f624aa8b8f6174d43e3c6b0e8f6eb"}, - {file = "simplejson-3.19.2-cp312-cp312-win32.whl", hash = "sha256:7cb98be113911cb0ad09e5523d0e2a926c09a465c9abb0784c9269efe4f95917"}, - {file = "simplejson-3.19.2-cp312-cp312-win_amd64.whl", hash = "sha256:6779105d2fcb7fcf794a6a2a233787f6bbd4731227333a072d8513b252ed374f"}, - {file = "simplejson-3.19.2-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:061e81ea2d62671fa9dea2c2bfbc1eec2617ae7651e366c7b4a2baf0a8c72cae"}, - {file = "simplejson-3.19.2-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4280e460e51f86ad76dc456acdbfa9513bdf329556ffc8c49e0200878ca57816"}, - {file = "simplejson-3.19.2-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:11c39fbc4280d7420684494373b7c5904fa72a2b48ef543a56c2d412999c9e5d"}, - {file = "simplejson-3.19.2-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bccb3e88ec26ffa90f72229f983d3a5d1155e41a1171190fa723d4135523585b"}, - {file = "simplejson-3.19.2-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1bb5b50dc6dd671eb46a605a3e2eb98deb4a9af787a08fcdddabe5d824bb9664"}, - {file = "simplejson-3.19.2-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:d94245caa3c61f760c4ce4953cfa76e7739b6f2cbfc94cc46fff6c050c2390c5"}, - {file = "simplejson-3.19.2-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:d0e5ffc763678d48ecc8da836f2ae2dd1b6eb2d27a48671066f91694e575173c"}, - {file = "simplejson-3.19.2-cp36-cp36m-musllinux_1_1_ppc64le.whl", hash = "sha256:d222a9ed082cd9f38b58923775152003765016342a12f08f8c123bf893461f28"}, - {file = "simplejson-3.19.2-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:8434dcdd347459f9fd9c526117c01fe7ca7b016b6008dddc3c13471098f4f0dc"}, - {file = "simplejson-3.19.2-cp36-cp36m-win32.whl", hash = "sha256:c9ac1c2678abf9270e7228133e5b77c6c3c930ad33a3c1dfbdd76ff2c33b7b50"}, - {file = "simplejson-3.19.2-cp36-cp36m-win_amd64.whl", hash = "sha256:92c4a4a2b1f4846cd4364855cbac83efc48ff5a7d7c06ba014c792dd96483f6f"}, - {file = "simplejson-3.19.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:0d551dc931638e2102b8549836a1632e6e7cf620af3d093a7456aa642bff601d"}, - {file = "simplejson-3.19.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:73a8a4653f2e809049999d63530180d7b5a344b23a793502413ad1ecea9a0290"}, - {file = "simplejson-3.19.2-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:40847f617287a38623507d08cbcb75d51cf9d4f9551dd6321df40215128325a3"}, - {file = "simplejson-3.19.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:be893258d5b68dd3a8cba8deb35dc6411db844a9d35268a8d3793b9d9a256f80"}, - {file = "simplejson-3.19.2-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e9eb3cff1b7d71aa50c89a0536f469cb8d6dcdd585d8f14fb8500d822f3bdee4"}, - {file = "simplejson-3.19.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:d0f402e787e6e7ee7876c8b05e2fe6464820d9f35ba3f172e95b5f8b699f6c7f"}, - {file = "simplejson-3.19.2-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:fbbcc6b0639aa09b9649f36f1bcb347b19403fe44109948392fbb5ea69e48c3e"}, - {file = "simplejson-3.19.2-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:2fc697be37585eded0c8581c4788fcfac0e3f84ca635b73a5bf360e28c8ea1a2"}, - {file = "simplejson-3.19.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:0b0a3eb6dd39cce23801a50c01a0976971498da49bc8a0590ce311492b82c44b"}, - {file = "simplejson-3.19.2-cp37-cp37m-win32.whl", hash = "sha256:49f9da0d6cd17b600a178439d7d2d57c5ef01f816b1e0e875e8e8b3b42db2693"}, - {file = "simplejson-3.19.2-cp37-cp37m-win_amd64.whl", hash = "sha256:c87c22bd6a987aca976e3d3e23806d17f65426191db36d40da4ae16a6a494cbc"}, - {file = "simplejson-3.19.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:9e4c166f743bb42c5fcc60760fb1c3623e8fda94f6619534217b083e08644b46"}, - {file = "simplejson-3.19.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0a48679310e1dd5c9f03481799311a65d343748fe86850b7fb41df4e2c00c087"}, - {file = "simplejson-3.19.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:c0521e0f07cb56415fdb3aae0bbd8701eb31a9dfef47bb57206075a0584ab2a2"}, - {file = "simplejson-3.19.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0d2d5119b1d7a1ed286b8af37357116072fc96700bce3bec5bb81b2e7057ab41"}, - {file = "simplejson-3.19.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2c1467d939932901a97ba4f979e8f2642415fcf02ea12f53a4e3206c9c03bc17"}, - {file = "simplejson-3.19.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:49aaf4546f6023c44d7e7136be84a03a4237f0b2b5fb2b17c3e3770a758fc1a0"}, - {file = "simplejson-3.19.2-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:60848ab779195b72382841fc3fa4f71698a98d9589b0a081a9399904487b5832"}, - {file = "simplejson-3.19.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:0436a70d8eb42bea4fe1a1c32d371d9bb3b62c637969cb33970ad624d5a3336a"}, - {file = "simplejson-3.19.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:49e0e3faf3070abdf71a5c80a97c1afc059b4f45a5aa62de0c2ca0444b51669b"}, - {file = "simplejson-3.19.2-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:ff836cd4041e16003549449cc0a5e372f6b6f871eb89007ab0ee18fb2800fded"}, - {file = "simplejson-3.19.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:3848427b65e31bea2c11f521b6fc7a3145d6e501a1038529da2391aff5970f2f"}, - {file = "simplejson-3.19.2-cp38-cp38-win32.whl", hash = "sha256:3f39bb1f6e620f3e158c8b2eaf1b3e3e54408baca96a02fe891794705e788637"}, - {file = "simplejson-3.19.2-cp38-cp38-win_amd64.whl", hash = "sha256:0405984f3ec1d3f8777c4adc33eac7ab7a3e629f3b1c05fdded63acc7cf01137"}, - {file = "simplejson-3.19.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:445a96543948c011a3a47c8e0f9d61e9785df2544ea5be5ab3bc2be4bd8a2565"}, - {file = "simplejson-3.19.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:4a8c3cc4f9dfc33220246760358c8265dad6e1104f25f0077bbca692d616d358"}, - {file = "simplejson-3.19.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:af9c7e6669c4d0ad7362f79cb2ab6784d71147503e62b57e3d95c4a0f222c01c"}, - {file = "simplejson-3.19.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:064300a4ea17d1cd9ea1706aa0590dcb3be81112aac30233823ee494f02cb78a"}, - {file = "simplejson-3.19.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9453419ea2ab9b21d925d0fd7e3a132a178a191881fab4169b6f96e118cc25bb"}, - {file = "simplejson-3.19.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9e038c615b3906df4c3be8db16b3e24821d26c55177638ea47b3f8f73615111c"}, - {file = "simplejson-3.19.2-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:16ca9c90da4b1f50f089e14485db8c20cbfff2d55424062791a7392b5a9b3ff9"}, - {file = "simplejson-3.19.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:1018bd0d70ce85f165185d2227c71e3b1e446186f9fa9f971b69eee223e1e3cd"}, - {file = "simplejson-3.19.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:e8dd53a8706b15bc0e34f00e6150fbefb35d2fd9235d095b4f83b3c5ed4fa11d"}, - {file = "simplejson-3.19.2-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:2d022b14d7758bfb98405672953fe5c202ea8a9ccf9f6713c5bd0718eba286fd"}, - {file = "simplejson-3.19.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:febffa5b1eda6622d44b245b0685aff6fb555ce0ed734e2d7b1c3acd018a2cff"}, - {file = "simplejson-3.19.2-cp39-cp39-win32.whl", hash = "sha256:4edcd0bf70087b244ba77038db23cd98a1ace2f91b4a3ecef22036314d77ac23"}, - {file = "simplejson-3.19.2-cp39-cp39-win_amd64.whl", hash = "sha256:aad7405c033d32c751d98d3a65801e2797ae77fac284a539f6c3a3e13005edc4"}, - {file = "simplejson-3.19.2-py3-none-any.whl", hash = "sha256:bcedf4cae0d47839fee7de344f96b5694ca53c786f28b5f773d4f0b265a159eb"}, - {file = "simplejson-3.19.2.tar.gz", hash = "sha256:9eb442a2442ce417801c912df68e1f6ccfcd41577ae7274953ab3ad24ef7d82c"}, +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.5" +groups = ["main"] +files = [ + {file = "simplejson-3.20.1-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:f5272b5866b259fe6c33c4a8c5073bf8b359c3c97b70c298a2f09a69b52c7c41"}, + {file = "simplejson-3.20.1-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:5c0de368f3052a59a1acf21f8b2dd28686a9e4eba2da7efae7ed9554cb31e7bc"}, + {file = "simplejson-3.20.1-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:0821871404a537fd0e22eba240c74c0467c28af6cc435903eca394cfc74a0497"}, + {file = "simplejson-3.20.1-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:c939a1e576bded47d7d03aa2afc2ae90b928b2cf1d9dc2070ceec51fd463f430"}, + {file = "simplejson-3.20.1-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:3c4f0a61cdc05550782ca4a2cdb311ea196c2e6be6b24a09bf71360ca8c3ca9b"}, + {file = "simplejson-3.20.1-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:6c21f5c026ca633cfffcb6bc1fac2e99f65cb2b24657d3bef21aed9916cc3bbf"}, + {file = "simplejson-3.20.1-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:8d23b7f8d6b72319d6d55a0261089ff621ce87e54731c2d3de6a9bf7be5c028c"}, + {file = "simplejson-3.20.1-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:cda5c32a98f392909088111ecec23f2b0d39346ceae1a0fea23ab2d1f84ec21d"}, + {file = "simplejson-3.20.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:e580aa65d5f6c3bf41b9b4afe74be5d5ddba9576701c107c772d936ea2b5043a"}, + {file = "simplejson-3.20.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:4a586ce4f78cec11f22fe55c5bee0f067e803aab9bad3441afe2181693b5ebb5"}, + {file = "simplejson-3.20.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:74a1608f9e6e8c27a4008d70a54270868306d80ed48c9df7872f9f4b8ac87808"}, + {file = "simplejson-3.20.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:03db8cb64154189a92a7786209f24e391644f3a3fa335658be2df2af1960b8d8"}, + {file = "simplejson-3.20.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:eea7e2b7d858f6fdfbf0fe3cb846d6bd8a45446865bc09960e51f3d473c2271b"}, + {file = "simplejson-3.20.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e66712b17d8425bb7ff8968d4c7c7fd5a2dd7bd63728b28356223c000dd2f91f"}, + {file = "simplejson-3.20.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a2cc4f6486f9f515b62f5831ff1888886619b84fc837de68f26d919ba7bbdcbc"}, + {file = "simplejson-3.20.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:a3c2df555ee4016148fa192e2b9cd9e60bc1d40769366134882685e90aee2a1e"}, + {file = "simplejson-3.20.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:78520f04b7548a5e476b5396c0847e066f1e0a4c0c5e920da1ad65e95f410b11"}, + {file = "simplejson-3.20.1-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:f4bd49ecde87b0fe9f55cc971449a32832bca9910821f7072bbfae1155eaa007"}, + {file = "simplejson-3.20.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:7eaae2b88eb5da53caaffdfa50e2e12022553949b88c0df4f9a9663609373f72"}, + {file = "simplejson-3.20.1-cp310-cp310-win32.whl", hash = "sha256:e836fb88902799eac8debc2b642300748f4860a197fa3d9ea502112b6bb8e142"}, + {file = "simplejson-3.20.1-cp310-cp310-win_amd64.whl", hash = "sha256:b122a19b552b212fc3b5b96fc5ce92333d4a9ac0a800803e1f17ebb16dac4be5"}, + {file = "simplejson-3.20.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:325b8c107253d3217e89d7b50c71015b5b31e2433e6c5bf38967b2f80630a8ca"}, + {file = "simplejson-3.20.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:88a7baa8211089b9e58d78fbc1b0b322103f3f3d459ff16f03a36cece0d0fcf0"}, + {file = "simplejson-3.20.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:299b1007b8101d50d95bc0db1bf5c38dc372e85b504cf77f596462083ee77e3f"}, + {file = "simplejson-3.20.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:03ec618ed65caab48e81e3ed29586236a8e57daef792f1f3bb59504a7e98cd10"}, + {file = "simplejson-3.20.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:cd2cdead1d3197f0ff43373cf4730213420523ba48697743e135e26f3d179f38"}, + {file = "simplejson-3.20.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3466d2839fdc83e1af42e07b90bc8ff361c4e8796cd66722a40ba14e458faddd"}, + {file = "simplejson-3.20.1-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d492ed8e92f3a9f9be829205f44b1d0a89af6582f0cf43e0d129fa477b93fe0c"}, + {file = "simplejson-3.20.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:f924b485537b640dc69434565463fd6fc0c68c65a8c6e01a823dd26c9983cf79"}, + {file = "simplejson-3.20.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:9e8eacf6a3491bf76ea91a8d46726368a6be0eb94993f60b8583550baae9439e"}, + {file = "simplejson-3.20.1-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:d34d04bf90b4cea7c22d8b19091633908f14a096caa301b24c2f3d85b5068fb8"}, + {file = "simplejson-3.20.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:69dd28d4ce38390ea4aaf212902712c0fd1093dc4c1ff67e09687c3c3e15a749"}, + {file = "simplejson-3.20.1-cp311-cp311-win32.whl", hash = "sha256:dfe7a9da5fd2a3499436cd350f31539e0a6ded5da6b5b3d422df016444d65e43"}, + {file = "simplejson-3.20.1-cp311-cp311-win_amd64.whl", hash = "sha256:896a6c04d7861d507d800da7642479c3547060bf97419d9ef73d98ced8258766"}, + {file = "simplejson-3.20.1-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:f31c4a3a7ab18467ee73a27f3e59158255d1520f3aad74315edde7a940f1be23"}, + {file = "simplejson-3.20.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:884e6183d16b725e113b83a6fc0230152ab6627d4d36cb05c89c2c5bccfa7bc6"}, + {file = "simplejson-3.20.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:03d7a426e416fe0d3337115f04164cd9427eb4256e843a6b8751cacf70abc832"}, + {file = "simplejson-3.20.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:000602141d0bddfcff60ea6a6e97d5e10c9db6b17fd2d6c66199fa481b6214bb"}, + {file = "simplejson-3.20.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:af8377a8af78226e82e3a4349efdde59ffa421ae88be67e18cef915e4023a595"}, + {file = "simplejson-3.20.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:15c7de4c88ab2fbcb8781a3b982ef883696736134e20b1210bca43fb42ff1acf"}, + {file = "simplejson-3.20.1-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:455a882ff3f97d810709f7b620007d4e0aca8da71d06fc5c18ba11daf1c4df49"}, + {file = "simplejson-3.20.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:fc0f523ce923e7f38eb67804bc80e0a028c76d7868500aa3f59225574b5d0453"}, + {file = "simplejson-3.20.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:76461ec929282dde4a08061071a47281ad939d0202dc4e63cdd135844e162fbc"}, + {file = "simplejson-3.20.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:ab19c2da8c043607bde4d4ef3a6b633e668a7d2e3d56f40a476a74c5ea71949f"}, + {file = "simplejson-3.20.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:b2578bedaedf6294415197b267d4ef678fea336dd78ee2a6d2f4b028e9d07be3"}, + {file = "simplejson-3.20.1-cp312-cp312-win32.whl", hash = "sha256:339f407373325a36b7fd744b688ba5bae0666b5d340ec6d98aebc3014bf3d8ea"}, + {file = "simplejson-3.20.1-cp312-cp312-win_amd64.whl", hash = "sha256:627d4486a1ea7edf1f66bb044ace1ce6b4c1698acd1b05353c97ba4864ea2e17"}, + {file = "simplejson-3.20.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:71e849e7ceb2178344998cbe5ade101f1b329460243c79c27fbfc51c0447a7c3"}, + {file = "simplejson-3.20.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:b63fdbab29dc3868d6f009a59797cefaba315fd43cd32ddd998ee1da28e50e29"}, + {file = "simplejson-3.20.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:1190f9a3ce644fd50ec277ac4a98c0517f532cfebdcc4bd975c0979a9f05e1fb"}, + {file = "simplejson-3.20.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c1336ba7bcb722ad487cd265701ff0583c0bb6de638364ca947bb84ecc0015d1"}, + {file = "simplejson-3.20.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e975aac6a5acd8b510eba58d5591e10a03e3d16c1cf8a8624ca177491f7230f0"}, + {file = "simplejson-3.20.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6a6dd11ee282937ad749da6f3b8d87952ad585b26e5edfa10da3ae2536c73078"}, + {file = "simplejson-3.20.1-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ab980fcc446ab87ea0879edad41a5c28f2d86020014eb035cf5161e8de4474c6"}, + {file = "simplejson-3.20.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:f5aee2a4cb6b146bd17333ac623610f069f34e8f31d2f4f0c1a2186e50c594f0"}, + {file = "simplejson-3.20.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:652d8eecbb9a3b6461b21ec7cf11fd0acbab144e45e600c817ecf18e4580b99e"}, + {file = "simplejson-3.20.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:8c09948f1a486a89251ee3a67c9f8c969b379f6ffff1a6064b41fea3bce0a112"}, + {file = "simplejson-3.20.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:cbbd7b215ad4fc6f058b5dd4c26ee5c59f72e031dfda3ac183d7968a99e4ca3a"}, + {file = "simplejson-3.20.1-cp313-cp313-win32.whl", hash = "sha256:ae81e482476eaa088ef9d0120ae5345de924f23962c0c1e20abbdff597631f87"}, + {file = "simplejson-3.20.1-cp313-cp313-win_amd64.whl", hash = "sha256:1b9fd15853b90aec3b1739f4471efbf1ac05066a2c7041bf8db821bb73cd2ddc"}, + {file = "simplejson-3.20.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:c7edf279c1376f28bf41e916c015a2a08896597869d57d621f55b6a30c7e1e6d"}, + {file = "simplejson-3.20.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d9202b9de38f12e99a40addd1a8d508a13c77f46d87ab1f9095f154667f4fe81"}, + {file = "simplejson-3.20.1-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:391345b4157cc4e120027e013bd35c45e2c191e2bf48b8913af488cdc3b9243c"}, + {file = "simplejson-3.20.1-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c6fdcc9debb711ddd2ad6d69f9386a3d9e8e253234bbb30513e0a7caa9510c51"}, + {file = "simplejson-3.20.1-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9daf8cdc7ee8a9e9f7a3b313ba0a003391857e90d0e82fbcd4d614aa05cb7c3b"}, + {file = "simplejson-3.20.1-cp36-cp36m-musllinux_1_2_aarch64.whl", hash = "sha256:c02f4868a3a46ffe284a51a88d134dc96feff6079a7115164885331a1ba8ed9f"}, + {file = "simplejson-3.20.1-cp36-cp36m-musllinux_1_2_i686.whl", hash = "sha256:3d7310172d5340febd258cb147f46aae30ad57c445f4d7e1ae8461c10aaf43b0"}, + {file = "simplejson-3.20.1-cp36-cp36m-musllinux_1_2_ppc64le.whl", hash = "sha256:4762e05577955312a4c6802f58dd02e040cc79ae59cda510aa1564d84449c102"}, + {file = "simplejson-3.20.1-cp36-cp36m-musllinux_1_2_x86_64.whl", hash = "sha256:8bb98fdf318c05aefd08a92583bd6ee148e93c6756fb1befb7b2d5f27824be78"}, + {file = "simplejson-3.20.1-cp36-cp36m-win32.whl", hash = "sha256:9a74e70818818981294b8e6956ce3496c5e1bd4726ac864fae473197671f7b85"}, + {file = "simplejson-3.20.1-cp36-cp36m-win_amd64.whl", hash = "sha256:e041add470e8f8535cc05509485eb7205729a84441f03b25cde80ad48823792e"}, + {file = "simplejson-3.20.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:7e9d73f46119240e4f4f07868241749d67d09873f40cb968d639aa9ccc488b86"}, + {file = "simplejson-3.20.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ae6e637dc24f8fee332ed23dd070e81394138e42cd4fd9d0923e5045ba122e27"}, + {file = "simplejson-3.20.1-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:efd3bc6c6b17e3d4620eb6be5196f0d1c08b6ce7c3101fa8e292b79e0908944b"}, + {file = "simplejson-3.20.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:87fc623d457173a0213bc9ca4e346b83c9d443f63ed5cca847fb0cacea3cfc95"}, + {file = "simplejson-3.20.1-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ec6a1e0a7aff76f0e008bebfa950188b9c50b58c1885d898145f48fc8e189a56"}, + {file = "simplejson-3.20.1-cp37-cp37m-musllinux_1_2_aarch64.whl", hash = "sha256:9c079606f461a6e950099167e21e13985147c8a24be8eea66c9ad68f73fad744"}, + {file = "simplejson-3.20.1-cp37-cp37m-musllinux_1_2_i686.whl", hash = "sha256:9faceb68fba27ef17eda306e4cd97a7b4b14fdadca5fbb15790ba8b26ebeec0c"}, + {file = "simplejson-3.20.1-cp37-cp37m-musllinux_1_2_ppc64le.whl", hash = "sha256:7ceed598e4bacbf5133fe7a418f7991bb2df0683f3ac11fbf9e36a2bc7aa4b85"}, + {file = "simplejson-3.20.1-cp37-cp37m-musllinux_1_2_x86_64.whl", hash = "sha256:ede69c765e9901861ad7c6139023b7b7d5807c48a2539d817b4ab40018002d5f"}, + {file = "simplejson-3.20.1-cp37-cp37m-win32.whl", hash = "sha256:d8853c269a4c5146ddca4aa7c70e631795e9d11239d5fedb1c6bbc91ffdebcac"}, + {file = "simplejson-3.20.1-cp37-cp37m-win_amd64.whl", hash = "sha256:ed6a17fd397f0e2b3ad668fc9e19253ed2e3875ad9086bd7f795c29a3223f4a1"}, + {file = "simplejson-3.20.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:7551682b60bba3a9e2780742e101cf0a64250e76de7d09b1c4b0c8a7c7cc6834"}, + {file = "simplejson-3.20.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:bd9577ec1c8c3a43040e3787711e4c257c70035b7551a21854b5dec88dad09e1"}, + {file = "simplejson-3.20.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:4a8e197e4cf6d42c2c57e7c52cd7c1e7b3e37c5911df1314fb393320131e2101"}, + {file = "simplejson-3.20.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6bd09c8c75666e7f62a33d2f1fb57f81da1fcbb19a9fe7d7910b5756e1dd6048"}, + {file = "simplejson-3.20.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1bd6bfe5678d73fbd5328eea6a35216503796428fc47f1237432522febaf3a0c"}, + {file = "simplejson-3.20.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:71b75d448fd0ceb2e7c90e72bb82c41f8462550d48529980bc0bab1d2495bfbb"}, + {file = "simplejson-3.20.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a7e15b716d09f318c8cda3e20f82fae81684ce3d3acd1d7770fa3007df1769de"}, + {file = "simplejson-3.20.1-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:3e7963197d958fcf9e98b212b80977d56c022384621ff463d98afc3b6b1ce7e8"}, + {file = "simplejson-3.20.1-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:2e671dd62051129185d3a9a92c60101f56cbc174854a1a3dfb69114ebd9e1699"}, + {file = "simplejson-3.20.1-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:e25b2a0c396f3b84fb89573d07b0e1846ed563eb364f2ea8230ca92b8a8cb786"}, + {file = "simplejson-3.20.1-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:489c3a43116082bad56795215786313832ba3991cca1f55838e52a553f451ab6"}, + {file = "simplejson-3.20.1-cp38-cp38-win32.whl", hash = "sha256:4a92e948bad8df7fa900ba2ba0667a98303f3db206cbaac574935c332838208e"}, + {file = "simplejson-3.20.1-cp38-cp38-win_amd64.whl", hash = "sha256:49d059b8363327eee3c94799dd96782314b2dbd7bcc293b4ad48db69d6f4d362"}, + {file = "simplejson-3.20.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:a8011f1dd1d676befcd4d675ebdbfdbbefd3bf350052b956ba8c699fca7d8cef"}, + {file = "simplejson-3.20.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:e91703a4c5fec53e36875ae426ad785f4120bd1d93b65bed4752eeccd1789e0c"}, + {file = "simplejson-3.20.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:e39eaa57c7757daa25bcd21f976c46be443b73dd6c3da47fe5ce7b7048ccefe2"}, + {file = "simplejson-3.20.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ceab2ce2acdc7fbaa433a93006758db6ba9a659e80c4faa13b80b9d2318e9b17"}, + {file = "simplejson-3.20.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6d4f320c33277a5b715db5bf5b10dae10c19076bd6d66c2843e04bd12d1f1ea5"}, + {file = "simplejson-3.20.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2b6436c48e64378fa844d8c9e58a5ed0352bbcfd4028369a9b46679b7ab79d2d"}, + {file = "simplejson-3.20.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6e18345c8dda5d699be8166b61f9d80aaee4545b709f1363f60813dc032dac53"}, + {file = "simplejson-3.20.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:90b573693d1526bed576f6817e2a492eaaef68f088b57d7a9e83d122bbb49e51"}, + {file = "simplejson-3.20.1-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:272cc767826e924a6bd369ea3dbf18e166ded29059c7a4d64d21a9a22424b5b5"}, + {file = "simplejson-3.20.1-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:51b41f284d603c4380732d7d619f8b34bd04bc4aa0ed0ed5f4ffd0539b14da44"}, + {file = "simplejson-3.20.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:6e6697a3067d281f01de0fe96fc7cba4ea870d96d7deb7bfcf85186d74456503"}, + {file = "simplejson-3.20.1-cp39-cp39-win32.whl", hash = "sha256:6dd3a1d5aca87bf947f3339b0f8e8e329f1badf548bdbff37fac63c17936da8e"}, + {file = "simplejson-3.20.1-cp39-cp39-win_amd64.whl", hash = "sha256:463f1fca8fbf23d088e5850fdd0dd4d5faea8900a9f9680270bd98fd649814ca"}, + {file = "simplejson-3.20.1-py3-none-any.whl", hash = "sha256:8a6c1bbac39fa4a79f83cbf1df6ccd8ff7069582a9fd8db1e52cea073bc2c697"}, + {file = "simplejson-3.20.1.tar.gz", hash = "sha256:e64139b4ec4f1f24c142ff7dcafe55a22b811a74d86d66560c8815687143037d"}, ] [[package]] @@ -2410,6 +2628,7 @@ version = "0.14.1" description = "A key-value storage for binary data, support many backends." optional = false python-versions = "*" +groups = ["main"] files = [ {file = "simplekv-0.14.1-py2-none-any.whl", hash = "sha256:af91a50af41a286a8b7b93292b21dd1af37f38e9513fea0eb4fa75ce778c1683"}, {file = "simplekv-0.14.1-py3-none-any.whl", hash = "sha256:fcee8d972d092de0dc83732084e389c9b95839503537ef85c1a2eeb07182f2f5"}, @@ -2418,13 +2637,26 @@ files = [ [[package]] name = "six" -version = "1.16.0" +version = "1.17.0" description = "Python 2 and 3 compatibility utilities" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" +groups = ["main"] files = [ - {file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"}, - {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"}, + {file = "six-1.17.0-py2.py3-none-any.whl", hash = "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274"}, + {file = "six-1.17.0.tar.gz", hash = "sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81"}, +] + +[[package]] +name = "sniffio" +version = "1.3.1" +description = "Sniff out which async library your code is running under" +optional = false +python-versions = ">=3.7" +groups = ["dev"] +files = [ + {file = "sniffio-1.3.1-py3-none-any.whl", hash = "sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2"}, + {file = "sniffio-1.3.1.tar.gz", hash = "sha256:f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc"}, ] [[package]] @@ -2433,99 +2665,121 @@ version = "2.2.0" description = "This package provides 29 stemmers for 28 languages generated from Snowball algorithms." optional = false python-versions = "*" +groups = ["dev"] files = [ {file = "snowballstemmer-2.2.0-py2.py3-none-any.whl", hash = "sha256:c8e1716e83cc398ae16824e5572ae04e0d9fc2c6b985fb0f900f5f0c96ecba1a"}, {file = "snowballstemmer-2.2.0.tar.gz", hash = "sha256:09b16deb8547d3412ad7b590689584cd0fe25ec8db3be37788be3810cbf19cb1"}, ] +[[package]] +name = "sortedcontainers" +version = "2.4.0" +description = "Sorted Containers -- Sorted List, Sorted Dict, Sorted Set" +optional = false +python-versions = "*" +groups = ["dev"] +files = [ + {file = "sortedcontainers-2.4.0-py2.py3-none-any.whl", hash = "sha256:a163dcaede0f1c021485e957a39245190e74249897e2ae4b2aa38595db237ee0"}, + {file = "sortedcontainers-2.4.0.tar.gz", hash = "sha256:25caa5a06cc30b6b83d11423433f65d1f9d76c4c6a0c90e3379eaa43b9bfdb88"}, +] + [[package]] name = "speaklater" version = "1.3" description = "implements a lazy string for python useful for use with gettext" optional = false python-versions = "*" +groups = ["main"] files = [ {file = "speaklater-1.3.tar.gz", hash = "sha256:59fea336d0eed38c1f0bf3181ee1222d0ef45f3a9dd34ebe65e6bfffdd6a65a9"}, ] [[package]] name = "sphinx" -version = "5.3.0" +version = "7.4.7" description = "Python documentation generator" optional = false -python-versions = ">=3.6" +python-versions = ">=3.9" +groups = ["dev"] files = [ - {file = "Sphinx-5.3.0.tar.gz", hash = "sha256:51026de0a9ff9fc13c05d74913ad66047e104f56a129ff73e174eb5c3ee794b5"}, - {file = "sphinx-5.3.0-py3-none-any.whl", hash = "sha256:060ca5c9f7ba57a08a1219e547b269fadf125ae25b06b9fa7f66768efb652d6d"}, + {file = "sphinx-7.4.7-py3-none-any.whl", hash = "sha256:c2419e2135d11f1951cd994d6eb18a1835bd8fdd8429f9ca375dc1f3281bd239"}, + {file = "sphinx-7.4.7.tar.gz", hash = "sha256:242f92a7ea7e6c5b406fdc2615413890ba9f699114a9c09192d7dfead2ee9cfe"}, ] [package.dependencies] -alabaster = ">=0.7,<0.8" -babel = ">=2.9" -colorama = {version = ">=0.4.5", markers = "sys_platform == \"win32\""} -docutils = ">=0.14,<0.20" +alabaster = ">=0.7.14,<0.8.0" +babel = ">=2.13" +colorama = {version = ">=0.4.6", markers = "sys_platform == \"win32\""} +docutils = ">=0.20,<0.22" imagesize = ">=1.3" -importlib-metadata = {version = ">=4.8", markers = "python_version < \"3.10\""} -Jinja2 = ">=3.0" -packaging = ">=21.0" -Pygments = ">=2.12" -requests = ">=2.5.0" -snowballstemmer = ">=2.0" +importlib-metadata = {version = ">=6.0", markers = "python_version < \"3.10\""} +Jinja2 = ">=3.1" +packaging = ">=23.0" +Pygments = ">=2.17" +requests = ">=2.30.0" +snowballstemmer = ">=2.2" sphinxcontrib-applehelp = "*" sphinxcontrib-devhelp = "*" sphinxcontrib-htmlhelp = ">=2.0.0" sphinxcontrib-jsmath = "*" sphinxcontrib-qthelp = "*" -sphinxcontrib-serializinghtml = ">=1.1.5" +sphinxcontrib-serializinghtml = ">=1.1.9" +tomli = {version = ">=2", markers = "python_version < \"3.11\""} [package.extras] docs = ["sphinxcontrib-websupport"] -lint = ["docutils-stubs", "flake8 (>=3.5.0)", "flake8-bugbear", "flake8-comprehensions", "flake8-simplify", "isort", "mypy (>=0.981)", "sphinx-lint", "types-requests", "types-typed-ast"] -test = ["cython", "html5lib", "pytest (>=4.6)", "typed_ast"] +lint = ["flake8 (>=6.0)", "importlib-metadata (>=6.0)", "mypy (==1.10.1)", "pytest (>=6.0)", "ruff (==0.5.2)", "sphinx-lint (>=0.9)", "tomli (>=2)", "types-docutils (==0.21.0.20240711)", "types-requests (>=2.30.0)"] +test = ["cython (>=3.0)", "defusedxml (>=0.7.1)", "pytest (>=8.0)", "setuptools (>=70.0)", "typing_extensions (>=4.9)"] [[package]] name = "sphinxcontrib-applehelp" -version = "1.0.2" -description = "sphinxcontrib-applehelp is a sphinx extension which outputs Apple help books" +version = "2.0.0" +description = "sphinxcontrib-applehelp is a Sphinx extension which outputs Apple help books" optional = false -python-versions = ">=3.5" +python-versions = ">=3.9" +groups = ["dev"] files = [ - {file = "sphinxcontrib-applehelp-1.0.2.tar.gz", hash = "sha256:a072735ec80e7675e3f432fcae8610ecf509c5f1869d17e2eecff44389cdbc58"}, - {file = "sphinxcontrib_applehelp-1.0.2-py2.py3-none-any.whl", hash = "sha256:806111e5e962be97c29ec4c1e7fe277bfd19e9652fb1a4392105b43e01af885a"}, + {file = "sphinxcontrib_applehelp-2.0.0-py3-none-any.whl", hash = "sha256:4cd3f0ec4ac5dd9c17ec65e9ab272c9b867ea77425228e68ecf08d6b28ddbdb5"}, + {file = "sphinxcontrib_applehelp-2.0.0.tar.gz", hash = "sha256:2f29ef331735ce958efa4734873f084941970894c6090408b079c61b2e1c06d1"}, ] [package.extras] -lint = ["docutils-stubs", "flake8", "mypy"] +lint = ["mypy", "ruff (==0.5.5)", "types-docutils"] +standalone = ["Sphinx (>=5)"] test = ["pytest"] [[package]] name = "sphinxcontrib-devhelp" -version = "1.0.2" -description = "sphinxcontrib-devhelp is a sphinx extension which outputs Devhelp document." +version = "2.0.0" +description = "sphinxcontrib-devhelp is a sphinx extension which outputs Devhelp documents" optional = false -python-versions = ">=3.5" +python-versions = ">=3.9" +groups = ["dev"] files = [ - {file = "sphinxcontrib-devhelp-1.0.2.tar.gz", hash = "sha256:ff7f1afa7b9642e7060379360a67e9c41e8f3121f2ce9164266f61b9f4b338e4"}, - {file = "sphinxcontrib_devhelp-1.0.2-py2.py3-none-any.whl", hash = "sha256:8165223f9a335cc1af7ffe1ed31d2871f325254c0423bc0c4c7cd1c1e4734a2e"}, + {file = "sphinxcontrib_devhelp-2.0.0-py3-none-any.whl", hash = "sha256:aefb8b83854e4b0998877524d1029fd3e6879210422ee3780459e28a1f03a8a2"}, + {file = "sphinxcontrib_devhelp-2.0.0.tar.gz", hash = "sha256:411f5d96d445d1d73bb5d52133377b4248ec79db5c793ce7dbe59e074b4dd1ad"}, ] [package.extras] -lint = ["docutils-stubs", "flake8", "mypy"] +lint = ["mypy", "ruff (==0.5.5)", "types-docutils"] +standalone = ["Sphinx (>=5)"] test = ["pytest"] [[package]] name = "sphinxcontrib-htmlhelp" -version = "2.0.0" +version = "2.1.0" description = "sphinxcontrib-htmlhelp is a sphinx extension which renders HTML help files" optional = false -python-versions = ">=3.6" +python-versions = ">=3.9" +groups = ["dev"] files = [ - {file = "sphinxcontrib-htmlhelp-2.0.0.tar.gz", hash = "sha256:f5f8bb2d0d629f398bf47d0d69c07bc13b65f75a81ad9e2f71a63d4b7a2f6db2"}, - {file = "sphinxcontrib_htmlhelp-2.0.0-py2.py3-none-any.whl", hash = "sha256:d412243dfb797ae3ec2b59eca0e52dac12e75a241bf0e4eb861e450d06c6ed07"}, + {file = "sphinxcontrib_htmlhelp-2.1.0-py3-none-any.whl", hash = "sha256:166759820b47002d22914d64a075ce08f4c46818e17cfc9470a9786b759b19f8"}, + {file = "sphinxcontrib_htmlhelp-2.1.0.tar.gz", hash = "sha256:c9e2916ace8aad64cc13a0d233ee22317f2b9025b9cf3295249fa985cc7082e9"}, ] [package.extras] -lint = ["docutils-stubs", "flake8", "mypy"] +lint = ["mypy", "ruff (==0.5.5)", "types-docutils"] +standalone = ["Sphinx (>=5)"] test = ["html5lib", "pytest"] [[package]] @@ -2534,6 +2788,7 @@ version = "1.0.1" description = "A sphinx extension which renders display math in HTML via JavaScript" optional = false python-versions = ">=3.5" +groups = ["dev"] files = [ {file = "sphinxcontrib-jsmath-1.0.1.tar.gz", hash = "sha256:a9925e4a4587247ed2191a22df5f6970656cb8ca2bd6284309578f2153e0c4b8"}, {file = "sphinxcontrib_jsmath-1.0.1-py2.py3-none-any.whl", hash = "sha256:2ec2eaebfb78f3f2078e73666b1415417a116cc848b72e5172e596c871103178"}, @@ -2544,127 +2799,148 @@ test = ["flake8", "mypy", "pytest"] [[package]] name = "sphinxcontrib-qthelp" -version = "1.0.3" -description = "sphinxcontrib-qthelp is a sphinx extension which outputs QtHelp document." +version = "2.0.0" +description = "sphinxcontrib-qthelp is a sphinx extension which outputs QtHelp documents" optional = false -python-versions = ">=3.5" +python-versions = ">=3.9" +groups = ["dev"] files = [ - {file = "sphinxcontrib-qthelp-1.0.3.tar.gz", hash = "sha256:4c33767ee058b70dba89a6fc5c1892c0d57a54be67ddd3e7875a18d14cba5a72"}, - {file = "sphinxcontrib_qthelp-1.0.3-py2.py3-none-any.whl", hash = "sha256:bd9fc24bcb748a8d51fd4ecaade681350aa63009a347a8c14e637895444dfab6"}, + {file = "sphinxcontrib_qthelp-2.0.0-py3-none-any.whl", hash = "sha256:b18a828cdba941ccd6ee8445dbe72ffa3ef8cbe7505d8cd1fa0d42d3f2d5f3eb"}, + {file = "sphinxcontrib_qthelp-2.0.0.tar.gz", hash = "sha256:4fe7d0ac8fc171045be623aba3e2a8f613f8682731f9153bb2e40ece16b9bbab"}, ] [package.extras] -lint = ["docutils-stubs", "flake8", "mypy"] -test = ["pytest"] +lint = ["mypy", "ruff (==0.5.5)", "types-docutils"] +standalone = ["Sphinx (>=5)"] +test = ["defusedxml (>=0.7.1)", "pytest"] [[package]] name = "sphinxcontrib-serializinghtml" -version = "1.1.5" -description = "sphinxcontrib-serializinghtml is a sphinx extension which outputs \"serialized\" HTML files (json and pickle)." +version = "2.0.0" +description = "sphinxcontrib-serializinghtml is a sphinx extension which outputs \"serialized\" HTML files (json and pickle)" optional = false -python-versions = ">=3.5" +python-versions = ">=3.9" +groups = ["dev"] files = [ - {file = "sphinxcontrib-serializinghtml-1.1.5.tar.gz", hash = "sha256:aa5f6de5dfdf809ef505c4895e51ef5c9eac17d0f287933eb49ec495280b6952"}, - {file = "sphinxcontrib_serializinghtml-1.1.5-py2.py3-none-any.whl", hash = "sha256:352a9a00ae864471d3a7ead8d7d79f5fc0b57e8b3f95e9867eb9eb28999b92fd"}, + {file = "sphinxcontrib_serializinghtml-2.0.0-py3-none-any.whl", hash = "sha256:6e2cb0eef194e10c27ec0023bfeb25badbbb5868244cf5bc5bdc04e4464bf331"}, + {file = "sphinxcontrib_serializinghtml-2.0.0.tar.gz", hash = "sha256:e9d912827f872c029017a53f0ef2180b327c3f7fd23c87229f7a8e8b70031d4d"}, ] [package.extras] -lint = ["docutils-stubs", "flake8", "mypy"] +lint = ["mypy", "ruff (==0.5.5)", "types-docutils"] +standalone = ["Sphinx (>=5)"] test = ["pytest"] [[package]] name = "sqlalchemy" -version = "1.4.52" +version = "2.0.38" description = "Database Abstraction Library" optional = false -python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,>=2.7" -files = [ - {file = "SQLAlchemy-1.4.52-cp310-cp310-macosx_11_0_x86_64.whl", hash = "sha256:f68016f9a5713684c1507cc37133c28035f29925c75c0df2f9d0f7571e23720a"}, - {file = "SQLAlchemy-1.4.52-cp310-cp310-manylinux1_x86_64.manylinux2010_x86_64.manylinux_2_12_x86_64.manylinux_2_5_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:24bb0f81fbbb13d737b7f76d1821ec0b117ce8cbb8ee5e8641ad2de41aa916d3"}, - {file = "SQLAlchemy-1.4.52-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e93983cc0d2edae253b3f2141b0a3fb07e41c76cd79c2ad743fc27eb79c3f6db"}, - {file = "SQLAlchemy-1.4.52-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:84e10772cfc333eb08d0b7ef808cd76e4a9a30a725fb62a0495877a57ee41d81"}, - {file = "SQLAlchemy-1.4.52-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:427988398d2902de042093d17f2b9619a5ebc605bf6372f7d70e29bde6736842"}, - {file = "SQLAlchemy-1.4.52-cp310-cp310-win32.whl", hash = "sha256:1296f2cdd6db09b98ceb3c93025f0da4835303b8ac46c15c2136e27ee4d18d94"}, - {file = "SQLAlchemy-1.4.52-cp310-cp310-win_amd64.whl", hash = "sha256:80e7f697bccc56ac6eac9e2df5c98b47de57e7006d2e46e1a3c17c546254f6ef"}, - {file = "SQLAlchemy-1.4.52-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:2f251af4c75a675ea42766880ff430ac33291c8d0057acca79710f9e5a77383d"}, - {file = "SQLAlchemy-1.4.52-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cb8f9e4c4718f111d7b530c4e6fb4d28f9f110eb82e7961412955b3875b66de0"}, - {file = "SQLAlchemy-1.4.52-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:afb1672b57f58c0318ad2cff80b384e816735ffc7e848d8aa51e0b0fc2f4b7bb"}, - {file = "SQLAlchemy-1.4.52-cp311-cp311-win32.whl", hash = "sha256:6e41cb5cda641f3754568d2ed8962f772a7f2b59403b95c60c89f3e0bd25f15e"}, - {file = "SQLAlchemy-1.4.52-cp311-cp311-win_amd64.whl", hash = "sha256:5bed4f8c3b69779de9d99eb03fd9ab67a850d74ab0243d1be9d4080e77b6af12"}, - {file = "SQLAlchemy-1.4.52-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:49e3772eb3380ac88d35495843daf3c03f094b713e66c7d017e322144a5c6b7c"}, - {file = "SQLAlchemy-1.4.52-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:618827c1a1c243d2540314c6e100aee7af09a709bd005bae971686fab6723554"}, - {file = "SQLAlchemy-1.4.52-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:de9acf369aaadb71a725b7e83a5ef40ca3de1cf4cdc93fa847df6b12d3cd924b"}, - {file = "SQLAlchemy-1.4.52-cp312-cp312-win32.whl", hash = "sha256:763bd97c4ebc74136ecf3526b34808c58945023a59927b416acebcd68d1fc126"}, - {file = "SQLAlchemy-1.4.52-cp312-cp312-win_amd64.whl", hash = "sha256:f12aaf94f4d9679ca475975578739e12cc5b461172e04d66f7a3c39dd14ffc64"}, - {file = "SQLAlchemy-1.4.52-cp36-cp36m-macosx_10_14_x86_64.whl", hash = "sha256:853fcfd1f54224ea7aabcf34b227d2b64a08cbac116ecf376907968b29b8e763"}, - {file = "SQLAlchemy-1.4.52-cp36-cp36m-manylinux1_x86_64.manylinux2010_x86_64.manylinux_2_12_x86_64.manylinux_2_5_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f98dbb8fcc6d1c03ae8ec735d3c62110949a3b8bc6e215053aa27096857afb45"}, - {file = "SQLAlchemy-1.4.52-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1e135fff2e84103bc15c07edd8569612ce317d64bdb391f49ce57124a73f45c5"}, - {file = "SQLAlchemy-1.4.52-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:5b5de6af8852500d01398f5047d62ca3431d1e29a331d0b56c3e14cb03f8094c"}, - {file = "SQLAlchemy-1.4.52-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3491c85df263a5c2157c594f54a1a9c72265b75d3777e61ee13c556d9e43ffc9"}, - {file = "SQLAlchemy-1.4.52-cp36-cp36m-win32.whl", hash = "sha256:427c282dd0deba1f07bcbf499cbcc9fe9a626743f5d4989bfdfd3ed3513003dd"}, - {file = "SQLAlchemy-1.4.52-cp36-cp36m-win_amd64.whl", hash = "sha256:ca5ce82b11731492204cff8845c5e8ca1a4bd1ade85e3b8fcf86e7601bfc6a39"}, - {file = "SQLAlchemy-1.4.52-cp37-cp37m-macosx_11_0_x86_64.whl", hash = "sha256:29d4247313abb2015f8979137fe65f4eaceead5247d39603cc4b4a610936cd2b"}, - {file = "SQLAlchemy-1.4.52-cp37-cp37m-manylinux1_x86_64.manylinux2010_x86_64.manylinux_2_12_x86_64.manylinux_2_5_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a752bff4796bf22803d052d4841ebc3c55c26fb65551f2c96e90ac7c62be763a"}, - {file = "SQLAlchemy-1.4.52-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f7ea11727feb2861deaa293c7971a4df57ef1c90e42cb53f0da40c3468388000"}, - {file = "SQLAlchemy-1.4.52-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:d913f8953e098ca931ad7f58797f91deed26b435ec3756478b75c608aa80d139"}, - {file = "SQLAlchemy-1.4.52-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a251146b921725547ea1735b060a11e1be705017b568c9f8067ca61e6ef85f20"}, - {file = "SQLAlchemy-1.4.52-cp37-cp37m-win32.whl", hash = "sha256:1f8e1c6a6b7f8e9407ad9afc0ea41c1f65225ce505b79bc0342159de9c890782"}, - {file = "SQLAlchemy-1.4.52-cp37-cp37m-win_amd64.whl", hash = "sha256:346ed50cb2c30f5d7a03d888e25744154ceac6f0e6e1ab3bc7b5b77138d37710"}, - {file = "SQLAlchemy-1.4.52-cp38-cp38-macosx_11_0_x86_64.whl", hash = "sha256:4dae6001457d4497736e3bc422165f107ecdd70b0d651fab7f731276e8b9e12d"}, - {file = "SQLAlchemy-1.4.52-cp38-cp38-manylinux1_x86_64.manylinux2010_x86_64.manylinux_2_12_x86_64.manylinux_2_5_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a5d2e08d79f5bf250afb4a61426b41026e448da446b55e4770c2afdc1e200fce"}, - {file = "SQLAlchemy-1.4.52-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5bbce5dd7c7735e01d24f5a60177f3e589078f83c8a29e124a6521b76d825b85"}, - {file = "SQLAlchemy-1.4.52-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:bdb7b4d889631a3b2a81a3347c4c3f031812eb4adeaa3ee4e6b0d028ad1852b5"}, - {file = "SQLAlchemy-1.4.52-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c294ae4e6bbd060dd79e2bd5bba8b6274d08ffd65b58d106394cb6abbf35cf45"}, - {file = "SQLAlchemy-1.4.52-cp38-cp38-win32.whl", hash = "sha256:bcdfb4b47fe04967669874fb1ce782a006756fdbebe7263f6a000e1db969120e"}, - {file = "SQLAlchemy-1.4.52-cp38-cp38-win_amd64.whl", hash = "sha256:7d0dbc56cb6af5088f3658982d3d8c1d6a82691f31f7b0da682c7b98fa914e91"}, - {file = "SQLAlchemy-1.4.52-cp39-cp39-macosx_11_0_x86_64.whl", hash = "sha256:a551d5f3dc63f096ed41775ceec72fdf91462bb95abdc179010dc95a93957800"}, - {file = "SQLAlchemy-1.4.52-cp39-cp39-manylinux1_x86_64.manylinux2010_x86_64.manylinux_2_12_x86_64.manylinux_2_5_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6ab773f9ad848118df7a9bbabca53e3f1002387cdbb6ee81693db808b82aaab0"}, - {file = "SQLAlchemy-1.4.52-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d2de46f5d5396d5331127cfa71f837cca945f9a2b04f7cb5a01949cf676db7d1"}, - {file = "SQLAlchemy-1.4.52-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:7027be7930a90d18a386b25ee8af30514c61f3852c7268899f23fdfbd3107181"}, - {file = "SQLAlchemy-1.4.52-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:99224d621affbb3c1a4f72b631f8393045f4ce647dd3262f12fe3576918f8bf3"}, - {file = "SQLAlchemy-1.4.52-cp39-cp39-win32.whl", hash = "sha256:c124912fd4e1bb9d1e7dc193ed482a9f812769cb1e69363ab68e01801e859821"}, - {file = "SQLAlchemy-1.4.52-cp39-cp39-win_amd64.whl", hash = "sha256:2c286fab42e49db23c46ab02479f328b8bdb837d3e281cae546cc4085c83b680"}, - {file = "SQLAlchemy-1.4.52.tar.gz", hash = "sha256:80e63bbdc5217dad3485059bdf6f65a7d43f33c8bde619df5c220edf03d87296"}, -] - -[package.dependencies] -greenlet = {version = "!=0.4.17", optional = true, markers = "python_version >= \"3\" and (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\" or extra == \"asyncio\")"} -importlib-metadata = {version = "*", markers = "python_version < \"3.8\""} +python-versions = ">=3.7" +groups = ["main"] +files = [ + {file = "SQLAlchemy-2.0.38-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:5e1d9e429028ce04f187a9f522818386c8b076723cdbe9345708384f49ebcec6"}, + {file = "SQLAlchemy-2.0.38-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:b87a90f14c68c925817423b0424381f0e16d80fc9a1a1046ef202ab25b19a444"}, + {file = "SQLAlchemy-2.0.38-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:402c2316d95ed90d3d3c25ad0390afa52f4d2c56b348f212aa9c8d072a40eee5"}, + {file = "SQLAlchemy-2.0.38-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6493bc0eacdbb2c0f0d260d8988e943fee06089cd239bd7f3d0c45d1657a70e2"}, + {file = "SQLAlchemy-2.0.38-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:0561832b04c6071bac3aad45b0d3bb6d2c4f46a8409f0a7a9c9fa6673b41bc03"}, + {file = "SQLAlchemy-2.0.38-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:49aa2cdd1e88adb1617c672a09bf4ebf2f05c9448c6dbeba096a3aeeb9d4d443"}, + {file = "SQLAlchemy-2.0.38-cp310-cp310-win32.whl", hash = "sha256:64aa8934200e222f72fcfd82ee71c0130a9c07d5725af6fe6e919017d095b297"}, + {file = "SQLAlchemy-2.0.38-cp310-cp310-win_amd64.whl", hash = "sha256:c57b8e0841f3fce7b703530ed70c7c36269c6d180ea2e02e36b34cb7288c50c7"}, + {file = "SQLAlchemy-2.0.38-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:bf89e0e4a30714b357f5d46b6f20e0099d38b30d45fa68ea48589faf5f12f62d"}, + {file = "SQLAlchemy-2.0.38-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:8455aa60da49cb112df62b4721bd8ad3654a3a02b9452c783e651637a1f21fa2"}, + {file = "SQLAlchemy-2.0.38-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f53c0d6a859b2db58332e0e6a921582a02c1677cc93d4cbb36fdf49709b327b2"}, + {file = "SQLAlchemy-2.0.38-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b3c4817dff8cef5697f5afe5fec6bc1783994d55a68391be24cb7d80d2dbc3a6"}, + {file = "SQLAlchemy-2.0.38-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:c9cea5b756173bb86e2235f2f871b406a9b9d722417ae31e5391ccaef5348f2c"}, + {file = "SQLAlchemy-2.0.38-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:40e9cdbd18c1f84631312b64993f7d755d85a3930252f6276a77432a2b25a2f3"}, + {file = "SQLAlchemy-2.0.38-cp311-cp311-win32.whl", hash = "sha256:cb39ed598aaf102251483f3e4675c5dd6b289c8142210ef76ba24aae0a8f8aba"}, + {file = "SQLAlchemy-2.0.38-cp311-cp311-win_amd64.whl", hash = "sha256:f9d57f1b3061b3e21476b0ad5f0397b112b94ace21d1f439f2db472e568178ae"}, + {file = "SQLAlchemy-2.0.38-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:12d5b06a1f3aeccf295a5843c86835033797fea292c60e72b07bcb5d820e6dd3"}, + {file = "SQLAlchemy-2.0.38-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:e036549ad14f2b414c725349cce0772ea34a7ab008e9cd67f9084e4f371d1f32"}, + {file = "SQLAlchemy-2.0.38-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ee3bee874cb1fadee2ff2b79fc9fc808aa638670f28b2145074538d4a6a5028e"}, + {file = "SQLAlchemy-2.0.38-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e185ea07a99ce8b8edfc788c586c538c4b1351007e614ceb708fd01b095ef33e"}, + {file = "SQLAlchemy-2.0.38-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:b79ee64d01d05a5476d5cceb3c27b5535e6bb84ee0f872ba60d9a8cd4d0e6579"}, + {file = "SQLAlchemy-2.0.38-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:afd776cf1ebfc7f9aa42a09cf19feadb40a26366802d86c1fba080d8e5e74bdd"}, + {file = "SQLAlchemy-2.0.38-cp312-cp312-win32.whl", hash = "sha256:a5645cd45f56895cfe3ca3459aed9ff2d3f9aaa29ff7edf557fa7a23515a3725"}, + {file = "SQLAlchemy-2.0.38-cp312-cp312-win_amd64.whl", hash = "sha256:1052723e6cd95312f6a6eff9a279fd41bbae67633415373fdac3c430eca3425d"}, + {file = "SQLAlchemy-2.0.38-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:ecef029b69843b82048c5b347d8e6049356aa24ed644006c9a9d7098c3bd3bfd"}, + {file = "SQLAlchemy-2.0.38-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:9c8bcad7fc12f0cc5896d8e10fdf703c45bd487294a986903fe032c72201596b"}, + {file = "SQLAlchemy-2.0.38-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2a0ef3f98175d77180ffdc623d38e9f1736e8d86b6ba70bff182a7e68bed7727"}, + {file = "SQLAlchemy-2.0.38-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8b0ac78898c50e2574e9f938d2e5caa8fe187d7a5b69b65faa1ea4648925b096"}, + {file = "SQLAlchemy-2.0.38-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:9eb4fa13c8c7a2404b6a8e3772c17a55b1ba18bc711e25e4d6c0c9f5f541b02a"}, + {file = "SQLAlchemy-2.0.38-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:5dba1cdb8f319084f5b00d41207b2079822aa8d6a4667c0f369fce85e34b0c86"}, + {file = "SQLAlchemy-2.0.38-cp313-cp313-win32.whl", hash = "sha256:eae27ad7580529a427cfdd52c87abb2dfb15ce2b7a3e0fc29fbb63e2ed6f8120"}, + {file = "SQLAlchemy-2.0.38-cp313-cp313-win_amd64.whl", hash = "sha256:b335a7c958bc945e10c522c069cd6e5804f4ff20f9a744dd38e748eb602cbbda"}, + {file = "SQLAlchemy-2.0.38-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:40310db77a55512a18827488e592965d3dec6a3f1e3d8af3f8243134029daca3"}, + {file = "SQLAlchemy-2.0.38-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3d3043375dd5bbcb2282894cbb12e6c559654c67b5fffb462fda815a55bf93f7"}, + {file = "SQLAlchemy-2.0.38-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:70065dfabf023b155a9c2a18f573e47e6ca709b9e8619b2e04c54d5bcf193178"}, + {file = "SQLAlchemy-2.0.38-cp37-cp37m-musllinux_1_2_aarch64.whl", hash = "sha256:c058b84c3b24812c859300f3b5abf300daa34df20d4d4f42e9652a4d1c48c8a4"}, + {file = "SQLAlchemy-2.0.38-cp37-cp37m-musllinux_1_2_x86_64.whl", hash = "sha256:0398361acebb42975deb747a824b5188817d32b5c8f8aba767d51ad0cc7bb08d"}, + {file = "SQLAlchemy-2.0.38-cp37-cp37m-win32.whl", hash = "sha256:a2bc4e49e8329f3283d99840c136ff2cd1a29e49b5624a46a290f04dff48e079"}, + {file = "SQLAlchemy-2.0.38-cp37-cp37m-win_amd64.whl", hash = "sha256:9cd136184dd5f58892f24001cdce986f5d7e96059d004118d5410671579834a4"}, + {file = "SQLAlchemy-2.0.38-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:665255e7aae5f38237b3a6eae49d2358d83a59f39ac21036413fab5d1e810578"}, + {file = "SQLAlchemy-2.0.38-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:92f99f2623ff16bd4aaf786ccde759c1f676d39c7bf2855eb0b540e1ac4530c8"}, + {file = "SQLAlchemy-2.0.38-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aa498d1392216fae47eaf10c593e06c34476ced9549657fca713d0d1ba5f7248"}, + {file = "SQLAlchemy-2.0.38-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a9afbc3909d0274d6ac8ec891e30210563b2c8bdd52ebbda14146354e7a69373"}, + {file = "SQLAlchemy-2.0.38-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:57dd41ba32430cbcc812041d4de8d2ca4651aeefad2626921ae2a23deb8cd6ff"}, + {file = "SQLAlchemy-2.0.38-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:3e35d5565b35b66905b79ca4ae85840a8d40d31e0b3e2990f2e7692071b179ca"}, + {file = "SQLAlchemy-2.0.38-cp38-cp38-win32.whl", hash = "sha256:f0d3de936b192980209d7b5149e3c98977c3810d401482d05fb6d668d53c1c63"}, + {file = "SQLAlchemy-2.0.38-cp38-cp38-win_amd64.whl", hash = "sha256:3868acb639c136d98107c9096303d2d8e5da2880f7706f9f8c06a7f961961149"}, + {file = "SQLAlchemy-2.0.38-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:07258341402a718f166618470cde0c34e4cec85a39767dce4e24f61ba5e667ea"}, + {file = "SQLAlchemy-2.0.38-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:0a826f21848632add58bef4f755a33d45105d25656a0c849f2dc2df1c71f6f50"}, + {file = "SQLAlchemy-2.0.38-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:386b7d136919bb66ced64d2228b92d66140de5fefb3c7df6bd79069a269a7b06"}, + {file = "SQLAlchemy-2.0.38-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2f2951dc4b4f990a4b394d6b382accb33141d4d3bd3ef4e2b27287135d6bdd68"}, + {file = "SQLAlchemy-2.0.38-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:8bf312ed8ac096d674c6aa9131b249093c1b37c35db6a967daa4c84746bc1bc9"}, + {file = "SQLAlchemy-2.0.38-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:6db316d6e340f862ec059dc12e395d71f39746a20503b124edc255973977b728"}, + {file = "SQLAlchemy-2.0.38-cp39-cp39-win32.whl", hash = "sha256:c09a6ea87658695e527104cf857c70f79f14e9484605e205217aae0ec27b45fc"}, + {file = "SQLAlchemy-2.0.38-cp39-cp39-win_amd64.whl", hash = "sha256:12f5c9ed53334c3ce719155424dc5407aaa4f6cadeb09c5b627e06abb93933a1"}, + {file = "SQLAlchemy-2.0.38-py3-none-any.whl", hash = "sha256:63178c675d4c80def39f1febd625a6333f44c0ba269edd8a468b156394b27753"}, + {file = "sqlalchemy-2.0.38.tar.gz", hash = "sha256:e5a4d82bdb4bf1ac1285a68eab02d253ab73355d9f0fe725a97e1e0fa689decb"}, +] + +[package.dependencies] +greenlet = {version = "!=0.4.17", optional = true, markers = "python_version < \"3.14\" and (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\") or extra == \"asyncio\""} +typing-extensions = ">=4.6.0" [package.extras] aiomysql = ["aiomysql (>=0.2.0)", "greenlet (!=0.4.17)"] +aioodbc = ["aioodbc", "greenlet (!=0.4.17)"] aiosqlite = ["aiosqlite", "greenlet (!=0.4.17)", "typing_extensions (!=3.10.0.1)"] asyncio = ["greenlet (!=0.4.17)"] -asyncmy = ["asyncmy (>=0.2.3,!=0.2.4)", "greenlet (!=0.4.17)"] -mariadb-connector = ["mariadb (>=1.0.1,!=1.1.2)"] +asyncmy = ["asyncmy (>=0.2.3,!=0.2.4,!=0.2.6)", "greenlet (!=0.4.17)"] +mariadb-connector = ["mariadb (>=1.0.1,!=1.1.2,!=1.1.5,!=1.1.10)"] mssql = ["pyodbc"] mssql-pymssql = ["pymssql"] mssql-pyodbc = ["pyodbc"] -mypy = ["mypy (>=0.910)", "sqlalchemy2-stubs"] -mysql = ["mysqlclient (>=1.4.0)", "mysqlclient (>=1.4.0,<2)"] +mypy = ["mypy (>=0.910)"] +mysql = ["mysqlclient (>=1.4.0)"] mysql-connector = ["mysql-connector-python"] -oracle = ["cx_oracle (>=7)", "cx_oracle (>=7,<8)"] +oracle = ["cx_oracle (>=8)"] +oracle-oracledb = ["oracledb (>=1.0.1)"] postgresql = ["psycopg2 (>=2.7)"] postgresql-asyncpg = ["asyncpg", "greenlet (!=0.4.17)"] -postgresql-pg8000 = ["pg8000 (>=1.16.6,!=1.29.0)"] +postgresql-pg8000 = ["pg8000 (>=1.29.1)"] +postgresql-psycopg = ["psycopg (>=3.0.7)"] postgresql-psycopg2binary = ["psycopg2-binary"] postgresql-psycopg2cffi = ["psycopg2cffi"] -pymysql = ["pymysql", "pymysql (<1)"] +postgresql-psycopgbinary = ["psycopg[binary] (>=3.0.7)"] +pymysql = ["pymysql"] sqlcipher = ["sqlcipher3_binary"] [[package]] name = "sqlalchemy-continuum" -version = "1.4.1" +version = "1.4.0" description = "Versioning and auditing extension for SQLAlchemy." optional = false python-versions = "*" +groups = ["main"] files = [ - {file = "SQLAlchemy-Continuum-1.4.1.tar.gz", hash = "sha256:e01646cdfbfd6b31a21b0aeba6bbff661258d5be8477c7500cab3a1c74848e6e"}, - {file = "SQLAlchemy_Continuum-1.4.1-py3-none-any.whl", hash = "sha256:f884ab36b1be724ecba867f21557f8f4658c1fb9dee6df8fe9a39b63d485bdd5"}, + {file = "SQLAlchemy-Continuum-1.4.0.tar.gz", hash = "sha256:464f9a5b106352b5ee44f139312cb358c592d25eeaae3537c0eac72c2fafb5e5"}, + {file = "SQLAlchemy_Continuum-1.4.0-py3-none-any.whl", hash = "sha256:a1de72660bb026cfaa6b8922ef79efaed5e7bc5e423f1d792d4c38e08ffaf3ae"}, ] [package.dependencies] -SQLAlchemy = ">=1.4.0,<=2.0.21" +SQLAlchemy = ">=1.4.0" SQLAlchemy-Utils = ">=0.30.12" [package.extras] @@ -2680,13 +2956,13 @@ version = "0.38.3" description = "Various utility functions for SQLAlchemy." optional = false python-versions = "~=3.6" +groups = ["main"] files = [ {file = "SQLAlchemy-Utils-0.38.3.tar.gz", hash = "sha256:9f9afba607a40455cf703adfa9846584bf26168a0c5a60a70063b70d65051f4d"}, {file = "SQLAlchemy_Utils-0.38.3-py3-none-any.whl", hash = "sha256:5c13b5d08adfaa85f3d4e8ec09a75136216fad41346980d02974a70a77988bf9"}, ] [package.dependencies] -importlib-metadata = {version = "*", markers = "python_version < \"3.8\""} SQLAlchemy = ">=1.3" [package.extras] @@ -2698,8 +2974,8 @@ intervals = ["intervals (>=0.7.1)"] password = ["passlib (>=1.6,<2.0)"] pendulum = ["pendulum (>=2.0.5)"] phone = ["phonenumbers (>=5.9.2)"] -test = ["Jinja2 (>=2.3)", "Pygments (>=1.2)", "backports.zoneinfo", "docutils (>=0.10)", "flake8 (>=2.4.0)", "flexmock (>=0.9.7)", "isort (>=4.2.2)", "pg8000 (>=1.12.4)", "psycopg2 (>=2.5.1)", "psycopg2cffi (>=2.8.1)", "pymysql", "pyodbc", "pytest (>=2.7.1)", "python-dateutil (>=2.6)", "pytz (>=2014.2)"] -test-all = ["Babel (>=1.3)", "Jinja2 (>=2.3)", "Pygments (>=1.2)", "arrow (>=0.3.4)", "backports.zoneinfo", "colour (>=0.0.4)", "cryptography (>=0.6)", "docutils (>=0.10)", "flake8 (>=2.4.0)", "flexmock (>=0.9.7)", "furl (>=0.4.1)", "intervals (>=0.7.1)", "isort (>=4.2.2)", "passlib (>=1.6,<2.0)", "pendulum (>=2.0.5)", "pg8000 (>=1.12.4)", "phonenumbers (>=5.9.2)", "psycopg2 (>=2.5.1)", "psycopg2cffi (>=2.8.1)", "pymysql", "pyodbc", "pytest (>=2.7.1)", "python-dateutil", "python-dateutil (>=2.6)", "pytz (>=2014.2)"] +test = ["Jinja2 (>=2.3)", "Pygments (>=1.2)", "backports.zoneinfo ; python_version < \"3.9\"", "docutils (>=0.10)", "flake8 (>=2.4.0)", "flexmock (>=0.9.7)", "isort (>=4.2.2)", "pg8000 (>=1.12.4)", "psycopg2 (>=2.5.1)", "psycopg2cffi (>=2.8.1)", "pymysql", "pyodbc", "pytest (>=2.7.1)", "python-dateutil (>=2.6)", "pytz (>=2014.2)"] +test-all = ["Babel (>=1.3)", "Jinja2 (>=2.3)", "Pygments (>=1.2)", "arrow (>=0.3.4)", "backports.zoneinfo ; python_version < \"3.9\"", "colour (>=0.0.4)", "cryptography (>=0.6)", "docutils (>=0.10)", "flake8 (>=2.4.0)", "flexmock (>=0.9.7)", "furl (>=0.4.1)", "intervals (>=0.7.1)", "isort (>=4.2.2)", "passlib (>=1.6,<2.0)", "pendulum (>=2.0.5)", "pg8000 (>=1.12.4)", "phonenumbers (>=5.9.2)", "psycopg2 (>=2.5.1)", "psycopg2cffi (>=2.8.1)", "pymysql", "pyodbc", "pytest (>=2.7.1)", "python-dateutil", "python-dateutil (>=2.6)", "pytz (>=2014.2)"] timezone = ["python-dateutil"] url = ["furl (>=0.4.1)"] @@ -2709,6 +2985,7 @@ version = "0.10.2" description = "Python Library for Tom's Obvious, Minimal Language" optional = false python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" +groups = ["dev"] files = [ {file = "toml-0.10.2-py2.py3-none-any.whl", hash = "sha256:806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"}, {file = "toml-0.10.2.tar.gz", hash = "sha256:b3bda1d108d5dd99f4a20d24d9c348e91c4db7ab1b749200bded2f839ccbe68f"}, @@ -2716,101 +2993,159 @@ files = [ [[package]] name = "tomli" -version = "2.0.1" +version = "2.2.1" description = "A lil' TOML parser" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" +groups = ["dev"] +markers = "python_full_version <= \"3.11.0a6\"" files = [ - {file = "tomli-2.0.1-py3-none-any.whl", hash = "sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc"}, - {file = "tomli-2.0.1.tar.gz", hash = "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f"}, + {file = "tomli-2.2.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:678e4fa69e4575eb77d103de3df8a895e1591b48e740211bd1067378c69e8249"}, + {file = "tomli-2.2.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:023aa114dd824ade0100497eb2318602af309e5a55595f76b626d6d9f3b7b0a6"}, + {file = "tomli-2.2.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ece47d672db52ac607a3d9599a9d48dcb2f2f735c6c2d1f34130085bb12b112a"}, + {file = "tomli-2.2.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6972ca9c9cc9f0acaa56a8ca1ff51e7af152a9f87fb64623e31d5c83700080ee"}, + {file = "tomli-2.2.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c954d2250168d28797dd4e3ac5cf812a406cd5a92674ee4c8f123c889786aa8e"}, + {file = "tomli-2.2.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:8dd28b3e155b80f4d54beb40a441d366adcfe740969820caf156c019fb5c7ec4"}, + {file = "tomli-2.2.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:e59e304978767a54663af13c07b3d1af22ddee3bb2fb0618ca1593e4f593a106"}, + {file = "tomli-2.2.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:33580bccab0338d00994d7f16f4c4ec25b776af3ffaac1ed74e0b3fc95e885a8"}, + {file = "tomli-2.2.1-cp311-cp311-win32.whl", hash = "sha256:465af0e0875402f1d226519c9904f37254b3045fc5084697cefb9bdde1ff99ff"}, + {file = "tomli-2.2.1-cp311-cp311-win_amd64.whl", hash = "sha256:2d0f2fdd22b02c6d81637a3c95f8cd77f995846af7414c5c4b8d0545afa1bc4b"}, + {file = "tomli-2.2.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:4a8f6e44de52d5e6c657c9fe83b562f5f4256d8ebbfe4ff922c495620a7f6cea"}, + {file = "tomli-2.2.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8d57ca8095a641b8237d5b079147646153d22552f1c637fd3ba7f4b0b29167a8"}, + {file = "tomli-2.2.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4e340144ad7ae1533cb897d406382b4b6fede8890a03738ff1683af800d54192"}, + {file = "tomli-2.2.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:db2b95f9de79181805df90bedc5a5ab4c165e6ec3fe99f970d0e302f384ad222"}, + {file = "tomli-2.2.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:40741994320b232529c802f8bc86da4e1aa9f413db394617b9a256ae0f9a7f77"}, + {file = "tomli-2.2.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:400e720fe168c0f8521520190686ef8ef033fb19fc493da09779e592861b78c6"}, + {file = "tomli-2.2.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:02abe224de6ae62c19f090f68da4e27b10af2b93213d36cf44e6e1c5abd19fdd"}, + {file = "tomli-2.2.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:b82ebccc8c8a36f2094e969560a1b836758481f3dc360ce9a3277c65f374285e"}, + {file = "tomli-2.2.1-cp312-cp312-win32.whl", hash = "sha256:889f80ef92701b9dbb224e49ec87c645ce5df3fa2cc548664eb8a25e03127a98"}, + {file = "tomli-2.2.1-cp312-cp312-win_amd64.whl", hash = "sha256:7fc04e92e1d624a4a63c76474610238576942d6b8950a2d7f908a340494e67e4"}, + {file = "tomli-2.2.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f4039b9cbc3048b2416cc57ab3bda989a6fcf9b36cf8937f01a6e731b64f80d7"}, + {file = "tomli-2.2.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:286f0ca2ffeeb5b9bd4fcc8d6c330534323ec51b2f52da063b11c502da16f30c"}, + {file = "tomli-2.2.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a92ef1a44547e894e2a17d24e7557a5e85a9e1d0048b0b5e7541f76c5032cb13"}, + {file = "tomli-2.2.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9316dc65bed1684c9a98ee68759ceaed29d229e985297003e494aa825ebb0281"}, + {file = "tomli-2.2.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e85e99945e688e32d5a35c1ff38ed0b3f41f43fad8df0bdf79f72b2ba7bc5272"}, + {file = "tomli-2.2.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:ac065718db92ca818f8d6141b5f66369833d4a80a9d74435a268c52bdfa73140"}, + {file = "tomli-2.2.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:d920f33822747519673ee656a4b6ac33e382eca9d331c87770faa3eef562aeb2"}, + {file = "tomli-2.2.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:a198f10c4d1b1375d7687bc25294306e551bf1abfa4eace6650070a5c1ae2744"}, + {file = "tomli-2.2.1-cp313-cp313-win32.whl", hash = "sha256:d3f5614314d758649ab2ab3a62d4f2004c825922f9e370b29416484086b264ec"}, + {file = "tomli-2.2.1-cp313-cp313-win_amd64.whl", hash = "sha256:a38aa0308e754b0e3c67e344754dff64999ff9b513e691d0e786265c93583c69"}, + {file = "tomli-2.2.1-py3-none-any.whl", hash = "sha256:cb55c73c5f4408779d0cf3eef9f762b9c9f147a77de7b258bef0a5628adc85cc"}, + {file = "tomli-2.2.1.tar.gz", hash = "sha256:cd45e1dc79c835ce60f7404ec8119f2eb06d38b1deba146f07ced3bbc44505ff"}, ] [[package]] -name = "typed-ast" -version = "1.5.5" -description = "a fork of Python 2 and 3 ast modules with type comment support" +name = "trio" +version = "0.29.0" +description = "A friendly Python library for async concurrency and I/O" optional = false -python-versions = ">=3.6" +python-versions = ">=3.9" +groups = ["dev"] +files = [ + {file = "trio-0.29.0-py3-none-any.whl", hash = "sha256:d8c463f1a9cc776ff63e331aba44c125f423a5a13c684307e828d930e625ba66"}, + {file = "trio-0.29.0.tar.gz", hash = "sha256:ea0d3967159fc130acb6939a0be0e558e364fee26b5deeecc893a6b08c361bdf"}, +] + +[package.dependencies] +attrs = ">=23.2.0" +cffi = {version = ">=1.14", markers = "os_name == \"nt\" and implementation_name != \"pypy\""} +exceptiongroup = {version = "*", markers = "python_version < \"3.11\""} +idna = "*" +outcome = "*" +sniffio = ">=1.3.0" +sortedcontainers = "*" + +[[package]] +name = "trio-websocket" +version = "0.12.1" +description = "WebSocket library for Trio" +optional = false +python-versions = ">=3.8" +groups = ["dev"] files = [ - {file = "typed_ast-1.5.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:4bc1efe0ce3ffb74784e06460f01a223ac1f6ab31c6bc0376a21184bf5aabe3b"}, - {file = "typed_ast-1.5.5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:5f7a8c46a8b333f71abd61d7ab9255440d4a588f34a21f126bbfc95f6049e686"}, - {file = "typed_ast-1.5.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:597fc66b4162f959ee6a96b978c0435bd63791e31e4f410622d19f1686d5e769"}, - {file = "typed_ast-1.5.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d41b7a686ce653e06c2609075d397ebd5b969d821b9797d029fccd71fdec8e04"}, - {file = "typed_ast-1.5.5-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:5fe83a9a44c4ce67c796a1b466c270c1272e176603d5e06f6afbc101a572859d"}, - {file = "typed_ast-1.5.5-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:d5c0c112a74c0e5db2c75882a0adf3133adedcdbfd8cf7c9d6ed77365ab90a1d"}, - {file = "typed_ast-1.5.5-cp310-cp310-win_amd64.whl", hash = "sha256:e1a976ed4cc2d71bb073e1b2a250892a6e968ff02aa14c1f40eba4f365ffec02"}, - {file = "typed_ast-1.5.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c631da9710271cb67b08bd3f3813b7af7f4c69c319b75475436fcab8c3d21bee"}, - {file = "typed_ast-1.5.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:b445c2abfecab89a932b20bd8261488d574591173d07827c1eda32c457358b18"}, - {file = "typed_ast-1.5.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cc95ffaaab2be3b25eb938779e43f513e0e538a84dd14a5d844b8f2932593d88"}, - {file = "typed_ast-1.5.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:61443214d9b4c660dcf4b5307f15c12cb30bdfe9588ce6158f4a005baeb167b2"}, - {file = "typed_ast-1.5.5-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:6eb936d107e4d474940469e8ec5b380c9b329b5f08b78282d46baeebd3692dc9"}, - {file = "typed_ast-1.5.5-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:e48bf27022897577d8479eaed64701ecaf0467182448bd95759883300ca818c8"}, - {file = "typed_ast-1.5.5-cp311-cp311-win_amd64.whl", hash = "sha256:83509f9324011c9a39faaef0922c6f720f9623afe3fe220b6d0b15638247206b"}, - {file = "typed_ast-1.5.5-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:44f214394fc1af23ca6d4e9e744804d890045d1643dd7e8229951e0ef39429b5"}, - {file = "typed_ast-1.5.5-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:118c1ce46ce58fda78503eae14b7664163aa735b620b64b5b725453696f2a35c"}, - {file = "typed_ast-1.5.5-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:be4919b808efa61101456e87f2d4c75b228f4e52618621c77f1ddcaae15904fa"}, - {file = "typed_ast-1.5.5-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:fc2b8c4e1bc5cd96c1a823a885e6b158f8451cf6f5530e1829390b4d27d0807f"}, - {file = "typed_ast-1.5.5-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:16f7313e0a08c7de57f2998c85e2a69a642e97cb32f87eb65fbfe88381a5e44d"}, - {file = "typed_ast-1.5.5-cp36-cp36m-win_amd64.whl", hash = "sha256:2b946ef8c04f77230489f75b4b5a4a6f24c078be4aed241cfabe9cbf4156e7e5"}, - {file = "typed_ast-1.5.5-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:2188bc33d85951ea4ddad55d2b35598b2709d122c11c75cffd529fbc9965508e"}, - {file = "typed_ast-1.5.5-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0635900d16ae133cab3b26c607586131269f88266954eb04ec31535c9a12ef1e"}, - {file = "typed_ast-1.5.5-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:57bfc3cf35a0f2fdf0a88a3044aafaec1d2f24d8ae8cd87c4f58d615fb5b6311"}, - {file = "typed_ast-1.5.5-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:fe58ef6a764de7b4b36edfc8592641f56e69b7163bba9f9c8089838ee596bfb2"}, - {file = "typed_ast-1.5.5-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:d09d930c2d1d621f717bb217bf1fe2584616febb5138d9b3e8cdd26506c3f6d4"}, - {file = "typed_ast-1.5.5-cp37-cp37m-win_amd64.whl", hash = "sha256:d40c10326893ecab8a80a53039164a224984339b2c32a6baf55ecbd5b1df6431"}, - {file = "typed_ast-1.5.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:fd946abf3c31fb50eee07451a6aedbfff912fcd13cf357363f5b4e834cc5e71a"}, - {file = "typed_ast-1.5.5-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:ed4a1a42df8a3dfb6b40c3d2de109e935949f2f66b19703eafade03173f8f437"}, - {file = "typed_ast-1.5.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:045f9930a1550d9352464e5149710d56a2aed23a2ffe78946478f7b5416f1ede"}, - {file = "typed_ast-1.5.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:381eed9c95484ceef5ced626355fdc0765ab51d8553fec08661dce654a935db4"}, - {file = "typed_ast-1.5.5-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:bfd39a41c0ef6f31684daff53befddae608f9daf6957140228a08e51f312d7e6"}, - {file = "typed_ast-1.5.5-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:8c524eb3024edcc04e288db9541fe1f438f82d281e591c548903d5b77ad1ddd4"}, - {file = "typed_ast-1.5.5-cp38-cp38-win_amd64.whl", hash = "sha256:7f58fabdde8dcbe764cef5e1a7fcb440f2463c1bbbec1cf2a86ca7bc1f95184b"}, - {file = "typed_ast-1.5.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:042eb665ff6bf020dd2243307d11ed626306b82812aba21836096d229fdc6a10"}, - {file = "typed_ast-1.5.5-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:622e4a006472b05cf6ef7f9f2636edc51bda670b7bbffa18d26b255269d3d814"}, - {file = "typed_ast-1.5.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1efebbbf4604ad1283e963e8915daa240cb4bf5067053cf2f0baadc4d4fb51b8"}, - {file = "typed_ast-1.5.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f0aefdd66f1784c58f65b502b6cf8b121544680456d1cebbd300c2c813899274"}, - {file = "typed_ast-1.5.5-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:48074261a842acf825af1968cd912f6f21357316080ebaca5f19abbb11690c8a"}, - {file = "typed_ast-1.5.5-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:429ae404f69dc94b9361bb62291885894b7c6fb4640d561179548c849f8492ba"}, - {file = "typed_ast-1.5.5-cp39-cp39-win_amd64.whl", hash = "sha256:335f22ccb244da2b5c296e6f96b06ee9bed46526db0de38d2f0e5a6597b81155"}, - {file = "typed_ast-1.5.5.tar.gz", hash = "sha256:94282f7a354f36ef5dbce0ef3467ebf6a258e370ab33d5b40c249fa996e590dd"}, + {file = "trio_websocket-0.12.1-py3-none-any.whl", hash = "sha256:608ec746bb287e5d5a66baf483e41194193c5cf05ffaad6240e7d1fcd80d1e6f"}, + {file = "trio_websocket-0.12.1.tar.gz", hash = "sha256:d55ccd4d3eae27c494f3fdae14823317839bdcb8214d1173eacc4d42c69fc91b"}, ] +[package.dependencies] +exceptiongroup = {version = "*", markers = "python_version < \"3.11\""} +outcome = ">=1.2.0" +trio = ">=0.11" +wsproto = ">=0.14" + [[package]] name = "typing-extensions" -version = "4.7.1" -description = "Backported and Experimental Type Hints for Python 3.7+" +version = "4.12.2" +description = "Backported and Experimental Type Hints for Python 3.8+" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" +groups = ["main", "dev"] files = [ - {file = "typing_extensions-4.7.1-py3-none-any.whl", hash = "sha256:440d5dd3af93b060174bf433bccd69b0babc3b15b1a8dca43789fd7f61514b36"}, - {file = "typing_extensions-4.7.1.tar.gz", hash = "sha256:b75ddc264f0ba5615db7ba217daeb99701ad295353c45f9e95963337ceeeffb2"}, + {file = "typing_extensions-4.12.2-py3-none-any.whl", hash = "sha256:04e5ca0351e0f3f85c6853954072df659d0d13fac324d0072316b67d7794700d"}, + {file = "typing_extensions-4.12.2.tar.gz", hash = "sha256:1a7ead55c7e559dd4dee8856e3a88b41225abfe1ce8df57b7c13915fe121ffb8"}, +] + +[[package]] +name = "tzdata" +version = "2025.1" +description = "Provider of IANA time zone data" +optional = false +python-versions = ">=2" +groups = ["main"] +files = [ + {file = "tzdata-2025.1-py2.py3-none-any.whl", hash = "sha256:7e127113816800496f027041c570f50bcd464a020098a3b6b199517772303639"}, + {file = "tzdata-2025.1.tar.gz", hash = "sha256:24894909e88cdb28bd1636c6887801df64cb485bd593f2fd83ef29075a81d694"}, ] [[package]] name = "ua-parser" -version = "0.18.0" +version = "1.0.1" description = "Python port of Browserscope's user agent parser" optional = false -python-versions = "*" +python-versions = ">=3.9" +groups = ["main"] files = [ - {file = "ua-parser-0.18.0.tar.gz", hash = "sha256:db51f1b59bfaa82ed9e2a1d99a54d3e4153dddf99ac1435d51828165422e624e"}, - {file = "ua_parser-0.18.0-py2.py3-none-any.whl", hash = "sha256:9d94ac3a80bcb0166823956a779186c746b50ea4c9fd9bf30fdb758553c38950"}, + {file = "ua_parser-1.0.1-py3-none-any.whl", hash = "sha256:b059f2cb0935addea7e551251cbbf42e9a8872f86134163bc1a4f79e0945ffea"}, + {file = "ua_parser-1.0.1.tar.gz", hash = "sha256:f9d92bf19d4329019cef91707aecc23c6d65143ad7e29a233f0580fb0d15547d"}, +] + +[package.dependencies] +ua-parser-builtins = "*" + +[package.extras] +re2 = ["google-re2"] +regex = ["ua-parser-rs"] +yaml = ["PyYaml"] + +[[package]] +name = "ua-parser-builtins" +version = "0.18.0.post1" +description = "Precompiled rules for User Agent Parser" +optional = false +python-versions = ">=3.9" +groups = ["main"] +files = [ + {file = "ua_parser_builtins-0.18.0.post1-py3-none-any.whl", hash = "sha256:eb4f93504040c3a990a6b0742a2afd540d87d7f9f05fd66e94c101db1564674d"}, ] [[package]] name = "urllib3" -version = "2.0.7" +version = "2.3.0" description = "HTTP library with thread-safe connection pooling, file post, and more." optional = false -python-versions = ">=3.7" +python-versions = ">=3.9" +groups = ["dev"] files = [ - {file = "urllib3-2.0.7-py3-none-any.whl", hash = "sha256:fdb6d215c776278489906c2f8916e6e7d4f5a9b602ccbcfdf7f016fc8da0596e"}, - {file = "urllib3-2.0.7.tar.gz", hash = "sha256:c97dfde1f7bd43a71c8d2a58e369e9b2bf692d1334ea9f9cae55add7d0dd0f84"}, + {file = "urllib3-2.3.0-py3-none-any.whl", hash = "sha256:1cee9ad369867bfdbbb48b7dd50374c0967a0bb7710050facf0dd6911440e3df"}, + {file = "urllib3-2.3.0.tar.gz", hash = "sha256:f8c5449b3cf0861679ce7e0503c7b44b5ec981bec0d1d3795a07f1ba96f0204d"}, ] +[package.dependencies] +pysocks = {version = ">=1.5.6,<1.5.7 || >1.5.7,<2.0", optional = true, markers = "extra == \"socks\""} + [package.extras] -brotli = ["brotli (>=1.0.9)", "brotlicffi (>=0.8.0)"] -secure = ["certifi", "cryptography (>=1.9)", "idna (>=2.0.0)", "pyopenssl (>=17.1.0)", "urllib3-secure-extra"] +brotli = ["brotli (>=1.0.9) ; platform_python_implementation == \"CPython\"", "brotlicffi (>=0.8.0) ; platform_python_implementation != \"CPython\""] +h2 = ["h2 (>=4,<5)"] socks = ["pysocks (>=1.5.6,!=1.5.7,<2.0)"] zstd = ["zstandard (>=0.18.0)"] @@ -2820,6 +3155,7 @@ version = "5.1.0" description = "Python promises." optional = false python-versions = ">=3.6" +groups = ["main"] files = [ {file = "vine-5.1.0-py3-none-any.whl", hash = "sha256:40fdf3c48b2cfe1c38a49e9ae2da6fda88e4794c810050a728bd7413811fb1dc"}, {file = "vine-5.1.0.tar.gz", hash = "sha256:8b62e981d35c41049211cf62a0a1242d8c1ee9bd15bb196ce38aefd6799e61e0"}, @@ -2827,39 +3163,42 @@ files = [ [[package]] name = "watchdog" -version = "2.2.1" +version = "6.0.0" description = "Filesystem events monitoring" optional = false -python-versions = ">=3.6" -files = [ - {file = "watchdog-2.2.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:a09483249d25cbdb4c268e020cb861c51baab2d1affd9a6affc68ffe6a231260"}, - {file = "watchdog-2.2.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:5100eae58133355d3ca6c1083a33b81355c4f452afa474c2633bd2fbbba398b3"}, - {file = "watchdog-2.2.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e618a4863726bc7a3c64f95c218437f3349fb9d909eb9ea3a1ed3b567417c661"}, - {file = "watchdog-2.2.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:102a60093090fc3ff76c983367b19849b7cc24ec414a43c0333680106e62aae1"}, - {file = "watchdog-2.2.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:748ca797ff59962e83cc8e4b233f87113f3cf247c23e6be58b8a2885c7337aa3"}, - {file = "watchdog-2.2.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:6ccd8d84b9490a82b51b230740468116b8205822ea5fdc700a553d92661253a3"}, - {file = "watchdog-2.2.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:6e01d699cd260d59b84da6bda019dce0a3353e3fcc774408ae767fe88ee096b7"}, - {file = "watchdog-2.2.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:8586d98c494690482c963ffb24c49bf9c8c2fe0589cec4dc2f753b78d1ec301d"}, - {file = "watchdog-2.2.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:adaf2ece15f3afa33a6b45f76b333a7da9256e1360003032524d61bdb4c422ae"}, - {file = "watchdog-2.2.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:83a7cead445008e880dbde833cb9e5cc7b9a0958edb697a96b936621975f15b9"}, - {file = "watchdog-2.2.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:f8ac23ff2c2df4471a61af6490f847633024e5aa120567e08d07af5718c9d092"}, - {file = "watchdog-2.2.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:d0f29fd9f3f149a5277929de33b4f121a04cf84bb494634707cfa8ea8ae106a8"}, - {file = "watchdog-2.2.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:967636031fa4c4955f0f3f22da3c5c418aa65d50908d31b73b3b3ffd66d60640"}, - {file = "watchdog-2.2.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:96cbeb494e6cbe3ae6aacc430e678ce4b4dd3ae5125035f72b6eb4e5e9eb4f4e"}, - {file = "watchdog-2.2.1-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:61fdb8e9c57baf625e27e1420e7ca17f7d2023929cd0065eb79c83da1dfbeacd"}, - {file = "watchdog-2.2.1-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:4cb5ecc332112017fbdb19ede78d92e29a8165c46b68a0b8ccbd0a154f196d5e"}, - {file = "watchdog-2.2.1-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:a480d122740debf0afac4ddd583c6c0bb519c24f817b42ed6f850e2f6f9d64a8"}, - {file = "watchdog-2.2.1-py3-none-manylinux2014_aarch64.whl", hash = "sha256:978a1aed55de0b807913b7482d09943b23a2d634040b112bdf31811a422f6344"}, - {file = "watchdog-2.2.1-py3-none-manylinux2014_armv7l.whl", hash = "sha256:8c28c23972ec9c524967895ccb1954bc6f6d4a557d36e681a36e84368660c4ce"}, - {file = "watchdog-2.2.1-py3-none-manylinux2014_i686.whl", hash = "sha256:c27d8c1535fd4474e40a4b5e01f4ba6720bac58e6751c667895cbc5c8a7af33c"}, - {file = "watchdog-2.2.1-py3-none-manylinux2014_ppc64.whl", hash = "sha256:d6b87477752bd86ac5392ecb9eeed92b416898c30bd40c7e2dd03c3146105646"}, - {file = "watchdog-2.2.1-py3-none-manylinux2014_ppc64le.whl", hash = "sha256:cece1aa596027ff56369f0b50a9de209920e1df9ac6d02c7f9e5d8162eb4f02b"}, - {file = "watchdog-2.2.1-py3-none-manylinux2014_s390x.whl", hash = "sha256:8b5cde14e5c72b2df5d074774bdff69e9b55da77e102a91f36ef26ca35f9819c"}, - {file = "watchdog-2.2.1-py3-none-manylinux2014_x86_64.whl", hash = "sha256:e038be858425c4f621900b8ff1a3a1330d9edcfeaa1c0468aeb7e330fb87693e"}, - {file = "watchdog-2.2.1-py3-none-win32.whl", hash = "sha256:bc43c1b24d2f86b6e1cc15f68635a959388219426109233e606517ff7d0a5a73"}, - {file = "watchdog-2.2.1-py3-none-win_amd64.whl", hash = "sha256:17f1708f7410af92ddf591e94ae71a27a13974559e72f7e9fde3ec174b26ba2e"}, - {file = "watchdog-2.2.1-py3-none-win_ia64.whl", hash = "sha256:195ab1d9d611a4c1e5311cbf42273bc541e18ea8c32712f2fb703cfc6ff006f9"}, - {file = "watchdog-2.2.1.tar.gz", hash = "sha256:cdcc23c9528601a8a293eb4369cbd14f6b4f34f07ae8769421252e9c22718b6f"}, +python-versions = ">=3.9" +groups = ["main"] +files = [ + {file = "watchdog-6.0.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:d1cdb490583ebd691c012b3d6dae011000fe42edb7a82ece80965b42abd61f26"}, + {file = "watchdog-6.0.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:bc64ab3bdb6a04d69d4023b29422170b74681784ffb9463ed4870cf2f3e66112"}, + {file = "watchdog-6.0.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c897ac1b55c5a1461e16dae288d22bb2e412ba9807df8397a635d88f671d36c3"}, + {file = "watchdog-6.0.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:6eb11feb5a0d452ee41f824e271ca311a09e250441c262ca2fd7ebcf2461a06c"}, + {file = "watchdog-6.0.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:ef810fbf7b781a5a593894e4f439773830bdecb885e6880d957d5b9382a960d2"}, + {file = "watchdog-6.0.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:afd0fe1b2270917c5e23c2a65ce50c2a4abb63daafb0d419fde368e272a76b7c"}, + {file = "watchdog-6.0.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:bdd4e6f14b8b18c334febb9c4425a878a2ac20efd1e0b231978e7b150f92a948"}, + {file = "watchdog-6.0.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:c7c15dda13c4eb00d6fb6fc508b3c0ed88b9d5d374056b239c4ad1611125c860"}, + {file = "watchdog-6.0.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:6f10cb2d5902447c7d0da897e2c6768bca89174d0c6e1e30abec5421af97a5b0"}, + {file = "watchdog-6.0.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:490ab2ef84f11129844c23fb14ecf30ef3d8a6abafd3754a6f75ca1e6654136c"}, + {file = "watchdog-6.0.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:76aae96b00ae814b181bb25b1b98076d5fc84e8a53cd8885a318b42b6d3a5134"}, + {file = "watchdog-6.0.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:a175f755fc2279e0b7312c0035d52e27211a5bc39719dd529625b1930917345b"}, + {file = "watchdog-6.0.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:e6f0e77c9417e7cd62af82529b10563db3423625c5fce018430b249bf977f9e8"}, + {file = "watchdog-6.0.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:90c8e78f3b94014f7aaae121e6b909674df5b46ec24d6bebc45c44c56729af2a"}, + {file = "watchdog-6.0.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:e7631a77ffb1f7d2eefa4445ebbee491c720a5661ddf6df3498ebecae5ed375c"}, + {file = "watchdog-6.0.0-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:c7ac31a19f4545dd92fc25d200694098f42c9a8e391bc00bdd362c5736dbf881"}, + {file = "watchdog-6.0.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:9513f27a1a582d9808cf21a07dae516f0fab1cf2d7683a742c498b93eedabb11"}, + {file = "watchdog-6.0.0-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:7a0e56874cfbc4b9b05c60c8a1926fedf56324bb08cfbc188969777940aef3aa"}, + {file = "watchdog-6.0.0-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:e6439e374fc012255b4ec786ae3c4bc838cd7309a540e5fe0952d03687d8804e"}, + {file = "watchdog-6.0.0-py3-none-manylinux2014_aarch64.whl", hash = "sha256:7607498efa04a3542ae3e05e64da8202e58159aa1fa4acddf7678d34a35d4f13"}, + {file = "watchdog-6.0.0-py3-none-manylinux2014_armv7l.whl", hash = "sha256:9041567ee8953024c83343288ccc458fd0a2d811d6a0fd68c4c22609e3490379"}, + {file = "watchdog-6.0.0-py3-none-manylinux2014_i686.whl", hash = "sha256:82dc3e3143c7e38ec49d61af98d6558288c415eac98486a5c581726e0737c00e"}, + {file = "watchdog-6.0.0-py3-none-manylinux2014_ppc64.whl", hash = "sha256:212ac9b8bf1161dc91bd09c048048a95ca3a4c4f5e5d4a7d1b1a7d5752a7f96f"}, + {file = "watchdog-6.0.0-py3-none-manylinux2014_ppc64le.whl", hash = "sha256:e3df4cbb9a450c6d49318f6d14f4bbc80d763fa587ba46ec86f99f9e6876bb26"}, + {file = "watchdog-6.0.0-py3-none-manylinux2014_s390x.whl", hash = "sha256:2cce7cfc2008eb51feb6aab51251fd79b85d9894e98ba847408f662b3395ca3c"}, + {file = "watchdog-6.0.0-py3-none-manylinux2014_x86_64.whl", hash = "sha256:20ffe5b202af80ab4266dcd3e91aae72bf2da48c0d33bdb15c66658e685e94e2"}, + {file = "watchdog-6.0.0-py3-none-win32.whl", hash = "sha256:07df1fdd701c5d4c8e55ef6cf55b8f0120fe1aef7ef39a1c6fc6bc2e606d517a"}, + {file = "watchdog-6.0.0-py3-none-win_amd64.whl", hash = "sha256:cbafb470cf848d93b5d013e2ecb245d4aa1c8fd0504e863ccefa32445359d680"}, + {file = "watchdog-6.0.0-py3-none-win_ia64.whl", hash = "sha256:a1914259fa9e1454315171103c6a30961236f508b9b623eae470268bbcc6a22f"}, + {file = "watchdog-6.0.0.tar.gz", hash = "sha256:9ddf7c82fda3ae8e24decda1338ede66e1c99883db93711d8fb941eaa2d8c282"}, ] [package.extras] @@ -2871,6 +3210,7 @@ version = "0.2.13" description = "Measures the displayed width of unicode strings in a terminal" optional = false python-versions = "*" +groups = ["main"] files = [ {file = "wcwidth-0.2.13-py2.py3-none-any.whl", hash = "sha256:3da69048e4540d84af32131829ff948f1e022c1c6bdb8d6102117aac784f6859"}, {file = "wcwidth-0.2.13.tar.gz", hash = "sha256:72ea0c06399eb286d978fdedb6923a9eb47e1c486ce63e9b4e64fc18303972b5"}, @@ -2882,6 +3222,7 @@ version = "5.5.3" description = "Declarative parsing and validation of HTTP request objects, with built-in support for popular web frameworks, including Flask, Django, Bottle, Tornado, Pyramid, webapp2, Falcon, and aiohttp." optional = false python-versions = "*" +groups = ["main"] files = [ {file = "webargs-5.5.3-py2-none-any.whl", hash = "sha256:fc81c9f9d391acfbce406a319217319fd8b2fd862f7fdb5319ad06944f36ed25"}, {file = "webargs-5.5.3-py3-none-any.whl", hash = "sha256:4f04918864c7602886335d8099f9b8960ee698b6b914f022736ed50be6b71235"}, @@ -2893,62 +3234,101 @@ marshmallow = ">=2.15.2" simplejson = ">=2.1.0" [package.extras] -dev = ["Django (>=1.11.16)", "Flask (>=0.12.2)", "aiohttp (>=3.0.0)", "bottle (>=0.12.13)", "falcon (>=1.4.0,<2.0)", "flake8 (==3.7.8)", "flake8-bugbear (==19.8.0)", "mock", "mypy (==0.730)", "pre-commit (>=1.17,<2.0)", "pyramid (>=1.9.1)", "pytest", "pytest-aiohttp (>=0.3.0)", "tornado (>=4.5.2)", "tox", "webapp2 (>=3.0.0b1)", "webtest (==2.0.33)", "webtest-aiohttp (==2.0.0)"] -docs = ["Django (>=1.11.16)", "Flask (>=0.12.2)", "Sphinx (==2.2.0)", "aiohttp (>=3.0.0)", "bottle (>=0.12.13)", "falcon (>=1.4.0,<2.0)", "pyramid (>=1.9.1)", "sphinx-issues (==1.2.0)", "sphinx-typlog-theme (==0.7.3)", "tornado (>=4.5.2)", "webapp2 (>=3.0.0b1)"] -frameworks = ["Django (>=1.11.16)", "Flask (>=0.12.2)", "aiohttp (>=3.0.0)", "bottle (>=0.12.13)", "falcon (>=1.4.0,<2.0)", "pyramid (>=1.9.1)", "tornado (>=4.5.2)", "webapp2 (>=3.0.0b1)"] -lint = ["flake8 (==3.7.8)", "flake8-bugbear (==19.8.0)", "mypy (==0.730)", "pre-commit (>=1.17,<2.0)"] -tests = ["Django (>=1.11.16)", "Flask (>=0.12.2)", "aiohttp (>=3.0.0)", "bottle (>=0.12.13)", "falcon (>=1.4.0,<2.0)", "mock", "pyramid (>=1.9.1)", "pytest", "pytest-aiohttp (>=0.3.0)", "tornado (>=4.5.2)", "webapp2 (>=3.0.0b1)", "webtest (==2.0.33)", "webtest-aiohttp (==2.0.0)"] +dev = ["Django (>=1.11.16)", "Flask (>=0.12.2)", "aiohttp (>=3.0.0) ; python_version >= \"3.5\"", "bottle (>=0.12.13)", "falcon (>=1.4.0,<2.0)", "flake8 (==3.7.8)", "flake8-bugbear (==19.8.0) ; python_version >= \"3.5\"", "mock", "mypy (==0.730) ; python_version >= \"3.5\"", "pre-commit (>=1.17,<2.0)", "pyramid (>=1.9.1)", "pytest", "pytest-aiohttp (>=0.3.0) ; python_version >= \"3.5\"", "tornado (>=4.5.2)", "tox", "webapp2 (>=3.0.0b1)", "webtest (==2.0.33)", "webtest-aiohttp (==2.0.0) ; python_version >= \"3.5\""] +docs = ["Django (>=1.11.16)", "Flask (>=0.12.2)", "Sphinx (==2.2.0)", "aiohttp (>=3.0.0) ; python_version >= \"3.5\"", "bottle (>=0.12.13)", "falcon (>=1.4.0,<2.0)", "pyramid (>=1.9.1)", "sphinx-issues (==1.2.0)", "sphinx-typlog-theme (==0.7.3)", "tornado (>=4.5.2)", "webapp2 (>=3.0.0b1)"] +frameworks = ["Django (>=1.11.16)", "Flask (>=0.12.2)", "aiohttp (>=3.0.0) ; python_version >= \"3.5\"", "bottle (>=0.12.13)", "falcon (>=1.4.0,<2.0)", "pyramid (>=1.9.1)", "tornado (>=4.5.2)", "webapp2 (>=3.0.0b1)"] +lint = ["flake8 (==3.7.8)", "flake8-bugbear (==19.8.0) ; python_version >= \"3.5\"", "mypy (==0.730) ; python_version >= \"3.5\"", "pre-commit (>=1.17,<2.0)"] +tests = ["Django (>=1.11.16)", "Flask (>=0.12.2)", "aiohttp (>=3.0.0) ; python_version >= \"3.5\"", "bottle (>=0.12.13)", "falcon (>=1.4.0,<2.0)", "mock", "pyramid (>=1.9.1)", "pytest", "pytest-aiohttp (>=0.3.0) ; python_version >= \"3.5\"", "tornado (>=4.5.2)", "webapp2 (>=3.0.0b1)", "webtest (==2.0.33)", "webtest-aiohttp (==2.0.0) ; python_version >= \"3.5\""] + +[[package]] +name = "websocket-client" +version = "1.8.0" +description = "WebSocket client for Python with low level API options" +optional = false +python-versions = ">=3.8" +groups = ["dev"] +files = [ + {file = "websocket_client-1.8.0-py3-none-any.whl", hash = "sha256:17b44cc997f5c498e809b22cdf2d9c7a9e71c02c8cc2b6c56e7c2d1239bfa526"}, + {file = "websocket_client-1.8.0.tar.gz", hash = "sha256:3239df9f44da632f96012472805d40a23281a991027ce11d2f45a6f24ac4c3da"}, +] + +[package.extras] +docs = ["Sphinx (>=6.0)", "myst-parser (>=2.0.0)", "sphinx-rtd-theme (>=1.1.0)"] +optional = ["python-socks", "wsaccel"] +test = ["websockets"] [[package]] name = "werkzeug" -version = "2.2.3" +version = "3.1.3" description = "The comprehensive WSGI web application library." optional = false -python-versions = ">=3.7" +python-versions = ">=3.9" +groups = ["main", "dev"] files = [ - {file = "Werkzeug-2.2.3-py3-none-any.whl", hash = "sha256:56433961bc1f12533306c624f3be5e744389ac61d722175d543e1751285da612"}, - {file = "Werkzeug-2.2.3.tar.gz", hash = "sha256:2e1ccc9417d4da358b9de6f174e3ac094391ea1d4fbef2d667865d819dfd0afe"}, + {file = "werkzeug-3.1.3-py3-none-any.whl", hash = "sha256:54b78bf3716d19a65be4fceccc0d1d7b89e608834989dfae50ea87564639213e"}, + {file = "werkzeug-3.1.3.tar.gz", hash = "sha256:60723ce945c19328679790e3282cc758aa4a6040e4bb330f53d30fa546d44746"}, ] [package.dependencies] MarkupSafe = ">=2.1.1" [package.extras] -watchdog = ["watchdog"] +watchdog = ["watchdog (>=2.3)"] + +[[package]] +name = "wsproto" +version = "1.2.0" +description = "WebSockets state-machine based protocol implementation" +optional = false +python-versions = ">=3.7.0" +groups = ["dev"] +files = [ + {file = "wsproto-1.2.0-py3-none-any.whl", hash = "sha256:b9acddd652b585d75b20477888c56642fdade28bdfd3579aa24a4d2c037dd736"}, + {file = "wsproto-1.2.0.tar.gz", hash = "sha256:ad565f26ecb92588a3e43bc3d96164de84cd9902482b130d0ddbaa9664a85065"}, +] + +[package.dependencies] +h11 = ">=0.9.0,<1" [[package]] name = "wtforms" -version = "3.0.1" +version = "3.2.1" description = "Form validation and rendering for Python web development." optional = false -python-versions = ">=3.7" +python-versions = ">=3.9" +groups = ["main"] files = [ - {file = "WTForms-3.0.1-py3-none-any.whl", hash = "sha256:837f2f0e0ca79481b92884962b914eba4e72b7a2daaf1f939c890ed0124b834b"}, - {file = "WTForms-3.0.1.tar.gz", hash = "sha256:6b351bbb12dd58af57ffef05bc78425d08d1914e0fd68ee14143b7ade023c5bc"}, + {file = "wtforms-3.2.1-py3-none-any.whl", hash = "sha256:583bad77ba1dd7286463f21e11aa3043ca4869d03575921d1a1698d0715e0fd4"}, + {file = "wtforms-3.2.1.tar.gz", hash = "sha256:df3e6b70f3192e92623128123ec8dca3067df9cfadd43d59681e210cfb8d4682"}, ] [package.dependencies] -MarkupSafe = "*" +markupsafe = "*" [package.extras] email = ["email-validator"] [[package]] name = "zipp" -version = "3.15.0" +version = "3.21.0" description = "Backport of pathlib-compatible object wrapper for zip files" optional = false -python-versions = ">=3.7" +python-versions = ">=3.9" +groups = ["main", "dev"] files = [ - {file = "zipp-3.15.0-py3-none-any.whl", hash = "sha256:48904fc76a60e542af151aded95726c1a5c34ed43ab4134b597665c86d7ad556"}, - {file = "zipp-3.15.0.tar.gz", hash = "sha256:112929ad649da941c23de50f356a2b5570c954b65150642bccdd66bf194d224b"}, + {file = "zipp-3.21.0-py3-none-any.whl", hash = "sha256:ac1bbe05fd2991f160ebce24ffbac5f6d11d83dc90891255885223d42b3cd931"}, + {file = "zipp-3.21.0.tar.gz", hash = "sha256:2c9958f6430a2040341a52eb608ed6dd93ef4392e02ffe219417c1b28b5dd1f4"}, ] [package.extras] -docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] -testing = ["big-O", "flake8 (<5)", "jaraco.functools", "jaraco.itertools", "more-itertools", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-flake8", "pytest-mypy (>=0.9.1)"] +check = ["pytest-checkdocs (>=2.4)", "pytest-ruff (>=0.2.1) ; sys_platform != \"cygwin\""] +cover = ["pytest-cov"] +doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] +enabler = ["pytest-enabler (>=2.2)"] +test = ["big-O", "importlib-resources ; python_version < \"3.9\"", "jaraco.functools", "jaraco.itertools", "jaraco.test", "more-itertools", "pytest (>=6,!=8.1.*)", "pytest-ignore-flaky"] +type = ["pytest-mypy"] [metadata] -lock-version = "2.0" -python-versions = ">=3.7,<3.10" -content-hash = "040233fe3876bcc6d597ca0f44565fa94a663278e8abce726459079db3304f2d" +lock-version = "2.1" +python-versions = ">=3.9, <3.13" +content-hash = "7e9235b000397a8cdc570686d343df34b6880733fb0b6cb637b5497739bf4202" diff --git a/pyproject.toml b/pyproject.toml index 49ed9a5..34e1517 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,9 +1,9 @@ -[tool.poetry] +[project] name = "invenio-sip2" version = "0.6.23" description = "Invenio module that add a SIP2 communication for library self-check service" readme = "README.rst" -authors = ["Laurent Dubois "] +authors = [{name = "Laurent Dubois",email = ""}] license = "GNU Affero General Public License v3.0" repository = "https://github.com/inveniosoftware-contrib/invenio-sip2" documentation = "https://invenio-sip2.readthedocs.io" @@ -16,47 +16,55 @@ classifiers = [ "Topic :: Internet :: WWW/HTTP :: Dynamic Content", "Topic :: Software Development :: Libraries :: Python Modules", "Programming Language :: Python :: 3", - "Programming Language :: Python :: 3.7", "Programming Language :: Python :: 3.8", "Programming Language :: Python :: 3.9", "Development Status :: 3 - Alpha", ] +requires-python = ">=3.9, <3.13" -[tool.poetry.dependencies] -python = ">=3.7,<3.10" -invenio-base = ">=1.3.0,<2.0.0" -invenio-access = ">=2.0.0,<3.0.0" -invenio-i18n = ">=2.0.0,<3.0.0" -jsonpickle = ">=1.2" -psutil = ">=5.9.0" -pycountry = ">=19.7.15" -python-dateutil = ">=2.8.2" -# Pinned due to before_first_request deprecation https://flask.palletsprojects.com/en/2.2.x/api/#flask.Flask.before_first_request -Flask = ">=2.2.0,<2.3.0" - -[tool.poetry.dev-dependencies] +dependencies = [ + "invenio-base (>=2.0,<3.0)", + "invenio-access (>=2.0.0,<5.0.0)", + "invenio-i18n (>=2.0.0,<4.0.0)", + "jsonpickle (>=1.2)", + "psutil", + "pycountry (>=19.7.15)", + "python-dateutil", + "Flask (>=2.2.0,<4.0)", + "SQLAlchemy (>=1.2.18,<3.0)", + "SQLAlchemy-Utils (>=0.33.1,<0.39)" +] + +[tool.poetry.group.dev.dependencies] pytest-black-ng = ">=0.4.0" -pytest-invenio = ">=2.1.6,<3.0.0" -Sphinx = ">=4.5.0" -pydocstyle = ">=6.1.1,<6.2" +pytest-invenio = ">=3.0.0,<4.0.0" +pydocstyle = ">=6.1.1" autoflake = ">=1.3.1" -mock = ">=4.0.3" +Sphinx = ">=4.5.0" +mock = ">=4.0.0" [build-system] requires = ["poetry_core>=1.0.0"] build-backend = "poetry.core.masonry.api" -[tool.poetry.plugins."invenio_base.apps"] +[project.entry-points."invenio_base.apps"] invenio_sip2 = "invenio_sip2:InvenioSIP2" -[tool.poetry.plugins."invenio_base.api_apps"] +[project.entry-points."invenio_base.api_apps"] invenio_sip2 = "invenio_sip2:InvenioSIP2" -[tool.poetry.plugins."invenio_base.blueprints"] +[project.entry-points."invenio_base.blueprints"] invenio_sip2 = "invenio_sip2.views.views:blueprint" -[tool.poetry.plugins."invenio_base.api_blueprints"] +[project.entry-points."invenio_base.api_blueprints"] invenio_sip2 = "invenio_sip2.views.rest:api_blueprint" -[tool.poetry.plugins."flask.commands"] +[project.entry-points."flask.commands"] selfcheck = "invenio_sip2.cli:selfcheck" + +[tool.isort] +profile = "black" + +[tool.pytest] +addopts = "--color=yes --black --isort --pydocstyle --doctest-glob=\"*.rst\" --doctest-modules --cov=invenio_sip2 --cov-report=term-missing --ignore=docs/conf.py" +testpaths = "docs tests invenio_sip2" \ No newline at end of file diff --git a/pytest.ini b/pytest.ini index 3a01d37..f4aed4a 100644 --- a/pytest.ini +++ b/pytest.ini @@ -16,5 +16,5 @@ # along with this program. If not, see . [pytest] -addopts = --isort --pydocstyle --pycodestyle --doctest-glob="*.rst" --doctest-modules --cov=invenio_sip2 --cov-report=term-missing +addopts = --color=yes --black --isort --pydocstyle --doctest-glob="*.rst" --doctest-modules --cov=invenio_sip2 --cov-report=term-missing --ignore=docs/conf.py testpaths = docs tests invenio_sip2 diff --git a/run-tests.sh b/run-tests.sh index 7deb4e5..b3940b2 100755 --- a/run-tests.sh +++ b/run-tests.sh @@ -84,13 +84,12 @@ function tests () { if [ $# -eq 0 ] then tests - tests_exit_code=$? - exit "$tests_exit_code" + exit "$?" fi if [ "$1" = "docker-services" ] then - eval "$(docker-services-cli up --db ${DB:-postgresql} --cache ${CACHE:-redis} --mq ${MQ:-redis} --env)" + docker-services-cli up --db ${DB:-postgresql} --cache ${CACHE:-redis} --mq ${MQ:-redis} --env tests tests_exit_code=$? docker-services-cli down diff --git a/tests/__init__.py b/tests/__init__.py new file mode 100644 index 0000000..dbbb42a --- /dev/null +++ b/tests/__init__.py @@ -0,0 +1,18 @@ +# -*- coding: utf-8 -*- +# +# INVENIO-SIP2 +# Copyright (C) 2020 UCLouvain +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as published by +# the Free Software Foundation, version 3 of the License. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . + +"""Tests.""" diff --git a/tests/conftest.py b/tests/conftest.py index 65bc6c8..57b3ab1 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -21,9 +21,11 @@ fixtures are available. """ + from __future__ import absolute_import, print_function import os + # import shutil import signal import socket @@ -39,32 +41,43 @@ from invenio_access import ActionRoles, authenticated_user, superuser_access from invenio_access.ext import InvenioAccess from invenio_accounts.ext import InvenioAccounts -from invenio_accounts.models import Role +from invenio_accounts.models import Role, User from invenio_accounts.testutils import create_test_user from invenio_db.ext import InvenioDB from invenio_i18n import Babel from invenio_i18n.ext import InvenioI18N -from utils import remote_authorize_patron_handler, remote_checkin_handler, \ - remote_checkout_handler, remote_enable_patron_handler, \ - remote_fee_paid_handler, remote_handler, remote_hold_handler, \ - remote_item_information_handler, remote_login_handler, \ - remote_patron_account_handler, remote_patron_status_handler, \ - remote_renew_handler, remote_system_status_handler, \ - remote_validate_patron_handler +from sqlalchemy import func from invenio_sip2 import InvenioSIP2 from invenio_sip2.views.rest import api_blueprint from invenio_sip2.views.views import blueprint +from .utils import ( + remote_authorize_patron_handler, + remote_checkin_handler, + remote_checkout_handler, + remote_enable_patron_handler, + remote_fee_paid_handler, + remote_handler, + remote_hold_handler, + remote_item_information_handler, + remote_login_handler, + remote_patron_account_handler, + remote_patron_status_handler, + remote_renew_handler, + remote_system_status_handler, + remote_validate_patron_handler, +) + sys.path.append(os.path.dirname(__file__)) pytest_plugins = [ - 'fixtures.messages', - 'fixtures.servers', + "fixtures.messages", + "fixtures.servers", ] -@pytest.fixture(scope='module') +@pytest.fixture(scope="module") def celery_config(): """Override pytest-invenio fixture. @@ -73,11 +86,11 @@ def celery_config(): return {} -@pytest.fixture(scope='module') +@pytest.fixture(scope="module") def base_app(request): """Flask application fixture.""" instance_path = tempfile.mkdtemp() - app = Flask('testapp', instance_path=instance_path) + app = Flask("testapp", instance_path=instance_path) app.config.update( ACCOUNTS_USE_CELERY=False, CELERY_ALWAYS_EAGER=True, @@ -93,16 +106,17 @@ def base_app(request): SECURITY_RESET_PASSWORD_WITHIN="2 seconds", DB_VERSIONING=False, DB_VERSIONING_USER_MODEL=None, - SQLALCHEMY_DATABASE_URI=os.environ.get('SQLALCHEMY_DATABASE_URI', - 'sqlite:///test.db'), + SQLALCHEMY_DATABASE_URI=os.environ.get( + "SQLALCHEMY_DATABASE_URI", "sqlite:///test.db" + ), SQLALCHEMY_TRACK_MODIFICATIONS=False, - SERVER_NAME='localhost:5000', + SERVER_NAME="localhost:5000", TESTING=True, WTF_CSRF_ENABLED=False, - CACHE_REDIS_URL='redis://localhost:6379/0', - SIP2_DATASTORE_HANDLER='invenio_sip2.datastore:Sip2RedisDatastore', - SIP2_DATASTORE_REDIS_URL='redis://localhost:6379/1', - SIP2_LOGGING_FS_LOGFILE='./log/sip2.log', + CACHE_REDIS_URL="redis://localhost:6379/0", + SIP2_DATASTORE_HANDLER="invenio_sip2.datastore:Sip2RedisDatastore", + SIP2_DATASTORE_REDIS_URL="redis://localhost:6379/1", + SIP2_LOGGING_FS_LOGFILE="./log/sip2.log", SIP2_ERROR_DETECTION=True, SIP2_REMOTE_ACTION_HANDLERS=dict( test_ils=dict( @@ -128,9 +142,9 @@ def base_app(request): fee_paid_handler=remote_fee_paid_handler, ), test_invalid=dict( - login_handler='utils.remote_login_handler', - ) - ) + login_handler="utils.remote_login_handler", + ), + ), ) Babel(app) InvenioDB(app) @@ -149,22 +163,21 @@ def _init_app(app_): return app_ -@pytest.fixture(scope='module') +@pytest.fixture(scope="module") def app(base_app): """Flask application fixture.""" return _init_app(base_app) -@pytest.fixture(scope='module') +@pytest.fixture(scope="module") def dummy_socket_server(app): """Start server socket.""" with app.app_context(): # Start socket server - cmd = 'invenio selfcheck start test_server -h 0.0.0.0 -p 3006 -r test' + cmd = "invenio selfcheck start test_server -h 0.0.0.0 -p 3006 -r test" dummy_server = subprocess.Popen( - cmd, - stdout=subprocess.PIPE, stderr=STDOUT, preexec_fn=os.setsid, - shell=True) + cmd, stdout=subprocess.PIPE, stderr=STDOUT, preexec_fn=os.setsid, shell=True + ) time.sleep(10) yield dummy_server @@ -172,13 +185,13 @@ def dummy_socket_server(app): os.killpg(dummy_server.pid, signal.SIGTERM) -@pytest.fixture(scope='module') +@pytest.fixture(scope="module") def selfcheck_client(): """Test socket server.""" # This is fake test client to attempt a connect and disconnect fake_client = socket.socket(socket.AF_INET, socket.SOCK_STREAM) fake_client.settimeout(10) - fake_client.connect(('127.0.0.1', 3006)) + fake_client.connect(("127.0.0.1", 3006)) yield fake_client fake_client.close() @@ -194,39 +207,43 @@ def script_info(app): def users(db, app): """Create users.""" # create users - admin = create_test_user( - email='admin@test.com', - password='123456', - active=True - ) - librarian = create_test_user( - email='librarian@test.com', - password='123456', - active=True - ) - patron = create_test_user( - email='patron@test.com', - password='123456', - active=True - ) - - with db.session.begin_nested(): - datastore = app.extensions['security'].datastore - # Give role to admin - admin_role = Role(name='admin') - db.session.add( - ActionRoles(action=superuser_access.value, role=admin_role) - ) - db.session.add( - ActionRoles(action='api-monitoring', role=admin_role) + datastore = app.extensions["security"].datastore + if not ( + admin := User.query.filter( + func.lower(User.email) == func.lower("admin@test.com") + ).first() + ): + admin = create_test_user(email="admin@test.com", password="123456", active=True) + with db.session.begin_nested(): + # Give role to admin + admin_role = Role(name="admin") + db.session.add(ActionRoles(action=superuser_access.value, role=admin_role)) + db.session.add(ActionRoles(action="api-monitoring", role=admin_role)) + datastore.add_role_to_user(admin, admin_role) + db.session.commit() + if not ( + librarian := User.query.filter( + func.lower(User.email) == func.lower("librarian@test.com") + ).first() + ): + librarian = create_test_user( + email="librarian@test.com", password="123456", active=True ) - datastore.add_role_to_user(admin, admin_role) - # Give role to librarian - librarian_role = Role(name='librarian') - db.session.add( - ActionRoles(action=authenticated_user.value, role=librarian_role) + with db.session.begin_nested(): + # Give role to librarian + librarian_role = Role(name="librarian") + db.session.add( + ActionRoles(action=authenticated_user.value, role=librarian_role) + ) + datastore.add_role_to_user(librarian, librarian_role) + db.session.commit() + if not ( + patron := User.query.filter( + func.lower(User.email) == func.lower("patron@test.com") + ).first() + ): + patron = create_test_user( + email="patron@test.com", password="123456", active=True ) - datastore.add_role_to_user(librarian, librarian_role) - db.session.commit() - return {'admin': admin, 'librarian': librarian, 'user': patron} + return {"admin": admin, "librarian": librarian, "user": patron} diff --git a/tests/fixtures/__init__.py b/tests/fixtures/__init__.py new file mode 100644 index 0000000..7a91804 --- /dev/null +++ b/tests/fixtures/__init__.py @@ -0,0 +1,18 @@ +# -*- coding: utf-8 -*- +# +# INVENIO-SIP2 +# Copyright (C) 2020 UCLouvain +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as published by +# the Free Software Foundation, version 3 of the License. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . + +"""Tests fixtures.""" diff --git a/tests/fixtures/messages.py b/tests/fixtures/messages.py index 7aad3e5..36a3c23 100644 --- a/tests/fixtures/messages.py +++ b/tests/fixtures/messages.py @@ -24,7 +24,7 @@ @pytest.fixture(scope="module") def not_implemented_message(): """Not implemented message.""" - return 'NOT_IMPLEMENTED_MESSAGE' + return "NOT_IMPLEMENTED_MESSAGE" @pytest.fixture(scope="module") @@ -36,7 +36,7 @@ def selfckeck_not_implemented_message(not_implemented_message): @pytest.fixture(scope="module") def failed_login_message(): """Failed login message.""" - return '9300CNinfo@test.org|COtester|CPselfcheck_location|AY0AZEB8C' + return "9300CNinfo@test.org|COtester|CPselfcheck_location|AY0AZEB8C" @pytest.fixture(scope="module") @@ -48,7 +48,7 @@ def selfckeck_failed_login_message(failed_login_message): @pytest.fixture(scope="module") def login_message(): """Login message.""" - return '9300CNlibrarian@test.com|CO123456|CPselfcheck_location|AY1AZEAEE' + return "9300CNlibrarian@test.com|CO123456|CPselfcheck_location|AY1AZEAEE" @pytest.fixture(scope="module") @@ -60,7 +60,7 @@ def selfckeck_login_message(login_message): @pytest.fixture(scope="module") def system_status_message(): """Login message.""" - return '9900802.00AY1AZFCA0' + return "9900802.00AY1AZFCA0" @pytest.fixture(scope="module") @@ -72,15 +72,13 @@ def selfckeck_system_status_message(system_status_message): @pytest.fixture(scope="module") def enable_patron_message(): """Enable patron message.""" - return '2520200717 190253AOinstitution_id|AApatron_identifier|' \ - 'AC|ADpatron_pwd' + return "2520200717 190253AOinstitution_id|AApatron_identifier|" "AC|ADpatron_pwd" @pytest.fixture(scope="module") def patron_status_message(): """Patron status message.""" - return '2300220201124 162421AOinstitution_id|AApatron_identifier|' \ - 'ADpatron_pwd' + return "2300220201124 162421AOinstitution_id|AApatron_identifier|" "ADpatron_pwd" @pytest.fixture(scope="module") @@ -98,8 +96,10 @@ def selfckeck_validate_patron_message(enable_patron_message): @pytest.fixture(scope="module") def patron_information_message(): """Patron information message.""" - return '6300020200716 211818Y AOinstitution_id' \ - '|AApatron_identifier|ADpatron_pwd|AY3AZECEC' + return ( + "6300020200716 211818Y AOinstitution_id" + "|AApatron_identifier|ADpatron_pwd|AY3AZECEC" + ) @pytest.fixture(scope="module") @@ -111,8 +111,7 @@ def selfckeck_patron_information_message(patron_information_message): @pytest.fixture(scope="module") def end_patron_session_message(): """End patron session message.""" - return '3520200717 192847AOinstitution_id|AApatron_identifier|' \ - 'ADpatron_pwd' + return "3520200717 192847AOinstitution_id|AApatron_identifier|" "ADpatron_pwd" @pytest.fixture(scope="module") @@ -124,7 +123,7 @@ def selfckeck_end_patron_session_message(end_patron_session_message): @pytest.fixture(scope="module") def item_information_message(): """Item information message.""" - return '1720201012 123755AOinstitution_id|ABitem_id|AY2AZF4D2' + return "1720201012 123755AOinstitution_id|ABitem_id|AY2AZF4D2" @pytest.fixture(scope="module") @@ -136,8 +135,10 @@ def selfckeck_item_information_message(item_information_message): @pytest.fixture(scope="module") def checkout_message(): """Checkout message.""" - return '11YN20201013 09315820201013 093158AOinstitution_id|' \ - 'AApatron_id|ABitem_id|ACterminal_password|AY0AZEC96' + return ( + "11YN20201013 09315820201013 093158AOinstitution_id|" + "AApatron_id|ABitem_id|ACterminal_password|AY0AZEC96" + ) @pytest.fixture(scope="module") @@ -149,8 +150,10 @@ def selfckeck_checkout_message(checkout_message): @pytest.fixture(scope="module") def checkin_message(): """Checkin message.""" - return '09N20201013 09315820201013 093158APinstitution_id|' \ - 'AOinstitution_id|ABitem_id|ACterminal_password|AY0AZEC96' + return ( + "09N20201013 09315820201013 093158APinstitution_id|" + "AOinstitution_id|ABitem_id|ACterminal_password|AY0AZEC96" + ) @pytest.fixture(scope="module") @@ -162,8 +165,10 @@ def selfckeck_checkin_message(checkin_message): @pytest.fixture(scope="module") def create_hold_message(): """Create hold message.""" - return '15+20201013 093158|AOinstitution_id|AApatron_id|ABitem_id|' \ - 'ACterminal_password|AY0AZEC96' + return ( + "15+20201013 093158|AOinstitution_id|AApatron_id|ABitem_id|" + "ACterminal_password|AY0AZEC96" + ) @pytest.fixture(scope="module") @@ -175,8 +180,10 @@ def selfckeck_create_hold_message(create_hold_message): @pytest.fixture(scope="module") def delete_hold_message(): """Delete hold message.""" - return '15-20201013 093158|AOinstitution_id|AApatron_id|ABitem_id|' \ - 'ACterminal_password|AY0AZEC96' + return ( + "15-20201013 093158|AOinstitution_id|AApatron_id|ABitem_id|" + "ACterminal_password|AY0AZEC96" + ) @pytest.fixture(scope="module") @@ -188,8 +195,10 @@ def selfckeck_delete_hold_message(delete_hold_message): @pytest.fixture(scope="module") def update_hold_message(): """Update hold message.""" - return '15*20201013 093158|AOinstitution_id|AApatron_id|ABitem_id|' \ - 'ACterminal_password|AY0AZEC96' + return ( + "15*20201013 093158|AOinstitution_id|AApatron_id|ABitem_id|" + "ACterminal_password|AY0AZEC96" + ) @pytest.fixture(scope="module") @@ -201,8 +210,10 @@ def selfckeck_update_hold_message(update_hold_message): @pytest.fixture(scope="module") def renew_message(): """Renew message.""" - return '29NN20201013 09315820201013 09315|AOinstitution_id|' \ - 'AApatron_id|ABitem_id|AY0AZEC96' + return ( + "29NN20201013 09315820201013 09315|AOinstitution_id|" + "AApatron_id|ABitem_id|AY0AZEC96" + ) @pytest.fixture(scope="module") @@ -214,8 +225,10 @@ def selfckeck_renew_message(renew_message): @pytest.fixture(scope="module") def fee_paid_message(): """Fee paid message.""" - return '3720221013 0931580402EUR|BV2.50|AOinstitution_id|AApatron_id' \ - '|CGfee_identifier|BKtransaction_id|AY0AZEC96' + return ( + "3720221013 0931580402EUR|BV2.50|AOinstitution_id|AApatron_id" + "|CGfee_identifier|BKtransaction_id|AY0AZEC96" + ) @pytest.fixture(scope="module") diff --git a/tests/fixtures/servers.py b/tests/fixtures/servers.py index 524d4ff..78a6006 100644 --- a/tests/fixtures/servers.py +++ b/tests/fixtures/servers.py @@ -26,34 +26,32 @@ def server_data(): """Load server data.""" return { - 'id': 'key_1', - 'host': '0.0.0.0', - 'port': 3006, - 'remote_app': 'test_ils', - 'server_name': 'server_sip2', + "id": "key_1", + "host": "0.0.0.0", + "port": 3006, + "remote_app": "test_ils", + "server_name": "server_sip2", } @pytest.fixture(scope="module") def server(app, server_data): """Load server record.""" - server = Server.create(server_data, id_='key_1') + server = Server.create(server_data, id_="key_1") return server -@pytest.fixture(scope='module') +@pytest.fixture(scope="module") def dummy_client_data(): """Load client data.""" return { - 'server': { - 'id': 'key_1' - }, - 'ip_address': '127.0.0.1', - 'socket': 65565, + "server": {"id": "key_1"}, + "ip_address": "127.0.0.1", + "socket": 65565, } -@pytest.fixture(scope='module') +@pytest.fixture(scope="module") def dummy_client(app, server, dummy_client_data): """Load and create client.""" client = Client.create(data=dummy_client_data) diff --git a/tests/test_actions.py b/tests/test_actions.py index 935a063..6f1d226 100644 --- a/tests/test_actions.py +++ b/tests/test_actions.py @@ -30,133 +30,123 @@ def test_sip2_actions_interface(app): """Test base action interface.""" - action = Action(command='93', response='94', message='interface_message') + action = Action(command="93", response="94", message="interface_message") with pytest.raises(NotImplementedError): action.execute() with pytest.raises(CommandNotFound): - action = Action( - command='85', response='86', message='interface_message') + action = Action(command="85", response="86", message="interface_message") action.execute() # test action from extension - current_sip2.sip2.execute('wrong command') + current_sip2.sip2.execute("wrong command") -@mock.patch('invenio_sip2.actions.actions.selfcheck_login_handler', - mock.MagicMock(return_value={'authenticated': False})) +@mock.patch( + "invenio_sip2.actions.actions.selfcheck_login_handler", + mock.MagicMock(return_value={"authenticated": False}), +) def test_sip2_login_failed(app, dummy_client, failed_login_message): """Test login action failed.""" response = current_sip2.sip2.execute( - Message(request=failed_login_message), - client=dummy_client + Message(request=failed_login_message), client=dummy_client ) - assert str(response) == '940AY0AZFDFE\r' + assert str(response) == "940AY0AZFDFE\r" def test_sip2_login(app, dummy_client, login_message): """Test login action.""" response = current_sip2.sip2.execute( - Message(request=login_message), - client=dummy_client + Message(request=login_message), client=dummy_client ) - assert str(response) == '941AY1AZFDFC\r' + assert str(response) == "941AY1AZFDFC\r" def test_sip2_system_status(app, dummy_client, system_status_message): """Test system status action.""" response = current_sip2.sip2.execute( - Message(request=system_status_message), - client=dummy_client + Message(request=system_status_message), client=dummy_client ) - assert str(response).startswith('98') + assert str(response).startswith("98") def test_patron_enable(app, dummy_client, enable_patron_message): """Test patron enable action.""" response = current_sip2.sip2.execute( - Message(request=enable_patron_message), - client=dummy_client + Message(request=enable_patron_message), client=dummy_client ) - assert str(response).startswith('26') + assert str(response).startswith("26") def test_patron_status(app, dummy_client, patron_status_message): """Test patron status action.""" response = current_sip2.sip2.execute( - Message(request=patron_status_message), - client=dummy_client + Message(request=patron_status_message), client=dummy_client ) - assert str(response).startswith('24') + assert str(response).startswith("24") def test_patron_information(app, dummy_client, patron_information_message): """Test patron information action.""" response = current_sip2.sip2.execute( - Message(request=patron_information_message), - client=dummy_client + Message(request=patron_information_message), client=dummy_client ) data = response.dumps() - required_fields = app.config.get('SIP2_MESSAGE_TYPES').get('64')\ - .get('required_fields') + required_fields = ( + app.config.get("SIP2_MESSAGE_TYPES").get("64").get("required_fields") + ) for field in required_fields: assert data[field] - assert str(response).startswith('64') + assert str(response).startswith("64") def test_item_information(app, dummy_client, item_information_message): """Test patron enable action.""" response = current_sip2.sip2.execute( - Message(request=item_information_message), - client=dummy_client + Message(request=item_information_message), client=dummy_client ) - assert str(response).startswith('18') + assert str(response).startswith("18") def test_checkout(app, dummy_client, checkout_message): """Test checkout action.""" response = current_sip2.sip2.execute( - Message(request=checkout_message), - client=dummy_client + Message(request=checkout_message), client=dummy_client ) - assert str(response).startswith('12') + assert str(response).startswith("12") def test_checkin(app, dummy_client, checkin_message): """Test checkin action.""" response = current_sip2.sip2.execute( - Message(request=checkin_message), - client=dummy_client + Message(request=checkin_message), client=dummy_client ) - assert str(response).startswith('10') + assert str(response).startswith("10") def test_hold(app, dummy_client, create_hold_message): """Test hold action.""" response = current_sip2.sip2.execute( - Message(request=create_hold_message), - client=dummy_client + Message(request=create_hold_message), client=dummy_client ) - assert str(response).startswith('16') + assert str(response).startswith("16") def test_renew(app, dummy_client, renew_message): """Test renew action.""" response = current_sip2.sip2.execute( - Message(request=renew_message), - client=dummy_client + Message(request=renew_message), client=dummy_client ) - assert str(response).startswith('30') + assert str(response).startswith("30") def test_fee_paid(app, dummy_client, fee_paid_message): """Test checkin action.""" response = current_sip2.sip2.execute( - Message(request=fee_paid_message), - client=dummy_client + Message(request=fee_paid_message), client=dummy_client ) - assert str(response).startswith('38') + assert str(response).startswith("38") def test_end_patron_session(app, dummy_client, end_patron_session_message): @@ -165,7 +155,6 @@ def test_end_patron_session(app, dummy_client, end_patron_session_message): # this test needs to be run last, because during this test, # the patron session is deleted response = current_sip2.sip2.execute( - Message(request=end_patron_session_message), - client=dummy_client + Message(request=end_patron_session_message), client=dummy_client ) - assert str(response).startswith('36') + assert str(response).startswith("36") diff --git a/tests/test_cli.py b/tests/test_cli.py index ee2d5b6..7867a93 100644 --- a/tests/test_cli.py +++ b/tests/test_cli.py @@ -35,7 +35,8 @@ def test_start_server_socker(app): runner = app.test_cli_runner() # test start server with wrong port - result = runner.invoke(start_socket_server, [ - 'test_server', '--host', '0.0.0.0', '--port', 78495, '--remote-app', - 'test']) + result = runner.invoke( + start_socket_server, + ["test_server", "--host", "0.0.0.0", "--port", 78495, "--remote-app", "test"], + ) assert result.exit_code == 1 diff --git a/tests/test_datastore.py b/tests/test_datastore.py index bf9e0ae..0ce33be 100644 --- a/tests/test_datastore.py +++ b/tests/test_datastore.py @@ -33,17 +33,17 @@ def test_datastore_interface(app, server_data): """Test datastore interface.""" ds = Datastore() with pytest.raises(NotImplementedError): - ds.add('key', 'value') + ds.add("key", "value") with pytest.raises(NotImplementedError): - ds.get('id_') + ds.get("id_") with pytest.raises(NotImplementedError): - ds.update('key', 'value') + ds.update("key", "value") with pytest.raises(NotImplementedError): - ds.delete('key') + ds.delete("key") with pytest.raises(NotImplementedError): ds.all() with pytest.raises(NotImplementedError): - ds.search('query') + ds.search("query") with pytest.raises(NotImplementedError): ds.flush() @@ -55,8 +55,8 @@ def test_redis_datastore(app, server_data): # clear datastore datastore.flush() server = Server(server_data) - datastore.add(server, 'key_1') - data = datastore.get(server.id, 'server') + datastore.add(server, "key_1") + data = datastore.get(server.id, "server") assert data datastore.flush() assert not datastore.get(server.id) @@ -65,10 +65,10 @@ def test_redis_datastore(app, server_data): def test_record_metadata(app, server_data, dummy_client_data): """Record metadata tests""" with app.app_context(): - server = Server.create(server_data, id_='key_1') + server = Server.create(server_data, id_="key_1") assert server.id assert server.count() == 1 - data = Server.find_server(server_name=server_data.get('server_name')) + data = Server.find_server(server_name=server_data.get("server_name")) assert data.id == server.id assert not server.is_running server.up() diff --git a/tests/test_examples_app.py b/tests/test_examples_app.py index 35318f1..44d481a 100644 --- a/tests/test_examples_app.py +++ b/tests/test_examples_app.py @@ -33,19 +33,22 @@ def example_app(): # Go to example directory project_dir = dirname(dirname(abspath(__file__))) - exampleapp_dir = join(project_dir, 'examples') + exampleapp_dir = join(project_dir, "examples") os.chdir(exampleapp_dir) # Setup application - assert subprocess.call('./app-setup.sh', shell=True) == 0 + assert subprocess.call("./app-setup.sh", shell=True) == 0 # Setup fixtures # assert subprocess.call('./app-fixtures.sh', shell=True) == 0 # Start example app webapp = subprocess.Popen( - 'FLASK_APP=app.py flask run --debugger -p 5000', - stdout=subprocess.PIPE, preexec_fn=os.setsid, shell=True) + "FLASK_APP=app.py flask run --debugger -p 5000", + stdout=subprocess.PIPE, + preexec_fn=os.setsid, + shell=True, + ) time.sleep(10) yield webapp @@ -53,7 +56,7 @@ def example_app(): os.killpg(webapp.pid, signal.SIGTERM) # Tear down example app - subprocess.call('./app-teardown.sh', shell=True) + subprocess.call("./app-teardown.sh", shell=True) # Return to the original directory os.chdir(current_dir) diff --git a/tests/test_helpers.py b/tests/test_helpers.py index 4708e58..8e690b9 100644 --- a/tests/test_helpers.py +++ b/tests/test_helpers.py @@ -20,28 +20,27 @@ import pytest from invenio_sip2.errors import UnknownFieldIdMessageError -from invenio_sip2.helpers import MessageTypeFixedField, \ - MessageTypeVariableField +from invenio_sip2.helpers import MessageTypeFixedField, MessageTypeVariableField def test_message_type_fixed_field(): """Test message type fixed field.""" - field = MessageTypeFixedField.get('available') + field = MessageTypeFixedField.get("available") assert str(field) with pytest.raises(UnknownFieldIdMessageError): - field = MessageTypeFixedField.get('dummy_field') + field = MessageTypeFixedField.get("dummy_field") def test_message_type_variable_field(): """Test message type fixed field.""" - field = MessageTypeVariableField.get('patron_id') + field = MessageTypeVariableField.get("patron_id") assert str(field) with pytest.raises(UnknownFieldIdMessageError): - field = MessageTypeVariableField.get('dummy_field') + field = MessageTypeVariableField.get("dummy_field") - assert MessageTypeVariableField.find_by_field_id('AA') + assert MessageTypeVariableField.find_by_field_id("AA") with pytest.raises(UnknownFieldIdMessageError): - MessageTypeVariableField.find_by_field_id('dummy_field') + MessageTypeVariableField.find_by_field_id("dummy_field") diff --git a/tests/test_invenio_sip2.py b/tests/test_invenio_sip2.py index 15f1731..b33e765 100644 --- a/tests/test_invenio_sip2.py +++ b/tests/test_invenio_sip2.py @@ -27,18 +27,19 @@ def test_version(): """Test version import.""" from invenio_sip2 import __version__ + assert __version__ def test_init(): """Test extension initialization.""" - app = Flask('testapp') + app = Flask("testapp") ext = InvenioSIP2(app) - assert 'invenio-sip2' in app.extensions + assert "invenio-sip2" in app.extensions assert ext.app is app - app = Flask('testapp') + app = Flask("testapp") ext = InvenioSIP2() - assert 'invenio-sip2' not in app.extensions + assert "invenio-sip2" not in app.extensions ext.init_app(app) - assert 'invenio-sip2' in app.extensions + assert "invenio-sip2" in app.extensions diff --git a/tests/test_messages_api.py b/tests/test_messages_api.py index 41fb038..0385449 100644 --- a/tests/test_messages_api.py +++ b/tests/test_messages_api.py @@ -27,16 +27,23 @@ def test_messages_api(app, patron_information_message): """Test invenio-sip2 Message api.""" # instantiate message class with wrong a message with pytest.raises(CommandNotFound): - message = Message(request='bad sip2 message') + message = Message(request="bad sip2 message") # use well-formed message message = Message(request=patron_information_message) - patron_id = message.get_field_values('patron_id') + patron_id = message.get_field_values("patron_id") data = message.dumps() - assert data['patron_id'] in patron_id - for key in ['_sip2', 'message_type', 'institution_id', 'patron_id', - 'checksum', 'sequence_number', 'transaction_date']: + assert data["patron_id"] in patron_id + for key in [ + "_sip2", + "message_type", + "institution_id", + "patron_id", + "checksum", + "sequence_number", + "transaction_date", + ]: assert data[key] # test unknown message field with pytest.raises(UnknownFieldIdMessageError): - field = message.get_field_values('message_type') + field = message.get_field_values("message_type") diff --git a/tests/test_models.py b/tests/test_models.py index 9e919b6..576cebc 100644 --- a/tests/test_models.py +++ b/tests/test_models.py @@ -29,117 +29,89 @@ def test_selfcheck_patron_status(): patron_status = PatronStatus() # test charged privileges denied status - patron_status.add_patron_status_type( - PatronStatusTypes.CHARGE_PRIVILEGES_DENIED - ) - assert str(patron_status)[0] == 'Y' - assert str(patron_status)[1] == ' ' + patron_status.add_patron_status_type(PatronStatusTypes.CHARGE_PRIVILEGES_DENIED) + assert str(patron_status)[0] == "Y" + assert str(patron_status)[1] == " " # test renewal privileges denied status patron_status = PatronStatus() - patron_status.add_patron_status_type( - PatronStatusTypes.RENEWAL_PRIVILEGES_DENIED - ) - assert str(patron_status)[1] == 'Y' - assert str(patron_status)[2] == ' ' + patron_status.add_patron_status_type(PatronStatusTypes.RENEWAL_PRIVILEGES_DENIED) + assert str(patron_status)[1] == "Y" + assert str(patron_status)[2] == " " # test recall privileges denied status patron_status = PatronStatus() - patron_status.add_patron_status_type( - PatronStatusTypes.RECALL_PRIVILEGES_DENIED - ) - assert str(patron_status)[2] == 'Y' - assert str(patron_status)[3] == ' ' + patron_status.add_patron_status_type(PatronStatusTypes.RECALL_PRIVILEGES_DENIED) + assert str(patron_status)[2] == "Y" + assert str(patron_status)[3] == " " # test hold privileges denied status patron_status = PatronStatus() - patron_status.add_patron_status_type( - PatronStatusTypes.HOLD_PRIVILEGES_DENIED - ) - assert str(patron_status)[3] == 'Y' - assert str(patron_status)[4] == ' ' + patron_status.add_patron_status_type(PatronStatusTypes.HOLD_PRIVILEGES_DENIED) + assert str(patron_status)[3] == "Y" + assert str(patron_status)[4] == " " # test card lost status patron_status = PatronStatus() - patron_status.add_patron_status_type( - PatronStatusTypes.CARD_REPORTED_LOST - ) - assert str(patron_status)[4] == 'Y' - assert str(patron_status)[5] == ' ' + patron_status.add_patron_status_type(PatronStatusTypes.CARD_REPORTED_LOST) + assert str(patron_status)[4] == "Y" + assert str(patron_status)[5] == " " # test too many items charged status patron_status = PatronStatus() - patron_status.add_patron_status_type( - PatronStatusTypes.TOO_MANY_ITEMS_CHARGED - ) - assert str(patron_status)[5] == 'Y' - assert str(patron_status)[6] == ' ' + patron_status.add_patron_status_type(PatronStatusTypes.TOO_MANY_ITEMS_CHARGED) + assert str(patron_status)[5] == "Y" + assert str(patron_status)[6] == " " # test too many items overdue status patron_status = PatronStatus() - patron_status.add_patron_status_type( - PatronStatusTypes.TOO_MANY_ITEMS_OVERDUE - ) - assert str(patron_status)[6] == 'Y' - assert str(patron_status)[7] == ' ' + patron_status.add_patron_status_type(PatronStatusTypes.TOO_MANY_ITEMS_OVERDUE) + assert str(patron_status)[6] == "Y" + assert str(patron_status)[7] == " " # test too many renewals status patron_status = PatronStatus() - patron_status.add_patron_status_type( - PatronStatusTypes.TOO_MANY_RENEWALS - ) - assert str(patron_status)[7] == 'Y' - assert str(patron_status)[8] == ' ' + patron_status.add_patron_status_type(PatronStatusTypes.TOO_MANY_RENEWALS) + assert str(patron_status)[7] == "Y" + assert str(patron_status)[8] == " " # test too many claims status patron_status = PatronStatus() patron_status.add_patron_status_type( PatronStatusTypes.TOO_MANY_CLAIMS_OF_ITEMS_RETURNED ) - assert str(patron_status)[8] == 'Y' - assert str(patron_status)[9] == ' ' + assert str(patron_status)[8] == "Y" + assert str(patron_status)[9] == " " # test too many items lost status patron_status = PatronStatus() - patron_status.add_patron_status_type( - PatronStatusTypes.TOO_MANY_ITEMS_LOST - ) - assert str(patron_status)[9] == 'Y' - assert str(patron_status)[10] == ' ' + patron_status.add_patron_status_type(PatronStatusTypes.TOO_MANY_ITEMS_LOST) + assert str(patron_status)[9] == "Y" + assert str(patron_status)[10] == " " # test excessive outstanding fines status patron_status = PatronStatus() - patron_status.add_patron_status_type( - PatronStatusTypes.EXCESSIVE_OUTSTANDING_FINES - ) - assert str(patron_status)[10] == 'Y' - assert str(patron_status)[11] == ' ' + patron_status.add_patron_status_type(PatronStatusTypes.EXCESSIVE_OUTSTANDING_FINES) + assert str(patron_status)[10] == "Y" + assert str(patron_status)[11] == " " # test excessive outstanding fees status patron_status = PatronStatus() - patron_status.add_patron_status_type( - PatronStatusTypes.EXCESSIVE_OUTSTANDING_FEES - ) - assert str(patron_status)[11] == 'Y' - assert str(patron_status)[12] == ' ' + patron_status.add_patron_status_type(PatronStatusTypes.EXCESSIVE_OUTSTANDING_FEES) + assert str(patron_status)[11] == "Y" + assert str(patron_status)[12] == " " # test recall overdue status patron_status = PatronStatus() - patron_status.add_patron_status_type( - PatronStatusTypes.RECALL_OVERDUE - ) - assert str(patron_status)[12] == 'Y' - assert str(patron_status)[13] == ' ' + patron_status.add_patron_status_type(PatronStatusTypes.RECALL_OVERDUE) + assert str(patron_status)[12] == "Y" + assert str(patron_status)[13] == " " # test too many items billed status patron_status = PatronStatus() - patron_status.add_patron_status_type( - PatronStatusTypes.TOO_MANY_ITEMS_BILLED - ) - assert str(patron_status)[13] == 'Y' + patron_status.add_patron_status_type(PatronStatusTypes.TOO_MANY_ITEMS_BILLED) + assert str(patron_status)[13] == "Y" # try to add unknown patron status type with pytest.raises(Exception): - patron_status.add_patron_status_type( - 'unknown_patron_status_type' - ) + patron_status.add_patron_status_type("unknown_patron_status_type") diff --git a/tests/test_server.py b/tests/test_server.py index bf66827..b8a38ae 100644 --- a/tests/test_server.py +++ b/tests/test_server.py @@ -30,7 +30,7 @@ def test_socket_server(app, dummy_socket_server, selfckeck_login_message): with app.app_context(): # test client connection client = socket.socket() - client.connect(('127.0.0.1', 3006)) + client.connect(("127.0.0.1", 3006)) client.settimeout(1) client.sendall(selfckeck_login_message) client.close() diff --git a/tests/test_utils.py b/tests/test_utils.py index 3fe57e1..4bdd5d1 100644 --- a/tests/test_utils.py +++ b/tests/test_utils.py @@ -19,45 +19,50 @@ from __future__ import absolute_import, print_function -from invenio_sip2.utils import convert_to_char, decode_char_to_bool, \ - ensure_i18n_language, get_language_code, parse_circulation_date +from invenio_sip2.utils import ( + convert_to_char, + decode_char_to_bool, + ensure_i18n_language, + get_language_code, + parse_circulation_date, +) def test_decode_char_to_bool(): """Test convert char to boolean.""" - assert decode_char_to_bool('Y') + assert decode_char_to_bool("Y") def test_convert_char(): """Test convert char.""" - assert convert_to_char(1) == 'Y' - assert convert_to_char(0) == 'N' + assert convert_to_char(1) == "Y" + assert convert_to_char(0) == "N" def test_parse_circulation_date(): """Test parse circulation date.""" - assert parse_circulation_date('2021-08-16T22:00:18.676736+00:00') - assert parse_circulation_date('2021-08-16T22:00:18') - assert parse_circulation_date('2021-08-16') + assert parse_circulation_date("2021-08-16T22:00:18.676736+00:00") + assert parse_circulation_date("2021-08-16T22:00:18") + assert parse_circulation_date("2021-08-16") def test_ensure_i18n_language(): """Test ensure i18n language.""" - assert ensure_i18n_language('en') == 'en' - assert ensure_i18n_language('eng') == 'en' - assert ensure_i18n_language('english') == 'en' - assert ensure_i18n_language('fr') == 'fr' - assert ensure_i18n_language('fra') == 'fr' - assert ensure_i18n_language('fre') == 'fr' - assert ensure_i18n_language('it') == 'it' - assert ensure_i18n_language('ita') == 'it' + assert ensure_i18n_language("en") == "en" + assert ensure_i18n_language("eng") == "en" + assert ensure_i18n_language("english") == "en" + assert ensure_i18n_language("fr") == "fr" + assert ensure_i18n_language("fra") == "fr" + assert ensure_i18n_language("fre") == "fr" + assert ensure_i18n_language("it") == "it" + assert ensure_i18n_language("ita") == "it" def test_get_language_code(): """Test conversion of language to SIP2 code.""" # test by ISO 639-2 language - assert get_language_code('eng') == '001' + assert get_language_code("eng") == "001" # test by enum name - assert get_language_code('FRENCH') == '002' + assert get_language_code("FRENCH") == "002" # test unknown value - assert get_language_code('inexisting_language') == '000' + assert get_language_code("inexisting_language") == "000" diff --git a/tests/test_views.py b/tests/test_views.py index 8e3ef3d..34f170f 100644 --- a/tests/test_views.py +++ b/tests/test_views.py @@ -23,4 +23,4 @@ def test_view_monitoring(app): with app.test_client() as client: res = client.get("/sip2/monitoring") assert res.status_code == 200 - assert 'Automated circulation system monitoring' in str(res.data) + assert "Automated circulation system monitoring" in str(res.data) diff --git a/tests/test_views_rest.py b/tests/test_views_rest.py index 2179c8a..141aae0 100644 --- a/tests/test_views_rest.py +++ b/tests/test_views_rest.py @@ -24,11 +24,11 @@ def test_monitoring_status(app, users, server, dummy_client): """Test monitoring status.""" with app.test_client() as client: - res = client.get(url_for('api_sip2.status')) + res = client.get(url_for("api_sip2.status")) assert res.status_code == 401 - user_login(client, 'admin', users) - res = client.get(url_for('api_sip2.status')) + user_login(client, "admin", users) + res = client.get(url_for("api_sip2.status")) assert res.status_code == 200 user_logout(client) @@ -36,11 +36,11 @@ def test_monitoring_status(app, users, server, dummy_client): def test_monitoring_servers(app, users): """Test monitoring servers.""" with app.test_client() as client: - res = client.get(url_for('api_sip2.get_servers')) + res = client.get(url_for("api_sip2.get_servers")) assert res.status_code == 401 - user_login(client, 'admin', users) - res = client.get(url_for('api_sip2.get_servers')) + user_login(client, "admin", users) + res = client.get(url_for("api_sip2.get_servers")) assert res.status_code == 200 user_logout(client) @@ -48,26 +48,25 @@ def test_monitoring_servers(app, users): def test_monitoring_clients(app, users): """Test monitoring servers.""" with app.test_client() as client: - res = client.get(url_for('api_sip2.get_clients')) + res = client.get(url_for("api_sip2.get_clients")) assert res.status_code == 401 - user_login(client, 'admin', users) - res = client.get(url_for('api_sip2.get_clients')) + user_login(client, "admin", users) + res = client.get(url_for("api_sip2.get_clients")) assert res.status_code == 200 user_logout(client) def test_get_server(app, users, server): """Test monitoring servers.""" + print("--->", users) with app.test_client() as client: - server_url = url_for( - 'api_sip2.get_server', server_id=server.id - ) + server_url = url_for("api_sip2.get_server", server_id=server.id) res = client.get(server_url) assert res.status_code == 401 - user_login(client, 'admin', users) + user_login(client, "admin", users) res = client.get(server_url) assert res.status_code == 200 user_logout(client) diff --git a/tests/utils.py b/tests/utils.py index 61660ed..c3470a3 100644 --- a/tests/utils.py +++ b/tests/utils.py @@ -24,11 +24,21 @@ from invenio_accounts.models import User from invenio_accounts.testutils import login_user_via_session -from invenio_sip2.models import PatronStatus, SelfcheckCheckin, \ - SelfcheckCheckout, SelfcheckCirculationStatus, SelfcheckFeePaid, \ - SelfcheckFeeType, SelfcheckHold, SelfcheckItemInformation, \ - SelfcheckMediaType, SelfcheckPatronInformation, SelfcheckPatronStatus, \ - SelfcheckRenew, SelfcheckSecurityMarkerType +from invenio_sip2.models import ( + PatronStatus, + SelfcheckCheckin, + SelfcheckCheckout, + SelfcheckCirculationStatus, + SelfcheckFeePaid, + SelfcheckFeeType, + SelfcheckHold, + SelfcheckItemInformation, + SelfcheckMediaType, + SelfcheckPatronInformation, + SelfcheckPatronStatus, + SelfcheckRenew, + SelfcheckSecurityMarkerType, +) def user_login(client, username, users): @@ -53,28 +63,28 @@ def user_logout(client): def str_to_bytes(string): """Convert string to bytes.""" - return bytes(string, 'utf-8') + return bytes(string, "utf-8") def remote_handler(): """Dummy remote handler function.""" - return lambda *args, **kwargs: 'TEST' + return lambda *args, **kwargs: "TEST" def remote_login_handler(login, password, **kwargs): """Dummy remote handler for login.""" return { - 'authenticated': True, - 'terminal': 'terminal_1', - 'transaction_user_id': 'user_id', - 'institution_id': 'selfcheck_location', - 'library_name': 'Name of the library' + "authenticated": True, + "terminal": "terminal_1", + "transaction_user_id": "user_id", + "institution_id": "selfcheck_location", + "library_name": "Name of the library", } def remote_system_status_handler(login, **kwargs): """Dummy remote handler for system status.""" - return {'institution_id': 'selfcheck_location'} + return {"institution_id": "selfcheck_location"} def remote_authorize_patron_handler(patron_id, patron_password, **kwargs): @@ -90,20 +100,20 @@ def remote_validate_patron_handler(patron_id, **kwargs): def remote_enable_patron_handler(patron_id, **kwargs): """Dummy remote handler for enable patron.""" return { - 'patron_status': PatronStatus(), - 'language': 'und', - 'institution_id': 'selfcheck_location', - 'patron_id': 'patron_id', - 'patron_name': 'formatted patron name' + "patron_status": PatronStatus(), + "language": "und", + "institution_id": "selfcheck_location", + "patron_id": "patron_id", + "patron_name": "formatted patron name", } def remote_patron_status_handler(patron_id, **kwargs): """Dummy remote handler for patron information.""" response = SelfcheckPatronStatus( - patron_id='patron_id', - institution_id='selfcheck_location', - print_line='message on one line' + patron_id="patron_id", + institution_id="selfcheck_location", + print_line="message on one line", ) return response @@ -113,16 +123,16 @@ def remote_patron_account_handler(patron_id, **kwargs): response = SelfcheckPatronInformation( patron_status=PatronStatus(), patron_id=patron_id, - patron_name='formatted_patron_name', - patron_email='patron_email', - patron_phone='patron_phone', - patron_address='patron_address', - institution_id='institution_id', - language='und', - currency_type='EUR' + patron_name="formatted_patron_name", + patron_email="patron_email", + patron_phone="patron_phone", + patron_address="patron_address", + institution_id="institution_id", + language="und", + currency_type="EUR", ) - response.get('hold_items', []).append('item_pid_1') - response.get('hold_items', []).append('item_pid_2') + response.get("hold_items", []).append("item_pid_1") + response.get("hold_items", []).append("item_pid_2") return response @@ -130,56 +140,54 @@ def remote_item_information_handler(item_id, **kwargs): """Dummy remote handler for item information.""" response = SelfcheckItemInformation( item_id=item_id, - title_id='title_id', + title_id="title_id", circulation_status=SelfcheckCirculationStatus.OTHER, fee_type=SelfcheckFeeType.OTHER, - security_marker=SelfcheckSecurityMarkerType.OTHER + security_marker=SelfcheckSecurityMarkerType.OTHER, ) - response['media_type'] = SelfcheckMediaType.OTHER - response['hold_queue_length'] = 0 - response['owner'] = 'owner' - response['permanent_location'] = 'permanent_location' - response['current_location'] = 'current_location' + response["media_type"] = SelfcheckMediaType.OTHER + response["hold_queue_length"] = 0 + response["owner"] = "owner" + response["permanent_location"] = "permanent_location" + response["current_location"] = "current_location" return response -def remote_checkout_handler(user_id, item_id, patron_id, - **kwargs): +def remote_checkout_handler(user_id, item_id, patron_id, **kwargs): """Dummy remote handler for checkout.""" response = SelfcheckCheckout( item_id=item_id, - title_id='title_id', + title_id="title_id", circulation_status=SelfcheckCirculationStatus.OTHER, fee_type=SelfcheckFeeType.OTHER, - security_marker=SelfcheckSecurityMarkerType.OTHER + security_marker=SelfcheckSecurityMarkerType.OTHER, ) - response['media_type'] = SelfcheckMediaType.OTHER - response['due_date'] = datetime.now(timezone.utc).strftime( - current_app.config['SIP2_CIRCULATION_DATE_FORMAT'] + response["media_type"] = SelfcheckMediaType.OTHER + response["due_date"] = datetime.now(timezone.utc).strftime( + current_app.config["SIP2_CIRCULATION_DATE_FORMAT"] ) - response['hold_queue_length'] = 0 - response['owner'] = 'owner' - response['permanent_location'] = 'permanent_location' - response['current_location'] = 'current_location' + response["hold_queue_length"] = 0 + response["owner"] = "owner" + response["permanent_location"] = "permanent_location" + response["current_location"] = "current_location" return response -def remote_checkin_handler(user_id, item_id, - **kwargs): +def remote_checkin_handler(user_id, item_id, **kwargs): """Dummy remote handler for checkin.""" response = SelfcheckCheckin( item_id=item_id, - title_id='title_id', - permanent_location='permanent_location', + title_id="title_id", + permanent_location="permanent_location", circulation_status=SelfcheckCirculationStatus.OTHER, fee_type=SelfcheckFeeType.OTHER, - security_marker=SelfcheckSecurityMarkerType.OTHER + security_marker=SelfcheckSecurityMarkerType.OTHER, ) - response['media_type'] = SelfcheckMediaType.OTHER - response['hold_queue_length'] = 0 - response['owner'] = 'owner' - response['permanent_location'] = 'permanent_location' - response['current_location'] = 'current_location' + response["media_type"] = SelfcheckMediaType.OTHER + response["hold_queue_length"] = 0 + response["owner"] = "owner" + response["permanent_location"] = "permanent_location" + response["current_location"] = "current_location" return response @@ -187,38 +195,45 @@ def remote_hold_handler(user_id, item_id, **kwargs): """Dummy remote handler for hold.""" response = SelfcheckHold( item_id=item_id, - title_id='title_id', + title_id="title_id", circulation_status=SelfcheckCirculationStatus.OTHER, fee_type=SelfcheckFeeType.OTHER, - security_marker=SelfcheckSecurityMarkerType.OTHER + security_marker=SelfcheckSecurityMarkerType.OTHER, ) - response['media_type'] = SelfcheckMediaType.OTHER - response['hold_queue_length'] = 0 - response['owner'] = 'owner' - response['permanent_location'] = 'permanent_location' - response['current_location'] = 'current_location' + response["media_type"] = SelfcheckMediaType.OTHER + response["hold_queue_length"] = 0 + response["owner"] = "owner" + response["permanent_location"] = "permanent_location" + response["current_location"] = "current_location" return response -def remote_renew_handler(user_id, item_id, - **kwargs): +def remote_renew_handler(user_id, item_id, **kwargs): """Dummy remote handler for renew.""" response = SelfcheckRenew( item_id=item_id, - title_id='title_id', + title_id="title_id", circulation_status=SelfcheckCirculationStatus.OTHER, fee_type=SelfcheckFeeType.OTHER, - security_marker=SelfcheckSecurityMarkerType.OTHER + security_marker=SelfcheckSecurityMarkerType.OTHER, ) - response['media_type'] = SelfcheckMediaType.OTHER - response['hold_queue_length'] = 0 - response['owner'] = 'owner' - response['permanent_location'] = 'permanent_location' - response['current_location'] = 'current_location' + response["media_type"] = SelfcheckMediaType.OTHER + response["hold_queue_length"] = 0 + response["owner"] = "owner" + response["permanent_location"] = "permanent_location" + response["current_location"] = "current_location" return response -def remote_fee_paid_handler(user_id, patron_identifier, fee_type, payment_type, - currency_type, fee_amount, *args, **kwargs): +def remote_fee_paid_handler( + user_id, + patron_identifier, + fee_type, + payment_type, + currency_type, + fee_amount, + *args, + **kwargs, +): """Dummy remote handler for renew.""" return SelfcheckFeePaid(accepted=True)