ffbb-data-client 2.0.0__py3-none-any.whl

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 (207) hide show
  1. ffbb_api_client_v3/__init__.py +25 -0
  2. ffbb_data_client/__init__.py +175 -0
  3. ffbb_data_client/clients/__init__.py +13 -0
  4. ffbb_data_client/clients/api_ffbb_app_client.py +2475 -0
  5. ffbb_data_client/clients/ffbb_data_client.py +2789 -0
  6. ffbb_data_client/clients/meilisearch_client.py +218 -0
  7. ffbb_data_client/clients/meilisearch_ffbb_client.py +647 -0
  8. ffbb_data_client/config.py +153 -0
  9. ffbb_data_client/data/__init__.py +25 -0
  10. ffbb_data_client/data/collections.json +1364 -0
  11. ffbb_data_client/data/endpoint_discovery.json +1875 -0
  12. ffbb_data_client/data/indexes.json +501 -0
  13. ffbb_data_client/data/openapi.json +35713 -0
  14. ffbb_data_client/data/openapi_full.json +37622 -0
  15. ffbb_data_client/helpers/__init__.py +27 -0
  16. ffbb_data_client/helpers/http_requests_helper.py +73 -0
  17. ffbb_data_client/helpers/http_requests_utils.py +502 -0
  18. ffbb_data_client/helpers/meilisearch_client_extension.py +153 -0
  19. ffbb_data_client/helpers/multi_search_query_helper.py +35 -0
  20. ffbb_data_client/models/__init__.py +241 -0
  21. ffbb_data_client/models/affiche.py +45 -0
  22. ffbb_data_client/models/cartographie.py +82 -0
  23. ffbb_data_client/models/categorie.py +55 -0
  24. ffbb_data_client/models/categorie_type.py +42 -0
  25. ffbb_data_client/models/clock.py +38 -0
  26. ffbb_data_client/models/club_contacts.py +77 -0
  27. ffbb_data_client/models/code.py +7 -0
  28. ffbb_data_client/models/commune.py +66 -0
  29. ffbb_data_client/models/competition_fields.py +309 -0
  30. ffbb_data_client/models/competition_id.py +116 -0
  31. ffbb_data_client/models/competition_id_categorie.py +31 -0
  32. ffbb_data_client/models/competition_id_sexe.py +31 -0
  33. ffbb_data_client/models/competition_id_type_competition.py +27 -0
  34. ffbb_data_client/models/competition_id_type_competition_generique.py +24 -0
  35. ffbb_data_client/models/competition_origine.py +69 -0
  36. ffbb_data_client/models/competition_origine_categorie.py +23 -0
  37. ffbb_data_client/models/competition_origine_type_competition.py +14 -0
  38. ffbb_data_client/models/competition_origine_type_competition_generique.py +24 -0
  39. ffbb_data_client/models/competition_type.py +6 -0
  40. ffbb_data_client/models/competitions_facet_distribution.py +65 -0
  41. ffbb_data_client/models/competitions_facet_stats.py +14 -0
  42. ffbb_data_client/models/competitions_hit.py +232 -0
  43. ffbb_data_client/models/competitions_multi_search_query.py +40 -0
  44. ffbb_data_client/models/competitions_query.py +11 -0
  45. ffbb_data_client/models/configuration_models.py +5 -0
  46. ffbb_data_client/models/contact_info.py +18 -0
  47. ffbb_data_client/models/content_multi_search_query.py +93 -0
  48. ffbb_data_client/models/coordonnees.py +27 -0
  49. ffbb_data_client/models/coordonnees_type.py +5 -0
  50. ffbb_data_client/models/document_flyer.py +205 -0
  51. ffbb_data_client/models/document_flyer_type.py +6 -0
  52. ffbb_data_client/models/engagement_contacts.py +97 -0
  53. ffbb_data_client/models/engagements_facet_distribution.py +59 -0
  54. ffbb_data_client/models/engagements_facet_stats.py +14 -0
  55. ffbb_data_client/models/engagements_hit.py +192 -0
  56. ffbb_data_client/models/engagements_multi_search_query.py +41 -0
  57. ffbb_data_client/models/etat.py +6 -0
  58. ffbb_data_client/models/external_competition_id.py +42 -0
  59. ffbb_data_client/models/external_id.py +72 -0
  60. ffbb_data_client/models/facet_distribution.py +13 -0
  61. ffbb_data_client/models/facet_stats.py +13 -0
  62. ffbb_data_client/models/field_set.py +10 -0
  63. ffbb_data_client/models/folder.py +35 -0
  64. ffbb_data_client/models/formation_session.py +60 -0
  65. ffbb_data_client/models/formations_facet_distribution.py +61 -0
  66. ffbb_data_client/models/formations_facet_stats.py +14 -0
  67. ffbb_data_client/models/formations_hit.py +277 -0
  68. ffbb_data_client/models/formations_multi_search_query.py +41 -0
  69. ffbb_data_client/models/game_stats_model.py +57 -0
  70. ffbb_data_client/models/game_stats_models.py +5 -0
  71. ffbb_data_client/models/generic_search.py +92 -0
  72. ffbb_data_client/models/geo.py +27 -0
  73. ffbb_data_client/models/geo_sort_order.py +6 -0
  74. ffbb_data_client/models/get_commune_response.py +18 -0
  75. ffbb_data_client/models/get_competition_response.py +523 -0
  76. ffbb_data_client/models/get_configuration_response.py +45 -0
  77. ffbb_data_client/models/get_engagement_response.py +23 -0
  78. ffbb_data_client/models/get_entraineur_response.py +18 -0
  79. ffbb_data_client/models/get_formation_response.py +28 -0
  80. ffbb_data_client/models/get_officiel_response.py +18 -0
  81. ffbb_data_client/models/get_organisme_response.py +476 -0
  82. ffbb_data_client/models/get_poule_response.py +68 -0
  83. ffbb_data_client/models/get_pratique_response.py +18 -0
  84. ffbb_data_client/models/get_rencontre_response.py +93 -0
  85. ffbb_data_client/models/get_saisons_response.py +56 -0
  86. ffbb_data_client/models/get_salle_response.py +20 -0
  87. ffbb_data_client/models/get_terrain_response.py +16 -0
  88. ffbb_data_client/models/get_tournoi_response.py +16 -0
  89. ffbb_data_client/models/gradient_color.py +27 -0
  90. ffbb_data_client/models/hit.py +16 -0
  91. ffbb_data_client/models/id_engagement_equipe.py +32 -0
  92. ffbb_data_client/models/id_organisme_equipe.py +51 -0
  93. ffbb_data_client/models/id_organisme_equipe1_logo.py +28 -0
  94. ffbb_data_client/models/id_poule.py +27 -0
  95. ffbb_data_client/models/jour.py +11 -0
  96. ffbb_data_client/models/label.py +15 -0
  97. ffbb_data_client/models/labellisation.py +30 -0
  98. ffbb_data_client/models/live.py +192 -0
  99. ffbb_data_client/models/lives.py +6 -0
  100. ffbb_data_client/models/logo.py +28 -0
  101. ffbb_data_client/models/multi_search_queries.py +24 -0
  102. ffbb_data_client/models/multi_search_query.py +96 -0
  103. ffbb_data_client/models/multi_search_result_competitions.py +14 -0
  104. ffbb_data_client/models/multi_search_result_engagements.py +14 -0
  105. ffbb_data_client/models/multi_search_result_formations.py +12 -0
  106. ffbb_data_client/models/multi_search_result_organismes.py +12 -0
  107. ffbb_data_client/models/multi_search_result_pratiques.py +12 -0
  108. ffbb_data_client/models/multi_search_result_rencontres.py +12 -0
  109. ffbb_data_client/models/multi_search_result_salles.py +12 -0
  110. ffbb_data_client/models/multi_search_result_terrains.py +12 -0
  111. ffbb_data_client/models/multi_search_result_tournois.py +12 -0
  112. ffbb_data_client/models/multi_search_results.py +103 -0
  113. ffbb_data_client/models/multi_search_results_class.py +96 -0
  114. ffbb_data_client/models/nature_sol.py +57 -0
  115. ffbb_data_client/models/niveau.py +10 -0
  116. ffbb_data_client/models/niveau_class.py +27 -0
  117. ffbb_data_client/models/niveau_extractor.py +214 -0
  118. ffbb_data_client/models/niveau_info.py +64 -0
  119. ffbb_data_client/models/niveau_models.py +14 -0
  120. ffbb_data_client/models/niveau_type.py +10 -0
  121. ffbb_data_client/models/objectif.py +7 -0
  122. ffbb_data_client/models/organisateur.py +197 -0
  123. ffbb_data_client/models/organisateur_type.py +6 -0
  124. ffbb_data_client/models/organisme_fields.py +327 -0
  125. ffbb_data_client/models/organisme_id_pere.py +177 -0
  126. ffbb_data_client/models/organismes_facet_distribution.py +46 -0
  127. ffbb_data_client/models/organismes_facet_stats.py +14 -0
  128. ffbb_data_client/models/organismes_hit.py +196 -0
  129. ffbb_data_client/models/organismes_multi_search_query.py +41 -0
  130. ffbb_data_client/models/organismes_query.py +8 -0
  131. ffbb_data_client/models/phase_code.py +23 -0
  132. ffbb_data_client/models/poule.py +35 -0
  133. ffbb_data_client/models/poule_fields.py +261 -0
  134. ffbb_data_client/models/poule_rencontre_item_model.py +69 -0
  135. ffbb_data_client/models/poules_models.py +6 -0
  136. ffbb_data_client/models/poules_query.py +9 -0
  137. ffbb_data_client/models/pratique.py +7 -0
  138. ffbb_data_client/models/pratiques_facet_distribution.py +29 -0
  139. ffbb_data_client/models/pratiques_facet_stats.py +14 -0
  140. ffbb_data_client/models/pratiques_hit.py +310 -0
  141. ffbb_data_client/models/pratiques_hit_type.py +9 -0
  142. ffbb_data_client/models/pratiques_multi_search_query.py +41 -0
  143. ffbb_data_client/models/pratiques_type_class.py +45 -0
  144. ffbb_data_client/models/publication_internet.py +6 -0
  145. ffbb_data_client/models/purple_logo.py +24 -0
  146. ffbb_data_client/models/query_fields_manager.py +75 -0
  147. ffbb_data_client/models/ranking_engagement.py +41 -0
  148. ffbb_data_client/models/rankings_models.py +6 -0
  149. ffbb_data_client/models/rencontres_engagement.py +23 -0
  150. ffbb_data_client/models/rencontres_facet_distribution.py +65 -0
  151. ffbb_data_client/models/rencontres_facet_stats.py +14 -0
  152. ffbb_data_client/models/rencontres_hit.py +271 -0
  153. ffbb_data_client/models/rencontres_multi_search_query.py +41 -0
  154. ffbb_data_client/models/saison.py +23 -0
  155. ffbb_data_client/models/saison_fields.py +36 -0
  156. ffbb_data_client/models/saisons_models.py +6 -0
  157. ffbb_data_client/models/saisons_query.py +9 -0
  158. ffbb_data_client/models/salle.py +56 -0
  159. ffbb_data_client/models/salles_facet_distribution.py +14 -0
  160. ffbb_data_client/models/salles_facet_stats.py +14 -0
  161. ffbb_data_client/models/salles_hit.py +153 -0
  162. ffbb_data_client/models/salles_multi_search_query.py +40 -0
  163. ffbb_data_client/models/sexe.py +9 -0
  164. ffbb_data_client/models/sexe_class.py +31 -0
  165. ffbb_data_client/models/source.py +5 -0
  166. ffbb_data_client/models/status.py +5 -0
  167. ffbb_data_client/models/team_engagement.py +56 -0
  168. ffbb_data_client/models/team_ranking.py +108 -0
  169. ffbb_data_client/models/terrains_categorie_championnat_3x3_libelle.py +5 -0
  170. ffbb_data_client/models/terrains_facet_distribution.py +41 -0
  171. ffbb_data_client/models/terrains_facet_stats.py +14 -0
  172. ffbb_data_client/models/terrains_hit.py +223 -0
  173. ffbb_data_client/models/terrains_multi_search_query.py +42 -0
  174. ffbb_data_client/models/terrains_name.py +5 -0
  175. ffbb_data_client/models/terrains_sexe_enum.py +7 -0
  176. ffbb_data_client/models/terrains_storage.py +5 -0
  177. ffbb_data_client/models/tournoi_type_class.py +35 -0
  178. ffbb_data_client/models/tournoi_type_enum.py +7 -0
  179. ffbb_data_client/models/tournoi_types_3x3.py +43 -0
  180. ffbb_data_client/models/tournoi_types_3x3_libelle.py +60 -0
  181. ffbb_data_client/models/tournoi_types_3x3_libelle_enum.py +10 -0
  182. ffbb_data_client/models/tournois_facet_distribution.py +41 -0
  183. ffbb_data_client/models/tournois_facet_stats.py +14 -0
  184. ffbb_data_client/models/tournois_hit.py +132 -0
  185. ffbb_data_client/models/tournois_hit_type.py +5 -0
  186. ffbb_data_client/models/tournois_libelle.py +7 -0
  187. ffbb_data_client/models/tournois_multi_search_query.py +40 -0
  188. ffbb_data_client/models/type_association.py +23 -0
  189. ffbb_data_client/models/type_association_libelle.py +30 -0
  190. ffbb_data_client/models/type_class.py +23 -0
  191. ffbb_data_client/models/type_competition.py +8 -0
  192. ffbb_data_client/models/type_competition_generique.py +31 -0
  193. ffbb_data_client/models/type_enum.py +7 -0
  194. ffbb_data_client/models/type_league.py +6 -0
  195. ffbb_data_client/py.typed +0 -0
  196. ffbb_data_client/utils/__init__.py +27 -0
  197. ffbb_data_client/utils/cache_manager.py +393 -0
  198. ffbb_data_client/utils/converter_utils.py +329 -0
  199. ffbb_data_client/utils/input_validation.py +360 -0
  200. ffbb_data_client/utils/retry_utils.py +478 -0
  201. ffbb_data_client/utils/secure_logging.py +153 -0
  202. ffbb_data_client/utils/token_manager.py +115 -0
  203. ffbb_data_client-2.0.0.dist-info/METADATA +339 -0
  204. ffbb_data_client-2.0.0.dist-info/RECORD +207 -0
  205. ffbb_data_client-2.0.0.dist-info/WHEEL +5 -0
  206. ffbb_data_client-2.0.0.dist-info/licenses/LICENSE.txt +201 -0
  207. ffbb_data_client-2.0.0.dist-info/top_level.txt +2 -0
