omlish 0.0.0.dev389__py3-none-any.whl → 0.0.0.dev391__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.
omlish/__about__.py CHANGED
@@ -1,5 +1,5 @@
1
- __version__ = '0.0.0.dev389'
2
- __revision__ = '5ed30f9d1e6912ba1c80e1c14f4e8d7a5998cba1'
1
+ __version__ = '0.0.0.dev391'
2
+ __revision__ = '9d8e80442975d9c9e6041f0fd1f201daaace73fe'
3
3
 
4
4
 
5
5
  #
omlish/formats/yaml.py CHANGED
@@ -156,7 +156,7 @@ class _cached_class_property: # noqa
156
156
  return ret
157
157
 
158
158
 
159
- class WrappedLoaders(lang.Namespace):
159
+ class WrappedLoaders(lang.NotInstantiable):
160
160
  @staticmethod
161
161
  def _wrap(cls): # noqa
162
162
  return type('NodeWrapping$' + cls.__name__, (NodeWrappingConstructorMixin, cls), {})
omlish/io/pyio.py CHANGED
@@ -4,7 +4,7 @@
4
4
  """
5
5
  Python implementation of the io module.
6
6
 
7
- https://github.com/python/cpython/blob/8b3cccf3f9508572d85b0044519f2bd5715dacad/Lib/_pyio.py
7
+ https://github.com/python/cpython/blob/6cb20a219a860eaf687b2d968b41c480c7461909/Lib/_pyio.py
8
8
  """
9
9
  # PYTHON SOFTWARE FOUNDATION LICENSE VERSION 2
10
10
  # --------------------------------------------
@@ -255,11 +255,18 @@ def open(
255
255
  result = raw
256
256
  try:
257
257
  line_buffering = False
258
- if buffering == 1 or buffering < 0 and raw._isatty_open_only():
258
+ if buffering == 1 or buffering < 0 and raw.isatty():
259
259
  buffering = -1
260
260
  line_buffering = True
261
261
  if buffering < 0:
262
- buffering = raw._blksize
262
+ buffering = DEFAULT_BUFFER_SIZE
263
+ try:
264
+ bs = os.fstat(raw.fileno()).st_blksize
265
+ except (OSError, AttributeError):
266
+ pass
267
+ else:
268
+ if bs > 1:
269
+ buffering = bs
263
270
  if buffering < 0:
264
271
  raise ValueError('invalid buffering size')
265
272
  if buffering == 0:
@@ -425,6 +432,9 @@ class IOBase(metaclass=abc.ABCMeta):
425
432
  if closed:
426
433
  return
427
434
 
435
+ if dealloc_warn := getattr(self, "_dealloc_warn", None):
436
+ dealloc_warn(self)
437
+
428
438
  # If close() fails, the caller logs the exception with sys.unraisablehook. close() must be called at the end at
429
439
  # __del__().
430
440
  self.close()
@@ -873,6 +883,10 @@ class _BufferedIOMixin(BufferedIOBase):
873
883
  else:
874
884
  return f'<{modname}.{clsname} name={name!r}>'
875
885
 
886
+ def _dealloc_warn(self, source):
887
+ if dealloc_warn := getattr(self.raw, "_dealloc_warn", None):
888
+ dealloc_warn(source)
889
+
876
890
  # Lower-level APIs
877
891
 
878
892
  def fileno(self):
@@ -1484,7 +1498,6 @@ class FileIO(RawIOBase):
1484
1498
 
1485
1499
  if self._fd >= 0:
1486
1500
  # Have to close the existing file first.
1487
- self._stat_atopen = None
1488
1501
  try:
1489
1502
  if self._closefd:
1490
1503
  os.close(self._fd)
@@ -1553,21 +1566,25 @@ class FileIO(RawIOBase):
1553
1566
  if not isinstance(fd, int):
1554
1567
  raise TypeError('expected integer from opener')
1555
1568
  if fd < 0:
1556
- raise OSError('Negative file descriptor')
1569
+ # bpo-27066: Raise a ValueError for bad value.
1570
+ raise ValueError(f'opener returned {fd}')
1557
1571
  owned_fd = fd
1558
1572
  if not noinherit_flag:
1559
1573
  os.set_inheritable(fd, False)
1560
1574
 
1561
1575
  self._closefd = closefd
1562
- self._stat_atopen = os.fstat(fd)
1576
+ fdfstat = os.fstat(fd)
1563
1577
  try:
1564
- if stat.S_ISDIR(self._stat_atopen.st_mode):
1578
+ if stat.S_ISDIR(fdfstat.st_mode):
1565
1579
  raise IsADirectoryError(
1566
1580
  errno.EISDIR, os.strerror(errno.EISDIR), file,
1567
1581
  )
1568
1582
  except AttributeError:
1569
1583
  # Ignore the AttributeError if stat.S_ISDIR or errno.EISDIR don't exist.
1570
1584
  pass
1585
+ self._blksize = getattr(fdfstat, 'st_blksize', 0)
1586
+ if self._blksize <= 1:
1587
+ self._blksize = DEFAULT_BUFFER_SIZE
1571
1588
 
1572
1589
  self.name = file
1573
1590
  if self._appending:
@@ -1579,16 +1596,15 @@ class FileIO(RawIOBase):
1579
1596
  if e.errno != errno.ESPIPE:
1580
1597
  raise
1581
1598
  except: # noqa
1582
- self._stat_atopen = None
1583
1599
  if owned_fd is not None:
1584
1600
  os.close(owned_fd)
1585
1601
  raise
1586
1602
  self._fd = fd
1587
1603
 
1588
- def __del__(self):
1604
+ def _dealloc_warn(self, source):
1589
1605
  if self._fd >= 0 and self._closefd and not self.closed:
1590
- warnings.warn('unclosed file %r' % (self,), ResourceWarning, stacklevel=2, source=self)
1591
- self.close()
1606
+ import warnings
1607
+ warnings.warn(f'unclosed file {source!r}', ResourceWarning, stacklevel=2, source=self)
1592
1608
 
1593
1609
  def __getstate__(self):
1594
1610
  raise TypeError(f'cannot pickle {self.__class__.__name__!r} object')
@@ -1614,17 +1630,6 @@ class FileIO(RawIOBase):
1614
1630
  self._closefd,
1615
1631
  )
