pythagoras 0.24.1__py3-none-any.whl → 0.24.3__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/.DS_Store CHANGED
Binary file
@@ -32,7 +32,6 @@ be subclassed to provide additional functionality.
32
32
  """
33
33
 
34
34
  from .post_init_metaclass import *
35
- from .not_picklable_class import *
36
35
  from .exceptions import *
37
36
  from .basic_portal_core_classes import *
38
37
  from .portal_tester import _PortalTester
@@ -14,12 +14,11 @@ from abc import abstractmethod
14
14
  from pathlib import Path
15
15
  from typing import TypeVar, Type, Any, NewType
16
16
  import pandas as pd
17
- import parameterizable
17
+ from parameterizable import NotPicklableClass
18
18
  from parameterizable import ParameterizableClass, sort_dict_by_keys
19
19
 
20
20
  from persidict import PersiDict, FileDirDict, SafeStrTuple
21
21
  from .post_init_metaclass import PostInitMeta
22
- from .not_picklable_class import NotPicklable
23
22
  from .._800_signatures_and_converters import get_hash_signature
24
23
 
25
24
  def _describe_persistent_characteristic(name, value) -> pd.DataFrame:
@@ -205,7 +204,7 @@ def get_default_portal_base_dir() -> str:
205
204
  return target_directory_str
206
205
 
207
206
 
208
- class BasicPortal(NotPicklable,ParameterizableClass, metaclass = PostInitMeta):
207
+ class BasicPortal(NotPicklableClass,ParameterizableClass, metaclass = PostInitMeta):
209
208
  """A base class for portal objects that enable access to 'outside' world.
210
209
 
211
210
  In a Pythagoras-based application, a portal is the application's 'window'
@@ -359,17 +358,6 @@ class BasicPortal(NotPicklable,ParameterizableClass, metaclass = PostInitMeta):
359
358
  return sorted_params
360
359
 
361
360
 
362
- @property
363
- def _ephemeral_param_names(self) -> set[str]:
364
- """Get the names of the portal's ephemeral parameters.
365
-
366
- Portal's ephemeral parameters are not stored persistently.
367
- They affect behaviour of a portal object in an application session,
368
- but they do not affect behaviour of the actual portal across multiple runs.
369
- """
370
- return set()
371
-
372
-
373
361
  @property
374
362
  def _str_id(self) -> PortalStrID:
375
363
  """Get the portal's persistent hash.
@@ -377,15 +365,8 @@ class BasicPortal(NotPicklable,ParameterizableClass, metaclass = PostInitMeta):
377
365
  It's an internal hash used by Pythagoras and is different from .__hash__()
378
366
  """
379
367
  if not hasattr(self,"_str_id_cache"):
380
- params = self.get_params()
381
- jsparams = parameterizable.dumpjs(params)
382
- param_names = set(params.keys())
383
- params = parameterizable.access_jsparams(jsparams, *param_names)
384
- ephemeral_names = self._ephemeral_param_names
385
- nonephemeral_params = {k:params[k] for k in params
386
- if k not in ephemeral_names}
387
368
  self._str_id_cache = PortalStrID(
388
- get_hash_signature(nonephemeral_params))
369
+ get_hash_signature(self.get_essential_jsparams()))
389
370
  return self._str_id_cache
390
371
 
391
372
 
@@ -61,7 +61,7 @@ class DataPortal(OrdinaryCodePortal):
61
61
  _config_settings: PersiDict | None
62
62
  _config_settings_cache: dict
63
63
 
64
- _ephemeral_config_params_at_init: dict[str, Any] | None
64
+ _auxiliary_config_params_at_init: dict[str, Any] | None
65
65
 
66
66
  def __init__(self
67
67
  , root_dict: PersiDict|str|None = None
@@ -69,7 +69,7 @@ class DataPortal(OrdinaryCodePortal):
69
69
  ):
70
70
  OrdinaryCodePortal.__init__(self, root_dict = root_dict)
71
71
  del root_dict
