orionis 0.206.0__py3-none-any.whl → 0.208.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,309 +1,230 @@
1
- from typing import Any, Type, Dict, List, Tuple, Callable, Optional, Set, TypeVar
2
- import inspect
3
1
  import abc
2
+ import inspect
3
+ from typing import Any, Dict, List, Tuple, Type, TypeVar, Union
4
+ from orionis.luminate.support.inspection.reflexion_abstract import ReflexionAbstract
5
+ from orionis.luminate.support.inspection.reflexion_instance import ReflexionInstance
4
6
 
5
7
  T = TypeVar('T')
6
8
  ABC = TypeVar('ABC', bound=abc.ABC)
7
9
 
8
10
  class ReflexionInstanceWithAbstract:
9
- """A reflection object encapsulating a class instance and its abstract parent.
11
+ """Advanced reflection tool for analyzing concrete implementations against abstract bases.
10
12
 
11
- This class provides methods to inspect both the concrete instance and its
12
- abstract parent class, including their relationships and implementations.
13
+ Combines inspection of both concrete instances and their abstract parent classes,
14
+ providing detailed comparison and compatibility analysis.
13
15
 
14
16
  Parameters
15
17
  ----------
16
18
  instance : Any
17
- The instance being reflected upon
19
+ The concrete instance to inspect
18
20
  abstract : Type[ABC]
19
- The abstract parent class
21
+ The abstract base class/interface being implemented
20
22
 
21
23
  Attributes
22
24
  ----------
23
25
  _instance : Any
24
- The encapsulated instance
26
+ The concrete instance being analyzed
25
27
  _abstract : Type[ABC]
26
- The encapsulated abstract parent class
28
+ The abstract base class/interface
29
+ _concrete_reflexion : ReflexionInstance
30
+ Reflection helper for the concrete instance
31
+ _abstract_reflexion : ReflexionAbstract
32
+ Reflection helper for the abstract class
27
33
  """
28
34
 
29
35
  def __init__(self, instance: Any, abstract: Type[ABC]) -> None:
30
- """Initialize with the instance and abstract parent."""
31
36
  self._instance = instance
32
37
  self._abstract = abstract
38
+ self._concrete_reflexion = ReflexionInstance(instance)
39
+ self._abstract_reflexion = ReflexionAbstract(abstract)
33
40
 
34
- def getClassName(self) -> str:
35
- """Get the name of the instance's class.
36
-
37
- Returns
38
- -------
39
- str
40
- The name of the concrete class
41
- """
42
- return self._instance.__class__.__name__
43
-
44
- def getAbstractClassName(self) -> str:
45
- """Get the name of the abstract parent class.
46
-
47
- Returns
48
- -------
49
- str
50
- The name of the abstract class
51
- """
52
- return self._abstract.__name__
53
-
54
- def getImplementationStatus(self) -> Dict[str, bool]:
55
- """Check which abstract methods are implemented.
56
-
57
- Returns
58
- -------
59
- Dict[str, bool]
60
- Dictionary mapping abstract method names to implementation status
61
- """
62
- abstract_methods = getattr(self._abstract, '__abstractmethods__', set())
63
- return {
64
- method: method in dir(self._instance)
65
- for method in abstract_methods
66
- }
41
+ @property
42
+ def concrete(self) -> ReflexionInstance:
43
+ """Access the concrete instance reflection helper."""
44
+ return self._concrete_reflexion
67
45
 
68
- def getMissingImplementations(self) -> Set[str]:
69
- """Get abstract methods not implemented by the concrete class.
46
+ @property
47
+ def abstract(self) -> ReflexionAbstract:
48
+ """Access the abstract class reflection helper."""
49
+ return self._abstract_reflexion
70
50
 
71
- Returns
72
- -------
73
- Set[str]
74
- Set of abstract method names not implemented
75
- """
76
- abstract_methods = getattr(self._abstract, '__abstractmethods__', set())
77
- return abstract_methods - set(dir(self._instance))
78
-
79
- def isProperImplementation(self) -> bool:
80
- """Check if the instance properly implements all abstract methods.
51
+ def getImplementationAnalysis(self) -> Dict[str, Dict[str, Union[bool, str, inspect.Signature]]]:
52
+ """Comprehensive analysis of implementation compliance.
81
53
 
82
54
  Returns
83
55
  -------
84
- bool
85
- True if all abstract methods are implemented, False otherwise
56
+ Dict[str, Dict[str, Union[bool, str, inspect.Signature]]]
57
+ Detailed analysis including:
58
+ - 'implemented': Whether method is implemented
59
+ - 'signature_match': Whether signatures match
60
+ - 'abstract_signature': Signature from abstract class
61
+ - 'concrete_signature': Signature from concrete class
86
62
  """
