ffbb-data-client 2.4.39__tar.gz → 2.4.41__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 (409) hide show
  1. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/AGENTS.md +6 -6
  2. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/CHANGELOG.md +26 -0
  3. {ffbb_data_client-2.4.39/src/ffbb_data_client.egg-info → ffbb_data_client-2.4.41}/PKG-INFO +6 -3
  4. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/README.md +5 -2
  5. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/RELEASE_NOTES.md +26 -1
  6. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/data/api_update_summary.md +15 -4
  7. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/data/endpoint_discovery.json +25 -22
  8. {ffbb_data_client-2.4.39/src/ffbb_data_client → ffbb_data_client-2.4.41}/data/indexes.json +10 -11
  9. {ffbb_data_client-2.4.39/src/ffbb_data_client → ffbb_data_client-2.4.41}/data/permission_matrix.json +28 -29
  10. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/data/type_discovery_corrections.json +40 -40
  11. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/docs/data_dictionary.rst +9 -12
  12. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/scripts/discover_endpoints.py +8 -1
  13. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/src/ffbb_data_client/api.py +138 -28
  14. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/src/ffbb_data_client/clients/_mixins/competition.py +24 -1
  15. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/src/ffbb_data_client/clients/_mixins/organisme.py +25 -1
  16. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/src/ffbb_data_client/clients/_rest_facade.py +2 -2
  17. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/src/ffbb_data_client/config.py +25 -11
  18. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/src/ffbb_data_client/data/endpoint_discovery.json +25 -22
  19. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41/src/ffbb_data_client}/data/indexes.json +10 -11
  20. ffbb_data_client-2.4.39/data/openapi_full.json → ffbb_data_client-2.4.41/src/ffbb_data_client/data/openapi.json +867 -2879
  21. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41/src/ffbb_data_client}/data/permission_matrix.json +28 -29
  22. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/src/ffbb_data_client/helpers/http_requests_utils.py +140 -57
  23. ffbb_data_client-2.4.41/src/ffbb_data_client/helpers/meilisearch_fallback.py +65 -0
  24. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/src/ffbb_data_client/models/get_organisme_response.py +21 -7
  25. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/src/ffbb_data_client/utils/retry_utils.py +59 -3
  26. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/src/ffbb_data_client/utils/token_manager.py +41 -11
  27. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/src/ffbb_data_client/utils/web_probe.py +46 -7
  28. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41/src/ffbb_data_client.egg-info}/PKG-INFO +6 -3
  29. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/src/ffbb_data_client.egg-info/SOURCES.txt +2 -0
  30. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/src/ffbb_data_client.egg-info/scm_file_list.json +2 -0
  31. ffbb_data_client-2.4.41/src/ffbb_data_client.egg-info/scm_version.json +8 -0
  32. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/tests/conftest.py +10 -0
  33. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/tests/integration/test_506_raw_json_model_conversion.py +2 -2
  34. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/tests/unit/helpers/test_400_http_helpers.py +27 -41
  35. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/tests/unit/test_310_discover_endpoints.py +1 -1
  36. ffbb_data_client-2.4.41/tests/unit/test_314_api_endpoints.py +293 -0
  37. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/tests/unit/test_314_discover_permissions.py +1 -1
  38. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/tests/unit/utils/test_301_input_validation.py +1 -1
  39. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/tests/unit/utils/test_302_retry_utils.py +3 -3
  40. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/tests/unit/utils/test_304_config.py +16 -1
  41. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/tests/unit/utils/test_305_token_manager.py +79 -6
  42. ffbb_data_client-2.4.41/tests/unit/utils/test_310_waf_circuit.py +174 -0
  43. ffbb_data_client-2.4.41/tests/unit/utils/test_web_probe.py +148 -0
  44. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/website/index.html +4 -4
  45. ffbb_data_client-2.4.39/src/ffbb_data_client.egg-info/scm_version.json +0 -8
  46. ffbb_data_client-2.4.39/tests/unit/test_314_api_endpoints.py +0 -144
  47. ffbb_data_client-2.4.39/tests/unit/utils/test_web_probe.py +0 -71
  48. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/.agents/rules/antigravity-rtk-rules.md +0 -0
  49. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/.coveragerc +0 -0
  50. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/.gitattributes +0 -0
  51. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/.github/FUNDING.yml +0 -0
  52. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
  53. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
  54. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
  55. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/.github/dependabot.yml +0 -0
  56. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/.github/scripts/check_wrapper_parity.py +0 -0
  57. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/.github/workflows/check_wrapper_parity.yml +0 -0
  58. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/.github/workflows/ci.yml +0 -0
  59. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/.github/workflows/codeql.yml +0 -0
  60. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/.github/workflows/dependabot-automerge.yml +0 -0
  61. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/.github/workflows/deploy-pages.yml +0 -0
  62. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/.github/workflows/keep-ffbb-api-discovery-alive.yml +0 -0
  63. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/.github/workflows/publish.yml +0 -0
  64. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/.github/workflows/release-after-discovery-merge.yml +0 -0
  65. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/.github/workflows/update-ffbb-api-discovery.yml +0 -0
  66. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/.gitignore +0 -0
  67. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/.isort.cfg +0 -0
  68. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/.jules/bolt.md +0 -0
  69. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/.omc/skills/codeql-security-hardening-expertise.md +0 -0
  70. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/.omc/skills/pypi-immutable-release-workflow.md +0 -0
  71. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/.omc/skills/terminal-output-hygiene-expertise.md +0 -0
  72. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/.pre-commit-config.yaml +0 -0
  73. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/.readthedocs.yml +0 -0
  74. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/AUTHORS.rst +0 -0
  75. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/CODE_OF_CONDUCT.md +0 -0
  76. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/CONTRIBUTING.rst +0 -0
  77. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/DESIGN.md +0 -0
  78. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/Dockerfile +0 -0
  79. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/LICENSE.txt +0 -0
  80. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/LOCAL_CI_GUIDE.md +0 -0
  81. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/SECURITY.md +0 -0
  82. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/data/api.ffbb.app.json +0 -0
  83. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/data/collections.json +0 -0
  84. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/data/field_dictionary.json +0 -0
  85. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/data/meilisearch-prod.ffbb.app.json +0 -0
  86. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/data/openapi.json +0 -0
  87. /ffbb_data_client-2.4.39/src/ffbb_data_client/data/openapi.json → /ffbb_data_client-2.4.41/data/openapi_full.json +0 -0
  88. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/data/permission_drift_summary.md +0 -0
  89. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/docs/Makefile +0 -0
  90. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/docs/_static/.gitignore +0 -0
  91. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/docs/architecture.rst +0 -0
  92. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/docs/authors.rst +0 -0
  93. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/docs/changelog.rst +0 -0
  94. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/docs/conf.py +0 -0
  95. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/docs/contributing.rst +0 -0
  96. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/docs/examples.rst +0 -0
  97. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/docs/index.rst +0 -0
  98. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/docs/license.rst +0 -0
  99. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/docs/migration.rst +0 -0
  100. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/docs/readme.rst +0 -0
  101. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/docs/requirements.txt +0 -0
  102. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/docs/test_strategy.md +0 -0
  103. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/docs/testing_conventions.md +0 -0
  104. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/examples/README.md +0 -0
  105. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/examples/complete_usage_example.py +0 -0
  106. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/examples/quick_start.py +0 -0
  107. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/examples/team_ranking_analysis.py +0 -0
  108. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/pyproject.toml +0 -0
  109. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/run-ci-locally.sh +0 -0
  110. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/scripts/benchmark_concurrent_pagination.py +0 -0
  111. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/scripts/benchmark_search_organisme.py +0 -0
  112. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/scripts/discover_permissions.py +0 -0
  113. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/scripts/discover_types.py +0 -0
  114. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/setup.cfg +0 -0
  115. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/setup.py +0 -0
  116. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/src/ffbb_data_client/__init__.py +0 -0
  117. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/src/ffbb_data_client/clients/__init__.py +0 -0
  118. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/src/ffbb_data_client/clients/_helpers.py +0 -0
  119. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/src/ffbb_data_client/clients/_mixins/__init__.py +0 -0
  120. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/src/ffbb_data_client/clients/_mixins/external.py +0 -0
  121. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/src/ffbb_data_client/clients/_mixins/getters.py +0 -0
  122. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/src/ffbb_data_client/clients/_mixins/list_methods.py +0 -0
  123. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/src/ffbb_data_client/clients/_search_facade.py +0 -0
  124. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/src/ffbb_data_client/clients/api_ffbb_app_client.py +0 -0
  125. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/src/ffbb_data_client/clients/ffbb_data_client.py +0 -0
  126. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/src/ffbb_data_client/clients/meilisearch_client.py +0 -0
  127. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/src/ffbb_data_client/clients/meilisearch_ffbb_client.py +0 -0
  128. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/src/ffbb_data_client/data/__init__.py +0 -0
  129. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/src/ffbb_data_client/data/collections.json +0 -0
  130. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/src/ffbb_data_client/data/field_dictionary.json +0 -0
  131. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/src/ffbb_data_client/exceptions.py +0 -0
  132. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/src/ffbb_data_client/helpers/__init__.py +0 -0
  133. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/src/ffbb_data_client/helpers/http_requests_helper.py +0 -0
  134. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/src/ffbb_data_client/helpers/meilisearch_client_extension.py +0 -0
  135. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/src/ffbb_data_client/helpers/multi_search_query_helper.py +0 -0
  136. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/src/ffbb_data_client/helpers/normalization.py +0 -0
  137. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/src/ffbb_data_client/models/__init__.py +0 -0
  138. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/src/ffbb_data_client/models/affiche.py +0 -0
  139. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/src/ffbb_data_client/models/cartographie.py +0 -0
  140. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/src/ffbb_data_client/models/categorie.py +0 -0
  141. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/src/ffbb_data_client/models/categorie_type.py +0 -0
  142. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/src/ffbb_data_client/models/clock.py +0 -0
  143. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/src/ffbb_data_client/models/club_contacts.py +0 -0
  144. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/src/ffbb_data_client/models/code.py +0 -0
  145. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/src/ffbb_data_client/models/commune.py +0 -0
  146. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/src/ffbb_data_client/models/competition_fields.py +0 -0
  147. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/src/ffbb_data_client/models/competition_id.py +0 -0
  148. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/src/ffbb_data_client/models/competition_id_categorie.py +0 -0
  149. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/src/ffbb_data_client/models/competition_id_sexe.py +0 -0
  150. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/src/ffbb_data_client/models/competition_id_type_competition.py +0 -0
  151. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/src/ffbb_data_client/models/competition_id_type_competition_generique.py +0 -0
  152. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/src/ffbb_data_client/models/competition_origine.py +0 -0
  153. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/src/ffbb_data_client/models/competition_origine_categorie.py +0 -0
  154. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/src/ffbb_data_client/models/competition_origine_type_competition.py +0 -0
  155. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/src/ffbb_data_client/models/competition_origine_type_competition_generique.py +0 -0
  156. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/src/ffbb_data_client/models/competition_type.py +0 -0
  157. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/src/ffbb_data_client/models/competitions_facet_distribution.py +0 -0
  158. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/src/ffbb_data_client/models/competitions_facet_stats.py +0 -0
  159. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/src/ffbb_data_client/models/competitions_hit.py +0 -0
  160. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/src/ffbb_data_client/models/competitions_multi_search_query.py +0 -0
  161. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/src/ffbb_data_client/models/competitions_query.py +0 -0
  162. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/src/ffbb_data_client/models/configuration_models.py +0 -0
  163. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/src/ffbb_data_client/models/contact_info.py +0 -0
  164. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/src/ffbb_data_client/models/content_multi_search_query.py +0 -0
  165. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/src/ffbb_data_client/models/coordonnees.py +0 -0
  166. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/src/ffbb_data_client/models/coordonnees_type.py +0 -0
  167. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/src/ffbb_data_client/models/document_flyer.py +0 -0
  168. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/src/ffbb_data_client/models/document_flyer_type.py +0 -0
  169. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/src/ffbb_data_client/models/engagement_contacts.py +0 -0
  170. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/src/ffbb_data_client/models/engagements_facet_distribution.py +0 -0
  171. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/src/ffbb_data_client/models/engagements_facet_stats.py +0 -0
  172. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/src/ffbb_data_client/models/engagements_hit.py +0 -0
  173. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/src/ffbb_data_client/models/engagements_multi_search_query.py +0 -0
  174. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/src/ffbb_data_client/models/etat.py +0 -0
  175. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/src/ffbb_data_client/models/external_competition_id.py +0 -0
  176. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/src/ffbb_data_client/models/external_id.py +0 -0
  177. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/src/ffbb_data_client/models/facet_distribution.py +0 -0
  178. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/src/ffbb_data_client/models/facet_stats.py +0 -0
  179. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/src/ffbb_data_client/models/field_set.py +0 -0
  180. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/src/ffbb_data_client/models/folder.py +0 -0
  181. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/src/ffbb_data_client/models/formation_session.py +0 -0
  182. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/src/ffbb_data_client/models/formations_facet_distribution.py +0 -0
  183. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/src/ffbb_data_client/models/formations_facet_stats.py +0 -0
  184. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/src/ffbb_data_client/models/formations_hit.py +0 -0
  185. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/src/ffbb_data_client/models/formations_multi_search_query.py +0 -0
  186. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/src/ffbb_data_client/models/game_stats_model.py +0 -0
  187. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/src/ffbb_data_client/models/game_stats_models.py +0 -0
  188. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/src/ffbb_data_client/models/generic_search.py +0 -0
  189. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/src/ffbb_data_client/models/geo.py +0 -0
  190. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/src/ffbb_data_client/models/geo_sort_order.py +0 -0
  191. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/src/ffbb_data_client/models/get_commune_response.py +0 -0
  192. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/src/ffbb_data_client/models/get_competition_response.py +0 -0
  193. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/src/ffbb_data_client/models/get_configuration_response.py +0 -0
  194. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/src/ffbb_data_client/models/get_engagement_response.py +0 -0
  195. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/src/ffbb_data_client/models/get_entraineur_response.py +0 -0
  196. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/src/ffbb_data_client/models/get_formation_response.py +0 -0
  197. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/src/ffbb_data_client/models/get_officiel_response.py +0 -0
  198. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/src/ffbb_data_client/models/get_poule_response.py +0 -0
  199. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/src/ffbb_data_client/models/get_pratique_response.py +0 -0
  200. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/src/ffbb_data_client/models/get_rencontre_response.py +0 -0
  201. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/src/ffbb_data_client/models/get_saisons_response.py +0 -0
  202. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/src/ffbb_data_client/models/get_salle_response.py +0 -0
  203. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/src/ffbb_data_client/models/get_terrain_response.py +0 -0
  204. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/src/ffbb_data_client/models/get_tournoi_response.py +0 -0
  205. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/src/ffbb_data_client/models/gradient_color.py +0 -0
  206. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/src/ffbb_data_client/models/hit.py +0 -0
  207. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/src/ffbb_data_client/models/id_engagement_equipe.py +0 -0
  208. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/src/ffbb_data_client/models/id_organisme_equipe.py +0 -0
  209. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/src/ffbb_data_client/models/id_organisme_equipe1_logo.py +0 -0
  210. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/src/ffbb_data_client/models/id_poule.py +0 -0
  211. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/src/ffbb_data_client/models/jour.py +0 -0
  212. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/src/ffbb_data_client/models/label.py +0 -0
  213. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/src/ffbb_data_client/models/labellisation.py +0 -0
  214. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/src/ffbb_data_client/models/live.py +0 -0
  215. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/src/ffbb_data_client/models/lives.py +0 -0
  216. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/src/ffbb_data_client/models/logo.py +0 -0
  217. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/src/ffbb_data_client/models/multi_search_queries.py +0 -0
  218. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/src/ffbb_data_client/models/multi_search_query.py +0 -0
  219. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/src/ffbb_data_client/models/multi_search_result_competitions.py +0 -0
  220. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/src/ffbb_data_client/models/multi_search_result_engagements.py +0 -0
  221. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/src/ffbb_data_client/models/multi_search_result_formations.py +0 -0
  222. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/src/ffbb_data_client/models/multi_search_result_organismes.py +0 -0
  223. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/src/ffbb_data_client/models/multi_search_result_pratiques.py +0 -0
  224. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/src/ffbb_data_client/models/multi_search_result_rencontres.py +0 -0
  225. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/src/ffbb_data_client/models/multi_search_result_salles.py +0 -0
  226. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/src/ffbb_data_client/models/multi_search_result_terrains.py +0 -0
  227. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/src/ffbb_data_client/models/multi_search_result_tournois.py +0 -0
  228. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/src/ffbb_data_client/models/multi_search_results.py +0 -0
  229. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/src/ffbb_data_client/models/multi_search_results_class.py +0 -0
  230. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/src/ffbb_data_client/models/nature_sol.py +0 -0
  231. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/src/ffbb_data_client/models/niveau.py +0 -0
  232. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/src/ffbb_data_client/models/niveau_class.py +0 -0
  233. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/src/ffbb_data_client/models/niveau_extractor.py +0 -0
  234. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/src/ffbb_data_client/models/niveau_info.py +0 -0
  235. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/src/ffbb_data_client/models/niveau_models.py +0 -0
  236. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/src/ffbb_data_client/models/niveau_type.py +0 -0
  237. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/src/ffbb_data_client/models/objectif.py +0 -0
  238. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/src/ffbb_data_client/models/organisateur.py +0 -0
  239. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/src/ffbb_data_client/models/organisateur_type.py +0 -0
  240. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/src/ffbb_data_client/models/organisme_fields.py +0 -0
  241. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/src/ffbb_data_client/models/organisme_id_pere.py +0 -0
  242. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/src/ffbb_data_client/models/organismes_facet_distribution.py +0 -0
  243. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/src/ffbb_data_client/models/organismes_facet_stats.py +0 -0
  244. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/src/ffbb_data_client/models/organismes_hit.py +0 -0
  245. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/src/ffbb_data_client/models/organismes_multi_search_query.py +0 -0
  246. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/src/ffbb_data_client/models/organismes_query.py +0 -0
  247. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/src/ffbb_data_client/models/phase_code.py +0 -0
  248. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/src/ffbb_data_client/models/poule.py +0 -0
  249. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/src/ffbb_data_client/models/poule_fields.py +0 -0
  250. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/src/ffbb_data_client/models/poule_rencontre_item_model.py +0 -0
  251. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/src/ffbb_data_client/models/poules_models.py +0 -0
  252. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/src/ffbb_data_client/models/poules_query.py +0 -0
  253. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/src/ffbb_data_client/models/pratique.py +0 -0
  254. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/src/ffbb_data_client/models/pratiques_facet_distribution.py +0 -0
  255. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/src/ffbb_data_client/models/pratiques_facet_stats.py +0 -0
  256. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/src/ffbb_data_client/models/pratiques_hit.py +0 -0
  257. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/src/ffbb_data_client/models/pratiques_hit_type.py +0 -0
  258. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/src/ffbb_data_client/models/pratiques_multi_search_query.py +0 -0
  259. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/src/ffbb_data_client/models/pratiques_type_class.py +0 -0
  260. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/src/ffbb_data_client/models/publication_internet.py +0 -0
  261. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/src/ffbb_data_client/models/purple_logo.py +0 -0
  262. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/src/ffbb_data_client/models/query_fields_manager.py +0 -0
  263. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/src/ffbb_data_client/models/ranking_engagement.py +0 -0
  264. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/src/ffbb_data_client/models/rankings_models.py +0 -0
  265. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/src/ffbb_data_client/models/rencontres_engagement.py +0 -0
  266. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/src/ffbb_data_client/models/rencontres_facet_distribution.py +0 -0
  267. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/src/ffbb_data_client/models/rencontres_facet_stats.py +0 -0
  268. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/src/ffbb_data_client/models/rencontres_hit.py +0 -0
  269. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/src/ffbb_data_client/models/rencontres_multi_search_query.py +0 -0
  270. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/src/ffbb_data_client/models/saison.py +0 -0
  271. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/src/ffbb_data_client/models/saison_fields.py +0 -0
  272. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/src/ffbb_data_client/models/saisons_models.py +0 -0
  273. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/src/ffbb_data_client/models/saisons_query.py +0 -0
  274. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/src/ffbb_data_client/models/salle.py +0 -0
  275. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/src/ffbb_data_client/models/salles_facet_distribution.py +0 -0
  276. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/src/ffbb_data_client/models/salles_facet_stats.py +0 -0
  277. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/src/ffbb_data_client/models/salles_hit.py +0 -0
  278. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/src/ffbb_data_client/models/salles_multi_search_query.py +0 -0
  279. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/src/ffbb_data_client/models/sexe.py +0 -0
  280. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/src/ffbb_data_client/models/sexe_class.py +0 -0
  281. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/src/ffbb_data_client/models/source.py +0 -0
  282. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/src/ffbb_data_client/models/status.py +0 -0
  283. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/src/ffbb_data_client/models/team_engagement.py +0 -0
  284. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/src/ffbb_data_client/models/team_ranking.py +0 -0
  285. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/src/ffbb_data_client/models/terrains_categorie_championnat_3x3_libelle.py +0 -0
  286. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/src/ffbb_data_client/models/terrains_facet_distribution.py +0 -0
  287. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/src/ffbb_data_client/models/terrains_facet_stats.py +0 -0
  288. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/src/ffbb_data_client/models/terrains_hit.py +0 -0
  289. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/src/ffbb_data_client/models/terrains_multi_search_query.py +0 -0
  290. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/src/ffbb_data_client/models/terrains_name.py +0 -0
  291. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/src/ffbb_data_client/models/terrains_sexe_enum.py +0 -0
  292. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/src/ffbb_data_client/models/terrains_storage.py +0 -0
  293. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/src/ffbb_data_client/models/tournoi_type_class.py +0 -0
  294. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/src/ffbb_data_client/models/tournoi_type_enum.py +0 -0
  295. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/src/ffbb_data_client/models/tournoi_types_3x3.py +0 -0
  296. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/src/ffbb_data_client/models/tournoi_types_3x3_libelle.py +0 -0
  297. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/src/ffbb_data_client/models/tournoi_types_3x3_libelle_enum.py +0 -0
  298. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/src/ffbb_data_client/models/tournois_facet_distribution.py +0 -0
  299. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/src/ffbb_data_client/models/tournois_facet_stats.py +0 -0
  300. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/src/ffbb_data_client/models/tournois_hit.py +0 -0
  301. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/src/ffbb_data_client/models/tournois_hit_type.py +0 -0
  302. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/src/ffbb_data_client/models/tournois_libelle.py +0 -0
  303. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/src/ffbb_data_client/models/tournois_multi_search_query.py +0 -0
  304. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/src/ffbb_data_client/models/type_association.py +0 -0
  305. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/src/ffbb_data_client/models/type_association_libelle.py +0 -0
  306. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/src/ffbb_data_client/models/type_class.py +0 -0
  307. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/src/ffbb_data_client/models/type_competition.py +0 -0
  308. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/src/ffbb_data_client/models/type_competition_generique.py +0 -0
  309. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/src/ffbb_data_client/models/type_enum.py +0 -0
  310. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/src/ffbb_data_client/models/type_league.py +0 -0
  311. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/src/ffbb_data_client/py.typed +0 -0
  312. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/src/ffbb_data_client/utils/__init__.py +0 -0
  313. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/src/ffbb_data_client/utils/cache_manager.py +0 -0
  314. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/src/ffbb_data_client/utils/concurrency_utils.py +0 -0
  315. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/src/ffbb_data_client/utils/converter_utils.py +0 -0
  316. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/src/ffbb_data_client/utils/input_validation.py +0 -0
  317. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/src/ffbb_data_client/utils/secure_logging.py +0 -0
  318. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/src/ffbb_data_client.egg-info/dependency_links.txt +0 -0
  319. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/src/ffbb_data_client.egg-info/not-zip-safe +0 -0
  320. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/src/ffbb_data_client.egg-info/requires.txt +0 -0
  321. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/src/ffbb_data_client.egg-info/top_level.txt +0 -0
  322. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/tests/e2e/__init__.py +0 -0
  323. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/tests/e2e/conftest.py +0 -0
  324. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/tests/integration/__init__.py +0 -0
  325. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/tests/integration/conftest.py +0 -0
  326. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/tests/integration/test_500_user_journey.py +0 -0
  327. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/tests/integration/test_501_user_journey_v3.py +0 -0
  328. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/tests/integration/test_502_enhanced_integration.py +0 -0
  329. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/tests/integration/test_503_secure_logging.py +0 -0
  330. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/tests/integration/test_504_input_validation.py +0 -0
  331. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/tests/integration/test_505_retry_timeout.py +0 -0
  332. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/tests/unit/__init__.py +0 -0
  333. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/tests/unit/clients/__init__.py +0 -0
  334. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/tests/unit/clients/test_200_api_ffbb_app_client.py +0 -0
  335. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/tests/unit/clients/test_201_unit_tests_core.py +0 -0
  336. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/tests/unit/clients/test_202_meilisearch_client.py +0 -0
  337. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/tests/unit/clients/test_203_meilisearch_client_extension.py +0 -0
  338. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/tests/unit/clients/test_204_ffbb_data_client.py +0 -0
  339. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/tests/unit/clients/test_205_meilisearch_ffbb_client.py +0 -0
  340. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/tests/unit/clients/test_206_coverage_gaps_clients.py +0 -0
  341. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/tests/unit/clients/test_207_coverage_clients_extended.py +0 -0
  342. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/tests/unit/clients/test_208_new_methods_coverage.py +0 -0
  343. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/tests/unit/clients/test_209_automatic_token_resolution.py +0 -0
  344. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/tests/unit/clients/test_210_targeted_clients_helpers_coverage.py +0 -0
  345. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/tests/unit/clients/test_api_optimizations.py +0 -0
  346. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/tests/unit/clients/test_async_methods.py +0 -0
  347. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/tests/unit/clients/test_meilisearch_async.py +0 -0
  348. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/tests/unit/clients/test_search_many.py +0 -0
  349. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/tests/unit/clients/test_v2_backport_search.py +0 -0
  350. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/tests/unit/clients/test_v3_new_features.py +0 -0
  351. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/tests/unit/clients/test_v4_aiter_and_contacts.py +0 -0
  352. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/tests/unit/clients/test_warm_cache.py +0 -0
  353. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/tests/unit/conftest.py +0 -0
  354. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/tests/unit/helpers/__init__.py +0 -0
  355. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/tests/unit/helpers/test_meilisearch_client_extension_recursive_pagination.py +0 -0
  356. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/tests/unit/helpers/test_meilisearch_pagination_concurrent.py +0 -0
  357. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/tests/unit/helpers/test_normalization.py +0 -0
  358. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/tests/unit/models/__init__.py +0 -0
  359. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/tests/unit/models/test_100_competition_id_categorie.py +0 -0
  360. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/tests/unit/models/test_101_competition_id_sexe.py +0 -0
  361. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/tests/unit/models/test_102_competition_id_type_competition.py +0 -0
  362. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/tests/unit/models/test_103_competition_id_type_competition_generique.py +0 -0
  363. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/tests/unit/models/test_104_competition_origine_categorie.py +0 -0
  364. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/tests/unit/models/test_105_competition_origine_type_competition_generique.py +0 -0
  365. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/tests/unit/models/test_106_competition_origine.py +0 -0
  366. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/tests/unit/models/test_107_id_engagement_equipe.py +0 -0
  367. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/tests/unit/models/test_108_id_organisme_equipe.py +0 -0
  368. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/tests/unit/models/test_109_id_organisme_equipe1_logo.py +0 -0
  369. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/tests/unit/models/test_110_labellisation.py +0 -0
  370. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/tests/unit/models/test_111_niveau_class.py +0 -0
  371. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/tests/unit/models/test_112_purple_logo.py +0 -0
  372. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/tests/unit/models/test_113_salle.py +0 -0
  373. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/tests/unit/models/test_114_tournoi_type_class.py +0 -0
  374. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/tests/unit/models/test_115_type_association_libelle.py +0 -0
  375. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/tests/unit/models/test_116_type_competition_generique.py +0 -0
  376. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/tests/unit/models/test_117_organisateur.py +0 -0
  377. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/tests/unit/models/test_118_competition_id.py +0 -0
  378. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/tests/unit/models/test_119_terrains_inner_models.py +0 -0
  379. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/tests/unit/models/test_120_pratiques_inner_models.py +0 -0
  380. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/tests/unit/models/test_121_to_dict_round_trip.py +0 -0
  381. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/tests/unit/models/test_122_coverage_gaps.py +0 -0
  382. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/tests/unit/models/test_123_missing_coverage.py +0 -0
  383. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/tests/unit/models/test_123_v2_backport.py +0 -0
  384. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/tests/unit/models/test_124_targeted_coverage_gains.py +0 -0
  385. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/tests/unit/models/test_dx_aliases.py +0 -0
  386. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/tests/unit/test_311_normalize_team_name.py +0 -0
  387. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/tests/unit/test_312_api_cors.py +0 -0
  388. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/tests/unit/test_313_api_metrics.py +0 -0
  389. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/tests/unit/utils/__init__.py +0 -0
  390. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/tests/unit/utils/test_300_secure_logging.py +0 -0
  391. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/tests/unit/utils/test_303_cache_manager.py +0 -0
  392. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/tests/unit/utils/test_306_converter_utils.py +0 -0
  393. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/tests/unit/utils/test_307_coverage_gaps_utils.py +0 -0
  394. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/tests/unit/utils/test_308_converter_utils_extended.py +0 -0
  395. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/tests/unit/utils/test_309_concurrency_utils.py +0 -0
  396. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/tools/update_agents_md.py +0 -0
  397. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/tox.ini +0 -0
  398. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/website/assets/apple-touch-icon.png +0 -0
  399. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/website/assets/favicon-192x192.png +0 -0
  400. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/website/assets/favicon-48x48.png +0 -0
  401. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/website/assets/favicon-96x96.png +0 -0
  402. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/website/assets/favicon.ico +0 -0
  403. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/website/assets/logo.webp +0 -0
  404. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/website/css/style.css +0 -0
  405. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/website/favicon.ico +0 -0
  406. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/website/llms-full.txt +0 -0
  407. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/website/llms.txt +0 -0
  408. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/website/robots.txt +0 -0
  409. {ffbb_data_client-2.4.39 → ffbb_data_client-2.4.41}/website/sitemap.xml +0 -0
