vega-framework 0.1.34__py3-none-any.whl → 0.2.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.
vega/web/routing.py ADDED
@@ -0,0 +1,347 @@
1
+ """Routing utilities and decorators for Vega Web Framework"""
2
+
3
+ import inspect
4
+ from typing import Any, Callable, Dict, List, Optional, Type, get_type_hints
5
+ from functools import wraps
6
+
7
+ from starlette.routing import Route as StarletteRoute, Mount
8
+ from starlette.requests import Request as StarletteRequest
9
+
10
+ from .exceptions import HTTPException
11
+ from .request import Request
12
+ from .response import JSONResponse, Response, create_response
13
+ from .route_middleware import MiddlewareChain
14
+
15
+
16
+ class Route:
17
+ """
18
+ Represents a single route in the application.
19
+
20
+ Args:
21
+ path: URL path pattern (e.g., "/users/{user_id}")
22
+ endpoint: Handler function
23
+ methods: HTTP methods (e.g., ["GET", "POST"])
24
+ name: Optional route name
25
+ include_in_schema: Whether to include in OpenAPI schema
26
+ tags: Tags for documentation
27
+ summary: Short description
28
+ description: Longer description
29
+ response_model: Expected response model type
30
+ status_code: Default status code
31
+ """
32
+
33
+ def __init__(
34
+ self,
35
+ path: str,
36
+ endpoint: Callable,
37
+ methods: List[str],
38
+ name: Optional[str] = None,
39
+ include_in_schema: bool = True,
40
+ tags: Optional[List[str]] = None,
41
+ summary: Optional[str] = None,
42
+ description: Optional[str] = None,
43
+ response_model: Optional[Type] = None,
44
+ status_code: int = 200,
45
+ ):
46
+ self.path = path
47
+ self.endpoint = endpoint
48
+ self.methods = methods
49
+ self.name = name or endpoint.__name__
50
+ self.include_in_schema = include_in_schema
51
+ self.tags = tags or []
52
+ self.summary = summary
53
+ self.description = description or inspect.getdoc(endpoint)
54
+ self.response_model = response_model
55
+ self.status_code = status_code
56
+
57
+ # Extract middleware from endpoint if decorated with @middleware
58
+ self.middlewares = getattr(endpoint, '_route_middlewares', [])
59
+
60
+ async def __call__(self, request: StarletteRequest) -> Response:
61
+ """Execute the route handler"""
62
+ return await self.endpoint(request)
63
+
64
+ def to_starlette_route(self) -> StarletteRoute:
65
+ """Convert to Starlette Route object"""
66
+ async def wrapped_endpoint(request: StarletteRequest) -> Response:
67
+ """Wrapper that handles request/response conversion and exceptions"""
68
+ try:
69
+ # Use request directly - Request is already a subclass of StarletteRequest
70
+ vega_request = request
71
+
72
+ # Get function signature to determine how to call it
73
+ sig = inspect.signature(self.endpoint)
74
+ params = sig.parameters
75
+
76
+ # Prepare kwargs for function call
77
+ kwargs = {}
78
+
79
+ # Extract path parameters
80
+ path_params = request.path_params
81
+
82
+ # Check if function expects Request object
83
+ has_request_param = any(
84
+ param.annotation == Request or param.name == "request"
85
+ for param in params.values()
86
+ )
87
+
88
+ if has_request_param:
89
+ kwargs["request"] = vega_request
90
+
91
+ # Add path parameters
92
+ for param_name, param_value in path_params.items():
93
+ if param_name in params:
94
+ kwargs[param_name] = param_value
95
+
96
+ # Execute middleware chain if present
97
+ if self.middlewares:
98
+ middleware_chain = MiddlewareChain(self.middlewares)
99
+ # Remove request from kwargs since it's passed separately to middleware
100
+ handler_kwargs = {k: v for k, v in kwargs.items() if k != "request"}
101
+ return await middleware_chain.execute(
102
+ vega_request,
103
+ self.endpoint,
104
+ **handler_kwargs
105
+ )
106
+
107
+ # No middleware, call endpoint directly
108
+ if inspect.iscoroutinefunction(self.endpoint):
109
+ result = await self.endpoint(**kwargs)
110
+ else:
111
+ result = self.endpoint(**kwargs)
112
+
113
+ # Handle different return types
114
+ if isinstance(result, (Response, JSONResponse)):
115
+ return result
116
+ elif isinstance(result, dict):
117
+ return JSONResponse(content=result, status_code=self.status_code)
118
+ elif isinstance(result, (list, tuple)):
119
+ return JSONResponse(content=result, status_code=self.status_code)
120
+ elif isinstance(result, str):
121
+ return Response(content=result, status_code=self.status_code)
122
+ elif result is None:
123
+ return Response(content=b"", status_code=self.status_code)
124
+ else:
125
+ # Try to serialize as JSON
126
+ return JSONResponse(content=result, status_code=self.status_code)
127
+
128
+ except HTTPException as exc:
129
+ # Handle HTTP exceptions
130
+ return JSONResponse(
131
+ content={"detail": exc.detail},
132
+ status_code=exc.status_code,
133
+ headers=exc.headers,
134
+ )
135
+ except Exception as exc:
136
+ # Handle unexpected exceptions
137
+ return JSONResponse(
138
+ content={"detail": str(exc)},
139
+ status_code=500,
140
+ )
141
+
142
+ return StarletteRoute(
143
+ path=self.path,
144
+ endpoint=wrapped_endpoint,
145
+ methods=self.methods,
146
+ name=self.name,
147
+ )
148
+
149
+
150
+ def route(
151
+ path: str,
152
+ methods: List[str],
153
+ *,
154
+ name: Optional[str] = None,
155
+ include_in_schema: bool = True,
156
+ tags: Optional[List[str]] = None,
157
+ summary: Optional[str] = None,
158
+ description: Optional[str] = None,
159
+ response_model: Optional[Type] = None,
160
+ status_code: int = 200,
161
+ ) -> Callable:
162
+ """
163
+ Generic route decorator.
164
+
165
+ Args:
166
+ path: URL path pattern
167
+ methods: List of HTTP methods
168
+ name: Optional route name
169
+ include_in_schema: Whether to include in API docs
170
+ tags: Tags for documentation
171
+ summary: Short description
172
+ description: Longer description
173
+ response_model: Expected response type
174
+ status_code: Default HTTP status code
175
+
176
+ Example:
177
+ @route("/users", methods=["GET", "POST"])
178
+ async def users_handler():
179
+ return {"users": []}
180
+ """
181
+
182
+ def decorator(func: Callable) -> Callable:
183
+ func._route_info = {
184
+ "path": path,
185
+ "methods": methods,
186
+ "name": name,
187
+ "include_in_schema": include_in_schema,
188
+ "tags": tags,
189
+ "summary": summary,
190
+ "description": description,
191
+ "response_model": response_model,
192
+ "status_code": status_code,
193
+ }
194
+ return func
195
+
196
+ return decorator
197
+
198
+
199
+ def get(
200
+ path: str,
201
+ *,
202
+ name: Optional[str] = None,
203
+ include_in_schema: bool = True,
204
+ tags: Optional[List[str]] = None,
205
+ summary: Optional[str] = None,
206
+ description: Optional[str] = None,
207
+ response_model: Optional[Type] = None,
208
+ status_code: int = 200,
209
+ ) -> Callable:
210
+ """
211
+ GET request decorator.
212
+
213
+ Example:
214
+ @get("/users/{user_id}")
215
+ async def get_user(user_id: str):
216
+ return {"id": user_id}
217
+ """
218
+ return route(
219
+ path,
220
+ methods=["GET"],
221
+ name=name,
222
+ include_in_schema=include_in_schema,
223
+ tags=tags,
224
+ summary=summary,
225
+ description=description,
226
+ response_model=response_model,
227
+ status_code=status_code,
228
+ )
229
+
230
+
231
+ def post(
232
+ path: str,
233
+ *,
234
+ name: Optional[str] = None,
235
+ include_in_schema: bool = True,
236
+ tags: Optional[List[str]] = None,
237
+ summary: Optional[str] = None,
238
+ description: Optional[str] = None,
239
+ response_model: Optional[Type] = None,
240
+ status_code: int = 201,
241
+ ) -> Callable:
242
+ """
243
+ POST request decorator.
244
+
245
+ Example:
246
+ @post("/users")
247
+ async def create_user(request: Request):
248
+ data = await request.json()
249
+ return {"id": "new_user", **data}
250
+ """
251
+ return route(
252
+ path,
253
+ methods=["POST"],
254
+ name=name,
255
+ include_in_schema=include_in_schema,
256
+ tags=tags,
257
+ summary=summary,
258
+ description=description,
259
+ response_model=response_model,
260
+ status_code=status_code,
261
+ )
262
+
263
+
264
+ def put(
265
+ path: str,
266
+ *,
267
+ name: Optional[str] = None,
268
+ include_in_schema: bool = True,
269
+ tags: Optional[List[str]] = None,
270
+ summary: Optional[str] = None,
271
+ description: Optional[str] = None,
272
+ response_model: Optional[Type] = None,
273
+ status_code: int = 200,
274
+ ) -> Callable:
275
+ """PUT request decorator."""
276
+ return route(
277
+ path,
278
+ methods=["PUT"],
279
+ name=name,
280
+ include_in_schema=include_in_schema,
281
+ tags=tags,
282
+ summary=summary,
283
+ description=description,
284
+ response_model=response_model,
285
+ status_code=status_code,
286
+ )
287
+
288
+
289
+ def patch(
290
+ path: str,
291
+ *,
292
+ name: Optional[str] = None,
293
+ include_in_schema: bool = True,
294
+ tags: Optional[List[str]] = None,
295
+ summary: Optional[str] = None,
296
+ description: Optional[str] = None,
297
+ response_model: Optional[Type] = None,
298
+ status_code: int = 200,
299
+ ) -> Callable:
300
+ """PATCH request decorator."""
301
+ return route(
302
+ path,
303
+ methods=["PATCH"],
304
+ name=name,
305
+ include_in_schema=include_in_schema,
306
+ tags=tags,
307
+ summary=summary,
308
+ description=description,
309
+ response_model=response_model,
310
+ status_code=status_code,
311
+ )
312
+
313
+
314
+ def delete(
315
+ path: str,
316
+ *,
317
+ name: Optional[str] = None,
318
+ include_in_schema: bool = True,
319
+ tags: Optional[List[str]] = None,
320
+ summary: Optional[str] = None,
321
+ description: Optional[str] = None,
322
+ response_model: Optional[Type] = None,
323
+ status_code: int = 204,
324
+ ) -> Callable:
325
+ """DELETE request decorator."""
326
+ return route(
327
+ path,
328
+ methods=["DELETE"],
329
+ name=name,
330
+ include_in_schema=include_in_schema,
331
+ tags=tags,
332
+ summary=summary,
333
+ description=description,
334
+ response_model=response_model,
335
+ status_code=status_code,
336
+ )
337
+
338
+
339
+ __all__ = [
340
+ "Route",
341
+ "route",
342
+ "get",
343
+ "post",
344
+ "put",
345
+ "patch",
346
+ "delete",
347
+ ]
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: vega-framework
3
- Version: 0.1.34
3
+ Version: 0.2.0
4
4
  Summary: Enterprise-ready Python framework that enforces Clean Architecture for building maintainable and scalable applications.
