ffbb-data-client 2.4.15__tar.gz → 2.4.16__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 (396) hide show
  1. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/.github/workflows/ci.yml +14 -1
  2. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/.github/workflows/publish.yml +37 -0
  3. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/AGENTS.md +9 -10
  4. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/PKG-INFO +5 -5
  5. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/README.md +4 -4
  6. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/docs/architecture.rst +2 -1
  7. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/docs/examples.rst +11 -24
  8. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/docs/migration.rst +3 -3
  9. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/docs/requirements.txt +0 -1
  10. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/src/ffbb_data_client/__init__.py +19 -0
  11. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/src/ffbb_data_client/api.py +11 -3
  12. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/src/ffbb_data_client/clients/_mixins/competition.py +7 -6
  13. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/src/ffbb_data_client/clients/_mixins/getters.py +31 -30
  14. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/src/ffbb_data_client/clients/_mixins/organisme.py +5 -4
  15. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/src/ffbb_data_client/clients/_search_facade.py +16 -3
  16. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/src/ffbb_data_client/clients/meilisearch_client.py +12 -19
  17. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/src/ffbb_data_client/config.py +7 -1
  18. ffbb_data_client-2.4.16/src/ffbb_data_client/exceptions.py +39 -0
  19. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/src/ffbb_data_client/helpers/http_requests_utils.py +91 -47
  20. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/src/ffbb_data_client/models/get_configuration_response.py +10 -17
  21. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/src/ffbb_data_client/utils/retry_utils.py +26 -14
  22. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/src/ffbb_data_client/utils/token_manager.py +12 -8
  23. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/src/ffbb_data_client.egg-info/PKG-INFO +5 -5
  24. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/src/ffbb_data_client.egg-info/SOURCES.txt +1 -0
  25. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/src/ffbb_data_client.egg-info/scm_file_list.json +1 -0
  26. ffbb_data_client-2.4.16/src/ffbb_data_client.egg-info/scm_version.json +8 -0
  27. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/tests/unit/clients/test_201_unit_tests_core.py +2 -1
  28. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/tests/unit/clients/test_207_coverage_clients_extended.py +18 -18
  29. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/tests/unit/clients/test_208_new_methods_coverage.py +2 -2
  30. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/tests/unit/clients/test_210_targeted_clients_helpers_coverage.py +21 -4
  31. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/tests/unit/clients/test_search_many.py +24 -21
  32. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/tests/unit/clients/test_v3_new_features.py +5 -5
  33. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/tests/unit/helpers/test_400_http_helpers.py +34 -1
  34. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/tests/unit/utils/test_302_retry_utils.py +8 -0
  35. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/tests/unit/utils/test_304_config.py +1 -1
  36. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/tests/unit/utils/test_305_token_manager.py +14 -1
  37. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/tests/unit/utils/test_307_coverage_gaps_utils.py +4 -4
  38. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/tools/update_agents_md.py +3 -3
  39. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/tox.ini +1 -1
  40. ffbb_data_client-2.4.15/src/ffbb_data_client.egg-info/scm_version.json +0 -8
  41. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/.agents/rules/antigravity-rtk-rules.md +0 -0
  42. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/.coveragerc +0 -0
  43. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/.gitattributes +0 -0
  44. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/.github/FUNDING.yml +0 -0
  45. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
  46. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
  47. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
  48. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/.github/dependabot.yml +0 -0
  49. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/.github/scripts/ai-pr-reviewer.cjs +0 -0
  50. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/.github/scripts/check_wrapper_parity.py +0 -0
  51. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/.github/workflows/ai-pr-reviewer.yml +0 -0
  52. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/.github/workflows/check_wrapper_parity.yml +0 -0
  53. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/.github/workflows/codeql.yml +0 -0
  54. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/.github/workflows/deploy-pages.yml +0 -0
  55. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/.github/workflows/keep-ffbb-api-discovery-alive.yml +0 -0
  56. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/.github/workflows/release-after-discovery-merge.yml +0 -0
  57. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/.github/workflows/update-ffbb-api-discovery.yml +0 -0
  58. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/.gitignore +0 -0
  59. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/.isort.cfg +0 -0
  60. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/.jules/bolt.md +0 -0
  61. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/.omc/skills/codeql-security-hardening-expertise.md +0 -0
  62. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/.omc/skills/pypi-immutable-release-workflow.md +0 -0
  63. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/.omc/skills/terminal-output-hygiene-expertise.md +0 -0
  64. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/.pre-commit-config.yaml +0 -0
  65. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/.readthedocs.yml +0 -0
  66. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/AUTHORS.rst +0 -0
  67. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/CHANGELOG.md +0 -0
  68. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/CODE_OF_CONDUCT.md +0 -0
  69. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/CONTRIBUTING.rst +0 -0
  70. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/DESIGN.md +0 -0
  71. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/Dockerfile +0 -0
  72. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/LICENSE.txt +0 -0
  73. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/LOCAL_CI_GUIDE.md +0 -0
  74. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/RELEASE_NOTES.md +0 -0
  75. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/SECURITY.md +0 -0
  76. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/data/api.ffbb.app.json +0 -0
  77. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/data/api_update_summary.md +0 -0
  78. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/data/collections.json +0 -0
  79. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/data/endpoint_discovery.json +0 -0
  80. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/data/field_dictionary.json +0 -0
  81. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/data/indexes.json +0 -0
  82. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/data/meilisearch-prod.ffbb.app.json +0 -0
  83. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/data/openapi.json +0 -0
  84. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/data/openapi_full.json +0 -0
  85. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/data/type_discovery_corrections.json +0 -0
  86. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/docs/Makefile +0 -0
  87. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/docs/_static/.gitignore +0 -0
  88. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/docs/authors.rst +0 -0
  89. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/docs/changelog.rst +0 -0
  90. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/docs/conf.py +0 -0
  91. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/docs/contributing.rst +0 -0
  92. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/docs/data_dictionary.rst +0 -0
  93. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/docs/index.rst +0 -0
  94. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/docs/license.rst +0 -0
  95. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/docs/readme.rst +0 -0
  96. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/docs/test_strategy.md +0 -0
  97. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/docs/testing_conventions.md +0 -0
  98. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/examples/README.md +0 -0
  99. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/examples/complete_usage_example.py +0 -0
  100. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/examples/quick_start.py +0 -0
  101. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/examples/team_ranking_analysis.py +0 -0
  102. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/pyproject.toml +0 -0
  103. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/pytest.ini +0 -0
  104. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/run-ci-locally.sh +0 -0
  105. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/scripts/benchmark_concurrent_pagination.py +0 -0
  106. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/scripts/benchmark_search_organisme.py +0 -0
  107. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/scripts/discover_endpoints.py +0 -0
  108. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/scripts/discover_types.py +0 -0
  109. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/setup.cfg +0 -0
  110. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/setup.py +0 -0
  111. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/src/ffbb_data_client/clients/__init__.py +0 -0
  112. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/src/ffbb_data_client/clients/_helpers.py +0 -0
  113. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/src/ffbb_data_client/clients/_mixins/__init__.py +0 -0
  114. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/src/ffbb_data_client/clients/_mixins/external.py +0 -0
  115. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/src/ffbb_data_client/clients/_mixins/list_methods.py +0 -0
  116. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/src/ffbb_data_client/clients/_rest_facade.py +0 -0
  117. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/src/ffbb_data_client/clients/api_ffbb_app_client.py +0 -0
  118. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/src/ffbb_data_client/clients/ffbb_data_client.py +0 -0
  119. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/src/ffbb_data_client/clients/meilisearch_ffbb_client.py +0 -0
  120. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/src/ffbb_data_client/data/__init__.py +0 -0
  121. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/src/ffbb_data_client/data/collections.json +0 -0
  122. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/src/ffbb_data_client/data/endpoint_discovery.json +0 -0
  123. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/src/ffbb_data_client/data/field_dictionary.json +0 -0
  124. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/src/ffbb_data_client/data/indexes.json +0 -0
  125. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/src/ffbb_data_client/data/openapi.json +0 -0
  126. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/src/ffbb_data_client/helpers/__init__.py +0 -0
  127. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/src/ffbb_data_client/helpers/http_requests_helper.py +0 -0
  128. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/src/ffbb_data_client/helpers/meilisearch_client_extension.py +0 -0
  129. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/src/ffbb_data_client/helpers/multi_search_query_helper.py +0 -0
  130. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/src/ffbb_data_client/helpers/normalization.py +0 -0
  131. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/src/ffbb_data_client/models/__init__.py +0 -0
  132. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/src/ffbb_data_client/models/affiche.py +0 -0
  133. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/src/ffbb_data_client/models/cartographie.py +0 -0
  134. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/src/ffbb_data_client/models/categorie.py +0 -0
  135. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/src/ffbb_data_client/models/categorie_type.py +0 -0
  136. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/src/ffbb_data_client/models/clock.py +0 -0
  137. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/src/ffbb_data_client/models/club_contacts.py +0 -0
  138. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/src/ffbb_data_client/models/code.py +0 -0
  139. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/src/ffbb_data_client/models/commune.py +0 -0
  140. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/src/ffbb_data_client/models/competition_fields.py +0 -0
  141. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/src/ffbb_data_client/models/competition_id.py +0 -0
  142. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/src/ffbb_data_client/models/competition_id_categorie.py +0 -0
  143. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/src/ffbb_data_client/models/competition_id_sexe.py +0 -0
  144. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/src/ffbb_data_client/models/competition_id_type_competition.py +0 -0
  145. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/src/ffbb_data_client/models/competition_id_type_competition_generique.py +0 -0
  146. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/src/ffbb_data_client/models/competition_origine.py +0 -0
  147. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/src/ffbb_data_client/models/competition_origine_categorie.py +0 -0
  148. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/src/ffbb_data_client/models/competition_origine_type_competition.py +0 -0
  149. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/src/ffbb_data_client/models/competition_origine_type_competition_generique.py +0 -0
  150. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/src/ffbb_data_client/models/competition_type.py +0 -0
  151. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/src/ffbb_data_client/models/competitions_facet_distribution.py +0 -0
  152. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/src/ffbb_data_client/models/competitions_facet_stats.py +0 -0
  153. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/src/ffbb_data_client/models/competitions_hit.py +0 -0
  154. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/src/ffbb_data_client/models/competitions_multi_search_query.py +0 -0
  155. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/src/ffbb_data_client/models/competitions_query.py +0 -0
  156. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/src/ffbb_data_client/models/configuration_models.py +0 -0
  157. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/src/ffbb_data_client/models/contact_info.py +0 -0
  158. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/src/ffbb_data_client/models/content_multi_search_query.py +0 -0
  159. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/src/ffbb_data_client/models/coordonnees.py +0 -0
  160. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/src/ffbb_data_client/models/coordonnees_type.py +0 -0
  161. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/src/ffbb_data_client/models/document_flyer.py +0 -0
  162. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/src/ffbb_data_client/models/document_flyer_type.py +0 -0
  163. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/src/ffbb_data_client/models/engagement_contacts.py +0 -0
  164. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/src/ffbb_data_client/models/engagements_facet_distribution.py +0 -0
  165. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/src/ffbb_data_client/models/engagements_facet_stats.py +0 -0
  166. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/src/ffbb_data_client/models/engagements_hit.py +0 -0
  167. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/src/ffbb_data_client/models/engagements_multi_search_query.py +0 -0
  168. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/src/ffbb_data_client/models/etat.py +0 -0
  169. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/src/ffbb_data_client/models/external_competition_id.py +0 -0
  170. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/src/ffbb_data_client/models/external_id.py +0 -0
  171. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/src/ffbb_data_client/models/facet_distribution.py +0 -0
  172. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/src/ffbb_data_client/models/facet_stats.py +0 -0
  173. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/src/ffbb_data_client/models/field_set.py +0 -0
  174. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/src/ffbb_data_client/models/folder.py +0 -0
  175. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/src/ffbb_data_client/models/formation_session.py +0 -0
  176. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/src/ffbb_data_client/models/formations_facet_distribution.py +0 -0
  177. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/src/ffbb_data_client/models/formations_facet_stats.py +0 -0
  178. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/src/ffbb_data_client/models/formations_hit.py +0 -0
  179. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/src/ffbb_data_client/models/formations_multi_search_query.py +0 -0
  180. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/src/ffbb_data_client/models/game_stats_model.py +0 -0
  181. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/src/ffbb_data_client/models/game_stats_models.py +0 -0
  182. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/src/ffbb_data_client/models/generic_search.py +0 -0
  183. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/src/ffbb_data_client/models/geo.py +0 -0
  184. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/src/ffbb_data_client/models/geo_sort_order.py +0 -0
  185. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/src/ffbb_data_client/models/get_commune_response.py +0 -0
  186. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/src/ffbb_data_client/models/get_competition_response.py +0 -0
  187. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/src/ffbb_data_client/models/get_engagement_response.py +0 -0
  188. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/src/ffbb_data_client/models/get_entraineur_response.py +0 -0
  189. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/src/ffbb_data_client/models/get_formation_response.py +0 -0
  190. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/src/ffbb_data_client/models/get_officiel_response.py +0 -0
  191. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/src/ffbb_data_client/models/get_organisme_response.py +0 -0
  192. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/src/ffbb_data_client/models/get_poule_response.py +0 -0
  193. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/src/ffbb_data_client/models/get_pratique_response.py +0 -0
  194. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/src/ffbb_data_client/models/get_rencontre_response.py +0 -0
  195. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/src/ffbb_data_client/models/get_saisons_response.py +0 -0
  196. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/src/ffbb_data_client/models/get_salle_response.py +0 -0
  197. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/src/ffbb_data_client/models/get_terrain_response.py +0 -0
  198. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/src/ffbb_data_client/models/get_tournoi_response.py +0 -0
  199. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/src/ffbb_data_client/models/gradient_color.py +0 -0
  200. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/src/ffbb_data_client/models/hit.py +0 -0
  201. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/src/ffbb_data_client/models/id_engagement_equipe.py +0 -0
  202. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/src/ffbb_data_client/models/id_organisme_equipe.py +0 -0
  203. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/src/ffbb_data_client/models/id_organisme_equipe1_logo.py +0 -0
  204. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/src/ffbb_data_client/models/id_poule.py +0 -0
  205. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/src/ffbb_data_client/models/jour.py +0 -0
  206. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/src/ffbb_data_client/models/label.py +0 -0
  207. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/src/ffbb_data_client/models/labellisation.py +0 -0
  208. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/src/ffbb_data_client/models/live.py +0 -0
  209. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/src/ffbb_data_client/models/lives.py +0 -0
  210. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/src/ffbb_data_client/models/logo.py +0 -0
  211. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/src/ffbb_data_client/models/multi_search_queries.py +0 -0
  212. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/src/ffbb_data_client/models/multi_search_query.py +0 -0
  213. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/src/ffbb_data_client/models/multi_search_result_competitions.py +0 -0
  214. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/src/ffbb_data_client/models/multi_search_result_engagements.py +0 -0
  215. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/src/ffbb_data_client/models/multi_search_result_formations.py +0 -0
  216. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/src/ffbb_data_client/models/multi_search_result_organismes.py +0 -0
  217. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/src/ffbb_data_client/models/multi_search_result_pratiques.py +0 -0
  218. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/src/ffbb_data_client/models/multi_search_result_rencontres.py +0 -0
  219. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/src/ffbb_data_client/models/multi_search_result_salles.py +0 -0
  220. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/src/ffbb_data_client/models/multi_search_result_terrains.py +0 -0
  221. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/src/ffbb_data_client/models/multi_search_result_tournois.py +0 -0
  222. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/src/ffbb_data_client/models/multi_search_results.py +0 -0
  223. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/src/ffbb_data_client/models/multi_search_results_class.py +0 -0
  224. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/src/ffbb_data_client/models/nature_sol.py +0 -0
  225. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/src/ffbb_data_client/models/niveau.py +0 -0
  226. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/src/ffbb_data_client/models/niveau_class.py +0 -0
  227. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/src/ffbb_data_client/models/niveau_extractor.py +0 -0
  228. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/src/ffbb_data_client/models/niveau_info.py +0 -0
  229. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/src/ffbb_data_client/models/niveau_models.py +0 -0
  230. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/src/ffbb_data_client/models/niveau_type.py +0 -0
  231. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/src/ffbb_data_client/models/objectif.py +0 -0
  232. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/src/ffbb_data_client/models/organisateur.py +0 -0
  233. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/src/ffbb_data_client/models/organisateur_type.py +0 -0
  234. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/src/ffbb_data_client/models/organisme_fields.py +0 -0
  235. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/src/ffbb_data_client/models/organisme_id_pere.py +0 -0
  236. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/src/ffbb_data_client/models/organismes_facet_distribution.py +0 -0
  237. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/src/ffbb_data_client/models/organismes_facet_stats.py +0 -0
  238. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/src/ffbb_data_client/models/organismes_hit.py +0 -0
  239. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/src/ffbb_data_client/models/organismes_multi_search_query.py +0 -0
  240. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/src/ffbb_data_client/models/organismes_query.py +0 -0
  241. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/src/ffbb_data_client/models/phase_code.py +0 -0
  242. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/src/ffbb_data_client/models/poule.py +0 -0
  243. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/src/ffbb_data_client/models/poule_fields.py +0 -0
  244. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/src/ffbb_data_client/models/poule_rencontre_item_model.py +0 -0
  245. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/src/ffbb_data_client/models/poules_models.py +0 -0
  246. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/src/ffbb_data_client/models/poules_query.py +0 -0
  247. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/src/ffbb_data_client/models/pratique.py +0 -0
  248. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/src/ffbb_data_client/models/pratiques_facet_distribution.py +0 -0
  249. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/src/ffbb_data_client/models/pratiques_facet_stats.py +0 -0
  250. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/src/ffbb_data_client/models/pratiques_hit.py +0 -0
  251. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/src/ffbb_data_client/models/pratiques_hit_type.py +0 -0
  252. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/src/ffbb_data_client/models/pratiques_multi_search_query.py +0 -0
  253. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/src/ffbb_data_client/models/pratiques_type_class.py +0 -0
  254. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/src/ffbb_data_client/models/publication_internet.py +0 -0
  255. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/src/ffbb_data_client/models/purple_logo.py +0 -0
  256. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/src/ffbb_data_client/models/query_fields_manager.py +0 -0
  257. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/src/ffbb_data_client/models/ranking_engagement.py +0 -0
  258. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/src/ffbb_data_client/models/rankings_models.py +0 -0
  259. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/src/ffbb_data_client/models/rencontres_engagement.py +0 -0
  260. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/src/ffbb_data_client/models/rencontres_facet_distribution.py +0 -0
  261. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/src/ffbb_data_client/models/rencontres_facet_stats.py +0 -0
  262. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/src/ffbb_data_client/models/rencontres_hit.py +0 -0
  263. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/src/ffbb_data_client/models/rencontres_multi_search_query.py +0 -0
  264. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/src/ffbb_data_client/models/saison.py +0 -0
  265. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/src/ffbb_data_client/models/saison_fields.py +0 -0
  266. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/src/ffbb_data_client/models/saisons_models.py +0 -0
  267. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/src/ffbb_data_client/models/saisons_query.py +0 -0
  268. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/src/ffbb_data_client/models/salle.py +0 -0
  269. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/src/ffbb_data_client/models/salles_facet_distribution.py +0 -0
  270. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/src/ffbb_data_client/models/salles_facet_stats.py +0 -0
  271. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/src/ffbb_data_client/models/salles_hit.py +0 -0
  272. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/src/ffbb_data_client/models/salles_multi_search_query.py +0 -0
  273. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/src/ffbb_data_client/models/sexe.py +0 -0
  274. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/src/ffbb_data_client/models/sexe_class.py +0 -0
  275. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/src/ffbb_data_client/models/source.py +0 -0
  276. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/src/ffbb_data_client/models/status.py +0 -0
  277. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/src/ffbb_data_client/models/team_engagement.py +0 -0
  278. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/src/ffbb_data_client/models/team_ranking.py +0 -0
  279. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/src/ffbb_data_client/models/terrains_categorie_championnat_3x3_libelle.py +0 -0
  280. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/src/ffbb_data_client/models/terrains_facet_distribution.py +0 -0
  281. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/src/ffbb_data_client/models/terrains_facet_stats.py +0 -0
  282. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/src/ffbb_data_client/models/terrains_hit.py +0 -0
  283. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/src/ffbb_data_client/models/terrains_multi_search_query.py +0 -0
  284. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/src/ffbb_data_client/models/terrains_name.py +0 -0
  285. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/src/ffbb_data_client/models/terrains_sexe_enum.py +0 -0
  286. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/src/ffbb_data_client/models/terrains_storage.py +0 -0
  287. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/src/ffbb_data_client/models/tournoi_type_class.py +0 -0
  288. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/src/ffbb_data_client/models/tournoi_type_enum.py +0 -0
  289. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/src/ffbb_data_client/models/tournoi_types_3x3.py +0 -0
  290. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/src/ffbb_data_client/models/tournoi_types_3x3_libelle.py +0 -0
  291. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/src/ffbb_data_client/models/tournoi_types_3x3_libelle_enum.py +0 -0
  292. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/src/ffbb_data_client/models/tournois_facet_distribution.py +0 -0
  293. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/src/ffbb_data_client/models/tournois_facet_stats.py +0 -0
  294. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/src/ffbb_data_client/models/tournois_hit.py +0 -0
  295. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/src/ffbb_data_client/models/tournois_hit_type.py +0 -0
  296. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/src/ffbb_data_client/models/tournois_libelle.py +0 -0
  297. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/src/ffbb_data_client/models/tournois_multi_search_query.py +0 -0
  298. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/src/ffbb_data_client/models/type_association.py +0 -0
  299. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/src/ffbb_data_client/models/type_association_libelle.py +0 -0
  300. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/src/ffbb_data_client/models/type_class.py +0 -0
  301. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/src/ffbb_data_client/models/type_competition.py +0 -0
  302. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/src/ffbb_data_client/models/type_competition_generique.py +0 -0
  303. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/src/ffbb_data_client/models/type_enum.py +0 -0
  304. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/src/ffbb_data_client/models/type_league.py +0 -0
  305. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/src/ffbb_data_client/py.typed +0 -0
  306. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/src/ffbb_data_client/utils/__init__.py +0 -0
  307. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/src/ffbb_data_client/utils/cache_manager.py +0 -0
  308. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/src/ffbb_data_client/utils/concurrency_utils.py +0 -0
  309. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/src/ffbb_data_client/utils/converter_utils.py +0 -0
  310. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/src/ffbb_data_client/utils/input_validation.py +0 -0
  311. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/src/ffbb_data_client/utils/secure_logging.py +0 -0
  312. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/src/ffbb_data_client.egg-info/dependency_links.txt +0 -0
  313. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/src/ffbb_data_client.egg-info/not-zip-safe +0 -0
  314. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/src/ffbb_data_client.egg-info/requires.txt +0 -0
  315. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/src/ffbb_data_client.egg-info/top_level.txt +0 -0
  316. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/tests/conftest.py +0 -0
  317. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/tests/e2e/__init__.py +0 -0
  318. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/tests/e2e/conftest.py +0 -0
  319. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/tests/integration/__init__.py +0 -0
  320. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/tests/integration/conftest.py +0 -0
  321. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/tests/integration/test_500_user_journey.py +0 -0
  322. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/tests/integration/test_501_user_journey_v3.py +0 -0
  323. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/tests/integration/test_502_enhanced_integration.py +0 -0
  324. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/tests/integration/test_503_secure_logging.py +0 -0
  325. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/tests/integration/test_504_input_validation.py +0 -0
  326. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/tests/integration/test_505_retry_timeout.py +0 -0
  327. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/tests/integration/test_506_raw_json_model_conversion.py +0 -0
  328. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/tests/unit/__init__.py +0 -0
  329. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/tests/unit/clients/__init__.py +0 -0
  330. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/tests/unit/clients/test_200_api_ffbb_app_client.py +0 -0
  331. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/tests/unit/clients/test_202_meilisearch_client.py +0 -0
  332. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/tests/unit/clients/test_203_meilisearch_client_extension.py +0 -0
  333. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/tests/unit/clients/test_204_ffbb_data_client.py +0 -0
  334. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/tests/unit/clients/test_205_meilisearch_ffbb_client.py +0 -0
  335. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/tests/unit/clients/test_206_coverage_gaps_clients.py +0 -0
  336. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/tests/unit/clients/test_209_automatic_token_resolution.py +0 -0
  337. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/tests/unit/clients/test_api_optimizations.py +0 -0
  338. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/tests/unit/clients/test_async_methods.py +0 -0
  339. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/tests/unit/clients/test_meilisearch_async.py +0 -0
  340. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/tests/unit/clients/test_v2_backport_search.py +0 -0
  341. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/tests/unit/clients/test_warm_cache.py +0 -0
  342. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/tests/unit/conftest.py +0 -0
  343. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/tests/unit/helpers/__init__.py +0 -0
  344. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/tests/unit/helpers/test_meilisearch_client_extension_recursive_pagination.py +0 -0
  345. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/tests/unit/helpers/test_meilisearch_pagination_concurrent.py +0 -0
  346. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/tests/unit/helpers/test_normalization.py +0 -0
  347. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/tests/unit/models/__init__.py +0 -0
  348. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/tests/unit/models/test_100_competition_id_categorie.py +0 -0
  349. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/tests/unit/models/test_101_competition_id_sexe.py +0 -0
  350. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/tests/unit/models/test_102_competition_id_type_competition.py +0 -0
  351. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/tests/unit/models/test_103_competition_id_type_competition_generique.py +0 -0
  352. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/tests/unit/models/test_104_competition_origine_categorie.py +0 -0
  353. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/tests/unit/models/test_105_competition_origine_type_competition_generique.py +0 -0
  354. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/tests/unit/models/test_106_competition_origine.py +0 -0
  355. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/tests/unit/models/test_107_id_engagement_equipe.py +0 -0
  356. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/tests/unit/models/test_108_id_organisme_equipe.py +0 -0
  357. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/tests/unit/models/test_109_id_organisme_equipe1_logo.py +0 -0
  358. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/tests/unit/models/test_110_labellisation.py +0 -0
  359. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/tests/unit/models/test_111_niveau_class.py +0 -0
  360. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/tests/unit/models/test_112_purple_logo.py +0 -0
  361. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/tests/unit/models/test_113_salle.py +0 -0
  362. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/tests/unit/models/test_114_tournoi_type_class.py +0 -0
  363. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/tests/unit/models/test_115_type_association_libelle.py +0 -0
  364. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/tests/unit/models/test_116_type_competition_generique.py +0 -0
  365. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/tests/unit/models/test_117_organisateur.py +0 -0
  366. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/tests/unit/models/test_118_competition_id.py +0 -0
  367. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/tests/unit/models/test_119_terrains_inner_models.py +0 -0
  368. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/tests/unit/models/test_120_pratiques_inner_models.py +0 -0
  369. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/tests/unit/models/test_121_to_dict_round_trip.py +0 -0
  370. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/tests/unit/models/test_122_coverage_gaps.py +0 -0
  371. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/tests/unit/models/test_123_missing_coverage.py +0 -0
  372. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/tests/unit/models/test_123_v2_backport.py +0 -0
  373. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/tests/unit/models/test_124_targeted_coverage_gains.py +0 -0
  374. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/tests/unit/models/test_dx_aliases.py +0 -0
  375. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/tests/unit/test_310_discover_endpoints.py +0 -0
  376. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/tests/unit/test_311_normalize_team_name.py +0 -0
  377. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/tests/unit/utils/__init__.py +0 -0
  378. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/tests/unit/utils/test_300_secure_logging.py +0 -0
  379. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/tests/unit/utils/test_301_input_validation.py +0 -0
  380. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/tests/unit/utils/test_303_cache_manager.py +0 -0
  381. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/tests/unit/utils/test_306_converter_utils.py +0 -0
  382. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/tests/unit/utils/test_308_converter_utils_extended.py +0 -0
  383. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/tests/unit/utils/test_309_concurrency_utils.py +0 -0
  384. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/website/assets/apple-touch-icon.png +0 -0
  385. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/website/assets/favicon-192x192.png +0 -0
  386. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/website/assets/favicon-48x48.png +0 -0
  387. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/website/assets/favicon-96x96.png +0 -0
  388. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/website/assets/favicon.ico +0 -0
  389. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/website/assets/logo.webp +0 -0
  390. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/website/css/style.css +0 -0
  391. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/website/favicon.ico +0 -0
  392. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/website/index.html +0 -0
  393. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/website/llms-full.txt +0 -0
  394. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/website/llms.txt +0 -0
  395. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/website/robots.txt +0 -0
  396. {ffbb_data_client-2.4.15 → ffbb_data_client-2.4.16}/website/sitemap.xml +0 -0