@@ -1,8 +1,8 @@
1
1
  # FFBB Data Client SDK
2
2
 
3
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 : ~19037 lignes de code
5
- > (clients: 6014, models: 9806, utils: 2061, helpers: 1156)
4
+ > Dernière mise à jour : ffbb-data-client | SDK total : ~20017 lignes de code
5
+ > (clients: 6472, models: 9825, utils: 2479, helpers: 1241)
6
6
 
7
7
  ## Langue
8
8
  Tous les documents de travail (walkthrough.md, implementation_plan.md) DOIVENT être en français.
@@ -69,13 +69,13 @@ Ces directives inspirées d'Andrej Karpathy visent à éliminer les erreurs de c
69
69
  ```
70
70
  src/ffbb_data_client/
71
71
  ├── __init__.py # Point d'entrée du SDK, expose FFBBDataClient et FFBBTokens
72
- ├── clients/ # Clients d'API (REST et Meilisearch) et façades (≈6014 lignes)
72
+ ├── clients/ # Clients d'API (REST et Meilisearch) et façades (≈6472 lignes)
73
73
  ├── config.py # Configuration centralisée (URLs, Headers, Endpoints, Facettes)
74
74
  ├── data/ # Ressources et données statiques
75
- ├── helpers/ # Méthodes utilitaires pour requêtes HTTP et mapping (≈1156 lignes)
76
- ├── models/ # Modèles de données Pydantic type-safe (≈9806 lignes)
75
+ ├── helpers/ # Méthodes utilitaires pour requêtes HTTP et mapping (≈1241 lignes)
76
+ ├── models/ # Modèles de données Pydantic type-safe (≈9825 lignes)
77
77
  ├── py.typed # Marqueur pour la compatibilité avec mypy
78
- └── utils/ # Gestionnaires transversaux (cache, jetons de sécurité, validation) (≈2061 lignes)
78
+ └── utils/ # Gestionnaires transversaux (cache, jetons de sécurité, validation) (≈2479 lignes)
79
79
  ```