87
- return len(self.getMissingImplementations()) == 0
88
-
89
- def getAbstractMethods(self) -> Set[str]:
90
- """Get all abstract methods from the parent class.
91
-
92
- Returns
93
- -------
94
- Set[str]
95
- Set of abstract method names
96
- """
97
- return getattr(self._abstract, '__abstractmethods__', set())
98
-
99
- def getConcreteMethods(self) -> List[str]:
100
- """Get all concrete methods of the instance.
101
-
102
- Returns
103
- -------
104
- List[str]
105
- List of method names implemented by the instance
106
- """
107
- return [name for name, _ in inspect.getmembers(
108
- self._instance,
109
- predicate=inspect.ismethod
110
- )]
111
-
112
- def getOverriddenMethods(self) -> Dict[str, Tuple[Type, Type]]:
113
- """Get methods that override abstract ones with their signatures.
114
-
115
- Returns
116
- -------
117
- Dict[str, Tuple[Type, Type]]
118
- Dictionary mapping method names to tuples of
119
- (abstract_signature, concrete_signature)
120
- """
121
- overridden = {}
122
- abstract_methods = self.getAbstractMethods()
123
-
63
+ analysis = {}
64
+ abstract_methods = self._abstract_reflexion.getAbstractMethods()
124
65
  for method in abstract_methods:
125
- if hasattr(self._instance, method):
126
- abstract_sig = inspect.signature(getattr(self._abstract, method))
127
- concrete_sig = inspect.signature(getattr(self._instance, method))
128
- overridden[method] = (abstract_sig, concrete_sig)
66
+ entry = {
67
+ 'implemented': False,
68
+ 'abstract_signature': None,
69
+ 'concrete_signature': None,
70
+ 'signature_match': False,
71
+ 'type' : 'method'
72
+ }
129
73
 
130
- return overridden
131
-
132
- def checkSignatureCompatibility(self) -> Dict[str, bool]:
133
- """Check if implemented methods match abstract signatures.
74
+ if hasattr(self._instance, method):
75
+ entry['implemented'] = True
76
+ abstract_sig = self._abstract_reflexion.getMethodSignature(method)
77
+ concrete_sig = self._concrete_reflexion.getMethodSignature(method)
78
+
79
+ entry.update({
80
+ 'abstract_signature': abstract_sig,
81
+ 'concrete_signature': concrete_sig,
82
+ 'signature_match': (
83
+ abstract_sig.parameters == concrete_sig.parameters and
84
+ abstract_sig.return_annotation == concrete_sig.return_annotation
85
+ )
86
+ })
87
+
88
+ analysis[method] = entry
89
+
90
+ abstract_properties = self._abstract_reflexion.getAbstractProperties()
91
+ for prop in abstract_properties:
92
+ entry = {
93
+ 'implemented': False,
94
+ 'abstract_signature': None,
95
+ 'concrete_signature': None,
96
+ 'signature_match': False,
97
+ 'type' : 'property'
98
+ }
99
+
100
+ if hasattr(self._instance, prop):
101
+ entry['implemented'] = True
102
+ abstract_sig = self._abstract_reflexion.getPropertySignature(prop)
103
+ concrete_sig = self._concrete_reflexion.getPropertySignature(prop)
104
+
105
+ entry.update({
106
+ 'abstract_signature': abstract_sig,
107
+ 'concrete_signature': concrete_sig,
108
+ 'signature_match': (
109
+ abstract_sig.parameters == concrete_sig.parameters and
110
+ abstract_sig.return_annotation == concrete_sig.return_annotation
111
+ )
112
+ })
113
+
114
+ analysis[prop] = entry
115
+
116
+ return analysis
117
+
118
+ def getNonInheritedImplementation(self) -> Dict[str, Any]:
119
+ """Get implementation details for methods, properties, and attributes not inherited from other parents.
134
120
 
