pythagoras 0.22.0__py3-none-any.whl → 0.22.2__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.
- pythagoras/_010_basic_portals/basic_portal_core_classes.py +2 -2
- pythagoras/_020_ordinary_code_portals/ordinary_portal_core_classes.py +2 -2
- pythagoras/_030_data_portals/__init__.py +7 -4
- pythagoras/_030_data_portals/data_portal_core_classes.py +24 -23
- pythagoras/_030_data_portals/ready_and_get.py +21 -8
- pythagoras/_040_logging_code_portals/logging_portal_core_classes.py +2 -2
- pythagoras/_060_autonomous_code_portals/autonomous_portal_core_classes.py +6 -0
- pythagoras/_070_protected_code_portals/__init__.py +1 -0
- pythagoras/_070_protected_code_portals/protected_portal_core_classes.py +10 -2
- pythagoras/_080_pure_code_portals/pure_core_classes.py +1 -0
- pythagoras/_090_swarming_portals/swarming_portals.py +7 -0
- {pythagoras-0.22.0.dist-info → pythagoras-0.22.2.dist-info}/METADATA +1 -1
- {pythagoras-0.22.0.dist-info → pythagoras-0.22.2.dist-info}/RECORD +14 -14
- {pythagoras-0.22.0.dist-info → pythagoras-0.22.2.dist-info}/WHEEL +0 -0
|
@@ -290,9 +290,9 @@ class BasicPortal(NotPicklable,ParameterizableClass, metaclass = PostInitMeta):
|
|
|
290
290
|
|
|
291
291
|
|
|
292
292
|
def _invalidate_cache(self) -> None:
|
|
293
|
-
"""Invalidate the
|
|
293
|
+
"""Invalidate the portal's attribute cache.
|
|
294
294
|
|
|
295
|
-
If the
|
|
295
|
+
If the portal's attribute named ATTR is cached,
|
|
296
296
|
its cached value will be stored in an attribute named _ATTR_cache
|
|
297
297
|
This method should delete all such attributes.
|
|
298
298
|
"""
|
|
@@ -201,9 +201,9 @@ class OrdinaryFn(PortalAwareClass):
|
|
|
201
201
|
|
|
202
202
|
|
|
203
203
|
def _invalidate_cache(self):
|
|
204
|
-
"""Invalidate the
|
|
204
|
+
"""Invalidate the function's attribute cache.
|
|
205
205
|
|
|
206
|
-
If the
|
|
206
|
+
If the function's attribute named ATTR is cached,
|
|
207
207
|
its cached value will be stored in an attribute named _ATTR_cache
|
|
208
208
|
This method should delete all such attributes.
|
|
209
209
|
"""
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
The most important classes in this sub-package are
|
|
4
4
|
DataPortal and ValueAddr.
|
|
5
5
|
|
|
6
|
-
A DataPortal is a container for storing and retrieving
|
|
6
|
+
A DataPortal is a container for storing and retrieving values.
|
|
7
7
|
In distributed applications, multiple application sessions / processes
|
|
8
8
|
can access the same DataPortal, which enables them to interact
|
|
9
9
|
via passing values through the portal.
|
|
@@ -12,18 +12,21 @@ A ValueAddr is a unique identifier for an immutable value.
|
|
|
12
12
|
Two objects with exactly the same type and value will always have
|
|
13
13
|
exactly the same ValueAddr-es.
|
|
14
14
|
|
|
15
|
-
|
|
15
|
+
Conceptually, ValueAddr consists of 2 strings: a descriptor, and a hash signature.
|
|
16
16
|
A descriptor contains human-readable information about an object's type.
|
|
17
17
|
A hash string contains the object's hash signature.
|
|
18
18
|
|
|
19
|
+
Under the hood, the hash signature is further split into 3 strings:
|
|
20
|
+
a shard, a subshard and a hash tail.
|
|
21
|
+
This is done to address limitations of some file systems
|
|
22
|
+
and to optimize work sith cloud storage (e.g. S3).
|
|
23
|
+
|
|
19
24
|
Typically, a DataPortal is implemented as
|
|
20
25
|
a shared directory on a file system (e.g. Amazon EFS),
|
|
21
26
|
or as a shared bucket in a cloud storage (e.g. Amazon S3).
|
|
22
27
|
In this case, a ValueAddr becomes a part of file path
|
|
23
28
|
or a URL (e.g. a hash serves as a filename,
|
|
24
29
|
and a prefix is a folder name).
|
|
25
|
-
|
|
26
|
-
DataPortal is a subclass of OrdinaryCodePortal.
|
|
27
30
|
"""
|
|
28
31
|
|
|
29
32
|
|
|
@@ -8,7 +8,6 @@ from parameterizable import sort_dict_by_keys
|
|
|
8
8
|
from persidict import PersiDict, SafeStrTuple, replace_unsafe_chars, DELETE_CURRENT
|
|
9
9
|
from persidict import KEEP_CURRENT, Joker
|
|
10
10
|
|
|
11
|
-
from .._010_basic_portals import BasicPortal
|
|
12
11
|
from .._010_basic_portals import get_active_portal, get_nonactive_portals
|
|
13
12
|
from .._800_signatures_and_converters import get_hash_signature
|
|
14
13
|
|
|
@@ -41,7 +40,7 @@ def get_nonactive_data_portals() -> list[DataPortal]:
|
|
|
41
40
|
class DataPortal(OrdinaryCodePortal):
|
|
42
41
|
"""A portal that persistently stores values.
|
|
43
42
|
|
|
44
|
-
|
|
43
|
+
Immutable values are accessible via their hash_address-es,
|
|
45
44
|
which are unique identifiers of the values.
|
|
46
45
|
|
|
47
46
|
If the current portal does not contain a specific value,
|
|
@@ -51,8 +50,11 @@ class DataPortal(OrdinaryCodePortal):
|
|
|
51
50
|
|
|
52
51
|
A portal can serve as a context manager, enabling the use of the
|
|
53
52
|
'with' statement to support portal-aware code blocks. If some code is
|
|
54
|
-
supposed to explicitly read anything from a portal,
|
|
55
|
-
in a 'with' statement that
|
|
53
|
+
supposed to explicitly read anything from (or save to) a portal,
|
|
54
|
+
it should be wrapped in a 'with' statement that
|
|
55
|
+
marks the portal as active for the duration of the code block.
|
|
56
|
+
|
|
57
|
+
DataPortal also supports random consistency checks.
|
|
56
58
|
"""
|
|
57
59
|
|
|
58
60
|
_value_store: WriteOnceDict | None
|
|
@@ -190,6 +192,7 @@ class DataPortal(OrdinaryCodePortal):
|
|
|
190
192
|
|
|
191
193
|
|
|
192
194
|
class StorableFn(OrdinaryFn):
|
|
195
|
+
"""An ordinary function that can be persistently stored in a DataPortal."""
|
|
193
196
|
|
|
194
197
|
_addr_cache: ValueAddr
|
|
195
198
|
_ephemeral_config_params_at_init: dict[str, Any] | None
|
|
@@ -219,13 +222,6 @@ class StorableFn(OrdinaryFn):
|
|
|
219
222
|
return OrdinaryFn.portal.__get__(self)
|
|
220
223
|
|
|
221
224
|
|
|
222
|
-
# @portal.setter
|
|
223
|
-
# def portal(self, new_portal: DataPortal) -> None:
|
|
224
|
-
# if not isinstance(new_portal, DataPortal):
|
|
225
|
-
# raise TypeError("portal must be a DataPortal instance")
|
|
226
|
-
# OrdinaryFn.portal.__set__(self, new_portal)
|
|
227
|
-
|
|
228
|
-
|
|
229
225
|
def _get_config_setting(self, key: SafeStrTuple, portal:DataPortal) -> Any:
|
|
230
226
|
if not isinstance(key, (str,SafeStrTuple)):
|
|
231
227
|
raise TypeError("key must be a SafeStrTuple or a string")
|
|
@@ -258,9 +254,9 @@ class StorableFn(OrdinaryFn):
|
|
|
258
254
|
|
|
259
255
|
|
|
260
256
|
def _invalidate_cache(self):
|
|
261
|
-
"""Invalidate the
|
|
257
|
+
"""Invalidate the function's attribute cache.
|
|
262
258
|
|
|
263
|
-
If the
|
|
259
|
+
If the function's attribute named ATTR is cached,
|
|
264
260
|
its cached value will be stored in an attribute named _ATTR_cache
|
|
265
261
|
This method should delete all such attributes.
|
|
266
262
|
"""
|
|
@@ -286,11 +282,15 @@ class HashAddr(SafeStrTuple):
|
|
|
286
282
|
Two objects with exactly the same type and value will always have
|
|
287
283
|
exactly the same HashAddr-es.
|
|
288
284
|
|
|
289
|
-
|
|
290
|
-
A descriptor contains human-readable information
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
285
|
+
Conceptually, HashAddr consists of 2 components: a descriptor,
|
|
286
|
+
and a hash signature. A descriptor contains human-readable information
|
|
287
|
+
about an object's type. A hash signature string contains
|
|
288
|
+
the object's sha256 value, encoded in base-32.
|
|
289
|
+
|
|
290
|
+
Under the hood, the hash signature is further split into 3 strings:
|
|
291
|
+
a shard, a subshard and a hash tail.
|
|
292
|
+
This is done to address limitations of some file systems
|
|
293
|
+
and to optimize work sith cloud storage (e.g. S3).
|
|
294
294
|
"""
|
|
295
295
|
|
|
296
296
|
def __init__(self, descriptor:str
|
|
@@ -362,7 +362,7 @@ class HashAddr(SafeStrTuple):
|
|
|
362
362
|
, hash_signature:str
|
|
363
363
|
, assert_readiness:bool=True
|
|
364
364
|
) -> HashAddr:
|
|
365
|
-
"""(Re)construct address from
|
|
365
|
+
"""(Re)construct address from str versions of a descriptor and a hash"""
|
|
366
366
|
|
|
367
367
|
if not isinstance(descriptor, str) or not isinstance(hash_signature, str):
|
|
368
368
|
raise TypeError("descriptor and hash_signature must be strings")
|
|
@@ -382,7 +382,7 @@ class HashAddr(SafeStrTuple):
|
|
|
382
382
|
@property
|
|
383
383
|
@abstractmethod
|
|
384
384
|
def ready(self) -> bool:
|
|
385
|
-
"""Check if address points to a value that is ready to be retrieved."""
|
|
385
|
+
"""Check if the address points to a value that is ready to be retrieved."""
|
|
386
386
|
# TODO: decide whether we need .ready() at the base class
|
|
387
387
|
raise NotImplementedError
|
|
388
388
|
|
|
@@ -417,12 +417,13 @@ class ValueAddr(HashAddr):
|
|
|
417
417
|
"""A globally unique address of an immutable value.
|
|
418
418
|
|
|
419
419
|
ValueAddr is a universal global identifier of any (constant) value.
|
|
420
|
+
|
|
420
421
|
Using only the value's hash should (theoretically) be enough to
|
|
421
|
-
uniquely address all possible data objects that the humanity
|
|
422
|
-
in the foreseeable future (see, for example ipfs.io).
|
|
422
|
+
uniquely address all possible data objects that the humanity will create
|
|
423
|
+
in the foreseeable future (see, for example, ipfs.io).
|
|
423
424
|
|
|
424
425
|
However, an address also includes a descriptor with an optional suffix.
|
|
425
|
-
It makes it easier for humans to interpret an address
|
|
426
|
+
It makes it easier for humans to interpret an address
|
|
426
427
|
and further decreases collision risk.
|
|
427
428
|
"""
|
|
428
429
|
_containing_portals: set[str]
|
|
@@ -1,6 +1,13 @@
|
|
|
1
|
+
from typing import Any
|
|
2
|
+
|
|
1
3
|
from .data_portal_core_classes import HashAddr
|
|
2
4
|
|
|
3
|
-
def ready(obj
|
|
5
|
+
def ready(obj) -> bool:
|
|
6
|
+
"""Return True if all objects in the data structure are ready."""
|
|
7
|
+
return _ready(obj)
|
|
8
|
+
|
|
9
|
+
def _ready(obj, seen=None):
|
|
10
|
+
"""Return True if all objects in the data structure are ready."""
|
|
4
11
|
if seen is None:
|
|
5
12
|
seen = set()
|
|
6
13
|
|
|
@@ -12,14 +19,20 @@ def ready(obj, seen=None):
|
|
|
12
19
|
if isinstance(obj, HashAddr):
|
|
13
20
|
return obj.ready
|
|
14
21
|
elif isinstance(obj, (list,tuple)):
|
|
15
|
-
return all(
|
|
22
|
+
return all(_ready(item, seen) for item in obj)
|
|
16
23
|
elif isinstance(obj, dict):
|
|
17
|
-
return all(
|
|
24
|
+
return all(_ready(value, seen) for key, value in obj.items())
|
|
18
25
|
else:
|
|
19
26
|
return True
|
|
20
27
|
|
|
21
28
|
|
|
22
|
-
def get(obj
|
|
29
|
+
def get(obj:Any) -> Any:
|
|
30
|
+
"""Return copy of data structure with addresses replaced with objects."""
|
|
31
|
+
return _get(obj)
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
def _get(obj:Any, seen=None)->Any:
|
|
35
|
+
"""Return copy of data structure with addresses replaced with objects."""
|
|
23
36
|
if seen is None:
|
|
24
37
|
seen = dict()
|
|
25
38
|
|
|
@@ -34,12 +47,12 @@ def get(obj, seen=None):
|
|
|
34
47
|
seen[id(obj)] = placeholder
|
|
35
48
|
|
|
36
49
|
if isinstance(obj, list):
|
|
37
|
-
result = [
|
|
50
|
+
result = [_get(item, seen) for item in obj]
|
|
38
51
|
# Update the placeholder with the actual values
|
|
39
52
|
placeholder.extend(result)
|
|
40
53
|
return placeholder
|
|
41
54
|
elif isinstance(obj, dict):
|
|
42
|
-
result = {key:
|
|
55
|
+
result = {key: _get(value, seen) for key, value in obj.items()}
|
|
43
56
|
# Update the placeholder with the actual values
|
|
44
57
|
placeholder.update(result)
|
|
45
58
|
return placeholder
|
|
@@ -47,9 +60,9 @@ def get(obj, seen=None):
|
|
|
47
60
|
if isinstance(obj, HashAddr):
|
|
48
61
|
result = obj.get()
|
|
49
62
|
elif isinstance(obj, tuple):
|
|
50
|
-
result = tuple(
|
|
63
|
+
result = tuple(_get(item, seen) for item in obj)
|
|
51
64
|
else:
|
|
52
65
|
result = obj
|
|
53
66
|
|
|
54
67
|
seen[id(obj)] = result
|
|
55
|
-
return result
|
|
68
|
+
return result
|
|
@@ -125,9 +125,9 @@ class LoggingFnCallSignature:
|
|
|
125
125
|
|
|
126
126
|
|
|
127
127
|
def _invalidate_cache(self):
|
|
128
|
-
"""Invalidate the
|
|
128
|
+
"""Invalidate the function's attribute cache.
|
|
129
129
|
|
|
130
|
-
If the
|
|
130
|
+
If the function's attribute named ATTR is cached,
|
|
131
131
|
its cached value will be stored in an attribute named _ATTR_cache
|
|
132
132
|
This method should delete all such attributes.
|
|
133
133
|
"""
|
|
@@ -139,6 +139,12 @@ class AutonomousFn(SafeFn):
|
|
|
139
139
|
|
|
140
140
|
|
|
141
141
|
def _invalidate_cache(self):
|
|
142
|
+
"""Invalidate the function's attribute cache.
|
|
143
|
+
|
|
144
|
+
If the function's attribute named ATTR is cached,
|
|
145
|
+
its cached value will be stored in an attribute named _ATTR_cache
|
|
146
|
+
This method should delete all such attributes.
|
|
147
|
+
"""
|
|
142
148
|
super()._invalidate_cache()
|
|
143
149
|
if hasattr(self, "_fixed_kwargs_cached"):
|
|
144
150
|
assert hasattr(self, "_fixed_kwargs_packed"), "Premature cache invalidation: fixed_kwargs_packed is missing."
|
|
@@ -188,10 +188,18 @@ class ProtectedFn(AutonomousFn):
|
|
|
188
188
|
|
|
189
189
|
|
|
190
190
|
def _invalidate_cache(self):
|
|
191
|
+
"""Invalidate the function's attribute cache.
|
|
192
|
+
|
|
193
|
+
If the function's attribute named ATTR is cached,
|
|
194
|
+
its cached value will be stored in an attribute named _ATTR_cache
|
|
195
|
+
This method should delete all such attributes.
|
|
196
|
+
"""
|
|
191
197
|
super()._invalidate_cache()
|
|
192
198
|
if hasattr(self, "_post_validators_cached"):
|
|
193
|
-
assert hasattr(self, "_post_validators_addrs")
|
|
199
|
+
assert (hasattr(self, "_post_validators_addrs")
|
|
200
|
+
, "Premature cache invalidation: _post_validators_addrs is missing.")
|
|
194
201
|
del self._post_validators_cached
|
|
195
202
|
if hasattr(self, "_pre_validators_cached"):
|
|
196
|
-
assert hasattr(self, "_pre_validators_addrs")
|
|
203
|
+
assert (hasattr(self, "_pre_validators_addrs")
|
|
204
|
+
, "Premature cache invalidation: _pre_validators_addrs is missing.")
|
|
197
205
|
del self._pre_validators_cached
|
|
@@ -176,8 +176,15 @@ class SwarmingPortal(PureCodePortal):
|
|
|
176
176
|
|
|
177
177
|
|
|
178
178
|
def _invalidate_cache(self):
|
|
179
|
+
"""Invalidate the object's attribute cache.
|
|
180
|
+
|
|
181
|
+
If the object's attribute named ATTR is cached,
|
|
182
|
+
its cached value will be stored in an attribute named _ATTR_cache
|
|
183
|
+
This method should delete all such attributes.
|
|
184
|
+
"""
|
|
179
185
|
if hasattr(self, "_max_n_workers_cache"):
|
|
180
186
|
del self._max_n_workers_cache
|
|
187
|
+
super()._invalidate_cache()
|
|
181
188
|
|
|
182
189
|
parameterizable.register_parameterizable_class(SwarmingPortal)
|
|
183
190
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
pythagoras/.DS_Store,sha256=40d35c2d6b7fca6728a8be89c610686ceb83b21e32d6fe0ddedcf1b3f58bfdaf,6148
|
|
2
2
|
pythagoras/_010_basic_portals/__init__.py,sha256=111d2457fb61ee16dae275d78e83fe8e837e72a9143281f889148280a50fef96,1703
|
|
3
|
-
pythagoras/_010_basic_portals/basic_portal_core_classes.py,sha256=
|
|
3
|
+
pythagoras/_010_basic_portals/basic_portal_core_classes.py,sha256=22bd32244f7d0b118b5eedc8b4ae45c06c47db21942773d7a44a947c52f143ed,18995
|
|
4
4
|
pythagoras/_010_basic_portals/exceptions.py,sha256=a15bab585769159db1bedf123bc92e920695f14faa3ad1f4ab0f863b7742b391,237
|
|
5
5
|
pythagoras/_010_basic_portals/long_infoname.py,sha256=9742b2bf023389704c88628a8ed81d1c82ad6eb15a0a27c9cddadbfae1e9cf2d,650
|
|
6
6
|
pythagoras/_010_basic_portals/not_picklable_class.py,sha256=2f7405a32c530a68fae64c5e06731b69c44dea1fc0611e72284d5b13dffd77c0,352
|
|
@@ -10,17 +10,17 @@ pythagoras/_020_ordinary_code_portals/__init__.py,sha256=a77912a9a4188f4c65864f4
|
|
|
10
10
|
pythagoras/_020_ordinary_code_portals/code_normalizer.py,sha256=ecbdcfe40699292f483eaac812fe5425cdc71c33f8f1fc3a1064165d973142d3,5004
|
|
11
11
|
pythagoras/_020_ordinary_code_portals/function_processing.py,sha256=ae5841d1da5a533b6fe92336c2551d6947444dc576a55508098b9f56b40245c7,3623
|
|
12
12
|
pythagoras/_020_ordinary_code_portals/ordinary_decorator.py,sha256=278ab1d37344120a585af8380fc52400bd0f76d02ddac43230dd68a7a2cc16c0,1028
|
|
13
|
-
pythagoras/_020_ordinary_code_portals/ordinary_portal_core_classes.py,sha256=
|
|
14
|
-
pythagoras/_030_data_portals/__init__.py,sha256=
|
|
15
|
-
pythagoras/_030_data_portals/data_portal_core_classes.py,sha256=
|
|
16
|
-
pythagoras/_030_data_portals/ready_and_get.py,sha256=
|
|
13
|
+
pythagoras/_020_ordinary_code_portals/ordinary_portal_core_classes.py,sha256=b4de7194d6c70eef172eb1de476515018c5d3eae07c7a15fb574ac6bd963d561,9756
|
|
14
|
+
pythagoras/_030_data_portals/__init__.py,sha256=d149ae2b0bd35429f89fd7922ff407975c3eff4a056ea83919c609d8f20af054,1422
|
|
15
|
+
pythagoras/_030_data_portals/data_portal_core_classes.py,sha256=2e2747fd978d0bce0f0b7f9d6460a4060d092af94a6cd01f5376573e0e5b2cb5,20432
|
|
16
|
+
pythagoras/_030_data_portals/ready_and_get.py,sha256=838004869475dd877a1158a7cb6c20f2f922b97e1ac174286ce30ce287fb6520,2002
|
|
17
17
|
pythagoras/_030_data_portals/storable_decorator.py,sha256=97c5b71a156622c7208e80931aaded99d7a12860cb2159c56d333e196fb51b88,578
|
|
18
18
|
pythagoras/_040_logging_code_portals/__init__.py,sha256=62ff68021e955c0a96ddd89168a3db25a8f20b3384d5e1ca10df7d9a24c96837,1251
|
|
19
19
|
pythagoras/_040_logging_code_portals/exception_processing_tracking.py,sha256=cb280c8390d66e0da2b698f407160573ca1ce49a96c10b7f1f2463a120ebe192,612
|
|
20
20
|
pythagoras/_040_logging_code_portals/execution_environment_summary.py,sha256=853bd36da75802d8ac6781fcaeafa7fe1b0a3c24b7f23b12cfc970fc0d4322a6,2268
|
|
21
21
|
pythagoras/_040_logging_code_portals/kw_args.py,sha256=8523b445ff1123cb9880147ab2849d7ee8e882a277e697fb33b8d81d2f75445f,2605
|
|
22
22
|
pythagoras/_040_logging_code_portals/logging_decorator.py,sha256=d3bf70dbf6791e15c52eb8325d07a48ee39bcbd09d5201541916d14f9969ba35,891
|
|
23
|
-
pythagoras/_040_logging_code_portals/logging_portal_core_classes.py,sha256=
|
|
23
|
+
pythagoras/_040_logging_code_portals/logging_portal_core_classes.py,sha256=197f9471a1f06ef3c40467f53e1ff9a44cc3b6547293c01b0577e639cdd0f566,21872
|
|
24
24
|
pythagoras/_040_logging_code_portals/notebook_checker.py,sha256=e654090c80f38512114a65f54fcf2701110c10ca030c57f438829cbd3a678739,541
|
|
25
25
|
pythagoras/_040_logging_code_portals/output_capturer.py,sha256=a210a9eaaab12fb22e2467e716e088823e4e7381e60bc73bb99184feecd69199,4216
|
|
26
26
|
pythagoras/_040_logging_code_portals/uncaught_exceptions.py,sha256=0776cfbd7e679c9271e098cb486765d715ce054da9aa8dc23fe32898901f5da1,3121
|
|
@@ -29,24 +29,24 @@ pythagoras/_050_safe_code_portals/safe_decorator.py,sha256=085bb05724d02a3ff4f51
|
|
|
29
29
|
pythagoras/_050_safe_code_portals/safe_portal_core_classes.py,sha256=bb37bd2515f7982829308265951e4576aed11517b1c8c76de75ef726f96c3ea4,1808
|
|
30
30
|
pythagoras/_060_autonomous_code_portals/__init__.py,sha256=6c19fffb24a93aef9587f0abe9ef24732ef5971c94e9a0fa2c36f4d7a3664e35,2232
|
|
31
31
|
pythagoras/_060_autonomous_code_portals/autonomous_decorators.py,sha256=c315b37cbc30e3929f18e29bda409aad39b6d5d840dcdb8b70c737817d346af6,3947
|
|
32
|
-
pythagoras/_060_autonomous_code_portals/autonomous_portal_core_classes.py,sha256=
|
|
32
|
+
pythagoras/_060_autonomous_code_portals/autonomous_portal_core_classes.py,sha256=7b6d8e0c7983e397e919c4c26ecf7642356fe833c90ce393c9d42e95a6f91dd0,5596
|
|
33
33
|
pythagoras/_060_autonomous_code_portals/names_usage_analyzer.py,sha256=1e0e84854ac630b204878fecde48a16739fd2663709fcee2ec0a8844f4fd4f13,7470
|
|
34
34
|
pythagoras/_070_protected_code_portals/OK_const.py,sha256=17ea314496f44b422f9936585c3bb3749c960bc779b4f74962ec04e3fa4d2494,186
|
|
35
|
-
pythagoras/_070_protected_code_portals/__init__.py,sha256=
|
|
35
|
+
pythagoras/_070_protected_code_portals/__init__.py,sha256=39e7944553dc6d847198e687ebae982bbf5ad8dc366e9fa4dcf60fef73122300,200
|
|
36
36
|
pythagoras/_070_protected_code_portals/basic_pre_validators.py,sha256=742771f96dd635a8d132ac3da90fd17689fe4b38e06160c8019be4fce7ef1602,1441
|
|
37
37
|
pythagoras/_070_protected_code_portals/fn_arg_names_checker.py,sha256=e858ce5099868030a39057177f93a893e13d7a210582e6ab636aaaccec898fb0,1230
|
|
38
38
|
pythagoras/_070_protected_code_portals/list_flattener.py,sha256=9a54b512ad9dc201db348e7908f5ca5f36d171ae3da433511d38023a6ba8d4b5,331
|
|
39
39
|
pythagoras/_070_protected_code_portals/package_manager.py,sha256=30adf8d75f55b9b2c587dc95f4aa1c2154fa9354d668af6f0d586bb42f0d5b17,2008
|
|
40
40
|
pythagoras/_070_protected_code_portals/protected_decorators.py,sha256=17459a1ad08e3e95f314636e670bce1dcc992631e38d1c08c5e55f3ee1459c2c,1613
|
|
41
|
-
pythagoras/_070_protected_code_portals/protected_portal_core_classes.py,sha256=
|
|
41
|
+
pythagoras/_070_protected_code_portals/protected_portal_core_classes.py,sha256=e8bf525ca65d3520c03e9d35934e62d2edd78c6b3d561b6d9668e1a9a05144e5,8349
|
|
42
42
|
pythagoras/_070_protected_code_portals/system_utils.py,sha256=878a22110140c852b3aaf774cb0c0023458360a4ae221fef89ff3a5d02176301,2360
|
|
43
43
|
pythagoras/_070_protected_code_portals/validator_fn_classes.py,sha256=4afa4bf0629f68e4b1623003272ffd7111ac9cbb739e81fde601049d19b84269,3232
|
|
44
44
|
pythagoras/_080_pure_code_portals/__init__.py,sha256=8ed33435bb03d96675537fc6a696625332f971698d56c6b22b5ca1bc9d1b4274,1856
|
|
45
|
-
pythagoras/_080_pure_code_portals/pure_core_classes.py,sha256=
|
|
45
|
+
pythagoras/_080_pure_code_portals/pure_core_classes.py,sha256=bc84f16c7d410e7fda12231802b7606c690655abbea76523f57f8a6058e0bdfd,19040
|
|
46
46
|
pythagoras/_080_pure_code_portals/pure_decorator.py,sha256=fd7acf43f2735146a4195d2a29d22e545f57b922489cd3baea7d9e4b5b88b5ae,1373
|
|
47
47
|
pythagoras/_090_swarming_portals/__init__.py,sha256=7041578f84ffa291f2752c7a2168007b9113f99482f0173f3729171b3bff551a,32
|
|
48
48
|
pythagoras/_090_swarming_portals/output_suppressor.py,sha256=83e6cc9bcc62a226babb1165912ef5095ea948499ce5136a7516ac8b54522607,626
|
|
49
|
-
pythagoras/_090_swarming_portals/swarming_portals.py,sha256=
|
|
49
|
+
pythagoras/_090_swarming_portals/swarming_portals.py,sha256=45d50cdc9020742d4dfbf93699f9d1e74ef87ff9cb5931bd3196d0c9d6a6b38e,12003
|
|
50
50
|
pythagoras/_100_top_level_API/__init__.py,sha256=b392edc2c918da7c2444f14accfd0fac2cd0d5cf6849c64ed2433dfdb58b8b75,64
|
|
51
51
|
pythagoras/_100_top_level_API/default_local_portal.py,sha256=cfbe20499fed2f038b507b44fb58bb4cb6ea2fbe2fe93a3ab5ad7f3ac655005f,215
|
|
52
52
|
pythagoras/_100_top_level_API/top_level_API.py,sha256=4b63575b86df2fdf28e93c67e8d33411e05bd67cf016d3d297ec9635ebc04081,906
|
|
@@ -60,6 +60,6 @@ pythagoras/_900_project_stats_collector/__init__.py,sha256=e3b0c44298fc1c149afbf
|
|
|
60
60
|
pythagoras/_900_project_stats_collector/project_analyzer.py,sha256=d06e9d7b516cb7424ef777e70abe9d5220e09b0b19476326b8974b4dc3917f89,3506
|
|
61
61
|
pythagoras/__init__.py,sha256=13b5aaf4128704dea052fc03a3a3488f1b14c3638dec45a9a29c74a4fbed7e24,1089
|
|
62
62
|
pythagoras/core/__init__.py,sha256=ec31383ee08c1d6ce12785c5b131a021c6abca933684a6757d8ee4fdc3f0923d,318
|
|
63
|
-
pythagoras-0.22.
|
|
64
|
-
pythagoras-0.22.
|
|
65
|
-
pythagoras-0.22.
|
|
63
|
+
pythagoras-0.22.2.dist-info/WHEEL,sha256=607c46fee47e440c91332c738096ff0f5e54ca3b0818ee85462dd5172a38e793,79
|
|
64
|
+
pythagoras-0.22.2.dist-info/METADATA,sha256=5a0cd5bb24f5e0266b9f1ab67d4df6a2ecefe3a52193e49d1fd977bbb9064c87,4241
|
|
65
|
+
pythagoras-0.22.2.dist-info/RECORD,,
|
|
File without changes
|