ffbb-data-client 2.3.3__tar.gz → 2.3.4__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 (381) hide show
  1. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/.github/workflows/keep-ffbb-api-discovery-alive.yml +3 -3
  2. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/.github/workflows/publish.yml +1 -0
  3. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/.github/workflows/release-after-discovery-merge.yml +8 -0
  4. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/.github/workflows/update-ffbb-api-discovery.yml +1 -0
  5. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/CHANGELOG.md +52 -1
  6. ffbb_data_client-2.3.4/DESIGN.md +171 -0
  7. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/PKG-INFO +6 -26
  8. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/README.md +5 -25
  9. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/RELEASE_NOTES.md +74 -2
  10. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/scripts/discover_endpoints.py +37 -0
  11. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/clients/api_ffbb_app_client.py +4 -3
  12. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/clients/meilisearch_client.py +3 -4
  13. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/saison_fields.py +0 -1
  14. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/utils/secure_logging.py +15 -12
  15. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client.egg-info/PKG-INFO +6 -26
  16. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client.egg-info/SOURCES.txt +1 -0
  17. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client.egg-info/scm_file_list.json +1 -0
  18. ffbb_data_client-2.3.4/src/ffbb_data_client.egg-info/scm_version.json +8 -0
  19. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/tests/integration/test_503_secure_logging.py +4 -6
  20. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/tests/unit/clients/test_201_unit_tests_core.py +2 -3
  21. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/tests/unit/utils/test_300_secure_logging.py +23 -8
  22. ffbb_data_client-2.3.4/website/css/style.css +1124 -0
  23. ffbb_data_client-2.3.4/website/index.html +623 -0
  24. ffbb_data_client-2.3.3/src/ffbb_data_client.egg-info/scm_version.json +0 -8
  25. ffbb_data_client-2.3.3/website/css/style.css +0 -490
  26. ffbb_data_client-2.3.3/website/index.html +0 -256
  27. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/.agents/rules/antigravity-rtk-rules.md +0 -0
  28. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/.coveragerc +0 -0
  29. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/.gitattributes +0 -0
  30. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/.github/FUNDING.yml +0 -0
  31. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
  32. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
  33. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
  34. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/.github/dependabot.yml +0 -0
  35. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/.github/scripts/ai-pr-reviewer.cjs +0 -0
  36. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/.github/scripts/check_wrapper_parity.py +0 -0
  37. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/.github/workflows/ai-pr-reviewer.yml +0 -0
  38. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/.github/workflows/check_wrapper_parity.yml +0 -0
  39. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/.github/workflows/ci.yml +0 -0
  40. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/.github/workflows/codeql.yml +0 -0
  41. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/.github/workflows/deploy-pages.yml +0 -0
  42. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/.gitignore +0 -0
  43. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/.isort.cfg +0 -0
  44. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/.jules/bolt.md +0 -0
  45. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/.pre-commit-config.yaml +0 -0
  46. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/.readthedocs.yml +0 -0
  47. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/AGENTS.md +0 -0
  48. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/AUTHORS.rst +0 -0
  49. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/CODE_OF_CONDUCT.md +0 -0
  50. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/CONTRIBUTING.rst +0 -0
  51. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/LICENSE.txt +0 -0
  52. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/LOCAL_CI_GUIDE.md +0 -0
  53. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/SECURITY.md +0 -0
  54. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/data/api.ffbb.app.json +0 -0
  55. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/data/api_update_summary.md +0 -0
  56. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/data/collections.json +0 -0
  57. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/data/endpoint_discovery.json +0 -0
  58. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/data/indexes.json +0 -0
  59. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/data/meilisearch-prod.ffbb.app.json +0 -0
  60. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/data/openapi.json +0 -0
  61. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/data/openapi_full.json +0 -0
  62. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/data/type_discovery_corrections.json +0 -0
  63. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/docs/Makefile +0 -0
  64. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/docs/_static/.gitignore +0 -0
  65. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/docs/architecture.rst +0 -0
  66. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/docs/authors.rst +0 -0
  67. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/docs/changelog.rst +0 -0
  68. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/docs/conf.py +0 -0
  69. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/docs/contributing.rst +0 -0
  70. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/docs/examples.rst +0 -0
  71. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/docs/index.rst +0 -0
  72. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/docs/license.rst +0 -0
  73. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/docs/migration.rst +0 -0
  74. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/docs/readme.rst +0 -0
  75. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/docs/requirements.txt +0 -0
  76. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/docs/test_strategy.md +0 -0
  77. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/docs/testing_conventions.md +0 -0
  78. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/examples/README.md +0 -0
  79. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/examples/complete_usage_example.py +0 -0
  80. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/examples/quick_start.py +0 -0
  81. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/examples/team_ranking_analysis.py +0 -0
  82. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/graphify-cross-repo.json +0 -0
  83. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/pyproject.toml +0 -0
  84. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/pytest.ini +0 -0
  85. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/run-ci-locally.sh +0 -0
  86. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/scripts/benchmark_concurrent_pagination.py +0 -0
  87. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/scripts/benchmark_search_organisme.py +0 -0
  88. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/scripts/discover_types.py +0 -0
  89. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/setup.cfg +0 -0
  90. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/setup.py +0 -0
  91. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/__init__.py +0 -0
  92. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/clients/__init__.py +0 -0
  93. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/clients/_helpers.py +0 -0
  94. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/clients/_mixins/__init__.py +0 -0
  95. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/clients/_mixins/competition.py +0 -0
  96. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/clients/_mixins/external.py +0 -0
  97. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/clients/_mixins/getters.py +0 -0
  98. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/clients/_mixins/list_methods.py +0 -0
  99. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/clients/_mixins/organisme.py +0 -0
  100. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/clients/_rest_facade.py +0 -0
  101. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/clients/_search_facade.py +0 -0
  102. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/clients/ffbb_data_client.py +0 -0
  103. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/clients/meilisearch_ffbb_client.py +0 -0
  104. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/config.py +0 -0
  105. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/data/__init__.py +0 -0
  106. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/data/collections.json +0 -0
  107. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/data/endpoint_discovery.json +0 -0
  108. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/data/indexes.json +0 -0
  109. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/data/openapi.json +0 -0
  110. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/helpers/__init__.py +0 -0
  111. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/helpers/http_requests_helper.py +0 -0
  112. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/helpers/http_requests_utils.py +0 -0
  113. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/helpers/meilisearch_client_extension.py +0 -0
  114. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/helpers/multi_search_query_helper.py +0 -0
  115. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/__init__.py +0 -0
  116. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/affiche.py +0 -0
  117. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/cartographie.py +0 -0
  118. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/categorie.py +0 -0
  119. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/categorie_type.py +0 -0
  120. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/clock.py +0 -0
  121. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/club_contacts.py +0 -0
  122. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/code.py +0 -0
  123. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/commune.py +0 -0
  124. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/competition_fields.py +0 -0
  125. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/competition_id.py +0 -0
  126. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/competition_id_categorie.py +0 -0
  127. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/competition_id_sexe.py +0 -0
  128. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/competition_id_type_competition.py +0 -0
  129. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/competition_id_type_competition_generique.py +0 -0
  130. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/competition_origine.py +0 -0
  131. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/competition_origine_categorie.py +0 -0
  132. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/competition_origine_type_competition.py +0 -0
  133. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/competition_origine_type_competition_generique.py +0 -0
  134. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/competition_type.py +0 -0
  135. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/competitions_facet_distribution.py +0 -0
  136. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/competitions_facet_stats.py +0 -0
  137. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/competitions_hit.py +0 -0
  138. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/competitions_multi_search_query.py +0 -0
  139. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/competitions_query.py +0 -0
  140. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/configuration_models.py +0 -0
  141. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/contact_info.py +0 -0
  142. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/content_multi_search_query.py +0 -0
  143. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/coordonnees.py +0 -0
  144. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/coordonnees_type.py +0 -0
  145. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/document_flyer.py +0 -0
  146. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/document_flyer_type.py +0 -0
  147. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/engagement_contacts.py +0 -0
  148. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/engagements_facet_distribution.py +0 -0
  149. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/engagements_facet_stats.py +0 -0
  150. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/engagements_hit.py +0 -0
  151. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/engagements_multi_search_query.py +0 -0
  152. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/etat.py +0 -0
  153. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/external_competition_id.py +0 -0
  154. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/external_id.py +0 -0
  155. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/facet_distribution.py +0 -0
  156. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/facet_stats.py +0 -0
  157. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/field_set.py +0 -0
  158. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/folder.py +0 -0
  159. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/formation_session.py +0 -0
  160. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/formations_facet_distribution.py +0 -0
  161. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/formations_facet_stats.py +0 -0
  162. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/formations_hit.py +0 -0
  163. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/formations_multi_search_query.py +0 -0
  164. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/game_stats_model.py +0 -0
  165. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/game_stats_models.py +0 -0
  166. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/generic_search.py +0 -0
  167. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/geo.py +0 -0
  168. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/geo_sort_order.py +0 -0
  169. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/get_commune_response.py +0 -0
  170. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/get_competition_response.py +0 -0
  171. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/get_configuration_response.py +0 -0
  172. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/get_engagement_response.py +0 -0
  173. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/get_entraineur_response.py +0 -0
  174. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/get_formation_response.py +0 -0
  175. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/get_officiel_response.py +0 -0
  176. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/get_organisme_response.py +0 -0
  177. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/get_poule_response.py +0 -0
  178. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/get_pratique_response.py +0 -0
  179. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/get_rencontre_response.py +0 -0
  180. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/get_saisons_response.py +0 -0
  181. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/get_salle_response.py +0 -0
  182. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/get_terrain_response.py +0 -0
  183. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/get_tournoi_response.py +0 -0
  184. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/gradient_color.py +0 -0
  185. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/hit.py +0 -0
  186. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/id_engagement_equipe.py +0 -0
  187. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/id_organisme_equipe.py +0 -0
  188. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/id_organisme_equipe1_logo.py +0 -0
  189. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/id_poule.py +0 -0
  190. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/jour.py +0 -0
  191. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/label.py +0 -0
  192. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/labellisation.py +0 -0
  193. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/live.py +0 -0
  194. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/lives.py +0 -0
  195. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/logo.py +0 -0
  196. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/multi_search_queries.py +0 -0
  197. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/multi_search_query.py +0 -0
  198. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/multi_search_result_competitions.py +0 -0
  199. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/multi_search_result_engagements.py +0 -0
  200. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/multi_search_result_formations.py +0 -0
  201. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/multi_search_result_organismes.py +0 -0
  202. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/multi_search_result_pratiques.py +0 -0
  203. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/multi_search_result_rencontres.py +0 -0
  204. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/multi_search_result_salles.py +0 -0
  205. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/multi_search_result_terrains.py +0 -0
  206. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/multi_search_result_tournois.py +0 -0
  207. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/multi_search_results.py +0 -0
  208. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/multi_search_results_class.py +0 -0
  209. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/nature_sol.py +0 -0
  210. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/niveau.py +0 -0
  211. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/niveau_class.py +0 -0
  212. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/niveau_extractor.py +0 -0
  213. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/niveau_info.py +0 -0
  214. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/niveau_models.py +0 -0
  215. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/niveau_type.py +0 -0
  216. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/objectif.py +0 -0
  217. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/organisateur.py +0 -0
  218. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/organisateur_type.py +0 -0
  219. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/organisme_fields.py +0 -0
  220. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/organisme_id_pere.py +0 -0
  221. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/organismes_facet_distribution.py +0 -0
  222. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/organismes_facet_stats.py +0 -0
  223. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/organismes_hit.py +0 -0
  224. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/organismes_multi_search_query.py +0 -0
  225. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/organismes_query.py +0 -0
  226. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/phase_code.py +0 -0
  227. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/poule.py +0 -0
  228. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/poule_fields.py +0 -0
  229. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/poule_rencontre_item_model.py +0 -0
  230. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/poules_models.py +0 -0
  231. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/poules_query.py +0 -0
  232. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/pratique.py +0 -0
  233. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/pratiques_facet_distribution.py +0 -0
  234. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/pratiques_facet_stats.py +0 -0
  235. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/pratiques_hit.py +0 -0
  236. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/pratiques_hit_type.py +0 -0
  237. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/pratiques_multi_search_query.py +0 -0
  238. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/pratiques_type_class.py +0 -0
  239. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/publication_internet.py +0 -0
  240. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/purple_logo.py +0 -0
  241. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/query_fields_manager.py +0 -0
  242. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/ranking_engagement.py +0 -0
  243. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/rankings_models.py +0 -0
  244. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/rencontres_engagement.py +0 -0
  245. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/rencontres_facet_distribution.py +0 -0
  246. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/rencontres_facet_stats.py +0 -0
  247. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/rencontres_hit.py +0 -0
  248. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/rencontres_multi_search_query.py +0 -0
  249. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/saison.py +0 -0
  250. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/saisons_models.py +0 -0
  251. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/saisons_query.py +0 -0
  252. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/salle.py +0 -0
  253. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/salles_facet_distribution.py +0 -0
  254. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/salles_facet_stats.py +0 -0
  255. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/salles_hit.py +0 -0
  256. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/salles_multi_search_query.py +0 -0
  257. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/sexe.py +0 -0
  258. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/sexe_class.py +0 -0
  259. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/source.py +0 -0
  260. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/status.py +0 -0
  261. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/team_engagement.py +0 -0
  262. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/team_ranking.py +0 -0
  263. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/terrains_categorie_championnat_3x3_libelle.py +0 -0
  264. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/terrains_facet_distribution.py +0 -0
  265. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/terrains_facet_stats.py +0 -0
  266. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/terrains_hit.py +0 -0
  267. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/terrains_multi_search_query.py +0 -0
  268. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/terrains_name.py +0 -0
  269. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/terrains_sexe_enum.py +0 -0
  270. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/terrains_storage.py +0 -0
  271. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/tournoi_type_class.py +0 -0
  272. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/tournoi_type_enum.py +0 -0
  273. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/tournoi_types_3x3.py +0 -0
  274. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/tournoi_types_3x3_libelle.py +0 -0
  275. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/tournoi_types_3x3_libelle_enum.py +0 -0
  276. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/tournois_facet_distribution.py +0 -0
  277. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/tournois_facet_stats.py +0 -0
  278. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/tournois_hit.py +0 -0
  279. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/tournois_hit_type.py +0 -0
  280. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/tournois_libelle.py +0 -0
  281. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/tournois_multi_search_query.py +0 -0
  282. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/type_association.py +0 -0
  283. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/type_association_libelle.py +0 -0
  284. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/type_class.py +0 -0
  285. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/type_competition.py +0 -0
  286. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/type_competition_generique.py +0 -0
  287. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/type_enum.py +0 -0
  288. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/models/type_league.py +0 -0
  289. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/py.typed +0 -0
  290. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/utils/__init__.py +0 -0
  291. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/utils/cache_manager.py +0 -0
  292. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/utils/concurrency_utils.py +0 -0
  293. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/utils/converter_utils.py +0 -0
  294. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/utils/input_validation.py +0 -0
  295. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/utils/retry_utils.py +0 -0
  296. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client/utils/token_manager.py +0 -0
  297. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client.egg-info/dependency_links.txt +0 -0
  298. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client.egg-info/not-zip-safe +0 -0
  299. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client.egg-info/requires.txt +0 -0
  300. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/src/ffbb_data_client.egg-info/top_level.txt +0 -0
  301. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/tests/conftest.py +0 -0
  302. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/tests/e2e/__init__.py +0 -0
  303. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/tests/e2e/conftest.py +0 -0
  304. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/tests/integration/__init__.py +0 -0
  305. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/tests/integration/conftest.py +0 -0
  306. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/tests/integration/test_500_user_journey.py +0 -0
  307. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/tests/integration/test_501_user_journey_v3.py +0 -0
  308. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/tests/integration/test_502_enhanced_integration.py +0 -0
  309. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/tests/integration/test_504_input_validation.py +0 -0
  310. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/tests/integration/test_505_retry_timeout.py +0 -0
  311. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/tests/integration/test_506_raw_json_model_conversion.py +0 -0
  312. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/tests/unit/__init__.py +0 -0
  313. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/tests/unit/clients/__init__.py +0 -0
  314. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/tests/unit/clients/test_200_api_ffbb_app_client.py +0 -0
  315. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/tests/unit/clients/test_202_meilisearch_client.py +0 -0
  316. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/tests/unit/clients/test_203_meilisearch_client_extension.py +0 -0
  317. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/tests/unit/clients/test_204_ffbb_data_client.py +0 -0
  318. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/tests/unit/clients/test_205_meilisearch_ffbb_client.py +0 -0
  319. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/tests/unit/clients/test_206_coverage_gaps_clients.py +0 -0
  320. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/tests/unit/clients/test_207_coverage_clients_extended.py +0 -0
  321. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/tests/unit/clients/test_208_new_methods_coverage.py +0 -0
  322. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/tests/unit/clients/test_209_automatic_token_resolution.py +0 -0
  323. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/tests/unit/clients/test_210_targeted_clients_helpers_coverage.py +0 -0
  324. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/tests/unit/clients/test_async_methods.py +0 -0
  325. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/tests/unit/clients/test_meilisearch_async.py +0 -0
  326. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/tests/unit/clients/test_search_many.py +0 -0
  327. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/tests/unit/clients/test_v2_backport_search.py +0 -0
  328. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/tests/unit/clients/test_v3_new_features.py +0 -0
  329. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/tests/unit/clients/test_warm_cache.py +0 -0
  330. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/tests/unit/conftest.py +0 -0
  331. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/tests/unit/helpers/__init__.py +0 -0
  332. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/tests/unit/helpers/test_400_http_helpers.py +0 -0
  333. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/tests/unit/helpers/test_meilisearch_client_extension_recursive_pagination.py +0 -0
  334. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/tests/unit/helpers/test_meilisearch_pagination_concurrent.py +0 -0
  335. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/tests/unit/models/__init__.py +0 -0
  336. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/tests/unit/models/test_100_competition_id_categorie.py +0 -0
  337. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/tests/unit/models/test_101_competition_id_sexe.py +0 -0
  338. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/tests/unit/models/test_102_competition_id_type_competition.py +0 -0
  339. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/tests/unit/models/test_103_competition_id_type_competition_generique.py +0 -0
  340. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/tests/unit/models/test_104_competition_origine_categorie.py +0 -0
  341. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/tests/unit/models/test_105_competition_origine_type_competition_generique.py +0 -0
  342. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/tests/unit/models/test_106_competition_origine.py +0 -0
  343. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/tests/unit/models/test_107_id_engagement_equipe.py +0 -0
  344. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/tests/unit/models/test_108_id_organisme_equipe.py +0 -0
  345. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/tests/unit/models/test_109_id_organisme_equipe1_logo.py +0 -0
  346. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/tests/unit/models/test_110_labellisation.py +0 -0
  347. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/tests/unit/models/test_111_niveau_class.py +0 -0
  348. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/tests/unit/models/test_112_purple_logo.py +0 -0
  349. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/tests/unit/models/test_113_salle.py +0 -0
  350. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/tests/unit/models/test_114_tournoi_type_class.py +0 -0
  351. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/tests/unit/models/test_115_type_association_libelle.py +0 -0
  352. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/tests/unit/models/test_116_type_competition_generique.py +0 -0
  353. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/tests/unit/models/test_117_organisateur.py +0 -0
  354. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/tests/unit/models/test_118_competition_id.py +0 -0
  355. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/tests/unit/models/test_119_terrains_inner_models.py +0 -0
  356. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/tests/unit/models/test_120_pratiques_inner_models.py +0 -0
  357. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/tests/unit/models/test_121_to_dict_round_trip.py +0 -0
  358. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/tests/unit/models/test_122_coverage_gaps.py +0 -0
  359. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/tests/unit/models/test_123_missing_coverage.py +0 -0
  360. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/tests/unit/models/test_123_v2_backport.py +0 -0
  361. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/tests/unit/models/test_124_targeted_coverage_gains.py +0 -0
  362. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/tests/unit/models/test_dx_aliases.py +0 -0
  363. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/tests/unit/test_310_discover_endpoints.py +0 -0
  364. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/tests/unit/utils/__init__.py +0 -0
  365. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/tests/unit/utils/test_301_input_validation.py +0 -0
  366. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/tests/unit/utils/test_302_retry_utils.py +0 -0
  367. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/tests/unit/utils/test_303_cache_manager.py +0 -0
  368. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/tests/unit/utils/test_304_config.py +0 -0
  369. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/tests/unit/utils/test_305_token_manager.py +0 -0
  370. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/tests/unit/utils/test_306_converter_utils.py +0 -0
  371. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/tests/unit/utils/test_307_coverage_gaps_utils.py +0 -0
  372. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/tests/unit/utils/test_308_converter_utils_extended.py +0 -0
  373. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/tests/unit/utils/test_309_concurrency_utils.py +0 -0
  374. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/tools/add_cross_repo_edges.py +0 -0
  375. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/tools/graphify-cross-repo.sh +0 -0
  376. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/tools/graphify_cross_repo.py +0 -0
  377. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/tools/update_agents_md.py +0 -0
  378. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/tox.ini +0 -0
  379. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/website/assets/logo.webp +0 -0
  380. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/website/robots.txt +0 -0
  381. {ffbb_data_client-2.3.3 → ffbb_data_client-2.3.4}/website/sitemap.xml +0 -0
