orionis 0.399.0__py3-none-any.whl → 0.400.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.
@@ -1,3 +1,4 @@
1
+ import time
1
2
  from pathlib import Path
2
3
  from typing import Any, List, Type
3
4
  from orionis.container.container import Container
@@ -16,6 +17,7 @@ from orionis.foundation.config.startup import Configuration
16
17
  from orionis.foundation.config.testing.entities.testing import Testing
17
18
  from orionis.foundation.contracts.application import IApplication
18
19
  from orionis.foundation.contracts.config import IConfig
20
+ from orionis.foundation.exceptions import OrionisTypeError, OrionisRuntimeError
19
21
 
20
22
  class Application(Container, IApplication):
21
23
  """
@@ -59,24 +61,47 @@ class Application(Container, IApplication):
59
61
 
60
62
  # Singleton pattern - prevent multiple initializations
61
63
  if not hasattr(self, '_Application__initialized'):
62
- self.__providers: List[IServiceProvider] = []
64
+ self.__providers: List[IServiceProvider, Any] = []
63
65
  self.__configurators : dict = {}
64
66
  self.__config: dict = {}
65
67
  self.__booted: bool = False
68
+ self.__startAt = time.time_ns()
69
+
70
+ # Flag to prevent re-initialization
66
71
  self.__initialized = True
67
72
 
73
+ # << Frameworks Kernel >>
74
+
75
+ def __loadFrameworksKernel(
76
+ self
77
+ ) -> None:
78
+ """
79
+ Load and register core framework kernels.
80
+
81
+ Instantiates and registers kernel components:
82
+ - TestKernel: Testing framework kernel
83
+ """
84
+ # Import core framework kernels
85
+ from orionis.test.kernel import TestKernel, ITestKernel
86
+
87
+ # Core framework kernels
88
+ core_kernels = {
89
+ ITestKernel: TestKernel
90
+ }
91
+
92
+ # Register each kernel instance
93
+ for kernel_name, kernel_cls in core_kernels.items():
94
+ self.instance(kernel_name, kernel_cls(self))
95
+
96
+ # << Service Providers >>
97
+
68
98
  def __loadFrameworkProviders(
69
99
  self
70
100
  ) -> None:
71
101
  """
72
102
  Load core framework service providers.
73
103
 
74
- Registers essential providers required for framework operation:
75
- - ConsoleProvider: Console output management
76
- - DumperProvider: Data dumping utilities
77
- - PathResolverProvider: Path resolution services
78
- - ProgressBarProvider: Progress bar functionality
79
- - WorkersProvider: Worker management
104
+ Registers essential providers required for framework operation
80
105
  """
81
106
  # Import core framework providers
82
107
  from orionis.foundation.providers.console_provider import ConsoleProvider
@@ -98,27 +123,6 @@ class Application(Container, IApplication):
98
123
  for provider_cls in core_providers:
99
124
  self.addProvider(provider_cls)
100
125
 
101
- def __loadFrameworksKernel(
102
- self
103
- ) -> None:
104
- """
105
- Load and register core framework kernels.
106
-
107
- Instantiates and registers kernel components:
108
- - TestKernel: Testing framework kernel
109
- """
110
- # Import core framework kernels
111
- from orionis.test.kernel import TestKernel, ITestKernel
112
-
113
- # Core framework kernels
114
- core_kernels = {
115
- ITestKernel: TestKernel
116
- }
117
-
118
- # Register each kernel instance
119
- for kernel_name, kernel_cls in core_kernels.items():
120
- self.instance(kernel_name, kernel_cls(self))
121
-
122
126
  def __registerProviders(
123
127
  self
124
128
  ) -> None:
@@ -128,8 +132,24 @@ class Application(Container, IApplication):
128
132
  Calls the register method on each provider to bind services
129
133
  into the container.
130
134
  """
