ffbb-data-client 2.2.0__tar.gz → 2.3.0__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 (350) hide show
  1. ffbb_data_client-2.3.0/.agents/rules/antigravity-rtk-rules.md +32 -0
  2. {ffbb_data_client-2.2.0 → ffbb_data_client-2.3.0}/.github/workflows/update-ffbb-api-discovery.yml +1 -1
  3. ffbb_data_client-2.3.0/AGENTS.md +260 -0
  4. {ffbb_data_client-2.2.0 → ffbb_data_client-2.3.0}/CHANGELOG.md +13 -0
  5. {ffbb_data_client-2.2.0 → ffbb_data_client-2.3.0}/CONTRIBUTING.rst +0 -25
  6. {ffbb_data_client-2.2.0/src/ffbb_data_client.egg-info → ffbb_data_client-2.3.0}/PKG-INFO +23 -1
  7. {ffbb_data_client-2.2.0 → ffbb_data_client-2.3.0}/README.md +22 -0
  8. ffbb_data_client-2.3.0/data/api_update_summary.md +30 -0
  9. {ffbb_data_client-2.2.0 → ffbb_data_client-2.3.0}/data/collections.json +20 -11
  10. {ffbb_data_client-2.2.0/src/ffbb_data_client → ffbb_data_client-2.3.0}/data/endpoint_discovery.json +64 -22
  11. {ffbb_data_client-2.2.0/src/ffbb_data_client → ffbb_data_client-2.3.0}/data/indexes.json +8 -7
  12. {ffbb_data_client-2.2.0 → ffbb_data_client-2.3.0}/data/openapi.json +564 -1
  13. {ffbb_data_client-2.2.0 → ffbb_data_client-2.3.0}/data/openapi_full.json +689 -15
  14. {ffbb_data_client-2.2.0 → ffbb_data_client-2.3.0}/docs/conf.py +1 -4
  15. {ffbb_data_client-2.2.0 → ffbb_data_client-2.3.0}/examples/team_ranking_analysis.py +2 -3
  16. {ffbb_data_client-2.2.0 → ffbb_data_client-2.3.0}/scripts/benchmark_search_organisme.py +1 -1
  17. {ffbb_data_client-2.2.0 → ffbb_data_client-2.3.0}/scripts/discover_endpoints.py +194 -13
  18. {ffbb_data_client-2.2.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/clients/ffbb_data_client.py +6 -10
  19. {ffbb_data_client-2.2.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/data/collections.json +20 -11
  20. {ffbb_data_client-2.2.0 → ffbb_data_client-2.3.0/src/ffbb_data_client}/data/endpoint_discovery.json +64 -22
  21. {ffbb_data_client-2.2.0 → ffbb_data_client-2.3.0/src/ffbb_data_client}/data/indexes.json +8 -7
  22. {ffbb_data_client-2.2.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/data/openapi.json +564 -1
  23. {ffbb_data_client-2.2.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/data/openapi_full.json +689 -15
  24. {ffbb_data_client-2.2.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/get_competition_response.py +0 -1
  25. {ffbb_data_client-2.2.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/get_organisme_response.py +0 -2
  26. {ffbb_data_client-2.2.0 → ffbb_data_client-2.3.0/src/ffbb_data_client.egg-info}/PKG-INFO +23 -1
  27. {ffbb_data_client-2.2.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client.egg-info/SOURCES.txt +4 -0
  28. {ffbb_data_client-2.2.0 → ffbb_data_client-2.3.0}/tests/integration/test_504_input_validation.py +26 -19
  29. {ffbb_data_client-2.2.0 → ffbb_data_client-2.3.0}/tests/integration/test_505_retry_timeout.py +3 -2
  30. {ffbb_data_client-2.2.0 → ffbb_data_client-2.3.0}/tests/unit/clients/test_201_unit_tests_core.py +8 -6
  31. ffbb_data_client-2.3.0/tests/unit/utils/test_308_converter_utils_extended.py +239 -0
  32. ffbb_data_client-2.3.0/tools/update_agents_md.py +219 -0
  33. ffbb_data_client-2.2.0/data/api_update_summary.md +0 -24
  34. {ffbb_data_client-2.2.0 → ffbb_data_client-2.3.0}/.coveragerc +0 -0
  35. {ffbb_data_client-2.2.0 → ffbb_data_client-2.3.0}/.github/dependabot.yml +0 -0
  36. {ffbb_data_client-2.2.0 → ffbb_data_client-2.3.0}/.github/scripts/check_wrapper_parity.py +0 -0
  37. {ffbb_data_client-2.2.0 → ffbb_data_client-2.3.0}/.github/workflows/check_wrapper_parity.yml +0 -0
  38. {ffbb_data_client-2.2.0 → ffbb_data_client-2.3.0}/.github/workflows/ci.yml +0 -0
  39. {ffbb_data_client-2.2.0 → ffbb_data_client-2.3.0}/.github/workflows/codeql.yml +0 -0
  40. {ffbb_data_client-2.2.0 → ffbb_data_client-2.3.0}/.github/workflows/deploy-pages.yml +0 -0
  41. {ffbb_data_client-2.2.0 → ffbb_data_client-2.3.0}/.github/workflows/publish.yml +0 -0
  42. {ffbb_data_client-2.2.0 → ffbb_data_client-2.3.0}/.github/workflows/release-after-discovery-merge.yml +0 -0
  43. {ffbb_data_client-2.2.0 → ffbb_data_client-2.3.0}/.gitignore +0 -0
  44. {ffbb_data_client-2.2.0 → ffbb_data_client-2.3.0}/.isort.cfg +0 -0
  45. {ffbb_data_client-2.2.0 → ffbb_data_client-2.3.0}/.jules/bolt.md +0 -0
  46. {ffbb_data_client-2.2.0 → ffbb_data_client-2.3.0}/.pre-commit-config.yaml +0 -0
  47. {ffbb_data_client-2.2.0 → ffbb_data_client-2.3.0}/.readthedocs.yml +0 -0
  48. {ffbb_data_client-2.2.0 → ffbb_data_client-2.3.0}/AUTHORS.rst +0 -0
  49. {ffbb_data_client-2.2.0 → ffbb_data_client-2.3.0}/LICENSE.txt +0 -0
  50. {ffbb_data_client-2.2.0 → ffbb_data_client-2.3.0}/LOCAL_CI_GUIDE.md +0 -0
  51. {ffbb_data_client-2.2.0 → ffbb_data_client-2.3.0}/RELEASE_NOTES.md +0 -0
  52. {ffbb_data_client-2.2.0 → ffbb_data_client-2.3.0}/SECURITY.md +0 -0
  53. {ffbb_data_client-2.2.0 → ffbb_data_client-2.3.0}/data/api.ffbb.app.json +0 -0
  54. {ffbb_data_client-2.2.0 → ffbb_data_client-2.3.0}/data/meilisearch-prod.ffbb.app.json +0 -0
  55. {ffbb_data_client-2.2.0 → ffbb_data_client-2.3.0}/data/type_discovery_corrections.json +0 -0
  56. {ffbb_data_client-2.2.0 → ffbb_data_client-2.3.0}/docs/Makefile +0 -0
  57. {ffbb_data_client-2.2.0 → ffbb_data_client-2.3.0}/docs/_static/.gitignore +0 -0
  58. {ffbb_data_client-2.2.0 → ffbb_data_client-2.3.0}/docs/architecture.rst +0 -0
  59. {ffbb_data_client-2.2.0 → ffbb_data_client-2.3.0}/docs/authors.rst +0 -0
  60. {ffbb_data_client-2.2.0 → ffbb_data_client-2.3.0}/docs/changelog.rst +0 -0
  61. {ffbb_data_client-2.2.0 → ffbb_data_client-2.3.0}/docs/contributing.rst +0 -0
  62. {ffbb_data_client-2.2.0 → ffbb_data_client-2.3.0}/docs/examples.rst +0 -0
  63. {ffbb_data_client-2.2.0 → ffbb_data_client-2.3.0}/docs/index.rst +0 -0
  64. {ffbb_data_client-2.2.0 → ffbb_data_client-2.3.0}/docs/license.rst +0 -0
  65. {ffbb_data_client-2.2.0 → ffbb_data_client-2.3.0}/docs/migration.rst +0 -0
  66. {ffbb_data_client-2.2.0 → ffbb_data_client-2.3.0}/docs/readme.rst +0 -0
  67. {ffbb_data_client-2.2.0 → ffbb_data_client-2.3.0}/docs/requirements.txt +0 -0
  68. {ffbb_data_client-2.2.0 → ffbb_data_client-2.3.0}/docs/test_strategy.md +0 -0
  69. {ffbb_data_client-2.2.0 → ffbb_data_client-2.3.0}/docs/testing_conventions.md +0 -0
  70. {ffbb_data_client-2.2.0 → ffbb_data_client-2.3.0}/examples/README.md +0 -0
  71. {ffbb_data_client-2.2.0 → ffbb_data_client-2.3.0}/examples/complete_usage_example.py +0 -0
  72. {ffbb_data_client-2.2.0 → ffbb_data_client-2.3.0}/examples/quick_start.py +0 -0
  73. {ffbb_data_client-2.2.0 → ffbb_data_client-2.3.0}/pyproject.toml +0 -0
  74. {ffbb_data_client-2.2.0 → ffbb_data_client-2.3.0}/pytest.ini +0 -0
  75. {ffbb_data_client-2.2.0 → ffbb_data_client-2.3.0}/run-ci-locally.sh +0 -0
  76. {ffbb_data_client-2.2.0 → ffbb_data_client-2.3.0}/scripts/discover_types.py +0 -0
  77. {ffbb_data_client-2.2.0 → ffbb_data_client-2.3.0}/setup.cfg +0 -0
  78. {ffbb_data_client-2.2.0 → ffbb_data_client-2.3.0}/setup.py +0 -0
  79. {ffbb_data_client-2.2.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/__init__.py +0 -0
  80. {ffbb_data_client-2.2.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/clients/__init__.py +0 -0
  81. {ffbb_data_client-2.2.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/clients/_rest_facade.py +0 -0
  82. {ffbb_data_client-2.2.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/clients/_search_facade.py +0 -0
  83. {ffbb_data_client-2.2.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/clients/api_ffbb_app_client.py +0 -0
  84. {ffbb_data_client-2.2.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/clients/meilisearch_client.py +0 -0
  85. {ffbb_data_client-2.2.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/clients/meilisearch_ffbb_client.py +0 -0
  86. {ffbb_data_client-2.2.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/config.py +0 -0
  87. {ffbb_data_client-2.2.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/data/__init__.py +0 -0
  88. {ffbb_data_client-2.2.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/helpers/__init__.py +0 -0
  89. {ffbb_data_client-2.2.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/helpers/http_requests_helper.py +0 -0
  90. {ffbb_data_client-2.2.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/helpers/http_requests_utils.py +0 -0
  91. {ffbb_data_client-2.2.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/helpers/meilisearch_client_extension.py +0 -0
  92. {ffbb_data_client-2.2.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/helpers/multi_search_query_helper.py +0 -0
  93. {ffbb_data_client-2.2.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/__init__.py +0 -0
  94. {ffbb_data_client-2.2.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/affiche.py +0 -0
  95. {ffbb_data_client-2.2.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/cartographie.py +0 -0
  96. {ffbb_data_client-2.2.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/categorie.py +0 -0
  97. {ffbb_data_client-2.2.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/categorie_type.py +0 -0
  98. {ffbb_data_client-2.2.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/clock.py +0 -0
  99. {ffbb_data_client-2.2.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/club_contacts.py +0 -0
  100. {ffbb_data_client-2.2.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/code.py +0 -0
  101. {ffbb_data_client-2.2.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/commune.py +0 -0
  102. {ffbb_data_client-2.2.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/competition_fields.py +0 -0
  103. {ffbb_data_client-2.2.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/competition_id.py +0 -0
  104. {ffbb_data_client-2.2.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/competition_id_categorie.py +0 -0
  105. {ffbb_data_client-2.2.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/competition_id_sexe.py +0 -0
  106. {ffbb_data_client-2.2.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/competition_id_type_competition.py +0 -0
  107. {ffbb_data_client-2.2.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/competition_id_type_competition_generique.py +0 -0
  108. {ffbb_data_client-2.2.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/competition_origine.py +0 -0
  109. {ffbb_data_client-2.2.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/competition_origine_categorie.py +0 -0
  110. {ffbb_data_client-2.2.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/competition_origine_type_competition.py +0 -0
  111. {ffbb_data_client-2.2.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/competition_origine_type_competition_generique.py +0 -0
  112. {ffbb_data_client-2.2.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/competition_type.py +0 -0
  113. {ffbb_data_client-2.2.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/competitions_facet_distribution.py +0 -0
  114. {ffbb_data_client-2.2.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/competitions_facet_stats.py +0 -0
  115. {ffbb_data_client-2.2.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/competitions_hit.py +0 -0
  116. {ffbb_data_client-2.2.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/competitions_multi_search_query.py +0 -0
  117. {ffbb_data_client-2.2.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/competitions_query.py +0 -0
  118. {ffbb_data_client-2.2.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/configuration_models.py +0 -0
  119. {ffbb_data_client-2.2.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/contact_info.py +0 -0
  120. {ffbb_data_client-2.2.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/content_multi_search_query.py +0 -0
  121. {ffbb_data_client-2.2.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/coordonnees.py +0 -0
  122. {ffbb_data_client-2.2.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/coordonnees_type.py +0 -0
  123. {ffbb_data_client-2.2.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/document_flyer.py +0 -0
  124. {ffbb_data_client-2.2.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/document_flyer_type.py +0 -0
  125. {ffbb_data_client-2.2.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/engagement_contacts.py +0 -0
  126. {ffbb_data_client-2.2.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/engagements_facet_distribution.py +0 -0
  127. {ffbb_data_client-2.2.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/engagements_facet_stats.py +0 -0
  128. {ffbb_data_client-2.2.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/engagements_hit.py +0 -0
  129. {ffbb_data_client-2.2.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/engagements_multi_search_query.py +0 -0
  130. {ffbb_data_client-2.2.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/etat.py +0 -0
  131. {ffbb_data_client-2.2.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/external_competition_id.py +0 -0
  132. {ffbb_data_client-2.2.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/external_id.py +0 -0
  133. {ffbb_data_client-2.2.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/facet_distribution.py +0 -0
  134. {ffbb_data_client-2.2.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/facet_stats.py +0 -0
  135. {ffbb_data_client-2.2.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/field_set.py +0 -0
  136. {ffbb_data_client-2.2.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/folder.py +0 -0
  137. {ffbb_data_client-2.2.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/formation_session.py +0 -0
  138. {ffbb_data_client-2.2.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/formations_facet_distribution.py +0 -0
  139. {ffbb_data_client-2.2.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/formations_facet_stats.py +0 -0
  140. {ffbb_data_client-2.2.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/formations_hit.py +0 -0
  141. {ffbb_data_client-2.2.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/formations_multi_search_query.py +0 -0
  142. {ffbb_data_client-2.2.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/game_stats_model.py +0 -0
  143. {ffbb_data_client-2.2.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/game_stats_models.py +0 -0
  144. {ffbb_data_client-2.2.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/generic_search.py +0 -0
  145. {ffbb_data_client-2.2.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/geo.py +0 -0
  146. {ffbb_data_client-2.2.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/geo_sort_order.py +0 -0
  147. {ffbb_data_client-2.2.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/get_commune_response.py +0 -0
  148. {ffbb_data_client-2.2.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/get_configuration_response.py +0 -0
  149. {ffbb_data_client-2.2.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/get_engagement_response.py +0 -0
  150. {ffbb_data_client-2.2.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/get_entraineur_response.py +0 -0
  151. {ffbb_data_client-2.2.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/get_formation_response.py +0 -0
  152. {ffbb_data_client-2.2.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/get_officiel_response.py +0 -0
  153. {ffbb_data_client-2.2.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/get_poule_response.py +0 -0
  154. {ffbb_data_client-2.2.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/get_pratique_response.py +0 -0
  155. {ffbb_data_client-2.2.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/get_rencontre_response.py +0 -0
  156. {ffbb_data_client-2.2.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/get_saisons_response.py +0 -0
  157. {ffbb_data_client-2.2.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/get_salle_response.py +0 -0
  158. {ffbb_data_client-2.2.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/get_terrain_response.py +0 -0
  159. {ffbb_data_client-2.2.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/get_tournoi_response.py +0 -0
  160. {ffbb_data_client-2.2.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/gradient_color.py +0 -0
  161. {ffbb_data_client-2.2.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/hit.py +0 -0
  162. {ffbb_data_client-2.2.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/id_engagement_equipe.py +0 -0
  163. {ffbb_data_client-2.2.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/id_organisme_equipe.py +0 -0
  164. {ffbb_data_client-2.2.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/id_organisme_equipe1_logo.py +0 -0
  165. {ffbb_data_client-2.2.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/id_poule.py +0 -0
  166. {ffbb_data_client-2.2.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/jour.py +0 -0
  167. {ffbb_data_client-2.2.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/label.py +0 -0
  168. {ffbb_data_client-2.2.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/labellisation.py +0 -0
  169. {ffbb_data_client-2.2.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/live.py +0 -0
  170. {ffbb_data_client-2.2.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/lives.py +0 -0
  171. {ffbb_data_client-2.2.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/logo.py +0 -0
  172. {ffbb_data_client-2.2.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/multi_search_queries.py +0 -0
  173. {ffbb_data_client-2.2.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/multi_search_query.py +0 -0
  174. {ffbb_data_client-2.2.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/multi_search_result_competitions.py +0 -0
  175. {ffbb_data_client-2.2.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/multi_search_result_engagements.py +0 -0
  176. {ffbb_data_client-2.2.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/multi_search_result_formations.py +0 -0
  177. {ffbb_data_client-2.2.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/multi_search_result_organismes.py +0 -0
  178. {ffbb_data_client-2.2.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/multi_search_result_pratiques.py +0 -0
  179. {ffbb_data_client-2.2.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/multi_search_result_rencontres.py +0 -0
  180. {ffbb_data_client-2.2.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/multi_search_result_salles.py +0 -0
  181. {ffbb_data_client-2.2.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/multi_search_result_terrains.py +0 -0
  182. {ffbb_data_client-2.2.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/multi_search_result_tournois.py +0 -0
  183. {ffbb_data_client-2.2.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/multi_search_results.py +0 -0
  184. {ffbb_data_client-2.2.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/multi_search_results_class.py +0 -0
  185. {ffbb_data_client-2.2.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/nature_sol.py +0 -0
  186. {ffbb_data_client-2.2.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/niveau.py +0 -0
  187. {ffbb_data_client-2.2.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/niveau_class.py +0 -0
  188. {ffbb_data_client-2.2.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/niveau_extractor.py +0 -0
  189. {ffbb_data_client-2.2.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/niveau_info.py +0 -0
  190. {ffbb_data_client-2.2.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/niveau_models.py +0 -0
  191. {ffbb_data_client-2.2.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/niveau_type.py +0 -0
  192. {ffbb_data_client-2.2.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/objectif.py +0 -0
  193. {ffbb_data_client-2.2.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/organisateur.py +0 -0
  194. {ffbb_data_client-2.2.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/organisateur_type.py +0 -0
  195. {ffbb_data_client-2.2.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/organisme_fields.py +0 -0
  196. {ffbb_data_client-2.2.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/organisme_id_pere.py +0 -0
  197. {ffbb_data_client-2.2.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/organismes_facet_distribution.py +0 -0
  198. {ffbb_data_client-2.2.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/organismes_facet_stats.py +0 -0
  199. {ffbb_data_client-2.2.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/organismes_hit.py +0 -0
  200. {ffbb_data_client-2.2.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/organismes_multi_search_query.py +0 -0
  201. {ffbb_data_client-2.2.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/organismes_query.py +0 -0
  202. {ffbb_data_client-2.2.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/phase_code.py +0 -0
  203. {ffbb_data_client-2.2.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/poule.py +0 -0
  204. {ffbb_data_client-2.2.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/poule_fields.py +0 -0
  205. {ffbb_data_client-2.2.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/poule_rencontre_item_model.py +0 -0
  206. {ffbb_data_client-2.2.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/poules_models.py +0 -0
  207. {ffbb_data_client-2.2.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/poules_query.py +0 -0
  208. {ffbb_data_client-2.2.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/pratique.py +0 -0
  209. {ffbb_data_client-2.2.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/pratiques_facet_distribution.py +0 -0
  210. {ffbb_data_client-2.2.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/pratiques_facet_stats.py +0 -0
  211. {ffbb_data_client-2.2.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/pratiques_hit.py +0 -0
  212. {ffbb_data_client-2.2.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/pratiques_hit_type.py +0 -0
  213. {ffbb_data_client-2.2.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/pratiques_multi_search_query.py +0 -0
  214. {ffbb_data_client-2.2.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/pratiques_type_class.py +0 -0
  215. {ffbb_data_client-2.2.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/publication_internet.py +0 -0
  216. {ffbb_data_client-2.2.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/purple_logo.py +0 -0
  217. {ffbb_data_client-2.2.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/query_fields_manager.py +0 -0
  218. {ffbb_data_client-2.2.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/ranking_engagement.py +0 -0
  219. {ffbb_data_client-2.2.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/rankings_models.py +0 -0
  220. {ffbb_data_client-2.2.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/rencontres_engagement.py +0 -0
  221. {ffbb_data_client-2.2.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/rencontres_facet_distribution.py +0 -0
  222. {ffbb_data_client-2.2.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/rencontres_facet_stats.py +0 -0
  223. {ffbb_data_client-2.2.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/rencontres_hit.py +0 -0
  224. {ffbb_data_client-2.2.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/rencontres_multi_search_query.py +0 -0
  225. {ffbb_data_client-2.2.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/saison.py +0 -0
  226. {ffbb_data_client-2.2.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/saison_fields.py +0 -0
  227. {ffbb_data_client-2.2.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/saisons_models.py +0 -0
  228. {ffbb_data_client-2.2.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/saisons_query.py +0 -0
  229. {ffbb_data_client-2.2.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/salle.py +0 -0
  230. {ffbb_data_client-2.2.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/salles_facet_distribution.py +0 -0
  231. {ffbb_data_client-2.2.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/salles_facet_stats.py +0 -0
  232. {ffbb_data_client-2.2.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/salles_hit.py +0 -0
  233. {ffbb_data_client-2.2.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/salles_multi_search_query.py +0 -0
  234. {ffbb_data_client-2.2.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/sexe.py +0 -0
  235. {ffbb_data_client-2.2.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/sexe_class.py +0 -0
  236. {ffbb_data_client-2.2.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/source.py +0 -0
  237. {ffbb_data_client-2.2.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/status.py +0 -0
  238. {ffbb_data_client-2.2.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/team_engagement.py +0 -0
  239. {ffbb_data_client-2.2.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/team_ranking.py +0 -0
  240. {ffbb_data_client-2.2.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/terrains_categorie_championnat_3x3_libelle.py +0 -0
  241. {ffbb_data_client-2.2.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/terrains_facet_distribution.py +0 -0
  242. {ffbb_data_client-2.2.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/terrains_facet_stats.py +0 -0
  243. {ffbb_data_client-2.2.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/terrains_hit.py +0 -0
  244. {ffbb_data_client-2.2.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/terrains_multi_search_query.py +0 -0
  245. {ffbb_data_client-2.2.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/terrains_name.py +0 -0
  246. {ffbb_data_client-2.2.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/terrains_sexe_enum.py +0 -0
  247. {ffbb_data_client-2.2.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/terrains_storage.py +0 -0
  248. {ffbb_data_client-2.2.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/tournoi_type_class.py +0 -0
  249. {ffbb_data_client-2.2.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/tournoi_type_enum.py +0 -0
  250. {ffbb_data_client-2.2.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/tournoi_types_3x3.py +0 -0
  251. {ffbb_data_client-2.2.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/tournoi_types_3x3_libelle.py +0 -0
  252. {ffbb_data_client-2.2.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/tournoi_types_3x3_libelle_enum.py +0 -0
  253. {ffbb_data_client-2.2.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/tournois_facet_distribution.py +0 -0
  254. {ffbb_data_client-2.2.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/tournois_facet_stats.py +0 -0
  255. {ffbb_data_client-2.2.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/tournois_hit.py +0 -0
  256. {ffbb_data_client-2.2.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/tournois_hit_type.py +0 -0
  257. {ffbb_data_client-2.2.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/tournois_libelle.py +0 -0
  258. {ffbb_data_client-2.2.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/tournois_multi_search_query.py +0 -0
  259. {ffbb_data_client-2.2.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/type_association.py +0 -0
  260. {ffbb_data_client-2.2.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/type_association_libelle.py +0 -0
  261. {ffbb_data_client-2.2.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/type_class.py +0 -0
  262. {ffbb_data_client-2.2.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/type_competition.py +0 -0
  263. {ffbb_data_client-2.2.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/type_competition_generique.py +0 -0
  264. {ffbb_data_client-2.2.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/type_enum.py +0 -0
  265. {ffbb_data_client-2.2.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/models/type_league.py +0 -0
  266. {ffbb_data_client-2.2.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/py.typed +0 -0
  267. {ffbb_data_client-2.2.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/utils/__init__.py +0 -0
  268. {ffbb_data_client-2.2.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/utils/cache_manager.py +0 -0
  269. {ffbb_data_client-2.2.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/utils/converter_utils.py +0 -0
  270. {ffbb_data_client-2.2.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/utils/input_validation.py +0 -0
  271. {ffbb_data_client-2.2.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/utils/retry_utils.py +0 -0
  272. {ffbb_data_client-2.2.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/utils/secure_logging.py +0 -0
  273. {ffbb_data_client-2.2.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client/utils/token_manager.py +0 -0
  274. {ffbb_data_client-2.2.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client.egg-info/dependency_links.txt +0 -0
  275. {ffbb_data_client-2.2.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client.egg-info/not-zip-safe +0 -0
  276. {ffbb_data_client-2.2.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client.egg-info/requires.txt +0 -0
  277. {ffbb_data_client-2.2.0 → ffbb_data_client-2.3.0}/src/ffbb_data_client.egg-info/top_level.txt +0 -0
  278. {ffbb_data_client-2.2.0 → ffbb_data_client-2.3.0}/tests/conftest.py +0 -0
  279. {ffbb_data_client-2.2.0 → ffbb_data_client-2.3.0}/tests/e2e/__init__.py +0 -0
  280. {ffbb_data_client-2.2.0 → ffbb_data_client-2.3.0}/tests/e2e/conftest.py +0 -0
  281. {ffbb_data_client-2.2.0 → ffbb_data_client-2.3.0}/tests/integration/__init__.py +0 -0
  282. {ffbb_data_client-2.2.0 → ffbb_data_client-2.3.0}/tests/integration/conftest.py +0 -0
  283. {ffbb_data_client-2.2.0 → ffbb_data_client-2.3.0}/tests/integration/test_500_user_journey.py +0 -0
  284. {ffbb_data_client-2.2.0 → ffbb_data_client-2.3.0}/tests/integration/test_501_user_journey_v3.py +0 -0
  285. {ffbb_data_client-2.2.0 → ffbb_data_client-2.3.0}/tests/integration/test_502_enhanced_integration.py +0 -0
  286. {ffbb_data_client-2.2.0 → ffbb_data_client-2.3.0}/tests/integration/test_503_secure_logging.py +0 -0
  287. {ffbb_data_client-2.2.0 → ffbb_data_client-2.3.0}/tests/integration/test_506_raw_json_model_conversion.py +0 -0
  288. {ffbb_data_client-2.2.0 → ffbb_data_client-2.3.0}/tests/unit/__init__.py +0 -0
  289. {ffbb_data_client-2.2.0 → ffbb_data_client-2.3.0}/tests/unit/clients/__init__.py +0 -0
  290. {ffbb_data_client-2.2.0 → ffbb_data_client-2.3.0}/tests/unit/clients/test_200_api_ffbb_app_client.py +0 -0
  291. {ffbb_data_client-2.2.0 → ffbb_data_client-2.3.0}/tests/unit/clients/test_202_meilisearch_client.py +0 -0
  292. {ffbb_data_client-2.2.0 → ffbb_data_client-2.3.0}/tests/unit/clients/test_203_meilisearch_client_extension.py +0 -0
  293. {ffbb_data_client-2.2.0 → ffbb_data_client-2.3.0}/tests/unit/clients/test_204_ffbb_data_client.py +0 -0
  294. {ffbb_data_client-2.2.0 → ffbb_data_client-2.3.0}/tests/unit/clients/test_205_meilisearch_ffbb_client.py +0 -0
  295. {ffbb_data_client-2.2.0 → ffbb_data_client-2.3.0}/tests/unit/clients/test_206_coverage_gaps_clients.py +0 -0
  296. {ffbb_data_client-2.2.0 → ffbb_data_client-2.3.0}/tests/unit/clients/test_207_coverage_clients_extended.py +0 -0
  297. {ffbb_data_client-2.2.0 → ffbb_data_client-2.3.0}/tests/unit/clients/test_208_new_methods_coverage.py +0 -0
  298. {ffbb_data_client-2.2.0 → ffbb_data_client-2.3.0}/tests/unit/clients/test_209_automatic_token_resolution.py +0 -0
  299. {ffbb_data_client-2.2.0 → ffbb_data_client-2.3.0}/tests/unit/clients/test_210_targeted_clients_helpers_coverage.py +0 -0
  300. {ffbb_data_client-2.2.0 → ffbb_data_client-2.3.0}/tests/unit/clients/test_async_methods.py +0 -0
  301. {ffbb_data_client-2.2.0 → ffbb_data_client-2.3.0}/tests/unit/clients/test_meilisearch_async.py +0 -0
  302. {ffbb_data_client-2.2.0 → ffbb_data_client-2.3.0}/tests/unit/clients/test_v2_backport_search.py +0 -0
  303. {ffbb_data_client-2.2.0 → ffbb_data_client-2.3.0}/tests/unit/clients/test_v3_new_features.py +0 -0
  304. {ffbb_data_client-2.2.0 → ffbb_data_client-2.3.0}/tests/unit/conftest.py +0 -0
  305. {ffbb_data_client-2.2.0 → ffbb_data_client-2.3.0}/tests/unit/helpers/__init__.py +0 -0
  306. {ffbb_data_client-2.2.0 → ffbb_data_client-2.3.0}/tests/unit/helpers/test_400_http_helpers.py +0 -0
  307. {ffbb_data_client-2.2.0 → ffbb_data_client-2.3.0}/tests/unit/helpers/test_meilisearch_client_extension_recursive_pagination.py +0 -0
  308. {ffbb_data_client-2.2.0 → ffbb_data_client-2.3.0}/tests/unit/models/__init__.py +0 -0
  309. {ffbb_data_client-2.2.0 → ffbb_data_client-2.3.0}/tests/unit/models/test_100_competition_id_categorie.py +0 -0
  310. {ffbb_data_client-2.2.0 → ffbb_data_client-2.3.0}/tests/unit/models/test_101_competition_id_sexe.py +0 -0
  311. {ffbb_data_client-2.2.0 → ffbb_data_client-2.3.0}/tests/unit/models/test_102_competition_id_type_competition.py +0 -0
  312. {ffbb_data_client-2.2.0 → ffbb_data_client-2.3.0}/tests/unit/models/test_103_competition_id_type_competition_generique.py +0 -0
  313. {ffbb_data_client-2.2.0 → ffbb_data_client-2.3.0}/tests/unit/models/test_104_competition_origine_categorie.py +0 -0
  314. {ffbb_data_client-2.2.0 → ffbb_data_client-2.3.0}/tests/unit/models/test_105_competition_origine_type_competition_generique.py +0 -0
  315. {ffbb_data_client-2.2.0 → ffbb_data_client-2.3.0}/tests/unit/models/test_106_competition_origine.py +0 -0
  316. {ffbb_data_client-2.2.0 → ffbb_data_client-2.3.0}/tests/unit/models/test_107_id_engagement_equipe.py +0 -0
  317. {ffbb_data_client-2.2.0 → ffbb_data_client-2.3.0}/tests/unit/models/test_108_id_organisme_equipe.py +0 -0
  318. {ffbb_data_client-2.2.0 → ffbb_data_client-2.3.0}/tests/unit/models/test_109_id_organisme_equipe1_logo.py +0 -0
  319. {ffbb_data_client-2.2.0 → ffbb_data_client-2.3.0}/tests/unit/models/test_110_labellisation.py +0 -0
  320. {ffbb_data_client-2.2.0 → ffbb_data_client-2.3.0}/tests/unit/models/test_111_niveau_class.py +0 -0
  321. {ffbb_data_client-2.2.0 → ffbb_data_client-2.3.0}/tests/unit/models/test_112_purple_logo.py +0 -0
  322. {ffbb_data_client-2.2.0 → ffbb_data_client-2.3.0}/tests/unit/models/test_113_salle.py +0 -0
  323. {ffbb_data_client-2.2.0 → ffbb_data_client-2.3.0}/tests/unit/models/test_114_tournoi_type_class.py +0 -0
  324. {ffbb_data_client-2.2.0 → ffbb_data_client-2.3.0}/tests/unit/models/test_115_type_association_libelle.py +0 -0
  325. {ffbb_data_client-2.2.0 → ffbb_data_client-2.3.0}/tests/unit/models/test_116_type_competition_generique.py +0 -0
  326. {ffbb_data_client-2.2.0 → ffbb_data_client-2.3.0}/tests/unit/models/test_117_organisateur.py +0 -0
  327. {ffbb_data_client-2.2.0 → ffbb_data_client-2.3.0}/tests/unit/models/test_118_competition_id.py +0 -0
  328. {ffbb_data_client-2.2.0 → ffbb_data_client-2.3.0}/tests/unit/models/test_119_terrains_inner_models.py +0 -0
  329. {ffbb_data_client-2.2.0 → ffbb_data_client-2.3.0}/tests/unit/models/test_120_pratiques_inner_models.py +0 -0
  330. {ffbb_data_client-2.2.0 → ffbb_data_client-2.3.0}/tests/unit/models/test_121_to_dict_round_trip.py +0 -0
  331. {ffbb_data_client-2.2.0 → ffbb_data_client-2.3.0}/tests/unit/models/test_122_coverage_gaps.py +0 -0
  332. {ffbb_data_client-2.2.0 → ffbb_data_client-2.3.0}/tests/unit/models/test_123_missing_coverage.py +0 -0
  333. {ffbb_data_client-2.2.0 → ffbb_data_client-2.3.0}/tests/unit/models/test_123_v2_backport.py +0 -0
  334. {ffbb_data_client-2.2.0 → ffbb_data_client-2.3.0}/tests/unit/models/test_124_targeted_coverage_gains.py +0 -0
  335. {ffbb_data_client-2.2.0 → ffbb_data_client-2.3.0}/tests/unit/models/test_dx_aliases.py +0 -0
  336. {ffbb_data_client-2.2.0 → ffbb_data_client-2.3.0}/tests/unit/utils/__init__.py +0 -0
  337. {ffbb_data_client-2.2.0 → ffbb_data_client-2.3.0}/tests/unit/utils/test_300_secure_logging.py +0 -0
  338. {ffbb_data_client-2.2.0 → ffbb_data_client-2.3.0}/tests/unit/utils/test_301_input_validation.py +0 -0
  339. {ffbb_data_client-2.2.0 → ffbb_data_client-2.3.0}/tests/unit/utils/test_302_retry_utils.py +0 -0
  340. {ffbb_data_client-2.2.0 → ffbb_data_client-2.3.0}/tests/unit/utils/test_303_cache_manager.py +0 -0
  341. {ffbb_data_client-2.2.0 → ffbb_data_client-2.3.0}/tests/unit/utils/test_304_config.py +0 -0
  342. {ffbb_data_client-2.2.0 → ffbb_data_client-2.3.0}/tests/unit/utils/test_305_token_manager.py +0 -0
  343. {ffbb_data_client-2.2.0 → ffbb_data_client-2.3.0}/tests/unit/utils/test_306_converter_utils.py +0 -0
  344. {ffbb_data_client-2.2.0 → ffbb_data_client-2.3.0}/tests/unit/utils/test_307_coverage_gaps_utils.py +0 -0
  345. {ffbb_data_client-2.2.0 → ffbb_data_client-2.3.0}/tox.ini +0 -0
  346. {ffbb_data_client-2.2.0 → ffbb_data_client-2.3.0}/website/assets/logo.webp +0 -0
  347. {ffbb_data_client-2.2.0 → ffbb_data_client-2.3.0}/website/css/style.css +0 -0
  348. {ffbb_data_client-2.2.0 → ffbb_data_client-2.3.0}/website/index.html +0 -0
  349. {ffbb_data_client-2.2.0 → ffbb_data_client-2.3.0}/website/robots.txt +0 -0
  350. {ffbb_data_client-2.2.0 → ffbb_data_client-2.3.0}/website/sitemap.xml +0 -0
@@ -0,0 +1,32 @@
1
+ # RTK - Rust Token Killer (Google Antigravity)
2
+
3
+ **Usage**: Token-optimized CLI proxy for shell commands.
4
+
5
+ ## Rule
6
+
7
+ Always prefix shell commands with `rtk` to minimize token consumption.
8
+
9
+ Examples:
10
+
11
+ ```bash
12
+ rtk git status
13
+ rtk cargo test
14
+ rtk ls src/
15
+ rtk grep "pattern" src/
16
+ rtk find "*.rs" .
17
+ rtk docker ps
18
+ rtk gh pr list
19
+ ```
20
+
21
+ ## Meta Commands
22
+
23
+ ```bash
24
+ rtk gain # Show token savings
25
+ rtk gain --history # Command history with savings
26
+ rtk discover # Find missed RTK opportunities
27
+ rtk proxy <cmd> # Run raw (no filtering, for debugging)
28
+ ```
29
+
30
+ ## Why
31
+
32
+ RTK filters and compresses command output before it reaches the LLM context, saving 60-90% tokens on common operations. Always use `rtk <cmd>` instead of raw commands.
@@ -35,7 +35,7 @@ jobs:
35
35
  - name: Detect structural discovery changes
36
36
  id: changes
37
37
  run: |
38
- if grep -Eq '^- (Added|Removed): \[' data/api_update_summary.md; then
38
+ if grep -Eq '^- (Added|Removed): \[' data/api_update_summary.md || grep -q 'drift' data/api_update_summary.md; then
39
39
  echo "changed=true" >> "$GITHUB_OUTPUT"
40
40
  else
41
41
  echo "changed=false" >> "$GITHUB_OUTPUT"
@@ -0,0 +1,260 @@
1
+ # FFBB Data Client SDK
2
+
3
+ > ⚠️ **Fichier auto-généré** par `tools/update_agents_md.py` — ne pas modifier manuellement.
4
+ > Dernière mise à jour : ffbb-data-client | SDK total : ~18767 lignes de code
5
+ > (clients: 6259, models: 9878, utils: 1840, helpers: 790)
6
+
7
+ ## Langue
8
+ Tous les documents de travail (walkthrough.md, implementation_plan.md) DOIVENT être en français.
9
+
10
+ ## Persona
11
+ Expert en basketball français et intégration technique.
12
+ Accès au SDK Python de bas niveau `ffbb-data-client` connecté à l'API et au Meilisearch officiel de la FFBB.
13
+
14
+ ## Méthodes REST du Client (Exemples importants)
15
+ Le SDK expose les méthodes directes de récupération de données suivantes via `FFBBDataClient` :
16
+ - `get_organisme_for_search` : Version allégée de get_organisme() pour les contextes de recherche
17
+ - `get_organisme_for_search_async` : Version async allégée de get_organisme() pour les contextes de recherche
18
+ - `get_configuration` : Retrieves the API configuration including bearer tokens
19
+ - `get_configuration_async` : Retrieves the API configuration including bearer tokens asynchronously
20
+ - `get_competition` : Retrieves detailed information about a competition
21
+ - `get_competition_async` : Retrieves detailed information about a competition asynchronously
22
+ - `list_competitions` : Lists competitions with optional field selection
23
+ - `list_competitions_async` : Lists competitions asynchronously
24
+ - `get_lives` : Retrieves a list of live events
25
+ - `get_lives_async` : Retrieves a list of live events asynchronously
26
+ - `get_organisme` : Retrieves detailed information about an organisme
27
+ - `get_organisme_async` : Retrieves detailed information about an organisme asynchronously
28
+ - `get_club_contacts` : Return club contact information (club-level + membres) for an organisme
29
+ - `get_poule` : Retrieves detailed information about a poule
30
+ - `get_poule_async` : Retrieves detailed information about a poule asynchronously
31
+ - `get_saisons` : Retrieves list of seasons with comprehensive input validation
32
+ - `get_saisons_async` : Retrieves list of seasons asynchronously with input validation
33
+ - `get_classement` : Retrieves ONLY the ranking (classement) for a specific poule
34
+ - `get_classement_async` : Retrieves ONLY the ranking (classement) for a specific poule asynchronously
35
+ - `get_equipes` : Retrieves ONLY the team commitments (engagements) for a specific club
36
+ - `get_equipes_async` : Retrieves ONLY the team commitments (engagements) for a specific club asynchronously
37
+ - `get_rencontre` : Retrieves detailed information about a rencontre
38
+ - `get_rencontre_async` : Asynchronously retrieves detailed information about a rencontre
39
+ - `get_engagement` : Retrieves detailed information about an engagement
40
+ - `get_engagement_async` : Asynchronously retrieves detailed information about an engagement
41
+ - `get_engagement_contacts` : Return compact contact information for an engagement
42
+ - `get_formation` : Retrieves detailed information about a formation
43
+ - `get_formation_async` : Asynchronously retrieves detailed information about a formation
44
+ - `get_entraineur` : Retrieves detailed information about an entraineur
45
+ - `get_entraineur_async` : Asynchronously retrieves detailed information about an entraineur
46
+ - `get_commune` : Retrieves detailed information about a commune
47
+ - `get_commune_async` : Asynchronously retrieves detailed information about a commune
48
+ - `get_officiel` : Retrieves detailed information about an officiel
49
+ - `get_officiel_async` : Asynchronously retrieves detailed information about an officiel
50
+ - `get_salle` : Retrieves detailed information about a salle
51
+ - `get_salle_async` : Asynchronously retrieves detailed information about a salle
52
+ - `get_terrain` : Retrieves detailed information about a terrain
53
+ - `get_terrain_async` : Asynchronously retrieves detailed information about a terrain
54
+ - `get_tournoi` : Retrieves detailed information about a tournoi
55
+ - `get_tournoi_async` : Asynchronously retrieves detailed information about a tournoi
56
+ - `get_pratique` : Retrieves detailed information about a pratique
57
+ - `get_pratique_async` : Asynchronously retrieves detailed information about a pratique
58
+ - `get_openapi_spec` : Retrieves the current Directus OpenAPI specification
59
+ - `get_openapi_spec_async` : Asynchronously retrieves the current Directus OpenAPI specification
60
+ - `get_session` : Retrieves detailed information about a formation session
61
+ - `get_session_async` : Asynchronously retrieves detailed information about a formation session
62
+ - `list_sessions` : Lists formation sessions
63
+ - `list_sessions_async` : Asynchronously lists formation sessions
64
+ - `get_genius_sport_match` : Retrieves detailed Genius Sports match statistics
65
+ - `get_genius_sport_match_async` : Asynchronously retrieves detailed Genius Sports match statistics
66
+ - `list_genius_sport_matches` : Lists Genius Sports match statistics
67
+ - `list_genius_sport_matches_async` : Asynchronously lists Genius Sports match statistics
68
+ - `list_genius_sports_live_logs` : Lists Genius Sports live logs
69
+ - `list_genius_sports_live_logs_async` : Asynchronously lists Genius Sports live logs
70
+ - `get_rematch_video` : Retrieves a Rematch video linked to FFBB data
71
+ - `get_rematch_video_async` : Asynchronously retrieves a Rematch video linked to FFBB data
72
+ - `list_rematch_videos` : Lists Rematch videos linked to FFBB data
73
+ - `list_rematch_videos_async` : Asynchronously lists Rematch videos linked to FFBB data
74
+ - `get_edf_match` : Retrieves an Equipe de France match
75
+ - `get_edf_match_async` : Asynchronously retrieves an Equipe de France match
76
+ - `list_edf_matches` : Lists Equipe de France matches
77
+ - `list_edf_matches_async` : Asynchronously lists Equipe de France matches
78
+ - `get_edf_player` : Retrieves an Equipe de France player
79
+ - `get_edf_player_async` : Asynchronously retrieves an Equipe de France player
80
+ - `list_edf_players` : Lists Equipe de France players
81
+ - `list_edf_players_async` : Asynchronously lists Equipe de France players
82
+ - `list_edf_teams` : Lists Equipe de France teams
83
+ - `list_edf_teams_async` : Asynchronously lists Equipe de France teams
84
+ - `list_edf_rosters` : Lists Equipe de France rosters
85
+ - `list_edf_rosters_async` : Asynchronously lists Equipe de France rosters
86
+ - `list_rencontres` :
87
+ - `list_rencontres_async` :
88
+ - `list_salles` :
89
+ - `list_salles_async` :
90
+ - `list_terrains` :
91
+ - `list_terrains_async` :
92
+ - `list_tournois` :
93
+ - `list_tournois_async` :
94
+ - `list_engagements` :
95
+ - `list_engagements_async` :
96
+ - `list_formations` :
97
+ - `list_formations_async` :
98
+ - `list_entraineurs` :
99
+ - `list_entraineurs_async` :
100
+ - `list_communes` :
101
+ - `list_communes_async` :
102
+ - `list_officiels` :
103
+ - `list_officiels_async` :
104
+ - `list_pratiques` :
105
+ - `list_pratiques_async` :
106
+ - `list_all_rencontres` :
107
+ - `list_all_rencontres_async` :
108
+ - `list_all_salles` :
109
+ - `list_all_salles_async` :
110
+ - `list_all_terrains` :
111
+ - `list_all_terrains_async` :
112
+ - `list_all_tournois` :
113
+ - `list_all_tournois_async` :
114
+ - `list_all_engagements` :
115
+ - `list_all_engagements_async` :
116
+ - `list_all_formations` :
117
+ - `list_all_formations_async` :
118
+ - `list_all_entraineurs` :
119
+ - `list_all_entraineurs_async` :
120
+ - `list_all_communes` :
121
+ - `list_all_communes_async` :
122
+ - `list_all_officiels` :
123
+ - `list_all_officiels_async` :
124
+ - `list_all_pratiques` :
125
+ - `list_all_pratiques_async` :
126
+ - `list_engagements_by_ids` :
127
+ - `list_engagements_by_poule` :
128
+ - `list_engagements_by_poules` :
129
+ - `list_rencontres_by_poule` :
130
+ - `list_rencontres_by_poules` :
131
+ - `list_entraineurs_by_ids` :
132
+
133
+ ## Méthodes de Recherche Meilisearch (Exemples importants)
134
+ Le SDK expose également des méthodes de recherche optimisées avec facettes, géolocalisation et filtres via Meilisearch :
135
+ - `multi_search` : Perform multi-search across all resource types with input validation
136
+ - `multi_search_async` : Performs a smart multi-search asynchronously
137
+ - `search_competitions` :
138
+ - `search_multiple_competitions` :
139
+ - `search_competitions_async` : Search for competitions asynchronously
140
+ - `search_multiple_competitions_async` : Search for multiple competitions asynchronously
141
+ - `search_organismes` :
142
+ - `search_organismes_by_geo` :
143
+ - `search_organismes_by_city` :
144
+ - `search_multiple_organismes` :
145
+ - `search_organismes_async` : Search for organismes asynchronously
146
+ - `search_multiple_organismes_async` : Search for multiple organismes asynchronously
147
+ - `search_pratiques` :
148
+ - `search_multiple_pratiques` :
149
+ - `search_pratiques_async` : Search for pratiques asynchronously
150
+ - `search_multiple_pratiques_async` : Search for multiple pratiques asynchronously
151
+ - `search_rencontres` :
152
+ - `search_multiple_rencontres` :
153
+ - `search_rencontres_async` : Search for rencontres asynchronously
154
+ - `search_multiple_rencontres_async` : Search for multiple rencontres asynchronously
155
+ - `search_salles` :
156
+ - `search_salles_by_geo` :
157
+ - `search_multiple_salles` :
158
+ - `search_salles_async` : Search for salles asynchronously
159
+ - `search_multiple_salles_async` : Search for multiple salles asynchronously
160
+ - `search_terrains` :
161
+ - `search_multiple_terrains` :
162
+ - `search_terrains_async` : Search for terrains asynchronously
163
+ - `search_multiple_terrains_async` : Search for multiple terrains asynchronously
164
+ - `search_tournois` :
165
+ - `search_multiple_tournois` :
166
+ - `search_tournois_async` : Search for tournois asynchronously
167
+ - `search_multiple_tournois_async` : Search for multiple tournois asynchronously
168
+ - `search_engagements` :
169
+ - `search_engagements_by_geo` :
170
+ - `search_engagements_filtered` :
171
+ - `search_multiple_engagements` :
172
+ - `search_engagements_async` : Search for engagements asynchronously
173
+ - `search_multiple_engagements_async` : Search for multiple engagements asynchronously
174
+ - `search_formations` :
175
+ - `search_multiple_formations` :
176
+ - `search_formations_async` : Search for formations asynchronously
177
+ - `search_multiple_formations_async` : Search for multiple formations asynchronously
178
+ - `search_news` :
179
+ - `search_multiple_news` :
180
+ - `search_youtube_videos` :
181
+ - `search_multiple_youtube_videos` :
182
+ - `search_rss` :
183
+ - `search_multiple_rss` :
184
+ - `search_galeries` :
185
+ - `search_multiple_galeries` :
186
+
187
+ ## Variables d'environnement
188
+ Le SDK résout automatiquement les jetons de sécurité via les variables d'environnement suivantes
189
+ ou interroge l'API publique en cache en cas d'absence :
190
+
191
+ | Variable | Défaut | Usage |
192
+ |----------|--------|-------|
193
+ | `API_FFBB_APP_BEARER_TOKEN` | — | Jeton Bearer de sécurité pour requêter directement l'API FFBB (api.ffbb.app) |
194
+ | `MEILISEARCH_BEARER_TOKEN` | — | Jeton Bearer de sécurité pour interroger le moteur Meilisearch (meilisearch-prod.ffbb.app) |
195
+
196
+ ## Règles de comportement des agents
197
+ - **RTK OBLIGATOIRE** : Utilisez TOUJOURS le préfixe `rtk` pour toutes les commandes terminal
198
+ exécutées sur la machine de l'utilisateur (ex: `rtk pytest`, `rtk tox`, etc.).
199
+ - **Tox & Pytest** : Privilégiez l'exécution des tests via `pytest` local ou `tox` pour valider
200
+ les évolutions du SDK sur les différentes versions de Python prises en charge.
201
+ - **Modèles typés** : Respectez scrupuleusement la déclaration des types Pydantic de `ffbb_data_client.models`.
202
+ Tout nouveau modèle ou modification de champ doit correspondre aux spécifications de l'API FFBB.
203
+ - **Réponses en français** : Communiquez et expliquez toujours vos changements ou vos analyses en langue française.
204
+
205
+ ## Karpathy Guidelines (Règles de développement)
206
+ Ces directives inspirées d'Andrej Karpathy visent à éliminer les erreurs de codage courantes en privilégiant la simplicité et la rigueur :
207
+
208
+ ### 1. Penser avant de coder (Think Before Coding)
209
+ - **Ne pas assumer, ne pas cacher la confusion, expliciter les compromis.**
210
+ - Avant d'implémenter :
211
+ - Déclarez vos hypothèses de manière explicite. En cas d'incertitude, demandez.
212
+ - S'il existe plusieurs interprétations, présentez-les — ne choisissez pas en silence.
213
+ - Si une approche plus simple existe, proposez-la. Argumentez contre la complexité inutile si nécessaire.
214
+ - Si quelque chose n'est pas clair, arrêtez-vous. Nommez ce qui vous perturbe et demandez confirmation.
215
+
216
+ ### 2. La simplicité d'abord (Simplicity First)
217
+ - **Le minimum de code nécessaire pour résoudre le problème. Rien de spéculatif.**
218
+ - Pas de fonctionnalités au-delà de ce qui est explicitement demandé.
219
+ - Pas d'abstractions pour du code à usage unique.
220
+ - Pas de "flexibilité" ou de "configurabilité" non requise.
221
+ - Pas de gestion d'erreurs pour des scénarios impossibles.
222
+ - Si vous écrivez 200 lignes alors que 50 suffiraient, réécrivez-le.
223
+ - Posez-vous toujours la question : "Est-ce qu'un développeur senior validerait cette implémentation comme simple et directe ?"
224
+
225
+ ## Architecture du SDK
226
+ ```
227
+ src/ffbb_data_client/
228
+ ├── __init__.py # Point d'entrée du SDK, expose FFBBDataClient et FFBBTokens
229
+ ├── clients/ # Clients d'API (REST et Meilisearch) et façades (≈6259 lignes)
230
+ ├── config.py # Configuration centralisée (URLs, Headers, Endpoints, Facettes)
231
+ ├── data/ # Ressources et données statiques
232
+ ├── helpers/ # Méthodes utilitaires pour requêtes HTTP et mapping (≈790 lignes)
233
+ ├── models/ # Modèles de données Pydantic type-safe (≈9878 lignes)
234
+ ├── py.typed # Marqueur pour la compatibilité avec mypy
235
+ └── utils/ # Gestionnaires transversaux (cache, jetons de sécurité, validation) (≈1840 lignes)
236
+ ```
237
+
238
+ ## Conventions de code
239
+ - **Modèles Pydantic** : Tous les modèles héritent de `pydantic.BaseModel` et fournissent une validation stricte.
240
+ - **Async/Sync en parallèle** : Le SDK implémente systématiquement la double interface synchrone (`get_x`)
241
+ et asynchrone (`get_x_async`) pour un maximum de flexibilité d'intégration.
242
+ - **Cache HTTP** : Utilisation d'`hishel` pour le cache de requêtes HTTP asynchrones et d'un cache local
243
+ configurable pour optimiser les appels et respecter les quotas FFBB.
244
+ - **Validation** : Les paramètres passés à `FFBBDataClient.create` sont strictement validés
245
+ via les utilitaires de validation robustes de `utils/input_validation.py`.
246
+
247
+ ## Commandes courantes
248
+ - Lancer les tests locaux : `rtk pytest`
249
+ - Lancer la suite d'intégration Tox : `rtk tox`
250
+ - Vérifier les types : `rtk mypy src`
251
+ - Formater et vérifier le style : `rtk ruff format . && rtk ruff check .`
252
+
253
+ ## Push / Tag / Release Gate
254
+ ⚠️ OBLIGATION STRICTE : Toutes ces commandes DOIVENT être préfixées par 'rtk' dans le terminal
255
+ (ex: 'rtk pytest'). Ne jamais exécuter de commande nue sans 'rtk'.
256
+ Avant push/tag/release :
257
+ 1. `rtk ruff format --check .`
258
+ 2. `rtk ruff check .`
259
+ 3. `rtk mypy src`
260
+ 4. `rtk pytest`
@@ -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
+ ## [2.3.0] - 2026-05-24
9
+
10
+ ### Added
11
+ - **API Schema Drift Detection**: Automated detection of changes inside Directus OpenAPI schemas (added/removed/modified properties, nested types, and nullability changes)
12
+ - **Meilisearch Attributes Drift Detection**: Automated detection of changes inside Meilisearch index schemas (`sampleKeys`) with robust sampling over 20 hits
13
+ - **CI/CD Pull Request Automation**: Pre-commit hooks and GitHub Actions workflow automatically open a Pull Request when any API property or index drift is detected
14
+ - Detailed Schema Drift reporting in `data/api_update_summary.md` and `report["drift"]` payload
15
+
16
+ ### Fixed
17
+ - Robust Meilisearch sampling: index keys are now aggregated across 20 hits instead of 1, preventing false positives on optional null fields
18
+ - Pre-commit & flake8 E501 line too long violations in `tools/update_agents_md.py`
19
+ - Formatted `AGENTS.md` spacing and line wrapping for flawless agent ingestion
20
+
8
21
  ## [2.2.0] - 2026-05-17
9
22
 
10
23
  ### Changed
@@ -1,28 +1,3 @@
1
- .. todo:: THIS IS SUPPOSED TO BE AN EXAMPLE. MODIFY IT ACCORDING TO YOUR NEEDS!
2
-
3
- The document assumes you are using a source repository service that promotes a
4
- contribution model similar to `GitHub's fork and pull request workflow`_.
5
- While this is true for the majority of services (like GitHub, GitLab,
6
- BitBucket), it might not be the case for private repositories (e.g., when
7
- using Gerrit).
8
-
9
- Also notice that the code examples might refer to GitHub URLs or the text
10
- might use GitHub specific terminology (e.g., *Pull Request* instead of *Merge
11
- Request*).
12
-
13
- Please make sure to check the document having these assumptions in mind
14
- and update things accordingly.
15
-
16
- .. todo:: Provide the correct links/replacements at the bottom of the document.
17
-
18
- .. todo:: You might want to have a look on `PyScaffold's contributor's guide`_,
19
-
20
- especially if your project is open source. The text should be very similar to
21
- this template, but there are a few extra contents that you might decide to
22
- also include, like mentioning labels of your issue tracker or automated
23
- releases.
24
-
25
-
26
1
  ============
27
2
  Contributing
28
3
  ============
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: ffbb-data-client
3
- Version: 2.2.0
3
+ Version: 2.3.0
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
@@ -316,6 +316,28 @@ Documentation complémentaire :
316
316
 
317
317
  ---
318
318
 
319
+ ## 🛠️ Découverte d'API et Détection de Drift (Schema Drift)
320
+
321
+ Le projet intègre un système robuste de surveillance quotidienne de l'API de production de la FFBB (Directus & Meilisearch) afin de détecter immédiatement l'apparition de nouvelles ressources, de nouveaux champs ou de changements de types.
322
+
323
+ ### 1. Fonctionnement
324
+ * **Script de découverte** : `scripts/discover_endpoints.py` interroge dynamiquement l'OpenAPI spec Directus de la FFBB, extrait toutes les collections, sonde les index Meilisearch (via un échantillonnage agrégé sur 20 hits) et calcule les différences structurelles avec les fichiers locaux.
325
+ * **Détection de dérive** : Le script compare les structures internes de chaque modèle (propriétés ajoutées, supprimées ou types modifiés) ainsi que les attributs Meilisearch, et génère un rapport consolidé dans `data/api_update_summary.md`.
326
+
327
+ ### 2. Automatisation CI/CD
328
+ Un workflow quotidien (`update-ffbb-api-discovery.yml`) s'exécute chaque matin à 5h17 UTC pour :
329
+ 1. Télécharger l'OpenAPI spec et sonder Meilisearch en production.
330
+ 2. Analyser les dérives structurelles.
331
+ 3. Si un changement structurel est détecté (ajout de collection, de propriétés ou d'index), le workflow ouvre automatiquement une **Pull Request** sur GitHub contenant un résumé des modifications pour permettre aux développeurs de mettre à jour les modèles Pydantic.
332
+
333
+ ### 3. Exécution locale
334
+ Pour lancer manuellement la découverte d'API et mettre à jour les fichiers de schémas locaux :
335
+ ```bash
336
+ python scripts/discover_endpoints.py
337
+ ```
338
+
339
+ ---
340
+
319
341
  ## 🤖 Intégration IA / MCP
320
342
 
321
343
  Le client sert de base au serveur MCP FFBB et expose une API stable pour construire des outils agent-friendly : recherche de clubs, récupération de poules, classements, lives, calendriers et détails de rencontres.
@@ -264,6 +264,28 @@ Documentation complémentaire :
264
264
 
265
265
  ---
266
266
 
267
+ ## 🛠️ Découverte d'API et Détection de Drift (Schema Drift)
268
+
269
+ Le projet intègre un système robuste de surveillance quotidienne de l'API de production de la FFBB (Directus & Meilisearch) afin de détecter immédiatement l'apparition de nouvelles ressources, de nouveaux champs ou de changements de types.
270
+
271
+ ### 1. Fonctionnement
272
+ * **Script de découverte** : `scripts/discover_endpoints.py` interroge dynamiquement l'OpenAPI spec Directus de la FFBB, extrait toutes les collections, sonde les index Meilisearch (via un échantillonnage agrégé sur 20 hits) et calcule les différences structurelles avec les fichiers locaux.
273
+ * **Détection de dérive** : Le script compare les structures internes de chaque modèle (propriétés ajoutées, supprimées ou types modifiés) ainsi que les attributs Meilisearch, et génère un rapport consolidé dans `data/api_update_summary.md`.
274
+
275
+ ### 2. Automatisation CI/CD
276
+ Un workflow quotidien (`update-ffbb-api-discovery.yml`) s'exécute chaque matin à 5h17 UTC pour :
277
+ 1. Télécharger l'OpenAPI spec et sonder Meilisearch en production.
278
+ 2. Analyser les dérives structurelles.
279
+ 3. Si un changement structurel est détecté (ajout de collection, de propriétés ou d'index), le workflow ouvre automatiquement une **Pull Request** sur GitHub contenant un résumé des modifications pour permettre aux développeurs de mettre à jour les modèles Pydantic.
280
+
281
+ ### 3. Exécution locale
282
+ Pour lancer manuellement la découverte d'API et mettre à jour les fichiers de schémas locaux :
283
+ ```bash
284
+ python scripts/discover_endpoints.py
285
+ ```
286
+
287
+ ---
288
+
267
289
  ## 🤖 Intégration IA / MCP
268
290
 
269
291
  Le client sert de base au serveur MCP FFBB et expose une API stable pour construire des outils agent-friendly : recherche de clubs, récupération de poules, classements, lives, calendriers et détails de rencontres.
@@ -0,0 +1,30 @@
1
+ # FFBB API update summary
2
+
3
+ - Timestamp: `2026-05-24T11:03:57.203628+00:00`
4
+ - API base URL: `https://api.ffbb.app/`
5
+ - Meilisearch base URL: `https://meilisearch-prod.ffbb.app/`
6
+ - OpenAPI version: `9be33d74bfb480282da91c53c8dfa29804914c96`
7
+ - OpenAPI SHA256: `d63e8450719e2580e1ab6c4960d6de978c1e2ab457f5e9d71cc3e872ed272641`
8
+
9
+ ## Directus collections
10
+ - Total: `164`
11
+ - Added: None
12
+ - Removed: None
13
+
14
+ ## Directus item paths
15
+ - Total: `331`
16
+ - Added: None
17
+ - Removed: None
18
+
19
+ ## Meilisearch indexes
20
+ - Available total: `13`
21
+ - Added: None
22
+ - Removed: None
23
+
24
+ ## Directus schema properties drift
25
+ - **ItemsFfbbsiteBlockJobs** :
26
+ - Added properties: `code`, `subscription_form`, `type_filter`
27
+ - **ItemsFfbbsiteJobs** :
28
+ - Added properties: `category`, `date_published`, `degree`, `postal_code`, `structure`, `structure_linked`, `terms_contact`, `type`
29
+
30
+ Generated by `python scripts/discover_endpoints.py`.
@@ -332,9 +332,9 @@
332
332
  "items/youtube_videos_youtube_tags"
333
333
  ],
334
334
  "metadata": {
335
- "openapi_version": "81dc585185721d2d026413c186a80f4779abf831",
335
+ "openapi_version": "9be33d74bfb480282da91c53c8dfa29804914c96",
336
336
  "source": "https://api.ffbb.app/server/specs/oas",
337
- "timestamp": "2026-04-30T13:30:14.497350+00:00"
337
+ "timestamp": "2026-05-24T11:03:51.034202+00:00"
338
338
  },
339
339
  "paths": {
340
340
  "items/configuration": [
@@ -788,13 +788,15 @@
788
788
  "get"
789
789
  ],
790
790
  "items/ffbbsite_block_assets": [
791
- "get"
791
+ "get",
792
+ "post"
792
793
  ],
793
794
  "items/ffbbsite_block_assets/{id}": [
794
795
  "get"
795
796
  ],
796
797
  "items/ffbbsite_block_assets_directus_files": [
797
- "get"
798
+ "get",
799
+ "post"
798
800
  ],
799
801
  "items/ffbbsite_block_assets_directus_files/{id}": [
800
802
  "get"
@@ -812,7 +814,8 @@
812
814
  "get"
813
815
  ],
814
816
  "items/ffbbsite_block_assets_files": [
815
- "get"
817
+ "get",
818
+ "post"
816
819
  ],
817
820
  "items/ffbbsite_block_assets_files/{id}": [
818
821
  "get"
@@ -1100,37 +1103,43 @@
1100
1103
  "get"
1101
1104
  ],
1102
1105
  "items/ffbbsite_jobs": [
1103
- "get"
1106
+ "get",
1107
+ "post"
1104
1108
  ],
1105
1109
  "items/ffbbsite_jobs/{id}": [
1106
1110
  "get"
1107
1111
  ],
1108
1112
  "items/ffbbsite_jobs_contracts": [
1109
- "get"
1113
+ "get",
1114
+ "post"
1110
1115
  ],
1111
1116
  "items/ffbbsite_jobs_contracts/{id}": [
1112
1117
  "get"
1113
1118
  ],
1114
1119
  "items/ffbbsite_jobs_domains": [
1115
- "get"
1120
+ "get",
1121
+ "post"
1116
1122
  ],
1117
1123
  "items/ffbbsite_jobs_domains/{id}": [
1118
1124
  "get"
1119
1125
  ],
1120
1126
  "items/ffbbsite_jobs_experience": [
1121
- "get"
1127
+ "get",
1128
+ "post"
1122
1129
  ],
1123
1130
  "items/ffbbsite_jobs_experience/{id}": [
1124
1131
  "get"
1125
1132
  ],
1126
1133
  "items/ffbbsite_jobs_services": [
1127
- "get"
1134
+ "get",
1135
+ "post"
1128
1136
  ],
1129
1137
  "items/ffbbsite_jobs_services/{id}": [
1130
1138
  "get"
1131
1139
  ],
1132
1140
  "items/ffbbsite_jobs_studies": [
1133
- "get"
1141
+ "get",
1142
+ "post"
1134
1143
  ],
1135
1144
  "items/ffbbsite_jobs_studies/{id}": [
1136
1145
  "get"