@@ -20,14 +20,14 @@ jobs:
20
20
  env:
21
21
  GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
22
22
  run: |
23
- last_ts=$(gh api repos/${{ github.repository }}/actions/workflows/update-ffbb-api-discovery.yml/runs \
24
- --jq -r '.workflow_runs[0].created_at' 2>/dev/null || echo "1970-01-01T00:00:00Z")
23
+ last_ts=$(gh api repos/${{ github.repository }}/actions/workflows/268964669/runs \
24
+ --jq '.workflow_runs[0].created_at' | tr -d '"' || echo "1970-01-01T00:00:00Z")
25
25
  echo "last_run=$last_ts"
26
26
  cutoff=$(date -u -d '-22 hours' +%Y-%m-%dT%H:%M:%SZ)
27
27
  echo "cutoff=$cutoff"
28
28
  if [[ "$last_ts" < "$cutoff" ]]; then
29
29
  echo "STALE: last run $last_ts is older than 22h, triggering discovery now"
30
- gh workflow run update-ffbb-api-discovery.yml
30
+ gh workflow run 268964669 --repo ${{ github.repository }} --ref master
31
31
  echo "triggered=true" >> "$GITHUB_OUTPUT"
32
32
  else
33
33
  echo "OK: discovery ran at $last_ts, no action needed"
