haiway 0.8.2__py3-none-any.whl → 0.8.4__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.
- haiway/__init__.py +6 -0
- haiway/state/structure.py +2 -12
- haiway/utils/__init__.py +5 -0
- haiway/utils/env.py +69 -3
- haiway/utils/mappings.py +30 -0
- haiway/utils/sequences.py +56 -0
- {haiway-0.8.2.dist-info → haiway-0.8.4.dist-info}/METADATA +4 -4
- {haiway-0.8.2.dist-info → haiway-0.8.4.dist-info}/RECORD +11 -9
- {haiway-0.8.2.dist-info → haiway-0.8.4.dist-info}/WHEEL +1 -1
- {haiway-0.8.2.dist-info → haiway-0.8.4.dist-info}/LICENSE +0 -0
- {haiway-0.8.2.dist-info → haiway-0.8.4.dist-info}/top_level.txt +0 -0
haiway/__init__.py
CHANGED
@@ -35,6 +35,9 @@ from haiway.types import (
|
|
35
35
|
from haiway.utils import (
|
36
36
|
AsyncQueue,
|
37
37
|
always,
|
38
|
+
as_dict,
|
39
|
+
as_list,
|
40
|
+
as_tuple,
|
38
41
|
async_always,
|
39
42
|
async_noop,
|
40
43
|
freeze,
|
@@ -69,6 +72,9 @@ __all__ = [
|
|
69
72
|
"ScopeIdentifier",
|
70
73
|
"State",
|
71
74
|
"always",
|
75
|
+
"as_dict",
|
76
|
+
"as_list",
|
77
|
+
"as_tuple",
|
72
78
|
"async_always",
|
73
79
|
"async_noop",
|
74
80
|
"asynchronous",
|
haiway/state/structure.py
CHANGED
@@ -1,6 +1,5 @@
|
|
1
1
|
import typing
|
2
2
|
from collections.abc import Mapping
|
3
|
-
from copy import deepcopy
|
4
3
|
from types import EllipsisType, GenericAlias
|
5
4
|
from typing import (
|
6
5
|
Any,
|
@@ -362,22 +361,13 @@ class State(metaclass=StateMeta):
|
|
362
361
|
)
|
363
362
|
|
364
363
|
def __copy__(self) -> Self:
|
365
|
-
return self
|
364
|
+
return self # State is immutable, no need to provide an actual copy
|
366
365
|
|
367
366
|
def __deepcopy__(
|
368
367
|
self,
|
369
368
|
memo: dict[int, Any] | None,
|
370
369
|
) -> Self:
|
371
|
-
|
372
|
-
**{
|
373
|
-
key: deepcopy(
|
374
|
-
value,
|
375
|
-
memo,
|
376
|
-
)
|
377
|
-
for key, value in vars(self).items()
|
378
|
-
}
|
379
|
-
)
|
380
|
-
return copy
|
370
|
+
return self # State is immutable, no need to provide an actual copy
|
381
371
|
|
382
372
|
def __replace__(
|
383
373
|
self,
|
haiway/utils/__init__.py
CHANGED
@@ -2,13 +2,18 @@ from haiway.utils.always import always, async_always
|
|
2
2
|
from haiway.utils.env import getenv_bool, getenv_float, getenv_int, getenv_str, load_env
|
3
3
|
from haiway.utils.immutable import freeze
|
4
4
|
from haiway.utils.logs import setup_logging
|
5
|
+
from haiway.utils.mappings import as_dict
|
5
6
|
from haiway.utils.mimic import mimic_function
|
6
7
|
from haiway.utils.noop import async_noop, noop
|
7
8
|
from haiway.utils.queue import AsyncQueue
|
9
|
+
from haiway.utils.sequences import as_list, as_tuple
|
8
10
|
|
9
11
|
__all__ = [
|
10
12
|
"AsyncQueue",
|
11
13
|
"always",
|
14
|
+
"as_dict",
|
15
|
+
"as_list",
|
16
|
+
"as_tuple",
|
12
17
|
"async_always",
|
13
18
|
"async_noop",
|
14
19
|
"freeze",
|
haiway/utils/env.py
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
from os import environ, getenv
|
2
|
-
from typing import overload
|
2
|
+
from typing import Literal, overload
|
3
3
|
|
4
4
|
__all__ = [
|
5
5
|
"getenv_bool",
|
@@ -25,13 +25,28 @@ def getenv_bool(
|
|
25
25
|
) -> bool: ...
|
26
26
|
|
27
27
|
|
28
|
+
@overload
|
29
|
+
def getenv_bool(
|
30
|
+
key: str,
|
31
|
+
/,
|
32
|
+
*,
|
33
|
+
required: Literal[True],
|
34
|
+
) -> bool: ...
|
35
|
+
|
36
|
+
|
28
37
|
def getenv_bool(
|
29
38
|
key: str,
|
30
39
|
/,
|
31
40
|
default: bool | None = None,
|
41
|
+
*,
|
42
|
+
required: bool = False,
|
32
43
|
) -> bool | None:
|
33
44
|
if value := getenv(key=key):
|
34
45
|
return value.lower() in ("true", "1", "t")
|
46
|
+
|
47
|
+
elif required and default is None:
|
48
|
+
raise ValueError(f"Required environment value `{key}` is missing!")
|
49
|
+
|
35
50
|
else:
|
36
51
|
return default
|
37
52
|
|
@@ -51,13 +66,31 @@ def getenv_int(
|
|
51
66
|
) -> int: ...
|
52
67
|
|
53
68
|
|
69
|
+
@overload
|
70
|
+
def getenv_int(
|
71
|
+
key: str,
|
72
|
+
/,
|
73
|
+
*,
|
74
|
+
required: Literal[True],
|
75
|
+
) -> int: ...
|
76
|
+
|
77
|
+
|
54
78
|
def getenv_int(
|
55
79
|
key: str,
|
56
80
|
/,
|
57
81
|
default: int | None = None,
|
82
|
+
*,
|
83
|
+
required: bool = False,
|
58
84
|
) -> int | None:
|
59
85
|
if value := getenv(key=key):
|
60
|
-
|
86
|
+
try:
|
87
|
+
return int(value)
|
88
|
+
|
89
|
+
except Exception as exc:
|
90
|
+
raise ValueError(f"Environment value `{key}` is not a valid int!") from exc
|
91
|
+
|
92
|
+
elif required and default is None:
|
93
|
+
raise ValueError(f"Required environment value `{key}` is missing!")
|
61
94
|
|
62
95
|
else:
|
63
96
|
return default
|
@@ -78,13 +111,31 @@ def getenv_float(
|
|
78
111
|
) -> float: ...
|
79
112
|
|
80
113
|
|
114
|
+
@overload
|
115
|
+
def getenv_float(
|
116
|
+
key: str,
|
117
|
+
/,
|
118
|
+
*,
|
119
|
+
required: Literal[True],
|
120
|
+
) -> float: ...
|
121
|
+
|
122
|
+
|
81
123
|
def getenv_float(
|
82
124
|
key: str,
|
83
125
|
/,
|
84
126
|
default: float | None = None,
|
127
|
+
*,
|
128
|
+
required: bool = False,
|
85
129
|
) -> float | None:
|
86
130
|
if value := getenv(key=key):
|
87
|
-
|
131
|
+
try:
|
132
|
+
return float(value)
|
133
|
+
|
134
|
+
except Exception as exc:
|
135
|
+
raise ValueError(f"Environment value `{key}` is not a valid float!") from exc
|
136
|
+
|
137
|
+
elif required and default is None:
|
138
|
+
raise ValueError(f"Required environment value `{key}` is missing!")
|
88
139
|
|
89
140
|
else:
|
90
141
|
return default
|
@@ -105,13 +156,28 @@ def getenv_str(
|
|
105
156
|
) -> str: ...
|
106
157
|
|
107
158
|
|
159
|
+
@overload
|
160
|
+
def getenv_str(
|
161
|
+
key: str,
|
162
|
+
/,
|
163
|
+
*,
|
164
|
+
required: Literal[True],
|
165
|
+
) -> str: ...
|
166
|
+
|
167
|
+
|
108
168
|
def getenv_str(
|
109
169
|
key: str,
|
110
170
|
/,
|
111
171
|
default: str | None = None,
|
172
|
+
*,
|
173
|
+
required: bool = False,
|
112
174
|
) -> str | None:
|
113
175
|
if value := getenv(key=key):
|
114
176
|
return value
|
177
|
+
|
178
|
+
elif required and default is None:
|
179
|
+
raise ValueError(f"Required environment value `{key}` is missing!")
|
180
|
+
|
115
181
|
else:
|
116
182
|
return default
|
117
183
|
|
haiway/utils/mappings.py
ADDED
@@ -0,0 +1,30 @@
|
|
1
|
+
from collections.abc import Mapping
|
2
|
+
|
3
|
+
__all__ = [
|
4
|
+
"as_dict",
|
5
|
+
]
|
6
|
+
|
7
|
+
|
8
|
+
def as_dict[K, V](
|
9
|
+
mapping: Mapping[K, V],
|
10
|
+
/,
|
11
|
+
) -> dict[K, V]:
|
12
|
+
"""
|
13
|
+
Converts any given mapping into a dict.
|
14
|
+
|
15
|
+
Parameters
|
16
|
+
----------
|
17
|
+
mapping : Mapping[K, V]
|
18
|
+
The input mapping to be converted.
|
19
|
+
|
20
|
+
Returns
|
21
|
+
-------
|
22
|
+
dict[K, V]
|
23
|
+
A new dict containing all elements of the input mapping,
|
24
|
+
or the original dict if it was already one.
|
25
|
+
"""
|
26
|
+
if isinstance(mapping, dict):
|
27
|
+
return mapping
|
28
|
+
|
29
|
+
else:
|
30
|
+
return dict(mapping)
|
@@ -0,0 +1,56 @@
|
|
1
|
+
from collections.abc import Sequence
|
2
|
+
|
3
|
+
__all__ = [
|
4
|
+
"as_list",
|
5
|
+
"as_tuple",
|
6
|
+
]
|
7
|
+
|
8
|
+
|
9
|
+
def as_list[T](
|
10
|
+
sequence: Sequence[T],
|
11
|
+
/,
|
12
|
+
) -> list[T]:
|
13
|
+
"""
|
14
|
+
Converts any given sequence into a list.
|
15
|
+
|
16
|
+
Parameters
|
17
|
+
----------
|
18
|
+
sequence : Sequence[T]
|
19
|
+
The input sequence to be converted.
|
20
|
+
|
21
|
+
Returns
|
22
|
+
-------
|
23
|
+
list[T]
|
24
|
+
A new list containing all elements of the input sequence,
|
25
|
+
or the original list if it was already one.
|
26
|
+
"""
|
27
|
+
if isinstance(sequence, list):
|
28
|
+
return sequence
|
29
|
+
|
30
|
+
else:
|
31
|
+
return list(sequence)
|
32
|
+
|
33
|
+
|
34
|
+
def as_tuple[T](
|
35
|
+
sequence: Sequence[T],
|
36
|
+
/,
|
37
|
+
) -> tuple[T, ...]:
|
38
|
+
"""
|
39
|
+
Converts any given sequence into a tuple.
|
40
|
+
|
41
|
+
Parameters
|
42
|
+
----------
|
43
|
+
sequence : Sequence[T]
|
44
|
+
The input sequence to be converted.
|
45
|
+
|
46
|
+
Returns
|
47
|
+
-------
|
48
|
+
tuple[T]
|
49
|
+
A new tuple containing all elements of the input sequence,
|
50
|
+
or the original tuple if it was already one.
|
51
|
+
"""
|
52
|
+
if isinstance(sequence, tuple):
|
53
|
+
return sequence
|
54
|
+
|
55
|
+
else:
|
56
|
+
return tuple(sequence)
|
@@ -1,6 +1,6 @@
|
|
1
|
-
Metadata-Version: 2.
|
1
|
+
Metadata-Version: 2.2
|
2
2
|
Name: haiway
|
3
|
-
Version: 0.8.
|
3
|
+
Version: 0.8.4
|
4
4
|
Summary: Framework for dependency injection and state management within structured concurrency model.
|
5
5
|
Maintainer-email: Kacper Kaliński <kacper.kalinski@miquido.com>
|
6
6
|
License: MIT License
|
@@ -37,12 +37,12 @@ Description-Content-Type: text/markdown
|
|
37
37
|
License-File: LICENSE
|
38
38
|
Provides-Extra: dev
|
39
39
|
Requires-Dist: haiway; extra == "dev"
|
40
|
-
Requires-Dist: ruff~=0.
|
40
|
+
Requires-Dist: ruff~=0.9; extra == "dev"
|
41
41
|
Requires-Dist: pyright~=1.1; extra == "dev"
|
42
42
|
Requires-Dist: bandit~=1.7; extra == "dev"
|
43
43
|
Requires-Dist: pytest~=7.4; extra == "dev"
|
44
44
|
Requires-Dist: pytest-cov~=4.1; extra == "dev"
|
45
|
-
Requires-Dist: pytest-asyncio~=0.23
|
45
|
+
Requires-Dist: pytest-asyncio~=0.23; extra == "dev"
|
46
46
|
|
47
47
|
# 🚗 haiway 🚕 🚚 🚙
|
48
48
|
|
@@ -1,4 +1,4 @@
|
|
1
|
-
haiway/__init__.py,sha256=
|
1
|
+
haiway/__init__.py,sha256=Llf80-CD62BLe-sI01SCctZqlawNlOwWUUoK0jV-_XQ,1755
|
2
2
|
haiway/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
3
3
|
haiway/context/__init__.py,sha256=FDPD92cVaZKbQoyXl8lO1GzrscfTSrvST_gtfxOxxcM,620
|
4
4
|
haiway/context/access.py,sha256=7UfhtDCjkVtdLfdWc5nR58KwKI3r693LcjFAlRtYHa0,15653
|
@@ -21,21 +21,23 @@ haiway/state/__init__.py,sha256=emTuwGFn7HyjyTJ_ass69J5jQIA7_WHO4teZz_dR05Y,355
|
|
21
21
|
haiway/state/attributes.py,sha256=iQ7TJHnT3hlcYwKcxchXE56zU8WbOTJZhsVn_HocXBc,22903
|
22
22
|
haiway/state/path.py,sha256=4vh-fYQv8_xRWjS0ErMQslKDWRI6-KVECAr8JhYk0UY,17503
|
23
23
|
haiway/state/requirement.py,sha256=3iQqzp5Q7w6y5uClamJGH7S5Hib9pciuTAV27PP5lS8,6161
|
24
|
-
haiway/state/structure.py,sha256=
|
24
|
+
haiway/state/structure.py,sha256=N8lh_yKyROm5GG1NjIxmidYttWZkYH0S3fhEpNIx5FY,11694
|
25
25
|
haiway/state/validation.py,sha256=n5cHcJTbv3Zf-qs05yzuLJIMBReV_4yYVwcH6IL58N0,13836
|
26
26
|
haiway/types/__init__.py,sha256=00Ulp2BxcIWm9vWXKQPodpFEwE8hpqj6OYgrNxelp5s,252
|
27
27
|
haiway/types/frozen.py,sha256=CZhFCXnWAKEhuWSfILxA8smfdpMd5Ku694ycfLh98R8,76
|
28
28
|
haiway/types/missing.py,sha256=JiXo5xdi7H-PbIJr0fuK5wpOuQZhjrDYUkMlfIFcsaE,1705
|
29
|
-
haiway/utils/__init__.py,sha256=
|
29
|
+
haiway/utils/__init__.py,sha256=pBeKpaPNfEHeKe8tT81JV-zADS1Qj32WnYcFP9ThtKk,749
|
30
30
|
haiway/utils/always.py,sha256=2abp8Lm9rQkrfS3rm1Iqhb-IcWyVfH1BULab3KMxgOw,1234
|
31
|
-
haiway/utils/env.py,sha256=
|
31
|
+
haiway/utils/env.py,sha256=vlW21LEp8uOVNnUXpBfPtj3zKi9Kkjoemb_H5hQpYPQ,4433
|
32
32
|
haiway/utils/immutable.py,sha256=K34ZIMzbkpgkHKH-KF73plEbXExsajNRkRTYp9nJEf4,620
|
33
33
|
haiway/utils/logs.py,sha256=oDsc1ZdqKDjlTlctLbDcp9iX98Acr-1tdw-Pyg3DElo,1577
|
34
|
+
haiway/utils/mappings.py,sha256=XxELxCpGEPfRERO54ySIbcV7t4Sxcb7NuQmyayU5GoY,555
|
34
35
|
haiway/utils/mimic.py,sha256=BkVjTVP2TxxC8GChPGyDV6UXVwJmiRiSWeOYZNZFHxs,1828
|
35
36
|
haiway/utils/noop.py,sha256=qgbZlOKWY6_23Zs43OLukK2HagIQKRyR04zrFVm5rWI,344
|
36
37
|
haiway/utils/queue.py,sha256=oQ3GXCJ-PGNtMEr6EPdgqAvYZoj8lAa7Z2drBKBEoBM,2345
|
37
|
-
haiway
|
38
|
-
haiway-0.8.
|
39
|
-
haiway-0.8.
|
40
|
-
haiway-0.8.
|
41
|
-
haiway-0.8.
|
38
|
+
haiway/utils/sequences.py,sha256=mXLAzH94HZHi0P7fF593FHNNTn1eNMRHA4Uxlr3UOu0,1064
|
39
|
+
haiway-0.8.4.dist-info/LICENSE,sha256=GehQEW_I1pkmxkkj3NEa7rCTQKYBn7vTPabpDYJlRuo,1063
|
40
|
+
haiway-0.8.4.dist-info/METADATA,sha256=kgICAuwSBcUZR47tc1Vtvj4EoRwPaWcQCRATc1epLMY,3894
|
41
|
+
haiway-0.8.4.dist-info/WHEEL,sha256=In9FTNxeP60KnTkGw7wk6mJPYd_dQSjEZmXdBdMCI-8,91
|
42
|
+
haiway-0.8.4.dist-info/top_level.txt,sha256=_LdXVLzUzgkvAGQnQJj5kQfoFhpPW6EF4Kj9NapniLg,7
|
43
|
+
haiway-0.8.4.dist-info/RECORD,,
|
File without changes
|
File without changes
|