80
80
 
81
81
  ## Conventions de code
@@ -7,6 +7,32 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
+ ## [2.4.41] - 2026-10-30
11
+
12
+ ### Resilience & WAF Bypass (Mobile App Discovery)
13
+ - **User-Agents mobiles officiels FFBB** : Intégration des User-Agents authentiques issus du reverse-engineering de l'application officielle FFBB React Native (moteur Hermes) :
14
+ - Android : `FFBB/1.6.7.42 Dalvik/2.1.0 (Linux; U; Android 5.1.1; Android SDK built for x86 Build/LMY48X)` (par défaut)
15
+ - iOS : `FFBB/1.6.4.176 CFNetwork/897.15 Darwin/17.5.0 (iPhone/6s iOS/11.3)`
16
+ - Safari iOS : `Mozilla/5.0 (iPhone; CPU iPhone OS 17_5 like Mac OS X) AppleWebKit/605.1.15`
17
+ - **Rotation ciblée `FALLBACK_USER_AGENTS` & réarmement du disjoncteur** :
18
+ - Réintroduction de la boucle de fallback automatique sur `FALLBACK_USER_AGENTS` dans `http_get`, `http_post`, `http_get_async` et `http_post_async` lors d'un code HTTP 403 HTML BunnyCDN.
19
+ - Ajout de `reset_host_waf_block(url_or_host)` permettant d'essayer chirurgicalement chaque User-Agent candidat sans que le premier échec ne verrouille immédiatement le disjoncteur pour 600s.
20
+ - Prise en charge dans `TokenManager._fetch_configuration` pour tenter l'ensemble des User-Agents mobiles officiels avant de basculer sur les jetons résilients par défaut.
21
+
22
+ ## [2.4.40] - 2026-10-24
23
+
24
+ ### Resilience (BunnyCDN WAF)
25
+ - **Disjoncteur WAF par hôte** : un 403 BunnyCDN coupe l'hôte pendant `FFBB_WAF_COOLDOWN_SECONDS` (600 s par défaut). Les appels suivants échouent instantanément sans requête réseau, puis l'hôte est sondé à nouveau après le délai.
26
+ - **Suppression de la rotation de User-Agent et du retry sur 403** : mesuré sans effet (5 User-Agents bloqués, même authentifiés), ils multipliaient les requêtes. `FALLBACK_USER_AGENTS` est retiré de `config`.
27
+ - **Pas de rafraîchissement de token sur un 403 WAF** (le token n'est pas en cause).
28
+ - **Fallback Meilisearch exact** (`helpers/meilisearch_fallback.py`) : organisme par `id`, engagements par `codeClub`, rencontres filtrées par code club. Corrige l'ancien fallback qui renvoyait des matchs d'autres clubs (recherche floue) avec compétition et salle vides.
29
+ - **Fallback organisme/engagements et saison active** lorsque Directus est bloqué ; jetons de secours quand `/items/configuration` est inaccessible.
30
+
31
+ ### API REST
32
+ - `GET /api/v1/club/{id}/matches` : filtre `date_from`/`date_to` ; en mode dégradé, en-tête `X-FFBB-Data-Source: meilisearch-window` (l'index ne couvre qu'une fenêtre glissante).
33
+ - `GET /api/v1/poule/{id}` et `/classement` : `degraded: true` et `Cache-Control: no-store` quand la donnée est indisponible, au lieu d'un vide présenté comme réel.
34
+ - `/health/ready` : `directus: waf_blocked` ; `/metrics` : `ffbb_upstream_waf_blocked_seconds{host=...}`.
35
+
10
36
  ## [2.4.39] - 2026-10-14
11
37
 
12
38
  ### Features & Discovery
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: ffbb-data-client
3
- Version: 2.4.39
3
+ Version: 2.4.41
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
@@ -97,6 +97,9 @@ Dynamic: license-file
97
97
  > 🔄 **Cartographie API synchronisée** : `162` collections Directus OpenAPI cartographiées, `17` index Meilisearch surveillés.
98
98
  <!-- DISCOVERY_METRICS:END -->
99
99
 
100
+ > [!WARNING]
101
+ > **Mode dégradé — blocage WAF BunnyCDN (octobre 2026)** : l'origine Directus (`bo.ffbb.com` / `bo.ffbb.app`) est actuellement bloquée en 403 par le WAF BunnyCDN, y compris avec un jeton valide. Les clubs, équipes et matchs récents restent servis via Meilisearch. En revanche, **les classements de poule resteront vides (avec `degraded: true`) tant que Directus est bloqué**, car Meilisearch n'en contient pas. La seule issue durable reste un accès officiel auprès de la FFBB.
102
+
100
103
  ---
101
104
 
102
105
  ## 🏆 Pourquoi choisir `ffbb-data-client` ?
@@ -341,7 +344,7 @@ Accédez ensuite à la documentation Swagger interactive sur `http://localhost:8
341
344
 
342
345
  ## 🛠️ Robustesse, CI/CD & Découverte Quotidienne
343
346
 
344
- * **Origine Directus & Anti-403** : Bascule native vers l'origine Directus `https://bo.ffbb.com/` (et fallback miroir `https://bo.ffbb.app/`) avec User-Agent mobile Safari authentique, éliminant définitivement les erreurs 403 Forbidden de l'ancienne pullzone BunnyCDN.
347
+ * **Origine Directus & Anti-403** : Origine Directus `https://bo.ffbb.com/` (fallback miroir `https://bo.ffbb.app/`). En cas de blocage WAF BunnyCDN, un disjoncteur coupe l'hôte (`FFBB_WAF_COOLDOWN_SECONDS`) et les données disponibles basculent sur Meilisearch ; les réponses partielles sont signalées (`degraded`, `X-FFBB-Data-Source`).
345
348
  * **Auto-Résolution des Tokens** : Découverte et rotation dynamiques des jetons Bearer Directus et Meilisearch sans configuration requise.
346
349
  * **Découverte Quotidienne du Schéma** : Un cron GitHub Actions analyse chaque matin à 5h17 UTC l'OpenAPI spec officielle de la FFBB et détecte automatiquement tout nouveau champ ou collection Directus.
347
350
  * **Cache Intelligent Sécurisé** : Gestionnaire de cache HTTP `hishel` avec SQLite distinct pour les flux synchrones et asynchrones.
@@ -356,7 +359,7 @@ Le SDK fonctionne instantanément sans configuration. Des variables d'environnem
356
359
  | Variable | Description | Valeur par défaut |
357
360
  | :--- | :--- | :--- |
358
361
  | `API_FFBB_BASE_URL` | URL de base du backend Directus | `https://bo.ffbb.com/` |
359
- | `FFBB_USER_AGENT` | En-tête User-Agent transmis aux requêtes | iOS Safari Mobile |
362
+ | `FFBB_USER_AGENT` | En-tête User-Agent transmis aux requêtes | FFBB Android Mobile (1.6.7.42) |
360
363
  | `API_FFBB_APP_BEARER_TOKEN` | Jeton Directus explicite (override l'auto-résolution) | Auto-résolu dynamiquement |
361
364
  | `MEILISEARCH_BEARER_TOKEN` | Jeton Meilisearch explicite (override l'auto-résolution) | Auto-résolu dynamiquement |
362
365
  | `HTTP_PROXY` / `HTTPS_PROXY` | Proxy HTTP/HTTPS sortant (ex: swarm / environnement conteneurisé) | Aucun |
@@ -41,6 +41,9 @@
41
41
  > 🔄 **Cartographie API synchronisée** : `162` collections Directus OpenAPI cartographiées, `17` index Meilisearch surveillés.
42
42
  <!-- DISCOVERY_METRICS:END -->
43
43
 
44
+ > [!WARNING]
45
+ > **Mode dégradé — blocage WAF BunnyCDN (octobre 2026)** : l'origine Directus (`bo.ffbb.com` / `bo.ffbb.app`) est actuellement bloquée en 403 par le WAF BunnyCDN, y compris avec un jeton valide. Les clubs, équipes et matchs récents restent servis via Meilisearch. En revanche, **les classements de poule resteront vides (avec `degraded: true`) tant que Directus est bloqué**, car Meilisearch n'en contient pas. La seule issue durable reste un accès officiel auprès de la FFBB.
46
+
44
47
  ---
45
48
 
46
49
  ## 🏆 Pourquoi choisir `ffbb-data-client` ?
@@ -285,7 +288,7 @@ Accédez ensuite à la documentation Swagger interactive sur `http://localhost:8
285
288
 
286
289
  ## 🛠️ Robustesse, CI/CD & Découverte Quotidienne
287
290
 
288
- * **Origine Directus & Anti-403** : Bascule native vers l'origine Directus `https://bo.ffbb.com/` (et fallback miroir `https://bo.ffbb.app/`) avec User-Agent mobile Safari authentique, éliminant définitivement les erreurs 403 Forbidden de l'ancienne pullzone BunnyCDN.
291
+ * **Origine Directus & Anti-403** : Origine Directus `https://bo.ffbb.com/` (fallback miroir `https://bo.ffbb.app/`). En cas de blocage WAF BunnyCDN, un disjoncteur coupe l'hôte (`FFBB_WAF_COOLDOWN_SECONDS`) et les données disponibles basculent sur Meilisearch ; les réponses partielles sont signalées (`degraded`, `X-FFBB-Data-Source`).
289
292
  * **Auto-Résolution des Tokens** : Découverte et rotation dynamiques des jetons Bearer Directus et Meilisearch sans configuration requise.
290
293
  * **Découverte Quotidienne du Schéma** : Un cron GitHub Actions analyse chaque matin à 5h17 UTC l'OpenAPI spec officielle de la FFBB et détecte automatiquement tout nouveau champ ou collection Directus.
291
294
  * **Cache Intelligent Sécurisé** : Gestionnaire de cache HTTP `hishel` avec SQLite distinct pour les flux synchrones et asynchrones.
@@ -300,7 +303,7 @@ Le SDK fonctionne instantanément sans configuration. Des variables d'environnem
300
303
  | Variable | Description | Valeur par défaut |
301
304
  | :--- | :--- | :--- |
302
305
  | `API_FFBB_BASE_URL` | URL de base du backend Directus | `https://bo.ffbb.com/` |
303
- | `FFBB_USER_AGENT` | En-tête User-Agent transmis aux requêtes | iOS Safari Mobile |
306
+ | `FFBB_USER_AGENT` | En-tête User-Agent transmis aux requêtes | FFBB Android Mobile (1.6.7.42) |
304
307
  | `API_FFBB_APP_BEARER_TOKEN` | Jeton Directus explicite (override l'auto-résolution) | Auto-résolu dynamiquement |
305
308
  | `MEILISEARCH_BEARER_TOKEN` | Jeton Meilisearch explicite (override l'auto-résolution) | Auto-résolu dynamiquement |
306
309
  | `HTTP_PROXY` / `HTTPS_PROXY` | Proxy HTTP/HTTPS sortant (ex: swarm / environnement conteneurisé) | Aucun |
@@ -1,6 +1,31 @@
1
1
  # Release Notes - FFBB Data Client
2
2
 
3
- ## Version 2.4.39 (Latest Release)
3
+ ## Version 2.4.41 (Latest Release)
4
+
5
+ ### 📱 Official FFBB Mobile App User-Agents & Targeted WAF Fallback
6
+ - **Official Mobile User-Agents**: Added authentic User-Agents extracted from the official FFBB React Native mobile application (Hermes bytecode):
7
+ - Android: `FFBB/1.6.7.42 Dalvik/2.1.0 (Linux; U; Android 5.1.1; Android SDK built for x86 Build/LMY48X)` (now default)
8
+ - iOS: `FFBB/1.6.4.176 CFNetwork/897.15 Darwin/17.5.0 (iPhone/6s iOS/11.3)`
9
+ - Safari iOS: `Mozilla/5.0 (iPhone; CPU iPhone OS 17_5 like Mac OS X) AppleWebKit/605.1.15`
10
+ - **Targeted Fallback Rotation & Circuit Unlocking**:
11
+ - Re-introduced resilient `FALLBACK_USER_AGENTS` rotation in `http_get`, `http_post`, `http_get_async`, and `http_post_async` upon receiving BunnyCDN 403 HTML.
12
+ - Added `reset_host_waf_block()` to ensure each candidate User-Agent gets executed without premature tripping of the 600s circuit breaker.
13
+ - Full support in `TokenManager._fetch_configuration` across Directus origins.
14
+
15
+ ---
16
+
17
+ ## Version 2.4.40
18
+
19
+ ### 🛡️ BunnyCDN WAF: circuit breaker instead of evasion
20
+ - **Per-host WAF circuit breaker**: a BunnyCDN 403 opens the circuit for `FFBB_WAF_COOLDOWN_SECONDS` (default 600 s). Subsequent calls fail instantly with no network traffic, then the host is probed again.
21
+ - **User-Agent rotation and 403 retries removed**: measured ineffective (all User-Agents blocked, even with a valid bearer); they only multiplied outbound requests.
22
+ - **Exact Meilisearch fallback**: organisme by `id`, engagements by `codeClub`, club matches filtered by club code. Fixes the previous fuzzy fallback that returned other clubs' matches.
23
+ - **Honest degraded mode**: `degraded: true` + `Cache-Control: no-store` on poule endpoints, `X-FFBB-Data-Source: meilisearch-window` on club matches, `directus: waf_blocked` readiness and `ffbb_upstream_waf_blocked_seconds` metric.
24
+ - **Club matches date filter**: `date_from` / `date_to` on `GET /api/v1/club/{id}/matches`.
25
+
26
+ ---
27
+
28
+ ## Version 2.4.39
4
29
 
5
30
  ### 🚀 Live Next.js Bundle Probing & Automatic Origin Discovery
6
31
  - **Autonomous Origin Extraction**: Introduced `probe_ffbb_web_origins` in `ffbb_data_client.utils.web_probe` to dynamically parse Next.js chunks from `www.ffbb.com` and identify operational Directus (`bo.ffbb.com`, `bo.ffbb.app`) and Meilisearch endpoints.
@@ -1,10 +1,10 @@
1
1
  # FFBB API update summary
2
2
 
3
- - Timestamp: `2026-10-13T12:17:56.973628+00:00`
3
+ - Timestamp: `2026-10-27T10:37:32.761487+00:00`
4
4
  - API base URL: `https://bo.ffbb.com/`
5
5
  - Meilisearch base URL: `https://meilisearch-prod.ffbb.app/`
6
- - OpenAPI version: `d7c8f0b3195fb0535eabd9d05c510a002d838c9a`
7
- - OpenAPI SHA256: `845c3e397ddc6d238069f38b23b08438893470c106a22c3292508fd7eb8c8188`
6
+ - OpenAPI version: `4aa55950ce1db53a17db2c04c935dc112989a92c`
7
+ - OpenAPI SHA256: `023cee7b018aed058369ca6757cfa08c823328ebe64f1e055dca22387b862bce`
8
8
 
9
9
  ## Directus collections
10
10
  - Total: `162`
@@ -21,8 +21,19 @@
21
21
  - Added: None
22
22
  - Removed: None
23
23
 
24
+ ## Meilisearch index attributes drift
25
+ - **ffbbserver_rencontres** :
26
+ - Removed attributes: `officiels_string`
27
+
28
+ ---
29
+
30
+ ## 📖 Analyse & Contexte Métier des Nouveautés
31
+
32
+ ### Index Meilisearch
33
+ - **`ffbbserver_rencontres` &rarr; Champ `officiels_string`** (supprimé) :
34
+ - *Nouvel attribut non documenté dans le dictionnaire de référence.*
35
+
24
36
  ## 🌐 Next.js Web Origin Probe
25
- - Healthy Directus origins: `https://bo.ffbb.com/`, `https://bo.ffbb.app/`
26
37
  - Meilisearch public URL: `https://meilisearch-prod.ffbb.app`
27
38
  - Scanned Next.js chunks: 17
28
39
 
@@ -329,9 +329,9 @@
329
329
  "items/youtube_videos_youtube_tags"
330
330
  ],
331
331
  "metadata": {
332
- "openapi_version": "d7c8f0b3195fb0535eabd9d05c510a002d838c9a",
332
+ "openapi_version": "4aa55950ce1db53a17db2c04c935dc112989a92c",
333
333
  "source": "https://bo.ffbb.com/server/specs/oas",
334
- "timestamp": "2026-10-13T12:17:56.973628+00:00"
334
+ "timestamp": "2026-10-27T10:37:32.761487+00:00"
335
335
  },
336
336
  "paths": {
337
337
  "items/configuration": [
@@ -1356,7 +1356,14 @@
1356
1356
  "modified_schemas": {},
1357
1357
  "removed_schemas": []
1358
1358
  },
1359
- "meilisearch_indexes": {}
1359
+ "meilisearch_indexes": {
1360
+ "ffbbserver_rencontres": {
1361
+ "added": [],
1362
+ "removed": [
1363
+ "officiels_string"
1364
+ ]
1365
+ }
1366
+ }
1360
1367
  },
1361
1368
  "meilisearch": {
1362
1369
  "available_indexes": [
@@ -1404,7 +1411,7 @@
1404
1411
  },
1405
1412
  {
1406
1413
  "available": true,
1407
- "estimatedTotalHits": 604,
1414
+ "estimatedTotalHits": 639,
1408
1415
  "indexUid": "ffbbnational_pratiques",
1409
1416
  "sampleKeys": [
1410
1417
  "_geo",
@@ -1461,7 +1468,7 @@
1461
1468
  },
1462
1469
  {
1463
1470
  "available": true,
1464
- "estimatedTotalHits": 4390,
1471
+ "estimatedTotalHits": 4444,
1465
1472
  "indexUid": "ffbbnational_rss",
1466
1473
  "sampleKeys": [
1467
1474
  "categories",
@@ -1491,7 +1498,7 @@
1491
1498
  },
1492
1499
  {
1493
1500
  "available": true,
1494
- "estimatedTotalHits": 3185,
1501
+ "estimatedTotalHits": 3607,
1495
1502
  "indexUid": "ffbbserver_competitions",
1496
1503
  "sampleKeys": [
1497
1504
  "age",
@@ -1571,7 +1578,7 @@
1571
1578
  },
1572
1579
  {
1573
1580
  "available": true,
1574
- "estimatedTotalHits": 145,
1581
+ "estimatedTotalHits": 121,
1575
1582
  "indexUid": "ffbbserver_formations",
1576
1583
  "sampleKeys": [
1577
1584
  "certification",
@@ -1642,7 +1649,7 @@
1642
1649
  },
1643
1650
  {
1644
1651
  "available": true,
1645
- "estimatedTotalHits": 5000,
1652
+ "estimatedTotalHits": 3280,
1646
1653
  "indexUid": "ffbbserver_rencontres",
1647
1654
  "sampleKeys": [
1648
1655
  "_geo",
@@ -1670,7 +1677,6 @@
1670
1677
  "nomEquipe2",
1671
1678
  "numeroJournee",
1672
1679
  "officiels",
1673
- "officiels_string",
1674
1680
  "organisateur",
1675
1681
  "pratique",
1676
1682
  "rematch_videos",
@@ -1734,7 +1740,7 @@
1734
1740
  },
1735
1741
  {
1736
1742
  "available": true,
1737
- "estimatedTotalHits": 31,
1743
+ "estimatedTotalHits": 24,
1738
1744
  "indexUid": "ffbbserver_tournois",
1739
1745
  "sampleKeys": [
1740
1746
  "_geo",
@@ -1789,7 +1795,7 @@
1789
1795
  },
1790
1796
  {
1791
1797
  "available": true,
1792
- "estimatedTotalHits": 5,
1798
+ "estimatedTotalHits": 6,
1793
1799
  "indexUid": "ffbbsite_jobs",
1794
1800
  "sampleKeys": [
1795
1801
  "asset",
@@ -1834,7 +1840,7 @@
1834
1840
  },
1835
1841
  {
1836
1842
  "available": true,
1837
- "estimatedTotalHits": 6393,
1843
+ "estimatedTotalHits": 6446,
1838
1844
  "indexUid": "ffbbsite_news",
1839
1845
  "sampleKeys": [
1840
1846
  "author",
@@ -1893,7 +1899,7 @@
1893
1899
  },
1894
1900
  {
1895
1901
  "available": true,
1896
- "estimatedTotalHits": 1870,
1902
+ "estimatedTotalHits": 1871,
1897
1903
  "indexUid": "youtube_videos",
1898
1904
  "sampleKeys": [
1899
1905
  "channelId",
@@ -1926,7 +1932,7 @@
1926
1932
  ],
1927
1933
  "metadata": {
1928
1934
  "source": "https://meilisearch-prod.ffbb.app/multi-search",
1929
- "timestamp": "2026-10-13T12:17:56.973628+00:00"
1935
+ "timestamp": "2026-10-27T10:37:32.761487+00:00"
1930
1936
  },
1931
1937
  "unavailable_indexes": [
1932
1938
  {
@@ -2667,10 +2673,10 @@
2667
2673
  "api_base_url": "https://bo.ffbb.com/",
2668
2674
  "configured_api_base_url": "https://bo.ffbb.com/",
2669
2675
  "meilisearch_base_url": "https://meilisearch-prod.ffbb.app/",
2670
- "openapi_sha256": "845c3e397ddc6d238069f38b23b08438893470c106a22c3292508fd7eb8c8188",
2671
- "openapi_snapshot_sha256": "537234c1f5b7d75615b0cafaf1775634a3226c2043310195c61fcea0656a84eb",
2672
- "openapi_version": "d7c8f0b3195fb0535eabd9d05c510a002d838c9a",
2673
- "timestamp": "2026-10-13T12:17:56.973628+00:00",
2676
+ "openapi_sha256": "023cee7b018aed058369ca6757cfa08c823328ebe64f1e055dca22387b862bce",
2677
+ "openapi_snapshot_sha256": "023cee7b018aed058369ca6757cfa08c823328ebe64f1e055dca22387b862bce",
2678
+ "openapi_version": "4aa55950ce1db53a17db2c04c935dc112989a92c",
2679
+ "timestamp": "2026-10-27T10:37:32.761487+00:00",
2674
2680
  "web_probe": {
2675
2681
  "all_ffbb_hosts": [
2676
2682
  "https://api.ffbb.app",
@@ -2686,10 +2692,7 @@
2686
2692
  "https://bo.ffbb.com/",
2687
2693
  "https://bo.ffbb.app/"
2688
2694
  ],
2689
- "healthy_directus_urls": [
2690
- "https://bo.ffbb.com/",
2691
- "https://bo.ffbb.app/"
2692
- ],
2695
+ "healthy_directus_urls": [],
2693
2696
  "meilisearch_urls": [
2694
2697
  "https://meilisearch-prod.ffbb.app"
2695
2698
  ],
@@ -44,7 +44,7 @@
44
44
  },
45
45
  {
46
46
  "available": true,
47
- "estimatedTotalHits": 604,
47
+ "estimatedTotalHits": 639,
48
48
  "indexUid": "ffbbnational_pratiques",
49
49
  "sampleKeys": [
50
50
  "_geo",
@@ -101,7 +101,7 @@
101
101
  },
102
102
  {
103
103
  "available": true,
104
- "estimatedTotalHits": 4390,
104
+ "estimatedTotalHits": 4444,
105
105
  "indexUid": "ffbbnational_rss",
106
106
  "sampleKeys": [
107
107
  "categories",
@@ -131,7 +131,7 @@
131
131
  },
132
132
  {
133
133
  "available": true,
134
- "estimatedTotalHits": 3185,
134
+ "estimatedTotalHits": 3607,
135
135
  "indexUid": "ffbbserver_competitions",
136
136
  "sampleKeys": [
137
137
  "age",
@@ -211,7 +211,7 @@
211
211
  },
212
212
  {
213
213
  "available": true,
214
- "estimatedTotalHits": 145,
214
+ "estimatedTotalHits": 121,
215
215
  "indexUid": "ffbbserver_formations",
216
216
  "sampleKeys": [
217
217
  "certification",
@@ -282,7 +282,7 @@
282
282
  },
283
283
  {
284
284
  "available": true,
285
- "estimatedTotalHits": 5000,
285
+ "estimatedTotalHits": 3280,
286
286
  "indexUid": "ffbbserver_rencontres",
287
287
  "sampleKeys": [
288
288
  "_geo",
@@ -310,7 +310,6 @@
310
310
  "nomEquipe2",
311
311
  "numeroJournee",
312
312
  "officiels",
313
- "officiels_string",
314
313
  "organisateur",
315
314
  "pratique",
316
315
  "rematch_videos",
@@ -374,7 +373,7 @@
374
373
  },
375
374
  {
376
375
  "available": true,
377
- "estimatedTotalHits": 31,
376
+ "estimatedTotalHits": 24,
378
377
  "indexUid": "ffbbserver_tournois",
379
378
  "sampleKeys": [
380
379
  "_geo",
@@ -429,7 +428,7 @@
429
428
  },
430
429
  {
431
430
  "available": true,
432
- "estimatedTotalHits": 5,
431
+ "estimatedTotalHits": 6,
433
432
  "indexUid": "ffbbsite_jobs",
434
433
  "sampleKeys": [
435
434
  "asset",
@@ -474,7 +473,7 @@
474
473
  },
475
474
  {
476
475
  "available": true,
477
- "estimatedTotalHits": 6393,
476
+ "estimatedTotalHits": 6446,
478
477
  "indexUid": "ffbbsite_news",
479
478
  "sampleKeys": [
480
479
  "author",
@@ -533,7 +532,7 @@
533
532
  },
534
533
  {
535
534
  "available": true,
536
- "estimatedTotalHits": 1870,
535
+ "estimatedTotalHits": 1871,
537
536
  "indexUid": "youtube_videos",
538
537
  "sampleKeys": [
539
538
  "channelId",
@@ -566,7 +565,7 @@
566
565
  ],
567
566
  "metadata": {
568
567
  "source": "https://meilisearch-prod.ffbb.app/multi-search",
569
- "timestamp": "2026-10-13T12:09:11.118613+00:00"
568
+ "timestamp": "2026-10-27T10:37:32.761487+00:00"
570
569
  },
571
570
  "unavailable_indexes": [
572
571
  {
@@ -9,26 +9,26 @@
9
9
  "archived_competition_id": "200000002872733",
10
10
  "canary_season": "2026-2027",
11
11
  "current_competition_id": "200000002900744",
12
- "timestamp": "2026-10-13T12:09:20.089035+00:00",
12
+ "timestamp": "2026-10-27T10:37:39.458428+00:00",
13
13
  "token_source": "public-fallback"
14
14
  },
15
15
  "probes": [
16
16
  {
17
17
  "name": "config_noauth",
18
18
  "notes": "Public endpoint sans auth : contrôle BunnyCDN et joignabilité par défaut.",
19
- "outcome": "ok",
20
- "status": 200,
19
+ "outcome": "blocked_cdn",
20
+ "status": 403,
21
21
  "url": "https://bo.ffbb.com/items/configuration"
22
22
  },
23
23
  {
24
24
  "name": "config_noauth_ipv4",
25
25
  "notes": "Public endpoint sans auth en IPv4 strict : détection précoce du blocage WAF BunnyCDN IPv4.",
26
- "outcome": "ok",
27
- "status": 200,
26
+ "outcome": "blocked_cdn",
27
+ "status": 403,
28
28
  "url": "https://bo.ffbb.com/items/configuration"
29
29
  },
30
30
  {
31
- "detail": "[Errno 8] nodename nor servname provided, or not known",
31
+ "detail": "[Errno 101] Network is unreachable",
32
32
  "name": "config_noauth_ipv6",
33
33
  "notes": "Public endpoint sans auth en IPv6 strict.",
34
34
  "outcome": "error:ConnectError",
@@ -38,86 +38,85 @@
38
38
  {
39
39
  "name": "config_tripwire_okhttp_ipv4",
40
40
  "notes": "Canari sentinelle okhttp sur IPv4 : attendu blocked_cdn (alerte si débloqué ou si la règle change).",
41
- "outcome": "ok",
42
- "status": 200,
41
+ "outcome": "blocked_cdn",
42
+ "status": 403,
43
43
  "url": "https://bo.ffbb.com/items/configuration"
44
44
  },
45
45
  {
46
46
  "name": "saisons_id_field",
47
47
  "notes": "Champ contrôle, attendu ok.",
48
- "outcome": "ok",
49
- "status": 200,
48
+ "outcome": "blocked_cdn",
49
+ "status": 403,
50
50
  "url": "https://bo.ffbb.com/items/ffbbserver_saisons?fields%5B%5D=id&limit=1"
51
51
  },
52
52
  {
53
53
  "name": "saisons_nom_field",
54
54
  "notes": "Champ restreint depuis sept 2026 : 403 Directus attendu.",
55
- "outcome": "forbidden_directus",
55
+ "outcome": "blocked_cdn",
56
56
  "status": 403,
57
57
  "url": "https://bo.ffbb.com/items/ffbbserver_saisons?fields%5B%5D=nom&limit=1"
58
58
  },
59
59
  {
60
60
  "name": "competitions_listing",
61
61
  "notes": "Listing contrôle, attendu ok.",
62
- "outcome": "ok",
63
- "status": 200,
62
+ "outcome": "blocked_cdn",
63
+ "status": 403,
64
64
  "url": "https://bo.ffbb.com/items/ffbbserver_competitions?limit=1"
65
65
  },
66
66
  {
67
67
  "name": "organismes_listing",
68
68
  "notes": "Listing contrôle, attendu ok.",
69
- "outcome": "ok",
70
- "status": 200,
69
+ "outcome": "blocked_cdn",
70
+ "status": 403,
71
71
  "url": "https://bo.ffbb.com/items/ffbbserver_organismes?limit=1"
72
72
  },
73
73
  {
74
74
  "name": "rencontres_listing",
75
75
  "notes": "Listing contrôle, attendu ok.",
76
- "outcome": "ok",
77
- "status": 200,
76
+ "outcome": "blocked_cdn",
77
+ "status": 403,
78
78
  "url": "https://bo.ffbb.com/items/ffbbserver_rencontres?limit=1"
79
79
  },
80
80
  {
81
81
  "name": "engagements_listing",
82
82
  "notes": "Listing contrôle, attendu ok.",
83
- "outcome": "ok",
84
- "status": 200,
83
+ "outcome": "blocked_cdn",
84
+ "status": 403,
85
85
  "url": "https://bo.ffbb.com/items/ffbbserver_engagements?limit=1"
86
86
  },
87
87
  {
88
88
  "name": "competition_current_direct",
89
89
  "notes": "Canari saison 2026-2027 : auto-rafraîchissable sur rollover. Un flip ici signale un canari périmé, pas forcément un changement de politique.",
90
- "outcome": "ok",
91
- "status": 200,
90
+ "outcome": "blocked_cdn",
91
+ "status": 403,
92
92
  "url": "https://bo.ffbb.com/items/ffbbserver_competitions/200000002900744"
93
93
  },
94
94
  {
95
95
  "name": "relational_nested_expand",
96
96
  "notes": "Jointure relationnelle multi-niveaux Directus (rencontre->poule->competition->organisateur).",
97
- "outcome": "ok",
98
- "status": 200,
97
+ "outcome": "blocked_cdn",
98
+ "status": 403,
99
99
  "url": "https://bo.ffbb.com/items/ffbbserver_rencontres?fields%5B%5D=id&fields%5B%5D=numero&fields%5B%5D=idPoule.id&fields%5B%5D=idPoule.nom&fields%5B%5D=idPoule.id_competition.id&fields%5B%5D=idPoule.id_competition.organisateur.code&limit=1&sort=-id"
100
100
  },
101
101
  {
102
102
  "name": "competition_current_filter",
103
103
  "notes": "Filtre sur saison courante, attendu ok non vide.",
104
- "outcome": "ok",
105
- "status": 200,
104
+ "outcome": "blocked_cdn",
105
+ "status": 403,
106
106
  "url": "https://bo.ffbb.com/items/ffbbserver_competitions?filter%5Bid%5D%5B_eq%5D=200000002900744&limit=1"
107
107
  },
108
108
  {
109
109
  "name": "competition_archived_direct",
110
110
  "notes": "Saison archivée : 403 Directus attendu sur accès direct.",
111
- "outcome": "forbidden_directus",
111
+ "outcome": "blocked_cdn",
112
112
  "status": 403,
113
113
  "url": "https://bo.ffbb.com/items/ffbbserver_competitions/200000002872733"
114
114
  },
115
115
  {
116
- "content_type": "application/json; charset=utf-8",
117
116
  "name": "competition_archived_filter",
118
117
  "notes": "Filtre sur archivé : 200 vide attendu (pas une erreur HTTP).",
119
- "outcome": "empty",
120
- "status": 200,
118
+ "outcome": "blocked_cdn",
119
+ "status": 403,
121
120
  "url": "https://bo.ffbb.com/items/ffbbserver_competitions?filter%5Bid%5D%5B_eq%5D=200000002872733&limit=1"
122
121
  }
123
122
  ]