@@ -4,6 +4,7 @@ on:
4
4
  push:
5
5
  tags:
6
6
  - 'v*'
7
+ workflow_dispatch:
7
8
 
8
9
  permissions:
9
10
  contents: read
@@ -9,6 +9,7 @@ on:
9
9
  permissions:
10
10
  contents: write
11
11
  pull-requests: read
12
+ actions: write
12
13
 
13
14
  concurrency:
14
15
  group: release-after-discovery-${{ github.event.workflow_run.head_sha }}
@@ -89,3 +90,10 @@ jobs:
89
90
  git config user.email "41898282+github-actions[bot]@users.noreply.github.com"
90
91
  git tag -a "$NEXT_TAG" -m "Release $NEXT_TAG after FFBB API discovery PR #$PR_NUMBER"
91
92
  git push origin "$NEXT_TAG"
93
+
94
+ - name: Dispatch publish workflow
95
+ if: steps.pr.outputs.release == 'true'
96
+ env:
97
+ NEXT_TAG: ${{ steps.version.outputs.tag }}
98
+ GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
99
+ run: gh workflow run publish.yml --ref "$NEXT_TAG"
@@ -81,3 +81,4 @@ jobs:
81
81
  src/ffbb_data_client/data/endpoint_discovery.json
82
82
  src/ffbb_data_client/data/indexes.json
