orionis 0.471.0__py3-none-any.whl → 0.473.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.
@@ -520,7 +520,7 @@ class Reactor(IReactor):
520
520
  command_instance._args = {}
521
521
 
522
522
  # Call the handle method of the command instance
523
- output = self.__app.call(command_instance, 'handle')
523
+ output = self.__app.call(command_instance, 'handle')
524
524
 
525
525
  # Log the command execution completion with DONE state
526
526
  elapsed_time = round(time.perf_counter() - start_time, 2)
@@ -1,4 +1,5 @@
1
1
  import abc
2
+ import asyncio
2
3
  import inspect
3
4
  import threading
4
5
  import typing
@@ -106,6 +107,122 @@ class Container(IContainer):
106
107
  # Mark this instance as initialized
107
108
  self.__initialized = True
108
109
 
110
+ def __handleSyncAsyncResult(
111
+ self,
112
+ result: Any
113
+ ) -> Any:
114
+ """
115
+ Universal helper to handle both synchronous and asynchronous results.
116
+
117
+ This method automatically detects if a result is a coroutine and handles
118
+ it appropriately based on the current execution context.
119
+
120
+ Parameters
121
+ ----------
122
+ result : Any
123
+ The result to handle, which may be a coroutine or regular value.
124
+
125
+ Returns
126
+ -------
127
+ Any
128
+ The resolved result. If the result was a coroutine, it will be awaited
129
+ if possible, or scheduled appropriately.
130
+ """
131
+
132
+ # If the result is not a coroutine, return it directly
133
+ if not asyncio.iscoroutine(result):
134
+ return result
135
+
136
+ try:
137
+
138
+ # Check if we're currently in an event loop
139
+ loop = asyncio.get_running_loop()
140
+
141
+ # If we're in an async context, we need to let the caller handle the coroutine
142
+ # Since we can't await here, we'll create a task and get the result synchronously
143
+ # This is a compromise for mixed sync/async environments
144
+ if loop.is_running():
145
+
146
+ # For running loops, we create a new thread to run the coroutine
147
+ import concurrent.futures
148
+
149
+ # Define a function to run the coroutine in a new event loop
150
+ def run_coroutine():
151
+
152
+ # Create a new event loop for this thread
153
+ new_loop = asyncio.new_event_loop()
154
+ asyncio.set_event_loop(new_loop)
155
+
156
+ # Run the coroutine until completion
157
+ try:
158
+ return new_loop.run_until_complete(result)
159
+
160
+ # Finally, ensure the loop is closed to free resources
161
+ finally:
162
+ new_loop.close()
163
+
164
+ # Use ThreadPoolExecutor to run the coroutine in a separate thread
165
+ with concurrent.futures.ThreadPoolExecutor() as executor:
166
+ future = executor.submit(run_coroutine)
167
+ return future.result()
168
+
169
+ else:
170
+ # If loop exists but not running, we can run the coroutine
171
+ return loop.run_until_complete(result)
172
+
173
+ except RuntimeError:
174
+
175
+ # No event loop running, we can run the coroutine directly
176
+ return asyncio.run(result)
177
+
178
+ def __invokeCallableUniversal(
179
+ self,
180
+ fn: Callable[..., Any],
181
+ *args,
182
+ **kwargs
183
+ ) -> Any:
184
+ """
185
+ Universal callable invoker that handles both sync and async callables.
186
+
187
+ Parameters
188
+ ----------
189
+ fn : Callable[..., Any]
190
+ The callable to invoke.
191
+ *args : tuple
192
+ Positional arguments to pass to the callable.
193
+ **kwargs : dict
194
+ Keyword arguments to pass to the callable.
195
+
196
+ Returns
197
+ -------
198
+ Any
199
+ The result of the callable invocation.
200
+
201
+ Raises
202
+ ------
203
+ OrionisContainerException
204
+ If the callable invocation fails.
205
+ """
206
+
207
+ try:
208
+
209
+ # Check if the callable is a coroutine function
210
+ result = fn(*args, **kwargs)
211
+ return self.__handleSyncAsyncResult(result)
212
+
213
+ except TypeError as e:
214
+
215
+ # If invocation fails, use ReflectionCallable for better error messaging
216
+ rf_callable = ReflectionCallable(fn)
217
+ function_name = rf_callable.getName()
218
+ signature = rf_callable.getSignature()
219
+
220
+ # Raise a more informative exception with the function name and signature
221
+ raise OrionisContainerException(
222
+ f"Failed to invoke function [{function_name}] with the provided arguments: {e}\n"
223
+ f"Expected function signature: [{signature}]"
224
+ ) from e
225
+
109
226
  def transient(
110
227
  self,
111
228
  abstract: Callable[..., Any],
@@ -1284,6 +1401,7 @@ class Container(IContainer):
1284
1401
  ) -> Any:
1285
1402
  """
1286
1403
  Invokes a callable with the provided arguments.
1404
+ Supports both synchronous and asynchronous callables automatically.
1287
1405
 
1288
1406
  Parameters
1289
1407
  ----------
@@ -1297,27 +1415,10 @@ class Container(IContainer):
1297
1415
  Returns
1298
1416
  -------
1299
1417
  Any
1300
- The result of the callable.
1418
+ The result of the callable. If the callable is async,
1419
+ the coroutine will be handled automatically.
1301
1420
  """
1302
-
1303
- # Try to invoke the callable with the provided arguments
1304
- try:
1305
-
1306
- # If the callable is a function, invoke it directly
1307
- return fn(*args, **kwargs)
1308
-
1309
- except TypeError as e:
1310
-
1311
- # If invocation fails, use ReflectionCallable to get function name and signature
1312
- rf_callable = ReflectionCallable(fn)
1313
- function_name = rf_callable.getName()
1314
- signature = rf_callable.getSignature()
1315
-
1316
- # Raise an exception with detailed information about the failure
1317
- raise OrionisContainerException(
1318
- f"Failed to invoke function [{function_name}] with the provided arguments: {e}\n"
1319
- f"Expected function signature: [{signature}]"
1320
- ) from e
1421
+ return self.__invokeCallableUniversal(fn, *args, **kwargs)
1321
1422
 
1322
1423
  def __instantiateConcreteReflective(
1323
1424
  self,
@@ -1359,13 +1460,13 @@ class Container(IContainer):
1359
1460
 
1360
1461
  # Try simple call first for functions without parameters
1361
1462
  try:
1362
-
1363
1463
  # Use ReflectionCallable to get dependencies
1364
1464
  dependencies = ReflectionCallable(fn).getDependencies()
1365
1465
 
1366
1466
  # If there are no required parameters, call directly
1367
1467
  if not dependencies or (not dependencies.resolved and not dependencies.unresolved):
1368
- return fn()
1468
+ result = fn()
1469
+ return self.__handleSyncAsyncResult(result)
1369
1470
 
1370
1471
  # If there are unresolved dependencies, raise an exception
1371
1472
  if dependencies.unresolved:
@@ -1379,13 +1480,19 @@ class Container(IContainer):
1379
1480
  getattr(fn, '__name__', str(fn)),
1380
1481
  dependencies
1381
1482
  )
1382
- return fn(**resolved_params)
1483
+
1484
+ # Invoke the callable with resolved parameters
1485
+ result = fn(**resolved_params)
1486
+
1487
+ # Handle the result, which may be a coroutine
1488
+ return self.__handleSyncAsyncResult(result)
1383
1489
 
1384
1490
  except Exception as inspect_error:
1385
1491
 
1386
1492
  # If inspection fails, try direct call as last resort
1387
1493
  try:
1388
- return fn()
1494
+ result = fn()
1495
+ return self.__handleSyncAsyncResult(result)
1389
1496
 
1390
1497
  # If direct call fails, raise inspection error
1391
1498
  except TypeError:
@@ -1533,6 +1640,7 @@ class Container(IContainer):
1533
1640
  return params
1534
1641
 
1535
1642
  except Exception as e:
1643
+
1536
1644
  # If the exception is already an OrionisContainerException, re-raise it
1537
1645
  if isinstance(e, OrionisContainerException):
1538
1646
  raise e from None