@@ -60,8 +60,21 @@ jobs:
60
60
  pipx run --python '${{ steps.setup-python.outputs.python-path }}'
61
61
  tox -e type
62
62
 
63
+ dependency-audit:
64
+ runs-on: ubuntu-latest
65
+ steps:
66
+ - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
67
+ - uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6.2.0
68
+ with:
69
+ python-version: "3.14"
70
+ cache: 'pip'
71
+ - name: Install package and auditor
72
+ run: python -m pip install . pip-audit
73
+ - name: Audit Python dependencies
74
+ run: python -m pip_audit
75
+
63
76
  build:
64
- needs: [lint, type-check]
77
+ needs: [lint, type-check, dependency-audit]
65
78
  runs-on: ubuntu-latest
66
79
  outputs:
67
80
  wheel-distribution: ${{ steps.wheel-distribution.outputs.path }}
@@ -13,8 +13,45 @@ env:
13
13
  FORCE_JAVASCRIPT_ACTIONS_TO_NODE24: true
14
14
 
15
15
  jobs:
16
+ verify:
17
+ name: Verify Python ${{ matrix.python }}
18
+ runs-on: ubuntu-latest
19
+ strategy:
20
+ fail-fast: false
21
+ matrix:
22
+ include:
23
+ - python: "3.10"
24
+ toxenv: py310
25
+ - python: "3.11"
26
+ toxenv: py311
27
+ - python: "3.12"
28
+ toxenv: py312
29
+ - python: "3.13"
30
+ toxenv: py313
31
+ - python: "3.14"
32
+ toxenv: py314
33
+ steps:
34
+ - name: Checkout
35
+ uses: actions/checkout@v7
36
+ with:
37
+ fetch-depth: 0
38
+ - name: Set up Python
39
+ uses: actions/setup-python@v6
40
+ id: setup-python
41
+ with:
42
+ python-version: ${{ matrix.python }}
43
+ cache: 'pip'
44
+ - name: Run test suite
45
+ env:
46
+ API_FFBB_APP_BEARER_TOKEN: ${{ secrets.API_FFBB_APP_BEARER_TOKEN }}
47
+ MEILISEARCH_BEARER_TOKEN: ${{ secrets.MEILISEARCH_BEARER_TOKEN }}
48
+ run: >-
49
+ pipx run --python '${{ steps.setup-python.outputs.python-path }}'
50
+ tox -e ${{ matrix.toxenv }}
51
+
16
52
  build:
17
53
  name: Build distribution
54
+ needs: verify
18
55
  runs-on: ubuntu-latest
19
56
  permissions:
20
57
  attestations: write
@@ -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 : ~18803 lignes de code
5
- > (clients: 5980, models: 9805, utils: 2003, helpers: 1015)
4
+ > Dernière mise à jour : ffbb-data-client | SDK total : ~19037 lignes de code
5
+ > (clients: 6014, models: 9806, utils: 2061, helpers: 1156)
6
6
 
7
7
  ## Langue
8
8
  Tous les documents de travail (walkthrough.md, implementation_plan.md) DOIVENT être en français.
@@ -40,10 +40,9 @@ ou interroge l'API publique en cache en cas d'absence :
40
40
  documentation (`AGENTS.md`), de site/landing page ou autres tâches de synchronisation de
41
41
  manière autonome. Si vous estimez qu'une mise à jour automatique est pertinente ou non, prenez
42
42
  la décision par vous-même sans attendre la validation explicite de l'utilisateur.
43
- - **Protocole Strict Pre-Commit & Re-Stage (Zéro échec de CI)** :
44
- 1. Toujours appliquer `.rstrip() + "\n"` dans les générateurs de fichiers (RST, MD, JSON).
45
- 2. Exécuter systématiquement `rtk pre-commit run --all-files`.
46
- 3. Si un hook (end-of-file-fixer, black, isort...) modifie un fichier sur disque : **OBLIGATION de ré-indexer (`rtk git add -u`) et de ré-exécuter `rtk pre-commit run --all-files`** jusqu'à un passage 100% propre avant de créer le commit (`git commit`).
43
+ - **Validation pre-commit systématique (Zéro échec de CI)** : Pour éviter tout échec de build ou de formatage en CI,
44
+ exécutez systématiquement la validation complète locale via `rtk pre-commit run --all-files` avant de pousser
45
+ tout commit vers origin. Résolvez toutes les alertes (formatage, imports `isort`, typage) localement.
47
46
 