83
83
  src/ffbb_data_client/data/openapi.json
84
+ README.md
@@ -7,8 +7,23 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
+ ## [2.3.4] - 2026-08-19
11
+
12
+ ### Fixed
13
+ - **Security**: Masquage complet des tokens d'authentification dans les messages et arguments de formatage de logs (`CWE-532` / alertes CodeQL).
14
+ - **Directus 403**: Retrait du champ `nom` obsolète dans `SaisonFields` pour prévenir les erreurs de permissions sur l'endpoint des saisons.
15
+
16
+ ### Added & Changed
17
+ - **Website & Documentation**: Refonte de la landing page avec design spatial et support mobile 100% responsive (tiroir de navigation hamburger, protection contre le CSS grid blowout, typographie fluide).
18
+ - **PyPI & Docs**: Correction des liens relatifs dans le README pour un affichage propre sur PyPI.
19
+
20
+
21
+ ## [2.3.3] - 2026-08-10
22
+
10
23
  ### Added
11
- - **Recherche parallèle** : `search_many` / `search_many_async` exécutent plusieurs recherches Meilisearch indépendantes concurrentement (`asyncio.gather`) et renvoient les résultats dans l'ordre. Chaque `SearchSpec` est dispatché vers la méthode `search_multiple_<resource>_async` correspondante.
24
+ - **Recherche parallèle**: `search_many` / `search_many_async` exécutent plusieurs recherches Meilisearch indépendantes concurrentement (`asyncio.gather`) et renvoient les résultats dans l'ordre. Chaque `SearchSpec` est dispatché vers la méthode `search_multiple_<resource>_async` correspondante.
25
+ - **Keepalive CI**: nouveau workflow `keep-ffbb-api-discovery-alive` garantissant une exécution quotidienne de la discovery automatique des artefacts API (relance si aucun run depuis 22 h).
26
+ - **Unit tests** pour le script de discovery FFBB API (`scripts/discover_endpoints.py`).
12
27
 
13
28
  ### Changed
14
29
  - **Performance**: `recursive_smart_multi_search` / `recursive_smart_multi_search_async`
@@ -17,6 +32,35 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
17
32
  allers-retours réseau un par un — divisant la latence de pagination par le nombre de pages.
18
33
  - Les requêtes de pagination sont désormais **clonées** (`dataclasses.replace`) au lieu de
19
34
  muter les objets `MultiSearchQuery` du caller, supprimant une fuite d'état entre appels.
35
+ - **Refactor**: `api_ffbb_app_client.py` découpé en mixins (2408 → 113 lignes).
36
+ - **Performance**: réutilisation des connexions HTTP, wheel allégée et déduplication des recherches Meilisearch.
37
+ - **CI**: migration du AI PR reviewer (`.js` → `.cjs`), pagination et retry; simplification de la résolution de conflits de PR.
38
+
39
+ ### Fixed
40
+ - Incohérences de la codebase : collision `HitType`, imports `_models` dépréciés remplacés par les sous-modules directs.
41
+ - CI : exécution uniquement de l'environnement tox correspondant à la matrice dans le job de test.
42
+ - Alertes CodeQL (imports) et ordre d'imports isort dans `http_requests_utils`.
43
+
44
+ ## [2.3.2] - 2026-06-13
45
+
46
+ ### Fixed
47
+ - Résolution du cycle d'imports du token manager et alignement des fichiers d'outillage (`fix: resolve token manager import cycle and sync tooling files`).
48
+ - Alertes CodeQL (imports et `empty-except`).
49
+ - Corrections pre-commit appliquées pour passer la CI.
50
+
51
+ ## [2.3.1] - 2026-06-13
52
+
53
+ ### Added
54
+ - **AI Pull Request Reviewer**: workflow d'analyse automatique des PR (analyse statique, commentaires automatiques, résolution de conflits `bolt.md`).
55
+
56
+ ### Changed
57
+ - **Performance**: suppression de `TypeAdapter` de Pydantic au profit des parseurs natifs; optimisation de la réutilisation des connexions HTTP et du cache warming parallèle.
58
+ - **CI**: cache pip et tox dans la pipeline GitHub Actions; opt-in Node.js 24 pour toutes les actions JavaScript; upgrade `actions/checkout` (4→6), `actions/setup-node` (4→6), `upload-artifact`/`download-artifact` (v7/v8), `github/codeql-action` (4.35.5→4.36.x); permission `workflows: write` ajoutée puis revertée sur `release-after-discovery-merge`.
59
+
60
+ ### Fixed
61
+ - Alertes de code scanning (`md5`, variables globales inutilisées, faux positifs Ruff S105).
62
+ - Cycle d'imports entre `token_manager` et `http_requests_utils`.
63
+ - Ordre d'imports (isort) et corrections flake8 pour le pre-commit de mise à jour des artefacts.
20
64
 
21
65
  ## [2.3.0] - 2026-05-24
22
66
 
@@ -291,3 +335,10 @@ organisme = client.get_organisme(999999)
291
335
  if organisme is None:
292
336
  print("Organization not found or error occurred")
