ffbb-data-client 2.3.0__tar.gz → 2.3.2__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.
Files changed (365) hide show
  1. ffbb_data_client-2.3.2/.github/ISSUE_TEMPLATE/bug_report.yml +64 -0
  2. ffbb_data_client-2.3.2/.github/ISSUE_TEMPLATE/feature_request.yml +37 -0
  3. ffbb_data_client-2.3.2/.github/PULL_REQUEST_TEMPLATE.md +45 -0
  4. ffbb_data_client-2.3.2/.github/scripts/ai-pr-reviewer.js +273 -0
  5. ffbb_data_client-2.3.2/.github/scripts/resolve-bolt-conflict.js +121 -0
  6. ffbb_data_client-2.3.2/.github/workflows/ai-pr-reviewer.yml +53 -0
  7. {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.2}/.github/workflows/check_wrapper_parity.yml +7 -2
  8. {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.2}/.github/workflows/ci.yml +51 -10
  9. {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.2}/.github/workflows/codeql.yml +6 -4
  10. {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.2}/.github/workflows/deploy-pages.yml +4 -1
  11. {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.2}/.github/workflows/publish.yml +10 -5
  12. {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.2}/.github/workflows/release-after-discovery-merge.yml +5 -1
  13. {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.2}/.github/workflows/update-ffbb-api-discovery.yml +8 -3
  14. {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.2}/.gitignore +1 -0
  15. ffbb_data_client-2.3.2/AGENTS.md +103 -0
  16. ffbb_data_client-2.3.2/CODE_OF_CONDUCT.md +77 -0
  17. {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.2}/PKG-INFO +9 -10
  18. {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.2}/README.md +7 -8
  19. {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.2}/data/api_update_summary.md +4 -6
  20. {ffbb_data_client-2.3.0/src/ffbb_data_client → ffbb_data_client-2.3.2}/data/endpoint_discovery.json +17 -32
  21. {ffbb_data_client-2.3.0/src/ffbb_data_client → ffbb_data_client-2.3.2}/data/indexes.json +9 -9
  22. {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.2}/data/openapi.json +9 -1
  23. {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.2}/data/openapi_full.json +9 -1
  24. {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.2}/docs/requirements.txt +1 -1
  25. ffbb_data_client-2.3.2/graphify-cross-repo.json +28 -0
  26. {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.2}/setup.cfg +1 -1
  27. {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.2}/src/ffbb_data_client/__init__.py +2 -0
  28. {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.2}/src/ffbb_data_client/clients/_rest_facade.py +59 -0
  29. {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.2}/src/ffbb_data_client/clients/api_ffbb_app_client.py +36 -18
  30. ffbb_data_client-2.3.2/src/ffbb_data_client/clients/ffbb_data_client.py +151 -0
  31. {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.2}/src/ffbb_data_client/clients/meilisearch_client.py +19 -13
  32. {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.2}/src/ffbb_data_client/config.py +2 -2
  33. {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.2/src/ffbb_data_client}/data/endpoint_discovery.json +17 -32
  34. {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.2/src/ffbb_data_client}/data/indexes.json +9 -9
  35. {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.2}/src/ffbb_data_client/data/openapi.json +9 -1
  36. {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.2}/src/ffbb_data_client/data/openapi_full.json +9 -1
  37. {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.2}/src/ffbb_data_client/helpers/http_requests_utils.py +179 -12
  38. {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.2}/src/ffbb_data_client/helpers/meilisearch_client_extension.py +51 -37
  39. {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.2}/src/ffbb_data_client/utils/__init__.py +2 -0
  40. {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.2}/src/ffbb_data_client/utils/cache_manager.py +66 -17
  41. ffbb_data_client-2.3.2/src/ffbb_data_client/utils/concurrency_utils.py +33 -0
  42. {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.2}/src/ffbb_data_client/utils/retry_utils.py +64 -36
  43. {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.2}/src/ffbb_data_client/utils/token_manager.py +51 -8
  44. {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.2}/src/ffbb_data_client.egg-info/PKG-INFO +9 -10
  45. {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.2}/src/ffbb_data_client.egg-info/SOURCES.txt +14 -0
  46. {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.2}/src/ffbb_data_client.egg-info/requires.txt +1 -1
  47. {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.2}/tests/unit/clients/test_201_unit_tests_core.py +47 -55
  48. {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.2}/tests/unit/clients/test_202_meilisearch_client.py +8 -11
  49. ffbb_data_client-2.3.2/tests/unit/clients/test_warm_cache.py +100 -0
  50. {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.2}/tests/unit/helpers/test_400_http_helpers.py +58 -0
  51. {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.2}/tests/unit/utils/test_303_cache_manager.py +15 -0
  52. {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.2}/tests/unit/utils/test_305_token_manager.py +25 -18
  53. ffbb_data_client-2.3.2/tests/unit/utils/test_309_concurrency_utils.py +46 -0
  54. ffbb_data_client-2.3.2/tools/add_cross_repo_edges.py +502 -0
  55. ffbb_data_client-2.3.2/tools/graphify-cross-repo.sh +64 -0
  56. ffbb_data_client-2.3.2/tools/graphify_cross_repo.py +593 -0
  57. {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.2}/tools/update_agents_md.py +8 -0
  58. {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.2}/website/index.html +1 -1
  59. ffbb_data_client-2.3.0/AGENTS.md +0 -260
  60. ffbb_data_client-2.3.0/src/ffbb_data_client/clients/ffbb_data_client.py +0 -266
  61. {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.2}/.agents/rules/antigravity-rtk-rules.md +0 -0
  62. {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.2}/.coveragerc +0 -0
  63. {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.2}/.github/dependabot.yml +0 -0
  64. {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.2}/.github/scripts/check_wrapper_parity.py +0 -0
  65. {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.2}/.isort.cfg +0 -0
  66. {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.2}/.jules/bolt.md +0 -0
  67. {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.2}/.pre-commit-config.yaml +0 -0
  68. {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.2}/.readthedocs.yml +0 -0
  69. {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.2}/AUTHORS.rst +0 -0
  70. {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.2}/CHANGELOG.md +0 -0
  71. {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.2}/CONTRIBUTING.rst +0 -0
  72. {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.2}/LICENSE.txt +0 -0
  73. {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.2}/LOCAL_CI_GUIDE.md +0 -0
  74. {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.2}/RELEASE_NOTES.md +0 -0
  75. {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.2}/SECURITY.md +0 -0
  76. {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.2}/data/api.ffbb.app.json +0 -0
  77. {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.2}/data/collections.json +0 -0
  78. {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.2}/data/meilisearch-prod.ffbb.app.json +0 -0
  79. {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.2}/data/type_discovery_corrections.json +0 -0
  80. {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.2}/docs/Makefile +0 -0
  81. {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.2}/docs/_static/.gitignore +0 -0
  82. {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.2}/docs/architecture.rst +0 -0
  83. {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.2}/docs/authors.rst +0 -0
  84. {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.2}/docs/changelog.rst +0 -0
  85. {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.2}/docs/conf.py +0 -0
  86. {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.2}/docs/contributing.rst +0 -0
  87. {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.2}/docs/examples.rst +0 -0
  88. {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.2}/docs/index.rst +0 -0
  89. {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.2}/docs/license.rst +0 -0
  90. {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.2}/docs/migration.rst +0 -0
  91. {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.2}/docs/readme.rst +0 -0
  92. {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.2}/docs/test_strategy.md +0 -0
  93. {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.2}/docs/testing_conventions.md +0 -0
  94. {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.2}/examples/README.md +0 -0
  95. {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.2}/examples/complete_usage_example.py +0 -0
  96. {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.2}/examples/quick_start.py +0 -0
  97. {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.2}/examples/team_ranking_analysis.py +0 -0
  98. {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.2}/pyproject.toml +0 -0
  99. {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.2}/pytest.ini +0 -0
  100. {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.2}/run-ci-locally.sh +0 -0
  101. {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.2}/scripts/benchmark_search_organisme.py +0 -0
  102. {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.2}/scripts/discover_endpoints.py +0 -0
  103. {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.2}/scripts/discover_types.py +0 -0
  104. {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.2}/setup.py +0 -0
  105. {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.2}/src/ffbb_data_client/clients/__init__.py +0 -0
  106. {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.2}/src/ffbb_data_client/clients/_search_facade.py +0 -0
  107. {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.2}/src/ffbb_data_client/clients/meilisearch_ffbb_client.py +0 -0
  108. {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.2}/src/ffbb_data_client/data/__init__.py +0 -0
  109. {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.2}/src/ffbb_data_client/data/collections.json +0 -0
  110. {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.2}/src/ffbb_data_client/helpers/__init__.py +0 -0
  111. {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.2}/src/ffbb_data_client/helpers/http_requests_helper.py +0 -0
  112. {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.2}/src/ffbb_data_client/helpers/multi_search_query_helper.py +0 -0
  113. {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.2}/src/ffbb_data_client/models/__init__.py +0 -0
  114. {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.2}/src/ffbb_data_client/models/affiche.py +0 -0
  115. {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.2}/src/ffbb_data_client/models/cartographie.py +0 -0
  116. {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.2}/src/ffbb_data_client/models/categorie.py +0 -0
  117. {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.2}/src/ffbb_data_client/models/categorie_type.py +0 -0
  118. {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.2}/src/ffbb_data_client/models/clock.py +0 -0
  119. {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.2}/src/ffbb_data_client/models/club_contacts.py +0 -0
  120. {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.2}/src/ffbb_data_client/models/code.py +0 -0
  121. {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.2}/src/ffbb_data_client/models/commune.py +0 -0
  122. {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.2}/src/ffbb_data_client/models/competition_fields.py +0 -0
  123. {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.2}/src/ffbb_data_client/models/competition_id.py +0 -0
  124. {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.2}/src/ffbb_data_client/models/competition_id_categorie.py +0 -0
  125. {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.2}/src/ffbb_data_client/models/competition_id_sexe.py +0 -0
  126. {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.2}/src/ffbb_data_client/models/competition_id_type_competition.py +0 -0
  127. {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.2}/src/ffbb_data_client/models/competition_id_type_competition_generique.py +0 -0
  128. {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.2}/src/ffbb_data_client/models/competition_origine.py +0 -0
  129. {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.2}/src/ffbb_data_client/models/competition_origine_categorie.py +0 -0
  130. {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.2}/src/ffbb_data_client/models/competition_origine_type_competition.py +0 -0
  131. {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.2}/src/ffbb_data_client/models/competition_origine_type_competition_generique.py +0 -0
  132. {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.2}/src/ffbb_data_client/models/competition_type.py +0 -0
  133. {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.2}/src/ffbb_data_client/models/competitions_facet_distribution.py +0 -0
  134. {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.2}/src/ffbb_data_client/models/competitions_facet_stats.py +0 -0
  135. {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.2}/src/ffbb_data_client/models/competitions_hit.py +0 -0
  136. {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.2}/src/ffbb_data_client/models/competitions_multi_search_query.py +0 -0
  137. {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.2}/src/ffbb_data_client/models/competitions_query.py +0 -0
  138. {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.2}/src/ffbb_data_client/models/configuration_models.py +0 -0
  139. {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.2}/src/ffbb_data_client/models/contact_info.py +0 -0
  140. {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.2}/src/ffbb_data_client/models/content_multi_search_query.py +0 -0
  141. {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.2}/src/ffbb_data_client/models/coordonnees.py +0 -0
  142. {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.2}/src/ffbb_data_client/models/coordonnees_type.py +0 -0
  143. {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.2}/src/ffbb_data_client/models/document_flyer.py +0 -0
  144. {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.2}/src/ffbb_data_client/models/document_flyer_type.py +0 -0
  145. {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.2}/src/ffbb_data_client/models/engagement_contacts.py +0 -0
  146. {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.2}/src/ffbb_data_client/models/engagements_facet_distribution.py +0 -0
  147. {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.2}/src/ffbb_data_client/models/engagements_facet_stats.py +0 -0
  148. {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.2}/src/ffbb_data_client/models/engagements_hit.py +0 -0
  149. {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.2}/src/ffbb_data_client/models/engagements_multi_search_query.py +0 -0
  150. {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.2}/src/ffbb_data_client/models/etat.py +0 -0
  151. {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.2}/src/ffbb_data_client/models/external_competition_id.py +0 -0
  152. {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.2}/src/ffbb_data_client/models/external_id.py +0 -0
  153. {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.2}/src/ffbb_data_client/models/facet_distribution.py +0 -0
  154. {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.2}/src/ffbb_data_client/models/facet_stats.py +0 -0
  155. {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.2}/src/ffbb_data_client/models/field_set.py +0 -0
  156. {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.2}/src/ffbb_data_client/models/folder.py +0 -0
  157. {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.2}/src/ffbb_data_client/models/formation_session.py +0 -0
  158. {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.2}/src/ffbb_data_client/models/formations_facet_distribution.py +0 -0
  159. {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.2}/src/ffbb_data_client/models/formations_facet_stats.py +0 -0
  160. {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.2}/src/ffbb_data_client/models/formations_hit.py +0 -0
  161. {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.2}/src/ffbb_data_client/models/formations_multi_search_query.py +0 -0
  162. {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.2}/src/ffbb_data_client/models/game_stats_model.py +0 -0
  163. {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.2}/src/ffbb_data_client/models/game_stats_models.py +0 -0
  164. {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.2}/src/ffbb_data_client/models/generic_search.py +0 -0
  165. {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.2}/src/ffbb_data_client/models/geo.py +0 -0
  166. {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.2}/src/ffbb_data_client/models/geo_sort_order.py +0 -0
  167. {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.2}/src/ffbb_data_client/models/get_commune_response.py +0 -0
  168. {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.2}/src/ffbb_data_client/models/get_competition_response.py +0 -0
  169. {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.2}/src/ffbb_data_client/models/get_configuration_response.py +0 -0
  170. {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.2}/src/ffbb_data_client/models/get_engagement_response.py +0 -0
  171. {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.2}/src/ffbb_data_client/models/get_entraineur_response.py +0 -0
  172. {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.2}/src/ffbb_data_client/models/get_formation_response.py +0 -0
  173. {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.2}/src/ffbb_data_client/models/get_officiel_response.py +0 -0
  174. {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.2}/src/ffbb_data_client/models/get_organisme_response.py +0 -0
  175. {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.2}/src/ffbb_data_client/models/get_poule_response.py +0 -0
  176. {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.2}/src/ffbb_data_client/models/get_pratique_response.py +0 -0
  177. {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.2}/src/ffbb_data_client/models/get_rencontre_response.py +0 -0
  178. {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.2}/src/ffbb_data_client/models/get_saisons_response.py +0 -0
  179. {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.2}/src/ffbb_data_client/models/get_salle_response.py +0 -0
  180. {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.2}/src/ffbb_data_client/models/get_terrain_response.py +0 -0
  181. {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.2}/src/ffbb_data_client/models/get_tournoi_response.py +0 -0
  182. {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.2}/src/ffbb_data_client/models/gradient_color.py +0 -0
  183. {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.2}/src/ffbb_data_client/models/hit.py +0 -0
  184. {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.2}/src/ffbb_data_client/models/id_engagement_equipe.py +0 -0
  185. {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.2}/src/ffbb_data_client/models/id_organisme_equipe.py +0 -0
  186. {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.2}/src/ffbb_data_client/models/id_organisme_equipe1_logo.py +0 -0
  187. {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.2}/src/ffbb_data_client/models/id_poule.py +0 -0
  188. {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.2}/src/ffbb_data_client/models/jour.py +0 -0
  189. {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.2}/src/ffbb_data_client/models/label.py +0 -0
  190. {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.2}/src/ffbb_data_client/models/labellisation.py +0 -0
  191. {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.2}/src/ffbb_data_client/models/live.py +0 -0
  192. {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.2}/src/ffbb_data_client/models/lives.py +0 -0
  193. {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.2}/src/ffbb_data_client/models/logo.py +0 -0
  194. {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.2}/src/ffbb_data_client/models/multi_search_queries.py +0 -0
  195. {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.2}/src/ffbb_data_client/models/multi_search_query.py +0 -0
  196. {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.2}/src/ffbb_data_client/models/multi_search_result_competitions.py +0 -0
  197. {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.2}/src/ffbb_data_client/models/multi_search_result_engagements.py +0 -0
  198. {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.2}/src/ffbb_data_client/models/multi_search_result_formations.py +0 -0
  199. {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.2}/src/ffbb_data_client/models/multi_search_result_organismes.py +0 -0
  200. {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.2}/src/ffbb_data_client/models/multi_search_result_pratiques.py +0 -0
  201. {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.2}/src/ffbb_data_client/models/multi_search_result_rencontres.py +0 -0
  202. {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.2}/src/ffbb_data_client/models/multi_search_result_salles.py +0 -0
  203. {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.2}/src/ffbb_data_client/models/multi_search_result_terrains.py +0 -0
  204. {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.2}/src/ffbb_data_client/models/multi_search_result_tournois.py +0 -0
  205. {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.2}/src/ffbb_data_client/models/multi_search_results.py +0 -0
  206. {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.2}/src/ffbb_data_client/models/multi_search_results_class.py +0 -0
  207. {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.2}/src/ffbb_data_client/models/nature_sol.py +0 -0
  208. {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.2}/src/ffbb_data_client/models/niveau.py +0 -0
  209. {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.2}/src/ffbb_data_client/models/niveau_class.py +0 -0
  210. {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.2}/src/ffbb_data_client/models/niveau_extractor.py +0 -0
  211. {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.2}/src/ffbb_data_client/models/niveau_info.py +0 -0
  212. {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.2}/src/ffbb_data_client/models/niveau_models.py +0 -0
  213. {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.2}/src/ffbb_data_client/models/niveau_type.py +0 -0
  214. {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.2}/src/ffbb_data_client/models/objectif.py +0 -0
  215. {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.2}/src/ffbb_data_client/models/organisateur.py +0 -0
  216. {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.2}/src/ffbb_data_client/models/organisateur_type.py +0 -0
  217. {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.2}/src/ffbb_data_client/models/organisme_fields.py +0 -0
  218. {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.2}/src/ffbb_data_client/models/organisme_id_pere.py +0 -0
  219. {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.2}/src/ffbb_data_client/models/organismes_facet_distribution.py +0 -0
  220. {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.2}/src/ffbb_data_client/models/organismes_facet_stats.py +0 -0
  221. {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.2}/src/ffbb_data_client/models/organismes_hit.py +0 -0
  222. {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.2}/src/ffbb_data_client/models/organismes_multi_search_query.py +0 -0
  223. {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.2}/src/ffbb_data_client/models/organismes_query.py +0 -0
  224. {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.2}/src/ffbb_data_client/models/phase_code.py +0 -0
  225. {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.2}/src/ffbb_data_client/models/poule.py +0 -0
  226. {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.2}/src/ffbb_data_client/models/poule_fields.py +0 -0
  227. {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.2}/src/ffbb_data_client/models/poule_rencontre_item_model.py +0 -0
  228. {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.2}/src/ffbb_data_client/models/poules_models.py +0 -0
  229. {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.2}/src/ffbb_data_client/models/poules_query.py +0 -0
  230. {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.2}/src/ffbb_data_client/models/pratique.py +0 -0
  231. {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.2}/src/ffbb_data_client/models/pratiques_facet_distribution.py +0 -0
  232. {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.2}/src/ffbb_data_client/models/pratiques_facet_stats.py +0 -0
  233. {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.2}/src/ffbb_data_client/models/pratiques_hit.py +0 -0
  234. {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.2}/src/ffbb_data_client/models/pratiques_hit_type.py +0 -0
  235. {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.2}/src/ffbb_data_client/models/pratiques_multi_search_query.py +0 -0
  236. {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.2}/src/ffbb_data_client/models/pratiques_type_class.py +0 -0
  237. {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.2}/src/ffbb_data_client/models/publication_internet.py +0 -0
  238. {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.2}/src/ffbb_data_client/models/purple_logo.py +0 -0
  239. {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.2}/src/ffbb_data_client/models/query_fields_manager.py +0 -0
  240. {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.2}/src/ffbb_data_client/models/ranking_engagement.py +0 -0
  241. {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.2}/src/ffbb_data_client/models/rankings_models.py +0 -0
  242. {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.2}/src/ffbb_data_client/models/rencontres_engagement.py +0 -0
  243. {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.2}/src/ffbb_data_client/models/rencontres_facet_distribution.py +0 -0
  244. {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.2}/src/ffbb_data_client/models/rencontres_facet_stats.py +0 -0
  245. {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.2}/src/ffbb_data_client/models/rencontres_hit.py +0 -0
  246. {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.2}/src/ffbb_data_client/models/rencontres_multi_search_query.py +0 -0
  247. {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.2}/src/ffbb_data_client/models/saison.py +0 -0
  248. {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.2}/src/ffbb_data_client/models/saison_fields.py +0 -0
  249. {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.2}/src/ffbb_data_client/models/saisons_models.py +0 -0
  250. {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.2}/src/ffbb_data_client/models/saisons_query.py +0 -0
  251. {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.2}/src/ffbb_data_client/models/salle.py +0 -0
  252. {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.2}/src/ffbb_data_client/models/salles_facet_distribution.py +0 -0
  253. {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.2}/src/ffbb_data_client/models/salles_facet_stats.py +0 -0
  254. {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.2}/src/ffbb_data_client/models/salles_hit.py +0 -0
  255. {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.2}/src/ffbb_data_client/models/salles_multi_search_query.py +0 -0
  256. {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.2}/src/ffbb_data_client/models/sexe.py +0 -0
  257. {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.2}/src/ffbb_data_client/models/sexe_class.py +0 -0
  258. {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.2}/src/ffbb_data_client/models/source.py +0 -0
  259. {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.2}/src/ffbb_data_client/models/status.py +0 -0
  260. {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.2}/src/ffbb_data_client/models/team_engagement.py +0 -0
  261. {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.2}/src/ffbb_data_client/models/team_ranking.py +0 -0
  262. {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.2}/src/ffbb_data_client/models/terrains_categorie_championnat_3x3_libelle.py +0 -0
  263. {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.2}/src/ffbb_data_client/models/terrains_facet_distribution.py +0 -0
  264. {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.2}/src/ffbb_data_client/models/terrains_facet_stats.py +0 -0
  265. {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.2}/src/ffbb_data_client/models/terrains_hit.py +0 -0
  266. {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.2}/src/ffbb_data_client/models/terrains_multi_search_query.py +0 -0
  267. {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.2}/src/ffbb_data_client/models/terrains_name.py +0 -0
  268. {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.2}/src/ffbb_data_client/models/terrains_sexe_enum.py +0 -0
  269. {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.2}/src/ffbb_data_client/models/terrains_storage.py +0 -0
  270. {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.2}/src/ffbb_data_client/models/tournoi_type_class.py +0 -0
  271. {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.2}/src/ffbb_data_client/models/tournoi_type_enum.py +0 -0
  272. {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.2}/src/ffbb_data_client/models/tournoi_types_3x3.py +0 -0
  273. {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.2}/src/ffbb_data_client/models/tournoi_types_3x3_libelle.py +0 -0
  274. {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.2}/src/ffbb_data_client/models/tournoi_types_3x3_libelle_enum.py +0 -0
  275. {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.2}/src/ffbb_data_client/models/tournois_facet_distribution.py +0 -0
  276. {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.2}/src/ffbb_data_client/models/tournois_facet_stats.py +0 -0
  277. {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.2}/src/ffbb_data_client/models/tournois_hit.py +0 -0
  278. {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.2}/src/ffbb_data_client/models/tournois_hit_type.py +0 -0
  279. {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.2}/src/ffbb_data_client/models/tournois_libelle.py +0 -0
  280. {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.2}/src/ffbb_data_client/models/tournois_multi_search_query.py +0 -0
  281. {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.2}/src/ffbb_data_client/models/type_association.py +0 -0
  282. {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.2}/src/ffbb_data_client/models/type_association_libelle.py +0 -0
  283. {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.2}/src/ffbb_data_client/models/type_class.py +0 -0
  284. {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.2}/src/ffbb_data_client/models/type_competition.py +0 -0
  285. {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.2}/src/ffbb_data_client/models/type_competition_generique.py +0 -0
  286. {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.2}/src/ffbb_data_client/models/type_enum.py +0 -0
  287. {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.2}/src/ffbb_data_client/models/type_league.py +0 -0
  288. {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.2}/src/ffbb_data_client/py.typed +0 -0
  289. {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.2}/src/ffbb_data_client/utils/converter_utils.py +0 -0
  290. {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.2}/src/ffbb_data_client/utils/input_validation.py +0 -0
  291. {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.2}/src/ffbb_data_client/utils/secure_logging.py +0 -0
  292. {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.2}/src/ffbb_data_client.egg-info/dependency_links.txt +0 -0
  293. {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.2}/src/ffbb_data_client.egg-info/not-zip-safe +0 -0
  294. {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.2}/src/ffbb_data_client.egg-info/top_level.txt +0 -0
  295. {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.2}/tests/conftest.py +0 -0
  296. {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.2}/tests/e2e/__init__.py +0 -0
  297. {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.2}/tests/e2e/conftest.py +0 -0
  298. {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.2}/tests/integration/__init__.py +0 -0
  299. {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.2}/tests/integration/conftest.py +0 -0
  300. {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.2}/tests/integration/test_500_user_journey.py +0 -0
  301. {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.2}/tests/integration/test_501_user_journey_v3.py +0 -0
  302. {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.2}/tests/integration/test_502_enhanced_integration.py +0 -0
  303. {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.2}/tests/integration/test_503_secure_logging.py +0 -0
  304. {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.2}/tests/integration/test_504_input_validation.py +0 -0
  305. {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.2}/tests/integration/test_505_retry_timeout.py +0 -0
  306. {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.2}/tests/integration/test_506_raw_json_model_conversion.py +0 -0
  307. {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.2}/tests/unit/__init__.py +0 -0
  308. {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.2}/tests/unit/clients/__init__.py +0 -0
  309. {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.2}/tests/unit/clients/test_200_api_ffbb_app_client.py +0 -0
  310. {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.2}/tests/unit/clients/test_203_meilisearch_client_extension.py +0 -0
  311. {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.2}/tests/unit/clients/test_204_ffbb_data_client.py +0 -0
  312. {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.2}/tests/unit/clients/test_205_meilisearch_ffbb_client.py +0 -0
  313. {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.2}/tests/unit/clients/test_206_coverage_gaps_clients.py +0 -0
  314. {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.2}/tests/unit/clients/test_207_coverage_clients_extended.py +0 -0
  315. {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.2}/tests/unit/clients/test_208_new_methods_coverage.py +0 -0
  316. {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.2}/tests/unit/clients/test_209_automatic_token_resolution.py +0 -0
  317. {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.2}/tests/unit/clients/test_210_targeted_clients_helpers_coverage.py +0 -0
  318. {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.2}/tests/unit/clients/test_async_methods.py +0 -0
  319. {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.2}/tests/unit/clients/test_meilisearch_async.py +0 -0
  320. {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.2}/tests/unit/clients/test_v2_backport_search.py +0 -0
  321. {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.2}/tests/unit/clients/test_v3_new_features.py +0 -0
  322. {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.2}/tests/unit/conftest.py +0 -0
  323. {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.2}/tests/unit/helpers/__init__.py +0 -0
  324. {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.2}/tests/unit/helpers/test_meilisearch_client_extension_recursive_pagination.py +0 -0
  325. {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.2}/tests/unit/models/__init__.py +0 -0
  326. {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.2}/tests/unit/models/test_100_competition_id_categorie.py +0 -0
  327. {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.2}/tests/unit/models/test_101_competition_id_sexe.py +0 -0
  328. {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.2}/tests/unit/models/test_102_competition_id_type_competition.py +0 -0
  329. {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.2}/tests/unit/models/test_103_competition_id_type_competition_generique.py +0 -0
  330. {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.2}/tests/unit/models/test_104_competition_origine_categorie.py +0 -0
  331. {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.2}/tests/unit/models/test_105_competition_origine_type_competition_generique.py +0 -0
  332. {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.2}/tests/unit/models/test_106_competition_origine.py +0 -0
  333. {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.2}/tests/unit/models/test_107_id_engagement_equipe.py +0 -0
  334. {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.2}/tests/unit/models/test_108_id_organisme_equipe.py +0 -0
  335. {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.2}/tests/unit/models/test_109_id_organisme_equipe1_logo.py +0 -0
  336. {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.2}/tests/unit/models/test_110_labellisation.py +0 -0
  337. {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.2}/tests/unit/models/test_111_niveau_class.py +0 -0
  338. {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.2}/tests/unit/models/test_112_purple_logo.py +0 -0
  339. {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.2}/tests/unit/models/test_113_salle.py +0 -0
  340. {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.2}/tests/unit/models/test_114_tournoi_type_class.py +0 -0
  341. {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.2}/tests/unit/models/test_115_type_association_libelle.py +0 -0
  342. {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.2}/tests/unit/models/test_116_type_competition_generique.py +0 -0
  343. {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.2}/tests/unit/models/test_117_organisateur.py +0 -0
  344. {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.2}/tests/unit/models/test_118_competition_id.py +0 -0
  345. {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.2}/tests/unit/models/test_119_terrains_inner_models.py +0 -0
  346. {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.2}/tests/unit/models/test_120_pratiques_inner_models.py +0 -0
  347. {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.2}/tests/unit/models/test_121_to_dict_round_trip.py +0 -0
  348. {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.2}/tests/unit/models/test_122_coverage_gaps.py +0 -0
  349. {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.2}/tests/unit/models/test_123_missing_coverage.py +0 -0
  350. {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.2}/tests/unit/models/test_123_v2_backport.py +0 -0
  351. {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.2}/tests/unit/models/test_124_targeted_coverage_gains.py +0 -0
  352. {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.2}/tests/unit/models/test_dx_aliases.py +0 -0
  353. {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.2}/tests/unit/utils/__init__.py +0 -0
  354. {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.2}/tests/unit/utils/test_300_secure_logging.py +0 -0
  355. {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.2}/tests/unit/utils/test_301_input_validation.py +0 -0
  356. {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.2}/tests/unit/utils/test_302_retry_utils.py +0 -0
  357. {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.2}/tests/unit/utils/test_304_config.py +0 -0
  358. {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.2}/tests/unit/utils/test_306_converter_utils.py +0 -0
  359. {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.2}/tests/unit/utils/test_307_coverage_gaps_utils.py +0 -0
  360. {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.2}/tests/unit/utils/test_308_converter_utils_extended.py +0 -0
  361. {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.2}/tox.ini +0 -0
  362. {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.2}/website/assets/logo.webp +0 -0
  363. {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.2}/website/css/style.css +0 -0
  364. {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.2}/website/robots.txt +0 -0
  365. {ffbb_data_client-2.3.0 → ffbb_data_client-2.3.2}/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
@@ -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@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
30
+ uses: actions/checkout@v6
27
31
 
28
32
  - name: Set up Python
29
- uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6.2.0
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