48
47
 
49
48
  ## Karpathy Guidelines (Règles de développement)
@@ -70,13 +69,13 @@ Ces directives inspirées d'Andrej Karpathy visent à éliminer les erreurs de c
70
69
  ```
71
70
  src/ffbb_data_client/
72
71
  ├── __init__.py # Point d'entrée du SDK, expose FFBBDataClient et FFBBTokens
73
- ├── clients/ # Clients d'API (REST et Meilisearch) et façades (≈5980 lignes)
72
+ ├── clients/ # Clients d'API (REST et Meilisearch) et façades (≈6014 lignes)
74
73
  ├── config.py # Configuration centralisée (URLs, Headers, Endpoints, Facettes)
75
74
  ├── data/ # Ressources et données statiques
76
- ├── helpers/ # Méthodes utilitaires pour requêtes HTTP et mapping (≈1015 lignes)
77
- ├── models/ # Modèles de données Pydantic type-safe (≈9805 lignes)
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)
78
77
  ├── py.typed # Marqueur pour la compatibilité avec mypy
79
- └── utils/ # Gestionnaires transversaux (cache, jetons de sécurité, validation) (≈2003 lignes)
78
+ └── utils/ # Gestionnaires transversaux (cache, jetons de sécurité, validation) (≈2061 lignes)
80
79
  ```