1616
1632
 
1617
- @property
1618
- def _blksize(self):
1619
- if self._stat_atopen is None:
1620
- return DEFAULT_BUFFER_SIZE
1621
-
1622
- blksize = getattr(self._stat_atopen, 'st_blksize', 0)
1623
- # WASI sets blsize to 0
1624
- if not blksize:
1625
- return DEFAULT_BUFFER_SIZE
1626
- return blksize
1627
-
1628
1633
  def _checkReadable(self):
1629
1634
  if not self._readable:
1630
1635
  raise UnsupportedOperation('File not open for reading')
@@ -1660,21 +1665,14 @@ class FileIO(RawIOBase):
1660
1665
 
1661
1666
  self._checkClosed()
1662
1667
  self._checkReadable()
1663
- if self._stat_atopen is None or self._stat_atopen.st_size <= 0:
1664
- bufsize = DEFAULT_BUFFER_SIZE
1665
- else:
1666
- # In order to detect end of file, need a read() of at least 1 byte which returns size 0. Oversize the buffer
1667
- # by 1 byte so the I/O can be completed with two read() calls (one for all data, one for EOF) without
1668
- # needing to resize the buffer.
1669
- bufsize = self._stat_atopen.st_size + 1
1670
-
1671
- if self._stat_atopen.st_size > 65536:
1672
- try:
1673
- pos = os.lseek(self._fd, 0, io.SEEK_CUR)
1674
- if self._stat_atopen.st_size >= pos:
1675
- bufsize = self._stat_atopen.st_size - pos + 1
1676
- except OSError:
1677
- pass
1668
+ bufsize = DEFAULT_BUFFER_SIZE
1669
+ try:
1670
+ pos = os.lseek(self._fd, 0, os.SEEK_CUR)
1671
+ end = os.fstat(self._fd).st_size
1672
+ if end >= pos:
1673
+ bufsize = end - pos + 1
1674
+ except OSError:
1675
+ pass
1678
1676
 
1679
1677
  result = bytearray()
1680
1678
  while True:
@@ -1756,7 +1754,6 @@ class FileIO(RawIOBase):
1756
1754
  if size is None:
1757
1755
  size = self.tell()
1758
1756
  os.ftruncate(self._fd, size)
1759
- self._stat_atopen = None
1760
1757
  return size
1761
1758
 
1762
1759
  def close(self):