293
337
  ```
338
+
339
+ [Unreleased]: https://github.com/nickdesi/ffbb-data-client/compare/v2.3.3...master
340
+ [2.3.3]: https://github.com/nickdesi/ffbb-data-client/compare/v2.3.2...v2.3.3
341
+ [2.3.2]: https://github.com/nickdesi/ffbb-data-client/compare/v2.3.1...v2.3.2
342
+ [2.3.1]: https://github.com/nickdesi/ffbb-data-client/compare/v2.3.0...v2.3.1
343
+ [2.3.0]: https://github.com/nickdesi/ffbb-data-client/compare/v2.2.0...v2.3.0
344
+ [2.2.0]: https://github.com/nickdesi/ffbb-data-client/compare/v2.1.0...v2.2.0
@@ -0,0 +1,171 @@
1
+ ---
2
+ version: "alpha"
3
+ name: "FFBB Data Client Design System"
4
+ description: "Google Labs DESIGN.md specification for ffbb-data-client web presence and documentation UI"
5
+ colors:
6
+ primary: "#090A0F"
7
+ on-primary: "#FFFFFF"
8
+ surface: "#121520"
9
+ on-surface: "#F1F5F9"
10
+ surface-variant: "#1A1F2E"
11
+ surface-elevated: "#22293D"
12
+ accent-orange: "#C03E08"
13
+ accent-amber: "#F59E0B"
14
+ accent-mint: "#34D399"
15
+ accent-cyan: "#06B6D4"
16
+ accent-indigo: "#818CF8"
17
+ text-secondary: "#94A3B8"
18
+ text-muted: "#64748B"
19
+ border-glass: "#22293D"
20
+ border-active: "#C03E08"
21
+ typography:
22
+ display-hero:
23
+ fontFamily: "Outfit, Space Grotesk, sans-serif"
24
+ fontSize: "4.5rem"
25
+ fontWeight: "800"
26
+ lineHeight: "1.08"
27
+ letterSpacing: "-0.035em"
28
+ h1:
29
+ fontFamily: "Space Grotesk, sans-serif"
30
+ fontSize: "3.25rem"
31
+ fontWeight: "800"
32
+ lineHeight: "1.15"
33
+ letterSpacing: "-0.025em"
34
+ h2:
35
+ fontFamily: "Space Grotesk, sans-serif"
36
+ fontSize: "2.25rem"
37
+ fontWeight: "700"
38
+ lineHeight: "1.2"
39
+ h3:
40
+ fontFamily: "Outfit, Space Grotesk, sans-serif"
41
+ fontSize: "1.4rem"
42
+ fontWeight: "700"
43
+ body-lg:
44
+ fontFamily: "Inter, sans-serif"
45
+ fontSize: "1.25rem"
46
+ lineHeight: "1.7"
47
+ body-md:
48
+ fontFamily: "Inter, sans-serif"
49
+ fontSize: "1rem"
50
+ lineHeight: "1.65"
51
+ code:
52
+ fontFamily: "JetBrains Mono, monospace"
53
+ fontSize: "0.94rem"
54
+ lineHeight: "1.7"
55
+ label-caps:
56
+ fontFamily: "Inter, sans-serif"
57
+ fontSize: "0.85rem"
58
+ fontWeight: "600"
59
+ letterSpacing: "0.06em"
60
+ rounded:
61
+ sm: "12px"
62
+ md: "16px"
63
+ card: "24px"
64
+ hero: "32px"
65
+ chip: "9999px"
66
+ spacing:
67
+ xs: "4px"
68
+ sm: "8px"
69
+ md: "16px"
70
+ lg: "24px"
71
+ xl: "32px"
72
+ xxl: "64px"
73
+ components:
74
+ button-primary:
75
+ backgroundColor: "{colors.accent-orange}"
76
+ textColor: "{colors.on-primary}"
77
+ rounded: "{rounded.chip}"
78
+ padding: "16px 36px"
79
+ button-surface:
80
+ backgroundColor: "{colors.surface-variant}"
81
+ textColor: "{colors.on-surface}"
82
+ rounded: "{rounded.chip}"
83
+ padding: "16px 36px"
84
+ chip-category:
85
+ backgroundColor: "{colors.surface-elevated}"
86
+ textColor: "{colors.text-secondary}"
87
+ rounded: "{rounded.chip}"
88
+ padding: "6px 16px"
89
+ chip-mint:
90
+ backgroundColor: "{colors.surface-variant}"
91
+ textColor: "{colors.accent-mint}"
92
+ rounded: "{rounded.chip}"
93
+ chip-cyan:
94
+ backgroundColor: "{colors.surface-variant}"
95
+ textColor: "{colors.accent-cyan}"
96
+ rounded: "{rounded.chip}"
97
+ chip-indigo:
98
+ backgroundColor: "{colors.surface-variant}"
99
+ textColor: "{colors.accent-indigo}"
100
+ rounded: "{rounded.chip}"
101
+ chip-amber:
102
+ backgroundColor: "{colors.surface-variant}"
103
+ textColor: "{colors.accent-amber}"
104
+ rounded: "{rounded.chip}"
105
+ feature-card:
106
+ backgroundColor: "{colors.surface}"
107
+ textColor: "{colors.on-surface}"
108
+ rounded: "{rounded.card}"
109
+ padding: "36px"
110
+ text-caption:
111
+ textColor: "{colors.text-muted}"
112
+ container-border:
113
+ backgroundColor: "{colors.border-glass}"
114
+ container-active-border:
115
+ backgroundColor: "{colors.border-active}"
116
+ ---
117
+
118
+ ## Overview
119
+
120
+ Architectural Rigor meets Google Editorial Design. The visual identity of `ffbb-data-client` balances high-performance sports analytics with the refined typography and spatial clarity of Google Labs.
121
+
122
+ ## Colors
123
+
124
+ The color system is built on deep slate foundations punctuated by the energetic warmth of Basketball Orange and Material You accent tones.
125
+
126
+ - **Primary (#090A0F):** Deep midnight slate for full-bleed backgrounds and ambient mesh.
127
+ - **Surface (#121520):** Elevated dark slate for cards and code containers.
128
+ - **Accent Orange (#C03E08):** Vibrant French basketball orange — the primary interaction and brand signature.
129
+ - **Accent Mint (#34D399) & Cyan (#06B6D4):** High-clarity feedback indicators for live synchronization and speed.
130
+ - **Accent Indigo (#818CF8):** Editorial accent for architecture and developer tooling highlights.
131
+
132
+ ## Typography
133
+
134
+ Typography establishes an expressive editorial hierarchy inspired by *Google Design* and *Space Grotesk*.
135
+
136
+ - **Display & Headlines:** `Outfit` & `Space Grotesk` with tight tracking (`-0.035em`) for commanding editorial titles.
137
+ - **Body & Captions:** `Inter` for optimal legibility across desktop and mobile screens.
138
+ - **Code & Syntax:** `JetBrains Mono` for precise terminal snippets and typed Python examples.
139
+
140
+ ## Layout
141
+
142
+ - Fluid 12-column grid maxing out at `1260px` with generous vertical breathing room (`96px` section padding).
143
+ - Bento grid arrangements with asymmetric spotlight cards for lead architectural stories.
144
+
145
+ ## Elevation & Depth
146
+
147
+ - Layered spatial depth using CSS `backdrop-filter: blur(20px)` and soft diffused shadows (`0 25px 60px -15px rgba(0,0,0,0.7)`).
148
+ - Kinetic micro-elevations on hover with smooth spring easing curves (`cubic-bezier(0.16, 1, 0.3, 1)`).
149
+
150
+ ## Shapes
151
+
152
+ - Pill-shaped interactive chips (`border-radius: 9999px`) for tags, action buttons, and live status badges.
153
+ - Expressive rounded cards (`border-radius: 24px` to `32px`) echoing Material 3 geometric standards.
154
+
155
+ ## Components
156
+
157
+ - **Playground Card:** Glassmorphism code block with macOS-style control dots, language tabs, and copy feedback.
158
+ - **Spotlight Banner:** Lead story card combining continuous API discovery metrics with live JSON status.
159
+ - **Interactive Chips Bar:** Filterable pills enabling frictionless switching between Python code snippets.
160
+
161
+ ## Do's and Don'ts
162
+
163
+ ### Do
164
+ - Always use semantic color tokens for status badges (`accent-mint` for live sync, `accent-orange` for primary CTA).
165
+ - Maintain generous whitespace and high-contrast editorial hierarchy.
166
+ - Ensure all interactive cards have subtle hover states (`translateY(-4px)` with spring easing).
167
+
168
+ ### Don't
169
+ - Never use generic pure grey backgrounds (`#111111`); always use tinted slate (`#090A0F`).
170
+ - Avoid sharp corners (`0px` border radius) on interactive components.
171
+ - Do not overload cards with heavy borders; prefer translucent glass borders (`rgba(255, 255, 255, 0.08)`).
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: ffbb-data-client
3
- Version: 2.3.3
3
+ Version: 2.3.4
4
4
  Summary: FFBB Data Client — SDK Python asynchrone pour les Statistiques de Basket France. Type-safe Pydantic models, async/sync, Meilisearch.