81
80
 
82
81
  ## Conventions de code
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: ffbb-data-client
3
- Version: 2.4.15
3
+ Version: 2.4.16
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
@@ -94,7 +94,7 @@ Dynamic: license-file
94
94
  `ffbb_data_client` simplifie l'accès aux API FFBB et à leurs index Meilisearch avec :
95
95
 
96
96
  - une façade unique : `FFBBDataClient` ;
97
- - des modèles Pydantic v2 typés ;
97
+ - des modèles typés, avec validation Pydantic v2 sur les contrats sensibles ;
98
98
  - une API utilisable en synchrone ou en `async/await` ;
99
99
  - une gestion automatique des tokens via `TokenManager` ;
100
100
  - du cache HTTP configurable via `hishel` ;
@@ -154,7 +154,7 @@ lives = client.get_lives()
154
154
  | API FFBB | clubs, compétitions, organismes, saisons, poules, classements, rencontres, lives |
155
155
  | Entités additionnelles | EDF (matches, joueurs, rosters, équipes), Genius Sport, Rematch Videos |
156
156
  | Recherche | organismes, compétitions, rencontres, salles, terrains, pratiques, tournois, engagements et formations |
157
- | REST typé | récupération de ressources individuelles avec modèles Pydantic v2 |
157
+ | REST typé | récupération de ressources individuelles avec modèles typés et conversion contrôlée |
158
158
  | Async | méthodes `*_async()` — source de vérité ; sync délègue via `_run_async()` |
159
159
  | Cache | cache HTTP `hishel`, sessions `httpx` réutilisées, retries configurables, SQLite séparés sync/async |
160
160
  | Sécurité | masquage des tokens dans les logs, CodeQL scanning, Dependabot |
@@ -229,7 +229,7 @@ entraineur = client.get_entraineur(44444)
229
229
 
230
230
  Les assets Directus et autres collections peuvent être exploités via les méthodes REST/listing dédiées exposées par le client lorsque disponibles.
231
231
 
232
- Les réponses sont converties en modèles Pydantic lorsque le schéma est connu, ce qui apporte validation, autocomplétion et sérialisation propre.
232
+ Les réponses sont converties en modèles typés lorsque le schéma est connu. Les contrats sensibles, notamment la configuration des tokens, utilisent une validation Pydantic stricte.
233
233
 
234
234
  ---
235
235
 
@@ -283,7 +283,7 @@ src/ffbb_data_client/
283
283
  │ ├── api_ffbb_app_client.py # Client REST FFBB (async source of truth)
284
284
  │ └── meilisearch_ffbb_client.py # Client recherche Meilisearch
285
285
  ├── helpers/ # Requêtes HTTP, multi-search, conversions
286
- ├── models/ # Modèles Pydantic v2
286
+ ├── models/ # Modèles typés (dataclasses et Pydantic v2)
287
287
  ├── utils/ # cache (sync/async séparés), tokens, logging sécurisé
288
288
  └── data/ # schémas et métadonnées embarqués