5
5
  License: MIT
6
6
  License-File: LICENSE
@@ -19,10 +19,10 @@ Classifier: Programming Language :: Python :: 3.14
19
19
  Classifier: Topic :: Software Development :: Libraries :: Application Frameworks
20
20
  Classifier: Topic :: Software Development :: Libraries :: Python Modules
21
21
  Requires-Dist: click (>=8.0,<9.0)
22
- Requires-Dist: fastapi (>=0.109,<0.110)
23
22
  Requires-Dist: jinja2 (>=3.1,<4.0)
24
23
  Requires-Dist: pydantic (>=2.0,<3.0)
25
24
  Requires-Dist: pydantic-settings (>=2.0,<3.0)
25
+ Requires-Dist: starlette (>=0.37,<0.38)
26
26
  Requires-Dist: toml (>=0.10,<0.11)
27
27
  Requires-Dist: uvicorn (>=0.27,<0.28)
28
28
  Project-URL: Documentation, https://vega-framework.readthedocs.io
@@ -43,7 +43,7 @@ Traditional Python frameworks show you **how to build** but don't enforce **how
43
43
  - ✅ **Business Logic First** - Pure, testable, framework-independent
44
44
  - ✅ **CLI Scaffolding** - Generate entire projects and components
45
45
  - ✅ **Async Support** - Full async/await for CLI and web
