pythagoras 0.23.6__py3-none-any.whl → 0.23.8__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.
@@ -219,7 +219,7 @@ class StorableFn(OrdinaryFn):
219
219
 
220
220
  @property
221
221
  def portal(self) -> DataPortal:
222
- return OrdinaryFn.portal.__get__(self)
222
+ return super().portal
223
223
 
224
224
 
225
225
  def _get_config_setting(self, key: SafeStrTuple, portal:DataPortal) -> Any:
@@ -72,7 +72,7 @@ class LoggingFn(StorableFn):
72
72
 
73
73
  @property
74
74
  def portal(self) -> LoggingCodePortal:
75
- return StorableFn.portal.__get__(self)
75
+ return super().portal
76
76
 
77
77
 
78
78
  class LoggingFnCallSignature:
@@ -59,7 +59,7 @@ class SafeFn(LoggingFn):
59
59
 
60
60
  @property
61
61
  def portal(self) -> SafeCodePortal:
62
- return LoggingFn.portal.__get__(self)
62
+ return super().portal
63
63
 
64
64
 
65
65
  register_parameterizable_class(SafeCodePortal)
@@ -4,6 +4,8 @@ import builtins
4
4
  from typing import Callable, Any
5
5
 
6
6
  from persidict import PersiDict, Joker, KEEP_CURRENT
7
+
8
+ from .._010_basic_portals import PortalAwareClass
7
9
  from .._020_ordinary_code_portals.code_normalizer import _pythagoras_decorator_names
8
10
  from .._030_data_portals import DataPortal
9
11
  from .._040_logging_code_portals import KwArgs
@@ -29,7 +31,7 @@ class AutonomousCodePortal(SafeCodePortal):
29
31
 
30
32
  class AutonomousFn(SafeFn):
31
33
 
32
- _fixed_kwargs_cached: KwArgs | None
34
+ _fixed_kwargs_cache: KwArgs | None
33
35
  _fixed_kwargs_packed: KwArgs | None
34
36
 
