pythagoras 0.20.2__tar.gz → 0.20.4__tar.gz

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.
Files changed (66) hide show
  1. {pythagoras-0.20.2 → pythagoras-0.20.4}/PKG-INFO +1 -1
  2. {pythagoras-0.20.2 → pythagoras-0.20.4}/pyproject.toml +1 -1
  3. {pythagoras-0.20.2 → pythagoras-0.20.4}/src/pythagoras/_020_ordinary_code_portals/code_normalizer.py +3 -1
  4. {pythagoras-0.20.2 → pythagoras-0.20.4}/src/pythagoras/_020_ordinary_code_portals/ordinary_portal_core_classes.py +1 -1
  5. {pythagoras-0.20.2 → pythagoras-0.20.4}/src/pythagoras/_060_autonomous_code_portals/autonomous_portal_core_classes.py +1 -1
  6. {pythagoras-0.20.2 → pythagoras-0.20.4}/src/pythagoras/_070_protected_code_portals/RAM_guards.py +2 -2
  7. pythagoras-0.20.4/src/pythagoras/_070_protected_code_portals/package_manager.py +76 -0
  8. pythagoras-0.20.2/src/pythagoras/_070_protected_code_portals/package_manager.py +0 -38
  9. {pythagoras-0.20.2 → pythagoras-0.20.4}/README.md +0 -0
  10. {pythagoras-0.20.2 → pythagoras-0.20.4}/src/pythagoras/_010_basic_portals/__init__.py +0 -0
  11. {pythagoras-0.20.2 → pythagoras-0.20.4}/src/pythagoras/_010_basic_portals/basic_portal_core_classes.py +0 -0
  12. {pythagoras-0.20.2 → pythagoras-0.20.4}/src/pythagoras/_010_basic_portals/exceptions.py +0 -0
  13. {pythagoras-0.20.2 → pythagoras-0.20.4}/src/pythagoras/_010_basic_portals/long_infoname.py +0 -0
  14. {pythagoras-0.20.2 → pythagoras-0.20.4}/src/pythagoras/_010_basic_portals/not_picklable_class.py +0 -0
  15. {pythagoras-0.20.2 → pythagoras-0.20.4}/src/pythagoras/_010_basic_portals/portal_tester.py +0 -0
  16. {pythagoras-0.20.2 → pythagoras-0.20.4}/src/pythagoras/_010_basic_portals/post_init_metaclass.py +0 -0
  17. {pythagoras-0.20.2 → pythagoras-0.20.4}/src/pythagoras/_020_ordinary_code_portals/__init__.py +0 -0
  18. {pythagoras-0.20.2 → pythagoras-0.20.4}/src/pythagoras/_020_ordinary_code_portals/function_processing.py +0 -0
  19. {pythagoras-0.20.2 → pythagoras-0.20.4}/src/pythagoras/_020_ordinary_code_portals/ordinary_decorator.py +0 -0
  20. {pythagoras-0.20.2 → pythagoras-0.20.4}/src/pythagoras/_030_data_portals/__init__.py +0 -0
  21. {pythagoras-0.20.2 → pythagoras-0.20.4}/src/pythagoras/_030_data_portals/data_portal_core_classes.py +0 -0
  22. {pythagoras-0.20.2 → pythagoras-0.20.4}/src/pythagoras/_030_data_portals/ready_and_get.py +0 -0
  23. {pythagoras-0.20.2 → pythagoras-0.20.4}/src/pythagoras/_030_data_portals/storable_decorator.py +0 -0
  24. {pythagoras-0.20.2 → pythagoras-0.20.4}/src/pythagoras/_040_logging_code_portals/__init__.py +0 -0
  25. {pythagoras-0.20.2 → pythagoras-0.20.4}/src/pythagoras/_040_logging_code_portals/exception_processing_tracking.py +0 -0
  26. {pythagoras-0.20.2 → pythagoras-0.20.4}/src/pythagoras/_040_logging_code_portals/execution_environment_summary.py +0 -0
  27. {pythagoras-0.20.2 → pythagoras-0.20.4}/src/pythagoras/_040_logging_code_portals/kw_args.py +0 -0
  28. {pythagoras-0.20.2 → pythagoras-0.20.4}/src/pythagoras/_040_logging_code_portals/logging_decorator.py +0 -0
  29. {pythagoras-0.20.2 → pythagoras-0.20.4}/src/pythagoras/_040_logging_code_portals/logging_portal_core_classes.py +0 -0
  30. {pythagoras-0.20.2 → pythagoras-0.20.4}/src/pythagoras/_040_logging_code_portals/notebook_checker.py +0 -0
  31. {pythagoras-0.20.2 → pythagoras-0.20.4}/src/pythagoras/_040_logging_code_portals/output_capturer.py +0 -0
  32. {pythagoras-0.20.2 → pythagoras-0.20.4}/src/pythagoras/_040_logging_code_portals/uncaught_exceptions.py +0 -0
  33. {pythagoras-0.20.2 → pythagoras-0.20.4}/src/pythagoras/_050_safe_code_portals/__init__.py +0 -0
  34. {pythagoras-0.20.2 → pythagoras-0.20.4}/src/pythagoras/_050_safe_code_portals/safe_decorator.py +0 -0
  35. {pythagoras-0.20.2 → pythagoras-0.20.4}/src/pythagoras/_050_safe_code_portals/safe_portal_core_classes.py +0 -0
  36. {pythagoras-0.20.2 → pythagoras-0.20.4}/src/pythagoras/_060_autonomous_code_portals/__init__.py +0 -0
  37. {pythagoras-0.20.2 → pythagoras-0.20.4}/src/pythagoras/_060_autonomous_code_portals/autonomous_decorators.py +0 -0
  38. {pythagoras-0.20.2 → pythagoras-0.20.4}/src/pythagoras/_060_autonomous_code_portals/names_usage_analyzer.py +0 -0
  39. {pythagoras-0.20.2 → pythagoras-0.20.4}/src/pythagoras/_070_protected_code_portals/GPU_guards.py +0 -0
  40. {pythagoras-0.20.2 → pythagoras-0.20.4}/src/pythagoras/_070_protected_code_portals/OK_const.py +0 -0
  41. {pythagoras-0.20.2 → pythagoras-0.20.4}/src/pythagoras/_070_protected_code_portals/__init__.py +0 -0
  42. {pythagoras-0.20.2 → pythagoras-0.20.4}/src/pythagoras/_070_protected_code_portals/fn_arg_names_checker.py +0 -0
  43. {pythagoras-0.20.2 → pythagoras-0.20.4}/src/pythagoras/_070_protected_code_portals/list_flattener.py +0 -0
  44. {pythagoras-0.20.2 → pythagoras-0.20.4}/src/pythagoras/_070_protected_code_portals/protected_decorators.py +0 -0
  45. {pythagoras-0.20.2 → pythagoras-0.20.4}/src/pythagoras/_070_protected_code_portals/protected_portal_core_classes.py +0 -0
  46. {pythagoras-0.20.2 → pythagoras-0.20.4}/src/pythagoras/_070_protected_code_portals/python_packages_guards.py +0 -0
  47. {pythagoras-0.20.2 → pythagoras-0.20.4}/src/pythagoras/_080_pure_code_portals/__init__.py +0 -0
  48. {pythagoras-0.20.2 → pythagoras-0.20.4}/src/pythagoras/_080_pure_code_portals/pure_core_classes.py +0 -0
  49. {pythagoras-0.20.2 → pythagoras-0.20.4}/src/pythagoras/_080_pure_code_portals/pure_decorator.py +0 -0
  50. {pythagoras-0.20.2 → pythagoras-0.20.4}/src/pythagoras/_090_swarming_portals/__init__.py +0 -0
  51. {pythagoras-0.20.2 → pythagoras-0.20.4}/src/pythagoras/_090_swarming_portals/output_suppressor.py +0 -0
  52. {pythagoras-0.20.2 → pythagoras-0.20.4}/src/pythagoras/_090_swarming_portals/swarming_portals.py +0 -0
  53. {pythagoras-0.20.2 → pythagoras-0.20.4}/src/pythagoras/_090_swarming_portals/system_utils.py +0 -0
  54. {pythagoras-0.20.2 → pythagoras-0.20.4}/src/pythagoras/_100_top_level_API/__init__.py +0 -0
  55. {pythagoras-0.20.2 → pythagoras-0.20.4}/src/pythagoras/_100_top_level_API/default_local_portal.py +0 -0
  56. {pythagoras-0.20.2 → pythagoras-0.20.4}/src/pythagoras/_100_top_level_API/top_level_API.py +0 -0
  57. {pythagoras-0.20.2 → pythagoras-0.20.4}/src/pythagoras/_800_signatures_and_converters/__init__.py +0 -0
  58. {pythagoras-0.20.2 → pythagoras-0.20.4}/src/pythagoras/_800_signatures_and_converters/base_16_32_convertors.py +0 -0
  59. {pythagoras-0.20.2 → pythagoras-0.20.4}/src/pythagoras/_800_signatures_and_converters/current_date_gmt_str.py +0 -0
  60. {pythagoras-0.20.2 → pythagoras-0.20.4}/src/pythagoras/_800_signatures_and_converters/hash_signatures.py +0 -0
  61. {pythagoras-0.20.2 → pythagoras-0.20.4}/src/pythagoras/_800_signatures_and_converters/node_signatures.py +0 -0
  62. {pythagoras-0.20.2 → pythagoras-0.20.4}/src/pythagoras/_800_signatures_and_converters/random_signatures.py +0 -0
  63. {pythagoras-0.20.2 → pythagoras-0.20.4}/src/pythagoras/_900_project_stats_collector/__init__.py +0 -0
  64. {pythagoras-0.20.2 → pythagoras-0.20.4}/src/pythagoras/_900_project_stats_collector/project_analyzer.py +0 -0
  65. {pythagoras-0.20.2 → pythagoras-0.20.4}/src/pythagoras/__init__.py +0 -0
  66. {pythagoras-0.20.2 → pythagoras-0.20.4}/src/pythagoras/core/__init__.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: pythagoras
