relib 1.3.5__py3-none-any.whl → 1.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.
relib/dict_utils.py CHANGED
@@ -1,5 +1,8 @@
1
1
  from typing import Any, Callable, Iterable, overload
2
2
  from .type_utils import as_any
3
+ from .types import K1, K2, K3, K4, K5, K6, T1, T2, K, T, U
4
+
5
+ sentinel = object()
3
6
 
4
7
  __all__ = [
5
8
  "deep_dict_pairs", "deepen_dict", "dict_by", "dict_firsts",
@@ -9,10 +12,11 @@ __all__ = [
9
12
  "map_dict", "merge_dicts",
10
13
  "omit",
11
14
  "pick",
15
+ "remap",
12
16
  "tuple_by",
13
17
  ]
14
18
 
15
- def merge_dicts[T, K](*dicts: dict[K, T]) -> dict[K, T]:
19
+ def merge_dicts(*dicts: dict[K, T]) -> dict[K, T]:
16
20
  if len(dicts) == 1:
17
21
  return dicts[0]
18
22
  result = {}
@@ -20,29 +24,47 @@ def merge_dicts[T, K](*dicts: dict[K, T]) -> dict[K, T]:
20
24
  result |= d
21
25
  return result
22
26
 
23
- def omit[T, K](d: dict[K, T], keys: Iterable[K]) -> dict[K, T]:
27
+ def omit(d: dict[K, T], keys: Iterable[K]) -> dict[K, T]:
24
28
  if keys:
25
29
  d = dict(d)
26
30
  for key in keys:
27
31
  del d[key]
28
32
  return d
29
33
 
30
- def pick[T, K](d: dict[K, T], keys: Iterable[K]) -> dict[K, T]:
34
+ def pick(d: dict[K, T], keys: Iterable[K]) -> dict[K, T]:
31
35
  return {key: d[key] for key in keys}
32
36
 
33
- def dict_by[T, K](keys: Iterable[K], values: Iterable[T]) -> dict[K, T]:
37
+ def dict_by(keys: Iterable[K], values: Iterable[T]) -> dict[K, T]:
34
38
  return dict(zip(keys, values))
35
39
 
36
- def tuple_by[T, K](d: dict[K, T], keys: Iterable[K]) -> tuple[T, ...]:
40
+ def tuple_by(d: dict[K, T], keys: Iterable[K]) -> tuple[T, ...]:
37
41
  return tuple(d[key] for key in keys)
38
42
 
39
- def map_dict[T, U, K](fn: Callable[[T], U], d: dict[K, T]) -> dict[K, U]:
43
+ def map_dict(fn: Callable[[T], T], d: dict[K, T]) -> dict[K, T]:
40
44
  return {key: fn(value) for key, value in d.items()}
41
45
 
42
- def key_of[T, U](dicts: Iterable[dict[T, U]], key: T) -> list[U]:
46
+ @overload
47
+ def remap(d: dict[K1, T1]) -> dict[K1, T1]: ...
48
+ @overload
49
+ def remap(d: dict[K1, T1], *, keys: dict[K1, K2] = {}) -> dict[K2, T1]: ...
50
+ @overload
51
+ def remap(d: dict[K1, T1], *, values: dict[T1, T2] = {}) -> dict[K1, T2]: ...
52
+ @overload
53
+ def remap(d: dict[K1, T1], *, keys: dict[K1, K2], values: dict[T1, T2]) -> dict[K2, T2]: ...
54
+ def remap(d: dict, *, keys=sentinel, values=sentinel) -> dict:
55
+ match (keys, values):
56
+ case (dict(), dict()):
57
+ return {keys[key]: values[value] for key, value in d.items()}
58
+ case (dict(), _):
59
+ return {keys[key]: value for key, value in d.items()}
60
+ case (_, dict()):
61
+ return {key: values[value] for key, value in d.items()}
62
+ return d
63
+
64
+ def key_of(dicts: Iterable[dict[T, U]], key: T) -> list[U]:
43
65
  return [d[key] for d in dicts]
44
66
 
45
- def get_at[T](d: dict, keys: Iterable[Any], default: T) -> T:
67
+ def get_at(d: dict, keys: Iterable[Any], default: T) -> T:
46
68
  try:
47
69
  for key in keys:
48
70
  d = d[key]
@@ -50,13 +72,13 @@ def get_at[T](d: dict, keys: Iterable[Any], default: T) -> T:
50
72
  return default
51
73
  return as_any(d)
52
74
 
53
- def dict_firsts[T, K](pairs: Iterable[tuple[K, T]]) -> dict[K, T]:
75
+ def dict_firsts(pairs: Iterable[tuple[K, T]]) -> dict[K, T]:
54
76
  result: dict[K, T] = {}
55
77
  for key, value in pairs:
56
78
  result.setdefault(key, value)
57
79
  return result
58
80
 
59
- def group[T, K](pairs: Iterable[tuple[K, T]]) -> dict[K, list[T]]:
81
+ def group(pairs: Iterable[tuple[K, T]]) -> dict[K, list[T]]:
60
82
  values_by_key = {}
61
83
  for key, value in pairs:
62
84
  values_by_key.setdefault(key, []).append(value)
@@ -73,17 +95,17 @@ def flatten_dict(deep_dict: dict, prefix=()) -> dict:
73
95
  return dict(deep_dict_pairs(deep_dict, prefix))
74
96
 
75
97
  @overload
76
- def deepen_dict[K1, U](d: dict[tuple[K1], U]) -> dict[K1, U]: ...
98
+ def deepen_dict(d: dict[tuple[K1], U]) -> dict[K1, U]: ...
77
99
  @overload
78
- def deepen_dict[K1, K2, U](d: dict[tuple[K1, K2], U]) -> dict[K1, dict[K2, U]]: ...
100
+ def deepen_dict(d: dict[tuple[K1, K2], U]) -> dict[K1, dict[K2, U]]: ...
79
101
  @overload
80
- def deepen_dict[K1, K2, K3, U](d: dict[tuple[K1, K2, K3], U]) -> dict[K1, dict[K2, dict[K3, U]]]: ...
102
+ def deepen_dict(d: dict[tuple[K1, K2, K3], U]) -> dict[K1, dict[K2, dict[K3, U]]]: ...
81
103
  @overload
82
- def deepen_dict[K1, K2, K3, K4, U](d: dict[tuple[K1, K2, K3, K4], U]) -> dict[K1, dict[K2, dict[K3, dict[K4, U]]]]: ...
104
+ def deepen_dict(d: dict[tuple[K1, K2, K3, K4], U]) -> dict[K1, dict[K2, dict[K3, dict[K4, U]]]]: ...
83
105
  @overload
84
- def deepen_dict[K1, K2, K3, K4, K5, U](d: dict[tuple[K1, K2, K3, K4, K5], U]) -> dict[K1, dict[K2, dict[K3, dict[K4, dict[K5, U]]]]]: ...
106
+ def deepen_dict(d: dict[tuple[K1, K2, K3, K4, K5], U]) -> dict[K1, dict[K2, dict[K3, dict[K4, dict[K5, U]]]]]: ...
85
107
  @overload
86
- def deepen_dict[K1, K2, K3, K4, K5, K6, U](d: dict[tuple[K1, K2, K3, K4, K5, K6], U]) -> dict[K1, dict[K2, dict[K3, dict[K4, dict[K5, dict[K6, U]]]]]]: ...
108
+ def deepen_dict(d: dict[tuple[K1, K2, K3, K4, K5, K6], U]) -> dict[K1, dict[K2, dict[K3, dict[K4, dict[K5, dict[K6, U]]]]]]: ...
87
109
  def deepen_dict(d: dict[tuple[Any, ...], Any]) -> dict:
88
110
  output = {}
89
111
  if () in d:
relib/iter_utils.py CHANGED
@@ -1,11 +1,12 @@
1
+ from __future__ import annotations
1
2
  from contextlib import contextmanager
2
3
  from itertools import chain, islice
3
- from typing import Any, Iterable, Literal, Self, Sequence, overload
4
+ from typing import Any, Generic, Iterable, Literal, Sequence, overload
4
5
  from .dict_utils import dict_firsts
6
+ from .types import T1, T2, T3, T4, T5, T, U
5
7
 
6
8
  __all__ = [
7
- "as_list",
8
- "at",
9
+ "as_list", "at",
9
10
  "chunked",
10
11
  "distinct_by", "distinct", "drop_none",
11
12
  "first", "flatten",
@@ -18,52 +19,52 @@ __all__ = [
18
19
  "transpose",
19
20
  ]
20
21
 
21
- def as_list[T](iterable: Iterable[T]) -> list[T]:
22
+ def as_list(iterable: Iterable[T]) -> list[T]:
22
23
  return iterable if isinstance(iterable, list) else list(iterable)
23
24
 
24
- def at[T, U](values: Sequence[T], index: int, default: U = None) -> T | U:
25
+ def at(values: Sequence[T], index: int, default: U = None) -> T | U:
25
26
  try:
26
27
  return values[index]
27
28
  except IndexError:
28
29
  return default
29
30
 
30
- def first[T](iterable: Iterable[T]) -> T | None:
31
+ def first(iterable: Iterable[T]) -> T | None:
31
32
  return next(iter(iterable), None)
32
33
 
33
- def drop_none[T](iterable: Iterable[T | None]) -> list[T]:
34
+ def drop_none(iterable: Iterable[T | None]) -> list[T]:
34
35
  return [x for x in iterable if x is not None]
35
36
 
36
- def distinct[T](iterable: Iterable[T]) -> list[T]:
37
+ def distinct(iterable: Iterable[T]) -> list[T]:
37
38
  return list(dict.fromkeys(iterable))
38
39
 
39
- def distinct_by[T](pairs: Iterable[tuple[object, T]]) -> list[T]:
40
+ def distinct_by(pairs: Iterable[tuple[object, T]]) -> list[T]:
40
41
  return list(dict_firsts(pairs).values())
41
42
 
42
- def sort_by[T](pairs: Iterable[tuple[Any, T]], reverse=False) -> list[T]:
43
+ def sort_by(pairs: Iterable[tuple[Any, T]], reverse=False) -> list[T]:
43
44
  pairs = sorted(pairs, key=lambda p: p[0], reverse=reverse)
44
45
  return [v for _, v in pairs]
45
46
 
46
- def move_value[T](iterable: Iterable[T], from_i: int, to_i: int) -> list[T]:
47
+ def move_value(iterable: Iterable[T], from_i: int, to_i: int) -> list[T]:
47
48
  values = list(iterable)
48
49
  values.insert(to_i, values.pop(from_i))
49
50
  return values
50
51
 
51
- def reversed_enumerate[T](values: Sequence[T] | tuple[T, ...]) -> Iterable[tuple[int, T]]:
52
+ def reversed_enumerate(values: Sequence[T] | tuple[T, ...]) -> Iterable[tuple[int, T]]:
52
53
  return zip(range(len(values))[::-1], reversed(values))
53
54
 
54
- def intersect[T](*iterables: Iterable[T]) -> list[T]:
55
+ def intersect(*iterables: Iterable[T]) -> list[T]:
55
56
  return list(set.intersection(*map(set, iterables)))
56
57
 
57
- def interleave[T](*iterables: Iterable[T]) -> list[T]:
58
+ def interleave(*iterables: Iterable[T]) -> list[T]:
58
59
  return flatten(zip(*iterables))
59
60
 
60
- def list_split[T](iterable: Iterable[T], sep: T) -> list[list[T]]:
61
+ def list_split(iterable: Iterable[T], sep: T) -> list[list[T]]:
61
62
  values = [sep, *iterable, sep]
62
63
  split_at = [i for i, x in enumerate(values) if x is sep]
63
64
  ranges = list(zip(split_at[0:-1], split_at[1:]))
64
65
  return [values[start + 1:end] for start, end in ranges]
65
66
 
66
- def partition[T](iterable: Iterable[tuple[bool, T]]) -> tuple[list[T], list[T]]:
67
+ def partition(iterable: Iterable[tuple[bool, T]]) -> tuple[list[T], list[T]]:
67
68
  true_values, false_values = [], []
68
69
  for predicate, value in iterable:
69
70
  if predicate:
@@ -72,7 +73,7 @@ def partition[T](iterable: Iterable[tuple[bool, T]]) -> tuple[list[T], list[T]]:
72
73
  false_values.append(value)
73
74
  return true_values, false_values
74
75
 
75
- class seekable[T]:
76
+ class seekable(Generic[T]):
76
77
  def __init__(self, iterable: Iterable[T]):
77
78
  self.index = 0
78
79
  self.source = iter(iterable)
@@ -97,14 +98,14 @@ class seekable[T]:
97
98
  self.sink[:self.index] = []
98
99
  self.index = 0
99
100
 
100
- def seek(self, index: int) -> Self:
101
+ def seek(self, index: int) -> seekable[T]:
101
102
  remainder = index - len(self.sink)
102
103
  if remainder > 0:
103
104
  next(islice(self, remainder, remainder), None)
104
105
  self.index = max(0, min(index, len(self.sink)))
105
106
  return self
106
107
 
107
- def step(self, count: int) -> Self:
108
+ def step(self, count: int) -> seekable[T]:
108
109
  return self.seek(self.index + count)
109
110
 
110
111
  @contextmanager
@@ -123,9 +124,9 @@ class seekable[T]:
123
124
  return list(islice(self, count))
124
125
 
125
126
  @overload
126
- def chunked[T](values: Iterable[T], *, num_chunks: int, chunk_size=None) -> list[list[T]]: ...
127
+ def chunked(values: Iterable[T], *, num_chunks: int, chunk_size=None) -> list[list[T]]: ...
127
128
  @overload
128
- def chunked[T](values: Iterable[T], *, num_chunks=None, chunk_size: int) -> list[list[T]]: ...
129
+ def chunked(values: Iterable[T], *, num_chunks=None, chunk_size: int) -> list[list[T]]: ...
129
130
  def chunked(values, *, num_chunks=None, chunk_size=None):
130
131
  values = as_list(values)
131
132
  if isinstance(num_chunks, int):
@@ -136,15 +137,15 @@ def chunked(values, *, num_chunks=None, chunk_size=None):
136
137
  return [values[i * chunk_size:(i + 1) * chunk_size] for i in range(num_chunks)]
137
138
 
138
139
  @overload
139
- def flatten[T](iterable: Iterable[T], depth: Literal[0]) -> list[T]: ...
140
+ def flatten(iterable: Iterable[T], depth: Literal[0]) -> list[T]: ...
140
141
  @overload
141
- def flatten[T](iterable: Iterable[Iterable[T]], depth: Literal[1] = 1) -> list[T]: ...
142
+ def flatten(iterable: Iterable[Iterable[T]], depth: Literal[1] = 1) -> list[T]: ...
142
143
  @overload
143
- def flatten[T](iterable: Iterable[Iterable[Iterable[T]]], depth: Literal[2]) -> list[T]: ...
144
+ def flatten(iterable: Iterable[Iterable[Iterable[T]]], depth: Literal[2]) -> list[T]: ...
144
145
  @overload
145
- def flatten[T](iterable: Iterable[Iterable[Iterable[Iterable[T]]]], depth: Literal[3]) -> list[T]: ...
146
+ def flatten(iterable: Iterable[Iterable[Iterable[Iterable[T]]]], depth: Literal[3]) -> list[T]: ...
146
147
  @overload
147
- def flatten[T](iterable: Iterable[Iterable[Iterable[Iterable[Iterable[T]]]]], depth: Literal[4]) -> list[T]: ...
148
+ def flatten(iterable: Iterable[Iterable[Iterable[Iterable[Iterable[T]]]]], depth: Literal[4]) -> list[T]: ...
148
149
  @overload
149
150
  def flatten(iterable: Iterable, depth: int) -> list: ...
150
151
  def flatten(iterable: Iterable, depth: int = 1) -> list:
@@ -153,15 +154,15 @@ def flatten(iterable: Iterable, depth: int = 1) -> list:
153
154
  return list(iterable)
154
155
 
155
156
  @overload
156
- def transpose[T1, T2](tuples: Iterable[tuple[T1, T2]], default_num_returns=0) -> tuple[list[T1], list[T2]]: ...
157
+ def transpose(tuples: Iterable[tuple[T1, T2]], default_num_returns=0) -> tuple[list[T1], list[T2]]: ...
157
158
  @overload
158
- def transpose[T1, T2, T3](tuples: Iterable[tuple[T1, T2, T3]], default_num_returns=0) -> tuple[list[T1], list[T2], list[T3]]: ...
159
+ def transpose(tuples: Iterable[tuple[T1, T2, T3]], default_num_returns=0) -> tuple[list[T1], list[T2], list[T3]]: ...
159
160
  @overload
160
- def transpose[T1, T2, T3, T4](tuples: Iterable[tuple[T1, T2, T3, T4]], default_num_returns=0) -> tuple[list[T1], list[T2], list[T3], list[T4]]: ...
161
+ def transpose(tuples: Iterable[tuple[T1, T2, T3, T4]], default_num_returns=0) -> tuple[list[T1], list[T2], list[T3], list[T4]]: ...
161
162
  @overload
162
- def transpose[T1, T2, T3, T4, T5](tuples: Iterable[tuple[T1, T2, T3, T4, T5]], default_num_returns=0) -> tuple[list[T1], list[T2], list[T3], list[T4], list[T5]]: ...
163
+ def transpose(tuples: Iterable[tuple[T1, T2, T3, T4, T5]], default_num_returns=0) -> tuple[list[T1], list[T2], list[T3], list[T4], list[T5]]: ...
163
164
  @overload
164
- def transpose[T](tuples: Iterable[tuple[T, ...]], default_num_returns=0) -> tuple[list[T], ...]: ...
165
+ def transpose(tuples: Iterable[tuple[T, ...]], default_num_returns=0) -> tuple[list[T], ...]: ...
165
166
  def transpose(tuples: Iterable[tuple], default_num_returns=0) -> tuple[list, ...]:
166
167
  output = tuple(zip(*tuples))
167
168
  if not output:
relib/processing_utils.py CHANGED
@@ -1,5 +1,6 @@
1
1
  import re
2
2
  from typing import Any, Callable, Iterable, overload
3
+ from .types import T
3
4
 
4
5
  __all__ = [
5
6
  "clamp",
@@ -12,7 +13,7 @@ __all__ = [
12
13
  def noop() -> None:
13
14
  pass
14
15
 
15
- def for_each[T](func: Callable[[T], Any], iterable: Iterable[T]) -> None:
16
+ def for_each(func: Callable[[T], Any], iterable: Iterable[T]) -> None:
16
17
  for item in iterable:
17
18
  func(item)
18
19
 
relib/runtime_tools.py CHANGED
@@ -8,6 +8,7 @@ from time import time
8
8
  from typing import Callable, Coroutine, Iterable, ParamSpec, TypeVar
9
9
  from .iter_utils import as_list
10
10
  from .processing_utils import noop
11
+ from .types import T
11
12
 
12
13
  __all__ = [
13
14
  "as_async", "async_limit",
@@ -34,13 +35,13 @@ def clear_console() -> None:
34
35
  def console_link(text: str, url: str) -> str:
35
36
  return f"\033]8;;{url}\033\\{text}\033]8;;\033\\"
36
37
 
37
- async def worker[T](task: Coro[T], semaphore: asyncio.Semaphore, update=noop) -> T:
38
+ async def worker(task: Coro[T], semaphore: asyncio.Semaphore, update=noop) -> T:
38
39
  async with semaphore:
39
40
  result = await task
40
41
  update()
41
42
  return result
42
43
 
43
- async def roll_tasks[T](tasks: Iterable[Coro[T]], workers=default_workers, progress=False) -> list[T]:
44
+ async def roll_tasks(tasks: Iterable[Coro[T]], workers=default_workers, progress=False) -> list[T]:
44
45
  semaphore = asyncio.Semaphore(workers)
45
46
  if not progress:
46
47
  return await asyncio.gather(*[worker(task, semaphore) for task in tasks])
relib/type_utils.py CHANGED
@@ -1,4 +1,5 @@
1
1
  from typing import Any
2
+ from .types import T
2
3
 
3
4
  __all__ = [
4
5
  "as_any",
@@ -9,9 +10,9 @@ __all__ = [
9
10
  def as_any(obj: Any) -> Any:
10
11
  return obj
11
12
 
12
- def non_none[T](obj: T | None) -> T:
13
+ def non_none(obj: T | None) -> T:
13
14
  assert obj is not None
14
15
  return obj
15
16
 
16
- def ensure_tuple[T](value: T | tuple[T, ...]) -> tuple[T, ...]:
17
+ def ensure_tuple(value: T | tuple[T, ...]) -> tuple[T, ...]:
17
18
  return value if isinstance(value, tuple) else (value,)
relib/types.py ADDED
@@ -0,0 +1,16 @@
1
+ from typing import TypeVar
2
+
3
+ T = TypeVar("T")
4
+ U = TypeVar("U")
5
+ K = TypeVar("K")
6
+ T1 = TypeVar("T1")
7
+ T2 = TypeVar("T2")
8
+ T3 = TypeVar("T3")
9
+ T4 = TypeVar("T4")
10
+ T5 = TypeVar("T5")
11
+ K1 = TypeVar("K1")
12
+ K2 = TypeVar("K2")
13
+ K3 = TypeVar("K3")
14
+ K4 = TypeVar("K4")
15
+ K5 = TypeVar("K5")
16
+ K6 = TypeVar("K6")
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: relib
3
- Version: 1.3.5
3
+ Version: 1.3.7
4
4
  Project-URL: Repository, https://github.com/Reddan/relib.git
5
5
  Author: Hampus Hallman
6
6
  License: Copyright 2018-2025 Hampus Hallman
@@ -11,4 +11,4 @@ License: Copyright 2018-2025 Hampus Hallman
11
11
 
12
12
  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
13
13
  License-File: LICENSE
14
- Requires-Python: >=3.12
14
+ Requires-Python: >=3.10
@@ -0,0 +1,12 @@
1
+ relib/__init__.py,sha256=WerjUaM_sNvudjXFudLRtXB7viZWEW1RSinkDjrh4nE,163
2
+ relib/dict_utils.py,sha256=EUfZi8sw_30Z4xtfyJYFy1COtDXGl6H5cya9X4ZyifI,3592
3
+ relib/io_utils.py,sha256=cUyUFhrMCUDfkINhYo32QPaVGz3chqDO3ElymSCoWEg,1086
4
+ relib/iter_utils.py,sha256=V0Sq64JM6M_g5yJvUVGhhLZ-v0x9RY0X8JpyVb_Iuxo,5755
5
+ relib/processing_utils.py,sha256=kFb4izrR8vec9BFWeGSb-TXR54bbA4X3dxAfIBZItuI,1911
6
+ relib/runtime_tools.py,sha256=6HpRXmAHHLq4bNRj6fSiaLQeHR2h3OdxFZxaB93fXhI,2979
7
+ relib/type_utils.py,sha256=68yEhEIBCIKfsIT1u647avHVA_JjVvDYSdtLD3nCrJs,338
8
+ relib/types.py,sha256=JzSGDl2L6tUWizGSsUpuyCKf-VKgtgfK_n21azSSMLM,288
9
+ relib-1.3.7.dist-info/METADATA,sha256=k2jncYQhiZXcQV12Bjev_1QmA148Cu6YP4iRIVhV0uo,1295
10
+ relib-1.3.7.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
11
+ relib-1.3.7.dist-info/licenses/LICENSE,sha256=9xVsdtv_-uSyY9Xl9yujwAPm4-mjcCLeVy-ljwXEWbo,1059
12
+ relib-1.3.7.dist-info/RECORD,,
@@ -1,11 +0,0 @@
1
- relib/__init__.py,sha256=WerjUaM_sNvudjXFudLRtXB7viZWEW1RSinkDjrh4nE,163
2
- relib/dict_utils.py,sha256=zuUkPI1uiElWUgt3ETdajG7S2grP5mX1qM0t2Cc1zy4,2968
3
- relib/io_utils.py,sha256=cUyUFhrMCUDfkINhYo32QPaVGz3chqDO3ElymSCoWEg,1086
4
- relib/iter_utils.py,sha256=xQOyNwYCc9fyKScyd56vx4CVCzZBDDROKVfnJuaInCM,5774
5
- relib/processing_utils.py,sha256=eMzjlxsEmfvtKafDITBWSp9D5RwegSWsUsvj1FpmBM0,1893
6
- relib/runtime_tools.py,sha256=50zfIXZwXXU6tGKM-1iS3FEax82vthgp-KNmvmIGlqE,2964
7
- relib/type_utils.py,sha256=oY96cAAux1JwhXgWFFyqEv_f-wwyPc_Hm6I9Yeisu_M,323
8
- relib-1.3.5.dist-info/METADATA,sha256=adnaXzA56Yff2cXRK79hAopNMnPs_rfwBBKs95l3neY,1295
9
- relib-1.3.5.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
10
- relib-1.3.5.dist-info/licenses/LICENSE,sha256=9xVsdtv_-uSyY9Xl9yujwAPm4-mjcCLeVy-ljwXEWbo,1059
11
- relib-1.3.5.dist-info/RECORD,,
File without changes