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/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
@@ -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
- return instance.call()
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):
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: vega-framework
3
- Version: 0.1.28
3
+ Version: 0.1.30
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
@@ -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=Rb4hXPHm_pFEKFViWJ2sMzyUNJWCCoTjLq2H2GvruGc,33720
6
- vega/cli/commands/init.py,sha256=kBRtntHT7e-y9uOwZm9o9IUED64e_pO5fBEsIx5m-X8,5592
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=7Lte7X7Gx0XJFCxnUIaadlmzXdosPR5P4Uu71V2cxWc,3130
10
- vega/cli/main.py,sha256=GNqNB6kX_c2a7d68B3g4_oFyWjxTf8ZaoPH7TaYiSmk,5136
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=axjR2Nk8Cy36owrXiHxDOFn9CCd6-Z7Ri5UvOcK1CoM,1876
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=nb8B9ha7-vYqnv6dpkI6ruL_Uo6cvJVdcDUseUACpdE,7631
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=FDlK10yYim6wHMk44IVncoo6RPO0TWDeHWpPjgLlaLo,577
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=s1MCuJQnCX1C0_YuAhKLHqhkpCRgeSrtAPfNbuboD20,180
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=QWy20KpWlgL6dav5IgHsfKFNHsTU0igyt4hWQxh_qXc,2366
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.28.dist-info/METADATA,sha256=phV5zRJGewa-FkO3KNY2BW8ILdZRaQy8qu-u4eaxISQ,12349
76
- vega_framework-0.1.28.dist-info/WHEEL,sha256=zp0Cn7JsFoX2ATtOhtaFYIiE2rmFAD4OcMhtUki8W3U,88
77
- vega_framework-0.1.28.dist-info/entry_points.txt,sha256=p3gyTmPYjNRLbuiKS-hG3ytWd-ssBweFy6VZ-F9FTNk,42
78
- vega_framework-0.1.28.dist-info/licenses/LICENSE,sha256=wlHh1MBTcs2kSQr99P30mZ61s7uh7Cp9Rk0YiJxots0,1084
79
- vega_framework-0.1.28.dist-info/RECORD,,
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,,