@@ -1621,6 +1729,7 @@ class Container(IContainer):
1621
1729
  ) -> Any:
1622
1730
  """
1623
1731
  Helper method to instantiate a target with reflection-based dependency resolution.
1732
+ Supports both synchronous and asynchronous callables automatically.
1624
1733
 
1625
1734
  Parameters
1626
1735
  ----------
@@ -1632,13 +1741,20 @@ class Container(IContainer):
1632
1741
  Returns
1633
1742
  -------
1634
1743
  Any
1635
- The instantiated object or callable result.
1744
+ The instantiated object or callable result. If the callable is async,
1745
+ the coroutine will be handled automatically.
1636
1746
  """
1637
1747
 
1748
+ # Reflect the target to get its dependencies
1638
1749
  resolved_params = self.__resolveDependencies(
1639
1750
  *self.__reflectTarget(target, is_class=is_class)
1640
1751
  )
1641
- return target(**resolved_params)
1752
+
1753
+ # If the target is a class, instantiate it with resolved parameters
1754
+ result = target(**resolved_params)
1755
+
1756
+ # Handle the result, which may be a coroutine
1757
+ return self.__handleSyncAsyncResult(result)
1642
1758
 
1643
1759
  def resolveWithoutContainer(
1644
1760
  self,
@@ -2118,6 +2234,7 @@ class Container(IContainer):
2118
2234
  ) -> Any:
2119
2235
  """
2120
2236
  Call a method on an instance with automatic dependency injection.
2237
+ Supports both synchronous and asynchronous methods automatically.
2121
2238
 
2122
2239
  Parameters
2123
2240
  ----------
@@ -2133,13 +2250,84 @@ class Container(IContainer):
2133
2250
  Returns
2134
2251
  -------
2135
2252
  Any
2136
- The result of the method call.
2253
+ The result of the method call. If the method is async,
2254
+ the coroutine will be handled automatically.
2255
+ """
2256
+
2257
+ # Validate inputs
2258
+ self.__validateCallInputs(instance, method_name)
2259
+
2260
+ # Get the method
2261
+ method = getattr(instance, method_name)
2262
+
2263
+ # Execute the method with appropriate handling
2264
+ return self.__executeMethod(method, *args, **kwargs)
2265
+
2266
+ async def callAsync(
2267
+ self,
2268
+ instance: Any,
2269
+ method_name: str,
2270
+ *args,
2271
+ **kwargs
2272
+ ) -> Any:
2273
+ """
2274
+ Async version of call for when you're in an async context and need to await the result.
2275
+
2276
+ Parameters
2277
+ ----------
2278
+ instance : Any
2279
+ The instance on which to call the method.
2280
+ method_name : str
2281
+ The name of the method to call.
2282
+ *args : tuple
2283
+ Positional arguments to pass to the method.
2284
+ **kwargs : dict
2285
+ Keyword arguments to pass to the method.
2286
+
2287
+ Returns
2288
+ -------
2289
+ Any
2290
+ The result of the method call, properly awaited if async.
2291
+ """
2292
+
2293
+ # Validate inputs
2294
+ self.__validateCallInputs(instance, method_name)
2295
+
2296
+ # Get the method
2297
+ method = getattr(instance, method_name)
2298
+
2299
+ # Execute the method with async handling
2300
+ result = self.__executeMethod(method, *args, **kwargs)
2301
+
2302
+ # If the result is a coroutine, await it
2303
+ if asyncio.iscoroutine(result):
2304
+ return await result
2305
+
2306
+ # Otherwise, return the result directly
2307
+ return result
2308
+
2309
+ def __validateCallInputs(self, instance: Any, method_name: str) -> None:
2310
+ """
2311
+ Validates the inputs for the call methods.
2312
+
2313
+ Parameters
2314
+ ----------
2315
+ instance : Any
2316
+ The instance to validate.
2317
+ method_name : str
2318
+ The method name to validate.
2319
+
2320
+ Raises
2321
+ ------
2322
+ OrionisContainerException
2323
+ If validation fails.
2137
2324
  """
2138
2325
 
2139
2326
  # Ensure the instance is a valid object (allow __main__ for development)
2140
2327
  if instance is None:
2141
2328
  raise OrionisContainerException("Instance cannot be None")
2142
2329
 
2330
+ # Ensure the instance is a valid object with a class
2143
2331
  if not hasattr(instance, '__class__'):
2144
2332
  raise OrionisContainerException("Instance must be a valid object with a class")
2145
2333
 
@@ -2161,12 +2349,35 @@ class Container(IContainer):
2161
2349
  f"Method '{method_name}' not found or not callable on instance '{type(instance).__name__}'."
2162
2350
  )
2163
2351
 
2352
+ def __executeMethod(
2353
+ self,
2354
+ method: Callable,
2355
+ *args,
2356
+ **kwargs
2357
+ ) -> Any:
2358
+ """
2359
+ Executes a method with automatic dependency injection and sync/async handling.
2360
+
2361
+ Parameters
2362
+ ----------
2363
+ method : Callable
2364
+ The method to execute.
2365
+ *args : tuple
2366
+ Positional arguments to pass to the method.
2367
+ **kwargs : dict
2368
+ Keyword arguments to pass to the method.
2369
+
2370
+ Returns
2371
+ -------
2372
+ Any
2373
+ The result of the method execution.
2374
+ """
2375
+
2164
2376
  # If args or kwargs are provided, use them directly
2165
2377
  if args or kwargs:
2166
- return self.__instantiateCallableWithArgs(method, *args, **kwargs)
2378
+ return self.__invokeCallableUniversal(method, *args, **kwargs)
2167
2379
 
2168
2380
  # For methods without provided arguments, try simple call first
2169
- # This avoids reflection issues for simple methods
2170
2381
  try:
2171
2382
 
2172
2383
  # Get method signature to check if it needs parameters
@@ -2178,19 +2389,22 @@ class Container(IContainer):
2178
2389
 
2179
2390
  # If no required parameters, call directly
2180
2391
  if not params:
2181
- return method()
2392
+ result = method()
2393
+ return self.__handleSyncAsyncResult(result)
2182
2394
 
2183
2395
  # If has required parameters, try dependency injection
2184
- return self.__instantiateWithReflection(method, is_class=False)
2396
+ result = self.__instantiateWithReflection(method, is_class=False)
2397
+ return result
2185
2398
 
2186
2399
  except Exception as reflection_error:
2187
2400
 
2188
2401
  # If reflection fails, try simple call as fallback
2189
2402
  try:
2190
- return method()
2403
+ result = method()
2404
+ return self.__handleSyncAsyncResult(result)
2191
2405
 
2192
- # If simple call also fails, raise the original reflection error
2406
+ # If both reflection and simple call fail, raise an exception
2193
2407
  except TypeError:
2194
2408
  raise OrionisContainerException(
2195
- f"Failed to call method '{method_name}': {reflection_error}"
2196
- ) from reflection_error
2409
+ f"Failed to call method '{method.__name__}': {reflection_error}"
2410
+ ) from reflection_error
@@ -5,7 +5,7 @@
5
5
  NAME = "orionis"
6
6
 
7
7
  # Current version of the framework
8
- VERSION = "0.471.0"
8
+ VERSION = "0.473.0"
9
9
 
10
10
  # Full name of the author or maintainer of the project
11
11
  AUTHOR = "Raul Mauricio Uñate Castro"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: orionis
3
- Version: 0.471.0
3
+ Version: 0.473.0
4
4
  Summary: Orionis Framework – Elegant, Fast, and Powerful.
5
5
  Home-page: https://github.com/orionis-framework/framework
6
6
  Author: Raul Mauricio Uñate Castro
@@ -22,7 +22,7 @@ orionis/console/contracts/kernel.py,sha256=mh4LlhEYHh3FuGZZQ0GBhD6ZLa5YQvaNj2r01
22
22
  orionis/console/contracts/reactor.py,sha256=GGhWSNYBE6E_W3HNEi4kjiDwqohsa-nnwJfoC1nJPM8,1998
23
23
  orionis/console/contracts/schedule.py,sha256=A7yYPjPmRizDHOR9k4qvY3NuRPrWBmNuQs6ENGXWtBs,70
