ffbb-data-client 2.4.24__tar.gz → 2.4.25__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 (398) hide show
  1. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/CHANGELOG.md +6 -0
  2. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/PKG-INFO +1 -1
  3. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/api.py +109 -1
  4. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/clients/_search_facade.py +88 -72
  5. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client.egg-info/PKG-INFO +1 -1
  6. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client.egg-info/SOURCES.txt +1 -0
  7. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client.egg-info/scm_file_list.json +1 -0
  8. ffbb_data_client-2.4.25/src/ffbb_data_client.egg-info/scm_version.json +8 -0
  9. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/tests/unit/clients/test_v2_backport_search.py +50 -0
  10. ffbb_data_client-2.4.25/tests/unit/test_313_api_metrics.py +33 -0
  11. ffbb_data_client-2.4.24/src/ffbb_data_client.egg-info/scm_version.json +0 -8
  12. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/.agents/rules/antigravity-rtk-rules.md +0 -0
  13. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/.coveragerc +0 -0
  14. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/.gitattributes +0 -0
  15. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/.github/FUNDING.yml +0 -0
  16. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
  17. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
  18. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
  19. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/.github/dependabot.yml +0 -0
  20. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/.github/scripts/ai-pr-reviewer.cjs +0 -0
  21. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/.github/scripts/check_wrapper_parity.py +0 -0
  22. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/.github/workflows/ai-pr-reviewer.yml +0 -0
  23. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/.github/workflows/check_wrapper_parity.yml +0 -0
  24. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/.github/workflows/ci.yml +0 -0
  25. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/.github/workflows/codeql.yml +0 -0
  26. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/.github/workflows/deploy-pages.yml +0 -0
  27. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/.github/workflows/keep-ffbb-api-discovery-alive.yml +0 -0
  28. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/.github/workflows/publish.yml +0 -0
  29. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/.github/workflows/release-after-discovery-merge.yml +0 -0
  30. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/.github/workflows/update-ffbb-api-discovery.yml +0 -0
  31. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/.gitignore +0 -0
  32. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/.isort.cfg +0 -0
  33. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/.jules/bolt.md +0 -0
  34. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/.omc/skills/codeql-security-hardening-expertise.md +0 -0
  35. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/.omc/skills/pypi-immutable-release-workflow.md +0 -0
  36. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/.omc/skills/terminal-output-hygiene-expertise.md +0 -0
  37. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/.pre-commit-config.yaml +0 -0
  38. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/.readthedocs.yml +0 -0
  39. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/AGENTS.md +0 -0
  40. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/AUTHORS.rst +0 -0
  41. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/CODE_OF_CONDUCT.md +0 -0
  42. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/CONTRIBUTING.rst +0 -0
  43. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/DESIGN.md +0 -0
  44. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/Dockerfile +0 -0
  45. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/LICENSE.txt +0 -0
  46. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/LOCAL_CI_GUIDE.md +0 -0
  47. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/README.md +0 -0
  48. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/RELEASE_NOTES.md +0 -0
  49. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/SECURITY.md +0 -0
  50. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/data/api.ffbb.app.json +0 -0
  51. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/data/api_update_summary.md +0 -0
  52. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/data/collections.json +0 -0
  53. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/data/endpoint_discovery.json +0 -0
  54. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/data/field_dictionary.json +0 -0
  55. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/data/indexes.json +0 -0
  56. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/data/meilisearch-prod.ffbb.app.json +0 -0
  57. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/data/openapi.json +0 -0
  58. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/data/openapi_full.json +0 -0
  59. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/data/type_discovery_corrections.json +0 -0
  60. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/docs/Makefile +0 -0
  61. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/docs/_static/.gitignore +0 -0
  62. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/docs/architecture.rst +0 -0
  63. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/docs/authors.rst +0 -0
  64. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/docs/changelog.rst +0 -0
  65. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/docs/conf.py +0 -0
  66. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/docs/contributing.rst +0 -0
  67. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/docs/data_dictionary.rst +0 -0
  68. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/docs/examples.rst +0 -0
  69. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/docs/index.rst +0 -0
  70. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/docs/license.rst +0 -0
  71. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/docs/migration.rst +0 -0
  72. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/docs/readme.rst +0 -0
  73. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/docs/requirements.txt +0 -0
  74. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/docs/test_strategy.md +0 -0
  75. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/docs/testing_conventions.md +0 -0
  76. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/examples/README.md +0 -0
  77. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/examples/complete_usage_example.py +0 -0
  78. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/examples/quick_start.py +0 -0
  79. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/examples/team_ranking_analysis.py +0 -0
  80. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/pyproject.toml +0 -0
  81. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/run-ci-locally.sh +0 -0
  82. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/scripts/benchmark_concurrent_pagination.py +0 -0
  83. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/scripts/benchmark_search_organisme.py +0 -0
  84. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/scripts/discover_endpoints.py +0 -0
  85. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/scripts/discover_types.py +0 -0
  86. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/setup.cfg +0 -0
  87. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/setup.py +0 -0
  88. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/__init__.py +0 -0
  89. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/clients/__init__.py +0 -0
  90. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/clients/_helpers.py +0 -0
  91. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/clients/_mixins/__init__.py +0 -0
  92. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/clients/_mixins/competition.py +0 -0
  93. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/clients/_mixins/external.py +0 -0
  94. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/clients/_mixins/getters.py +0 -0
  95. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/clients/_mixins/list_methods.py +0 -0
  96. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/clients/_mixins/organisme.py +0 -0
  97. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/clients/_rest_facade.py +0 -0
  98. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/clients/api_ffbb_app_client.py +0 -0
  99. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/clients/ffbb_data_client.py +0 -0
  100. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/clients/meilisearch_client.py +0 -0
  101. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/clients/meilisearch_ffbb_client.py +0 -0
  102. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/config.py +0 -0
  103. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/data/__init__.py +0 -0
  104. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/data/collections.json +0 -0
  105. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/data/endpoint_discovery.json +0 -0
  106. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/data/field_dictionary.json +0 -0
  107. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/data/indexes.json +0 -0
  108. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/data/openapi.json +0 -0
  109. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/exceptions.py +0 -0
  110. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/helpers/__init__.py +0 -0
  111. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/helpers/http_requests_helper.py +0 -0
  112. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/helpers/http_requests_utils.py +0 -0
  113. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/helpers/meilisearch_client_extension.py +0 -0
  114. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/helpers/multi_search_query_helper.py +0 -0
  115. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/helpers/normalization.py +0 -0
  116. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/__init__.py +0 -0
  117. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/affiche.py +0 -0
  118. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/cartographie.py +0 -0
  119. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/categorie.py +0 -0
  120. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/categorie_type.py +0 -0
  121. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/clock.py +0 -0
  122. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/club_contacts.py +0 -0
  123. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/code.py +0 -0
  124. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/commune.py +0 -0
  125. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/competition_fields.py +0 -0
  126. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/competition_id.py +0 -0
  127. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/competition_id_categorie.py +0 -0
  128. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/competition_id_sexe.py +0 -0
  129. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/competition_id_type_competition.py +0 -0
  130. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/competition_id_type_competition_generique.py +0 -0
  131. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/competition_origine.py +0 -0
  132. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/competition_origine_categorie.py +0 -0
  133. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/competition_origine_type_competition.py +0 -0
  134. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/competition_origine_type_competition_generique.py +0 -0
  135. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/competition_type.py +0 -0
  136. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/competitions_facet_distribution.py +0 -0
  137. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/competitions_facet_stats.py +0 -0
  138. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/competitions_hit.py +0 -0
  139. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/competitions_multi_search_query.py +0 -0
  140. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/competitions_query.py +0 -0
  141. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/configuration_models.py +0 -0
  142. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/contact_info.py +0 -0
  143. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/content_multi_search_query.py +0 -0
  144. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/coordonnees.py +0 -0
  145. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/coordonnees_type.py +0 -0
  146. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/document_flyer.py +0 -0
  147. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/document_flyer_type.py +0 -0
  148. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/engagement_contacts.py +0 -0
  149. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/engagements_facet_distribution.py +0 -0
  150. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/engagements_facet_stats.py +0 -0
  151. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/engagements_hit.py +0 -0
  152. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/engagements_multi_search_query.py +0 -0
  153. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/etat.py +0 -0
  154. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/external_competition_id.py +0 -0
  155. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/external_id.py +0 -0
  156. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/facet_distribution.py +0 -0
  157. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/facet_stats.py +0 -0
  158. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/field_set.py +0 -0
  159. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/folder.py +0 -0
  160. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/formation_session.py +0 -0
  161. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/formations_facet_distribution.py +0 -0
  162. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/formations_facet_stats.py +0 -0
  163. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/formations_hit.py +0 -0
  164. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/formations_multi_search_query.py +0 -0
  165. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/game_stats_model.py +0 -0
  166. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/game_stats_models.py +0 -0
  167. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/generic_search.py +0 -0
  168. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/geo.py +0 -0
  169. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/geo_sort_order.py +0 -0
  170. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/get_commune_response.py +0 -0
  171. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/get_competition_response.py +0 -0
  172. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/get_configuration_response.py +0 -0
  173. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/get_engagement_response.py +0 -0
  174. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/get_entraineur_response.py +0 -0
  175. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/get_formation_response.py +0 -0
  176. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/get_officiel_response.py +0 -0
  177. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/get_organisme_response.py +0 -0
  178. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/get_poule_response.py +0 -0
  179. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/get_pratique_response.py +0 -0
  180. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/get_rencontre_response.py +0 -0
  181. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/get_saisons_response.py +0 -0
  182. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/get_salle_response.py +0 -0
  183. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/get_terrain_response.py +0 -0
  184. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/get_tournoi_response.py +0 -0
  185. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/gradient_color.py +0 -0
  186. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/hit.py +0 -0
  187. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/id_engagement_equipe.py +0 -0
  188. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/id_organisme_equipe.py +0 -0
  189. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/id_organisme_equipe1_logo.py +0 -0
  190. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/id_poule.py +0 -0
  191. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/jour.py +0 -0
  192. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/label.py +0 -0
  193. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/labellisation.py +0 -0
  194. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/live.py +0 -0
  195. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/lives.py +0 -0
  196. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/logo.py +0 -0
  197. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/multi_search_queries.py +0 -0
  198. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/multi_search_query.py +0 -0
  199. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/multi_search_result_competitions.py +0 -0
  200. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/multi_search_result_engagements.py +0 -0
  201. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/multi_search_result_formations.py +0 -0
  202. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/multi_search_result_organismes.py +0 -0
  203. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/multi_search_result_pratiques.py +0 -0
  204. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/multi_search_result_rencontres.py +0 -0
  205. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/multi_search_result_salles.py +0 -0
  206. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/multi_search_result_terrains.py +0 -0
  207. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/multi_search_result_tournois.py +0 -0
  208. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/multi_search_results.py +0 -0
  209. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/multi_search_results_class.py +0 -0
  210. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/nature_sol.py +0 -0
  211. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/niveau.py +0 -0
  212. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/niveau_class.py +0 -0
  213. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/niveau_extractor.py +0 -0
  214. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/niveau_info.py +0 -0
  215. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/niveau_models.py +0 -0
  216. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/niveau_type.py +0 -0
  217. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/objectif.py +0 -0
  218. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/organisateur.py +0 -0
  219. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/organisateur_type.py +0 -0
  220. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/organisme_fields.py +0 -0
  221. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/organisme_id_pere.py +0 -0
  222. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/organismes_facet_distribution.py +0 -0
  223. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/organismes_facet_stats.py +0 -0
  224. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/organismes_hit.py +0 -0
  225. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/organismes_multi_search_query.py +0 -0
  226. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/organismes_query.py +0 -0
  227. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/phase_code.py +0 -0
  228. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/poule.py +0 -0
  229. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/poule_fields.py +0 -0
  230. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/poule_rencontre_item_model.py +0 -0
  231. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/poules_models.py +0 -0
  232. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/poules_query.py +0 -0
  233. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/pratique.py +0 -0
  234. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/pratiques_facet_distribution.py +0 -0
  235. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/pratiques_facet_stats.py +0 -0
  236. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/pratiques_hit.py +0 -0
  237. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/pratiques_hit_type.py +0 -0
  238. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/pratiques_multi_search_query.py +0 -0
  239. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/pratiques_type_class.py +0 -0
  240. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/publication_internet.py +0 -0
  241. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/purple_logo.py +0 -0
  242. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/query_fields_manager.py +0 -0
  243. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/ranking_engagement.py +0 -0
  244. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/rankings_models.py +0 -0
  245. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/rencontres_engagement.py +0 -0
  246. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/rencontres_facet_distribution.py +0 -0
  247. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/rencontres_facet_stats.py +0 -0
  248. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/rencontres_hit.py +0 -0
  249. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/rencontres_multi_search_query.py +0 -0
  250. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/saison.py +0 -0
  251. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/saison_fields.py +0 -0
  252. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/saisons_models.py +0 -0
  253. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/saisons_query.py +0 -0
  254. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/salle.py +0 -0
  255. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/salles_facet_distribution.py +0 -0
  256. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/salles_facet_stats.py +0 -0
  257. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/salles_hit.py +0 -0
  258. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/salles_multi_search_query.py +0 -0
  259. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/sexe.py +0 -0
  260. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/sexe_class.py +0 -0
  261. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/source.py +0 -0
  262. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/status.py +0 -0
  263. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/team_engagement.py +0 -0
  264. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/team_ranking.py +0 -0
  265. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/terrains_categorie_championnat_3x3_libelle.py +0 -0
  266. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/terrains_facet_distribution.py +0 -0
  267. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/terrains_facet_stats.py +0 -0
  268. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/terrains_hit.py +0 -0
  269. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/terrains_multi_search_query.py +0 -0
  270. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/terrains_name.py +0 -0
  271. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/terrains_sexe_enum.py +0 -0
  272. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/terrains_storage.py +0 -0
  273. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/tournoi_type_class.py +0 -0
  274. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/tournoi_type_enum.py +0 -0
  275. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/tournoi_types_3x3.py +0 -0
  276. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/tournoi_types_3x3_libelle.py +0 -0
  277. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/tournoi_types_3x3_libelle_enum.py +0 -0
  278. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/tournois_facet_distribution.py +0 -0
  279. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/tournois_facet_stats.py +0 -0
  280. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/tournois_hit.py +0 -0
  281. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/tournois_hit_type.py +0 -0
  282. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/tournois_libelle.py +0 -0
  283. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/tournois_multi_search_query.py +0 -0
  284. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/type_association.py +0 -0
  285. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/type_association_libelle.py +0 -0
  286. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/type_class.py +0 -0
  287. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/type_competition.py +0 -0
  288. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/type_competition_generique.py +0 -0
  289. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/type_enum.py +0 -0
  290. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/models/type_league.py +0 -0
  291. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/py.typed +0 -0
  292. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/utils/__init__.py +0 -0
  293. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/utils/cache_manager.py +0 -0
  294. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/utils/concurrency_utils.py +0 -0
  295. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/utils/converter_utils.py +0 -0
  296. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/utils/input_validation.py +0 -0
  297. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/utils/retry_utils.py +0 -0
  298. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/utils/secure_logging.py +0 -0
  299. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client/utils/token_manager.py +0 -0
  300. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client.egg-info/dependency_links.txt +0 -0
  301. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client.egg-info/not-zip-safe +0 -0
  302. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client.egg-info/requires.txt +0 -0
  303. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/src/ffbb_data_client.egg-info/top_level.txt +0 -0
  304. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/tests/conftest.py +0 -0
  305. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/tests/e2e/__init__.py +0 -0
  306. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/tests/e2e/conftest.py +0 -0
  307. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/tests/integration/__init__.py +0 -0
  308. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/tests/integration/conftest.py +0 -0
  309. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/tests/integration/test_500_user_journey.py +0 -0
  310. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/tests/integration/test_501_user_journey_v3.py +0 -0
  311. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/tests/integration/test_502_enhanced_integration.py +0 -0
  312. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/tests/integration/test_503_secure_logging.py +0 -0
  313. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/tests/integration/test_504_input_validation.py +0 -0
  314. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/tests/integration/test_505_retry_timeout.py +0 -0
  315. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/tests/integration/test_506_raw_json_model_conversion.py +0 -0
  316. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/tests/unit/__init__.py +0 -0
  317. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/tests/unit/clients/__init__.py +0 -0
  318. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/tests/unit/clients/test_200_api_ffbb_app_client.py +0 -0
  319. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/tests/unit/clients/test_201_unit_tests_core.py +0 -0
  320. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/tests/unit/clients/test_202_meilisearch_client.py +0 -0
  321. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/tests/unit/clients/test_203_meilisearch_client_extension.py +0 -0
  322. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/tests/unit/clients/test_204_ffbb_data_client.py +0 -0
  323. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/tests/unit/clients/test_205_meilisearch_ffbb_client.py +0 -0
  324. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/tests/unit/clients/test_206_coverage_gaps_clients.py +0 -0
  325. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/tests/unit/clients/test_207_coverage_clients_extended.py +0 -0
  326. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/tests/unit/clients/test_208_new_methods_coverage.py +0 -0
  327. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/tests/unit/clients/test_209_automatic_token_resolution.py +0 -0
  328. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/tests/unit/clients/test_210_targeted_clients_helpers_coverage.py +0 -0
  329. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/tests/unit/clients/test_api_optimizations.py +0 -0
  330. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/tests/unit/clients/test_async_methods.py +0 -0
  331. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/tests/unit/clients/test_meilisearch_async.py +0 -0
  332. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/tests/unit/clients/test_search_many.py +0 -0
  333. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/tests/unit/clients/test_v3_new_features.py +0 -0
  334. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/tests/unit/clients/test_v4_aiter_and_contacts.py +0 -0
  335. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/tests/unit/clients/test_warm_cache.py +0 -0
  336. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/tests/unit/conftest.py +0 -0
  337. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/tests/unit/helpers/__init__.py +0 -0
  338. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/tests/unit/helpers/test_400_http_helpers.py +0 -0
  339. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/tests/unit/helpers/test_meilisearch_client_extension_recursive_pagination.py +0 -0
  340. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/tests/unit/helpers/test_meilisearch_pagination_concurrent.py +0 -0
  341. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/tests/unit/helpers/test_normalization.py +0 -0
  342. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/tests/unit/models/__init__.py +0 -0
  343. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/tests/unit/models/test_100_competition_id_categorie.py +0 -0
  344. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/tests/unit/models/test_101_competition_id_sexe.py +0 -0
  345. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/tests/unit/models/test_102_competition_id_type_competition.py +0 -0
  346. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/tests/unit/models/test_103_competition_id_type_competition_generique.py +0 -0
  347. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/tests/unit/models/test_104_competition_origine_categorie.py +0 -0
  348. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/tests/unit/models/test_105_competition_origine_type_competition_generique.py +0 -0
  349. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/tests/unit/models/test_106_competition_origine.py +0 -0
  350. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/tests/unit/models/test_107_id_engagement_equipe.py +0 -0
  351. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/tests/unit/models/test_108_id_organisme_equipe.py +0 -0
  352. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/tests/unit/models/test_109_id_organisme_equipe1_logo.py +0 -0
  353. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/tests/unit/models/test_110_labellisation.py +0 -0
  354. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/tests/unit/models/test_111_niveau_class.py +0 -0
  355. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/tests/unit/models/test_112_purple_logo.py +0 -0
  356. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/tests/unit/models/test_113_salle.py +0 -0
  357. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/tests/unit/models/test_114_tournoi_type_class.py +0 -0
  358. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/tests/unit/models/test_115_type_association_libelle.py +0 -0
  359. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/tests/unit/models/test_116_type_competition_generique.py +0 -0
  360. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/tests/unit/models/test_117_organisateur.py +0 -0
  361. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/tests/unit/models/test_118_competition_id.py +0 -0
  362. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/tests/unit/models/test_119_terrains_inner_models.py +0 -0
  363. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/tests/unit/models/test_120_pratiques_inner_models.py +0 -0
  364. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/tests/unit/models/test_121_to_dict_round_trip.py +0 -0
  365. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/tests/unit/models/test_122_coverage_gaps.py +0 -0
  366. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/tests/unit/models/test_123_missing_coverage.py +0 -0
  367. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/tests/unit/models/test_123_v2_backport.py +0 -0
  368. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/tests/unit/models/test_124_targeted_coverage_gains.py +0 -0
  369. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/tests/unit/models/test_dx_aliases.py +0 -0
  370. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/tests/unit/test_310_discover_endpoints.py +0 -0
  371. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/tests/unit/test_311_normalize_team_name.py +0 -0
  372. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/tests/unit/test_312_api_cors.py +0 -0
  373. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/tests/unit/utils/__init__.py +0 -0
  374. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/tests/unit/utils/test_300_secure_logging.py +0 -0
  375. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/tests/unit/utils/test_301_input_validation.py +0 -0
  376. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/tests/unit/utils/test_302_retry_utils.py +0 -0
  377. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/tests/unit/utils/test_303_cache_manager.py +0 -0
  378. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/tests/unit/utils/test_304_config.py +0 -0
  379. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/tests/unit/utils/test_305_token_manager.py +0 -0
  380. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/tests/unit/utils/test_306_converter_utils.py +0 -0
  381. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/tests/unit/utils/test_307_coverage_gaps_utils.py +0 -0
  382. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/tests/unit/utils/test_308_converter_utils_extended.py +0 -0
  383. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/tests/unit/utils/test_309_concurrency_utils.py +0 -0
  384. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/tools/update_agents_md.py +0 -0
  385. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/tox.ini +0 -0
  386. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/website/assets/apple-touch-icon.png +0 -0
  387. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/website/assets/favicon-192x192.png +0 -0
  388. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/website/assets/favicon-48x48.png +0 -0
  389. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/website/assets/favicon-96x96.png +0 -0
  390. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/website/assets/favicon.ico +0 -0
  391. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/website/assets/logo.webp +0 -0
  392. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/website/css/style.css +0 -0
  393. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/website/favicon.ico +0 -0
  394. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/website/index.html +0 -0
  395. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/website/llms-full.txt +0 -0
  396. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/website/llms.txt +0 -0
  397. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/website/robots.txt +0 -0
  398. {ffbb_data_client-2.4.24 → ffbb_data_client-2.4.25}/website/sitemap.xml +0 -0