35
37
  def __init__(self, fn: Callable|str|SafeFn
@@ -46,9 +48,9 @@ class AutonomousFn(SafeFn):
46
48
 
47
49
  if isinstance(fn, AutonomousFn):
48
50
  self._fixed_kwargs_packed.update(fixed_kwargs_packed)
49
- self._fixed_kwargs_cached = KwArgs(**{**fn.fixed_kwargs, **fixed_kwargs})
51
+ self._fixed_kwargs_cache = KwArgs(**{**fn.fixed_kwargs, **fixed_kwargs})
50
52
  else:
51
- self._fixed_kwargs_cached = fixed_kwargs
53
+ self._fixed_kwargs_cache = fixed_kwargs
52
54
  self._fixed_kwargs_packed = fixed_kwargs_packed
53
55
 
54
56
  fn_name = self.name
@@ -88,10 +90,10 @@ class AutonomousFn(SafeFn):
88
90
 
89
91
  @property
90
92
  def fixed_kwargs(self) -> KwArgs:
91
- if not hasattr(self, "_fixed_kwargs_cached"):
93
+ if not hasattr(self, "_fixed_kwargs_cache"):
92
94
  with self.portal:
93
- self._fixed_kwargs_cached = self._fixed_kwargs_packed.unpack()
94
- return self._fixed_kwargs_cached
95
+ self._fixed_kwargs_cache = self._fixed_kwargs_packed.unpack()
96
+ return self._fixed_kwargs_cache
95
97
 
96
98
 
97
99
  def execute(self, **kwargs) -> Any:
@@ -120,9 +122,12 @@ class AutonomousFn(SafeFn):
120
122
 
121
123
  def _first_visit_to_portal(self, portal: DataPortal) -> None:
122
124
  super()._first_visit_to_portal(portal)
123
- if hasattr(self,"_fixed_kwargs_cached"):
125
+ if hasattr(self,"_fixed_kwargs_cache"):
124
126
  with portal:
125
- _ = self._fixed_kwargs_cached.pack()
127
+ for v in self._fixed_kwargs_cache.values():
128
+ if isinstance(v, PortalAwareClass):
129
+ v._first_visit_to_portal(portal)
130
+ _ = self._fixed_kwargs_cache.pack()
126
131
 
127
132
 
128
133
  def __getstate__(self):
@@ -140,7 +145,7 @@ class AutonomousFn(SafeFn):
140
145
 
141
146
  @property
142
147
  def portal(self) -> AutonomousCodePortal:
143
- return SafeFn.portal.__get__(self)
148
+ return super().portal
144
149
 
145
150
 
146
151
  def _invalidate_cache(self):
@@ -151,8 +156,8 @@ class AutonomousFn(SafeFn):
151
156
  This method should delete all such attributes.
152
157
  """
153
158
  super()._invalidate_cache()
154
- if hasattr(self, "_fixed_kwargs_cached"):
159
+ if hasattr(self, "_fixed_kwargs_cache"):
155
160
  if not hasattr(self, "_fixed_kwargs_packed"):
156
161
  raise AttributeError("Premature cache invalidation: "
157
162
  "fixed_kwargs_packed is missing.")
158
- del self._fixed_kwargs_cached
163
+ del self._fixed_kwargs_cache
@@ -26,21 +26,31 @@ def unused_ram(Gb:int) -> SimplePreValidatorFn:
26
26
  return SimplePreValidatorFn(_at_least_X_G_RAM_free_check).fix_kwargs(x=Gb)
27
27
 
28
28
 
29
- def _check_python_package_and_install_if_needed(package_name)-> ValidationSuccessClass | None:
29
+ def _check_python_package_and_install_if_needed(
30
+ package_name)-> ValidationSuccessClass | None:
30
31
  assert isinstance(package_name, str)
31
- import importlib
32
+ import importlib, time
32
33
  try:
33
34
  importlib.import_module(package_name)
34
35
  return pth.VALIDATION_SUCCESSFUL
35
36
  except:
36
- pth.install_package(package_name)
37
- return pth.VALIDATION_SUCCESSFUL
37
+ portal = self.portal
38
+ address = (pth.get_node_signature()
39
+ , package_name
40
+ , "installation_attempt")
41
+ # allow installation retries every 10 minutes
42
+ if (not address in portal._config_settings
43
+ or portal._config_settings[address] < time.time() - 600):
44
+ portal._config_settings[address] = time.time()
45
+ pth.install_package(package_name)
46
+ return pth.VALIDATION_SUCCESSFUL
38
47
 
39
48
 
40
49
  def installed_packages(*args) -> list[SimplePreValidatorFn]:
41
50
  validators = []
42
51
  for package_name in args:
43
52
  assert isinstance(package_name, str)
53
+ #TODO: check if the package is available on pypi.org
44
54
  new_validator = SimplePreValidatorFn(_check_python_package_and_install_if_needed)
45
55
  new_validator = new_validator.fix_kwargs(package_name=package_name)
46
56
  validators.append(new_validator)
@@ -48,8 +48,8 @@ class ProtectedCodePortal(AutonomousCodePortal):
48
48
 
49
49
  class ProtectedFn(AutonomousFn):
50
50
 
51
- _pre_validators_cached: list[ValidatorFn] | None
52
- _post_validators_cached: list[ValidatorFn] | None
51
+ _pre_validators_cache: list[ValidatorFn] | None
52
+ _post_validators_cache: list[ValidatorFn] | None
53
53
  _pre_validators_addrs: list[ValueAddr]
54
54
  _post_validators_addrs: list[ValueAddr]
55
55
 
@@ -57,8 +57,8 @@ class ProtectedFn(AutonomousFn):
57
57
  pre_validators_arg_names = ["packed_kwargs", "fn_addr"]
58
58
 
59
59
  def __init__(self, fn: Callable | str
60
- , pre_validators: list[ValidatorFn] | list[Callable] | None = None
61
- , post_validators: list[ValidatorFn] | list[Callable] | None = None
60
+ , pre_validators: list[ValidatorFn] | list[Callable] | ValidatorFn | Callable | None = None
61
+ , post_validators: list[ValidatorFn] | list[Callable] | ValidatorFn | Callable | None = None
62
62
  , excessive_logging: bool | Joker = KEEP_CURRENT
63
63
  , fixed_kwargs: dict[str,Any] | None = None
64
64
  , portal: ProtectedCodePortal | None = None):
@@ -84,12 +84,12 @@ class ProtectedFn(AutonomousFn):
84
84
  pre_validators = self._normalize_validators(pre_validators, PreValidatorFn)
85
85
  post_validators = self._normalize_validators(post_validators, PostValidatorFn)
86
86
 
87
- self._pre_validators_cached = pre_validators
88
- self._post_validators_cached = post_validators
87
+ self._pre_validators_cache = pre_validators
88
+ self._post_validators_cache = post_validators
89
89
  self._pre_validators_addrs = [ValueAddr(g, store=False)
90
- for g in self._pre_validators_cached]
90
+ for g in self._pre_validators_cache]
91
91
  self._post_validators_addrs = [ValueAddr(v, store=False)
92
- for v in self._post_validators_cached]
92
+ for v in self._post_validators_cache]
93
93
 
94
94
 
95
95
  def __getstate__(self):
@@ -112,27 +112,37 @@ class ProtectedFn(AutonomousFn):
112
112
  """Register an object in a portal that the object has not seen before."""
113
113
  super()._first_visit_to_portal(portal)
114
114
 
115
- if hasattr(self,"_pre_validators_cached"):
116
- with portal:
117
- _ = [ValueAddr(g) for g in self._pre_validators_cached]
115
+ for f in self.pre_validators:
116
+ f._first_visit_to_portal(portal)
117
+ for f in self.post_validators:
118
+ f._first_visit_to_portal(portal)
118
119
 
119
- if hasattr(self,"_post_validators_cached"):
120
- with portal:
121
- _ = [ValueAddr(g) for g in self._post_validators_cached]
120
+
121
+ # if hasattr(self,"_pre_validators_cache"):
122
+ # with portal:
123
+ # _ = [ValueAddr(g) for g in self._pre_validators_cache]
124
+ # else:
125
+ # raise AttributeError("Missing pre-validators: ")
126
+ #
127
+ # if hasattr(self,"_post_validators_cache"):
128
+ # with portal:
129
+ # _ = [ValueAddr(g) for g in self._post_validators_cache]
130
+ # else:
131
+ # raise AttributeError("Missing post-validators: ")
122
132
 
123
133
 
124
134
  @property
125
135
  def pre_validators(self) -> list[AutonomousFn]:
126
- if not hasattr(self, "_pre_validators_cached"):
127
- self._pre_validators_cached = [addr.get() for addr in self._pre_validators_addrs]
128
- return self._pre_validators_cached
136
+ if not hasattr(self, "_pre_validators_cache"):
137
+ self._pre_validators_cache = [addr.get() for addr in self._pre_validators_addrs]
138
+ return self._pre_validators_cache
129
139
 
130
140
 
131
141
  @property
132
142
  def post_validators(self) -> list[AutonomousFn]:
133
- if not hasattr(self, "_post_validators_cached"):
134
- self._post_validators_cached = [addr.get() for addr in self._post_validators_addrs]
135
- return self._post_validators_cached
143
+ if not hasattr(self, "_post_validators_cache"):
144
+ self._post_validators_cache = [addr.get() for addr in self._post_validators_addrs]
145
+ return self._post_validators_cache
136
146
 
137
147
 
138
148
  def can_be_executed(self, kw_args: KwArgs) -> bool:
@@ -173,7 +183,7 @@ class ProtectedFn(AutonomousFn):
173
183
 
174
184
 
175
185
  def _normalize_validators(self
176
- , validators: list[ValidatorFn] | None
186
+ , validators: list[ValidatorFn] | ValidatorFn | None
177
187
  , validator_type: type
178
188
  ) -> list[ValidatorFn]:
179
189
  """Return list of validators in a normalized form.
@@ -210,7 +220,7 @@ class ProtectedFn(AutonomousFn):
210
220
 
211
221
  @property
212
222
  def portal(self) -> ProtectedCodePortal:
213
- return AutonomousFn.portal.__get__(self)
223
+ return super().portal
214
224
 
215
225
 
216
226
  def _invalidate_cache(self):
@@ -225,9 +235,9 @@ class ProtectedFn(AutonomousFn):
225
235
  if not hasattr(self, "_post_validators_addrs"):
226
236
  raise AttributeError("Premature cache invalidation: "
227
237
  "_post_validators_addrs is missing.")
228
- del self._post_validators_cached
238
+ del self._post_validators_cache
229
239
  if hasattr(self, "_pre_validators_cached"):
230
240
  if not hasattr(self, "_pre_validators_addrs"):
231
241
  raise AttributeError("Premature cache invalidation: "
232
242
  "_pre_validators_addrs is missing.")
233
- del self._pre_validators_cached
243
+ del self._pre_validators_cache
@@ -248,7 +248,7 @@ class PureFn(ProtectedFn):
248
248
 
249
249
  @property
250
250
  def portal(self) -> PureCodePortal: #*#*#
251
- return ProtectedFn.portal.__get__(self)
251
+ return super().portal
252
252
 
253
253
 
254
254
  class PureFnExecutionResultAddr(HashAddr):
@@ -27,7 +27,7 @@ from .._010_basic_portals.basic_portal_core_classes import _describe_runtime_cha
27
27
  from persidict import OverlappingMultiDict
28
28
  from .._080_pure_code_portals.pure_core_classes import (
29
29
  PureCodePortal, PureFnExecutionResultAddr)
30
- from .._800_signatures_and_converters.node_signatures import get_node_signature
30
+ from .._800_signatures_and_converters.node_signature import get_node_signature
31
31
 
32
32
  from multiprocessing import get_context
33
33
 
@@ -1,5 +1,5 @@
1
1
  from .base_16_32_convertors import *
2
2
  from .current_date_gmt_str import *
3
3
  from .hash_signatures import *
4
- from .node_signatures import *
4
+ from .node_signature import *
5
5
  from .random_signatures import *
@@ -1,8 +1,10 @@
1
1
  import uuid, platform, getpass
2
+ from functools import cache
2
3
 
3
4
  from .hash_signatures import get_hash_signature
4
5
 
5
6
 
7
+ @cache
6
8
  def get_node_signature() -> str:
7
9
  """Returns a globally-unique signature for the current computing node.
8
10
  """
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: pythagoras
3
- Version: 0.23.6
3
+ Version: 0.23.8
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
@@ -12,7 +12,7 @@ pythagoras/_020_ordinary_code_portals/function_processing.py,sha256=ae5841d1da5a
12
12
  pythagoras/_020_ordinary_code_portals/ordinary_decorator.py,sha256=278ab1d37344120a585af8380fc52400bd0f76d02ddac43230dd68a7a2cc16c0,1028
13
13
  pythagoras/_020_ordinary_code_portals/ordinary_portal_core_classes.py,sha256=6d8d87cf2d7d9537b3bfde9d49cd65e52b1a1b13643133aaf08b1f9e4755d706,9743
14
14
  pythagoras/_030_data_portals/__init__.py,sha256=7ff17d0c29ae5603cc833c118ee363e8523add2de85eeee58f7cd4eba370ec77,1427
15
- pythagoras/_030_data_portals/data_portal_core_classes.py,sha256=e790ff0ec8c303ef3809da998378956265978b34f80b0da36bc42b975ff56e4f,20423
15
+ pythagoras/_030_data_portals/data_portal_core_classes.py,sha256=e8c3ecf61233bd2ae8fba50159afcf875c0e42c8238fca704da7ab545fabe1b1,20406
16
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=ab6855c8e56013ef51bb7c9c8a52bdf184bd45ab7cb5273a7ab77b02d1b1a5a0,996
@@ -20,46 +20,46 @@ pythagoras/_040_logging_code_portals/exception_processing_tracking.py,sha256=b14
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=cf513ce2e8621e13f552e449930c57d4867279f3aa3e7ca0d796197751eae9d7,2604
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=ebc0a18b3f4e85caad69e47c3a244c62e9c42d5aa262c1e34d380620910127e2,21869
23
+ pythagoras/_040_logging_code_portals/logging_portal_core_classes.py,sha256=aa44a1349736850e0a42fd1d96d28b09bca0252c410771bea7f9882c9135ebf0,21852
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
27
27
  pythagoras/_050_safe_code_portals/__init__.py,sha256=611f95e96d96675ed28ea993c98db1758d7ac5354412e2ecd8c75d263fd60995,557
28
28
  pythagoras/_050_safe_code_portals/safe_decorator.py,sha256=653b08326b5bdde180592a7074c6174662326898aa57a99d15b07f32a9e0efce,804
29
- pythagoras/_050_safe_code_portals/safe_portal_core_classes.py,sha256=0f414a7a6f280cddb9a9b55dbb86f7039fcc4e558147d1c1a2704df640de9ecf,2026
29
+ pythagoras/_050_safe_code_portals/safe_portal_core_classes.py,sha256=e8566522619b39f3e966032ceed935aa0644641a977c185ef8ecb9011071fc45,2010
30
30
  pythagoras/_060_autonomous_code_portals/__init__.py,sha256=7308e1db007167f22096e0c59701784a4ecc5d5fb776ae016a50dc3b6d100285,1747
31
31
  pythagoras/_060_autonomous_code_portals/autonomous_decorators.py,sha256=762597d378d96889dce798c0837f75651061f92b797b12512c36624bb76a62f8,2895
32
- pythagoras/_060_autonomous_code_portals/autonomous_portal_core_classes.py,sha256=d07623edf1383bc8b82eae49f6c7b19e3512edc79a05f391133c05a2e02f6739,6027
32
+ pythagoras/_060_autonomous_code_portals/autonomous_portal_core_classes.py,sha256=5f4387176ba2e4bd4ed5ea7b17b5b8fa6332c75933a7fb5f070f53105c47cb8e,6228
33
33
  pythagoras/_060_autonomous_code_portals/names_usage_analyzer.py,sha256=9aaaf3010c37b46c4f617b0c03c1347e1848a49a29bd116bce47353154ac3d74,7474
34
34
  pythagoras/_070_protected_code_portals/__init__.py,sha256=4ef19c25acf6d10aac9aff26da903876e06d167fc274229f9126ce485a094bc9,989
35
- pythagoras/_070_protected_code_portals/basic_pre_validators.py,sha256=1d63cc3464c602a022e26b74a255c9539ecdb00437c48bb50a41e1e5e443f8f6,1595
35
+ pythagoras/_070_protected_code_portals/basic_pre_validators.py,sha256=8a3a1727bb4acdf95ea897810092e0d09c8df2b81d8014e3f1f9f585761b5301,2071
36
36
  pythagoras/_070_protected_code_portals/fn_arg_names_checker.py,sha256=e858ce5099868030a39057177f93a893e13d7a210582e6ab636aaaccec898fb0,1230
37
37
  pythagoras/_070_protected_code_portals/list_flattener.py,sha256=9a54b512ad9dc201db348e7908f5ca5f36d171ae3da433511d38023a6ba8d4b5,331
38
38
  pythagoras/_070_protected_code_portals/package_manager.py,sha256=4111d71886adcf1e8d28f3c2d3a08c8a352601297f9ab3f08a4541586ed9d376,1965
39
39
  pythagoras/_070_protected_code_portals/protected_decorators.py,sha256=956ed45870004246d77d6e364015b3a0d936bd8b919dfa9a56c97d69713a9b80,1627
40
- pythagoras/_070_protected_code_portals/protected_portal_core_classes.py,sha256=8bd5e15a4d863aa13a14d04f115c37ddec345964c41ae8666b49d200221f5b64,9426
40
+ pythagoras/_070_protected_code_portals/protected_portal_core_classes.py,sha256=81c202261209e6e0feeaa2edeaf5e965aa2b78e8e8e0761ac86e5c39f584f48b,9802
41
41
  pythagoras/_070_protected_code_portals/system_utils.py,sha256=878a22110140c852b3aaf774cb0c0023458360a4ae221fef89ff3a5d02176301,2360
42
42
  pythagoras/_070_protected_code_portals/validation_succesful_const.py,sha256=602cd3598dd43a71421eb547f1e80f411e30df616deb26912a741a2898d06754,300
43
43
  pythagoras/_070_protected_code_portals/validator_fn_classes.py,sha256=4afa4bf0629f68e4b1623003272ffd7111ac9cbb739e81fde601049d19b84269,3232
44
44
  pythagoras/_080_pure_code_portals/__init__.py,sha256=aa8564346e1701934310dd5eca92424f5784e0be49c6bad97459f4bab1bdad73,1082
45
- pythagoras/_080_pure_code_portals/pure_core_classes.py,sha256=5227a65ca50143b0234ce8845d45fad38a7b0b80d7b15ad7f441e594944b59f7,19457
45
+ pythagoras/_080_pure_code_portals/pure_core_classes.py,sha256=d8399addccd7cec09586660bc958f1cbfac08fe7ce6cab4c8f5ae16d5ec996ce,19439
46
46
  pythagoras/_080_pure_code_portals/pure_decorator.py,sha256=587650ce6cb1802a402c7aea7de88e32b33a4c391972fd18d9bef9e9ecf84369,2279
47
47
  pythagoras/_090_swarming_portals/__init__.py,sha256=4ee035ecf7ed4c1b9da6d01b94db41943e3a06a5228ad92c3ad7f7cb4d502a6d,514
48
48
  pythagoras/_090_swarming_portals/output_suppressor.py,sha256=83e6cc9bcc62a226babb1165912ef5095ea948499ce5136a7516ac8b54522607,626
49
- pythagoras/_090_swarming_portals/swarming_portals.py,sha256=51e1a4149659cc1ef62761338ae9190736a89ecefc5c10281f20b805f4e4c1d4,12485
49
+ pythagoras/_090_swarming_portals/swarming_portals.py,sha256=5e54bc77538bf949aa7438944d0be36b03382f9e6192bf20397700ba106ad693,12484
50
50
  pythagoras/_100_top_level_API/__init__.py,sha256=b392edc2c918da7c2444f14accfd0fac2cd0d5cf6849c64ed2433dfdb58b8b75,64
51
51
  pythagoras/_100_top_level_API/default_local_portal.py,sha256=4a7ca44e94d78352ae4f5ab00e7ac067ade562c84ccbed27362520a0e54cc42b,339
52
52
  pythagoras/_100_top_level_API/top_level_API.py,sha256=4b63575b86df2fdf28e93c67e8d33411e05bd67cf016d3d297ec9635ebc04081,906
53
- pythagoras/_800_signatures_and_converters/__init__.py,sha256=d9420254db0c62903fe5419612cef536f219ec319e81b7efc3e783a113aac93b,167
53
+ pythagoras/_800_signatures_and_converters/__init__.py,sha256=580ce93def1fb21ff0ffb1e15712592c189dee0c675b7a663d95bce9f6272639,166
54
54
  pythagoras/_800_signatures_and_converters/base_16_32_convertors.py,sha256=66356d2a38e33203201d484cfb543da8b6160832a1965aaaf73e1880a2f4a828,1236
55
55
  pythagoras/_800_signatures_and_converters/current_date_gmt_str.py,sha256=2beac61f2ad112cc8175832aeef5abbf715d01a71ea56429bce7d3fe6ad9a8d3,268
56
56
  pythagoras/_800_signatures_and_converters/hash_signatures.py,sha256=02c5080ff67bc9e174e899a4f2428015722ec6817484dd0ec0e4b54f99eeeff9,989
57
- pythagoras/_800_signatures_and_converters/node_signatures.py,sha256=2de43f2cc4c3d62f56240fc26fc70668fde809a65f023502fb773ccafae3224b,557
57
+ pythagoras/_800_signatures_and_converters/node_signature.py,sha256=a52678c81e1a5cd1faca18b343a6779b8b9172e0cd92bffe959f34db835b67bc,592
58
58
  pythagoras/_800_signatures_and_converters/random_signatures.py,sha256=c174f28c04ccf08c0c5eadaf1e1a00aba4fec88ec370def64afcadd39123141a,323
59
59
  pythagoras/_900_project_stats_collector/__init__.py,sha256=11a82df8184f3ed046829332c31da590b0cad7ad3763db7f40176d1ca5071c56,71
60
60
  pythagoras/_900_project_stats_collector/project_analyzer.py,sha256=ba1c9c14a8d421712961c6589da937ca7e0916172197ea19ef0b7ab291718686,3574
61
61
  pythagoras/__init__.py,sha256=4cc3ed25d4a2fd64a10a9267b1555d3b8f1672fb3bf0631b522e601dcd5e30bc,1233
62
62
  pythagoras/core/__init__.py,sha256=11c3616471c79550d69a0d3b3b49a45b90087919b82477db5de99c8ebc6ba5c0,298
63
- pythagoras-0.23.6.dist-info/WHEEL,sha256=607c46fee47e440c91332c738096ff0f5e54ca3b0818ee85462dd5172a38e793,79
64
- pythagoras-0.23.6.dist-info/METADATA,sha256=28ec1f4dc27b92b5349c1d9a03ea75e3cab78a24ec4a142d9b686a02a3c0b947,4902
65
- pythagoras-0.23.6.dist-info/RECORD,,
63
+ pythagoras-0.23.8.dist-info/WHEEL,sha256=607c46fee47e440c91332c738096ff0f5e54ca3b0818ee85462dd5172a38e793,79
64
+ pythagoras-0.23.8.dist-info/METADATA,sha256=20330bc6ac1e9c95a092ebf66c5af3c45f3405de19e850063b3516c9068b92c9,4902
65
+ pythagoras-0.23.8.dist-info/RECORD,,