AUTO-FRANCE-PARTS commited on
Commit
b411033
·
1 Parent(s): a7e3f58

feat : Add Get parcel tool

Browse files
.gitignore ADDED
@@ -0,0 +1 @@
 
 
1
+ */__pycache__/*
__pycache__/app.cpython-312.pyc ADDED
Binary file (1.96 kB). View file
 
api_sources/__init__.py ADDED
@@ -0,0 +1 @@
 
 
1
+
api_sources/base.py ADDED
@@ -0,0 +1,28 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ from abc import ABC, abstractmethod
2
+ from typing import Dict, Any, Optional
3
+
4
+
5
+ class BaseAPISource(ABC):
6
+ """Classe de base abstraite pour toutes les sources d'API externes."""
7
+
8
+ def __init__(self, base_url: str, timeout: int = 30):
9
+ self.base_url = base_url.rstrip('/')
10
+ self.timeout = timeout
11
+
12
+ @abstractmethod
13
+ async def get_parcel_from_lat_lon(self, latitude: float, longitude: float) -> Dict[str, Any]:
14
+ """
15
+ Récupère les informations de parcelle à partir des coordonnées GPS.
16
+
17
+ Args:
18
+ latitude: Latitude en degrés décimaux
19
+ longitude: Longitude en degrés décimaux
20
+
21
+ Returns:
22
+ Dict contenant les données de la parcelle
23
+ """
24
+ pass
25
+
26
+ def _build_url(self, endpoint: str) -> str:
27
+ """Construit l'URL complète à partir du base_url et de l'endpoint."""
28
+ return f"{self.base_url}/{endpoint.lstrip('/')}"
api_sources/config.py ADDED
@@ -0,0 +1,13 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ """Configuration des API externes."""
2
+
3
+ API_CONFIGS = {
4
+ "lexicon": {
5
+ "base_url": "https://lexicon.osfarm.org",
6
+ "timeout": 30
7
+ },
8
+ # Exemple pour futures API sources
9
+ # "autre_api": {
10
+ # "base_url": "https://exemple.com",
11
+ # "timeout": 45
12
+ # }
13
+ }
api_sources/example_new_source.py ADDED
@@ -0,0 +1,51 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ """
2
+ EXEMPLE : Comment ajouter une nouvelle source d'API
3
+
4
+ Pour ajouter une nouvelle source d'API, suivez ces étapes :
5
+
6
+ 1. Créez une nouvelle classe qui hérite de BaseAPISource
7
+ 2. Implémentez la méthode get_parcel_from_lat_lon
8
+ 3. Ajoutez d'autres méthodes spécifiques si nécessaire
9
+ 4. Intégrez la nouvelle source dans app.py
10
+
11
+ Exemple d'implémentation :
12
+ """
13
+
14
+ import httpx
15
+ from typing import Dict, Any
16
+ from .base import BaseAPISource
17
+ from .config import API_CONFIGS
18
+
19
+
20
+ class ExempleAPI(BaseAPISource):
21
+ """Exemple d'implémentation d'une nouvelle source d'API."""
22
+
23
+ def __init__(self):
24
+ config = API_CONFIGS.get("exemple_api", {
25
+ "base_url": "https://exemple.com",
26
+ "timeout": 30
27
+ })
28
+ super().__init__(
29
+ base_url=config["base_url"],
30
+ timeout=config["timeout"]
31
+ )
32
+
33
+ async def get_parcel_from_lat_lon(self, latitude: float, longitude: float) -> Dict[str, Any]:
34
+ """Implémentation pour l'API exemple."""
35
+ url = self._build_url("/api/parcelle")
36
+
37
+ params = {
38
+ "lat": latitude,
39
+ "lon": longitude
40
+ }
41
+
42
+ async with httpx.AsyncClient(timeout=self.timeout) as client:
43
+ response = await client.get(url, params=params)
44
+ response.raise_for_status()
45
+ return response.json()
46
+
47
+ async def autre_methode_specifique(self, param: str) -> Dict[str, Any]:
48
+ """Exemple d'une méthode spécifique à cette API."""
49
+ url = self._build_url("/api/autre-endpoint")
50
+ # ... implémentation
51
+ pass
api_sources/lexicon.py ADDED
@@ -0,0 +1,53 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import httpx
2
+ from typing import Dict, Any
3
+ from .base import BaseAPISource
4
+ from .config import API_CONFIGS
5
+
6
+
7
+ class LexiconAPI(BaseAPISource):
8
+ """Implémentation de l'API Lexicon pour récupérer les données de parcelles."""
9
+
10
+ def __init__(self):
11
+ config = API_CONFIGS["lexicon"]
12
+ super().__init__(
13
+ base_url=config["base_url"],
14
+ timeout=config["timeout"]
15
+ )
16
+
17
+ async def get_parcel_from_lat_lon(self, latitude: float, longitude: float) -> Dict[str, Any]:
18
+ """
19
+ Récupère les informations de parcelle depuis l'API Lexicon.
20
+
21
+ Args:
22
+ latitude: Latitude en degrés décimaux
23
+ longitude: Longitude en degrés décimaux
24
+
25
+ Returns:
26
+ Dict contenant les données de la parcelle depuis Lexicon
27
+
28
+ Raises:
29
+ httpx.HTTPStatusError: Si la requête échoue
30
+ httpx.RequestError: Si une erreur de connexion survient
31
+ """
32
+ url = self._build_url("/tools/parcel-identifier.json")
33
+
34
+ params = {
35
+ "latitude": latitude,
36
+ "longitude": longitude
37
+ }
38
+
39
+ async with httpx.AsyncClient(timeout=self.timeout) as client:
40
+ try:
41
+ response = await client.get(url, params=params)
42
+ response.raise_for_status()
43
+ return response.json()
44
+ except httpx.HTTPStatusError as e:
45
+ raise Exception(f"Erreur HTTP {e.response.status_code}: {e.response.text}")
46
+ except httpx.RequestError as e:
47
+ raise Exception(f"Erreur de connexion à l'API Lexicon: {str(e)}")
48
+
49
+ # Exemple : Vous pouvez ajouter d'autres méthodes spécifiques à Lexicon ici
50
+ # async def autre_methode_lexicon(self, param: str) -> Dict[str, Any]:
51
+ # """Autre méthode spécifique à l'API Lexicon."""
52
+ # url = self._build_url("/autre-endpoint")
53
+ # # ... implémentation
app.py CHANGED
@@ -1,7 +1,42 @@
1
- from fastapi import FastAPI
 
 
2
 
3
- app = FastAPI()
 
 
 
 
 
 
 
4
 
5
  @app.get("/")
6
  def greet_json():
7
  return {"Hello": "World!"}
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ from fastapi import FastAPI, HTTPException, Query
2
+ from typing import Dict, Any
3
+ from api_sources.lexicon import LexiconAPI
4
 
5
+ app = FastAPI(
6
+ title="Data API",
7
+ description="API pour récupérer des données de parcelles depuis différentes sources",
8
+ version="1.0.0"
9
+ )
10
+
11
+ # Instance de l'API Lexicon
12
+ lexicon_api = LexiconAPI()
13
 
14
  @app.get("/")
15
  def greet_json():
16
  return {"Hello": "World!"}
17
+
18
+ @app.get("/tools/parcel-identifier")
19
+ async def get_parcel_identifier(
20
+ latitude: float = Query(..., description="Latitude en degrés décimaux"),
21
+ longitude: float = Query(..., description="Longitude en degrés décimaux")
22
+ ) -> Dict[str, Any]:
23
+ """
24
+ Récupère les informations d'identification de parcelle à partir des coordonnées GPS.
25
+
26
+ Args:
27
+ latitude: Latitude en degrés décimaux
28
+ longitude: Longitude en degrés décimaux
29
+
30
+ Returns:
31
+ Dict contenant les données de la parcelle
32
+ """
33
+ try:
34
+ # Appel de l'API Lexicon pour récupérer les données
35
+ parcel_data = await lexicon_api.get_parcel_from_lat_lon(latitude, longitude)
36
+ return parcel_data
37
+
38
+ except Exception as e:
39
+ raise HTTPException(
40
+ status_code=500,
41
+ detail=f"Erreur lors de la récupération des données de parcelle: {str(e)}"
42
+ )
requirements.txt CHANGED
@@ -1,2 +1,4 @@
1
  fastapi
2
  uvicorn[standard]
 
 
 
1
  fastapi
2
  uvicorn[standard]
3
+ requests
4
+ httpx