72
- self._ephemeral_config_params_at_init = dict()
72
+ self._auxiliary_config_params_at_init = dict()
73
73
  self._config_settings_cache = dict()
74
74
 
75
75
  config_settings_prototype = self._root_dict.get_subdict("config_settings")
@@ -84,7 +84,7 @@ class DataPortal(OrdinaryCodePortal):
84
84
  raise ValueError("p_consistency_checks must be a float in [0,1] "
85
85
  +f"or a Joker, but got {p_consistency_checks}")
86
86
 
87
- self._ephemeral_config_params_at_init["p_consistency_checks"
87
+ self._auxiliary_config_params_at_init["p_consistency_checks"
88
88
  ] = p_consistency_checks
89
89
 
90
90
  value_store_prototype = self._root_dict.get_subdict("value_store")
@@ -97,7 +97,7 @@ class DataPortal(OrdinaryCodePortal):
97
97
 
98
98
 
99
99
  def _persist_initial_config_params(self) -> None:
100
- for key, value in self._ephemeral_config_params_at_init.items():
100
+ for key, value in self._auxiliary_config_params_at_init.items():
101
101
  self._set_config_setting(key, value)
102
102
 
103
103
 
@@ -111,15 +111,15 @@ class DataPortal(OrdinaryCodePortal):
111
111
  def get_params(self) -> dict:
112
112
  """Get the portal's configuration parameters"""
113
113
  params = super().get_params()
114
- params.update(self._ephemeral_config_params_at_init)
114
+ params.update(self._auxiliary_config_params_at_init)
115
115
  sorted_params = sort_dict_by_keys(params)
116
116
  return sorted_params
117
117
 
118
118
 
119
119
  @property
120
- def _ephemeral_param_names(self) -> set[str]:
121
- names = super()._ephemeral_param_names
122
- names.update(self._ephemeral_config_params_at_init)
120
+ def auxiliary_param_names(self) -> set[str]:
121
+ names = super().auxiliary_param_names
122
+ names.update(self._auxiliary_config_params_at_init)
123
123
  return names
124
124
 
125
125
 
@@ -186,7 +186,7 @@ class DataPortal(OrdinaryCodePortal):
186
186
  """Clear the portal's state"""
187
187
  self._value_store = None
188
188
  self._config_settings = None
189
- self._ephemeral_config_params_at_init = None
189
+ self._auxiliary_config_params_at_init = None
190
190
  self._invalidate_cache()
191
191
  super()._clear()
192
192
 
@@ -195,14 +195,14 @@ class StorableFn(OrdinaryFn):
195
195
  """An ordinary function that can be persistently stored in a DataPortal."""
196
196
 
197
197
  _addr_cache: ValueAddr
198
- _ephemeral_config_params_at_init: dict[str, Any] | None
198
+ _auxiliary_config_params_at_init: dict[str, Any] | None
199
199
 
200
200
  def __init__(self
201
201
  , fn: Callable | str
202
202
  , portal: DataPortal | None = None
203
203
  ):
204
204
  OrdinaryFn.__init__(self, fn=fn, portal=portal)
205
- self._ephemeral_config_params_at_init = dict()
205
+ self._auxiliary_config_params_at_init = dict()
206
206
 
207
207
 
208
208
  def _first_visit_to_portal(self, portal: DataPortal) -> None:
@@ -213,7 +213,7 @@ class StorableFn(OrdinaryFn):
213
213
 
214
214
 
215
215
  def _persist_initial_config_params(self, portal:DataPortal) -> None:
216
- for key, value in self._ephemeral_config_params_at_init.items():
216
+ for key, value in self._auxiliary_config_params_at_init.items():
217
217
  self._set_config_setting(key, value, portal)
218
218
 
219
219
 
@@ -268,7 +268,7 @@ class StorableFn(OrdinaryFn):
268
268
  def __setstate__(self, state):
269
269
  """This method is called when the object is unpickled."""
270
270
  super().__setstate__(state)
271
- self._ephemeral_config_params_at_init = dict()
271
+ self._auxiliary_config_params_at_init = dict()
272
272
 
273
273
 
274
274
  def __getstate__(self):
@@ -5,10 +5,10 @@ import traceback
5
5
  from typing import Callable, Any
6
6
 
7
7
  import pandas as pd
8
- # from parameterizable import register_parameterizable_class
8
+ from parameterizable import NotPicklableClass
9
9
  from persidict import PersiDict, KEEP_CURRENT, Joker
10
10
 
11
- from .._010_basic_portals import NotPicklable, get_active_portal
11
+ from .._010_basic_portals import get_active_portal
12
12
  from .._010_basic_portals.basic_portal_core_classes import (
13
13
  _describe_persistent_characteristic, _describe_runtime_characteristic)
14
14
 
@@ -48,9 +48,9 @@ class LoggingFn(StorableFn):
48
48
  f"got {type(excessive_logging)}")