135
121
  Returns
136
122
  -------
137
- Dict[str, bool]
138
- Dictionary mapping method names to compatibility status
139
- """
140
- compatibility = {}
141
- overridden = self.getOverriddenMethods()
142
-
143
- for method, (abstract_sig, concrete_sig) in overridden.items():
144
- compatibility[method] = (
145
- abstract_sig.parameters == concrete_sig.parameters and
146
- abstract_sig.return_annotation == concrete_sig.return_annotation
147
- )
148
-
149
- return compatibility
150
-
151
- def getAbstractProperties(self) -> Set[str]:
152
- """Get all abstract properties from the parent class.
123
+ Dict[str, Any]
124
+ Dictionary containing:
125
+ - 'methods': List of non-inherited method names
126
+ - 'properties': List of non-inherited property names
127
+ - 'attributes': Dict of non-inherited attributes
128
+ """
129
+ # Get all members from concrete class (non-inherited methods, properties, and attributes)
130
+ concrete_members = set(dir(self._instance.__class__))
131
+
132
+ # Get members from the abstract class (base class)
133
+ base_members = set(dir(self._abstract))
134
+
135
+ # Filter out inherited members (methods, properties, and attributes)
136
+ non_inherited_methods = [
137
+ name for name in concrete_members
138
+ if callable(getattr(self._instance.__class__, name)) and name not in base_members
139
+ ]
140
+
141
+ non_inherited_properties = [
142
+ name for name in concrete_members
143
+ if isinstance(getattr(self._instance.__class__, name, None), property) and name not in base_members
144
+ ]
145
+
146
+ non_inherited_attributes = {
147
+ name: getattr(self._instance.__class__, name)
148
+ for name in concrete_members
149
+ if not callable(getattr(self._instance.__class__, name)) and not isinstance(getattr(self._instance.__class__, name, None), property) and name not in base_members
150
+ }
153
151
 
154
- Returns
155
- -------
156
- Set[str]
157
- Set of abstract property names
158
- """
159
152
  return {
160
- name for name, member in inspect.getmembers(
161
- self._abstract,
162
- lambda x: isinstance(x, property) and
163
- name in getattr(self._abstract, '__abstractmethods__', set())
164
- )
153
+ 'methods': non_inherited_methods,
154
+ 'properties': non_inherited_properties,
155
+ 'attributes': non_inherited_attributes
165
156
  }
166
157
 
167
- def getInstanceAttributes(self) -> Dict[str, Any]:
168
- """Get all attributes of the concrete instance.
158
+ def validateImplementation(self) -> Tuple[bool, Dict[str, List[str]]]:
159
+ """Validate the implementation against the abstract base.
169
160
 
170
161
  Returns
171
162
  -------
172
- Dict[str, Any]
173
- Dictionary of attribute names and their values
163
+ Tuple[bool, Dict[str, List[str]]]
164
+ - First element: True if fully valid implementation
165
+ - Second element: Dictionary of issues by category:
166
+ * 'missing': Missing required methods
167
+ * 'signature_mismatch': Methods with signature mismatches
168
+ * 'type_mismatch': Methods with return type mismatches
174
169
  """
175
- return vars(self._instance)
176
-
177
- def getAbstractClassDocstring(self) -> Optional[str]:
178
- """Get the docstring of the abstract parent class.
179
-
180
- Returns
181
- -------
182
- Optional[str]
183
- The abstract class docstring, or None if not available
184
- """
185
- return self._abstract.__doc__
186
-
187
- def getConcreteClassDocstring(self) -> Optional[str]:
188
- """Get the docstring of the concrete instance's class.
189
-
190
- Returns
191
- -------
192
- Optional[str]
193
- The concrete class docstring, or None if not available
194
- """
195
- return self._instance.__class__.__doc__
196
-
197
- def getAbstractClassModule(self) -> str:
198
- """Get the module name where the abstract class is defined.
199
-
200
- Returns
201
- -------
202
- str
203
- The module name of the abstract class
204
- """
205
- return self._abstract.__module__
206
-
207
- def getConcreteClassModule(self) -> str:
208
- """Get the module name where the concrete class is defined.
209
-
210
- Returns
211
- -------
212
- str
213
- The module name of the concrete class
214
- """
215
- return self._instance.__class__.__module__
216
-
217
- def isDirectSubclass(self) -> bool:
218
- """Check if the concrete class directly inherits from the abstract class.
219
-
220
- Returns
221
- -------
222
- bool
223
- True if direct subclass, False otherwise
224
- """
225
- return self._abstract in self._instance.__class__.__bases__
170
+ issues = {
171
+ 'missing': [],
172
+ 'signature_mismatch': [],
173
+ 'type_mismatch': []
174
+ }
226
175
 
227
- def getAbstractClassHierarchy(self) -> List[Type]:
228
- """Get the inheritance hierarchy of the abstract class.
176
+ analysis = self.getImplementationAnalysis()
177
+ for method, data in analysis.items():
178
+ if not data['implemented']:
179
+ issues['missing'].append(method)
180
+ elif not data['signature_match']:
181
+ issues['signature_mismatch'].append(method)
182
+ # Check specifically for return type mismatch
183
+ abstract_return = data['abstract_signature'].return_annotation
184
+ concrete_return = data['concrete_signature'].return_annotation
185
+ if abstract_return != concrete_return and abstract_return is not inspect.Parameter.empty:
186
+ issues['type_mismatch'].append(method)
229
187
 