3
- Version: 0.20.2
3
+ Version: 0.20.4
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
@@ -4,7 +4,7 @@ build-backend = "uv_build"
4
4
 
5
5
  [project]
6
6
  name = "pythagoras"
7
- version = "0.20.2"
7
+ version = "0.20.4"
8
8
  authors = [
9
9
  {name = "Volodymyr (Vlad) Pavlov", email = "vlpavlov@ieee.org"},
10
10
  ]
@@ -1,3 +1,5 @@
1
+ import sys
2
+
1
3
  from .._010_basic_portals.exceptions import NonCompliantFunction
2
4
  import ast
3
5
  import inspect
@@ -7,8 +9,8 @@ import autopep8
7
9
  from .function_processing import get_function_name_from_source
8
10
  from .._010_basic_portals.long_infoname import get_long_infoname
9
11
  from .function_processing import assert_ordinarity
10
- from ... import pythagoras as pth
11
12
 
13
+ import pythagoras as pth
12
14
 
13
15
  def _get_normalized_function_source_impl(
14
16
  a_func: Callable | str
@@ -227,7 +227,7 @@ class OrdinaryFn(PortalAwareClass):
227
227
 
228
228
  def _available_names(self):
229
229
  """Returns a dictionary with the names, available inside the function."""
230
- from ... import pythagoras as pth
230
+ import pythagoras as pth
231
231
  names= dict(globals())
232
232
  names[self.name] = self
233
233
  names["self"] = self
@@ -13,7 +13,7 @@ from .._060_autonomous_code_portals.names_usage_analyzer import (
13
13
  from .._050_safe_code_portals.safe_portal_core_classes import (
14
14
  SafeFn, SafeCodePortal)
15
15
 
16
- from ... import pythagoras as pth
16
+ import pythagoras as pth
17
17
 
18
18
 
19
19
  class AutonomousCodePortal(SafeCodePortal):
@@ -1,12 +1,12 @@
1
1
  from .._060_autonomous_code_portals import AutonomousFn, autonomous
2
- from ... import pythagoras as pth
2
+ from .OK_const import OK
3
3
 
4
4
 
5
5
  def free_ram_bytes(packed_kwargs, fn_addr, required_memory):
6
6
  import psutil
7
7
  mem_info = psutil.virtual_memory()
8
8
  if mem_info.available >= required_memory:
9
- return pth.OK
9
+ return OK
10
10
 
11
11
 
12
12
  def RAM_K(limit:int) -> AutonomousFn:
@@ -0,0 +1,76 @@
1
+ import subprocess
2
+ import importlib
3
+ import sys
4
+ from typing import Optional
5
+
6
+ _uv_and_pip_installation_needed:bool = True
7
+
8
+ def _install_uv_and_pip() -> None:
9
+ global _uv_and_pip_installation_needed
10
+ if not _uv_and_pip_installation_needed:
11
+ return
12
+ _uv_pip_installation_attempted = False
13
+
14
+ try:
15
+ importlib.import_module("uv")
16
+ except:
17
+ install_package("uv", use_uv=False)
18
+
19
+ try:
20
+ importlib.import_module("pip")
21
+ except:
22
+ install_package("pip", use_uv=True)
23
+
24
+
25
+ def install_package(package_name:str
26
+ , upgrade:bool=False
27
+ , version:Optional[str]=None
28
+ , use_uv:bool = True
29
+ ) -> None:
30
+ """Install package using pip."""
31
+
32
+ if package_name == "pip":
33
+ assert use_uv
34
+ elif package_name == "uv":
35
+ assert not use_uv
36
+ else:
37
+ _install_uv_and_pip()
38
+
39
+ if use_uv:
40
+ command = [sys.executable, "-m", "uv", "pip", "install"]
41
+ else:
42
+ command = [sys.executable, "-m", "pip", "install"]
43
+
44
+ if upgrade:
45
+ command += ["--upgrade"]
46
+
47
+ package_spec = f"{package_name}=={version}" if version else package_name
48
+ command += [package_spec]
49
+
50
+ subprocess.run(command, check=True, stdout=subprocess.PIPE
51
+ , stderr=subprocess.STDOUT, text=True)
52
+
53
+ importlib.import_module(package_name)
54
+
55
+
56
+ def uninstall_package(package_name:str, use_uv:bool=True)->None:
57
+ """Uninstall package using uv or pip."""
58
+
59
+ assert package_name not in ["pip", "uv"]
60
+
61
+ if use_uv:
62
+ command = [sys.executable, "-m", "uv", "pip", "uninstall", package_name]
63
+ else:
64
+ command = [sys.executable, "-m", "pip", "uninstall", "-y", package_name]
65
+
66
+ subprocess.run(command, check=True, stdout=subprocess.PIPE
67
+ , stderr=subprocess.STDOUT, text=True)
68
+
69
+ try:
70
+ package = importlib.import_module(package_name)
71
+ importlib.reload(package)
72
+ except:
73
+ pass
74
+ else:
75
+ raise Exception(
76
+ f"Failed to validate package uninstallation for '{package_name}'. ")
@@ -1,38 +0,0 @@
1
- import subprocess
2
- import importlib
3
- import sys
4
- from typing import Optional
5
-
6
- def install_package(package_name:str
7
- , upgrade:bool=False
8
- , version:Optional[str]=None
9
- ) -> None:
10
- """Install package using pip."""
11
- command = [sys.executable, "-m", "uv", "pip", "install"]
12
-
13
- if upgrade:
14
- command += ["--upgrade"]
15
-
16
- package_spec = f"{package_name}=={version}" if version else package_name
17
- command += [package_spec]
18
-
19
- subprocess.run(command, check=True, stdout=subprocess.PIPE
20
- , stderr=subprocess.STDOUT, text=True)
21
-
22
- importlib.import_module(package_name)
23
-
24
- def uninstall_package(package_name:str)->None:
25
- """Uninstall package using pip."""
26
-
27
- command = [sys.executable, "-m", "uv", "pip", "uninstall", package_name]
28
- subprocess.run(command, check=True, stdout=subprocess.PIPE
29
- , stderr=subprocess.STDOUT, text=True)
30
-
31
- try:
32
- package = importlib.import_module(package_name)
33
- importlib.reload(package)
34
- except:
35
- pass
36
- else:
37
- raise Exception(
38
- f"Failed to validate package uninstallation for '{package_name}'. ")
File without changes