289
289
  ```
@@ -38,7 +38,7 @@
38
38
  `ffbb_data_client` simplifie l'accès aux API FFBB et à leurs index Meilisearch avec :
39
39
 
40
40
  - une façade unique : `FFBBDataClient` ;
41
- - des modèles Pydantic v2 typés ;
41
+ - des modèles typés, avec validation Pydantic v2 sur les contrats sensibles ;
42
42
  - une API utilisable en synchrone ou en `async/await` ;
43
43
  - une gestion automatique des tokens via `TokenManager` ;
44
44
  - du cache HTTP configurable via `hishel` ;
@@ -98,7 +98,7 @@ lives = client.get_lives()
98
98
  | API FFBB | clubs, compétitions, organismes, saisons, poules, classements, rencontres, lives |
99
99
  | Entités additionnelles | EDF (matches, joueurs, rosters, équipes), Genius Sport, Rematch Videos |
100
100
  | Recherche | organismes, compétitions, rencontres, salles, terrains, pratiques, tournois, engagements et formations |
101
- | REST typé | récupération de ressources individuelles avec modèles Pydantic v2 |
101
+ | REST typé | récupération de ressources individuelles avec modèles typés et conversion contrôlée |
102
102
  | Async | méthodes `*_async()` — source de vérité ; sync délègue via `_run_async()` |
103
103
  | Cache | cache HTTP `hishel`, sessions `httpx` réutilisées, retries configurables, SQLite séparés sync/async |
104
104
  | Sécurité | masquage des tokens dans les logs, CodeQL scanning, Dependabot |
@@ -173,7 +173,7 @@ entraineur = client.get_entraineur(44444)
173
173
 
174
174
  Les assets Directus et autres collections peuvent être exploités via les méthodes REST/listing dédiées exposées par le client lorsque disponibles.
175
175
 
176
- Les réponses sont converties en modèles Pydantic lorsque le schéma est connu, ce qui apporte validation, autocomplétion et sérialisation propre.
176
+ Les réponses sont converties en modèles typés lorsque le schéma est connu. Les contrats sensibles, notamment la configuration des tokens, utilisent une validation Pydantic stricte.
177
177
 
178
178
  ---
179
179
 
@@ -227,7 +227,7 @@ src/ffbb_data_client/
227
227
  │ ├── api_ffbb_app_client.py # Client REST FFBB (async source of truth)
228
228
  │ └── meilisearch_ffbb_client.py # Client recherche Meilisearch
229
229
  ├── helpers/ # Requêtes HTTP, multi-search, conversions
230
- ├── models/ # Modèles Pydantic v2
230
+ ├── models/ # Modèles typés (dataclasses et Pydantic v2)
231
231
  ├── utils/ # cache (sync/async séparés), tokens, logging sécurisé
232
232
  └── data/ # schémas et métadonnées embarqués
233
233
  ```
@@ -64,7 +64,8 @@ Usage:
64
64
 
65
65
  .. code-block:: python
66
66
 
67
- from ffbb_data_client import Live, MultiSearchQuery, CompetitionType
67
+ from ffbb_data_client import MultiSearchQuery
68
+ from ffbb_data_client.models import CompetitionType, Live
68
69
 
69
70
  # Create search queries
70
71
  query = MultiSearchQuery("basketball")
@@ -77,7 +77,7 @@ Cache Management
77
77
  from ffbb_data_client.utils.cache_manager import CacheManager
78
78
 
79
79
  # Clear token cache
80
- CacheManager().clear()
80
+ CacheManager().clear_cache()
81
81
 
82
82
  Configuration Management (v1.2.0+)
83
83
  ====================================
@@ -296,8 +296,7 @@ Robust Error Handling
296
296
 
297
297
  .. code-block:: python
298
298
 
299
- from ffbb_data_client import FFBBDataClient
300
- import requests
299
+ from ffbb_data_client import FFBBDataClient, FFBBError
301
300
 
302
301
  try:
303
302
  client = FFBBDataClient.create(MEILISEARCH_TOKEN, API_TOKEN)
@@ -307,8 +306,8 @@ Robust Error Handling
307
306
 
308
307
  except ValueError as e:
309
308
  print(f"Configuration error: {e}")
310
- except requests.RequestException as e:
311
- print(f"Network error: {e}")
309
+ except FFBBError as e:
310
+ print(f"FFBB error: {e}")
312
311
  except Exception as e:
313
312
  print(f"Unexpected error: {e}")
314
313
 
@@ -320,30 +319,18 @@ Using Cached Sessions
320
319
 
321
320
  .. code-block:: python
322
321
 
323
- from requests_cache import CachedSession
324
322
  from ffbb_data_client import FFBBDataClient
323
+ from ffbb_data_client.utils.cache_manager import CacheConfig, CacheManager
325
324
 
326
- # Create custom cached session
327
- cached_session = CachedSession(
328
- 'ffbb_cache',
329
- backend='sqlite',
330
- expire_after=3600 # 1 hour cache
331
- )
332
-
333
- # Create client with custom session
334
- api_client = ApiFFBBAppClient(
335
- bearer_token=API_TOKEN,
336
- cached_session=cached_session
337
- )
325
+ cache = CacheManager(CacheConfig(backend="sqlite", expire_after=3600))
338
326
 