230
- Returns
231
- -------
232
- List[Type]
233
- List of classes in the inheritance hierarchy
234
- """
235
- return inspect.getmro(self._abstract)
188
+ is_valid = not any(issues.values())
189
+ return (is_valid, issues)
236
190
 
237
- def getConcreteClassHierarchy(self) -> List[Type]:
238
- """Get the inheritance hierarchy of the concrete class.
191
+ def getHierarchyAnalysis(self) -> Dict[str, List[str]]:
192
+ """Analyze the class hierarchy relationships.
239
193
 
240
194
  Returns
241
195
  -------
242
- List[Type]
243
- List of classes in the inheritance hierarchy
196
+ Dict[str, List[str]]
197
+ Dictionary containing:
198
+ - 'concrete_hierarchy': List of class names in concrete hierarchy
199
+ - 'abstract_hierarchy': List of class names in abstract hierarchy
200
+ - 'common_ancestors': List of common ancestor class names
244
201
  """
245
- return inspect.getmro(self._instance.__class__)
202
+ concrete_hierarchy = [cls.__name__ for cls in inspect.getmro(self._instance.__class__)]
203
+ abstract_hierarchy = [cls.__name__ for cls in inspect.getmro(self._abstract)]
246
204
 
247
- def getCommonBaseClasses(self) -> List[Type]:
248
- """Get base classes common to both abstract and concrete classes.
249
-
250
- Returns
251
- -------
252
- List[Type]
253
- List of common base classes
254
- """
255
- abstract_bases = set(inspect.getmro(self._abstract))
256
205
  concrete_bases = set(inspect.getmro(self._instance.__class__))
257
- return list(abstract_bases & concrete_bases - {self._abstract, object})
258
-
259
- def getAbstractClassSource(self) -> Optional[str]:
260
- """Get the source code of the abstract class.
261
-
262
- Returns
263
- -------
264
- Optional[str]
265
- The source code if available, None otherwise
266
- """
267
- try:
268
- return inspect.getsource(self._abstract)
269
- except (TypeError, OSError):
270
- return None
271
-
272
- def getConcreteClassSource(self) -> Optional[str]:
273
- """Get the source code of the concrete class.
206
+ abstract_bases = set(inspect.getmro(self._abstract))
207
+ common = concrete_bases & abstract_bases - {self._abstract, object}
274
208
 
275
- Returns
276
- -------
277
- Optional[str]
278
- The source code if available, None otherwise
279
- """
280
- try:
281
- return inspect.getsource(self._instance.__class__)
282
- except (TypeError, OSError):
283
- return None
209
+ return {
210
+ 'concrete_hierarchy': concrete_hierarchy,
211
+ 'abstract_hierarchy': abstract_hierarchy,
212
+ 'common_ancestors': [cls.__name__ for cls in common]
213
+ }
284
214
 
285
- def getAbstractClassFile(self) -> Optional[str]:
286
- """Get the file location of the abstract class definition.
215
+ def getImplementationCoverage(self) -> float:
216
+ """Calculate the percentage of abstract methods implemented.
287
217
 
288
218
  Returns