5
5
  Home-page: https://github.com/nickdesi/ffbb-data-client
6
6
  Author: nickdesi
@@ -60,9 +60,9 @@ Dynamic: license-file
60
60
  [![Python](https://img.shields.io/pypi/pyversions/ffbb-data-client?logo=python&logoColor=white)](https://pypi.org/project/ffbb-data-client/)
61
61
  [![CI](https://github.com/nickdesi/ffbb-data-client/actions/workflows/ci.yml/badge.svg)](https://github.com/nickdesi/ffbb-data-client/actions/workflows/ci.yml)
62
62
  [![Coverage](https://coveralls.io/repos/github/nickdesi/ffbb-data-client/badge.svg?branch=master)](https://coveralls.io/github/nickdesi/ffbb-data-client?branch=master)
63
- [![License](https://img.shields.io/pypi/l/ffbb-data-client?color=green)](LICENSE.txt)
63
+ [![License](https://img.shields.io/pypi/l/ffbb-data-client?color=green)](https://github.com/nickdesi/ffbb-data-client/blob/master/LICENSE.txt)
64
64
  [![MCP-Ready](https://img.shields.io/badge/MCP-Ready-orange.svg?logo=modelcontextprotocol&logoColor=white)](https://github.com/nickdesi/FFBB-MCP-Server)
65
- [![Security Policy](https://img.shields.io/badge/Security-Policy-blue.svg)](SECURITY.md)
65
+ [![Security Policy](https://img.shields.io/badge/Security-Policy-blue.svg)](https://github.com/nickdesi/ffbb-data-client/blob/master/SECURITY.md)
66
66
  [![Stars](https://img.shields.io/github/stars/nickdesi/ffbb-data-client?style=social)](https://github.com/nickdesi/ffbb-data-client/stargazers)
67
67
  [![Last Commit](https://img.shields.io/github/last-commit/nickdesi/ffbb-data-client)](https://github.com/nickdesi/ffbb-data-client/commits/master)
68
68
  [![Issues](https://img.shields.io/github/issues/nickdesi/ffbb-data-client)](https://github.com/nickdesi/ffbb-data-client/issues)
@@ -92,17 +92,9 @@ Dynamic: license-file
92
92
 
93
93
  ---
94
94
 
95
- ## 🚀 Version v2.3.1 — Juin 2026
95
+ ## 🚀 Nouveautés
96
96
 
97
- Principales évolutions récentes :
98
-
99
- - **détection de drift API** : surveillance des changements de schéma Directus (propriétés/types/nullabilité) ;
100
- - **détection de drift Meilisearch** : agrégation robuste des attributs (`sampleKeys`) sur plusieurs hits ;
101
- - **automatisation CI/CD** : ouverture automatique de PR lorsqu'un drift est détecté ;
102
- - **fiabilité outillage** : alignement pyupgrade/isort/pre-commit pour des runs CI reproductibles ;
103
- - **qualité/sécurité** : corrections CodeQL et nettoyage des alertes d'analyse statique.
104
-
105
- Voir aussi : [CHANGELOG.md](https://github.com/nickdesi/ffbb-data-client/blob/master/CHANGELOG.md) et [RELEASE_NOTES.md](https://github.com/nickdesi/ffbb-data-client/blob/master/RELEASE_NOTES.md).
97
+ Les évolutions de chaque version sont documentées dans les [GitHub Releases](https://github.com/nickdesi/ffbb-data-client/releases), ainsi que dans [CHANGELOG.md](https://github.com/nickdesi/ffbb-data-client/blob/master/CHANGELOG.md) et [RELEASE_NOTES.md](https://github.com/nickdesi/ffbb-data-client/blob/master/RELEASE_NOTES.md).
106
98
 
107
99
  ---
108
100
 
@@ -362,19 +354,7 @@ Les contributions sont bienvenues :
362
354
 
363
355
  ## 📄 Licence
364
356
 
365
- Distribué sous licence Apache-2.0. Voir [`LICENSE.txt`](LICENSE.txt).
366
-
367
- ---
368
-
369
- ## 📌 Recommandations GitHub
370
-
371
- **Description suggérée :**
372
-
373
- > 🏀 Modern async & typed Python SDK for FFBB public data (clubs, competitions, standings, lives) and Meilisearch search — the data layer behind the FFBB MCP Server.
374
-
375
- **Topics suggérés (≤ 20) :**
376
-
377
- `python` · `api-client` · `ffbb` · `open-data` · `basketball` · `mcp` · `model-context-protocol` · `async` · `pydantic` · `meilisearch` · `sdk` · `ai` · `llm` · `sports` · `rest-api` · `httpx` · `france` · `data` · `cache` · `typed`
357
+ Distribué sous licence Apache-2.0. Voir [`LICENSE.txt`](https://github.com/nickdesi/ffbb-data-client/blob/master/LICENSE.txt).
378
358
 
379
359
  ---
380
360
 
@@ -8,9 +8,9 @@
8
8
  [![Python](https://img.shields.io/pypi/pyversions/ffbb-data-client?logo=python&logoColor=white)](https://pypi.org/project/ffbb-data-client/)
9
9
  [![CI](https://github.com/nickdesi/ffbb-data-client/actions/workflows/ci.yml/badge.svg)](https://github.com/nickdesi/ffbb-data-client/actions/workflows/ci.yml)
10
10
  [![Coverage](https://coveralls.io/repos/github/nickdesi/ffbb-data-client/badge.svg?branch=master)](https://coveralls.io/github/nickdesi/ffbb-data-client?branch=master)
11
- [![License](https://img.shields.io/pypi/l/ffbb-data-client?color=green)](LICENSE.txt)
11
+ [![License](https://img.shields.io/pypi/l/ffbb-data-client?color=green)](https://github.com/nickdesi/ffbb-data-client/blob/master/LICENSE.txt)
12
12
  [![MCP-Ready](https://img.shields.io/badge/MCP-Ready-orange.svg?logo=modelcontextprotocol&logoColor=white)](https://github.com/nickdesi/FFBB-MCP-Server)
13
- [![Security Policy](https://img.shields.io/badge/Security-Policy-blue.svg)](SECURITY.md)
13
+ [![Security Policy](https://img.shields.io/badge/Security-Policy-blue.svg)](https://github.com/nickdesi/ffbb-data-client/blob/master/SECURITY.md)
14
14
  [![Stars](https://img.shields.io/github/stars/nickdesi/ffbb-data-client?style=social)](https://github.com/nickdesi/ffbb-data-client/stargazers)
15
15
  [![Last Commit](https://img.shields.io/github/last-commit/nickdesi/ffbb-data-client)](https://github.com/nickdesi/ffbb-data-client/commits/master)
16
16
  [![Issues](https://img.shields.io/github/issues/nickdesi/ffbb-data-client)](https://github.com/nickdesi/ffbb-data-client/issues)
@@ -40,17 +40,9 @@
40
40
 
41
41
  ---
42
42
 
43
- ## 🚀 Version v2.3.1 — Juin 2026
43
+ ## 🚀 Nouveautés
44
44
 
45
- Principales évolutions récentes :
46
-
47
- - **détection de drift API** : surveillance des changements de schéma Directus (propriétés/types/nullabilité) ;
48
- - **détection de drift Meilisearch** : agrégation robuste des attributs (`sampleKeys`) sur plusieurs hits ;
49
- - **automatisation CI/CD** : ouverture automatique de PR lorsqu'un drift est détecté ;
50
- - **fiabilité outillage** : alignement pyupgrade/isort/pre-commit pour des runs CI reproductibles ;
51
- - **qualité/sécurité** : corrections CodeQL et nettoyage des alertes d'analyse statique.
52
-
53
- Voir aussi : [CHANGELOG.md](https://github.com/nickdesi/ffbb-data-client/blob/master/CHANGELOG.md) et [RELEASE_NOTES.md](https://github.com/nickdesi/ffbb-data-client/blob/master/RELEASE_NOTES.md).
45
+ Les évolutions de chaque version sont documentées dans les [GitHub Releases](https://github.com/nickdesi/ffbb-data-client/releases), ainsi que dans [CHANGELOG.md](https://github.com/nickdesi/ffbb-data-client/blob/master/CHANGELOG.md) et [RELEASE_NOTES.md](https://github.com/nickdesi/ffbb-data-client/blob/master/RELEASE_NOTES.md).
54
46
 
55
47
  ---
56
48
 
@@ -310,19 +302,7 @@ Les contributions sont bienvenues :
310
302
 
311
303
  ## 📄 Licence
312
304
 
313
- Distribué sous licence Apache-2.0. Voir [`LICENSE.txt`](LICENSE.txt).
314
-
315
- ---
316
-
317
- ## 📌 Recommandations GitHub
318
-
319
- **Description suggérée :**
320
-
321
- > 🏀 Modern async & typed Python SDK for FFBB public data (clubs, competitions, standings, lives) and Meilisearch search — the data layer behind the FFBB MCP Server.
322
-
323
- **Topics suggérés (≤ 20) :**
324
-
325
- `python` · `api-client` · `ffbb` · `open-data` · `basketball` · `mcp` · `model-context-protocol` · `async` · `pydantic` · `meilisearch` · `sdk` · `ai` · `llm` · `sports` · `rest-api` · `httpx` · `france` · `data` · `cache` · `typed`
305
+ Distribué sous licence Apache-2.0. Voir [`LICENSE.txt`](https://github.com/nickdesi/ffbb-data-client/blob/master/LICENSE.txt).
326
306
 
327
307
  ---
328
308
 
@@ -1,6 +1,78 @@
1
- # Release Notes - FFBB API Client V2
1
+ # Release Notes - FFBB Data Client
2
2
 
3
- ## Version 2.2.0 (Latest Release)
3
+ ## Version 2.3.4 (Latest Release)
4
+
5
+ ### 🔒 Security & Bug Fixes
6
+ - **Sensitive logging mitigation**: Masked authentication tokens in logging messages and format arguments (`CWE-532` / CodeQL compliance)
7
+ - **Directus compatibility**: Removed non-existent `nom` field from default `SaisonFields` to prevent Directus 403 errors
8
+
9
+ ### 📱 Responsive Website & Documentation
10
+ - **Mobile optimization**: Full smartphone responsiveness on landing page (mobile hamburger drawer, fluid font scaling, CSS grid blowout prevention)
11
+ - **PyPI documentation**: Standardized README badges and absolute GitHub URLs for flawless rendering on PyPI
12
+
13
+ ---
14
+
15
+ ## Version 2.3.3
16
+
17
+ ### 🚀 New Features
18
+ - **`search_many` / `search_many_async`**: run multiple independent Meilisearch searches concurrently (`asyncio.gather`) and return results in order — each `SearchSpec` is dispatched to the matching `search_multiple_<resource>_async` method
19
+ - **Keepalive workflow**: new `keep-ffbb-api-discovery-alive` workflow guarantees a daily FFBB API discovery run (auto-triggers when no run happened in the last 22 h)
20
+ - **Unit tests** for the FFBB API discovery script (`scripts/discover_endpoints.py`)
21
+
22
+ ### ⚡ Performance
23
+ - **Concurrent Meilisearch pagination**: `recursive_smart_multi_search` / `recursive_smart_multi_search_async` now fetch pages in parallel (batches of 10, `asyncio.gather` async / `ThreadPoolExecutor` sync) instead of sequential round-trips — dividing pagination latency by the number of pages
24
+ - **Non-mutating queries**: pagination requests are now cloned (`dataclasses.replace`) instead of mutating the caller's `MultiSearchQuery` objects, removing cross-call state leaks
25
+ - **Slimmer wheel + HTTP connection reuse** + Meilisearch query deduplication
26
+
27
+ ### 🏗 Refactor
28
+ - `api_ffbb_app_client.py` split into mixins (2408 → 113 lines)
29
+
30
+ ### 🐛 Bug Fixes
31
+ - Codebase inconsistencies: `HitType` collision, deprecated `_models` imports replaced with direct submodules
32
+ - isort formatting in `niveau_models.py`
33
+ - CI: only run the matrix-matching tox env in the test job
34
+ - CodeQL alerts (imports) and isort ordering in `http_requests_utils`
35
+
36
+ ### 📦 Misc
37
+ - Docs: improved README, rewrote SECURITY.md, added FUNDING.yml
38
+ - CI: AI PR reviewer migrated to `.cjs` (pagination + retry), simplified PR conflict resolution, refreshed FFBB API discovery artefacts (#57)
39
+ - Dependency bumps (checkout v7, CodeQL 4.37, setuptools ≥83, attest 4.1.1, cache v6, softprops/action-gh-release 3.0.1)
40
+
41
+ ---
42
+
43
+ ## Version 2.3.2
44
+
45
+ ### 🐛 Bug Fixes
46
+ - Resolved token manager import cycle and synced tooling files
47
+ - CodeQL import and empty-except alerts
48
+ - Pre-commit fixes applied to pass CI
49
+
50
+ ### 📦 Misc
51
+ - Updated PyPI README version block to 2.3.1
52
+ - Reverted invalid `workflows: write` permission on release-after-discovery-merge workflow
53
+
54
+ ---
55
+
56
+ ## Version 2.3.1
57
+
58
+ ### ⚡ Performance
59
+ - Replaced Pydantic `TypeAdapter` with native parsers for faster deserialization
60
+ - Optimized HTTP connection reuse and parallel cache warming
61
+
62
+ ### 🔒 Security & Quality
63
+ - Fixed code-scanning alerts (`md5` usage, unused global variables, Ruff S105 false positives)
64
+ - Resolved cyclic import between `token_manager` and `http_requests_utils`
65
+
66
+ ### 🚀 CI/CD
67
+ - **AI Pull Request Reviewer** workflow added (static analysis, automatic comments, `bolt.md` conflict auto-resolver)
68
+ - Node.js 24 opt-in for all JavaScript actions
69
+ - GitHub Actions pipeline optimized with pip cache and tox
70
+ - Action upgrades: `actions/checkout` 4→6, `actions/setup-node` 4→6, `upload-artifact` v7 / `download-artifact` v8, `github/codeql-action` 4.35.5→4.36.x
71
+ - `hishel` dependency bumped to ≥1.3.0
72
+
73
+ ---
74
+
75
+ ## Version 2.2.0 (Previous Release)
4
76
 
5
77
  ### 🏗 Architecture Refactor
6
78
 
@@ -17,6 +17,7 @@ from __future__ import annotations
17
17
 
18
18
  import hashlib
19
19
  import json
20
+ import re
20
21
  import sys
21
22
  from datetime import datetime, timezone
22
23
  from pathlib import Path
@@ -509,6 +510,41 @@ def _build_change_summary(
509
510
  return "\n".join(lines) + "\n"
510
511
 
511
512
 
513
+ def _update_readme_discovery_metrics(
514
+ collections_count: int, indexes_count: int
515
+ ) -> bool:
516
+ readme_path = PROJECT_ROOT / "README.md"
517
+ if not readme_path.exists():
518
+ return False
519
+ text = readme_path.read_text(encoding="utf-8")
520
+ block_start = "<!-- DISCOVERY_METRICS:START -->"
521
+ block_end = "<!-- DISCOVERY_METRICS:END -->"
522
+ nl = chr(10)
523
+ new_block = (
524
+ block_start
525
+ + nl
526
+ + f"> 🔄 **Cartographie API synchronisée** : `{collections_count}` collections Directus OpenAPI cartographiées, "
527
+ f"`{indexes_count}` index Meilisearch surveillés." + nl + block_end
528
+ )
529
+
530
+ if block_start in text and block_end in text:
531
+ pattern = re.compile(
532
+ rf"{re.escape(block_start)}.*?{re.escape(block_end)}", re.DOTALL
533
+ )
534
+ updated = pattern.sub(new_block, text)
535
+ else:
536
+ needle = "---" + nl + nl + "## 📌 À propos"
537
+ if needle in text:
538
+ updated = text.replace(needle, new_block + nl + nl + needle)
539
+ else:
540
+ updated = text + nl + nl + new_block + nl
541
+
542
+ if updated != text:
543
+ readme_path.write_text(updated, encoding="utf-8")
544
+ return True
545
+ return False
546
+
547
+
512
548
  def main() -> None:
513
549
  DATA_DIR.mkdir(parents=True, exist_ok=True)
514
550
 
@@ -610,6 +646,7 @@ def main() -> None:
610
646
 
611
647
  packaged_changed = _sync_packaged_artefacts(PACKAGED_ARTEFACT_PATHS)
612
648
 
649
+ _update_readme_discovery_metrics(len(collections), len(available_indexes))
613
650
  print(f"Directus collections: {len(collections)}")
614
651
  print(f"Directus item paths: {len(item_paths)}")
615
652
  print(f"Available Meilisearch indexes: {len(available_indexes)}")
@@ -11,7 +11,7 @@ from ..utils.retry_utils import (
11
11
  get_default_retry_config,
12
12
  get_default_timeout_config,
13
13
  )
14
- from ..utils.secure_logging import get_secure_logger, mask_token
14
+ from ..utils.secure_logging import get_secure_logger
15
15
  from ._mixins.competition import CompetitionMixin
16
16
  from ._mixins.external import ExternalMixin
17
17
  from ._mixins.getters import GettersMixin
@@ -89,9 +89,10 @@ class ApiFFBBAppClient(
89
89
 
90
90
  self.logger = get_secure_logger(f"{self.__class__.__name__}")
91
91
 
92
- masked_token = mask_token(self._bearer_token)
93
92
  if self.debug:
94
- self.logger.info(f"ApiFFBBAppClient initialized with token: {masked_token}")
93
+ self.logger.info(
94
+ "ApiFFBBAppClient initialized with authentication token configured"
95
+ )
95
96
  self.logger.info(
96
97
  f"Retry config: {self.retry_config.max_attempts} attempts, "
97
98
  f"timeout: {self.timeout_config.total_timeout}s"
@@ -30,7 +30,7 @@ from ..utils.retry_utils import (
30
30
  get_default_retry_config,
31
31
  get_default_timeout_config,
32
32
  )
33
- from ..utils.secure_logging import get_secure_logger, mask_token
33
+ from ..utils.secure_logging import get_secure_logger
34
34
 
35
35
  _APP_CACHE: dict[str, tuple[float, Any]] = {}
36
36
  _APP_CACHE_LOCK = threading.Lock()
@@ -134,11 +134,10 @@ class MeilisearchClient:
134
134
  # Initialize secure logger
135
135
  self.logger = get_secure_logger(f"{self.__class__.__name__}")
136
136
 
137
- # Log initialization with masked token
138
- masked_token = mask_token(self._bearer_token)
137
+ # Log initialization without leaking token
139
138
  if self.debug:
140
139
  self.logger.info(
141
- f"MeilisearchClient initialized with token: {masked_token}"
140
+ "MeilisearchClient initialized with authentication token configured"
142
141
  )
143
142
  self.logger.info(
144
143
  f"Retry config: {self.retry_config.max_attempts} attempts, "
@@ -18,7 +18,6 @@ class SaisonFields:
18
18
  """Get default fields for saison queries."""
19
19
  return [
20
20
  cls.ID,
21
- cls.NOM,
22
21
  cls.ACTIF,
23
22
  cls.DEBUT,
24
23
  cls.FIN,
@@ -83,35 +83,38 @@ class SecureLogger:
83
83
 
84
84
  return masked_message
85
85
 
86
+ def _log(self, level: int, message: str, *args, **kwargs):
87
+ """Log with sensitive data masked in the message and its format args."""
88
+ masked_message = self._mask_sensitive_data(message)
89
+ masked_args = tuple(
90
+ self._mask_sensitive_data(arg) if isinstance(arg, str) else arg
91
+ for arg in args
92
+ )
93
+ self.logger.log(level, masked_message, *masked_args, **kwargs)
94
+
86
95
  def debug(self, message: str, *args, **kwargs):
87
96
  """Log a debug message with sensitive data masked."""
88
- masked_message = self._mask_sensitive_data(message)
89
- self.logger.debug(masked_message, *args, **kwargs)
97
+ self._log(logging.DEBUG, message, *args, **kwargs)
90
98
 
91
99
  def info(self, message: str, *args, **kwargs):
92
100
  """Log an info message with sensitive data masked."""
93
- masked_message = self._mask_sensitive_data(message)
94
- self.logger.info(masked_message, *args, **kwargs)
101
+ self._log(logging.INFO, message, *args, **kwargs)
95
102
 
96
103
  def warning(self, message: str, *args, **kwargs):
97
104
  """Log a warning message with sensitive data masked."""
98
- masked_message = self._mask_sensitive_data(message)
99
- self.logger.warning(masked_message, *args, **kwargs)
105
+ self._log(logging.WARNING, message, *args, **kwargs)
100
106
 
101
107
  def error(self, message: str, *args, **kwargs):
102
108
  """Log an error message with sensitive data masked."""
103
- masked_message = self._mask_sensitive_data(message)
104
- self.logger.error(masked_message, *args, **kwargs)
109
+ self._log(logging.ERROR, message, *args, **kwargs)
105
110
 
106
111
  def critical(self, message: str, *args, **kwargs):
107
112
  """Log a critical message with sensitive data masked."""
108
- masked_message = self._mask_sensitive_data(message)
109
- self.logger.critical(masked_message, *args, **kwargs)
113
+ self._log(logging.CRITICAL, message, *args, **kwargs)
110
114
 
111
115
  def log(self, level: int, message: str, *args, **kwargs):
112
116
  """Log a message at the specified level with sensitive data masked."""
113
- masked_message = self._mask_sensitive_data(message)
114
- self.logger.log(level, masked_message, *args, **kwargs)
117
+ self._log(level, message, *args, **kwargs)
115
118
 
116
119
 
117
120
  # Global secure logger instance