ffbb-data-client 2.4.17__tar.gz → 2.4.18__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.17 → ffbb_data_client-2.4.18}/PKG-INFO +1 -1
  2. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/src/ffbb_data_client/__init__.py +10 -0
  3. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/src/ffbb_data_client/clients/_mixins/list_methods.py +80 -0
  4. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/src/ffbb_data_client/clients/_rest_facade.py +236 -0
  5. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/src/ffbb_data_client/models/niveau_extractor.py +17 -12
  6. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/src/ffbb_data_client.egg-info/PKG-INFO +1 -1
  7. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/src/ffbb_data_client.egg-info/SOURCES.txt +1 -0
  8. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/src/ffbb_data_client.egg-info/scm_file_list.json +1 -0
  9. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/src/ffbb_data_client.egg-info/scm_version.json +2 -2
  10. ffbb_data_client-2.4.18/tests/unit/clients/test_v4_aiter_and_contacts.py +155 -0
  11. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/.agents/rules/antigravity-rtk-rules.md +0 -0
  12. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/.coveragerc +0 -0
  13. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/.gitattributes +0 -0
  14. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/.github/FUNDING.yml +0 -0
  15. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
  16. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
  17. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
  18. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/.github/dependabot.yml +0 -0
  19. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/.github/scripts/ai-pr-reviewer.cjs +0 -0
  20. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/.github/scripts/check_wrapper_parity.py +0 -0
  21. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/.github/workflows/ai-pr-reviewer.yml +0 -0
  22. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/.github/workflows/check_wrapper_parity.yml +0 -0
  23. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/.github/workflows/ci.yml +0 -0
  24. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/.github/workflows/codeql.yml +0 -0
  25. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/.github/workflows/deploy-pages.yml +0 -0
  26. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/.github/workflows/keep-ffbb-api-discovery-alive.yml +0 -0
  27. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/.github/workflows/publish.yml +0 -0
  28. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/.github/workflows/release-after-discovery-merge.yml +0 -0
  29. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/.github/workflows/update-ffbb-api-discovery.yml +0 -0
  30. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/.gitignore +0 -0
  31. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/.isort.cfg +0 -0
  32. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/.jules/bolt.md +0 -0
  33. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/.omc/skills/codeql-security-hardening-expertise.md +0 -0
  34. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/.omc/skills/pypi-immutable-release-workflow.md +0 -0
  35. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/.omc/skills/terminal-output-hygiene-expertise.md +0 -0
  36. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/.pre-commit-config.yaml +0 -0
  37. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/.readthedocs.yml +0 -0
  38. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/AGENTS.md +0 -0
  39. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/AUTHORS.rst +0 -0
  40. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/CHANGELOG.md +0 -0
  41. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/CODE_OF_CONDUCT.md +0 -0
  42. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/CONTRIBUTING.rst +0 -0
  43. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/DESIGN.md +0 -0
  44. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/Dockerfile +0 -0
  45. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/LICENSE.txt +0 -0
  46. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/LOCAL_CI_GUIDE.md +0 -0
  47. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/README.md +0 -0
  48. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/RELEASE_NOTES.md +0 -0
  49. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/SECURITY.md +0 -0
  50. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/data/api.ffbb.app.json +0 -0
  51. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/data/api_update_summary.md +0 -0
  52. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/data/collections.json +0 -0
  53. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/data/endpoint_discovery.json +0 -0
  54. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/data/field_dictionary.json +0 -0
  55. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/data/indexes.json +0 -0
  56. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/data/meilisearch-prod.ffbb.app.json +0 -0
  57. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/data/openapi.json +0 -0
  58. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/data/openapi_full.json +0 -0
  59. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/data/type_discovery_corrections.json +0 -0
  60. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/docs/Makefile +0 -0
  61. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/docs/_static/.gitignore +0 -0
  62. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/docs/architecture.rst +0 -0
  63. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/docs/authors.rst +0 -0
  64. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/docs/changelog.rst +0 -0
  65. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/docs/conf.py +0 -0
  66. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/docs/contributing.rst +0 -0
  67. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/docs/data_dictionary.rst +0 -0
  68. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/docs/examples.rst +0 -0
  69. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/docs/index.rst +0 -0
  70. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/docs/license.rst +0 -0
  71. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/docs/migration.rst +0 -0
  72. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/docs/readme.rst +0 -0
  73. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/docs/requirements.txt +0 -0
  74. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/docs/test_strategy.md +0 -0
  75. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/docs/testing_conventions.md +0 -0
  76. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/examples/README.md +0 -0
  77. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/examples/complete_usage_example.py +0 -0
  78. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/examples/quick_start.py +0 -0
  79. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/examples/team_ranking_analysis.py +0 -0
  80. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/pyproject.toml +0 -0
  81. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/pytest.ini +0 -0
  82. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/run-ci-locally.sh +0 -0
  83. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/scripts/benchmark_concurrent_pagination.py +0 -0
  84. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/scripts/benchmark_search_organisme.py +0 -0
  85. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/scripts/discover_endpoints.py +0 -0
  86. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/scripts/discover_types.py +0 -0
  87. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/setup.cfg +0 -0
  88. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/setup.py +0 -0
  89. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/src/ffbb_data_client/api.py +0 -0
  90. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/src/ffbb_data_client/clients/__init__.py +0 -0
  91. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/src/ffbb_data_client/clients/_helpers.py +0 -0
  92. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/src/ffbb_data_client/clients/_mixins/__init__.py +0 -0
  93. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/src/ffbb_data_client/clients/_mixins/competition.py +0 -0
  94. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/src/ffbb_data_client/clients/_mixins/external.py +0 -0
  95. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/src/ffbb_data_client/clients/_mixins/getters.py +0 -0
  96. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/src/ffbb_data_client/clients/_mixins/organisme.py +0 -0
  97. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/src/ffbb_data_client/clients/_search_facade.py +0 -0
  98. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/src/ffbb_data_client/clients/api_ffbb_app_client.py +0 -0
  99. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/src/ffbb_data_client/clients/ffbb_data_client.py +0 -0
  100. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/src/ffbb_data_client/clients/meilisearch_client.py +0 -0
  101. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/src/ffbb_data_client/clients/meilisearch_ffbb_client.py +0 -0
  102. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/src/ffbb_data_client/config.py +0 -0
  103. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/src/ffbb_data_client/data/__init__.py +0 -0
  104. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/src/ffbb_data_client/data/collections.json +0 -0
  105. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/src/ffbb_data_client/data/endpoint_discovery.json +0 -0
  106. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/src/ffbb_data_client/data/field_dictionary.json +0 -0
  107. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/src/ffbb_data_client/data/indexes.json +0 -0
  108. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/src/ffbb_data_client/data/openapi.json +0 -0
  109. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/src/ffbb_data_client/exceptions.py +0 -0
  110. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/src/ffbb_data_client/helpers/__init__.py +0 -0
  111. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/src/ffbb_data_client/helpers/http_requests_helper.py +0 -0
  112. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/src/ffbb_data_client/helpers/http_requests_utils.py +0 -0
  113. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/src/ffbb_data_client/helpers/meilisearch_client_extension.py +0 -0
  114. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/src/ffbb_data_client/helpers/multi_search_query_helper.py +0 -0
  115. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/src/ffbb_data_client/helpers/normalization.py +0 -0
  116. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/src/ffbb_data_client/models/__init__.py +0 -0
  117. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/src/ffbb_data_client/models/affiche.py +0 -0
  118. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/src/ffbb_data_client/models/cartographie.py +0 -0
  119. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/src/ffbb_data_client/models/categorie.py +0 -0
  120. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/src/ffbb_data_client/models/categorie_type.py +0 -0
  121. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/src/ffbb_data_client/models/clock.py +0 -0
  122. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/src/ffbb_data_client/models/club_contacts.py +0 -0
  123. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/src/ffbb_data_client/models/code.py +0 -0
  124. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/src/ffbb_data_client/models/commune.py +0 -0
  125. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/src/ffbb_data_client/models/competition_fields.py +0 -0
  126. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/src/ffbb_data_client/models/competition_id.py +0 -0
  127. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/src/ffbb_data_client/models/competition_id_categorie.py +0 -0
  128. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/src/ffbb_data_client/models/competition_id_sexe.py +0 -0
  129. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/src/ffbb_data_client/models/competition_id_type_competition.py +0 -0
  130. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/src/ffbb_data_client/models/competition_id_type_competition_generique.py +0 -0
  131. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/src/ffbb_data_client/models/competition_origine.py +0 -0
  132. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/src/ffbb_data_client/models/competition_origine_categorie.py +0 -0
  133. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/src/ffbb_data_client/models/competition_origine_type_competition.py +0 -0
  134. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/src/ffbb_data_client/models/competition_origine_type_competition_generique.py +0 -0
  135. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/src/ffbb_data_client/models/competition_type.py +0 -0
  136. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/src/ffbb_data_client/models/competitions_facet_distribution.py +0 -0
  137. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/src/ffbb_data_client/models/competitions_facet_stats.py +0 -0
  138. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/src/ffbb_data_client/models/competitions_hit.py +0 -0
  139. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/src/ffbb_data_client/models/competitions_multi_search_query.py +0 -0
  140. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/src/ffbb_data_client/models/competitions_query.py +0 -0
  141. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/src/ffbb_data_client/models/configuration_models.py +0 -0
  142. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/src/ffbb_data_client/models/contact_info.py +0 -0
  143. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/src/ffbb_data_client/models/content_multi_search_query.py +0 -0
  144. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/src/ffbb_data_client/models/coordonnees.py +0 -0
  145. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/src/ffbb_data_client/models/coordonnees_type.py +0 -0
  146. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/src/ffbb_data_client/models/document_flyer.py +0 -0
  147. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/src/ffbb_data_client/models/document_flyer_type.py +0 -0
  148. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/src/ffbb_data_client/models/engagement_contacts.py +0 -0
  149. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/src/ffbb_data_client/models/engagements_facet_distribution.py +0 -0
  150. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/src/ffbb_data_client/models/engagements_facet_stats.py +0 -0
  151. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/src/ffbb_data_client/models/engagements_hit.py +0 -0
  152. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/src/ffbb_data_client/models/engagements_multi_search_query.py +0 -0
  153. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/src/ffbb_data_client/models/etat.py +0 -0
  154. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/src/ffbb_data_client/models/external_competition_id.py +0 -0
  155. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/src/ffbb_data_client/models/external_id.py +0 -0
  156. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/src/ffbb_data_client/models/facet_distribution.py +0 -0
  157. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/src/ffbb_data_client/models/facet_stats.py +0 -0
  158. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/src/ffbb_data_client/models/field_set.py +0 -0
  159. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/src/ffbb_data_client/models/folder.py +0 -0
  160. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/src/ffbb_data_client/models/formation_session.py +0 -0
  161. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/src/ffbb_data_client/models/formations_facet_distribution.py +0 -0
  162. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/src/ffbb_data_client/models/formations_facet_stats.py +0 -0
  163. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/src/ffbb_data_client/models/formations_hit.py +0 -0
  164. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/src/ffbb_data_client/models/formations_multi_search_query.py +0 -0
  165. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/src/ffbb_data_client/models/game_stats_model.py +0 -0
  166. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/src/ffbb_data_client/models/game_stats_models.py +0 -0
  167. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/src/ffbb_data_client/models/generic_search.py +0 -0
  168. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/src/ffbb_data_client/models/geo.py +0 -0
  169. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/src/ffbb_data_client/models/geo_sort_order.py +0 -0
  170. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/src/ffbb_data_client/models/get_commune_response.py +0 -0
  171. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/src/ffbb_data_client/models/get_competition_response.py +0 -0
  172. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/src/ffbb_data_client/models/get_configuration_response.py +0 -0
  173. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/src/ffbb_data_client/models/get_engagement_response.py +0 -0
  174. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/src/ffbb_data_client/models/get_entraineur_response.py +0 -0
  175. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/src/ffbb_data_client/models/get_formation_response.py +0 -0
  176. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/src/ffbb_data_client/models/get_officiel_response.py +0 -0
  177. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/src/ffbb_data_client/models/get_organisme_response.py +0 -0
  178. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/src/ffbb_data_client/models/get_poule_response.py +0 -0
  179. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/src/ffbb_data_client/models/get_pratique_response.py +0 -0
  180. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/src/ffbb_data_client/models/get_rencontre_response.py +0 -0
  181. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/src/ffbb_data_client/models/get_saisons_response.py +0 -0
  182. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/src/ffbb_data_client/models/get_salle_response.py +0 -0
  183. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/src/ffbb_data_client/models/get_terrain_response.py +0 -0
  184. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/src/ffbb_data_client/models/get_tournoi_response.py +0 -0
  185. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/src/ffbb_data_client/models/gradient_color.py +0 -0
  186. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/src/ffbb_data_client/models/hit.py +0 -0
  187. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/src/ffbb_data_client/models/id_engagement_equipe.py +0 -0
  188. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/src/ffbb_data_client/models/id_organisme_equipe.py +0 -0
  189. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/src/ffbb_data_client/models/id_organisme_equipe1_logo.py +0 -0
  190. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/src/ffbb_data_client/models/id_poule.py +0 -0
  191. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/src/ffbb_data_client/models/jour.py +0 -0
  192. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/src/ffbb_data_client/models/label.py +0 -0
  193. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/src/ffbb_data_client/models/labellisation.py +0 -0
  194. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/src/ffbb_data_client/models/live.py +0 -0
  195. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/src/ffbb_data_client/models/lives.py +0 -0
  196. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/src/ffbb_data_client/models/logo.py +0 -0
  197. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/src/ffbb_data_client/models/multi_search_queries.py +0 -0
  198. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/src/ffbb_data_client/models/multi_search_query.py +0 -0
  199. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/src/ffbb_data_client/models/multi_search_result_competitions.py +0 -0
  200. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/src/ffbb_data_client/models/multi_search_result_engagements.py +0 -0
  201. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/src/ffbb_data_client/models/multi_search_result_formations.py +0 -0
  202. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/src/ffbb_data_client/models/multi_search_result_organismes.py +0 -0
  203. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/src/ffbb_data_client/models/multi_search_result_pratiques.py +0 -0
  204. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/src/ffbb_data_client/models/multi_search_result_rencontres.py +0 -0
  205. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/src/ffbb_data_client/models/multi_search_result_salles.py +0 -0
  206. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/src/ffbb_data_client/models/multi_search_result_terrains.py +0 -0
  207. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/src/ffbb_data_client/models/multi_search_result_tournois.py +0 -0
  208. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/src/ffbb_data_client/models/multi_search_results.py +0 -0
  209. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/src/ffbb_data_client/models/multi_search_results_class.py +0 -0
  210. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/src/ffbb_data_client/models/nature_sol.py +0 -0
  211. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/src/ffbb_data_client/models/niveau.py +0 -0
  212. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/src/ffbb_data_client/models/niveau_class.py +0 -0
  213. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/src/ffbb_data_client/models/niveau_info.py +0 -0
  214. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/src/ffbb_data_client/models/niveau_models.py +0 -0
  215. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/src/ffbb_data_client/models/niveau_type.py +0 -0
  216. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/src/ffbb_data_client/models/objectif.py +0 -0
  217. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/src/ffbb_data_client/models/organisateur.py +0 -0
  218. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/src/ffbb_data_client/models/organisateur_type.py +0 -0
  219. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/src/ffbb_data_client/models/organisme_fields.py +0 -0
  220. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/src/ffbb_data_client/models/organisme_id_pere.py +0 -0
  221. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/src/ffbb_data_client/models/organismes_facet_distribution.py +0 -0
  222. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/src/ffbb_data_client/models/organismes_facet_stats.py +0 -0
  223. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/src/ffbb_data_client/models/organismes_hit.py +0 -0
  224. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/src/ffbb_data_client/models/organismes_multi_search_query.py +0 -0
  225. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/src/ffbb_data_client/models/organismes_query.py +0 -0
  226. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/src/ffbb_data_client/models/phase_code.py +0 -0
  227. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/src/ffbb_data_client/models/poule.py +0 -0
  228. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/src/ffbb_data_client/models/poule_fields.py +0 -0
  229. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/src/ffbb_data_client/models/poule_rencontre_item_model.py +0 -0
  230. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/src/ffbb_data_client/models/poules_models.py +0 -0
  231. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/src/ffbb_data_client/models/poules_query.py +0 -0
  232. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/src/ffbb_data_client/models/pratique.py +0 -0
  233. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/src/ffbb_data_client/models/pratiques_facet_distribution.py +0 -0
  234. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/src/ffbb_data_client/models/pratiques_facet_stats.py +0 -0
  235. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/src/ffbb_data_client/models/pratiques_hit.py +0 -0
  236. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/src/ffbb_data_client/models/pratiques_hit_type.py +0 -0
  237. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/src/ffbb_data_client/models/pratiques_multi_search_query.py +0 -0
  238. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/src/ffbb_data_client/models/pratiques_type_class.py +0 -0
  239. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/src/ffbb_data_client/models/publication_internet.py +0 -0
  240. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/src/ffbb_data_client/models/purple_logo.py +0 -0
  241. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/src/ffbb_data_client/models/query_fields_manager.py +0 -0
  242. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/src/ffbb_data_client/models/ranking_engagement.py +0 -0
  243. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/src/ffbb_data_client/models/rankings_models.py +0 -0
  244. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/src/ffbb_data_client/models/rencontres_engagement.py +0 -0
  245. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/src/ffbb_data_client/models/rencontres_facet_distribution.py +0 -0
  246. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/src/ffbb_data_client/models/rencontres_facet_stats.py +0 -0
  247. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/src/ffbb_data_client/models/rencontres_hit.py +0 -0
  248. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/src/ffbb_data_client/models/rencontres_multi_search_query.py +0 -0
  249. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/src/ffbb_data_client/models/saison.py +0 -0
  250. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/src/ffbb_data_client/models/saison_fields.py +0 -0
  251. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/src/ffbb_data_client/models/saisons_models.py +0 -0
  252. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/src/ffbb_data_client/models/saisons_query.py +0 -0
  253. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/src/ffbb_data_client/models/salle.py +0 -0
  254. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/src/ffbb_data_client/models/salles_facet_distribution.py +0 -0
  255. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/src/ffbb_data_client/models/salles_facet_stats.py +0 -0
  256. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/src/ffbb_data_client/models/salles_hit.py +0 -0
  257. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/src/ffbb_data_client/models/salles_multi_search_query.py +0 -0
  258. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/src/ffbb_data_client/models/sexe.py +0 -0
  259. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/src/ffbb_data_client/models/sexe_class.py +0 -0
  260. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/src/ffbb_data_client/models/source.py +0 -0
  261. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/src/ffbb_data_client/models/status.py +0 -0
  262. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/src/ffbb_data_client/models/team_engagement.py +0 -0
  263. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/src/ffbb_data_client/models/team_ranking.py +0 -0
  264. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/src/ffbb_data_client/models/terrains_categorie_championnat_3x3_libelle.py +0 -0
  265. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/src/ffbb_data_client/models/terrains_facet_distribution.py +0 -0
  266. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/src/ffbb_data_client/models/terrains_facet_stats.py +0 -0
  267. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/src/ffbb_data_client/models/terrains_hit.py +0 -0
  268. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/src/ffbb_data_client/models/terrains_multi_search_query.py +0 -0
  269. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/src/ffbb_data_client/models/terrains_name.py +0 -0
  270. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/src/ffbb_data_client/models/terrains_sexe_enum.py +0 -0
  271. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/src/ffbb_data_client/models/terrains_storage.py +0 -0
  272. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/src/ffbb_data_client/models/tournoi_type_class.py +0 -0
  273. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/src/ffbb_data_client/models/tournoi_type_enum.py +0 -0
  274. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/src/ffbb_data_client/models/tournoi_types_3x3.py +0 -0
  275. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/src/ffbb_data_client/models/tournoi_types_3x3_libelle.py +0 -0
  276. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/src/ffbb_data_client/models/tournoi_types_3x3_libelle_enum.py +0 -0
  277. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/src/ffbb_data_client/models/tournois_facet_distribution.py +0 -0
  278. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/src/ffbb_data_client/models/tournois_facet_stats.py +0 -0
  279. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/src/ffbb_data_client/models/tournois_hit.py +0 -0
  280. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/src/ffbb_data_client/models/tournois_hit_type.py +0 -0
  281. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/src/ffbb_data_client/models/tournois_libelle.py +0 -0
  282. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/src/ffbb_data_client/models/tournois_multi_search_query.py +0 -0
  283. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/src/ffbb_data_client/models/type_association.py +0 -0
  284. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/src/ffbb_data_client/models/type_association_libelle.py +0 -0
  285. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/src/ffbb_data_client/models/type_class.py +0 -0
  286. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/src/ffbb_data_client/models/type_competition.py +0 -0
  287. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/src/ffbb_data_client/models/type_competition_generique.py +0 -0
  288. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/src/ffbb_data_client/models/type_enum.py +0 -0
  289. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/src/ffbb_data_client/models/type_league.py +0 -0
  290. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/src/ffbb_data_client/py.typed +0 -0
  291. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/src/ffbb_data_client/utils/__init__.py +0 -0
  292. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/src/ffbb_data_client/utils/cache_manager.py +0 -0
  293. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/src/ffbb_data_client/utils/concurrency_utils.py +0 -0
  294. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/src/ffbb_data_client/utils/converter_utils.py +0 -0
  295. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/src/ffbb_data_client/utils/input_validation.py +0 -0
  296. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/src/ffbb_data_client/utils/retry_utils.py +0 -0
  297. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/src/ffbb_data_client/utils/secure_logging.py +0 -0
  298. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/src/ffbb_data_client/utils/token_manager.py +0 -0
  299. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/src/ffbb_data_client.egg-info/dependency_links.txt +0 -0
  300. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/src/ffbb_data_client.egg-info/not-zip-safe +0 -0
  301. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/src/ffbb_data_client.egg-info/requires.txt +0 -0
  302. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/src/ffbb_data_client.egg-info/top_level.txt +0 -0
  303. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/tests/conftest.py +0 -0
  304. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/tests/e2e/__init__.py +0 -0
  305. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/tests/e2e/conftest.py +0 -0
  306. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/tests/integration/__init__.py +0 -0
  307. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/tests/integration/conftest.py +0 -0
  308. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/tests/integration/test_500_user_journey.py +0 -0
  309. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/tests/integration/test_501_user_journey_v3.py +0 -0
  310. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/tests/integration/test_502_enhanced_integration.py +0 -0
  311. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/tests/integration/test_503_secure_logging.py +0 -0
  312. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/tests/integration/test_504_input_validation.py +0 -0
  313. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/tests/integration/test_505_retry_timeout.py +0 -0
  314. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/tests/integration/test_506_raw_json_model_conversion.py +0 -0
  315. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/tests/unit/__init__.py +0 -0
  316. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/tests/unit/clients/__init__.py +0 -0
  317. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/tests/unit/clients/test_200_api_ffbb_app_client.py +0 -0
  318. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/tests/unit/clients/test_201_unit_tests_core.py +0 -0
  319. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/tests/unit/clients/test_202_meilisearch_client.py +0 -0
  320. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/tests/unit/clients/test_203_meilisearch_client_extension.py +0 -0
  321. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/tests/unit/clients/test_204_ffbb_data_client.py +0 -0
  322. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/tests/unit/clients/test_205_meilisearch_ffbb_client.py +0 -0
  323. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/tests/unit/clients/test_206_coverage_gaps_clients.py +0 -0
  324. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/tests/unit/clients/test_207_coverage_clients_extended.py +0 -0
  325. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/tests/unit/clients/test_208_new_methods_coverage.py +0 -0
  326. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/tests/unit/clients/test_209_automatic_token_resolution.py +0 -0
  327. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/tests/unit/clients/test_210_targeted_clients_helpers_coverage.py +0 -0
  328. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/tests/unit/clients/test_api_optimizations.py +0 -0
  329. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/tests/unit/clients/test_async_methods.py +0 -0
  330. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/tests/unit/clients/test_meilisearch_async.py +0 -0
  331. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/tests/unit/clients/test_search_many.py +0 -0
  332. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/tests/unit/clients/test_v2_backport_search.py +0 -0
  333. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/tests/unit/clients/test_v3_new_features.py +0 -0
  334. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/tests/unit/clients/test_warm_cache.py +0 -0
  335. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/tests/unit/conftest.py +0 -0
  336. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/tests/unit/helpers/__init__.py +0 -0
  337. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/tests/unit/helpers/test_400_http_helpers.py +0 -0
  338. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/tests/unit/helpers/test_meilisearch_client_extension_recursive_pagination.py +0 -0
  339. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/tests/unit/helpers/test_meilisearch_pagination_concurrent.py +0 -0
  340. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/tests/unit/helpers/test_normalization.py +0 -0
  341. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/tests/unit/models/__init__.py +0 -0
  342. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/tests/unit/models/test_100_competition_id_categorie.py +0 -0
  343. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/tests/unit/models/test_101_competition_id_sexe.py +0 -0
  344. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/tests/unit/models/test_102_competition_id_type_competition.py +0 -0
  345. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/tests/unit/models/test_103_competition_id_type_competition_generique.py +0 -0
  346. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/tests/unit/models/test_104_competition_origine_categorie.py +0 -0
  347. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/tests/unit/models/test_105_competition_origine_type_competition_generique.py +0 -0
  348. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/tests/unit/models/test_106_competition_origine.py +0 -0
  349. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/tests/unit/models/test_107_id_engagement_equipe.py +0 -0
  350. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/tests/unit/models/test_108_id_organisme_equipe.py +0 -0
  351. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/tests/unit/models/test_109_id_organisme_equipe1_logo.py +0 -0
  352. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/tests/unit/models/test_110_labellisation.py +0 -0
  353. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/tests/unit/models/test_111_niveau_class.py +0 -0
  354. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/tests/unit/models/test_112_purple_logo.py +0 -0
  355. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/tests/unit/models/test_113_salle.py +0 -0
  356. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/tests/unit/models/test_114_tournoi_type_class.py +0 -0
  357. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/tests/unit/models/test_115_type_association_libelle.py +0 -0
  358. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/tests/unit/models/test_116_type_competition_generique.py +0 -0
  359. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/tests/unit/models/test_117_organisateur.py +0 -0
  360. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/tests/unit/models/test_118_competition_id.py +0 -0
  361. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/tests/unit/models/test_119_terrains_inner_models.py +0 -0
  362. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/tests/unit/models/test_120_pratiques_inner_models.py +0 -0
  363. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/tests/unit/models/test_121_to_dict_round_trip.py +0 -0
  364. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/tests/unit/models/test_122_coverage_gaps.py +0 -0
  365. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/tests/unit/models/test_123_missing_coverage.py +0 -0
  366. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/tests/unit/models/test_123_v2_backport.py +0 -0
  367. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/tests/unit/models/test_124_targeted_coverage_gains.py +0 -0
  368. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/tests/unit/models/test_dx_aliases.py +0 -0
  369. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/tests/unit/test_310_discover_endpoints.py +0 -0
  370. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/tests/unit/test_311_normalize_team_name.py +0 -0
  371. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/tests/unit/utils/__init__.py +0 -0
  372. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/tests/unit/utils/test_300_secure_logging.py +0 -0
  373. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/tests/unit/utils/test_301_input_validation.py +0 -0
  374. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/tests/unit/utils/test_302_retry_utils.py +0 -0
  375. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/tests/unit/utils/test_303_cache_manager.py +0 -0
  376. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/tests/unit/utils/test_304_config.py +0 -0
  377. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/tests/unit/utils/test_305_token_manager.py +0 -0
  378. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/tests/unit/utils/test_306_converter_utils.py +0 -0
  379. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/tests/unit/utils/test_307_coverage_gaps_utils.py +0 -0
  380. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/tests/unit/utils/test_308_converter_utils_extended.py +0 -0
  381. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/tests/unit/utils/test_309_concurrency_utils.py +0 -0
  382. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/tools/update_agents_md.py +0 -0
  383. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/tox.ini +0 -0
  384. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/website/assets/apple-touch-icon.png +0 -0
  385. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/website/assets/favicon-192x192.png +0 -0
  386. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/website/assets/favicon-48x48.png +0 -0
  387. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/website/assets/favicon-96x96.png +0 -0
  388. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/website/assets/favicon.ico +0 -0
  389. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/website/assets/logo.webp +0 -0
  390. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/website/css/style.css +0 -0
  391. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/website/favicon.ico +0 -0
  392. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/website/index.html +0 -0
  393. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/website/llms-full.txt +0 -0
  394. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/website/llms.txt +0 -0
  395. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/website/robots.txt +0 -0
  396. {ffbb_data_client-2.4.17 → ffbb_data_client-2.4.18}/website/sitemap.xml +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: ffbb-data-client
