ffbb-data-client 2.3.3__tar.gz → 2.3.4__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/.github/workflows/keep-ffbb-api-discovery-alive.yml +3 -3
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/.github/workflows/publish.yml +1 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/.github/workflows/release-after-discovery-merge.yml +8 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/.github/workflows/update-ffbb-api-discovery.yml +1 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/CHANGELOG.md +52 -1
- ffbb_data_client-2.3.4/DESIGN.md +171 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/PKG-INFO +6 -26
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/README.md +5 -25
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/RELEASE_NOTES.md +74 -2
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/scripts/discover_endpoints.py +37 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/clients/api_ffbb_app_client.py +4 -3
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/clients/meilisearch_client.py +3 -4
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/saison_fields.py +0 -1
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/utils/secure_logging.py +15 -12
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client.egg-info/PKG-INFO +6 -26
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client.egg-info/SOURCES.txt +1 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client.egg-info/scm_file_list.json +1 -0
- ffbb_data_client-2.3.4/src/ffbb_data_client.egg-info/scm_version.json +8 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/tests/integration/test_503_secure_logging.py +4 -6
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/tests/unit/clients/test_201_unit_tests_core.py +2 -3
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/tests/unit/utils/test_300_secure_logging.py +23 -8
- ffbb_data_client-2.3.4/website/css/style.css +1124 -0
- ffbb_data_client-2.3.4/website/index.html +623 -0
- ffbb_data_client-2.3.3/src/ffbb_data_client.egg-info/scm_version.json +0 -8
- ffbb_data_client-2.3.3/website/css/style.css +0 -490
- ffbb_data_client-2.3.3/website/index.html +0 -256
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/.agents/rules/antigravity-rtk-rules.md +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/.coveragerc +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/.gitattributes +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/.github/FUNDING.yml +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/.github/dependabot.yml +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/.github/scripts/ai-pr-reviewer.cjs +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/.github/scripts/check_wrapper_parity.py +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/.github/workflows/ai-pr-reviewer.yml +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/.github/workflows/check_wrapper_parity.yml +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/.github/workflows/ci.yml +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/.github/workflows/codeql.yml +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/.github/workflows/deploy-pages.yml +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/.gitignore +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/.isort.cfg +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/.jules/bolt.md +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/.pre-commit-config.yaml +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/.readthedocs.yml +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/AGENTS.md +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/AUTHORS.rst +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/CODE_OF_CONDUCT.md +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/CONTRIBUTING.rst +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/LICENSE.txt +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/LOCAL_CI_GUIDE.md +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/SECURITY.md +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/data/api.ffbb.app.json +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/data/api_update_summary.md +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/data/collections.json +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/data/endpoint_discovery.json +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/data/indexes.json +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/data/meilisearch-prod.ffbb.app.json +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/data/openapi.json +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/data/openapi_full.json +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/data/type_discovery_corrections.json +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/docs/Makefile +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/docs/_static/.gitignore +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/docs/architecture.rst +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/docs/authors.rst +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/docs/changelog.rst +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/docs/conf.py +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/docs/contributing.rst +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/docs/examples.rst +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/docs/index.rst +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/docs/license.rst +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/docs/migration.rst +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/docs/readme.rst +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/docs/requirements.txt +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/docs/test_strategy.md +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/docs/testing_conventions.md +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/examples/README.md +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/examples/complete_usage_example.py +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/examples/quick_start.py +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/examples/team_ranking_analysis.py +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/graphify-cross-repo.json +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/pyproject.toml +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/pytest.ini +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/run-ci-locally.sh +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/scripts/benchmark_concurrent_pagination.py +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/scripts/benchmark_search_organisme.py +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/scripts/discover_types.py +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/setup.cfg +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/setup.py +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/__init__.py +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/clients/__init__.py +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/clients/_helpers.py +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/clients/_mixins/__init__.py +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/clients/_mixins/competition.py +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/clients/_mixins/external.py +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/clients/_mixins/getters.py +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/clients/_mixins/list_methods.py +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/clients/_mixins/organisme.py +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/clients/_rest_facade.py +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/clients/_search_facade.py +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/clients/ffbb_data_client.py +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/clients/meilisearch_ffbb_client.py +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/config.py +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/data/__init__.py +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/data/collections.json +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/data/endpoint_discovery.json +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/data/indexes.json +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/data/openapi.json +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/helpers/__init__.py +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/helpers/http_requests_helper.py +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/helpers/http_requests_utils.py +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/helpers/meilisearch_client_extension.py +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/helpers/multi_search_query_helper.py +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/__init__.py +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/affiche.py +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/cartographie.py +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/categorie.py +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/categorie_type.py +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/clock.py +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/club_contacts.py +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/code.py +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/commune.py +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/competition_fields.py +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/competition_id.py +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/competition_id_categorie.py +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/competition_id_sexe.py +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/competition_id_type_competition.py +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/competition_id_type_competition_generique.py +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/competition_origine.py +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/competition_origine_categorie.py +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/competition_origine_type_competition.py +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/competition_origine_type_competition_generique.py +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/competition_type.py +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/competitions_facet_distribution.py +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/competitions_facet_stats.py +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/competitions_hit.py +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/competitions_multi_search_query.py +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/competitions_query.py +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/configuration_models.py +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/contact_info.py +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/content_multi_search_query.py +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/coordonnees.py +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/coordonnees_type.py +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/document_flyer.py +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/document_flyer_type.py +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/engagement_contacts.py +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/engagements_facet_distribution.py +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/engagements_facet_stats.py +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/engagements_hit.py +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/engagements_multi_search_query.py +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/etat.py +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/external_competition_id.py +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/external_id.py +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/facet_distribution.py +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/facet_stats.py +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/field_set.py +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/folder.py +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/formation_session.py +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/formations_facet_distribution.py +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/formations_facet_stats.py +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/formations_hit.py +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/formations_multi_search_query.py +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/game_stats_model.py +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/game_stats_models.py +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/generic_search.py +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/geo.py +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/geo_sort_order.py +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/get_commune_response.py +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/get_competition_response.py +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/get_configuration_response.py +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/get_engagement_response.py +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/get_entraineur_response.py +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/get_formation_response.py +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/get_officiel_response.py +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/get_organisme_response.py +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/get_poule_response.py +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/get_pratique_response.py +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/get_rencontre_response.py +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/get_saisons_response.py +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/get_salle_response.py +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/get_terrain_response.py +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/get_tournoi_response.py +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/gradient_color.py +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/hit.py +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/id_engagement_equipe.py +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/id_organisme_equipe.py +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/id_organisme_equipe1_logo.py +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/id_poule.py +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/jour.py +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/label.py +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/labellisation.py +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/live.py +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/lives.py +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/logo.py +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/multi_search_queries.py +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/multi_search_query.py +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/multi_search_result_competitions.py +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/multi_search_result_engagements.py +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/multi_search_result_formations.py +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/multi_search_result_organismes.py +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/multi_search_result_pratiques.py +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/multi_search_result_rencontres.py +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/multi_search_result_salles.py +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/multi_search_result_terrains.py +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/multi_search_result_tournois.py +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/multi_search_results.py +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/multi_search_results_class.py +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/nature_sol.py +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/niveau.py +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/niveau_class.py +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/niveau_extractor.py +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/niveau_info.py +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/niveau_models.py +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/niveau_type.py +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/objectif.py +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/organisateur.py +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/organisateur_type.py +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/organisme_fields.py +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/organisme_id_pere.py +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/organismes_facet_distribution.py +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/organismes_facet_stats.py +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/organismes_hit.py +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/organismes_multi_search_query.py +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/organismes_query.py +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/phase_code.py +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/poule.py +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/poule_fields.py +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/poule_rencontre_item_model.py +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/poules_models.py +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/poules_query.py +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/pratique.py +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/pratiques_facet_distribution.py +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/pratiques_facet_stats.py +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/pratiques_hit.py +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/pratiques_hit_type.py +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/pratiques_multi_search_query.py +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/pratiques_type_class.py +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/publication_internet.py +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/purple_logo.py +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/query_fields_manager.py +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/ranking_engagement.py +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/rankings_models.py +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/rencontres_engagement.py +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/rencontres_facet_distribution.py +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/rencontres_facet_stats.py +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/rencontres_hit.py +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/rencontres_multi_search_query.py +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/saison.py +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/saisons_models.py +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/saisons_query.py +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/salle.py +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/salles_facet_distribution.py +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/salles_facet_stats.py +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/salles_hit.py +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/salles_multi_search_query.py +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/sexe.py +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/sexe_class.py +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/source.py +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/status.py +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/team_engagement.py +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/team_ranking.py +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/terrains_categorie_championnat_3x3_libelle.py +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/terrains_facet_distribution.py +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/terrains_facet_stats.py +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/terrains_hit.py +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/terrains_multi_search_query.py +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/terrains_name.py +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/terrains_sexe_enum.py +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/terrains_storage.py +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/tournoi_type_class.py +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/tournoi_type_enum.py +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/tournoi_types_3x3.py +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/tournoi_types_3x3_libelle.py +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/tournoi_types_3x3_libelle_enum.py +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/tournois_facet_distribution.py +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/tournois_facet_stats.py +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/tournois_hit.py +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/tournois_hit_type.py +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/tournois_libelle.py +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/tournois_multi_search_query.py +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/type_association.py +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/type_association_libelle.py +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/type_class.py +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/type_competition.py +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/type_competition_generique.py +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/type_enum.py +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/type_league.py +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/py.typed +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/utils/__init__.py +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/utils/cache_manager.py +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/utils/concurrency_utils.py +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/utils/converter_utils.py +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/utils/input_validation.py +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/utils/retry_utils.py +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/utils/token_manager.py +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client.egg-info/dependency_links.txt +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client.egg-info/not-zip-safe +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client.egg-info/requires.txt +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client.egg-info/top_level.txt +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/tests/conftest.py +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/tests/e2e/__init__.py +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/tests/e2e/conftest.py +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/tests/integration/__init__.py +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/tests/integration/conftest.py +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/tests/integration/test_500_user_journey.py +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/tests/integration/test_501_user_journey_v3.py +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/tests/integration/test_502_enhanced_integration.py +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/tests/integration/test_504_input_validation.py +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/tests/integration/test_505_retry_timeout.py +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/tests/integration/test_506_raw_json_model_conversion.py +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/tests/unit/__init__.py +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/tests/unit/clients/__init__.py +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/tests/unit/clients/test_200_api_ffbb_app_client.py +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/tests/unit/clients/test_202_meilisearch_client.py +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/tests/unit/clients/test_203_meilisearch_client_extension.py +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/tests/unit/clients/test_204_ffbb_data_client.py +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/tests/unit/clients/test_205_meilisearch_ffbb_client.py +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/tests/unit/clients/test_206_coverage_gaps_clients.py +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/tests/unit/clients/test_207_coverage_clients_extended.py +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/tests/unit/clients/test_208_new_methods_coverage.py +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/tests/unit/clients/test_209_automatic_token_resolution.py +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/tests/unit/clients/test_210_targeted_clients_helpers_coverage.py +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/tests/unit/clients/test_async_methods.py +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/tests/unit/clients/test_meilisearch_async.py +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/tests/unit/clients/test_search_many.py +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/tests/unit/clients/test_v2_backport_search.py +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/tests/unit/clients/test_v3_new_features.py +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/tests/unit/clients/test_warm_cache.py +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/tests/unit/conftest.py +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/tests/unit/helpers/__init__.py +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/tests/unit/helpers/test_400_http_helpers.py +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/tests/unit/helpers/test_meilisearch_client_extension_recursive_pagination.py +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/tests/unit/helpers/test_meilisearch_pagination_concurrent.py +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/tests/unit/models/__init__.py +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/tests/unit/models/test_100_competition_id_categorie.py +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/tests/unit/models/test_101_competition_id_sexe.py +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/tests/unit/models/test_102_competition_id_type_competition.py +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/tests/unit/models/test_103_competition_id_type_competition_generique.py +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/tests/unit/models/test_104_competition_origine_categorie.py +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/tests/unit/models/test_105_competition_origine_type_competition_generique.py +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/tests/unit/models/test_106_competition_origine.py +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/tests/unit/models/test_107_id_engagement_equipe.py +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/tests/unit/models/test_108_id_organisme_equipe.py +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/tests/unit/models/test_109_id_organisme_equipe1_logo.py +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/tests/unit/models/test_110_labellisation.py +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/tests/unit/models/test_111_niveau_class.py +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/tests/unit/models/test_112_purple_logo.py +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/tests/unit/models/test_113_salle.py +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/tests/unit/models/test_114_tournoi_type_class.py +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/tests/unit/models/test_115_type_association_libelle.py +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/tests/unit/models/test_116_type_competition_generique.py +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/tests/unit/models/test_117_organisateur.py +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/tests/unit/models/test_118_competition_id.py +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/tests/unit/models/test_119_terrains_inner_models.py +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/tests/unit/models/test_120_pratiques_inner_models.py +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/tests/unit/models/test_121_to_dict_round_trip.py +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/tests/unit/models/test_122_coverage_gaps.py +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/tests/unit/models/test_123_missing_coverage.py +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/tests/unit/models/test_123_v2_backport.py +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/tests/unit/models/test_124_targeted_coverage_gains.py +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/tests/unit/models/test_dx_aliases.py +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/tests/unit/test_310_discover_endpoints.py +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/tests/unit/utils/__init__.py +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/tests/unit/utils/test_301_input_validation.py +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/tests/unit/utils/test_302_retry_utils.py +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/tests/unit/utils/test_303_cache_manager.py +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/tests/unit/utils/test_304_config.py +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/tests/unit/utils/test_305_token_manager.py +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/tests/unit/utils/test_306_converter_utils.py +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/tests/unit/utils/test_307_coverage_gaps_utils.py +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/tests/unit/utils/test_308_converter_utils_extended.py +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/tests/unit/utils/test_309_concurrency_utils.py +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/tools/add_cross_repo_edges.py +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/tools/graphify-cross-repo.sh +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/tools/graphify_cross_repo.py +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/tools/update_agents_md.py +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/tox.ini +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/website/assets/logo.webp +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/website/robots.txt +0 -0
- {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/website/sitemap.xml +0 -0
|
@@ -20,14 +20,14 @@ jobs:
|
|
|
20
20
|
env:
|
|
21
21
|
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
|
22
22
|
run: |
|
|
23
|
-
last_ts=$(gh api repos/${{ github.repository }}/actions/workflows/
|
|
24
|
-
--jq
|
|
23
|
+
last_ts=$(gh api repos/${{ github.repository }}/actions/workflows/268964669/runs \
|
|
24
|
+
--jq '.workflow_runs[0].created_at' | tr -d '"' || echo "1970-01-01T00:00:00Z")
|
|
25
25
|
echo "last_run=$last_ts"
|
|
26
26
|
cutoff=$(date -u -d '-22 hours' +%Y-%m-%dT%H:%M:%SZ)
|
|
27
27
|
echo "cutoff=$cutoff"
|
|
28
28
|
if [[ "$last_ts" < "$cutoff" ]]; then
|
|
29
29
|
echo "STALE: last run $last_ts is older than 22h, triggering discovery now"
|
|
30
|
-
gh workflow run
|
|
30
|
+
gh workflow run 268964669 --repo ${{ github.repository }} --ref master
|
|
31
31
|
echo "triggered=true" >> "$GITHUB_OUTPUT"
|
|
32
32
|
else
|
|
33
33
|
echo "OK: discovery ran at $last_ts, no action needed"
|
|
@@ -9,6 +9,7 @@ on:
|
|
|
9
9
|
permissions:
|
|
10
10
|
contents: write
|
|
11
11
|
pull-requests: read
|
|
12
|
+
actions: write
|
|
12
13
|
|
|
13
14
|
concurrency:
|
|
14
15
|
group: release-after-discovery-${{ github.event.workflow_run.head_sha }}
|
|
@@ -89,3 +90,10 @@ jobs:
|
|
|
89
90
|
git config user.email "41898282+github-actions[bot]@users.noreply.github.com"
|
|
90
91
|
git tag -a "$NEXT_TAG" -m "Release $NEXT_TAG after FFBB API discovery PR #$PR_NUMBER"
|
|
91
92
|
git push origin "$NEXT_TAG"
|
|
93
|
+
|
|
94
|
+
- name: Dispatch publish workflow
|
|
95
|
+
if: steps.pr.outputs.release == 'true'
|
|
96
|
+
env:
|
|
97
|
+
NEXT_TAG: ${{ steps.version.outputs.tag }}
|
|
98
|
+
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
|
99
|
+
run: gh workflow run publish.yml --ref "$NEXT_TAG"
|
|
@@ -7,8 +7,23 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
7
7
|
|
|
8
8
|
## [Unreleased]
|
|
9
9
|
|
|
10
|
+
## [2.3.4] - 2026-08-19
|
|
11
|
+
|
|
12
|
+
### Fixed
|
|
13
|
+
- **Security**: Masquage complet des tokens d'authentification dans les messages et arguments de formatage de logs (`CWE-532` / alertes CodeQL).
|
|
14
|
+
- **Directus 403**: Retrait du champ `nom` obsolète dans `SaisonFields` pour prévenir les erreurs de permissions sur l'endpoint des saisons.
|
|
15
|
+
|
|
16
|
+
### Added & Changed
|
|
17
|
+
- **Website & Documentation**: Refonte de la landing page avec design spatial et support mobile 100% responsive (tiroir de navigation hamburger, protection contre le CSS grid blowout, typographie fluide).
|
|
18
|
+
- **PyPI & Docs**: Correction des liens relatifs dans le README pour un affichage propre sur PyPI.
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
## [2.3.3] - 2026-08-10
|
|
22
|
+
|
|
10
23
|
### Added
|
|
11
|
-
- **Recherche parallèle
|
|
24
|
+
- **Recherche parallèle**: `search_many` / `search_many_async` exécutent plusieurs recherches Meilisearch indépendantes concurrentement (`asyncio.gather`) et renvoient les résultats dans l'ordre. Chaque `SearchSpec` est dispatché vers la méthode `search_multiple_<resource>_async` correspondante.
|
|
25
|
+
- **Keepalive CI**: nouveau workflow `keep-ffbb-api-discovery-alive` garantissant une exécution quotidienne de la discovery automatique des artefacts API (relance si aucun run depuis 22 h).
|
|
26
|
+
- **Unit tests** pour le script de discovery FFBB API (`scripts/discover_endpoints.py`).
|
|
12
27
|
|
|
13
28
|
### Changed
|
|
14
29
|
- **Performance**: `recursive_smart_multi_search` / `recursive_smart_multi_search_async`
|
|
@@ -17,6 +32,35 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
17
32
|
allers-retours réseau un par un — divisant la latence de pagination par le nombre de pages.
|
|
18
33
|
- Les requêtes de pagination sont désormais **clonées** (`dataclasses.replace`) au lieu de
|
|
19
34
|
muter les objets `MultiSearchQuery` du caller, supprimant une fuite d'état entre appels.
|
|
35
|
+
- **Refactor**: `api_ffbb_app_client.py` découpé en mixins (2408 → 113 lignes).
|
|
36
|
+
- **Performance**: réutilisation des connexions HTTP, wheel allégée et déduplication des recherches Meilisearch.
|
|
37
|
+
- **CI**: migration du AI PR reviewer (`.js` → `.cjs`), pagination et retry; simplification de la résolution de conflits de PR.
|
|
38
|
+
|
|
39
|
+
### Fixed
|
|
40
|
+
- Incohérences de la codebase : collision `HitType`, imports `_models` dépréciés remplacés par les sous-modules directs.
|
|
41
|
+
- CI : exécution uniquement de l'environnement tox correspondant à la matrice dans le job de test.
|
|
42
|
+
- Alertes CodeQL (imports) et ordre d'imports isort dans `http_requests_utils`.
|
|
43
|
+
|
|
44
|
+
## [2.3.2] - 2026-06-13
|
|
45
|
+
|
|
46
|
+
### Fixed
|
|
47
|
+
- Résolution du cycle d'imports du token manager et alignement des fichiers d'outillage (`fix: resolve token manager import cycle and sync tooling files`).
|
|
48
|
+
- Alertes CodeQL (imports et `empty-except`).
|
|
49
|
+
- Corrections pre-commit appliquées pour passer la CI.
|
|
50
|
+
|
|
51
|
+
## [2.3.1] - 2026-06-13
|
|
52
|
+
|
|
53
|
+
### Added
|
|
54
|
+
- **AI Pull Request Reviewer**: workflow d'analyse automatique des PR (analyse statique, commentaires automatiques, résolution de conflits `bolt.md`).
|
|
55
|
+
|
|
56
|
+
### Changed
|
|
57
|
+
- **Performance**: suppression de `TypeAdapter` de Pydantic au profit des parseurs natifs; optimisation de la réutilisation des connexions HTTP et du cache warming parallèle.
|
|
58
|
+
- **CI**: cache pip et tox dans la pipeline GitHub Actions; opt-in Node.js 24 pour toutes les actions JavaScript; upgrade `actions/checkout` (4→6), `actions/setup-node` (4→6), `upload-artifact`/`download-artifact` (v7/v8), `github/codeql-action` (4.35.5→4.36.x); permission `workflows: write` ajoutée puis revertée sur `release-after-discovery-merge`.
|
|
59
|
+
|
|
60
|
+
### Fixed
|
|
61
|
+
- Alertes de code scanning (`md5`, variables globales inutilisées, faux positifs Ruff S105).
|
|
62
|
+
- Cycle d'imports entre `token_manager` et `http_requests_utils`.
|
|
63
|
+
- Ordre d'imports (isort) et corrections flake8 pour le pre-commit de mise à jour des artefacts.
|
|
20
64
|
|
|
21
65
|
## [2.3.0] - 2026-05-24
|
|
22
66
|
|
|
@@ -291,3 +335,10 @@ organisme = client.get_organisme(999999)
|
|
|
291
335
|
if organisme is None:
|
|
292
336
|
print("Organization not found or error occurred")
|
|
293
337
|
```
|
|
338
|
+
|
|
339
|
+
[Unreleased]: https://github.com/nickdesi/ffbb-data-client/compare/v2.3.3...master
|
|
340
|
+
[2.3.3]: https://github.com/nickdesi/ffbb-data-client/compare/v2.3.2...v2.3.3
|
|
341
|
+
[2.3.2]: https://github.com/nickdesi/ffbb-data-client/compare/v2.3.1...v2.3.2
|
|
342
|
+
[2.3.1]: https://github.com/nickdesi/ffbb-data-client/compare/v2.3.0...v2.3.1
|
|
343
|
+
[2.3.0]: https://github.com/nickdesi/ffbb-data-client/compare/v2.2.0...v2.3.0
|
|
344
|
+
[2.2.0]: https://github.com/nickdesi/ffbb-data-client/compare/v2.1.0...v2.2.0
|
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
---
|
|
2
|
+
version: "alpha"
|
|
3
|
+
name: "FFBB Data Client Design System"
|
|
4
|
+
description: "Google Labs DESIGN.md specification for ffbb-data-client web presence and documentation UI"
|
|
5
|
+
colors:
|
|
6
|
+
primary: "#090A0F"
|
|
7
|
+
on-primary: "#FFFFFF"
|
|
8
|
+
surface: "#121520"
|
|
9
|
+
on-surface: "#F1F5F9"
|
|
10
|
+
surface-variant: "#1A1F2E"
|
|
11
|
+
surface-elevated: "#22293D"
|
|
12
|
+
accent-orange: "#C03E08"
|
|
13
|
+
accent-amber: "#F59E0B"
|
|
14
|
+
accent-mint: "#34D399"
|
|
15
|
+
accent-cyan: "#06B6D4"
|
|
16
|
+
accent-indigo: "#818CF8"
|
|
17
|
+
text-secondary: "#94A3B8"
|
|
18
|
+
text-muted: "#64748B"
|
|
19
|
+
border-glass: "#22293D"
|
|
20
|
+
border-active: "#C03E08"
|
|
21
|
+
typography:
|
|
22
|
+
display-hero:
|
|
23
|
+
fontFamily: "Outfit, Space Grotesk, sans-serif"
|
|
24
|
+
fontSize: "4.5rem"
|
|
25
|
+
fontWeight: "800"
|
|
26
|
+
lineHeight: "1.08"
|
|
27
|
+
letterSpacing: "-0.035em"
|
|
28
|
+
h1:
|
|
29
|
+
fontFamily: "Space Grotesk, sans-serif"
|
|
30
|
+
fontSize: "3.25rem"
|
|
31
|
+
fontWeight: "800"
|
|
32
|
+
lineHeight: "1.15"
|
|
33
|
+
letterSpacing: "-0.025em"
|
|
34
|
+
h2:
|
|
35
|
+
fontFamily: "Space Grotesk, sans-serif"
|
|
36
|
+
fontSize: "2.25rem"
|
|
37
|
+
fontWeight: "700"
|
|
38
|
+
lineHeight: "1.2"
|
|
39
|
+
h3:
|
|
40
|
+
fontFamily: "Outfit, Space Grotesk, sans-serif"
|
|
41
|
+
fontSize: "1.4rem"
|
|
42
|
+
fontWeight: "700"
|
|
43
|
+
body-lg:
|
|
44
|
+
fontFamily: "Inter, sans-serif"
|
|
45
|
+
fontSize: "1.25rem"
|
|
46
|
+
lineHeight: "1.7"
|
|
47
|
+
body-md:
|
|
48
|
+
fontFamily: "Inter, sans-serif"
|
|
49
|
+
fontSize: "1rem"
|
|
50
|
+
lineHeight: "1.65"
|
|
51
|
+
code:
|
|
52
|
+
fontFamily: "JetBrains Mono, monospace"
|
|
53
|
+
fontSize: "0.94rem"
|
|
54
|
+
lineHeight: "1.7"
|
|
55
|
+
label-caps:
|
|
56
|
+
fontFamily: "Inter, sans-serif"
|
|
57
|
+
fontSize: "0.85rem"
|
|
58
|
+
fontWeight: "600"
|
|
59
|
+
letterSpacing: "0.06em"
|
|
60
|
+
rounded:
|
|
61
|
+
sm: "12px"
|
|
62
|
+
md: "16px"
|
|
63
|
+
card: "24px"
|
|
64
|
+
hero: "32px"
|
|
65
|
+
chip: "9999px"
|
|
66
|
+
spacing:
|
|
67
|
+
xs: "4px"
|
|
68
|
+
sm: "8px"
|
|
69
|
+
md: "16px"
|
|
70
|
+
lg: "24px"
|
|
71
|
+
xl: "32px"
|
|
72
|
+
xxl: "64px"
|
|
73
|
+
components:
|
|
74
|
+
button-primary:
|
|
75
|
+
backgroundColor: "{colors.accent-orange}"
|
|
76
|
+
textColor: "{colors.on-primary}"
|
|
77
|
+
rounded: "{rounded.chip}"
|
|
78
|
+
padding: "16px 36px"
|
|
79
|
+
button-surface:
|
|
80
|
+
backgroundColor: "{colors.surface-variant}"
|
|
81
|
+
textColor: "{colors.on-surface}"
|
|
82
|
+
rounded: "{rounded.chip}"
|
|
83
|
+
padding: "16px 36px"
|
|
84
|
+
chip-category:
|
|
85
|
+
backgroundColor: "{colors.surface-elevated}"
|
|
86
|
+
textColor: "{colors.text-secondary}"
|
|
87
|
+
rounded: "{rounded.chip}"
|
|
88
|
+
padding: "6px 16px"
|
|
89
|
+
chip-mint:
|
|
90
|
+
backgroundColor: "{colors.surface-variant}"
|
|
91
|
+
textColor: "{colors.accent-mint}"
|
|
92
|
+
rounded: "{rounded.chip}"
|
|
93
|
+
chip-cyan:
|
|
94
|
+
backgroundColor: "{colors.surface-variant}"
|
|
95
|
+
textColor: "{colors.accent-cyan}"
|
|
96
|
+
rounded: "{rounded.chip}"
|
|
97
|
+
chip-indigo:
|
|
98
|
+
backgroundColor: "{colors.surface-variant}"
|
|
99
|
+
textColor: "{colors.accent-indigo}"
|
|
100
|
+
rounded: "{rounded.chip}"
|
|
101
|
+
chip-amber:
|
|
102
|
+
backgroundColor: "{colors.surface-variant}"
|
|
103
|
+
textColor: "{colors.accent-amber}"
|
|
104
|
+
rounded: "{rounded.chip}"
|
|
105
|
+
feature-card:
|
|
106
|
+
backgroundColor: "{colors.surface}"
|
|
107
|
+
textColor: "{colors.on-surface}"
|
|
108
|
+
rounded: "{rounded.card}"
|
|
109
|
+
padding: "36px"
|
|
110
|
+
text-caption:
|
|
111
|
+
textColor: "{colors.text-muted}"
|
|
112
|
+
container-border:
|
|
113
|
+
backgroundColor: "{colors.border-glass}"
|
|
114
|
+
container-active-border:
|
|
115
|
+
backgroundColor: "{colors.border-active}"
|
|
116
|
+
---
|
|
117
|
+
|
|
118
|
+
## Overview
|
|
119
|
+
|
|
120
|
+
Architectural Rigor meets Google Editorial Design. The visual identity of `ffbb-data-client` balances high-performance sports analytics with the refined typography and spatial clarity of Google Labs.
|
|
121
|
+
|
|
122
|
+
## Colors
|
|
123
|
+
|
|
124
|
+
The color system is built on deep slate foundations punctuated by the energetic warmth of Basketball Orange and Material You accent tones.
|
|
125
|
+
|
|
126
|
+
- **Primary (#090A0F):** Deep midnight slate for full-bleed backgrounds and ambient mesh.
|
|
127
|
+
- **Surface (#121520):** Elevated dark slate for cards and code containers.
|
|
128
|
+
- **Accent Orange (#C03E08):** Vibrant French basketball orange — the primary interaction and brand signature.
|
|
129
|
+
- **Accent Mint (#34D399) & Cyan (#06B6D4):** High-clarity feedback indicators for live synchronization and speed.
|
|
130
|
+
- **Accent Indigo (#818CF8):** Editorial accent for architecture and developer tooling highlights.
|
|
131
|
+
|
|
132
|
+
## Typography
|
|
133
|
+
|
|
134
|
+
Typography establishes an expressive editorial hierarchy inspired by *Google Design* and *Space Grotesk*.
|
|
135
|
+
|
|
136
|
+
- **Display & Headlines:** `Outfit` & `Space Grotesk` with tight tracking (`-0.035em`) for commanding editorial titles.
|
|
137
|
+
- **Body & Captions:** `Inter` for optimal legibility across desktop and mobile screens.
|
|
138
|
+
- **Code & Syntax:** `JetBrains Mono` for precise terminal snippets and typed Python examples.
|
|
139
|
+
|
|
140
|
+
## Layout
|
|
141
|
+
|
|
142
|
+
- Fluid 12-column grid maxing out at `1260px` with generous vertical breathing room (`96px` section padding).
|
|
143
|
+
- Bento grid arrangements with asymmetric spotlight cards for lead architectural stories.
|
|
144
|
+
|
|
145
|
+
## Elevation & Depth
|
|
146
|
+
|
|
147
|
+
- Layered spatial depth using CSS `backdrop-filter: blur(20px)` and soft diffused shadows (`0 25px 60px -15px rgba(0,0,0,0.7)`).
|
|
148
|
+
- Kinetic micro-elevations on hover with smooth spring easing curves (`cubic-bezier(0.16, 1, 0.3, 1)`).
|
|
149
|
+
|
|
150
|
+
## Shapes
|
|
151
|
+
|
|
152
|
+
- Pill-shaped interactive chips (`border-radius: 9999px`) for tags, action buttons, and live status badges.
|
|
153
|
+
- Expressive rounded cards (`border-radius: 24px` to `32px`) echoing Material 3 geometric standards.
|
|
154
|
+
|
|
155
|
+
## Components
|
|
156
|
+
|
|
157
|
+
- **Playground Card:** Glassmorphism code block with macOS-style control dots, language tabs, and copy feedback.
|
|
158
|
+
- **Spotlight Banner:** Lead story card combining continuous API discovery metrics with live JSON status.
|
|
159
|
+
- **Interactive Chips Bar:** Filterable pills enabling frictionless switching between Python code snippets.
|
|
160
|
+
|
|
161
|
+
## Do's and Don'ts
|
|
162
|
+
|
|
163
|
+
### Do
|
|
164
|
+
- Always use semantic color tokens for status badges (`accent-mint` for live sync, `accent-orange` for primary CTA).
|
|
165
|
+
- Maintain generous whitespace and high-contrast editorial hierarchy.
|
|
166
|
+
- Ensure all interactive cards have subtle hover states (`translateY(-4px)` with spring easing).
|
|
167
|
+
|
|
168
|
+
### Don't
|
|
169
|
+
- Never use generic pure grey backgrounds (`#111111`); always use tinted slate (`#090A0F`).
|
|
170
|
+
- Avoid sharp corners (`0px` border radius) on interactive components.
|
|
171
|
+
- Do not overload cards with heavy borders; prefer translucent glass borders (`rgba(255, 255, 255, 0.08)`).
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: ffbb-data-client
|
|
3
|
-
Version: 2.3.
|
|
3
|
+
Version: 2.3.4
|
|
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
|
|
@@ -60,9 +60,9 @@ Dynamic: license-file
|
|
|
60
60
|
[](https://pypi.org/project/ffbb-data-client/)
|
|
61
61
|
[](https://github.com/nickdesi/ffbb-data-client/actions/workflows/ci.yml)
|
|
62
62
|
[](https://coveralls.io/github/nickdesi/ffbb-data-client?branch=master)
|
|
63
|
-
[](LICENSE.txt)
|
|
63
|
+
[](https://github.com/nickdesi/ffbb-data-client/blob/master/LICENSE.txt)
|
|
64
64
|
[](https://github.com/nickdesi/FFBB-MCP-Server)
|
|
65
|
-
[](SECURITY.md)
|
|
65
|
+
[](https://github.com/nickdesi/ffbb-data-client/blob/master/SECURITY.md)
|
|
66
66
|
[](https://github.com/nickdesi/ffbb-data-client/stargazers)
|
|
67
67
|
[](https://github.com/nickdesi/ffbb-data-client/commits/master)
|
|
68
68
|
[](https://github.com/nickdesi/ffbb-data-client/issues)
|
|
@@ -92,17 +92,9 @@ Dynamic: license-file
|
|
|
92
92
|
|
|
93
93
|
---
|
|
94
94
|
|
|
95
|
-
## 🚀
|
|
95
|
+
## 🚀 Nouveautés
|
|
96
96
|
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
- **détection de drift API** : surveillance des changements de schéma Directus (propriétés/types/nullabilité) ;
|
|
100
|
-
- **détection de drift Meilisearch** : agrégation robuste des attributs (`sampleKeys`) sur plusieurs hits ;
|
|
101
|
-
- **automatisation CI/CD** : ouverture automatique de PR lorsqu'un drift est détecté ;
|
|
102
|
-
- **fiabilité outillage** : alignement pyupgrade/isort/pre-commit pour des runs CI reproductibles ;
|
|
103
|
-
- **qualité/sécurité** : corrections CodeQL et nettoyage des alertes d'analyse statique.
|
|
104
|
-
|
|
105
|
-
Voir aussi : [CHANGELOG.md](https://github.com/nickdesi/ffbb-data-client/blob/master/CHANGELOG.md) et [RELEASE_NOTES.md](https://github.com/nickdesi/ffbb-data-client/blob/master/RELEASE_NOTES.md).
|
|
97
|
+
Les évolutions de chaque version sont documentées dans les [GitHub Releases](https://github.com/nickdesi/ffbb-data-client/releases), ainsi que dans [CHANGELOG.md](https://github.com/nickdesi/ffbb-data-client/blob/master/CHANGELOG.md) et [RELEASE_NOTES.md](https://github.com/nickdesi/ffbb-data-client/blob/master/RELEASE_NOTES.md).
|
|
106
98
|
|
|
107
99
|
---
|
|
108
100
|
|
|
@@ -362,19 +354,7 @@ Les contributions sont bienvenues :
|
|
|
362
354
|
|
|
363
355
|
## 📄 Licence
|
|
364
356
|
|
|
365
|
-
Distribué sous licence Apache-2.0. Voir [`LICENSE.txt`](LICENSE.txt).
|
|
366
|
-
|
|
367
|
-
---
|
|
368
|
-
|
|
369
|
-
## 📌 Recommandations GitHub
|
|
370
|
-
|
|
371
|
-
**Description suggérée :**
|
|
372
|
-
|
|
373
|
-
> 🏀 Modern async & typed Python SDK for FFBB public data (clubs, competitions, standings, lives) and Meilisearch search — the data layer behind the FFBB MCP Server.
|
|
374
|
-
|
|
375
|
-
**Topics suggérés (≤ 20) :**
|
|
376
|
-
|
|
377
|
-
`python` · `api-client` · `ffbb` · `open-data` · `basketball` · `mcp` · `model-context-protocol` · `async` · `pydantic` · `meilisearch` · `sdk` · `ai` · `llm` · `sports` · `rest-api` · `httpx` · `france` · `data` · `cache` · `typed`
|
|
357
|
+
Distribué sous licence Apache-2.0. Voir [`LICENSE.txt`](https://github.com/nickdesi/ffbb-data-client/blob/master/LICENSE.txt).
|
|
378
358
|
|
|
379
359
|
---
|
|
380
360
|
|
|
@@ -8,9 +8,9 @@
|
|
|
8
8
|
[](https://pypi.org/project/ffbb-data-client/)
|
|
9
9
|
[](https://github.com/nickdesi/ffbb-data-client/actions/workflows/ci.yml)
|
|
10
10
|
[](https://coveralls.io/github/nickdesi/ffbb-data-client?branch=master)
|
|
11
|
-
[](LICENSE.txt)
|
|
11
|
+
[](https://github.com/nickdesi/ffbb-data-client/blob/master/LICENSE.txt)
|
|
12
12
|
[](https://github.com/nickdesi/FFBB-MCP-Server)
|
|
13
|
-
[](SECURITY.md)
|
|
13
|
+
[](https://github.com/nickdesi/ffbb-data-client/blob/master/SECURITY.md)
|
|
14
14
|
[](https://github.com/nickdesi/ffbb-data-client/stargazers)
|
|
15
15
|
[](https://github.com/nickdesi/ffbb-data-client/commits/master)
|
|
16
16
|
[](https://github.com/nickdesi/ffbb-data-client/issues)
|
|
@@ -40,17 +40,9 @@
|
|
|
40
40
|
|
|
41
41
|
---
|
|
42
42
|
|
|
43
|
-
## 🚀
|
|
43
|
+
## 🚀 Nouveautés
|
|
44
44
|
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
- **détection de drift API** : surveillance des changements de schéma Directus (propriétés/types/nullabilité) ;
|
|
48
|
-
- **détection de drift Meilisearch** : agrégation robuste des attributs (`sampleKeys`) sur plusieurs hits ;
|
|
49
|
-
- **automatisation CI/CD** : ouverture automatique de PR lorsqu'un drift est détecté ;
|
|
50
|
-
- **fiabilité outillage** : alignement pyupgrade/isort/pre-commit pour des runs CI reproductibles ;
|
|
51
|
-
- **qualité/sécurité** : corrections CodeQL et nettoyage des alertes d'analyse statique.
|
|
52
|
-
|
|
53
|
-
Voir aussi : [CHANGELOG.md](https://github.com/nickdesi/ffbb-data-client/blob/master/CHANGELOG.md) et [RELEASE_NOTES.md](https://github.com/nickdesi/ffbb-data-client/blob/master/RELEASE_NOTES.md).
|
|
45
|
+
Les évolutions de chaque version sont documentées dans les [GitHub Releases](https://github.com/nickdesi/ffbb-data-client/releases), ainsi que dans [CHANGELOG.md](https://github.com/nickdesi/ffbb-data-client/blob/master/CHANGELOG.md) et [RELEASE_NOTES.md](https://github.com/nickdesi/ffbb-data-client/blob/master/RELEASE_NOTES.md).
|
|
54
46
|
|
|
55
47
|
---
|
|
56
48
|
|
|
@@ -310,19 +302,7 @@ Les contributions sont bienvenues :
|
|
|
310
302
|
|
|
311
303
|
## 📄 Licence
|
|
312
304
|
|
|
313
|
-
Distribué sous licence Apache-2.0. Voir [`LICENSE.txt`](LICENSE.txt).
|
|
314
|
-
|
|
315
|
-
---
|
|
316
|
-
|
|
317
|
-
## 📌 Recommandations GitHub
|
|
318
|
-
|
|
319
|
-
**Description suggérée :**
|
|
320
|
-
|
|
321
|
-
> 🏀 Modern async & typed Python SDK for FFBB public data (clubs, competitions, standings, lives) and Meilisearch search — the data layer behind the FFBB MCP Server.
|
|
322
|
-
|
|
323
|
-
**Topics suggérés (≤ 20) :**
|
|
324
|
-
|
|
325
|
-
`python` · `api-client` · `ffbb` · `open-data` · `basketball` · `mcp` · `model-context-protocol` · `async` · `pydantic` · `meilisearch` · `sdk` · `ai` · `llm` · `sports` · `rest-api` · `httpx` · `france` · `data` · `cache` · `typed`
|
|
305
|
+
Distribué sous licence Apache-2.0. Voir [`LICENSE.txt`](https://github.com/nickdesi/ffbb-data-client/blob/master/LICENSE.txt).
|
|
326
306
|
|
|
327
307
|
---
|
|
328
308
|
|
|
@@ -1,6 +1,78 @@
|
|
|
1
|
-
# Release Notes - FFBB
|
|
1
|
+
# Release Notes - FFBB Data Client
|
|
2
2
|
|
|
3
|
-
## Version 2.
|
|
3
|
+
## Version 2.3.4 (Latest Release)
|
|
4
|
+
|
|
5
|
+
### 🔒 Security & Bug Fixes
|
|
6
|
+
- **Sensitive logging mitigation**: Masked authentication tokens in logging messages and format arguments (`CWE-532` / CodeQL compliance)
|
|
7
|
+
- **Directus compatibility**: Removed non-existent `nom` field from default `SaisonFields` to prevent Directus 403 errors
|
|
8
|
+
|
|
9
|
+
### 📱 Responsive Website & Documentation
|
|
10
|
+
- **Mobile optimization**: Full smartphone responsiveness on landing page (mobile hamburger drawer, fluid font scaling, CSS grid blowout prevention)
|
|
11
|
+
- **PyPI documentation**: Standardized README badges and absolute GitHub URLs for flawless rendering on PyPI
|
|
12
|
+
|
|
13
|
+
---
|
|
14
|
+
|
|
15
|
+
## Version 2.3.3
|
|
16
|
+
|
|
17
|
+
### 🚀 New Features
|
|
18
|
+
- **`search_many` / `search_many_async`**: run multiple independent Meilisearch searches concurrently (`asyncio.gather`) and return results in order — each `SearchSpec` is dispatched to the matching `search_multiple_<resource>_async` method
|
|
19
|
+
- **Keepalive workflow**: new `keep-ffbb-api-discovery-alive` workflow guarantees a daily FFBB API discovery run (auto-triggers when no run happened in the last 22 h)
|
|
20
|
+
- **Unit tests** for the FFBB API discovery script (`scripts/discover_endpoints.py`)
|
|
21
|
+
|
|
22
|
+
### ⚡ Performance
|
|
23
|
+
- **Concurrent Meilisearch pagination**: `recursive_smart_multi_search` / `recursive_smart_multi_search_async` now fetch pages in parallel (batches of 10, `asyncio.gather` async / `ThreadPoolExecutor` sync) instead of sequential round-trips — dividing pagination latency by the number of pages
|
|
24
|
+
- **Non-mutating queries**: pagination requests are now cloned (`dataclasses.replace`) instead of mutating the caller's `MultiSearchQuery` objects, removing cross-call state leaks
|
|
25
|
+
- **Slimmer wheel + HTTP connection reuse** + Meilisearch query deduplication
|
|
26
|
+
|
|
27
|
+
### 🏗 Refactor
|
|
28
|
+
- `api_ffbb_app_client.py` split into mixins (2408 → 113 lines)
|
|
29
|
+
|
|
30
|
+
### 🐛 Bug Fixes
|
|
31
|
+
- Codebase inconsistencies: `HitType` collision, deprecated `_models` imports replaced with direct submodules
|
|
32
|
+
- isort formatting in `niveau_models.py`
|
|
33
|
+
- CI: only run the matrix-matching tox env in the test job
|
|
34
|
+
- CodeQL alerts (imports) and isort ordering in `http_requests_utils`
|
|
35
|
+
|
|
36
|
+
### 📦 Misc
|
|
37
|
+
- Docs: improved README, rewrote SECURITY.md, added FUNDING.yml
|
|
38
|
+
- CI: AI PR reviewer migrated to `.cjs` (pagination + retry), simplified PR conflict resolution, refreshed FFBB API discovery artefacts (#57)
|
|
39
|
+
- Dependency bumps (checkout v7, CodeQL 4.37, setuptools ≥83, attest 4.1.1, cache v6, softprops/action-gh-release 3.0.1)
|
|
40
|
+
|
|
41
|
+
---
|
|
42
|
+
|
|
43
|
+
## Version 2.3.2
|
|
44
|
+
|
|
45
|
+
### 🐛 Bug Fixes
|
|
46
|
+
- Resolved token manager import cycle and synced tooling files
|
|
47
|
+
- CodeQL import and empty-except alerts
|
|
48
|
+
- Pre-commit fixes applied to pass CI
|
|
49
|
+
|
|
50
|
+
### 📦 Misc
|
|
51
|
+
- Updated PyPI README version block to 2.3.1
|
|
52
|
+
- Reverted invalid `workflows: write` permission on release-after-discovery-merge workflow
|
|
53
|
+
|
|
54
|
+
---
|
|
55
|
+
|
|
56
|
+
## Version 2.3.1
|
|
57
|
+
|
|
58
|
+
### ⚡ Performance
|
|
59
|
+
- Replaced Pydantic `TypeAdapter` with native parsers for faster deserialization
|
|
60
|
+
- Optimized HTTP connection reuse and parallel cache warming
|
|
61
|
+
|
|
62
|
+
### 🔒 Security & Quality
|
|
63
|
+
- Fixed code-scanning alerts (`md5` usage, unused global variables, Ruff S105 false positives)
|
|
64
|
+
- Resolved cyclic import between `token_manager` and `http_requests_utils`
|
|
65
|
+
|
|
66
|
+
### 🚀 CI/CD
|
|
67
|
+
- **AI Pull Request Reviewer** workflow added (static analysis, automatic comments, `bolt.md` conflict auto-resolver)
|
|
68
|
+
- Node.js 24 opt-in for all JavaScript actions
|
|
69
|
+
- GitHub Actions pipeline optimized with pip cache and tox
|
|
70
|
+
- Action upgrades: `actions/checkout` 4→6, `actions/setup-node` 4→6, `upload-artifact` v7 / `download-artifact` v8, `github/codeql-action` 4.35.5→4.36.x
|
|
71
|
+
- `hishel` dependency bumped to ≥1.3.0
|
|
72
|
+
|
|
73
|
+
---
|
|
74
|
+
|
|
75
|
+
## Version 2.2.0 (Previous Release)
|
|
4
76
|
|
|
5
77
|
### 🏗 Architecture Refactor
|
|
6
78
|
|
|
@@ -17,6 +17,7 @@ from __future__ import annotations
|
|
|
17
17
|
|
|
18
18
|
import hashlib
|
|
19
19
|
import json
|
|
20
|
+
import re
|
|
20
21
|
import sys
|
|
21
22
|
from datetime import datetime, timezone
|
|
22
23
|
from pathlib import Path
|
|
@@ -509,6 +510,41 @@ def _build_change_summary(
|
|
|
509
510
|
return "\n".join(lines) + "\n"
|
|
510
511
|
|
|
511
512
|
|
|
513
|
+
def _update_readme_discovery_metrics(
|
|
514
|
+
collections_count: int, indexes_count: int
|
|
515
|
+
) -> bool:
|
|
516
|
+
readme_path = PROJECT_ROOT / "README.md"
|
|
517
|
+
if not readme_path.exists():
|
|
518
|
+
return False
|
|
519
|
+
text = readme_path.read_text(encoding="utf-8")
|
|
520
|
+
block_start = "<!-- DISCOVERY_METRICS:START -->"
|
|
521
|
+
block_end = "<!-- DISCOVERY_METRICS:END -->"
|
|
522
|
+
nl = chr(10)
|
|
523
|
+
new_block = (
|
|
524
|
+
block_start
|
|
525
|
+
+ nl
|
|
526
|
+
+ f"> 🔄 **Cartographie API synchronisée** : `{collections_count}` collections Directus OpenAPI cartographiées, "
|
|
527
|
+
f"`{indexes_count}` index Meilisearch surveillés." + nl + block_end
|
|
528
|
+
)
|
|
529
|
+
|
|
530
|
+
if block_start in text and block_end in text:
|
|
531
|
+
pattern = re.compile(
|
|
532
|
+
rf"{re.escape(block_start)}.*?{re.escape(block_end)}", re.DOTALL
|
|
533
|
+
)
|
|
534
|
+
updated = pattern.sub(new_block, text)
|
|
535
|
+
else:
|
|
536
|
+
needle = "---" + nl + nl + "## 📌 À propos"
|
|
537
|
+
if needle in text:
|
|
538
|
+
updated = text.replace(needle, new_block + nl + nl + needle)
|
|
539
|
+
else:
|
|
540
|
+
updated = text + nl + nl + new_block + nl
|
|
541
|
+
|
|
542
|
+
if updated != text:
|
|
543
|
+
readme_path.write_text(updated, encoding="utf-8")
|
|
544
|
+
return True
|
|
545
|
+
return False
|
|
546
|
+
|
|
547
|
+
|
|
512
548
|
def main() -> None:
|
|
513
549
|
DATA_DIR.mkdir(parents=True, exist_ok=True)
|
|
514
550
|
|
|
@@ -610,6 +646,7 @@ def main() -> None:
|
|
|
610
646
|
|
|
611
647
|
packaged_changed = _sync_packaged_artefacts(PACKAGED_ARTEFACT_PATHS)
|
|
612
648
|
|
|
649
|
+
_update_readme_discovery_metrics(len(collections), len(available_indexes))
|
|
613
650
|
print(f"Directus collections: {len(collections)}")
|
|
614
651
|
print(f"Directus item paths: {len(item_paths)}")
|
|
615
652
|
print(f"Available Meilisearch indexes: {len(available_indexes)}")
|
|
@@ -11,7 +11,7 @@ from ..utils.retry_utils import (
|
|
|
11
11
|
get_default_retry_config,
|
|
12
12
|
get_default_timeout_config,
|
|
13
13
|
)
|
|
14
|
-
from ..utils.secure_logging import get_secure_logger
|
|
14
|
+
from ..utils.secure_logging import get_secure_logger
|
|
15
15
|
from ._mixins.competition import CompetitionMixin
|
|
16
16
|
from ._mixins.external import ExternalMixin
|
|
17
17
|
from ._mixins.getters import GettersMixin
|
|
@@ -89,9 +89,10 @@ class ApiFFBBAppClient(
|
|
|
89
89
|
|
|
90
90
|
self.logger = get_secure_logger(f"{self.__class__.__name__}")
|
|
91
91
|
|
|
92
|
-
masked_token = mask_token(self._bearer_token)
|
|
93
92
|
if self.debug:
|
|
94
|
-
self.logger.info(
|
|
93
|
+
self.logger.info(
|
|
94
|
+
"ApiFFBBAppClient initialized with authentication token configured"
|
|
95
|
+
)
|
|
95
96
|
self.logger.info(
|
|
96
97
|
f"Retry config: {self.retry_config.max_attempts} attempts, "
|
|
97
98
|
f"timeout: {self.timeout_config.total_timeout}s"
|
{ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/clients/meilisearch_client.py
RENAMED
|
@@ -30,7 +30,7 @@ from ..utils.retry_utils import (
|
|
|
30
30
|
get_default_retry_config,
|
|
31
31
|
get_default_timeout_config,
|
|
32
32
|
)
|
|
33
|
-
from ..utils.secure_logging import get_secure_logger
|
|
33
|
+
from ..utils.secure_logging import get_secure_logger
|
|
34
34
|
|
|
35
35
|
_APP_CACHE: dict[str, tuple[float, Any]] = {}
|
|
36
36
|
_APP_CACHE_LOCK = threading.Lock()
|
|
@@ -134,11 +134,10 @@ class MeilisearchClient:
|
|
|
134
134
|
# Initialize secure logger
|
|
135
135
|
self.logger = get_secure_logger(f"{self.__class__.__name__}")
|
|
136
136
|
|
|
137
|
-
# Log initialization
|
|
138
|
-
masked_token = mask_token(self._bearer_token)
|
|
137
|
+
# Log initialization without leaking token
|
|
139
138
|
if self.debug:
|
|
140
139
|
self.logger.info(
|
|
141
|
-
|
|
140
|
+
"MeilisearchClient initialized with authentication token configured"
|
|
142
141
|
)
|
|
143
142
|
self.logger.info(
|
|
144
143
|
f"Retry config: {self.retry_config.max_attempts} attempts, "
|
{ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/utils/secure_logging.py
RENAMED
|
@@ -83,35 +83,38 @@ class SecureLogger:
|
|
|
83
83
|
|
|
84
84
|
return masked_message
|
|
85
85
|
|
|
86
|
+
def _log(self, level: int, message: str, *args, **kwargs):
|
|
87
|
+
"""Log with sensitive data masked in the message and its format args."""
|
|
88
|
+
masked_message = self._mask_sensitive_data(message)
|
|
89
|
+
masked_args = tuple(
|
|
90
|
+
self._mask_sensitive_data(arg) if isinstance(arg, str) else arg
|
|
91
|
+
for arg in args
|
|
92
|
+
)
|
|
93
|
+
self.logger.log(level, masked_message, *masked_args, **kwargs)
|
|
94
|
+
|
|
86
95
|
def debug(self, message: str, *args, **kwargs):
|
|
87
96
|
"""Log a debug message with sensitive data masked."""
|
|
88
|
-
|
|
89
|
-
self.logger.debug(masked_message, *args, **kwargs)
|
|
97
|
+
self._log(logging.DEBUG, message, *args, **kwargs)
|
|
90
98
|
|
|
91
99
|
def info(self, message: str, *args, **kwargs):
|
|
92
100
|
"""Log an info message with sensitive data masked."""
|
|
93
|
-
|
|
94
|
-
self.logger.info(masked_message, *args, **kwargs)
|
|
101
|
+
self._log(logging.INFO, message, *args, **kwargs)
|
|
95
102
|
|
|
96
103
|
def warning(self, message: str, *args, **kwargs):
|
|
97
104
|
"""Log a warning message with sensitive data masked."""
|
|
98
|
-
|
|
99
|
-
self.logger.warning(masked_message, *args, **kwargs)
|
|
105
|
+
self._log(logging.WARNING, message, *args, **kwargs)
|
|
100
106
|
|
|
101
107
|
def error(self, message: str, *args, **kwargs):
|
|
102
108
|
"""Log an error message with sensitive data masked."""
|
|
103
|
-
|
|
104
|
-
self.logger.error(masked_message, *args, **kwargs)
|
|
109
|
+
self._log(logging.ERROR, message, *args, **kwargs)
|
|
105
110
|
|
|
106
111
|
def critical(self, message: str, *args, **kwargs):
|
|
107
112
|
"""Log a critical message with sensitive data masked."""
|
|
108
|
-
|
|
109
|
-
self.logger.critical(masked_message, *args, **kwargs)
|
|
113
|
+
self._log(logging.CRITICAL, message, *args, **kwargs)
|
|
110
114
|
|
|
111
115
|
def log(self, level: int, message: str, *args, **kwargs):
|
|
112
116
|
"""Log a message at the specified level with sensitive data masked."""
|
|
113
|
-
|
|
114
|
-
self.logger.log(level, masked_message, *args, **kwargs)
|
|
117
|
+
self._log(level, message, *args, **kwargs)
|
|
115
118
|
|
|
116
119
|
|
|
117
120
|
# Global secure logger instance
|