ffbb-data-client 2.3.0__tar.gz → 2.3.1__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.1/.github/ISSUE_TEMPLATE/bug_report.yml +64 -0
- ffbb_data_client-2.3.1/.github/ISSUE_TEMPLATE/feature_request.yml +37 -0
- ffbb_data_client-2.3.1/.github/PULL_REQUEST_TEMPLATE.md +45 -0
- ffbb_data_client-2.3.1/.github/scripts/ai-pr-reviewer.js +273 -0
- ffbb_data_client-2.3.1/.github/scripts/resolve-bolt-conflict.js +121 -0
- ffbb_data_client-2.3.1/.github/workflows/ai-pr-reviewer.yml +53 -0
- {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.1}/.github/workflows/check_wrapper_parity.yml +7 -2
- {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.1}/.github/workflows/ci.yml +51 -10
- {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.1}/.github/workflows/codeql.yml +6 -4
- {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.1}/.github/workflows/deploy-pages.yml +4 -1
- {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.1}/.github/workflows/publish.yml +10 -5
- {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.1}/.github/workflows/release-after-discovery-merge.yml +6 -1
- {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.1}/.github/workflows/update-ffbb-api-discovery.yml +8 -3
- {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.1}/.gitignore +1 -0
- ffbb_data_client-2.3.1/AGENTS.md +103 -0
- ffbb_data_client-2.3.1/CODE_OF_CONDUCT.md +77 -0
- {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.1}/PKG-INFO +2 -2
- {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.1}/data/api_update_summary.md +4 -6
- {ffbb_data_client-2.3.0/src/ffbb_data_client → ffbb_data_client-2.3.1}/data/endpoint_discovery.json +17 -32
- {ffbb_data_client-2.3.0/src/ffbb_data_client → ffbb_data_client-2.3.1}/data/indexes.json +9 -9
- {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.1}/data/openapi.json +9 -1
- {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.1}/data/openapi_full.json +9 -1
- {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.1}/docs/requirements.txt +1 -1
- {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.1}/setup.cfg +1 -1
- {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.1}/src/ffbb_data_client/__init__.py +2 -0
- {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.1}/src/ffbb_data_client/clients/_rest_facade.py +59 -0
- {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.1}/src/ffbb_data_client/clients/api_ffbb_app_client.py +36 -18
- ffbb_data_client-2.3.1/src/ffbb_data_client/clients/ffbb_data_client.py +151 -0
- {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.1}/src/ffbb_data_client/clients/meilisearch_client.py +19 -13
- {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.1}/src/ffbb_data_client/config.py +2 -2
- {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.1/src/ffbb_data_client}/data/endpoint_discovery.json +17 -32
- {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.1/src/ffbb_data_client}/data/indexes.json +9 -9
- {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.1}/src/ffbb_data_client/data/openapi.json +9 -1
- {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.1}/src/ffbb_data_client/data/openapi_full.json +9 -1
- {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.1}/src/ffbb_data_client/helpers/http_requests_utils.py +179 -12
- {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.1}/src/ffbb_data_client/helpers/meilisearch_client_extension.py +51 -37
- {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.1}/src/ffbb_data_client/utils/__init__.py +2 -0
- {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.1}/src/ffbb_data_client/utils/cache_manager.py +66 -17
- ffbb_data_client-2.3.1/src/ffbb_data_client/utils/concurrency_utils.py +33 -0
- {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.1}/src/ffbb_data_client/utils/retry_utils.py +64 -36
- {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.1}/src/ffbb_data_client/utils/token_manager.py +6 -4
- {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.1}/src/ffbb_data_client.egg-info/PKG-INFO +2 -2
- {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.1}/src/ffbb_data_client.egg-info/SOURCES.txt +10 -0
- {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.1}/src/ffbb_data_client.egg-info/requires.txt +1 -1
- {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.1}/tests/unit/clients/test_201_unit_tests_core.py +47 -55
- {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.1}/tests/unit/clients/test_202_meilisearch_client.py +8 -11
- ffbb_data_client-2.3.1/tests/unit/clients/test_warm_cache.py +100 -0
- {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.1}/tests/unit/helpers/test_400_http_helpers.py +58 -0
- {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.1}/tests/unit/utils/test_303_cache_manager.py +15 -0
- {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.1}/tests/unit/utils/test_305_token_manager.py +3 -3
- ffbb_data_client-2.3.1/tests/unit/utils/test_309_concurrency_utils.py +46 -0
- {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.1}/tools/update_agents_md.py +8 -0
- {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.1}/website/index.html +1 -1
- ffbb_data_client-2.3.0/AGENTS.md +0 -260
- ffbb_data_client-2.3.0/src/ffbb_data_client/clients/ffbb_data_client.py +0 -266
- {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.1}/.agents/rules/antigravity-rtk-rules.md +0 -0
- {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.1}/.coveragerc +0 -0
- {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.1}/.github/dependabot.yml +0 -0
- {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.1}/.github/scripts/check_wrapper_parity.py +0 -0
- {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.1}/.isort.cfg +0 -0
- {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.1}/.jules/bolt.md +0 -0
- {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.1}/.pre-commit-config.yaml +0 -0
- {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.1}/.readthedocs.yml +0 -0
- {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.1}/AUTHORS.rst +0 -0
- {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.1}/CHANGELOG.md +0 -0
- {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.1}/CONTRIBUTING.rst +0 -0
- {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.1}/LICENSE.txt +0 -0
- {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.1}/LOCAL_CI_GUIDE.md +0 -0
- {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.1}/README.md +0 -0
- {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.1}/RELEASE_NOTES.md +0 -0
- {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.1}/SECURITY.md +0 -0
- {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.1}/data/api.ffbb.app.json +0 -0
- {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.1}/data/collections.json +0 -0
- {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.1}/data/meilisearch-prod.ffbb.app.json +0 -0
- {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.1}/data/type_discovery_corrections.json +0 -0
- {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.1}/docs/Makefile +0 -0
- {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.1}/docs/_static/.gitignore +0 -0
- {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.1}/docs/architecture.rst +0 -0
- {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.1}/docs/authors.rst +0 -0
- {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.1}/docs/changelog.rst +0 -0
- {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.1}/docs/conf.py +0 -0
- {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.1}/docs/contributing.rst +0 -0
- {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.1}/docs/examples.rst +0 -0
- {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.1}/docs/index.rst +0 -0
- {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.1}/docs/license.rst +0 -0
- {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.1}/docs/migration.rst +0 -0
- {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.1}/docs/readme.rst +0 -0
- {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.1}/docs/test_strategy.md +0 -0
- {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.1}/docs/testing_conventions.md +0 -0
- {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.1}/examples/README.md +0 -0
- {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.1}/examples/complete_usage_example.py +0 -0
- {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.1}/examples/quick_start.py +0 -0
- {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.1}/examples/team_ranking_analysis.py +0 -0
- {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.1}/pyproject.toml +0 -0
- {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.1}/pytest.ini +0 -0
- {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.1}/run-ci-locally.sh +0 -0
- {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.1}/scripts/benchmark_search_organisme.py +0 -0
- {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.1}/scripts/discover_endpoints.py +0 -0
- {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.1}/scripts/discover_types.py +0 -0
- {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.1}/setup.py +0 -0
- {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.1}/src/ffbb_data_client/clients/__init__.py +0 -0
- {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.1}/src/ffbb_data_client/clients/_search_facade.py +0 -0
- {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.1}/src/ffbb_data_client/clients/meilisearch_ffbb_client.py +0 -0
- {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.1}/src/ffbb_data_client/data/__init__.py +0 -0
- {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.1}/src/ffbb_data_client/data/collections.json +0 -0
- {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.1}/src/ffbb_data_client/helpers/__init__.py +0 -0
- {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.1}/src/ffbb_data_client/helpers/http_requests_helper.py +0 -0
- {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.1}/src/ffbb_data_client/helpers/multi_search_query_helper.py +0 -0
- {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.1}/src/ffbb_data_client/models/__init__.py +0 -0
- {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.1}/src/ffbb_data_client/models/affiche.py +0 -0
- {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.1}/src/ffbb_data_client/models/cartographie.py +0 -0
- {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.1}/src/ffbb_data_client/models/categorie.py +0 -0
- {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.1}/src/ffbb_data_client/models/categorie_type.py +0 -0
- {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.1}/src/ffbb_data_client/models/clock.py +0 -0
- {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.1}/src/ffbb_data_client/models/club_contacts.py +0 -0
- {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.1}/src/ffbb_data_client/models/code.py +0 -0
- {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.1}/src/ffbb_data_client/models/commune.py +0 -0
- {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.1}/src/ffbb_data_client/models/competition_fields.py +0 -0
- {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.1}/src/ffbb_data_client/models/competition_id.py +0 -0
- {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.1}/src/ffbb_data_client/models/competition_id_categorie.py +0 -0
- {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.1}/src/ffbb_data_client/models/competition_id_sexe.py +0 -0
- {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.1}/src/ffbb_data_client/models/competition_id_type_competition.py +0 -0
- {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.1}/src/ffbb_data_client/models/competition_id_type_competition_generique.py +0 -0
- {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.1}/src/ffbb_data_client/models/competition_origine.py +0 -0
- {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.1}/src/ffbb_data_client/models/competition_origine_categorie.py +0 -0
- {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.1}/src/ffbb_data_client/models/competition_origine_type_competition.py +0 -0
- {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.1}/src/ffbb_data_client/models/competition_origine_type_competition_generique.py +0 -0
- {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.1}/src/ffbb_data_client/models/competition_type.py +0 -0
- {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.1}/src/ffbb_data_client/models/competitions_facet_distribution.py +0 -0
- {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.1}/src/ffbb_data_client/models/competitions_facet_stats.py +0 -0
- {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.1}/src/ffbb_data_client/models/competitions_hit.py +0 -0
- {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.1}/src/ffbb_data_client/models/competitions_multi_search_query.py +0 -0
- {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.1}/src/ffbb_data_client/models/competitions_query.py +0 -0
- {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.1}/src/ffbb_data_client/models/configuration_models.py +0 -0
- {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.1}/src/ffbb_data_client/models/contact_info.py +0 -0
- {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.1}/src/ffbb_data_client/models/content_multi_search_query.py +0 -0
- {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.1}/src/ffbb_data_client/models/coordonnees.py +0 -0
- {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.1}/src/ffbb_data_client/models/coordonnees_type.py +0 -0
- {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.1}/src/ffbb_data_client/models/document_flyer.py +0 -0
- {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.1}/src/ffbb_data_client/models/document_flyer_type.py +0 -0
- {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.1}/src/ffbb_data_client/models/engagement_contacts.py +0 -0
- {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.1}/src/ffbb_data_client/models/engagements_facet_distribution.py +0 -0
- {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.1}/src/ffbb_data_client/models/engagements_facet_stats.py +0 -0
- {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.1}/src/ffbb_data_client/models/engagements_hit.py +0 -0
- {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.1}/src/ffbb_data_client/models/engagements_multi_search_query.py +0 -0
- {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.1}/src/ffbb_data_client/models/etat.py +0 -0
- {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.1}/src/ffbb_data_client/models/external_competition_id.py +0 -0
- {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.1}/src/ffbb_data_client/models/external_id.py +0 -0
- {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.1}/src/ffbb_data_client/models/facet_distribution.py +0 -0
- {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.1}/src/ffbb_data_client/models/facet_stats.py +0 -0
- {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.1}/src/ffbb_data_client/models/field_set.py +0 -0
- {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.1}/src/ffbb_data_client/models/folder.py +0 -0
- {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.1}/src/ffbb_data_client/models/formation_session.py +0 -0
- {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.1}/src/ffbb_data_client/models/formations_facet_distribution.py +0 -0
- {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.1}/src/ffbb_data_client/models/formations_facet_stats.py +0 -0
- {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.1}/src/ffbb_data_client/models/formations_hit.py +0 -0
- {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.1}/src/ffbb_data_client/models/formations_multi_search_query.py +0 -0
- {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.1}/src/ffbb_data_client/models/game_stats_model.py +0 -0
- {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.1}/src/ffbb_data_client/models/game_stats_models.py +0 -0
- {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.1}/src/ffbb_data_client/models/generic_search.py +0 -0
- {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.1}/src/ffbb_data_client/models/geo.py +0 -0
- {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.1}/src/ffbb_data_client/models/geo_sort_order.py +0 -0
- {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.1}/src/ffbb_data_client/models/get_commune_response.py +0 -0
- {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.1}/src/ffbb_data_client/models/get_competition_response.py +0 -0
- {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.1}/src/ffbb_data_client/models/get_configuration_response.py +0 -0
- {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.1}/src/ffbb_data_client/models/get_engagement_response.py +0 -0
- {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.1}/src/ffbb_data_client/models/get_entraineur_response.py +0 -0
- {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.1}/src/ffbb_data_client/models/get_formation_response.py +0 -0
- {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.1}/src/ffbb_data_client/models/get_officiel_response.py +0 -0
- {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.1}/src/ffbb_data_client/models/get_organisme_response.py +0 -0
- {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.1}/src/ffbb_data_client/models/get_poule_response.py +0 -0
- {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.1}/src/ffbb_data_client/models/get_pratique_response.py +0 -0
- {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.1}/src/ffbb_data_client/models/get_rencontre_response.py +0 -0
- {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.1}/src/ffbb_data_client/models/get_saisons_response.py +0 -0
- {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.1}/src/ffbb_data_client/models/get_salle_response.py +0 -0
- {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.1}/src/ffbb_data_client/models/get_terrain_response.py +0 -0
- {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.1}/src/ffbb_data_client/models/get_tournoi_response.py +0 -0
- {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.1}/src/ffbb_data_client/models/gradient_color.py +0 -0
- {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.1}/src/ffbb_data_client/models/hit.py +0 -0
- {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.1}/src/ffbb_data_client/models/id_engagement_equipe.py +0 -0
- {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.1}/src/ffbb_data_client/models/id_organisme_equipe.py +0 -0
- {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.1}/src/ffbb_data_client/models/id_organisme_equipe1_logo.py +0 -0
- {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.1}/src/ffbb_data_client/models/id_poule.py +0 -0
- {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.1}/src/ffbb_data_client/models/jour.py +0 -0
- {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.1}/src/ffbb_data_client/models/label.py +0 -0
- {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.1}/src/ffbb_data_client/models/labellisation.py +0 -0
- {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.1}/src/ffbb_data_client/models/live.py +0 -0
- {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.1}/src/ffbb_data_client/models/lives.py +0 -0
- {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.1}/src/ffbb_data_client/models/logo.py +0 -0
- {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.1}/src/ffbb_data_client/models/multi_search_queries.py +0 -0
- {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.1}/src/ffbb_data_client/models/multi_search_query.py +0 -0
- {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.1}/src/ffbb_data_client/models/multi_search_result_competitions.py +0 -0
- {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.1}/src/ffbb_data_client/models/multi_search_result_engagements.py +0 -0
- {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.1}/src/ffbb_data_client/models/multi_search_result_formations.py +0 -0
- {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.1}/src/ffbb_data_client/models/multi_search_result_organismes.py +0 -0
- {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.1}/src/ffbb_data_client/models/multi_search_result_pratiques.py +0 -0
- {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.1}/src/ffbb_data_client/models/multi_search_result_rencontres.py +0 -0
- {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.1}/src/ffbb_data_client/models/multi_search_result_salles.py +0 -0
- {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.1}/src/ffbb_data_client/models/multi_search_result_terrains.py +0 -0
- {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.1}/src/ffbb_data_client/models/multi_search_result_tournois.py +0 -0
- {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.1}/src/ffbb_data_client/models/multi_search_results.py +0 -0
- {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.1}/src/ffbb_data_client/models/multi_search_results_class.py +0 -0
- {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.1}/src/ffbb_data_client/models/nature_sol.py +0 -0
- {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.1}/src/ffbb_data_client/models/niveau.py +0 -0
- {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.1}/src/ffbb_data_client/models/niveau_class.py +0 -0
- {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.1}/src/ffbb_data_client/models/niveau_extractor.py +0 -0
- {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.1}/src/ffbb_data_client/models/niveau_info.py +0 -0
- {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.1}/src/ffbb_data_client/models/niveau_models.py +0 -0
- {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.1}/src/ffbb_data_client/models/niveau_type.py +0 -0
- {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.1}/src/ffbb_data_client/models/objectif.py +0 -0
- {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.1}/src/ffbb_data_client/models/organisateur.py +0 -0
- {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.1}/src/ffbb_data_client/models/organisateur_type.py +0 -0
- {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.1}/src/ffbb_data_client/models/organisme_fields.py +0 -0
- {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.1}/src/ffbb_data_client/models/organisme_id_pere.py +0 -0
- {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.1}/src/ffbb_data_client/models/organismes_facet_distribution.py +0 -0
- {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.1}/src/ffbb_data_client/models/organismes_facet_stats.py +0 -0
- {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.1}/src/ffbb_data_client/models/organismes_hit.py +0 -0
- {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.1}/src/ffbb_data_client/models/organismes_multi_search_query.py +0 -0
- {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.1}/src/ffbb_data_client/models/organismes_query.py +0 -0
- {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.1}/src/ffbb_data_client/models/phase_code.py +0 -0
- {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.1}/src/ffbb_data_client/models/poule.py +0 -0
- {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.1}/src/ffbb_data_client/models/poule_fields.py +0 -0
- {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.1}/src/ffbb_data_client/models/poule_rencontre_item_model.py +0 -0
- {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.1}/src/ffbb_data_client/models/poules_models.py +0 -0
- {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.1}/src/ffbb_data_client/models/poules_query.py +0 -0
- {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.1}/src/ffbb_data_client/models/pratique.py +0 -0
- {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.1}/src/ffbb_data_client/models/pratiques_facet_distribution.py +0 -0
- {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.1}/src/ffbb_data_client/models/pratiques_facet_stats.py +0 -0
- {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.1}/src/ffbb_data_client/models/pratiques_hit.py +0 -0
- {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.1}/src/ffbb_data_client/models/pratiques_hit_type.py +0 -0
- {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.1}/src/ffbb_data_client/models/pratiques_multi_search_query.py +0 -0
- {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.1}/src/ffbb_data_client/models/pratiques_type_class.py +0 -0
- {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.1}/src/ffbb_data_client/models/publication_internet.py +0 -0
- {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.1}/src/ffbb_data_client/models/purple_logo.py +0 -0
- {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.1}/src/ffbb_data_client/models/query_fields_manager.py +0 -0
- {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.1}/src/ffbb_data_client/models/ranking_engagement.py +0 -0
- {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.1}/src/ffbb_data_client/models/rankings_models.py +0 -0
- {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.1}/src/ffbb_data_client/models/rencontres_engagement.py +0 -0
- {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.1}/src/ffbb_data_client/models/rencontres_facet_distribution.py +0 -0
- {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.1}/src/ffbb_data_client/models/rencontres_facet_stats.py +0 -0
- {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.1}/src/ffbb_data_client/models/rencontres_hit.py +0 -0
- {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.1}/src/ffbb_data_client/models/rencontres_multi_search_query.py +0 -0
- {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.1}/src/ffbb_data_client/models/saison.py +0 -0
- {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.1}/src/ffbb_data_client/models/saison_fields.py +0 -0
- {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.1}/src/ffbb_data_client/models/saisons_models.py +0 -0
- {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.1}/src/ffbb_data_client/models/saisons_query.py +0 -0
- {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.1}/src/ffbb_data_client/models/salle.py +0 -0
- {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.1}/src/ffbb_data_client/models/salles_facet_distribution.py +0 -0
- {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.1}/src/ffbb_data_client/models/salles_facet_stats.py +0 -0
- {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.1}/src/ffbb_data_client/models/salles_hit.py +0 -0
- {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.1}/src/ffbb_data_client/models/salles_multi_search_query.py +0 -0
- {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.1}/src/ffbb_data_client/models/sexe.py +0 -0
- {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.1}/src/ffbb_data_client/models/sexe_class.py +0 -0
- {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.1}/src/ffbb_data_client/models/source.py +0 -0
- {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.1}/src/ffbb_data_client/models/status.py +0 -0
- {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.1}/src/ffbb_data_client/models/team_engagement.py +0 -0
- {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.1}/src/ffbb_data_client/models/team_ranking.py +0 -0
- {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.1}/src/ffbb_data_client/models/terrains_categorie_championnat_3x3_libelle.py +0 -0
- {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.1}/src/ffbb_data_client/models/terrains_facet_distribution.py +0 -0
- {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.1}/src/ffbb_data_client/models/terrains_facet_stats.py +0 -0
- {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.1}/src/ffbb_data_client/models/terrains_hit.py +0 -0
- {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.1}/src/ffbb_data_client/models/terrains_multi_search_query.py +0 -0
- {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.1}/src/ffbb_data_client/models/terrains_name.py +0 -0
- {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.1}/src/ffbb_data_client/models/terrains_sexe_enum.py +0 -0
- {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.1}/src/ffbb_data_client/models/terrains_storage.py +0 -0
- {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.1}/src/ffbb_data_client/models/tournoi_type_class.py +0 -0
- {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.1}/src/ffbb_data_client/models/tournoi_type_enum.py +0 -0
- {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.1}/src/ffbb_data_client/models/tournoi_types_3x3.py +0 -0
- {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.1}/src/ffbb_data_client/models/tournoi_types_3x3_libelle.py +0 -0
- {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.1}/src/ffbb_data_client/models/tournoi_types_3x3_libelle_enum.py +0 -0
- {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.1}/src/ffbb_data_client/models/tournois_facet_distribution.py +0 -0
- {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.1}/src/ffbb_data_client/models/tournois_facet_stats.py +0 -0
- {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.1}/src/ffbb_data_client/models/tournois_hit.py +0 -0
- {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.1}/src/ffbb_data_client/models/tournois_hit_type.py +0 -0
- {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.1}/src/ffbb_data_client/models/tournois_libelle.py +0 -0
- {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.1}/src/ffbb_data_client/models/tournois_multi_search_query.py +0 -0
- {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.1}/src/ffbb_data_client/models/type_association.py +0 -0
- {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.1}/src/ffbb_data_client/models/type_association_libelle.py +0 -0
- {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.1}/src/ffbb_data_client/models/type_class.py +0 -0
- {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.1}/src/ffbb_data_client/models/type_competition.py +0 -0
- {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.1}/src/ffbb_data_client/models/type_competition_generique.py +0 -0
- {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.1}/src/ffbb_data_client/models/type_enum.py +0 -0
- {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.1}/src/ffbb_data_client/models/type_league.py +0 -0
- {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.1}/src/ffbb_data_client/py.typed +0 -0
- {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.1}/src/ffbb_data_client/utils/converter_utils.py +0 -0
- {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.1}/src/ffbb_data_client/utils/input_validation.py +0 -0
- {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.1}/src/ffbb_data_client/utils/secure_logging.py +0 -0
- {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.1}/src/ffbb_data_client.egg-info/dependency_links.txt +0 -0
- {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.1}/src/ffbb_data_client.egg-info/not-zip-safe +0 -0
- {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.1}/src/ffbb_data_client.egg-info/top_level.txt +0 -0
- {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.1}/tests/conftest.py +0 -0
- {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.1}/tests/e2e/__init__.py +0 -0
- {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.1}/tests/e2e/conftest.py +0 -0
- {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.1}/tests/integration/__init__.py +0 -0
- {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.1}/tests/integration/conftest.py +0 -0
- {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.1}/tests/integration/test_500_user_journey.py +0 -0
- {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.1}/tests/integration/test_501_user_journey_v3.py +0 -0
- {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.1}/tests/integration/test_502_enhanced_integration.py +0 -0
- {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.1}/tests/integration/test_503_secure_logging.py +0 -0
- {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.1}/tests/integration/test_504_input_validation.py +0 -0
- {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.1}/tests/integration/test_505_retry_timeout.py +0 -0
- {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.1}/tests/integration/test_506_raw_json_model_conversion.py +0 -0
- {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.1}/tests/unit/__init__.py +0 -0
- {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.1}/tests/unit/clients/__init__.py +0 -0
- {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.1}/tests/unit/clients/test_200_api_ffbb_app_client.py +0 -0
- {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.1}/tests/unit/clients/test_203_meilisearch_client_extension.py +0 -0
- {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.1}/tests/unit/clients/test_204_ffbb_data_client.py +0 -0
- {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.1}/tests/unit/clients/test_205_meilisearch_ffbb_client.py +0 -0
- {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.1}/tests/unit/clients/test_206_coverage_gaps_clients.py +0 -0
- {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.1}/tests/unit/clients/test_207_coverage_clients_extended.py +0 -0
- {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.1}/tests/unit/clients/test_208_new_methods_coverage.py +0 -0
- {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.1}/tests/unit/clients/test_209_automatic_token_resolution.py +0 -0
- {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.1}/tests/unit/clients/test_210_targeted_clients_helpers_coverage.py +0 -0
- {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.1}/tests/unit/clients/test_async_methods.py +0 -0
- {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.1}/tests/unit/clients/test_meilisearch_async.py +0 -0
- {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.1}/tests/unit/clients/test_v2_backport_search.py +0 -0
- {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.1}/tests/unit/clients/test_v3_new_features.py +0 -0
- {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.1}/tests/unit/conftest.py +0 -0
- {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.1}/tests/unit/helpers/__init__.py +0 -0
- {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.1}/tests/unit/helpers/test_meilisearch_client_extension_recursive_pagination.py +0 -0
- {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.1}/tests/unit/models/__init__.py +0 -0
- {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.1}/tests/unit/models/test_100_competition_id_categorie.py +0 -0
- {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.1}/tests/unit/models/test_101_competition_id_sexe.py +0 -0
- {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.1}/tests/unit/models/test_102_competition_id_type_competition.py +0 -0
- {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.1}/tests/unit/models/test_103_competition_id_type_competition_generique.py +0 -0
- {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.1}/tests/unit/models/test_104_competition_origine_categorie.py +0 -0
- {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.1}/tests/unit/models/test_105_competition_origine_type_competition_generique.py +0 -0
- {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.1}/tests/unit/models/test_106_competition_origine.py +0 -0
- {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.1}/tests/unit/models/test_107_id_engagement_equipe.py +0 -0
- {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.1}/tests/unit/models/test_108_id_organisme_equipe.py +0 -0
- {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.1}/tests/unit/models/test_109_id_organisme_equipe1_logo.py +0 -0
- {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.1}/tests/unit/models/test_110_labellisation.py +0 -0
- {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.1}/tests/unit/models/test_111_niveau_class.py +0 -0
- {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.1}/tests/unit/models/test_112_purple_logo.py +0 -0
- {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.1}/tests/unit/models/test_113_salle.py +0 -0
- {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.1}/tests/unit/models/test_114_tournoi_type_class.py +0 -0
- {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.1}/tests/unit/models/test_115_type_association_libelle.py +0 -0
- {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.1}/tests/unit/models/test_116_type_competition_generique.py +0 -0
- {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.1}/tests/unit/models/test_117_organisateur.py +0 -0
- {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.1}/tests/unit/models/test_118_competition_id.py +0 -0
- {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.1}/tests/unit/models/test_119_terrains_inner_models.py +0 -0
- {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.1}/tests/unit/models/test_120_pratiques_inner_models.py +0 -0
- {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.1}/tests/unit/models/test_121_to_dict_round_trip.py +0 -0
- {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.1}/tests/unit/models/test_122_coverage_gaps.py +0 -0
- {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.1}/tests/unit/models/test_123_missing_coverage.py +0 -0
- {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.1}/tests/unit/models/test_123_v2_backport.py +0 -0
- {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.1}/tests/unit/models/test_124_targeted_coverage_gains.py +0 -0
- {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.1}/tests/unit/models/test_dx_aliases.py +0 -0
- {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.1}/tests/unit/utils/__init__.py +0 -0
- {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.1}/tests/unit/utils/test_300_secure_logging.py +0 -0
- {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.1}/tests/unit/utils/test_301_input_validation.py +0 -0
- {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.1}/tests/unit/utils/test_302_retry_utils.py +0 -0
- {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.1}/tests/unit/utils/test_304_config.py +0 -0
- {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.1}/tests/unit/utils/test_306_converter_utils.py +0 -0
- {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.1}/tests/unit/utils/test_307_coverage_gaps_utils.py +0 -0
- {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.1}/tests/unit/utils/test_308_converter_utils_extended.py +0 -0
- {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.1}/tox.ini +0 -0
- {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.1}/website/assets/logo.webp +0 -0
- {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.1}/website/css/style.css +0 -0
- {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.1}/website/robots.txt +0 -0
- {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.1}/website/sitemap.xml +0 -0
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
name: 🐛 Signalement de bug
|
|
2
|
+
description: Signaler un problème ou un comportement inattendu dans ffbb-data-client.
|
|
3
|
+
title: "[BUG] "
|
|
4
|
+
labels: ["bug"]
|
|
5
|
+
body:
|
|
6
|
+
- type: markdown
|
|
7
|
+
attributes:
|
|
8
|
+
value: |
|
|
9
|
+
Merci de prendre le temps de signaler ce bug ! Vos retours nous aident à améliorer `ffbb-data-client`.
|
|
10
|
+
- type: textarea
|
|
11
|
+
id: description
|
|
12
|
+
attributes:
|
|
13
|
+
label: Description du bug
|
|
14
|
+
description: Une description claire et concise de ce qu'est le bug.
|
|
15
|
+
placeholder: Quel est le problème rencontré ?
|
|
16
|
+
validations:
|
|
17
|
+
required: true
|
|
18
|
+
- type: textarea
|
|
19
|
+
id: reproduction
|
|
20
|
+
attributes:
|
|
21
|
+
label: Étapes pour reproduire
|
|
22
|
+
description: |
|
|
23
|
+
Expliquez comment nous pouvons reproduire le comportement. Un exemple de code minimal est grandement apprécié !
|
|
24
|
+
placeholder: |
|
|
25
|
+
1. Instancier le client `FFBBDataClient()`
|
|
26
|
+
2. Appeler la méthode `get_...` avec les paramètres ...
|
|
27
|
+
3. Voir l'erreur apparaitre
|
|
28
|
+
validations:
|
|
29
|
+
required: true
|
|
30
|
+
- type: textarea
|
|
31
|
+
id: expected
|
|
32
|
+
attributes:
|
|
33
|
+
label: Comportement attendu
|
|
34
|
+
description: Décrivez ce qui aurait dû se passer.
|
|
35
|
+
placeholder: Quel comportement ou résultat attendiez-vous ?
|
|
36
|
+
validations:
|
|
37
|
+
required: true
|
|
38
|
+
- type: textarea
|
|
39
|
+
id: environment
|
|
40
|
+
attributes:
|
|
41
|
+
label: Environnement de développement
|
|
42
|
+
description: Version de Python, OS, version du SDK, etc.
|
|
43
|
+
placeholder: |
|
|
44
|
+
- OS: macOS / Linux / Windows
|
|
45
|
+
- Python version: 3.11.x
|
|
46
|
+
- ffbb-data-client version: 1.x.x
|
|
47
|
+
validations:
|
|
48
|
+
required: true
|
|
49
|
+
- type: textarea
|
|
50
|
+
id: logs
|
|
51
|
+
attributes:
|
|
52
|
+
label: Stacktrace et logs additionnels
|
|
53
|
+
description: Copiez-collez les logs ou les traces d'erreur ici si nécessaire.
|
|
54
|
+
render: python
|
|
55
|
+
- type: checkboxes
|
|
56
|
+
id: checks
|
|
57
|
+
attributes:
|
|
58
|
+
label: Avant de soumettre
|
|
59
|
+
description: "Veuillez vérifier les points suivants :"
|
|
60
|
+
options:
|
|
61
|
+
- label: J'ai recherché dans les issues existantes si ce problème n'avait pas déjà été signalé.
|
|
62
|
+
required: true
|
|
63
|
+
- label: J'ai testé mon code en local et validé le fonctionnement.
|
|
64
|
+
required: true
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
name: ✨ Proposition de fonctionnalité
|
|
2
|
+
description: Suggérer une idée ou une amélioration pour ffbb-data-client.
|
|
3
|
+
title: "[FEATURE] "
|
|
4
|
+
labels: ["enhancement"]
|
|
5
|
+
body:
|
|
6
|
+
- type: markdown
|
|
7
|
+
attributes:
|
|
8
|
+
value: |
|
|
9
|
+
Vous avez une idée pour rendre `ffbb-data-client` encore plus performant ? Proposez-la ici !
|
|
10
|
+
- type: textarea
|
|
11
|
+
id: problem
|
|
12
|
+
attributes:
|
|
13
|
+
label: Est-ce que votre proposition résout un problème existant ?
|
|
14
|
+
description: Une description claire et concise du problème ou du besoin non couvert.
|
|
15
|
+
placeholder: Je rencontre des difficultés lorsque j'essaie de...
|
|
16
|
+
validations:
|
|
17
|
+
required: true
|
|
18
|
+
- type: textarea
|
|
19
|
+
id: solution
|
|
20
|
+
attributes:
|
|
21
|
+
label: Description de la solution proposée
|
|
22
|
+
description: Décrivez clairement la fonctionnalité ou l'évolution que vous imaginez.
|
|
23
|
+
placeholder: J'aimerais que le SDK permette de...
|
|
24
|
+
validations:
|
|
25
|
+
required: true
|
|
26
|
+
- type: textarea
|
|
27
|
+
id: alternatives
|
|
28
|
+
attributes:
|
|
29
|
+
label: Alternatives envisagées
|
|
30
|
+
description: Avez-vous pensé à des solutions de contournement ou à d'autres façons de faire ?
|
|
31
|
+
placeholder: J'ai essayé d'écrire une fonction utilitaire à côté, mais...
|
|
32
|
+
- type: textarea
|
|
33
|
+
id: context
|
|
34
|
+
attributes:
|
|
35
|
+
label: Contexte additionnel
|
|
36
|
+
description: Ajoutez toute autre information, cas d'usage, ou lien vers de la documentation de l'API FFBB ici.
|
|
37
|
+
placeholder: Lien vers l'API, exemple de JSON retourné par l'API, etc.
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
## 📝 Description
|
|
2
|
+
|
|
3
|
+
Fournissez une description claire des modifications proposées dans cette Pull Request et de leurs motivations.
|
|
4
|
+
|
|
5
|
+
> Résout : # (indiquez l'issue associée ici, ex: #123)
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## 🛠️ Type de changement
|
|
10
|
+
|
|
11
|
+
Veuillez cocher l'option qui s'applique à votre Pull Request :
|
|
12
|
+
|
|
13
|
+
- [ ] 🐛 Correction de bug (changement non bloquant qui résout un dysfonctionnement)
|
|
14
|
+
- [ ] ✨ Nouvelle fonctionnalité (changement non bloquant qui ajoute une fonctionnalité)
|
|
15
|
+
- [ ] 💥 Changement majeur / breaking change (correction ou fonctionnalité qui modifie le comportement existant)
|
|
16
|
+
- [ ] ⚙️ Refactoring / Amélioration de code (optimisation du code sans changement de fonctionnalité)
|
|
17
|
+
- [ ] 📖 Documentation (modification ou ajout à la documentation ou aux commentaires de code)
|
|
18
|
+
- [ ] 🚨 Tests (ajout ou mise à jour de la couverture de tests)
|
|
19
|
+
|
|
20
|
+
---
|
|
21
|
+
|
|
22
|
+
## 🔍 Comment cela a-t-il été testé ?
|
|
23
|
+
|
|
24
|
+
Veuillez détailler les tests effectués pour valider vos modifications (ex: tests unitaires ajoutés, tests d'intégration, ou vérification manuelle).
|
|
25
|
+
|
|
26
|
+
*Exemple :*
|
|
27
|
+
- [ ] Test unitaire `tests/unit/clients/test_xyz.py` exécuté et validé.
|
|
28
|
+
- [ ] Validation complète de la suite via Tox.
|
|
29
|
+
|
|
30
|
+
---
|
|
31
|
+
|
|
32
|
+
## ✅ Checklist de validation
|
|
33
|
+
|
|
34
|
+
Avant de soumettre cette Pull Request, veuillez vérifier et cocher les points suivants :
|
|
35
|
+
|
|
36
|
+
- [ ] Mon code respecte le style et les règles de conception décrits dans les directives du projet.
|
|
37
|
+
- [ ] J'ai documenté les nouvelles fonctionnalités ou modifications dans le code (docstrings, typage Pydantic).
|
|
38
|
+
- [ ] J'ai ajouté des tests couvrant mes modifications.
|
|
39
|
+
- [ ] Tous les tests existants et nouveaux passent avec succès (`rtk pytest`).
|
|
40
|
+
- [ ] J'ai exécuté le formatage et le linter localement (`rtk ruff format . && rtk ruff check .`).
|
|
41
|
+
- [ ] J'ai vérifié la conformité des types statiques avec `rtk mypy src`.
|
|
42
|
+
- [ ] La validation `rtk pre-commit run --all-files` s'exécute localement sans aucune erreur.
|
|
43
|
+
- [ ] Je n'ai pas modifié manuellement le fichier `AGENTS.md` (qui est géré de manière autonome par les scripts).
|
|
44
|
+
|
|
45
|
+
> ⚠️ **Rappel crucial** : Toutes les commandes exécutées localement dans votre terminal doivent obligatoirement être préfixées par **`rtk`** (ex: `rtk pytest`, `rtk tox`, etc.).
|
|
@@ -0,0 +1,273 @@
|
|
|
1
|
+
const fs = require('fs');
|
|
2
|
+
const https = require('https');
|
|
3
|
+
|
|
4
|
+
// Configuration depuis les variables d'environnement
|
|
5
|
+
const GITHUB_TOKEN = process.env.GITHUB_TOKEN;
|
|
6
|
+
const GEMINI_API_KEY = process.env.GEMINI_API_KEY;
|
|
7
|
+
const GITHUB_REPOSITORY = process.env.GITHUB_REPOSITORY; // ex: "owner/repo"
|
|
8
|
+
const PR_NUMBER = process.env.GITHUB_PR_NUMBER;
|
|
9
|
+
|
|
10
|
+
if (!GITHUB_TOKEN || !GEMINI_API_KEY || !GITHUB_REPOSITORY || !PR_NUMBER) {
|
|
11
|
+
console.error("Erreur: Variables d'environnement manquantes (GITHUB_TOKEN, GEMINI_API_KEY, GITHUB_REPOSITORY, GITHUB_PR_NUMBER).");
|
|
12
|
+
process.exit(1);
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
// Configuration des extensions de fichiers à analyser
|
|
16
|
+
const SUPPORTED_EXTENSIONS = [
|
|
17
|
+
'.js', '.ts', '.jsx', '.tsx', '.py', '.sh', '.yml', '.yaml',
|
|
18
|
+
'.json', '.css', '.html', '.go', '.rs', '.c', '.cpp', '.h',
|
|
19
|
+
'.conf', '.ini', '.md'
|
|
20
|
+
];
|
|
21
|
+
|
|
22
|
+
// Fichiers à ignorer explicitement
|
|
23
|
+
const IGNORED_FILES = [
|
|
24
|
+
'package-lock.json', 'pnpm-lock.yaml', 'yarn.lock', 'composer.lock',
|
|
25
|
+
'AGENTS.md', 'task.md', 'implementation_plan.md', 'walkthrough.md'
|
|
26
|
+
];
|
|
27
|
+
|
|
28
|
+
// Fonction utilitaire pour faire des requêtes HTTPS asynchrones
|
|
29
|
+
function makeRequest(options, postData = null) {
|
|
30
|
+
return new Promise((resolve, reject) => {
|
|
31
|
+
const req = https.request(options, (res) => {
|
|
32
|
+
let data = '';
|
|
33
|
+
res.on('data', (chunk) => { data += chunk; });
|
|
34
|
+
res.on('end', () => {
|
|
35
|
+
if (res.statusCode >= 200 && res.statusCode < 300) {
|
|
36
|
+
resolve(data);
|
|
37
|
+
} else {
|
|
38
|
+
reject(new Error(`Status Code: ${res.statusCode}. Response: ${data}`));
|
|
39
|
+
}
|
|
40
|
+
});
|
|
41
|
+
});
|
|
42
|
+
|
|
43
|
+
req.on('error', (err) => { reject(err); });
|
|
44
|
+
|
|
45
|
+
if (postData) {
|
|
46
|
+
req.write(typeof postData === 'string' ? postData : JSON.stringify(postData));
|
|
47
|
+
}
|
|
48
|
+
req.end();
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
// Fonction pour récupérer la liste des lignes ajoutées ou modifiées dans un patch
|
|
53
|
+
function getAddedLines(patch) {
|
|
54
|
+
if (!patch) return [];
|
|
55
|
+
const lines = patch.split('\n');
|
|
56
|
+
const addedLines = [];
|
|
57
|
+
let currentNewLineNum = 0;
|
|
58
|
+
|
|
59
|
+
for (const line of lines) {
|
|
60
|
+
const chunkHeader = line.match(/^@@ -\d+(?:,\d+)? \+(\d+)(?:,\d+)? @@/);
|
|
61
|
+
if (chunkHeader) {
|
|
62
|
+
currentNewLineNum = parseInt(chunkHeader[1], 10);
|
|
63
|
+
continue;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
if (line.startsWith('+')) {
|
|
67
|
+
if (!line.startsWith('+++')) { // Éviter l'en-tête du fichier
|
|
68
|
+
addedLines.push(currentNewLineNum);
|
|
69
|
+
}
|
|
70
|
+
currentNewLineNum++;
|
|
71
|
+
} else if (line.startsWith('-')) {
|
|
72
|
+
// Ligne supprimée (n'existe pas dans le nouveau fichier)
|
|
73
|
+
} else {
|
|
74
|
+
// Ligne inchangée
|
|
75
|
+
currentNewLineNum++;
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
return addedLines;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
async function run() {
|
|
82
|
+
try {
|
|
83
|
+
console.log(`Démarrage de la revue IA pour la PR #${PR_NUMBER} du dépôt ${GITHUB_REPOSITORY}...`);
|
|
84
|
+
|
|
85
|
+
// 1. Récupérer les détails de la PR (notamment pour avoir le SHA de commit de tête)
|
|
86
|
+
console.log("Récupération des détails de la PR...");
|
|
87
|
+
const prDetailsOptions = {
|
|
88
|
+
hostname: 'api.github.com',
|
|
89
|
+
path: `/repos/${GITHUB_REPOSITORY}/pulls/${PR_NUMBER}`,
|
|
90
|
+
method: 'GET',
|
|
91
|
+
headers: {
|
|
92
|
+
'Authorization': `Bearer ${GITHUB_TOKEN}`,
|
|
93
|
+
'Accept': 'application/vnd.github.v3+json',
|
|
94
|
+
'User-Agent': 'AI-PR-Reviewer-Action'
|
|
95
|
+
}
|
|
96
|
+
};
|
|
97
|
+
const prDetailsRaw = await makeRequest(prDetailsOptions);
|
|
98
|
+
const prDetails = JSON.parse(prDetailsRaw);
|
|
99
|
+
const commitSha = prDetails.head.sha;
|
|
100
|
+
console.log(`SHA du dernier commit: ${commitSha}`);
|
|
101
|
+
|
|
102
|
+
// 2. Récupérer les fichiers modifiés dans la PR
|
|
103
|
+
console.log("Récupération des fichiers de la PR...");
|
|
104
|
+
const prFilesOptions = {
|
|
105
|
+
hostname: 'api.github.com',
|
|
106
|
+
path: `/repos/${GITHUB_REPOSITORY}/pulls/${PR_NUMBER}/files?per_page=100`,
|
|
107
|
+
method: 'GET',
|
|
108
|
+
headers: {
|
|
109
|
+
'Authorization': `Bearer ${GITHUB_TOKEN}`,
|
|
110
|
+
'Accept': 'application/vnd.github.v3+json',
|
|
111
|
+
'User-Agent': 'AI-PR-Reviewer-Action'
|
|
112
|
+
}
|
|
113
|
+
};
|
|
114
|
+
const prFilesRaw = await makeRequest(prFilesOptions);
|
|
115
|
+
const files = JSON.parse(prFilesRaw);
|
|
116
|
+
|
|
117
|
+
// Filtrer les fichiers de code pertinents
|
|
118
|
+
const filesToAnalyze = files.filter(file => {
|
|
119
|
+
const isIgnored = IGNORED_FILES.some(ignored => file.filename.endsWith(ignored));
|
|
120
|
+
if (isIgnored) return false;
|
|
121
|
+
|
|
122
|
+
const isSupported = SUPPORTED_EXTENSIONS.some(ext => file.filename.endsWith(ext));
|
|
123
|
+
const hasPatch = !!file.patch;
|
|
124
|
+
return isSupported && hasPatch;
|
|
125
|
+
});
|
|
126
|
+
|
|
127
|
+
if (filesToAnalyze.length === 0) {
|
|
128
|
+
console.log("Aucun fichier de code modifiable ou pertinent n'a été trouvé à analyser.");
|
|
129
|
+
return;
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
console.log(`${filesToAnalyze.length} fichiers retenus pour analyse.`);
|
|
133
|
+
|
|
134
|
+
// 3. Préparer les données pour Gemini
|
|
135
|
+
const fileDiffData = filesToAnalyze.map(file => {
|
|
136
|
+
const addedLines = getAddedLines(file.patch);
|
|
137
|
+
return {
|
|
138
|
+
filename: file.filename,
|
|
139
|
+
patch: file.patch,
|
|
140
|
+
validLinesForComments: addedLines
|
|
141
|
+
};
|
|
142
|
+
});
|
|
143
|
+
|
|
144
|
+
// 4. Appeler l'API Gemini
|
|
145
|
+
console.log("Envoi des modifications à l'API Gemini...");
|
|
146
|
+
|
|
147
|
+
const systemInstruction = `Tu es un expert en revue de code (ingénieur logiciel principal). Ton rôle est d'analyser les modifications d'une Pull Request (les diffs fournis avec leurs patches) et de générer une revue technique constructive et précise.
|
|
148
|
+
|
|
149
|
+
Consignes impératives :
|
|
150
|
+
1. Tu dois analyser chaque fichier et générer des commentaires ciblés uniquement si cela est nécessaire (bugs, failles de sécurité, optimisations majeures de performance, mauvaise gestion d'erreurs, lisibilité).
|
|
151
|
+
2. Pour chaque commentaire, tu DOIS fournir un numéro de ligne ('line') qui fait partie de la liste des lignes valides ('validLinesForComments') fournie pour ce fichier. Ne commente jamais sur une ligne en dehors de cette liste, sinon l'API GitHub lèvera une erreur.
|
|
152
|
+
3. Rédige tes commentaires en français, de manière claire et technique. Tu peux proposer du code de correction sous forme de bloc de code markdown.
|
|
153
|
+
4. Rends ton verdict global dans le champ 'verdict' :
|
|
154
|
+
- 'APPROVE' : Si le code est excellent et prêt à être fusionné (aucun commentaire requis).
|
|
155
|
+
- 'COMMENT' : Si tu as des suggestions ou questions mineures mais non bloquantes.
|
|
156
|
+
- 'REQUEST_CHANGES' : Si tu as trouvé des bugs sérieux, des failles de sécurité, ou des problèmes de performance bloquants.
|
|
157
|
+
5. Tu dois obligatoirement répondre en JSON respectant exactement le schéma suivant :
|
|
158
|
+
{
|
|
159
|
+
"verdict": "APPROVE" | "COMMENT" | "REQUEST_CHANGES",
|
|
160
|
+
"summary": "Résumé textuel global de ta revue.",
|
|
161
|
+
"comments": [
|
|
162
|
+
{
|
|
163
|
+
"path": "chemin/du/fichier.js",
|
|
164
|
+
"line": 42,
|
|
165
|
+
"body": "Explication du problème ou suggestion de correction..."
|
|
166
|
+
}
|
|
167
|
+
]
|
|
168
|
+
}`;
|
|
169
|
+
|
|
170
|
+
const promptUser = `Voici les fichiers modifiés et leurs diffs pour la Pull Request #${PR_NUMBER}.
|
|
171
|
+
Analyse-les attentivement et génère ta revue de code structurée au format JSON.
|
|
172
|
+
|
|
173
|
+
Données de la Pull Request :
|
|
174
|
+
${JSON.stringify(fileDiffData, null, 2)}`;
|
|
175
|
+
|
|
176
|
+
const geminiPayload = {
|
|
177
|
+
contents: [
|
|
178
|
+
{
|
|
179
|
+
parts: [
|
|
180
|
+
{ text: promptUser }
|
|
181
|
+
]
|
|
182
|
+
}
|
|
183
|
+
],
|
|
184
|
+
systemInstruction: {
|
|
185
|
+
parts: [
|
|
186
|
+
{ text: systemInstruction }
|
|
187
|
+
]
|
|
188
|
+
},
|
|
189
|
+
generationConfig: {
|
|
190
|
+
responseMimeType: "application/json"
|
|
191
|
+
}
|
|
192
|
+
};
|
|
193
|
+
|
|
194
|
+
const geminiUrl = `https://generativelanguage.googleapis.com/v1beta/models/gemini-2.5-flash:generateContent?key=${GEMINI_API_KEY}`;
|
|
195
|
+
const urlObj = new URL(geminiUrl);
|
|
196
|
+
|
|
197
|
+
const geminiOptions = {
|
|
198
|
+
hostname: urlObj.hostname,
|
|
199
|
+
path: urlObj.pathname + urlObj.search,
|
|
200
|
+
method: 'POST',
|
|
201
|
+
headers: {
|
|
202
|
+
'Content-Type': 'application/json'
|
|
203
|
+
}
|
|
204
|
+
};
|
|
205
|
+
|
|
206
|
+
const geminiResponseRaw = await makeRequest(geminiOptions, geminiPayload);
|
|
207
|
+
const geminiResponse = JSON.parse(geminiResponseRaw);
|
|
208
|
+
|
|
209
|
+
// Extraire le texte de la réponse
|
|
210
|
+
const responseText = geminiResponse.candidates[0].content.parts[0].text;
|
|
211
|
+
const reviewResult = JSON.parse(responseText);
|
|
212
|
+
|
|
213
|
+
console.log(`Verdict de l'IA : ${reviewResult.verdict}`);
|
|
214
|
+
console.log(`Résumé : ${reviewResult.summary}`);
|
|
215
|
+
console.log(`Nombre de commentaires générés : ${reviewResult.comments ? reviewResult.comments.length : 0}`);
|
|
216
|
+
|
|
217
|
+
// Filtrer les commentaires pour s'assurer qu'ils ciblent des lignes valides
|
|
218
|
+
const validComments = [];
|
|
219
|
+
if (reviewResult.comments && Array.isArray(reviewResult.comments)) {
|
|
220
|
+
for (const comment of reviewResult.comments) {
|
|
221
|
+
const fileData = fileDiffData.find(f => f.filename === comment.path);
|
|
222
|
+
if (fileData) {
|
|
223
|
+
if (fileData.validLinesForComments.includes(Number(comment.line))) {
|
|
224
|
+
validComments.push({
|
|
225
|
+
path: comment.path,
|
|
226
|
+
line: Number(comment.line),
|
|
227
|
+
side: 'RIGHT',
|
|
228
|
+
body: comment.body
|
|
229
|
+
});
|
|
230
|
+
} else {
|
|
231
|
+
console.warn(`Avertissement : L'IA a proposé un commentaire pour ${comment.path} à la ligne ${comment.line}, mais cette ligne n'est pas modifiée dans la PR. Commentaire ignoré.`);
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
// 5. Soumettre la revue sur GitHub
|
|
238
|
+
console.log("Publication de la revue sur GitHub...");
|
|
239
|
+
const reviewPayload = {
|
|
240
|
+
commit_id: commitSha,
|
|
241
|
+
body: `### 🤖 Revue automatique par l'IA (Gemini)
|
|
242
|
+
|
|
243
|
+
**Verdict :** ${reviewResult.verdict === 'APPROVE' ? '✅ Approuvé' : reviewResult.verdict === 'REQUEST_CHANGES' ? '❌ Changements demandés' : '💬 Commentaires'}
|
|
244
|
+
|
|
245
|
+
${reviewResult.summary}
|
|
246
|
+
|
|
247
|
+
_Cette revue a été générée automatiquement par l'agent IA._`,
|
|
248
|
+
event: reviewResult.verdict,
|
|
249
|
+
comments: validComments
|
|
250
|
+
};
|
|
251
|
+
|
|
252
|
+
const submitReviewOptions = {
|
|
253
|
+
hostname: 'api.github.com',
|
|
254
|
+
path: `/repos/${GITHUB_REPOSITORY}/pulls/${PR_NUMBER}/reviews`,
|
|
255
|
+
method: 'POST',
|
|
256
|
+
headers: {
|
|
257
|
+
'Authorization': `Bearer ${GITHUB_TOKEN}`,
|
|
258
|
+
'Accept': 'application/vnd.github.v3+json',
|
|
259
|
+
'User-Agent': 'AI-PR-Reviewer-Action',
|
|
260
|
+
'Content-Type': 'application/json'
|
|
261
|
+
}
|
|
262
|
+
};
|
|
263
|
+
|
|
264
|
+
await makeRequest(submitReviewOptions, reviewPayload);
|
|
265
|
+
console.log("Revue publiée avec succès !");
|
|
266
|
+
|
|
267
|
+
} catch (error) {
|
|
268
|
+
console.error("Une erreur est survenue lors de l'exécution de la revue IA :", error);
|
|
269
|
+
process.exit(1);
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
|
|
273
|
+
run();
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
const fs = require('fs');
|
|
2
|
+
const { execSync } = require('child_process');
|
|
3
|
+
|
|
4
|
+
const BASE_BRANCH = process.env.BASE_BRANCH || 'main';
|
|
5
|
+
const HEAD_BRANCH = process.env.HEAD_BRANCH;
|
|
6
|
+
|
|
7
|
+
if (!HEAD_BRANCH) {
|
|
8
|
+
console.log("Ce déclenchement n'est pas lié à une Pull Request (HEAD_BRANCH manquante). Passage de la résolution de conflits.");
|
|
9
|
+
process.exit(0);
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
const BOLT_PATH = '.jules/bolt.md';
|
|
13
|
+
|
|
14
|
+
// Fonction pour exécuter une commande shell de manière sécurisée
|
|
15
|
+
function runCmd(cmd) {
|
|
16
|
+
try {
|
|
17
|
+
return execSync(cmd, { stdio: 'pipe' }).toString().trim();
|
|
18
|
+
} catch (error) {
|
|
19
|
+
throw new Error(error.stderr ? error.stderr.toString() : error.message);
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
// Fonction pour résoudre le conflit dans le contenu du fichier bolt.md
|
|
24
|
+
function resolveBoltConflict(fileContent) {
|
|
25
|
+
const conflictRegex = /<<<<<<< HEAD([\s\S]*?)=======([\s\S]*?)>>>>>>> [^\n]*/g;
|
|
26
|
+
|
|
27
|
+
let resolvedContent = fileContent;
|
|
28
|
+
let hasConflict = false;
|
|
29
|
+
|
|
30
|
+
resolvedContent = resolvedContent.replace(conflictRegex, (match, headBlock, mainBlock) => {
|
|
31
|
+
hasConflict = true;
|
|
32
|
+
const headLines = headBlock.trim();
|
|
33
|
+
const mainLines = mainBlock.trim();
|
|
34
|
+
|
|
35
|
+
// Extraire les dates pour trier chronologiquement
|
|
36
|
+
const dateRegex = /## (\d{4}-\d{2}-\d{2})/;
|
|
37
|
+
const headDateMatch = headLines.match(dateRegex);
|
|
38
|
+
const mainDateMatch = mainLines.match(dateRegex);
|
|
39
|
+
|
|
40
|
+
if (headDateMatch && mainDateMatch) {
|
|
41
|
+
const headDate = headDateMatch[1];
|
|
42
|
+
const mainDate = mainDateMatch[1];
|
|
43
|
+
if (headDate > mainDate) {
|
|
44
|
+
return `${mainLines}\n\n${headLines}`;
|
|
45
|
+
} else {
|
|
46
|
+
return `${headLines}\n\n${mainLines}`;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
return `${headLines}\n\n${mainLines}`;
|
|
51
|
+
});
|
|
52
|
+
|
|
53
|
+
return { resolvedContent, hasConflict };
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
async function run() {
|
|
57
|
+
try {
|
|
58
|
+
console.log(`Vérification des conflits potentiels avec la branche de base : ${BASE_BRANCH}...`);
|
|
59
|
+
|
|
60
|
+
// 1. Configurer l'utilisateur Git local pour le commit automatique
|
|
61
|
+
runCmd('git config user.name "github-actions[bot]"');
|
|
62
|
+
runCmd('git config user.email "github-actions[bot]@users.noreply.github.com"');
|
|
63
|
+
|
|
64
|
+
// 2. Récupérer la branche de base
|
|
65
|
+
console.log(`Récupération de la branche origin/${BASE_BRANCH}...`);
|
|
66
|
+
runCmd(`git fetch origin ${BASE_BRANCH}`);
|
|
67
|
+
|
|
68
|
+
// 3. Tenter de fusionner la branche de base dans la branche actuelle
|
|
69
|
+
console.log(`Tentative de fusion de origin/${BASE_BRANCH}...`);
|
|
70
|
+
try {
|
|
71
|
+
runCmd(`git merge origin/${BASE_BRANCH} --no-edit`);
|
|
72
|
+
console.log("✅ Fusion réussie sans conflit.");
|
|
73
|
+
process.exit(0);
|
|
74
|
+
} catch (mergeError) {
|
|
75
|
+
console.log("⚠️ Conflits détectés lors de la fusion. Analyse de .jules/bolt.md...");
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
// 4. Si la fusion a échoué, vérifier s'il s'agit d'un conflit sur bolt.md
|
|
79
|
+
if (!fs.existsSync(BOLT_PATH)) {
|
|
80
|
+
console.log(`Le fichier ${BOLT_PATH} n'existe pas. Impossible de résoudre le conflit automatiquement.`);
|
|
81
|
+
runCmd('git merge --abort');
|
|
82
|
+
process.exit(1);
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
const content = fs.readFileSync(BOLT_PATH, 'utf8');
|
|
86
|
+
const { resolvedContent, hasConflict } = resolveBoltConflict(content);
|
|
87
|
+
|
|
88
|
+
if (!hasConflict) {
|
|
89
|
+
console.log("❌ Le conflit n'est pas situé dans .jules/bolt.md ou n'a pas pu être résolu automatiquement.");
|
|
90
|
+
runCmd('git merge --abort');
|
|
91
|
+
process.exit(1);
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
// 5. Enregistrer le fichier résolu et l'ajouter à git
|
|
95
|
+
console.log("Remplacement du fichier .jules/bolt.md avec la version fusionnée et triée...");
|
|
96
|
+
fs.writeFileSync(BOLT_PATH, resolvedContent, 'utf8');
|
|
97
|
+
runCmd(`git add ${BOLT_PATH}`);
|
|
98
|
+
|
|
99
|
+
// 6. Tenter de valider le merge
|
|
100
|
+
try {
|
|
101
|
+
runCmd('git commit -m "ci: resolve merge conflict in .jules/bolt.md by keeping both logs"');
|
|
102
|
+
console.log("✅ Conflit sur .jules/bolt.md résolu et commit de fusion créé.");
|
|
103
|
+
} catch (commitError) {
|
|
104
|
+
console.log("❌ Impossible de valider la fusion. Il reste probablement d'autres conflits dans d'autres fichiers.");
|
|
105
|
+
runCmd('git merge --abort');
|
|
106
|
+
process.exit(1);
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
// 7. Pousser la résolution vers la branche distante
|
|
110
|
+
console.log(`Poussée de la résolution vers origin/${HEAD_BRANCH}...`);
|
|
111
|
+
// On utilise l'authentification Git standard fournie par GitHub Actions
|
|
112
|
+
runCmd(`git push origin HEAD:${HEAD_BRANCH}`);
|
|
113
|
+
console.log("🎉 Conflit résolu et poussé sur la branche distante !");
|
|
114
|
+
|
|
115
|
+
} catch (error) {
|
|
116
|
+
console.error("Une erreur est survenue lors de la résolution du conflit :", error.message);
|
|
117
|
+
process.exit(1);
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
run();
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
name: AI Pull Request Reviewer
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
pull_request:
|
|
5
|
+
types: [opened, synchronize]
|
|
6
|
+
workflow_dispatch:
|
|
7
|
+
inputs:
|
|
8
|
+
pr_number:
|
|
9
|
+
description: 'Numéro de la Pull Request à analyser'
|
|
10
|
+
required: true
|
|
11
|
+
type: string
|
|
12
|
+
|
|
13
|
+
permissions:
|
|
14
|
+
pull-requests: write
|
|
15
|
+
contents: write
|
|
16
|
+
|
|
17
|
+
env:
|
|
18
|
+
FORCE_JAVASCRIPT_ACTIONS_TO_NODE24: true
|
|
19
|
+
|
|
20
|
+
jobs:
|
|
21
|
+
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
|
+
runs-on: ubuntu-latest
|
|
27
|
+
|
|
28
|
+
env:
|
|
29
|
+
GEMINI_API_KEY: ${{ secrets.GEMINI_API_KEY }}
|
|
30
|
+
|
|
31
|
+
steps:
|
|
32
|
+
- name: Checkout Repository
|
|
33
|
+
uses: actions/checkout@v6
|
|
34
|
+
with:
|
|
35
|
+
fetch-depth: 0 # Nécessaire pour avoir l'historique et faire le merge
|
|
36
|
+
|
|
37
|
+
- name: Setup Node.js
|
|
38
|
+
uses: actions/setup-node@v6
|
|
39
|
+
with:
|
|
40
|
+
node-version: 18
|
|
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
|
|
47
|
+
|
|
48
|
+
- name: Run AI Reviewer
|
|
49
|
+
if: env.GEMINI_API_KEY != ''
|
|
50
|
+
env:
|
|
51
|
+
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
|
52
|
+
GITHUB_PR_NUMBER: ${{ inputs.pr_number || github.event.pull_request.number }}
|
|
53
|
+
run: node .github/scripts/ai-pr-reviewer.js
|
{ffbb_data_client-2.3.0 → ffbb_data_client-2.3.1}/.github/workflows/check_wrapper_parity.yml
RENAMED
|
@@ -12,6 +12,10 @@ on:
|
|
|
12
12
|
- cron: '0 6 * * 1' # Every Monday at 06:00 UTC
|
|
13
13
|
workflow_dispatch:
|
|
14
14
|
|
|
15
|
+
concurrency:
|
|
16
|
+
group: check-wrapper-parity-${{ github.ref }}
|
|
17
|
+
cancel-in-progress: true
|
|
18
|
+
|
|
15
19
|
env:
|
|
16
20
|
FORCE_JAVASCRIPT_ACTIONS_TO_NODE24: true
|
|
17
21
|
|
|
@@ -23,12 +27,13 @@ jobs:
|
|
|
23
27
|
|
|
24
28
|
steps:
|
|
25
29
|
- name: Checkout
|
|
26
|
-
uses: actions/checkout@
|
|
30
|
+
uses: actions/checkout@v6
|
|
27
31
|
|
|
28
32
|
- name: Set up Python
|
|
29
|
-
uses: actions/setup-python@
|
|
33
|
+
uses: actions/setup-python@v6
|
|
30
34
|
with:
|
|
31
35
|
python-version: '3.11'
|
|
36
|
+
cache: 'pip'
|
|
32
37
|
|
|
33
38
|
- name: Run parity check
|
|
34
39
|
id: parity
|