retracesoftware-utils 0.2.10__cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.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.
- _retracesoftware_utils_debug.cpython-312-i386-linux-gnu.so +0 -0
- _retracesoftware_utils_release.cpython-312-i386-linux-gnu.so +0 -0
- retracesoftware/utils/__init__.py +172 -0
- retracesoftware_utils-0.2.10.dist-info/METADATA +17 -0
- retracesoftware_utils-0.2.10.dist-info/RECORD +6 -0
- retracesoftware_utils-0.2.10.dist-info/WHEEL +6 -0
|
Binary file
|
|
Binary file
|
|
@@ -0,0 +1,172 @@
|
|
|
1
|
+
"""
|
|
2
|
+
retracesoftware.utils - Runtime selectable release/debug builds
|
|
3
|
+
|
|
4
|
+
Set RETRACE_DEBUG=1 to use the debug build with symbols and assertions.
|
|
5
|
+
"""
|
|
6
|
+
import os
|
|
7
|
+
import weakref
|
|
8
|
+
import threading
|
|
9
|
+
from collections import UserDict
|
|
10
|
+
from typing import Callable, Any, Dict
|
|
11
|
+
from contextlib import contextmanager
|
|
12
|
+
from types import ModuleType
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
def _is_truthy_env(v):
|
|
16
|
+
if v is None:
|
|
17
|
+
return False
|
|
18
|
+
return v.strip().lower() in {"1", "true", "yes", "y", "on"}
|
|
19
|
+
|
|
20
|
+
_DEBUG_MODE = _is_truthy_env(os.getenv("RETRACE_DEBUG"))
|
|
21
|
+
|
|
22
|
+
_backend_mod: ModuleType
|
|
23
|
+
__backend__: str
|
|
24
|
+
|
|
25
|
+
try:
|
|
26
|
+
if _DEBUG_MODE:
|
|
27
|
+
import _retracesoftware_utils_debug as _backend_mod # type: ignore
|
|
28
|
+
__backend__ = "native-debug"
|
|
29
|
+
else:
|
|
30
|
+
import _retracesoftware_utils_release as _backend_mod # type: ignore
|
|
31
|
+
__backend__ = "native-release"
|
|
32
|
+
except Exception:
|
|
33
|
+
raise ImportError("Failed to load retracesoftware_utils native extension")
|
|
34
|
+
|
|
35
|
+
# Expose debug mode flag
|
|
36
|
+
DEBUG_MODE = _DEBUG_MODE and __backend__.startswith("native")
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
def __getattr__(name: str) -> Any:
|
|
40
|
+
return getattr(_backend_mod, name)
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
def _export_public(mod: ModuleType) -> None:
|
|
44
|
+
g = globals()
|
|
45
|
+
for k, v in mod.__dict__.items():
|
|
46
|
+
if k.startswith("_"):
|
|
47
|
+
continue
|
|
48
|
+
g[k] = v
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
_export_public(_backend_mod)
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
# ---------------------------------------------------------------------------
|
|
55
|
+
# High-level API (convenience wrappers around C++ extension)
|
|
56
|
+
# ---------------------------------------------------------------------------
|
|
57
|
+
|
|
58
|
+
def typeflags(cls):
|
|
59
|
+
bits = _backend_mod.type_flags(cls)
|
|
60
|
+
result = set()
|
|
61
|
+
for name, value in _backend_mod.TypeFlags.items():
|
|
62
|
+
if (value & bits) != 0:
|
|
63
|
+
result.add(name)
|
|
64
|
+
return result
|
|
65
|
+
|
|
66
|
+
|
|
67
|
+
def is_method_descriptor(obj):
|
|
68
|
+
return 'Py_TPFLAGS_METHOD_DESCRIPTOR' in typeflags(type(obj))
|
|
69
|
+
|
|
70
|
+
|
|
71
|
+
def flags(cls: type):
|
|
72
|
+
f = _backend_mod.type_flags(cls)
|
|
73
|
+
s = set()
|
|
74
|
+
for name, value in _backend_mod.TypeFlags.items():
|
|
75
|
+
if (f & value) != 0:
|
|
76
|
+
s.add(name)
|
|
77
|
+
f = f & ~value
|
|
78
|
+
if f != 0:
|
|
79
|
+
s.add(f)
|
|
80
|
+
return s
|
|
81
|
+
|
|
82
|
+
|
|
83
|
+
class WithoutFlags:
|
|
84
|
+
def __init__(self, cls, *flags):
|
|
85
|
+
self.cls = cls
|
|
86
|
+
self.flags = flags
|
|
87
|
+
|
|
88
|
+
def __enter__(self):
|
|
89
|
+
self.saved = _backend_mod.type_flags(self.cls)
|
|
90
|
+
flags = self.saved
|
|
91
|
+
for flag in self.flags:
|
|
92
|
+
flags = flags & ~_backend_mod.TypeFlags[flag]
|
|
93
|
+
_backend_mod.set_type_flags(self.cls, flags)
|
|
94
|
+
return self.cls
|
|
95
|
+
|
|
96
|
+
def __exit__(self, *args):
|
|
97
|
+
_backend_mod.set_type_flags(self.cls, self.saved)
|
|
98
|
+
|
|
99
|
+
|
|
100
|
+
class WithFlags:
|
|
101
|
+
def __init__(self, cls, *flags):
|
|
102
|
+
self.cls = cls
|
|
103
|
+
self.flags = flags
|
|
104
|
+
|
|
105
|
+
def __enter__(self):
|
|
106
|
+
self.saved = _backend_mod.type_flags(self.cls)
|
|
107
|
+
flags = self.saved
|
|
108
|
+
for flag in self.flags:
|
|
109
|
+
flags |= _backend_mod.TypeFlags[flag]
|
|
110
|
+
_backend_mod.set_type_flags(self.cls, flags)
|
|
111
|
+
return self.cls
|
|
112
|
+
|
|
113
|
+
def __exit__(self, *args):
|
|
114
|
+
_backend_mod.set_type_flags(self.cls, self.saved)
|
|
115
|
+
|
|
116
|
+
|
|
117
|
+
def wrap_func_with_overrides(func, **overrides):
|
|
118
|
+
"""
|
|
119
|
+
Return a new function identical to `func` but with selected global names
|
|
120
|
+
overridden by keyword arguments.
|
|
121
|
+
"""
|
|
122
|
+
import builtins as _builtins
|
|
123
|
+
import types
|
|
124
|
+
|
|
125
|
+
orig = getattr(func, "__func__", func)
|
|
126
|
+
g = dict(orig.__globals__)
|
|
127
|
+
g.setdefault("__builtins__", _builtins.__dict__)
|
|
128
|
+
g.update(overrides)
|
|
129
|
+
|
|
130
|
+
return types.FunctionType(
|
|
131
|
+
orig.__code__, g, orig.__name__, orig.__defaults__, orig.__closure__
|
|
132
|
+
)
|
|
133
|
+
|
|
134
|
+
|
|
135
|
+
def update(obj, name, f, *args, **kwargs):
|
|
136
|
+
value = getattr(obj, name)
|
|
137
|
+
setattr(obj, name, f(value, *args, **kwargs))
|
|
138
|
+
|
|
139
|
+
|
|
140
|
+
class InterceptDict(dict):
|
|
141
|
+
def __init__(self, backing: Dict, on_set: Callable[[str, Any], Any]):
|
|
142
|
+
super().__init__()
|
|
143
|
+
self.backing = backing
|
|
144
|
+
self.on_set = on_set
|
|
145
|
+
self.move_from_backing()
|
|
146
|
+
|
|
147
|
+
def move_from_backing(self):
|
|
148
|
+
for key, value in self.backing.items():
|
|
149
|
+
super().__setitem__(key, self.on_set(key, value))
|
|
150
|
+
self.backing.clear()
|
|
151
|
+
|
|
152
|
+
def __getitem__(self, key):
|
|
153
|
+
self.move_from_backing()
|
|
154
|
+
return super().__getitem__(key)
|
|
155
|
+
|
|
156
|
+
def __setitem__(self, key: str, value: Any) -> None:
|
|
157
|
+
self.move_from_backing()
|
|
158
|
+
super().__setitem__(key, self.on_set(key, value))
|
|
159
|
+
|
|
160
|
+
|
|
161
|
+
def map_values(f, m):
|
|
162
|
+
return {k: f(v) for k, v in m.items()}
|
|
163
|
+
|
|
164
|
+
|
|
165
|
+
@contextmanager
|
|
166
|
+
def on_set(dict, on_set):
|
|
167
|
+
_backend_mod.intercept_dict_set(dict, on_set)
|
|
168
|
+
yield
|
|
169
|
+
_backend_mod.intercept_dict_set(dict, None)
|
|
170
|
+
|
|
171
|
+
|
|
172
|
+
__all__ = sorted([k for k in globals().keys() if not k.startswith("_")])
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
Metadata-Version: 2.1
|
|
2
|
+
Name: retracesoftware_utils
|
|
3
|
+
Version: 0.2.10
|
|
4
|
+
Keywords: functional,programming,c-extension,utilities,performance
|
|
5
|
+
Author-Email: Retrace Software <info@retracesoftware.com>
|
|
6
|
+
Maintainer-Email: Retrace Software <info@retracesoftware.com>
|
|
7
|
+
License: Apache-2.0
|
|
8
|
+
Classifier: Development Status :: 4 - Beta
|
|
9
|
+
Classifier: Intended Audience :: Developers
|
|
10
|
+
Classifier: License :: OSI Approved :: Apache Software License
|
|
11
|
+
Classifier: Operating System :: OS Independent
|
|
12
|
+
Classifier: Programming Language :: Python :: 3
|
|
13
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
14
|
+
Classifier: Programming Language :: Python :: Implementation :: CPython
|
|
15
|
+
Classifier: Topic :: Software Development :: Libraries :: Python Modules
|
|
16
|
+
Requires-Dist: retracesoftware.functional~=0.3.5
|
|
17
|
+
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
_retracesoftware_utils_debug.cpython-312-i386-linux-gnu.so,sha256=Jj7S_jhyiTYo6ruuJkimU7gcr7P9vZ3boYgYARk_tTk,2850424
|
|
2
|
+
_retracesoftware_utils_release.cpython-312-i386-linux-gnu.so,sha256=W-Qi3hU3P2McxY1HXYxUmSDCLcX5ylx4yPbidT4KtMU,332332
|
|
3
|
+
retracesoftware_utils-0.2.10.dist-info/WHEEL,sha256=m8xSD7H0M6c8kTBrGL7KdF2qjX8ZqbabyPdWuccniJ0,133
|
|
4
|
+
retracesoftware_utils-0.2.10.dist-info/METADATA,sha256=h87Xfke6Rwhe-nP9Uw0j5Bp0JBMCrJAEdI1g2CklbL0,764
|
|
5
|
+
retracesoftware_utils-0.2.10.dist-info/RECORD,,
|
|
6
|
+
retracesoftware/utils/__init__.py,sha256=qxVskvjP9nDJ922awMqFQDk2zvcoUSB47MwUk8upBws,4585
|