ffbb-data-client 2.3.2__tar.gz → 2.3.3__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/.gitattributes +2 -0
- ffbb_data_client-2.3.3/.github/FUNDING.yml +1 -0
- ffbb_data_client-2.3.3/.github/scripts/ai-pr-reviewer.cjs +278 -0
- {ffbb_data_client-2.3.2 → ffbb_data_client-2.3.3}/.github/workflows/ai-pr-reviewer.yml +13 -15
- {ffbb_data_client-2.3.2 → ffbb_data_client-2.3.3}/.github/workflows/check_wrapper_parity.yml +1 -1
- {ffbb_data_client-2.3.2 → ffbb_data_client-2.3.3}/.github/workflows/ci.yml +14 -10
- {ffbb_data_client-2.3.2 → ffbb_data_client-2.3.3}/.github/workflows/codeql.yml +3 -3
- {ffbb_data_client-2.3.2 → ffbb_data_client-2.3.3}/.github/workflows/deploy-pages.yml +1 -1
- ffbb_data_client-2.3.3/.github/workflows/keep-ffbb-api-discovery-alive.yml +39 -0
- {ffbb_data_client-2.3.2 → ffbb_data_client-2.3.3}/.github/workflows/publish.yml +3 -4
- {ffbb_data_client-2.3.2 → ffbb_data_client-2.3.3}/.github/workflows/release-after-discovery-merge.yml +1 -1
- {ffbb_data_client-2.3.2 → ffbb_data_client-2.3.3}/.github/workflows/update-ffbb-api-discovery.yml +1 -2
- {ffbb_data_client-2.3.2 → ffbb_data_client-2.3.3}/.gitignore +3 -0
- {ffbb_data_client-2.3.2 → ffbb_data_client-2.3.3}/.pre-commit-config.yaml +1 -1
- {ffbb_data_client-2.3.2 → ffbb_data_client-2.3.3}/CHANGELOG.md +13 -0
- {ffbb_data_client-2.3.2/src/ffbb_data_client.egg-info → ffbb_data_client-2.3.3}/PKG-INFO +22 -5
- {ffbb_data_client-2.3.2 → ffbb_data_client-2.3.3}/README.md +21 -4
- ffbb_data_client-2.3.3/SECURITY.md +53 -0
- ffbb_data_client-2.3.3/data/api_update_summary.md +35 -0
- {ffbb_data_client-2.3.2/src/ffbb_data_client → ffbb_data_client-2.3.3}/data/collections.json +2 -24
- {ffbb_data_client-2.3.2 → ffbb_data_client-2.3.3}/data/endpoint_discovery.json +49 -43
- {ffbb_data_client-2.3.2/src/ffbb_data_client → ffbb_data_client-2.3.3}/data/indexes.json +13 -10
- {ffbb_data_client-2.3.2 → ffbb_data_client-2.3.3}/data/openapi.json +10 -761
- {ffbb_data_client-2.3.2 → ffbb_data_client-2.3.3}/data/openapi_full.json +1747 -2506
- {ffbb_data_client-2.3.2 → ffbb_data_client-2.3.3}/pyproject.toml +1 -1
- ffbb_data_client-2.3.3/scripts/benchmark_concurrent_pagination.py +266 -0
- {ffbb_data_client-2.3.2 → ffbb_data_client-2.3.3}/scripts/discover_endpoints.py +3 -2
- {ffbb_data_client-2.3.2 → ffbb_data_client-2.3.3}/setup.cfg +3 -0
- {ffbb_data_client-2.3.2 → ffbb_data_client-2.3.3}/src/ffbb_data_client/__init__.py +3 -0
- ffbb_data_client-2.3.3/src/ffbb_data_client/clients/_helpers.py +92 -0
- ffbb_data_client-2.3.3/src/ffbb_data_client/clients/_mixins/competition.py +217 -0
- ffbb_data_client-2.3.3/src/ffbb_data_client/clients/_mixins/external.py +382 -0
- ffbb_data_client-2.3.3/src/ffbb_data_client/clients/_mixins/getters.py +611 -0
- ffbb_data_client-2.3.3/src/ffbb_data_client/clients/_mixins/list_methods.py +348 -0
- ffbb_data_client-2.3.3/src/ffbb_data_client/clients/_mixins/organisme.py +174 -0
- {ffbb_data_client-2.3.2 → ffbb_data_client-2.3.3}/src/ffbb_data_client/clients/_rest_facade.py +43 -43
- {ffbb_data_client-2.3.2 → ffbb_data_client-2.3.3}/src/ffbb_data_client/clients/_search_facade.py +98 -1
- ffbb_data_client-2.3.3/src/ffbb_data_client/clients/api_ffbb_app_client.py +125 -0
- {ffbb_data_client-2.3.2 → ffbb_data_client-2.3.3}/src/ffbb_data_client/clients/ffbb_data_client.py +2 -1
- {ffbb_data_client-2.3.2 → ffbb_data_client-2.3.3}/src/ffbb_data_client/data/__init__.py +0 -1
- {ffbb_data_client-2.3.2 → ffbb_data_client-2.3.3/src/ffbb_data_client}/data/collections.json +2 -24
- {ffbb_data_client-2.3.2 → ffbb_data_client-2.3.3}/src/ffbb_data_client/data/endpoint_discovery.json +49 -43
- {ffbb_data_client-2.3.2 → ffbb_data_client-2.3.3/src/ffbb_data_client}/data/indexes.json +13 -10
- {ffbb_data_client-2.3.2 → ffbb_data_client-2.3.3}/src/ffbb_data_client/data/openapi.json +10 -761
- {ffbb_data_client-2.3.2 → ffbb_data_client-2.3.3}/src/ffbb_data_client/helpers/http_requests_utils.py +11 -30
- ffbb_data_client-2.3.3/src/ffbb_data_client/helpers/meilisearch_client_extension.py +230 -0
- {ffbb_data_client-2.3.2 → ffbb_data_client-2.3.3}/src/ffbb_data_client/models/document_flyer.py +24 -46
- {ffbb_data_client-2.3.2 → ffbb_data_client-2.3.3}/src/ffbb_data_client/models/formations_hit.py +41 -80
- ffbb_data_client-2.3.3/src/ffbb_data_client/models/game_stats_models.py +14 -0
- {ffbb_data_client-2.3.2 → ffbb_data_client-2.3.3}/src/ffbb_data_client/models/get_organisme_response.py +2 -1
- ffbb_data_client-2.3.3/src/ffbb_data_client/models/niveau_models.py +27 -0
- {ffbb_data_client-2.3.2 → ffbb_data_client-2.3.3}/src/ffbb_data_client/models/organisateur.py +26 -50
- ffbb_data_client-2.3.3/src/ffbb_data_client/models/poules_models.py +15 -0
- {ffbb_data_client-2.3.2 → ffbb_data_client-2.3.3}/src/ffbb_data_client/models/pratiques_hit.py +36 -67
- {ffbb_data_client-2.3.2 → ffbb_data_client-2.3.3}/src/ffbb_data_client/models/pratiques_hit_type.py +5 -1
- ffbb_data_client-2.3.3/src/ffbb_data_client/models/rankings_models.py +15 -0
- ffbb_data_client-2.3.3/src/ffbb_data_client/models/saisons_models.py +15 -0
- {ffbb_data_client-2.3.2 → ffbb_data_client-2.3.3}/src/ffbb_data_client/models/terrains_hit.py +16 -30
- {ffbb_data_client-2.3.2 → ffbb_data_client-2.3.3}/src/ffbb_data_client/models/tournois_hit.py +3 -3
- ffbb_data_client-2.3.3/src/ffbb_data_client/models/tournois_hit_type.py +9 -0
- {ffbb_data_client-2.3.2 → ffbb_data_client-2.3.3}/src/ffbb_data_client/utils/cache_manager.py +0 -1
- {ffbb_data_client-2.3.2 → ffbb_data_client-2.3.3}/src/ffbb_data_client/utils/converter_utils.py +6 -0
- {ffbb_data_client-2.3.2 → ffbb_data_client-2.3.3/src/ffbb_data_client.egg-info}/PKG-INFO +22 -5
- {ffbb_data_client-2.3.2 → ffbb_data_client-2.3.3}/src/ffbb_data_client.egg-info/SOURCES.txt +17 -3
- ffbb_data_client-2.3.3/src/ffbb_data_client.egg-info/scm_file_list.json +372 -0
- ffbb_data_client-2.3.3/src/ffbb_data_client.egg-info/scm_version.json +8 -0
- {ffbb_data_client-2.3.2 → ffbb_data_client-2.3.3}/tests/integration/test_506_raw_json_model_conversion.py +1 -1
- {ffbb_data_client-2.3.2 → ffbb_data_client-2.3.3}/tests/unit/clients/test_201_unit_tests_core.py +28 -36
- {ffbb_data_client-2.3.2 → ffbb_data_client-2.3.3}/tests/unit/clients/test_207_coverage_clients_extended.py +12 -12
- {ffbb_data_client-2.3.2 → ffbb_data_client-2.3.3}/tests/unit/clients/test_208_new_methods_coverage.py +21 -21
- {ffbb_data_client-2.3.2 → ffbb_data_client-2.3.3}/tests/unit/clients/test_210_targeted_clients_helpers_coverage.py +7 -6
- {ffbb_data_client-2.3.2 → ffbb_data_client-2.3.3}/tests/unit/clients/test_async_methods.py +1 -1
- ffbb_data_client-2.3.3/tests/unit/clients/test_search_many.py +94 -0
- ffbb_data_client-2.3.3/tests/unit/helpers/test_meilisearch_pagination_concurrent.py +81 -0
- {ffbb_data_client-2.3.2 → ffbb_data_client-2.3.3}/tests/unit/models/test_122_coverage_gaps.py +2 -2
- ffbb_data_client-2.3.3/tests/unit/test_310_discover_endpoints.py +372 -0
- ffbb_data_client-2.3.3/tests/unit/utils/__init__.py +0 -0
- {ffbb_data_client-2.3.2 → ffbb_data_client-2.3.3}/tests/unit/utils/test_307_coverage_gaps_utils.py +6 -1
- ffbb_data_client-2.3.2/.github/scripts/ai-pr-reviewer.js +0 -273
- ffbb_data_client-2.3.2/.github/scripts/resolve-bolt-conflict.js +0 -121
- ffbb_data_client-2.3.2/SECURITY.md +0 -15
- ffbb_data_client-2.3.2/data/api_update_summary.md +0 -28
- ffbb_data_client-2.3.2/src/ffbb_data_client/clients/api_ffbb_app_client.py +0 -2408
- ffbb_data_client-2.3.2/src/ffbb_data_client/data/openapi_full.json +0 -38304
- ffbb_data_client-2.3.2/src/ffbb_data_client/helpers/meilisearch_client_extension.py +0 -167
- ffbb_data_client-2.3.2/src/ffbb_data_client/models/game_stats_models.py +0 -5
- ffbb_data_client-2.3.2/src/ffbb_data_client/models/niveau_models.py +0 -14
- ffbb_data_client-2.3.2/src/ffbb_data_client/models/poules_models.py +0 -6
- ffbb_data_client-2.3.2/src/ffbb_data_client/models/rankings_models.py +0 -6
- ffbb_data_client-2.3.2/src/ffbb_data_client/models/saisons_models.py +0 -6
- ffbb_data_client-2.3.2/src/ffbb_data_client/models/tournois_hit_type.py +0 -5
- {ffbb_data_client-2.3.2 → ffbb_data_client-2.3.3}/.agents/rules/antigravity-rtk-rules.md +0 -0
- {ffbb_data_client-2.3.2 → ffbb_data_client-2.3.3}/.coveragerc +0 -0
- {ffbb_data_client-2.3.2 → ffbb_data_client-2.3.3}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
- {ffbb_data_client-2.3.2 → ffbb_data_client-2.3.3}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
- {ffbb_data_client-2.3.2 → ffbb_data_client-2.3.3}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
- {ffbb_data_client-2.3.2 → ffbb_data_client-2.3.3}/.github/dependabot.yml +0 -0
- {ffbb_data_client-2.3.2 → ffbb_data_client-2.3.3}/.github/scripts/check_wrapper_parity.py +0 -0
- {ffbb_data_client-2.3.2 → ffbb_data_client-2.3.3}/.isort.cfg +0 -0
- {ffbb_data_client-2.3.2 → ffbb_data_client-2.3.3}/.jules/bolt.md +0 -0
- {ffbb_data_client-2.3.2 → ffbb_data_client-2.3.3}/.readthedocs.yml +0 -0
- {ffbb_data_client-2.3.2 → ffbb_data_client-2.3.3}/AGENTS.md +0 -0
- {ffbb_data_client-2.3.2 → ffbb_data_client-2.3.3}/AUTHORS.rst +0 -0
- {ffbb_data_client-2.3.2 → ffbb_data_client-2.3.3}/CODE_OF_CONDUCT.md +0 -0
- {ffbb_data_client-2.3.2 → ffbb_data_client-2.3.3}/CONTRIBUTING.rst +0 -0
- {ffbb_data_client-2.3.2 → ffbb_data_client-2.3.3}/LICENSE.txt +0 -0
- {ffbb_data_client-2.3.2 → ffbb_data_client-2.3.3}/LOCAL_CI_GUIDE.md +0 -0
- {ffbb_data_client-2.3.2 → ffbb_data_client-2.3.3}/RELEASE_NOTES.md +0 -0
- {ffbb_data_client-2.3.2 → ffbb_data_client-2.3.3}/data/api.ffbb.app.json +0 -0
- {ffbb_data_client-2.3.2 → ffbb_data_client-2.3.3}/data/meilisearch-prod.ffbb.app.json +0 -0
- {ffbb_data_client-2.3.2 → ffbb_data_client-2.3.3}/data/type_discovery_corrections.json +0 -0
- {ffbb_data_client-2.3.2 → ffbb_data_client-2.3.3}/docs/Makefile +0 -0
- {ffbb_data_client-2.3.2 → ffbb_data_client-2.3.3}/docs/_static/.gitignore +0 -0
- {ffbb_data_client-2.3.2 → ffbb_data_client-2.3.3}/docs/architecture.rst +0 -0
- {ffbb_data_client-2.3.2 → ffbb_data_client-2.3.3}/docs/authors.rst +0 -0
- {ffbb_data_client-2.3.2 → ffbb_data_client-2.3.3}/docs/changelog.rst +0 -0
- {ffbb_data_client-2.3.2 → ffbb_data_client-2.3.3}/docs/conf.py +0 -0
- {ffbb_data_client-2.3.2 → ffbb_data_client-2.3.3}/docs/contributing.rst +0 -0
- {ffbb_data_client-2.3.2 → ffbb_data_client-2.3.3}/docs/examples.rst +0 -0
- {ffbb_data_client-2.3.2 → ffbb_data_client-2.3.3}/docs/index.rst +0 -0
- {ffbb_data_client-2.3.2 → ffbb_data_client-2.3.3}/docs/license.rst +0 -0
- {ffbb_data_client-2.3.2 → ffbb_data_client-2.3.3}/docs/migration.rst +0 -0
- {ffbb_data_client-2.3.2 → ffbb_data_client-2.3.3}/docs/readme.rst +0 -0
- {ffbb_data_client-2.3.2 → ffbb_data_client-2.3.3}/docs/requirements.txt +0 -0
- {ffbb_data_client-2.3.2 → ffbb_data_client-2.3.3}/docs/test_strategy.md +0 -0
- {ffbb_data_client-2.3.2 → ffbb_data_client-2.3.3}/docs/testing_conventions.md +0 -0
- {ffbb_data_client-2.3.2 → ffbb_data_client-2.3.3}/examples/README.md +0 -0
- {ffbb_data_client-2.3.2 → ffbb_data_client-2.3.3}/examples/complete_usage_example.py +0 -0
- {ffbb_data_client-2.3.2 → ffbb_data_client-2.3.3}/examples/quick_start.py +0 -0
- {ffbb_data_client-2.3.2 → ffbb_data_client-2.3.3}/examples/team_ranking_analysis.py +0 -0
- {ffbb_data_client-2.3.2 → ffbb_data_client-2.3.3}/graphify-cross-repo.json +0 -0
- {ffbb_data_client-2.3.2 → ffbb_data_client-2.3.3}/pytest.ini +0 -0
- {ffbb_data_client-2.3.2 → ffbb_data_client-2.3.3}/run-ci-locally.sh +0 -0
- {ffbb_data_client-2.3.2 → ffbb_data_client-2.3.3}/scripts/benchmark_search_organisme.py +0 -0
- {ffbb_data_client-2.3.2 → ffbb_data_client-2.3.3}/scripts/discover_types.py +0 -0
- {ffbb_data_client-2.3.2 → ffbb_data_client-2.3.3}/setup.py +0 -0
- {ffbb_data_client-2.3.2 → ffbb_data_client-2.3.3}/src/ffbb_data_client/clients/__init__.py +0 -0
- {ffbb_data_client-2.3.2/tests/e2e → ffbb_data_client-2.3.3/src/ffbb_data_client/clients/_mixins}/__init__.py +0 -0
- {ffbb_data_client-2.3.2 → ffbb_data_client-2.3.3}/src/ffbb_data_client/clients/meilisearch_client.py +0 -0
- {ffbb_data_client-2.3.2 → ffbb_data_client-2.3.3}/src/ffbb_data_client/clients/meilisearch_ffbb_client.py +0 -0
- {ffbb_data_client-2.3.2 → ffbb_data_client-2.3.3}/src/ffbb_data_client/config.py +0 -0
- {ffbb_data_client-2.3.2 → ffbb_data_client-2.3.3}/src/ffbb_data_client/helpers/__init__.py +0 -0
- {ffbb_data_client-2.3.2 → ffbb_data_client-2.3.3}/src/ffbb_data_client/helpers/http_requests_helper.py +0 -0
- {ffbb_data_client-2.3.2 → ffbb_data_client-2.3.3}/src/ffbb_data_client/helpers/multi_search_query_helper.py +0 -0
- {ffbb_data_client-2.3.2 → ffbb_data_client-2.3.3}/src/ffbb_data_client/models/__init__.py +0 -0
- {ffbb_data_client-2.3.2 → ffbb_data_client-2.3.3}/src/ffbb_data_client/models/affiche.py +0 -0
- {ffbb_data_client-2.3.2 → ffbb_data_client-2.3.3}/src/ffbb_data_client/models/cartographie.py +0 -0
- {ffbb_data_client-2.3.2 → ffbb_data_client-2.3.3}/src/ffbb_data_client/models/categorie.py +0 -0
- {ffbb_data_client-2.3.2 → ffbb_data_client-2.3.3}/src/ffbb_data_client/models/categorie_type.py +0 -0
- {ffbb_data_client-2.3.2 → ffbb_data_client-2.3.3}/src/ffbb_data_client/models/clock.py +0 -0
- {ffbb_data_client-2.3.2 → ffbb_data_client-2.3.3}/src/ffbb_data_client/models/club_contacts.py +0 -0
- {ffbb_data_client-2.3.2 → ffbb_data_client-2.3.3}/src/ffbb_data_client/models/code.py +0 -0
- {ffbb_data_client-2.3.2 → ffbb_data_client-2.3.3}/src/ffbb_data_client/models/commune.py +0 -0
- {ffbb_data_client-2.3.2 → ffbb_data_client-2.3.3}/src/ffbb_data_client/models/competition_fields.py +0 -0
- {ffbb_data_client-2.3.2 → ffbb_data_client-2.3.3}/src/ffbb_data_client/models/competition_id.py +0 -0
- {ffbb_data_client-2.3.2 → ffbb_data_client-2.3.3}/src/ffbb_data_client/models/competition_id_categorie.py +0 -0
- {ffbb_data_client-2.3.2 → ffbb_data_client-2.3.3}/src/ffbb_data_client/models/competition_id_sexe.py +0 -0
- {ffbb_data_client-2.3.2 → ffbb_data_client-2.3.3}/src/ffbb_data_client/models/competition_id_type_competition.py +0 -0
- {ffbb_data_client-2.3.2 → ffbb_data_client-2.3.3}/src/ffbb_data_client/models/competition_id_type_competition_generique.py +0 -0
- {ffbb_data_client-2.3.2 → ffbb_data_client-2.3.3}/src/ffbb_data_client/models/competition_origine.py +0 -0
- {ffbb_data_client-2.3.2 → ffbb_data_client-2.3.3}/src/ffbb_data_client/models/competition_origine_categorie.py +0 -0
- {ffbb_data_client-2.3.2 → ffbb_data_client-2.3.3}/src/ffbb_data_client/models/competition_origine_type_competition.py +0 -0
- {ffbb_data_client-2.3.2 → ffbb_data_client-2.3.3}/src/ffbb_data_client/models/competition_origine_type_competition_generique.py +0 -0
- {ffbb_data_client-2.3.2 → ffbb_data_client-2.3.3}/src/ffbb_data_client/models/competition_type.py +0 -0
- {ffbb_data_client-2.3.2 → ffbb_data_client-2.3.3}/src/ffbb_data_client/models/competitions_facet_distribution.py +0 -0
- {ffbb_data_client-2.3.2 → ffbb_data_client-2.3.3}/src/ffbb_data_client/models/competitions_facet_stats.py +0 -0
- {ffbb_data_client-2.3.2 → ffbb_data_client-2.3.3}/src/ffbb_data_client/models/competitions_hit.py +0 -0
- {ffbb_data_client-2.3.2 → ffbb_data_client-2.3.3}/src/ffbb_data_client/models/competitions_multi_search_query.py +0 -0
- {ffbb_data_client-2.3.2 → ffbb_data_client-2.3.3}/src/ffbb_data_client/models/competitions_query.py +0 -0
- {ffbb_data_client-2.3.2 → ffbb_data_client-2.3.3}/src/ffbb_data_client/models/configuration_models.py +0 -0
- {ffbb_data_client-2.3.2 → ffbb_data_client-2.3.3}/src/ffbb_data_client/models/contact_info.py +0 -0
- {ffbb_data_client-2.3.2 → ffbb_data_client-2.3.3}/src/ffbb_data_client/models/content_multi_search_query.py +0 -0
- {ffbb_data_client-2.3.2 → ffbb_data_client-2.3.3}/src/ffbb_data_client/models/coordonnees.py +0 -0
- {ffbb_data_client-2.3.2 → ffbb_data_client-2.3.3}/src/ffbb_data_client/models/coordonnees_type.py +0 -0
- {ffbb_data_client-2.3.2 → ffbb_data_client-2.3.3}/src/ffbb_data_client/models/document_flyer_type.py +0 -0
- {ffbb_data_client-2.3.2 → ffbb_data_client-2.3.3}/src/ffbb_data_client/models/engagement_contacts.py +0 -0
- {ffbb_data_client-2.3.2 → ffbb_data_client-2.3.3}/src/ffbb_data_client/models/engagements_facet_distribution.py +0 -0
- {ffbb_data_client-2.3.2 → ffbb_data_client-2.3.3}/src/ffbb_data_client/models/engagements_facet_stats.py +0 -0
- {ffbb_data_client-2.3.2 → ffbb_data_client-2.3.3}/src/ffbb_data_client/models/engagements_hit.py +0 -0
- {ffbb_data_client-2.3.2 → ffbb_data_client-2.3.3}/src/ffbb_data_client/models/engagements_multi_search_query.py +0 -0
- {ffbb_data_client-2.3.2 → ffbb_data_client-2.3.3}/src/ffbb_data_client/models/etat.py +0 -0
- {ffbb_data_client-2.3.2 → ffbb_data_client-2.3.3}/src/ffbb_data_client/models/external_competition_id.py +0 -0
- {ffbb_data_client-2.3.2 → ffbb_data_client-2.3.3}/src/ffbb_data_client/models/external_id.py +0 -0
- {ffbb_data_client-2.3.2 → ffbb_data_client-2.3.3}/src/ffbb_data_client/models/facet_distribution.py +0 -0
- {ffbb_data_client-2.3.2 → ffbb_data_client-2.3.3}/src/ffbb_data_client/models/facet_stats.py +0 -0
- {ffbb_data_client-2.3.2 → ffbb_data_client-2.3.3}/src/ffbb_data_client/models/field_set.py +0 -0
- {ffbb_data_client-2.3.2 → ffbb_data_client-2.3.3}/src/ffbb_data_client/models/folder.py +0 -0
- {ffbb_data_client-2.3.2 → ffbb_data_client-2.3.3}/src/ffbb_data_client/models/formation_session.py +0 -0
- {ffbb_data_client-2.3.2 → ffbb_data_client-2.3.3}/src/ffbb_data_client/models/formations_facet_distribution.py +0 -0
- {ffbb_data_client-2.3.2 → ffbb_data_client-2.3.3}/src/ffbb_data_client/models/formations_facet_stats.py +0 -0
- {ffbb_data_client-2.3.2 → ffbb_data_client-2.3.3}/src/ffbb_data_client/models/formations_multi_search_query.py +0 -0
- {ffbb_data_client-2.3.2 → ffbb_data_client-2.3.3}/src/ffbb_data_client/models/game_stats_model.py +0 -0
- {ffbb_data_client-2.3.2 → ffbb_data_client-2.3.3}/src/ffbb_data_client/models/generic_search.py +0 -0
- {ffbb_data_client-2.3.2 → ffbb_data_client-2.3.3}/src/ffbb_data_client/models/geo.py +0 -0
- {ffbb_data_client-2.3.2 → ffbb_data_client-2.3.3}/src/ffbb_data_client/models/geo_sort_order.py +0 -0
- {ffbb_data_client-2.3.2 → ffbb_data_client-2.3.3}/src/ffbb_data_client/models/get_commune_response.py +0 -0
- {ffbb_data_client-2.3.2 → ffbb_data_client-2.3.3}/src/ffbb_data_client/models/get_competition_response.py +0 -0
- {ffbb_data_client-2.3.2 → ffbb_data_client-2.3.3}/src/ffbb_data_client/models/get_configuration_response.py +0 -0
- {ffbb_data_client-2.3.2 → ffbb_data_client-2.3.3}/src/ffbb_data_client/models/get_engagement_response.py +0 -0
- {ffbb_data_client-2.3.2 → ffbb_data_client-2.3.3}/src/ffbb_data_client/models/get_entraineur_response.py +0 -0
- {ffbb_data_client-2.3.2 → ffbb_data_client-2.3.3}/src/ffbb_data_client/models/get_formation_response.py +0 -0
- {ffbb_data_client-2.3.2 → ffbb_data_client-2.3.3}/src/ffbb_data_client/models/get_officiel_response.py +0 -0
- {ffbb_data_client-2.3.2 → ffbb_data_client-2.3.3}/src/ffbb_data_client/models/get_poule_response.py +0 -0
- {ffbb_data_client-2.3.2 → ffbb_data_client-2.3.3}/src/ffbb_data_client/models/get_pratique_response.py +0 -0
- {ffbb_data_client-2.3.2 → ffbb_data_client-2.3.3}/src/ffbb_data_client/models/get_rencontre_response.py +0 -0
- {ffbb_data_client-2.3.2 → ffbb_data_client-2.3.3}/src/ffbb_data_client/models/get_saisons_response.py +0 -0
- {ffbb_data_client-2.3.2 → ffbb_data_client-2.3.3}/src/ffbb_data_client/models/get_salle_response.py +0 -0
- {ffbb_data_client-2.3.2 → ffbb_data_client-2.3.3}/src/ffbb_data_client/models/get_terrain_response.py +0 -0
- {ffbb_data_client-2.3.2 → ffbb_data_client-2.3.3}/src/ffbb_data_client/models/get_tournoi_response.py +0 -0
- {ffbb_data_client-2.3.2 → ffbb_data_client-2.3.3}/src/ffbb_data_client/models/gradient_color.py +0 -0
- {ffbb_data_client-2.3.2 → ffbb_data_client-2.3.3}/src/ffbb_data_client/models/hit.py +0 -0
- {ffbb_data_client-2.3.2 → ffbb_data_client-2.3.3}/src/ffbb_data_client/models/id_engagement_equipe.py +0 -0
- {ffbb_data_client-2.3.2 → ffbb_data_client-2.3.3}/src/ffbb_data_client/models/id_organisme_equipe.py +0 -0
- {ffbb_data_client-2.3.2 → ffbb_data_client-2.3.3}/src/ffbb_data_client/models/id_organisme_equipe1_logo.py +0 -0
- {ffbb_data_client-2.3.2 → ffbb_data_client-2.3.3}/src/ffbb_data_client/models/id_poule.py +0 -0
- {ffbb_data_client-2.3.2 → ffbb_data_client-2.3.3}/src/ffbb_data_client/models/jour.py +0 -0
- {ffbb_data_client-2.3.2 → ffbb_data_client-2.3.3}/src/ffbb_data_client/models/label.py +0 -0
- {ffbb_data_client-2.3.2 → ffbb_data_client-2.3.3}/src/ffbb_data_client/models/labellisation.py +0 -0
- {ffbb_data_client-2.3.2 → ffbb_data_client-2.3.3}/src/ffbb_data_client/models/live.py +0 -0
- {ffbb_data_client-2.3.2 → ffbb_data_client-2.3.3}/src/ffbb_data_client/models/lives.py +0 -0
- {ffbb_data_client-2.3.2 → ffbb_data_client-2.3.3}/src/ffbb_data_client/models/logo.py +0 -0
- {ffbb_data_client-2.3.2 → ffbb_data_client-2.3.3}/src/ffbb_data_client/models/multi_search_queries.py +0 -0
- {ffbb_data_client-2.3.2 → ffbb_data_client-2.3.3}/src/ffbb_data_client/models/multi_search_query.py +0 -0
- {ffbb_data_client-2.3.2 → ffbb_data_client-2.3.3}/src/ffbb_data_client/models/multi_search_result_competitions.py +0 -0
- {ffbb_data_client-2.3.2 → ffbb_data_client-2.3.3}/src/ffbb_data_client/models/multi_search_result_engagements.py +0 -0
- {ffbb_data_client-2.3.2 → ffbb_data_client-2.3.3}/src/ffbb_data_client/models/multi_search_result_formations.py +0 -0
- {ffbb_data_client-2.3.2 → ffbb_data_client-2.3.3}/src/ffbb_data_client/models/multi_search_result_organismes.py +0 -0
- {ffbb_data_client-2.3.2 → ffbb_data_client-2.3.3}/src/ffbb_data_client/models/multi_search_result_pratiques.py +0 -0
- {ffbb_data_client-2.3.2 → ffbb_data_client-2.3.3}/src/ffbb_data_client/models/multi_search_result_rencontres.py +0 -0
- {ffbb_data_client-2.3.2 → ffbb_data_client-2.3.3}/src/ffbb_data_client/models/multi_search_result_salles.py +0 -0
- {ffbb_data_client-2.3.2 → ffbb_data_client-2.3.3}/src/ffbb_data_client/models/multi_search_result_terrains.py +0 -0
- {ffbb_data_client-2.3.2 → ffbb_data_client-2.3.3}/src/ffbb_data_client/models/multi_search_result_tournois.py +0 -0
- {ffbb_data_client-2.3.2 → ffbb_data_client-2.3.3}/src/ffbb_data_client/models/multi_search_results.py +0 -0
- {ffbb_data_client-2.3.2 → ffbb_data_client-2.3.3}/src/ffbb_data_client/models/multi_search_results_class.py +0 -0
- {ffbb_data_client-2.3.2 → ffbb_data_client-2.3.3}/src/ffbb_data_client/models/nature_sol.py +0 -0
- {ffbb_data_client-2.3.2 → ffbb_data_client-2.3.3}/src/ffbb_data_client/models/niveau.py +0 -0
- {ffbb_data_client-2.3.2 → ffbb_data_client-2.3.3}/src/ffbb_data_client/models/niveau_class.py +0 -0
- {ffbb_data_client-2.3.2 → ffbb_data_client-2.3.3}/src/ffbb_data_client/models/niveau_extractor.py +0 -0
- {ffbb_data_client-2.3.2 → ffbb_data_client-2.3.3}/src/ffbb_data_client/models/niveau_info.py +0 -0
- {ffbb_data_client-2.3.2 → ffbb_data_client-2.3.3}/src/ffbb_data_client/models/niveau_type.py +0 -0
- {ffbb_data_client-2.3.2 → ffbb_data_client-2.3.3}/src/ffbb_data_client/models/objectif.py +0 -0
- {ffbb_data_client-2.3.2 → ffbb_data_client-2.3.3}/src/ffbb_data_client/models/organisateur_type.py +0 -0
- {ffbb_data_client-2.3.2 → ffbb_data_client-2.3.3}/src/ffbb_data_client/models/organisme_fields.py +0 -0
- {ffbb_data_client-2.3.2 → ffbb_data_client-2.3.3}/src/ffbb_data_client/models/organisme_id_pere.py +0 -0
- {ffbb_data_client-2.3.2 → ffbb_data_client-2.3.3}/src/ffbb_data_client/models/organismes_facet_distribution.py +0 -0
- {ffbb_data_client-2.3.2 → ffbb_data_client-2.3.3}/src/ffbb_data_client/models/organismes_facet_stats.py +0 -0
- {ffbb_data_client-2.3.2 → ffbb_data_client-2.3.3}/src/ffbb_data_client/models/organismes_hit.py +0 -0
- {ffbb_data_client-2.3.2 → ffbb_data_client-2.3.3}/src/ffbb_data_client/models/organismes_multi_search_query.py +0 -0
- {ffbb_data_client-2.3.2 → ffbb_data_client-2.3.3}/src/ffbb_data_client/models/organismes_query.py +0 -0
- {ffbb_data_client-2.3.2 → ffbb_data_client-2.3.3}/src/ffbb_data_client/models/phase_code.py +0 -0
- {ffbb_data_client-2.3.2 → ffbb_data_client-2.3.3}/src/ffbb_data_client/models/poule.py +0 -0
- {ffbb_data_client-2.3.2 → ffbb_data_client-2.3.3}/src/ffbb_data_client/models/poule_fields.py +0 -0
- {ffbb_data_client-2.3.2 → ffbb_data_client-2.3.3}/src/ffbb_data_client/models/poule_rencontre_item_model.py +0 -0
- {ffbb_data_client-2.3.2 → ffbb_data_client-2.3.3}/src/ffbb_data_client/models/poules_query.py +0 -0
- {ffbb_data_client-2.3.2 → ffbb_data_client-2.3.3}/src/ffbb_data_client/models/pratique.py +0 -0
- {ffbb_data_client-2.3.2 → ffbb_data_client-2.3.3}/src/ffbb_data_client/models/pratiques_facet_distribution.py +0 -0
- {ffbb_data_client-2.3.2 → ffbb_data_client-2.3.3}/src/ffbb_data_client/models/pratiques_facet_stats.py +0 -0
- {ffbb_data_client-2.3.2 → ffbb_data_client-2.3.3}/src/ffbb_data_client/models/pratiques_multi_search_query.py +0 -0
- {ffbb_data_client-2.3.2 → ffbb_data_client-2.3.3}/src/ffbb_data_client/models/pratiques_type_class.py +0 -0
- {ffbb_data_client-2.3.2 → ffbb_data_client-2.3.3}/src/ffbb_data_client/models/publication_internet.py +0 -0
- {ffbb_data_client-2.3.2 → ffbb_data_client-2.3.3}/src/ffbb_data_client/models/purple_logo.py +0 -0
- {ffbb_data_client-2.3.2 → ffbb_data_client-2.3.3}/src/ffbb_data_client/models/query_fields_manager.py +0 -0
- {ffbb_data_client-2.3.2 → ffbb_data_client-2.3.3}/src/ffbb_data_client/models/ranking_engagement.py +0 -0
- {ffbb_data_client-2.3.2 → ffbb_data_client-2.3.3}/src/ffbb_data_client/models/rencontres_engagement.py +0 -0
- {ffbb_data_client-2.3.2 → ffbb_data_client-2.3.3}/src/ffbb_data_client/models/rencontres_facet_distribution.py +0 -0
- {ffbb_data_client-2.3.2 → ffbb_data_client-2.3.3}/src/ffbb_data_client/models/rencontres_facet_stats.py +0 -0
- {ffbb_data_client-2.3.2 → ffbb_data_client-2.3.3}/src/ffbb_data_client/models/rencontres_hit.py +0 -0
- {ffbb_data_client-2.3.2 → ffbb_data_client-2.3.3}/src/ffbb_data_client/models/rencontres_multi_search_query.py +0 -0
- {ffbb_data_client-2.3.2 → ffbb_data_client-2.3.3}/src/ffbb_data_client/models/saison.py +0 -0
- {ffbb_data_client-2.3.2 → ffbb_data_client-2.3.3}/src/ffbb_data_client/models/saison_fields.py +0 -0
- {ffbb_data_client-2.3.2 → ffbb_data_client-2.3.3}/src/ffbb_data_client/models/saisons_query.py +0 -0
- {ffbb_data_client-2.3.2 → ffbb_data_client-2.3.3}/src/ffbb_data_client/models/salle.py +0 -0
- {ffbb_data_client-2.3.2 → ffbb_data_client-2.3.3}/src/ffbb_data_client/models/salles_facet_distribution.py +0 -0
- {ffbb_data_client-2.3.2 → ffbb_data_client-2.3.3}/src/ffbb_data_client/models/salles_facet_stats.py +0 -0
- {ffbb_data_client-2.3.2 → ffbb_data_client-2.3.3}/src/ffbb_data_client/models/salles_hit.py +0 -0
- {ffbb_data_client-2.3.2 → ffbb_data_client-2.3.3}/src/ffbb_data_client/models/salles_multi_search_query.py +0 -0
- {ffbb_data_client-2.3.2 → ffbb_data_client-2.3.3}/src/ffbb_data_client/models/sexe.py +0 -0
- {ffbb_data_client-2.3.2 → ffbb_data_client-2.3.3}/src/ffbb_data_client/models/sexe_class.py +0 -0
- {ffbb_data_client-2.3.2 → ffbb_data_client-2.3.3}/src/ffbb_data_client/models/source.py +0 -0
- {ffbb_data_client-2.3.2 → ffbb_data_client-2.3.3}/src/ffbb_data_client/models/status.py +0 -0
- {ffbb_data_client-2.3.2 → ffbb_data_client-2.3.3}/src/ffbb_data_client/models/team_engagement.py +0 -0
- {ffbb_data_client-2.3.2 → ffbb_data_client-2.3.3}/src/ffbb_data_client/models/team_ranking.py +0 -0
- {ffbb_data_client-2.3.2 → ffbb_data_client-2.3.3}/src/ffbb_data_client/models/terrains_categorie_championnat_3x3_libelle.py +0 -0
- {ffbb_data_client-2.3.2 → ffbb_data_client-2.3.3}/src/ffbb_data_client/models/terrains_facet_distribution.py +0 -0
- {ffbb_data_client-2.3.2 → ffbb_data_client-2.3.3}/src/ffbb_data_client/models/terrains_facet_stats.py +0 -0
- {ffbb_data_client-2.3.2 → ffbb_data_client-2.3.3}/src/ffbb_data_client/models/terrains_multi_search_query.py +0 -0
- {ffbb_data_client-2.3.2 → ffbb_data_client-2.3.3}/src/ffbb_data_client/models/terrains_name.py +0 -0
- {ffbb_data_client-2.3.2 → ffbb_data_client-2.3.3}/src/ffbb_data_client/models/terrains_sexe_enum.py +0 -0
- {ffbb_data_client-2.3.2 → ffbb_data_client-2.3.3}/src/ffbb_data_client/models/terrains_storage.py +0 -0
- {ffbb_data_client-2.3.2 → ffbb_data_client-2.3.3}/src/ffbb_data_client/models/tournoi_type_class.py +0 -0
- {ffbb_data_client-2.3.2 → ffbb_data_client-2.3.3}/src/ffbb_data_client/models/tournoi_type_enum.py +0 -0
- {ffbb_data_client-2.3.2 → ffbb_data_client-2.3.3}/src/ffbb_data_client/models/tournoi_types_3x3.py +0 -0
- {ffbb_data_client-2.3.2 → ffbb_data_client-2.3.3}/src/ffbb_data_client/models/tournoi_types_3x3_libelle.py +0 -0
- {ffbb_data_client-2.3.2 → ffbb_data_client-2.3.3}/src/ffbb_data_client/models/tournoi_types_3x3_libelle_enum.py +0 -0
- {ffbb_data_client-2.3.2 → ffbb_data_client-2.3.3}/src/ffbb_data_client/models/tournois_facet_distribution.py +0 -0
- {ffbb_data_client-2.3.2 → ffbb_data_client-2.3.3}/src/ffbb_data_client/models/tournois_facet_stats.py +0 -0
- {ffbb_data_client-2.3.2 → ffbb_data_client-2.3.3}/src/ffbb_data_client/models/tournois_libelle.py +0 -0
- {ffbb_data_client-2.3.2 → ffbb_data_client-2.3.3}/src/ffbb_data_client/models/tournois_multi_search_query.py +0 -0
- {ffbb_data_client-2.3.2 → ffbb_data_client-2.3.3}/src/ffbb_data_client/models/type_association.py +0 -0
- {ffbb_data_client-2.3.2 → ffbb_data_client-2.3.3}/src/ffbb_data_client/models/type_association_libelle.py +0 -0
- {ffbb_data_client-2.3.2 → ffbb_data_client-2.3.3}/src/ffbb_data_client/models/type_class.py +0 -0
- {ffbb_data_client-2.3.2 → ffbb_data_client-2.3.3}/src/ffbb_data_client/models/type_competition.py +0 -0
- {ffbb_data_client-2.3.2 → ffbb_data_client-2.3.3}/src/ffbb_data_client/models/type_competition_generique.py +0 -0
- {ffbb_data_client-2.3.2 → ffbb_data_client-2.3.3}/src/ffbb_data_client/models/type_enum.py +0 -0
- {ffbb_data_client-2.3.2 → ffbb_data_client-2.3.3}/src/ffbb_data_client/models/type_league.py +0 -0
- {ffbb_data_client-2.3.2 → ffbb_data_client-2.3.3}/src/ffbb_data_client/py.typed +0 -0
- {ffbb_data_client-2.3.2 → ffbb_data_client-2.3.3}/src/ffbb_data_client/utils/__init__.py +0 -0
- {ffbb_data_client-2.3.2 → ffbb_data_client-2.3.3}/src/ffbb_data_client/utils/concurrency_utils.py +0 -0
- {ffbb_data_client-2.3.2 → ffbb_data_client-2.3.3}/src/ffbb_data_client/utils/input_validation.py +0 -0
- {ffbb_data_client-2.3.2 → ffbb_data_client-2.3.3}/src/ffbb_data_client/utils/retry_utils.py +0 -0
- {ffbb_data_client-2.3.2 → ffbb_data_client-2.3.3}/src/ffbb_data_client/utils/secure_logging.py +0 -0
- {ffbb_data_client-2.3.2 → ffbb_data_client-2.3.3}/src/ffbb_data_client/utils/token_manager.py +0 -0
- {ffbb_data_client-2.3.2 → ffbb_data_client-2.3.3}/src/ffbb_data_client.egg-info/dependency_links.txt +0 -0
- {ffbb_data_client-2.3.2 → ffbb_data_client-2.3.3}/src/ffbb_data_client.egg-info/not-zip-safe +0 -0
- {ffbb_data_client-2.3.2 → ffbb_data_client-2.3.3}/src/ffbb_data_client.egg-info/requires.txt +0 -0
- {ffbb_data_client-2.3.2 → ffbb_data_client-2.3.3}/src/ffbb_data_client.egg-info/top_level.txt +0 -0
- {ffbb_data_client-2.3.2 → ffbb_data_client-2.3.3}/tests/conftest.py +0 -0
- {ffbb_data_client-2.3.2/tests/integration → ffbb_data_client-2.3.3/tests/e2e}/__init__.py +0 -0
- {ffbb_data_client-2.3.2 → ffbb_data_client-2.3.3}/tests/e2e/conftest.py +0 -0
- {ffbb_data_client-2.3.2/tests/unit → ffbb_data_client-2.3.3/tests/integration}/__init__.py +0 -0
- {ffbb_data_client-2.3.2 → ffbb_data_client-2.3.3}/tests/integration/conftest.py +0 -0
- {ffbb_data_client-2.3.2 → ffbb_data_client-2.3.3}/tests/integration/test_500_user_journey.py +0 -0
- {ffbb_data_client-2.3.2 → ffbb_data_client-2.3.3}/tests/integration/test_501_user_journey_v3.py +0 -0
- {ffbb_data_client-2.3.2 → ffbb_data_client-2.3.3}/tests/integration/test_502_enhanced_integration.py +0 -0
- {ffbb_data_client-2.3.2 → ffbb_data_client-2.3.3}/tests/integration/test_503_secure_logging.py +0 -0
- {ffbb_data_client-2.3.2 → ffbb_data_client-2.3.3}/tests/integration/test_504_input_validation.py +0 -0
- {ffbb_data_client-2.3.2 → ffbb_data_client-2.3.3}/tests/integration/test_505_retry_timeout.py +0 -0
- {ffbb_data_client-2.3.2/tests/unit/clients → ffbb_data_client-2.3.3/tests/unit}/__init__.py +0 -0
- {ffbb_data_client-2.3.2/tests/unit/helpers → ffbb_data_client-2.3.3/tests/unit/clients}/__init__.py +0 -0
- {ffbb_data_client-2.3.2 → ffbb_data_client-2.3.3}/tests/unit/clients/test_200_api_ffbb_app_client.py +0 -0
- {ffbb_data_client-2.3.2 → ffbb_data_client-2.3.3}/tests/unit/clients/test_202_meilisearch_client.py +0 -0
- {ffbb_data_client-2.3.2 → ffbb_data_client-2.3.3}/tests/unit/clients/test_203_meilisearch_client_extension.py +0 -0
- {ffbb_data_client-2.3.2 → ffbb_data_client-2.3.3}/tests/unit/clients/test_204_ffbb_data_client.py +0 -0
- {ffbb_data_client-2.3.2 → ffbb_data_client-2.3.3}/tests/unit/clients/test_205_meilisearch_ffbb_client.py +0 -0
- {ffbb_data_client-2.3.2 → ffbb_data_client-2.3.3}/tests/unit/clients/test_206_coverage_gaps_clients.py +0 -0
- {ffbb_data_client-2.3.2 → ffbb_data_client-2.3.3}/tests/unit/clients/test_209_automatic_token_resolution.py +0 -0
- {ffbb_data_client-2.3.2 → ffbb_data_client-2.3.3}/tests/unit/clients/test_meilisearch_async.py +0 -0
- {ffbb_data_client-2.3.2 → ffbb_data_client-2.3.3}/tests/unit/clients/test_v2_backport_search.py +0 -0
- {ffbb_data_client-2.3.2 → ffbb_data_client-2.3.3}/tests/unit/clients/test_v3_new_features.py +0 -0
- {ffbb_data_client-2.3.2 → ffbb_data_client-2.3.3}/tests/unit/clients/test_warm_cache.py +0 -0
- {ffbb_data_client-2.3.2 → ffbb_data_client-2.3.3}/tests/unit/conftest.py +0 -0
- {ffbb_data_client-2.3.2/tests/unit/models → ffbb_data_client-2.3.3/tests/unit/helpers}/__init__.py +0 -0
- {ffbb_data_client-2.3.2 → ffbb_data_client-2.3.3}/tests/unit/helpers/test_400_http_helpers.py +0 -0
- {ffbb_data_client-2.3.2 → ffbb_data_client-2.3.3}/tests/unit/helpers/test_meilisearch_client_extension_recursive_pagination.py +0 -0
- {ffbb_data_client-2.3.2/tests/unit/utils → ffbb_data_client-2.3.3/tests/unit/models}/__init__.py +0 -0
- {ffbb_data_client-2.3.2 → ffbb_data_client-2.3.3}/tests/unit/models/test_100_competition_id_categorie.py +0 -0
- {ffbb_data_client-2.3.2 → ffbb_data_client-2.3.3}/tests/unit/models/test_101_competition_id_sexe.py +0 -0
- {ffbb_data_client-2.3.2 → ffbb_data_client-2.3.3}/tests/unit/models/test_102_competition_id_type_competition.py +0 -0
- {ffbb_data_client-2.3.2 → ffbb_data_client-2.3.3}/tests/unit/models/test_103_competition_id_type_competition_generique.py +0 -0
- {ffbb_data_client-2.3.2 → ffbb_data_client-2.3.3}/tests/unit/models/test_104_competition_origine_categorie.py +0 -0
- {ffbb_data_client-2.3.2 → ffbb_data_client-2.3.3}/tests/unit/models/test_105_competition_origine_type_competition_generique.py +0 -0
- {ffbb_data_client-2.3.2 → ffbb_data_client-2.3.3}/tests/unit/models/test_106_competition_origine.py +0 -0
- {ffbb_data_client-2.3.2 → ffbb_data_client-2.3.3}/tests/unit/models/test_107_id_engagement_equipe.py +0 -0
- {ffbb_data_client-2.3.2 → ffbb_data_client-2.3.3}/tests/unit/models/test_108_id_organisme_equipe.py +0 -0
- {ffbb_data_client-2.3.2 → ffbb_data_client-2.3.3}/tests/unit/models/test_109_id_organisme_equipe1_logo.py +0 -0
- {ffbb_data_client-2.3.2 → ffbb_data_client-2.3.3}/tests/unit/models/test_110_labellisation.py +0 -0
- {ffbb_data_client-2.3.2 → ffbb_data_client-2.3.3}/tests/unit/models/test_111_niveau_class.py +0 -0
- {ffbb_data_client-2.3.2 → ffbb_data_client-2.3.3}/tests/unit/models/test_112_purple_logo.py +0 -0
- {ffbb_data_client-2.3.2 → ffbb_data_client-2.3.3}/tests/unit/models/test_113_salle.py +0 -0
- {ffbb_data_client-2.3.2 → ffbb_data_client-2.3.3}/tests/unit/models/test_114_tournoi_type_class.py +0 -0
- {ffbb_data_client-2.3.2 → ffbb_data_client-2.3.3}/tests/unit/models/test_115_type_association_libelle.py +0 -0
- {ffbb_data_client-2.3.2 → ffbb_data_client-2.3.3}/tests/unit/models/test_116_type_competition_generique.py +0 -0
- {ffbb_data_client-2.3.2 → ffbb_data_client-2.3.3}/tests/unit/models/test_117_organisateur.py +0 -0
- {ffbb_data_client-2.3.2 → ffbb_data_client-2.3.3}/tests/unit/models/test_118_competition_id.py +0 -0
- {ffbb_data_client-2.3.2 → ffbb_data_client-2.3.3}/tests/unit/models/test_119_terrains_inner_models.py +0 -0
- {ffbb_data_client-2.3.2 → ffbb_data_client-2.3.3}/tests/unit/models/test_120_pratiques_inner_models.py +0 -0
- {ffbb_data_client-2.3.2 → ffbb_data_client-2.3.3}/tests/unit/models/test_121_to_dict_round_trip.py +0 -0
- {ffbb_data_client-2.3.2 → ffbb_data_client-2.3.3}/tests/unit/models/test_123_missing_coverage.py +0 -0
- {ffbb_data_client-2.3.2 → ffbb_data_client-2.3.3}/tests/unit/models/test_123_v2_backport.py +0 -0
- {ffbb_data_client-2.3.2 → ffbb_data_client-2.3.3}/tests/unit/models/test_124_targeted_coverage_gains.py +0 -0
- {ffbb_data_client-2.3.2 → ffbb_data_client-2.3.3}/tests/unit/models/test_dx_aliases.py +0 -0
- {ffbb_data_client-2.3.2 → ffbb_data_client-2.3.3}/tests/unit/utils/test_300_secure_logging.py +0 -0
- {ffbb_data_client-2.3.2 → ffbb_data_client-2.3.3}/tests/unit/utils/test_301_input_validation.py +0 -0
- {ffbb_data_client-2.3.2 → ffbb_data_client-2.3.3}/tests/unit/utils/test_302_retry_utils.py +0 -0
- {ffbb_data_client-2.3.2 → ffbb_data_client-2.3.3}/tests/unit/utils/test_303_cache_manager.py +0 -0
- {ffbb_data_client-2.3.2 → ffbb_data_client-2.3.3}/tests/unit/utils/test_304_config.py +0 -0
- {ffbb_data_client-2.3.2 → ffbb_data_client-2.3.3}/tests/unit/utils/test_305_token_manager.py +0 -0
- {ffbb_data_client-2.3.2 → ffbb_data_client-2.3.3}/tests/unit/utils/test_306_converter_utils.py +0 -0
- {ffbb_data_client-2.3.2 → ffbb_data_client-2.3.3}/tests/unit/utils/test_308_converter_utils_extended.py +0 -0
- {ffbb_data_client-2.3.2 → ffbb_data_client-2.3.3}/tests/unit/utils/test_309_concurrency_utils.py +0 -0
- {ffbb_data_client-2.3.2 → ffbb_data_client-2.3.3}/tools/add_cross_repo_edges.py +0 -0
- {ffbb_data_client-2.3.2 → ffbb_data_client-2.3.3}/tools/graphify-cross-repo.sh +0 -0
- {ffbb_data_client-2.3.2 → ffbb_data_client-2.3.3}/tools/graphify_cross_repo.py +0 -0
- {ffbb_data_client-2.3.2 → ffbb_data_client-2.3.3}/tools/update_agents_md.py +0 -0
- {ffbb_data_client-2.3.2 → ffbb_data_client-2.3.3}/tox.ini +0 -0
- {ffbb_data_client-2.3.2 → ffbb_data_client-2.3.3}/website/assets/logo.webp +0 -0
- {ffbb_data_client-2.3.2 → ffbb_data_client-2.3.3}/website/css/style.css +0 -0
- {ffbb_data_client-2.3.2 → ffbb_data_client-2.3.3}/website/index.html +0 -0
- {ffbb_data_client-2.3.2 → ffbb_data_client-2.3.3}/website/robots.txt +0 -0
- {ffbb_data_client-2.3.2 → ffbb_data_client-2.3.3}/website/sitemap.xml +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
github: [nickdesi]
|
|
@@ -0,0 +1,278 @@
|
|
|
1
|
+
const https = require('https');
|
|
2
|
+
|
|
3
|
+
// Configuration from environment variables
|
|
4
|
+
const GITHUB_TOKEN = process.env.GITHUB_TOKEN;
|
|
5
|
+
const GEMINI_API_KEY = process.env.GEMINI_API_KEY;
|
|
6
|
+
const GITHUB_REPOSITORY = process.env.GITHUB_REPOSITORY;
|
|
7
|
+
const PR_NUMBER = process.env.GITHUB_PR_NUMBER;
|
|
8
|
+
const GEMINI_MODEL = process.env.GEMINI_MODEL || 'gemini-2.5-flash';
|
|
9
|
+
|
|
10
|
+
if (!GITHUB_TOKEN || !GEMINI_API_KEY || !GITHUB_REPOSITORY || !PR_NUMBER) {
|
|
11
|
+
console.error("Missing env vars: GITHUB_TOKEN, GEMINI_API_KEY, GITHUB_REPOSITORY, GITHUB_PR_NUMBER");
|
|
12
|
+
process.exit(1);
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
const SUPPORTED_EXTENSIONS = [
|
|
16
|
+
'.js', '.ts', '.jsx', '.tsx', '.py', '.sh', '.yml', '.yaml',
|
|
17
|
+
'.json', '.css', '.html', '.go', '.rs', '.c', '.cpp', '.h',
|
|
18
|
+
'.conf', '.ini', '.md', '.toml'
|
|
19
|
+
];
|
|
20
|
+
|
|
21
|
+
const IGNORED_FILES = [
|
|
22
|
+
'package-lock.json', 'pnpm-lock.yaml', 'yarn.lock', 'composer.lock',
|
|
23
|
+
'AGENTS.md', 'task.md', 'implementation_plan.md', 'walkthrough.md'
|
|
24
|
+
];
|
|
25
|
+
|
|
26
|
+
const MAX_RETRIES = 3;
|
|
27
|
+
const BASE_DELAY_MS = 1000;
|
|
28
|
+
|
|
29
|
+
// HTTPS request helper with retry and exponential backoff
|
|
30
|
+
function makeRequest(options, postData = null, retries = MAX_RETRIES) {
|
|
31
|
+
return new Promise((resolve, reject) => {
|
|
32
|
+
const req = https.request(options, (res) => {
|
|
33
|
+
let data = '';
|
|
34
|
+
res.on('data', (chunk) => { data += chunk; });
|
|
35
|
+
res.on('end', () => {
|
|
36
|
+
if (res.statusCode >= 200 && res.statusCode < 300) {
|
|
37
|
+
resolve({ data, headers: res.headers });
|
|
38
|
+
} else if (res.statusCode === 429 && retries > 0) {
|
|
39
|
+
const delay = BASE_DELAY_MS * Math.pow(2, MAX_RETRIES - retries);
|
|
40
|
+
console.warn(`Rate limited. Retrying in ${delay}ms...`);
|
|
41
|
+
setTimeout(() => {
|
|
42
|
+
makeRequest(options, postData, retries - 1).then(resolve).catch(reject);
|
|
43
|
+
}, delay);
|
|
44
|
+
} else if (res.statusCode >= 500 && retries > 0) {
|
|
45
|
+
const delay = BASE_DELAY_MS * Math.pow(2, MAX_RETRIES - retries);
|
|
46
|
+
console.warn(`Server error ${res.statusCode}. Retrying in ${delay}ms...`);
|
|
47
|
+
setTimeout(() => {
|
|
48
|
+
makeRequest(options, postData, retries - 1).then(resolve).catch(reject);
|
|
49
|
+
}, delay);
|
|
50
|
+
} else {
|
|
51
|
+
reject(new Error(`Status ${res.statusCode}: ${data}`));
|
|
52
|
+
}
|
|
53
|
+
});
|
|
54
|
+
});
|
|
55
|
+
req.on('error', (err) => {
|
|
56
|
+
if (retries > 0) {
|
|
57
|
+
const delay = BASE_DELAY_MS * Math.pow(2, MAX_RETRIES - retries);
|
|
58
|
+
setTimeout(() => {
|
|
59
|
+
makeRequest(options, postData, retries - 1).then(resolve).catch(reject);
|
|
60
|
+
}, delay);
|
|
61
|
+
} else {
|
|
62
|
+
reject(err);
|
|
63
|
+
}
|
|
64
|
+
});
|
|
65
|
+
if (postData) {
|
|
66
|
+
req.write(typeof postData === 'string' ? postData : JSON.stringify(postData));
|
|
67
|
+
}
|
|
68
|
+
req.end();
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
// Fetch all pages of PR files (handles pagination)
|
|
73
|
+
async function fetchAllPRFiles() {
|
|
74
|
+
const allFiles = [];
|
|
75
|
+
let page = 1;
|
|
76
|
+
|
|
77
|
+
while (true) {
|
|
78
|
+
const options = {
|
|
79
|
+
hostname: 'api.github.com',
|
|
80
|
+
path: `/repos/${GITHUB_REPOSITORY}/pulls/${PR_NUMBER}/files?per_page=100&page=${page}`,
|
|
81
|
+
method: 'GET',
|
|
82
|
+
headers: {
|
|
83
|
+
'Authorization': `Bearer ${GITHUB_TOKEN}`,
|
|
84
|
+
'Accept': 'application/vnd.github.v3+json',
|
|
85
|
+
'User-Agent': 'AI-PR-Reviewer-Action'
|
|
86
|
+
}
|
|
87
|
+
};
|
|
88
|
+
|
|
89
|
+
const { data } = await makeRequest(options);
|
|
90
|
+
const files = JSON.parse(data);
|
|
91
|
+
|
|
92
|
+
if (files.length === 0) break;
|
|
93
|
+
allFiles.push(...files);
|
|
94
|
+
|
|
95
|
+
if (files.length < 100) break;
|
|
96
|
+
page++;
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
return allFiles;
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
// Extract added line numbers from a unified diff patch
|
|
103
|
+
function getAddedLines(patch) {
|
|
104
|
+
if (!patch) return [];
|
|
105
|
+
const lines = patch.split('\n');
|
|
106
|
+
const addedLines = [];
|
|
107
|
+
let currentNewLineNum = 0;
|
|
108
|
+
|
|
109
|
+
for (const line of lines) {
|
|
110
|
+
const chunkHeader = line.match(/^@@ -\d+(?:,\d+)? \+(\d+)(?:,\d+)? @@/);
|
|
111
|
+
if (chunkHeader) {
|
|
112
|
+
currentNewLineNum = parseInt(chunkHeader[1], 10);
|
|
113
|
+
continue;
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
if (line.startsWith('+') && !line.startsWith('+++')) {
|
|
117
|
+
addedLines.push(currentNewLineNum);
|
|
118
|
+
currentNewLineNum++;
|
|
119
|
+
} else if (line.startsWith('-')) {
|
|
120
|
+
// Deleted line — skip
|
|
121
|
+
} else {
|
|
122
|
+
currentNewLineNum++;
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
return addedLines;
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
async function run() {
|
|
129
|
+
try {
|
|
130
|
+
console.log(`AI review for PR #${PR_NUMBER} on ${GITHUB_REPOSITORY} (model: ${GEMINI_MODEL})`);
|
|
131
|
+
|
|
132
|
+
// 1. Get PR details for head SHA
|
|
133
|
+
const prDetailsOptions = {
|
|
134
|
+
hostname: 'api.github.com',
|
|
135
|
+
path: `/repos/${GITHUB_REPOSITORY}/pulls/${PR_NUMBER}`,
|
|
136
|
+
method: 'GET',
|
|
137
|
+
headers: {
|
|
138
|
+
'Authorization': `Bearer ${GITHUB_TOKEN}`,
|
|
139
|
+
'Accept': 'application/vnd.github.v3+json',
|
|
140
|
+
'User-Agent': 'AI-PR-Reviewer-Action'
|
|
141
|
+
}
|
|
142
|
+
};
|
|
143
|
+
const { data: prDetailsRaw } = await makeRequest(prDetailsOptions);
|
|
144
|
+
const prDetails = JSON.parse(prDetailsRaw);
|
|
145
|
+
const commitSha = prDetails.head.sha;
|
|
146
|
+
console.log(`Head SHA: ${commitSha}`);
|
|
147
|
+
|
|
148
|
+
// 2. Fetch all modified files (paginated)
|
|
149
|
+
const files = await fetchAllPRFiles();
|
|
150
|
+
|
|
151
|
+
const filesToAnalyze = files.filter(file => {
|
|
152
|
+
if (IGNORED_FILES.some(ignored => file.filename.endsWith(ignored))) return false;
|
|
153
|
+
return SUPPORTED_EXTENSIONS.some(ext => file.filename.endsWith(ext)) && !!file.patch;
|
|
154
|
+
});
|
|
155
|
+
|
|
156
|
+
if (filesToAnalyze.length === 0) {
|
|
157
|
+
console.log("No analyzable code files found.");
|
|
158
|
+
return;
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
console.log(`${filesToAnalyze.length} files retained for analysis.`);
|
|
162
|
+
|
|
163
|
+
// 3. Prepare diff data for Gemini
|
|
164
|
+
const fileDiffData = filesToAnalyze.map(file => ({
|
|
165
|
+
filename: file.filename,
|
|
166
|
+
patch: file.patch,
|
|
167
|
+
validLinesForComments: getAddedLines(file.patch)
|
|
168
|
+
}));
|
|
169
|
+
|
|
170
|
+
// 4. Call Gemini API
|
|
171
|
+
const systemInstruction = `Tu es un expert en revue de code (ingénieur logiciel principal). Analyse les modifications d'une Pull Request et génère une revue technique constructive et précise.
|
|
172
|
+
|
|
173
|
+
Consignes :
|
|
174
|
+
1. Génère des commentaires ciblés uniquement si nécessaire (bugs, failles de sécurité, optimisations majeures, mauvaise gestion d'erreurs, lisibilité).
|
|
175
|
+
2. Chaque commentaire DOIT avoir un numéro de ligne ('line') présent dans 'validLinesForComments' du fichier correspondant. Ne commente jamais sur une ligne hors de cette liste.
|
|
176
|
+
3. Rédige en français, de manière claire et technique. Propose du code de correction en bloc markdown si pertinent.
|
|
177
|
+
4. Verdict global dans le champ 'verdict' :
|
|
178
|
+
- 'APPROVE' : Code excellent, prêt à fusionner (aucun commentaire requis).
|
|
179
|
+
- 'COMMENT' : Suggestions mineures, non bloquantes.
|
|
180
|
+
- 'REQUEST_CHANGES' : Bugs sérieux, failles de sécurité, ou problèmes de performance bloquants.
|
|
181
|
+
5. Réponds en JSON strictement conforme à ce schéma :
|
|
182
|
+
{
|
|
183
|
+
"verdict": "APPROVE" | "COMMENT" | "REQUEST_CHANGES",
|
|
184
|
+
"summary": "Résumé global de la revue.",
|
|
185
|
+
"comments": [
|
|
186
|
+
{
|
|
187
|
+
"path": "chemin/du/fichier.js",
|
|
188
|
+
"line": 42,
|
|
189
|
+
"body": "Explication du problème ou suggestion."
|
|
190
|
+
}
|
|
191
|
+
]
|
|
192
|
+
}`;
|
|
193
|
+
|
|
194
|
+
const promptUser = `Fichiers modifiés et diffs pour la PR #${PR_NUMBER} :
|
|
195
|
+
${JSON.stringify(fileDiffData, null, 2)}`;
|
|
196
|
+
|
|
197
|
+
const geminiPayload = {
|
|
198
|
+
contents: [{ parts: [{ text: promptUser }] }],
|
|
199
|
+
systemInstruction: { parts: [{ text: systemInstruction }] },
|
|
200
|
+
generationConfig: { responseMimeType: "application/json" }
|
|
201
|
+
};
|
|
202
|
+
|
|
203
|
+
const geminiUrl = new URL(
|
|
204
|
+
`https://generativelanguage.googleapis.com/v1beta/models/${GEMINI_MODEL}:generateContent?key=${GEMINI_API_KEY}`
|
|
205
|
+
);
|
|
206
|
+
|
|
207
|
+
const geminiOptions = {
|
|
208
|
+
hostname: geminiUrl.hostname,
|
|
209
|
+
path: geminiUrl.pathname + geminiUrl.search,
|
|
210
|
+
method: 'POST',
|
|
211
|
+
headers: { 'Content-Type': 'application/json' }
|
|
212
|
+
};
|
|
213
|
+
|
|
214
|
+
console.log(`Sending to Gemini (${GEMINI_MODEL})...`);
|
|
215
|
+
const { data: geminiResponseRaw } = await makeRequest(geminiOptions, geminiPayload);
|
|
216
|
+
const geminiResponse = JSON.parse(geminiResponseRaw);
|
|
217
|
+
|
|
218
|
+
const responseText = geminiResponse.candidates[0].content.parts[0].text;
|
|
219
|
+
const reviewResult = JSON.parse(responseText);
|
|
220
|
+
|
|
221
|
+
console.log(`Verdict: ${reviewResult.verdict}`);
|
|
222
|
+
console.log(`Summary: ${reviewResult.summary}`);
|
|
223
|
+
console.log(`Comments: ${reviewResult.comments ? reviewResult.comments.length : 0}`);
|
|
224
|
+
|
|
225
|
+
// Filter comments to valid diff lines only
|
|
226
|
+
const validComments = [];
|
|
227
|
+
if (reviewResult.comments && Array.isArray(reviewResult.comments)) {
|
|
228
|
+
for (const comment of reviewResult.comments) {
|
|
229
|
+
const fileData = fileDiffData.find(f => f.filename === comment.path);
|
|
230
|
+
if (fileData && fileData.validLinesForComments.includes(Number(comment.line))) {
|
|
231
|
+
validComments.push({
|
|
232
|
+
path: comment.path,
|
|
233
|
+
line: Number(comment.line),
|
|
234
|
+
side: 'RIGHT',
|
|
235
|
+
body: comment.body
|
|
236
|
+
});
|
|
237
|
+
} else {
|
|
238
|
+
console.warn(`Skipped invalid comment: ${comment.path}:${comment.line} (not in diff)`);
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
// 5. Submit review to GitHub
|
|
244
|
+
const reviewPayload = {
|
|
245
|
+
commit_id: commitSha,
|
|
246
|
+
body: `### 🤖 Revue automatique par l'IA (${GEMINI_MODEL})
|
|
247
|
+
|
|
248
|
+
**Verdict :** ${reviewResult.verdict === 'APPROVE' ? '✅ Approuvé' : reviewResult.verdict === 'REQUEST_CHANGES' ? '❌ Changements demandés' : '💬 Commentaires'}
|
|
249
|
+
|
|
250
|
+
${reviewResult.summary}
|
|
251
|
+
|
|
252
|
+
_Revue générée automatiquement._`,
|
|
253
|
+
event: reviewResult.verdict,
|
|
254
|
+
comments: validComments
|
|
255
|
+
};
|
|
256
|
+
|
|
257
|
+
const submitReviewOptions = {
|
|
258
|
+
hostname: 'api.github.com',
|
|
259
|
+
path: `/repos/${GITHUB_REPOSITORY}/pulls/${PR_NUMBER}/reviews`,
|
|
260
|
+
method: 'POST',
|
|
261
|
+
headers: {
|
|
262
|
+
'Authorization': `Bearer ${GITHUB_TOKEN}`,
|
|
263
|
+
'Accept': 'application/vnd.github.v3+json',
|
|
264
|
+
'User-Agent': 'AI-PR-Reviewer-Action',
|
|
265
|
+
'Content-Type': 'application/json'
|
|
266
|
+
}
|
|
267
|
+
};
|
|
268
|
+
|
|
269
|
+
await makeRequest(submitReviewOptions, reviewPayload);
|
|
270
|
+
console.log("Review published successfully.");
|
|
271
|
+
|
|
272
|
+
} catch (error) {
|
|
273
|
+
console.error("AI review failed:", error);
|
|
274
|
+
process.exit(1);
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
|
|
278
|
+
run();
|
|
@@ -3,12 +3,19 @@ name: AI Pull Request Reviewer
|
|
|
3
3
|
on:
|
|
4
4
|
pull_request:
|
|
5
5
|
types: [opened, synchronize]
|
|
6
|
+
paths-ignore:
|
|
7
|
+
- '**.md'
|
|
6
8
|
workflow_dispatch:
|
|
7
9
|
inputs:
|
|
8
10
|
pr_number:
|
|
9
|
-
description: '
|
|
11
|
+
description: 'PR number to review'
|
|
10
12
|
required: true
|
|
11
13
|
type: string
|
|
14
|
+
gemini_model:
|
|
15
|
+
description: 'Gemini model to use'
|
|
16
|
+
required: false
|
|
17
|
+
default: 'gemini-2.5-flash'
|
|
18
|
+
type: string
|
|
12
19
|
|
|
13
20
|
permissions:
|
|
14
21
|
pull-requests: write
|
|
@@ -19,35 +26,26 @@ env:
|
|
|
19
26
|
|
|
20
27
|
jobs:
|
|
21
28
|
review:
|
|
22
|
-
# Optionnel: pour limiter la revue aux PR créées par un utilisateur spécifique (ex: Jules)
|
|
23
|
-
# Remplacer 'jules-username' par l'identifiant GitHub de Jules
|
|
24
|
-
# if: github.event.pull_request.user.login == 'jules-username'
|
|
25
|
-
|
|
26
29
|
runs-on: ubuntu-latest
|
|
27
30
|
|
|
28
31
|
env:
|
|
29
32
|
GEMINI_API_KEY: ${{ secrets.GEMINI_API_KEY }}
|
|
33
|
+
GEMINI_MODEL: ${{ inputs.gemini_model || 'gemini-2.5-flash' }}
|
|
30
34
|
|
|
31
35
|
steps:
|
|
32
36
|
- name: Checkout Repository
|
|
33
|
-
uses: actions/checkout@
|
|
37
|
+
uses: actions/checkout@v7
|
|
34
38
|
with:
|
|
35
|
-
fetch-depth: 0
|
|
39
|
+
fetch-depth: 0
|
|
36
40
|
|
|
37
41
|
- name: Setup Node.js
|
|
38
42
|
uses: actions/setup-node@v6
|
|
39
43
|
with:
|
|
40
|
-
node-version:
|
|
41
|
-
|
|
42
|
-
- name: Resolve bolt.md Merge Conflicts
|
|
43
|
-
env:
|
|
44
|
-
BASE_BRANCH: ${{ github.event.pull_request.base.ref }}
|
|
45
|
-
HEAD_BRANCH: ${{ github.event.pull_request.head.ref }}
|
|
46
|
-
run: node .github/scripts/resolve-bolt-conflict.js
|
|
44
|
+
node-version: 24
|
|
47
45
|
|
|
48
46
|
- name: Run AI Reviewer
|
|
49
47
|
if: env.GEMINI_API_KEY != ''
|
|
50
48
|
env:
|
|
51
49
|
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
|
52
50
|
GITHUB_PR_NUMBER: ${{ inputs.pr_number || github.event.pull_request.number }}
|
|
53
|
-
run: node .github/scripts/ai-pr-reviewer.
|
|
51
|
+
run: node .github/scripts/ai-pr-reviewer.cjs
|
|
@@ -31,13 +31,13 @@ jobs:
|
|
|
31
31
|
lint:
|
|
32
32
|
runs-on: ubuntu-latest
|
|
33
33
|
steps:
|
|
34
|
-
- uses: actions/checkout@
|
|
34
|
+
- uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
|
|
35
35
|
- uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6.2.0
|
|
36
36
|
with:
|
|
37
37
|
python-version: "3.14"
|
|
38
38
|
cache: 'pip'
|
|
39
39
|
- name: Cache pre-commit
|
|
40
|
-
uses: actions/cache@
|
|
40
|
+
uses: actions/cache@v6
|
|
41
41
|
with:
|
|
42
42
|
path: ~/.cache/pre-commit
|
|
43
43
|
key: ${{ runner.os }}-pre-commit-${{ hashFiles('.pre-commit-config.yaml') }}
|
|
@@ -49,7 +49,7 @@ jobs:
|
|
|
49
49
|
type-check:
|
|
50
50
|
runs-on: ubuntu-latest
|
|
51
51
|
steps:
|
|
52
|
-
- uses: actions/checkout@
|
|
52
|
+
- uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
|
|
53
53
|
- uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6.2.0
|
|
54
54
|
id: setup-python
|
|
55
55
|
with:
|
|
@@ -66,7 +66,7 @@ jobs:
|
|
|
66
66
|
outputs:
|
|
67
67
|
wheel-distribution: ${{ steps.wheel-distribution.outputs.path }}
|
|
68
68
|
steps:
|
|
69
|
-
- uses: actions/checkout@
|
|
69
|
+
- uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
|
|
70
70
|
with: {fetch-depth: 0} # deep clone for setuptools-scm
|
|
71
71
|
- uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6.2.0
|
|
72
72
|
id: setup-python
|
|
@@ -93,7 +93,6 @@ jobs:
|
|
|
93
93
|
'ffbb_data_client/data/endpoint_discovery.json',
|
|
94
94
|
'ffbb_data_client/data/indexes.json',
|
|
95
95
|
'ffbb_data_client/data/openapi.json',
|
|
96
|
-
'ffbb_data_client/data/openapi_full.json',
|
|
97
96
|
}
|
|
98
97
|
with zipfile.ZipFile(wheels[0]) as wheel:
|
|
99
98
|
names = set(wheel.namelist())
|
|
@@ -133,14 +132,14 @@ jobs:
|
|
|
133
132
|
- ubuntu-latest
|
|
134
133
|
runs-on: ${{ matrix.platform }}
|
|
135
134
|
steps:
|
|
136
|
-
- uses: actions/checkout@
|
|
135
|
+
- uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
|
|
137
136
|
- uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6.2.0
|
|
138
137
|
id: setup-python
|
|
139
138
|
with:
|
|
140
139
|
python-version: ${{ matrix.python }}
|
|
141
140
|
cache: 'pip'
|
|
142
141
|
- name: Cache tox environments
|
|
143
|
-
uses: actions/cache@
|
|
142
|
+
uses: actions/cache@v6
|
|
144
143
|
with:
|
|
145
144
|
path: .tox
|
|
146
145
|
key: ${{ runner.os }}-tox-${{ matrix.python }}-${{ hashFiles('setup.cfg', 'tox.ini', 'pyproject.toml') }}
|
|
@@ -153,9 +152,14 @@ jobs:
|
|
|
153
152
|
env:
|
|
154
153
|
API_FFBB_APP_BEARER_TOKEN: ${{ secrets.API_FFBB_APP_BEARER_TOKEN }}
|
|
155
154
|
MEILISEARCH_BEARER_TOKEN: ${{ secrets.MEILISEARCH_BEARER_TOKEN }}
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
155
|
+
MATRIX_PYTHON: ${{ matrix.python }}
|
|
156
|
+
run: |
|
|
157
|
+
toxenv="py${MATRIX_PYTHON//./}"
|
|
158
|
+
pipx run --python '${{ steps.setup-python.outputs.python-path }}' \
|
|
159
|
+
tox -e "$toxenv" --installpkg '${{ needs.build.outputs.wheel-distribution }}'
|
|
160
|
+
# Only run the tox environment matching this matrix runner's Python.
|
|
161
|
+
# Without `-e`, tox executes the full envlist (py310..py314) on a
|
|
162
|
+
# single-version runner and fails on the missing interpreters.
|
|
159
163
|
|
|
160
164
|
# ── Coveralls: upload partial report (parallel mode) ─────────────────
|
|
161
165
|
# coverallsapp/github-action@v2 uses the Universal Coverage Reporter
|
|
@@ -23,13 +23,13 @@ jobs:
|
|
|
23
23
|
|
|
24
24
|
steps:
|
|
25
25
|
- name: Checkout
|
|
26
|
-
uses: actions/checkout@
|
|
26
|
+
uses: actions/checkout@v7
|
|
27
27
|
|
|
28
28
|
- name: Initialize CodeQL
|
|
29
|
-
uses: github/codeql-action/init@
|
|
29
|
+
uses: github/codeql-action/init@99df26d4f13ea111d4ec1a7dddef6063f76b97e9 # v4
|
|
30
30
|
with:
|
|
31
31
|
languages: python
|
|
32
32
|
queries: security-extended,security-and-quality
|
|
33
33
|
|
|
34
34
|
- name: Perform CodeQL Analysis
|
|
35
|
-
uses: github/codeql-action/analyze@
|
|
35
|
+
uses: github/codeql-action/analyze@99df26d4f13ea111d4ec1a7dddef6063f76b97e9 # v4
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
name: Keep FFBB API Discovery Alive
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
schedule:
|
|
5
|
+
# Safety net: GitHub may silently stop firing the main schedule.
|
|
6
|
+
# Check every 6h that the discovery workflow ran in the last 22h and
|
|
7
|
+
# trigger it manually if not, guaranteeing at least one run per day.
|
|
8
|
+
- cron: '0 */6 * * *'
|
|
9
|
+
workflow_dispatch:
|
|
10
|
+
|
|
11
|
+
permissions:
|
|
12
|
+
actions: write
|
|
13
|
+
|
|
14
|
+
jobs:
|
|
15
|
+
ensure-daily-run:
|
|
16
|
+
runs-on: ubuntu-latest
|
|
17
|
+
steps:
|
|
18
|
+
- name: Check last discovery run
|
|
19
|
+
id: check
|
|
20
|
+
env:
|
|
21
|
+
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
|
22
|
+
run: |
|
|
23
|
+
last_ts=$(gh api repos/${{ github.repository }}/actions/workflows/update-ffbb-api-discovery.yml/runs \
|
|
24
|
+
--jq -r '.workflow_runs[0].created_at' 2>/dev/null || echo "1970-01-01T00:00:00Z")
|
|
25
|
+
echo "last_run=$last_ts"
|
|
26
|
+
cutoff=$(date -u -d '-22 hours' +%Y-%m-%dT%H:%M:%SZ)
|
|
27
|
+
echo "cutoff=$cutoff"
|
|
28
|
+
if [[ "$last_ts" < "$cutoff" ]]; then
|
|
29
|
+
echo "STALE: last run $last_ts is older than 22h, triggering discovery now"
|
|
30
|
+
gh workflow run update-ffbb-api-discovery.yml
|
|
31
|
+
echo "triggered=true" >> "$GITHUB_OUTPUT"
|
|
32
|
+
else
|
|
33
|
+
echo "OK: discovery ran at $last_ts, no action needed"
|
|
34
|
+
echo "triggered=false" >> "$GITHUB_OUTPUT"
|
|
35
|
+
fi
|
|
36
|
+
|
|
37
|
+
- name: Report outcome
|
|
38
|
+
run: |
|
|
39
|
+
echo "triggered=${{ steps.check.outputs.triggered }}"
|
|
@@ -22,7 +22,7 @@ jobs:
|
|
|
22
22
|
|
|
23
23
|
steps:
|
|
24
24
|
- name: Checkout
|
|
25
|
-
uses: actions/checkout@
|
|
25
|
+
uses: actions/checkout@v7
|
|
26
26
|
with:
|
|
27
27
|
fetch-depth: 0 # Required for setuptools_scm to resolve version from tags
|
|
28
28
|
|
|
@@ -54,7 +54,6 @@ jobs:
|
|
|
54
54
|
'ffbb_data_client/data/endpoint_discovery.json',
|
|
55
55
|
'ffbb_data_client/data/indexes.json',
|
|
56
56
|
'ffbb_data_client/data/openapi.json',
|
|
57
|
-
'ffbb_data_client/data/openapi_full.json',
|
|
58
57
|
}
|
|
59
58
|
with zipfile.ZipFile(wheels[0]) as wheel:
|
|
60
59
|
names = set(wheel.namelist())
|
|
@@ -73,7 +72,7 @@ jobs:
|
|
|
73
72
|
path: dist/
|
|
74
73
|
|
|
75
74
|
- name: Generate artifact attestation
|
|
76
|
-
uses: actions/attest@
|
|
75
|
+
uses: actions/attest@a1948c3f048ba23858d222213b7c278aabede763 # v4
|
|
77
76
|
with:
|
|
78
77
|
subject-path: dist/*
|
|
79
78
|
|
|
@@ -110,7 +109,7 @@ jobs:
|
|
|
110
109
|
path: dist/
|
|
111
110
|
|
|
112
111
|
- name: Create GitHub Release
|
|
113
|
-
uses: softprops/action-gh-release@
|
|
112
|
+
uses: softprops/action-gh-release@718ea10b132b3b2eba29c1007bb80653f286566b # v3
|
|
114
113
|
with:
|
|
115
114
|
files: dist/*
|
|
116
115
|
generate_release_notes: true
|
{ffbb_data_client-2.3.2 → ffbb_data_client-2.3.3}/.github/workflows/update-ffbb-api-discovery.yml
RENAMED
|
@@ -23,7 +23,7 @@ jobs:
|
|
|
23
23
|
|
|
24
24
|
steps:
|
|
25
25
|
- name: Checkout
|
|
26
|
-
uses: actions/checkout@
|
|
26
|
+
uses: actions/checkout@v7
|
|
27
27
|
|
|
28
28
|
- name: Set up Python
|
|
29
29
|
uses: actions/setup-python@v6
|
|
@@ -81,4 +81,3 @@ jobs:
|
|
|
81
81
|
src/ffbb_data_client/data/endpoint_discovery.json
|
|
82
82
|
src/ffbb_data_client/data/indexes.json
|
|
83
83
|
src/ffbb_data_client/data/openapi.json
|
|
84
|
-
src/ffbb_data_client/data/openapi_full.json
|
|
@@ -9,7 +9,7 @@ repos:
|
|
|
9
9
|
hooks:
|
|
10
10
|
- id: trailing-whitespace
|
|
11
11
|
- id: check-added-large-files
|
|
12
|
-
exclude: ^src/ffbb_data_client/data/
|
|
12
|
+
exclude: ^src/ffbb_data_client/data/openapi\.json$
|
|
13
13
|
- id: check-ast
|
|
14
14
|
- id: check-json
|
|
15
15
|
- id: check-merge-conflict
|
|
@@ -5,6 +5,19 @@ 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
|
+
## [Unreleased]
|
|
9
|
+
|
|
10
|
+
### Added
|
|
11
|
+
- **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.
|
|
12
|
+
|
|
13
|
+
### Changed
|
|
14
|
+
- **Performance**: `recursive_smart_multi_search` / `recursive_smart_multi_search_async`
|
|
15
|
+
exécutent désormais la pagination Meilisearch en **parallèle** (lots de 10 pages,
|
|
16
|
+
`asyncio.gather` en async / `ThreadPoolExecutor` en sync) au lieu d'enchaîner les
|
|
17
|
+
allers-retours réseau un par un — divisant la latence de pagination par le nombre de pages.
|
|
18
|
+
- Les requêtes de pagination sont désormais **clonées** (`dataclasses.replace`) au lieu de
|
|
19
|
+
muter les objets `MultiSearchQuery` du caller, supprimant une fuite d'état entre appels.
|
|
20
|
+
|
|
8
21
|
## [2.3.0] - 2026-05-24
|
|
9
22
|
|
|
10
23
|
### Added
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: ffbb-data-client
|
|
3
|
-
Version: 2.3.
|
|
3
|
+
Version: 2.3.3
|
|
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
|
|
@@ -56,12 +56,17 @@ Dynamic: license-file
|
|
|
56
56
|
|
|
57
57
|
**SDK Python moderne, typé et asynchrone pour exploiter les données publiques FFBB : clubs, compétitions, rencontres, classements, salles, officiels et recherche Meilisearch.**
|
|
58
58
|
|
|
59
|
-
[](https://pypi.org/project/ffbb-data-client/)
|
|
60
|
-
[](https://pypi.org/project/ffbb-data-client/)
|
|
59
|
+
[](https://pypi.org/project/ffbb-data-client/)
|
|
60
|
+
[](https://pypi.org/project/ffbb-data-client/)
|
|
61
61
|
[](https://github.com/nickdesi/ffbb-data-client/actions/workflows/ci.yml)
|
|
62
|
-
[](https://coveralls.io/github/nickdesi/ffbb-data-client?branch=master)
|
|
63
63
|
[](LICENSE.txt)
|
|
64
|
-
[](https://github.com/nickdesi/FFBB-MCP-Server)
|
|
64
|
+
[](https://github.com/nickdesi/FFBB-MCP-Server)
|
|
65
|
+
[](SECURITY.md)
|
|
66
|
+
[](https://github.com/nickdesi/ffbb-data-client/stargazers)
|
|
67
|
+
[](https://github.com/nickdesi/ffbb-data-client/commits/master)
|
|
68
|
+
[](https://github.com/nickdesi/ffbb-data-client/issues)
|
|
69
|
+
[](https://github.com/nickdesi/ffbb-data-client/pulls)
|
|
65
70
|
|
|
66
71
|
[Installation](#-installation) •
|
|
67
72
|
[Démarrage rapide](#-démarrage-rapide) •
|
|
@@ -361,6 +366,18 @@ Distribué sous licence Apache-2.0. Voir [`LICENSE.txt`](LICENSE.txt).
|
|
|
361
366
|
|
|
362
367
|
---
|
|
363
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`
|
|
378
|
+
|
|
379
|
+
---
|
|
380
|
+
|
|
364
381
|
<div align="center">
|
|
365
382
|
|
|
366
383
|
**Si ce projet vous aide, une étoile est appréciée. ⭐**
|