ffbb-data-client 2.4.24__tar.gz → 2.4.25__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/CHANGELOG.md +6 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/PKG-INFO +1 -1
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/api.py +109 -1
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/clients/_search_facade.py +88 -72
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client.egg-info/PKG-INFO +1 -1
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client.egg-info/SOURCES.txt +1 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client.egg-info/scm_file_list.json +1 -0
- ffbb_data_client-2.4.25/src/ffbb_data_client.egg-info/scm_version.json +8 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/tests/unit/clients/test_v2_backport_search.py +50 -0
- ffbb_data_client-2.4.25/tests/unit/test_313_api_metrics.py +33 -0
- ffbb_data_client-2.4.24/src/ffbb_data_client.egg-info/scm_version.json +0 -8
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/.agents/rules/antigravity-rtk-rules.md +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/.coveragerc +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/.gitattributes +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/.github/FUNDING.yml +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/.github/dependabot.yml +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/.github/scripts/ai-pr-reviewer.cjs +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/.github/scripts/check_wrapper_parity.py +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/.github/workflows/ai-pr-reviewer.yml +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/.github/workflows/check_wrapper_parity.yml +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/.github/workflows/ci.yml +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/.github/workflows/codeql.yml +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/.github/workflows/deploy-pages.yml +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/.github/workflows/keep-ffbb-api-discovery-alive.yml +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/.github/workflows/publish.yml +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/.github/workflows/release-after-discovery-merge.yml +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/.github/workflows/update-ffbb-api-discovery.yml +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/.gitignore +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/.isort.cfg +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/.jules/bolt.md +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/.omc/skills/codeql-security-hardening-expertise.md +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/.omc/skills/pypi-immutable-release-workflow.md +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/.omc/skills/terminal-output-hygiene-expertise.md +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/.pre-commit-config.yaml +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/.readthedocs.yml +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/AGENTS.md +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/AUTHORS.rst +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/CODE_OF_CONDUCT.md +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/CONTRIBUTING.rst +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/DESIGN.md +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/Dockerfile +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/LICENSE.txt +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/LOCAL_CI_GUIDE.md +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/README.md +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/RELEASE_NOTES.md +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/SECURITY.md +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/data/api.ffbb.app.json +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/data/api_update_summary.md +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/data/collections.json +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/data/endpoint_discovery.json +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/data/field_dictionary.json +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/data/indexes.json +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/data/meilisearch-prod.ffbb.app.json +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/data/openapi.json +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/data/openapi_full.json +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/data/type_discovery_corrections.json +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/docs/Makefile +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/docs/_static/.gitignore +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/docs/architecture.rst +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/docs/authors.rst +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/docs/changelog.rst +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/docs/conf.py +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/docs/contributing.rst +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/docs/data_dictionary.rst +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/docs/examples.rst +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/docs/index.rst +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/docs/license.rst +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/docs/migration.rst +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/docs/readme.rst +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/docs/requirements.txt +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/docs/test_strategy.md +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/docs/testing_conventions.md +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/examples/README.md +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/examples/complete_usage_example.py +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/examples/quick_start.py +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/examples/team_ranking_analysis.py +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/pyproject.toml +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/run-ci-locally.sh +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/scripts/benchmark_concurrent_pagination.py +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/scripts/benchmark_search_organisme.py +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/scripts/discover_endpoints.py +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/scripts/discover_types.py +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/setup.cfg +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/setup.py +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/__init__.py +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/clients/__init__.py +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/clients/_helpers.py +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/clients/_mixins/__init__.py +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/clients/_mixins/competition.py +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/clients/_mixins/external.py +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/clients/_mixins/getters.py +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/clients/_mixins/list_methods.py +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/clients/_mixins/organisme.py +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/clients/_rest_facade.py +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/clients/api_ffbb_app_client.py +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/clients/ffbb_data_client.py +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/clients/meilisearch_client.py +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/clients/meilisearch_ffbb_client.py +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/config.py +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/data/__init__.py +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/data/collections.json +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/data/endpoint_discovery.json +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/data/field_dictionary.json +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/data/indexes.json +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/data/openapi.json +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/exceptions.py +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/helpers/__init__.py +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/helpers/http_requests_helper.py +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/helpers/http_requests_utils.py +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/helpers/meilisearch_client_extension.py +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/helpers/multi_search_query_helper.py +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/helpers/normalization.py +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/__init__.py +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/affiche.py +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/cartographie.py +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/categorie.py +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/categorie_type.py +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/clock.py +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/club_contacts.py +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/code.py +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/commune.py +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/competition_fields.py +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/competition_id.py +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/competition_id_categorie.py +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/competition_id_sexe.py +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/competition_id_type_competition.py +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/competition_id_type_competition_generique.py +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/competition_origine.py +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/competition_origine_categorie.py +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/competition_origine_type_competition.py +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/competition_origine_type_competition_generique.py +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/competition_type.py +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/competitions_facet_distribution.py +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/competitions_facet_stats.py +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/competitions_hit.py +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/competitions_multi_search_query.py +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/competitions_query.py +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/configuration_models.py +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/contact_info.py +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/content_multi_search_query.py +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/coordonnees.py +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/coordonnees_type.py +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/document_flyer.py +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/document_flyer_type.py +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/engagement_contacts.py +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/engagements_facet_distribution.py +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/engagements_facet_stats.py +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/engagements_hit.py +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/engagements_multi_search_query.py +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/etat.py +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/external_competition_id.py +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/external_id.py +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/facet_distribution.py +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/facet_stats.py +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/field_set.py +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/folder.py +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/formation_session.py +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/formations_facet_distribution.py +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/formations_facet_stats.py +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/formations_hit.py +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/formations_multi_search_query.py +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/game_stats_model.py +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/game_stats_models.py +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/generic_search.py +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/geo.py +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/geo_sort_order.py +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/get_commune_response.py +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/get_competition_response.py +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/get_configuration_response.py +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/get_engagement_response.py +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/get_entraineur_response.py +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/get_formation_response.py +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/get_officiel_response.py +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/get_organisme_response.py +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/get_poule_response.py +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/get_pratique_response.py +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/get_rencontre_response.py +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/get_saisons_response.py +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/get_salle_response.py +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/get_terrain_response.py +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/get_tournoi_response.py +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/gradient_color.py +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/hit.py +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/id_engagement_equipe.py +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/id_organisme_equipe.py +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/id_organisme_equipe1_logo.py +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/id_poule.py +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/jour.py +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/label.py +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/labellisation.py +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/live.py +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/lives.py +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/logo.py +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/multi_search_queries.py +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/multi_search_query.py +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/multi_search_result_competitions.py +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/multi_search_result_engagements.py +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/multi_search_result_formations.py +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/multi_search_result_organismes.py +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/multi_search_result_pratiques.py +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/multi_search_result_rencontres.py +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/multi_search_result_salles.py +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/multi_search_result_terrains.py +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/multi_search_result_tournois.py +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/multi_search_results.py +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/multi_search_results_class.py +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/nature_sol.py +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/niveau.py +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/niveau_class.py +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/niveau_extractor.py +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/niveau_info.py +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/niveau_models.py +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/niveau_type.py +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/objectif.py +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/organisateur.py +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/organisateur_type.py +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/organisme_fields.py +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/organisme_id_pere.py +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/organismes_facet_distribution.py +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/organismes_facet_stats.py +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/organismes_hit.py +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/organismes_multi_search_query.py +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/organismes_query.py +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/phase_code.py +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/poule.py +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/poule_fields.py +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/poule_rencontre_item_model.py +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/poules_models.py +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/poules_query.py +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/pratique.py +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/pratiques_facet_distribution.py +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/pratiques_facet_stats.py +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/pratiques_hit.py +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/pratiques_hit_type.py +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/pratiques_multi_search_query.py +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/pratiques_type_class.py +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/publication_internet.py +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/purple_logo.py +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/query_fields_manager.py +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/ranking_engagement.py +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/rankings_models.py +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/rencontres_engagement.py +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/rencontres_facet_distribution.py +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/rencontres_facet_stats.py +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/rencontres_hit.py +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/rencontres_multi_search_query.py +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/saison.py +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/saison_fields.py +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/saisons_models.py +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/saisons_query.py +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/salle.py +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/salles_facet_distribution.py +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/salles_facet_stats.py +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/salles_hit.py +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/salles_multi_search_query.py +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/sexe.py +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/sexe_class.py +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/source.py +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/status.py +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/team_engagement.py +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/team_ranking.py +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/terrains_categorie_championnat_3x3_libelle.py +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/terrains_facet_distribution.py +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/terrains_facet_stats.py +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/terrains_hit.py +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/terrains_multi_search_query.py +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/terrains_name.py +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/terrains_sexe_enum.py +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/terrains_storage.py +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/tournoi_type_class.py +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/tournoi_type_enum.py +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/tournoi_types_3x3.py +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/tournoi_types_3x3_libelle.py +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/tournoi_types_3x3_libelle_enum.py +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/tournois_facet_distribution.py +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/tournois_facet_stats.py +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/tournois_hit.py +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/tournois_hit_type.py +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/tournois_libelle.py +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/tournois_multi_search_query.py +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/type_association.py +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/type_association_libelle.py +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/type_class.py +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/type_competition.py +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/type_competition_generique.py +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/type_enum.py +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/type_league.py +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/py.typed +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/utils/__init__.py +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/utils/cache_manager.py +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/utils/concurrency_utils.py +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/utils/converter_utils.py +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/utils/input_validation.py +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/utils/retry_utils.py +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/utils/secure_logging.py +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/utils/token_manager.py +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client.egg-info/dependency_links.txt +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client.egg-info/not-zip-safe +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client.egg-info/requires.txt +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client.egg-info/top_level.txt +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/tests/conftest.py +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/tests/e2e/__init__.py +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/tests/e2e/conftest.py +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/tests/integration/__init__.py +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/tests/integration/conftest.py +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/tests/integration/test_500_user_journey.py +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/tests/integration/test_501_user_journey_v3.py +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/tests/integration/test_502_enhanced_integration.py +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/tests/integration/test_503_secure_logging.py +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/tests/integration/test_504_input_validation.py +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/tests/integration/test_505_retry_timeout.py +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/tests/integration/test_506_raw_json_model_conversion.py +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/tests/unit/__init__.py +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/tests/unit/clients/__init__.py +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/tests/unit/clients/test_200_api_ffbb_app_client.py +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/tests/unit/clients/test_201_unit_tests_core.py +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/tests/unit/clients/test_202_meilisearch_client.py +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/tests/unit/clients/test_203_meilisearch_client_extension.py +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/tests/unit/clients/test_204_ffbb_data_client.py +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/tests/unit/clients/test_205_meilisearch_ffbb_client.py +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/tests/unit/clients/test_206_coverage_gaps_clients.py +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/tests/unit/clients/test_207_coverage_clients_extended.py +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/tests/unit/clients/test_208_new_methods_coverage.py +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/tests/unit/clients/test_209_automatic_token_resolution.py +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/tests/unit/clients/test_210_targeted_clients_helpers_coverage.py +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/tests/unit/clients/test_api_optimizations.py +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/tests/unit/clients/test_async_methods.py +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/tests/unit/clients/test_meilisearch_async.py +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/tests/unit/clients/test_search_many.py +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/tests/unit/clients/test_v3_new_features.py +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/tests/unit/clients/test_v4_aiter_and_contacts.py +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/tests/unit/clients/test_warm_cache.py +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/tests/unit/conftest.py +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/tests/unit/helpers/__init__.py +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/tests/unit/helpers/test_400_http_helpers.py +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/tests/unit/helpers/test_meilisearch_client_extension_recursive_pagination.py +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/tests/unit/helpers/test_meilisearch_pagination_concurrent.py +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/tests/unit/helpers/test_normalization.py +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/tests/unit/models/__init__.py +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/tests/unit/models/test_100_competition_id_categorie.py +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/tests/unit/models/test_101_competition_id_sexe.py +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/tests/unit/models/test_102_competition_id_type_competition.py +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/tests/unit/models/test_103_competition_id_type_competition_generique.py +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/tests/unit/models/test_104_competition_origine_categorie.py +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/tests/unit/models/test_105_competition_origine_type_competition_generique.py +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/tests/unit/models/test_106_competition_origine.py +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/tests/unit/models/test_107_id_engagement_equipe.py +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/tests/unit/models/test_108_id_organisme_equipe.py +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/tests/unit/models/test_109_id_organisme_equipe1_logo.py +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/tests/unit/models/test_110_labellisation.py +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/tests/unit/models/test_111_niveau_class.py +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/tests/unit/models/test_112_purple_logo.py +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/tests/unit/models/test_113_salle.py +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/tests/unit/models/test_114_tournoi_type_class.py +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/tests/unit/models/test_115_type_association_libelle.py +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/tests/unit/models/test_116_type_competition_generique.py +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/tests/unit/models/test_117_organisateur.py +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/tests/unit/models/test_118_competition_id.py +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/tests/unit/models/test_119_terrains_inner_models.py +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/tests/unit/models/test_120_pratiques_inner_models.py +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/tests/unit/models/test_121_to_dict_round_trip.py +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/tests/unit/models/test_122_coverage_gaps.py +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/tests/unit/models/test_123_missing_coverage.py +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/tests/unit/models/test_123_v2_backport.py +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/tests/unit/models/test_124_targeted_coverage_gains.py +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/tests/unit/models/test_dx_aliases.py +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/tests/unit/test_310_discover_endpoints.py +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/tests/unit/test_311_normalize_team_name.py +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/tests/unit/test_312_api_cors.py +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/tests/unit/utils/__init__.py +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/tests/unit/utils/test_300_secure_logging.py +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/tests/unit/utils/test_301_input_validation.py +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/tests/unit/utils/test_302_retry_utils.py +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/tests/unit/utils/test_303_cache_manager.py +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/tests/unit/utils/test_304_config.py +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/tests/unit/utils/test_305_token_manager.py +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/tests/unit/utils/test_306_converter_utils.py +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/tests/unit/utils/test_307_coverage_gaps_utils.py +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/tests/unit/utils/test_308_converter_utils_extended.py +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/tests/unit/utils/test_309_concurrency_utils.py +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/tools/update_agents_md.py +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/tox.ini +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/website/assets/apple-touch-icon.png +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/website/assets/favicon-192x192.png +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/website/assets/favicon-48x48.png +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/website/assets/favicon-96x96.png +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/website/assets/favicon.ico +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/website/assets/logo.webp +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/website/css/style.css +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/website/favicon.ico +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/website/index.html +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/website/llms-full.txt +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/website/llms.txt +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/website/robots.txt +0 -0
- {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/website/sitemap.xml +0 -0
|
@@ -7,6 +7,12 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
7
7
|
|
|
8
8
|
## [Unreleased]
|
|
9
9
|
|
|
10
|
+
## [2.4.25] - 2026-09-17
|
|
11
|
+
|
|
12
|
+
### Features & Parity
|
|
13
|
+
- **SDK Search Async Parity**: Standardisation de toutes les méthodes de recherche asynchrones (`search_organismes_async`, `search_competitions_async`, `search_pratiques_async`, `search_salles_async`, `search_terrains_async`, `search_tournois_async`, `search_engagements_async`, `search_formations_async`) avec support complet de `filter`, `sort` et `limit` (pagination).
|
|
14
|
+
- **FastAPI Prometheus Monitoring**: Ajout d'un middleware de métriques et de l'endpoint `/metrics` officiel Prometheus pour le monitoring de la latence (histogram), du débit de requêtes, des jauges de requêtes en cours et de l'état des caches mémoires.
|
|
15
|
+
|
|
10
16
|
## [2.4.6] - 2026-08-29
|
|
11
17
|
|
|
12
18
|
### Performance & Modern Standards (FastAPI Lifespan)
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: ffbb-data-client
|
|
3
|
-
Version: 2.4.
|
|
3
|
+
Version: 2.4.25
|
|
4
4
|
Summary: API FFBB — SDK Python moderne & asynchrone pour les donnees officielles de la Federation Francaise de BasketBall (clubs, classements, calendriers, lives, Meilisearch). Alternative moderne a ffbb-api-client.
|
|
5
5
|
Home-page: https://github.com/nickdesi/ffbb-data-client
|
|
6
6
|
Author: nickdesi
|
|
@@ -7,9 +7,11 @@ Swagger UI at /swagger, ReDoc at /redoc, and hosts the official website at /.
|
|
|
7
7
|
from __future__ import annotations
|
|
8
8
|
|
|
9
9
|
import asyncio
|
|
10
|
+
import bisect
|
|
10
11
|
import logging
|
|
11
12
|
import os
|
|
12
13
|
import re
|
|
14
|
+
import threading
|
|
13
15
|
import time
|
|
14
16
|
from collections import OrderedDict
|
|
15
17
|
from contextlib import asynccontextmanager
|
|
@@ -95,7 +97,7 @@ l'ensemble des données publiques de la **Fédération Française de BasketBall*
|
|
|
95
97
|
- ⭐ **Code Source GitHub** : [`https://github.com/nickdesi/ffbb-data-client`](https://github.com/nickdesi/ffbb-data-client)
|
|
96
98
|
- 📖 **Documentation Sphinx complète** : [`https://nickdesi.github.io/ffbb-data-client/`](https://nickdesi.github.io/ffbb-data-client/)
|
|
97
99
|
""",
|
|
98
|
-
version="2.4.
|
|
100
|
+
version="2.4.25",
|
|
99
101
|
openapi_tags=TAGS_METADATA,
|
|
100
102
|
docs_url=None,
|
|
101
103
|
redoc_url=None,
|
|
@@ -126,6 +128,48 @@ app.add_middleware(
|
|
|
126
128
|
allow_headers=["*"],
|
|
127
129
|
)
|
|
128
130
|
|
|
131
|
+
# ---------------------------------------------------------------------------
|
|
132
|
+
# Prometheus Metrics State & Middleware
|
|
133
|
+
# ---------------------------------------------------------------------------
|
|
134
|
+
_API_START_TIME = time.time()
|
|
135
|
+
_LATENCY_BUCKETS = (0.005, 0.01, 0.025, 0.05, 0.1, 0.25, 0.5, 1.0, 2.5, 5.0, 10.0)
|
|
136
|
+
_http_requests: dict[tuple[str, str, int], int] = {}
|
|
137
|
+
_http_latency_bucket_counts: list[int] = [0] * (len(_LATENCY_BUCKETS) + 1)
|
|
138
|
+
_http_latency_sum: float = 0.0
|
|
139
|
+
_http_latency_count: int = 0
|
|
140
|
+
_http_inflight: int = 0
|
|
141
|
+
_metrics_lock = threading.Lock()
|
|
142
|
+
|
|
143
|
+
|
|
144
|
+
@app.middleware("http")
|
|
145
|
+
async def prometheus_metrics_middleware(request: Request, call_next):
|
|
146
|
+
global _http_inflight, _http_latency_sum, _http_latency_count
|
|
147
|
+
with _metrics_lock:
|
|
148
|
+
_http_inflight += 1
|
|
149
|
+
t0 = time.perf_counter()
|
|
150
|
+
status_code = 500
|
|
151
|
+
try:
|
|
152
|
+
response = await call_next(request)
|
|
153
|
+
status_code = response.status_code
|
|
154
|
+
return response
|
|
155
|
+
finally:
|
|
156
|
+
latency = time.perf_counter() - t0
|
|
157
|
+
path = request.url.path
|
|
158
|
+
# Normalize dynamic numeric IDs to prevent metric cardinality explosion
|
|
159
|
+
norm_path = re.sub(r"/\d+", "/{id}", path)
|
|
160
|
+
method = request.method
|
|
161
|
+
with _metrics_lock:
|
|
162
|
+
_http_inflight -= 1
|
|
163
|
+
key = (method, norm_path, status_code)
|
|
164
|
+
_http_requests[key] = _http_requests.get(key, 0) + 1
|
|
165
|
+
_http_latency_sum += latency
|
|
166
|
+
_http_latency_count += 1
|
|
167
|
+
idx = bisect.bisect_left(_LATENCY_BUCKETS, latency)
|
|
168
|
+
if idx < len(_LATENCY_BUCKETS):
|
|
169
|
+
_http_latency_bucket_counts[idx] += 1
|
|
170
|
+
_http_latency_bucket_counts[len(_LATENCY_BUCKETS)] += 1
|
|
171
|
+
|
|
172
|
+
|
|
129
173
|
# Global Client Singleton
|
|
130
174
|
_client: FFBBDataClient | None = None
|
|
131
175
|
|
|
@@ -550,6 +594,70 @@ async def health_head():
|
|
|
550
594
|
return Response(status_code=200)
|
|
551
595
|
|
|
552
596
|
|
|
597
|
+
@app.get(
|
|
598
|
+
"/metrics",
|
|
599
|
+
tags=["Monitoring & Diagnostic"],
|
|
600
|
+
summary="Métriques Prometheus de l'API (/metrics)",
|
|
601
|
+
response_class=Response,
|
|
602
|
+
)
|
|
603
|
+
async def metrics():
|
|
604
|
+
"""Expose les métriques temps réel du serveur au format officiel Prometheus."""
|
|
605
|
+
with _metrics_lock:
|
|
606
|
+
uptime = time.time() - _API_START_TIME
|
|
607
|
+
requests = dict(_http_requests)
|
|
608
|
+
lat_buckets = list(_http_latency_bucket_counts)
|
|
609
|
+
lat_sum = _http_latency_sum
|
|
610
|
+
lat_count = _http_latency_count
|
|
611
|
+
inflight = _http_inflight
|
|
612
|
+
|
|
613
|
+
lines: list[str] = [
|
|
614
|
+
"# HELP ffbb_api_uptime_seconds Uptime du serveur API en secondes",
|
|
615
|
+
"# TYPE ffbb_api_uptime_seconds gauge",
|
|
616
|
+
f"ffbb_api_uptime_seconds {uptime:.2f}",
|
|
617
|
+
"",
|
|
618
|
+
"# HELP ffbb_api_http_requests_total Total des requetes HTTP reçues par methode, route et statut",
|
|
619
|
+
"# TYPE ffbb_api_http_requests_total counter",
|
|
620
|
+
]
|
|
621
|
+
for (method, path, status), count in sorted(requests.items()):
|
|
622
|
+
lines.append(
|
|
623
|
+
f'ffbb_api_http_requests_total{{method="{method}",path="{path}",status="{status}"}} {count}'
|
|
624
|
+
)
|
|
625
|
+
|
|
626
|
+
lines += [
|
|
627
|
+
"",
|
|
628
|
+
"# HELP ffbb_api_http_latency_seconds Latence des requetes HTTP en secondes",
|
|
629
|
+
"# TYPE ffbb_api_http_latency_seconds histogram",
|
|
630
|
+
]
|
|
631
|
+
cumulative = 0
|
|
632
|
+
for i, bound in enumerate(_LATENCY_BUCKETS):
|
|
633
|
+
cumulative += lat_buckets[i]
|
|
634
|
+
lines.append(
|
|
635
|
+
f'ffbb_api_http_latency_seconds_bucket{{le="{bound}"}} {cumulative}'
|
|
636
|
+
)
|
|
637
|
+
lines.append(f'ffbb_api_http_latency_seconds_bucket{{le="+Inf"}} {lat_count}')
|
|
638
|
+
lines.append(f"ffbb_api_http_latency_seconds_sum {lat_sum:.4f}")
|
|
639
|
+
lines.append(f"ffbb_api_http_latency_seconds_count {lat_count}")
|
|
640
|
+
|
|
641
|
+
lines += [
|
|
642
|
+
"",
|
|
643
|
+
"# HELP ffbb_api_http_inflight_requests Requetes HTTP actuellement en cours d'execution",
|
|
644
|
+
"# TYPE ffbb_api_http_inflight_requests gauge",
|
|
645
|
+
f"ffbb_api_http_inflight_requests {inflight}",
|
|
646
|
+
"",
|
|
647
|
+
"# HELP ffbb_api_cache_entries Nombre d'elements dans les caches LRU en memoire",
|
|
648
|
+
"# TYPE ffbb_api_cache_entries gauge",
|
|
649
|
+
f'ffbb_api_cache_entries{{cache="organisme"}} {len(_org_cache._cache)}',
|
|
650
|
+
f'ffbb_api_cache_entries{{cache="logo"}} {len(_logo_cache._cache)}',
|
|
651
|
+
f'ffbb_api_cache_entries{{cache="salle"}} {len(_salle_cache._cache)}',
|
|
652
|
+
"",
|
|
653
|
+
]
|
|
654
|
+
|
|
655
|
+
return Response(
|
|
656
|
+
content="\n".join(lines) + "\n",
|
|
657
|
+
media_type="text/plain; version=0.0.4; charset=utf-8",
|
|
658
|
+
)
|
|
659
|
+
|
|
660
|
+
|
|
553
661
|
@app.get(
|
|
554
662
|
"/api/v1/search",
|
|
555
663
|
tags=["Recherche & Meilisearch"],
|
{ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/clients/_search_facade.py
RENAMED
|
@@ -137,18 +137,20 @@ class _SearchFacade:
|
|
|
137
137
|
)
|
|
138
138
|
|
|
139
139
|
async def search_competitions_async(
|
|
140
|
-
self,
|
|
140
|
+
self,
|
|
141
|
+
name: str | None = None,
|
|
142
|
+
filter: list[str] | None = None,
|
|
143
|
+
sort: list[str] | None = None,
|
|
144
|
+
limit: int | None = 10,
|
|
141
145
|
) -> CompetitionsMultiSearchResult | None:
|
|
142
146
|
"""Search for competitions asynchronously."""
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
cast(CompetitionsMultiSearchResult, results.results[0])
|
|
149
|
-
if results and results.results
|
|
150
|
-
else None
|
|
147
|
+
results = await self.search_multiple_competitions_async(
|
|
148
|
+
[name] if name is not None else None,
|
|
149
|
+
filter=filter,
|
|
150
|
+
sort=sort,
|
|
151
|
+
limit=limit,
|
|
151
152
|
)
|
|
153
|
+
return results[0] if results else None
|
|
152
154
|
|
|
153
155
|
async def search_multiple_competitions_async(
|
|
154
156
|
self,
|
|
@@ -247,18 +249,20 @@ class _SearchFacade:
|
|
|
247
249
|
)
|
|
248
250
|
|
|
249
251
|
async def search_organismes_async(
|
|
250
|
-
self,
|
|
252
|
+
self,
|
|
253
|
+
name: str | None = None,
|
|
254
|
+
filter: list[str] | None = None,
|
|
255
|
+
sort: list[str] | None = None,
|
|
256
|
+
limit: int | None = 10,
|
|
251
257
|
) -> OrganismesMultiSearchResult | None:
|
|
252
258
|
"""Search for organismes asynchronously."""
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
cast(OrganismesMultiSearchResult, results.results[0])
|
|
259
|
-
if results and results.results
|
|
260
|
-
else None
|
|
259
|
+
results = await self.search_multiple_organismes_async(
|
|
260
|
+
[name] if name is not None else None,
|
|
261
|
+
filter=filter,
|
|
262
|
+
sort=sort,
|
|
263
|
+
limit=limit,
|
|
261
264
|
)
|
|
265
|
+
return results[0] if results else None
|
|
262
266
|
|
|
263
267
|
async def search_multiple_organismes_async(
|
|
264
268
|
self,
|
|
@@ -324,18 +328,20 @@ class _SearchFacade:
|
|
|
324
328
|
)
|
|
325
329
|
|
|
326
330
|
async def search_pratiques_async(
|
|
327
|
-
self,
|
|
331
|
+
self,
|
|
332
|
+
name: str | None = None,
|
|
333
|
+
filter: list[str] | None = None,
|
|
334
|
+
sort: list[str] | None = None,
|
|
335
|
+
limit: int | None = 10,
|
|
328
336
|
) -> PratiquesMultiSearchResult | None:
|
|
329
337
|
"""Search for pratiques asynchronously."""
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
cast(PratiquesMultiSearchResult, results.results[0])
|
|
336
|
-
if results and results.results
|
|
337
|
-
else None
|
|
338
|
+
results = await self.search_multiple_pratiques_async(
|
|
339
|
+
[name] if name is not None else None,
|
|
340
|
+
filter=filter,
|
|
341
|
+
sort=sort,
|
|
342
|
+
limit=limit,
|
|
338
343
|
)
|
|
344
|
+
return results[0] if results else None
|
|
339
345
|
|
|
340
346
|
async def search_multiple_pratiques_async(
|
|
341
347
|
self,
|
|
@@ -524,18 +530,20 @@ class _SearchFacade:
|
|
|
524
530
|
return cast(list[SallesMultiSearchResult], results.results) if results else None
|
|
525
531
|
|
|
526
532
|
async def search_salles_async(
|
|
527
|
-
self,
|
|
533
|
+
self,
|
|
534
|
+
name: str | None = None,
|
|
535
|
+
filter: list[str] | None = None,
|
|
536
|
+
sort: list[str] | None = None,
|
|
537
|
+
limit: int | None = 10,
|
|
528
538
|
) -> SallesMultiSearchResult | None:
|
|
529
539
|
"""Search for salles asynchronously."""
|
|
530
|
-
|
|
531
|
-
|
|
532
|
-
|
|
533
|
-
|
|
534
|
-
|
|
535
|
-
cast(SallesMultiSearchResult, results.results[0])
|
|
536
|
-
if results and results.results
|
|
537
|
-
else None
|
|
540
|
+
results = await self.search_multiple_salles_async(
|
|
541
|
+
[name] if name is not None else None,
|
|
542
|
+
filter=filter,
|
|
543
|
+
sort=sort,
|
|
544
|
+
limit=limit,
|
|
538
545
|
)
|
|
546
|
+
return results[0] if results else None
|
|
539
547
|
|
|
540
548
|
async def search_multiple_salles_async(
|
|
541
549
|
self,
|
|
@@ -597,18 +605,20 @@ class _SearchFacade:
|
|
|
597
605
|
)
|
|
598
606
|
|
|
599
607
|
async def search_terrains_async(
|
|
600
|
-
self,
|
|
608
|
+
self,
|
|
609
|
+
name: str | None = None,
|
|
610
|
+
filter: list[str] | None = None,
|
|
611
|
+
sort: list[str] | None = None,
|
|
612
|
+
limit: int | None = 10,
|
|
601
613
|
) -> TerrainsMultiSearchResult | None:
|
|
602
614
|
"""Search for terrains asynchronously."""
|
|
603
|
-
|
|
604
|
-
|
|
605
|
-
|
|
606
|
-
|
|
607
|
-
|
|
608
|
-
cast(TerrainsMultiSearchResult, results.results[0])
|
|
609
|
-
if results and results.results
|
|
610
|
-
else None
|
|
615
|
+
results = await self.search_multiple_terrains_async(
|
|
616
|
+
[name] if name is not None else None,
|
|
617
|
+
filter=filter,
|
|
618
|
+
sort=sort,
|
|
619
|
+
limit=limit,
|
|
611
620
|
)
|
|
621
|
+
return results[0] if results else None
|
|
612
622
|
|
|
613
623
|
async def search_multiple_terrains_async(
|
|
614
624
|
self,
|
|
@@ -672,18 +682,20 @@ class _SearchFacade:
|
|
|
672
682
|
)
|
|
673
683
|
|
|
674
684
|
async def search_tournois_async(
|
|
675
|
-
self,
|
|
685
|
+
self,
|
|
686
|
+
name: str | None = None,
|
|
687
|
+
filter: list[str] | None = None,
|
|
688
|
+
sort: list[str] | None = None,
|
|
689
|
+
limit: int | None = 10,
|
|
676
690
|
) -> TournoisMultiSearchResult | None:
|
|
677
691
|
"""Search for tournois asynchronously."""
|
|
678
|
-
|
|
679
|
-
|
|
680
|
-
|
|
681
|
-
|
|
682
|
-
|
|
683
|
-
cast(TournoisMultiSearchResult, results.results[0])
|
|
684
|
-
if results and results.results
|
|
685
|
-
else None
|
|
692
|
+
results = await self.search_multiple_tournois_async(
|
|
693
|
+
[name] if name is not None else None,
|
|
694
|
+
filter=filter,
|
|
695
|
+
sort=sort,
|
|
696
|
+
limit=limit,
|
|
686
697
|
)
|
|
698
|
+
return results[0] if results else None
|
|
687
699
|
|
|
688
700
|
async def search_multiple_tournois_async(
|
|
689
701
|
self,
|
|
@@ -791,18 +803,20 @@ class _SearchFacade:
|
|
|
791
803
|
)
|
|
792
804
|
|
|
793
805
|
async def search_engagements_async(
|
|
794
|
-
self,
|
|
806
|
+
self,
|
|
807
|
+
name: str | None = None,
|
|
808
|
+
filter: list[str] | None = None,
|
|
809
|
+
sort: list[str] | None = None,
|
|
810
|
+
limit: int | None = 10,
|
|
795
811
|
) -> EngagementsMultiSearchResult | None:
|
|
796
812
|
"""Search for engagements asynchronously."""
|
|
797
|
-
|
|
798
|
-
|
|
799
|
-
|
|
800
|
-
|
|
801
|
-
|
|
802
|
-
cast(EngagementsMultiSearchResult, results.results[0])
|
|
803
|
-
if results and results.results
|
|
804
|
-
else None
|
|
813
|
+
results = await self.search_multiple_engagements_async(
|
|
814
|
+
[name] if name is not None else None,
|
|
815
|
+
filter=filter,
|
|
816
|
+
sort=sort,
|
|
817
|
+
limit=limit,
|
|
805
818
|
)
|
|
819
|
+
return results[0] if results else None
|
|
806
820
|
|
|
807
821
|
async def search_multiple_engagements_async(
|
|
808
822
|
self,
|
|
@@ -870,18 +884,20 @@ class _SearchFacade:
|
|
|
870
884
|
)
|
|
871
885
|
|
|
872
886
|
async def search_formations_async(
|
|
873
|
-
self,
|
|
887
|
+
self,
|
|
888
|
+
name: str | None = None,
|
|
889
|
+
filter: list[str] | None = None,
|
|
890
|
+
sort: list[str] | None = None,
|
|
891
|
+
limit: int | None = 10,
|
|
874
892
|
) -> FormationsMultiSearchResult | None:
|
|
875
893
|
"""Search for formations asynchronously."""
|
|
876
|
-
|
|
877
|
-
|
|
878
|
-
|
|
879
|
-
|
|
880
|
-
|
|
881
|
-
cast(FormationsMultiSearchResult, results.results[0])
|
|
882
|
-
if results and results.results
|
|
883
|
-
else None
|
|
894
|
+
results = await self.search_multiple_formations_async(
|
|
895
|
+
[name] if name is not None else None,
|
|
896
|
+
filter=filter,
|
|
897
|
+
sort=sort,
|
|
898
|
+
limit=limit,
|
|
884
899
|
)
|
|
900
|
+
return results[0] if results else None
|
|
885
901
|
|
|
886
902
|
async def search_multiple_formations_async(
|
|
887
903
|
self,
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: ffbb-data-client
|
|
3
|
-
Version: 2.4.
|
|
3
|
+
Version: 2.4.25
|
|
4
4
|
Summary: API FFBB — SDK Python moderne & asynchrone pour les donnees officielles de la Federation Francaise de BasketBall (clubs, classements, calendriers, lives, Meilisearch). Alternative moderne a ffbb-api-client.
|
|
5
5
|
Home-page: https://github.com/nickdesi/ffbb-data-client
|
|
6
6
|
Author: nickdesi
|
{ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client.egg-info/SOURCES.txt
RENAMED
|
@@ -315,6 +315,7 @@ tests/unit/conftest.py
|
|
|
315
315
|
tests/unit/test_310_discover_endpoints.py
|
|
316
316
|
tests/unit/test_311_normalize_team_name.py
|
|
317
317
|
tests/unit/test_312_api_cors.py
|
|
318
|
+
tests/unit/test_313_api_metrics.py
|
|
318
319
|
tests/unit/clients/__init__.py
|
|
319
320
|
tests/unit/clients/test_200_api_ffbb_app_client.py
|
|
320
321
|
tests/unit/clients/test_201_unit_tests_core.py
|
{ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client.egg-info/scm_file_list.json
RENAMED
|
@@ -361,6 +361,7 @@
|
|
|
361
361
|
"tests/unit/test_310_discover_endpoints.py",
|
|
362
362
|
"tests/unit/test_311_normalize_team_name.py",
|
|
363
363
|
"tests/unit/test_312_api_cors.py",
|
|
364
|
+
"tests/unit/test_313_api_metrics.py",
|
|
364
365
|
"tests/unit/utils/__init__.py",
|
|
365
366
|
"tests/unit/utils/test_300_secure_logging.py",
|
|
366
367
|
"tests/unit/utils/test_301_input_validation.py",
|
{ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/tests/unit/clients/test_v2_backport_search.py
RENAMED
|
@@ -122,3 +122,53 @@ class TestV2BackportSearch(unittest.TestCase):
|
|
|
122
122
|
mock_rms.assert_called_once()
|
|
123
123
|
queries = mock_rms.call_args[0][0]
|
|
124
124
|
self.assertEqual(queries[0].limit, 3)
|
|
125
|
+
|
|
126
|
+
|
|
127
|
+
class TestV2BackportSearchAsync(unittest.IsolatedAsyncioTestCase):
|
|
128
|
+
"""Async tests for search_*_async filter/sort/limit parameters."""
|
|
129
|
+
|
|
130
|
+
async def asyncSetUp(self) -> None:
|
|
131
|
+
with patch("ffbb_data_client.clients.meilisearch_client.CacheManager"):
|
|
132
|
+
api_client = MagicMock(spec=ApiFFBBAppClient)
|
|
133
|
+
api_client.cached_session = None
|
|
134
|
+
api_client.async_cached_session = None
|
|
135
|
+
meilisearch_client = MeilisearchFFBBClient(bearer_token="test-token")
|
|
136
|
+
self.client = FFBBDataClient(api_client, meilisearch_client)
|
|
137
|
+
|
|
138
|
+
def _make_mock_results(self, result_mock: MagicMock) -> MultiSearchResults:
|
|
139
|
+
results = MagicMock(spec=MultiSearchResults)
|
|
140
|
+
results.results = [result_mock]
|
|
141
|
+
return results
|
|
142
|
+
|
|
143
|
+
@patch.object(MeilisearchFFBBClient, "recursive_smart_multi_search_async")
|
|
144
|
+
async def test_search_organismes_async_with_limit_and_filter(
|
|
145
|
+
self, mock_rms_async: MagicMock
|
|
146
|
+
) -> None:
|
|
147
|
+
mock_result = MagicMock(spec=OrganismesMultiSearchResult)
|
|
148
|
+
mock_rms_async.return_value = self._make_mock_results(mock_result)
|
|
149
|
+
|
|
150
|
+
result = await self.client.search_organismes_async(
|
|
151
|
+
"Clermont",
|
|
152
|
+
filter=['codePostal = "63000"'],
|
|
153
|
+
sort=["nom:asc"],
|
|
154
|
+
limit=5,
|
|
155
|
+
)
|
|
156
|
+
self.assertIsNotNone(result)
|
|
157
|
+
mock_rms_async.assert_called_once()
|
|
158
|
+
queries = mock_rms_async.call_args[0][0]
|
|
159
|
+
self.assertEqual(queries[0].limit, 5)
|
|
160
|
+
self.assertEqual(queries[0].filter, ['codePostal = "63000"'])
|
|
161
|
+
self.assertEqual(queries[0].sort, ["nom:asc"])
|
|
162
|
+
|
|
163
|
+
@patch.object(MeilisearchFFBBClient, "recursive_smart_multi_search_async")
|
|
164
|
+
async def test_search_competitions_async_with_limit(
|
|
165
|
+
self, mock_rms_async: MagicMock
|
|
166
|
+
) -> None:
|
|
167
|
+
mock_result = MagicMock(spec=CompetitionsMultiSearchResult)
|
|
168
|
+
mock_rms_async.return_value = self._make_mock_results(mock_result)
|
|
169
|
+
|
|
170
|
+
result = await self.client.search_competitions_async("U13", limit=7)
|
|
171
|
+
self.assertIsNotNone(result)
|
|
172
|
+
mock_rms_async.assert_called_once()
|
|
173
|
+
queries = mock_rms_async.call_args[0][0]
|
|
174
|
+
self.assertEqual(queries[0].limit, 7)
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
"""Unit tests for Prometheus /metrics endpoint on FastAPI API."""
|
|
2
|
+
|
|
3
|
+
import httpx
|
|
4
|
+
import pytest
|
|
5
|
+
|
|
6
|
+
from ffbb_data_client.api import app
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
@pytest.mark.asyncio
|
|
10
|
+
async def test_metrics_endpoint_returns_valid_prometheus_format():
|
|
11
|
+
"""Verify that /metrics endpoint returns 200 with standard Prometheus exposition format."""
|
|
12
|
+
async with httpx.AsyncClient(
|
|
13
|
+
transport=httpx.ASGITransport(app=app), base_url="http://test"
|
|
14
|
+
) as client:
|
|
15
|
+
# Trigger an endpoint to record metrics
|
|
16
|
+
health_resp = await client.get("/health")
|
|
17
|
+
assert health_resp.status_code == 200
|
|
18
|
+
|
|
19
|
+
# Now query /metrics
|
|
20
|
+
metrics_resp = await client.get("/metrics")
|
|
21
|
+
assert metrics_resp.status_code == 200
|
|
22
|
+
assert "text/plain" in metrics_resp.headers.get("content-type", "")
|
|
23
|
+
|
|
24
|
+
text = metrics_resp.text
|
|
25
|
+
assert "ffbb_api_uptime_seconds" in text
|
|
26
|
+
assert "ffbb_api_http_requests_total" in text
|
|
27
|
+
assert "ffbb_api_http_latency_seconds_bucket" in text
|
|
28
|
+
assert "ffbb_api_http_latency_seconds_sum" in text
|
|
29
|
+
assert "ffbb_api_http_latency_seconds_count" in text
|
|
30
|
+
assert "ffbb_api_http_inflight_requests" in text
|
|
31
|
+
assert "ffbb_api_cache_entries" in text
|
|
32
|
+
assert 'path="/health"' in text
|
|
33
|
+
assert 'status="200"' in text
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/.github/ISSUE_TEMPLATE/feature_request.yml
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/.github/workflows/check_wrapper_parity.yml
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/.github/workflows/update-ffbb-api-discovery.yml
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/.omc/skills/pypi-immutable-release-workflow.md
RENAMED
|
File without changes
|
{ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/.omc/skills/terminal-output-hygiene-expertise.md
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|