From 92a904faf57dae68f71bf71cf30716df31ae3fe6 Mon Sep 17 00:00:00 2001 From: hopcy-forcy Date: Fri, 4 Jul 2025 22:02:17 +0100 Subject: [PATCH 1/3] update --- src/app/docs/basics/body-parser/page.mdx | 296 +++++++++++++++++++++++ src/app/docs/basics/body-parser/page.py | 0 src/app/docs/basics/controllers/main.py | 13 - src/app/docs/basics/controllers/page.mdx | 8 +- src/app/docs/basics/response/page.mdx | 10 +- src/app/docs/basics/routing/page.mdx | 152 ------------ src/app/docs/started/page.mdx | 1 + src/app/docs/started/structure/page.mdx | 7 +- src/components/(home)/sideBar.tsx | 24 +- src/data/docs/sidebar.ts | 46 ++-- 10 files changed, 339 insertions(+), 218 deletions(-) create mode 100644 src/app/docs/basics/body-parser/page.mdx create mode 100644 src/app/docs/basics/body-parser/page.py delete mode 100644 src/app/docs/basics/controllers/main.py delete mode 100644 src/app/docs/basics/routing/page.mdx diff --git a/src/app/docs/basics/body-parser/page.mdx b/src/app/docs/basics/body-parser/page.mdx new file mode 100644 index 00000000..37812763 --- /dev/null +++ b/src/app/docs/basics/body-parser/page.mdx @@ -0,0 +1,296 @@ +# Body Parser + +Nexy provides comprehensive request body parsing through FastAPI and Pydantic. Unlike traditional frameworks requiring manual parser configuration, Nexy intelligently handles request content based on MIME types and structure. + + + Nexy automatically parses JSON, form data, files, and even complex nested structures. Just define your expected schema! + + +--- + +## Available Parser Types + +### Basic Types +Les types de base constituent les fondements de notre système de typage. Comme les briques élémentaires d'une construction, ils nous permettent de représenter les données les plus simples mais essentielles. + + + + + +### Collections +Les collections nous permettent d'organiser et de structurer nos données de manière plus complexe, comme un architecte assemblant différents éléments pour créer un tout cohérent. + + + + + +### Special Types +Les types spéciaux nous offrent des outils de validation sophistiqués, garantissant l'intégrité et la cohérence de nos données comme un gardien vigilant. + + + + + +### Time Types +La gestion du temps dans nos applications reflète notre rapport au temporel, permettant de capturer et manipuler les moments qui structurent nos données. + + + + + +### File Handling +La gestion des fichiers représente l'interface entre notre application et le monde extérieur, comme un pont permettant l'échange de données. + + + + + +### Form Data +Les formulaires constituent l'interface privilégiée entre l'utilisateur et notre système, permettant une interaction structurée et validée. + + + + + +### Request Metadata +Les métadonnées de requête nous permettent de contextualiser et d'enrichir nos interactions, comme des annotations précieuses guidant notre compréhension. + + + + + +--- + +## Advanced Features + +### Validation Rules +La validation des données est comme un gardien philosophique, assurant que chaque entrée respecte les règles établies pour maintenir l'intégrité de notre système. + + + + + +### Performance Optimization +L'optimisation est un art subtil, équilibrant efficacité et lisibilité pour créer un système performant et maintenable. + + + Any: + return self.settings.get(key) + +async def process_data(data: bytes) -> Dict[str, Any]: + # Traitement asynchrone optimisé + return {"processed": len(data)} +`}/> + + +### Error Handling +La gestion des erreurs est comme une philosophie de la résilience, permettant à notre système de réagir gracieusement aux situations imprévues. + + + CustomError: + return CustomError( + code="VALIDATION_ERROR", + message="Données invalides", + details={"errors": e.errors()} + ) + +def POST(data: Dict[str, Any]): + try: + # Logique métier + if not data: + raise HTTPException(status_code=400, detail="Données requises") + return {"status": "success"} + except ValidationError as e: + return handle_validation_error(e) +`}/> + + +--- + +## 🎯 Key Points + + +**Automatic Detection**: Nexy détecte intelligemment les types de contenu et applique les parseurs appropriés + +**Built-in Validation**: Toutes les données sont validées selon des schémas définis + +**Type Safety**: Un typage fort avec conversions automatiques + +**Flexible Parsing**: Support pour tous les formats de données courants + +**Error Handling**: Détection et rapport d'erreurs complets + + +Le système de parsing de Nexy incarne une philosophie de simplicité et de puissance - définissez simplement votre structure de données, et laissez Nexy s'occuper du reste ! + + \ No newline at end of file diff --git a/src/app/docs/basics/body-parser/page.py b/src/app/docs/basics/body-parser/page.py new file mode 100644 index 00000000..e69de29b diff --git a/src/app/docs/basics/controllers/main.py b/src/app/docs/basics/controllers/main.py deleted file mode 100644 index 7bed3244..00000000 --- a/src/app/docs/basics/controllers/main.py +++ /dev/null @@ -1,13 +0,0 @@ -from nexy import Request, Depends -from .service import AppService - -async def POST( - userId: int, - service: Depends(AppService), - request: Request, - ) -> Dict[str, str]: - - comment_data = await request.json() - data = await service.add_comment(userId, comment_data) - - return data diff --git a/src/app/docs/basics/controllers/page.mdx b/src/app/docs/basics/controllers/page.mdx index af4ab7fd..1e313d0c 100644 --- a/src/app/docs/basics/controllers/page.mdx +++ b/src/app/docs/basics/controllers/page.mdx @@ -286,12 +286,12 @@ Maintenant que vous avez appris à propos des contrôleurs et des endpoints, vou Découvrons comment faire cela dans la section suivante. \ No newline at end of file diff --git a/src/app/docs/basics/response/page.mdx b/src/app/docs/basics/response/page.mdx index 9356b19b..c66f5abd 100644 --- a/src/app/docs/basics/response/page.mdx +++ b/src/app/docs/basics/response/page.mdx @@ -177,7 +177,7 @@ async def generate_data(): """Génère des données en flux""" for i in range(10): data = {"item": i, "timestamp": f"2024-{i:02d}-01"} - yield f"data: {json.dumps(data)}\n\n" + yield f"data: {json.dumps(data)}" await asyncio.sleep(0.5) def GET() -> StreamingResponse: @@ -191,9 +191,9 @@ code = { async def GET(): """Streaming d'un gros fichier CSV""" def generate_csv(): - yield "nom,email,age\n" + yield "nom,email,age" for i in range(1000): - yield f"User{i},user{i}@example.com,{20+i%50}\n" + yield f"User{i},user{i}@example.com,{20+i%50}" return StreamingResponse(generate_csv(), media_type="text/csv") ` @@ -480,10 +480,10 @@ Vous maîtrisez maintenant toutes les façons de créer et personnaliser des ré \ No newline at end of file diff --git a/src/app/docs/basics/routing/page.mdx b/src/app/docs/basics/routing/page.mdx deleted file mode 100644 index f6853a47..00000000 --- a/src/app/docs/basics/routing/page.mdx +++ /dev/null @@ -1,152 +0,0 @@ -# Le Routage dans Nexy - - - Le routage est la façon dont Nexy organise les différentes pages et fonctionnalités de votre application. C'est comme créer un plan pour votre maison, où chaque pièce (route) a son propre chemin d'accès ! - - -## Comprendre le Routage - -Imaginez votre application comme une bibliothèque : -- Chaque étagère représente un dossier -- Chaque livre représente une page ou une fonctionnalité -- Le chemin pour trouver un livre est votre route - -### Comment ça marche ? - -Nexy utilise un système de routage basé sur les fichiers. C'est très simple : **la structure de vos dossiers devient automatiquement les chemins de votre application** ! - -### Structure de Base - - - - - - - - - - - - -Quand vous créez cette structure : -- `app/controller.py` devient votre page d'accueil (`/`) -- `app/produits/controller.py` devient accessible via `/produits` - -## Les Types de Routes - -### 1. Routes Simples (Statiques) - -Ce sont les routes les plus basiques. Comme une adresse fixe ! - - - - - -**Résultat** : Quand quelqu'un visite `/produits`, il verra "Voici la liste de nos produits !" - -### 2. Routes Dynamiques - -Imaginez que vous voulez une page différente pour chaque produit. Les routes dynamiques sont là pour ça ! - -#### a) Routes avec Paramètres `[param]` - - - - - - - - - - - - - - -```python -# app/produits/[id]/controller.py -from nexy import Controller - -class ProduitDetailController(Controller): - def get(self, id: int): - # id sera automatiquement extrait de l'URL ! - return {"message": f"Voici les détails du produit numéro {id}"} -``` - - -**Comment ça marche ?** -- `/produits/1` affichera les détails du produit 1 -- `/produits/2` affichera les détails du produit 2 -- Et ainsi de suite ! - -#### b) Routes Attrape-tout `![param]` - -Ces routes sont comme des filets qui attrapent tous les chemins possibles ! - - -```python -# app/blog/![slug]/controller.py -from nexy import Controller - -class BlogController(Controller): - def get(self, slug: list): - # slug contiendra tous les segments de l'URL - return {"message": f"Blog : {'/'.join(slug)}"} -``` - - -**Exemples d'URLs capturées :** -- `/blog/2023/janvier/article` -- `/blog/technologie/python` - -#### c) Routes Privées `[_param]` - -Pour les parties de votre application qui nécessitent une authentification. - - -```python -# app/admin/[_dashboard]/controller.py -from nexy import Controller - -class AdminController(Controller): - def get(self): - # Vérification de l'authentification incluse automatiquement - return {"message": "Bienvenue dans le tableau de bord admin !"} -``` - - -## Bonnes Pratiques - - -1. **Organisez Logiquement :** - - Gardez les routes liées ensemble (ex: tout ce qui concerne les produits dans `/produits`) - - Utilisez des noms clairs et descriptifs - -2. **Simplicité d'abord :** - - Commencez par des routes simples - - Ajoutez des routes dynamiques seulement quand nécessaire - -3. **Sécurité :** - - Utilisez les routes privées pour le contenu sensible - - Vérifiez toujours les permissions - -4. **Documentation :** - - Commentez vos contrôleurs - - Gardez une liste à jour de vos routes - - - \ No newline at end of file diff --git a/src/app/docs/started/page.mdx b/src/app/docs/started/page.mdx index eb285885..7dd62580 100644 --- a/src/app/docs/started/page.mdx +++ b/src/app/docs/started/page.mdx @@ -45,6 +45,7 @@ Une fois que vous avez vérifié que vous disposez d'une version de Pytho code = { `pip install nexy` }/> + ---- diff --git a/src/app/docs/started/structure/page.mdx b/src/app/docs/started/structure/page.mdx index beaccbb9..5844f30d 100644 --- a/src/app/docs/started/structure/page.mdx +++ b/src/app/docs/started/structure/page.mdx @@ -124,12 +124,9 @@ Chaque dossier représente un segment d'itinéraire mappé à un segment corresp - - dkdjkjk - - +--- ## 👌 Bravo ! Maintenant que vous avez pu créer votre projet, vous pouvez commencer à analyser sa structure !
Nous allons voir comment faire cela dans la section suivante. @@ -141,7 +138,7 @@ Maintenant que vous avez pu créer votre projet, vous pouvez commencer à analys }} next ={ { label: "Structure", - href: "/started/structure" + href: "/basics/controllers" }} /> \ No newline at end of file diff --git a/src/components/(home)/sideBar.tsx b/src/components/(home)/sideBar.tsx index e1bb61b4..775cb733 100644 --- a/src/components/(home)/sideBar.tsx +++ b/src/components/(home)/sideBar.tsx @@ -4,21 +4,19 @@ import { Collapse } from "./collapse" import { SIDE_BAR } from "@/data/docs/sidebar" import { usePathname } from "next/navigation" import useStore from "@/store" +import { useEffect } from "react" -const SideBar = ({hidden}: {hidden?: boolean}) => { +const SideBar = ({ hidden }: { hidden?: boolean }) => { const pathname = usePathname() const { setMenuIsOpen } = useStore(); + useEffect(() => { + + }, [pathname]) return (