339
- meilisearch_client = MeilisearchFFBBClient(
340
- bearer_token=MEILISEARCH_TOKEN,
341
- cached_session=cached_session
327
+ client = FFBBDataClient.create(
328
+ api_bearer_token=API_TOKEN,
329
+ meilisearch_bearer_token=MEILISEARCH_TOKEN,
330
+ cached_session=cache.session,
331
+ async_cached_session=cache.async_session,
342
332
  )
343
333
 
344
- # Create main client
345
- client = FFBBDataClient(api_client, meilisearch_client)
346
-
347
334
  Data Export and Processing
348
335
  ==========================
349
336
 
@@ -102,12 +102,12 @@ Migration from v1.1.x to v1.2.0 (Upcoming)
102
102
  tokens = TokenManager.get_tokens(use_cache=False)
103
103
 
104
104
  # Use CacheManager directly for cache operations
105
- CacheManager().clear()
105
+ CacheManager().clear_cache()
106
106
 
107
107
  **Migration Steps:**
108
108
 
109
109
  1. Update TokenManager.get_tokens() calls to use cache_config parameter
110
- 2. Replace TokenManager.clear_cache() with CacheManager().clear()
110
+ 2. Replace TokenManager.clear_cache() with CacheManager().clear_cache()
111
111
  3. Import CacheManager from ffbb_data_client.utils.cache_manager
112
112
 
113
113
  ---
@@ -165,4 +165,4 @@ Token Management Updates
165
165
  # After v1.2.0
166
166
  tokens = TokenManager.get_tokens(use_cache=False)
167
167
  from ffbb_data_client.utils.cache_manager import CacheManager
168
- CacheManager().clear()
168
+ CacheManager().clear_cache()
@@ -4,7 +4,6 @@ pydantic>=2.13.4
4
4
  python-dateutil>=2.9.0.post0
5
5
  python-dotenv>=1.2.2
6
6
  readme_renderer[md]>=44.0
7
- requests_cache
8
7
  # Requirements file for ReadTheDocs, check .readthedocs.yml.
9
8
  # To build the module reference correctly, make sure every external package
10
9
  # under `install_requires` in `setup.cfg` is also listed here!
@@ -10,6 +10,16 @@ from .clients.api_ffbb_app_client import ApiFFBBAppClient
10
10
  from .clients.ffbb_data_client import FFBBDataClient
11
11
  from .clients.meilisearch_client import MeilisearchClient
12
12
  from .clients.meilisearch_ffbb_client import MeilisearchFFBBClient
13
+ from .exceptions import (
14
+ FFBBAuthenticationError,
15
+ FFBBError,
16
+ FFBBHTTPError,
17
+ FFBBNotFoundError,
18
+ FFBBRateLimitError,
19
+ FFBBResponseValidationError,
20
+ FFBBServerError,
21
+ FFBBTransportError,
22
+ )
13
23
  from .helpers.meilisearch_client_extension import MeilisearchClientExtension
14
24
  from .helpers.multi_search_query_helper import generate_queries
15
25
  from .models.club_contacts import ClubContacts
@@ -76,6 +86,15 @@ __all__ = [
76
86
  "FFBBDataClient",
77
87
  "MeilisearchClient",
78
88
  "MeilisearchFFBBClient",
89
+ # Exceptions
90
+ "FFBBError",
91
+ "FFBBHTTPError",
92
+ "FFBBNotFoundError",
93
+ "FFBBAuthenticationError",
94
+ "FFBBRateLimitError",
95
+ "FFBBServerError",
96
+ "FFBBTransportError",
97
+ "FFBBResponseValidationError",
79
98
  # Helpers
80
99
  "MeilisearchClientExtension",
81
100
  "generate_queries",
@@ -8,6 +8,7 @@ from __future__ import annotations
8
8
 
9
9
  import asyncio
10
10
  import logging
11
+ import os
11
12
  import re
12
13
  import time
13
14
  from collections import OrderedDict
@@ -112,11 +113,18 @@ l'ensemble des données publiques de la **Fédération Française de BasketBall*
112
113
  lifespan=lifespan,
113
114
  )
114
115
 
115
- # Enable CORS for all origins
116
+ _cors_origins = [
117
+ origin.strip()
118
+ for origin in os.getenv(
119
+ "FFBB_CORS_ORIGINS", "http://localhost:3000,http://localhost:8000"
120
+ ).split(",")
121
+ if origin.strip()
122
+ ]
123
+
116
124
  app.add_middleware(
117
125
  CORSMiddleware,
118
- allow_origins=["*"],
119
- allow_credentials=True,
126
+ allow_origins=_cors_origins,
127
+ allow_credentials=False,
120
128
  allow_methods=["*"],
121
129
  allow_headers=["*"],
122
130
  )
@@ -10,6 +10,7 @@ from ...config import (
10
10
  ENDPOINT_POULES,
11
11
  ENDPOINT_SAISONS,
12
12
  )
13
+ from ...exceptions import FFBBNotFoundError
13
14
  from ...helpers.http_requests_utils import http_get_json_async, url_with_params
14
15
  from ...models.field_set import FieldSet
15
16
  from ...models.get_competition_response import GetCompetitionResponse
@@ -75,13 +76,13 @@ class CompetitionMixin:
75
76
  final_url,
76
77
  self.headers,
77
78
  debug=self.debug,
78
- cached_session=self.async_cached_session or self.async_cached_session,
79
+ cached_session=cached_session or self.async_cached_session,
79
80
  )
80
81
  actual_data = data.get("data") if data and isinstance(data, dict) else data
81
82
  if actual_data:
82
83
  return GetCompetitionResponse.from_dict(actual_data)
83
84
  return None
84
- except Exception as e:
85
+ except FFBBNotFoundError as e:
85
86
  if self.debug:
86
87
  self.logger.error(f"Error in get_competition_async: {e}")
87
88
  return None
@@ -129,13 +130,13 @@ class CompetitionMixin:
129
130
  final_url,
130
131
  self.headers,
131
132
  debug=self.debug,
132
- cached_session=self.async_cached_session or self.async_cached_session,
133
+ cached_session=cached_session or self.async_cached_session,
133
134
  )
134
135
  actual_data = data.get("data") if data and isinstance(data, dict) else data
135
136
  if actual_data:
136
137
  return GetPouleResponse.from_dict(actual_data)
137
138
  return None
138
- except Exception as e:
139
+ except FFBBNotFoundError as e:
139
140
  if self.debug:
140
141
  self.logger.error(f"Error in get_poule_async: {e}")
141
142
  return None
@@ -205,13 +206,13 @@ class CompetitionMixin:
205
206
  final_url,
206
207
  self.headers,
207
208
  debug=self.debug,
208
- cached_session=self.async_cached_session or self.async_cached_session,
209
+ cached_session=cached_session or self.async_cached_session,
209
210
  )
210
211
  actual_data = data.get("data") if data and isinstance(data, dict) else data
211
212
  if actual_data and isinstance(actual_data, list):
212
213
  return GetSaisonsResponse.from_list(actual_data)
213
214
  return []
214
- except Exception as e:
215
+ except FFBBNotFoundError as e:
215
216
  if self.debug:
216
217
  self.logger.error(f"Error in get_saisons_async: {e}")
217
218
  return []
@@ -21,6 +21,7 @@ from ...config import (
21
21
  ENDPOINT_TERRAINS,
22
22
  ENDPOINT_TOURNOIS,
23
23
  )
24
+ from ...exceptions import FFBBNotFoundError
24
25
  from ...helpers.http_requests_utils import http_get_json_async, url_with_params
25
26
  from ...models.configuration_models import GetConfigurationResponse
26
27
  from ...models.get_commune_response import GetCommuneResponse
@@ -83,11 +84,11 @@ class GettersMixin:
83
84
  final_url,
84
85
  self.headers,
85
86
  debug=self.debug,
86
- cached_session=self.async_cached_session or self.async_cached_session,
87
+ cached_session=cached_session or self.async_cached_session,
87
88
  retry_config=self.retry_config,
88
89
  timeout_config=self.timeout_config,
89
90
  )
90
- except Exception as e:
91
+ except FFBBNotFoundError as e:
91
92
  if self.debug:
92
93
  self.logger.error(f"Error in _get_directus_item_async: {e}")
93
94
  return None
@@ -149,11 +150,11 @@ class GettersMixin:
149
150
  final_url,
150
151
  self.headers,
151
152
  debug=self.debug,
152
- cached_session=self.async_cached_session or self.async_cached_session,
153
+ cached_session=cached_session or self.async_cached_session,
153
154
  retry_config=self.retry_config,
154
155
  timeout_config=self.timeout_config,
155
156
  )
156
- except Exception as e:
157
+ except FFBBNotFoundError as e:
157
158
  if self.debug:
158
159
  self.logger.error(f"Error in _list_directus_items_async: {e}")
159
160
  return []
@@ -182,12 +183,12 @@ class GettersMixin:
182
183
  url,
183
184
  self.headers,
184
185
  debug=self.debug,
185
- cached_session=self.async_cached_session or self.async_cached_session,
186
+ cached_session=cached_session or self.async_cached_session,
186
187
  retry_config=self.retry_config,
187
188
  timeout_config=self.timeout_config,
188
189
  )
189
190
  return data if isinstance(data, dict) else None
190
- except Exception as e:
191
+ except FFBBNotFoundError as e:
191
192
  if self.debug:
192
193
  self.logger.error(f"Error in get_openapi_spec_async: {e}")
193
194
  return None
@@ -210,7 +211,7 @@ class GettersMixin:
210
211
  url,
211
212
  self.headers,
212
213
  debug=self.debug,
213
- cached_session=self.async_cached_session or self.async_cached_session,
214
+ cached_session=cached_session or self.async_cached_session,
214
215
  retry_config=self.retry_config,
215
216
  timeout_config=self.timeout_config,
216
217
  )