46
- - ✅ **FastAPI & SQLAlchemy** - Built-in integrations when needed
46
+ - ✅ **Vega Web (Starlette) & SQLAlchemy** - Built-in integrations when needed
47
47
 
48
48
  **[Read the Philosophy →](docs/explanation/philosophy.md)** to understand why architecture matters.
49
49
 
@@ -152,7 +152,7 @@ container = Container({
152
152
 
153
153
  ```bash
154
154
  vega init my-app # Create new project
155
- vega init my-api --template fastapi # Create with FastAPI
155
+ vega init my-api --template web # Create with Vega Web
156
156
  vega doctor # Validate architecture
157
157
  vega update # Update framework
158
158
  ```
@@ -169,7 +169,7 @@ vega generate interactor CreateProduct
169
169
  vega generate mediator CheckoutWorkflow
170
170
 
171
171
  # Presentation layer
172
- vega generate router Product # FastAPI (requires: vega add web)
172
+ vega generate router Product # Vega Web (requires: vega add web)
173
173
  vega generate command create-product # CLI
174
174
 
175
175
  # Infrastructure
@@ -179,7 +179,7 @@ vega generate model Product # SQLAlchemy (requires: vega add db)
179
179
  ### Add Features
180
180
 
181
181
  ```bash
182
- vega add web # Add FastAPI web support
182
+ vega add web # Add Vega Web support
183
183
  vega add sqlalchemy # Add database support
184
184
  ```
185
185
 
@@ -232,6 +232,7 @@ await UserCreated(user_id="123", email="test@test.com").publish()
232
232
  - [Patterns](docs/explanation/patterns/interactor.md) - Interactor, Mediator, Repository, Service
233
233
 
234
234
  ### Guides
235
+ - [Use Vega Web](docs/how-to/use-vega-web.md) - Build HTTP APIs with Vega's router and middleware
235
236
  - [Building Domain Layer](docs/how-to/build-domain-layer.md) - Business logic first
236
237
  - [CLI Reference](docs/reference/cli/overview.md) - All CLI commands
237
238
  - [Events System](docs/explanation/events/overview.md) - Event-driven architecture
@@ -268,7 +269,7 @@ my-app/
268
269
  │ └── services/ # API integrations
269
270
  ├── presentation/ # User interfaces
270
271
  │ ├── cli/ # CLI commands
271
- │ └── web/ # FastAPI routes
272
+ │ └── web/ # Vega Web routes
272
273
  ├── config.py # Dependency injection
273
274
  ├── settings.py # Configuration
274
275
  └── main.py # Entry point
@@ -289,7 +290,7 @@ async def create_order(request: Request):
289
290
  ```
290
291
 
291
292
  **Problems:**
292
- - Can't test without FastAPI, database, and Stripe
293
+ - Can't test without the web framework, database, and Stripe
293
294
  - Can't reuse for CLI or other interfaces
294
295
  - Business rules are unclear
295
296
  - Tightly coupled to specific technologies
@@ -309,7 +310,7 @@ class PlaceOrder(Interactor[Order]):
309
310
  await payment_service.charge(...)
310
311
  return await order_repo.save(order)
311
312
 
312
- # ✅ FastAPI route (Presentation) - just wiring
313
+ # ✅ Vega Web route (Presentation) - just wiring
313
314
  @router.post("/orders")
314
315
  async def create_order_api(request: CreateOrderRequest):
315
316
  return await PlaceOrder(...)
@@ -1,21 +1,22 @@
1
1
  vega/__init__.py,sha256=A05RwOYXooAZUz3GnbJ--ofLXgtRZK9gaSmsLVRdGPY,1811
2
2
  vega/cli/__init__.py,sha256=NCzOOyhKHqLeN1r80ekhMfkQwBdAQXKcKiKoNwYPNiY,304
3
3
  vega/cli/commands/__init__.py,sha256=UH7MdYduBG_YoulgdiWkUCtcgGLzuYRGFzxaqoa0pyg,19
4
- vega/cli/commands/add.py,sha256=5Li588W1KWQqCKV0VZSURx4J3I8dQE297c4V_3anf5U,6465
4
+ vega/cli/commands/add.py,sha256=Q9T6MHJcWCnRY68OrS3y4sO0kI6ElGlUHNHB2_jNJOU,6418
5
5
  vega/cli/commands/generate.py,sha256=wCvcj1bSIK9MJam8FcT9G2vrQTYv92JFRzPYOipJywA,38172
6
- vega/cli/commands/init.py,sha256=Ro35QfCKeo-Nm_rJkRT-DaX0nH7_bGc_ewX5Q1eqpP8,5860
6
+ vega/cli/commands/init.py,sha256=oOlc_CjZDLOswLJd8POUfPA6yFep3Th-f2sr4fqHI7M,5936
7
7
  vega/cli/commands/migrate.py,sha256=00swKeVhmKr1_1VJhg3GpIMcJ6Jfgz5FUpmJoLf5qSQ,3805
8
8
  vega/cli/commands/update.py,sha256=0zRWkHvQwKGlJL9XF3bi--dThkFapyNOugL6AgGr6Ic,5897
9
9
  vega/cli/commands/web.py,sha256=tkaMzrENiV044JdPtCSRmzX_vVpnumlDeTG6YH3DWo4,3450
10
- vega/cli/main.py,sha256=0hSar-MFpu3tp2QDOite4LGVpAhCTojuRZhPDiilEFQ,5476
11
- vega/cli/scaffolds/__init__.py,sha256=WFJf2H_4UWL89gDxX8PXKkTVSVOfw7hFfyaPWKokp1g,217
10
+ vega/cli/main.py,sha256=MlRUaJriz68rFW7fwG1Ug3k9fI8PF4NbENcTWTZcdh8,5470
11
+ vega/cli/scaffolds/__init__.py,sha256=wqddIhjBNDI-ztYj_E6B3tTrKfIoF4iPeynt454eHH0,378
12
12
  vega/cli/scaffolds/fastapi.py,sha256=9VqZD5TIT7iX6za_5h0L1aWqJ0V58pV8CyEiIxw7_w0,3013
13
13
  vega/cli/scaffolds/sqlalchemy.py,sha256=il5JqiA8LSQKnNoOYfAFD82rdYx5l_ZsqsjHnplYohw,6164
14
- vega/cli/templates/__init__.py,sha256=1Udc3hlhj3pJYQGk4NVpg0u9us040YarL_adlomJTf4,2018
14
+ vega/cli/scaffolds/vega_web.py,sha256=mVYi2TsokbJxYbInIOQHMyiDi3fH0nPBalDJIxC0mz4,3489
15
+ vega/cli/templates/__init__.py,sha256=f166zCou83Bf1j4ZHRZPIfjzN2L2qGo1QsMouFOcKUs,2755
15
16
  vega/cli/templates/cli/command.py.j2,sha256=Z8K9DRfppsco9uID_uG8EKVyWYD_1x-KYqLZY4BJKzM,1097
16
17
  vega/cli/templates/cli/command_simple.py.j2,sha256=PshUZyKtkazSEtaf6E1__hQbX07pz6ojxTXK4TgtUEw,531
17
18
  vega/cli/templates/cli/commands_init.py.j2,sha256=iZGnWmJoFUGM1pUMQGYLNplgwgwo8D48vT1hzBcHUEQ,300
18
- vega/cli/templates/components.py,sha256=93fzDB6DJUq4_wPaM1ao8RgHxlm6giMSu4JIP8ULOS4,8541
19
+ vega/cli/templates/components.py,sha256=5m3lkk8jCYeIiSgvScGAwoKzYSH-Jobb5Mip2HJ_LCM,9115
19
20
  vega/cli/templates/domain/entity.py.j2,sha256=dl5rzuJMnTRqOdU5SYV2o_OPGy9l6DNf_symCcjdjK0,344
20
21
  vega/cli/templates/domain/event.py.j2,sha256=hfNTrlhtwgyiid5oCIBOeVkb6t4K5IOCx7cd0cQi7mQ,667
21
22
  vega/cli/templates/domain/event_handler.py.j2,sha256=F8uYJp4WbbAjUk74raD01WcgjU0NVPqtD_9wx2aC4lM,664
@@ -43,18 +44,18 @@ vega/cli/templates/sqlalchemy/database_manager.py.j2,sha256=6h3a5RbGNnVLLt5cozTt
43
44
  vega/cli/templates/sqlalchemy/env.py.j2,sha256=IHZTD4OgX_hk7E-mu1wbPS4d_7UoM2VCJxvo8JHK3rY,2431
44
45
  vega/cli/templates/sqlalchemy/script.py.mako,sha256=MEqL-2qATlST9TAOeYgscMn1uy6HUS9NFvDgl93dMj8,635
45
46
  vega/cli/templates/web/__init__.py.j2,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
46
- vega/cli/templates/web/app.py.j2,sha256=mu9EjazXWTbKusaUJMA1SrIJzz4hfxeZQvTLfYyCS4E,416
47
- vega/cli/templates/web/health_route.py.j2,sha256=iq30wENqti14j3JOfVqJNO4WAE2NiNYzVq3R6ScVKVg,253
47
+ vega/cli/templates/web/app.py.j2,sha256=hIUiH1vtqAtX8u8aiSOaYz9xh9jX1Y9Isl8WeBf-21k,419
48
+ vega/cli/templates/web/health_route.py.j2,sha256=ZsPhr3mUmFlatoqVPS91YC1kLDOUWQViot28ijQ88FU,248
48
49
  vega/cli/templates/web/main.py.j2,sha256=9zJzBMOLZl4J3WqLULARosyILhdHiXYMMdxeNAHlX3w,557
49
50
  vega/cli/templates/web/middleware.py.j2,sha256=ild8nAdq45HGCiA-XVcWgmMBCfwIgORcZ7qsykmOclw,2165
50
51
  vega/cli/templates/web/models_init.py.j2,sha256=QdNOaZ6iMh3Tz7uut1VA3XUIivYD1SkHFmDHCfstqho,159
51
52
  vega/cli/templates/web/request_model.py.j2,sha256=PPoLGMd7VZ6QXj75UxCcryZZ9SNPhaDfMH2ykVtjIXQ,534
52
53
  vega/cli/templates/web/response_model.py.j2,sha256=wCSOhEUaDD1CYcim8qf6PEkhECTR7P0NsTtAme71qic,505
53
- vega/cli/templates/web/router.py.j2,sha256=5FgBYTcsdHH24Y9GtlsPWMllwygFO5aaCNCqNQGlhgc,4295
54
+ vega/cli/templates/web/router.py.j2,sha256=4L71VCJ_On7uS76aoTqPsD0249WQJBQMAg6KCL7n6bE,4290
54
55
  vega/cli/templates/web/routes_init.py.j2,sha256=uyeuLGRZ-bDY-xefJ1eI9wU1kt9z7lwoVjw_nvY7Vk4,397
55
- vega/cli/templates/web/routes_init_autodiscovery.py.j2,sha256=jxvFGmWsmW1tMCeOoYfPi4l0U94YkUxcZm2VFsGgTsw,310
56
+ vega/cli/templates/web/routes_init_autodiscovery.py.j2,sha256=XXCDNw_yBBgMLM0K8lTUEx7-_lxBhSM6dI7K-9Qpylg,308
56
57
  vega/cli/templates/web/user_models.py.j2,sha256=_lbG-oL8-C7Lk3-48YuKR65USD5TV4D9JNoFT9kktIM,1250
57
- vega/cli/templates/web/users_route.py.j2,sha256=TjKu28jxVY3SwToptjOZoclUnZkobbDOUfOYlDkjs40,1927
58
+ vega/cli/templates/web/users_route.py.j2,sha256=pSpnTZLE1kNtigkDqa-tx7-lsHgKdkDipgO7iNvz1IQ,1922
58
59
  vega/cli/utils/__init__.py,sha256=18sBatA5Y9TaJCCJqSCYRyF0XJrSty_UlPeZrJPlTlI,513
59
60
  vega/cli/utils/async_support.py,sha256=eU4HVZUCeJclZzpQQoDysiJ_qewwyCtu3C0TcSsuKl4,1511
60
61
  vega/cli/utils/messages.py,sha256=EtRWqMD6BUGaIuEWiH0cigpQPEaLOhnURSACSzdxBdA,2399
@@ -68,7 +69,7 @@ vega/di/scope.py,sha256=1yorvknVwmYGcDpNGsQDgob1jZQ5QoHdibbBH1SLcwQ,4652
68
69
  vega/discovery/__init__.py,sha256=nTq5wapJxg2ZZ2rylp1xY3Phq7OQYjXskIy2Ld8wQSw,251
69
70
  vega/discovery/commands.py,sha256=U1adQJXqBi88c2lkx8gMWzNE1hj8od72QLEKxjNq7gM,3375
70
71
  vega/discovery/events.py,sha256=TF8pjYE6gyJJRpOW8Pqvc0Gpu1n1iIHh3UBqzD8kGRI,3051
71
- vega/discovery/routes.py,sha256=WiNhNynbKewOrXv7D5fY03I3Oh_yfwEZbkeS8WGyQpU,4347
72
+ vega/discovery/routes.py,sha256=gp8DQcp8Rdfj9nGkxyzD8p6Rn7y8F_szVX5nIT13hGY,4338
72
73
  vega/events/README.md,sha256=3dp-ZwVxKURIl3FfokzMzVj12wlMImvWaWKx9Y46U7w,13934
73
74
  vega/events/SYNTAX_GUIDE.md,sha256=LFnxGOi-IzpOkpW5RERxL-jjMlVmJEIfdXN7_w0DJKY,8577
74
75
  vega/events/__init__.py,sha256=yt-0idaDMDfAFiQcRjI-VrDTunKGkYrMV9QFJ244p0Y,800
@@ -83,8 +84,18 @@ vega/patterns/repository.py,sha256=uYUyLs-O8OqW1Wb9ZqIo8UUcCjZ5UFuHors_F2iDg9A,1
83
84
  vega/patterns/service.py,sha256=buFRgJoeQtZQK22Upb4vh84c1elWKFXWBaB0X4RaruE,1374
84
85
  vega/settings/__init__.py,sha256=Eb8PMUyXAlCAQIcL2W8QhTTUHUbVlkAfXdpTUlADo1I,786
85
86
  vega/settings/base.py,sha256=bL45hyoa3t-hQOvur860eSo7O833sQMsXJJPwbTVbwE,1321
86
- vega_framework-0.1.34.dist-info/METADATA,sha256=qW5INwXRHJ0iD84K9niYoDeggeqA_meB2evoLxyFx9w,11105
87
- vega_framework-0.1.34.dist-info/WHEEL,sha256=zp0Cn7JsFoX2ATtOhtaFYIiE2rmFAD4OcMhtUki8W3U,88
88
- vega_framework-0.1.34.dist-info/entry_points.txt,sha256=p3gyTmPYjNRLbuiKS-hG3ytWd-ssBweFy6VZ-F9FTNk,42
89
- vega_framework-0.1.34.dist-info/licenses/LICENSE,sha256=wlHh1MBTcs2kSQr99P30mZ61s7uh7Cp9Rk0YiJxots0,1084
90
- vega_framework-0.1.34.dist-info/RECORD,,
87
+ vega/web/__init__.py,sha256=grAuMNHY1Z0uPXJVDdyyBt_X6JbKzdubG-7FAizW7Ws,2032
88
+ vega/web/application.py,sha256=OIupZT_Q3Lad74Zr-fzl1oxgbBc0cl1NEDR3Nz0TxTY,7004
89
+ vega/web/builtin_middlewares.py,sha256=01iSy-pZL-Y1R-f-GHzT2GVtdRuYK_-wZFv0VP_S9BU,9356
90
+ vega/web/exceptions.py,sha256=QxfhHntAIMwfqCvaCRro8MqKvxZxARjSoL9eTNWa5Qc,4897
91
+ vega/web/middleware.py,sha256=DZLlkcuKOV1uPGYnaT4MsbvFWnzFVAiyGcSvi8D2Vnw,5204
92
+ vega/web/request.py,sha256=-xz6cbRAxtY0hZv62UFgg0ces0dtDcCCE_EHcw6cEms,3181
93
+ vega/web/response.py,sha256=h5E7crRepaFRyUecasIbP3ErkRLpFQXRZhYl9OrFLWY,5641
94
+ vega/web/route_middleware.py,sha256=zZzkXsdu7bCRcw-CXvFmTjNuyJ1v4NNM1DbEQo7l0qg,8208
95
+ vega/web/router.py,sha256=6K6TPMZhi92jd030guYh_mdfN3Z9MTSfjy1P3xnFfdg,10575
96
+ vega/web/routing.py,sha256=5uxiroobZb194Vg_MNzJyd-B7BOiitdwQuH2oq9Z5B8,10506
97
+ vega_framework-0.2.0.dist-info/METADATA,sha256=R2K4dHAqHR36fDva1SB4iHMdMdRu_mcqg0LpBWG_beQ,11226
98
+ vega_framework-0.2.0.dist-info/WHEEL,sha256=zp0Cn7JsFoX2ATtOhtaFYIiE2rmFAD4OcMhtUki8W3U,88
99
+ vega_framework-0.2.0.dist-info/entry_points.txt,sha256=p3gyTmPYjNRLbuiKS-hG3ytWd-ssBweFy6VZ-F9FTNk,42
100
+ vega_framework-0.2.0.dist-info/licenses/LICENSE,sha256=wlHh1MBTcs2kSQr99P30mZ61s7uh7Cp9Rk0YiJxots0,1084
101
+ vega_framework-0.2.0.dist-info/RECORD,,