ffbb-data-client 2.0.2__tar.gz → 2.2.0__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 (349) hide show
  1. {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/.coveragerc +5 -5
  2. ffbb_data_client-2.2.0/.github/dependabot.yml +19 -0
  3. {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/.github/scripts/check_wrapper_parity.py +31 -7
  4. {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/.github/workflows/check_wrapper_parity.yml +2 -2
  5. {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/.github/workflows/ci.yml +7 -1
  6. ffbb_data_client-2.2.0/.github/workflows/codeql.yml +33 -0
  7. {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/.github/workflows/deploy-pages.yml +3 -3
  8. {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/.github/workflows/publish.yml +20 -8
  9. {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/.github/workflows/release-after-discovery-merge.yml +1 -1
  10. {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/.github/workflows/update-ffbb-api-discovery.yml +4 -4
  11. {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/.pre-commit-config.yaml +10 -0
  12. {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/CHANGELOG.md +50 -0
  13. {ffbb_data_client-2.0.2/src/ffbb_data_client.egg-info → ffbb_data_client-2.2.0}/PKG-INFO +32 -22
  14. {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/README.md +29 -19
  15. {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/RELEASE_NOTES.md +26 -1
  16. ffbb_data_client-2.2.0/SECURITY.md +15 -0
  17. {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/docs/conf.py +1 -4
  18. {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/docs/requirements.txt +2 -2
  19. {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/pyproject.toml +1 -0
  20. {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/setup.cfg +2 -2
  21. {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/__init__.py +0 -18
  22. {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/clients/__init__.py +4 -0
  23. ffbb_data_client-2.0.2/src/ffbb_data_client/clients/ffbb_data_client.py → ffbb_data_client-2.2.0/src/ffbb_data_client/clients/_rest_facade.py +396 -1510
  24. ffbb_data_client-2.2.0/src/ffbb_data_client/clients/_search_facade.py +1046 -0
  25. {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/clients/api_ffbb_app_client.py +551 -636
  26. ffbb_data_client-2.2.0/src/ffbb_data_client/clients/ffbb_data_client.py +270 -0
  27. {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/data/__init__.py +6 -3
  28. {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/commune.py +2 -2
  29. {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/get_rencontre_response.py +1 -1
  30. {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/query_fields_manager.py +1 -1
  31. {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/team_ranking.py +1 -0
  32. {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/utils/cache_manager.py +12 -30
  33. {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/utils/retry_utils.py +6 -3
  34. {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0/src/ffbb_data_client.egg-info}/PKG-INFO +32 -22
  35. {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client.egg-info/SOURCES.txt +6 -4
  36. {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client.egg-info/requires.txt +2 -2
  37. ffbb_data_client-2.2.0/src/ffbb_data_client.egg-info/top_level.txt +1 -0
  38. {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/tests/integration/test_502_enhanced_integration.py +2 -2
  39. {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/tests/integration/test_506_raw_json_model_conversion.py +37 -9
  40. {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/tests/unit/clients/test_201_unit_tests_core.py +61 -19
  41. {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/tests/unit/clients/test_207_coverage_clients_extended.py +10 -3
  42. {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/tests/unit/clients/test_208_new_methods_coverage.py +40 -10
  43. {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/tests/unit/clients/test_210_targeted_clients_helpers_coverage.py +23 -12
  44. {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/tests/unit/utils/test_303_cache_manager.py +0 -7
  45. {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/tests/unit/utils/test_307_coverage_gaps_utils.py +0 -24
  46. {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/tox.ini +15 -1
  47. ffbb_data_client-2.0.2/diagnose-ci-issues.sh +0 -243
  48. ffbb_data_client-2.0.2/scratch.py +0 -21
  49. ffbb_data_client-2.0.2/src/ffbb_api_client_v3/__init__.py +0 -25
  50. ffbb_data_client-2.0.2/src/ffbb_data_client.egg-info/top_level.txt +0 -3
  51. {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/.gitignore +0 -0
  52. {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/.isort.cfg +0 -0
  53. {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/.jules/bolt.md +0 -0
  54. {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/.readthedocs.yml +0 -0
  55. {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/AUTHORS.rst +0 -0
  56. {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/CONTRIBUTING.rst +0 -0
  57. {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/LICENSE.txt +0 -0
  58. {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/LOCAL_CI_GUIDE.md +0 -0
  59. {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/data/api.ffbb.app.json +0 -0
  60. {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/data/api_update_summary.md +0 -0
  61. {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/data/collections.json +0 -0
  62. {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/data/endpoint_discovery.json +0 -0
  63. {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/data/indexes.json +0 -0
  64. {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/data/meilisearch-prod.ffbb.app.json +0 -0
  65. {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/data/openapi.json +0 -0
  66. {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/data/openapi_full.json +0 -0
  67. {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/data/type_discovery_corrections.json +0 -0
  68. {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/docs/Makefile +0 -0
  69. {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/docs/_static/.gitignore +0 -0
  70. {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/docs/architecture.rst +0 -0
  71. {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/docs/authors.rst +0 -0
  72. {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/docs/changelog.rst +0 -0
  73. {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/docs/contributing.rst +0 -0
  74. {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/docs/examples.rst +0 -0
  75. {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/docs/index.rst +0 -0
  76. {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/docs/license.rst +0 -0
  77. {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/docs/migration.rst +0 -0
  78. {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/docs/readme.rst +0 -0
  79. {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/docs/test_strategy.md +0 -0
  80. {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/docs/testing_conventions.md +0 -0
  81. {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/examples/README.md +0 -0
  82. {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/examples/complete_usage_example.py +0 -0
  83. {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/examples/quick_start.py +0 -0
  84. {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/examples/team_ranking_analysis.py +0 -0
  85. {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/pytest.ini +0 -0
  86. {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/run-ci-locally.sh +0 -0
  87. {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0/scripts}/benchmark_search_organisme.py +0 -0
  88. {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/scripts/discover_endpoints.py +0 -0
  89. {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/scripts/discover_types.py +0 -0
  90. {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/setup.py +0 -0
  91. {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/clients/meilisearch_client.py +0 -0
  92. {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/clients/meilisearch_ffbb_client.py +0 -0
  93. {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/config.py +0 -0
  94. {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/data/collections.json +0 -0
  95. {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/data/endpoint_discovery.json +0 -0
  96. {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/data/indexes.json +0 -0
  97. {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/data/openapi.json +0 -0
  98. {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/data/openapi_full.json +0 -0
  99. {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/helpers/__init__.py +0 -0
  100. {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/helpers/http_requests_helper.py +0 -0
  101. {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/helpers/http_requests_utils.py +0 -0
  102. {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/helpers/meilisearch_client_extension.py +0 -0
  103. {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/helpers/multi_search_query_helper.py +0 -0
  104. {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/__init__.py +0 -0
  105. {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/affiche.py +0 -0
  106. {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/cartographie.py +0 -0
  107. {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/categorie.py +0 -0
  108. {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/categorie_type.py +0 -0
  109. {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/clock.py +0 -0
  110. {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/club_contacts.py +0 -0
  111. {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/code.py +0 -0
  112. {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/competition_fields.py +0 -0
  113. {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/competition_id.py +0 -0
  114. {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/competition_id_categorie.py +0 -0
  115. {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/competition_id_sexe.py +0 -0
  116. {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/competition_id_type_competition.py +0 -0
  117. {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/competition_id_type_competition_generique.py +0 -0
  118. {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/competition_origine.py +0 -0
  119. {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/competition_origine_categorie.py +0 -0
  120. {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/competition_origine_type_competition.py +0 -0
  121. {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/competition_origine_type_competition_generique.py +0 -0
  122. {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/competition_type.py +0 -0
  123. {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/competitions_facet_distribution.py +0 -0
  124. {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/competitions_facet_stats.py +0 -0
  125. {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/competitions_hit.py +0 -0
  126. {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/competitions_multi_search_query.py +0 -0
  127. {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/competitions_query.py +0 -0
  128. {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/configuration_models.py +0 -0
  129. {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/contact_info.py +0 -0
  130. {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/content_multi_search_query.py +0 -0
  131. {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/coordonnees.py +0 -0
  132. {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/coordonnees_type.py +0 -0
  133. {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/document_flyer.py +0 -0
  134. {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/document_flyer_type.py +0 -0
  135. {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/engagement_contacts.py +0 -0
  136. {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/engagements_facet_distribution.py +0 -0
  137. {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/engagements_facet_stats.py +0 -0
  138. {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/engagements_hit.py +0 -0
  139. {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/engagements_multi_search_query.py +0 -0
  140. {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/etat.py +0 -0
  141. {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/external_competition_id.py +0 -0
  142. {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/external_id.py +0 -0
  143. {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/facet_distribution.py +0 -0
  144. {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/facet_stats.py +0 -0
  145. {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/field_set.py +0 -0
  146. {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/folder.py +0 -0
  147. {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/formation_session.py +0 -0
  148. {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/formations_facet_distribution.py +0 -0
  149. {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/formations_facet_stats.py +0 -0
  150. {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/formations_hit.py +0 -0
  151. {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/formations_multi_search_query.py +0 -0
  152. {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/game_stats_model.py +0 -0
  153. {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/game_stats_models.py +0 -0
  154. {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/generic_search.py +0 -0
  155. {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/geo.py +0 -0
  156. {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/geo_sort_order.py +0 -0
  157. {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/get_commune_response.py +0 -0
  158. {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/get_competition_response.py +0 -0
  159. {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/get_configuration_response.py +0 -0
  160. {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/get_engagement_response.py +0 -0
  161. {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/get_entraineur_response.py +0 -0
  162. {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/get_formation_response.py +0 -0
  163. {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/get_officiel_response.py +0 -0
  164. {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/get_organisme_response.py +0 -0
  165. {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/get_poule_response.py +0 -0
  166. {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/get_pratique_response.py +0 -0
  167. {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/get_saisons_response.py +0 -0
  168. {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/get_salle_response.py +0 -0
  169. {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/get_terrain_response.py +0 -0
  170. {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/get_tournoi_response.py +0 -0
  171. {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/gradient_color.py +0 -0
  172. {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/hit.py +0 -0
  173. {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/id_engagement_equipe.py +0 -0
  174. {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/id_organisme_equipe.py +0 -0
  175. {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/id_organisme_equipe1_logo.py +0 -0
  176. {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/id_poule.py +0 -0
  177. {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/jour.py +0 -0
  178. {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/label.py +0 -0
  179. {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/labellisation.py +0 -0
  180. {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/live.py +0 -0
  181. {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/lives.py +0 -0
  182. {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/logo.py +0 -0
  183. {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/multi_search_queries.py +0 -0
  184. {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/multi_search_query.py +0 -0
  185. {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/multi_search_result_competitions.py +0 -0
  186. {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/multi_search_result_engagements.py +0 -0
  187. {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/multi_search_result_formations.py +0 -0
  188. {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/multi_search_result_organismes.py +0 -0
  189. {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/multi_search_result_pratiques.py +0 -0
  190. {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/multi_search_result_rencontres.py +0 -0
  191. {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/multi_search_result_salles.py +0 -0
  192. {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/multi_search_result_terrains.py +0 -0
  193. {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/multi_search_result_tournois.py +0 -0
  194. {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/multi_search_results.py +0 -0
  195. {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/multi_search_results_class.py +0 -0
  196. {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/nature_sol.py +0 -0
  197. {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/niveau.py +0 -0
  198. {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/niveau_class.py +0 -0
  199. {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/niveau_extractor.py +0 -0
  200. {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/niveau_info.py +0 -0
  201. {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/niveau_models.py +0 -0
  202. {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/niveau_type.py +0 -0
  203. {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/objectif.py +0 -0
  204. {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/organisateur.py +0 -0
  205. {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/organisateur_type.py +0 -0
  206. {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/organisme_fields.py +0 -0
  207. {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/organisme_id_pere.py +0 -0
  208. {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/organismes_facet_distribution.py +0 -0
  209. {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/organismes_facet_stats.py +0 -0
  210. {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/organismes_hit.py +0 -0
  211. {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/organismes_multi_search_query.py +0 -0
  212. {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/organismes_query.py +0 -0
  213. {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/phase_code.py +0 -0
  214. {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/poule.py +0 -0
  215. {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/poule_fields.py +0 -0
  216. {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/poule_rencontre_item_model.py +0 -0
  217. {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/poules_models.py +0 -0
  218. {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/poules_query.py +0 -0
  219. {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/pratique.py +0 -0
  220. {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/pratiques_facet_distribution.py +0 -0
  221. {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/pratiques_facet_stats.py +0 -0
  222. {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/pratiques_hit.py +0 -0
  223. {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/pratiques_hit_type.py +0 -0
  224. {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/pratiques_multi_search_query.py +0 -0
  225. {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/pratiques_type_class.py +0 -0
  226. {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/publication_internet.py +0 -0
  227. {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/purple_logo.py +0 -0
  228. {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/ranking_engagement.py +0 -0
  229. {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/rankings_models.py +0 -0
  230. {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/rencontres_engagement.py +0 -0
  231. {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/rencontres_facet_distribution.py +0 -0
  232. {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/rencontres_facet_stats.py +0 -0
  233. {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/rencontres_hit.py +0 -0
  234. {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/rencontres_multi_search_query.py +0 -0
  235. {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/saison.py +0 -0
  236. {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/saison_fields.py +0 -0
  237. {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/saisons_models.py +0 -0
  238. {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/saisons_query.py +0 -0
  239. {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/salle.py +0 -0
  240. {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/salles_facet_distribution.py +0 -0
  241. {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/salles_facet_stats.py +0 -0
  242. {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/salles_hit.py +0 -0
  243. {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/salles_multi_search_query.py +0 -0
  244. {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/sexe.py +0 -0
  245. {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/sexe_class.py +0 -0
  246. {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/source.py +0 -0
  247. {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/status.py +0 -0
  248. {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/team_engagement.py +0 -0
  249. {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/terrains_categorie_championnat_3x3_libelle.py +0 -0
  250. {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/terrains_facet_distribution.py +0 -0
  251. {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/terrains_facet_stats.py +0 -0
  252. {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/terrains_hit.py +0 -0
  253. {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/terrains_multi_search_query.py +0 -0
  254. {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/terrains_name.py +0 -0
  255. {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/terrains_sexe_enum.py +0 -0
  256. {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/terrains_storage.py +0 -0
  257. {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/tournoi_type_class.py +0 -0
  258. {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/tournoi_type_enum.py +0 -0
  259. {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/tournoi_types_3x3.py +0 -0
  260. {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/tournoi_types_3x3_libelle.py +0 -0
  261. {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/tournoi_types_3x3_libelle_enum.py +0 -0
  262. {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/tournois_facet_distribution.py +0 -0
  263. {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/tournois_facet_stats.py +0 -0
  264. {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/tournois_hit.py +0 -0
  265. {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/tournois_hit_type.py +0 -0
  266. {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/tournois_libelle.py +0 -0
  267. {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/tournois_multi_search_query.py +0 -0
  268. {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/type_association.py +0 -0
  269. {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/type_association_libelle.py +0 -0
  270. {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/type_class.py +0 -0
  271. {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/type_competition.py +0 -0
  272. {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/type_competition_generique.py +0 -0
  273. {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/type_enum.py +0 -0
  274. {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/models/type_league.py +0 -0
  275. {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/py.typed +0 -0
  276. {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/utils/__init__.py +0 -0
  277. {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/utils/converter_utils.py +0 -0
  278. {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/utils/input_validation.py +0 -0
  279. {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/utils/secure_logging.py +0 -0
  280. {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client/utils/token_manager.py +0 -0
  281. {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client.egg-info/dependency_links.txt +0 -0
  282. {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/src/ffbb_data_client.egg-info/not-zip-safe +0 -0
  283. {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/tests/conftest.py +0 -0
  284. {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/tests/e2e/__init__.py +0 -0
  285. {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/tests/e2e/conftest.py +0 -0
  286. {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/tests/integration/__init__.py +0 -0
  287. {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/tests/integration/conftest.py +0 -0
  288. {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/tests/integration/test_500_user_journey.py +0 -0
  289. {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/tests/integration/test_501_user_journey_v3.py +0 -0
  290. {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/tests/integration/test_503_secure_logging.py +0 -0
  291. {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/tests/integration/test_504_input_validation.py +0 -0
  292. {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/tests/integration/test_505_retry_timeout.py +0 -0
  293. {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/tests/unit/__init__.py +0 -0
  294. {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/tests/unit/clients/__init__.py +0 -0
  295. {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/tests/unit/clients/test_200_api_ffbb_app_client.py +0 -0
  296. {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/tests/unit/clients/test_202_meilisearch_client.py +0 -0
  297. {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/tests/unit/clients/test_203_meilisearch_client_extension.py +0 -0
  298. {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/tests/unit/clients/test_204_ffbb_data_client.py +0 -0
  299. {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/tests/unit/clients/test_205_meilisearch_ffbb_client.py +0 -0
  300. {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/tests/unit/clients/test_206_coverage_gaps_clients.py +0 -0
  301. {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/tests/unit/clients/test_209_automatic_token_resolution.py +0 -0
  302. {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/tests/unit/clients/test_async_methods.py +0 -0
  303. {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/tests/unit/clients/test_meilisearch_async.py +0 -0
  304. {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/tests/unit/clients/test_v2_backport_search.py +0 -0
  305. {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/tests/unit/clients/test_v3_new_features.py +0 -0
  306. {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/tests/unit/conftest.py +0 -0
  307. {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/tests/unit/helpers/__init__.py +0 -0
  308. {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/tests/unit/helpers/test_400_http_helpers.py +0 -0
  309. {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/tests/unit/helpers/test_meilisearch_client_extension_recursive_pagination.py +0 -0
  310. {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/tests/unit/models/__init__.py +0 -0
  311. {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/tests/unit/models/test_100_competition_id_categorie.py +0 -0
  312. {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/tests/unit/models/test_101_competition_id_sexe.py +0 -0
  313. {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/tests/unit/models/test_102_competition_id_type_competition.py +0 -0
  314. {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/tests/unit/models/test_103_competition_id_type_competition_generique.py +0 -0
  315. {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/tests/unit/models/test_104_competition_origine_categorie.py +0 -0
  316. {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/tests/unit/models/test_105_competition_origine_type_competition_generique.py +0 -0
  317. {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/tests/unit/models/test_106_competition_origine.py +0 -0
  318. {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/tests/unit/models/test_107_id_engagement_equipe.py +0 -0
  319. {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/tests/unit/models/test_108_id_organisme_equipe.py +0 -0
  320. {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/tests/unit/models/test_109_id_organisme_equipe1_logo.py +0 -0
  321. {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/tests/unit/models/test_110_labellisation.py +0 -0
  322. {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/tests/unit/models/test_111_niveau_class.py +0 -0
  323. {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/tests/unit/models/test_112_purple_logo.py +0 -0
  324. {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/tests/unit/models/test_113_salle.py +0 -0
  325. {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/tests/unit/models/test_114_tournoi_type_class.py +0 -0
  326. {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/tests/unit/models/test_115_type_association_libelle.py +0 -0
  327. {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/tests/unit/models/test_116_type_competition_generique.py +0 -0
  328. {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/tests/unit/models/test_117_organisateur.py +0 -0
  329. {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/tests/unit/models/test_118_competition_id.py +0 -0
  330. {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/tests/unit/models/test_119_terrains_inner_models.py +0 -0
  331. {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/tests/unit/models/test_120_pratiques_inner_models.py +0 -0
  332. {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/tests/unit/models/test_121_to_dict_round_trip.py +0 -0
  333. {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/tests/unit/models/test_122_coverage_gaps.py +0 -0
  334. {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/tests/unit/models/test_123_missing_coverage.py +0 -0
  335. {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/tests/unit/models/test_123_v2_backport.py +0 -0
  336. {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/tests/unit/models/test_124_targeted_coverage_gains.py +0 -0
  337. {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/tests/unit/models/test_dx_aliases.py +0 -0
  338. {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/tests/unit/utils/__init__.py +0 -0
  339. {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/tests/unit/utils/test_300_secure_logging.py +0 -0
  340. {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/tests/unit/utils/test_301_input_validation.py +0 -0
  341. {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/tests/unit/utils/test_302_retry_utils.py +0 -0
  342. {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/tests/unit/utils/test_304_config.py +0 -0
  343. {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/tests/unit/utils/test_305_token_manager.py +0 -0
  344. {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/tests/unit/utils/test_306_converter_utils.py +0 -0
  345. {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/website/assets/logo.webp +0 -0
  346. {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/website/css/style.css +0 -0
  347. {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/website/index.html +0 -0
  348. {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/website/robots.txt +0 -0
  349. {ffbb_data_client-2.0.2 → ffbb_data_client-2.2.0}/website/sitemap.xml +0 -0
@@ -3,7 +3,7 @@
3
3
 
4
4
  [run]
5
5
  branch = True
6
- source = ffbb_api_client_v3
6
+ source = ffbb_data_client
7
7
  parallel = True
8
8
  # CRITICAL for Coveralls: ensures paths are relative to the git root
9
9
  # Without this, Coveralls reports 0% or fails to map files
@@ -21,9 +21,9 @@ omit =
21
21
  # Maps coverage paths from different environments (tox, Docker, etc.)
22
22
  # to the canonical source root. Order matters: first match wins.
23
23
  source =
24
- src/ffbb_api_client_v3
25
- */ffbb_api_client_v3
26
- */src/ffbb_api_client_v3
24
+ src/ffbb_data_client
25
+ */ffbb_data_client
26
+ */src/ffbb_data_client
27
27
 
28
28
  [report]
29
29
  # Minimum coverage threshold — CI will fail below this
@@ -62,7 +62,7 @@ exclude_lines =
62
62
 
63
63
  [html]
64
64
  directory = htmlcov
65
- title = FFBBApiClientV3 Coverage
65
+ title = FFBB Data Client Coverage
66
66
 
67
67
  [xml]
68
68
  # Required by coverallsapp/github-action@v2 Universal Coverage Reporter
@@ -0,0 +1,19 @@
1
+ version: 2
2
+ updates:
3
+ - package-ecosystem: "github-actions"
4
+ directory: "/"
5
+ schedule:
6
+ interval: "weekly"
7
+ open-pull-requests-limit: 5
8
+
9
+ - package-ecosystem: "pip"
10
+ directory: "/"
11
+ schedule:
12
+ interval: "weekly"
13
+ open-pull-requests-limit: 5
14
+
15
+ - package-ecosystem: "pip"
16
+ directory: "/docs"
17
+ schedule:
18
+ interval: "weekly"
19
+ open-pull-requests-limit: 5
@@ -62,23 +62,49 @@ def write_summary(text: str) -> None:
62
62
  def main() -> int:
63
63
  api_methods = get_public_methods(CLIENTS / "api_ffbb_app_client.py")
64
64
  ms_methods = get_public_methods(CLIENTS / "meilisearch_ffbb_client.py")
65
- wrapper_methods = get_public_methods(CLIENTS / "ffbb_data_client.py")
65
+
66
+ # Collect wrapper methods from the main file AND any facade files.
67
+ # After the v2.1.0 refactor, methods live in _rest_facade.py and
68
+ # _search_facade.py; the thin ffbb_data_client.py delegates via setattr.
69
+ wrapper_files = [
70
+ CLIENTS / "ffbb_data_client.py",
71
+ CLIENTS / "_rest_facade.py",
72
+ CLIENTS / "_search_facade.py",
73
+ ]
74
+ wrapper_methods: set[str] = set()
75
+ for wf in wrapper_files:
76
+ if wf.exists():
77
+ wrapper_methods |= get_public_methods(wf)
66
78
 
67
79
  all_inner = api_methods | ms_methods
68
80
  missing = sorted(all_inner - wrapper_methods)
69
81
 
70
82
  if not missing:
71
- msg = "## ✅ Wrapper parity OK\n\nAll public methods from inner clients are exposed in `FFBBDataClient`."
83
+ msg = "## ✅ Wrapper parity OK\n\nAll public methods from inner clients are exposed in `FFBBDataClient` (including facade files)."
72
84
  print(msg)
73
85
  write_summary(msg)
74
86
  return 0
75
87
 
76
88
  # Build markdown report
89
+ missing_detail = " ".join(
90
+ [
91
+ "The following methods exist in inner clients but are **not exposed**",
92
+ "in `FFBBDataClient` or its facade files:",
93
+ ]
94
+ )
95
+ fix_detail = " ".join(
96
+ [
97
+ "Add the missing method(s) to",
98
+ "`src/ffbb_data_client/clients/ffbb_data_client.py` or one of its",
99
+ "facade files (`_rest_facade.py`, `_search_facade.py`)",
100
+ "so they delegate to the appropriate inner client.",
101
+ ]
102
+ )
103
+
77
104
  lines = [
78
105
  "## ⚠️ Wrapper parity check failed",
79
106
  "",
80
- "The following methods exist in inner clients but are **not exposed** "
81
- "in `FFBBDataClient`:",
107
+ missing_detail,
82
108
  "",
83
109
  "| Method | Source client |",
84
110
  "|---|---|",
@@ -94,9 +120,7 @@ def main() -> int:
94
120
  lines += [
95
121
  "",
96
122
  "### How to fix",
97
- "Add the missing method(s) to "
98
- "`src/ffbb_data_client/clients/ffbb_data_client.py` "
99
- "so they delegate to the appropriate inner client.",
123
+ fix_detail,
100
124
  ]
101
125
 
102
126
  report = "\n".join(lines)
@@ -23,10 +23,10 @@ jobs:
23
23
 
24
24
  steps:
25
25
  - name: Checkout
26
- uses: actions/checkout@v6
26
+ uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
27
27
 
28
28
  - name: Set up Python
29
- uses: actions/setup-python@v6
29
+ uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6.2.0
30
30
  with:
31
31
  python-version: '3.11'
32
32
 
@@ -37,6 +37,10 @@ jobs:
37
37
  with: {python-version: "3.14"}
38
38
  - name: Run static analysis and format checkers
39
39
  run: pipx run pre-commit run --all-files --show-diff-on-failure
40
+ - name: Run type checks
41
+ run: >-
42
+ pipx run --python '${{ steps.setup-python.outputs.python-path }}'
43
+ tox -e type
40
44
  - name: Build package distribution files
41
45
  run: >-
42
46
  pipx run --python '${{ steps.setup-python.outputs.python-path }}'
@@ -74,7 +78,7 @@ jobs:
74
78
  tox -e validate
75
79
  - name: Record the path of wheel distribution
76
80
  id: wheel-distribution
77
- run: echo "path=$(ls dist/*.whl)" >> $GITHUB_OUTPUT
81
+ run: echo "path=$(ls dist/*.whl)" >> "$GITHUB_OUTPUT"
78
82
  - name: Store the distribution files for use in other stages
79
83
  uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
80
84
  with:
@@ -118,6 +122,7 @@ jobs:
118
122
  # `parallel: true` signals that more reports are coming from other jobs.
119
123
  # `flag-name` labels this specific combination for per-flag drill-down on Coveralls.
120
124
  - name: Upload coverage to Coveralls (parallel)
125
+ if: ${{ github.ref_type != 'tag' }}
121
126
  uses: coverallsapp/github-action@648a8eb78e6d50909eff900e4ec85cab4524a45b # v2.3.6
122
127
  with:
123
128
  file: coverage.lcov
@@ -136,6 +141,7 @@ jobs:
136
141
  if: ${{ always() }}
137
142
  steps:
138
143
  - name: Finalize coverage report on Coveralls
144
+ if: ${{ github.ref_type != 'tag' }}
139
145
  uses: coverallsapp/github-action@648a8eb78e6d50909eff900e4ec85cab4524a45b # v2.3.6
140
146
  with:
141
147
  github-token: ${{ secrets.GITHUB_TOKEN }}
@@ -0,0 +1,33 @@
1
+ name: CodeQL
2
+
3
+ on:
4
+ push:
5
+ branches: [master]
6
+ pull_request:
7
+ schedule:
8
+ - cron: '31 2 * * 1'
9
+
10
+ permissions:
11
+ contents: read
12
+
13
+ jobs:
14
+ analyze:
15
+ name: Analyze Python
16
+ runs-on: ubuntu-latest
17
+ permissions:
18
+ actions: read
19
+ contents: read
20
+ security-events: write
21
+
22
+ steps:
23
+ - name: Checkout
24
+ uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
25
+
26
+ - name: Initialize CodeQL
27
+ uses: github/codeql-action/init@9e0d7b8d25671d64c341c19c0152d693099fb5ba # v4
28
+ with:
29
+ languages: python
30
+ queries: security-extended,security-and-quality
31
+
32
+ - name: Perform CodeQL Analysis
33
+ uses: github/codeql-action/analyze@9e0d7b8d25671d64c341c19c0152d693099fb5ba # v4
@@ -20,7 +20,7 @@ jobs:
20
20
  runs-on: ubuntu-latest
21
21
  steps:
22
22
  - name: Checkout
23
- uses: actions/checkout@v6
23
+ uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
24
24
  with:
25
25
  fetch-depth: 0
26
26
 
@@ -36,7 +36,7 @@ jobs:
36
36
  run: touch website/.nojekyll
37
37
 
38
38
  - name: Upload Pages artifact
39
- uses: actions/upload-pages-artifact@v5
39
+ uses: actions/upload-pages-artifact@fc324d3547104276b827a68afc52ff2a11cc49c9 # v5
40
40
  with:
41
41
  path: website
42
42
 
@@ -52,4 +52,4 @@ jobs:
52
52
  steps:
53
53
  - name: Deploy to GitHub Pages
54
54
  id: deployment
55
- uses: actions/deploy-pages@v5
55
+ uses: actions/deploy-pages@cd2ce8fcbc39b97be8ca5fce6e763baed58fa128 # v5
@@ -5,19 +5,26 @@ on:
5
5
  tags:
6
6
  - 'v*'
7
7
 
8
+ permissions:
9
+ contents: read
10
+
8
11
  jobs:
9
12
  build:
10
13
  name: Build distribution
11
14
  runs-on: ubuntu-latest
15
+ permissions:
16
+ attestations: write
17
+ contents: read
18
+ id-token: write
12
19
 
13
20
  steps:
14
21
  - name: Checkout
15
- uses: actions/checkout@v6
22
+ uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
16
23
  with:
17
24
  fetch-depth: 0 # Required for setuptools_scm to resolve version from tags
18
25
 
19
26
  - name: Set up Python
20
- uses: actions/setup-python@v6
27
+ uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6.2.0
21
28
  with:
22
29
  python-version: '3.11'
23
30
 
@@ -56,11 +63,16 @@ jobs:
56
63
  PY
57
64
 
58
65
  - name: Upload distribution artifacts
59
- uses: actions/upload-artifact@v7
66
+ uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
60
67
  with:
61
68
  name: dist
62
69
  path: dist/
63
70
 
71
+ - name: Generate artifact attestation
72
+ uses: actions/attest@59d89421af93a897026c735860bf21b6eb4f7b26 # v4
73
+ with:
74
+ subject-path: dist/*
75
+
64
76
  publish-pypi:
65
77
  name: Publish to PyPI
66
78
  needs: build
@@ -71,13 +83,13 @@ jobs:
71
83
 
72
84
  steps:
73
85
  - name: Download distribution artifacts
74
- uses: actions/download-artifact@v8
86
+ uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
75
87
  with:
76
88
  name: dist
77
89
  path: dist/
78
90
 
79
91
  - name: Publish to PyPI
80
- uses: pypa/gh-action-pypi-publish@release/v1
92
+ uses: pypa/gh-action-pypi-publish@cef221092ed1bacb1cc03d23a2d87d1d172e277b # release/v1
81
93
 
82
94
  publish-github-release:
83
95
  name: Create GitHub Release
@@ -88,13 +100,13 @@ jobs:
88
100
 
89
101
  steps:
90
102
  - name: Download distribution artifacts
91
- uses: actions/download-artifact@v8
103
+ uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
92
104
  with:
93
105
  name: dist
94
106
  path: dist/
95
107
 
96
108
  - name: Create GitHub Release
97
- uses: softprops/action-gh-release@v3
109
+ uses: softprops/action-gh-release@b4309332981a82ec1c5618f44dd2e27cc8bfbfda # v3
98
110
  with:
99
111
  files: dist/*
100
112
  generate_release_notes: true
@@ -106,7 +118,7 @@ jobs:
106
118
 
107
119
  steps:
108
120
  - name: Dispatch bump event to FFBB-MCP-Server
109
- uses: peter-evans/repository-dispatch@v4
121
+ uses: peter-evans/repository-dispatch@28959ce8df70de7be546dd1250a005dd32156697 # v4
110
122
  with:
111
123
  token: ${{ secrets.MCP_SERVER_PAT }}
112
124
  repository: nickdesi/FFBB-MCP-Server
@@ -51,7 +51,7 @@ jobs:
51
51
 
52
52
  - name: Checkout tested commit
53
53
  if: steps.pr.outputs.release == 'true'
54
- uses: actions/checkout@v6
54
+ uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
55
55
  with:
56
56
  ref: ${{ github.event.workflow_run.head_sha }}
57
57
  fetch-depth: 0
@@ -19,10 +19,10 @@ jobs:
19
19
 
20
20
  steps:
21
21
  - name: Checkout
22
- uses: actions/checkout@v6
22
+ uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
23
23
 
24
24
  - name: Set up Python
25
- uses: actions/setup-python@v6
25
+ uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6.2.0
26
26
  with:
27
27
  python-version: '3.11'
28
28
 
@@ -44,7 +44,7 @@ jobs:
44
44
 
45
45
  - name: Upload discovery summary
46
46
  if: always()
47
- uses: actions/upload-artifact@v7
47
+ uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
48
48
  with:
49
49
  name: ffbb-api-update-summary
50
50
  path: data/api_update_summary.md
@@ -53,7 +53,7 @@ jobs:
53
53
 
54
54
  - name: Create pull request
55
55
  if: steps.changes.outputs.changed == 'true'
56
- uses: peter-evans/create-pull-request@v8
56
+ uses: peter-evans/create-pull-request@5f6978faf089d4d20b00c7766989d076bb2fc7f1 # v8
57
57
  with:
58
58
  token: ${{ secrets.GITHUB_TOKEN }}
59
59
  branch: chore/update-ffbb-api-discovery
@@ -61,6 +61,16 @@ repos:
61
61
  hooks:
62
62
  - id: flake8
63
63
 
64
+ # Type-checking on push (mypy + pyright via tox)
65
+ - repo: local
66
+ hooks:
67
+ - id: type-check
68
+ name: type-check (mypy + pyright)
69
+ entry: bash -c 'PATH="$PWD/.venv/bin:$PATH" tox -e type'
70
+ language: system
71
+ pass_filenames: false
72
+ stages: [pre-push]
73
+
64
74
  # Check for misspells in documentation files:
65
75
  # - repo: https://github.com/codespell-project/codespell
66
76
  # rev: v2.2.5
@@ -5,6 +5,56 @@ All notable changes to this project will be documented in this file.
5
5
  The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
6
6
  and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
7
 
8
+ ## [2.2.0] - 2026-05-17
9
+
10
+ ### Changed
11
+ - **REFACTOR**: `FFBBDataClient` (2865 → 272 lines) split into modular facades — `_RestFacade` (1592 lines) and `_SearchFacade` (1020 lines)
12
+ - Public API remains 100% backward-compatible — all 167 methods accessible directly on `FFBBDataClient`
13
+ - `check_wrapper_parity.py` updated to scan facade files in addition to the main client
14
+
15
+ ### Added
16
+ - `pytest_asyncio_mode = "auto"` in `pyproject.toml` for pytest-asyncio compatibility
17
+ - `isolated_build = True` in `tox.ini` for proper PEP 517 builds
18
+
19
+ ### Fixed
20
+ - `CacheManager` docstring corrected — Redis backend marked as "planned" (not implemented)
21
+ - `readme_renderer[md]` moved from `install_requires` to `testing` extras (build-time only dependency)
22
+
23
+ ### Removed
24
+ - Orphaned `src/ffbb_api_client_v3/` directory (residual from v2.1.0 cleanup)
25
+ - Orphaned `.coverage` file at project root
26
+ - `benchmark_search_organisme.py` moved from root to `scripts/`
27
+
28
+ ## [2.1.0] - 2026-05-17
29
+
30
+ ### Changed
31
+ - **BREAKING (internal)**: Sync methods now delegate to async counterparts via `_run_async()` helper, eliminating ~604 lines of duplication
32
+ - Sync and async share a single source of truth — async methods are canonical
33
+ - `ThreadPoolExecutor` fallback handles nested event loops gracefully
34
+
35
+ ### Added
36
+ - **NEW**: Pre-push hook for type-check (mypy + pyright) — catches type errors before push
37
+ - **NEW**: CodeQL security scanning in CI
38
+ - **NEW**: Dependabot for automated dependency updates (GitHub Actions + pip)
39
+ - **NEW**: `SECURITY.md` security policy
40
+
41
+ ### Fixed
42
+ - SQLite cache concurrency: sync uses `http_cache.db`, async uses `http_cache_async.db` (prevents `database is locked`)
43
+ - CI type check failures with proper generic typing for `_run_async(coro: Awaitable[T]) -> T`
44
+ - `FFBBDataClient` wrapper parity — added 8 missing async method delegations
45
+
46
+ ### Removed
47
+ - Dead `invalidate_pattern()` from `CacheManager` and related tests
48
+ - `ffbb_api_client_v3` shim, dead scripts, and backward-compat alias
49
+
50
+ ### Security
51
+ - CI supply chain hardened with pinned action versions and trusted publishers
52
+
53
+ ## [2.0.2] - 2026-05-17
54
+
55
+ ### Changed
56
+ - README version updated to v2.0.2
57
+
8
58
  ## [1.6.1] - 2026-04-29
9
59
 
10
60
  ### Changed
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: ffbb-data-client
3
- Version: 2.0.2
3
+ Version: 2.2.0
4
4
  Summary: FFBB Data Client — SDK Python asynchrone pour les Statistiques de Basket France. Type-safe Pydantic models, async/sync, Meilisearch.
5
5
  Home-page: https://github.com/nickdesi/ffbb-data-client
6
6
  Author: nickdesi
@@ -33,11 +33,10 @@ Requires-Python: >=3.10
33
33
  Description-Content-Type: text/markdown; charset=UTF-8
34
34
  License-File: LICENSE.txt
35
35
  Requires-Dist: python-dotenv>=1.2.2
36
- Requires-Dist: readme_renderer[md]>=44.0
37
36
  Requires-Dist: python-dateutil>=2.9.0.post0
38
37
  Requires-Dist: httpx>=0.28.1
39
38
  Requires-Dist: hishel[async]>=1.2.1
40
- Requires-Dist: pydantic>=2.13.3
39
+ Requires-Dist: pydantic>=2.13.4
41
40
  Provides-Extra: testing
42
41
  Requires-Dist: setuptools>=82.0.1; extra == "testing"
43
42
  Requires-Dist: coverage>=7.13.5; extra == "testing"
@@ -46,6 +45,7 @@ Requires-Dist: pytest-xdist>=3.8.0; extra == "testing"
46
45
  Requires-Dist: pytest-cov>=7.1.0; extra == "testing"
47
46
  Requires-Dist: respx>=0.23.1; extra == "testing"
48
47
  Requires-Dist: pytest-asyncio>=1.3.0; extra == "testing"
48
+ Requires-Dist: readme_renderer[md]>=44.0; extra == "testing"
49
49
  Provides-Extra: typing
50
50
  Requires-Dist: types-python-dateutil>=2.9.0.20260408; extra == "typing"
51
51
  Dynamic: license-file
@@ -85,20 +85,18 @@ Dynamic: license-file
85
85
  - du cache HTTP configurable via `hishel` ;
86
86
  - des helpers prêts pour l'intégration MCP / agents IA.
87
87
 
88
- > La V3 remplace l’approche V2 basée sur des dictionnaires bruts et une configuration manuelle. Elle privilégie le typage, la robustesse réseau et les appels batchés.
89
-
90
88
  ---
91
89
 
92
- ## 🚀 Version v1.7.0 — 30 avril 2026
90
+ ## 🚀 Version v2.2.0 — Mai 2026
93
91
 
94
92
  Principales évolutions récentes :
95
93
 
96
- - ajout d'entités REST et Meilisearch : rencontres, officiels, entraîneurs, communes et assets ;
97
- - réutilisation des clients `httpx` synchrones et asynchrones ;
98
- - cache Meilisearch optimisé pour limiter les copies coûteuses ;
99
- - retries de transport configurables via `CacheConfig.transport_retries` ;
100
- - mise à jour des schémas OpenAPI, collections et index ;
101
- - stabilisation CI, typage, tests et formatage.
94
+ - **refactor architecture** : `FFBBDataClient` (2865 272 lignes) découpé en `_RestFacade` + `_SearchFacade` — API publique 100% compatible ;
95
+ - **unification sync/async** : les méthodes synchrones délèguent à leurs homologues asynchrones via `_run_async()`, éliminant ~604 lignes de duplication ;
96
+ - **nouvelles entités** : EDF (matches, joueurs, rosters, équipes), Genius Sport (matches, live logs), Rematch Videos ;
97
+ - **cache SQLite concurrency-safe** : fichiers séparés pour sync (`http_cache.db`) et async (`http_cache_async.db`) ;
98
+ - **CI renforcée** : mypy + pyright + CodeQL + Dependabot + hook pre-push + wrapper parity check ;
99
+ - **nettoyage** : suppression du shim `ffbb_api_client_v3`, scripts morts et code mort (`invalidate_pattern`).
102
100
 
103
101
  Voir aussi : [`CHANGELOG.md`](CHANGELOG.md) et [`RELEASE_NOTES.md`](RELEASE_NOTES.md).
104
102
 
@@ -148,11 +146,12 @@ lives = client.get_lives()
148
146
  | Domaine | Capacités |
149
147
  |---|---|
150
148
  | API FFBB | clubs, compétitions, organismes, saisons, poules, classements, rencontres, lives |
149
+ | Entités additionnelles | EDF (matches, joueurs, rosters, équipes), Genius Sport, Rematch Videos |
151
150
  | Recherche | organismes, compétitions, rencontres, salles, terrains, pratiques, tournois, engagements et formations |
152
151
  | REST typé | récupération de ressources individuelles avec modèles Pydantic v2 |
153
- | Async | méthodes `*_async()` pour les appels réseau non bloquants |
154
- | Cache | cache HTTP `hishel`, sessions `httpx` réutilisées, retries configurables |
155
- | Sécurité | masquage des tokens dans les logs |
152
+ | Async | méthodes `*_async()` source de vérité ; sync délègue via `_run_async()` |
153
+ | Cache | cache HTTP `hishel`, sessions `httpx` réutilisées, retries configurables, SQLite séparés sync/async |
154
+ | Sécurité | masquage des tokens dans les logs, CodeQL scanning, Dependabot |
156
155
  | IA / MCP | structure compatible avec des wrappers MCP et agents IA |
157
156
 
158
157
  ---
@@ -272,15 +271,21 @@ Il est donc possible de laisser le client résoudre les tokens automatiquement o
272
271
  ```text
273
272
  src/ffbb_data_client/
274
273
  ├── clients/
275
- │ ├── ffbb_data_client.py # Façade publique
276
- │ ├── api_ffbb_app_client.py # Client REST FFBB
277
- └── meilisearch_ffbb_client.py # Client recherche Meilisearch
278
- ├── helpers/ # Requêtes HTTP, multi-search, conversions
279
- ├── models/ # Modèles Pydantic v2
280
- ├── utils/ # cache, tokens, logging sécurisé
281
- └── data/ # schémas et métadonnées embarqués
274
+ │ ├── ffbb_data_client.py # Façade publique (272 lignes, delegation)
275
+ │ ├── _rest_facade.py # Façade REST API (Directus)
276
+ ├── _search_facade.py # Façade recherche Meilisearch
277
+ ├── api_ffbb_app_client.py # Client REST FFBB (async source of truth)
278
+ │ └── meilisearch_ffbb_client.py # Client recherche Meilisearch
279
+ ├── helpers/ # Requêtes HTTP, multi-search, conversions
280
+ ├── models/ # Modèles Pydantic v2
281
+ ├── utils/ # cache (sync/async séparés), tokens, logging sécurisé
282
+ └── data/ # schémas et métadonnées embarqués
282
283
  ```
283
284
 
285
+ > **Architecture sync/async** : Depuis v2.1.0, les méthodes asynchrones sont la source de vérité. Les méthodes synchrones délèguent via `_run_async()`, un helper qui gère les event loops imbriqués avec `ThreadPoolExecutor`.
286
+ >
287
+ > **Architecture facades** : Depuis v2.2.0, `FFBBDataClient` est une fine coquille qui compose `_RestFacade` et `_SearchFacade`. L'API publique reste identique — `client.get_organisme(123)` fonctionne comme avant.
288
+
284
289
  ---
285
290
 
286
291
  ## 🧪 Développement local
@@ -296,8 +301,13 @@ Commandes utiles :
296
301
  pytest tests/unit/
297
302
  pytest tests/integration/
298
303
  pytest tests/ --cov=src
304
+ tox -e type # mypy + pyright
299
305
  ```
300
306
 
307
+ Hooks automatiques :
308
+ - **pre-push** : exécute mypy + pyright avant chaque push
309
+ - **pre-commit** : black, isort, flake8, trailing-whitespace
310
+
301
311
  Documentation complémentaire :
302
312
 
303
313
  - [`LOCAL_CI_GUIDE.md`](LOCAL_CI_GUIDE.md)
@@ -33,20 +33,18 @@
33
33
  - du cache HTTP configurable via `hishel` ;
34
34
  - des helpers prêts pour l'intégration MCP / agents IA.
35
35
 
36
- > La V3 remplace l’approche V2 basée sur des dictionnaires bruts et une configuration manuelle. Elle privilégie le typage, la robustesse réseau et les appels batchés.
37
-
38
36
  ---
39
37
 
40
- ## 🚀 Version v1.7.0 — 30 avril 2026
38
+ ## 🚀 Version v2.2.0 — Mai 2026
41
39
 
42
40
  Principales évolutions récentes :
43
41
 
44
- - ajout d'entités REST et Meilisearch : rencontres, officiels, entraîneurs, communes et assets ;
45
- - réutilisation des clients `httpx` synchrones et asynchrones ;
46
- - cache Meilisearch optimisé pour limiter les copies coûteuses ;
47
- - retries de transport configurables via `CacheConfig.transport_retries` ;
48
- - mise à jour des schémas OpenAPI, collections et index ;
49
- - stabilisation CI, typage, tests et formatage.
42
+ - **refactor architecture** : `FFBBDataClient` (2865 272 lignes) découpé en `_RestFacade` + `_SearchFacade` — API publique 100% compatible ;
43
+ - **unification sync/async** : les méthodes synchrones délèguent à leurs homologues asynchrones via `_run_async()`, éliminant ~604 lignes de duplication ;
44
+ - **nouvelles entités** : EDF (matches, joueurs, rosters, équipes), Genius Sport (matches, live logs), Rematch Videos ;
45
+ - **cache SQLite concurrency-safe** : fichiers séparés pour sync (`http_cache.db`) et async (`http_cache_async.db`) ;
46
+ - **CI renforcée** : mypy + pyright + CodeQL + Dependabot + hook pre-push + wrapper parity check ;
47
+ - **nettoyage** : suppression du shim `ffbb_api_client_v3`, scripts morts et code mort (`invalidate_pattern`).
50
48
 
51
49
  Voir aussi : [`CHANGELOG.md`](CHANGELOG.md) et [`RELEASE_NOTES.md`](RELEASE_NOTES.md).
52
50
 
@@ -96,11 +94,12 @@ lives = client.get_lives()
96
94
  | Domaine | Capacités |
97
95
  |---|---|
98
96
  | API FFBB | clubs, compétitions, organismes, saisons, poules, classements, rencontres, lives |
97
+ | Entités additionnelles | EDF (matches, joueurs, rosters, équipes), Genius Sport, Rematch Videos |
99
98
  | Recherche | organismes, compétitions, rencontres, salles, terrains, pratiques, tournois, engagements et formations |
100
99
  | REST typé | récupération de ressources individuelles avec modèles Pydantic v2 |
101
- | Async | méthodes `*_async()` pour les appels réseau non bloquants |
102
- | Cache | cache HTTP `hishel`, sessions `httpx` réutilisées, retries configurables |
103
- | Sécurité | masquage des tokens dans les logs |
100
+ | Async | méthodes `*_async()` source de vérité ; sync délègue via `_run_async()` |
101
+ | Cache | cache HTTP `hishel`, sessions `httpx` réutilisées, retries configurables, SQLite séparés sync/async |
102
+ | Sécurité | masquage des tokens dans les logs, CodeQL scanning, Dependabot |
104
103
  | IA / MCP | structure compatible avec des wrappers MCP et agents IA |
105
104
 
106
105
  ---
@@ -220,15 +219,21 @@ Il est donc possible de laisser le client résoudre les tokens automatiquement o
220
219
  ```text
221
220
  src/ffbb_data_client/
222
221
  ├── clients/
223
- │ ├── ffbb_data_client.py # Façade publique
224
- │ ├── api_ffbb_app_client.py # Client REST FFBB
225
- └── meilisearch_ffbb_client.py # Client recherche Meilisearch
226
- ├── helpers/ # Requêtes HTTP, multi-search, conversions
227
- ├── models/ # Modèles Pydantic v2
228
- ├── utils/ # cache, tokens, logging sécurisé
229
- └── data/ # schémas et métadonnées embarqués
222
+ │ ├── ffbb_data_client.py # Façade publique (272 lignes, delegation)
223
+ │ ├── _rest_facade.py # Façade REST API (Directus)
224
+ ├── _search_facade.py # Façade recherche Meilisearch
225
+ ├── api_ffbb_app_client.py # Client REST FFBB (async source of truth)
226
+ │ └── meilisearch_ffbb_client.py # Client recherche Meilisearch
227
+ ├── helpers/ # Requêtes HTTP, multi-search, conversions
228
+ ├── models/ # Modèles Pydantic v2
229
+ ├── utils/ # cache (sync/async séparés), tokens, logging sécurisé
230
+ └── data/ # schémas et métadonnées embarqués
230
231
  ```
231
232
 
233
+ > **Architecture sync/async** : Depuis v2.1.0, les méthodes asynchrones sont la source de vérité. Les méthodes synchrones délèguent via `_run_async()`, un helper qui gère les event loops imbriqués avec `ThreadPoolExecutor`.
234
+ >
235
+ > **Architecture facades** : Depuis v2.2.0, `FFBBDataClient` est une fine coquille qui compose `_RestFacade` et `_SearchFacade`. L'API publique reste identique — `client.get_organisme(123)` fonctionne comme avant.
236
+
232
237
  ---
233
238
 
234
239
  ## 🧪 Développement local
@@ -244,8 +249,13 @@ Commandes utiles :
244
249
  pytest tests/unit/
245
250
  pytest tests/integration/
246
251
  pytest tests/ --cov=src
252
+ tox -e type # mypy + pyright
247
253
  ```
248
254
 
255
+ Hooks automatiques :
256
+ - **pre-push** : exécute mypy + pyright avant chaque push
257
+ - **pre-commit** : black, isort, flake8, trailing-whitespace
258
+
249
259
  Documentation complémentaire :
250
260
 
251
261
  - [`LOCAL_CI_GUIDE.md`](LOCAL_CI_GUIDE.md)