omlish 0.0.0.dev264__py3-none-any.whl → 0.0.0.dev266__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.
Files changed (54) hide show
  1. omlish/__about__.py +5 -5
  2. omlish/collections/__init__.py +5 -0
  3. omlish/collections/abc.py +24 -0
  4. omlish/collections/cache/descriptor.py +3 -0
  5. omlish/collections/cache/impl.py +3 -0
  6. omlish/collections/cache/types.py +3 -0
  7. omlish/collections/coerce.py +2 -1
  8. omlish/collections/frozen.py +3 -0
  9. omlish/collections/hasheq.py +3 -0
  10. omlish/collections/identity.py +3 -0
  11. omlish/collections/kv/__init__.py +51 -0
  12. omlish/collections/kv/base.py +55 -0
  13. omlish/collections/kv/capabilities.py +46 -0
  14. omlish/collections/kv/filtered.py +101 -0
  15. omlish/collections/kv/mappings.py +76 -0
  16. omlish/collections/kv/transformed.py +123 -0
  17. omlish/collections/kv/wrappers.py +99 -0
  18. omlish/collections/mappings.py +3 -0
  19. omlish/collections/ordered.py +3 -0
  20. omlish/collections/persistent/persistent.py +3 -0
  21. omlish/collections/persistent/treap.py +5 -1
  22. omlish/collections/persistent/treapmap.py +3 -0
  23. omlish/collections/sorted/sorted.py +3 -0
  24. omlish/collections/unmodifiable.py +3 -0
  25. omlish/inject/bindings.py +3 -0
  26. omlish/inject/eagers.py +3 -0
  27. omlish/inject/elements.py +4 -1
  28. omlish/inject/impl/elements.py +3 -0
  29. omlish/inject/impl/injector.py +3 -0
  30. omlish/inject/impl/multis.py +3 -0
  31. omlish/inject/impl/proxy.py +3 -0
  32. omlish/inject/impl/scopes.py +3 -0
  33. omlish/inject/injector.py +3 -0
  34. omlish/inject/inspect.py +3 -0
  35. omlish/inject/keys.py +3 -0
  36. omlish/inject/listeners.py +3 -0
  37. omlish/inject/multis.py +2 -0
  38. omlish/inject/origins.py +3 -0
  39. omlish/inject/overrides.py +3 -0
  40. omlish/inject/privates.py +3 -0
  41. omlish/inject/providers.py +3 -0
  42. omlish/inject/types.py +3 -0
  43. omlish/inject/utils.py +3 -0
  44. omlish/lang/__init__.py +2 -0
  45. omlish/lang/functions.py +14 -1
  46. omlish/lang/objects.py +18 -0
  47. omlish/term/codes.py +25 -17
  48. omlish/term/progressbar.py +29 -8
  49. {omlish-0.0.0.dev264.dist-info → omlish-0.0.0.dev266.dist-info}/METADATA +7 -7
  50. {omlish-0.0.0.dev264.dist-info → omlish-0.0.0.dev266.dist-info}/RECORD +54 -47
  51. {omlish-0.0.0.dev264.dist-info → omlish-0.0.0.dev266.dist-info}/WHEEL +0 -0
  52. {omlish-0.0.0.dev264.dist-info → omlish-0.0.0.dev266.dist-info}/entry_points.txt +0 -0
  53. {omlish-0.0.0.dev264.dist-info → omlish-0.0.0.dev266.dist-info}/licenses/LICENSE +0 -0
  54. {omlish-0.0.0.dev264.dist-info → omlish-0.0.0.dev266.dist-info}/top_level.txt +0 -0
@@ -7,6 +7,9 @@ K = ta.TypeVar('K')
7
7
  V = ta.TypeVar('V')
8
8
 
9
9
 
10
+ ##
11
+
12
+
10
13
  def multikey_dict(dct: ta.Mapping[ta.Iterable[K] | K, V], *, deep: bool = False) -> dict[K, V]:
11
14
  ret = {}
12
15
  for k, v in dct.items():
@@ -4,6 +4,9 @@ import typing as ta
4
4
  T = ta.TypeVar('T')
5
5
 
6
6
 
7
+ ##
8
+
9
+
7
10
  class OrderedSet(ta.MutableSet[T]):
8
11
  def __init__(self, iterable: ta.Iterable[T] | None = None) -> None:
9
12
  super().__init__()
@@ -6,6 +6,9 @@ K = ta.TypeVar('K')
6
6
  V = ta.TypeVar('V')