@@ -1767,9 +1764,8 @@ class FileIO(RawIOBase):
1767
1764
  """
1768
1765
 
1769
1766
  if not self.closed:
1770
- self._stat_atopen = None
1771
1767
  try:
1772
- if self._closefd:
1768
+ if self._closefd and self._fd >= 0:
1773
1769
  os.close(self._fd)
1774
1770
  finally:
1775
1771
  super().close()
@@ -1811,20 +1807,6 @@ class FileIO(RawIOBase):
1811
1807
  self._checkClosed()
1812
1808
  return os.isatty(self._fd)
1813
1809
 
1814
- def _isatty_open_only(self):
1815
- """
1816
- Checks whether the file is a TTY using an open-only optimization.
1817
-
1818
- TTYs are always character devices. If the interpreter knows a file is not a character device when it would call
1819
- ``isatty``, can skip that call. Inside ``open()`` there is a fresh stat result that contains that information.
1820
- Use the stat result to skip a system call. Outside of that context TOCTOU issues (the fd could be arbitrarily
1821
- modified by surrounding code).
1822
- """
1823
-
1824
- if self._stat_atopen is not None and not stat.S_ISCHR(self._stat_atopen.st_mode):
1825
- return False
1826
- return os.isatty(self._fd)
1827
-
1828
1810
  @property
1829
1811
  def closefd(self):
1830
1812
  """True if the file descriptor will be closed by close()."""
@@ -2583,11 +2565,8 @@ class TextIOWrapper(TextIOBase):
2583
2565
  decoder = self._decoder or self._get_decoder()
2584
2566
 
2585
2567
  if size < 0:
2586
- chunk = self.buffer.read()
2587
- if chunk is None:
2588
- raise BlockingIOError("Read returned None.")
2589
2568
  # Read everything.
2590
- result = self._get_decoded_chars() + decoder.decode(chunk, final=True)
2569
+ result = self._get_decoded_chars() + decoder.decode(self.buffer.read(), final=True)
2591
2570
  if self._snapshot is not None:
2592
2571
  self._set_decoded_chars('')
2593
2572
  self._snapshot = None
@@ -2708,6 +2687,10 @@ class TextIOWrapper(TextIOBase):
2708
2687
  def newlines(self):
2709
2688
  return self._decoder.newlines if self._decoder else None
2710
2689
 
2690
+ def _dealloc_warn(self, source):
2691
+ if dealloc_warn := getattr(self.buffer, "_dealloc_warn", None):
2692
+ dealloc_warn(source)
2693
+
2711
2694
 
2712
2695
  class StringIO(TextIOWrapper):
2713
2696
  """
omlish/lite/maysyncs.py CHANGED
@@ -11,7 +11,8 @@ import typing as ta
11
11
 
12
12
  T = ta.TypeVar('T')
13
13
  T_co = ta.TypeVar('T_co', covariant=True)
14
- _X = ta.TypeVar('_X')
14
+
15
+ _MaysyncX = ta.TypeVar('_MaysyncX')
15
16
 
16
17
  _MaysyncGen = ta.Generator['_MaysyncOp', ta.Any, T] # ta.TypeAlias
17
18
 
@@ -40,11 +41,11 @@ class Maysync_(abc.ABC): # noqa
40
41
  ##
41
42
 
42
43
 
43
- class _Maywaitable(abc.ABC, ta.Generic[_X, T]):
44
+ class _Maywaitable(abc.ABC, ta.Generic[_MaysyncX, T]):
44
45
  @ta.final
45
46
  def __init__(
46
47
  self,
47
- x: _X,
48
+ x: _MaysyncX,
48
49
  *args: ta.Any,
49
50
  **kwargs: ta.Any,
50
51
  ) -> None:
@@ -115,6 +116,8 @@ class _MgMaysync(Maysync_, ta.Generic[T]):
115
116
  ) -> None:
116
117
  self.mg = mg
117
118
 
119
+ functools.update_wrapper(self, mg, updated=())
120
+
118
121
  def __get__(self, instance, owner=None):
