ffbb-data-client 2.0.2__tar.gz → 2.1.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.1.0}/.coveragerc +5 -5
- ffbb_data_client-2.1.0/.github/dependabot.yml +19 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.1.0}/.github/scripts/check_wrapper_parity.py +16 -5
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.1.0}/.github/workflows/check_wrapper_parity.yml +2 -2
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.1.0}/.github/workflows/ci.yml +7 -1
- ffbb_data_client-2.1.0/.github/workflows/codeql.yml +33 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.1.0}/.github/workflows/deploy-pages.yml +3 -3
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.1.0}/.github/workflows/publish.yml +20 -8
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.1.0}/.github/workflows/release-after-discovery-merge.yml +1 -1
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.1.0}/.github/workflows/update-ffbb-api-discovery.yml +4 -4
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.1.0}/.pre-commit-config.yaml +10 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.1.0}/CHANGELOG.md +30 -0
- {ffbb_data_client-2.0.2/src/ffbb_data_client.egg-info → ffbb_data_client-2.1.0}/PKG-INFO +26 -19
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.1.0}/README.md +24 -17
- ffbb_data_client-2.1.0/SECURITY.md +15 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.1.0}/docs/conf.py +1 -4
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.1.0}/docs/requirements.txt +2 -2
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.1.0}/setup.cfg +1 -1
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.1.0}/src/ffbb_data_client/__init__.py +0 -18
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.1.0}/src/ffbb_data_client/clients/api_ffbb_app_client.py +551 -636
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.1.0}/src/ffbb_data_client/clients/ffbb_data_client.py +78 -2
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.1.0}/src/ffbb_data_client/data/__init__.py +6 -3
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.1.0}/src/ffbb_data_client/models/commune.py +2 -2
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.1.0}/src/ffbb_data_client/models/get_rencontre_response.py +1 -1
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.1.0}/src/ffbb_data_client/models/query_fields_manager.py +1 -1
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.1.0}/src/ffbb_data_client/models/team_ranking.py +1 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.1.0}/src/ffbb_data_client/utils/cache_manager.py +10 -28
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.1.0}/src/ffbb_data_client/utils/retry_utils.py +6 -3
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.1.0/src/ffbb_data_client.egg-info}/PKG-INFO +26 -19
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.1.0}/src/ffbb_data_client.egg-info/SOURCES.txt +3 -3
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.1.0}/src/ffbb_data_client.egg-info/requires.txt +1 -1
- ffbb_data_client-2.1.0/src/ffbb_data_client.egg-info/top_level.txt +1 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.1.0}/tests/integration/test_502_enhanced_integration.py +2 -2
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.1.0}/tests/integration/test_506_raw_json_model_conversion.py +37 -9
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.1.0}/tests/unit/clients/test_201_unit_tests_core.py +57 -15
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.1.0}/tests/unit/clients/test_207_coverage_clients_extended.py +10 -3
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.1.0}/tests/unit/clients/test_208_new_methods_coverage.py +40 -10
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.1.0}/tests/unit/clients/test_210_targeted_clients_helpers_coverage.py +12 -3
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.1.0}/tests/unit/utils/test_303_cache_manager.py +0 -7
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.1.0}/tests/unit/utils/test_307_coverage_gaps_utils.py +0 -24
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.1.0}/tox.ini +14 -0
- 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.1.0}/.gitignore +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.1.0}/.isort.cfg +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.1.0}/.jules/bolt.md +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.1.0}/.readthedocs.yml +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.1.0}/AUTHORS.rst +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.1.0}/CONTRIBUTING.rst +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.1.0}/LICENSE.txt +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.1.0}/LOCAL_CI_GUIDE.md +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.1.0}/RELEASE_NOTES.md +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.1.0}/benchmark_search_organisme.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.1.0}/data/api.ffbb.app.json +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.1.0}/data/api_update_summary.md +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.1.0}/data/collections.json +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.1.0}/data/endpoint_discovery.json +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.1.0}/data/indexes.json +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.1.0}/data/meilisearch-prod.ffbb.app.json +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.1.0}/data/openapi.json +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.1.0}/data/openapi_full.json +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.1.0}/data/type_discovery_corrections.json +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.1.0}/docs/Makefile +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.1.0}/docs/_static/.gitignore +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.1.0}/docs/architecture.rst +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.1.0}/docs/authors.rst +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.1.0}/docs/changelog.rst +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.1.0}/docs/contributing.rst +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.1.0}/docs/examples.rst +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.1.0}/docs/index.rst +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.1.0}/docs/license.rst +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.1.0}/docs/migration.rst +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.1.0}/docs/readme.rst +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.1.0}/docs/test_strategy.md +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.1.0}/docs/testing_conventions.md +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.1.0}/examples/README.md +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.1.0}/examples/complete_usage_example.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.1.0}/examples/quick_start.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.1.0}/examples/team_ranking_analysis.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.1.0}/pyproject.toml +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.1.0}/pytest.ini +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.1.0}/run-ci-locally.sh +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.1.0}/scripts/discover_endpoints.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.1.0}/scripts/discover_types.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.1.0}/setup.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.1.0}/src/ffbb_data_client/clients/__init__.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.1.0}/src/ffbb_data_client/clients/meilisearch_client.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.1.0}/src/ffbb_data_client/clients/meilisearch_ffbb_client.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.1.0}/src/ffbb_data_client/config.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.1.0}/src/ffbb_data_client/data/collections.json +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.1.0}/src/ffbb_data_client/data/endpoint_discovery.json +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.1.0}/src/ffbb_data_client/data/indexes.json +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.1.0}/src/ffbb_data_client/data/openapi.json +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.1.0}/src/ffbb_data_client/data/openapi_full.json +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.1.0}/src/ffbb_data_client/helpers/__init__.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.1.0}/src/ffbb_data_client/helpers/http_requests_helper.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.1.0}/src/ffbb_data_client/helpers/http_requests_utils.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.1.0}/src/ffbb_data_client/helpers/meilisearch_client_extension.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.1.0}/src/ffbb_data_client/helpers/multi_search_query_helper.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.1.0}/src/ffbb_data_client/models/__init__.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.1.0}/src/ffbb_data_client/models/affiche.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.1.0}/src/ffbb_data_client/models/cartographie.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.1.0}/src/ffbb_data_client/models/categorie.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.1.0}/src/ffbb_data_client/models/categorie_type.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.1.0}/src/ffbb_data_client/models/clock.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.1.0}/src/ffbb_data_client/models/club_contacts.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.1.0}/src/ffbb_data_client/models/code.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.1.0}/src/ffbb_data_client/models/competition_fields.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.1.0}/src/ffbb_data_client/models/competition_id.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.1.0}/src/ffbb_data_client/models/competition_id_categorie.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.1.0}/src/ffbb_data_client/models/competition_id_sexe.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.1.0}/src/ffbb_data_client/models/competition_id_type_competition.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.1.0}/src/ffbb_data_client/models/competition_id_type_competition_generique.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.1.0}/src/ffbb_data_client/models/competition_origine.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.1.0}/src/ffbb_data_client/models/competition_origine_categorie.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.1.0}/src/ffbb_data_client/models/competition_origine_type_competition.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.1.0}/src/ffbb_data_client/models/competition_origine_type_competition_generique.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.1.0}/src/ffbb_data_client/models/competition_type.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.1.0}/src/ffbb_data_client/models/competitions_facet_distribution.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.1.0}/src/ffbb_data_client/models/competitions_facet_stats.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.1.0}/src/ffbb_data_client/models/competitions_hit.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.1.0}/src/ffbb_data_client/models/competitions_multi_search_query.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.1.0}/src/ffbb_data_client/models/competitions_query.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.1.0}/src/ffbb_data_client/models/configuration_models.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.1.0}/src/ffbb_data_client/models/contact_info.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.1.0}/src/ffbb_data_client/models/content_multi_search_query.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.1.0}/src/ffbb_data_client/models/coordonnees.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.1.0}/src/ffbb_data_client/models/coordonnees_type.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.1.0}/src/ffbb_data_client/models/document_flyer.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.1.0}/src/ffbb_data_client/models/document_flyer_type.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.1.0}/src/ffbb_data_client/models/engagement_contacts.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.1.0}/src/ffbb_data_client/models/engagements_facet_distribution.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.1.0}/src/ffbb_data_client/models/engagements_facet_stats.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.1.0}/src/ffbb_data_client/models/engagements_hit.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.1.0}/src/ffbb_data_client/models/engagements_multi_search_query.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.1.0}/src/ffbb_data_client/models/etat.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.1.0}/src/ffbb_data_client/models/external_competition_id.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.1.0}/src/ffbb_data_client/models/external_id.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.1.0}/src/ffbb_data_client/models/facet_distribution.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.1.0}/src/ffbb_data_client/models/facet_stats.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.1.0}/src/ffbb_data_client/models/field_set.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.1.0}/src/ffbb_data_client/models/folder.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.1.0}/src/ffbb_data_client/models/formation_session.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.1.0}/src/ffbb_data_client/models/formations_facet_distribution.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.1.0}/src/ffbb_data_client/models/formations_facet_stats.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.1.0}/src/ffbb_data_client/models/formations_hit.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.1.0}/src/ffbb_data_client/models/formations_multi_search_query.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.1.0}/src/ffbb_data_client/models/game_stats_model.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.1.0}/src/ffbb_data_client/models/game_stats_models.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.1.0}/src/ffbb_data_client/models/generic_search.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.1.0}/src/ffbb_data_client/models/geo.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.1.0}/src/ffbb_data_client/models/geo_sort_order.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.1.0}/src/ffbb_data_client/models/get_commune_response.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.1.0}/src/ffbb_data_client/models/get_competition_response.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.1.0}/src/ffbb_data_client/models/get_configuration_response.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.1.0}/src/ffbb_data_client/models/get_engagement_response.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.1.0}/src/ffbb_data_client/models/get_entraineur_response.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.1.0}/src/ffbb_data_client/models/get_formation_response.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.1.0}/src/ffbb_data_client/models/get_officiel_response.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.1.0}/src/ffbb_data_client/models/get_organisme_response.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.1.0}/src/ffbb_data_client/models/get_poule_response.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.1.0}/src/ffbb_data_client/models/get_pratique_response.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.1.0}/src/ffbb_data_client/models/get_saisons_response.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.1.0}/src/ffbb_data_client/models/get_salle_response.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.1.0}/src/ffbb_data_client/models/get_terrain_response.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.1.0}/src/ffbb_data_client/models/get_tournoi_response.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.1.0}/src/ffbb_data_client/models/gradient_color.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.1.0}/src/ffbb_data_client/models/hit.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.1.0}/src/ffbb_data_client/models/id_engagement_equipe.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.1.0}/src/ffbb_data_client/models/id_organisme_equipe.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.1.0}/src/ffbb_data_client/models/id_organisme_equipe1_logo.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.1.0}/src/ffbb_data_client/models/id_poule.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.1.0}/src/ffbb_data_client/models/jour.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.1.0}/src/ffbb_data_client/models/label.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.1.0}/src/ffbb_data_client/models/labellisation.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.1.0}/src/ffbb_data_client/models/live.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.1.0}/src/ffbb_data_client/models/lives.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.1.0}/src/ffbb_data_client/models/logo.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.1.0}/src/ffbb_data_client/models/multi_search_queries.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.1.0}/src/ffbb_data_client/models/multi_search_query.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.1.0}/src/ffbb_data_client/models/multi_search_result_competitions.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.1.0}/src/ffbb_data_client/models/multi_search_result_engagements.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.1.0}/src/ffbb_data_client/models/multi_search_result_formations.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.1.0}/src/ffbb_data_client/models/multi_search_result_organismes.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.1.0}/src/ffbb_data_client/models/multi_search_result_pratiques.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.1.0}/src/ffbb_data_client/models/multi_search_result_rencontres.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.1.0}/src/ffbb_data_client/models/multi_search_result_salles.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.1.0}/src/ffbb_data_client/models/multi_search_result_terrains.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.1.0}/src/ffbb_data_client/models/multi_search_result_tournois.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.1.0}/src/ffbb_data_client/models/multi_search_results.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.1.0}/src/ffbb_data_client/models/multi_search_results_class.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.1.0}/src/ffbb_data_client/models/nature_sol.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.1.0}/src/ffbb_data_client/models/niveau.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.1.0}/src/ffbb_data_client/models/niveau_class.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.1.0}/src/ffbb_data_client/models/niveau_extractor.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.1.0}/src/ffbb_data_client/models/niveau_info.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.1.0}/src/ffbb_data_client/models/niveau_models.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.1.0}/src/ffbb_data_client/models/niveau_type.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.1.0}/src/ffbb_data_client/models/objectif.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.1.0}/src/ffbb_data_client/models/organisateur.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.1.0}/src/ffbb_data_client/models/organisateur_type.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.1.0}/src/ffbb_data_client/models/organisme_fields.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.1.0}/src/ffbb_data_client/models/organisme_id_pere.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.1.0}/src/ffbb_data_client/models/organismes_facet_distribution.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.1.0}/src/ffbb_data_client/models/organismes_facet_stats.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.1.0}/src/ffbb_data_client/models/organismes_hit.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.1.0}/src/ffbb_data_client/models/organismes_multi_search_query.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.1.0}/src/ffbb_data_client/models/organismes_query.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.1.0}/src/ffbb_data_client/models/phase_code.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.1.0}/src/ffbb_data_client/models/poule.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.1.0}/src/ffbb_data_client/models/poule_fields.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.1.0}/src/ffbb_data_client/models/poule_rencontre_item_model.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.1.0}/src/ffbb_data_client/models/poules_models.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.1.0}/src/ffbb_data_client/models/poules_query.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.1.0}/src/ffbb_data_client/models/pratique.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.1.0}/src/ffbb_data_client/models/pratiques_facet_distribution.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.1.0}/src/ffbb_data_client/models/pratiques_facet_stats.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.1.0}/src/ffbb_data_client/models/pratiques_hit.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.1.0}/src/ffbb_data_client/models/pratiques_hit_type.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.1.0}/src/ffbb_data_client/models/pratiques_multi_search_query.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.1.0}/src/ffbb_data_client/models/pratiques_type_class.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.1.0}/src/ffbb_data_client/models/publication_internet.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.1.0}/src/ffbb_data_client/models/purple_logo.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.1.0}/src/ffbb_data_client/models/ranking_engagement.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.1.0}/src/ffbb_data_client/models/rankings_models.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.1.0}/src/ffbb_data_client/models/rencontres_engagement.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.1.0}/src/ffbb_data_client/models/rencontres_facet_distribution.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.1.0}/src/ffbb_data_client/models/rencontres_facet_stats.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.1.0}/src/ffbb_data_client/models/rencontres_hit.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.1.0}/src/ffbb_data_client/models/rencontres_multi_search_query.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.1.0}/src/ffbb_data_client/models/saison.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.1.0}/src/ffbb_data_client/models/saison_fields.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.1.0}/src/ffbb_data_client/models/saisons_models.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.1.0}/src/ffbb_data_client/models/saisons_query.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.1.0}/src/ffbb_data_client/models/salle.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.1.0}/src/ffbb_data_client/models/salles_facet_distribution.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.1.0}/src/ffbb_data_client/models/salles_facet_stats.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.1.0}/src/ffbb_data_client/models/salles_hit.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.1.0}/src/ffbb_data_client/models/salles_multi_search_query.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.1.0}/src/ffbb_data_client/models/sexe.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.1.0}/src/ffbb_data_client/models/sexe_class.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.1.0}/src/ffbb_data_client/models/source.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.1.0}/src/ffbb_data_client/models/status.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.1.0}/src/ffbb_data_client/models/team_engagement.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.1.0}/src/ffbb_data_client/models/terrains_categorie_championnat_3x3_libelle.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.1.0}/src/ffbb_data_client/models/terrains_facet_distribution.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.1.0}/src/ffbb_data_client/models/terrains_facet_stats.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.1.0}/src/ffbb_data_client/models/terrains_hit.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.1.0}/src/ffbb_data_client/models/terrains_multi_search_query.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.1.0}/src/ffbb_data_client/models/terrains_name.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.1.0}/src/ffbb_data_client/models/terrains_sexe_enum.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.1.0}/src/ffbb_data_client/models/terrains_storage.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.1.0}/src/ffbb_data_client/models/tournoi_type_class.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.1.0}/src/ffbb_data_client/models/tournoi_type_enum.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.1.0}/src/ffbb_data_client/models/tournoi_types_3x3.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.1.0}/src/ffbb_data_client/models/tournoi_types_3x3_libelle.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.1.0}/src/ffbb_data_client/models/tournoi_types_3x3_libelle_enum.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.1.0}/src/ffbb_data_client/models/tournois_facet_distribution.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.1.0}/src/ffbb_data_client/models/tournois_facet_stats.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.1.0}/src/ffbb_data_client/models/tournois_hit.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.1.0}/src/ffbb_data_client/models/tournois_hit_type.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.1.0}/src/ffbb_data_client/models/tournois_libelle.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.1.0}/src/ffbb_data_client/models/tournois_multi_search_query.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.1.0}/src/ffbb_data_client/models/type_association.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.1.0}/src/ffbb_data_client/models/type_association_libelle.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.1.0}/src/ffbb_data_client/models/type_class.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.1.0}/src/ffbb_data_client/models/type_competition.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.1.0}/src/ffbb_data_client/models/type_competition_generique.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.1.0}/src/ffbb_data_client/models/type_enum.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.1.0}/src/ffbb_data_client/models/type_league.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.1.0}/src/ffbb_data_client/py.typed +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.1.0}/src/ffbb_data_client/utils/__init__.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.1.0}/src/ffbb_data_client/utils/converter_utils.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.1.0}/src/ffbb_data_client/utils/input_validation.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.1.0}/src/ffbb_data_client/utils/secure_logging.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.1.0}/src/ffbb_data_client/utils/token_manager.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.1.0}/src/ffbb_data_client.egg-info/dependency_links.txt +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.1.0}/src/ffbb_data_client.egg-info/not-zip-safe +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.1.0}/tests/conftest.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.1.0}/tests/e2e/__init__.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.1.0}/tests/e2e/conftest.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.1.0}/tests/integration/__init__.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.1.0}/tests/integration/conftest.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.1.0}/tests/integration/test_500_user_journey.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.1.0}/tests/integration/test_501_user_journey_v3.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.1.0}/tests/integration/test_503_secure_logging.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.1.0}/tests/integration/test_504_input_validation.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.1.0}/tests/integration/test_505_retry_timeout.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.1.0}/tests/unit/__init__.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.1.0}/tests/unit/clients/__init__.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.1.0}/tests/unit/clients/test_200_api_ffbb_app_client.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.1.0}/tests/unit/clients/test_202_meilisearch_client.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.1.0}/tests/unit/clients/test_203_meilisearch_client_extension.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.1.0}/tests/unit/clients/test_204_ffbb_data_client.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.1.0}/tests/unit/clients/test_205_meilisearch_ffbb_client.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.1.0}/tests/unit/clients/test_206_coverage_gaps_clients.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.1.0}/tests/unit/clients/test_209_automatic_token_resolution.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.1.0}/tests/unit/clients/test_async_methods.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.1.0}/tests/unit/clients/test_meilisearch_async.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.1.0}/tests/unit/clients/test_v2_backport_search.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.1.0}/tests/unit/clients/test_v3_new_features.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.1.0}/tests/unit/conftest.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.1.0}/tests/unit/helpers/__init__.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.1.0}/tests/unit/helpers/test_400_http_helpers.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.1.0}/tests/unit/helpers/test_meilisearch_client_extension_recursive_pagination.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.1.0}/tests/unit/models/__init__.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.1.0}/tests/unit/models/test_100_competition_id_categorie.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.1.0}/tests/unit/models/test_101_competition_id_sexe.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.1.0}/tests/unit/models/test_102_competition_id_type_competition.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.1.0}/tests/unit/models/test_103_competition_id_type_competition_generique.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.1.0}/tests/unit/models/test_104_competition_origine_categorie.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.1.0}/tests/unit/models/test_105_competition_origine_type_competition_generique.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.1.0}/tests/unit/models/test_106_competition_origine.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.1.0}/tests/unit/models/test_107_id_engagement_equipe.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.1.0}/tests/unit/models/test_108_id_organisme_equipe.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.1.0}/tests/unit/models/test_109_id_organisme_equipe1_logo.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.1.0}/tests/unit/models/test_110_labellisation.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.1.0}/tests/unit/models/test_111_niveau_class.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.1.0}/tests/unit/models/test_112_purple_logo.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.1.0}/tests/unit/models/test_113_salle.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.1.0}/tests/unit/models/test_114_tournoi_type_class.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.1.0}/tests/unit/models/test_115_type_association_libelle.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.1.0}/tests/unit/models/test_116_type_competition_generique.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.1.0}/tests/unit/models/test_117_organisateur.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.1.0}/tests/unit/models/test_118_competition_id.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.1.0}/tests/unit/models/test_119_terrains_inner_models.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.1.0}/tests/unit/models/test_120_pratiques_inner_models.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.1.0}/tests/unit/models/test_121_to_dict_round_trip.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.1.0}/tests/unit/models/test_122_coverage_gaps.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.1.0}/tests/unit/models/test_123_missing_coverage.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.1.0}/tests/unit/models/test_123_v2_backport.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.1.0}/tests/unit/models/test_124_targeted_coverage_gains.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.1.0}/tests/unit/models/test_dx_aliases.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.1.0}/tests/unit/utils/__init__.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.1.0}/tests/unit/utils/test_300_secure_logging.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.1.0}/tests/unit/utils/test_301_input_validation.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.1.0}/tests/unit/utils/test_302_retry_utils.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.1.0}/tests/unit/utils/test_304_config.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.1.0}/tests/unit/utils/test_305_token_manager.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.1.0}/tests/unit/utils/test_306_converter_utils.py +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.1.0}/website/assets/logo.webp +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.1.0}/website/css/style.css +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.1.0}/website/index.html +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.1.0}/website/robots.txt +0 -0
- {ffbb_data_client-2.0.2 → ffbb_data_client-2.1.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
|
|
@@ -74,11 +74,24 @@ def main() -> int:
|
|
|
74
74
|
return 0
|
|
75
75
|
|
|
76
76
|
# Build markdown report
|
|
77
|
+
missing_detail = " ".join(
|
|
78
|
+
[
|
|
79
|
+
"The following methods exist in inner clients but are **not exposed**",
|
|
80
|
+
"in `FFBBDataClient`:",
|
|
81
|
+
]
|
|
82
|
+
)
|
|
83
|
+
fix_detail = " ".join(
|
|
84
|
+
[
|
|
85
|
+
"Add the missing method(s) to",
|
|
86
|
+
"`src/ffbb_data_client/clients/ffbb_data_client.py`",
|
|
87
|
+
"so they delegate to the appropriate inner client.",
|
|
88
|
+
]
|
|
89
|
+
)
|
|
90
|
+
|
|
77
91
|
lines = [
|
|
78
92
|
"## ⚠️ Wrapper parity check failed",
|
|
79
93
|
"",
|
|
80
|
-
|
|
81
|
-
"in `FFBBDataClient`:",
|
|
94
|
+
missing_detail,
|
|
82
95
|
"",
|
|
83
96
|
"| Method | Source client |",
|
|
84
97
|
"|---|---|",
|
|
@@ -94,9 +107,7 @@ def main() -> int:
|
|
|
94
107
|
lines += [
|
|
95
108
|
"",
|
|
96
109
|
"### How to fix",
|
|
97
|
-
|
|
98
|
-
"`src/ffbb_data_client/clients/ffbb_data_client.py` "
|
|
99
|
-
"so they delegate to the appropriate inner client.",
|
|
110
|
+
fix_detail,
|
|
100
111
|
]
|
|
101
112
|
|
|
102
113
|
report = "\n".join(lines)
|
{ffbb_data_client-2.0.2 → ffbb_data_client-2.1.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.1.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,36 @@ 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.1.0] - 2026-05-17
|
|
9
|
+
|
|
10
|
+
### Changed
|
|
11
|
+
- **BREAKING (internal)**: Sync methods now delegate to async counterparts via `_run_async()` helper, eliminating ~604 lines of duplication
|
|
12
|
+
- Sync and async share a single source of truth — async methods are canonical
|
|
13
|
+
- `ThreadPoolExecutor` fallback handles nested event loops gracefully
|
|
14
|
+
|
|
15
|
+
### Added
|
|
16
|
+
- **NEW**: Pre-push hook for type-check (mypy + pyright) — catches type errors before push
|
|
17
|
+
- **NEW**: CodeQL security scanning in CI
|
|
18
|
+
- **NEW**: Dependabot for automated dependency updates (GitHub Actions + pip)
|
|
19
|
+
- **NEW**: `SECURITY.md` security policy
|
|
20
|
+
|
|
21
|
+
### Fixed
|
|
22
|
+
- SQLite cache concurrency: sync uses `http_cache.db`, async uses `http_cache_async.db` (prevents `database is locked`)
|
|
23
|
+
- CI type check failures with proper generic typing for `_run_async(coro: Awaitable[T]) -> T`
|
|
24
|
+
- `FFBBDataClient` wrapper parity — added 8 missing async method delegations
|
|
25
|
+
|
|
26
|
+
### Removed
|
|
27
|
+
- Dead `invalidate_pattern()` from `CacheManager` and related tests
|
|
28
|
+
- `ffbb_api_client_v3` shim, dead scripts, and backward-compat alias
|
|
29
|
+
|
|
30
|
+
### Security
|
|
31
|
+
- CI supply chain hardened with pinned action versions and trusted publishers
|
|
32
|
+
|
|
33
|
+
## [2.0.2] - 2026-05-17
|
|
34
|
+
|
|
35
|
+
### Changed
|
|
36
|
+
- README version updated to v2.0.2
|
|
37
|
+
|
|
8
38
|
## [1.6.1] - 2026-04-29
|
|
9
39
|
|
|
10
40
|
### Changed
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: ffbb-data-client
|
|
3
|
-
Version: 2.0
|
|
3
|
+
Version: 2.1.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
|
|
@@ -37,7 +37,7 @@ Requires-Dist: readme_renderer[md]>=44.0
|
|
|
37
37
|
Requires-Dist: python-dateutil>=2.9.0.post0
|
|
38
38
|
Requires-Dist: httpx>=0.28.1
|
|
39
39
|
Requires-Dist: hishel[async]>=1.2.1
|
|
40
|
-
Requires-Dist: pydantic>=2.13.
|
|
40
|
+
Requires-Dist: pydantic>=2.13.4
|
|
41
41
|
Provides-Extra: testing
|
|
42
42
|
Requires-Dist: setuptools>=82.0.1; extra == "testing"
|
|
43
43
|
Requires-Dist: coverage>=7.13.5; extra == "testing"
|
|
@@ -89,16 +89,15 @@ Dynamic: license-file
|
|
|
89
89
|
|
|
90
90
|
---
|
|
91
91
|
|
|
92
|
-
## 🚀 Version
|
|
92
|
+
## 🚀 Version v2.1.0 — Mai 2026
|
|
93
93
|
|
|
94
94
|
Principales évolutions récentes :
|
|
95
95
|
|
|
96
|
-
-
|
|
97
|
-
-
|
|
98
|
-
- cache
|
|
99
|
-
-
|
|
100
|
-
-
|
|
101
|
-
- stabilisation CI, typage, tests et formatage.
|
|
96
|
+
- **unification sync/async** : les méthodes synchrones délèguent désormais à leurs homologues asynchrones via `_run_async()`, éliminant ~604 lignes de duplication ;
|
|
97
|
+
- **nouvelles entités** : EDF (matches, joueurs, rosters, équipes), Genius Sport (matches, live logs), Rematch Videos ;
|
|
98
|
+
- **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 ;
|
|
100
|
+
- **nettoyage** : suppression du shim `ffbb_api_client_v3`, scripts morts et code mort (`invalidate_pattern`).
|
|
102
101
|
|
|
103
102
|
Voir aussi : [`CHANGELOG.md`](CHANGELOG.md) et [`RELEASE_NOTES.md`](RELEASE_NOTES.md).
|
|
104
103
|
|
|
@@ -148,11 +147,12 @@ lives = client.get_lives()
|
|
|
148
147
|
| Domaine | Capacités |
|
|
149
148
|
|---|---|
|
|
150
149
|
| API FFBB | clubs, compétitions, organismes, saisons, poules, classements, rencontres, lives |
|
|
150
|
+
| Entités additionnelles | EDF (matches, joueurs, rosters, équipes), Genius Sport, Rematch Videos |
|
|
151
151
|
| Recherche | organismes, compétitions, rencontres, salles, terrains, pratiques, tournois, engagements et formations |
|
|
152
152
|
| 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 |
|
|
153
|
+
| Async | méthodes `*_async()` — source de vérité ; sync délègue via `_run_async()` |
|
|
154
|
+
| Cache | cache HTTP `hishel`, sessions `httpx` réutilisées, retries configurables, SQLite séparés sync/async |
|
|
155
|
+
| Sécurité | masquage des tokens dans les logs, CodeQL scanning, Dependabot |
|
|
156
156
|
| IA / MCP | structure compatible avec des wrappers MCP et agents IA |
|
|
157
157
|
|
|
158
158
|
---
|
|
@@ -272,15 +272,17 @@ Il est donc possible de laisser le client résoudre les tokens automatiquement o
|
|
|
272
272
|
```text
|
|
273
273
|
src/ffbb_data_client/
|
|
274
274
|
├── clients/
|
|
275
|
-
│ ├── ffbb_data_client.py # Façade publique
|
|
276
|
-
│ ├── api_ffbb_app_client.py
|
|
277
|
-
│ └── meilisearch_ffbb_client.py
|
|
278
|
-
├── helpers/
|
|
279
|
-
├── models/
|
|
280
|
-
├── utils/
|
|
281
|
-
└── data/
|
|
275
|
+
│ ├── ffbb_data_client.py # Façade publique (sync → async delegation)
|
|
276
|
+
│ ├── api_ffbb_app_client.py # Client REST FFBB (async source of truth)
|
|
277
|
+
│ └── meilisearch_ffbb_client.py # Client recherche Meilisearch
|
|
278
|
+
├── helpers/ # Requêtes HTTP, multi-search, conversions
|
|
279
|
+
├── models/ # Modèles Pydantic v2
|
|
280
|
+
├── utils/ # cache (sync/async séparés), tokens, logging sécurisé
|
|
281
|
+
└── data/ # schémas et métadonnées embarqués
|
|
282
282
|
```
|
|
283
283
|
|
|
284
|
+
> **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`.
|
|
285
|
+
|
|
284
286
|
---
|
|
285
287
|
|
|
286
288
|
## 🧪 Développement local
|
|
@@ -296,8 +298,13 @@ Commandes utiles :
|
|
|
296
298
|
pytest tests/unit/
|
|
297
299
|
pytest tests/integration/
|
|
298
300
|
pytest tests/ --cov=src
|
|
301
|
+
tox -e type # mypy + pyright
|
|
299
302
|
```
|
|
300
303
|
|
|
304
|
+
Hooks automatiques :
|
|
305
|
+
- **pre-push** : exécute mypy + pyright avant chaque push
|
|
306
|
+
- **pre-commit** : black, isort, flake8, trailing-whitespace
|
|
307
|
+
|
|
301
308
|
Documentation complémentaire :
|
|
302
309
|
|
|
303
310
|
- [`LOCAL_CI_GUIDE.md`](LOCAL_CI_GUIDE.md)
|
|
@@ -37,16 +37,15 @@
|
|
|
37
37
|
|
|
38
38
|
---
|
|
39
39
|
|
|
40
|
-
## 🚀 Version
|
|
40
|
+
## 🚀 Version v2.1.0 — Mai 2026
|
|
41
41
|
|
|
42
42
|
Principales évolutions récentes :
|
|
43
43
|
|
|
44
|
-
-
|
|
45
|
-
-
|
|
46
|
-
- cache
|
|
47
|
-
-
|
|
48
|
-
-
|
|
49
|
-
- stabilisation CI, typage, tests et formatage.
|
|
44
|
+
- **unification sync/async** : les méthodes synchrones délèguent désormais à leurs homologues asynchrones via `_run_async()`, éliminant ~604 lignes de duplication ;
|
|
45
|
+
- **nouvelles entités** : EDF (matches, joueurs, rosters, équipes), Genius Sport (matches, live logs), Rematch Videos ;
|
|
46
|
+
- **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 ;
|
|
48
|
+
- **nettoyage** : suppression du shim `ffbb_api_client_v3`, scripts morts et code mort (`invalidate_pattern`).
|
|
50
49
|
|
|
51
50
|
Voir aussi : [`CHANGELOG.md`](CHANGELOG.md) et [`RELEASE_NOTES.md`](RELEASE_NOTES.md).
|
|
52
51
|
|
|
@@ -96,11 +95,12 @@ lives = client.get_lives()
|
|
|
96
95
|
| Domaine | Capacités |
|
|
97
96
|
|---|---|
|
|
98
97
|
| API FFBB | clubs, compétitions, organismes, saisons, poules, classements, rencontres, lives |
|
|
98
|
+
| Entités additionnelles | EDF (matches, joueurs, rosters, équipes), Genius Sport, Rematch Videos |
|
|
99
99
|
| Recherche | organismes, compétitions, rencontres, salles, terrains, pratiques, tournois, engagements et formations |
|
|
100
100
|
| 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 |
|
|
101
|
+
| Async | méthodes `*_async()` — source de vérité ; sync délègue via `_run_async()` |
|
|
102
|
+
| Cache | cache HTTP `hishel`, sessions `httpx` réutilisées, retries configurables, SQLite séparés sync/async |
|
|
103
|
+
| Sécurité | masquage des tokens dans les logs, CodeQL scanning, Dependabot |
|
|
104
104
|
| IA / MCP | structure compatible avec des wrappers MCP et agents IA |
|
|
105
105
|
|
|
106
106
|
---
|
|
@@ -220,15 +220,17 @@ Il est donc possible de laisser le client résoudre les tokens automatiquement o
|
|
|
220
220
|
```text
|
|
221
221
|
src/ffbb_data_client/
|
|
222
222
|
├── clients/
|
|
223
|
-
│ ├── ffbb_data_client.py # Façade publique
|
|
224
|
-
│ ├── api_ffbb_app_client.py
|
|
225
|
-
│ └── meilisearch_ffbb_client.py
|
|
226
|
-
├── helpers/
|
|
227
|
-
├── models/
|
|
228
|
-
├── utils/
|
|
229
|
-
└── data/
|
|
223
|
+
│ ├── ffbb_data_client.py # Façade publique (sync → async delegation)
|
|
224
|
+
│ ├── api_ffbb_app_client.py # Client REST FFBB (async source of truth)
|
|
225
|
+
│ └── meilisearch_ffbb_client.py # Client recherche Meilisearch
|
|
226
|
+
├── helpers/ # Requêtes HTTP, multi-search, conversions
|
|
227
|
+
├── models/ # Modèles Pydantic v2
|
|
228
|
+
├── utils/ # cache (sync/async séparés), tokens, logging sécurisé
|
|
229
|
+
└── data/ # schémas et métadonnées embarqués
|
|
230
230
|
```
|
|
231
231
|
|
|
232
|
+
> **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`.
|
|
233
|
+
|
|
232
234
|
---
|
|
233
235
|
|
|
234
236
|
## 🧪 Développement local
|
|
@@ -244,8 +246,13 @@ Commandes utiles :
|
|
|
244
246
|
pytest tests/unit/
|
|
245
247
|
pytest tests/integration/
|
|
246
248
|
pytest tests/ --cov=src
|
|
249
|
+
tox -e type # mypy + pyright
|
|
247
250
|
```
|
|
248
251
|
|
|
252
|
+
Hooks automatiques :
|
|
253
|
+
- **pre-push** : exécute mypy + pyright avant chaque push
|
|
254
|
+
- **pre-commit** : black, isort, flake8, trailing-whitespace
|
|
255
|
+
|
|
249
256
|
Documentation complémentaire :
|
|
250
257
|
|
|
251
258
|
- [`LOCAL_CI_GUIDE.md`](LOCAL_CI_GUIDE.md)
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
# Security Policy
|
|
2
|
+
|
|
3
|
+
## Reporting a Vulnerability
|
|
4
|
+
|
|
5
|
+
Please report suspected vulnerabilities privately by email to the maintainer listed in `setup.cfg` or through GitHub Security Advisories when available.
|
|
6
|
+
|
|
7
|
+
Do not disclose security issues publicly until a fix or mitigation has been released.
|
|
8
|
+
|
|
9
|
+
## Supported Versions
|
|
10
|
+
|
|
11
|
+
Security fixes target the latest released version of `ffbb-data-client` on PyPI and the current `master` branch.
|
|
12
|
+
|
|
13
|
+
## Sensitive Data
|
|
14
|
+
|
|
15
|
+
Do not include FFBB bearer tokens, Meilisearch tokens, logs containing credentials, or private user data in reports. If such data is required to reproduce the issue, redact it first.
|
|
@@ -35,10 +35,7 @@ except ImportError:
|
|
|
35
35
|
|
|
36
36
|
output_dir = os.path.join(__location__, "api")
|
|
37
37
|
module_dir = os.path.join(__location__, "../src/ffbb_data_client")
|
|
38
|
-
|
|
39
|
-
shutil.rmtree(output_dir)
|
|
40
|
-
except FileNotFoundError:
|
|
41
|
-
pass
|
|
38
|
+
shutil.rmtree(output_dir, ignore_errors=True)
|
|
42
39
|
|
|
43
40
|
try:
|
|
44
41
|
import sphinx
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
hishel[async]>=1.2.1
|
|
2
2
|
httpx>=0.28.1
|
|
3
|
-
pydantic>=2.13.
|
|
3
|
+
pydantic>=2.13.4
|
|
4
4
|
python-dateutil>=2.9.0.post0
|
|
5
5
|
python-dotenv>=1.2.2
|
|
6
6
|
readme_renderer[md]>=44.0
|
|
@@ -8,5 +8,5 @@ requests_cache
|
|
|
8
8
|
# Requirements file for ReadTheDocs, check .readthedocs.yml.
|
|
9
9
|
# To build the module reference correctly, make sure every external package
|
|
10
10
|
# under `install_requires` in `setup.cfg` is also listed here!
|
|
11
|
-
sphinx>=
|
|
11
|
+
sphinx>=9.1.0
|
|
12
12
|
# sphinx_rtd_theme
|
|
@@ -155,21 +155,3 @@ except PackageNotFoundError:
|
|
|
155
155
|
__version__ = "unknown"
|
|
156
156
|
finally:
|
|
157
157
|
del version, PackageNotFoundError
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
# ---------------------------------------------------------------------------
|
|
161
|
-
# Backward-compatibility alias (deprecated)
|
|
162
|
-
# ---------------------------------------------------------------------------
|
|
163
|
-
import warnings as _warnings
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
def __getattr__(name: str):
|
|
167
|
-
if name == "FFBBAPIClientV3":
|
|
168
|
-
_warnings.warn(
|
|
169
|
-
"FFBBAPIClientV3 has been renamed to FFBBDataClient. "
|
|
170
|
-
"Update your imports: from ffbb_data_client import FFBBDataClient",
|
|
171
|
-
DeprecationWarning,
|
|
172
|
-
stacklevel=2,
|
|
173
|
-
)
|
|
174
|
-
return FFBBDataClient
|
|
175
|
-
raise AttributeError(f"module {__name__!r} has no attribute {name!r}")
|