vega-framework 0.1.28__py3-none-any.whl → 0.1.30__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/cli/commands/generate.py +114 -0
- vega/cli/commands/init.py +6 -0
- vega/cli/commands/web.py +9 -0
- vega/cli/main.py +18 -1
- vega/cli/templates/__init__.py +6 -0
- vega/cli/templates/components.py +34 -0
- vega/cli/templates/domain/event.py.j2 +23 -0
- vega/cli/templates/domain/event_handler.py.j2 +22 -0
- vega/cli/templates/domain/repository_interface.py.j2 +1 -1
- vega/cli/templates/project/events_init.py.j2 +32 -0
- vega/discovery/__init__.py +2 -1
- vega/discovery/events.py +86 -0
- vega/events/README.md +564 -0
- vega/events/SYNTAX_GUIDE.md +360 -0
- vega/events/__init__.py +30 -0
- vega/events/bus.py +382 -0
- vega/events/decorators.py +181 -0
- vega/events/event.py +156 -0
- vega/events/middleware.py +259 -0
- vega/patterns/interactor.py +47 -1
- {vega_framework-0.1.28.dist-info → vega_framework-0.1.30.dist-info}/METADATA +1 -1
- {vega_framework-0.1.28.dist-info → vega_framework-0.1.30.dist-info}/RECORD +25 -14
- {vega_framework-0.1.28.dist-info → vega_framework-0.1.30.dist-info}/WHEEL +0 -0
- {vega_framework-0.1.28.dist-info → vega_framework-0.1.30.dist-info}/entry_points.txt +0 -0
- {vega_framework-0.1.28.dist-info → vega_framework-0.1.30.dist-info}/licenses/LICENSE +0 -0
vega/events/event.py
ADDED
@@ -0,0 +1,156 @@
|
|
1
|
+
"""Base Event class for domain events"""
|
2
|
+
from datetime import datetime, timezone
|
3
|
+
from typing import Any, Dict
|
4
|
+
from uuid import uuid4
|
5
|
+
|
6
|
+
|
7
|
+
class PublishableEventMeta(type):
|
8
|
+
"""
|
9
|
+
Metaclass for auto-publishing events.
|
10
|
+
|
11
|
+
Automatically publishes the event after instantiation,
|
12
|
+
allowing ultra-clean syntax:
|
13
|
+
|
14
|
+
await UserCreated(user_id="123", email="test@test.com")
|
15
|
+
|
16
|
+
Instead of:
|
17
|
+
event = UserCreated(user_id="123", email="test@test.com")
|
18
|
+
await event.publish()
|
19
|
+
"""
|
20
|
+
|
21
|
+
def __call__(cls, *args, **kwargs):
|
22
|
+
"""
|
23
|
+
Create instance and return publish() coroutine (auto-publish is always enabled).
|
24
|
+
|
25
|
+
To disable auto-publish on an event class (rare):
|
26
|
+
class UserCreated(Event, auto_publish=False):
|
27
|
+
...
|
28
|
+
"""
|
29
|
+
instance = super().__call__(*args, **kwargs)
|
30
|
+
|
31
|
+
# Auto-publish is enabled by default, can be disabled with auto_publish=False
|
32
|
+
if getattr(cls, '_auto_publish', True): # Default is True now!
|
33
|
+
return instance.publish()
|
34
|
+
|
35
|
+
return instance
|
36
|
+
|
37
|
+
|
38
|
+
class Event(metaclass=PublishableEventMeta):
|
39
|
+
"""
|
40
|
+
Base class for domain events.
|
41
|
+
|
42
|
+
An event represents something that has happened in the domain.
|
43
|
+
Events are immutable and should be named in past tense.
|
44
|
+
|
45
|
+
Key Characteristics:
|
46
|
+
- Immutable (use frozen dataclass or read-only properties)
|
47
|
+
- Named in past tense (UserCreated, OrderPlaced, PaymentProcessed)
|
48
|
+
- Contains all data needed by handlers
|
49
|
+
- Auto-generates event_id and timestamp
|
50
|
+
- Auto-publishes by default (like Interactors!)
|
51
|
+
|
52
|
+
Example - Auto-publish (default, ultra-clean syntax):
|
53
|
+
from vega.events import Event
|
54
|
+
from dataclasses import dataclass
|
55
|
+
|
56
|
+
@dataclass(frozen=True)
|
57
|
+
class UserCreated(Event):
|
58
|
+
user_id: str
|
59
|
+
email: str
|
60
|
+
name: str
|
61
|
+
|
62
|
+
def __post_init__(self):
|
63
|
+
super().__init__()
|
64
|
+
|
65
|
+
# Event is auto-published when instantiated! Just await it!
|
66
|
+
await UserCreated(user_id="123", email="test@test.com", name="Test")
|
67
|
+
|
68
|
+
Example - Disable auto-publish (rare, when you need to inspect first):
|
69
|
+
@dataclass(frozen=True)
|
70
|
+
class UserCreated(Event, auto_publish=False):
|
71
|
+
user_id: str
|
72
|
+
email: str
|
73
|
+
name: str
|
74
|
+
|
75
|
+
def __post_init__(self):
|
76
|
+
super().__init__()
|
77
|
+
|
78
|
+
# Manual publish
|
79
|
+
event = UserCreated(user_id="123", email="test@test.com", name="Test")
|
80
|
+
# ... inspect or modify event ...
|
81
|
+
await event.publish()
|
82
|
+
"""
|
83
|
+
|
84
|
+
def __init_subclass__(cls, auto_publish: bool = True, **kwargs):
|
85
|
+
"""
|
86
|
+
Hook to configure auto-publish behavior.
|
87
|
+
|
88
|
+
Args:
|
89
|
+
auto_publish: If False, event will NOT auto-publish when instantiated (default: True)
|
90
|
+
"""
|
91
|
+
super().__init_subclass__(**kwargs)
|
92
|
+
cls._auto_publish = auto_publish
|
93
|
+
|
94
|
+
def __init__(self):
|
95
|
+
"""Initialize event with auto-generated metadata"""
|
96
|
+
# Use object.__setattr__ to bypass frozen dataclass
|
97
|
+
object.__setattr__(self, '_event_id', str(uuid4()))
|
98
|
+
object.__setattr__(self, '_timestamp', datetime.now(timezone.utc))
|
99
|
+
object.__setattr__(self, '_metadata', {})
|
100
|
+
|
101
|
+
@property
|
102
|
+
def event_id(self) -> str:
|
103
|
+
"""Unique identifier for this event instance"""
|
104
|
+
return self._event_id
|
105
|
+
|
106
|
+
@property
|
107
|
+
def timestamp(self) -> datetime:
|
108
|
+
"""When this event was created"""
|
109
|
+
return self._timestamp
|
110
|
+
|
111
|
+
@property
|
112
|
+
def event_name(self) -> str:
|
113
|
+
"""Name of the event (class name)"""
|
114
|
+
return self.__class__.__name__
|
115
|
+
|
116
|
+
@property
|
117
|
+
def metadata(self) -> Dict[str, Any]:
|
118
|
+
"""Additional metadata attached to the event"""
|
119
|
+
return self._metadata
|
120
|
+
|
121
|
+
def add_metadata(self, key: str, value: Any) -> None:
|
122
|
+
"""
|
123
|
+
Add metadata to the event.
|
124
|
+
|
125
|
+
Useful for adding correlation IDs, user context, etc.
|
126
|
+
|
127
|
+
Args:
|
128
|
+
key: Metadata key
|
129
|
+
value: Metadata value
|
130
|
+
"""
|
131
|
+
# Access metadata dict directly to modify it
|
132
|
+
if not hasattr(self, '_metadata'):
|
133
|
+
object.__setattr__(self, '_metadata', {})
|
134
|
+
self._metadata[key] = value
|
135
|
+
|
136
|
+
async def publish(self) -> None:
|
137
|
+
"""
|
138
|
+
Publish this event to the global event bus.
|
139
|
+
|
140
|
+
This is a convenience method to avoid importing get_event_bus().
|
141
|
+
|
142
|
+
Example:
|
143
|
+
event = UserCreated(user_id="123", email="test@test.com", name="Test")
|
144
|
+
await event.publish() # Simple!
|
145
|
+
|
146
|
+
Note:
|
147
|
+
This uses the global event bus. If you need a custom bus,
|
148
|
+
call bus.publish(event) directly.
|
149
|
+
"""
|
150
|
+
# Import here to avoid circular dependency
|
151
|
+
from vega.events.bus import get_event_bus
|
152
|
+
bus = get_event_bus()
|
153
|
+
await bus.publish(self)
|
154
|
+
|
155
|
+
def __repr__(self) -> str:
|
156
|
+
return f"{self.event_name}(event_id={self.event_id}, timestamp={self.timestamp})"
|
@@ -0,0 +1,259 @@
|
|
1
|
+
"""Event middleware for cross-cutting concerns"""
|
2
|
+
import logging
|
3
|
+
import time
|
4
|
+
from abc import ABC, abstractmethod
|
5
|
+
from typing import Any, Dict
|
6
|
+
|
7
|
+
from vega.events.event import Event
|
8
|
+
|
9
|
+
logger = logging.getLogger(__name__)
|
10
|
+
|
11
|
+
|
12
|
+
class EventMiddleware(ABC):
|
13
|
+
"""
|
14
|
+
Base class for event middleware.
|
15
|
+
|
16
|
+
Middleware allows you to add cross-cutting concerns to event processing,
|
17
|
+
such as logging, metrics, validation, or security checks.
|
18
|
+
|
19
|
+
Middleware is executed in the order it was added to the event bus.
|
20
|
+
|
21
|
+
Example:
|
22
|
+
class LoggingMiddleware(EventMiddleware):
|
23
|
+
async def before_publish(self, event: Event):
|
24
|
+
print(f"Publishing: {event.event_name}")
|
25
|
+
|
26
|
+
async def after_publish(self, event: Event):
|
27
|
+
print(f"Published: {event.event_name}")
|
28
|
+
|
29
|
+
bus = EventBus()
|
30
|
+
bus.add_middleware(LoggingMiddleware())
|
31
|
+
"""
|
32
|
+
|
33
|
+
@abstractmethod
|
34
|
+
async def before_publish(self, event: Event) -> None:
|
35
|
+
"""
|
36
|
+
Called before event is published to handlers.
|
37
|
+
|
38
|
+
Use this to modify the event, add metadata, or perform validation.
|
39
|
+
|
40
|
+
Args:
|
41
|
+
event: Event about to be published
|
42
|
+
"""
|
43
|
+
pass
|
44
|
+
|
45
|
+
@abstractmethod
|
46
|
+
async def after_publish(self, event: Event) -> None:
|
47
|
+
"""
|
48
|
+
Called after all handlers have processed the event.
|
49
|
+
|
50
|
+
Use this for cleanup, logging, or metrics collection.
|
51
|
+
|
52
|
+
Args:
|
53
|
+
event: Event that was published
|
54
|
+
"""
|
55
|
+
pass
|
56
|
+
|
57
|
+
|
58
|
+
class LoggingEventMiddleware(EventMiddleware):
|
59
|
+
"""
|
60
|
+
Middleware that logs all events.
|
61
|
+
|
62
|
+
Logs event name, ID, and processing time.
|
63
|
+
|
64
|
+
Example:
|
65
|
+
from vega.events import EventBus, LoggingEventMiddleware
|
66
|
+
|
67
|
+
bus = EventBus()
|
68
|
+
bus.add_middleware(LoggingEventMiddleware())
|
69
|
+
"""
|
70
|
+
|
71
|
+
def __init__(self, log_level: int = logging.DEBUG):
|
72
|
+
"""
|
73
|
+
Initialize logging middleware.
|
74
|
+
|
75
|
+
Args:
|
76
|
+
log_level: Log level to use (default: DEBUG)
|
77
|
+
"""
|
78
|
+
self.log_level = log_level
|
79
|
+
self._start_times: Dict[str, float] = {}
|
80
|
+
|
81
|
+
async def before_publish(self, event: Event) -> None:
|
82
|
+
"""Log event publication start"""
|
83
|
+
self._start_times[event.event_id] = time.time()
|
84
|
+
logger.log(
|
85
|
+
self.log_level,
|
86
|
+
f"Publishing event: {event.event_name} (id={event.event_id})"
|
87
|
+
)
|
88
|
+
|
89
|
+
async def after_publish(self, event: Event) -> None:
|
90
|
+
"""Log event publication completion with duration"""
|
91
|
+
start_time = self._start_times.pop(event.event_id, None)
|
92
|
+
if start_time:
|
93
|
+
duration = (time.time() - start_time) * 1000 # ms
|
94
|
+
logger.log(
|
95
|
+
self.log_level,
|
96
|
+
f"Event processed: {event.event_name} (id={event.event_id}, duration={duration:.2f}ms)"
|
97
|
+
)
|
98
|
+
|
99
|
+
|
100
|
+
class MetricsEventMiddleware(EventMiddleware):
|
101
|
+
"""
|
102
|
+
Middleware that collects metrics for events.
|
103
|
+
|
104
|
+
Tracks:
|
105
|
+
- Event count by type
|
106
|
+
- Processing duration
|
107
|
+
- Success/failure rates
|
108
|
+
|
109
|
+
Example:
|
110
|
+
middleware = MetricsEventMiddleware()
|
111
|
+
bus.add_middleware(middleware)
|
112
|
+
|
113
|
+
# Later, get metrics
|
114
|
+
print(middleware.get_metrics())
|
115
|
+
"""
|
116
|
+
|
117
|
+
def __init__(self):
|
118
|
+
"""Initialize metrics middleware"""
|
119
|
+
self._metrics: Dict[str, Dict[str, Any]] = {}
|
120
|
+
self._start_times: Dict[str, float] = {}
|
121
|
+
|
122
|
+
async def before_publish(self, event: Event) -> None:
|
123
|
+
"""Record event start time"""
|
124
|
+
self._start_times[event.event_id] = time.time()
|
125
|
+
|
126
|
+
# Initialize metrics for this event type
|
127
|
+
event_name = event.event_name
|
128
|
+
if event_name not in self._metrics:
|
129
|
+
self._metrics[event_name] = {
|
130
|
+
'count': 0,
|
131
|
+
'total_duration_ms': 0,
|
132
|
+
'min_duration_ms': float('inf'),
|
133
|
+
'max_duration_ms': 0,
|
134
|
+
}
|
135
|
+
|
136
|
+
async def after_publish(self, event: Event) -> None:
|
137
|
+
"""Record event completion and update metrics"""
|
138
|
+
start_time = self._start_times.pop(event.event_id, None)
|
139
|
+
if start_time is None:
|
140
|
+
return
|
141
|
+
|
142
|
+
duration_ms = (time.time() - start_time) * 1000
|
143
|
+
|
144
|
+
# Update metrics
|
145
|
+
event_name = event.event_name
|
146
|
+
metrics = self._metrics[event_name]
|
147
|
+
metrics['count'] += 1
|
148
|
+
metrics['total_duration_ms'] += duration_ms
|
149
|
+
metrics['min_duration_ms'] = min(metrics['min_duration_ms'], duration_ms)
|
150
|
+
metrics['max_duration_ms'] = max(metrics['max_duration_ms'], duration_ms)
|
151
|
+
metrics['avg_duration_ms'] = metrics['total_duration_ms'] / metrics['count']
|
152
|
+
|
153
|
+
def get_metrics(self) -> Dict[str, Dict[str, Any]]:
|
154
|
+
"""
|
155
|
+
Get collected metrics.
|
156
|
+
|
157
|
+
Returns:
|
158
|
+
Dictionary of metrics by event type
|
159
|
+
"""
|
160
|
+
return self._metrics.copy()
|
161
|
+
|
162
|
+
def reset_metrics(self) -> None:
|
163
|
+
"""Reset all metrics"""
|
164
|
+
self._metrics.clear()
|
165
|
+
self._start_times.clear()
|
166
|
+
|
167
|
+
|
168
|
+
class ValidationEventMiddleware(EventMiddleware):
|
169
|
+
"""
|
170
|
+
Middleware that validates events before publishing.
|
171
|
+
|
172
|
+
Ensures events meet certain criteria before being processed.
|
173
|
+
|
174
|
+
Example:
|
175
|
+
def validate_user_event(event):
|
176
|
+
if hasattr(event, 'user_id') and not event.user_id:
|
177
|
+
raise ValueError("user_id cannot be empty")
|
178
|
+
|
179
|
+
middleware = ValidationEventMiddleware()
|
180
|
+
middleware.add_validator(UserCreated, validate_user_event)
|
181
|
+
|
182
|
+
bus.add_middleware(middleware)
|
183
|
+
"""
|
184
|
+
|
185
|
+
def __init__(self):
|
186
|
+
"""Initialize validation middleware"""
|
187
|
+
from typing import Type, Callable
|
188
|
+
self._validators: Dict[Type[Event], list[Callable]] = {}
|
189
|
+
|
190
|
+
def add_validator(self, event_type: type, validator: callable) -> None:
|
191
|
+
"""
|
192
|
+
Add a validator for an event type.
|
193
|
+
|
194
|
+
Args:
|
195
|
+
event_type: Event type to validate
|
196
|
+
validator: Validation function that raises on invalid event
|
197
|
+
"""
|
198
|
+
if event_type not in self._validators:
|
199
|
+
self._validators[event_type] = []
|
200
|
+
self._validators[event_type].append(validator)
|
201
|
+
|
202
|
+
async def before_publish(self, event: Event) -> None:
|
203
|
+
"""Validate event before publishing"""
|
204
|
+
event_type = type(event)
|
205
|
+
|
206
|
+
# Run validators for this event type
|
207
|
+
if event_type in self._validators:
|
208
|
+
for validator in self._validators[event_type]:
|
209
|
+
# Run validator
|
210
|
+
result = validator(event)
|
211
|
+
# Await if async
|
212
|
+
if hasattr(result, '__await__'):
|
213
|
+
await result
|
214
|
+
|
215
|
+
async def after_publish(self, event: Event) -> None:
|
216
|
+
"""No action after publish"""
|
217
|
+
pass
|
218
|
+
|
219
|
+
|
220
|
+
class EnrichmentEventMiddleware(EventMiddleware):
|
221
|
+
"""
|
222
|
+
Middleware that enriches events with additional data.
|
223
|
+
|
224
|
+
Automatically adds metadata like user context, correlation IDs, etc.
|
225
|
+
|
226
|
+
Example:
|
227
|
+
middleware = EnrichmentEventMiddleware()
|
228
|
+
middleware.add_enricher(lambda event: event.add_metadata('tenant_id', 'abc123'))
|
229
|
+
|
230
|
+
bus.add_middleware(middleware)
|
231
|
+
"""
|
232
|
+
|
233
|
+
def __init__(self):
|
234
|
+
"""Initialize enrichment middleware"""
|
235
|
+
self._enrichers: list[callable] = []
|
236
|
+
|
237
|
+
def add_enricher(self, enricher: callable) -> None:
|
238
|
+
"""
|
239
|
+
Add an enricher function.
|
240
|
+
|
241
|
+
Enricher should modify the event in-place (e.g., add metadata).
|
242
|
+
|
243
|
+
Args:
|
244
|
+
enricher: Function that enriches the event
|
245
|
+
"""
|
246
|
+
self._enrichers.append(enricher)
|
247
|
+
|
248
|
+
async def before_publish(self, event: Event) -> None:
|
249
|
+
"""Enrich event before publishing"""
|
250
|
+
for enricher in self._enrichers:
|
251
|
+
# Run enricher
|
252
|
+
result = enricher(event)
|
253
|
+
# Await if async
|
254
|
+
if hasattr(result, '__await__'):
|
255
|
+
await result
|
256
|
+
|
257
|
+
async def after_publish(self, event: Event) -> None:
|
258
|
+
"""No action after publish"""
|
259
|
+
pass
|
vega/patterns/interactor.py
CHANGED
@@ -15,16 +15,62 @@ class InteractorMeta(ABCMeta):
|
|
15
15
|
Instead of:
|
16
16
|
interactor = CreateUser(name="John", email="john@example.com")
|
17
17
|
result = await interactor.call()
|
18
|
+
|
19
|
+
Also supports @trigger decorator to automatically publish events after call() completes.
|
18
20
|
"""
|
19
21
|
|
20
22
|
def __call__(cls, *args, **kwargs):
|
21
23
|
"""
|
22
24
|
Create instance and call the call() method.
|
23
25
|
|
26
|
+
If @trigger decorator is used, wraps call() to publish event after completion.
|
27
|
+
|
24
28
|
Returns the result of call() method (usually a coroutine).
|
25
29
|
"""
|
26
30
|
instance = super(InteractorMeta, cls).__call__(*args, **kwargs)
|
27
|
-
|
31
|
+
call_result = instance.call()
|
32
|
+
|
33
|
+
# Check if @trigger decorator was used
|
34
|
+
if hasattr(cls, '_trigger_event'):
|
35
|
+
# Wrap the coroutine to trigger event after completion
|
36
|
+
return cls._wrap_with_event_trigger(call_result, cls._trigger_event)
|
37
|
+
|
38
|
+
return call_result
|
39
|
+
|
40
|
+
@staticmethod
|
41
|
+
async def _wrap_with_event_trigger(call_coroutine, event_class):
|
42
|
+
"""
|
43
|
+
Wrap call() coroutine to trigger event after it completes.
|
44
|
+
|
45
|
+
Args:
|
46
|
+
call_coroutine: The coroutine returned by call()
|
47
|
+
event_class: The event class to instantiate and publish
|
48
|
+
|
49
|
+
Returns:
|
50
|
+
The result of call()
|
51
|
+
"""
|
52
|
+
# Execute the call() method
|
53
|
+
result = await call_coroutine
|
54
|
+
|
55
|
+
# Trigger the event with the result
|
56
|
+
try:
|
57
|
+
# If result is a dict, unpack as kwargs
|
58
|
+
if isinstance(result, dict):
|
59
|
+
await event_class(**result)
|
60
|
+
# If result is None, create event with no args
|
61
|
+
elif result is None:
|
62
|
+
await event_class()
|
63
|
+
# Otherwise, pass result as first argument
|
64
|
+
else:
|
65
|
+
await event_class(result)
|
66
|
+
except Exception as e:
|
67
|
+
# Log but don't fail the interactor if event publishing fails
|
68
|
+
import logging
|
69
|
+
logger = logging.getLogger(__name__)
|
70
|
+
logger.error(f"Failed to trigger event {event_class.__name__}: {e}")
|
71
|
+
|
72
|
+
# Return the original result
|
73
|
+
return result
|
28
74
|
|
29
75
|
|
30
76
|
class Interactor(Generic[T], metaclass=InteractorMeta):
|
@@ -2,24 +2,26 @@ 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
4
|
vega/cli/commands/add.py,sha256=5Li588W1KWQqCKV0VZSURx4J3I8dQE297c4V_3anf5U,6465
|
5
|
-
vega/cli/commands/generate.py,sha256=
|
6
|
-
vega/cli/commands/init.py,sha256=
|
5
|
+
vega/cli/commands/generate.py,sha256=S3qNE40exn1dSub8kM8Vp-Tpn9ByK2UBjaVA6LadAos,38172
|
6
|
+
vega/cli/commands/init.py,sha256=Ro35QfCKeo-Nm_rJkRT-DaX0nH7_bGc_ewX5Q1eqpP8,5860
|
7
7
|
vega/cli/commands/migrate.py,sha256=00swKeVhmKr1_1VJhg3GpIMcJ6Jfgz5FUpmJoLf5qSQ,3805
|
8
8
|
vega/cli/commands/update.py,sha256=0zRWkHvQwKGlJL9XF3bi--dThkFapyNOugL6AgGr6Ic,5897
|
9
|
-
vega/cli/commands/web.py,sha256=
|
10
|
-
vega/cli/main.py,sha256=
|
9
|
+
vega/cli/commands/web.py,sha256=tkaMzrENiV044JdPtCSRmzX_vVpnumlDeTG6YH3DWo4,3450
|
10
|
+
vega/cli/main.py,sha256=0hSar-MFpu3tp2QDOite4LGVpAhCTojuRZhPDiilEFQ,5476
|
11
11
|
vega/cli/scaffolds/__init__.py,sha256=WFJf2H_4UWL89gDxX8PXKkTVSVOfw7hFfyaPWKokp1g,217
|
12
12
|
vega/cli/scaffolds/fastapi.py,sha256=a_vZVSfMgyteRURFZAShbtjSRMOSM4YeEIKKvBtAOfo,3788
|
13
13
|
vega/cli/scaffolds/sqlalchemy.py,sha256=il5JqiA8LSQKnNoOYfAFD82rdYx5l_ZsqsjHnplYohw,6164
|
14
|
-
vega/cli/templates/__init__.py,sha256=
|
14
|
+
vega/cli/templates/__init__.py,sha256=1Udc3hlhj3pJYQGk4NVpg0u9us040YarL_adlomJTf4,2018
|
15
15
|
vega/cli/templates/cli/command.py.j2,sha256=Z8K9DRfppsco9uID_uG8EKVyWYD_1x-KYqLZY4BJKzM,1097
|
16
16
|
vega/cli/templates/cli/command_simple.py.j2,sha256=PshUZyKtkazSEtaf6E1__hQbX07pz6ojxTXK4TgtUEw,531
|
17
17
|
vega/cli/templates/cli/commands_init.py.j2,sha256=iZGnWmJoFUGM1pUMQGYLNplgwgwo8D48vT1hzBcHUEQ,300
|
18
|
-
vega/cli/templates/components.py,sha256=
|
18
|
+
vega/cli/templates/components.py,sha256=93fzDB6DJUq4_wPaM1ao8RgHxlm6giMSu4JIP8ULOS4,8541
|
19
19
|
vega/cli/templates/domain/entity.py.j2,sha256=dl5rzuJMnTRqOdU5SYV2o_OPGy9l6DNf_symCcjdjK0,344
|
20
|
+
vega/cli/templates/domain/event.py.j2,sha256=hfNTrlhtwgyiid5oCIBOeVkb6t4K5IOCx7cd0cQi7mQ,667
|
21
|
+
vega/cli/templates/domain/event_handler.py.j2,sha256=F8uYJp4WbbAjUk74raD01WcgjU0NVPqtD_9wx2aC4lM,664
|
20
22
|
vega/cli/templates/domain/interactor.py.j2,sha256=Hv6whUyW67smjMRw_HuvC3_-q7g32dEUOFZdmi5xkrc,684
|
21
23
|
vega/cli/templates/domain/mediator.py.j2,sha256=gdEDNscYaB3wOemaVrFr3qKVE5sTS5wRVvbxrrfBemY,694
|
22
|
-
vega/cli/templates/domain/repository_interface.py.j2,sha256=
|
24
|
+
vega/cli/templates/domain/repository_interface.py.j2,sha256=90jPcokr7GPbfzma_k5GFYFAKk8RZ52SMTmnrC6bnQg,584
|
23
25
|
vega/cli/templates/domain/service_interface.py.j2,sha256=Pq-wwGvGbns9Z_2lqL8Xi2_G-MMU-0JjAuGW94H6mrE,330
|
24
26
|
vega/cli/templates/infrastructure/model.py.j2,sha256=zNY4m7BZJeQhdu_bTFY6WIhizsYW4eJY6PS1DCs0vbE,796
|
25
27
|
vega/cli/templates/infrastructure/repository_impl.py.j2,sha256=Rmip4Swh3wdJRioVOWKgJVQgl45Y9STu3M-oviaOrPM,488
|
@@ -30,6 +32,7 @@ vega/cli/templates/project/.gitignore,sha256=7JSDihCtBznd-QxQ4wUtHM9fnbYnbw6PK4A
|
|
30
32
|
vega/cli/templates/project/ARCHITECTURE.md.j2,sha256=HunrJ_9LlPxd5-GONaJxjoLlw-XfjYaLpsVHFa72Yf4,25868
|
31
33
|
vega/cli/templates/project/README.md.j2,sha256=tZtMKhyKjfCq5JTECHihISu0VjYd254t-7y2kJ0nbKY,4589
|
32
34
|
vega/cli/templates/project/config.py.j2,sha256=1Iva9JEz5ej_WmTbRVBvOfSBhYUKIzN88p6GYKR0m4s,866
|
35
|
+
vega/cli/templates/project/events_init.py.j2,sha256=dp9yc8_Du6lv62vum_Br0p030I4TKZAkZG29mj4AZaM,1057
|
33
36
|
vega/cli/templates/project/main.py.j2,sha256=wpIWNcj0N42KI1crdn0aDISZ6aRt9LjX7FDzJxEE8OM,572
|
34
37
|
vega/cli/templates/project/main_fastapi.py.j2,sha256=5xXB7_OR1-3vkTAkvRvSh3GpL5NWnUEId3bSOOd9qxA,613
|
35
38
|
vega/cli/templates/project/main_standard.py.j2,sha256=j2z6u93_ObiOquzYQM1sZex50Z1cAwHOEG1-0REImRI,617
|
@@ -62,18 +65,26 @@ vega/di/container.py,sha256=o4cpxCx53wWSNLcrr8Qt9tc7_YiDtHpYvUrdruNVwEc,5467
|
|
62
65
|
vega/di/decorators.py,sha256=WypsUa9sqojwCCnZ6jXdOob6G6vL4wIx3df_WbUV8Ks,9733
|
63
66
|
vega/di/errors.py,sha256=TITDvwkL05b_O7sygJvTx8aSegUXBgF2EqEhVxRuuGE,148
|
64
67
|
vega/di/scope.py,sha256=1yorvknVwmYGcDpNGsQDgob1jZQ5QoHdibbBH1SLcwQ,4652
|
65
|
-
vega/discovery/__init__.py,sha256=
|
68
|
+
vega/discovery/__init__.py,sha256=nTq5wapJxg2ZZ2rylp1xY3Phq7OQYjXskIy2Ld8wQSw,251
|
66
69
|
vega/discovery/commands.py,sha256=U1adQJXqBi88c2lkx8gMWzNE1hj8od72QLEKxjNq7gM,3375
|
70
|
+
vega/discovery/events.py,sha256=TF8pjYE6gyJJRpOW8Pqvc0Gpu1n1iIHh3UBqzD8kGRI,3051
|
67
71
|
vega/discovery/routes.py,sha256=WiNhNynbKewOrXv7D5fY03I3Oh_yfwEZbkeS8WGyQpU,4347
|
72
|
+
vega/events/README.md,sha256=3dp-ZwVxKURIl3FfokzMzVj12wlMImvWaWKx9Y46U7w,13934
|
73
|
+
vega/events/SYNTAX_GUIDE.md,sha256=LFnxGOi-IzpOkpW5RERxL-jjMlVmJEIfdXN7_w0DJKY,8577
|
74
|
+
vega/events/__init__.py,sha256=yt-0idaDMDfAFiQcRjI-VrDTunKGkYrMV9QFJ244p0Y,800
|
75
|
+
vega/events/bus.py,sha256=uALNVeGOyis2ZLCUQn7d87U3UzBO1-0HYO0GErxCmmM,12116
|
76
|
+
vega/events/decorators.py,sha256=UF2dQ2GOoXeGuScWBNsePP66ZCIZznJalZVX3i4ome0,5720
|
77
|
+
vega/events/event.py,sha256=PfsIl8-6dZR2J1aS7VV9ZQn1CzxvNZOcbP-dil49z9U,4964
|
78
|
+
vega/events/middleware.py,sha256=jNltBxeF42-XnC_uVB9OD0BLNRBirudOPeOUYa-fGv8,7862
|
68
79
|
vega/patterns/__init__.py,sha256=UlrgFy8OQkAjgqRLFCOcnTHFKODfZH4FA4_33hq0GgQ,1150
|
69
|
-
vega/patterns/interactor.py,sha256=
|
80
|
+
vega/patterns/interactor.py,sha256=kRJaFp2eUwHZ-cTQ5y7FoF59yEUo2J9yzL9mo_JbLfI,4030
|
70
81
|
vega/patterns/mediator.py,sha256=n5rqu1ZD0iljbAHct4mRPFPHaKVPWQJF-Ps9egYQ41g,2306
|
71
82
|
vega/patterns/repository.py,sha256=uYUyLs-O8OqW1Wb9ZqIo8UUcCjZ5UFuHors_F2iDg9A,1480
|
72
83
|
vega/patterns/service.py,sha256=buFRgJoeQtZQK22Upb4vh84c1elWKFXWBaB0X4RaruE,1374
|
73
84
|
vega/settings/__init__.py,sha256=Eb8PMUyXAlCAQIcL2W8QhTTUHUbVlkAfXdpTUlADo1I,786
|
74
85
|
vega/settings/base.py,sha256=bL45hyoa3t-hQOvur860eSo7O833sQMsXJJPwbTVbwE,1321
|
75
|
-
vega_framework-0.1.
|
76
|
-
vega_framework-0.1.
|
77
|
-
vega_framework-0.1.
|
78
|
-
vega_framework-0.1.
|
79
|
-
vega_framework-0.1.
|
86
|
+
vega_framework-0.1.30.dist-info/METADATA,sha256=zPGu-SvaUbI2HUAlWGgpN457HPycRqeGpEuKO5pq2v8,12349
|
87
|
+
vega_framework-0.1.30.dist-info/WHEEL,sha256=zp0Cn7JsFoX2ATtOhtaFYIiE2rmFAD4OcMhtUki8W3U,88
|
88
|
+
vega_framework-0.1.30.dist-info/entry_points.txt,sha256=p3gyTmPYjNRLbuiKS-hG3ytWd-ssBweFy6VZ-F9FTNk,42
|
89
|
+
vega_framework-0.1.30.dist-info/licenses/LICENSE,sha256=wlHh1MBTcs2kSQr99P30mZ61s7uh7Cp9Rk0YiJxots0,1084
|
90
|
+
vega_framework-0.1.30.dist-info/RECORD,,
|
File without changes
|
File without changes
|
File without changes
|