3
- Version: 2.4.17
3
+ Version: 2.4.18
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
@@ -22,6 +22,7 @@ from .exceptions import (
22
22
  )
23
23
  from .helpers.meilisearch_client_extension import MeilisearchClientExtension
24
24
  from .helpers.multi_search_query_helper import generate_queries
25
+ from .models.categorie_type import CategorieType
25
26
  from .models.club_contacts import ClubContacts
26
27
  from .models.competitions_facet_distribution import CompetitionsFacetDistribution
27
28
  from .models.competitions_facet_stats import CompetitionsFacetStats
@@ -55,6 +56,9 @@ from .models.multi_search_result_rencontres import RencontresMultiSearchResult
55
56
  from .models.multi_search_result_salles import SallesMultiSearchResult
56
57
  from .models.multi_search_result_terrains import TerrainsMultiSearchResult
57
58
  from .models.multi_search_result_tournois import TournoisMultiSearchResult
59
+ from .models.niveau_extractor import NiveauExtractor, get_niveau_from_idcompetition
60
+ from .models.niveau_info import NiveauInfo
61
+ from .models.niveau_type import NiveauType
58
62
  from .models.organismes_facet_distribution import OrganismesFacetDistribution
59
63
  from .models.organismes_facet_stats import OrganismesFacetStats
