ffbb-data-client 2.1.0__tar.gz → 2.3.0__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.3.0/.agents/rules/antigravity-rtk-rules.md +32 -0
- {ffbb_data_client-2.1.0 → ffbb_data_client-2.3.0}/.github/scripts/check_wrapper_parity.py +17 -4
- {ffbb_data_client-2.1.0 → ffbb_data_client-2.3.0}/.github/workflows/update-ffbb-api-discovery.yml +1 -1
- ffbb_data_client-2.3.0/AGENTS.md +260 -0
- {ffbb_data_client-2.1.0 → ffbb_data_client-2.3.0}/CHANGELOG.md +33 -0
- {ffbb_data_client-2.1.0 → ffbb_data_client-2.3.0}/CONTRIBUTING.rst +0 -25
- {ffbb_data_client-2.1.0/src/ffbb_data_client.egg-info → ffbb_data_client-2.3.0}/PKG-INFO +33 -8
- {ffbb_data_client-2.1.0 → ffbb_data_client-2.3.0}/README.md +31 -6
- {ffbb_data_client-2.1.0 → ffbb_data_client-2.3.0}/RELEASE_NOTES.md +26 -1
- ffbb_data_client-2.3.0/data/api_update_summary.md +30 -0
- {ffbb_data_client-2.1.0 → ffbb_data_client-2.3.0}/data/collections.json +20 -11
- {ffbb_data_client-2.1.0/src/ffbb_data_client → ffbb_data_client-2.3.0}/data/endpoint_discovery.json +64 -22
- {ffbb_data_client-2.1.0/src/ffbb_data_client → ffbb_data_client-2.3.0}/data/indexes.json +8 -7
- {ffbb_data_client-2.1.0 → ffbb_data_client-2.3.0}/data/openapi.json +564 -1
- {ffbb_data_client-2.1.0 → ffbb_data_client-2.3.0}/data/openapi_full.json +689 -15
- {ffbb_data_client-2.1.0 → ffbb_data_client-2.3.0}/docs/conf.py +1 -4
- {ffbb_data_client-2.1.0 → ffbb_data_client-2.3.0}/examples/team_ranking_analysis.py +2 -3
- {ffbb_data_client-2.1.0 → ffbb_data_client-2.3.0}/pyproject.toml +1 -0
- {ffbb_data_client-2.1.0 → ffbb_data_client-2.3.0/scripts}/benchmark_search_organisme.py +1 -1
- {ffbb_data_client-2.1.0 → ffbb_data_client-2.3.0}/scripts/discover_endpoints.py +194 -13
- {ffbb_data_client-2.1.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/clients/__init__.py +4 -0
- ffbb_data_client-2.1.0/src/ffbb_data_client/clients/ffbb_data_client.py → ffbb_data_client-2.3.0/src/ffbb_data_client/clients/_rest_facade.py +349 -1539
- ffbb_data_client-2.3.0/src/ffbb_data_client/clients/_search_facade.py +1046 -0
- ffbb_data_client-2.3.0/src/ffbb_data_client/clients/ffbb_data_client.py +266 -0
- {ffbb_data_client-2.1.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/data/collections.json +20 -11
- {ffbb_data_client-2.1.0 → ffbb_data_client-2.3.0/src/ffbb_data_client}/data/endpoint_discovery.json +64 -22
- {ffbb_data_client-2.1.0 → ffbb_data_client-2.3.0/src/ffbb_data_client}/data/indexes.json +8 -7
- {ffbb_data_client-2.1.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/data/openapi.json +564 -1
- {ffbb_data_client-2.1.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/data/openapi_full.json +689 -15
- {ffbb_data_client-2.1.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/get_competition_response.py +0 -1
- {ffbb_data_client-2.1.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/get_organisme_response.py +0 -2
- {ffbb_data_client-2.1.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/utils/cache_manager.py +2 -2
- {ffbb_data_client-2.1.0 → ffbb_data_client-2.3.0/src/ffbb_data_client.egg-info}/PKG-INFO +33 -8
- {ffbb_data_client-2.1.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client.egg-info/SOURCES.txt +7 -1
- {ffbb_data_client-2.1.0 → ffbb_data_client-2.3.0}/tests/integration/test_504_input_validation.py +26 -19
- {ffbb_data_client-2.1.0 → ffbb_data_client-2.3.0}/tests/integration/test_505_retry_timeout.py +3 -2
- {ffbb_data_client-2.1.0 → ffbb_data_client-2.3.0}/tests/unit/clients/test_201_unit_tests_core.py +12 -10
- {ffbb_data_client-2.1.0 → ffbb_data_client-2.3.0}/tests/unit/clients/test_210_targeted_clients_helpers_coverage.py +11 -9
- ffbb_data_client-2.3.0/tests/unit/utils/test_308_converter_utils_extended.py +239 -0
- ffbb_data_client-2.3.0/tools/update_agents_md.py +219 -0
- {ffbb_data_client-2.1.0 → ffbb_data_client-2.3.0}/tox.ini +1 -1
- ffbb_data_client-2.1.0/data/api_update_summary.md +0 -24
- {ffbb_data_client-2.1.0 → ffbb_data_client-2.3.0}/.coveragerc +0 -0
- {ffbb_data_client-2.1.0 → ffbb_data_client-2.3.0}/.github/dependabot.yml +0 -0
- {ffbb_data_client-2.1.0 → ffbb_data_client-2.3.0}/.github/workflows/check_wrapper_parity.yml +0 -0
- {ffbb_data_client-2.1.0 → ffbb_data_client-2.3.0}/.github/workflows/ci.yml +0 -0
- {ffbb_data_client-2.1.0 → ffbb_data_client-2.3.0}/.github/workflows/codeql.yml +0 -0
- {ffbb_data_client-2.1.0 → ffbb_data_client-2.3.0}/.github/workflows/deploy-pages.yml +0 -0
- {ffbb_data_client-2.1.0 → ffbb_data_client-2.3.0}/.github/workflows/publish.yml +0 -0
- {ffbb_data_client-2.1.0 → ffbb_data_client-2.3.0}/.github/workflows/release-after-discovery-merge.yml +0 -0
- {ffbb_data_client-2.1.0 → ffbb_data_client-2.3.0}/.gitignore +0 -0
- {ffbb_data_client-2.1.0 → ffbb_data_client-2.3.0}/.isort.cfg +0 -0
- {ffbb_data_client-2.1.0 → ffbb_data_client-2.3.0}/.jules/bolt.md +0 -0
- {ffbb_data_client-2.1.0 → ffbb_data_client-2.3.0}/.pre-commit-config.yaml +0 -0
- {ffbb_data_client-2.1.0 → ffbb_data_client-2.3.0}/.readthedocs.yml +0 -0
- {ffbb_data_client-2.1.0 → ffbb_data_client-2.3.0}/AUTHORS.rst +0 -0
- {ffbb_data_client-2.1.0 → ffbb_data_client-2.3.0}/LICENSE.txt +0 -0
- {ffbb_data_client-2.1.0 → ffbb_data_client-2.3.0}/LOCAL_CI_GUIDE.md +0 -0
- {ffbb_data_client-2.1.0 → ffbb_data_client-2.3.0}/SECURITY.md +0 -0
- {ffbb_data_client-2.1.0 → ffbb_data_client-2.3.0}/data/api.ffbb.app.json +0 -0
- {ffbb_data_client-2.1.0 → ffbb_data_client-2.3.0}/data/meilisearch-prod.ffbb.app.json +0 -0
- {ffbb_data_client-2.1.0 → ffbb_data_client-2.3.0}/data/type_discovery_corrections.json +0 -0
- {ffbb_data_client-2.1.0 → ffbb_data_client-2.3.0}/docs/Makefile +0 -0
- {ffbb_data_client-2.1.0 → ffbb_data_client-2.3.0}/docs/_static/.gitignore +0 -0
- {ffbb_data_client-2.1.0 → ffbb_data_client-2.3.0}/docs/architecture.rst +0 -0
- {ffbb_data_client-2.1.0 → ffbb_data_client-2.3.0}/docs/authors.rst +0 -0
- {ffbb_data_client-2.1.0 → ffbb_data_client-2.3.0}/docs/changelog.rst +0 -0
- {ffbb_data_client-2.1.0 → ffbb_data_client-2.3.0}/docs/contributing.rst +0 -0
- {ffbb_data_client-2.1.0 → ffbb_data_client-2.3.0}/docs/examples.rst +0 -0
- {ffbb_data_client-2.1.0 → ffbb_data_client-2.3.0}/docs/index.rst +0 -0
- {ffbb_data_client-2.1.0 → ffbb_data_client-2.3.0}/docs/license.rst +0 -0
- {ffbb_data_client-2.1.0 → ffbb_data_client-2.3.0}/docs/migration.rst +0 -0
- {ffbb_data_client-2.1.0 → ffbb_data_client-2.3.0}/docs/readme.rst +0 -0
- {ffbb_data_client-2.1.0 → ffbb_data_client-2.3.0}/docs/requirements.txt +0 -0
- {ffbb_data_client-2.1.0 → ffbb_data_client-2.3.0}/docs/test_strategy.md +0 -0
- {ffbb_data_client-2.1.0 → ffbb_data_client-2.3.0}/docs/testing_conventions.md +0 -0
- {ffbb_data_client-2.1.0 → ffbb_data_client-2.3.0}/examples/README.md +0 -0
- {ffbb_data_client-2.1.0 → ffbb_data_client-2.3.0}/examples/complete_usage_example.py +0 -0
- {ffbb_data_client-2.1.0 → ffbb_data_client-2.3.0}/examples/quick_start.py +0 -0
- {ffbb_data_client-2.1.0 → ffbb_data_client-2.3.0}/pytest.ini +0 -0
- {ffbb_data_client-2.1.0 → ffbb_data_client-2.3.0}/run-ci-locally.sh +0 -0
- {ffbb_data_client-2.1.0 → ffbb_data_client-2.3.0}/scripts/discover_types.py +0 -0
- {ffbb_data_client-2.1.0 → ffbb_data_client-2.3.0}/setup.cfg +1 -1
- {ffbb_data_client-2.1.0 → ffbb_data_client-2.3.0}/setup.py +0 -0
- {ffbb_data_client-2.1.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/__init__.py +0 -0
- {ffbb_data_client-2.1.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/clients/api_ffbb_app_client.py +0 -0
- {ffbb_data_client-2.1.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/clients/meilisearch_client.py +0 -0
- {ffbb_data_client-2.1.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/clients/meilisearch_ffbb_client.py +0 -0
- {ffbb_data_client-2.1.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/config.py +0 -0
- {ffbb_data_client-2.1.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/data/__init__.py +0 -0
- {ffbb_data_client-2.1.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/helpers/__init__.py +0 -0
- {ffbb_data_client-2.1.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/helpers/http_requests_helper.py +0 -0
- {ffbb_data_client-2.1.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/helpers/http_requests_utils.py +0 -0
- {ffbb_data_client-2.1.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/helpers/meilisearch_client_extension.py +0 -0
- {ffbb_data_client-2.1.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/helpers/multi_search_query_helper.py +0 -0
- {ffbb_data_client-2.1.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/__init__.py +0 -0
- {ffbb_data_client-2.1.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/affiche.py +0 -0
- {ffbb_data_client-2.1.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/cartographie.py +0 -0
- {ffbb_data_client-2.1.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/categorie.py +0 -0
- {ffbb_data_client-2.1.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/categorie_type.py +0 -0
- {ffbb_data_client-2.1.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/clock.py +0 -0
- {ffbb_data_client-2.1.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/club_contacts.py +0 -0
- {ffbb_data_client-2.1.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/code.py +0 -0
- {ffbb_data_client-2.1.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/commune.py +0 -0
- {ffbb_data_client-2.1.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/competition_fields.py +0 -0
- {ffbb_data_client-2.1.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/competition_id.py +0 -0
- {ffbb_data_client-2.1.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/competition_id_categorie.py +0 -0
- {ffbb_data_client-2.1.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/competition_id_sexe.py +0 -0
- {ffbb_data_client-2.1.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/competition_id_type_competition.py +0 -0
- {ffbb_data_client-2.1.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/competition_id_type_competition_generique.py +0 -0
- {ffbb_data_client-2.1.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/competition_origine.py +0 -0
- {ffbb_data_client-2.1.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/competition_origine_categorie.py +0 -0
- {ffbb_data_client-2.1.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/competition_origine_type_competition.py +0 -0
- {ffbb_data_client-2.1.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/competition_origine_type_competition_generique.py +0 -0
- {ffbb_data_client-2.1.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/competition_type.py +0 -0
- {ffbb_data_client-2.1.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/competitions_facet_distribution.py +0 -0
- {ffbb_data_client-2.1.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/competitions_facet_stats.py +0 -0
- {ffbb_data_client-2.1.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/competitions_hit.py +0 -0
- {ffbb_data_client-2.1.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/competitions_multi_search_query.py +0 -0
- {ffbb_data_client-2.1.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/competitions_query.py +0 -0
- {ffbb_data_client-2.1.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/configuration_models.py +0 -0
- {ffbb_data_client-2.1.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/contact_info.py +0 -0
- {ffbb_data_client-2.1.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/content_multi_search_query.py +0 -0
- {ffbb_data_client-2.1.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/coordonnees.py +0 -0
- {ffbb_data_client-2.1.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/coordonnees_type.py +0 -0
- {ffbb_data_client-2.1.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/document_flyer.py +0 -0
- {ffbb_data_client-2.1.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/document_flyer_type.py +0 -0
- {ffbb_data_client-2.1.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/engagement_contacts.py +0 -0
- {ffbb_data_client-2.1.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/engagements_facet_distribution.py +0 -0
- {ffbb_data_client-2.1.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/engagements_facet_stats.py +0 -0
- {ffbb_data_client-2.1.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/engagements_hit.py +0 -0
- {ffbb_data_client-2.1.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/engagements_multi_search_query.py +0 -0
- {ffbb_data_client-2.1.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/etat.py +0 -0
- {ffbb_data_client-2.1.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/external_competition_id.py +0 -0
- {ffbb_data_client-2.1.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/external_id.py +0 -0
- {ffbb_data_client-2.1.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/facet_distribution.py +0 -0
- {ffbb_data_client-2.1.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/facet_stats.py +0 -0
- {ffbb_data_client-2.1.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/field_set.py +0 -0
- {ffbb_data_client-2.1.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/folder.py +0 -0
- {ffbb_data_client-2.1.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/formation_session.py +0 -0
- {ffbb_data_client-2.1.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/formations_facet_distribution.py +0 -0
- {ffbb_data_client-2.1.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/formations_facet_stats.py +0 -0
- {ffbb_data_client-2.1.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/formations_hit.py +0 -0
- {ffbb_data_client-2.1.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/formations_multi_search_query.py +0 -0
- {ffbb_data_client-2.1.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/game_stats_model.py +0 -0
- {ffbb_data_client-2.1.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/game_stats_models.py +0 -0
- {ffbb_data_client-2.1.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/generic_search.py +0 -0
- {ffbb_data_client-2.1.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/geo.py +0 -0
- {ffbb_data_client-2.1.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/geo_sort_order.py +0 -0
- {ffbb_data_client-2.1.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/get_commune_response.py +0 -0
- {ffbb_data_client-2.1.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/get_configuration_response.py +0 -0
- {ffbb_data_client-2.1.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/get_engagement_response.py +0 -0
- {ffbb_data_client-2.1.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/get_entraineur_response.py +0 -0
- {ffbb_data_client-2.1.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/get_formation_response.py +0 -0
- {ffbb_data_client-2.1.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/get_officiel_response.py +0 -0
- {ffbb_data_client-2.1.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/get_poule_response.py +0 -0
- {ffbb_data_client-2.1.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/get_pratique_response.py +0 -0
- {ffbb_data_client-2.1.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/get_rencontre_response.py +0 -0
- {ffbb_data_client-2.1.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/get_saisons_response.py +0 -0
- {ffbb_data_client-2.1.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/get_salle_response.py +0 -0
- {ffbb_data_client-2.1.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/get_terrain_response.py +0 -0
- {ffbb_data_client-2.1.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/get_tournoi_response.py +0 -0
- {ffbb_data_client-2.1.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/gradient_color.py +0 -0
- {ffbb_data_client-2.1.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/hit.py +0 -0
- {ffbb_data_client-2.1.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/id_engagement_equipe.py +0 -0
- {ffbb_data_client-2.1.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/id_organisme_equipe.py +0 -0
- {ffbb_data_client-2.1.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/id_organisme_equipe1_logo.py +0 -0
- {ffbb_data_client-2.1.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/id_poule.py +0 -0
- {ffbb_data_client-2.1.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/jour.py +0 -0
- {ffbb_data_client-2.1.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/label.py +0 -0
- {ffbb_data_client-2.1.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/labellisation.py +0 -0
- {ffbb_data_client-2.1.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/live.py +0 -0
- {ffbb_data_client-2.1.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/lives.py +0 -0
- {ffbb_data_client-2.1.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/logo.py +0 -0
- {ffbb_data_client-2.1.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/multi_search_queries.py +0 -0
- {ffbb_data_client-2.1.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/multi_search_query.py +0 -0
- {ffbb_data_client-2.1.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/multi_search_result_competitions.py +0 -0
- {ffbb_data_client-2.1.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/multi_search_result_engagements.py +0 -0
- {ffbb_data_client-2.1.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/multi_search_result_formations.py +0 -0
- {ffbb_data_client-2.1.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/multi_search_result_organismes.py +0 -0
- {ffbb_data_client-2.1.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/multi_search_result_pratiques.py +0 -0
- {ffbb_data_client-2.1.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/multi_search_result_rencontres.py +0 -0
- {ffbb_data_client-2.1.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/multi_search_result_salles.py +0 -0
- {ffbb_data_client-2.1.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/multi_search_result_terrains.py +0 -0
- {ffbb_data_client-2.1.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/multi_search_result_tournois.py +0 -0
- {ffbb_data_client-2.1.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/multi_search_results.py +0 -0
- {ffbb_data_client-2.1.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/multi_search_results_class.py +0 -0
- {ffbb_data_client-2.1.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/nature_sol.py +0 -0
- {ffbb_data_client-2.1.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/niveau.py +0 -0
- {ffbb_data_client-2.1.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/niveau_class.py +0 -0
- {ffbb_data_client-2.1.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/niveau_extractor.py +0 -0
- {ffbb_data_client-2.1.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/niveau_info.py +0 -0
- {ffbb_data_client-2.1.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/niveau_models.py +0 -0
- {ffbb_data_client-2.1.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/niveau_type.py +0 -0
- {ffbb_data_client-2.1.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/objectif.py +0 -0
- {ffbb_data_client-2.1.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/organisateur.py +0 -0
- {ffbb_data_client-2.1.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/organisateur_type.py +0 -0
- {ffbb_data_client-2.1.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/organisme_fields.py +0 -0
- {ffbb_data_client-2.1.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/organisme_id_pere.py +0 -0
- {ffbb_data_client-2.1.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/organismes_facet_distribution.py +0 -0
- {ffbb_data_client-2.1.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/organismes_facet_stats.py +0 -0
- {ffbb_data_client-2.1.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/organismes_hit.py +0 -0
- {ffbb_data_client-2.1.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/organismes_multi_search_query.py +0 -0
- {ffbb_data_client-2.1.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/organismes_query.py +0 -0
- {ffbb_data_client-2.1.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/phase_code.py +0 -0
- {ffbb_data_client-2.1.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/poule.py +0 -0
- {ffbb_data_client-2.1.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/poule_fields.py +0 -0
- {ffbb_data_client-2.1.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/poule_rencontre_item_model.py +0 -0
- {ffbb_data_client-2.1.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/poules_models.py +0 -0
- {ffbb_data_client-2.1.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/poules_query.py +0 -0
- {ffbb_data_client-2.1.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/pratique.py +0 -0
- {ffbb_data_client-2.1.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/pratiques_facet_distribution.py +0 -0
- {ffbb_data_client-2.1.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/pratiques_facet_stats.py +0 -0
- {ffbb_data_client-2.1.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/pratiques_hit.py +0 -0
- {ffbb_data_client-2.1.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/pratiques_hit_type.py +0 -0
- {ffbb_data_client-2.1.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/pratiques_multi_search_query.py +0 -0
- {ffbb_data_client-2.1.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/pratiques_type_class.py +0 -0
- {ffbb_data_client-2.1.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/publication_internet.py +0 -0
- {ffbb_data_client-2.1.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/purple_logo.py +0 -0
- {ffbb_data_client-2.1.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/query_fields_manager.py +0 -0
- {ffbb_data_client-2.1.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/ranking_engagement.py +0 -0
- {ffbb_data_client-2.1.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/rankings_models.py +0 -0
- {ffbb_data_client-2.1.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/rencontres_engagement.py +0 -0
- {ffbb_data_client-2.1.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/rencontres_facet_distribution.py +0 -0
- {ffbb_data_client-2.1.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/rencontres_facet_stats.py +0 -0
- {ffbb_data_client-2.1.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/rencontres_hit.py +0 -0
- {ffbb_data_client-2.1.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/rencontres_multi_search_query.py +0 -0
- {ffbb_data_client-2.1.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/saison.py +0 -0
- {ffbb_data_client-2.1.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/saison_fields.py +0 -0
- {ffbb_data_client-2.1.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/saisons_models.py +0 -0
- {ffbb_data_client-2.1.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/saisons_query.py +0 -0
- {ffbb_data_client-2.1.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/salle.py +0 -0
- {ffbb_data_client-2.1.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/salles_facet_distribution.py +0 -0
- {ffbb_data_client-2.1.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/salles_facet_stats.py +0 -0
- {ffbb_data_client-2.1.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/salles_hit.py +0 -0
- {ffbb_data_client-2.1.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/salles_multi_search_query.py +0 -0
- {ffbb_data_client-2.1.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/sexe.py +0 -0
- {ffbb_data_client-2.1.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/sexe_class.py +0 -0
- {ffbb_data_client-2.1.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/source.py +0 -0
- {ffbb_data_client-2.1.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/status.py +0 -0
- {ffbb_data_client-2.1.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/team_engagement.py +0 -0
- {ffbb_data_client-2.1.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/team_ranking.py +0 -0
- {ffbb_data_client-2.1.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/terrains_categorie_championnat_3x3_libelle.py +0 -0
- {ffbb_data_client-2.1.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/terrains_facet_distribution.py +0 -0
- {ffbb_data_client-2.1.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/terrains_facet_stats.py +0 -0
- {ffbb_data_client-2.1.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/terrains_hit.py +0 -0
- {ffbb_data_client-2.1.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/terrains_multi_search_query.py +0 -0
- {ffbb_data_client-2.1.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/terrains_name.py +0 -0
- {ffbb_data_client-2.1.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/terrains_sexe_enum.py +0 -0
- {ffbb_data_client-2.1.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/terrains_storage.py +0 -0
- {ffbb_data_client-2.1.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/tournoi_type_class.py +0 -0
- {ffbb_data_client-2.1.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/tournoi_type_enum.py +0 -0
- {ffbb_data_client-2.1.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/tournoi_types_3x3.py +0 -0
- {ffbb_data_client-2.1.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/tournoi_types_3x3_libelle.py +0 -0
- {ffbb_data_client-2.1.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/tournoi_types_3x3_libelle_enum.py +0 -0
- {ffbb_data_client-2.1.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/tournois_facet_distribution.py +0 -0
- {ffbb_data_client-2.1.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/tournois_facet_stats.py +0 -0
- {ffbb_data_client-2.1.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/tournois_hit.py +0 -0
- {ffbb_data_client-2.1.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/tournois_hit_type.py +0 -0
- {ffbb_data_client-2.1.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/tournois_libelle.py +0 -0
- {ffbb_data_client-2.1.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/tournois_multi_search_query.py +0 -0
- {ffbb_data_client-2.1.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/type_association.py +0 -0
- {ffbb_data_client-2.1.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/type_association_libelle.py +0 -0
- {ffbb_data_client-2.1.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/type_class.py +0 -0
- {ffbb_data_client-2.1.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/type_competition.py +0 -0
- {ffbb_data_client-2.1.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/type_competition_generique.py +0 -0
- {ffbb_data_client-2.1.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/type_enum.py +0 -0
- {ffbb_data_client-2.1.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/type_league.py +0 -0
- {ffbb_data_client-2.1.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/py.typed +0 -0
- {ffbb_data_client-2.1.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/utils/__init__.py +0 -0
- {ffbb_data_client-2.1.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/utils/converter_utils.py +0 -0
- {ffbb_data_client-2.1.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/utils/input_validation.py +0 -0
- {ffbb_data_client-2.1.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/utils/retry_utils.py +0 -0
- {ffbb_data_client-2.1.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/utils/secure_logging.py +0 -0
- {ffbb_data_client-2.1.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/utils/token_manager.py +0 -0
- {ffbb_data_client-2.1.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client.egg-info/dependency_links.txt +0 -0
- {ffbb_data_client-2.1.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client.egg-info/not-zip-safe +0 -0
- {ffbb_data_client-2.1.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client.egg-info/requires.txt +1 -1
- {ffbb_data_client-2.1.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client.egg-info/top_level.txt +0 -0
- {ffbb_data_client-2.1.0 → ffbb_data_client-2.3.0}/tests/conftest.py +0 -0
- {ffbb_data_client-2.1.0 → ffbb_data_client-2.3.0}/tests/e2e/__init__.py +0 -0
- {ffbb_data_client-2.1.0 → ffbb_data_client-2.3.0}/tests/e2e/conftest.py +0 -0
- {ffbb_data_client-2.1.0 → ffbb_data_client-2.3.0}/tests/integration/__init__.py +0 -0
- {ffbb_data_client-2.1.0 → ffbb_data_client-2.3.0}/tests/integration/conftest.py +0 -0
- {ffbb_data_client-2.1.0 → ffbb_data_client-2.3.0}/tests/integration/test_500_user_journey.py +0 -0
- {ffbb_data_client-2.1.0 → ffbb_data_client-2.3.0}/tests/integration/test_501_user_journey_v3.py +0 -0
- {ffbb_data_client-2.1.0 → ffbb_data_client-2.3.0}/tests/integration/test_502_enhanced_integration.py +0 -0
- {ffbb_data_client-2.1.0 → ffbb_data_client-2.3.0}/tests/integration/test_503_secure_logging.py +0 -0
- {ffbb_data_client-2.1.0 → ffbb_data_client-2.3.0}/tests/integration/test_506_raw_json_model_conversion.py +0 -0
- {ffbb_data_client-2.1.0 → ffbb_data_client-2.3.0}/tests/unit/__init__.py +0 -0
- {ffbb_data_client-2.1.0 → ffbb_data_client-2.3.0}/tests/unit/clients/__init__.py +0 -0
- {ffbb_data_client-2.1.0 → ffbb_data_client-2.3.0}/tests/unit/clients/test_200_api_ffbb_app_client.py +0 -0
- {ffbb_data_client-2.1.0 → ffbb_data_client-2.3.0}/tests/unit/clients/test_202_meilisearch_client.py +0 -0
- {ffbb_data_client-2.1.0 → ffbb_data_client-2.3.0}/tests/unit/clients/test_203_meilisearch_client_extension.py +0 -0
- {ffbb_data_client-2.1.0 → ffbb_data_client-2.3.0}/tests/unit/clients/test_204_ffbb_data_client.py +0 -0
- {ffbb_data_client-2.1.0 → ffbb_data_client-2.3.0}/tests/unit/clients/test_205_meilisearch_ffbb_client.py +0 -0
- {ffbb_data_client-2.1.0 → ffbb_data_client-2.3.0}/tests/unit/clients/test_206_coverage_gaps_clients.py +0 -0
- {ffbb_data_client-2.1.0 → ffbb_data_client-2.3.0}/tests/unit/clients/test_207_coverage_clients_extended.py +0 -0
- {ffbb_data_client-2.1.0 → ffbb_data_client-2.3.0}/tests/unit/clients/test_208_new_methods_coverage.py +0 -0
- {ffbb_data_client-2.1.0 → ffbb_data_client-2.3.0}/tests/unit/clients/test_209_automatic_token_resolution.py +0 -0
- {ffbb_data_client-2.1.0 → ffbb_data_client-2.3.0}/tests/unit/clients/test_async_methods.py +0 -0
- {ffbb_data_client-2.1.0 → ffbb_data_client-2.3.0}/tests/unit/clients/test_meilisearch_async.py +0 -0
- {ffbb_data_client-2.1.0 → ffbb_data_client-2.3.0}/tests/unit/clients/test_v2_backport_search.py +0 -0
- {ffbb_data_client-2.1.0 → ffbb_data_client-2.3.0}/tests/unit/clients/test_v3_new_features.py +0 -0
- {ffbb_data_client-2.1.0 → ffbb_data_client-2.3.0}/tests/unit/conftest.py +0 -0
- {ffbb_data_client-2.1.0 → ffbb_data_client-2.3.0}/tests/unit/helpers/__init__.py +0 -0
- {ffbb_data_client-2.1.0 → ffbb_data_client-2.3.0}/tests/unit/helpers/test_400_http_helpers.py +0 -0
- {ffbb_data_client-2.1.0 → ffbb_data_client-2.3.0}/tests/unit/helpers/test_meilisearch_client_extension_recursive_pagination.py +0 -0
- {ffbb_data_client-2.1.0 → ffbb_data_client-2.3.0}/tests/unit/models/__init__.py +0 -0
- {ffbb_data_client-2.1.0 → ffbb_data_client-2.3.0}/tests/unit/models/test_100_competition_id_categorie.py +0 -0
- {ffbb_data_client-2.1.0 → ffbb_data_client-2.3.0}/tests/unit/models/test_101_competition_id_sexe.py +0 -0
- {ffbb_data_client-2.1.0 → ffbb_data_client-2.3.0}/tests/unit/models/test_102_competition_id_type_competition.py +0 -0
- {ffbb_data_client-2.1.0 → ffbb_data_client-2.3.0}/tests/unit/models/test_103_competition_id_type_competition_generique.py +0 -0
- {ffbb_data_client-2.1.0 → ffbb_data_client-2.3.0}/tests/unit/models/test_104_competition_origine_categorie.py +0 -0
- {ffbb_data_client-2.1.0 → ffbb_data_client-2.3.0}/tests/unit/models/test_105_competition_origine_type_competition_generique.py +0 -0
- {ffbb_data_client-2.1.0 → ffbb_data_client-2.3.0}/tests/unit/models/test_106_competition_origine.py +0 -0
- {ffbb_data_client-2.1.0 → ffbb_data_client-2.3.0}/tests/unit/models/test_107_id_engagement_equipe.py +0 -0
- {ffbb_data_client-2.1.0 → ffbb_data_client-2.3.0}/tests/unit/models/test_108_id_organisme_equipe.py +0 -0
- {ffbb_data_client-2.1.0 → ffbb_data_client-2.3.0}/tests/unit/models/test_109_id_organisme_equipe1_logo.py +0 -0
- {ffbb_data_client-2.1.0 → ffbb_data_client-2.3.0}/tests/unit/models/test_110_labellisation.py +0 -0
- {ffbb_data_client-2.1.0 → ffbb_data_client-2.3.0}/tests/unit/models/test_111_niveau_class.py +0 -0
- {ffbb_data_client-2.1.0 → ffbb_data_client-2.3.0}/tests/unit/models/test_112_purple_logo.py +0 -0
- {ffbb_data_client-2.1.0 → ffbb_data_client-2.3.0}/tests/unit/models/test_113_salle.py +0 -0
- {ffbb_data_client-2.1.0 → ffbb_data_client-2.3.0}/tests/unit/models/test_114_tournoi_type_class.py +0 -0
- {ffbb_data_client-2.1.0 → ffbb_data_client-2.3.0}/tests/unit/models/test_115_type_association_libelle.py +0 -0
- {ffbb_data_client-2.1.0 → ffbb_data_client-2.3.0}/tests/unit/models/test_116_type_competition_generique.py +0 -0
- {ffbb_data_client-2.1.0 → ffbb_data_client-2.3.0}/tests/unit/models/test_117_organisateur.py +0 -0
- {ffbb_data_client-2.1.0 → ffbb_data_client-2.3.0}/tests/unit/models/test_118_competition_id.py +0 -0
- {ffbb_data_client-2.1.0 → ffbb_data_client-2.3.0}/tests/unit/models/test_119_terrains_inner_models.py +0 -0
- {ffbb_data_client-2.1.0 → ffbb_data_client-2.3.0}/tests/unit/models/test_120_pratiques_inner_models.py +0 -0
- {ffbb_data_client-2.1.0 → ffbb_data_client-2.3.0}/tests/unit/models/test_121_to_dict_round_trip.py +0 -0
- {ffbb_data_client-2.1.0 → ffbb_data_client-2.3.0}/tests/unit/models/test_122_coverage_gaps.py +0 -0
- {ffbb_data_client-2.1.0 → ffbb_data_client-2.3.0}/tests/unit/models/test_123_missing_coverage.py +0 -0
- {ffbb_data_client-2.1.0 → ffbb_data_client-2.3.0}/tests/unit/models/test_123_v2_backport.py +0 -0
- {ffbb_data_client-2.1.0 → ffbb_data_client-2.3.0}/tests/unit/models/test_124_targeted_coverage_gains.py +0 -0
- {ffbb_data_client-2.1.0 → ffbb_data_client-2.3.0}/tests/unit/models/test_dx_aliases.py +0 -0
- {ffbb_data_client-2.1.0 → ffbb_data_client-2.3.0}/tests/unit/utils/__init__.py +0 -0
- {ffbb_data_client-2.1.0 → ffbb_data_client-2.3.0}/tests/unit/utils/test_300_secure_logging.py +0 -0
- {ffbb_data_client-2.1.0 → ffbb_data_client-2.3.0}/tests/unit/utils/test_301_input_validation.py +0 -0
- {ffbb_data_client-2.1.0 → ffbb_data_client-2.3.0}/tests/unit/utils/test_302_retry_utils.py +0 -0
- {ffbb_data_client-2.1.0 → ffbb_data_client-2.3.0}/tests/unit/utils/test_303_cache_manager.py +0 -0
- {ffbb_data_client-2.1.0 → ffbb_data_client-2.3.0}/tests/unit/utils/test_304_config.py +0 -0
- {ffbb_data_client-2.1.0 → ffbb_data_client-2.3.0}/tests/unit/utils/test_305_token_manager.py +0 -0
- {ffbb_data_client-2.1.0 → ffbb_data_client-2.3.0}/tests/unit/utils/test_306_converter_utils.py +0 -0
- {ffbb_data_client-2.1.0 → ffbb_data_client-2.3.0}/tests/unit/utils/test_307_coverage_gaps_utils.py +0 -0
- {ffbb_data_client-2.1.0 → ffbb_data_client-2.3.0}/website/assets/logo.webp +0 -0
- {ffbb_data_client-2.1.0 → ffbb_data_client-2.3.0}/website/css/style.css +0 -0
- {ffbb_data_client-2.1.0 → ffbb_data_client-2.3.0}/website/index.html +0 -0
- {ffbb_data_client-2.1.0 → ffbb_data_client-2.3.0}/website/robots.txt +0 -0
- {ffbb_data_client-2.1.0 → ffbb_data_client-2.3.0}/website/sitemap.xml +0 -0
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
# RTK - Rust Token Killer (Google Antigravity)
|
|
2
|
+
|
|
3
|
+
**Usage**: Token-optimized CLI proxy for shell commands.
|
|
4
|
+
|
|
5
|
+
## Rule
|
|
6
|
+
|
|
7
|
+
Always prefix shell commands with `rtk` to minimize token consumption.
|
|
8
|
+
|
|
9
|
+
Examples:
|
|
10
|
+
|
|
11
|
+
```bash
|
|
12
|
+
rtk git status
|
|
13
|
+
rtk cargo test
|
|
14
|
+
rtk ls src/
|
|
15
|
+
rtk grep "pattern" src/
|
|
16
|
+
rtk find "*.rs" .
|
|
17
|
+
rtk docker ps
|
|
18
|
+
rtk gh pr list
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
## Meta Commands
|
|
22
|
+
|
|
23
|
+
```bash
|
|
24
|
+
rtk gain # Show token savings
|
|
25
|
+
rtk gain --history # Command history with savings
|
|
26
|
+
rtk discover # Find missed RTK opportunities
|
|
27
|
+
rtk proxy <cmd> # Run raw (no filtering, for debugging)
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
## Why
|
|
31
|
+
|
|
32
|
+
RTK filters and compresses command output before it reaches the LLM context, saving 60-90% tokens on common operations. Always use `rtk <cmd>` instead of raw commands.
|
|
@@ -62,13 +62,25 @@ def write_summary(text: str) -> None:
|
|
|
62
62
|
def main() -> int:
|
|
63
63
|
api_methods = get_public_methods(CLIENTS / "api_ffbb_app_client.py")
|
|
64
64
|
ms_methods = get_public_methods(CLIENTS / "meilisearch_ffbb_client.py")
|
|
65
|
-
|
|
65
|
+
|
|
66
|
+
# Collect wrapper methods from the main file AND any facade files.
|
|
67
|
+
# After the v2.1.0 refactor, methods live in _rest_facade.py and
|
|
68
|
+
# _search_facade.py; the thin ffbb_data_client.py delegates via setattr.
|
|
69
|
+
wrapper_files = [
|
|
70
|
+
CLIENTS / "ffbb_data_client.py",
|
|
71
|
+
CLIENTS / "_rest_facade.py",
|
|
72
|
+
CLIENTS / "_search_facade.py",
|
|
73
|
+
]
|
|
74
|
+
wrapper_methods: set[str] = set()
|
|
75
|
+
for wf in wrapper_files:
|
|
76
|
+
if wf.exists():
|
|
77
|
+
wrapper_methods |= get_public_methods(wf)
|
|
66
78
|
|
|
67
79
|
all_inner = api_methods | ms_methods
|
|
68
80
|
missing = sorted(all_inner - wrapper_methods)
|
|
69
81
|
|
|
70
82
|
if not missing:
|
|
71
|
-
msg = "## ✅ Wrapper parity OK\n\nAll public methods from inner clients are exposed in `FFBBDataClient
|
|
83
|
+
msg = "## ✅ Wrapper parity OK\n\nAll public methods from inner clients are exposed in `FFBBDataClient` (including facade files)."
|
|
72
84
|
print(msg)
|
|
73
85
|
write_summary(msg)
|
|
74
86
|
return 0
|
|
@@ -77,13 +89,14 @@ def main() -> int:
|
|
|
77
89
|
missing_detail = " ".join(
|
|
78
90
|
[
|
|
79
91
|
"The following methods exist in inner clients but are **not exposed**",
|
|
80
|
-
"in `FFBBDataClient
|
|
92
|
+
"in `FFBBDataClient` or its facade files:",
|
|
81
93
|
]
|
|
82
94
|
)
|
|
83
95
|
fix_detail = " ".join(
|
|
84
96
|
[
|
|
85
97
|
"Add the missing method(s) to",
|
|
86
|
-
"`src/ffbb_data_client/clients/ffbb_data_client.py`",
|
|
98
|
+
"`src/ffbb_data_client/clients/ffbb_data_client.py` or one of its",
|
|
99
|
+
"facade files (`_rest_facade.py`, `_search_facade.py`)",
|
|
87
100
|
"so they delegate to the appropriate inner client.",
|
|
88
101
|
]
|
|
89
102
|
)
|
{ffbb_data_client-2.1.0 → ffbb_data_client-2.3.0}/.github/workflows/update-ffbb-api-discovery.yml
RENAMED
|
@@ -35,7 +35,7 @@ jobs:
|
|
|
35
35
|
- name: Detect structural discovery changes
|
|
36
36
|
id: changes
|
|
37
37
|
run: |
|
|
38
|
-
if grep -Eq '^- (Added|Removed): \[' data/api_update_summary.md; then
|
|
38
|
+
if grep -Eq '^- (Added|Removed): \[' data/api_update_summary.md || grep -q 'drift' data/api_update_summary.md; then
|
|
39
39
|
echo "changed=true" >> "$GITHUB_OUTPUT"
|
|
40
40
|
else
|
|
41
41
|
echo "changed=false" >> "$GITHUB_OUTPUT"
|
|
@@ -0,0 +1,260 @@
|
|
|
1
|
+
# FFBB Data Client SDK
|
|
2
|
+
|
|
3
|
+
> ⚠️ **Fichier auto-généré** par `tools/update_agents_md.py` — ne pas modifier manuellement.
|
|
4
|
+
> Dernière mise à jour : ffbb-data-client | SDK total : ~18767 lignes de code
|
|
5
|
+
> (clients: 6259, models: 9878, utils: 1840, helpers: 790)
|
|
6
|
+
|
|
7
|
+
## Langue
|
|
8
|
+
Tous les documents de travail (walkthrough.md, implementation_plan.md) DOIVENT être en français.
|
|
9
|
+
|
|
10
|
+
## Persona
|
|
11
|
+
Expert en basketball français et intégration technique.
|
|
12
|
+
Accès au SDK Python de bas niveau `ffbb-data-client` connecté à l'API et au Meilisearch officiel de la FFBB.
|
|
13
|
+
|
|
14
|
+
## Méthodes REST du Client (Exemples importants)
|
|
15
|
+
Le SDK expose les méthodes directes de récupération de données suivantes via `FFBBDataClient` :
|
|
16
|
+
- `get_organisme_for_search` : Version allégée de get_organisme() pour les contextes de recherche
|
|
17
|
+
- `get_organisme_for_search_async` : Version async allégée de get_organisme() pour les contextes de recherche
|
|
18
|
+
- `get_configuration` : Retrieves the API configuration including bearer tokens
|
|
19
|
+
- `get_configuration_async` : Retrieves the API configuration including bearer tokens asynchronously
|
|
20
|
+
- `get_competition` : Retrieves detailed information about a competition
|
|
21
|
+
- `get_competition_async` : Retrieves detailed information about a competition asynchronously
|
|
22
|
+
- `list_competitions` : Lists competitions with optional field selection
|
|
23
|
+
- `list_competitions_async` : Lists competitions asynchronously
|
|
24
|
+
- `get_lives` : Retrieves a list of live events
|
|
25
|
+
- `get_lives_async` : Retrieves a list of live events asynchronously
|
|
26
|
+
- `get_organisme` : Retrieves detailed information about an organisme
|
|
27
|
+
- `get_organisme_async` : Retrieves detailed information about an organisme asynchronously
|
|
28
|
+
- `get_club_contacts` : Return club contact information (club-level + membres) for an organisme
|
|
29
|
+
- `get_poule` : Retrieves detailed information about a poule
|
|
30
|
+
- `get_poule_async` : Retrieves detailed information about a poule asynchronously
|
|
31
|
+
- `get_saisons` : Retrieves list of seasons with comprehensive input validation
|
|
32
|
+
- `get_saisons_async` : Retrieves list of seasons asynchronously with input validation
|
|
33
|
+
- `get_classement` : Retrieves ONLY the ranking (classement) for a specific poule
|
|
34
|
+
- `get_classement_async` : Retrieves ONLY the ranking (classement) for a specific poule asynchronously
|
|
35
|
+
- `get_equipes` : Retrieves ONLY the team commitments (engagements) for a specific club
|
|
36
|
+
- `get_equipes_async` : Retrieves ONLY the team commitments (engagements) for a specific club asynchronously
|
|
37
|
+
- `get_rencontre` : Retrieves detailed information about a rencontre
|
|
38
|
+
- `get_rencontre_async` : Asynchronously retrieves detailed information about a rencontre
|
|
39
|
+
- `get_engagement` : Retrieves detailed information about an engagement
|
|
40
|
+
- `get_engagement_async` : Asynchronously retrieves detailed information about an engagement
|
|
41
|
+
- `get_engagement_contacts` : Return compact contact information for an engagement
|
|
42
|
+
- `get_formation` : Retrieves detailed information about a formation
|
|
43
|
+
- `get_formation_async` : Asynchronously retrieves detailed information about a formation
|
|
44
|
+
- `get_entraineur` : Retrieves detailed information about an entraineur
|
|
45
|
+
- `get_entraineur_async` : Asynchronously retrieves detailed information about an entraineur
|
|
46
|
+
- `get_commune` : Retrieves detailed information about a commune
|
|
47
|
+
- `get_commune_async` : Asynchronously retrieves detailed information about a commune
|
|
48
|
+
- `get_officiel` : Retrieves detailed information about an officiel
|
|
49
|
+
- `get_officiel_async` : Asynchronously retrieves detailed information about an officiel
|
|
50
|
+
- `get_salle` : Retrieves detailed information about a salle
|
|
51
|
+
- `get_salle_async` : Asynchronously retrieves detailed information about a salle
|
|
52
|
+
- `get_terrain` : Retrieves detailed information about a terrain
|
|
53
|
+
- `get_terrain_async` : Asynchronously retrieves detailed information about a terrain
|
|
54
|
+
- `get_tournoi` : Retrieves detailed information about a tournoi
|
|
55
|
+
- `get_tournoi_async` : Asynchronously retrieves detailed information about a tournoi
|
|
56
|
+
- `get_pratique` : Retrieves detailed information about a pratique
|
|
57
|
+
- `get_pratique_async` : Asynchronously retrieves detailed information about a pratique
|
|
58
|
+
- `get_openapi_spec` : Retrieves the current Directus OpenAPI specification
|
|
59
|
+
- `get_openapi_spec_async` : Asynchronously retrieves the current Directus OpenAPI specification
|
|
60
|
+
- `get_session` : Retrieves detailed information about a formation session
|
|
61
|
+
- `get_session_async` : Asynchronously retrieves detailed information about a formation session
|
|
62
|
+
- `list_sessions` : Lists formation sessions
|
|
63
|
+
- `list_sessions_async` : Asynchronously lists formation sessions
|
|
64
|
+
- `get_genius_sport_match` : Retrieves detailed Genius Sports match statistics
|
|
65
|
+
- `get_genius_sport_match_async` : Asynchronously retrieves detailed Genius Sports match statistics
|
|
66
|
+
- `list_genius_sport_matches` : Lists Genius Sports match statistics
|
|
67
|
+
- `list_genius_sport_matches_async` : Asynchronously lists Genius Sports match statistics
|
|
68
|
+
- `list_genius_sports_live_logs` : Lists Genius Sports live logs
|
|
69
|
+
- `list_genius_sports_live_logs_async` : Asynchronously lists Genius Sports live logs
|
|
70
|
+
- `get_rematch_video` : Retrieves a Rematch video linked to FFBB data
|
|
71
|
+
- `get_rematch_video_async` : Asynchronously retrieves a Rematch video linked to FFBB data
|
|
72
|
+
- `list_rematch_videos` : Lists Rematch videos linked to FFBB data
|
|
73
|
+
- `list_rematch_videos_async` : Asynchronously lists Rematch videos linked to FFBB data
|
|
74
|
+
- `get_edf_match` : Retrieves an Equipe de France match
|
|
75
|
+
- `get_edf_match_async` : Asynchronously retrieves an Equipe de France match
|
|
76
|
+
- `list_edf_matches` : Lists Equipe de France matches
|
|
77
|
+
- `list_edf_matches_async` : Asynchronously lists Equipe de France matches
|
|
78
|
+
- `get_edf_player` : Retrieves an Equipe de France player
|
|
79
|
+
- `get_edf_player_async` : Asynchronously retrieves an Equipe de France player
|
|
80
|
+
- `list_edf_players` : Lists Equipe de France players
|
|
81
|
+
- `list_edf_players_async` : Asynchronously lists Equipe de France players
|
|
82
|
+
- `list_edf_teams` : Lists Equipe de France teams
|
|
83
|
+
- `list_edf_teams_async` : Asynchronously lists Equipe de France teams
|
|
84
|
+
- `list_edf_rosters` : Lists Equipe de France rosters
|
|
85
|
+
- `list_edf_rosters_async` : Asynchronously lists Equipe de France rosters
|
|
86
|
+
- `list_rencontres` :
|
|
87
|
+
- `list_rencontres_async` :
|
|
88
|
+
- `list_salles` :
|
|
89
|
+
- `list_salles_async` :
|
|
90
|
+
- `list_terrains` :
|
|
91
|
+
- `list_terrains_async` :
|
|
92
|
+
- `list_tournois` :
|
|
93
|
+
- `list_tournois_async` :
|
|
94
|
+
- `list_engagements` :
|
|
95
|
+
- `list_engagements_async` :
|
|
96
|
+
- `list_formations` :
|
|
97
|
+
- `list_formations_async` :
|
|
98
|
+
- `list_entraineurs` :
|
|
99
|
+
- `list_entraineurs_async` :
|
|
100
|
+
- `list_communes` :
|
|
101
|
+
- `list_communes_async` :
|
|
102
|
+
- `list_officiels` :
|
|
103
|
+
- `list_officiels_async` :
|
|
104
|
+
- `list_pratiques` :
|
|
105
|
+
- `list_pratiques_async` :
|
|
106
|
+
- `list_all_rencontres` :
|
|
107
|
+
- `list_all_rencontres_async` :
|
|
108
|
+
- `list_all_salles` :
|
|
109
|
+
- `list_all_salles_async` :
|
|
110
|
+
- `list_all_terrains` :
|
|
111
|
+
- `list_all_terrains_async` :
|
|
112
|
+
- `list_all_tournois` :
|
|
113
|
+
- `list_all_tournois_async` :
|
|
114
|
+
- `list_all_engagements` :
|
|
115
|
+
- `list_all_engagements_async` :
|
|
116
|
+
- `list_all_formations` :
|
|
117
|
+
- `list_all_formations_async` :
|
|
118
|
+
- `list_all_entraineurs` :
|
|
119
|
+
- `list_all_entraineurs_async` :
|
|
120
|
+
- `list_all_communes` :
|
|
121
|
+
- `list_all_communes_async` :
|
|
122
|
+
- `list_all_officiels` :
|
|
123
|
+
- `list_all_officiels_async` :
|
|
124
|
+
- `list_all_pratiques` :
|
|
125
|
+
- `list_all_pratiques_async` :
|
|
126
|
+
- `list_engagements_by_ids` :
|
|
127
|
+
- `list_engagements_by_poule` :
|
|
128
|
+
- `list_engagements_by_poules` :
|
|
129
|
+
- `list_rencontres_by_poule` :
|
|
130
|
+
- `list_rencontres_by_poules` :
|
|
131
|
+
- `list_entraineurs_by_ids` :
|
|
132
|
+
|
|
133
|
+
## Méthodes de Recherche Meilisearch (Exemples importants)
|
|
134
|
+
Le SDK expose également des méthodes de recherche optimisées avec facettes, géolocalisation et filtres via Meilisearch :
|
|
135
|
+
- `multi_search` : Perform multi-search across all resource types with input validation
|
|
136
|
+
- `multi_search_async` : Performs a smart multi-search asynchronously
|
|
137
|
+
- `search_competitions` :
|
|
138
|
+
- `search_multiple_competitions` :
|
|
139
|
+
- `search_competitions_async` : Search for competitions asynchronously
|
|
140
|
+
- `search_multiple_competitions_async` : Search for multiple competitions asynchronously
|
|
141
|
+
- `search_organismes` :
|
|
142
|
+
- `search_organismes_by_geo` :
|
|
143
|
+
- `search_organismes_by_city` :
|
|
144
|
+
- `search_multiple_organismes` :
|
|
145
|
+
- `search_organismes_async` : Search for organismes asynchronously
|
|
146
|
+
- `search_multiple_organismes_async` : Search for multiple organismes asynchronously
|
|
147
|
+
- `search_pratiques` :
|
|
148
|
+
- `search_multiple_pratiques` :
|
|
149
|
+
- `search_pratiques_async` : Search for pratiques asynchronously
|
|
150
|
+
- `search_multiple_pratiques_async` : Search for multiple pratiques asynchronously
|
|
151
|
+
- `search_rencontres` :
|
|
152
|
+
- `search_multiple_rencontres` :
|
|
153
|
+
- `search_rencontres_async` : Search for rencontres asynchronously
|
|
154
|
+
- `search_multiple_rencontres_async` : Search for multiple rencontres asynchronously
|
|
155
|
+
- `search_salles` :
|
|
156
|
+
- `search_salles_by_geo` :
|
|
157
|
+
- `search_multiple_salles` :
|
|
158
|
+
- `search_salles_async` : Search for salles asynchronously
|
|
159
|
+
- `search_multiple_salles_async` : Search for multiple salles asynchronously
|
|
160
|
+
- `search_terrains` :
|
|
161
|
+
- `search_multiple_terrains` :
|
|
162
|
+
- `search_terrains_async` : Search for terrains asynchronously
|
|
163
|
+
- `search_multiple_terrains_async` : Search for multiple terrains asynchronously
|
|
164
|
+
- `search_tournois` :
|
|
165
|
+
- `search_multiple_tournois` :
|
|
166
|
+
- `search_tournois_async` : Search for tournois asynchronously
|
|
167
|
+
- `search_multiple_tournois_async` : Search for multiple tournois asynchronously
|
|
168
|
+
- `search_engagements` :
|
|
169
|
+
- `search_engagements_by_geo` :
|
|
170
|
+
- `search_engagements_filtered` :
|
|
171
|
+
- `search_multiple_engagements` :
|
|
172
|
+
- `search_engagements_async` : Search for engagements asynchronously
|
|
173
|
+
- `search_multiple_engagements_async` : Search for multiple engagements asynchronously
|
|
174
|
+
- `search_formations` :
|
|
175
|
+
- `search_multiple_formations` :
|
|
176
|
+
- `search_formations_async` : Search for formations asynchronously
|
|
177
|
+
- `search_multiple_formations_async` : Search for multiple formations asynchronously
|
|
178
|
+
- `search_news` :
|
|
179
|
+
- `search_multiple_news` :
|
|
180
|
+
- `search_youtube_videos` :
|
|
181
|
+
- `search_multiple_youtube_videos` :
|
|
182
|
+
- `search_rss` :
|
|
183
|
+
- `search_multiple_rss` :
|
|
184
|
+
- `search_galeries` :
|
|
185
|
+
- `search_multiple_galeries` :
|
|
186
|
+
|
|
187
|
+
## Variables d'environnement
|
|
188
|
+
Le SDK résout automatiquement les jetons de sécurité via les variables d'environnement suivantes
|
|
189
|
+
ou interroge l'API publique en cache en cas d'absence :
|
|
190
|
+
|
|
191
|
+
| Variable | Défaut | Usage |
|
|
192
|
+
|----------|--------|-------|
|
|
193
|
+
| `API_FFBB_APP_BEARER_TOKEN` | — | Jeton Bearer de sécurité pour requêter directement l'API FFBB (api.ffbb.app) |
|
|
194
|
+
| `MEILISEARCH_BEARER_TOKEN` | — | Jeton Bearer de sécurité pour interroger le moteur Meilisearch (meilisearch-prod.ffbb.app) |
|
|
195
|
+
|
|
196
|
+
## Règles de comportement des agents
|
|
197
|
+
- **RTK OBLIGATOIRE** : Utilisez TOUJOURS le préfixe `rtk` pour toutes les commandes terminal
|
|
198
|
+
exécutées sur la machine de l'utilisateur (ex: `rtk pytest`, `rtk tox`, etc.).
|
|
199
|
+
- **Tox & Pytest** : Privilégiez l'exécution des tests via `pytest` local ou `tox` pour valider
|
|
200
|
+
les évolutions du SDK sur les différentes versions de Python prises en charge.
|
|
201
|
+
- **Modèles typés** : Respectez scrupuleusement la déclaration des types Pydantic de `ffbb_data_client.models`.
|
|
202
|
+
Tout nouveau modèle ou modification de champ doit correspondre aux spécifications de l'API FFBB.
|
|
203
|
+
- **Réponses en français** : Communiquez et expliquez toujours vos changements ou vos analyses en langue française.
|
|
204
|
+
|
|
205
|
+
## Karpathy Guidelines (Règles de développement)
|
|
206
|
+
Ces directives inspirées d'Andrej Karpathy visent à éliminer les erreurs de codage courantes en privilégiant la simplicité et la rigueur :
|
|
207
|
+
|
|
208
|
+
### 1. Penser avant de coder (Think Before Coding)
|
|
209
|
+
- **Ne pas assumer, ne pas cacher la confusion, expliciter les compromis.**
|
|
210
|
+
- Avant d'implémenter :
|
|
211
|
+
- Déclarez vos hypothèses de manière explicite. En cas d'incertitude, demandez.
|
|
212
|
+
- S'il existe plusieurs interprétations, présentez-les — ne choisissez pas en silence.
|
|
213
|
+
- Si une approche plus simple existe, proposez-la. Argumentez contre la complexité inutile si nécessaire.
|
|
214
|
+
- Si quelque chose n'est pas clair, arrêtez-vous. Nommez ce qui vous perturbe et demandez confirmation.
|
|
215
|
+
|
|
216
|
+
### 2. La simplicité d'abord (Simplicity First)
|
|
217
|
+
- **Le minimum de code nécessaire pour résoudre le problème. Rien de spéculatif.**
|
|
218
|
+
- Pas de fonctionnalités au-delà de ce qui est explicitement demandé.
|
|
219
|
+
- Pas d'abstractions pour du code à usage unique.
|
|
220
|
+
- Pas de "flexibilité" ou de "configurabilité" non requise.
|
|
221
|
+
- Pas de gestion d'erreurs pour des scénarios impossibles.
|
|
222
|
+
- Si vous écrivez 200 lignes alors que 50 suffiraient, réécrivez-le.
|
|
223
|
+
- Posez-vous toujours la question : "Est-ce qu'un développeur senior validerait cette implémentation comme simple et directe ?"
|
|
224
|
+
|
|
225
|
+
## Architecture du SDK
|
|
226
|
+
```
|
|
227
|
+
src/ffbb_data_client/
|
|
228
|
+
├── __init__.py # Point d'entrée du SDK, expose FFBBDataClient et FFBBTokens
|
|
229
|
+
├── clients/ # Clients d'API (REST et Meilisearch) et façades (≈6259 lignes)
|
|
230
|
+
├── config.py # Configuration centralisée (URLs, Headers, Endpoints, Facettes)
|
|
231
|
+
├── data/ # Ressources et données statiques
|
|
232
|
+
├── helpers/ # Méthodes utilitaires pour requêtes HTTP et mapping (≈790 lignes)
|
|
233
|
+
├── models/ # Modèles de données Pydantic type-safe (≈9878 lignes)
|
|
234
|
+
├── py.typed # Marqueur pour la compatibilité avec mypy
|
|
235
|
+
└── utils/ # Gestionnaires transversaux (cache, jetons de sécurité, validation) (≈1840 lignes)
|
|
236
|
+
```
|
|
237
|
+
|
|
238
|
+
## Conventions de code
|
|
239
|
+
- **Modèles Pydantic** : Tous les modèles héritent de `pydantic.BaseModel` et fournissent une validation stricte.
|
|
240
|
+
- **Async/Sync en parallèle** : Le SDK implémente systématiquement la double interface synchrone (`get_x`)
|
|
241
|
+
et asynchrone (`get_x_async`) pour un maximum de flexibilité d'intégration.
|
|
242
|
+
- **Cache HTTP** : Utilisation d'`hishel` pour le cache de requêtes HTTP asynchrones et d'un cache local
|
|
243
|
+
configurable pour optimiser les appels et respecter les quotas FFBB.
|
|
244
|
+
- **Validation** : Les paramètres passés à `FFBBDataClient.create` sont strictement validés
|
|
245
|
+
via les utilitaires de validation robustes de `utils/input_validation.py`.
|
|
246
|
+
|
|
247
|
+
## Commandes courantes
|
|
248
|
+
- Lancer les tests locaux : `rtk pytest`
|
|
249
|
+
- Lancer la suite d'intégration Tox : `rtk tox`
|
|
250
|
+
- Vérifier les types : `rtk mypy src`
|
|
251
|
+
- Formater et vérifier le style : `rtk ruff format . && rtk ruff check .`
|
|
252
|
+
|
|
253
|
+
## Push / Tag / Release Gate
|
|
254
|
+
⚠️ OBLIGATION STRICTE : Toutes ces commandes DOIVENT être préfixées par 'rtk' dans le terminal
|
|
255
|
+
(ex: 'rtk pytest'). Ne jamais exécuter de commande nue sans 'rtk'.
|
|
256
|
+
Avant push/tag/release :
|
|
257
|
+
1. `rtk ruff format --check .`
|
|
258
|
+
2. `rtk ruff check .`
|
|
259
|
+
3. `rtk mypy src`
|
|
260
|
+
4. `rtk pytest`
|
|
@@ -5,6 +5,39 @@ All notable changes to this project will be documented in this file.
|
|
|
5
5
|
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
|
|
6
6
|
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
7
7
|
|
|
8
|
+
## [2.3.0] - 2026-05-24
|
|
9
|
+
|
|
10
|
+
### Added
|
|
11
|
+
- **API Schema Drift Detection**: Automated detection of changes inside Directus OpenAPI schemas (added/removed/modified properties, nested types, and nullability changes)
|
|
12
|
+
- **Meilisearch Attributes Drift Detection**: Automated detection of changes inside Meilisearch index schemas (`sampleKeys`) with robust sampling over 20 hits
|
|
13
|
+
- **CI/CD Pull Request Automation**: Pre-commit hooks and GitHub Actions workflow automatically open a Pull Request when any API property or index drift is detected
|
|
14
|
+
- Detailed Schema Drift reporting in `data/api_update_summary.md` and `report["drift"]` payload
|
|
15
|
+
|
|
16
|
+
### Fixed
|
|
17
|
+
- Robust Meilisearch sampling: index keys are now aggregated across 20 hits instead of 1, preventing false positives on optional null fields
|
|
18
|
+
- Pre-commit & flake8 E501 line too long violations in `tools/update_agents_md.py`
|
|
19
|
+
- Formatted `AGENTS.md` spacing and line wrapping for flawless agent ingestion
|
|
20
|
+
|
|
21
|
+
## [2.2.0] - 2026-05-17
|
|
22
|
+
|
|
23
|
+
### Changed
|
|
24
|
+
- **REFACTOR**: `FFBBDataClient` (2865 → 272 lines) split into modular facades — `_RestFacade` (1592 lines) and `_SearchFacade` (1020 lines)
|
|
25
|
+
- Public API remains 100% backward-compatible — all 167 methods accessible directly on `FFBBDataClient`
|
|
26
|
+
- `check_wrapper_parity.py` updated to scan facade files in addition to the main client
|
|
27
|
+
|
|
28
|
+
### Added
|
|
29
|
+
- `pytest_asyncio_mode = "auto"` in `pyproject.toml` for pytest-asyncio compatibility
|
|
30
|
+
- `isolated_build = True` in `tox.ini` for proper PEP 517 builds
|
|
31
|
+
|
|
32
|
+
### Fixed
|
|
33
|
+
- `CacheManager` docstring corrected — Redis backend marked as "planned" (not implemented)
|
|
34
|
+
- `readme_renderer[md]` moved from `install_requires` to `testing` extras (build-time only dependency)
|
|
35
|
+
|
|
36
|
+
### Removed
|
|
37
|
+
- Orphaned `src/ffbb_api_client_v3/` directory (residual from v2.1.0 cleanup)
|
|
38
|
+
- Orphaned `.coverage` file at project root
|
|
39
|
+
- `benchmark_search_organisme.py` moved from root to `scripts/`
|
|
40
|
+
|
|
8
41
|
## [2.1.0] - 2026-05-17
|
|
9
42
|
|
|
10
43
|
### Changed
|
|
@@ -1,28 +1,3 @@
|
|
|
1
|
-
.. todo:: THIS IS SUPPOSED TO BE AN EXAMPLE. MODIFY IT ACCORDING TO YOUR NEEDS!
|
|
2
|
-
|
|
3
|
-
The document assumes you are using a source repository service that promotes a
|
|
4
|
-
contribution model similar to `GitHub's fork and pull request workflow`_.
|
|
5
|
-
While this is true for the majority of services (like GitHub, GitLab,
|
|
6
|
-
BitBucket), it might not be the case for private repositories (e.g., when
|
|
7
|
-
using Gerrit).
|
|
8
|
-
|
|
9
|
-
Also notice that the code examples might refer to GitHub URLs or the text
|
|
10
|
-
might use GitHub specific terminology (e.g., *Pull Request* instead of *Merge
|
|
11
|
-
Request*).
|
|
12
|
-
|
|
13
|
-
Please make sure to check the document having these assumptions in mind
|
|
14
|
-
and update things accordingly.
|
|
15
|
-
|
|
16
|
-
.. todo:: Provide the correct links/replacements at the bottom of the document.
|
|
17
|
-
|
|
18
|
-
.. todo:: You might want to have a look on `PyScaffold's contributor's guide`_,
|
|
19
|
-
|
|
20
|
-
especially if your project is open source. The text should be very similar to
|
|
21
|
-
this template, but there are a few extra contents that you might decide to
|
|
22
|
-
also include, like mentioning labels of your issue tracker or automated
|
|
23
|
-
releases.
|
|
24
|
-
|
|
25
|
-
|
|
26
1
|
============
|
|
27
2
|
Contributing
|
|
28
3
|
============
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: ffbb-data-client
|
|
3
|
-
Version: 2.
|
|
3
|
+
Version: 2.3.0
|
|
4
4
|
Summary: FFBB Data Client — SDK Python asynchrone pour les Statistiques de Basket France. Type-safe Pydantic models, async/sync, Meilisearch.
|
|
5
5
|
Home-page: https://github.com/nickdesi/ffbb-data-client
|
|
6
6
|
Author: nickdesi
|
|
@@ -33,7 +33,6 @@ Requires-Python: >=3.10
|
|
|
33
33
|
Description-Content-Type: text/markdown; charset=UTF-8
|
|
34
34
|
License-File: LICENSE.txt
|
|
35
35
|
Requires-Dist: python-dotenv>=1.2.2
|
|
36
|
-
Requires-Dist: readme_renderer[md]>=44.0
|
|
37
36
|
Requires-Dist: python-dateutil>=2.9.0.post0
|
|
38
37
|
Requires-Dist: httpx>=0.28.1
|
|
39
38
|
Requires-Dist: hishel[async]>=1.2.1
|
|
@@ -46,6 +45,7 @@ Requires-Dist: pytest-xdist>=3.8.0; extra == "testing"
|
|
|
46
45
|
Requires-Dist: pytest-cov>=7.1.0; extra == "testing"
|
|
47
46
|
Requires-Dist: respx>=0.23.1; extra == "testing"
|
|
48
47
|
Requires-Dist: pytest-asyncio>=1.3.0; extra == "testing"
|
|
48
|
+
Requires-Dist: readme_renderer[md]>=44.0; extra == "testing"
|
|
49
49
|
Provides-Extra: typing
|
|
50
50
|
Requires-Dist: types-python-dateutil>=2.9.0.20260408; extra == "typing"
|
|
51
51
|
Dynamic: license-file
|
|
@@ -85,18 +85,17 @@ Dynamic: license-file
|
|
|
85
85
|
- du cache HTTP configurable via `hishel` ;
|
|
86
86
|
- des helpers prêts pour l'intégration MCP / agents IA.
|
|
87
87
|
|
|
88
|
-
> La V3 remplace l’approche V2 basée sur des dictionnaires bruts et une configuration manuelle. Elle privilégie le typage, la robustesse réseau et les appels batchés.
|
|
89
|
-
|
|
90
88
|
---
|
|
91
89
|
|
|
92
|
-
## 🚀 Version v2.
|
|
90
|
+
## 🚀 Version v2.2.0 — Mai 2026
|
|
93
91
|
|
|
94
92
|
Principales évolutions récentes :
|
|
95
93
|
|
|
96
|
-
- **
|
|
94
|
+
- **refactor architecture** : `FFBBDataClient` (2865 → 272 lignes) découpé en `_RestFacade` + `_SearchFacade` — API publique 100% compatible ;
|
|
95
|
+
- **unification sync/async** : les méthodes synchrones délèguent à leurs homologues asynchrones via `_run_async()`, éliminant ~604 lignes de duplication ;
|
|
97
96
|
- **nouvelles entités** : EDF (matches, joueurs, rosters, équipes), Genius Sport (matches, live logs), Rematch Videos ;
|
|
98
97
|
- **cache SQLite concurrency-safe** : fichiers séparés pour sync (`http_cache.db`) et async (`http_cache_async.db`) ;
|
|
99
|
-
- **CI renforcée** : mypy + pyright + CodeQL + Dependabot + hook pre-push ;
|
|
98
|
+
- **CI renforcée** : mypy + pyright + CodeQL + Dependabot + hook pre-push + wrapper parity check ;
|
|
100
99
|
- **nettoyage** : suppression du shim `ffbb_api_client_v3`, scripts morts et code mort (`invalidate_pattern`).
|
|
101
100
|
|
|
102
101
|
Voir aussi : [`CHANGELOG.md`](CHANGELOG.md) et [`RELEASE_NOTES.md`](RELEASE_NOTES.md).
|
|
@@ -272,7 +271,9 @@ Il est donc possible de laisser le client résoudre les tokens automatiquement o
|
|
|
272
271
|
```text
|
|
273
272
|
src/ffbb_data_client/
|
|
274
273
|
├── clients/
|
|
275
|
-
│ ├── ffbb_data_client.py # Façade publique (
|
|
274
|
+
│ ├── ffbb_data_client.py # Façade publique (272 lignes, delegation)
|
|
275
|
+
│ ├── _rest_facade.py # Façade REST API (Directus)
|
|
276
|
+
│ ├── _search_facade.py # Façade recherche Meilisearch
|
|
276
277
|
│ ├── api_ffbb_app_client.py # Client REST FFBB (async source of truth)
|
|
277
278
|
│ └── meilisearch_ffbb_client.py # Client recherche Meilisearch
|
|
278
279
|
├── helpers/ # Requêtes HTTP, multi-search, conversions
|
|
@@ -282,6 +283,8 @@ src/ffbb_data_client/
|
|
|
282
283
|
```
|
|
283
284
|
|
|
284
285
|
> **Architecture sync/async** : Depuis v2.1.0, les méthodes asynchrones sont la source de vérité. Les méthodes synchrones délèguent via `_run_async()`, un helper qui gère les event loops imbriqués avec `ThreadPoolExecutor`.
|
|
286
|
+
>
|
|
287
|
+
> **Architecture facades** : Depuis v2.2.0, `FFBBDataClient` est une fine coquille qui compose `_RestFacade` et `_SearchFacade`. L'API publique reste identique — `client.get_organisme(123)` fonctionne comme avant.
|
|
285
288
|
|
|
286
289
|
---
|
|
287
290
|
|
|
@@ -313,6 +316,28 @@ Documentation complémentaire :
|
|
|
313
316
|
|
|
314
317
|
---
|
|
315
318
|
|
|
319
|
+
## 🛠️ Découverte d'API et Détection de Drift (Schema Drift)
|
|
320
|
+
|
|
321
|
+
Le projet intègre un système robuste de surveillance quotidienne de l'API de production de la FFBB (Directus & Meilisearch) afin de détecter immédiatement l'apparition de nouvelles ressources, de nouveaux champs ou de changements de types.
|
|
322
|
+
|
|
323
|
+
### 1. Fonctionnement
|
|
324
|
+
* **Script de découverte** : `scripts/discover_endpoints.py` interroge dynamiquement l'OpenAPI spec Directus de la FFBB, extrait toutes les collections, sonde les index Meilisearch (via un échantillonnage agrégé sur 20 hits) et calcule les différences structurelles avec les fichiers locaux.
|
|
325
|
+
* **Détection de dérive** : Le script compare les structures internes de chaque modèle (propriétés ajoutées, supprimées ou types modifiés) ainsi que les attributs Meilisearch, et génère un rapport consolidé dans `data/api_update_summary.md`.
|
|
326
|
+
|
|
327
|
+
### 2. Automatisation CI/CD
|
|
328
|
+
Un workflow quotidien (`update-ffbb-api-discovery.yml`) s'exécute chaque matin à 5h17 UTC pour :
|
|
329
|
+
1. Télécharger l'OpenAPI spec et sonder Meilisearch en production.
|
|
330
|
+
2. Analyser les dérives structurelles.
|
|
331
|
+
3. Si un changement structurel est détecté (ajout de collection, de propriétés ou d'index), le workflow ouvre automatiquement une **Pull Request** sur GitHub contenant un résumé des modifications pour permettre aux développeurs de mettre à jour les modèles Pydantic.
|
|
332
|
+
|
|
333
|
+
### 3. Exécution locale
|
|
334
|
+
Pour lancer manuellement la découverte d'API et mettre à jour les fichiers de schémas locaux :
|
|
335
|
+
```bash
|
|
336
|
+
python scripts/discover_endpoints.py
|
|
337
|
+
```
|
|
338
|
+
|
|
339
|
+
---
|
|
340
|
+
|
|
316
341
|
## 🤖 Intégration IA / MCP
|
|
317
342
|
|
|
318
343
|
Le client sert de base au serveur MCP FFBB et expose une API stable pour construire des outils agent-friendly : recherche de clubs, récupération de poules, classements, lives, calendriers et détails de rencontres.
|
|
@@ -33,18 +33,17 @@
|
|
|
33
33
|
- du cache HTTP configurable via `hishel` ;
|
|
34
34
|
- des helpers prêts pour l'intégration MCP / agents IA.
|
|
35
35
|
|
|
36
|
-
> La V3 remplace l’approche V2 basée sur des dictionnaires bruts et une configuration manuelle. Elle privilégie le typage, la robustesse réseau et les appels batchés.
|
|
37
|
-
|
|
38
36
|
---
|
|
39
37
|
|
|
40
|
-
## 🚀 Version v2.
|
|
38
|
+
## 🚀 Version v2.2.0 — Mai 2026
|
|
41
39
|
|
|
42
40
|
Principales évolutions récentes :
|
|
43
41
|
|
|
44
|
-
- **
|
|
42
|
+
- **refactor architecture** : `FFBBDataClient` (2865 → 272 lignes) découpé en `_RestFacade` + `_SearchFacade` — API publique 100% compatible ;
|
|
43
|
+
- **unification sync/async** : les méthodes synchrones délèguent à leurs homologues asynchrones via `_run_async()`, éliminant ~604 lignes de duplication ;
|
|
45
44
|
- **nouvelles entités** : EDF (matches, joueurs, rosters, équipes), Genius Sport (matches, live logs), Rematch Videos ;
|
|
46
45
|
- **cache SQLite concurrency-safe** : fichiers séparés pour sync (`http_cache.db`) et async (`http_cache_async.db`) ;
|
|
47
|
-
- **CI renforcée** : mypy + pyright + CodeQL + Dependabot + hook pre-push ;
|
|
46
|
+
- **CI renforcée** : mypy + pyright + CodeQL + Dependabot + hook pre-push + wrapper parity check ;
|
|
48
47
|
- **nettoyage** : suppression du shim `ffbb_api_client_v3`, scripts morts et code mort (`invalidate_pattern`).
|
|
49
48
|
|
|
50
49
|
Voir aussi : [`CHANGELOG.md`](CHANGELOG.md) et [`RELEASE_NOTES.md`](RELEASE_NOTES.md).
|
|
@@ -220,7 +219,9 @@ Il est donc possible de laisser le client résoudre les tokens automatiquement o
|
|
|
220
219
|
```text
|
|
221
220
|
src/ffbb_data_client/
|
|
222
221
|
├── clients/
|
|
223
|
-
│ ├── ffbb_data_client.py # Façade publique (
|
|
222
|
+
│ ├── ffbb_data_client.py # Façade publique (272 lignes, delegation)
|
|
223
|
+
│ ├── _rest_facade.py # Façade REST API (Directus)
|
|
224
|
+
│ ├── _search_facade.py # Façade recherche Meilisearch
|
|
224
225
|
│ ├── api_ffbb_app_client.py # Client REST FFBB (async source of truth)
|
|
225
226
|
│ └── meilisearch_ffbb_client.py # Client recherche Meilisearch
|
|
226
227
|
├── helpers/ # Requêtes HTTP, multi-search, conversions
|
|
@@ -230,6 +231,8 @@ src/ffbb_data_client/
|
|
|
230
231
|
```
|
|
231
232
|
|
|
232
233
|
> **Architecture sync/async** : Depuis v2.1.0, les méthodes asynchrones sont la source de vérité. Les méthodes synchrones délèguent via `_run_async()`, un helper qui gère les event loops imbriqués avec `ThreadPoolExecutor`.
|
|
234
|
+
>
|
|
235
|
+
> **Architecture facades** : Depuis v2.2.0, `FFBBDataClient` est une fine coquille qui compose `_RestFacade` et `_SearchFacade`. L'API publique reste identique — `client.get_organisme(123)` fonctionne comme avant.
|
|
233
236
|
|
|
234
237
|
---
|
|
235
238
|
|
|
@@ -261,6 +264,28 @@ Documentation complémentaire :
|
|
|
261
264
|
|
|
262
265
|
---
|
|
263
266
|
|
|
267
|
+
## 🛠️ Découverte d'API et Détection de Drift (Schema Drift)
|
|
268
|
+
|
|
269
|
+
Le projet intègre un système robuste de surveillance quotidienne de l'API de production de la FFBB (Directus & Meilisearch) afin de détecter immédiatement l'apparition de nouvelles ressources, de nouveaux champs ou de changements de types.
|
|
270
|
+
|
|
271
|
+
### 1. Fonctionnement
|
|
272
|
+
* **Script de découverte** : `scripts/discover_endpoints.py` interroge dynamiquement l'OpenAPI spec Directus de la FFBB, extrait toutes les collections, sonde les index Meilisearch (via un échantillonnage agrégé sur 20 hits) et calcule les différences structurelles avec les fichiers locaux.
|
|
273
|
+
* **Détection de dérive** : Le script compare les structures internes de chaque modèle (propriétés ajoutées, supprimées ou types modifiés) ainsi que les attributs Meilisearch, et génère un rapport consolidé dans `data/api_update_summary.md`.
|
|
274
|
+
|
|
275
|
+
### 2. Automatisation CI/CD
|
|
276
|
+
Un workflow quotidien (`update-ffbb-api-discovery.yml`) s'exécute chaque matin à 5h17 UTC pour :
|
|
277
|
+
1. Télécharger l'OpenAPI spec et sonder Meilisearch en production.
|
|
278
|
+
2. Analyser les dérives structurelles.
|
|
279
|
+
3. Si un changement structurel est détecté (ajout de collection, de propriétés ou d'index), le workflow ouvre automatiquement une **Pull Request** sur GitHub contenant un résumé des modifications pour permettre aux développeurs de mettre à jour les modèles Pydantic.
|
|
280
|
+
|
|
281
|
+
### 3. Exécution locale
|
|
282
|
+
Pour lancer manuellement la découverte d'API et mettre à jour les fichiers de schémas locaux :
|
|
283
|
+
```bash
|
|
284
|
+
python scripts/discover_endpoints.py
|
|
285
|
+
```
|
|
286
|
+
|
|
287
|
+
---
|
|
288
|
+
|
|
264
289
|
## 🤖 Intégration IA / MCP
|
|
265
290
|
|
|
266
291
|
Le client sert de base au serveur MCP FFBB et expose une API stable pour construire des outils agent-friendly : recherche de clubs, récupération de poules, classements, lives, calendriers et détails de rencontres.
|
|
@@ -1,6 +1,31 @@
|
|
|
1
1
|
# Release Notes - FFBB API Client V2
|
|
2
2
|
|
|
3
|
-
## Version
|
|
3
|
+
## Version 2.2.0 (Latest Release)
|
|
4
|
+
|
|
5
|
+
### 🏗 Architecture Refactor
|
|
6
|
+
|
|
7
|
+
#### **Facade Pattern — FFBBDataClient Modularization**
|
|
8
|
+
- **REFACTOR**: `FFBBDataClient` split from a monolithic 2865-line file into three focused modules:
|
|
9
|
+
- `ffbb_data_client.py` (272 lines) — thin public facade with factory and delegation
|
|
10
|
+
- `_rest_facade.py` (1592 lines) — all REST API (Directus) methods
|
|
11
|
+
- `_search_facade.py` (1020 lines) — all Meilisearch search methods
|
|
12
|
+
- **BACKWARD-COMPATIBLE**: All 167 public methods remain accessible directly on `FFBBDataClient` instances — zero breaking changes
|
|
13
|
+
- Methods delegated via `setattr` at construction time — no performance impact
|
|
14
|
+
|
|
15
|
+
#### **CI & Build Improvements**
|
|
16
|
+
- `pytest_asyncio_mode = "auto"` — prevents pytest-asyncio breaking changes across versions
|
|
17
|
+
- `isolated_build = True` in tox — proper PEP 517 builds with setuptools_scm
|
|
18
|
+
- `check_wrapper_parity.py` updated to scan facade files alongside the main client
|
|
19
|
+
|
|
20
|
+
### 🐛 Bug Fixes & Cleanup
|
|
21
|
+
- `CacheManager` docstring corrected — Redis backend documented as "planned"
|
|
22
|
+
- `readme_renderer[md]` moved to dev extras (was incorrectly in runtime dependencies)
|
|
23
|
+
- Orphaned `src/ffbb_api_client_v3/` directory removed
|
|
24
|
+
- `benchmark_search_organisme.py` moved to `scripts/`
|
|
25
|
+
|
|
26
|
+
---
|
|
27
|
+
|
|
28
|
+
## Version 2.1.0 (Previous Release)
|
|
4
29
|
|
|
5
30
|
### 🚀 Major Features & Improvements
|
|
6
31
|
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
# FFBB API update summary
|
|
2
|
+
|
|
3
|
+
- Timestamp: `2026-05-24T11:03:57.203628+00:00`
|
|
4
|
+
- API base URL: `https://api.ffbb.app/`
|
|
5
|
+
- Meilisearch base URL: `https://meilisearch-prod.ffbb.app/`
|
|
6
|
+
- OpenAPI version: `9be33d74bfb480282da91c53c8dfa29804914c96`
|
|
7
|
+
- OpenAPI SHA256: `d63e8450719e2580e1ab6c4960d6de978c1e2ab457f5e9d71cc3e872ed272641`
|
|
8
|
+
|
|
9
|
+
## Directus collections
|
|
10
|
+
- Total: `164`
|
|
11
|
+
- Added: None
|
|
12
|
+
- Removed: None
|
|
13
|
+
|
|
14
|
+
## Directus item paths
|
|
15
|
+
- Total: `331`
|
|
16
|
+
- Added: None
|
|
17
|
+
- Removed: None
|
|
18
|
+
|
|
19
|
+
## Meilisearch indexes
|
|
20
|
+
- Available total: `13`
|
|
21
|
+
- Added: None
|
|
22
|
+
- Removed: None
|
|
23
|
+
|
|
24
|
+
## Directus schema properties drift
|
|
25
|
+
- **ItemsFfbbsiteBlockJobs** :
|
|
26
|
+
- Added properties: `code`, `subscription_form`, `type_filter`
|
|
27
|
+
- **ItemsFfbbsiteJobs** :
|
|
28
|
+
- Added properties: `category`, `date_published`, `degree`, `postal_code`, `structure`, `structure_linked`, `terms_contact`, `type`
|
|
29
|
+
|
|
30
|
+
Generated by `python scripts/discover_endpoints.py`.
|