289
219
  -------
290
- Optional[str]
291
- The file path if available, None otherwise
220
+ float
221
+ Implementation coverage percentage (0.0 to 1.0)
292
222
  """
293
- try:
294
- return inspect.getfile(self._abstract)
295
- except (TypeError, OSError):
296
- return None
297
-
298
- def getConcreteClassFile(self) -> Optional[str]:
299
- """Get the file location of the concrete class definition.
223
+ attr = self.getImplementationAnalysis()
224
+ attr_len = len(attr) * 2
225
+ attr_implemented = 0
226
+ for method in attr.values():
227
+ if method.get('implemented'):
228
+ attr_implemented += 2 if method.get('signature_match') else 1
300
229
 
301
- Returns
302
- -------
303
- Optional[str]
304
- The file path if available, None otherwise
305
- """
306
- try:
307
- return inspect.getfile(self._instance.__class__)
308
- except (TypeError, OSError):
309
- return None
230
+ return attr_implemented / attr_len if attr_len > 0 else 0.0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: orionis
3
- Version: 0.206.0
3
+ Version: 0.208.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
@@ -1,6 +1,6 @@
1
1
  orionis/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
2
2
  orionis/console.py,sha256=4gYWxf0fWYgJ4RKwARvnTPh06FL3GJ6SAZ7R2NzOICw,1342
3
- orionis/framework.py,sha256=QxS4x7KjzkvUswd2zt7Ceqeq9NxjSZjDVH7sKtcIvL8,1469
3
+ orionis/framework.py,sha256=f9Ehyig7U1LRiEgdsm4-gGL1bjHiiwYNZJN0A-D3fio,1469
4
4
  orionis/installer/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
5
5
  orionis/installer/manager.py,sha256=Li4TVziRXWfum02xNG4JHwbnLk-u8xzHjdqKz-D894k,2755
6
6
  orionis/installer/output.py,sha256=7O9qa2xtXMB_4ZvVi-Klneom9YazwygAd_4uYAoxhbU,8548
@@ -171,11 +171,11 @@ orionis/luminate/support/inspection/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQ
171
171
  orionis/luminate/support/inspection/container_integrity.py,sha256=6d9FsGk-Rm1AXgqBS3Nww49dR7n1ptXTTNyGUuBHgNY,10111
172
172
  orionis/luminate/support/inspection/functions.py,sha256=XVDLdygONcfDNlH7CZ6muNdtYHLgNp5RybqC3smL4Y4,6400
173
173
  orionis/luminate/support/inspection/reflection.py,sha256=x_UHBY9pBSKgct13-u1WbhoONqLoGG60OpgoCsKE0AI,20368
174
- orionis/luminate/support/inspection/reflexion_abstract.py,sha256=yZTl_oZACjlXKKPmQimGsfre3qQUO2hbNDf7PJ4gKZE,7661
174
+ orionis/luminate/support/inspection/reflexion_abstract.py,sha256=U_VAGQN0ZDMgjxYPhNrLxFt6F8_-8zXcA_B5djTV4GE,10731
175
175
  orionis/luminate/support/inspection/reflexion_concrete.py,sha256=0WOlLeTWLwMeAUReoaJetqlnT1_TxW_jMnbk_yXRR0g,549
176
176
  orionis/luminate/support/inspection/reflexion_concrete_with_abstract.py,sha256=ZuAFoSPkgbOFMIbVR0hvlkKsm1dIpY1_bsXxZxvXcmU,801
177
- orionis/luminate/support/inspection/reflexion_instance.py,sha256=k6bpRYjLeTUDqquluYrDZUtBLpLuGe4wm7PMUM8Sz-E,9914
178
- orionis/luminate/support/inspection/reflexion_instance_with_abstract.py,sha256=dag6QdVp1CydREWdpQvzAyOPX3q-lSb0_XzB0u3odQE,9629
177
+ orionis/luminate/support/inspection/reflexion_instance.py,sha256=LNAgw4sZvHT7UMiObHTGk7xgqpIeKYHAQRgRpuPfEas,10842
178
+ orionis/luminate/support/inspection/reflexion_instance_with_abstract.py,sha256=PI_VSH8baxjPgheOYc9tQAlLq9mjxGm5zCOr-bLVksg,9406
179
179
  orionis/luminate/support/inspection/reflexion_module.py,sha256=OgBXpqNJHkmq-gX4rqFStv-WVNe9R38RsgUgfHpak8k,405
180
180
  orionis/luminate/support/inspection/reflexion_module_with_classname.py,sha256=YZHZI0XUZkSWnq9wrGxrIXtI64nY9yVSZoMe7PZXq8Y,620
181
181
  orionis/luminate/test/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -199,12 +199,16 @@ tests/example/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
199
199
  tests/example/test_example.py,sha256=MNYissCEa0mzx1YA2gTiqXRX8r2v_vfB_Ew0jBFmBag,556
200
200
  tests/support/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
201
201
  tests/support/inspection/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
202
- tests/support/inspection/test_reflection_instance.py,sha256=aYi4qmuAzQ4-gAUrtc9Lx6gNR4Mw4GcOF_T8iWsWZoQ,7266
202
+ tests/support/inspection/test_reflection_abstract.py,sha256=eralQ9DKyEFEZWl97J4YOTpkYBccMfQpwoPLC1OWapA,9233
203
+ tests/support/inspection/test_reflection_instance.py,sha256=46mO4drWsfKKVPuCjUbKeVmw16uBDk-eVhc0idzCd_w,6978
204
+ tests/support/inspection/test_reflection_instance_with_abstract.py,sha256=HZn7BOtlHtKeIgJ2KATSQq9kjEPqhq5NtoNY7HQU0y0,4096
203
205
  tests/support/inspection/fakes/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
204
- tests/support/inspection/fakes/fake_reflection.py,sha256=G16rZdJWC3L8SGEQkmwktvw4n7IAusIIx9Tm-ZFLcg4,1419
205
- orionis-0.206.0.dist-info/LICENCE,sha256=-_4cF2EBKuYVS_SQpy1uapq0oJPUU1vl_RUWSy2jJTo,1111
206
- orionis-0.206.0.dist-info/METADATA,sha256=rpiw7sbXAHLEJ6HEEGVgBfG3C4qyEGXiDzH0SAi6Ucg,3003
207
- orionis-0.206.0.dist-info/WHEEL,sha256=In9FTNxeP60KnTkGw7wk6mJPYd_dQSjEZmXdBdMCI-8,91
208
- orionis-0.206.0.dist-info/entry_points.txt,sha256=a_e0faeSqyUCVZd0MqljQ2oaHHdlsz6g9sU_bMqi5zQ,49
209
- orionis-0.206.0.dist-info/top_level.txt,sha256=2bdoHgyGZhOtLAXS6Om8OCTmL24dUMC_L1quMe_ETbk,14
210
- orionis-0.206.0.dist-info/RECORD,,
206
+ tests/support/inspection/fakes/fake_reflection_abstract.py,sha256=7qtz44brfFzE4oNYi9kIsvdWP79nP2FnzSz-0bU__pg,5045
207
+ tests/support/inspection/fakes/fake_reflection_instance.py,sha256=G16rZdJWC3L8SGEQkmwktvw4n7IAusIIx9Tm-ZFLcg4,1419
208
+ tests/support/inspection/fakes/fake_reflection_instance_with_abstract.py,sha256=SfL8FuFmr650RlzXTrP4tGMfsPVZLhOxVnBXu_g1POg,1471
209
+ orionis-0.208.0.dist-info/LICENCE,sha256=-_4cF2EBKuYVS_SQpy1uapq0oJPUU1vl_RUWSy2jJTo,1111
210
+ orionis-0.208.0.dist-info/METADATA,sha256=QTcA2C1AAfSDvSXVYX8W8515ffwiWK5SKavkRrIYoFQ,3003
211
+ orionis-0.208.0.dist-info/WHEEL,sha256=In9FTNxeP60KnTkGw7wk6mJPYd_dQSjEZmXdBdMCI-8,91
212
+ orionis-0.208.0.dist-info/entry_points.txt,sha256=a_e0faeSqyUCVZd0MqljQ2oaHHdlsz6g9sU_bMqi5zQ,49
213
+ orionis-0.208.0.dist-info/top_level.txt,sha256=2bdoHgyGZhOtLAXS6Om8OCTmL24dUMC_L1quMe_ETbk,14
214
+ orionis-0.208.0.dist-info/RECORD,,