@@ -7,6 +7,12 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
+ ## [2.4.25] - 2026-09-17
11
+
12
+ ### Features & Parity
13
+ - **SDK Search Async Parity**: Standardisation de toutes les méthodes de recherche asynchrones (`search_organismes_async`, `search_competitions_async`, `search_pratiques_async`, `search_salles_async`, `search_terrains_async`, `search_tournois_async`, `search_engagements_async`, `search_formations_async`) avec support complet de `filter`, `sort` et `limit` (pagination).
14
+ - **FastAPI Prometheus Monitoring**: Ajout d'un middleware de métriques et de l'endpoint `/metrics` officiel Prometheus pour le monitoring de la latence (histogram), du débit de requêtes, des jauges de requêtes en cours et de l'état des caches mémoires.
15
+
10
16
  ## [2.4.6] - 2026-08-29
11
17
 
12
18
  ### Performance & Modern Standards (FastAPI Lifespan)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: ffbb-data-client
3
- Version: 2.4.24
3
+ Version: 2.4.25
4
4
  Summary: API FFBB — SDK Python moderne & asynchrone pour les donnees officielles de la Federation Francaise de BasketBall (clubs, classements, calendriers, lives, Meilisearch). Alternative moderne a ffbb-api-client.
5
5
  Home-page: https://github.com/nickdesi/ffbb-data-client
