ffbb-data-client 2.0.2__tar.gz → 2.2.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.0.2 → ffbb_data_client-2.2.0}/.coveragerc +5 -5
- ffbb_data_client-2.2.0/.github/dependabot.yml +19 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/.github/scripts/check_wrapper_parity.py +31 -7
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/.github/workflows/check_wrapper_parity.yml +2 -2
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/.github/workflows/ci.yml +7 -1
- ffbb_data_client-2.2.0/.github/workflows/codeql.yml +33 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/.github/workflows/deploy-pages.yml +3 -3
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/.github/workflows/publish.yml +20 -8
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/.github/workflows/release-after-discovery-merge.yml +1 -1
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/.github/workflows/update-ffbb-api-discovery.yml +4 -4
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/.pre-commit-config.yaml +10 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/CHANGELOG.md +50 -0
- {ffbb_data_client-2.0.2/src/ffbb_data_client.egg-info → ffbb_data_client-2.2.0}/PKG-INFO +32 -22
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/README.md +29 -19
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/RELEASE_NOTES.md +26 -1
- ffbb_data_client-2.2.0/SECURITY.md +15 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/docs/conf.py +1 -4
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/docs/requirements.txt +2 -2
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/pyproject.toml +1 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/setup.cfg +2 -2
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/__init__.py +0 -18
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/clients/__init__.py +4 -0
- ffbb_data_client-2.0.2/src/ffbb_data_client/clients/ffbb_data_client.py → ffbb_data_client-2.2.0/src/ffbb_data_client/clients/_rest_facade.py +396 -1510
- ffbb_data_client-2.2.0/src/ffbb_data_client/clients/_search_facade.py +1046 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/clients/api_ffbb_app_client.py +551 -636
- ffbb_data_client-2.2.0/src/ffbb_data_client/clients/ffbb_data_client.py +270 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/data/__init__.py +6 -3
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/commune.py +2 -2
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/get_rencontre_response.py +1 -1
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/query_fields_manager.py +1 -1
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/team_ranking.py +1 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/utils/cache_manager.py +12 -30
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/utils/retry_utils.py +6 -3
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0/src/ffbb_data_client.egg-info}/PKG-INFO +32 -22
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client.egg-info/SOURCES.txt +6 -4
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client.egg-info/requires.txt +2 -2
- ffbb_data_client-2.2.0/src/ffbb_data_client.egg-info/top_level.txt +1 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/tests/integration/test_502_enhanced_integration.py +2 -2
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/tests/integration/test_506_raw_json_model_conversion.py +37 -9
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/tests/unit/clients/test_201_unit_tests_core.py +61 -19
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/tests/unit/clients/test_207_coverage_clients_extended.py +10 -3
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/tests/unit/clients/test_208_new_methods_coverage.py +40 -10
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/tests/unit/clients/test_210_targeted_clients_helpers_coverage.py +23 -12
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/tests/unit/utils/test_303_cache_manager.py +0 -7
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/tests/unit/utils/test_307_coverage_gaps_utils.py +0 -24
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/tox.ini +15 -1
- ffbb_data_client-2.0.2/diagnose-ci-issues.sh +0 -243
- ffbb_data_client-2.0.2/scratch.py +0 -21
- ffbb_data_client-2.0.2/src/ffbb_api_client_v3/__init__.py +0 -25
- ffbb_data_client-2.0.2/src/ffbb_data_client.egg-info/top_level.txt +0 -3
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/.gitignore +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/.isort.cfg +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/.jules/bolt.md +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/.readthedocs.yml +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/AUTHORS.rst +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/CONTRIBUTING.rst +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/LICENSE.txt +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/LOCAL_CI_GUIDE.md +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/data/api.ffbb.app.json +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/data/api_update_summary.md +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/data/collections.json +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/data/endpoint_discovery.json +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/data/indexes.json +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/data/meilisearch-prod.ffbb.app.json +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/data/openapi.json +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/data/openapi_full.json +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/data/type_discovery_corrections.json +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/docs/Makefile +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/docs/_static/.gitignore +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/docs/architecture.rst +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/docs/authors.rst +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/docs/changelog.rst +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/docs/contributing.rst +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/docs/examples.rst +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/docs/index.rst +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/docs/license.rst +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/docs/migration.rst +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/docs/readme.rst +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/docs/test_strategy.md +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/docs/testing_conventions.md +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/examples/README.md +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/examples/complete_usage_example.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/examples/quick_start.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/examples/team_ranking_analysis.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/pytest.ini +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/run-ci-locally.sh +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0/scripts}/benchmark_search_organisme.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/scripts/discover_endpoints.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/scripts/discover_types.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/setup.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/clients/meilisearch_client.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/clients/meilisearch_ffbb_client.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/config.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/data/collections.json +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/data/endpoint_discovery.json +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/data/indexes.json +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/data/openapi.json +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/data/openapi_full.json +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/helpers/__init__.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/helpers/http_requests_helper.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/helpers/http_requests_utils.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/helpers/meilisearch_client_extension.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/helpers/multi_search_query_helper.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/__init__.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/affiche.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/cartographie.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/categorie.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/categorie_type.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/clock.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/club_contacts.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/code.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/competition_fields.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/competition_id.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/competition_id_categorie.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/competition_id_sexe.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/competition_id_type_competition.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/competition_id_type_competition_generique.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/competition_origine.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/competition_origine_categorie.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/competition_origine_type_competition.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/competition_origine_type_competition_generique.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/competition_type.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/competitions_facet_distribution.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/competitions_facet_stats.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/competitions_hit.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/competitions_multi_search_query.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/competitions_query.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/configuration_models.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/contact_info.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/content_multi_search_query.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/coordonnees.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/coordonnees_type.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/document_flyer.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/document_flyer_type.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/engagement_contacts.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/engagements_facet_distribution.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/engagements_facet_stats.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/engagements_hit.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/engagements_multi_search_query.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/etat.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/external_competition_id.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/external_id.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/facet_distribution.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/facet_stats.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/field_set.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/folder.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/formation_session.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/formations_facet_distribution.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/formations_facet_stats.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/formations_hit.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/formations_multi_search_query.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/game_stats_model.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/game_stats_models.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/generic_search.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/geo.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/geo_sort_order.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/get_commune_response.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/get_competition_response.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/get_configuration_response.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/get_engagement_response.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/get_entraineur_response.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/get_formation_response.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/get_officiel_response.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/get_organisme_response.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/get_poule_response.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/get_pratique_response.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/get_saisons_response.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/get_salle_response.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/get_terrain_response.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/get_tournoi_response.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/gradient_color.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/hit.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/id_engagement_equipe.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/id_organisme_equipe.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/id_organisme_equipe1_logo.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/id_poule.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/jour.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/label.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/labellisation.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/live.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/lives.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/logo.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/multi_search_queries.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/multi_search_query.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/multi_search_result_competitions.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/multi_search_result_engagements.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/multi_search_result_formations.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/multi_search_result_organismes.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/multi_search_result_pratiques.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/multi_search_result_rencontres.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/multi_search_result_salles.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/multi_search_result_terrains.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/multi_search_result_tournois.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/multi_search_results.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/multi_search_results_class.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/nature_sol.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/niveau.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/niveau_class.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/niveau_extractor.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/niveau_info.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/niveau_models.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/niveau_type.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/objectif.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/organisateur.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/organisateur_type.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/organisme_fields.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/organisme_id_pere.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/organismes_facet_distribution.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/organismes_facet_stats.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/organismes_hit.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/organismes_multi_search_query.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/organismes_query.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/phase_code.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/poule.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/poule_fields.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/poule_rencontre_item_model.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/poules_models.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/poules_query.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/pratique.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/pratiques_facet_distribution.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/pratiques_facet_stats.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/pratiques_hit.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/pratiques_hit_type.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/pratiques_multi_search_query.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/pratiques_type_class.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/publication_internet.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/purple_logo.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/ranking_engagement.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/rankings_models.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/rencontres_engagement.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/rencontres_facet_distribution.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/rencontres_facet_stats.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/rencontres_hit.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/rencontres_multi_search_query.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/saison.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/saison_fields.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/saisons_models.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/saisons_query.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/salle.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/salles_facet_distribution.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/salles_facet_stats.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/salles_hit.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/salles_multi_search_query.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/sexe.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/sexe_class.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/source.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/status.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/team_engagement.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/terrains_categorie_championnat_3x3_libelle.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/terrains_facet_distribution.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/terrains_facet_stats.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/terrains_hit.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/terrains_multi_search_query.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/terrains_name.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/terrains_sexe_enum.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/terrains_storage.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/tournoi_type_class.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/tournoi_type_enum.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/tournoi_types_3x3.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/tournoi_types_3x3_libelle.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/tournoi_types_3x3_libelle_enum.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/tournois_facet_distribution.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/tournois_facet_stats.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/tournois_hit.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/tournois_hit_type.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/tournois_libelle.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/tournois_multi_search_query.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/type_association.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/type_association_libelle.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/type_class.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/type_competition.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/type_competition_generique.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/type_enum.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/type_league.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/py.typed +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/utils/__init__.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/utils/converter_utils.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/utils/input_validation.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/utils/secure_logging.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/utils/token_manager.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client.egg-info/dependency_links.txt +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client.egg-info/not-zip-safe +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/tests/conftest.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/tests/e2e/__init__.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/tests/e2e/conftest.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/tests/integration/__init__.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/tests/integration/conftest.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/tests/integration/test_500_user_journey.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/tests/integration/test_501_user_journey_v3.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/tests/integration/test_503_secure_logging.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/tests/integration/test_504_input_validation.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/tests/integration/test_505_retry_timeout.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/tests/unit/__init__.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/tests/unit/clients/__init__.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/tests/unit/clients/test_200_api_ffbb_app_client.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/tests/unit/clients/test_202_meilisearch_client.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/tests/unit/clients/test_203_meilisearch_client_extension.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/tests/unit/clients/test_204_ffbb_data_client.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/tests/unit/clients/test_205_meilisearch_ffbb_client.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/tests/unit/clients/test_206_coverage_gaps_clients.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/tests/unit/clients/test_209_automatic_token_resolution.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/tests/unit/clients/test_async_methods.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/tests/unit/clients/test_meilisearch_async.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/tests/unit/clients/test_v2_backport_search.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/tests/unit/clients/test_v3_new_features.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/tests/unit/conftest.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/tests/unit/helpers/__init__.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/tests/unit/helpers/test_400_http_helpers.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/tests/unit/helpers/test_meilisearch_client_extension_recursive_pagination.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/tests/unit/models/__init__.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/tests/unit/models/test_100_competition_id_categorie.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/tests/unit/models/test_101_competition_id_sexe.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/tests/unit/models/test_102_competition_id_type_competition.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/tests/unit/models/test_103_competition_id_type_competition_generique.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/tests/unit/models/test_104_competition_origine_categorie.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/tests/unit/models/test_105_competition_origine_type_competition_generique.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/tests/unit/models/test_106_competition_origine.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/tests/unit/models/test_107_id_engagement_equipe.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/tests/unit/models/test_108_id_organisme_equipe.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/tests/unit/models/test_109_id_organisme_equipe1_logo.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/tests/unit/models/test_110_labellisation.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/tests/unit/models/test_111_niveau_class.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/tests/unit/models/test_112_purple_logo.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/tests/unit/models/test_113_salle.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/tests/unit/models/test_114_tournoi_type_class.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/tests/unit/models/test_115_type_association_libelle.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/tests/unit/models/test_116_type_competition_generique.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/tests/unit/models/test_117_organisateur.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/tests/unit/models/test_118_competition_id.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/tests/unit/models/test_119_terrains_inner_models.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/tests/unit/models/test_120_pratiques_inner_models.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/tests/unit/models/test_121_to_dict_round_trip.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/tests/unit/models/test_122_coverage_gaps.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/tests/unit/models/test_123_missing_coverage.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/tests/unit/models/test_123_v2_backport.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/tests/unit/models/test_124_targeted_coverage_gains.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/tests/unit/models/test_dx_aliases.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/tests/unit/utils/__init__.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/tests/unit/utils/test_300_secure_logging.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/tests/unit/utils/test_301_input_validation.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/tests/unit/utils/test_302_retry_utils.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/tests/unit/utils/test_304_config.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/tests/unit/utils/test_305_token_manager.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/tests/unit/utils/test_306_converter_utils.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/website/assets/logo.webp +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/website/css/style.css +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/website/index.html +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/website/robots.txt +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/website/sitemap.xml +0 -0
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
|
|
4
4
|
[run]
|
|
5
5
|
branch = True
|
|
6
|
-
source =
|
|
6
|
+
source = ffbb_data_client
|
|
7
7
|
parallel = True
|
|
8
8
|
# CRITICAL for Coveralls: ensures paths are relative to the git root
|
|
9
9
|
# Without this, Coveralls reports 0% or fails to map files
|
|
@@ -21,9 +21,9 @@ omit =
|
|
|
21
21
|
# Maps coverage paths from different environments (tox, Docker, etc.)
|
|
22
22
|
# to the canonical source root. Order matters: first match wins.
|
|
23
23
|
source =
|
|
24
|
-
src/
|
|
25
|
-
*/
|
|
26
|
-
*/src/
|
|
24
|
+
src/ffbb_data_client
|
|
25
|
+
*/ffbb_data_client
|
|
26
|
+
*/src/ffbb_data_client
|
|
27
27
|
|
|
28
28
|
[report]
|
|
29
29
|
# Minimum coverage threshold — CI will fail below this
|
|
@@ -62,7 +62,7 @@ exclude_lines =
|
|
|
62
62
|
|
|
63
63
|
[html]
|
|
64
64
|
directory = htmlcov
|
|
65
|
-
title =
|
|
65
|
+
title = FFBB Data Client Coverage
|
|
66
66
|
|
|
67
67
|
[xml]
|
|
68
68
|
# Required by coverallsapp/github-action@v2 Universal Coverage Reporter
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
version: 2
|
|
2
|
+
updates:
|
|
3
|
+
- package-ecosystem: "github-actions"
|
|
4
|
+
directory: "/"
|
|
5
|
+
schedule:
|
|
6
|
+
interval: "weekly"
|
|
7
|
+
open-pull-requests-limit: 5
|
|
8
|
+
|
|
9
|
+
- package-ecosystem: "pip"
|
|
10
|
+
directory: "/"
|
|
11
|
+
schedule:
|
|
12
|
+
interval: "weekly"
|
|
13
|
+
open-pull-requests-limit: 5
|
|
14
|
+
|
|
15
|
+
- package-ecosystem: "pip"
|
|
16
|
+
directory: "/docs"
|
|
17
|
+
schedule:
|
|
18
|
+
interval: "weekly"
|
|
19
|
+
open-pull-requests-limit: 5
|
|
@@ -62,23 +62,49 @@ 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
|
|
75
87
|
|
|
76
88
|
# Build markdown report
|
|
89
|
+
missing_detail = " ".join(
|
|
90
|
+
[
|
|
91
|
+
"The following methods exist in inner clients but are **not exposed**",
|
|
92
|
+
"in `FFBBDataClient` or its facade files:",
|
|
93
|
+
]
|
|
94
|
+
)
|
|
95
|
+
fix_detail = " ".join(
|
|
96
|
+
[
|
|
97
|
+
"Add the missing method(s) to",
|
|
98
|
+
"`src/ffbb_data_client/clients/ffbb_data_client.py` or one of its",
|
|
99
|
+
"facade files (`_rest_facade.py`, `_search_facade.py`)",
|
|
100
|
+
"so they delegate to the appropriate inner client.",
|
|
101
|
+
]
|
|
102
|
+
)
|
|
103
|
+
|
|
77
104
|
lines = [
|
|
78
105
|
"## ⚠️ Wrapper parity check failed",
|
|
79
106
|
"",
|
|
80
|
-
|
|
81
|
-
"in `FFBBDataClient`:",
|
|
107
|
+
missing_detail,
|
|
82
108
|
"",
|
|
83
109
|
"| Method | Source client |",
|
|
84
110
|
"|---|---|",
|
|
@@ -94,9 +120,7 @@ def main() -> int:
|
|
|
94
120
|
lines += [
|
|
95
121
|
"",
|
|
96
122
|
"### How to fix",
|
|
97
|
-
|
|
98
|
-
"`src/ffbb_data_client/clients/ffbb_data_client.py` "
|
|
99
|
-
"so they delegate to the appropriate inner client.",
|
|
123
|
+
fix_detail,
|
|
100
124
|
]
|
|
101
125
|
|
|
102
126
|
report = "\n".join(lines)
|
{ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/.github/workflows/check_wrapper_parity.yml
RENAMED
|
@@ -23,10 +23,10 @@ jobs:
|
|
|
23
23
|
|
|
24
24
|
steps:
|
|
25
25
|
- name: Checkout
|
|
26
|
-
uses: actions/checkout@v6
|
|
26
|
+
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
|
|
27
27
|
|
|
28
28
|
- name: Set up Python
|
|
29
|
-
uses: actions/setup-python@v6
|
|
29
|
+
uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6.2.0
|
|
30
30
|
with:
|
|
31
31
|
python-version: '3.11'
|
|
32
32
|
|
|
@@ -37,6 +37,10 @@ jobs:
|
|
|
37
37
|
with: {python-version: "3.14"}
|
|
38
38
|
- name: Run static analysis and format checkers
|
|
39
39
|
run: pipx run pre-commit run --all-files --show-diff-on-failure
|
|
40
|
+
- name: Run type checks
|
|
41
|
+
run: >-
|
|
42
|
+
pipx run --python '${{ steps.setup-python.outputs.python-path }}'
|
|
43
|
+
tox -e type
|
|
40
44
|
- name: Build package distribution files
|
|
41
45
|
run: >-
|
|
42
46
|
pipx run --python '${{ steps.setup-python.outputs.python-path }}'
|
|
@@ -74,7 +78,7 @@ jobs:
|
|
|
74
78
|
tox -e validate
|
|
75
79
|
- name: Record the path of wheel distribution
|
|
76
80
|
id: wheel-distribution
|
|
77
|
-
run: echo "path=$(ls dist/*.whl)" >> $GITHUB_OUTPUT
|
|
81
|
+
run: echo "path=$(ls dist/*.whl)" >> "$GITHUB_OUTPUT"
|
|
78
82
|
- name: Store the distribution files for use in other stages
|
|
79
83
|
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
|
|
80
84
|
with:
|
|
@@ -118,6 +122,7 @@ jobs:
|
|
|
118
122
|
# `parallel: true` signals that more reports are coming from other jobs.
|
|
119
123
|
# `flag-name` labels this specific combination for per-flag drill-down on Coveralls.
|
|
120
124
|
- name: Upload coverage to Coveralls (parallel)
|
|
125
|
+
if: ${{ github.ref_type != 'tag' }}
|
|
121
126
|
uses: coverallsapp/github-action@648a8eb78e6d50909eff900e4ec85cab4524a45b # v2.3.6
|
|
122
127
|
with:
|
|
123
128
|
file: coverage.lcov
|
|
@@ -136,6 +141,7 @@ jobs:
|
|
|
136
141
|
if: ${{ always() }}
|
|
137
142
|
steps:
|
|
138
143
|
- name: Finalize coverage report on Coveralls
|
|
144
|
+
if: ${{ github.ref_type != 'tag' }}
|
|
139
145
|
uses: coverallsapp/github-action@648a8eb78e6d50909eff900e4ec85cab4524a45b # v2.3.6
|
|
140
146
|
with:
|
|
141
147
|
github-token: ${{ secrets.GITHUB_TOKEN }}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
name: CodeQL
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
branches: [master]
|
|
6
|
+
pull_request:
|
|
7
|
+
schedule:
|
|
8
|
+
- cron: '31 2 * * 1'
|
|
9
|
+
|
|
10
|
+
permissions:
|
|
11
|
+
contents: read
|
|
12
|
+
|
|
13
|
+
jobs:
|
|
14
|
+
analyze:
|
|
15
|
+
name: Analyze Python
|
|
16
|
+
runs-on: ubuntu-latest
|
|
17
|
+
permissions:
|
|
18
|
+
actions: read
|
|
19
|
+
contents: read
|
|
20
|
+
security-events: write
|
|
21
|
+
|
|
22
|
+
steps:
|
|
23
|
+
- name: Checkout
|
|
24
|
+
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
|
|
25
|
+
|
|
26
|
+
- name: Initialize CodeQL
|
|
27
|
+
uses: github/codeql-action/init@9e0d7b8d25671d64c341c19c0152d693099fb5ba # v4
|
|
28
|
+
with:
|
|
29
|
+
languages: python
|
|
30
|
+
queries: security-extended,security-and-quality
|
|
31
|
+
|
|
32
|
+
- name: Perform CodeQL Analysis
|
|
33
|
+
uses: github/codeql-action/analyze@9e0d7b8d25671d64c341c19c0152d693099fb5ba # v4
|
|
@@ -20,7 +20,7 @@ jobs:
|
|
|
20
20
|
runs-on: ubuntu-latest
|
|
21
21
|
steps:
|
|
22
22
|
- name: Checkout
|
|
23
|
-
uses: actions/checkout@v6
|
|
23
|
+
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
|
|
24
24
|
with:
|
|
25
25
|
fetch-depth: 0
|
|
26
26
|
|
|
@@ -36,7 +36,7 @@ jobs:
|
|
|
36
36
|
run: touch website/.nojekyll
|
|
37
37
|
|
|
38
38
|
- name: Upload Pages artifact
|
|
39
|
-
uses: actions/upload-pages-artifact@v5
|
|
39
|
+
uses: actions/upload-pages-artifact@fc324d3547104276b827a68afc52ff2a11cc49c9 # v5
|
|
40
40
|
with:
|
|
41
41
|
path: website
|
|
42
42
|
|
|
@@ -52,4 +52,4 @@ jobs:
|
|
|
52
52
|
steps:
|
|
53
53
|
- name: Deploy to GitHub Pages
|
|
54
54
|
id: deployment
|
|
55
|
-
uses: actions/deploy-pages@v5
|
|
55
|
+
uses: actions/deploy-pages@cd2ce8fcbc39b97be8ca5fce6e763baed58fa128 # v5
|
|
@@ -5,19 +5,26 @@ on:
|
|
|
5
5
|
tags:
|
|
6
6
|
- 'v*'
|
|
7
7
|
|
|
8
|
+
permissions:
|
|
9
|
+
contents: read
|
|
10
|
+
|
|
8
11
|
jobs:
|
|
9
12
|
build:
|
|
10
13
|
name: Build distribution
|
|
11
14
|
runs-on: ubuntu-latest
|
|
15
|
+
permissions:
|
|
16
|
+
attestations: write
|
|
17
|
+
contents: read
|
|
18
|
+
id-token: write
|
|
12
19
|
|
|
13
20
|
steps:
|
|
14
21
|
- name: Checkout
|
|
15
|
-
uses: actions/checkout@v6
|
|
22
|
+
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
|
|
16
23
|
with:
|
|
17
24
|
fetch-depth: 0 # Required for setuptools_scm to resolve version from tags
|
|
18
25
|
|
|
19
26
|
- name: Set up Python
|
|
20
|
-
uses: actions/setup-python@v6
|
|
27
|
+
uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6.2.0
|
|
21
28
|
with:
|
|
22
29
|
python-version: '3.11'
|
|
23
30
|
|
|
@@ -56,11 +63,16 @@ jobs:
|
|
|
56
63
|
PY
|
|
57
64
|
|
|
58
65
|
- name: Upload distribution artifacts
|
|
59
|
-
uses: actions/upload-artifact@v7
|
|
66
|
+
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
|
|
60
67
|
with:
|
|
61
68
|
name: dist
|
|
62
69
|
path: dist/
|
|
63
70
|
|
|
71
|
+
- name: Generate artifact attestation
|
|
72
|
+
uses: actions/attest@59d89421af93a897026c735860bf21b6eb4f7b26 # v4
|
|
73
|
+
with:
|
|
74
|
+
subject-path: dist/*
|
|
75
|
+
|
|
64
76
|
publish-pypi:
|
|
65
77
|
name: Publish to PyPI
|
|
66
78
|
needs: build
|
|
@@ -71,13 +83,13 @@ jobs:
|
|
|
71
83
|
|
|
72
84
|
steps:
|
|
73
85
|
- name: Download distribution artifacts
|
|
74
|
-
uses: actions/download-artifact@v8
|
|
86
|
+
uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
|
|
75
87
|
with:
|
|
76
88
|
name: dist
|
|
77
89
|
path: dist/
|
|
78
90
|
|
|
79
91
|
- name: Publish to PyPI
|
|
80
|
-
uses: pypa/gh-action-pypi-publish@release/v1
|
|
92
|
+
uses: pypa/gh-action-pypi-publish@cef221092ed1bacb1cc03d23a2d87d1d172e277b # release/v1
|
|
81
93
|
|
|
82
94
|
publish-github-release:
|
|
83
95
|
name: Create GitHub Release
|
|
@@ -88,13 +100,13 @@ jobs:
|
|
|
88
100
|
|
|
89
101
|
steps:
|
|
90
102
|
- name: Download distribution artifacts
|
|
91
|
-
uses: actions/download-artifact@v8
|
|
103
|
+
uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
|
|
92
104
|
with:
|
|
93
105
|
name: dist
|
|
94
106
|
path: dist/
|
|
95
107
|
|
|
96
108
|
- name: Create GitHub Release
|
|
97
|
-
uses: softprops/action-gh-release@v3
|
|
109
|
+
uses: softprops/action-gh-release@b4309332981a82ec1c5618f44dd2e27cc8bfbfda # v3
|
|
98
110
|
with:
|
|
99
111
|
files: dist/*
|
|
100
112
|
generate_release_notes: true
|
|
@@ -106,7 +118,7 @@ jobs:
|
|
|
106
118
|
|
|
107
119
|
steps:
|
|
108
120
|
- name: Dispatch bump event to FFBB-MCP-Server
|
|
109
|
-
uses: peter-evans/repository-dispatch@v4
|
|
121
|
+
uses: peter-evans/repository-dispatch@28959ce8df70de7be546dd1250a005dd32156697 # v4
|
|
110
122
|
with:
|
|
111
123
|
token: ${{ secrets.MCP_SERVER_PAT }}
|
|
112
124
|
repository: nickdesi/FFBB-MCP-Server
|
|
@@ -51,7 +51,7 @@ jobs:
|
|
|
51
51
|
|
|
52
52
|
- name: Checkout tested commit
|
|
53
53
|
if: steps.pr.outputs.release == 'true'
|
|
54
|
-
uses: actions/checkout@v6
|
|
54
|
+
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
|
|
55
55
|
with:
|
|
56
56
|
ref: ${{ github.event.workflow_run.head_sha }}
|
|
57
57
|
fetch-depth: 0
|
{ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/.github/workflows/update-ffbb-api-discovery.yml
RENAMED
|
@@ -19,10 +19,10 @@ jobs:
|
|
|
19
19
|
|
|
20
20
|
steps:
|
|
21
21
|
- name: Checkout
|
|
22
|
-
uses: actions/checkout@v6
|
|
22
|
+
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
|
|
23
23
|
|
|
24
24
|
- name: Set up Python
|
|
25
|
-
uses: actions/setup-python@v6
|
|
25
|
+
uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6.2.0
|
|
26
26
|
with:
|
|
27
27
|
python-version: '3.11'
|
|
28
28
|
|
|
@@ -44,7 +44,7 @@ jobs:
|
|
|
44
44
|
|
|
45
45
|
- name: Upload discovery summary
|
|
46
46
|
if: always()
|
|
47
|
-
uses: actions/upload-artifact@v7
|
|
47
|
+
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
|
|
48
48
|
with:
|
|
49
49
|
name: ffbb-api-update-summary
|
|
50
50
|
path: data/api_update_summary.md
|
|
@@ -53,7 +53,7 @@ jobs:
|
|
|
53
53
|
|
|
54
54
|
- name: Create pull request
|
|
55
55
|
if: steps.changes.outputs.changed == 'true'
|
|
56
|
-
uses: peter-evans/create-pull-request@v8
|
|
56
|
+
uses: peter-evans/create-pull-request@5f6978faf089d4d20b00c7766989d076bb2fc7f1 # v8
|
|
57
57
|
with:
|
|
58
58
|
token: ${{ secrets.GITHUB_TOKEN }}
|
|
59
59
|
branch: chore/update-ffbb-api-discovery
|
|
@@ -61,6 +61,16 @@ repos:
|
|
|
61
61
|
hooks:
|
|
62
62
|
- id: flake8
|
|
63
63
|
|
|
64
|
+
# Type-checking on push (mypy + pyright via tox)
|
|
65
|
+
- repo: local
|
|
66
|
+
hooks:
|
|
67
|
+
- id: type-check
|
|
68
|
+
name: type-check (mypy + pyright)
|
|
69
|
+
entry: bash -c 'PATH="$PWD/.venv/bin:$PATH" tox -e type'
|
|
70
|
+
language: system
|
|
71
|
+
pass_filenames: false
|
|
72
|
+
stages: [pre-push]
|
|
73
|
+
|
|
64
74
|
# Check for misspells in documentation files:
|
|
65
75
|
# - repo: https://github.com/codespell-project/codespell
|
|
66
76
|
# rev: v2.2.5
|
|
@@ -5,6 +5,56 @@ 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.2.0] - 2026-05-17
|
|
9
|
+
|
|
10
|
+
### Changed
|
|
11
|
+
- **REFACTOR**: `FFBBDataClient` (2865 → 272 lines) split into modular facades — `_RestFacade` (1592 lines) and `_SearchFacade` (1020 lines)
|
|
12
|
+
- Public API remains 100% backward-compatible — all 167 methods accessible directly on `FFBBDataClient`
|
|
13
|
+
- `check_wrapper_parity.py` updated to scan facade files in addition to the main client
|
|
14
|
+
|
|
15
|
+
### Added
|
|
16
|
+
- `pytest_asyncio_mode = "auto"` in `pyproject.toml` for pytest-asyncio compatibility
|
|
17
|
+
- `isolated_build = True` in `tox.ini` for proper PEP 517 builds
|
|
18
|
+
|
|
19
|
+
### Fixed
|
|
20
|
+
- `CacheManager` docstring corrected — Redis backend marked as "planned" (not implemented)
|
|
21
|
+
- `readme_renderer[md]` moved from `install_requires` to `testing` extras (build-time only dependency)
|
|
22
|
+
|
|
23
|
+
### Removed
|
|
24
|
+
- Orphaned `src/ffbb_api_client_v3/` directory (residual from v2.1.0 cleanup)
|
|
25
|
+
- Orphaned `.coverage` file at project root
|
|
26
|
+
- `benchmark_search_organisme.py` moved from root to `scripts/`
|
|
27
|
+
|
|
28
|
+
## [2.1.0] - 2026-05-17
|
|
29
|
+
|
|
30
|
+
### Changed
|
|
31
|
+
- **BREAKING (internal)**: Sync methods now delegate to async counterparts via `_run_async()` helper, eliminating ~604 lines of duplication
|
|
32
|
+
- Sync and async share a single source of truth — async methods are canonical
|
|
33
|
+
- `ThreadPoolExecutor` fallback handles nested event loops gracefully
|
|
34
|
+
|
|
35
|
+
### Added
|
|
36
|
+
- **NEW**: Pre-push hook for type-check (mypy + pyright) — catches type errors before push
|
|
37
|
+
- **NEW**: CodeQL security scanning in CI
|
|
38
|
+
- **NEW**: Dependabot for automated dependency updates (GitHub Actions + pip)
|
|
39
|
+
- **NEW**: `SECURITY.md` security policy
|
|
40
|
+
|
|
41
|
+
### Fixed
|
|
42
|
+
- SQLite cache concurrency: sync uses `http_cache.db`, async uses `http_cache_async.db` (prevents `database is locked`)
|
|
43
|
+
- CI type check failures with proper generic typing for `_run_async(coro: Awaitable[T]) -> T`
|
|
44
|
+
- `FFBBDataClient` wrapper parity — added 8 missing async method delegations
|
|
45
|
+
|
|
46
|
+
### Removed
|
|
47
|
+
- Dead `invalidate_pattern()` from `CacheManager` and related tests
|
|
48
|
+
- `ffbb_api_client_v3` shim, dead scripts, and backward-compat alias
|
|
49
|
+
|
|
50
|
+
### Security
|
|
51
|
+
- CI supply chain hardened with pinned action versions and trusted publishers
|
|
52
|
+
|
|
53
|
+
## [2.0.2] - 2026-05-17
|
|
54
|
+
|
|
55
|
+
### Changed
|
|
56
|
+
- README version updated to v2.0.2
|
|
57
|
+
|
|
8
58
|
## [1.6.1] - 2026-04-29
|
|
9
59
|
|
|
10
60
|
### Changed
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: ffbb-data-client
|
|
3
|
-
Version: 2.0
|
|
3
|
+
Version: 2.2.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,11 +33,10 @@ 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
|
|
40
|
-
Requires-Dist: pydantic>=2.13.
|
|
39
|
+
Requires-Dist: pydantic>=2.13.4
|
|
41
40
|
Provides-Extra: testing
|
|
42
41
|
Requires-Dist: setuptools>=82.0.1; extra == "testing"
|
|
43
42
|
Requires-Dist: coverage>=7.13.5; extra == "testing"
|
|
@@ -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,20 +85,18 @@ 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
|
|
90
|
+
## 🚀 Version v2.2.0 — Mai 2026
|
|
93
91
|
|
|
94
92
|
Principales évolutions récentes :
|
|
95
93
|
|
|
96
|
-
-
|
|
97
|
-
-
|
|
98
|
-
-
|
|
99
|
-
-
|
|
100
|
-
-
|
|
101
|
-
-
|
|
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 ;
|
|
96
|
+
- **nouvelles entités** : EDF (matches, joueurs, rosters, équipes), Genius Sport (matches, live logs), Rematch Videos ;
|
|
97
|
+
- **cache SQLite concurrency-safe** : fichiers séparés pour sync (`http_cache.db`) et async (`http_cache_async.db`) ;
|
|
98
|
+
- **CI renforcée** : mypy + pyright + CodeQL + Dependabot + hook pre-push + wrapper parity check ;
|
|
99
|
+
- **nettoyage** : suppression du shim `ffbb_api_client_v3`, scripts morts et code mort (`invalidate_pattern`).
|
|
102
100
|
|
|
103
101
|
Voir aussi : [`CHANGELOG.md`](CHANGELOG.md) et [`RELEASE_NOTES.md`](RELEASE_NOTES.md).
|
|
104
102
|
|
|
@@ -148,11 +146,12 @@ lives = client.get_lives()
|
|
|
148
146
|
| Domaine | Capacités |
|
|
149
147
|
|---|---|
|
|
150
148
|
| API FFBB | clubs, compétitions, organismes, saisons, poules, classements, rencontres, lives |
|
|
149
|
+
| Entités additionnelles | EDF (matches, joueurs, rosters, équipes), Genius Sport, Rematch Videos |
|
|
151
150
|
| Recherche | organismes, compétitions, rencontres, salles, terrains, pratiques, tournois, engagements et formations |
|
|
152
151
|
| REST typé | récupération de ressources individuelles avec modèles Pydantic v2 |
|
|
153
|
-
| Async | méthodes `*_async()`
|
|
154
|
-
| Cache | cache HTTP `hishel`, sessions `httpx` réutilisées, retries configurables |
|
|
155
|
-
| Sécurité | masquage des tokens dans les logs |
|
|
152
|
+
| Async | méthodes `*_async()` — source de vérité ; sync délègue via `_run_async()` |
|
|
153
|
+
| Cache | cache HTTP `hishel`, sessions `httpx` réutilisées, retries configurables, SQLite séparés sync/async |
|
|
154
|
+
| Sécurité | masquage des tokens dans les logs, CodeQL scanning, Dependabot |
|
|
156
155
|
| IA / MCP | structure compatible avec des wrappers MCP et agents IA |
|
|
157
156
|
|
|
158
157
|
---
|
|
@@ -272,15 +271,21 @@ 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
|
|
276
|
-
│ ├──
|
|
277
|
-
│
|
|
278
|
-
├──
|
|
279
|
-
|
|
280
|
-
├──
|
|
281
|
-
|
|
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
|
|
277
|
+
│ ├── api_ffbb_app_client.py # Client REST FFBB (async source of truth)
|
|
278
|
+
│ └── meilisearch_ffbb_client.py # Client recherche Meilisearch
|
|
279
|
+
├── helpers/ # Requêtes HTTP, multi-search, conversions
|
|
280
|
+
├── models/ # Modèles Pydantic v2
|
|
281
|
+
├── utils/ # cache (sync/async séparés), tokens, logging sécurisé
|
|
282
|
+
└── data/ # schémas et métadonnées embarqués
|
|
282
283
|
```
|
|
283
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.
|
|
288
|
+
|
|
284
289
|
---
|
|
285
290
|
|
|
286
291
|
## 🧪 Développement local
|
|
@@ -296,8 +301,13 @@ Commandes utiles :
|
|
|
296
301
|
pytest tests/unit/
|
|
297
302
|
pytest tests/integration/
|
|
298
303
|
pytest tests/ --cov=src
|
|
304
|
+
tox -e type # mypy + pyright
|
|
299
305
|
```
|
|
300
306
|
|
|
307
|
+
Hooks automatiques :
|
|
308
|
+
- **pre-push** : exécute mypy + pyright avant chaque push
|
|
309
|
+
- **pre-commit** : black, isort, flake8, trailing-whitespace
|
|
310
|
+
|
|
301
311
|
Documentation complémentaire :
|
|
302
312
|
|
|
303
313
|
- [`LOCAL_CI_GUIDE.md`](LOCAL_CI_GUIDE.md)
|
|
@@ -33,20 +33,18 @@
|
|
|
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
|
|
38
|
+
## 🚀 Version v2.2.0 — Mai 2026
|
|
41
39
|
|
|
42
40
|
Principales évolutions récentes :
|
|
43
41
|
|
|
44
|
-
-
|
|
45
|
-
-
|
|
46
|
-
-
|
|
47
|
-
-
|
|
48
|
-
-
|
|
49
|
-
-
|
|
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 ;
|
|
44
|
+
- **nouvelles entités** : EDF (matches, joueurs, rosters, équipes), Genius Sport (matches, live logs), Rematch Videos ;
|
|
45
|
+
- **cache SQLite concurrency-safe** : fichiers séparés pour sync (`http_cache.db`) et async (`http_cache_async.db`) ;
|
|
46
|
+
- **CI renforcée** : mypy + pyright + CodeQL + Dependabot + hook pre-push + wrapper parity check ;
|
|
47
|
+
- **nettoyage** : suppression du shim `ffbb_api_client_v3`, scripts morts et code mort (`invalidate_pattern`).
|
|
50
48
|
|
|
51
49
|
Voir aussi : [`CHANGELOG.md`](CHANGELOG.md) et [`RELEASE_NOTES.md`](RELEASE_NOTES.md).
|
|
52
50
|
|
|
@@ -96,11 +94,12 @@ lives = client.get_lives()
|
|
|
96
94
|
| Domaine | Capacités |
|
|
97
95
|
|---|---|
|
|
98
96
|
| API FFBB | clubs, compétitions, organismes, saisons, poules, classements, rencontres, lives |
|
|
97
|
+
| Entités additionnelles | EDF (matches, joueurs, rosters, équipes), Genius Sport, Rematch Videos |
|
|
99
98
|
| Recherche | organismes, compétitions, rencontres, salles, terrains, pratiques, tournois, engagements et formations |
|
|
100
99
|
| REST typé | récupération de ressources individuelles avec modèles Pydantic v2 |
|
|
101
|
-
| Async | méthodes `*_async()`
|
|
102
|
-
| Cache | cache HTTP `hishel`, sessions `httpx` réutilisées, retries configurables |
|
|
103
|
-
| Sécurité | masquage des tokens dans les logs |
|
|
100
|
+
| Async | méthodes `*_async()` — source de vérité ; sync délègue via `_run_async()` |
|
|
101
|
+
| Cache | cache HTTP `hishel`, sessions `httpx` réutilisées, retries configurables, SQLite séparés sync/async |
|
|
102
|
+
| Sécurité | masquage des tokens dans les logs, CodeQL scanning, Dependabot |
|
|
104
103
|
| IA / MCP | structure compatible avec des wrappers MCP et agents IA |
|
|
105
104
|
|
|
106
105
|
---
|
|
@@ -220,15 +219,21 @@ 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
|
|
224
|
-
│ ├──
|
|
225
|
-
│
|
|
226
|
-
├──
|
|
227
|
-
|
|
228
|
-
├──
|
|
229
|
-
|
|
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
|
|
225
|
+
│ ├── api_ffbb_app_client.py # Client REST FFBB (async source of truth)
|
|
226
|
+
│ └── meilisearch_ffbb_client.py # Client recherche Meilisearch
|
|
227
|
+
├── helpers/ # Requêtes HTTP, multi-search, conversions
|
|
228
|
+
├── models/ # Modèles Pydantic v2
|
|
229
|
+
├── utils/ # cache (sync/async séparés), tokens, logging sécurisé
|
|
230
|
+
└── data/ # schémas et métadonnées embarqués
|
|
230
231
|
```
|
|
231
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.
|
|
236
|
+
|
|
232
237
|
---
|
|
233
238
|
|
|
234
239
|
## 🧪 Développement local
|
|
@@ -244,8 +249,13 @@ Commandes utiles :
|
|
|
244
249
|
pytest tests/unit/
|
|
245
250
|
pytest tests/integration/
|
|
246
251
|
pytest tests/ --cov=src
|
|
252
|
+
tox -e type # mypy + pyright
|
|
247
253
|
```
|
|
248
254
|
|
|
255
|
+
Hooks automatiques :
|
|
256
|
+
- **pre-push** : exécute mypy + pyright avant chaque push
|
|
257
|
+
- **pre-commit** : black, isort, flake8, trailing-whitespace
|
|
258
|
+
|
|
249
259
|
Documentation complémentaire :
|
|
250
260
|
|
|
251
261
|
- [`LOCAL_CI_GUIDE.md`](LOCAL_CI_GUIDE.md)
|