24
24
  orionis/console/core/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
25
- orionis/console/core/reactor.py,sha256=R5mS6hdNivqBQEUQaBePcMi0HXtN_ifWbb-ZlPIlIKU,23572
25
+ orionis/console/core/reactor.py,sha256=A0koFZaizrK9R1jlFbx9zdf9UZ4tBxSRJY04hcGzbsQ,23571
26
26
  orionis/console/dumper/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
27
27
  orionis/console/dumper/dump.py,sha256=CATERiQ6XuIrKQsDaWcVxzTtlAJI9qLJX44fQxEX8ws,22443
28
28
  orionis/console/dumper/contracts/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -47,7 +47,7 @@ orionis/console/output/enums/styles.py,sha256=6a4oQCOBOKMh2ARdeq5GlIskJ3wjiylYmh
47
47
  orionis/console/tasks/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
48
48
  orionis/console/tasks/schedule.py,sha256=ANRuPRRd-znbMD5fcPNgKAv69XOECWod7mugF5_dt0U,26636
49
49
  orionis/container/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
50
- orionis/container/container.py,sha256=MmvFm0Y-x667mIYPunmBnHzQHBsWJObT5_zuWrgqaWU,80528
50
+ orionis/container/container.py,sha256=p7kJ-hwnDattTWCArt0ypol4bW3M334hIZ2FAQhID-w,87570
51
51
  orionis/container/context/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
52
52
  orionis/container/context/manager.py,sha256=I08K_jKXSKmrq18Pv33qYyMKIlAovVOwIgmfiVm-J7c,2971
53
53
  orionis/container/context/scope.py,sha256=p_oCzR7dDz-5ZAd16ab4vfLc3gBf34CaN0f4iR9D0bQ,1155
@@ -190,7 +190,7 @@ orionis/foundation/providers/reactor_provider.py,sha256=P0KQcp4AFKTrD6BStGfCTqhG
190
190
  orionis/foundation/providers/testing_provider.py,sha256=SrJRpdvcblx9WvX7x9Y3zc7OQfiTf7la0HAJrm2ESlE,3725
191
191
  orionis/foundation/providers/workers_provider.py,sha256=oa_2NIDH6UxZrtuGkkoo_zEoNIMGgJ46vg5CCgAm7wI,3926
192
192
  orionis/metadata/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
193
- orionis/metadata/framework.py,sha256=Z11lk3yQI0ENTmiVxaQtKovPA5ViRPC2HZaMwQduE3w,4109
193
+ orionis/metadata/framework.py,sha256=khas6LVa0a512rnxIkerr5kQToXUs9YMIA2u1NLPsYc,4109
194
194
  orionis/metadata/package.py,sha256=k7Yriyp5aUcR-iR8SK2ec_lf0_Cyc-C7JczgXa-I67w,16039
195
195
  orionis/services/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
196
196
  orionis/services/asynchrony/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -356,13 +356,15 @@ orionis/test/validators/web_report.py,sha256=n9BfzOZz6aEiNTypXcwuWbFRG0OdHNSmCNu
356
356
  orionis/test/validators/workers.py,sha256=rWcdRexINNEmGaO7mnc1MKUxkHKxrTsVuHgbnIfJYgc,1206
357
357
  orionis/test/view/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
358
358
  orionis/test/view/render.py,sha256=f-zNhtKSg9R5Njqujbg2l2amAs2-mRVESneLIkWOZjU,4082
359
- orionis-0.471.0.dist-info/licenses/LICENCE,sha256=JhC-z_9mbpUrCfPjcl3DhDA8trNDMzb57cvRSam1avc,1463
359
+ orionis-0.473.0.dist-info/licenses/LICENCE,sha256=JhC-z_9mbpUrCfPjcl3DhDA8trNDMzb57cvRSam1avc,1463
360
360
  tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
361
361
  tests/container/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
362
362
  tests/container/context/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
363
363
  tests/container/context/test_manager.py,sha256=wOwXpl9rHNfTTexa9GBKYMwK0_-KSQPbI-AEyGNkmAE,1356
364
364
  tests/container/context/test_scope.py,sha256=1YGfOHwOjLiQ1GPewbJGrUaTyH0SjrQux7LBVn_l2q4,1223
