jetpytools 2.0.1__py3-none-any.whl → 2.0.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.
Potentially problematic release.
This version of jetpytools might be problematic. Click here for more details.
- jetpytools/_metadata.py +1 -1
- jetpytools/types/utils.py +35 -21
- {jetpytools-2.0.1.dist-info → jetpytools-2.0.2.dist-info}/METADATA +1 -1
- {jetpytools-2.0.1.dist-info → jetpytools-2.0.2.dist-info}/RECORD +6 -6
- {jetpytools-2.0.1.dist-info → jetpytools-2.0.2.dist-info}/WHEEL +0 -0
- {jetpytools-2.0.1.dist-info → jetpytools-2.0.2.dist-info}/licenses/LICENSE +0 -0
jetpytools/_metadata.py
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"""Collection of stuff that's useful in general python programming"""
|
|
2
2
|
|
|
3
|
-
__version__ = "2.0.
|
|
3
|
+
__version__ = "2.0.2"
|
|
4
4
|
|
|
5
5
|
__author_name__, __author_email__ = "Jaded Encoding Thaumaturgy", "jaded.encoding.thaumaturgy@gmail.com"
|
|
6
6
|
__maintainer_name__, __maintainer_email__ = __author_name__, __author_email__
|
jetpytools/types/utils.py
CHANGED
|
@@ -3,7 +3,7 @@ from __future__ import annotations
|
|
|
3
3
|
import sys
|
|
4
4
|
from contextlib import suppress
|
|
5
5
|
from functools import wraps
|
|
6
|
-
from inspect import Signature
|
|
6
|
+
from inspect import Signature, get_annotations
|
|
7
7
|
from typing import (
|
|
8
8
|
TYPE_CHECKING,
|
|
9
9
|
Any,
|
|
@@ -498,13 +498,13 @@ class inject_kwargs_params(_InjectKwargsParamsBase[_T_co, _P, _R_co]):
|
|
|
498
498
|
|
|
499
499
|
|
|
500
500
|
class _ComplexHash[**P, R]:
|
|
501
|
-
__slots__ = "
|
|
501
|
+
__slots__ = "_func"
|
|
502
502
|
|
|
503
503
|
def __init__(self, func: Callable[P, R]) -> None:
|
|
504
|
-
self.
|
|
504
|
+
self._func = func
|
|
505
505
|
|
|
506
506
|
def __call__(self, *args: P.args, **kwargs: P.kwargs) -> R:
|
|
507
|
-
return self.
|
|
507
|
+
return self._func(*args, **kwargs)
|
|
508
508
|
|
|
509
509
|
@staticmethod
|
|
510
510
|
def hash(*args: Any) -> int:
|
|
@@ -515,8 +515,8 @@ class _ComplexHash[**P, R]:
|
|
|
515
515
|
|
|
516
516
|
:return: Hash of all the combined objects' hashes.
|
|
517
517
|
"""
|
|
518
|
-
|
|
519
518
|
values = list[str]()
|
|
519
|
+
|
|
520
520
|
for value in args:
|
|
521
521
|
try:
|
|
522
522
|
new_hash = hash(value)
|
|
@@ -531,18 +531,21 @@ class _ComplexHash[**P, R]:
|
|
|
531
531
|
@_ComplexHash
|
|
532
532
|
def complex_hash[T](cls: type[T]) -> type[T]:
|
|
533
533
|
"""
|
|
534
|
-
|
|
534
|
+
Class decorator that automatically adds a ``__hash__`` method to the target class.
|
|
535
535
|
|
|
536
|
-
|
|
536
|
+
The generated ``__hash__`` method computes a hash value derived from:
|
|
537
|
+
- the class's name
|
|
538
|
+
- the values of all attributes listed in its type annotations.
|
|
539
|
+
|
|
540
|
+
This is particularly useful for immutable data structures (e.g., NamedTuples or dataclasses).
|
|
537
541
|
"""
|
|
538
542
|
|
|
539
543
|
def __hash__(self: T) -> int: # noqa: N807
|
|
540
|
-
return complex_hash.hash(self.__class__.__name__, *(getattr(self, key) for key in
|
|
544
|
+
return complex_hash.hash(self.__class__.__name__, *(getattr(self, key) for key in get_annotations(cls)))
|
|
541
545
|
|
|
542
|
-
|
|
543
|
-
ns["__hash__"] = __hash__
|
|
546
|
+
setattr(cls, __hash__.__name__, __hash__)
|
|
544
547
|
|
|
545
|
-
return
|
|
548
|
+
return cls
|
|
546
549
|
|
|
547
550
|
|
|
548
551
|
def get_subclasses[T](family: type[T], exclude: Sequence[type[T]] = []) -> list[type[T]]:
|
|
@@ -794,22 +797,33 @@ class KwargsNotNone(KwargsT):
|
|
|
794
797
|
|
|
795
798
|
|
|
796
799
|
class SingletonMeta(type):
|
|
797
|
-
_instances: ClassVar[dict[
|
|
800
|
+
_instances: ClassVar[dict[SingletonMeta, Any]] = {}
|
|
798
801
|
_singleton_init: bool
|
|
799
802
|
|
|
800
803
|
def __new__[MetaSelf: SingletonMeta](
|
|
801
|
-
mcls: type[MetaSelf],
|
|
804
|
+
mcls: type[MetaSelf],
|
|
805
|
+
name: str,
|
|
806
|
+
bases: tuple[type, ...],
|
|
807
|
+
namespace: dict[str, Any],
|
|
808
|
+
*,
|
|
809
|
+
init: bool = False,
|
|
810
|
+
**kwargs: Any,
|
|
802
811
|
) -> MetaSelf:
|
|
803
|
-
|
|
804
|
-
|
|
812
|
+
cls = super().__new__(mcls, name, bases, namespace, **kwargs)
|
|
813
|
+
cls._singleton_init = init
|
|
814
|
+
return cls
|
|
815
|
+
|
|
816
|
+
if not TYPE_CHECKING:
|
|
817
|
+
|
|
818
|
+
def __call__(cls, *args: Any, **kwargs: Any) -> Any:
|
|
819
|
+
if cls not in cls._instances:
|
|
820
|
+
cls._instances[cls] = obj = super().__call__(*args, **kwargs)
|
|
821
|
+
return obj
|
|
805
822
|
|
|
806
|
-
|
|
807
|
-
|
|
808
|
-
cls._instances[cls] = super(SingletonMeta, cls).__call__(*args, **kwargs)
|
|
809
|
-
elif cls._singleton_init:
|
|
810
|
-
cls._instances[cls].__init__(*args, **kwargs)
|
|
823
|
+
if cls._singleton_init:
|
|
824
|
+
cls._instances[cls].__init__(*args, **kwargs)
|
|
811
825
|
|
|
812
|
-
|
|
826
|
+
return cls._instances[cls]
|
|
813
827
|
|
|
814
828
|
|
|
815
829
|
class Singleton(metaclass=SingletonMeta):
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: jetpytools
|
|
3
|
-
Version: 2.0.
|
|
3
|
+
Version: 2.0.2
|
|
4
4
|
Summary: Collection of stuff that's useful in general python programming
|
|
5
5
|
Project-URL: Source Code, https://github.com/Jaded-Encoding-Thaumaturgy/jetpytools
|
|
6
6
|
Project-URL: Contact, https://discord.gg/XTpc6Fa9eB
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
jetpytools/__init__.py,sha256=ha_pCOMqfeIbipDRrtqKOqH3NQEpX4KwN2SskpsCGb4,114
|
|
2
|
-
jetpytools/_metadata.py,sha256=
|
|
2
|
+
jetpytools/_metadata.py,sha256=BTjwrbkWnb_tGrAfT27AXcCTiifys4nvvnRB6AJn6ns,414
|
|
3
3
|
jetpytools/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
4
4
|
jetpytools/enums/__init__.py,sha256=TvEt3TWmnzf2TWS_Gd6llyyXAGDKxdhdJsDgSvT7xys,41
|
|
5
5
|
jetpytools/enums/base.py,sha256=Vuzlv84jXUCje7-yoyjucPcgkmfVkLHuuLXcmx4z1Yw,1970
|
|
@@ -21,13 +21,13 @@ jetpytools/types/file.py,sha256=6hV332qbBtvg3p3g6tNHiSnZGp4DhtcTZm-Vap7M72k,6400
|
|
|
21
21
|
jetpytools/types/funcs.py,sha256=arlykyVyosdjBhUTrJDfAoGBdkI5zhoJc0yINMQEonw,2804
|
|
22
22
|
jetpytools/types/generic.py,sha256=LlYiD54GPi5ghjdw4wJmulrZiqv5IUnfPfyr-fk-RlA,1138
|
|
23
23
|
jetpytools/types/supports.py,sha256=uZ2N7XxAa5H3QcOKStCH8fp2x6EXvoKwLQZue5xTLFY,3400
|
|
24
|
-
jetpytools/types/utils.py,sha256=
|
|
24
|
+
jetpytools/types/utils.py,sha256=aLepdNRRs5lbuTghqz7Jt_l_sstXl0wJapbUZiqUMI8,29908
|
|
25
25
|
jetpytools/utils/__init__.py,sha256=_rJ-mY5PsGjBfy8Fihx_FYJfAIGSrYAYzI6Td9oFh9A,83
|
|
26
26
|
jetpytools/utils/file.py,sha256=3fJxAHjIN5zdyzO0guc3jDspcs5HPG4t4cwB_ZrAhh4,10622
|
|
27
27
|
jetpytools/utils/funcs.py,sha256=2jOOIUQpifQ_kTuVUSrCAi8hvCmmvieBpMTfF8XuM24,979
|
|
28
28
|
jetpytools/utils/math.py,sha256=ZqsAyVNBT4LD-zqP7QxEkGwWdVfrR7YAkdv87NQTMV0,3460
|
|
29
29
|
jetpytools/utils/ranges.py,sha256=RAknSZkTAYxAXdFn_CKY8xGASu7xS7Gu039DX89ugDc,1293
|
|
30
|
-
jetpytools-2.0.
|
|
31
|
-
jetpytools-2.0.
|
|
32
|
-
jetpytools-2.0.
|
|
33
|
-
jetpytools-2.0.
|
|
30
|
+
jetpytools-2.0.2.dist-info/METADATA,sha256=hGJCLx_FZHmzdIoUMNRrs5Lohi5s544OtjzLoS6UUEI,1198
|
|
31
|
+
jetpytools-2.0.2.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
|
|
32
|
+
jetpytools-2.0.2.dist-info/licenses/LICENSE,sha256=l0PN-qDtXcgOB5aXP_nSUsvCK5V3o9pQCGsTzyZhKL0,1071
|
|
33
|
+
jetpytools-2.0.2.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|