@@ -0,0 +1,115 @@
1
+ """Token management for FFBB API clients."""
2
+
3
+ from __future__ import annotations
4
+
5
+ import os
6
+ from dataclasses import dataclass
7
+
8
+ from ..config import (
9
+ API_FFBB_BASE_URL,
10
+ DEFAULT_USER_AGENT,
11
+ ENDPOINT_CONFIGURATION,
12
+ ENV_API_TOKEN,
13
+ ENV_MEILISEARCH_TOKEN,
14
+ )
15
+ from ..helpers.http_requests_helper import catch_result
16
+ from ..helpers.http_requests_utils import http_get_json
17
+ from ..models.configuration_models import GetConfigurationResponse
18
+ from ..utils.cache_manager import CacheConfig, CacheManager
19
+
20
+
21
+ @dataclass
22
+ class FFBBTokens:
23
+ """Container for FFBB API tokens."""
24
+
25
+ api_token: str
26
+ meilisearch_token: str
27
+
28
+
29
+ class TokenManager:
30
+ """
31
+ Manages FFBB API tokens.
32
+
33
+ Resolution order:
34
+ 1. Environment variables
35
+ 2. Fetch from FFBB API configuration endpoint (public, HTTP cached)
36
+
37
+ Example:
38
+ tokens = TokenManager.get_tokens()
39
+ client = FFBBDataClient.create(
40
+ api_bearer_token=tokens.api_token,
41
+ meilisearch_bearer_token=tokens.meilisearch_token
42
+ )
43
+ """
44
+
45
+ @staticmethod
46
+ def get_tokens(
47
+ cache_config: CacheConfig | None = None,
48
+ use_cache: bool | None = None,
49
+ ) -> FFBBTokens:
50
+ """
51
+ Get FFBB tokens from environment or API.
52
+
53
+ Args:
54
+ cache_config: Optional cache configuration object for advanced settings.
55
+ use_cache: Simple boolean to enable/disable caching (mutually exclusive with cache_config).
56
+
57
+ Returns:
58
+ FFBBTokens with api_token and meilisearch_token
59
+
60
+ Raises:
61
+ ValueError: If both cache_config and use_cache are provided.
62
+
63
+ Note:
64
+ If neither cache_config nor use_cache is provided, default caching is used.
65
+ """
66
+ if cache_config is not None and use_cache is not None:
67
+ raise ValueError(
68
+ "Cannot specify both 'cache_config' and 'use_cache' parameters"
69
+ )
70
+
71
+ # Convert simple use_cache boolean to CacheConfig if provided
72
+ if use_cache is not None:
73
+ cache_config = CacheConfig(enabled=use_cache)
74
+
75
+ # Try environment variables first
76
+ api_token = os.getenv(ENV_API_TOKEN)
77
+ meilisearch_token = os.getenv(ENV_MEILISEARCH_TOKEN)
78
+
79
+ if api_token and meilisearch_token:
80
+ return FFBBTokens(api_token=api_token, meilisearch_token=meilisearch_token)
81
+
82
+ # Fetch from API (HTTP layer handles caching)
83
+ config = TokenManager._fetch_configuration(cache_config)
84
+ return FFBBTokens(
85
+ api_token=config.api_bearer_token,
86
+ meilisearch_token=config.meilisearch_token,
87
+ )
88
+
89
+ @staticmethod
90
+ def _fetch_configuration(
91
+ cache_config: CacheConfig | None = None,
92
+ ) -> GetConfigurationResponse:
93
+ """Fetch configuration from FFBB API (public endpoint)."""
94
+ cache_manager = CacheManager(cache_config)
95
+ cached_session = cache_manager.session
96
+
97
+ config_url = f"{API_FFBB_BASE_URL}{ENDPOINT_CONFIGURATION}"
98
+ headers = {"user-agent": DEFAULT_USER_AGENT}
99
+
100
+ data = catch_result(
101
+ lambda: http_get_json(
102
+ config_url,
103
+ headers,
104
+ cached_session=cached_session,
105
+ )
106
+ )
107
+
108
+ actual_data = data.get("data") if data and isinstance(data, dict) else data
109
+
110
+ if not actual_data:
111
+ raise RuntimeError("Failed to fetch configuration from FFBB API")
112
+
113
+ from pydantic import TypeAdapter
114
+
115
+ return TypeAdapter(GetConfigurationResponse).validate_python(actual_data)
@@ -0,0 +1,339 @@
1
+ Metadata-Version: 2.4
2
+ Name: ffbb_data_client
3
+ Version: 2.0.0
4
+ Summary: FFBB API Python Client (V3) — SDK asynchrone pour les Statistiques de Basket France. Type-safe Pydantic models, async/sync, Meilisearch.
5
+ Home-page: https://github.com/nickdesi/ffbb-data-client
6
+ Author: nickdesi
7
+ Author-email: nicolas.desimone@gmail.com
8
+ License: Apache-2.0
9
+ Project-URL: Homepage, https://nickdesi.github.io/ffbb-data-client/
10
+ Project-URL: Documentation, https://nickdesi.github.io/ffbb-data-client/
11
+ Project-URL: Source, https://github.com/nickdesi/ffbb-data-client
12
+ Project-URL: Changelog, https://github.com/nickdesi/ffbb-data-client/blob/main/CHANGELOG.md
13
+ Project-URL: Tracker, https://github.com/nickdesi/ffbb-data-client/issues
14
+ Project-URL: Release Notes, https://github.com/nickdesi/ffbb-data-client/blob/main/RELEASE_NOTES.md
15
+ Keywords: ffbb,basketball,statistiques,france,api,python-sdk,pydantic,asynchrone,meilisearch,basket-france
16
+ Platform: any
17
+ Classifier: Development Status :: 4 - Beta
18
+ Classifier: Programming Language :: Python
19
+ Classifier: Programming Language :: Python :: 3
20
+ Classifier: Programming Language :: Python :: 3.10
21
+ Classifier: Programming Language :: Python :: 3.11
22
+ Classifier: Programming Language :: Python :: 3.12
23
+ Classifier: Programming Language :: Python :: 3.13
24
+ Classifier: Programming Language :: Python :: 3.14
25
+ Classifier: Intended Audience :: Developers
26
+ Classifier: Topic :: Software Development :: Libraries :: Python Modules
27
+ Classifier: Topic :: Software Development :: Libraries
28
+ Classifier: Topic :: Internet :: WWW/HTTP :: Dynamic Content
29
+ Classifier: Framework :: AsyncIO
30
+ Classifier: Operating System :: OS Independent
31
+ Classifier: Natural Language :: French
32
+ Requires-Python: >=3.10
33
+ Description-Content-Type: text/markdown; charset=UTF-8
34
+ License-File: LICENSE.txt
35
+ Requires-Dist: python-dotenv>=1.2.2
36
+ Requires-Dist: readme_renderer[md]>=44.0
37
+ Requires-Dist: python-dateutil>=2.9.0.post0
38
+ Requires-Dist: httpx>=0.28.1
39
+ Requires-Dist: hishel[async]>=1.2.1
40
+ Requires-Dist: pydantic>=2.13.3
41
+ Provides-Extra: testing
42
+ Requires-Dist: setuptools>=82.0.1; extra == "testing"
43
+ Requires-Dist: coverage>=7.13.5; extra == "testing"
44
+ Requires-Dist: pytest>=9.0.3; extra == "testing"
45
+ Requires-Dist: pytest-xdist>=3.8.0; extra == "testing"
46
+ Requires-Dist: pytest-cov>=7.1.0; extra == "testing"
47
+ Requires-Dist: respx>=0.23.1; extra == "testing"
48
+ Requires-Dist: pytest-asyncio>=1.3.0; extra == "testing"
49
+ Provides-Extra: typing
50
+ Requires-Dist: types-python-dateutil>=2.9.0.20260408; extra == "typing"
51
+ Dynamic: license-file
52
+
53
+ <div align="center">
54
+
55
+ # 🏀 FFBB API Python Client V3
56
+
57
+ **SDK Python moderne, typé et asynchrone pour exploiter les données publiques FFBB : clubs, compétitions, rencontres, classements, salles, officiels et recherche Meilisearch.**
58
+
59
+ [![PyPI](https://img.shields.io/pypi/v/ffbb_data_client?color=blue&label=PyPI&logo=python)](https://pypi.org/project/ffbb_data_client/)
60
+ [![Python](https://img.shields.io/pypi/pyversions/ffbb_data_client?logo=python)](https://pypi.org/project/ffbb_data_client/)
61
+ [![CI](https://github.com/nickdesi/ffbb-data-client/actions/workflows/ci.yml/badge.svg)](https://github.com/nickdesi/ffbb-data-client/actions/workflows/ci.yml)
62
+ [![Coverage Status](https://coveralls.io/repos/github/nickdesi/ffbb-data-client/badge.svg?branch=master)](https://coveralls.io/github/nickdesi/ffbb-data-client?branch=master)
63
+ [![License](https://img.shields.io/pypi/l/ffbb_data_client?color=green)](LICENSE.txt)
64
+ [![MCP-Ready](https://img.shields.io/badge/MCP-Ready-orange.svg?logo=modelcontextprotocol)](https://github.com/nickdesi/FFBB-MCP-Server)
65
+
66
+ [Installation](#-installation) •
67
+ [Démarrage rapide](#-démarrage-rapide) •
68
+ [Fonctionnalités](#-fonctionnalités) •
69
+ [Recherche](#-recherche-meilisearch) •
70
+ [Async](#-utilisation-asynchrone) •
71
+ [Développement](#-développement-local)
72
+
73
+ </div>
74
+
75
+ ---
76
+
77
+ ## 📌 À propos
78
+
79
+ `ffbb_data_client` simplifie l'accès aux API FFBB et à leurs index Meilisearch avec :
80
+
81
+ - une façade unique : `FFBBDataClient` ;
82
+ - des modèles Pydantic v2 typés ;
83
+ - une API utilisable en synchrone ou en `async/await` ;
84
+ - une gestion automatique des tokens via `TokenManager` ;
85
+ - du cache HTTP configurable via `hishel` ;
86
+ - des helpers prêts pour l'intégration MCP / agents IA.
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
+ ---
91
+
92
+ ## 🚀 Version v1.7.0 — 30 avril 2026
93
+
94
+ Principales évolutions récentes :
95
+
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.
102
+
103
+ Voir aussi : [`CHANGELOG.md`](CHANGELOG.md) et [`RELEASE_NOTES.md`](RELEASE_NOTES.md).
104
+
105
+ ---
106
+
107
+ ## 📦 Installation
108
+
109
+ ```bash
110
+ pip install ffbb_data_client
111
+ ```
112
+
113
+ Pour contribuer ou exécuter les tests :
114
+
115
+ ```bash
116
+ git clone https://github.com/nickdesi/ffbb-data-client.git
117
+ cd ffbb-data-client
118
+ pip install -e ".[testing]"
119
+ ```
120
+
121
+ Prérequis : Python `>=3.10`.
122
+
123
+ ---
124
+
125
+ ## ⚡ Démarrage rapide
126
+
127
+ ```python
128
+ from ffbb_data_client import FFBBDataClient
129
+
130
+ client = FFBBDataClient.create()
131
+
132
+ # Recherche globale sur les index FFBB
133
+ results = client.multi_search("Pau Orthez")
134
+
135
+ for result in results or []:
136
+ print(result.index_uid, len(result.hits or []))
137
+
138
+ # Lives en cours
139
+ lives = client.get_lives()
140
+ ```
141
+
142
+ `FFBBDataClient.create()` résout automatiquement les tokens si aucun token n'est passé explicitement.
143
+
144
+ ---
145
+
146
+ ## ✨ Fonctionnalités
147
+
148
+ | Domaine | Capacités |
149
+ |---|---|
150
+ | API FFBB | clubs, compétitions, organismes, saisons, poules, classements, rencontres, lives |
151
+ | Recherche | organismes, compétitions, rencontres, salles, terrains, pratiques, tournois, engagements et formations |
152
+ | 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 |
156
+ | IA / MCP | structure compatible avec des wrappers MCP et agents IA |
157
+
158
+ ---
159
+
160
+ ## 🔍 Recherche Meilisearch
161
+
162
+ ### Recherche globale
163
+
164
+ ```python
165
+ results = client.multi_search("Clermont")
166
+ ```
167
+
168
+ ### Recherche ciblée
169
+
170
+ ```python
171
+ organismes = client.search_organismes(
172
+ "Clermont",
173
+ filter=['codePostal = "63000"'],
174
+ sort=["nom:asc"],
175
+ limit=10,
176
+ )
177
+
178
+ rencontres = client.search_rencontres("N1M", limit=20)
179
+ salles = client.search_salles("Maison des Sports", limit=5)
180
+ engagements = client.search_engagements("U15M", limit=20)
181
+ ```
182
+
183
+ ### Recherche géographique
184
+
185
+ ```python
186
+ clubs = client.search_organismes_by_geo(
187
+ lat=45.7772,
188
+ lng=3.0870,
189
+ radius_km=20,
190
+ limit=20,
191
+ )
192
+ ```
193
+
194
+ ### Principales méthodes exposées
195
+
196
+ | Ressource | Méthode sync | Méthode async |
197
+ |---|---|---|
198
+ | Recherche globale | `multi_search()` | `multi_search_async()` |
199
+ | Clubs / organismes | `search_organismes()` | `search_organismes_async()` |
200
+ | Compétitions | `search_competitions()` | `search_competitions_async()` |
201
+ | Rencontres | `search_rencontres()` | `search_rencontres_async()` |
202
+ | Salles | `search_salles()` | `search_salles_async()` |
203
+ | Terrains | `search_terrains()` | `search_terrains_async()` |
204
+ | Pratiques | `search_pratiques()` | `search_pratiques_async()` |
205
+ | Tournois | `search_tournois()` | `search_tournois_async()` |
206
+ | Engagements | `search_engagements()` | `search_engagements_async()` |
207
+ | Formations | `search_formations()` | `search_formations_async()` |
208
+
209
+ ---
210
+
211
+ ## 🧱 Accès REST typé
212
+
213
+ ```python
214
+ # Ressources principales
215
+ organisme = client.get_organisme(12345)
216
+ competition = client.get_competition(67890)
217
+ poule = client.get_poule(11111)
218
+
219
+ # Ressources ajoutées récemment
220
+ rencontre = client.get_rencontre(22222)
221
+ officiel = client.get_officiel(33333)
222
+ entraineur = client.get_entraineur(44444)
223
+ ```
224
+
225
+ Les assets Directus et autres collections peuvent être exploités via les méthodes REST/listing dédiées exposées par le client lorsque disponibles.
226
+
227
+ Les réponses sont converties en modèles Pydantic lorsque le schéma est connu, ce qui apporte validation, autocomplétion et sérialisation propre.
228
+
229
+ ---
230
+
231
+ ## 🧵 Utilisation asynchrone
232
+
233
+ ```python
234
+ import asyncio
235
+ from ffbb_data_client import FFBBDataClient
236
+
237
+ async def main() -> None:
238
+ client = FFBBDataClient.create()
239
+
240
+ results = await client.search_organismes_async("ASVEL")
241
+ lives = await client.get_lives_async()
242
+
243
+ print(results.estimated_total_hits if results else 0)
244
+ print(len(lives or []))
245
+
246
+ asyncio.run(main())
247
+ ```
248
+
249
+ ---
250
+
251
+ ## 🔐 Tokens et configuration
252
+
253
+ Par défaut, le client utilise `TokenManager.get_tokens()` au moment de la création :
254
+
255
+ ```python
256
+ from ffbb_data_client import FFBBDataClient, TokenManager
257
+
258
+ tokens = TokenManager.get_tokens()
259
+
260
+ client = FFBBDataClient.create(
261
+ api_bearer_token=tokens.api_token,
262
+ meilisearch_bearer_token=tokens.meilisearch_token,
263
+ )
264
+ ```
265
+
266
+ Il est donc possible de laisser le client résoudre les tokens automatiquement ou de les fournir explicitement selon le contexte d'exécution.
267
+
268
+ ---
269
+
270
+ ## 🏗 Architecture
271
+
272
+ ```text
273
+ src/ffbb_data_client/
274
+ ├── 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
282
+ ```
283
+
284
+ ---
285
+
286
+ ## 🧪 Développement local
287
+
288
+ ```bash
289
+ pip install -e ".[testing]"
290
+ pytest tests/
291
+ ```
292
+
293
+ Commandes utiles :
294
+
295
+ ```bash
296
+ pytest tests/unit/
297
+ pytest tests/integration/
298
+ pytest tests/ --cov=src
299
+ ```
300
+
301
+ Documentation complémentaire :
302
+
303
+ - [`LOCAL_CI_GUIDE.md`](LOCAL_CI_GUIDE.md)
304
+ - [`docs/testing_conventions.md`](docs/testing_conventions.md)
305
+ - [`docs/architecture.rst`](docs/architecture.rst)
306
+
307
+ ---
308
+
309
+ ## 🤖 Intégration IA / MCP
310
+
311
+ Le client sert de base au serveur MCP FFBB et expose une API stable pour construire des outils agent-friendly : recherche de clubs, récupération de poules, classements, lives, calendriers et détails de rencontres.
312
+
313
+ Projet associé : [FFBB-MCP-Server](https://github.com/nickdesi/FFBB-MCP-Server)
314
+
315
+ ---
316
+
317
+ ## 🤝 Contribuer
318
+
319
+ Les contributions sont bienvenues :
320
+
321
+ - ouvrez une [issue](https://github.com/nickdesi/ffbb-data-client/issues) pour un bug ;
322
+ - proposez une évolution via les [discussions](https://github.com/nickdesi/ffbb-data-client/discussions) ;
323
+ - lancez les tests localement avant une pull request.
324
+
325
+ ---
326
+
327
+ ## 📄 Licence
328
+
329
+ Distribué sous licence Apache-2.0. Voir [`LICENSE.txt`](LICENSE.txt).
330
+
331
+ ---
332
+
333
+ <div align="center">
334
+
335
+ **Si ce projet vous aide, une étoile est appréciée. ⭐**
336
+
337
+ [![GitHub stars](https://img.shields.io/github/stars/nickdesi/ffbb-data-client?style=social)](https://github.com/nickdesi/ffbb-data-client/stargazers)
338
+
339
+ </div>
@@ -0,0 +1,207 @@
1
+ ffbb_api_client_v3/__init__.py,sha256=g_Lvo8LAHPMQmecCLLPt3-_6m5r_OU_GXz6BQ9gw-aE,736
2
+ ffbb_data_client/__init__.py,sha256=b9x5XJsqIUDoNlYaa7oqCrq1he5dETIve72Y4nWSCXA,6556
3
+ ffbb_data_client/config.py,sha256=MHcGXFOedAPf_i6De7jWL6hgnU2GMoFKvhtTGplNXhQ,4665
4
+ ffbb_data_client/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
5
+ ffbb_data_client/clients/__init__.py,sha256=y2dMaPmCH2E2jIB-7tPnlxD49xq1QFbQPbtsNbs8dZw,368
6
+ ffbb_data_client/clients/api_ffbb_app_client.py,sha256=p8Up53eQA7YJu9ig4yAaGlgKKVRt9Jm2URUtuEkn5Vg,87503
7
+ ffbb_data_client/clients/ffbb_data_client.py,sha256=abeiFkbw5L_us2Zb1RiTU1w2fU5XILtzewlWfPdNu8U,102076
8
+ ffbb_data_client/clients/meilisearch_client.py,sha256=n5RaHO8om4JKLaxvDcdBnlBQH16JoIBqP6ixkOUTj9U,7501
9
+ ffbb_data_client/clients/meilisearch_ffbb_client.py,sha256=-OrShwAYBFgQKqRhx6f5TES5m19Yru_MLUpY3LTrXUQ,21301
10
+ ffbb_data_client/data/__init__.py,sha256=JydabW1QdWT6euj_uKJ3x1slbhuJmQc1JTeSYWsia_0,629
11
+ ffbb_data_client/data/collections.json,sha256=md3ztxsuX0rbGpTM1a46o6xfUG3ATZZrHUeUIGIb3Vw,32308
12
+ ffbb_data_client/data/endpoint_discovery.json,sha256=rPz2OC_Mi8yqUO3YqzMQ_AeKOzcABpNgMGPpTRutFok,47285
13
+ ffbb_data_client/data/indexes.json,sha256=6Vp2zhAzMpgxor1fJzUHa9ODZI1RWAJDFEDaXuGM_9M,10775
14
+ ffbb_data_client/data/openapi.json,sha256=pDO9h97D5tyVA0j9pAtJJ5KpVYD8-vWxYXgPsGw2Nmg,978757
15
+ ffbb_data_client/data/openapi_full.json,sha256=COzzhYaKp01EDfujFOZgY3Gaqkry8APkslZfpk1oYhU,1033004
16
+ ffbb_data_client/helpers/__init__.py,sha256=t51TgI33J9zOVC8Wj3pIiPaY_gGaJfu4VMlmb75xk3Y,630
17
+ ffbb_data_client/helpers/http_requests_helper.py,sha256=LOn2eLdoHM9Tt84y_v9kuMPcUd9EpnvV18A0jyq1ueA,1975
18
+ ffbb_data_client/helpers/http_requests_utils.py,sha256=LB-GwPBrN_slKsIbS33LQlzRyAQqOpCNM7AEsIQu-TI,15838
19
+ ffbb_data_client/helpers/meilisearch_client_extension.py,sha256=xc7gvHQke5oAVIKKa2lyTSh1PdRZrhG8psSEpBhbfNk,5810
20
+ ffbb_data_client/helpers/multi_search_query_helper.py,sha256=SCk8uDoC3c5buAMyiGcEMOQIJ30D8FWbXudFIMrFwE0,1780
21
+ ffbb_data_client/models/__init__.py,sha256=FKUcoNUUSe94Pkg-3reUYR_abS73chl4ThfhEUvNFXs,8478
22
+ ffbb_data_client/models/affiche.py,sha256=eETToOKavwaNC2MXZTdtV5n8d7SpftMyP9KP8V6PiF8,1224
23
+ ffbb_data_client/models/cartographie.py,sha256=uyO7B_Th1DA49Jbyk2ZHKgcCT7_ybU6UZz0m-oTmSe4,2809
24
+ ffbb_data_client/models/categorie.py,sha256=pf0rt3s9KLj9BbtZ0zxSpGCqyJnMm-NCKbhKQY-7Pm8,1669
25
+ ffbb_data_client/models/categorie_type.py,sha256=jtnXS2MFVOhKdtu3_zDXcMwTt-DMaQ_t0uub6jPZYiA,833
26
+ ffbb_data_client/models/clock.py,sha256=sdRlH1rnjHXMbZScOlwBXpG8ER_vocIF_mTPs2ggm6k,1066
27
+ ffbb_data_client/models/club_contacts.py,sha256=z83zatuQdFYFtPO-qhqtmaqFtuLBA3Y4CgdTlvR6sPo,2536
28
+ ffbb_data_client/models/code.py,sha256=CNbKO-moSoW4vnlZsKm6ZImngygEWKbkyEUOfyOIBW4,86
29
+ ffbb_data_client/models/commune.py,sha256=-7jT5EVNqlBpHUGNCfkf07mUAhOvoWWlQnzgvAErKvs,2330
30
+ ffbb_data_client/models/competition_fields.py,sha256=VDHguZVSdL7_gSW1svTUzlBt2_Jjt332hiwwCb53rxk,12926
31
+ ffbb_data_client/models/competition_id.py,sha256=5YeCVx-Bfdiw423NPJm6IhQ4qqEJkwtF50R_Ak_SMNU,4571
32
+ ffbb_data_client/models/competition_id_categorie.py,sha256=CWsHm0BO5vAbrCPebtoWpx4hFwXqKKe0Ic-iIt7nvoM,900
33
+ ffbb_data_client/models/competition_id_sexe.py,sha256=p2sCt2d8Jgmiguaq9_ItUKA3domj0rdg_BnFGJeEvFg,921
34
+ ffbb_data_client/models/competition_id_type_competition.py,sha256=faKGBGRcJgQU5blWN-fKgB2ZoE_aLrZS62YAkLCSHgA,791
35
+ ffbb_data_client/models/competition_id_type_competition_generique.py,sha256=BG0db1ycEKTCa1pc3ZUb6mBw4HtBvdjRUo33gnIyViQ,730
36
+ ffbb_data_client/models/competition_origine.py,sha256=A5C0qHYwciHjPFbA5EQCW1o3xBzd3aSVTFfLduzwwKU,2378
37
+ ffbb_data_client/models/competition_origine_categorie.py,sha256=0NgeYFHNw0moDCE8S3OkbXFd5l08B8s4B3l1lEOekC0,583
38
+ ffbb_data_client/models/competition_origine_type_competition.py,sha256=WuPyW3gb1HUXJLUGWi_OrcpsXyADfyVbK_uTz8rQcLA,328
39
+ ffbb_data_client/models/competition_origine_type_competition_generique.py,sha256=L1KpAnRmQL72Knv3uBla2bhNZHv4zk4C-M_DUMtUHGQ,695
40
+ ffbb_data_client/models/competition_type.py,sha256=eOqfvmcbetx_VAJEMujB-9GilIvApS6FYFoSeoc3D8I,103
41
+ ffbb_data_client/models/competitions_facet_distribution.py,sha256=W7s9Yh48ehZKvy9NMN-zrMJL6eDmpMu0QcxYUqzni6Y,2975
42
+ ffbb_data_client/models/competitions_facet_stats.py,sha256=F44MGuCALLUXU2CdMg9TfRtk8A8vjYpR8rf8IOVJUHs,318
43
+ ffbb_data_client/models/competitions_hit.py,sha256=YgNz9mOq42F5sLZAWH6VhabLxKi2aUUfLSf4HZWRqkw,9614
44
+ ffbb_data_client/models/competitions_multi_search_query.py,sha256=qPtLQHsINOqSNyJzmpcBEnj-Ecq3031A7TiiAeDtVhQ,1350
45
+ ffbb_data_client/models/competitions_query.py,sha256=6NrHeSK-_6AxTy6z_XZdg6zwTEY2VEBnEh7FQMY2rSk,321
46
+ ffbb_data_client/models/configuration_models.py,sha256=b8S3H1wrDoLhXKDWeMFdewk98y5qNGXrRT4t90J7l1w,180
47
+ ffbb_data_client/models/contact_info.py,sha256=29dP0jn9kwPbwaYWIQ8-1RhwFA7S1x0kp47UAAnQTmQ,460
48
+ ffbb_data_client/models/content_multi_search_query.py,sha256=sHJs5pBqVJX83IioCcrcX9UdsfOJB0Z8egUniX2gZxg,2398
49
+ ffbb_data_client/models/coordonnees.py,sha256=cgrBUdQZIfbjBKGiBSQXhEYu_81sZpg_gx3b7Kn9-yA,759
50
+ ffbb_data_client/models/coordonnees_type.py,sha256=zfNjyn4c-Aqi8uYabQ7bCL_hjkQqOwOUWC0_tAeQbb4,73
51
+ ffbb_data_client/models/document_flyer.py,sha256=ssndp1IQATQHuFwBqExZdst9WfIO64Vrh2mAP_ts1uQ,8183
52
+ ffbb_data_client/models/document_flyer_type.py,sha256=nx6bB7FQOtSJWGh08T7y6vhnmKOhk1THkfwZA-I6QXQ,113
53
+ ffbb_data_client/models/engagement_contacts.py,sha256=Y0vFheTcskX_Ff7qNPAFyYBieXITM7be1zBRw4x-GCI,3265
54
+ ffbb_data_client/models/engagements_facet_distribution.py,sha256=i3t-Zc9GOltAvzUpMCf4rPvvcg3l8OY9hwPQNYCVUKg,2629
55
+ ffbb_data_client/models/engagements_facet_stats.py,sha256=o_-05vIVWMzhC9QZBlvn-AtyB6jOZC6boRuQhQKVDo0,315
56
+ ffbb_data_client/models/engagements_hit.py,sha256=KONm_jVmzIeKCCUe0SmQ-pnjvHdYFlJ__tJ1_Qqn2Co,7506
57
+ ffbb_data_client/models/engagements_multi_search_query.py,sha256=bPCGtGgRgBbAymDfiW3bUOwzgF7mvFG94ZMpL4s1nfE,1421
58
+ ffbb_data_client/models/etat.py,sha256=FqxyjROWJVf4xzlHF_LmBNw4QCeGQ9rIzFVHISD_e1Y,66
59
+ ffbb_data_client/models/external_competition_id.py,sha256=DaLNHj3BHkzHEF0m90b-5gz6T1IwdNhSkO3m2kcf7qk,1158
60
+ ffbb_data_client/models/external_id.py,sha256=4zmSINctnoBiBK2clzVeuxQkHv3K9jL0d_52xWqPTrU,2704
61
+ ffbb_data_client/models/facet_distribution.py,sha256=Ocez-lX8MiBIT6DgIzZ11RV5S74RMx0AJ9aZF2U8XJI,344
62
+ ffbb_data_client/models/facet_stats.py,sha256=MLG93BXS7JdLmt3C5SszhqB6pYFZUIJj30H_FWs3o-g,361
63
+ ffbb_data_client/models/field_set.py,sha256=OmfJdMVht5h4KN7RNGLwQTPutS95wfxC1rdmC1oNnx0,182
64
+ ffbb_data_client/models/folder.py,sha256=Ikc4lSftUrlc28F2r0Dw-hA99vYtd9_7k8wXWI_kTio,863
65
+ ffbb_data_client/models/formation_session.py,sha256=JMnCUDxa7cofzPFyb6Tj7Bz3tj_Pr1D8f42U2PHWA5s,2108
66
+ ffbb_data_client/models/formations_facet_distribution.py,sha256=SKQkXJFucKrjoAxOBSh3X-YbQ0yR742FpzTjtGe6SOs,2304
67
+ ffbb_data_client/models/formations_facet_stats.py,sha256=uck76NLcy7n0p8GXsJL0tmvGP3cjQcaGm44Ed4UFipM,312
68
+ ffbb_data_client/models/formations_hit.py,sha256=qeALpqnqBxziwtQa_xvHBL-BUAar5kQKnrADuIxeNv8,11399
69
+ ffbb_data_client/models/formations_multi_search_query.py,sha256=8qFdN19aIX82tjcL69aonu4SufgLL5C9gLTscyz4NKM,1407
70
+ ffbb_data_client/models/game_stats_model.py,sha256=QoIjhVr_aNpkuqbxhdccnGmIpVywiy14LyEl8QVwTmk,1932
71
+ ffbb_data_client/models/game_stats_models.py,sha256=uuSRai1Qgjz3MC4l75DAYmLjjLM_lMXiUBFEBxMNuKU,140
72
+ ffbb_data_client/models/generic_search.py,sha256=T7N_OhnnuYABH6nZgyVeRLceNK6mYTGemPeygaZi6Og,2641
73
+ ffbb_data_client/models/geo.py,sha256=y8SOKvcoHIEufQUeiyyZ5RVfes1CXwoLsIS0BgcyVFY,646
74
+ ffbb_data_client/models/geo_sort_order.py,sha256=2bdDnFZiXJIjSAcNe_e8ejti-7wGAzRx-djW7e8uZlI,109
75
+ ffbb_data_client/models/get_commune_response.py,sha256=QzGjPA61zJkAWszqSW8xNuAa8ulylhoBdw5zYgM4Vqo,468
76
+ ffbb_data_client/models/get_competition_response.py,sha256=IlIUd9Vc36ehnltfVuSmNLlRcQE2SLhiX29HeEecbrc,23259
77
+ ffbb_data_client/models/get_configuration_response.py,sha256=aUJgLB0dd36l-gtYX1C1s4VcbnEcYFXDoEmN_34kJ4Y,1426
78
+ ffbb_data_client/models/get_engagement_response.py,sha256=_sS88D3baQOsEkuWD330g601yetxcwLWpmzPmI4OvO8,677
79
+ ffbb_data_client/models/get_entraineur_response.py,sha256=KCxmfIeJ12MefZFOvPweEqbKSOE36WsvCUdDcocnOfc,450
80
+ ffbb_data_client/models/get_formation_response.py,sha256=7hnahTxqG1Z0XWeVbhQl-LKVoing3doYL2SAUob39M4,802
81
+ ffbb_data_client/models/get_officiel_response.py,sha256=Ogh_io0wLkgOH-S1LNdBVNBMzD0WQAqmNy9BKpLvH_s,446
82
+ ffbb_data_client/models/get_organisme_response.py,sha256=fc_UllH7s--3tVTfi7JQR89BlWIPCpY1pZk8YAWg7bk,16873
83
+ ffbb_data_client/models/get_poule_response.py,sha256=4mAb5DXokr3mBmNe4L6YlFo9DycktdRmvURhGoOYTXA,2549
84
+ ffbb_data_client/models/get_pratique_response.py,sha256=DgcGZ4kYVZj67GWjjj0a0WEGj8ZXjtynPaaZIxwyUTA,446
85
+ ffbb_data_client/models/get_rencontre_response.py,sha256=Hpe5wjp7ktSp5P8p8zz3J6dB-Rh7csq6Yb5YcYc_KRc,3555
86
+ ffbb_data_client/models/get_saisons_response.py,sha256=QBs9wHFFmPrA0eXgFKpa8hv8aMyrZB8gr77n5f4PTWM,1847
87
+ ffbb_data_client/models/get_salle_response.py,sha256=fZ3FyVXDdMHadh6nAdAaJ6FRNOdnRfIoiVik8NUm6EY,524
88
+ ffbb_data_client/models/get_terrain_response.py,sha256=81w1iGiMlP7mjFmz2ARjdXdm3mcff3S_jVRthOnUO-A,375
89
+ ffbb_data_client/models/get_tournoi_response.py,sha256=XB4xqdj6VOXnqO1BnkK5PGdh55ar_k9xUxq1sr6smsw,387
90
+ ffbb_data_client/models/gradient_color.py,sha256=b6YPuG77kzxYCwk2imJ-z7kwVE8QCABWV8eebOf07-E,638
91
+ ffbb_data_client/models/hit.py,sha256=rKjIy-NPSrw3tQORSSCIBFyGMz0y0t6n8El3BFQ9glE,362
92
+ ffbb_data_client/models/id_engagement_equipe.py,sha256=CjI7ofaaWiPoqKFyCjmbEIYsdX1BbsOShAMdL0A5wIk,928
93
+ ffbb_data_client/models/id_organisme_equipe.py,sha256=uQk2bLEBN28U5oWY98kI_2-QKykPPX6cO4mAuOEnUrM,1592
94
+ ffbb_data_client/models/id_organisme_equipe1_logo.py,sha256=I5uO_9KD7Pw2dfn80AVEh0sIrakS04y5Uqu704jbOvk,813
95
+ ffbb_data_client/models/id_poule.py,sha256=MV5_0kq2aY1HTSUuEjSIHZb6yW7jQpkPzgrCJv1POSE,640
96
+ ffbb_data_client/models/jour.py,sha256=ZBPjd69VAlp2zHD6p0EXwJycspzVeYabVRVqTEGt9gQ,207
97
+ ffbb_data_client/models/label.py,sha256=0SCYfJaL4c3x_1jND8BnYEyH02KgVuTJMhkXqiult2o,557
98
+ ffbb_data_client/models/labellisation.py,sha256=4cAWvmUWcbjurIjwWkHY52wNNcB1es-oi3zJL7gWrZU,961
99
+ ffbb_data_client/models/live.py,sha256=JqlU1BaDYI-ZedcO26j8B-8QkZDWyl5Bp_kKqr3HaSE,7795
100
+ ffbb_data_client/models/lives.py,sha256=T3zTpd3YwAtnuKrEVn0DCaZ_XgML50XGE9LWKIco8mY,192
101
+ ffbb_data_client/models/logo.py,sha256=xX24v3n9vAyedkcn38c0yyuGrPJH0EDcHUFNLRNC-s0,759
102
+ ffbb_data_client/models/multi_search_queries.py,sha256=6BXtStGs5QVpcRPaCTnDxNJj_eqdaMBAyt3lMEFDAHE,693
103
+ ffbb_data_client/models/multi_search_query.py,sha256=xharNIwaUaUYS8hGM9I-JLPIedEElxt_fA-rA1rVnSo,3132
104
+ ffbb_data_client/models/multi_search_result_competitions.py,sha256=sNyOqn8sm82WSiXl2tQFwt7eqLtiKYurdviGt9xvwAc,466
105
+ ffbb_data_client/models/multi_search_result_engagements.py,sha256=5FNlTpg-kRymlviG-39hF39lIZxlpA8YnIOxC5gAXa8,455
106
+ ffbb_data_client/models/multi_search_result_formations.py,sha256=6c5SrHMcI_Hg7vrmhpziUMznVKqMOX--2E-Hjp5FPGA,430
107
+ ffbb_data_client/models/multi_search_result_organismes.py,sha256=nqORa-_DoUhlkjLSbe2awSeD72at8EjddUhqsoyMcmQ,430
108
+ ffbb_data_client/models/multi_search_result_pratiques.py,sha256=5BpYIYEqDjVtd6kVtqXY5PFhWCmYvvAWeuAXiZGvjVE,419
109
+ ffbb_data_client/models/multi_search_result_rencontres.py,sha256=Nv9HMctxCJBkKgHhsxx9NYMJsm4bO2216Acm1A2se64,430
110
+ ffbb_data_client/models/multi_search_result_salles.py,sha256=szmBiUe71yBEIZepP2g7Fw1R7T3yn5Glr9CTq95DsEo,386
111
+ ffbb_data_client/models/multi_search_result_terrains.py,sha256=oXAj8n3TVqTRQsUtVp_sOGJQ25iopbV_wHYn1ks0fqA,408
112
+ ffbb_data_client/models/multi_search_result_tournois.py,sha256=6IEqlb3wOA_-BFxVJAGIpP-rfG6XXm24TXfi36cEMPw,408
113
+ ffbb_data_client/models/multi_search_results.py,sha256=tltyeFmhwG_o4MsgtMl5npIOiK52cAn3QAp1mTjAWDM,4081
114
+ ffbb_data_client/models/multi_search_results_class.py,sha256=GutznuFvU9CpHJgbX_qYjjp2ENXE7CKdM15NKn3l5Zw,3779
115
+ ffbb_data_client/models/nature_sol.py,sha256=G0Gai_tHcGhElQ6cgIpkwzUdNdKJ-IduI0l_fvJALoc,1693
116
+ ffbb_data_client/models/niveau.py,sha256=kekEeUR7YdQ2apDw5vMyzrkvx3W-5eR_gBJADpEDLwA,220
117
+ ffbb_data_client/models/niveau_class.py,sha256=qco97CuA5GaF2wPlKsF-i4NZ3cyuOe178osW_A2Xcfs,796
118
+ ffbb_data_client/models/niveau_extractor.py,sha256=Y7xusxOXtHAyBd-z2TD8amm1eMdxW0da30sZeZdW2s4,7999
119
+ ffbb_data_client/models/niveau_info.py,sha256=qWgaIEjyrUz2tgOV6PfX3vXwXk3y9J88rRXy6VVPYpc,2048
120
+ ffbb_data_client/models/niveau_models.py,sha256=hcnp8jD_DnNiy7tEJHIhywC4UKCC4ftYpXvMOF15dyo,387
121
+ ffbb_data_client/models/niveau_type.py,sha256=a4ipehu_kn7C-rMQYctK8oWC3d9IJ9WNsfyMSQr4SYE,252
122
+ ffbb_data_client/models/objectif.py,sha256=uqE1nnj5LL5Kwk4QkPV4ngOh4SWRS3Y8Yawh1NJpZtE,138
123
+ ffbb_data_client/models/organisateur.py,sha256=tsO6Fi21WZzrzkSoWQImYEvHQ7kEylElGYW49OXEfSA,7874
124
+ ffbb_data_client/models/organisateur_type.py,sha256=ca8_3VibJmCJLZ6wSybpNdDGj937XVePTsd9Rf_-zi0,78
125
+ ffbb_data_client/models/organisme_fields.py,sha256=UldaY2zxp0arVyNKhhAS0KBcc4lijukYUYv7vXje9bE,12407
126
+ ffbb_data_client/models/organisme_id_pere.py,sha256=aPYdtrpf53kxypOwrBCBCb8a0qohoQa-LBMGQNPlvzQ,6905
127
+ ffbb_data_client/models/organismes_facet_distribution.py,sha256=2j-HktiD00J6pPLByGUjSxO4pSGsemEYP1lVjN8o9mY,1784
128
+ ffbb_data_client/models/organismes_facet_stats.py,sha256=nTYZegFEMo3_2QIUcgMXUjJ8ONDPNMPduhsdXEe8xg8,312
129
+ ffbb_data_client/models/organismes_hit.py,sha256=GSzyhk46P8vBqq7HOrUaOqRv6rmS2GkJIq5CAF36B2M,7871
130
+ ffbb_data_client/models/organismes_multi_search_query.py,sha256=HpnaZC9zmg_TsuOvbCTD-OPkViuMk95gIGWvwjRnZyA,1407
131
+ ffbb_data_client/models/organismes_query.py,sha256=mMxtwrfQ2b-OU7x8lyNgQzlnPPBurn8rO5yKqkkcHn4,187
132
+ ffbb_data_client/models/phase_code.py,sha256=4-eFhE95dS2-5D_p5Qa4v3qGORndjK7Vst36buztAuM,347
133
+ ffbb_data_client/models/poule.py,sha256=AW53JK6vZwJybRhGJXQzH-98CLM4zTHJoXqKU9lkIqU,968
134
+ ffbb_data_client/models/poule_fields.py,sha256=qWZ57QPw2Vc_xYkKJzQnChzJaOVbSv8e7hvReNkWzI4,11965
135
+ ffbb_data_client/models/poule_rencontre_item_model.py,sha256=HpiN5A-PiKaD07HXfjtolzzET62YQ32QjYoR9B83hDc,1554
136
+ ffbb_data_client/models/poules_models.py,sha256=MfDGwI3Ao7tND75SvkhjAQMaimxAMK1NFMoXXr3lxrw,198
137
+ ffbb_data_client/models/poules_query.py,sha256=NNevHJBz3TyVYrKbgQbNoHsTncdAVyb3GV9vV3R3Dq4,269
138
+ ffbb_data_client/models/pratique.py,sha256=wQoD2z2K3Vtr8QxCwJztK2XtR4Ed2kJe_qmxmTB8zxA,118
139
+ ffbb_data_client/models/pratiques_facet_distribution.py,sha256=Opvdp9zYh3P9_vnmFDw0FIeV21s5Meyi5aaUzgL51N8,911
140
+ ffbb_data_client/models/pratiques_facet_stats.py,sha256=X0_Onb7XFFiPH2hvQEr-8RoFtwk-ZdQ27sQBiXgw15M,309
141
+ ffbb_data_client/models/pratiques_hit.py,sha256=kDdGDjs4wAPpTY3CmrC730Lvs1ybMOm1XzPJrHil_OY,13294
142
+ ffbb_data_client/models/pratiques_hit_type.py,sha256=y21ZeQ_XQeKnVJUR-gt_zHo2Cd50-h1CnBHFulLg2GQ,251
143
+ ffbb_data_client/models/pratiques_multi_search_query.py,sha256=K1NtTjl1FKvWb_E_HUuw_TXNPphJFek6je-WRTMb2ro,1393
144
+ ffbb_data_client/models/pratiques_type_class.py,sha256=Dh0dI0JX8ONKzxl_XpY1uX4DHiDvTBwyYGc0ETkOxrk,1679
145
+ ffbb_data_client/models/publication_internet.py,sha256=UIKUE_So9KuSQq9giY68hIH8MvcQ7iQIuT5s_cCKf24,101
146
+ ffbb_data_client/models/purple_logo.py,sha256=_XkIOlYRTAGdiD6hgfQmSYjSA8qlq-vX1BruO4OZniQ,538
147
+ ffbb_data_client/models/query_fields_manager.py,sha256=zMy5w7pnLts_Cjz3PWZ7hrSZBPH2O7YKTBR3pyP7Zxw,2836
148
+ ffbb_data_client/models/ranking_engagement.py,sha256=O5vJ4E1oCtN7RLWlIndaTDDJ7tsPk5weVt8E65r1Ci8,1302
149
+ ffbb_data_client/models/rankings_models.py,sha256=ZaXaVclzNCAJapBJeusklm_ksWjTnUfsvx2_XSTdVg8,217
150
+ ffbb_data_client/models/rencontres_engagement.py,sha256=c_rxNqZ-qnAK-r47mbNekxO1NGfxTNg1o_jprGQTalY,508
151
+ ffbb_data_client/models/rencontres_facet_distribution.py,sha256=AqWhEqoowBZrKvzRLVlX2QrAeKbwiUEWJ5YcNQD36Qo,2969
152
+ ffbb_data_client/models/rencontres_facet_stats.py,sha256=Hv1sNxOAV_iB7TidU4brhiTEfZP78xH7Aji0RNafnqo,312
153
+ ffbb_data_client/models/rencontres_hit.py,sha256=cYE3r28djWgCSqsvkWBME__smBSz3PC0NM-kXqXBzbY,11532
154
+ ffbb_data_client/models/rencontres_multi_search_query.py,sha256=PssdHDTodd2Enrv7otrovPZGFCiKSfqJmi5rIeqhXtc,1407
155
+ ffbb_data_client/models/saison.py,sha256=mqTz4FwYy2el2lhkhkXKxSC2IqpmV0FOiLoyhRMWVhg,512
156
+ ffbb_data_client/models/saison_fields.py,sha256=kui7M1Nf6baGesubrT9Vc_Fru69gzKBc34uPTgy4_jY,864
157
+ ffbb_data_client/models/saisons_models.py,sha256=N6UoYZiAivArSDDuhofVzEUa4YFIHJBvoBhlvknrhVA,208
158
+ ffbb_data_client/models/saisons_query.py,sha256=m_S-90th-h5RN7ZpCpiw7FFRdhvM-seCxD6otlE0Kl8,254
159
+ ffbb_data_client/models/salle.py,sha256=B7WR6NKM-_1XfEmnS_SwAaycLkJ6dDGIvszegVx1ccs,2043
160
+ ffbb_data_client/models/salles_facet_distribution.py,sha256=70kdzC3F18eoGpGVgEwWER1QdCr8HpEcSRhWa28fFyI,342
161
+ ffbb_data_client/models/salles_facet_stats.py,sha256=wNBeLlXzCwsZ_Fu5cwvpVh1wy0NRIZ5w4It5JPufYu4,300
162
+ ffbb_data_client/models/salles_hit.py,sha256=J45qqx5TrEpAGIwvRkilr8J7TlkbFGhCw2tp2cs9AEE,5921
163
+ ffbb_data_client/models/salles_multi_search_query.py,sha256=SUe4-PScxmTBzVqjuTRX_EdJxA4cknm7hur5EoHhd4o,1278
164
+ ffbb_data_client/models/sexe.py,sha256=X-SQljG_o2eeoNqnURr3B3saeCWhm0sGD_LJ8YfRYuw,151
165
+ ffbb_data_client/models/sexe_class.py,sha256=LvxqzF6OfqYYPUPE0S097Rs1wbFJoRV0g74Y0AGowGA,897
166
+ ffbb_data_client/models/source.py,sha256=VRDg-tg8pnH5RaGR6bLUOkJozYXzAjoGM-S5tinfAEk,78
167
+ ffbb_data_client/models/status.py,sha256=q13pO5EwD4F0811iGtx9Jf0wBTaRlBUaUKBC5pVMFog,64
168
+ ffbb_data_client/models/team_engagement.py,sha256=j9m9PamEyl8b4l0ImAHz5JHqtbEysTzMIrGByVGsPn8,1664
169
+ ffbb_data_client/models/team_ranking.py,sha256=PcuWR_Z_w00fzslgtj9EyvJyX9SmxjSo_3By8RG3SYc,4144
170
+ ffbb_data_client/models/terrains_categorie_championnat_3x3_libelle.py,sha256=UxbVHB5qQyXkSasF6zMvTASzmnh84LWa3KHpkKToS-c,84
171
+ ffbb_data_client/models/terrains_facet_distribution.py,sha256=2nJTIdVFhRQwcDhRQwsU46U0aMhTKAbj6X2rS7o0GHI,1527
172
+ ffbb_data_client/models/terrains_facet_stats.py,sha256=vK1f2_emi4QegRrEQ0-wRiuhAFjYz1BhM57N5SrJouY,306
173
+ ffbb_data_client/models/terrains_hit.py,sha256=ThyGFK3b_hu3Q5pMLJDX6fNGp958gHvo2vo8V4jc8kA,9931
174
+ ffbb_data_client/models/terrains_multi_search_query.py,sha256=VPrF5LGvKmw40gvmQUfAzoDe_AmjUvrnHtayMtjxyYI,1370
175
+ ffbb_data_client/models/terrains_name.py,sha256=apcHnrVUpg0FCKpoW9oO3CzA4I_Oxvn85odCwFhRQeY,68
176
+ ffbb_data_client/models/terrains_sexe_enum.py,sha256=N9318BHF7QiA-aY2ckLyYn7gn4qEFIiPrdPbyxIIeVI,119
177
+ ffbb_data_client/models/terrains_storage.py,sha256=LbUQV-rBT7gqEj4zui6pgRugwOgW8CewR9bf9z0VNFs,65
178
+ ffbb_data_client/models/tournoi_type_class.py,sha256=KYgbwquoIDrzaZ4JLrSyVc_uAyaIQaSME7A7V4Ca2O4,1071
179
+ ffbb_data_client/models/tournoi_type_enum.py,sha256=z2QDJzzqctQf116HabWbXlnRDhysH0MbjC6ltZ4kOag,153
180
+ ffbb_data_client/models/tournoi_types_3x3.py,sha256=ohU6TpJcMn5SDtkGX42q9vrxtXKog2ge7ovhWhxvqDo,1387
181
+ ffbb_data_client/models/tournoi_types_3x3_libelle.py,sha256=6Sm_bSgn9XRVIIOFCi3syDtiUvJ1Oj9vedXfa3STJrE,2796
182
+ ffbb_data_client/models/tournoi_types_3x3_libelle_enum.py,sha256=EcpjpY4Nu2AmMhcNmkRCGikNOi2tdi69vImjreVZ_Wo,473
183
+ ffbb_data_client/models/tournois_facet_distribution.py,sha256=6u9kJCbi6Exfv2CtPMmrKcyc8CrwzZJSHucLFloYkwU,1527
184
+ ffbb_data_client/models/tournois_facet_stats.py,sha256=J8TSr1ZbdSU2_UvwwPu-iW2T27845VUWrG4hW8WG63Q,306
185
+ ffbb_data_client/models/tournois_hit.py,sha256=kdBLKW_JGP7wCyRG2O0koqp0gk97lQeyoW0k2SSgR40,4611
186
+ ffbb_data_client/models/tournois_hit_type.py,sha256=mPafcm25HBxOEf-8YZOQ05neGRxEe_P71QJJEel1wGQ,69
187
+ ffbb_data_client/models/tournois_libelle.py,sha256=XEbaYPnM-_9A6M63bnoDUGJDTSuP86KHg3eXGKsvcf4,131
188
+ ffbb_data_client/models/tournois_multi_search_query.py,sha256=mfgI92J-YHn-CFWMw6vd1zMHbmYz4QjUACIgXfbWUIg,1356
189
+ ffbb_data_client/models/type_association.py,sha256=GJcerhw4hhDatl90gjAn4Pei6ZOV0W7SQU11UwCVPE0,563
190
+ ffbb_data_client/models/type_association_libelle.py,sha256=phryiGtbziZzIe9bSyIw6wDVrFbDKxooumTTF4tbtCE,952
191
+ ffbb_data_client/models/type_class.py,sha256=NegmNRPLgiiH__4oEg3p48iaIOGQYVdMYrICYVwb09U,569
192
+ ffbb_data_client/models/type_competition.py,sha256=Iujv3epgHa_sA4XWTlZD9qqONl3OqevzXD-wyx-_uV4,170
193
+ ffbb_data_client/models/type_competition_generique.py,sha256=r37t2ykqKEYF8yviylmfwvx-aB9V-Lq4UEsjXzaaM4Q,956
194
+ ffbb_data_client/models/type_enum.py,sha256=nTqBQIptXGnnfpRUKMUkHqwpVc9nl9kbvQQWVeGlrXg,124
195
+ ffbb_data_client/models/type_league.py,sha256=gffJUx6T_iMa-8xAXdlGw24jl3MGTUS_offhx1EddbU,92
196
+ ffbb_data_client/utils/__init__.py,sha256=JdM_VFTosc-j7A088FD1WjpHYJvAFwWUHu6QGIy8wFQ,436
197
+ ffbb_data_client/utils/cache_manager.py,sha256=N0vpAezs6A1Jqs13sCzN62VvbOszvXF5DFrHLN48gLk,12737
198
+ ffbb_data_client/utils/converter_utils.py,sha256=FfBdycW_BTH5iFl1pkqWJfjlHo-PhqPYHdARG-UyF-E,9489
199
+ ffbb_data_client/utils/input_validation.py,sha256=5SnnRYq0CAn3Vxh7VPbhgRGNMYxVhdlbF6TFmkhEmjM,10138
200
+ ffbb_data_client/utils/retry_utils.py,sha256=spRyALFPAgnqTA3PMqBQcgx5lT5BLVeCsAKUReRJwXA,14122
201
+ ffbb_data_client/utils/secure_logging.py,sha256=-6WiCd3urahn2Hco3TmLs3IkZCmQGpym33GTDQ4tH_0,5064
202
+ ffbb_data_client/utils/token_manager.py,sha256=cWXjviitdDUQdgHuzWI-0JugMqddRfcySAZ0TvqgmxM,3552
203
+ ffbb_data_client-2.0.0.dist-info/licenses/LICENSE.txt,sha256=tAkwu8-AdEyGxGoSvJ2gVmQdcicWw3j1ZZueVV74M-E,11357
204
+ ffbb_data_client-2.0.0.dist-info/METADATA,sha256=NR81et7tQazpF17jKP7GuYVtKcSTwnFl2j2uTbGCXcs,11235
205
+ ffbb_data_client-2.0.0.dist-info/WHEEL,sha256=aeYiig01lYGDzBgS8HxWXOg3uV61G9ijOsup-k9o1sk,91
206
+ ffbb_data_client-2.0.0.dist-info/top_level.txt,sha256=2QSblPqCcppE_maoLmo6GZw2a4nmTqYyRD4HQ_NmY7E,36
207
+ ffbb_data_client-2.0.0.dist-info/RECORD,,
@@ -0,0 +1,5 @@
1
+ Wheel-Version: 1.0
2
+ Generator: setuptools (82.0.1)
3
+ Root-Is-Purelib: true
4
+ Tag: py3-none-any
5
+