7
7
 
8
8
 
9
+ ##
10
+
11
+
9
12
  class PersistentMap(ta.Generic[K, V], abc.ABC):
10
13
  @abc.abstractmethod
11
14
  def __len__(self) -> int:
@@ -21,7 +21,11 @@ import typing as ta
21
21
 
22
22
 
23
23
  T = ta.TypeVar('T')
24
- Comparer = ta.Callable[[T, T], int]
24
+
25
+ Comparer: ta.TypeAlias = ta.Callable[[T, T], int]
26
+
27
+
28
+ ##
25
29
 
26
30
 
27
31
  class TreapNode(ta.Generic[T]):
@@ -28,6 +28,9 @@ K = ta.TypeVar('K')
28
28
  V = ta.TypeVar('V')
29
29
 
30
30
 
31
+ ##
32
+
33
+
31
34
  class TreapMap(PersistentMap[K, V]):
32
35
  __slots__ = ('_n', '_c')
33
36
 
@@ -10,6 +10,9 @@ K = ta.TypeVar('K')
10
10
  V = ta.TypeVar('V')
11
11
 
12
12
 
13
+ ##
14
+
15
+
13
16
  class SortedCollection(lang.Abstract, ta.Collection[T]):
14
17
  Comparator = ta.Callable[[U, U], int]
15
18
 
@@ -8,6 +8,9 @@ K = ta.TypeVar('K')
8
8
  V = ta.TypeVar('V')
9
9
 
10
10
 
11
+ ##
12
+
13
+
11
14
  class Unmodifiable(lang.Abstract):
12
15
  pass
13
16
 
omlish/inject/bindings.py CHANGED
@@ -8,6 +8,9 @@ from .types import Scope
8
8
  from .types import Unscoped
9
9
 
10
10
 
11
+ ##
12
+
13
+
11
14
  @dc.dataclass(frozen=True)
12
15
  @dc.extra_params(cache_hash=True)
13
16
  class Binding(Element, lang.Final):
omlish/inject/eagers.py CHANGED
@@ -9,6 +9,9 @@ from .elements import Element
9
9
  from .keys import Key
10
10
 
11
11
 
12
+ ##
13
+
14
+
12
15
  @dc.dataclass(frozen=True)
13
16
  @dc.extra_params(cache_hash=True)
14
17
  class Eager(Element, lang.Final):
omlish/inject/elements.py CHANGED
@@ -6,6 +6,9 @@ from .. import lang
6
6
  from .impl.origins import HasOriginsImpl
7
7
 
8
8
 
9
+ ##
10
+
11
+
9
12
  class Element(HasOriginsImpl, lang.Abstract, lang.PackageSealed):
10
13
  """Note: inheritors must be dataclasses."""
11
14
 
@@ -29,7 +32,7 @@ class Elements(lang.Final):
29
32
  yield from c
30
33
 
31
34
 