@@ -220,7 +221,7 @@ class GettersMixin:
220
221
  if not isinstance(raw_data, list):
221
222
  return []
222
223
  return lives_from_dict(raw_data)
223
- except Exception as e:
224
+ except FFBBNotFoundError as e:
224
225
  if self.debug:
225
226
  self.logger.error(f"Error in get_lives_async: {e}")
226
227
  return None
@@ -247,7 +248,7 @@ class GettersMixin:
247
248
  url,
248
249
  self.headers,
249
250
  debug=self.debug,
250
- cached_session=self.async_cached_session or self.async_cached_session,
251
+ cached_session=cached_session or self.async_cached_session,
251
252
  retry_config=self.retry_config,
252
253
  timeout_config=self.timeout_config,
253
254
  )
@@ -255,7 +256,7 @@ class GettersMixin:
255
256
  if actual_data:
256
257
  return GetConfigurationResponse.from_dict(actual_data)
257
258
  return None
258
- except Exception as e:
259
+ except FFBBNotFoundError as e:
259
260
  if self.debug:
260
261
  self.logger.error(f"Error in get_configuration_async: {e}")
261
262
  return None
@@ -282,11 +283,11 @@ class GettersMixin:
282
283
  url,
283
284
  self.headers,
284
285
  debug=self.debug,
285
- cached_session=self.async_cached_session or self.async_cached_session,
286
+ cached_session=cached_session or self.async_cached_session,
286
287
  )
287
288
  actual_data = data.get("data") if data and isinstance(data, dict) else data
288
289
  return GetRencontreResponse.from_dict(actual_data) if actual_data else None
289
- except Exception as e:
290
+ except FFBBNotFoundError as e:
290
291
  if self.debug:
291
292
  self.logger.error(f"Error in get_rencontre_async: {e}")
292
293
  return None
@@ -309,11 +310,11 @@ class GettersMixin:
309
310
  url,
310
311
  self.headers,
311
312
  debug=self.debug,
312
- cached_session=self.async_cached_session or self.async_cached_session,
313
+ cached_session=cached_session or self.async_cached_session,
313
314
  )
314
315
  actual_data = data.get("data") if data and isinstance(data, dict) else data
315
316
  return GetEngagementResponse.from_dict(actual_data) if actual_data else None
316
- except Exception as e:
317
+ except FFBBNotFoundError as e:
317
318
  if self.debug:
318
319
  self.logger.error(f"Error in get_engagement_async: {e}")
319
320
  return None
@@ -340,11 +341,11 @@ class GettersMixin:
340
341
  url,
341
342
  self.headers,
342
343
  debug=self.debug,
343
- cached_session=self.async_cached_session or self.async_cached_session,
344
+ cached_session=cached_session or self.async_cached_session,
344
345
  )
345
346
  actual_data = data.get("data") if data and isinstance(data, dict) else data
346
347
  return GetFormationResponse.from_dict(actual_data) if actual_data else None
347
- except Exception as e:
348
+ except FFBBNotFoundError as e:
348
349
  if self.debug:
349
350
  self.logger.error(f"Error in get_formation_async: {e}")
350
351
  return None
@@ -367,11 +368,11 @@ class GettersMixin:
367
368
  url,
368
369
  self.headers,
369
370
  debug=self.debug,
370
- cached_session=self.async_cached_session or self.async_cached_session,
371
+ cached_session=cached_session or self.async_cached_session,
371
372
  )
372
373
  actual_data = data.get("data") if data and isinstance(data, dict) else data
373
374
  return GetEntraineurResponse.from_dict(actual_data) if actual_data else None
374
- except Exception as e:
375
+ except FFBBNotFoundError as e:
375
376
  if self.debug:
376
377
  self.logger.error(f"Error in get_entraineur_async: {e}")
377
378
  return None
@@ -398,11 +399,11 @@ class GettersMixin:
398
399
  url,
399
400
  self.headers,
400
401
  debug=self.debug,
401
- cached_session=self.async_cached_session or self.async_cached_session,
402
+ cached_session=cached_session or self.async_cached_session,
402
403
  )
403
404
  actual_data = data.get("data") if data and isinstance(data, dict) else data
404
405
  return GetCommuneResponse.from_dict(actual_data) if actual_data else None
405
- except Exception as e:
406
+ except FFBBNotFoundError as e:
406
407
  if self.debug:
407
408
  self.logger.error(f"Error in get_commune_async: {e}")
408
409
  return None
@@ -425,11 +426,11 @@ class GettersMixin:
425
426
  url,
426
427
  self.headers,
427
428
  debug=self.debug,
428
- cached_session=self.async_cached_session or self.async_cached_session,
429
+ cached_session=cached_session or self.async_cached_session,
429
430
  )
430
431
  actual_data = data.get("data") if data and isinstance(data, dict) else data
431
432
  return GetOfficielResponse.from_dict(actual_data) if actual_data else None
432
- except Exception as e:
433
+ except FFBBNotFoundError as e:
433
434
  if self.debug:
434
435
  self.logger.error(f"Error in get_officiel_async: {e}")
435
436
  return None
@@ -452,11 +453,11 @@ class GettersMixin:
452
453
  url,
453
454
  self.headers,
454
455
  debug=self.debug,
455
- cached_session=self.async_cached_session or self.async_cached_session,
456
+ cached_session=cached_session or self.async_cached_session,
456
457
  )
457
458
  actual_data = data.get("data") if data and isinstance(data, dict) else data
458
459
  return GetSalleResponse.from_dict(actual_data) if actual_data else None
459
- except Exception as e:
460
+ except FFBBNotFoundError as e:
460
461
  if self.debug:
461
462
  self.logger.error(f"Error in get_salle_async: {e}")
462
463
  return None
@@ -479,11 +480,11 @@ class GettersMixin:
479
480
  url,
480
481
  self.headers,
481
482
  debug=self.debug,
482
- cached_session=self.async_cached_session or self.async_cached_session,
483
+ cached_session=cached_session or self.async_cached_session,
483
484
  )
484
485
  actual_data = data.get("data") if data and isinstance(data, dict) else data
485
486
  return GetTerrainResponse.from_dict(actual_data) if actual_data else None
486
- except Exception as e:
487
+ except FFBBNotFoundError as e:
487
488
  if self.debug:
488
489
  self.logger.error(f"Error in get_terrain_async: {e}")
489
490
  return None
@@ -506,11 +507,11 @@ class GettersMixin:
506
507
  url,
507
508
  self.headers,
508
509
  debug=self.debug,
509
- cached_session=self.async_cached_session or self.async_cached_session,
510
+ cached_session=cached_session or self.async_cached_session,
510
511
  )
511
512
  actual_data = data.get("data") if data and isinstance(data, dict) else data
512
513
  return GetTournoiResponse.from_dict(actual_data) if actual_data else None
513
- except Exception as e:
514
+ except FFBBNotFoundError as e:
514
515
  if self.debug:
515
516
  self.logger.error(f"Error in get_tournoi_async: {e}")
516
517
  return None
@@ -533,11 +534,11 @@ class GettersMixin:
533
534
  url,
534
535
  self.headers,
535
536
  debug=self.debug,
536
- cached_session=self.async_cached_session or self.async_cached_session,
537
+ cached_session=cached_session or self.async_cached_session,
537
538
  )
538
539
  actual_data = data.get("data") if data and isinstance(data, dict) else data
539
540
  return GetPratiqueResponse.from_dict(actual_data) if actual_data else None
540
- except Exception as e:
541
+ except FFBBNotFoundError as e:
541
542
  if self.debug:
542
543
  self.logger.error(f"Error in get_pratique_async: {e}")
543
544
  return None