49
49
 
50
50
  if excessive_logging is KEEP_CURRENT and isinstance(fn, LoggingFn):
51
- excessive_logging = fn._ephemeral_config_params_at_init["excessive_logging"]
51
+ excessive_logging = fn._auxiliary_config_params_at_init["excessive_logging"]
52
52
 
53
- self._ephemeral_config_params_at_init[
53
+ self._auxiliary_config_params_at_init[
54
54
  "excessive_logging"] = excessive_logging
55
55
 
56
56
 
@@ -313,7 +313,7 @@ class LoggingFnCallSignature:
313
313
  return result
314
314
 
315
315
 
316
- class LoggingFnExecutionRecord(NotPicklable):
316
+ class LoggingFnExecutionRecord(NotPicklableClass):
317
317
  """ A record of one full function execution session.
318
318
 
319
319
  It provides access to all information logged during the
@@ -392,7 +392,7 @@ class LoggingFnExecutionRecord(NotPicklable):
392
392
  f"{self.call_signature.fn_name} execution results.")
393
393
 
394
394
 
395
- class LoggingFnExecutionFrame(NotPicklable):
395
+ class LoggingFnExecutionFrame(NotPicklableClass):
396
396
  call_stack: list[LoggingFnExecutionFrame] = []
397
397
 
398
398
  session_id: str
@@ -545,7 +545,7 @@ class LoggingCodePortal(DataPortal):
545
545
  "excessive_logging must be a boolean or Joker, "
546
546
  f"got {type(excessive_logging)}")
547
547
 
548
- self._ephemeral_config_params_at_init["excessive_logging"
548
+ self._auxiliary_config_params_at_init["excessive_logging"
549
549
  ] = excessive_logging
550
550
 
551
551
  crash_history_prototype = self._root_dict.get_subdict("crash_history")
@@ -20,17 +20,12 @@ def _recursion_pre_validator(
20
20
  param_value = unpacked_kwargs[param_name]
21
21
  assert isinstance(param_value, int)
22
22
  assert param_value >= 0
23
- if param_value in {0,1,2,3,4}:
23
+ if param_value in {0,1}:
24
24
  return pth.VALIDATION_SUCCESSFUL
25
- unpacked_kwargs[param_name] = param_value - 1
26
- result_addr = pth.PureFnExecutionResultAddr(
27
- fn=fn, arguments=unpacked_kwargs)
28
- if result_addr.ready:
29
- return pth.VALIDATION_SUCCESSFUL
30
- result = result_addr.call_signature
31
-
25
+
32
26
  # Binary search to find the smallest n where result_addr.ready is not True
33
- left, right = 2, param_value - 2
27
+ left, right = 2, param_value - 1
28
+ result = pth.VALIDATION_SUCCESSFUL # Default result if all are ready
34
29
 
35
30
  while left <= right:
36
31
  mid = (left + right) // 2
@@ -47,6 +42,7 @@ def _recursion_pre_validator(
47
42
  # Result is ready, search in the right half
48
43
  left = mid + 1
49
44
 
45
+
50
46
  return result
51
47
 
52
48
 
@@ -72,7 +72,7 @@ class SwarmingPortal(PureCodePortal):
72
72
  if parent_process_id is None or parent_process_start_time is None:
73
73
  assert parent_process_id is None
74
74
  assert parent_process_start_time is None
75
- self._ephemeral_config_params_at_init["max_n_workers"
75
+ self._auxiliary_config_params_at_init["max_n_workers"
76
76
  ] = max_n_workers
77
77
  else:
78
78
  assert max_n_workers == 0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: pythagoras
3
- Version: 0.24.1
3
+ Version: 0.24.3
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
@@ -16,7 +16,6 @@ Classifier: Topic :: Scientific/Engineering
16
16
  Classifier: Topic :: Scientific/Engineering :: Information Analysis
17
17
  Classifier: Topic :: Software Development :: Libraries
18
18
  Classifier: Topic :: Software Development :: Libraries :: Python Modules
19
- Requires-Dist: persidict==0.104.1
20
19
  Requires-Dist: lz4
21
20
  Requires-Dist: joblib
22
21
  Requires-Dist: scikit-learn
@@ -27,11 +26,12 @@ Requires-Dist: autopep8
27
26
  Requires-Dist: deepdiff
28
27
  Requires-Dist: numpy
29
28
  Requires-Dist: pytest
29
+ Requires-Dist: persidict==0.104.2
30
30
  Requires-Dist: boto3
31
31
  Requires-Dist: moto
32
32
  Requires-Dist: uv
33
33
  Requires-Dist: nvidia-ml-py
34
- Requires-Dist: parameterizable==0.100.0
34
+ Requires-Dist: parameterizable==0.101.0
35
35
  Requires-Dist: persidict[aws] ; extra == 'aws'
36
36
  Requires-Dist: boto3 ; extra == 'aws'
37
37
  Requires-Dist: moto ; extra == 'aws'
@@ -1,43 +1,35 @@
1
- pythagoras/.DS_Store,sha256=5wiLlLmnKc1n5s8_gb9-zTLc63vpMGQMQtrld6M4GP4,8196
2
- pythagoras/_010_basic_portals/.DS_Store,sha256=SyPTnduZgvgOlrP5Jp0o9nC6pUH7g-BK_aB1_dg3ozQ,6148
3
- pythagoras/_010_basic_portals/__init__.py,sha256=ER0kV_th7hba4nXXjoP-joN-cqkUMoH4iRSCgKUP75Y,1703
4
- pythagoras/_010_basic_portals/basic_portal_core_classes.py,sha256=Mknyv2O5JWvpfplwCXIR6zY3kBBy2vVcP8bmj27YcLw,24758
1
+ pythagoras/.DS_Store,sha256=4fJ-j5kHYgNLz5ki6QI2jkwoTuthfKswojnfe4naJ8U,8196
2
+ pythagoras/_010_basic_portals/__init__.py,sha256=L6vahRANApOIIdzw3wuAIZtJRijepneOevXnlhrZmj4,1668
3
+ pythagoras/_010_basic_portals/basic_portal_core_classes.py,sha256=UcvgxajJdtb7bgNkhUrehjN6Hd39iCNFtVqeC71qYoU,23979
5
4
  pythagoras/_010_basic_portals/exceptions.py,sha256=CMtSyRb47YKZtANN-iCQBvvyYPKdKqomLygRE1fjSNk,1248
6
5
  pythagoras/_010_basic_portals/long_infoname.py,sha256=KXOmHfQ_5hdZNqfB3Cif2CQiZ3XI3UAOEXKl3DLLYF4,1366
7
- pythagoras/_010_basic_portals/not_picklable_class.py,sha256=hSU069pixbaRaV_TX0KDdy3kupB9GVqkzYwxU9DzEkE,1442
8
6
  pythagoras/_010_basic_portals/portal_tester.py,sha256=x6HiJ3GW9XWplnsT6Ob7QCy2J_JPgGpdaJ8QRyFH-e8,3353
9
7
  pythagoras/_010_basic_portals/post_init_metaclass.py,sha256=94FEVMCJBUReRb-fo2-LW8YWXUXw5lLLYlXMnlxHJuU,1495
10
- pythagoras/_020_ordinary_code_portals/.DS_Store,sha256=16GbH9SWbcO6wuvkCY8k-8Pj5K_nF4povX7lcKOEOrY,8196
11
8
  pythagoras/_020_ordinary_code_portals/__init__.py,sha256=p3kSqaQYj0xlhk9BwptFgA1USdTbfHkAB5Q9MH-ANI0,1295
12
9
  pythagoras/_020_ordinary_code_portals/code_normalizer.py,sha256=7L3P5AaZKS9IPqrIEv5UJc3HHDP48fw6EGQWXZcxQtM,5004
13
10
  pythagoras/_020_ordinary_code_portals/function_processing.py,sha256=rlhB0dpaUztv6SM2wlUdaUdETcV2pVUICYufVrQCRcc,3623
14
11
  pythagoras/_020_ordinary_code_portals/ordinary_decorator.py,sha256=J4qx03NEEgpYWvg4D8UkAL0PdtAt2sQyMN1op6LMFsA,1028
15
12
  pythagoras/_020_ordinary_code_portals/ordinary_portal_core_classes.py,sha256=bY2Hzy19lTezv96dSc1l5SsaGxNkMTOq8IsfnkdV1wY,9743
16
- pythagoras/_030_data_portals/.DS_Store,sha256=9flOwntPyYLLwCTCE5bdQLps9o3GYwoKUQPHeY96XMo,6148
17
13
  pythagoras/_030_data_portals/__init__.py,sha256=f_F9DCmuVgPMgzwRjuNj6FI63S3oXu7lj3zU66Nw7Hc,1427
18
- pythagoras/_030_data_portals/data_portal_core_classes.py,sha256=_K7diNol7Wl0YLUI2VC3cn7djm0wFQ7rcvflpyIP84w,20420
14
+ pythagoras/_030_data_portals/data_portal_core_classes.py,sha256=CJmJD2uzZwDuk8lQEJbpWAtN25UF57tkKYTot_yZmfo,20418
19
15
  pythagoras/_030_data_portals/ready_and_get.py,sha256=UKiQHkLhdAdvEwP5BTdoAnp4XEs7HDGx6026M2eMuc0,2842
20
16
  pythagoras/_030_data_portals/storable_decorator.py,sha256=l8W3GhVmIscgjoCTGq3tmdehKGDLIVnFbTM-GW-1G4g,578
21
- pythagoras/_040_logging_code_portals/.DS_Store,sha256=RsjvHGpmn53BwBQmcJAkfxm1gTuS6uAiL2DzJJymb_I,6148
22
17
  pythagoras/_040_logging_code_portals/__init__.py,sha256=q2hVyOVgE-9Ru3ycilK98YS9Rat8tSc6erd7AtGxpaA,996
23
18
  pythagoras/_040_logging_code_portals/exception_processing_tracking.py,sha256=sU-FCayvppF6gafBRAKsJcMC0JMBcnCCiLzu3yFmxiA,778
24
19
  pythagoras/_040_logging_code_portals/execution_environment_summary.py,sha256=hTvTbadYAtisZ4H8rq-n_hsKPCS38jsSz8lw_A1DIqY,2268
25
20
  pythagoras/_040_logging_code_portals/kw_args.py,sha256=4EYpPrr2xCgFAarmdFRKlEvGhIHC9kk9kc-VPW4S-XA,2717
26
21
  pythagoras/_040_logging_code_portals/logging_decorator.py,sha256=079w2_Z5HhXFLrgyXQekjuOby9CdUgFUGRbRT5lpujU,891
27
- pythagoras/_040_logging_code_portals/logging_portal_core_classes.py,sha256=lVYO0NmTbgGOwi1dx0qJIrJPuDjX1-DBBED6CRe6Jj8,21972
22
+ pythagoras/_040_logging_code_portals/logging_portal_core_classes.py,sha256=FZ_tFg6tVO-kCCXR3X9FLLXxe_5M7tHtkrSmyYhM9f4,21953
28
23
  pythagoras/_040_logging_code_portals/notebook_checker.py,sha256=5lQJDIDzhRIRSmX1T88nAREMEMoDDFf0OIKcvTpnhzk,541
29
24
  pythagoras/_040_logging_code_portals/output_capturer.py,sha256=ohCp6qqxL7IuJGfnFuCIgj5Oc4HmC8c7uZGE_uzWkZk,4216
30
25
  pythagoras/_040_logging_code_portals/uncaught_exceptions.py,sha256=B3bPvX5nnJJx4JjLSGdl1xXOBU2pqo3CP-MomJAfXaE,3121
31
- pythagoras/_050_safe_code_portals/.DS_Store,sha256=QTfd3CjdIT5D3IfCl9k-I23xwJsRUDWszBkAIqe4Ino,6148
32
26
  pythagoras/_050_safe_code_portals/__init__.py,sha256=YR-V6W2WZ17SjqmTyY2xdY16xTVEEuLs2MddJj_WCZU,557
33
27
  pythagoras/_050_safe_code_portals/safe_decorator.py,sha256=ZTsIMmtb3eGAWSpwdMYXRmIyaJiqV6mdFbB_Mqng784,804
34
28
  pythagoras/_050_safe_code_portals/safe_portal_core_classes.py,sha256=G1jYgKaOzkzYxIBMvlLYKMPk2OOpK_SQzMQVsHfBJqY,2562
35
- pythagoras/_060_autonomous_code_portals/.DS_Store,sha256=vpgKPXuQXZ0Iby1X6z5LaaYeHbfUAoHcqCIduOaRQ_I,8196
36
29
  pythagoras/_060_autonomous_code_portals/__init__.py,sha256=hnv_dxxRx8c7IDf1QgVYHfYoeVAz8oD9K0oWI_o9N20,1704
37
30
  pythagoras/_060_autonomous_code_portals/autonomous_decorators.py,sha256=diWX03jZaInc55jAg391ZRBh-St5exJRLDZiS7dqYvg,2895
38
31
  pythagoras/_060_autonomous_code_portals/autonomous_portal_core_classes.py,sha256=21JNwBgEoIHXwCrBPb_eN5vMaHTZ98LdFkHuaMHtkI0,6665
39
32
  pythagoras/_060_autonomous_code_portals/names_usage_analyzer.py,sha256=mqrzAQw3tGxPYXsMA8E0fhhIpJopvRFrzkc1MVSsPXQ,7474
40
- pythagoras/_070_protected_code_portals/.DS_Store,sha256=1lFlJ5EFymdzGAUAaI30vcaaLHt3F1LwpG7xILf9jsM,6148
41
33
  pythagoras/_070_protected_code_portals/__init__.py,sha256=TvGcJaz20Qqsmv8m2pA4duBtFn_CdCKfkSbOSFoJS8k,989
42
34
  pythagoras/_070_protected_code_portals/basic_pre_validators.py,sha256=6wrWKumBr2eyEhqpzZv8UlcX0WwUnAUzQ9D4cFyx1OE,2067
43
35
  pythagoras/_070_protected_code_portals/fn_arg_names_checker.py,sha256=6FjOUJmGgDCjkFcXf5Ook-E9eiEFguarY2qqzOyJj7A,1230
@@ -47,31 +39,26 @@ pythagoras/_070_protected_code_portals/protected_decorators.py,sha256=5Y62rswuD7
47
39
  pythagoras/_070_protected_code_portals/protected_portal_core_classes.py,sha256=ZTSD6m9HGTJDa9WuInb-0wqzP8NzaoIqWapg9XUXD-E,13583
48
40
  pythagoras/_070_protected_code_portals/system_utils.py,sha256=h4oiEQFAyFKzqvd0ywwAI0WDYKSuIh_vif86XQIXYwE,2360
49
41
  pythagoras/_070_protected_code_portals/validation_succesful_const.py,sha256=4NWGwN5Gu6kbbHTMkmJs8Ym0rFee_cIE2VlAPonmlJI,298
50
- pythagoras/_080_pure_code_portals/.DS_Store,sha256=7Hw2ywKd2_cT6DdEeFusb8FikZadNTywabAGqDpOvaw,6148
51
42
  pythagoras/_080_pure_code_portals/__init__.py,sha256=OI7836lLHT51SYdFfmWp4GdGRgcAkpLiAj-Zj_g2Gxo,1052
52
43
  pythagoras/_080_pure_code_portals/pure_core_classes.py,sha256=6AjtE9QdiG84e9WuJtsrvkuHTRC4MovC31xItGn2PD8,20455
53
44
  pythagoras/_080_pure_code_portals/pure_decorator.py,sha256=WHZQzmyxgCpALHrqfeiOMrM6TDkZcv0Y2b756ez4Q2k,2279
54
- pythagoras/_080_pure_code_portals/recursion_pre_validator.py,sha256=RT-v4vPACSUtqz3e80ZW08RuJm9EoYRLbLBPSgJF7gg,2036
55
- pythagoras/_090_swarming_portals/.DS_Store,sha256=ej2yPeAYBAemK4O3B-CM7evu22Yes4SvpAs3z9L4Wd0,6148
45
+ pythagoras/_080_pure_code_portals/recursion_pre_validator.py,sha256=n03ooGISJvuwNWteBN9t7CFFSLYAu86AHHFJVcywPqg,1865
56
46
  pythagoras/_090_swarming_portals/__init__.py,sha256=TuA17PftTBudptAblNtBlD46BqUiitksOtf3y01QKm0,514
57
47
  pythagoras/_090_swarming_portals/output_suppressor.py,sha256=ENRtQtK_-7A94lAqtUQsIWrvtcgKniEpaWcZZZrpfQM,611
58
- pythagoras/_090_swarming_portals/swarming_portals.py,sha256=NxZmrUw450lJw24OqYD0dCt9qO-ADegMIc9U5wFcB-o,12784
59
- pythagoras/_100_top_level_API/.DS_Store,sha256=1lFlJ5EFymdzGAUAaI30vcaaLHt3F1LwpG7xILf9jsM,6148
48
+ pythagoras/_090_swarming_portals/swarming_portals.py,sha256=ZZuzkAf4Ls9oZyg_yUbj3kEEmXGTPjTCevVh-w7AAkE,12784
60
49
  pythagoras/_100_top_level_API/__init__.py,sha256=s5LtwskY2nwkRPFKzP0PrCzQ1c9oScZO0kM9_bWLi3U,64
61
50
  pythagoras/_100_top_level_API/default_local_portal.py,sha256=SnykTpTXg1KuT1qwDnrAZ63lYshMy-0nNiUgoOVMxCs,339
62
51
  pythagoras/_100_top_level_API/top_level_API.py,sha256=S2NXW4bfL98o6Txn6NM0EeBb1nzwFtPSl-yWNevAQIE,906
63
- pythagoras/_800_signatures_and_converters/.DS_Store,sha256=1lFlJ5EFymdzGAUAaI30vcaaLHt3F1LwpG7xILf9jsM,6148
64
52
  pythagoras/_800_signatures_and_converters/__init__.py,sha256=WAzpPe8fsh_w_7HhVxJZLBid7gxnW3pmPZW86fYnJjk,166
65
53
  pythagoras/_800_signatures_and_converters/base_16_32_convertors.py,sha256=ZjVtKjjjMgMgHUhM-1Q9qLYWCDKhllqq9z4YgKL0qCg,1236
66
54
  pythagoras/_800_signatures_and_converters/current_date_gmt_str.py,sha256=K-rGHyrREsyBdYMq7vWrv3FdAacepWQpvOfT_mrZqNM,268
67
55
  pythagoras/_800_signatures_and_converters/hash_signatures.py,sha256=AsUID_Z7yeF06Jmk8kKAFXIuxoF0hN0OwOS1T5nu7_k,989
68
56
  pythagoras/_800_signatures_and_converters/node_signature.py,sha256=pSZ4yB4aXNH6yhizQ6Z3m4uRcuDNkr_-lZ8024NbZ7w,592
69
57
  pythagoras/_800_signatures_and_converters/random_signatures.py,sha256=wXTyjATM8IwMXq2vHhoAq6T-yI7DcN72Svyt05EjFBo,323
70
- pythagoras/_900_project_stats_collector/.DS_Store,sha256=1lFlJ5EFymdzGAUAaI30vcaaLHt3F1LwpG7xILf9jsM,6148
71
58
  pythagoras/_900_project_stats_collector/__init__.py,sha256=Eagt-BhPPtBGgpMywx2lkLDK1603Y9t_QBdtHKUHHFY,71
72
59
  pythagoras/_900_project_stats_collector/project_analyzer.py,sha256=uhycFKjUIXEpYcZYnak3yn4JFhchl-oZ7wt6spFxhoY,3574
73
60
  pythagoras/__init__.py,sha256=TMPtJdSi_WShCpJnsVVdO48Wcvs78GMbUi5gHc1eMLw,1233
74
61
  pythagoras/core/__init__.py,sha256=cXtQ-Vbm8TqzazvkFws5cV3AEEYbEKzNXYeuHeLGFK0,328
75
- pythagoras-0.24.1.dist-info/WHEEL,sha256=n2u5OFBbdZvCiUKAmfnY1Po2j3FB_NWfuUlt5WiAjrk,79
76
- pythagoras-0.24.1.dist-info/METADATA,sha256=JuDNan166nhI1rLSyATrObrTOxPtQZSrKUuvi4lJgh4,7467
77
- pythagoras-0.24.1.dist-info/RECORD,,
62
+ pythagoras-0.24.3.dist-info/WHEEL,sha256=X16MKk8bp2DRsAuyteHJ-9qOjzmnY0x1aj0P1ftqqWA,78
63
+ pythagoras-0.24.3.dist-info/METADATA,sha256=tOfVHjizrk-0w3mhvbdhqpSNY-z3U_BhhMuYsa-CCVE,7467
64
+ pythagoras-0.24.3.dist-info/RECORD,,
@@ -1,4 +1,4 @@
1
1
  Wheel-Version: 1.0
2
- Generator: uv 0.8.23
2
+ Generator: uv 0.9.2
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
Binary file
@@ -1,36 +0,0 @@
1
- class NotPicklable:
2
- """A mixin class that prevents objects from being pickled or unpickled.
3
-
4
- This class provides a mechanism to explicitly prevent instances from being
5
- serialized using Python's pickle module. Classes that inherit from this
6
- mixin will raise TypeError exceptions when pickle attempts to serialize
7
- or deserialize them.
8
-
9
- This is useful for objects that contain non-serializable resources or
10
- should not be persisted for security or architectural reasons.
11
- """
12
-
13
- def __getstate__(self):
14
- """Prevent object serialization by raising TypeError.
15
-
16
- This method is called by pickle when attempting to serialize the object.
17
- It unconditionally raises a TypeError to prevent pickling.
18
-
19
- Raises:
20
- TypeError: Always raised to prevent the object from being pickled.
21
- """
22
- raise TypeError(f"{type(self).__name__} cannot be pickled")
23
-
24
- def __setstate__(self, state):
25
- """Prevent object deserialization by raising TypeError.
26
-
27
- This method is called by pickle when attempting to deserialize the object.
28
- It unconditionally raises a TypeError to prevent unpickling.
29
-
30
- Args:
31
- state: The state dictionary that would be used for unpickling.
32
-
33
- Raises:
34
- TypeError: Always raised to prevent the object from being unpickled.
35
- """
36
- raise TypeError(f"{type(self).__name__} cannot be unpickled")
Binary file
Binary file
Binary file
Binary file
Binary file