60
64
  from .models.organismes_hit import OrganismesHit
@@ -169,6 +173,12 @@ __all__ = [
169
173
  "FFBBTokens",
170
174
  "TokenManager",
171
175
  "gather_with_concurrency",
176
+ # Extraction & Helpers
177
+ "NiveauExtractor",
178
+ "NiveauInfo",
179
+ "NiveauType",
180
+ "CategorieType",
181
+ "get_niveau_from_idcompetition",
172
182
  ]
173
183
 
174
184
  from importlib.metadata import PackageNotFoundError, version
@@ -1,6 +1,7 @@
1
1
  from __future__ import annotations
2
2
 
3
3
  import asyncio
4
+ from collections.abc import AsyncIterator
4
5
  from typing import Any
5
6
 
6
7
  import httpx
@@ -219,6 +220,18 @@ class ListAllMixin:
219
220
  list_all_pratiques: Any
220
221
  list_all_pratiques_async: Any
221
222
 
223
+ # Method stubs for dynamically generated aiter_all generators
224
+ aiter_all_rencontres: Any
225
+ aiter_all_salles: Any
226
+ aiter_all_terrains: Any
227
+ aiter_all_tournois: Any
228
+ aiter_all_engagements: Any
229
+ aiter_all_formations: Any
230
+ aiter_all_entraineurs: Any
231
+ aiter_all_communes: Any
232
+ aiter_all_officiels: Any
233
+ aiter_all_pratiques: Any
234
+
222
235
  async def _list_all_directus_items_async(
223
236
  self,
224
237
  endpoint: str,
@@ -266,6 +279,43 @@ class ListAllMixin:
266
279
  break
267
280
  return results[:max_items]
268
281
 
282
+ async def _aiter_all_directus_items(
283
+ self,
284
+ endpoint: str,
285
+ model_cls: type,
286
+ filter_criteria: str | None = None,
287
+ sort: list[str] | None = None,
288
+ search: str | None = None,
289
+ page_size: int = 100,
290
+ max_items: int = 10000,
291
+ cached_session: httpx.AsyncClient | None = None,
292
+ ) -> AsyncIterator[Any]:
293
+ """Streaming async generator: yields items one by one across paginated Directus requests."""
294
+ offset = 0
295
+ yielded = 0
296
+ while yielded < max_items:
297
+ current_limit = min(page_size, max_items - yielded)
298
+ batch = await self._list_directus_items_async(
299
+ endpoint,
300
+ limit=current_limit,
301
+ filter_criteria=filter_criteria,
302
+ sort=sort,
303
+ offset=offset,
304
+ search=search,
305
+ cached_session=self.async_cached_session,
306
+ )
307
+ if not batch:
308
+ break
309
+ for r in batch:
310
+ if r:
311
+ yield model_cls.from_dict(r) # type: ignore[attr-defined]
312
+ yielded += 1
313
+ if yielded >= max_items:
314
+ return
315
+ if len(batch) < current_limit:
316
+ break
317
+ offset += len(batch)
318
+
269
319
  def _list_all(
270
320
  self,
271
321
  endpoint: str,
@@ -341,8 +391,38 @@ def _make_list_all_method(endpoint: str, model_cls: Any, name: str) -> tuple[Any
341
391
  return list_all_method, list_all_method_async
342
392
 
343
393
 
394
+ def _make_aiter_all_method(endpoint: str, model_cls: Any, name: str) -> Any:
395
+ """Factory: creates async aiter_all_X generator on ListAllMixin."""
396
+
397
+ def aiter_all_method(
398
+ self: Any,
399
+ filter_criteria: str | None = None,
400
+ sort: list[str] | None = None,
401
+ search: str | None = None,
402
+ page_size: int = 100,
403
+ max_items: int = 10000,
404
+ cached_session: httpx.AsyncClient | None = None,
405
+ ) -> AsyncIterator[Any]:
406
+ return self._aiter_all_directus_items( # type: ignore[no-any-return]
407
+ endpoint,
408
+ model_cls,
409
+ filter_criteria=filter_criteria,
410
+ sort=sort,
411
+ search=search,
412
+ page_size=page_size,
413
+ max_items=max_items,
414
+ cached_session=cached_session,
415
+ )
416
+
417
+ aiter_all_method.__name__ = name
418
+ aiter_all_method.__qualname__ = f"ListAllMixin.{name}"
419
+ return aiter_all_method
420
+
421
+
344
422
  for _name, _cls in _LIST_ENDPOINTS.items():
345
423
  _endpoint = _ENDPOINT_MODULES[_name]
346
424
  _sync, _async = _make_list_all_method(_endpoint, _cls, f"list_all_{_name}")
347
425
  setattr(ListAllMixin, f"list_all_{_name}", _sync)
348
426
  setattr(ListAllMixin, f"list_all_{_name}_async", _async)
427
+ _aiter = _make_aiter_all_method(_endpoint, _cls, f"aiter_all_{_name}")
428
+ setattr(ListAllMixin, f"aiter_all_{_name}", _aiter)
@@ -2,6 +2,7 @@ from __future__ import annotations
2
2
 
3
3
  import asyncio
4
4
  import json
5
+ from collections.abc import AsyncIterator
5
6
  from typing import Any
6
7
 
7
8
  import httpx
@@ -208,6 +209,27 @@ class _RestFacade:
208
209
  organisme=organisme, club_contact=club_contact, membres=membres
209
210
  )
210
211
 
212
+ async def get_club_contacts_async(
213
+ self,
214
+ organisme_id: int,
215
+ cached_session: httpx.AsyncClient | None = None,
216
+ ) -> ClubContacts | None:
217
+ """Async version: return club contact information (club-level + membres) for an organisme.
218
+
219
+ This method delegates to `get_organisme_async()` and uses the extractor helpers
220
+ to produce a compact `ClubContacts` object.
221
+ """
222
+ organisme = await self.get_organisme_async(
223
+ organisme_id, cached_session=cached_session
224
+ )
225
+ if not organisme:
226
+ return None
227
+ club_contact = extract_club_info(organisme)
228
+ membres = extract_membres_contacts(organisme)
229
+ return ClubContacts(
230
+ organisme=organisme, club_contact=club_contact, membres=membres
231
+ )
232
+
211
233
  def get_poule(
212
234
  self,
213
235
  poule_id: int,
@@ -1666,6 +1688,220 @@ class _RestFacade:
1666
1688
  cached_session=cached_session,
1667
1689
  )
1668
1690
 
1691
+ # ------------------------------------------------------------------
1692
+ # Streaming async generators (aiter_all_*)
1693
+ # ------------------------------------------------------------------
1694
+
1695
+ def aiter_all_rencontres(
1696
+ self,
1697
+ filter_criteria: str | None = None,
1698
+ sort: list[str] | None = None,
1699
+ search: str | None = None,
1700
+ page_size: int = 100,
1701
+ max_items: int = 10000,
1702
+ cached_session: httpx.AsyncClient | None = None,
1703
+ ) -> AsyncIterator[GetRencontreResponse]:
1704
+ """Streaming async generator for rencontres."""
1705
+ return self._api.aiter_all_rencontres( # type: ignore[no-any-return]
1706
+ filter_criteria=validate_filter_criteria(
1707
+ filter_criteria, "filter_criteria"
1708
+ ),
1709
+ sort=validate_string_list(sort, "sort"),
1710
+ search=validate_search_query(search, "search"),
1711
+ page_size=page_size,
1712
+ max_items=max_items,
1713
+ cached_session=cached_session,
1714
+ )
1715
+
1716
+ def aiter_all_salles(
1717
+ self,
1718
+ filter_criteria: str | None = None,
1719
+ sort: list[str] | None = None,
1720
+ search: str | None = None,
1721
+ page_size: int = 100,
1722
+ max_items: int = 10000,
1723
+ cached_session: httpx.AsyncClient | None = None,
1724
+ ) -> AsyncIterator[GetSalleResponse]:
1725
+ """Streaming async generator for salles."""
1726
+ return self._api.aiter_all_salles( # type: ignore[no-any-return]
1727
+ filter_criteria=validate_filter_criteria(
1728
+ filter_criteria, "filter_criteria"
1729
+ ),
1730
+ sort=validate_string_list(sort, "sort"),
1731
+ search=validate_search_query(search, "search"),
1732
+ page_size=page_size,
1733
+ max_items=max_items,
1734
+ cached_session=cached_session,
1735
+ )
1736
+
1737
+ def aiter_all_terrains(
1738
+ self,
1739
+ filter_criteria: str | None = None,
1740
+ sort: list[str] | None = None,
1741
+ search: str | None = None,
1742
+ page_size: int = 100,
1743
+ max_items: int = 10000,
1744
+ cached_session: httpx.AsyncClient | None = None,
1745
+ ) -> AsyncIterator[GetTerrainResponse]:
1746
+ """Streaming async generator for terrains."""
1747
+ return self._api.aiter_all_terrains( # type: ignore[no-any-return]
1748
+ filter_criteria=validate_filter_criteria(
1749
+ filter_criteria, "filter_criteria"
1750
+ ),
1751
+ sort=validate_string_list(sort, "sort"),
1752
+ search=validate_search_query(search, "search"),
1753
+ page_size=page_size,
1754
+ max_items=max_items,
1755
+ cached_session=cached_session,
1756
+ )
1757
+
1758
+ def aiter_all_tournois(
1759
+ self,
1760
+ filter_criteria: str | None = None,
1761
+ sort: list[str] | None = None,
1762
+ search: str | None = None,
1763
+ page_size: int = 100,
1764
+ max_items: int = 10000,
1765
+ cached_session: httpx.AsyncClient | None = None,
1766
+ ) -> AsyncIterator[GetTournoiResponse]:
1767
+ """Streaming async generator for tournois."""
1768
+ return self._api.aiter_all_tournois( # type: ignore[no-any-return]
1769
+ filter_criteria=validate_filter_criteria(
1770
+ filter_criteria, "filter_criteria"
1771
+ ),
1772
+ sort=validate_string_list(sort, "sort"),
1773
+ search=validate_search_query(search, "search"),
1774
+ page_size=page_size,
1775
+ max_items=max_items,
1776
+ cached_session=cached_session,
1777
+ )
1778
+
1779
+ def aiter_all_engagements(
1780
+ self,
1781
+ filter_criteria: str | None = None,
1782
+ sort: list[str] | None = None,
1783
+ search: str | None = None,
1784
+ page_size: int = 100,
1785
+ max_items: int = 10000,
1786
+ cached_session: httpx.AsyncClient | None = None,
1787
+ ) -> AsyncIterator[GetEngagementResponse]:
1788
+ """Streaming async generator for engagements."""
1789
+ return self._api.aiter_all_engagements( # type: ignore[no-any-return]
1790
+ filter_criteria=validate_filter_criteria(
1791
+ filter_criteria, "filter_criteria"
1792
+ ),
1793
+ sort=validate_string_list(sort, "sort"),
1794
+ search=validate_search_query(search, "search"),
1795
+ page_size=page_size,
1796
+ max_items=max_items,
1797
+ cached_session=cached_session,
1798
+ )
1799
+
1800
+ def aiter_all_formations(
1801
+ self,
1802
+ filter_criteria: str | None = None,
1803
+ sort: list[str] | None = None,
1804
+ search: str | None = None,
1805
+ page_size: int = 100,
1806
+ max_items: int = 10000,
1807
+ cached_session: httpx.AsyncClient | None = None,
1808
+ ) -> AsyncIterator[GetFormationResponse]:
1809
+ """Streaming async generator for formations."""
1810
+ return self._api.aiter_all_formations( # type: ignore[no-any-return]
1811
+ filter_criteria=validate_filter_criteria(
1812
+ filter_criteria, "filter_criteria"
1813
+ ),
1814
+ sort=validate_string_list(sort, "sort"),
1815
+ search=validate_search_query(search, "search"),
1816
+ page_size=page_size,
1817
+ max_items=max_items,
1818
+ cached_session=cached_session,
1819
+ )
1820
+
1821
+ def aiter_all_entraineurs(
1822
+ self,
1823
+ filter_criteria: str | None = None,
1824
+ sort: list[str] | None = None,
1825
+ search: str | None = None,
1826
+ page_size: int = 100,
1827
+ max_items: int = 10000,
1828
+ cached_session: httpx.AsyncClient | None = None,
1829
+ ) -> AsyncIterator[GetEntraineurResponse]:
1830
+ """Streaming async generator for entraineurs."""
1831
+ return self._api.aiter_all_entraineurs( # type: ignore[no-any-return]
1832
+ filter_criteria=validate_filter_criteria(
1833
+ filter_criteria, "filter_criteria"
1834
+ ),
1835
+ sort=validate_string_list(sort, "sort"),
1836
+ search=validate_search_query(search, "search"),
1837
+ page_size=page_size,
1838
+ max_items=max_items,
1839
+ cached_session=cached_session,
1840
+ )
1841
+
1842
+ def aiter_all_communes(
1843
+ self,
1844
+ filter_criteria: str | None = None,
1845
+ sort: list[str] | None = None,
1846
+ search: str | None = None,
1847
+ page_size: int = 100,
1848
+ max_items: int = 10000,
1849
+ cached_session: httpx.AsyncClient | None = None,
1850
+ ) -> AsyncIterator[GetCommuneResponse]:
1851
+ """Streaming async generator for communes."""
1852
+ return self._api.aiter_all_communes( # type: ignore[no-any-return]
1853
+ filter_criteria=validate_filter_criteria(
1854
+ filter_criteria, "filter_criteria"
1855
+ ),
1856
+ sort=validate_string_list(sort, "sort"),
1857
+ search=validate_search_query(search, "search"),
1858
+ page_size=page_size,
1859
+ max_items=max_items,
1860
+ cached_session=cached_session,
1861
+ )
1862
+
1863
+ def aiter_all_officiels(
1864
+ self,
1865
+ filter_criteria: str | None = None,
1866
+ sort: list[str] | None = None,
1867
+ search: str | None = None,
1868
+ page_size: int = 100,
1869
+ max_items: int = 10000,
1870
+ cached_session: httpx.AsyncClient | None = None,
1871
+ ) -> AsyncIterator[GetOfficielResponse]:
1872
+ """Streaming async generator for officiels."""
1873
+ return self._api.aiter_all_officiels( # type: ignore[no-any-return]
1874
+ filter_criteria=validate_filter_criteria(
1875
+ filter_criteria, "filter_criteria"
1876
+ ),
1877
+ sort=validate_string_list(sort, "sort"),
1878
+ search=validate_search_query(search, "search"),
1879
+ page_size=page_size,
1880
+ max_items=max_items,
1881
+ cached_session=cached_session,
1882
+ )
1883
+
1884
+ def aiter_all_pratiques(
1885
+ self,
1886
+ filter_criteria: str | None = None,
1887
+ sort: list[str] | None = None,
1888
+ search: str | None = None,
1889
+ page_size: int = 100,
1890
+ max_items: int = 10000,
1891
+ cached_session: httpx.AsyncClient | None = None,
1892
+ ) -> AsyncIterator[GetPratiqueResponse]:
1893
+ """Streaming async generator for pratiques."""
1894
+ return self._api.aiter_all_pratiques( # type: ignore[no-any-return]
1895
+ filter_criteria=validate_filter_criteria(
1896
+ filter_criteria, "filter_criteria"
1897
+ ),
1898
+ sort=validate_string_list(sort, "sort"),
1899
+ search=validate_search_query(search, "search"),
1900
+ page_size=page_size,
1901
+ max_items=max_items,
1902
+ cached_session=cached_session,
1903
+ )
1904
+
1669
1905
  # ------------------------------------------------------------------
1670
1906
  # Batch helpers
1671
1907
  # ------------------------------------------------------------------
@@ -31,31 +31,39 @@ class NiveauExtractor:
31
31
  NiveauType.REGIONAL: [
32
32
  re.compile(r"\bREGIONAL\b"),
33
33
  re.compile(r"\bRÉGIONAL\b"),
34
+ re.compile(r"\bREGIONALE\b"),
35
+ re.compile(r"\bRÉGIONALE\b"),
34
36
  re.compile(r"\bR1\b"),
35
37
  re.compile(r"\bR2\b"),
36
38
  re.compile(r"\bR3\b"),
37
- re.compile(r"\bREGIONALE\b"),
38
- re.compile(r"^RÉGIONALE\b"), # Format simple: "Régionale masculine seniors"
39
+ re.compile(r"\bPRE\s*REGIONAL\b"),
40
+ re.compile(r"\bPRÉ\s*RÉGIONAL\b"),
39
41
  ],
40
42
  NiveauType.DEPARTEMENTAL: [
41
43
  re.compile(r"\bDEPARTEMENTAL\b"),
42
44
  re.compile(r"\bDÉPARTEMENTAL\b"),
45
+ re.compile(r"\bDEPARTEMENTALE\b"),
46
+ re.compile(r"\bDÉPARTEMENTALE\b"),
43
47
  re.compile(r"\bD1\b"),
44
48
  re.compile(r"\bD2\b"),
45
49
  re.compile(r"\bD3\b"),
46
- re.compile(r"\bDEPARTEMENTALE\b"),
47
- re.compile(
48
- r"^DÉPARTEMENTALE\b"
49
- ), # Format simple: "Départementale masculine seniors"
50
+ re.compile(r"\bD4\b"),
51
+ re.compile(r"\bD5\b"),
50
52
  ],
51
53
  }
52
54
 
53
55
  # Patterns pour extraire les numéros de division
54
56
  DIVISION_PATTERNS = [
55
- re.compile(r"\b[DR](\d+)\b"), # R1, R2, D1, D2, etc.
56
- re.compile(r"\bREGIONAL\s+(\d+)\b"), # REGIONAL 1, REGIONAL 2
57
- re.compile(r"\bDEPARTEMENTAL\s+(\d+)\b"), # DEPARTEMENTAL 1, DEPARTEMENTAL 2
57
+ re.compile(r"\b[DR](\d+)\b"), # R1, R2, D1, D2, N1, etc.
58
+ re.compile(
59
+ r"\bR[ÉE]GIONALE?\s+(\d+)\b"
60
+ ), # REGIONAL 1, REGIONALE 2, RÉGIONALE 2
61
+ re.compile(
62
+ r"\bD[ÉE]PARTEMENTALE?\s+(\d+)\b"
63
+ ), # DEPARTEMENTAL 1, DEPARTEMENTALE 2
64
+ re.compile(r"\bNATIONALE?\s+(\d+)\b"), # NATIONAL 1, NATIONALE 2
58
65
  re.compile(r"-\s*DIVISION\s+(\d+)\b"), # - Division 3, - DIVISION 1
66
+ re.compile(r"\bDIV(?:ISION)?\s*(\d+)\b"), # DIV 1, DIVISION 2
59
67
  ]
60
68
 
61
69
  # Patterns pour les catégories
@@ -182,14 +190,12 @@ class NiveauExtractor:
182
190
  Returns:
183
191
  Objet Niveau ou None
184
192
  """
185
- # Essayer d'abord avec le nom de la compétition
186
193
  nom = competition_data.get("nom", "")
187
194
  niveau = cls.extract_niveau(nom)
188
195
 
189
196
  if niveau:
190
197
  return niveau
191
198
 
192
- # Essayer avec le code de la compétition
193
199
  code = competition_data.get("code", "")
194
200
  if code:
195
201
  niveau = cls.extract_niveau(code)
@@ -197,7 +203,6 @@ class NiveauExtractor:
197
203
  return niveau
198
204
 
199
205
 
200
- # Fonctions utilitaires pour l'analyse
201
206
  def get_niveau_from_idcompetition(idcompetition) -> NiveauInfo | None:
202
207
  """
203
208
  Extrait le niveau depuis un objet IdCompetitionModel.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: ffbb-data-client
3
- Version: 2.4.17
3
+ Version: 2.4.18
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
@@ -333,6 +333,7 @@ tests/unit/clients/test_meilisearch_async.py
333
333
  tests/unit/clients/test_search_many.py
334
334
  tests/unit/clients/test_v2_backport_search.py
335
335
  tests/unit/clients/test_v3_new_features.py
336
+ tests/unit/clients/test_v4_aiter_and_contacts.py
336
337
  tests/unit/clients/test_warm_cache.py
337
338
  tests/unit/helpers/__init__.py
338
339
  tests/unit/helpers/test_400_http_helpers.py
@@ -323,6 +323,7 @@
323
323
  "tests/unit/clients/test_search_many.py",
324
324
  "tests/unit/clients/test_v2_backport_search.py",
325
325
  "tests/unit/clients/test_v3_new_features.py",
326
+ "tests/unit/clients/test_v4_aiter_and_contacts.py",
326
327
  "tests/unit/clients/test_warm_cache.py",
327
328
  "tests/unit/conftest.py",
328
329
  "tests/unit/helpers/__init__.py",
@@ -1,7 +1,7 @@
1
1
  {
2
- "tag": "2.4.17",
2
+ "tag": "2.4.18",
3
3
  "distance": 0,
4
- "node": "ged3eff199bc01a22bce05689b3490d1bb0b4a885",
4
+ "node": "g39d469ef3ba333658f0d405760eebb1bb3641b15",
5
5
  "dirty": false,
6
6
  "branch": "HEAD",
7
7
  "node_date": "2026-09-16"
@@ -0,0 +1,155 @@
1
+ """Tests for v4 features: get_club_contacts_async, aiter_all_* streaming generators, and NiveauExtractor exports."""
2
+
3
+ import httpx
4
+ import pytest
5
+ import respx
6
+
7
+ from ffbb_data_client import (
8
+ CategorieType,
9
+ FFBBDataClient,
10
+ NiveauExtractor,
11
+ NiveauType,
12
+ )
13
+ from ffbb_data_client.clients.api_ffbb_app_client import ApiFFBBAppClient
14
+ from ffbb_data_client.clients.meilisearch_ffbb_client import MeilisearchFFBBClient
15
+
16
+
17
+ # ---------------------------------------------------------------------------
18
+ # Test 1: get_club_contacts_async
19
+ # ---------------------------------------------------------------------------
20
+ @pytest.mark.asyncio
21
+ async def test_get_club_contacts_async():
22
+ """get_club_contacts_async should fetch organisme and return structured ClubContacts."""
23
+ api_client = ApiFFBBAppClient(bearer_token="test-token")
24
+ ms_client = MeilisearchFFBBClient(bearer_token="test-token")
25
+ client = FFBBDataClient(api_client, ms_client)
26
+ organisme_id = 12345
27
+
28
+ with respx.mock:
29
+ respx.get(
30
+ url__startswith=f"https://api.ffbb.app/items/ffbbserver_organismes/{organisme_id}"
31
+ ).respond(
32
+ json={
33
+ "data": {
34
+ "id": str(organisme_id),
35
+ "nom": "BASKET CLUB CLERMONTOIS",
36
+ "code": "ARA0063001",
37
+ "mail": "contact@basket-clermont.fr",
38
+ "telephone": "0473000000",
39
+ "adresse": "12 RUE DU BASKET",
40
+ "membres": [
41
+ {
42
+ "id": "m1",
43
+ "nom": "DUPONT",
44
+ "prenom": "JEAN",
45
+ "codeFonction": "PRESI",
46
+ "mail": "president@basket-clermont.fr",
47
+ "telephoneFixe": "0600000001",
48
+ }
49
+ ],
50
+ }
51
+ }
52
+ )
53
+
54
+ contacts = await client.get_club_contacts_async(organisme_id)
55
+ assert contacts is not None
56
+ assert contacts.organisme is not None
57
+ assert contacts.organisme.nom == "BASKET CLUB CLERMONTOIS"
58
+ assert contacts.club_contact is not None
59
+ assert contacts.club_contact.email == "contact@basket-clermont.fr"
60
+ assert len(contacts.membres) == 1
61
+ assert contacts.membres[0].role == "PRESI"
62
+ assert contacts.membres[0].nom == "Dupont"
63
+ assert contacts.membres[0].prenom == "Jean"
64
+
65
+
66
+ # ---------------------------------------------------------------------------
67
+ # Test 2: aiter_all_rencontres streaming generator
68
+ # ---------------------------------------------------------------------------
69
+ @pytest.mark.asyncio
70
+ async def test_aiter_all_rencontres_streaming():
71
+ """aiter_all_rencontres should stream rencontres across pages with proper termination."""
72
+ api_client = ApiFFBBAppClient(bearer_token="test-token")
73
+ ms_client = MeilisearchFFBBClient(bearer_token="test-token")
74
+ client = FFBBDataClient(api_client, ms_client)
75
+
76
+ with respx.mock:
77
+ # Route handler for paginated rencontres
78
+ def rencontres_callback(request):
79
+ params = dict(request.url.params)
80
+ offset = int(params.get("offset", "0"))
81
+ limit = int(params.get("limit", "2"))
82
+
83
+ all_data = [
84
+ {"id": "r1", "nom": "Match 1", "numero": "101"},
85
+ {"id": "r2", "nom": "Match 2", "numero": "102"},
86
+ {"id": "r3", "nom": "Match 3", "numero": "103"},
87
+ ]
88
+ page_data = all_data[offset : offset + limit]
89
+ return httpx.Response(200, json={"data": page_data})
90
+
91
+ respx.get(
92
+ url__startswith="https://api.ffbb.app/items/ffbbserver_rencontres"
93
+ ).mock(side_effect=rencontres_callback)
94
+
95
+ results = []
96
+ async for rencontre in client.aiter_all_rencontres(page_size=2, max_items=10):
97
+ results.append(rencontre)
98
+
99
+ assert len(results) == 3
100
+ assert results[0].id == "r1"
101
+ assert results[1].id == "r2"
102
+ assert results[2].id == "r3"
103
+
104
+
105
+ # ---------------------------------------------------------------------------
106
+ # Test 3: aiter_all_salles with early break
107
+ # ---------------------------------------------------------------------------
108
+ @pytest.mark.asyncio
109
+ async def test_aiter_all_salles_early_break():
110
+ """aiter_all_salles should support early loop breaking without fetching excess pages."""
111
+ api_client = ApiFFBBAppClient(bearer_token="test-token")
112
+ ms_client = MeilisearchFFBBClient(bearer_token="test-token")
113
+ client = FFBBDataClient(api_client, ms_client)
114
+
115
+ with respx.mock:
116
+ respx.get(
117
+ url__startswith="https://api.ffbb.app/items/ffbbserver_salles"
118
+ ).respond(
119
+ json={
120
+ "data": [
121
+ {"id": "s1", "libelle": "Gymnase A"},
122
+ {"id": "s2", "libelle": "Gymnase B"},
123
+ {"id": "s3", "libelle": "Gymnase C"},
124
+ ]
125
+ }
126
+ )
127
+
128
+ results = []
129
+ async for salle in client.aiter_all_salles(page_size=10):
130
+ results.append(salle)
131
+ if len(results) == 1:
132
+ break
133
+
134
+ assert len(results) == 1
135
+ assert results[0].libelle == "Gymnase A"
136
+
137
+
138
+ # ---------------------------------------------------------------------------
139
+ # Test 4: NiveauExtractor Exports and Logic
140
+ # ---------------------------------------------------------------------------
141
+ def test_niveau_extractor_exports_and_detection():
142
+ """NiveauExtractor should properly extract levels and categories."""
143
+ info_u13 = NiveauExtractor.extract_niveau("U13 MASCULIN RÉGIONALE 2 - POULE A")
144
+ assert info_u13 is not None
145
+ assert info_u13.type == NiveauType.REGIONAL
146
+ assert info_u13.division == 2
147
+ assert info_u13.categorie == CategorieType.U13
148
+
149
+ info_senior_d1 = NiveauExtractor.extract_niveau(
150
+ "DÉPARTEMENTALE MASCULINE SENIORS - DIVISION 1"
151
+ )
152
+ assert info_senior_d1 is not None
153
+ assert info_senior_d1.type == NiveauType.DEPARTEMENTAL
154
+ assert info_senior_d1.division == 1
155
+ assert info_senior_d1.categorie == CategorieType.SENIORS