119
122
  return _MgMaysync(
120
123
  self.mg.__get__(instance, owner), # noqa
@@ -188,7 +191,7 @@ class _MgMaysyncFn:
188
191
  def __init__(self, m):
189
192
  self.m = m
190
193
 
191
- functools.update_wrapper(self, m)
194
+ functools.update_wrapper(self, m, updated=())
192
195
 
193
196
  def __get__(self, instance, owner=None):
194
197
  return _MgMaysyncFn(
@@ -47,8 +47,6 @@ class AsyncsPlugin:
47
47
  bd: dict[str, AsyncsBackend] = {}
48
48
  for bc in backends:
49
49
  be = bc()
50
- if not be.is_available():
51
- continue
52
50
  bn = be.name
53
51
  check.not_in(bn, bd)
54
52
  bd[bn] = be
@@ -82,7 +80,8 @@ class AsyncsPlugin:
82
80
 
83
81
  for bn in bns:
84
82
  be = self._backends[bn]
85
- be.prepare_for_metafunc(metafunc)
83
+ if be.is_available():
84
+ be.prepare_for_metafunc(metafunc)
86
85
 
87
86
  metafunc.fixturenames.append(PARAM_NAME)
88
87
  metafunc.parametrize(PARAM_NAME, bns)
@@ -139,6 +138,9 @@ class AsyncsPlugin:
139
138
  if not is_coroutine_function(testfunc):
140
139
  pytest.fail(f'test function `{item!r}` is marked asyncs but is not async')
141
140
 
141
+ if not backend.is_available():
142
+ pytest.skip(f'backend `{backend.name}` is unavailable')
143
+
142
144
  @backend.wrap_runner
143
145
  async def _bootstrap_fixtures_and_run_test(**kwargs):
144
146
  __tracebackhide__ = True
@@ -98,6 +98,6 @@ def module_register(
98
98
 
99
99
  regex_register(
100
100
  pm,
101
- [rf'{re.escape(m.replace(".", "/"))}/.*\.py' for m in mods],
101
+ [rf'{re.escape(m.replace(".", "/"))}(/.*)?\.py' for m in mods],
102
102
  [rf'{re.escape(m.replace(".", "/"))}(\..*)?' for m in imp_mods],
103
103
  )
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: omlish
3
- Version: 0.0.0.dev389
3
+ Version: 0.0.0.dev391
4
4
  Summary: omlish
5
5
  Author: wrmsr
6
6
  License-Expression: BSD-3-Clause
@@ -1,5 +1,5 @@
1
1
  omlish/.manifests.json,sha256=aT8yZ-Zh-9wfHl5Ym5ouiWC1i0cy7Q7RlhzavB6VLPI,8587
2
- omlish/__about__.py,sha256=nywiLIvIX-iNrqLzoBB2G9Oux2R2MJWTjuu4s5X9qzM,3543
2
+ omlish/__about__.py,sha256=a6RkItgr_-dJttDWjLRSXAsJlAhjzEkuNmTdxKIRibk,3543
3
3
  omlish/__init__.py,sha256=SsyiITTuK0v74XpKV8dqNaCmjOlan1JZKrHQv5rWKPA,253
4
4
  omlish/c3.py,sha256=rer-TPOFDU6fYq_AWio_AmA-ckZ8JDY5shIzQ_yXfzA,8414
5
5
  omlish/cached.py,sha256=MLap_p0rdGoDIMVhXVHm1tsbcWobJF0OanoodV03Ju8,542
@@ -251,7 +251,7 @@ omlish/formats/pickle.py,sha256=jdp4E9WH9qVPBE3sSqbqDtUo18RbTSIiSpSzJ-IEVZw,529
251
251
  omlish/formats/props.py,sha256=rPycJ-_b76NSNc2b_dZ0F0zyKzuXK8v6K6fqcV8uCRQ,18933
252
252
  omlish/formats/repr.py,sha256=kYrNs4o-ji8nOdp6u_L3aMgBMWN1ZAZJSAWgQQfStSQ,414
253
253
  omlish/formats/xml.py,sha256=S_5txvWn8Gv4D8cS0-amxrsmvjBGap3gKMXqEkdtpss,3515
254
- omlish/formats/yaml.py,sha256=jGPQlTE0vSV-p0O7TJRNlf6o1uq4gx8PrHZe1ApJ_o8,7386
254
+ omlish/formats/yaml.py,sha256=yAyozZFbHIjNwexX81pnAIcpnGbJvWCras-8ifqWKFI,7392
255
255
  omlish/formats/edn/__init__.py,sha256=H3q5B-dibXvQV8pmuWizTo6Xk75M7M0M7VPCLt86rpo,195
256
256
  omlish/formats/edn/codec.py,sha256=k6-Ra3P3Rlv6JA69-jPLI4nCe5XVes_QJbcsj5DYzMM,454
257
257
  omlish/formats/edn/lexing.py,sha256=LaIaGql9NtRlgi6bs4XhZ-wtabiUs99PoYN7_yAKMNE,6892
@@ -390,7 +390,7 @@ omlish/io/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
390
390
  omlish/io/abc.py,sha256=M40QB2udYpCEqmlxCcHv6FlJYJY6ymmJQBlaklYv0U8,1256
391
391
  omlish/io/buffers.py,sha256=2ZAAZn-fTAtPCgtwcH_UJrSr5ZS9VNRp7yynufv0Rmk,7291
392
392
  omlish/io/fileno.py,sha256=_W3qxkIKpnabn1_7kgmKdx0IsPF3R334xWnF_TtkEj4,185
393
- omlish/io/pyio.py,sha256=UwtTYyFYDy050IzDP-71QH2W7RB2ZUsDFs59A_jpxAY,95438
393
+ omlish/io/pyio.py,sha256=xmHTV-sn7QZThWCVBo6lTM7dhgsQn7m2L0DqRwdF2-8,94509
394
394
  omlish/io/trampoline.py,sha256=yM7Evz7cgWpFj97IUiHgq9jfqpsx-deTSZwGl1qOnoM,7199
395
395
  omlish/io/compress/__init__.py,sha256=fJFPT4ONfqxmsA4jR6qbMt2woIyyEgnc_qOWK9o1kII,247
396
396
  omlish/io/compress/abc.py,sha256=P9YoQX8XYoq2UfBsinKLUuwwqV1ODUIJzjTraRWGF1M,3090
@@ -478,7 +478,7 @@ omlish/lite/json.py,sha256=m0Ce9eqUZG23-H7-oOp8n1sf4fzno5vtK4AK_4Vc-Mg,706
478
478
  omlish/lite/logs.py,sha256=CWFG0NKGhqNeEgryF5atN2gkPYbUdTINEw_s1phbINM,51
479
479
  omlish/lite/marshal.py,sha256=JD_8ox5-yeIo7MZ6iipCdiVxx33So52M02AtvFlRGC8,20392
480
480
  omlish/lite/maybes.py,sha256=0p_fzb6yiOjEpvMKaQ53Q6CH1VPW1or7v7Lt1JIKcgM,4359
481
- omlish/lite/maysyncs.py,sha256=qPYJw9adceaoW50PqyLRomlrhxjnzLBxswjyMaUk04M,5755
481
+ omlish/lite/maysyncs.py,sha256=ltB3CQ_zYl2PiTmHjtpeErZDFpNwj27JhO6_3xBmnfk,5852
482
482
  omlish/lite/pycharm.py,sha256=FRHGcCDo42UzZXqNwW_DkhI-6kb_CmJKPiQ8F6mYkLA,1174
483
483
  omlish/lite/reflect.py,sha256=pzOY2PPuHH0omdtglkN6DheXDrGopdL3PtTJnejyLFU,2189
484
484
  omlish/lite/reprs.py,sha256=Tiqf_ciD8FfS0ury7FcJ5G21yY342fW0vPacYlb8EO4,2014
@@ -775,7 +775,7 @@ omlish/testing/pytest/inject/__init__.py,sha256=pdRKv1HcDmJ_yArKJbYITPXXZthRSGgB
775
775
  omlish/testing/pytest/inject/harness.py,sha256=uaFDli1ovhue-kfXV5WXyLn6cVOWNQf_2vFD13r-JyQ,5700
776
776
  omlish/testing/pytest/plugins/__init__.py,sha256=ys1zXrYrNm7Uo6YOIVJ6Bd3dQo6kv387k7MbTYlqZSI,467
777
777
  omlish/testing/pytest/plugins/_registry.py,sha256=IK04KlBgiOJxKAyCCgjpX2R-9tE-btalYJkgjLc8Te8,77
778
- omlish/testing/pytest/plugins/depskip.py,sha256=dMrcmAHVv2-4ot6i_tvIUmENxbj-k8ov58zkhcjtd2o,3214
778
+ omlish/testing/pytest/plugins/depskip.py,sha256=erF9Ff7lmGR8g-lNGAbU0tLTl43dLzO5e6AUwJ6p4GA,3217
779
779
  omlish/testing/pytest/plugins/logging.py,sha256=8gelEK2rho1I5XtxH0XPfJwxF0O-CAMffcXbi2ZsbBI,395
780
780
  omlish/testing/pytest/plugins/managermarks.py,sha256=i8JtdLtR1kYkgcu5lCOTXXrY5qM4TOFW0lbS1CKB1Ts,1305
781
781
  omlish/testing/pytest/plugins/pydevd.py,sha256=umbQh8Dy1kDjpvV6F9Ld9un7boEkjx90S94h5pzHhO8,846
@@ -786,7 +786,7 @@ omlish/testing/pytest/plugins/utils.py,sha256=7NZIe_AiblFEm7fIOL66up4k0sdBL3RZgj
786
786
  omlish/testing/pytest/plugins/asyncs/__init__.py,sha256=TTNhFmP_krug1973sq_bpWBTIvg68-1nbuVLSs92Z6k,41
787
787
  omlish/testing/pytest/plugins/asyncs/consts.py,sha256=0NOCkzV43dOu3u97BqYMQ4mPG8JuFncpWibkOZpCqX4,55
788
788
  omlish/testing/pytest/plugins/asyncs/fixtures.py,sha256=O0gT4jVH-4t1WYpY2j51QgsbdK8LKt4R9hOxnf74eTg,11264
789
- omlish/testing/pytest/plugins/asyncs/plugin.py,sha256=Z7uKL-leu3aM10hX98_bKwWEvRYE2dAPLY2RbcHq-WQ,6005
789
+ omlish/testing/pytest/plugins/asyncs/plugin.py,sha256=cQEdInjYxXswOMexTdZTkcNpM3RKeQiKxdS7fjwIsq0,6088
790
790
  omlish/testing/pytest/plugins/asyncs/utils.py,sha256=YYh6XW_WmHnQCWw1jUMi0HOX_PkRnM-u5_dlVth2tt8,299
791
791
  omlish/testing/pytest/plugins/asyncs/backends/__init__.py,sha256=DpJGt5KA2N2pNXy59raVyJH1969M1AP80pJAqIlNEAs,359
792
792
  omlish/testing/pytest/plugins/asyncs/backends/asyncio.py,sha256=V4bPSbGRbSHuoRRMFhufqOam49oRycobtChN1eldvRI,825
@@ -895,9 +895,9 @@ omlish/typedvalues/marshal.py,sha256=AtBz7Jq-BfW8vwM7HSxSpR85JAXmxK2T0xDblmm1HI0
895
895
  omlish/typedvalues/of_.py,sha256=UXkxSj504WI2UrFlqdZJbu2hyDwBhL7XVrc2qdR02GQ,1309
896
896
  omlish/typedvalues/reflect.py,sha256=PAvKW6T4cW7u--iX80w3HWwZUS3SmIZ2_lQjT65uAyk,1026
897
897
  omlish/typedvalues/values.py,sha256=ym46I-q2QJ_6l4UlERqv3yj87R-kp8nCKMRph0xQ3UA,1307
898
- omlish-0.0.0.dev389.dist-info/licenses/LICENSE,sha256=B_hVtavaA8zCYDW99DYdcpDLKz1n3BBRjZrcbv8uG8c,1451
899
- omlish-0.0.0.dev389.dist-info/METADATA,sha256=YuiaRpmbQmDNnnQ-xxr5mY0iJC-fWVgVqlOANsG00BE,18825
900
- omlish-0.0.0.dev389.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
901
- omlish-0.0.0.dev389.dist-info/entry_points.txt,sha256=Lt84WvRZJskWCAS7xnQGZIeVWksprtUHj0llrvVmod8,35
902
- omlish-0.0.0.dev389.dist-info/top_level.txt,sha256=pePsKdLu7DvtUiecdYXJ78iO80uDNmBlqe-8hOzOmfs,7
903
- omlish-0.0.0.dev389.dist-info/RECORD,,
898
+ omlish-0.0.0.dev391.dist-info/licenses/LICENSE,sha256=B_hVtavaA8zCYDW99DYdcpDLKz1n3BBRjZrcbv8uG8c,1451
899
+ omlish-0.0.0.dev391.dist-info/METADATA,sha256=5_6xnSlNVHQd_t9th-Vt5lgyJkBo9FZtVJeqNOb9L4Q,18825
900
+ omlish-0.0.0.dev391.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
901
+ omlish-0.0.0.dev391.dist-info/entry_points.txt,sha256=Lt84WvRZJskWCAS7xnQGZIeVWksprtUHj0llrvVmod8,35
902
+ omlish-0.0.0.dev391.dist-info/top_level.txt,sha256=pePsKdLu7DvtUiecdYXJ78iO80uDNmBlqe-8hOzOmfs,7
903
+ omlish-0.0.0.dev391.dist-info/RECORD,,