6
6
  Author: nickdesi
@@ -7,9 +7,11 @@ Swagger UI at /swagger, ReDoc at /redoc, and hosts the official website at /.
7
7
  from __future__ import annotations
8
8
 
9
9
  import asyncio
10
+ import bisect
10
11
  import logging
11
12
  import os
12
13
  import re
14
+ import threading
13
15
  import time
14
16
  from collections import OrderedDict
15
17
  from contextlib import asynccontextmanager
@@ -95,7 +97,7 @@ l'ensemble des données publiques de la **Fédération Française de BasketBall*
95
97
  - ⭐ **Code Source GitHub** : [`https://github.com/nickdesi/ffbb-data-client`](https://github.com/nickdesi/ffbb-data-client)
96
98
  - 📖 **Documentation Sphinx complète** : [`https://nickdesi.github.io/ffbb-data-client/`](https://nickdesi.github.io/ffbb-data-client/)
97
99
  """,
98
- version="2.4.23",
100
+ version="2.4.25",
99
101
  openapi_tags=TAGS_METADATA,
100
102
  docs_url=None,
101
103
  redoc_url=None,
@@ -126,6 +128,48 @@ app.add_middleware(
126
128
  allow_headers=["*"],
127
129
  )
128
130
 
131
+ # ---------------------------------------------------------------------------
132
+ # Prometheus Metrics State & Middleware
133
+ # ---------------------------------------------------------------------------
134
+ _API_START_TIME = time.time()
135
+ _LATENCY_BUCKETS = (0.005, 0.01, 0.025, 0.05, 0.1, 0.25, 0.5, 1.0, 2.5, 5.0, 10.0)
136
+ _http_requests: dict[tuple[str, str, int], int] = {}
137
+ _http_latency_bucket_counts: list[int] = [0] * (len(_LATENCY_BUCKETS) + 1)
138
+ _http_latency_sum: float = 0.0
139
+ _http_latency_count: int = 0
140
+ _http_inflight: int = 0
141
+ _metrics_lock = threading.Lock()
142
+
143
+
144
+ @app.middleware("http")
145
+ async def prometheus_metrics_middleware(request: Request, call_next):
146
+ global _http_inflight, _http_latency_sum, _http_latency_count
147
+ with _metrics_lock:
148
+ _http_inflight += 1
149
+ t0 = time.perf_counter()
150
+ status_code = 500
151
+ try:
152
+ response = await call_next(request)
153
+ status_code = response.status_code
154
+ return response
155
+ finally:
156
+ latency = time.perf_counter() - t0
157
+ path = request.url.path
158
+ # Normalize dynamic numeric IDs to prevent metric cardinality explosion
159
+ norm_path = re.sub(r"/\d+", "/{id}", path)
160
+ method = request.method
161
+ with _metrics_lock:
162
+ _http_inflight -= 1
163
+ key = (method, norm_path, status_code)
164
+ _http_requests[key] = _http_requests.get(key, 0) + 1
165
+ _http_latency_sum += latency
166
+ _http_latency_count += 1
167
+ idx = bisect.bisect_left(_LATENCY_BUCKETS, latency)
168
+ if idx < len(_LATENCY_BUCKETS):
169
+ _http_latency_bucket_counts[idx] += 1
170
+ _http_latency_bucket_counts[len(_LATENCY_BUCKETS)] += 1
171
+
172
+
129
173
  # Global Client Singleton
130
174
  _client: FFBBDataClient | None = None
131
175
 
@@ -550,6 +594,70 @@ async def health_head():
550
594
  return Response(status_code=200)
551
595
 
552
596
 
597
+ @app.get(
598
+ "/metrics",
599
+ tags=["Monitoring & Diagnostic"],
600
+ summary="Métriques Prometheus de l'API (/metrics)",
601
+ response_class=Response,
602
+ )
603
+ async def metrics():
604
+ """Expose les métriques temps réel du serveur au format officiel Prometheus."""
605
+ with _metrics_lock:
606
+ uptime = time.time() - _API_START_TIME
607
+ requests = dict(_http_requests)
608
+ lat_buckets = list(_http_latency_bucket_counts)
609
+ lat_sum = _http_latency_sum
610
+ lat_count = _http_latency_count
611
+ inflight = _http_inflight
612
+
613
+ lines: list[str] = [
614
+ "# HELP ffbb_api_uptime_seconds Uptime du serveur API en secondes",
615
+ "# TYPE ffbb_api_uptime_seconds gauge",
616
+ f"ffbb_api_uptime_seconds {uptime:.2f}",
617
+ "",
618
+ "# HELP ffbb_api_http_requests_total Total des requetes HTTP reçues par methode, route et statut",
619
+ "# TYPE ffbb_api_http_requests_total counter",
620
+ ]
621
+ for (method, path, status), count in sorted(requests.items()):
622
+ lines.append(
623
+ f'ffbb_api_http_requests_total{{method="{method}",path="{path}",status="{status}"}} {count}'
624
+ )
625
+
626
+ lines += [
627
+ "",
628
+ "# HELP ffbb_api_http_latency_seconds Latence des requetes HTTP en secondes",
629
+ "# TYPE ffbb_api_http_latency_seconds histogram",
630
+ ]
631
+ cumulative = 0
632
+ for i, bound in enumerate(_LATENCY_BUCKETS):
633
+ cumulative += lat_buckets[i]
634
+ lines.append(
635
+ f'ffbb_api_http_latency_seconds_bucket{{le="{bound}"}} {cumulative}'
636
+ )
637
+ lines.append(f'ffbb_api_http_latency_seconds_bucket{{le="+Inf"}} {lat_count}')
638
+ lines.append(f"ffbb_api_http_latency_seconds_sum {lat_sum:.4f}")
639
+ lines.append(f"ffbb_api_http_latency_seconds_count {lat_count}")
640
+
641
+ lines += [
642
+ "",
643
+ "# HELP ffbb_api_http_inflight_requests Requetes HTTP actuellement en cours d'execution",
644
+ "# TYPE ffbb_api_http_inflight_requests gauge",
645
+ f"ffbb_api_http_inflight_requests {inflight}",
646
+ "",
647
+ "# HELP ffbb_api_cache_entries Nombre d'elements dans les caches LRU en memoire",
648
+ "# TYPE ffbb_api_cache_entries gauge",
649
+ f'ffbb_api_cache_entries{{cache="organisme"}} {len(_org_cache._cache)}',
650
+ f'ffbb_api_cache_entries{{cache="logo"}} {len(_logo_cache._cache)}',
651
+ f'ffbb_api_cache_entries{{cache="salle"}} {len(_salle_cache._cache)}',
652
+ "",
653
+ ]
654
+
655
+ return Response(
656
+ content="\n".join(lines) + "\n",
657
+ media_type="text/plain; version=0.0.4; charset=utf-8",
658
+ )
659
+
660
+
553
661
  @app.get(
554
662
  "/api/v1/search",
555
663
  tags=["Recherche & Meilisearch"],
@@ -137,18 +137,20 @@ class _SearchFacade:
137
137
  )
138
138
 
139
139
  async def search_competitions_async(
140
- self, name: str | None = None
140
+ self,
141
+ name: str | None = None,
142
+ filter: list[str] | None = None,
143
+ sort: list[str] | None = None,
144
+ limit: int | None = 10,
141
145
  ) -> CompetitionsMultiSearchResult | None:
142
146
  """Search for competitions asynchronously."""
143
- if not name:
144
- return None
145
- queries = [CompetitionsMultiSearchQuery(name)]
146
- results = await self._meilisearch.recursive_smart_multi_search_async(queries)
147
- return (
148
- cast(CompetitionsMultiSearchResult, results.results[0])
149
- if results and results.results
150
- else None
147
+ results = await self.search_multiple_competitions_async(
148
+ [name] if name is not None else None,
149
+ filter=filter,
150
+ sort=sort,
151
+ limit=limit,
151
152
  )
153
+ return results[0] if results else None
152
154
 
153
155
  async def search_multiple_competitions_async(
154
156
  self,
@@ -247,18 +249,20 @@ class _SearchFacade:
247
249
  )
248
250
 
249
251
  async def search_organismes_async(
250
- self, name: str | None = None
252
+ self,
253
+ name: str | None = None,
254
+ filter: list[str] | None = None,
255
+ sort: list[str] | None = None,
256
+ limit: int | None = 10,
251
257
  ) -> OrganismesMultiSearchResult | None:
252
258
  """Search for organismes asynchronously."""
253
- if not name:
254
- return None
255
- queries = [OrganismesMultiSearchQuery(name)]
256
- results = await self._meilisearch.recursive_smart_multi_search_async(queries)
257
- return (
258
- cast(OrganismesMultiSearchResult, results.results[0])
259
- if results and results.results
260
- else None
259
+ results = await self.search_multiple_organismes_async(
260
+ [name] if name is not None else None,
261
+ filter=filter,
262
+ sort=sort,
263
+ limit=limit,
261
264
  )
265
+ return results[0] if results else None
262
266
 
263
267
  async def search_multiple_organismes_async(
264
268
  self,
@@ -324,18 +328,20 @@ class _SearchFacade:
324
328
  )
325
329
 
326
330
  async def search_pratiques_async(
327
- self, name: str | None = None
331
+ self,
332
+ name: str | None = None,
333
+ filter: list[str] | None = None,
334
+ sort: list[str] | None = None,
335
+ limit: int | None = 10,
328
336
  ) -> PratiquesMultiSearchResult | None:
329
337
  """Search for pratiques asynchronously."""
330
- if not name:
331
- return None
332
- queries = [PratiquesMultiSearchQuery(name)]
333
- results = await self._meilisearch.recursive_smart_multi_search_async(queries)
334
- return (
335
- cast(PratiquesMultiSearchResult, results.results[0])
336
- if results and results.results
337
- else None
338
+ results = await self.search_multiple_pratiques_async(
339
+ [name] if name is not None else None,
340
+ filter=filter,
341
+ sort=sort,
342
+ limit=limit,
338
343
  )
344
+ return results[0] if results else None
339
345
 
340
346
  async def search_multiple_pratiques_async(
341
347
  self,
@@ -524,18 +530,20 @@ class _SearchFacade:
524
530
  return cast(list[SallesMultiSearchResult], results.results) if results else None
525
531
 
526
532
  async def search_salles_async(
527
- self, name: str | None = None
533
+ self,
534
+ name: str | None = None,
535
+ filter: list[str] | None = None,
536
+ sort: list[str] | None = None,
537
+ limit: int | None = 10,
528
538
  ) -> SallesMultiSearchResult | None:
529
539
  """Search for salles asynchronously."""
530
- if not name:
531
- return None
532
- queries = [SallesMultiSearchQuery(name)]
533
- results = await self._meilisearch.recursive_smart_multi_search_async(queries)
534
- return (
535
- cast(SallesMultiSearchResult, results.results[0])
536
- if results and results.results
537
- else None
540
+ results = await self.search_multiple_salles_async(
541
+ [name] if name is not None else None,
542
+ filter=filter,
543
+ sort=sort,
544
+ limit=limit,
538
545
  )
546
+ return results[0] if results else None
539
547
 
540
548
  async def search_multiple_salles_async(
541
549
  self,
@@ -597,18 +605,20 @@ class _SearchFacade:
597
605
  )
598
606
 
599
607
  async def search_terrains_async(
600
- self, name: str | None = None
608
+ self,
609
+ name: str | None = None,
610
+ filter: list[str] | None = None,
611
+ sort: list[str] | None = None,
612
+ limit: int | None = 10,
601
613
  ) -> TerrainsMultiSearchResult | None:
602
614
  """Search for terrains asynchronously."""
603
- if not name:
604
- return None
605
- queries = [TerrainsMultiSearchQuery(name)]
606
- results = await self._meilisearch.recursive_smart_multi_search_async(queries)
607
- return (
608
- cast(TerrainsMultiSearchResult, results.results[0])
609
- if results and results.results
610
- else None
615
+ results = await self.search_multiple_terrains_async(
616
+ [name] if name is not None else None,
617
+ filter=filter,
618
+ sort=sort,
619
+ limit=limit,
611
620
  )
621
+ return results[0] if results else None
612
622
 
613
623
  async def search_multiple_terrains_async(
614
624
  self,
@@ -672,18 +682,20 @@ class _SearchFacade:
672
682
  )
673
683
 
674
684
  async def search_tournois_async(
675
- self, name: str | None = None
685
+ self,
686
+ name: str | None = None,
687
+ filter: list[str] | None = None,
688
+ sort: list[str] | None = None,
689
+ limit: int | None = 10,
676
690
  ) -> TournoisMultiSearchResult | None:
677
691
  """Search for tournois asynchronously."""
678
- if not name:
679
- return None
680
- queries = [TournoisMultiSearchQuery(name)]
681
- results = await self._meilisearch.recursive_smart_multi_search_async(queries)
682
- return (
683
- cast(TournoisMultiSearchResult, results.results[0])
684
- if results and results.results
685
- else None
692
+ results = await self.search_multiple_tournois_async(
693
+ [name] if name is not None else None,
694
+ filter=filter,
695
+ sort=sort,
696
+ limit=limit,
686
697
  )
698
+ return results[0] if results else None
687
699
 
688
700
  async def search_multiple_tournois_async(
689
701
  self,
@@ -791,18 +803,20 @@ class _SearchFacade:
791
803
  )
792
804
 
793
805
  async def search_engagements_async(
794
- self, name: str | None = None
806
+ self,
807
+ name: str | None = None,
808
+ filter: list[str] | None = None,
809
+ sort: list[str] | None = None,
810
+ limit: int | None = 10,
795
811
  ) -> EngagementsMultiSearchResult | None:
796
812
  """Search for engagements asynchronously."""
797
- if not name:
798
- return None
799
- queries = [EngagementsMultiSearchQuery(name)]
800
- results = await self._meilisearch.recursive_smart_multi_search_async(queries)
801
- return (
802
- cast(EngagementsMultiSearchResult, results.results[0])
803
- if results and results.results
804
- else None
813
+ results = await self.search_multiple_engagements_async(
814
+ [name] if name is not None else None,
815
+ filter=filter,
816
+ sort=sort,
817
+ limit=limit,
805
818
  )
819
+ return results[0] if results else None
806
820
 
807
821
  async def search_multiple_engagements_async(
808
822
  self,
@@ -870,18 +884,20 @@ class _SearchFacade:
870
884
  )
871
885
 
872
886
  async def search_formations_async(
873
- self, name: str | None = None
887
+ self,
888
+ name: str | None = None,
889
+ filter: list[str] | None = None,
890
+ sort: list[str] | None = None,
891
+ limit: int | None = 10,
874
892
  ) -> FormationsMultiSearchResult | None:
875
893
  """Search for formations asynchronously."""
876
- if not name:
877
- return None
878
- queries = [FormationsMultiSearchQuery(name)]
879
- results = await self._meilisearch.recursive_smart_multi_search_async(queries)
880
- return (
881
- cast(FormationsMultiSearchResult, results.results[0])
882
- if results and results.results
883
- else None
894
+ results = await self.search_multiple_formations_async(
895
+ [name] if name is not None else None,
896
+ filter=filter,
897
+ sort=sort,
898
+ limit=limit,
884
899
  )
900
+ return results[0] if results else None
885
901
 
886
902
  async def search_multiple_formations_async(
887
903
  self,
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: ffbb-data-client
3
- Version: 2.4.24
3
+ Version: 2.4.25
4
4
  Summary: API FFBB — SDK Python moderne & asynchrone pour les donnees officielles de la Federation Francaise de BasketBall (clubs, classements, calendriers, lives, Meilisearch). Alternative moderne a ffbb-api-client.
5
5
  Home-page: https://github.com/nickdesi/ffbb-data-client
6
6
  Author: nickdesi
@@ -315,6 +315,7 @@ tests/unit/conftest.py
315
315
  tests/unit/test_310_discover_endpoints.py
316
316
  tests/unit/test_311_normalize_team_name.py
317
317
  tests/unit/test_312_api_cors.py
318
+ tests/unit/test_313_api_metrics.py
318
319
  tests/unit/clients/__init__.py
319
320
  tests/unit/clients/test_200_api_ffbb_app_client.py
320
321
  tests/unit/clients/test_201_unit_tests_core.py
@@ -361,6 +361,7 @@
361
361
  "tests/unit/test_310_discover_endpoints.py",
362
362
  "tests/unit/test_311_normalize_team_name.py",
363
363
  "tests/unit/test_312_api_cors.py",
364
+ "tests/unit/test_313_api_metrics.py",
364
365
  "tests/unit/utils/__init__.py",
365
366
  "tests/unit/utils/test_300_secure_logging.py",
366
367
  "tests/unit/utils/test_301_input_validation.py",
@@ -0,0 +1,8 @@
1
+ {
2
+ "tag": "2.4.25",
3
+ "distance": 0,
4
+ "node": "g26a270fad648b215937496d899f124d8eb80f2d4",
5
+ "dirty": false,
6
+ "branch": "HEAD",
7
+ "node_date": "2026-09-17"
8
+ }
@@ -122,3 +122,53 @@ class TestV2BackportSearch(unittest.TestCase):
122
122
  mock_rms.assert_called_once()
123
123
  queries = mock_rms.call_args[0][0]
124
124
  self.assertEqual(queries[0].limit, 3)
125
+
126
+
127
+ class TestV2BackportSearchAsync(unittest.IsolatedAsyncioTestCase):
128
+ """Async tests for search_*_async filter/sort/limit parameters."""
129
+
130
+ async def asyncSetUp(self) -> None:
131
+ with patch("ffbb_data_client.clients.meilisearch_client.CacheManager"):
132
+ api_client = MagicMock(spec=ApiFFBBAppClient)
133
+ api_client.cached_session = None
134
+ api_client.async_cached_session = None
135
+ meilisearch_client = MeilisearchFFBBClient(bearer_token="test-token")
136
+ self.client = FFBBDataClient(api_client, meilisearch_client)
137
+
138
+ def _make_mock_results(self, result_mock: MagicMock) -> MultiSearchResults:
139
+ results = MagicMock(spec=MultiSearchResults)
140
+ results.results = [result_mock]
141
+ return results
142
+
143
+ @patch.object(MeilisearchFFBBClient, "recursive_smart_multi_search_async")
144
+ async def test_search_organismes_async_with_limit_and_filter(
145
+ self, mock_rms_async: MagicMock
146
+ ) -> None:
147
+ mock_result = MagicMock(spec=OrganismesMultiSearchResult)
148
+ mock_rms_async.return_value = self._make_mock_results(mock_result)
149
+
150
+ result = await self.client.search_organismes_async(
151
+ "Clermont",
152
+ filter=['codePostal = "63000"'],
153
+ sort=["nom:asc"],
154
+ limit=5,
155
+ )
156
+ self.assertIsNotNone(result)
157
+ mock_rms_async.assert_called_once()
158
+ queries = mock_rms_async.call_args[0][0]
159
+ self.assertEqual(queries[0].limit, 5)
160
+ self.assertEqual(queries[0].filter, ['codePostal = "63000"'])
161
+ self.assertEqual(queries[0].sort, ["nom:asc"])
162
+
163
+ @patch.object(MeilisearchFFBBClient, "recursive_smart_multi_search_async")
164
+ async def test_search_competitions_async_with_limit(
165
+ self, mock_rms_async: MagicMock
166
+ ) -> None:
167
+ mock_result = MagicMock(spec=CompetitionsMultiSearchResult)
168
+ mock_rms_async.return_value = self._make_mock_results(mock_result)
169
+
170
+ result = await self.client.search_competitions_async("U13", limit=7)
171
+ self.assertIsNotNone(result)
172
+ mock_rms_async.assert_called_once()
173
+ queries = mock_rms_async.call_args[0][0]
174
+ self.assertEqual(queries[0].limit, 7)
@@ -0,0 +1,33 @@
1
+ """Unit tests for Prometheus /metrics endpoint on FastAPI API."""
2
+
3
+ import httpx
4
+ import pytest
5
+
6
+ from ffbb_data_client.api import app
7
+
8
+
9
+ @pytest.mark.asyncio
10
+ async def test_metrics_endpoint_returns_valid_prometheus_format():
11
+ """Verify that /metrics endpoint returns 200 with standard Prometheus exposition format."""
12
+ async with httpx.AsyncClient(
13
+ transport=httpx.ASGITransport(app=app), base_url="http://test"
14
+ ) as client:
15
+ # Trigger an endpoint to record metrics
16
+ health_resp = await client.get("/health")
17
+ assert health_resp.status_code == 200
18
+
19
+ # Now query /metrics
20
+ metrics_resp = await client.get("/metrics")
21
+ assert metrics_resp.status_code == 200
22
+ assert "text/plain" in metrics_resp.headers.get("content-type", "")
23
+
24
+ text = metrics_resp.text
25
+ assert "ffbb_api_uptime_seconds" in text
26
+ assert "ffbb_api_http_requests_total" in text
27
+ assert "ffbb_api_http_latency_seconds_bucket" in text
28
+ assert "ffbb_api_http_latency_seconds_sum" in text
29
+ assert "ffbb_api_http_latency_seconds_count" in text
30
+ assert "ffbb_api_http_inflight_requests" in text
31
+ assert "ffbb_api_cache_entries" in text
32
+ assert 'path="/health"' in text
33
+ assert 'status="200"' in text
@@ -1,8 +0,0 @@
1
- {
2
- "tag": "2.4.24",
3
- "distance": 0,
4
- "node": "g48944fcb30cb345a1de2e8155012960a5bbace66",
5
- "dirty": false,
6
- "branch": "HEAD",
7
- "node_date": "2026-09-16"
8
- }