pythagoras 0.24.0__py3-none-any.whl → 0.24.1__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
Binary file
@@ -14,6 +14,7 @@ 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
18
  from parameterizable import ParameterizableClass, sort_dict_by_keys
18
19
 
19
20
  from persidict import PersiDict, FileDirDict, SafeStrTuple
@@ -376,7 +377,10 @@ class BasicPortal(NotPicklable,ParameterizableClass, metaclass = PostInitMeta):
376
377
  It's an internal hash used by Pythagoras and is different from .__hash__()
377
378
  """
378
379
  if not hasattr(self,"_str_id_cache"):
379
- params = self.get_portable_params()
380
+ params = self.get_params()
381
+ jsparams = parameterizable.dumpjs(params)
382
+ param_names = set(params.keys())
383
+ params = parameterizable.access_jsparams(jsparams, *param_names)
380
384
  ephemeral_names = self._ephemeral_param_names
381
385
  nonephemeral_params = {k:params[k] for k in params
382
386
  if k not in ephemeral_names}
Binary file
@@ -5,7 +5,7 @@ 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 register_parameterizable_class
9
9
  from persidict import PersiDict, KEEP_CURRENT, Joker
10
10
 
11
11
  from .._010_basic_portals import NotPicklable, get_active_portal
@@ -611,7 +611,7 @@ class LoggingCodePortal(DataPortal):
611
611
  super()._clear()
612
612
 
613
613
 
614
- register_parameterizable_class(LoggingCodePortal)
614
+ # register_parameterizable_class(LoggingCodePortal)
615
615
 
616
616
 
617
617
  def log_exception() -> None:
@@ -15,7 +15,7 @@ from __future__ import annotations
15
15
 
16
16
  from typing import Callable
17
17
 
18
- from parameterizable import register_parameterizable_class
18
+ # from parameterizable import register_parameterizable_class
19
19
  from persidict import PersiDict, Joker, KEEP_CURRENT
20
20
 
21
21
  from .._040_logging_code_portals.logging_portal_core_classes import *
@@ -80,4 +80,4 @@ class SafeFn(LoggingFn):
80
80
  return SafeFnCallSignature(fn=self, arguments=arguments)
81
81
 
82
82
 
83
- register_parameterizable_class(SafeCodePortal)
83
+ # register_parameterizable_class(SafeCodePortal)
@@ -20,12 +20,17 @@ 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}:
23
+ if param_value in {0,1,2,3,4}:
24
24
  return pth.VALIDATION_SUCCESSFUL
25
-
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
+
26
32
  # Binary search to find the smallest n where result_addr.ready is not True
27
- left, right = 2, param_value - 1
28
- result = pth.VALIDATION_SUCCESSFUL # Default result if all are ready
33
+ left, right = 2, param_value - 2
29
34
 
30
35
  while left <= right:
31
36
  mid = (left + right) // 2
@@ -42,7 +47,6 @@ def _recursion_pre_validator(
42
47
  # Result is ready, search in the right half
43
48
  left = mid + 1
44
49
 
45
-
46
50
  return result
47
51
 
48
52
 
@@ -1,23 +1,18 @@
1
1
  import os
2
- import sys
2
+ from contextlib import ExitStack, redirect_stderr, redirect_stdout
3
+
3
4
 
4
5
 
5
6
  class OutputSuppressor:
6
7
  """A context manager that suppresses stdout and stderr output."""
7
- def __init__(self):
8
- pass
9
8
 
10
9
  def __enter__(self):
11
10
  """Redirect stdout and stderr to os.devnull."""
12
- self.old_stdout = sys.stdout
13
- self.old_stderr = sys.stderr
14
- self.devnull = open(os.devnull, 'w')
15
- sys.stdout = self.devnull
16
- sys.stderr = self.devnull
11
+ self._stack = ExitStack()
12
+ devnull = self._stack.enter_context(open(os.devnull, "w"))
13
+ self._stack.enter_context(redirect_stdout(devnull))
14
+ self._stack.enter_context(redirect_stderr(devnull))
17
15
  return self
18
16
 
19
17
  def __exit__(self, exc_type, exc_val, exc_tb):
20
- sys.stdout = self.old_stdout
21
- sys.stderr = self.old_stderr
22
- if self.devnull:
23
- self.devnull.close()
18
+ return self._stack.__exit__(exc_type, exc_val, exc_tb)
@@ -12,13 +12,19 @@ at least once but does not offer any further guarantees.
12
12
  from __future__ import annotations
13
13
 
14
14
  import atexit
15
+ import json
15
16
  from time import sleep
16
17
 
17
18
  import pandas as pd
18
19
  import parameterizable
19
- from parameterizable import sort_dict_by_keys
20
+ from parameterizable import (
21
+ sort_dict_by_keys,
22
+ update_jsparams,
23
+ access_jsparams)
20
24
  from persidict import PersiDict, Joker, KEEP_CURRENT
21
25
 
26
+ from parameterizable.json_processor import _Markers
27
+
22
28
  from .. import VALIDATION_SUCCESSFUL
23
29
  from .._010_basic_portals import get_all_known_portals
24
30
  from .._070_protected_code_portals.system_utils import get_unused_ram_mb, get_unused_cpu_cores, process_is_active, \
@@ -88,6 +94,14 @@ class SwarmingPortal(PureCodePortal):
88
94
  self._child_process = None
89
95
 
90
96
 
97
+ def get_params(self) -> dict:
98
+ params = super().get_params()
99
+ params["parent_process_id"] = self._parent_process_id
100
+ params["parent_process_start_time"] = self._parent_process_start_time
101
+ sorted_params = sort_dict_by_keys(params)
102
+ return sorted_params
103
+
104
+
91
105
  @property
92
106
  def is_parent(self) -> bool:
93
107
  """Check if this portal is the parent process."""
@@ -106,14 +120,14 @@ class SwarmingPortal(PureCodePortal):
106
120
  if self.is_parent:
107
121
  if self.max_n_workers > 0:
108
122
 
109
- portal_init_params = self.get_portable_params()
110
- portal_init_params["max_n_workers"] = self.max_n_workers
111
- portal_init_params = sort_dict_by_keys(portal_init_params)
123
+ portal_init_jsparams = parameterizable.dumpjs(self)
124
+ portal_init_jsparams = update_jsparams(portal_init_jsparams,
125
+ max_n_workers = self.max_n_workers)
112
126
 
113
127
  ctx = get_context("spawn")
114
128
  self._child_process = ctx.Process(
115
129
  target=_launch_many_background_workers
116
- , kwargs=portal_init_params)
130
+ , args=(portal_init_jsparams,))
117
131
  self._child_process.start()
118
132
 
119
133
 
@@ -198,22 +212,22 @@ class SwarmingPortal(PureCodePortal):
198
212
  del self._max_n_workers_cache
199
213
  super()._invalidate_cache()
200
214
 
201
- parameterizable.register_parameterizable_class(SwarmingPortal)
215
+ # parameterizable.register_parameterizable_class(SwarmingPortal)
202
216
 
203
217
 
204
- def _launch_many_background_workers(**portal_init_params) -> None:
218
+ def _launch_many_background_workers(portal_init_jsparams:JsonSerializedParams) -> None:
205
219
  """Launch many background worker processes."""
206
- n_workers_to_launch = portal_init_params["max_n_workers"]
220
+
221
+
222
+ n_workers_to_launch = access_jsparams(portal_init_jsparams
223
+ , "max_n_workers")["max_n_workers"]
207
224
  n_workers_to_launch = int(n_workers_to_launch)
208
225
 
209
- portal_init_params["max_n_workers"] = 0
210
- current_process_id = get_current_process_id()
211
- portal_init_params["parent_process_id"] = current_process_id
212
- portal_init_params["parent_process_start_time"
213
- ] = get_current_process_start_time()
214
- portal_init_params = sort_dict_by_keys(portal_init_params)
215
- portal = parameterizable.get_object_from_portable_params(
216
- portal_init_params)
226
+ portal_init_jsparams = update_jsparams(portal_init_jsparams,
227
+ max_n_workers=0, parent_process_id = get_current_process_id(),
228
+ parent_process_start_time = get_current_process_start_time())
229
+
230
+ portal = parameterizable.loadjs(portal_init_jsparams)
217
231
  assert isinstance(portal, SwarmingPortal)
218
232
 
219
233
  summary = build_execution_environment_summary()
@@ -226,7 +240,7 @@ def _launch_many_background_workers(**portal_init_params) -> None:
226
240
  portal._randomly_delay_execution(p=1)
227
241
  ctx = get_context("spawn")
228
242
  try:
229
- p = ctx.Process(target=_background_worker, kwargs=portal_init_params)
243
+ p = ctx.Process(target=_background_worker, args=(portal_init_jsparams,))
230
244
  p.start()
231
245
  list_of_all_workers.append(p)
232
246
  except Exception as e:
@@ -243,7 +257,7 @@ def _launch_many_background_workers(**portal_init_params) -> None:
243
257
  portal._randomly_delay_execution(p=1)
244
258
  ctx = get_context("spawn")
245
259
  try:
246
- p = ctx.Process(target=_background_worker, kwargs=portal_init_params)
260
+ p = ctx.Process(target=_background_worker, args=(portal_init_jsparams,))
247
261
  p.start()
248
262
  new_list_of_all_workers.append(p)
249
263
  except Exception as e:
@@ -251,10 +265,9 @@ def _launch_many_background_workers(**portal_init_params) -> None:
251
265
  list_of_all_workers = new_list_of_all_workers
252
266
 
253
267
 
254
- def _background_worker(**portal_init_params) -> None:
268
+ def _background_worker(portal_init_jsparams:JsonSerializedParams) -> None:
255
269
  """Background worker that keeps processing random execution requests."""
256
- portal = parameterizable.get_object_from_portable_params(
257
- portal_init_params)
270
+ portal = parameterizable.loadjs(portal_init_jsparams)
258
271
  assert isinstance(portal, SwarmingPortal)
259
272
  with portal:
260
273
  ctx = get_context("spawn")
@@ -264,16 +277,19 @@ def _background_worker(**portal_init_params) -> None:
264
277
  return
265
278
  p = ctx.Process(
266
279
  target=_process_random_execution_request
267
- , kwargs=portal_init_params)
280
+ , args=(portal_init_jsparams,))
268
281
  p.start()
269
282
  p.join()
270
283
  portal._randomly_delay_execution()
271
284
 
272
285
 
273
- def _process_random_execution_request(**portal_init_params):
286
+ def _process_random_execution_request(portal_init_jsparams:JsonSerializedParams):
274
287
  """Process one random execution request."""
275
- portal = parameterizable.get_object_from_portable_params(
276
- portal_init_params)
288
+ # portal = parameterizable.get_object_from_portable_params(
289
+ # portal_init_params)
290
+ portal_init_jsparams = update_jsparams(
291
+ portal_init_jsparams, max_n_workers=0)
292
+ portal = parameterizable.loadjs(portal_init_jsparams)
277
293
  assert isinstance(portal, SwarmingPortal)
278
294
  with portal:
279
295
  call_signature:PureFnCallSignature|None = None
Binary file
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: pythagoras
3
- Version: 0.24.0
3
+ Version: 0.24.1
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,8 +16,7 @@ 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: parameterizable
20
- Requires-Dist: persidict
19
+ Requires-Dist: persidict==0.104.1
21
20
  Requires-Dist: lz4
22
21
  Requires-Dist: joblib
23
22
  Requires-Dist: scikit-learn
@@ -32,6 +31,7 @@ Requires-Dist: boto3
32
31
  Requires-Dist: moto
33
32
  Requires-Dist: uv
34
33
  Requires-Dist: nvidia-ml-py
34
+ Requires-Dist: parameterizable==0.100.0
35
35
  Requires-Dist: persidict[aws] ; extra == 'aws'
36
36
  Requires-Dist: boto3 ; extra == 'aws'
37
37
  Requires-Dist: moto ; extra == 'aws'
@@ -1,36 +1,43 @@
1
- pythagoras/.DS_Store,sha256=QNNcLWt_ymcoqL6JxhBobOuDsh4y1v4N3tzxs_WL_a8,6148
1
+ pythagoras/.DS_Store,sha256=5wiLlLmnKc1n5s8_gb9-zTLc63vpMGQMQtrld6M4GP4,8196
2
+ pythagoras/_010_basic_portals/.DS_Store,sha256=SyPTnduZgvgOlrP5Jp0o9nC6pUH7g-BK_aB1_dg3ozQ,6148
2
3
  pythagoras/_010_basic_portals/__init__.py,sha256=ER0kV_th7hba4nXXjoP-joN-cqkUMoH4iRSCgKUP75Y,1703
3
- pythagoras/_010_basic_portals/basic_portal_core_classes.py,sha256=2Hh9mEb0k0YKKl6sDiOINLk4EspBIbn2oR-1xGyUFFA,24568
4
+ pythagoras/_010_basic_portals/basic_portal_core_classes.py,sha256=Mknyv2O5JWvpfplwCXIR6zY3kBBy2vVcP8bmj27YcLw,24758
4
5
  pythagoras/_010_basic_portals/exceptions.py,sha256=CMtSyRb47YKZtANN-iCQBvvyYPKdKqomLygRE1fjSNk,1248
5
6
  pythagoras/_010_basic_portals/long_infoname.py,sha256=KXOmHfQ_5hdZNqfB3Cif2CQiZ3XI3UAOEXKl3DLLYF4,1366
6
7
  pythagoras/_010_basic_portals/not_picklable_class.py,sha256=hSU069pixbaRaV_TX0KDdy3kupB9GVqkzYwxU9DzEkE,1442
7
8
  pythagoras/_010_basic_portals/portal_tester.py,sha256=x6HiJ3GW9XWplnsT6Ob7QCy2J_JPgGpdaJ8QRyFH-e8,3353
8
9
  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
9
11
  pythagoras/_020_ordinary_code_portals/__init__.py,sha256=p3kSqaQYj0xlhk9BwptFgA1USdTbfHkAB5Q9MH-ANI0,1295
10
12
  pythagoras/_020_ordinary_code_portals/code_normalizer.py,sha256=7L3P5AaZKS9IPqrIEv5UJc3HHDP48fw6EGQWXZcxQtM,5004
11
13
  pythagoras/_020_ordinary_code_portals/function_processing.py,sha256=rlhB0dpaUztv6SM2wlUdaUdETcV2pVUICYufVrQCRcc,3623
12
14
  pythagoras/_020_ordinary_code_portals/ordinary_decorator.py,sha256=J4qx03NEEgpYWvg4D8UkAL0PdtAt2sQyMN1op6LMFsA,1028
13
15
  pythagoras/_020_ordinary_code_portals/ordinary_portal_core_classes.py,sha256=bY2Hzy19lTezv96dSc1l5SsaGxNkMTOq8IsfnkdV1wY,9743
16
+ pythagoras/_030_data_portals/.DS_Store,sha256=9flOwntPyYLLwCTCE5bdQLps9o3GYwoKUQPHeY96XMo,6148
14
17
  pythagoras/_030_data_portals/__init__.py,sha256=f_F9DCmuVgPMgzwRjuNj6FI63S3oXu7lj3zU66Nw7Hc,1427
15
18
  pythagoras/_030_data_portals/data_portal_core_classes.py,sha256=_K7diNol7Wl0YLUI2VC3cn7djm0wFQ7rcvflpyIP84w,20420
16
19
  pythagoras/_030_data_portals/ready_and_get.py,sha256=UKiQHkLhdAdvEwP5BTdoAnp4XEs7HDGx6026M2eMuc0,2842
17
20
  pythagoras/_030_data_portals/storable_decorator.py,sha256=l8W3GhVmIscgjoCTGq3tmdehKGDLIVnFbTM-GW-1G4g,578
21
+ pythagoras/_040_logging_code_portals/.DS_Store,sha256=RsjvHGpmn53BwBQmcJAkfxm1gTuS6uAiL2DzJJymb_I,6148
18
22
  pythagoras/_040_logging_code_portals/__init__.py,sha256=q2hVyOVgE-9Ru3ycilK98YS9Rat8tSc6erd7AtGxpaA,996
19
23
  pythagoras/_040_logging_code_portals/exception_processing_tracking.py,sha256=sU-FCayvppF6gafBRAKsJcMC0JMBcnCCiLzu3yFmxiA,778
20
24
  pythagoras/_040_logging_code_portals/execution_environment_summary.py,sha256=hTvTbadYAtisZ4H8rq-n_hsKPCS38jsSz8lw_A1DIqY,2268
21
25
  pythagoras/_040_logging_code_portals/kw_args.py,sha256=4EYpPrr2xCgFAarmdFRKlEvGhIHC9kk9kc-VPW4S-XA,2717
22
26
  pythagoras/_040_logging_code_portals/logging_decorator.py,sha256=079w2_Z5HhXFLrgyXQekjuOby9CdUgFUGRbRT5lpujU,891
23
- pythagoras/_040_logging_code_portals/logging_portal_core_classes.py,sha256=8jDjprlnpo7cXW9dhv-VdVF8eCMRRRTPZngol5xjiqw,21968
27
+ pythagoras/_040_logging_code_portals/logging_portal_core_classes.py,sha256=lVYO0NmTbgGOwi1dx0qJIrJPuDjX1-DBBED6CRe6Jj8,21972
24
28
  pythagoras/_040_logging_code_portals/notebook_checker.py,sha256=5lQJDIDzhRIRSmX1T88nAREMEMoDDFf0OIKcvTpnhzk,541
25
29
  pythagoras/_040_logging_code_portals/output_capturer.py,sha256=ohCp6qqxL7IuJGfnFuCIgj5Oc4HmC8c7uZGE_uzWkZk,4216
26
30
  pythagoras/_040_logging_code_portals/uncaught_exceptions.py,sha256=B3bPvX5nnJJx4JjLSGdl1xXOBU2pqo3CP-MomJAfXaE,3121
31
+ pythagoras/_050_safe_code_portals/.DS_Store,sha256=QTfd3CjdIT5D3IfCl9k-I23xwJsRUDWszBkAIqe4Ino,6148
27
32
  pythagoras/_050_safe_code_portals/__init__.py,sha256=YR-V6W2WZ17SjqmTyY2xdY16xTVEEuLs2MddJj_WCZU,557
28
33
  pythagoras/_050_safe_code_portals/safe_decorator.py,sha256=ZTsIMmtb3eGAWSpwdMYXRmIyaJiqV6mdFbB_Mqng784,804
29
- pythagoras/_050_safe_code_portals/safe_portal_core_classes.py,sha256=KCQ-7AzpTSSG17ud9IjkiZW6oX-ydy0rVbxA7AmxyAs,2558
34
+ 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
30
36
  pythagoras/_060_autonomous_code_portals/__init__.py,sha256=hnv_dxxRx8c7IDf1QgVYHfYoeVAz8oD9K0oWI_o9N20,1704
31
37
  pythagoras/_060_autonomous_code_portals/autonomous_decorators.py,sha256=diWX03jZaInc55jAg391ZRBh-St5exJRLDZiS7dqYvg,2895
32
38
  pythagoras/_060_autonomous_code_portals/autonomous_portal_core_classes.py,sha256=21JNwBgEoIHXwCrBPb_eN5vMaHTZ98LdFkHuaMHtkI0,6665
33
39
  pythagoras/_060_autonomous_code_portals/names_usage_analyzer.py,sha256=mqrzAQw3tGxPYXsMA8E0fhhIpJopvRFrzkc1MVSsPXQ,7474
40
+ pythagoras/_070_protected_code_portals/.DS_Store,sha256=1lFlJ5EFymdzGAUAaI30vcaaLHt3F1LwpG7xILf9jsM,6148
34
41
  pythagoras/_070_protected_code_portals/__init__.py,sha256=TvGcJaz20Qqsmv8m2pA4duBtFn_CdCKfkSbOSFoJS8k,989
35
42
  pythagoras/_070_protected_code_portals/basic_pre_validators.py,sha256=6wrWKumBr2eyEhqpzZv8UlcX0WwUnAUzQ9D4cFyx1OE,2067
36
43
  pythagoras/_070_protected_code_portals/fn_arg_names_checker.py,sha256=6FjOUJmGgDCjkFcXf5Ook-E9eiEFguarY2qqzOyJj7A,1230
@@ -40,26 +47,31 @@ pythagoras/_070_protected_code_portals/protected_decorators.py,sha256=5Y62rswuD7
40
47
  pythagoras/_070_protected_code_portals/protected_portal_core_classes.py,sha256=ZTSD6m9HGTJDa9WuInb-0wqzP8NzaoIqWapg9XUXD-E,13583
41
48
  pythagoras/_070_protected_code_portals/system_utils.py,sha256=h4oiEQFAyFKzqvd0ywwAI0WDYKSuIh_vif86XQIXYwE,2360
42
49
  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
43
51
  pythagoras/_080_pure_code_portals/__init__.py,sha256=OI7836lLHT51SYdFfmWp4GdGRgcAkpLiAj-Zj_g2Gxo,1052
44
52
  pythagoras/_080_pure_code_portals/pure_core_classes.py,sha256=6AjtE9QdiG84e9WuJtsrvkuHTRC4MovC31xItGn2PD8,20455
45
53
  pythagoras/_080_pure_code_portals/pure_decorator.py,sha256=WHZQzmyxgCpALHrqfeiOMrM6TDkZcv0Y2b756ez4Q2k,2279
46
- pythagoras/_080_pure_code_portals/recursion_pre_validator.py,sha256=n03ooGISJvuwNWteBN9t7CFFSLYAu86AHHFJVcywPqg,1865
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
47
56
  pythagoras/_090_swarming_portals/__init__.py,sha256=TuA17PftTBudptAblNtBlD46BqUiitksOtf3y01QKm0,514
48
- pythagoras/_090_swarming_portals/output_suppressor.py,sha256=g-bMm8xioia6uxFlkS71CV6pSEmc5RNqdRasi1RSJgc,626
49
- pythagoras/_090_swarming_portals/swarming_portals.py,sha256=YKs7JDUp7ifqZSSkkAVkJ73IdyxCwkvArQW9C-cCIfk,12286
57
+ 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
50
60
  pythagoras/_100_top_level_API/__init__.py,sha256=s5LtwskY2nwkRPFKzP0PrCzQ1c9oScZO0kM9_bWLi3U,64
51
61
  pythagoras/_100_top_level_API/default_local_portal.py,sha256=SnykTpTXg1KuT1qwDnrAZ63lYshMy-0nNiUgoOVMxCs,339
52
62
  pythagoras/_100_top_level_API/top_level_API.py,sha256=S2NXW4bfL98o6Txn6NM0EeBb1nzwFtPSl-yWNevAQIE,906
63
+ pythagoras/_800_signatures_and_converters/.DS_Store,sha256=1lFlJ5EFymdzGAUAaI30vcaaLHt3F1LwpG7xILf9jsM,6148
53
64
  pythagoras/_800_signatures_and_converters/__init__.py,sha256=WAzpPe8fsh_w_7HhVxJZLBid7gxnW3pmPZW86fYnJjk,166
54
65
  pythagoras/_800_signatures_and_converters/base_16_32_convertors.py,sha256=ZjVtKjjjMgMgHUhM-1Q9qLYWCDKhllqq9z4YgKL0qCg,1236
55
66
  pythagoras/_800_signatures_and_converters/current_date_gmt_str.py,sha256=K-rGHyrREsyBdYMq7vWrv3FdAacepWQpvOfT_mrZqNM,268
56
67
  pythagoras/_800_signatures_and_converters/hash_signatures.py,sha256=AsUID_Z7yeF06Jmk8kKAFXIuxoF0hN0OwOS1T5nu7_k,989
57
68
  pythagoras/_800_signatures_and_converters/node_signature.py,sha256=pSZ4yB4aXNH6yhizQ6Z3m4uRcuDNkr_-lZ8024NbZ7w,592
58
69
  pythagoras/_800_signatures_and_converters/random_signatures.py,sha256=wXTyjATM8IwMXq2vHhoAq6T-yI7DcN72Svyt05EjFBo,323
70
+ pythagoras/_900_project_stats_collector/.DS_Store,sha256=1lFlJ5EFymdzGAUAaI30vcaaLHt3F1LwpG7xILf9jsM,6148
59
71
  pythagoras/_900_project_stats_collector/__init__.py,sha256=Eagt-BhPPtBGgpMywx2lkLDK1603Y9t_QBdtHKUHHFY,71
60
72
  pythagoras/_900_project_stats_collector/project_analyzer.py,sha256=uhycFKjUIXEpYcZYnak3yn4JFhchl-oZ7wt6spFxhoY,3574
61
73
  pythagoras/__init__.py,sha256=TMPtJdSi_WShCpJnsVVdO48Wcvs78GMbUi5gHc1eMLw,1233
62
74
  pythagoras/core/__init__.py,sha256=cXtQ-Vbm8TqzazvkFws5cV3AEEYbEKzNXYeuHeLGFK0,328
63
- pythagoras-0.24.0.dist-info/WHEEL,sha256=-neZj6nU9KAMg2CnCY6T3w8J53nx1kFGw_9HfoSzM60,79
64
- pythagoras-0.24.0.dist-info/METADATA,sha256=oCp51VLtdtZ93XR25Nv-FQIu-VG0rU770nm6WWug_vU,7449
65
- pythagoras-0.24.0.dist-info/RECORD,,
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,,
@@ -1,4 +1,4 @@
1
1
  Wheel-Version: 1.0
2
- Generator: uv 0.8.22
2
+ Generator: uv 0.8.23
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any