32
- Elemental = ta.Union[ # noqa
35
+ Elemental: ta.TypeAlias = ta.Union[ # noqa
33
36
  Element,
34
37
  Elements,
35
38
  ElementGenerator,
@@ -60,6 +60,9 @@ else:
60
60
  ElementT = ta.TypeVar('ElementT', bound=Element)
61
61
 
62
62
 
63
+ ##
64
+
65
+
63
66
  class ElementCollection(lang.Final):
64
67
  def __init__(self, es: Elements) -> None:
65
68
  super().__init__()
@@ -45,6 +45,9 @@ from .scopes import make_scope_impl
45
45
  log = logging.getLogger(__name__)
46
46
 
47
47
 
48
+ ##
49
+
50
+
48
51
  DEFAULT_SCOPES: list[Scope] = [
49
52
  Unscoped(),
50
53
  Singleton(),
@@ -14,6 +14,9 @@ from .providers import LinkProviderImpl
14
14
  from .providers import ProviderImpl
15
15
 
16
16
 
17
+ ##
18
+
19
+
17
20
  @dc.dataclass(frozen=True, eq=False)
18
21
  class SetProviderImpl(ProviderImpl, lang.Final):
19
22
  ps: ta.Sequence[ProviderImpl]
@@ -4,6 +4,9 @@ from ... import check
4
4
  from ... import lang
5
5
 
6
6
 
7
+ ##
8
+
9
+
7
10
  @lang.cached_function
8
11
  def _cyclic_dependency_proxy() -> tuple[type, ta.Callable[[ta.Any, ta.Any], None]]:
9
12
  import wrapt # noqa
@@ -38,6 +38,9 @@ else:
38
38
  injector_ = lang.proxy_import('.injector', __package__)
39
39
 
40
40
 
41
+ ##
42
+
43
+
41
44
  class ScopeImpl(lang.Abstract):
42
45
  @property
43
46
  @abc.abstractmethod
omlish/inject/injector.py CHANGED
@@ -17,6 +17,9 @@ else:
17
17
  T = ta.TypeVar('T')
18
18
 
19
19
 
20
+ ##
21
+
22
+
20
23
  class Injector(lang.Abstract):
21
24
  @abc.abstractmethod
22
25
  def try_provide(self, key: ta.Any) -> lang.Maybe[ta.Any]:
omlish/inject/inspect.py CHANGED
@@ -13,6 +13,9 @@ else:
13
13
  T = ta.TypeVar('T')
14
14
 
15
15
 
16
+ ##
17
+
18
+
16
19
  class Kwarg(ta.NamedTuple):
17
20
  name: str
18
21
  key: Key
omlish/inject/keys.py CHANGED
@@ -10,6 +10,9 @@ from .types import Tag
10
10
  T = ta.TypeVar('T')
11
11
 
12
12
 
13
+ ##
14
+
15
+
13
16
  @dc.dataclass(frozen=True)
14
17
  @dc.extra_params(cache_hash=True)
15
18
  class Key(lang.Final, ta.Generic[T]):
@@ -8,6 +8,9 @@ from .injector import Injector
8
8
  from .keys import Key
9
9
 
10
10
 
11
+ ##
12
+
13
+
11
14
  ProvisionListener: ta.TypeAlias = ta.Callable[[
12
15
  Injector,
13
16
  Key,
omlish/inject/multis.py CHANGED
@@ -69,6 +69,7 @@ class MapProvider(Provider):
69
69
  class SetBinder(ElementGenerator, ta.Generic[T]):
70
70
  def __init__(self, *, tag: ta.Any = None) -> None:
71
71
  super().__init__()
72
+
72
73
  self._tag: ta.Any = tag
73
74
  self._sbs: list[SetBinding] = []
74
75
 
@@ -96,6 +97,7 @@ class SetBinder(ElementGenerator, ta.Generic[T]):
96
97
  class MapBinder(ElementGenerator, ta.Generic[K, V]):
97
98
  def __init__(self, *, tag: ta.Any = None) -> None:
98
99
  super().__init__()
100
+
99
101
  self._tag: ta.Any = tag
100
102
  self._mbs: list[MapBinding] = []
101
103
 
omlish/inject/origins.py CHANGED
@@ -8,6 +8,9 @@ from .. import lang
8
8
  T = ta.TypeVar('T')
9
9
 
10
10
 
11
+ ##
12
+
13
+
11
14
  @dc.dataclass(frozen=True)
12
15
  @dc.extra_params(cache_hash=True)
13
16
  class Origin:
@@ -8,6 +8,9 @@ from .elements import Elements
8
8
  from .elements import as_elements
9
9
 
10
10
 
11
+ ##
12
+
13
+
11
14
  @dc.dataclass(frozen=True)
12
15
  @dc.extra_params(cache_hash=True)
13
16
  class Overrides(Element, lang.Final):
omlish/inject/privates.py CHANGED
@@ -9,6 +9,9 @@ from .keys import Key
9
9
  from .keys import as_key
10
10
 
11
11
 
12
+ ##
13
+
14
+
12
15
  @dc.dataclass(frozen=True)
13
16
  @dc.extra_params(cache_hash=True)
14
17
  class Expose(Element, lang.Final):
@@ -6,6 +6,9 @@ from .. import lang
6
6
  from .keys import Key
7
7
 
8
8
 
9
+ ##
10
+
11
+
9
12
  class _Missing(lang.NotInstantiable):
10
13
  pass
11
14
 
omlish/inject/types.py CHANGED
@@ -3,6 +3,9 @@ import collections
3
3
  from .. import lang
4
4
 
5
5
 
6
+ ##
7
+
8
+
6
9
  Tag = collections.namedtuple('Tag', 'tag') # noqa
7
10
 
8
11
 
omlish/inject/utils.py CHANGED
@@ -8,6 +8,9 @@ from .impl.origins import HasOriginsImpl
8
8
  T = ta.TypeVar('T')
9
9
 
10
10
 
11
+ ##
12
+
13
+
11
14
  @dc.dataclass(frozen=True, eq=False)
12
15
  class ConstFn(HasOriginsImpl, lang.Final, ta.Generic[T]):
13
16
  """An origin tracking provider function for a constant value. Equivalent to `lambda: v` but transparent."""
omlish/lang/__init__.py CHANGED
@@ -147,6 +147,7 @@ from .functions import ( # noqa
147
147
  raise_,
148
148
  raising,
149
149
  recurse,
150
+ strict_constant,
150
151
  try_,
151
152
  void,
152
153
  )
@@ -199,6 +200,7 @@ from .maybes import ( # noqa
199
200
 
200
201
  from .objects import ( # noqa
201
202
  SimpleProxy,
203
+ anon_object,
202
204
  arg_repr,
203
205
  attr_repr,
204
206
  build_mro_dict,
omlish/lang/functions.py CHANGED
@@ -92,16 +92,29 @@ def opt_fn(fn: ta.Callable[[F], T]) -> ta.Callable[[F | None], T | None]:
92
92
  return inner
93
93
 
94
94
 
95
- class constant(ta.Generic[T]): # noqa
95
+ ##
96
+
97
+
98
+ class _constant(ta.Generic[T]): # noqa
96
99
  def __init__(self, obj: T) -> None:
97
100
  super().__init__()
98
101
 
99
102
  self._obj = obj
100
103
 
104
+
105
+ class constant(_constant[T]): # noqa
106
+ def __call__(self, *args: ta.Any, **kwargs: ta.Any) -> T:
107
+ return self._obj
108
+
109
+
110
+ class strict_constant(_constant[T]): # noqa
101
111
  def __call__(self) -> T:
102
112
  return self._obj
103
113
 
104
114
 
115
+ ##
116
+
117
+
105
118
  def is_none(o: ta.Any) -> bool:
106
119
  return o is None
107
120
 
omlish/lang/objects.py CHANGED
@@ -199,3 +199,21 @@ class SimpleProxy(ta.Generic[T]):
199
199
 
200
200
  def __delattr__(self, item):
201
201
  delattr(object.__getattribute__(self, '__wrapped__'), item)
202
+
203
+
204
+ ##
205
+
206
+
207
+ class _AnonObject:
208
+ def __init__(self, **attrs: ta.Any) -> None:
209
+ super().__init__()
210
+
211
+ for k, v in attrs.items():
212
+ setattr(self, k, v)
213
+
214
+ def __init_subclass__(cls, **kwargs):
215
+ raise TypeError
216
+
217
+
218
+ def anon_object(**attrs: ta.Any) -> ta.Any:
219
+ return _AnonObject(**attrs)
omlish/term/codes.py CHANGED
@@ -29,6 +29,7 @@ def strip_ansi_codes(s: str) -> str:
29
29
  class ControlSequence:
30
30
  def __init__(self, fn: ta.Callable[..., str], desc: str) -> None:
31
31
  super().__init__()
32
+
32
33
  self._fn = fn
33
34
  self._desc = desc
34
35
 
@@ -40,19 +41,6 @@ class ControlSequence:
40
41
  return self._fn(*args, **kwargs)
41
42
 
42
43
 
43
- CUU = ControlSequence(lambda n: CSI + str(n) + 'A', 'Cursor Up')
44
- CUD = ControlSequence(lambda n: CSI + str(n) + 'B', 'Cursor Down')
45
- CUF = ControlSequence(lambda n: CSI + str(n) + 'C', 'Cursor Forward')
46
- CUB = ControlSequence(lambda n: CSI + str(n) + 'D', 'Cursor Back')
47
-
48
- CNL = ControlSequence(lambda n: CSI + str(n) + 'E', 'Cursor Next Line')
49
- CPL = ControlSequence(lambda n: CSI + str(n) + 'F', 'Cursor Previous Line')
50
- CHA = ControlSequence(lambda n: CSI + str(n) + 'G', 'Cursor Horizontal Line Absolute')
51
-
52
- CUP = ControlSequence(lambda n, m: CSI + str(n) + ';' + str(m) + 'H', 'Cursor Position')
53
- HVP = ControlSequence(lambda n, m: CSI + str(n) + ';' + str(m) + 'f', 'Horizontal Vertical Position')
54
-
55
-
56
44
  def _str_val(val: ta.Any) -> str:
57
45
  if isinstance(val, enum.Enum):
58
46
  return str(val.value)
@@ -60,6 +48,26 @@ def _str_val(val: ta.Any) -> str:
60
48
  return str(val)
61
49
 
62
50
 
51
+ def _opt_str_val(v):
52
+ if v is None:
53
+ return ''
54
+ else:
55
+ return _str_val(v)
56
+
57
+
58
+ CUU = ControlSequence(lambda n=None: CSI + _opt_str_val(n) + 'A', 'Cursor Up')
59
+ CUD = ControlSequence(lambda n=None: CSI + _opt_str_val(n) + 'B', 'Cursor Down')
60
+ CUF = ControlSequence(lambda n=None: CSI + _opt_str_val(n) + 'C', 'Cursor Forward')
61
+ CUB = ControlSequence(lambda n=None: CSI + _opt_str_val(n) + 'D', 'Cursor Back')
62
+
63
+ CNL = ControlSequence(lambda n=None: CSI + _opt_str_val(n) + 'E', 'Cursor Next Line')
64
+ CPL = ControlSequence(lambda n=None: CSI + _opt_str_val(n) + 'F', 'Cursor Previous Line')
65
+ CHA = ControlSequence(lambda n=None: CSI + _opt_str_val(n) + 'G', 'Cursor Horizontal Line Absolute')
66
+
67
+ CUP = ControlSequence(lambda n, m: CSI + str(n) + ';' + str(m) + 'H', 'Cursor Position')
68
+ HVP = ControlSequence(lambda n, m: CSI + str(n) + ';' + str(m) + 'f', 'Horizontal Vertical Position')
69
+
70
+
63
71
  class EDs(enum.Enum):
64
72
  FROM_CURSOR_TO_END = 0
65
73
  FROM_CURSOR_TO_BEGINNING = 1
@@ -67,7 +75,7 @@ class EDs(enum.Enum):
67
75
  ALL_AND_SCROLLBACK = 3
68
76
 
69
77
 
70
- ED = ControlSequence(lambda n: CSI + _str_val(n) + 'J', 'Erase in Display')
78
+ ED = ControlSequence(lambda n=None: CSI + _opt_str_val(n) + 'J', 'Erase in Display')
71
79
 
72
80
 
73
81
  class ELs(enum.Enum):
@@ -76,10 +84,10 @@ class ELs(enum.Enum):
76
84
  ALL = 2
77
85
 
78
86
 
79
- EL = ControlSequence(lambda n: CSI + _str_val(n) + 'K', 'Erase in Line')
87
+ EL = ControlSequence(lambda n=None: CSI + _opt_str_val(n) + 'K', 'Erase in Line')
80
88
 
81
- SU = ControlSequence(lambda n: CSI + str(n) + 'S', 'Scroll Up')
82
- SD = ControlSequence(lambda n: CSI + str(n) + 'T', 'Scroll Down')
89
+ SU = ControlSequence(lambda n=None: CSI + _opt_str_val(n) + 'S', 'Scroll Up')
90
+ SD = ControlSequence(lambda n=None: CSI + _opt_str_val(n) + 'T', 'Scroll Down')
83
91
 
84
92
  DSR = ControlSequence(lambda: CSI + '6n', 'Device Status Report')
85
93
 
@@ -1,3 +1,5 @@
1
+ # ruff: noqa: UP006 UP007
2
+ # @omlish-lite
1
3
  import sys
2
4
  import time
3
5
  import typing as ta
@@ -20,12 +22,12 @@ class ProgressBar:
20
22
 
21
23
  def __init__(
22
24
  self,
23
- total: int | None = None,
25
+ total: ta.Optional[int] = None,
24
26
  *,
25
27
  length: int = 40,
26
28
  interval: float = .2,
27
- start_time: float | None = None,
28
- out: ta.TextIO | None = None,
29
+ start_time: ta.Optional[float] = None,
30
+ out: ta.Optional[ta.TextIO] = None,
29
31
  ) -> None:
30
32
  super().__init__()
31
33
 
@@ -73,17 +75,25 @@ class ProgressBar:
73
75
  info = ' | '.join(info_parts)
74
76
  return f'{bar} {info}'
75
77
 
78
+ # Note: omitted, kept lite for now
79
+ # _LINE_UPDATE_PREFIX: ta.ClassVar[str] = ''.join([
80
+ # codes.EL(codes.ELs.ALL),
81
+ # codes.CHA(),
82
+ # ])
83
+
84
+ _LINE_UPDATE_PREFIX: ta.ClassVar[str] = '\033[2K\033['
85
+
76
86
  def print(
77
87
  self,
78
88
  *,
79
- now: float | None = None,
89
+ now: ta.Optional[float] = None,
80
90
  **kwargs: ta.Any,
81
91
  ) -> None:
82
92
  if now is None:
83
93
  now = time.time()
84
94
 
85
95
  line = self.render(**kwargs)
86
- self._out.write(f'\033[2K\033[G{line}')
96
+ self._out.write(f'{self._LINE_UPDATE_PREFIX}{line}')
87
97
  self._out.flush()
88
98
 
89
99
  self._last_print = now
@@ -92,7 +102,7 @@ class ProgressBar:
92
102
  self,
93
103
  n: int = 1,
94
104
  *,
95
- now: float | None = None,
105
+ now: ta.Optional[float] = None,
96
106
  silent: bool = False,
97
107
  ) -> None:
98
108
  if now is None:
@@ -110,8 +120,8 @@ def progress_bar(
110
120
  seq: ta.Iterable[T],
111
121
  *,
112
122
  no_tty_check: bool = False,
113
- total: int | None = None,
114
- out: ta.TextIO | None = None,
123
+ total: ta.Optional[int] = None,
124
+ out: ta.Optional[ta.TextIO] = None,
115
125
  **kwargs: ta.Any,
116
126
  ) -> ta.Generator[T, None, None]:
117
127
  if out is None:
@@ -137,3 +147,14 @@ def progress_bar(
137
147
 
138
148
  pb.print(complete=True)
139
149
  out.write('\n')
150
+
151
+
152
+ ##
153
+
154
+
155
+ if __name__ == '__main__':
156
+ def _main() -> None:
157
+ for _ in progress_bar(range(100), no_tty_check=True):
158
+ time.sleep(0.01)
159
+
160
+ _main()
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: omlish
3
- Version: 0.0.0.dev264
3
+ Version: 0.0.0.dev266
4
4
  Summary: omlish
5
5
  Author: wrmsr
6
6
  License: BSD-3-Clause
@@ -39,10 +39,10 @@ Requires-Dist: pymysql~=1.1; extra == "all"
39
39
  Requires-Dist: aiomysql~=0.2; extra == "all"
40
40
  Requires-Dist: aiosqlite~=0.21; extra == "all"
41
41
  Requires-Dist: asyncpg~=0.30; extra == "all"
42
- Requires-Dist: apsw~=3.47; extra == "all"
43
- Requires-Dist: sqlean.py~=3.45; extra == "all"
42
+ Requires-Dist: apsw~=3.49; extra == "all"
43
+ Requires-Dist: sqlean.py~=3.47; extra == "all"
44
44
  Requires-Dist: duckdb~=1.2; extra == "all"
45
- Requires-Dist: pytest~=8.0; extra == "all"
45
+ Requires-Dist: pytest~=8.3; extra == "all"
46
46
  Requires-Dist: anyio~=4.9; extra == "all"
47
47
  Requires-Dist: sniffio~=1.3; extra == "all"
48
48
  Requires-Dist: asttokens~=3.0; extra == "all"
@@ -85,11 +85,11 @@ Requires-Dist: pymysql~=1.1; extra == "sqldrivers"
85
85
  Requires-Dist: aiomysql~=0.2; extra == "sqldrivers"
86
86
  Requires-Dist: aiosqlite~=0.21; extra == "sqldrivers"
87
87
  Requires-Dist: asyncpg~=0.30; extra == "sqldrivers"
88
- Requires-Dist: apsw~=3.47; extra == "sqldrivers"
89
- Requires-Dist: sqlean.py~=3.45; extra == "sqldrivers"
88
+ Requires-Dist: apsw~=3.49; extra == "sqldrivers"
89
+ Requires-Dist: sqlean.py~=3.47; extra == "sqldrivers"
90
90
  Requires-Dist: duckdb~=1.2; extra == "sqldrivers"
91
91
  Provides-Extra: testing
92
- Requires-Dist: pytest~=8.0; extra == "testing"
92
+ Requires-Dist: pytest~=8.3; extra == "testing"
93
93
  Provides-Extra: plus
94
94
  Requires-Dist: anyio~=4.9; extra == "plus"
95
95
  Requires-Dist: sniffio~=1.3; extra == "plus"