ffbb-data-client 2.3.2__tar.gz → 2.3.3__tar.gz

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