365
365
  tests/container/core/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
366
+ tests/container/core/test_advanced_async.py,sha256=kqNGCPwBlQBB3JBWHgyC7TVPfTEIf34Bz6C2ZBwLz68,10192
367
+ tests/container/core/test_async_optimizations.py,sha256=jal7neUv_N8GoSOi0EvtDlWDcLw46Yc0uf2MTCHW3SY,12348
366
368
  tests/container/core/test_container.py,sha256=6F4y5t-dR2E6eVKRI_hvKty0LhvTkXqiLGjaGVwsSb4,15775
367
369
  tests/container/core/test_singleton.py,sha256=CfOB-YkIh16Pu5rNbOp5dD9cvMfWXHQESADDYSBcsQg,4801
368
370
  tests/container/core/test_thread_safety.py,sha256=-GiscMxZJXr8vRiir_i7_6YtYqG9zDGo52druYk6qKo,3785
@@ -373,6 +375,8 @@ tests/container/enums/test_lifetimes.py,sha256=JFb4q1rgo10C5ibQ6LS-776NevxCMNLSq
373
375
  tests/container/facades/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
374
376
  tests/container/facades/test_facade.py,sha256=aCy0S6YaaiswGoodJEAhNkqJrMaEQL-CcWh2AgXMvvQ,2938
375
377
  tests/container/mocks/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
378
+ tests/container/mocks/mock_advanced_async.py,sha256=Kcbo0bdvv4alVgu66DuSkxHgAWXM_LZFvqBrNFsZGp8,11423
379
+ tests/container/mocks/mock_async_optimizations.py,sha256=nLHglkDJNF3XJbIGkLo3KZWBR4yjKd55cVrQC1BrtRU,12432
376
380
  tests/container/mocks/mock_auto_resolution.py,sha256=PprLC_UbZb0hV69CTzZ3t-5FLLvE-WCTA-6W7wcOIZQ,7340
377
381
  tests/container/mocks/mock_complex_classes.py,sha256=YkC8tgDHU0YVEkIeUPd39gp3zkGLpFObQKzjuxatqro,20307
378
382
  tests/container/mocks/mock_simple_classes.py,sha256=bzKbmwOD-RBTT8GVN_W53ufGEWpjppe4g5mX6CI5Yk0,2317
@@ -499,8 +503,8 @@ tests/testing/validators/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZ
499
503
  tests/testing/validators/test_testing_validators.py,sha256=WPo5GxTP6xE-Dw3X1vZoqOMpb6HhokjNSbgDsDRDvy4,16588
500
504
  tests/testing/view/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
501
505
  tests/testing/view/test_render.py,sha256=tnnMBwS0iKUIbogLvu-7Rii50G6Koddp3XT4wgdFEYM,1050
502
- orionis-0.471.0.dist-info/METADATA,sha256=dGJTEj76Vp1GTGBs5XuKcu_A_bjONiaX2NIgwqXrDY4,4801
503
- orionis-0.471.0.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
504
- orionis-0.471.0.dist-info/top_level.txt,sha256=2bdoHgyGZhOtLAXS6Om8OCTmL24dUMC_L1quMe_ETbk,14
505
- orionis-0.471.0.dist-info/zip-safe,sha256=frcCV1k9oG9oKj3dpUqdJg1PxRT2RSN_XKdLCPjaYaY,2
506
- orionis-0.471.0.dist-info/RECORD,,
506
+ orionis-0.473.0.dist-info/METADATA,sha256=9Tq4vH590vaqS1n0K22s4CyuqlKdrf7c4m2nxJyn7cM,4801
507
+ orionis-0.473.0.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
508
+ orionis-0.473.0.dist-info/top_level.txt,sha256=2bdoHgyGZhOtLAXS6Om8OCTmL24dUMC_L1quMe_ETbk,14
509
+ orionis-0.473.0.dist-info/zip-safe,sha256=frcCV1k9oG9oKj3dpUqdJg1PxRT2RSN_XKdLCPjaYaY,2
510
+ orionis-0.473.0.dist-info/RECORD,,