135
+
136
+ # Ensure providers list is empty before registration
137
+ initialized_providers = []
138
+
139
+ # Iterate over each provider and register it
131
140
  for provider in self.__providers:
132
- provider.register()
141
+
142
+ # Initialize the provider
143
+ class_provider: IServiceProvider = provider(self)
144
+
145
+ # Register the provider in the container
146
+ class_provider.register()
147
+
148
+ # Add the initialized provider to the list
149
+ initialized_providers.append(class_provider)
150
+
151
+ # Update the providers list with initialized providers
152
+ self.__providers = initialized_providers
133
153
 
134
154
  def __bootProviders(
135
155
  self
@@ -140,8 +160,12 @@ class Application(Container, IApplication):
140
160
  Calls the boot method on each provider to initialize services
141
161
  after all providers have been registered.
142
162
  """
163
+ # Iterate over each provider and boot it
143
164
  for provider in self.__providers:
144
- provider.boot()
165
+
166
+ # Ensure provider is initialized before calling boot
167
+ if hasattr(provider, 'boot') and callable(getattr(provider, 'boot')):
168
+ provider.boot()
145
169
 
146
170
  def withProviders(
147
171
  self,
@@ -187,20 +211,58 @@ class Application(Container, IApplication):
187
211
 
188
212
  Raises
189
213
  ------
190
- TypeError
214
+ OrionisTypeError
191
215
  If provider is not a subclass of IServiceProvider
192
216
  """
193
217
 
194
218
  # Validate provider type
195
219
  if not isinstance(provider, type) or not issubclass(provider, IServiceProvider):
196
- raise TypeError(f"Expected IServiceProvider class, got {type(provider).__name__}")
220
+ raise OrionisTypeError(f"Expected IServiceProvider class, got {type(provider).__name__}")
221
+
222
+ # Add the provider to the list
223
+ if provider not in self.__providers:
224
+ self.__providers.append(provider)
197
225
 
198
- # Instantiate and add provider
199
- self.__providers.append(provider(self))
226
+ # If already added, raise an error
227
+ else:
228
+ raise OrionisTypeError(f"Provider {provider.__name__} is already registered.")
200
229
 
201
230
  # Return self instance.
202
231
  return self
203
232
 
233
+ # << Configuration >>
234
+
235
+ def __loadConfig(
236
+ self,
237
+ ) -> None:
238
+ """
239
+ Retrieve a configuration value by key.
240
+
241
+ Returns
242
+ -------
243
+ None
244
+ Initializes the application configuration if not already set.
245
+ """
246
+
247
+ # Try to load the configuration
248
+ try:
249
+
250
+ # Check if configuration is a dictionary
251
+ if not self.__config:
252
+
253
+ # Initialize with default configuration
254
+ if not self.__configurators:
255
+ self.__config = Configuration().toDict()
256
+
257
+ # If configurators are provided, use them to create the configuration
258
+ else:
259
+ self.__config = Configuration(**self.__configurators).toDict()
260
+
261
+ except Exception as e:
262
+
263
+ # Handle any exceptions during configuration loading
264
+ raise OrionisRuntimeError(f"Failed to load application configuration: {str(e)}")
265
+
204
266
  def withConfigurators(
205
267
  self,
206
268
  *,
@@ -354,7 +416,7 @@ class Application(Container, IApplication):
354
416
 
355
417
  # Validate config type
356
418
  if not isinstance(app, App):
357
- raise TypeError(f"Expected App instance, got {type(app).__name__}")
419
+ raise OrionisTypeError(f"Expected App instance, got {type(app).__name__}")
358
420
 
359
421
  # Store the configuration
360
422
  self.__configurators['app'] = app
@@ -407,7 +469,7 @@ class Application(Container, IApplication):
407
469
 
408
470
  # Validate auth type
409
471
  if not isinstance(auth, Auth):
410
- raise TypeError(f"Expected Auth instance, got {type(auth).__name__}")
472
+ raise OrionisTypeError(f"Expected Auth instance, got {type(auth).__name__}")
411
473
 
412
474
  # Store the configuration
413
475
  self.__configurators['auth'] = auth
@@ -460,7 +522,7 @@ class Application(Container, IApplication):
460
522
 
461
523
  # Validate cache type
462
524
  if not isinstance(cache, Cache):
463
- raise TypeError(f"Expected Cache instance, got {type(cache).__name__}")
525
+ raise OrionisTypeError(f"Expected Cache instance, got {type(cache).__name__}")
464
526
 
465
527
  # Store the configuration
466
528
  self.__configurators['cache'] = cache
@@ -513,7 +575,7 @@ class Application(Container, IApplication):
513
575
 
514
576
  # Validate cors type
515
577
  if not isinstance(cors, Cors):
516
- raise TypeError(f"Expected Cors instance, got {type(cors).__name__}")
578
+ raise OrionisTypeError(f"Expected Cors instance, got {type(cors).__name__}")
517
579
 
518
580
  # Store the configuration
519
581
  self.__configurators['cors'] = cors
@@ -569,7 +631,7 @@ class Application(Container, IApplication):
569
631
 
570
632
  # Validate database type
571
633
  if not isinstance(database, Database):
572
- raise TypeError(f"Expected Database instance, got {type(database).__name__}")
634
+ raise OrionisTypeError(f"Expected Database instance, got {type(database).__name__}")
573
635
 
574
636
  # Store the configuration
575
637
  self.__configurators['database'] = database
@@ -625,7 +687,7 @@ class Application(Container, IApplication):
625
687
 
626
688
  # Validate filesystems type
627
689
  if not isinstance(filesystems, Filesystems):
628
- raise TypeError(f"Expected Filesystems instance, got {type(filesystems).__name__}")
690
+ raise OrionisTypeError(f"Expected Filesystems instance, got {type(filesystems).__name__}")
629
691
 
630
692
  # Store the configuration
631
693
  self.__configurators['filesystems'] = filesystems
@@ -681,7 +743,7 @@ class Application(Container, IApplication):
681
743
 
682
744
  # Validate logging type
683
745
  if not isinstance(logging, Logging):
684
- raise TypeError(f"Expected Logging instance, got {type(logging).__name__}")
746
+ raise OrionisTypeError(f"Expected Logging instance, got {type(logging).__name__}")
685
747
 
686
748
  # Store the configuration
687
749
  self.__configurators['logging'] = logging
@@ -737,7 +799,7 @@ class Application(Container, IApplication):
737
799
 
738
800
  # Validate mail type
739
801
  if not isinstance(mail, Mail):
740
- raise TypeError(f"Expected Mail instance, got {type(mail).__name__}")
802
+ raise OrionisTypeError(f"Expected Mail instance, got {type(mail).__name__}")
741
803
 
742
804
  # Store the configuration
743
805
  self.__configurators['mail'] = mail
@@ -793,7 +855,7 @@ class Application(Container, IApplication):
793
855
 
794
856
  # Validate queue type
795
857
  if not isinstance(queue, Queue):
796
- raise TypeError(f"Expected Queue instance, got {type(queue).__name__}")
858
+ raise OrionisTypeError(f"Expected Queue instance, got {type(queue).__name__}")
797
859
 
798
860
  # Store the configuration
799
861
  self.__configurators['queue'] = queue
@@ -849,7 +911,7 @@ class Application(Container, IApplication):
849
911
 
850
912
  # Validate session type
851
913
  if not isinstance(session, Session):
852
- raise TypeError(f"Expected Session instance, got {type(session).__name__}")
914
+ raise OrionisTypeError(f"Expected Session instance, got {type(session).__name__}")
853
915
 
854
916
  # Store the configuration
855
917
  self.__configurators['session'] = session
@@ -905,7 +967,7 @@ class Application(Container, IApplication):
905
967
 
906
968
  # Validate testing type
907
969
  if not isinstance(testing, Testing):
908
- raise TypeError(f"Expected Testing instance, got {type(testing).__name__}")
970
+ raise OrionisTypeError(f"Expected Testing instance, got {type(testing).__name__}")
909
971
 
910
972
  # Store the configuration
911
973
  self.__configurators['testing'] = testing
@@ -913,36 +975,7 @@ class Application(Container, IApplication):
913
975
  # Return the application instance for method chaining
914
976
  return self
915
977
 
916
- def __loadConfig(
917
- self,
918
- ) -> None:
919
- """
920
- Retrieve a configuration value by key.
921
-
922
- Returns
923
- -------
924
- None
925
- Initializes the application configuration if not already set.
926
- """
927
-
928
- # Try to load the configuration
929
- try:
930
-
931
- # Check if configuration is a dictionary
932
- if not self.__config:
933
-
934
- # Initialize with default configuration
935
- if not self.__configurators:
936
- self.__config = Configuration().toDict()
937
-
938
- # If configurators are provided, use them to create the configuration
939
- else:
940
- self.__config = Configuration(**self.__configurators).toDict()
941
-
942
- except Exception as e:
943
-
944
- # Handle any exceptions during configuration loading
945
- raise RuntimeError(f"Failed to load application configuration: {str(e)}")
978
+ # << Application Lifecycle >>
946
979
 
947
980
  def create(
948
981
  self
@@ -958,22 +991,24 @@ class Application(Container, IApplication):
958
991
  # Check if already booted
959
992
  if not self.__booted:
960
993
 
961
- # Load core framework components
962
- self.__loadFrameworkProviders()
963
- self.__loadFrameworksKernel()
994
+ # Load configuration if not already set
995
+ self.__loadConfig()
964
996
 
965
- # Register and boot all providers
997
+ # Load framework providers and register them
998
+ self.__loadFrameworkProviders()
966
999
  self.__registerProviders()
967
1000
  self.__bootProviders()
968
1001
 
969
- # Load configuration if not already set
970
- self.__loadConfig()
1002
+ # Load core framework kernels
1003
+ self.__loadFrameworksKernel()
971
1004
 
972
1005
  # Mark as booted
973
1006
  self.__booted = True
974
1007
 
975
1008
  return self
976
1009
 
1010
+ # << Configuration Access >>
1011
+
977
1012
  def config(
978
1013
  self,
979
1014
  key: str,
@@ -1023,6 +1058,8 @@ class Application(Container, IApplication):
1023
1058
  # Return the final configuration value
1024
1059
  return config_value
1025
1060
 
1061
+ # << Path Configuration Access >>
1062
+
1026
1063
  def path(
1027
1064
  self,
1028
1065
  key: str,
@@ -1,7 +1,11 @@
1
1
  from .integrity import OrionisIntegrityException
2
2
  from .value import OrionisValueError
3
+ from .type import OrionisTypeError
4
+ from .runtime import OrionisRuntimeError
3
5
 
4
6
  __all__ = [
5
7
  "OrionisIntegrityException",
6
- "OrionisValueError"
8
+ "OrionisValueError",
9
+ "OrionisTypeError",
10
+ "OrionisRuntimeError"
7
11
  ]
@@ -0,0 +1,19 @@
1
+ class OrionisRuntimeError(RuntimeError):
2
+
3
+ def __init__(self, msg: str):
4
+ """
5
+ Parameters
6
+ ----------
7
+ msg : str
8
+ Descriptive error message explaining the cause of the exception.
9
+ """
10
+ super().__init__(msg)
11
+
12
+ def __str__(self) -> str:
13
+ """
14
+ Returns
15
+ -------
16
+ str
17
+ Formatted string describing the exception.
18
+ """
19
+ return str(self.args[0])
@@ -0,0 +1,19 @@
1
+ class OrionisTypeError(TypeError):
2
+
3
+ def __init__(self, msg: str):
4
+ """
5
+ Parameters
6
+ ----------
7
+ msg : str
8
+ Descriptive error message explaining the cause of the exception.
9
+ """
10
+ super().__init__(msg)
11
+
12
+ def __str__(self) -> str:
13
+ """
14
+ Returns
15
+ -------
16
+ str
17
+ Formatted string describing the exception.
18
+ """
19
+ return str(self.args[0])
@@ -5,7 +5,7 @@
5
5
  NAME = "orionis"
6
6
 
7
7
  # Current version of the framework
8
- VERSION = "0.399.0"
8
+ VERSION = "0.400.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.399.0
3
+ Version: 0.400.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
@@ -146,7 +146,7 @@ orionis/container/validators/is_subclass.py,sha256=4sBaGLoRs8nUhuWjlP0VJqyTwVHYq
146
146
  orionis/container/validators/is_valid_alias.py,sha256=4uAYcq8xov7jZbXnpKpjNkxcZtlTNnL5RRctVPMwJes,1424
147
147
  orionis/container/validators/lifetime.py,sha256=IQ43fDNrxYHMlZH2zlYDJnlkLO_eS4U7Fs3UJgQBidI,1844
148
148
  orionis/foundation/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
149
- orionis/foundation/application.py,sha256=Nxv_0nfBec8mOlEFVED0UY7PFgWw_e5uBoM4e-0T2w8,33794
149
+ orionis/foundation/application.py,sha256=iR8wCicowPy4Rfn-teOlLgN3ILWCPC9TuiCPX7dvyCM,34992
150
150
  orionis/foundation/config/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
151
151
  orionis/foundation/config/startup.py,sha256=zutF-34DkW68bpiTxH9xrmIe1iJdXCF9Y6wueXS6qys,8265
152
152
  orionis/foundation/config/app/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -237,8 +237,10 @@ orionis/foundation/config/testing/enums/test_mode.py,sha256=IbFpauu7J-iSAfmC8jDb
237
237
  orionis/foundation/contracts/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
238
238
  orionis/foundation/contracts/application.py,sha256=iFUGJBnA3Aqab9x4axqRiuzyORpwj37JL--Npjn1e1w,16739
239
239
  orionis/foundation/contracts/config.py,sha256=Rpz6U6t8OXHO9JJKSTnCimytXE-tfCB-1ithP2nG8MQ,628
240
- orionis/foundation/exceptions/__init__.py,sha256=XtG3MJ_MFNY_dU5mmTyz_N_4QG1jYrcv5RegBso7wuY,163
240
+ orionis/foundation/exceptions/__init__.py,sha256=q6we1N8kcd6j6GjUJY30WQhhHnqF9RXA0c6-ksEztlc,294
241
241
  orionis/foundation/exceptions/integrity.py,sha256=mc4pL1UMoYRHEmphnpW2oGk5URhu7DJRREyzHaV-cs8,472
242
+ orionis/foundation/exceptions/runtime.py,sha256=QS9Wjy79UFoM_lA-JR907p4l4Z8ae5E810HAHAnmIq8,469
243
+ orionis/foundation/exceptions/type.py,sha256=Ug51YdaUKUlbngR0KeWnJNqIwS9StP4ScVobFY1eI18,463
242
244
  orionis/foundation/exceptions/value.py,sha256=hQhXybXEnaa59ba7JxG65jceHt3mnql9MyekF-TChpM,465
243
245
  orionis/foundation/providers/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
244
246
  orionis/foundation/providers/console_provider.py,sha256=pAIklY1QKx2HKjTp7YyJT6KbJPlEEyzWSr79RTFkEK0,700
@@ -247,7 +249,7 @@ orionis/foundation/providers/path_resolver_provider.py,sha256=rXvaVc5sSqmDgRzWJo
247
249
  orionis/foundation/providers/progress_bar_provider.py,sha256=75Jr4iEgUOUGl8Di1DioeP5_HRQlR-1lVzPmS96sWjA,737
248
250
  orionis/foundation/providers/workers_provider.py,sha256=WWlji3C69_-Y0c42aZDbR_bmcE_qZEh2SaA_cNkCivI,702
249
251
  orionis/metadata/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
250
- orionis/metadata/framework.py,sha256=K8scP1C_3ceCS2Knn8YTyYMxbmUHtFWI98zWSnaLpns,4960
252
+ orionis/metadata/framework.py,sha256=cjv4CHVM62AzFx5-htVVpWEHinon7yMVjzb5Y-1YemA,4960
251
253
  orionis/metadata/package.py,sha256=tqLfBRo-w1j_GN4xvzUNFyweWYFS-qhSgAEc-AmCH1M,5452
252
254
  orionis/services/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
253
255
  orionis/services/asynchrony/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -384,7 +386,7 @@ orionis/test/records/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hS
384
386
  orionis/test/records/logs.py,sha256=EOQcloMVdhlNl2lU9igQz8H4b-OtKtiwh2pgr_QZWOI,13186
385
387
  orionis/test/view/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
386
388
  orionis/test/view/render.py,sha256=zd7xDvVfmQ2HxZamDTzL2-z2PpyL99EaolbbM7wTah4,5014
387
- orionis-0.399.0.dist-info/licenses/LICENCE,sha256=-_4cF2EBKuYVS_SQpy1uapq0oJPUU1vl_RUWSy2jJTo,1111
389
+ orionis-0.400.0.dist-info/licenses/LICENCE,sha256=-_4cF2EBKuYVS_SQpy1uapq0oJPUU1vl_RUWSy2jJTo,1111
388
390
  tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
389
391
  tests/example/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
390
392
  tests/example/test_example.py,sha256=yctjQT5ocYEu__kNvJxmQJ-l5yxRMkohwcfYWSjWDVo,25566
@@ -485,8 +487,8 @@ tests/support/wrapper/test_services_wrapper_docdict.py,sha256=nTNrvJkMSPx_aopEQ9
485
487
  tests/testing/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
486
488
  tests/testing/test_testing_result.py,sha256=fnH7hjumNSErAFGITJgq2LHxSzvPF2tdtmHL9kyAv-Y,4409
487
489
  tests/testing/test_testing_unit.py,sha256=d3CRGo6608fMzYcZKIKapjx_af2aigqWiKSiuK9euIY,7600
488
- orionis-0.399.0.dist-info/METADATA,sha256=W1dRShLunXjACwe2Xjv3LK4FEiBPaa8b9gMMN1oEQL4,4772
489
- orionis-0.399.0.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
490
- orionis-0.399.0.dist-info/top_level.txt,sha256=2bdoHgyGZhOtLAXS6Om8OCTmL24dUMC_L1quMe_ETbk,14
491
- orionis-0.399.0.dist-info/zip-safe,sha256=frcCV1k9oG9oKj3dpUqdJg1PxRT2RSN_XKdLCPjaYaY,2
492
- orionis-0.399.0.dist-info/RECORD,,
490
+ orionis-0.400.0.dist-info/METADATA,sha256=UEh4Wj-neUiv_E3PcTpu72nc1EoshadIzPwiSAPh_QU,4772
491
+ orionis-0.400.0.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
492
+ orionis-0.400.0.dist-info/top_level.txt,sha256=2bdoHgyGZhOtLAXS6Om8OCTmL24dUMC_L1quMe_ETbk,14
493
+ orionis-0.400.0.dist-info/zip-safe,sha256=frcCV1k9oG9oKj3dpUqdJg1PxRT2RSN_XKdLCPjaYaY,2
494
+ orionis-0.400.0.dist-info/RECORD,,