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.
@@ -290,9 +290,9 @@ class BasicPortal(NotPicklable,ParameterizableClass, metaclass = PostInitMeta):
290
290
 
291
291
 
292
292
  def _invalidate_cache(self) -> None:
293
- """Invalidate the object's attribute cache.
293
+ """Invalidate the portal's attribute cache.
294
294
 
295
- If the object's attribute named ATTR is cached,
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 object's attribute cache.
204
+ """Invalidate the function's attribute cache.
205
205
 
206
- If the object's attribute named ATTR is cached,
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 immutable values.
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
- A ValueAddr consists of 2 strings: a descriptor, and a hash.
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
- Values are accessible via their hash_address-es,
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, it should be wrapped
55
- in a 'with' statement that marks the portal as the current.
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 object's attribute cache.
257
+ """Invalidate the function's attribute cache.
262
258
 
263
- If the object's attribute named ATTR is cached,
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
- A HashAddr consists of 2 components: a descriptor, and a hash.
290
- A descriptor contains human-readable information about an object's type.
291
- A hash string contains the object's hash signature. It may contain
292
- an optional suffix, which provides additional human-readable
293
- information about the object's structure / value.
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 text representations of descriptor and hash"""
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 will create
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, seen=None):
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(ready(item, seen) for item in obj)
22
+ return all(_ready(item, seen) for item in obj)
16
23
  elif isinstance(obj, dict):
17
- return all(ready(value, seen) for key, value in obj.items())
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, seen=None):
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 = [get(item, seen) for item in obj]
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: get(value, seen) for key, value in obj.items()}
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(get(item, seen) for item in obj)
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 object's attribute cache.
128
+ """Invalidate the function's attribute cache.
129
129
 
130
- If the object's attribute named ATTR is cached,
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."
@@ -3,3 +3,4 @@ from .protected_portal_core_classes import *
3
3
  from .protected_decorators import *
4
4
  from .system_utils import *
5
5
  from .basic_pre_validators import *
6
+ from .package_manager import *
@@ -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"), "Premature cache invalidation: _post_validators_addrs is missing."
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"), "Premature cache invalidation: _pre_validators_addrs is missing."
203
+ assert (hasattr(self, "_pre_validators_addrs")
204
+ , "Premature cache invalidation: _pre_validators_addrs is missing.")
197
205
  del self._pre_validators_cached
@@ -287,6 +287,7 @@ class PureFnExecutionResultAddr(HashAddr):
287
287
  del self._kwargs_cache
288
288
  if hasattr(self, "_call_signature_cache"):
289
289
  del self._call_signature_cache
290
+ super()._invalidate_cache()
290
291
 
291
292
 
292
293
  def get_ValueAddr(self):
@@ -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
  Metadata-Version: 2.3
2
2
  Name: pythagoras
3
- Version: 0.22.0
3
+ Version: 0.22.2
4
4
  Summary: Planet-scale distributed computing in Python.
5
5
  Keywords: cloud,ML,AI,serverless,distributed,parallel,machine-learning,deep-learning,pythagoras
6
6
  Author: Volodymyr (Vlad) Pavlov
@@ -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=1cc8fc86d8be58283a93b7707a63e27228b012f07601916f5eb851bc66d4db26,18995
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=ff3ce5d740f6e19a32a4d1f3d516d825a50a53d53a8c483f388e008d69062838,9752
14
- pythagoras/_030_data_portals/__init__.py,sha256=e7265c2dc7d6e8ceb0ae6057c086ec23417219e943360d6635018ff64532c6b4,1245
15
- pythagoras/_030_data_portals/data_portal_core_classes.py,sha256=7f4b43c86ba167edb18ec16d2d2d5eac2dd23b4821ff6297fc037ef37d764a8d,20385
16
- pythagoras/_030_data_portals/ready_and_get.py,sha256=d87d16a6747239f4ed6c30c2be95eab9ae58bc5b2742f0fd924fd2a3ace71382,1571
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=76171d0adb83223dcc26bad99af36cd5f539c23e311062f2ec6c8cc3eb35198b,21868
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=c655406ca62ad82632bf3cae7f0b41670e6b8ca8e5f081c4c3c494f074755fb7,5342
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=de95bf2b28ee110e70c3dd43ccc13cfb7131d5e643086863114cbfebf127fa67,169
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=899cf52300deec302c96c6d240651115957f714760e7169640206684bc6a854b,8057
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=93867a68efa491b719b587b8e2f235cc48df792120e1278f6600afed039e1826,19004
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=e74c34a4ebb2751bb7aa037db0bd2f9c1feca35596d847c44052c5123fb60146,11717
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.0.dist-info/WHEEL,sha256=607c46fee47e440c91332c738096ff0f5e54ca3b0818ee85462dd5172a38e793,79
64
- pythagoras-0.22.0.dist-info/METADATA,sha256=ca388d6dfb7253fcf52afb3a14f102877c06b356764ca400081b4d167e57a959,4241
65
- pythagoras-0.22.0.dist-info/RECORD,,
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,,