mm-std 0.3.5__py3-none-any.whl → 0.3.7__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.
mm_std/__init__.py
CHANGED
@@ -13,7 +13,7 @@ from .date import parse_date as parse_date
|
|
13
13
|
from .date import utc_delta as utc_delta
|
14
14
|
from .date import utc_now as utc_now
|
15
15
|
from .date import utc_random as utc_random
|
16
|
-
from .dict import
|
16
|
+
from .dict import replace_empty_dict_values as replace_empty_dict_values
|
17
17
|
from .env import get_dotenv as get_dotenv
|
18
18
|
from .http_ import CHROME_USER_AGENT as CHROME_USER_AGENT
|
19
19
|
from .http_ import FIREFOX_USER_AGENT as FIREFOX_USER_AGENT
|
@@ -41,6 +41,7 @@ from .result import Ok as Ok
|
|
41
41
|
from .result import Result as Result
|
42
42
|
from .result import try_ok as try_ok
|
43
43
|
from .str import number_with_separator as number_with_separator
|
44
|
+
from .str import str_contains_any as str_contains_any
|
44
45
|
from .str import str_ends_with_any as str_ends_with_any
|
45
46
|
from .str import str_starts_with_any as str_starts_with_any
|
46
47
|
from .str import str_to_list as str_to_list
|
mm_std/dict.py
CHANGED
@@ -1,4 +1,37 @@
|
|
1
|
-
def
|
2
|
-
|
3
|
-
|
4
|
-
|
1
|
+
def replace_empty_dict_values(
|
2
|
+
data: dict[object, object],
|
3
|
+
defaults: dict[object, object] | None = None,
|
4
|
+
zero_is_empty: bool = False,
|
5
|
+
) -> dict[object, object]:
|
6
|
+
"""
|
7
|
+
Replace empty values in a dictionary with provided default values, or remove them if no default exists.
|
8
|
+
|
9
|
+
An "empty" value is defined as one of the following:
|
10
|
+
- None
|
11
|
+
- An empty string ("")
|
12
|
+
|
13
|
+
If the flag `zero_is_empty` is True, the numeric value 0 is also considered empty.
|
14
|
+
|
15
|
+
For each key in the input dictionary `data`, if its value is empty, the function checks the
|
16
|
+
`defaults` dictionary for a replacement. If a default exists, it uses that value; otherwise, the
|
17
|
+
key is omitted from the resulting dictionary.
|
18
|
+
|
19
|
+
Parameters:
|
20
|
+
data (dict[object, object]): The input dictionary with key-value pairs to process.
|
21
|
+
defaults (dict[object, object] | None, optional): A dictionary of default values to use as
|
22
|
+
replacements for empty entries. If None, no default replacements are applied.
|
23
|
+
zero_is_empty (bool, optional): If True, treats the value 0 as empty. Defaults to False.
|
24
|
+
|
25
|
+
Returns:
|
26
|
+
dict[object, object]: A new dictionary with empty values replaced by defaults or removed if no
|
27
|
+
default is provided.
|
28
|
+
"""
|
29
|
+
if defaults is None:
|
30
|
+
defaults = {}
|
31
|
+
result = {}
|
32
|
+
for key, value in data.items():
|
33
|
+
if value is None or value == "" or (zero_is_empty and value == 0):
|
34
|
+
value = defaults.get(key, None) # noqa: PLW2901
|
35
|
+
if value is not None:
|
36
|
+
result[key] = value
|
37
|
+
return result
|
mm_std/str.py
CHANGED
@@ -70,6 +70,11 @@ def str_ends_with_any(value: str, prefixes: list[str]) -> bool:
|
|
70
70
|
return any(value.endswith(prefix) for prefix in prefixes)
|
71
71
|
|
72
72
|
|
73
|
+
def str_contains_any(value: str, substrings: list[str]) -> bool:
|
74
|
+
"""Check if str contains any of the given substrings"""
|
75
|
+
return any(substring in value for substring in substrings)
|
76
|
+
|
77
|
+
|
73
78
|
def split_on_plus_minus_tokens(value: str) -> list[str]:
|
74
79
|
value = "".join(value.split())
|
75
80
|
if not value:
|
@@ -1,10 +1,10 @@
|
|
1
|
-
mm_std/__init__.py,sha256=
|
1
|
+
mm_std/__init__.py,sha256=wzKZe6qMG7cmZLqnA-thfr4QaFaPudJzcQKqLsfZeB8,2500
|
2
2
|
mm_std/command.py,sha256=ze286wjUjg0QSTgIu-2WZks53_Vclg69UaYYgPpQvCU,1283
|
3
3
|
mm_std/concurrency.py,sha256=4kKLhde6YQYsjJJjH6K5eMQj6FtegEz55Mo5TmhQMM0,5242
|
4
4
|
mm_std/config.py,sha256=4DGzjLO8TYno1xF8wj2hRaw2-gfNzt_W1_bt7w8ovno,1874
|
5
5
|
mm_std/crypto.py,sha256=jdk0_TCmeU0pPXMyz9xH6kQHSjjZ9GcGClBwQps5vBo,340
|
6
6
|
mm_std/date.py,sha256=976eEkSONuNqHQBgSRu8hrtH23tJqztbmHFHLdbP2TY,1879
|
7
|
-
mm_std/dict.py,sha256=
|
7
|
+
mm_std/dict.py,sha256=E8YxRCs-hdXt0yhZUzR_o892LYokHzcFxSaGh835yjI,1588
|
8
8
|
mm_std/env.py,sha256=5zaR9VeIfObN-4yfgxoFeU5IM1GDeZZj9SuYf7t9sOA,125
|
9
9
|
mm_std/fs.py,sha256=RwarNRJq3tIMG6LVX_g03hasfYpjYFh_O27oVDt5IPQ,291
|
10
10
|
mm_std/http_.py,sha256=QaPPXVb-rOS0BpoKdYQ0ABm_-mcR5dNa7Uqn-SeW_kE,4119
|
@@ -15,10 +15,10 @@ mm_std/print_.py,sha256=zB7sVbSSF8RffMxvnOdbKCXjCKtKzKV3R68pBri4NkQ,1638
|
|
15
15
|
mm_std/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
16
16
|
mm_std/random_.py,sha256=OuUX4VJeSd13NZBya4qrGpR2TfN7_87tfebOY6DBUnI,1113
|
17
17
|
mm_std/result.py,sha256=KLnPWjICYFkP6CAhq7Ifs22XSD-PQ9RkG6n1-cZcXkM,7625
|
18
|
-
mm_std/str.py,sha256=
|
18
|
+
mm_std/str.py,sha256=BEjJ1p5O4-uSYK0h-enasSSDdwzkBbiwdQ4_dsrlEE8,3257
|
19
19
|
mm_std/toml.py,sha256=CNznWKR0bpOxS6e3VB5LGS-Oa9lW-wterkcPUFtPcls,610
|
20
20
|
mm_std/types_.py,sha256=hvZlnvBWyB8CL_MeEWWD0Y0nN677plibYn3yD-5g7xs,99
|
21
21
|
mm_std/zip.py,sha256=axzF1BwcIygtfNNTefZH7hXKaQqwe-ZH3ChuRWr9dnk,396
|
22
|
-
mm_std-0.3.
|
23
|
-
mm_std-0.3.
|
24
|
-
mm_std-0.3.
|
22
|
+
mm_std-0.3.7.dist-info/METADATA,sha256=Fy4PKSoAghLXCIQa8zJMIeO64q3GFRuYucv9XDlz360,308
|
23
|
+
mm_std-0.3.7.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
|
24
|
+
mm_std-0.3.7.dist-info/RECORD,,
|
File without changes
|