omdev 0.0.0.dev428__py3-none-any.whl → 0.0.0.dev430__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.
@@ -27,7 +27,7 @@
27
27
  "module": ".cexts.cmake",
28
28
  "attr": "_CLI_MODULE",
29
29
  "file": "omdev/cexts/cmake.py",
30
- "line": 333,
30
+ "line": 332,
31
31
  "value": {
32
32
  "!.cli.types.CliModule": {
33
33
  "name": "cmake",
@@ -284,7 +284,7 @@
284
284
  "module": ".py.tools.mkrelimp",
285
285
  "attr": "_CLI_MODULE",
286
286
  "file": "omdev/py/tools/mkrelimp.py",
287
- "line": 149,
287
+ "line": 148,
288
288
  "value": {
289
289
  "!.cli.types.CliModule": {
290
290
  "name": "py/mkrelimp",
omdev/amalg/cli/main.py CHANGED
@@ -26,7 +26,6 @@ Targets:
26
26
  - supervisor?
27
27
  """
28
28
  import argparse
29
- import logging
30
29
  import os.path
31
30
  import stat
32
31
  import typing as ta
@@ -38,7 +37,7 @@ from ..gen.gen import SCAN_COMMENT
38
37
  from ..gen.gen import AmalgGenerator
39
38
 
40
39
 
41
- log = logging.getLogger(__name__)
40
+ log = logs.get_module_logger(globals())
42
41
 
43
42
 
44
43
  ##
omdev/cache/data/cache.py CHANGED
@@ -11,7 +11,6 @@ TODO:
11
11
  - download resume ala hf_hub
12
12
  """
13
13
  import contextlib
14
- import logging
15
14
  import os.path
16
15
  import shutil
17
16
  import subprocess
@@ -25,6 +24,7 @@ from omlish import check
25
24
  from omlish import lang
26
25
  from omlish import marshal as msh
27
26
  from omlish.formats import json
27
+ from omlish.logs import all as logs
28
28
  from omlish.os.files import touch
29
29
 
30
30
  from ...git.shallow import git_shallow_clone
@@ -37,7 +37,7 @@ from .specs import Spec
37
37
  from .specs import UrlSpec
38
38
 
39
39
 
40
- log = logging.getLogger(__name__)
40
+ log = logs.get_module_logger(globals())
41
41
 
42
42
 
43
43
  ##
@@ -37,7 +37,6 @@ License Agreement.
37
37
  """
38
38
  import contextlib
39
39
  import dataclasses as dc
40
- import logging
41
40
  import os
42
41
  import site
43
42
  import sys
@@ -46,6 +45,7 @@ import typing as ta
46
45
  from omlish import cached
47
46
  from omlish import check
48
47
  from omlish import lang
48
+ from omlish.logs import all as logs
49
49
 
50
50
  from . import compilers
51
51
  from . import errors
@@ -55,7 +55,10 @@ from . import sysconfig
55
55
  from . import util
56
56
 
57
57
 
58
- log = logging.getLogger(__name__)
58
+ log = logs.get_module_logger(globals())
59
+
60
+
61
+ ##
59
62
 
60
63
 
61
64
  def _get_str_config_var(name: str) -> str:
@@ -1,7 +1,6 @@
1
1
  """
2
2
  Contains CCompiler, an abstract base class that defines the interface for the Distutils compiler abstraction model.
3
3
  """
4
- import logging
5
4
  import os
6
5
  import re
7
6
  import sys
@@ -9,6 +8,7 @@ import typing as ta
9
8
  import warnings
10
9
 
11
10
  from omlish import check
11
+ from omlish.logs import all as logs
12
12
 
13
13
  from ..dir_util import mkpath
14
14
  from ..errors import CompileError
@@ -25,7 +25,10 @@ from .options import Macro
25
25
  from .options import gen_preprocess_options
26
26
 
27
27
 
28
- log = logging.getLogger(__name__)
28
+ log = logs.get_module_logger(globals())
29
+
30
+
31
+ ##
29
32
 
30
33
 
31
34
  class CCompiler:
@@ -4,6 +4,9 @@ import typing as ta
4
4
  from ..util import always_iterable
5
5
 
6
6
 
7
+ ##
8
+
9
+
7
10
  Macro: ta.TypeAlias = tuple[str, str | None] | tuple[str]
8
11
 
9
12
 
@@ -14,13 +14,14 @@ from __future__ import annotations
14
14
 
15
15
  import importlib
16
16
  import itertools
17
- import logging
18
17
  import os
19
18
  import re
20
19
  import shlex
21
20
  import sys
22
21
  import typing as ta
23
22
 
23
+ from omlish.logs import all as logs
24
+
24
25
  from .. import sysconfig
25
26
  from ..errors import CompileError
26
27
  from ..errors import DistutilsExecError
@@ -32,7 +33,10 @@ from .options import gen_lib_options
32
33
  from .options import gen_preprocess_options
33
34
 
34
35
 
35
- log = logging.getLogger(__name__)
36
+ log = logs.get_module_logger(globals())
37
+
38
+
39
+ ##
36
40
 
37
41
 
38
42
  def bypass_compiler_fixup(cmd, args):
@@ -1,13 +1,17 @@
1
1
  """Utility functions for manipulating directories and directory trees."""
2
2
  import errno
3
- import logging
4
3
  import os
5
4
 
5
+ from omlish.logs import all as logs
6
+
6
7
  from .errors import DistutilsFileError
7
8
  from .errors import DistutilsInternalError
8
9
 
9
10
 
10
- log = logging.getLogger(__name__)
11
+ log = logs.get_module_logger(globals())
12
+
13
+
14
+ ##
11
15
 
12
16
 
13
17
  # cache for by mkpath() -- in addition to cheapening redundant calls, eliminates redundant "creating /foo/bar/baz"
@@ -8,6 +8,9 @@ end with "Error".
8
8
  """
9
9
 
10
10
 
11
+ ##
12
+
13
+
11
14
  class DistutilsError(Exception):
12
15
  """The root of all Distutils evil."""
13
16
 
@@ -2,6 +2,9 @@
2
2
  import warnings
3
3
 
4
4
 
5
+ ##
6
+
7
+
5
8
  class Extension:
6
9
  """
7
10
  Just a collection of attributes that describes an extension module and everything needed to build it (hopefully in a
@@ -1,12 +1,16 @@
1
1
  """Utility functions for operating on single files."""
2
2
  import contextlib
3
- import logging
4
3
  import os
5
4
 
5
+ from omlish.logs import all as logs
6
+
6
7
  from .errors import DistutilsFileError
7
8
 
8
9
 
9
- log = logging.getLogger(__name__)
10
+ log = logs.get_module_logger(globals())
11
+
12
+
13
+ ##
10
14
 
11
15
 
12
16
  # for generating verbose output in 'copy_file()'
@@ -4,6 +4,9 @@ import os.path
4
4
  from .errors import DistutilsFileError
5
5
 
6
6
 
7
+ ##
8
+
9
+
7
10
  def _newer(source, target):
8
11
  return not os.path.exists(target) or (os.path.getmtime(source) > os.path.getmtime(target))
9
12
 
@@ -4,15 +4,19 @@ specific functions for launching another program in a sub-process.
4
4
  Also provides the 'find_executable()' to search the path for a given
5
5
  executable name.
6
6
  """
7
- import logging
8
7
  import os
9
8
  import subprocess
10
9
  import sys
11
10
 
11
+ from omlish.logs import all as logs
12
+
12
13
  from .errors import DistutilsExecError
13
14
 
14
15
 
15
- log = logging.getLogger(__name__)
16
+ log = logs.get_module_logger(globals())
17
+
18
+
19
+ ##
16
20
 
17
21
 
18
22
  def spawn(cmd, search_path=1, verbose=0, dry_run=False, env=None, debug=False): # noqa: C901
@@ -16,6 +16,9 @@ from .errors import DistutilsPlatformError
16
16
  from .util import pass_none
17
17
 
18
18
 
19
+ ##
20
+
21
+
19
22
  IS_PYPY = '__pypy__' in sys.builtin_module_names
20
23
 
21
24
  # These are needed in a couple of spots, so just compute them once.
@@ -1,6 +1,5 @@
1
1
  """Miscellaneous utility functions -- anything that doesn't fit into one of the other *util.py modules."""
2
2
  import functools
3
- import logging
4
3
  import os
5
4
  import re
6
5
  import string
@@ -8,10 +7,15 @@ import sys
8
7
  import sysconfig
9
8
  import typing as ta
10
9
 
10
+ from omlish.logs import all as logs
11
+
11
12
  from .errors import DistutilsPlatformError
12
13
 
13
14
 
14
- log = logging.getLogger(__name__)
15
+ log = logs.get_module_logger(globals())
16
+
17
+
18
+ ##
15
19
 
16
20
 
17
21
  def pass_none(func):
@@ -18,6 +18,9 @@ import re
18
18
  import warnings
19
19
 
20
20
 
21
+ ##
22
+
23
+
21
24
  @contextlib.contextmanager
22
25
  def suppress_known_deprecation():
23
26
  with warnings.catch_warnings(record=True) as ctx:
omdev/cexts/cmake.py CHANGED
@@ -33,7 +33,6 @@ Done:
33
33
  import argparse
34
34
  import dataclasses as dc
35
35
  import io
36
- import logging
37
36
  import os.path
38
37
  import shutil
39
38
  import sys
@@ -50,7 +49,7 @@ from ..cli import CliModule
50
49
  from .magic import CextMagic
51
50
 
52
51
 
53
- log = logging.getLogger(__name__)
52
+ log = logs.get_module_logger(globals())
54
53
 
55
54
 
56
55
  ##
omdev/cexts/scan.py CHANGED
@@ -1,5 +1,4 @@
1
1
  import argparse
2
- import logging
3
2
  import os.path
4
3
  import typing as ta
5
4
 
@@ -8,7 +7,7 @@ from omlish.logs import all as logs
8
7
  from .magic import CextMagic
9
8
 
10
9
 
11
- log = logging.getLogger(__name__)
10
+ log = logs.get_module_logger(globals())
12
11
 
13
12
 
14
13
  ##
@@ -8,7 +8,6 @@ TODO:
8
8
  - more sparse / diffuse intent, not package-level
9
9
  """
10
10
  import importlib
11
- import logging
12
11
  import os.path
13
12
  import typing as ta
14
13
 
@@ -21,9 +20,10 @@ from omlish.dataclasses.impl.generation.processor import Codegen as CodegenProce
21
20
  from omlish.dataclasses.impl.generation.processor import GeneratorProcessor
22
21
  from omlish.dataclasses.impl.processing.base import ProcessingContext
23
22
  from omlish.dataclasses.impl.processing.driving import processing_options_context
23
+ from omlish.logs import all as logs
24
24
 
25
25
 
26
- log = logging.getLogger(__name__)
26
+ log = logs.get_module_logger(globals())
27
27
 
28
28
 
29
29
  ##
omdev/precheck/lite.py CHANGED
@@ -2,13 +2,13 @@ import asyncio
2
2
  import dataclasses as dc
3
3
  import glob
4
4
  import inspect
5
- import logging
6
5
  import os.path
7
6
  import subprocess
8
7
  import textwrap
9
8
  import typing as ta
10
9
 
11
10
  from omlish import cached
11
+ from omlish.logs import all as logs
12
12
  from omlish.subprocesses.wrap import subprocess_maybe_shell_wrap_exec
13
13
 
14
14
  from .. import magic
@@ -16,7 +16,7 @@ from .base import Precheck
16
16
  from .base import PrecheckContext
17
17
 
18
18
 
19
- log = logging.getLogger(__name__)
19
+ log = logs.get_module_logger(globals())
20
20
 
21
21
 
22
22
  ##
omdev/precheck/main.py CHANGED
@@ -20,7 +20,6 @@ TODO:
20
20
  """
21
21
  import argparse
22
22
  import asyncio
23
- import logging
24
23
  import os.path
25
24
  import sys
26
25
  import typing as ta
@@ -43,7 +42,7 @@ from .scripts import ScriptDepsPrecheck
43
42
  from .unicode import UnicodePrecheck
44
43
 
45
44
 
46
- log = logging.getLogger(__name__)
45
+ log = logs.get_module_logger(globals())
47
46
 
48
47
 
49
48
  ##
@@ -1,6 +1,5 @@
1
1
  import argparse
2
2
  import itertools
3
- import logging
4
3
  import os.path
5
4
  import typing as ta
6
5
 
@@ -13,7 +12,7 @@ from ...tokens import all as tks
13
12
  T = ta.TypeVar('T')
14
13
 
15
14
 
16
- log = logging.getLogger(__name__)
15
+ log = logs.get_module_logger(globals())
17
16
 
18
17
 
19
18
  ##
omdev/scripts/ci.py CHANGED
@@ -1807,19 +1807,16 @@ def format_num_bytes(num_bytes: int) -> str:
1807
1807
  ##
1808
1808
 
1809
1809
 
1810
- class _LoggingContextInfo:
1811
- def __mro_entries__(self, bases):
1812
- return ()
1813
-
1814
-
1815
- LoggingContextInfo: type = ta.cast(ta.Any, _LoggingContextInfo())
1810
+ def logging_context_info(cls):
1811
+ return cls
1816
1812
 
1817
1813
 
1818
1814
  ##
1819
1815
 
1820
1816
 
1817
+ @logging_context_info
1821
1818
  @ta.final
1822
- class LoggingSourceFileInfo(LoggingContextInfo, ta.NamedTuple): # type: ignore[misc]
1819
+ class LoggingSourceFileInfo(ta.NamedTuple):
1823
1820
  file_name: str
1824
1821
  module: str
1825
1822
 
@@ -1836,16 +1833,17 @@ class LoggingSourceFileInfo(LoggingContextInfo, ta.NamedTuple): # type: ignore[
1836
1833
  return None
1837
1834
 
1838
1835
  return cls(
1839
- file_name,
1840
- module,
1836
+ file_name=file_name,
1837
+ module=module,
1841
1838
  )
1842
1839
 
1843
1840
 
1844
1841
  ##
1845
1842
 
1846
1843
 
1844
+ @logging_context_info
1847
1845
  @ta.final
1848
- class LoggingThreadInfo(LoggingContextInfo, ta.NamedTuple): # type: ignore[misc]
1846
+ class LoggingThreadInfo(ta.NamedTuple):
1849
1847
  ident: int
1850
1848
  native_id: ta.Optional[int]
1851
1849
  name: str
@@ -1853,31 +1851,33 @@ class LoggingThreadInfo(LoggingContextInfo, ta.NamedTuple): # type: ignore[misc
1853
1851
  @classmethod
1854
1852
  def build(cls) -> 'LoggingThreadInfo':
1855
1853
  return cls(
1856
- threading.get_ident(),
1857
- threading.get_native_id() if hasattr(threading, 'get_native_id') else None,
1858
- threading.current_thread().name,
1854
+ ident=threading.get_ident(),
1855
+ native_id=threading.get_native_id() if hasattr(threading, 'get_native_id') else None,
1856
+ name=threading.current_thread().name,
1859
1857
  )
1860
1858
 
1861
1859
 
1862
1860
  ##
1863
1861
 
1864
1862
 
1863
+ @logging_context_info
1865
1864
  @ta.final
1866
- class LoggingProcessInfo(LoggingContextInfo, ta.NamedTuple): # type: ignore[misc]
1865
+ class LoggingProcessInfo(ta.NamedTuple):
1867
1866
  pid: int
1868
1867
 
1869
1868
  @classmethod
1870
1869
  def build(cls) -> 'LoggingProcessInfo':
1871
1870
  return cls(
1872
- os.getpid(),
1871
+ pid=os.getpid(),
1873
1872
  )
1874
1873
 
1875
1874
 
1876
1875
  ##
1877
1876
 
1878
1877
 
1878
+ @logging_context_info
1879
1879
  @ta.final
1880
- class LoggingMultiprocessingInfo(LoggingContextInfo, ta.NamedTuple): # type: ignore[misc]
1880
+ class LoggingMultiprocessingInfo(ta.NamedTuple):
1881
1881
  process_name: str
1882
1882
 
1883
1883
  @classmethod
@@ -1887,15 +1887,16 @@ class LoggingMultiprocessingInfo(LoggingContextInfo, ta.NamedTuple): # type: ig
1887
1887
  return None
1888
1888
 
1889
1889
  return cls(
1890
- mp.current_process().name,
1890
+ process_name=mp.current_process().name,
1891
1891
  )
1892
1892
 
1893
1893
 
1894
1894
  ##
1895
1895
 
1896
1896
 
1897
+ @logging_context_info
1897
1898
  @ta.final
1898
- class LoggingAsyncioTaskInfo(LoggingContextInfo, ta.NamedTuple): # type: ignore[misc]
1899
+ class LoggingAsyncioTaskInfo(ta.NamedTuple):
1899
1900
  name: str
1900
1901
 
1901
1902
  @classmethod
@@ -1913,7 +1914,7 @@ class LoggingAsyncioTaskInfo(LoggingContextInfo, ta.NamedTuple): # type: ignore
1913
1914
  return None
1914
1915
 
1915
1916
  return cls(
1916
- task.get_name(), # Always non-None
1917
+ name=task.get_name(), # Always non-None
1917
1918
  )
1918
1919
 
1919
1920
 
@@ -1936,36 +1937,66 @@ class NamedLogLevel(int):
1936
1937
 
1937
1938
  #
1938
1939
 
1939
- @property
1940
- def exact_name(self) -> ta.Optional[str]:
1941
- return self._NAMES_BY_INT.get(self)
1940
+ _CACHE: ta.ClassVar[ta.MutableMapping[int, 'NamedLogLevel']] = {}
1941
+
1942
+ @ta.overload
1943
+ def __new__(cls, name: str, offset: int = 0, /) -> 'NamedLogLevel':
1944
+ ...
1942
1945
 
1943
- _effective_name: ta.Optional[str]
1946
+ @ta.overload
1947
+ def __new__(cls, i: int, /) -> 'NamedLogLevel':
1948
+ ...
1949
+
1950
+ def __new__(cls, x, offset=0, /):
1951
+ if isinstance(x, str):
1952
+ return cls(cls._INTS_BY_NAME[x.upper()] + offset)
1953
+ elif not offset and (c := cls._CACHE.get(x)) is not None:
1954
+ return c
1955
+ else:
1956
+ return super().__new__(cls, x + offset)
1957
+
1958
+ #
1959
+
1960
+ _name_and_offset: ta.Tuple[str, int]
1944
1961
 
1945
1962
  @property
1946
- def effective_name(self) -> ta.Optional[str]:
1963
+ def name_and_offset(self) -> ta.Tuple[str, int]:
1947
1964
  try:
1948
- return self._effective_name
1965
+ return self._name_and_offset
1949
1966
  except AttributeError:
1950
1967
  pass
1951
1968
 
1952
- if (n := self.exact_name) is None:
1969
+ if (n := self._NAMES_BY_INT.get(self)) is not None:
1970
+ t = (n, 0)
1971
+ else:
1953
1972
  for n, i in self._NAME_INT_PAIRS: # noqa
1954
1973
  if self >= i:
1974
+ t = (n, (self - i))
1955
1975
  break
1956
1976
  else:
1957
- n = None
1977
+ t = ('NOTSET', int(self))
1958
1978
 
1959
- self._effective_name = n
1979
+ self._name_and_offset = t
1980
+ return t
1981
+
1982
+ @property
1983
+ def exact_name(self) -> ta.Optional[str]:
1984
+ n, o = self.name_and_offset
1985
+ return n if not o else None
1986
+
1987
+ @property
1988
+ def effective_name(self) -> str:
1989
+ n, _ = self.name_and_offset
1960
1990
  return n
1961
1991
 
1962
1992
  #
1963
1993
 
1964
- def __repr__(self) -> str:
1965
- return f'{self.__class__.__name__}({int(self)})'
1966
-
1967
1994
  def __str__(self) -> str:
1968
- return self.exact_name or f'{self.effective_name or "INVALID"}:{int(self)}'
1995
+ return self.exact_name or f'{self.effective_name}{int(self):+}'
1996
+
1997
+ def __repr__(self) -> str:
1998
+ n, o = self.name_and_offset
1999
+ return f'{self.__class__.__name__}({n!r}{f", {int(o)}" if o else ""})'
1969
2000
 
1970
2001
  #
1971
2002
 
@@ -1985,6 +2016,9 @@ NamedLogLevel.DEBUG = NamedLogLevel(logging.DEBUG)
1985
2016
  NamedLogLevel.NOTSET = NamedLogLevel(logging.NOTSET)
1986
2017
 
1987
2018
 
2019
+ NamedLogLevel._CACHE.update({i: NamedLogLevel(i) for i in NamedLogLevel._NAMES_BY_INT}) # noqa
2020
+
2021
+
1988
2022
  ########################################
1989
2023
  # ../../../omlish/logs/std/filters.py
1990
2024
 
@@ -4952,7 +4986,9 @@ class PredicateTimeout(Timeout):
4952
4986
  ##
4953
4987
 
4954
4988
 
4955
- class LoggingCaller(LoggingContextInfo, ta.NamedTuple): # type: ignore[misc]
4989
+ @logging_context_info
4990
+ @ta.final
4991
+ class LoggingCaller(ta.NamedTuple):
4956
4992
  file_path: str
4957
4993
  line_no: int
4958
4994
  name: str
@@ -5005,10 +5041,10 @@ class LoggingCaller(LoggingContextInfo, ta.NamedTuple): # type: ignore[misc]
5005
5041
  sinfo = sinfo[:-1]
5006
5042
 
5007
5043
  return cls(
5008
- f.f_code.co_filename,
5009
- f.f_lineno or 0,
5010
- f.f_code.co_name,
5011
- sinfo,
5044
+ file_path=f.f_code.co_filename,
5045
+ line_no=f.f_lineno or 0,
5046
+ name=f.f_code.co_name,
5047
+ stack_info=sinfo,
5012
5048
  )
5013
5049
 
5014
5050
 
@@ -5019,6 +5055,7 @@ class LoggingCaller(LoggingContextInfo, ta.NamedTuple): # type: ignore[misc]
5019
5055
  ##
5020
5056
 
5021
5057
 
5058
+ @ta.runtime_checkable
5022
5059
  class LoggerLike(ta.Protocol):
5023
5060
  """Satisfied by both our Logger and stdlib logging.Logger."""
5024
5061
 
@@ -5107,7 +5144,9 @@ class JsonLoggingFormatter(logging.Formatter):
5107
5144
  ##
5108
5145
 
5109
5146
 
5110
- class LoggingTimeFields(LoggingContextInfo, ta.NamedTuple): # type: ignore[misc]
5147
+ @logging_context_info
5148
+ @ta.final
5149
+ class LoggingTimeFields(ta.NamedTuple):
5111
5150
  """Maps directly to stdlib `logging.LogRecord` fields, and must be kept in sync with it."""
5112
5151
 
5113
5152
  created: float
@@ -5155,9 +5194,9 @@ class LoggingTimeFields(LoggingContextInfo, ta.NamedTuple): # type: ignore[misc
5155
5194
  relative_created = (time_ns - start_time_ns) / 1e6
5156
5195
 
5157
5196
  return cls(
5158
- created,
5159
- msecs,
5160
- relative_created,
5197
+ created=created,
5198
+ msecs=msecs,
5199
+ relative_created=relative_created,
5161
5200
  )
5162
5201
 
5163
5202
 
@@ -9432,7 +9471,7 @@ class CoroHttpServer:
9432
9471
 
9433
9472
  class AnyLogger(Abstract, ta.Generic[T]):
9434
9473
  def is_enabled_for(self, level: LogLevel) -> bool:
9435
- return self.get_effective_level() >= level
9474
+ return level >= self.get_effective_level()
9436
9475
 
9437
9476
  @abc.abstractmethod
9438
9477
  def get_effective_level(self) -> LogLevel:
@@ -9629,7 +9668,7 @@ class AsyncLogger(AnyLogger[ta.Awaitable[None]], Abstract):
9629
9668
  class AnyNopLogger(AnyLogger[T], Abstract):
9630
9669
  @ta.final
9631
9670
  def get_effective_level(self) -> LogLevel:
9632
- return 999
9671
+ return -999
9633
9672
 
9634
9673
 
9635
9674
  @ta.final
@@ -10010,7 +10049,7 @@ def generate_temp_localhost_ssl_cert() -> TempSslCert:
10010
10049
 
10011
10050
 
10012
10051
  class SocketServer:
10013
- _DEFAULT_LOGGER = logging.getLogger('.'.join([__name__, 'SocketServer']))
10052
+ _DEFAULT_LOGGER: LoggerLike = logging.getLogger('.'.join([__name__, 'SocketServer'])) # FIXME
10014
10053
 
10015
10054
  def __init__(
10016
10055
  self,
@@ -11132,7 +11171,7 @@ class CoroHttpServerSocketHandler(SocketHandler_):
11132
11171
 
11133
11172
 
11134
11173
  ########################################
11135
- # ../../../omlish/logs/std/adapters.py
11174
+ # ../../../omlish/logs/std/loggers.py
11136
11175
 
11137
11176
 
11138
11177
  ##
@@ -11148,6 +11187,9 @@ class StdLogger(Logger):
11148
11187
  def std(self) -> logging.Logger:
11149
11188
  return self._std
11150
11189
 
11190
+ def is_enabled_for(self, level: LogLevel) -> bool:
11191
+ return self._std.isEnabledFor(level)
11192
+
11151
11193
  def get_effective_level(self) -> LogLevel:
11152
11194
  return self._std.getEffectiveLevel()
11153
11195
 
omdev/scripts/interp.py CHANGED
@@ -1407,36 +1407,66 @@ class NamedLogLevel(int):
1407
1407
 
1408
1408
  #
1409
1409
 
1410
- @property
1411
- def exact_name(self) -> ta.Optional[str]:
1412
- return self._NAMES_BY_INT.get(self)
1410
+ _CACHE: ta.ClassVar[ta.MutableMapping[int, 'NamedLogLevel']] = {}
1411
+
1412
+ @ta.overload
1413
+ def __new__(cls, name: str, offset: int = 0, /) -> 'NamedLogLevel':
1414
+ ...
1415
+
1416
+ @ta.overload
1417
+ def __new__(cls, i: int, /) -> 'NamedLogLevel':
1418
+ ...
1419
+
1420
+ def __new__(cls, x, offset=0, /):
1421
+ if isinstance(x, str):
1422
+ return cls(cls._INTS_BY_NAME[x.upper()] + offset)
1423
+ elif not offset and (c := cls._CACHE.get(x)) is not None:
1424
+ return c
1425
+ else:
1426
+ return super().__new__(cls, x + offset)
1427
+
1428
+ #
1413
1429
 
1414
- _effective_name: ta.Optional[str]
1430
+ _name_and_offset: ta.Tuple[str, int]
1415
1431
 
1416
1432
  @property
1417
- def effective_name(self) -> ta.Optional[str]:
1433
+ def name_and_offset(self) -> ta.Tuple[str, int]:
1418
1434
  try:
1419
- return self._effective_name
1435
+ return self._name_and_offset
1420
1436
  except AttributeError:
1421
1437
  pass
1422
1438
 
1423
- if (n := self.exact_name) is None:
1439
+ if (n := self._NAMES_BY_INT.get(self)) is not None:
1440
+ t = (n, 0)
1441
+ else:
1424
1442
  for n, i in self._NAME_INT_PAIRS: # noqa
1425
1443
  if self >= i:
1444
+ t = (n, (self - i))
1426
1445
  break
1427
1446
  else:
1428
- n = None
1447
+ t = ('NOTSET', int(self))
1448
+
1449
+ self._name_and_offset = t
1450
+ return t
1451
+
1452
+ @property
1453
+ def exact_name(self) -> ta.Optional[str]:
1454
+ n, o = self.name_and_offset
1455
+ return n if not o else None
1429
1456
 
1430
- self._effective_name = n
1457
+ @property
1458
+ def effective_name(self) -> str:
1459
+ n, _ = self.name_and_offset
1431
1460
  return n
1432
1461
 
1433
1462
  #
1434
1463
 
1435
- def __repr__(self) -> str:
1436
- return f'{self.__class__.__name__}({int(self)})'
1437
-
1438
1464
  def __str__(self) -> str:
1439
- return self.exact_name or f'{self.effective_name or "INVALID"}:{int(self)}'
1465
+ return self.exact_name or f'{self.effective_name}{int(self):+}'
1466
+
1467
+ def __repr__(self) -> str:
1468
+ n, o = self.name_and_offset
1469
+ return f'{self.__class__.__name__}({n!r}{f", {int(o)}" if o else ""})'
1440
1470
 
1441
1471
  #
1442
1472
 
@@ -1456,6 +1486,9 @@ NamedLogLevel.DEBUG = NamedLogLevel(logging.DEBUG)
1456
1486
  NamedLogLevel.NOTSET = NamedLogLevel(logging.NOTSET)
1457
1487
 
1458
1488
 
1489
+ NamedLogLevel._CACHE.update({i: NamedLogLevel(i) for i in NamedLogLevel._NAMES_BY_INT}) # noqa
1490
+
1491
+
1459
1492
  ########################################
1460
1493
  # ../../../omlish/logs/std/filters.py
1461
1494
 
@@ -2826,6 +2859,7 @@ class PredicateTimeout(Timeout):
2826
2859
  ##
2827
2860
 
2828
2861
 
2862
+ @ta.runtime_checkable
2829
2863
  class LoggerLike(ta.Protocol):
2830
2864
  """Satisfied by both our Logger and stdlib logging.Logger."""
2831
2865
 
@@ -2966,19 +2966,16 @@ def typing_annotations_attr() -> str:
2966
2966
  ##
2967
2967
 
2968
2968
 
2969
- class _LoggingContextInfo:
2970
- def __mro_entries__(self, bases):
2971
- return ()
2972
-
2973
-
2974
- LoggingContextInfo: type = ta.cast(ta.Any, _LoggingContextInfo())
2969
+ def logging_context_info(cls):
2970
+ return cls
2975
2971
 
2976
2972
 
2977
2973
  ##
2978
2974
 
2979
2975
 
2976
+ @logging_context_info
2980
2977
  @ta.final
2981
- class LoggingSourceFileInfo(LoggingContextInfo, ta.NamedTuple): # type: ignore[misc]
2978
+ class LoggingSourceFileInfo(ta.NamedTuple):
2982
2979
  file_name: str
2983
2980
  module: str
2984
2981
 
@@ -2995,16 +2992,17 @@ class LoggingSourceFileInfo(LoggingContextInfo, ta.NamedTuple): # type: ignore[
2995
2992
  return None
2996
2993
 
2997
2994
  return cls(
2998
- file_name,
2999
- module,
2995
+ file_name=file_name,
2996
+ module=module,
3000
2997
  )
3001
2998
 
3002
2999
 
3003
3000
  ##
3004
3001
 
3005
3002
 
3003
+ @logging_context_info
3006
3004
  @ta.final
3007
- class LoggingThreadInfo(LoggingContextInfo, ta.NamedTuple): # type: ignore[misc]
3005
+ class LoggingThreadInfo(ta.NamedTuple):
3008
3006
  ident: int
3009
3007
  native_id: ta.Optional[int]
3010
3008
  name: str
@@ -3012,31 +3010,33 @@ class LoggingThreadInfo(LoggingContextInfo, ta.NamedTuple): # type: ignore[misc
3012
3010
  @classmethod
3013
3011
  def build(cls) -> 'LoggingThreadInfo':
3014
3012
  return cls(
3015
- threading.get_ident(),
3016
- threading.get_native_id() if hasattr(threading, 'get_native_id') else None,
3017
- threading.current_thread().name,
3013
+ ident=threading.get_ident(),
3014
+ native_id=threading.get_native_id() if hasattr(threading, 'get_native_id') else None,
3015
+ name=threading.current_thread().name,
3018
3016
  )
3019
3017
 
3020
3018
 
3021
3019
  ##
3022
3020
 
3023
3021
 
3022
+ @logging_context_info
3024
3023
  @ta.final
3025
- class LoggingProcessInfo(LoggingContextInfo, ta.NamedTuple): # type: ignore[misc]
3024
+ class LoggingProcessInfo(ta.NamedTuple):
3026
3025
  pid: int
3027
3026
 
3028
3027
  @classmethod
3029
3028
  def build(cls) -> 'LoggingProcessInfo':
3030
3029
  return cls(
3031
- os.getpid(),
3030
+ pid=os.getpid(),
3032
3031
  )
3033
3032
 
3034
3033
 
3035
3034
  ##
3036
3035
 
3037
3036
 
3037
+ @logging_context_info
3038
3038
  @ta.final
3039
- class LoggingMultiprocessingInfo(LoggingContextInfo, ta.NamedTuple): # type: ignore[misc]
3039
+ class LoggingMultiprocessingInfo(ta.NamedTuple):
3040
3040
  process_name: str
3041
3041
 
3042
3042
  @classmethod
@@ -3046,15 +3046,16 @@ class LoggingMultiprocessingInfo(LoggingContextInfo, ta.NamedTuple): # type: ig
3046
3046
  return None
3047
3047
 
3048
3048
  return cls(
3049
- mp.current_process().name,
3049
+ process_name=mp.current_process().name,
3050
3050
  )
3051
3051
 
3052
3052
 
3053
3053
  ##
3054
3054
 
3055
3055
 
3056
+ @logging_context_info
3056
3057
  @ta.final
3057
- class LoggingAsyncioTaskInfo(LoggingContextInfo, ta.NamedTuple): # type: ignore[misc]
3058
+ class LoggingAsyncioTaskInfo(ta.NamedTuple):
3058
3059
  name: str
3059
3060
 
3060
3061
  @classmethod
@@ -3072,7 +3073,7 @@ class LoggingAsyncioTaskInfo(LoggingContextInfo, ta.NamedTuple): # type: ignore
3072
3073
  return None
3073
3074
 
3074
3075
  return cls(
3075
- task.get_name(), # Always non-None
3076
+ name=task.get_name(), # Always non-None
3076
3077
  )
3077
3078
 
3078
3079
 
@@ -3095,36 +3096,66 @@ class NamedLogLevel(int):
3095
3096
 
3096
3097
  #
3097
3098
 
3098
- @property
3099
- def exact_name(self) -> ta.Optional[str]:
3100
- return self._NAMES_BY_INT.get(self)
3099
+ _CACHE: ta.ClassVar[ta.MutableMapping[int, 'NamedLogLevel']] = {}
3100
+
3101
+ @ta.overload
3102
+ def __new__(cls, name: str, offset: int = 0, /) -> 'NamedLogLevel':
3103
+ ...
3101
3104
 
3102
- _effective_name: ta.Optional[str]
3105
+ @ta.overload
3106
+ def __new__(cls, i: int, /) -> 'NamedLogLevel':
3107
+ ...
3108
+
3109
+ def __new__(cls, x, offset=0, /):
3110
+ if isinstance(x, str):
3111
+ return cls(cls._INTS_BY_NAME[x.upper()] + offset)
3112
+ elif not offset and (c := cls._CACHE.get(x)) is not None:
3113
+ return c
3114
+ else:
3115
+ return super().__new__(cls, x + offset)
3116
+
3117
+ #
3118
+
3119
+ _name_and_offset: ta.Tuple[str, int]
3103
3120
 
3104
3121
  @property
3105
- def effective_name(self) -> ta.Optional[str]:
3122
+ def name_and_offset(self) -> ta.Tuple[str, int]:
3106
3123
  try:
3107
- return self._effective_name
3124
+ return self._name_and_offset
3108
3125
  except AttributeError:
3109
3126
  pass
3110
3127
 
3111
- if (n := self.exact_name) is None:
3128
+ if (n := self._NAMES_BY_INT.get(self)) is not None:
3129
+ t = (n, 0)
3130
+ else:
3112
3131
  for n, i in self._NAME_INT_PAIRS: # noqa
3113
3132
  if self >= i:
3133
+ t = (n, (self - i))
3114
3134
  break
3115
3135
  else:
3116
- n = None
3136
+ t = ('NOTSET', int(self))
3117
3137
 
3118
- self._effective_name = n
3138
+ self._name_and_offset = t
3139
+ return t
3140
+
3141
+ @property
3142
+ def exact_name(self) -> ta.Optional[str]:
3143
+ n, o = self.name_and_offset
3144
+ return n if not o else None
3145
+
3146
+ @property
3147
+ def effective_name(self) -> str:
3148
+ n, _ = self.name_and_offset
3119
3149
  return n
3120
3150
 
3121
3151
  #
3122
3152
 
3123
- def __repr__(self) -> str:
3124
- return f'{self.__class__.__name__}({int(self)})'
3125
-
3126
3153
  def __str__(self) -> str:
3127
- return self.exact_name or f'{self.effective_name or "INVALID"}:{int(self)}'
3154
+ return self.exact_name or f'{self.effective_name}{int(self):+}'
3155
+
3156
+ def __repr__(self) -> str:
3157
+ n, o = self.name_and_offset
3158
+ return f'{self.__class__.__name__}({n!r}{f", {int(o)}" if o else ""})'
3128
3159
 
3129
3160
  #
3130
3161
 
@@ -3144,6 +3175,9 @@ NamedLogLevel.DEBUG = NamedLogLevel(logging.DEBUG)
3144
3175
  NamedLogLevel.NOTSET = NamedLogLevel(logging.NOTSET)
3145
3176
 
3146
3177
 
3178
+ NamedLogLevel._CACHE.update({i: NamedLogLevel(i) for i in NamedLogLevel._NAMES_BY_INT}) # noqa
3179
+
3180
+
3147
3181
  ########################################
3148
3182
  # ../../../omlish/logs/std/filters.py
3149
3183
 
@@ -5532,7 +5566,9 @@ class PredicateTimeout(Timeout):
5532
5566
  ##
5533
5567
 
5534
5568
 
5535
- class LoggingCaller(LoggingContextInfo, ta.NamedTuple): # type: ignore[misc]
5569
+ @logging_context_info
5570
+ @ta.final
5571
+ class LoggingCaller(ta.NamedTuple):
5536
5572
  file_path: str
5537
5573
  line_no: int
5538
5574
  name: str
@@ -5585,10 +5621,10 @@ class LoggingCaller(LoggingContextInfo, ta.NamedTuple): # type: ignore[misc]
5585
5621
  sinfo = sinfo[:-1]
5586
5622
 
5587
5623
  return cls(
5588
- f.f_code.co_filename,
5589
- f.f_lineno or 0,
5590
- f.f_code.co_name,
5591
- sinfo,
5624
+ file_path=f.f_code.co_filename,
5625
+ line_no=f.f_lineno or 0,
5626
+ name=f.f_code.co_name,
5627
+ stack_info=sinfo,
5592
5628
  )
5593
5629
 
5594
5630
 
@@ -5599,6 +5635,7 @@ class LoggingCaller(LoggingContextInfo, ta.NamedTuple): # type: ignore[misc]
5599
5635
  ##
5600
5636
 
5601
5637
 
5638
+ @ta.runtime_checkable
5602
5639
  class LoggerLike(ta.Protocol):
5603
5640
  """Satisfied by both our Logger and stdlib logging.Logger."""
5604
5641
 
@@ -5687,7 +5724,9 @@ class JsonLoggingFormatter(logging.Formatter):
5687
5724
  ##
5688
5725
 
5689
5726
 
5690
- class LoggingTimeFields(LoggingContextInfo, ta.NamedTuple): # type: ignore[misc]
5727
+ @logging_context_info
5728
+ @ta.final
5729
+ class LoggingTimeFields(ta.NamedTuple):
5691
5730
  """Maps directly to stdlib `logging.LogRecord` fields, and must be kept in sync with it."""
5692
5731
 
5693
5732
  created: float
@@ -5735,9 +5774,9 @@ class LoggingTimeFields(LoggingContextInfo, ta.NamedTuple): # type: ignore[misc
5735
5774
  relative_created = (time_ns - start_time_ns) / 1e6
5736
5775
 
5737
5776
  return cls(
5738
- created,
5739
- msecs,
5740
- relative_created,
5777
+ created=created,
5778
+ msecs=msecs,
5779
+ relative_created=relative_created,
5741
5780
  )
5742
5781
 
5743
5782
 
@@ -7577,7 +7616,7 @@ InterpProviders = ta.NewType('InterpProviders', ta.Sequence[InterpProvider])
7577
7616
 
7578
7617
  class AnyLogger(Abstract, ta.Generic[T]):
7579
7618
  def is_enabled_for(self, level: LogLevel) -> bool:
7580
- return self.get_effective_level() >= level
7619
+ return level >= self.get_effective_level()
7581
7620
 
7582
7621
  @abc.abstractmethod
7583
7622
  def get_effective_level(self) -> LogLevel:
@@ -7774,7 +7813,7 @@ class AsyncLogger(AnyLogger[ta.Awaitable[None]], Abstract):
7774
7813
  class AnyNopLogger(AnyLogger[T], Abstract):
7775
7814
  @ta.final
7776
7815
  def get_effective_level(self) -> LogLevel:
7777
- return 999
7816
+ return -999
7778
7817
 
7779
7818
 
7780
7819
  @ta.final
@@ -8384,7 +8423,7 @@ class InterpResolver:
8384
8423
 
8385
8424
 
8386
8425
  ########################################
8387
- # ../../../omlish/logs/std/adapters.py
8426
+ # ../../../omlish/logs/std/loggers.py
8388
8427
 
8389
8428
 
8390
8429
  ##
@@ -8400,6 +8439,9 @@ class StdLogger(Logger):
8400
8439
  def std(self) -> logging.Logger:
8401
8440
  return self._std
8402
8441
 
8442
+ def is_enabled_for(self, level: LogLevel) -> bool:
8443
+ return self._std.isEnabledFor(level)
8444
+
8403
8445
  def get_effective_level(self) -> LogLevel:
8404
8446
  return self._std.getEffectiveLevel()
8405
8447
 
omdev/tools/git/cli.py CHANGED
@@ -21,7 +21,6 @@ TODO:
21
21
  fatal: Need to specify how to reconcile divergent branches.
22
22
  """
23
23
  import dataclasses as dc
24
- import logging
25
24
  import os
26
25
  import shutil
27
26
  import tempfile
@@ -58,7 +57,7 @@ else:
58
57
  msh = lang.proxy_import('omlish.marshal')
59
58
 
60
59
 
61
- log = logging.getLogger(__name__)
60
+ log = logs.get_module_logger(globals())
62
61
 
63
62
 
64
63
  ##
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: omdev
3
- Version: 0.0.0.dev428
3
+ Version: 0.0.0.dev430
4
4
  Summary: omdev
5
5
  Author: wrmsr
6
6
  License-Expression: BSD-3-Clause
@@ -14,7 +14,7 @@ Classifier: Programming Language :: Python :: 3.13
14
14
  Requires-Python: >=3.13
15
15
  Description-Content-Type: text/markdown
16
16
  License-File: LICENSE
17
- Requires-Dist: omlish==0.0.0.dev428
17
+ Requires-Dist: omlish==0.0.0.dev430
18
18
  Provides-Extra: all
19
19
  Requires-Dist: black~=25.1; extra == "all"
20
20
  Requires-Dist: pycparser~=2.22; extra == "all"
@@ -1,4 +1,4 @@
1
- omdev/.omlish-manifests.json,sha256=diaasURIGOs_kTukNgRFlaZ3Vq7kRGYLvOKAP5hqeMU,11909
1
+ omdev/.omlish-manifests.json,sha256=KfVVQzsOja2Zhq2VWbwmRSR_KN9aYcFWehbVCuM2AjA,11909
2
2
  omdev/__about__.py,sha256=fQNmzSa1MntcPSrzg_Vpo6JRU2RbXik2NqRz0oQCApE,1202
3
3
  omdev/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
4
4
  omdev/cmake.py,sha256=gu49t10_syXh_TUJs4POsxeFs8we8Y3XTOOPgIXmGvg,4608
@@ -9,7 +9,7 @@ omdev/amalg/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
9
9
  omdev/amalg/__main__.py,sha256=nGxQ4PLd2u7zf6dH4TDWZg6yrVe3FxIVn9sGT5w8O-o,174
10
10
  omdev/amalg/sources.py,sha256=wxPxPFnxRhPSRhQoWn9bpTYopXW-tanJQLvVQkf2K_A,1379
11
11
  omdev/amalg/cli/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
12
- omdev/amalg/cli/main.py,sha256=U1PQ8JfdzQ1l4m-TS9YECTcTLltuQSxB6oIomVemg6w,4323
12
+ omdev/amalg/cli/main.py,sha256=uoPQo_7pevBd5dX_3-wHrXWN-Mr6eUeHy70OCNE0Bss,4314
13
13
  omdev/amalg/gen/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
14
14
  omdev/amalg/gen/gen.py,sha256=95iQT0At_NsMf4IEg702ZOmmyEdhCZJGcSCFypm1BTk,6194
15
15
  omdev/amalg/gen/imports.py,sha256=Bv3xNgej1Nsuv5R_y-9wd9b8cPtWljZsxjMh9bolJWc,2074
@@ -30,7 +30,7 @@ omdev/cache/compute/storage.py,sha256=3oHJGhIO3gilEyOIDR2UiB8yPKcw9xwWWvoQ0_ZjxZ
30
30
  omdev/cache/compute/types.py,sha256=pF5htSH7oXyky2mxCqGhb_xhOc_GKnjnBAu6lzxaeM8,2645
31
31
  omdev/cache/data/__init__.py,sha256=SQXtugLceRif463rcoklpQ33pxYLgEIm0xiI6NvOI6M,301
32
32
  omdev/cache/data/actions.py,sha256=Mv7eXeZuohCjQLpmLyvqvGjjBacXIvTYzIRMVpEh-zM,1037
33
- omdev/cache/data/cache.py,sha256=thX1Xk_s7WeAfSer2T40ZUJHSz91pPKy1alcN-7jt-w,7633
33
+ omdev/cache/data/cache.py,sha256=h5xQUxiye2exsMUWh1pDeMz_t3LEC75kvloIDg57xMI,7660
34
34
  omdev/cache/data/consts.py,sha256=d6W_aeMqgah6PmPYi9RA8Be54oQ4BcNCy8kDQ7FlB_Q,26
35
35
  omdev/cache/data/defaults.py,sha256=NL_mT7kaSLm2Mk9VO5wdSu-DIcHTR1KgcihJqdSd4TY,312
36
36
  omdev/cache/data/manifests.py,sha256=NweXxbkuLMBG1DiUFliOSYeXBrLPMIY4GA_gOZzHwho,949
@@ -52,26 +52,26 @@ omdev/cc/srclangs.py,sha256=3u_APHgknuc-BPRQSDISwSzouluKsnLlBxodp-XCl_E,728
52
52
  omdev/cexts/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
53
53
  omdev/cexts/_boilerplate.cc,sha256=sbpXEgdFrkdzZXgaNWFFNN27fL9TZu6VrwvMY4-nnFM,1726
54
54
  omdev/cexts/build.py,sha256=JxEuqSpspnY6kWn8eB89FjcSjF4bpNgVYNeIvwmWehY,2659
55
- omdev/cexts/cmake.py,sha256=yqSRV3K0Shsk3z_GMKDbwJiX_C4L4AZ7NJXupGpe1vE,10059
55
+ omdev/cexts/cmake.py,sha256=7CSL9AsWaJnad94dw9QxbZLirtxdlg7Au7EQ1g7H74g,10050
56
56
  omdev/cexts/importhook.py,sha256=GZ04bE6tMQ8uQUUzGr22Rt9cwyI6kkoK4t7xpLP2Lrs,3562
57
57
  omdev/cexts/magic.py,sha256=DglhjCXEiL28pFTN4lrmUW6ZLn6HaumR13ptyaFOez4,131
58
- omdev/cexts/scan.py,sha256=lhK5-8bylu6qZcAfoS-rjdx8c9TLVzqnrPm44cIowKQ,1682
58
+ omdev/cexts/scan.py,sha256=94UqVgxBrAHn_VyW_ZA3-hB_R6pWIJRWqvtSBEg_O4U,1673
59
59
  omdev/cexts/_distutils/LICENSE,sha256=22p14FIRp3F4Cb7Mj_GK33PKr25issFGHC2JN6dg9vc,1023
60
60
  omdev/cexts/_distutils/__init__.py,sha256=c1zImtnPh3uY8BUTV4RLKtGKqTPx3c_pBbhA6tPtNsE,297
61
- omdev/cexts/_distutils/build_ext.py,sha256=pwdqqFKyls4uUAGYMyK4zDPCwyWkOTV5KKi_9sRyylA,13840
62
- omdev/cexts/_distutils/dir_util.py,sha256=xxfAIPHbjlh-aW9OX6UGDrXiXfB5biG4xEC5RA6oszM,2882
63
- omdev/cexts/_distutils/errors.py,sha256=HWmsruDLOctJwjZ3yjIkef6O-NI2m0A74tLYZKbS-TY,2035
64
- omdev/cexts/_distutils/extension.py,sha256=CAxie5k3eCD-k-OaBPYYsyOFbgcWgx0oipA2D6_hrIs,5631
65
- omdev/cexts/_distutils/file_util.py,sha256=glpfHGEDZKMS_VAIgr3YlExtQfNP4agxOrn3WenjE7U,7804
66
- omdev/cexts/_distutils/modified.py,sha256=OI4guORuIv16fyFTS-B_eaPSELttGPVeZCYgjR357Ec,1723
67
- omdev/cexts/_distutils/spawn.py,sha256=ROud2VB_tyktPGq6ldsOyFTGIsvSvYAQf_ioWQh0XH0,3435
68
- omdev/cexts/_distutils/sysconfig.py,sha256=lVMnczs-4vSqzWeHzDo6ImRW-uAAR0ZIGVJwnyhfjp8,12654
69
- omdev/cexts/_distutils/util.py,sha256=k4t8w-8VWLVzFh5LvfSpygkssSfrU7LaMT6xIMQQkQw,6413
70
- omdev/cexts/_distutils/version.py,sha256=0Z8veDAUFclFHGoX9USchD2TdV1ECe8yD83vPLOxaSI,12558
61
+ omdev/cexts/_distutils/build_ext.py,sha256=urqWd8fIHY4v8Q9FVK8Plgkp4xwpilKvna9-Dphp0io,13872
62
+ omdev/cexts/_distutils/dir_util.py,sha256=llDo9EpCec91hY4XnqesSigenXS8F4RTdCoJ7hYFguc,2915
63
+ omdev/cexts/_distutils/errors.py,sha256=ITuhD_Vk-KD2z6JEBxIFUoGkCkn1MotgbNh5OP9tEd4,2040
64
+ omdev/cexts/_distutils/extension.py,sha256=MG-W77JvN5rkzuqHcq-Y5zJEYYCPfwlSzqK0XBNsMKw,5636
65
+ omdev/cexts/_distutils/file_util.py,sha256=O1dCq13Y7PCEBWYlzgSEfwG70TkS0eLxaPcV8sr11gA,7837
66
+ omdev/cexts/_distutils/modified.py,sha256=0iTW3mFNJMohDtKOaqhM8zVBQRAX142-xm2eNE4HCJM,1728
67
+ omdev/cexts/_distutils/spawn.py,sha256=cBVCmBl-zAvQG2p2UTmF10Odrw0TFYDJ19XdiVNNXPQ,3468
68
+ omdev/cexts/_distutils/sysconfig.py,sha256=YVQl9ChV0JiYZLFcPgcHMCCWX2QK0ECTbGajLodiKFs,12659
69
+ omdev/cexts/_distutils/util.py,sha256=l0TpopYsS_LadTd-W9VFyoD0RPhXqGX-33AdVPHN96g,6446
70
+ omdev/cexts/_distutils/version.py,sha256=003kpYCV9IwuOFxtfoRgGKpuz8MkgJucYHBcEVmFcoc,12563
71
71
  omdev/cexts/_distutils/compilers/__init__.py,sha256=amL_zrFlba0lHIvpqDne9uhqhLemA7hBZFX-MHL7R3c,68
72
- omdev/cexts/_distutils/compilers/ccompiler.py,sha256=cTs88qrvj0hBVXHfemSDE_du_nEA4_qo3Qst5TpQkVI,43606
73
- omdev/cexts/_distutils/compilers/options.py,sha256=H7r5IcLvga5Fs3jjXWIT-6ap3JBduXRKgtpDmSGCZxs,3818
74
- omdev/cexts/_distutils/compilers/unixccompiler.py,sha256=KO33tQYjgeRqvl0KOAD87tuChECPYYvJlpij440IE_4,15422
72
+ omdev/cexts/_distutils/compilers/ccompiler.py,sha256=eDJPALnD__VJYeJaJhnghn7q3XMSSa7GL0P44aer3_I,43638
73
+ omdev/cexts/_distutils/compilers/options.py,sha256=ghKhvi2YaC50lwoWK1ewV-xRwbz0EXt6PsbgSdFIfzg,3823
74
+ omdev/cexts/_distutils/compilers/unixccompiler.py,sha256=fgmKXR7_BkZu1E3oVu6IpwbtIKtTwpvhnFEpSVtMOuM,15455
75
75
  omdev/ci/__init__.py,sha256=Y3l4WY4JRi2uLG6kgbGp93fuGfkxkKwZDvhsa0Rwgtk,15
76
76
  omdev/ci/__main__.py,sha256=Jsrv3P7LX2Cg08W7ByZfZ1JQT4lgLDPW1qNAmShFuMk,75
77
77
  omdev/ci/cache.py,sha256=aKsNvl7fTJfjpFhUrWgKCNEwgoSfTZpEcn0NUY9BOCM,8456
@@ -131,7 +131,7 @@ omdev/cmdlog/cmdlog.py,sha256=MJqfCG7sVWjSK_i1shD7cgWpFZXZkPvGhGEh-yd6iwM,1982
131
131
  omdev/dataclasses/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
132
132
  omdev/dataclasses/__main__.py,sha256=N-a0Lf_s7D0VajuZCCY_dt8R4rSpeck9inbCsoIvciQ,175
133
133
  omdev/dataclasses/cli.py,sha256=j5GfpJQSkA_jmV94XTVb3amCFYjgrasMs-bp_zJEkqE,445
134
- omdev/dataclasses/codegen.py,sha256=5jdj8omkvxb61AN10is4IqCHLuafkJes3jpPhoF1VRA,2994
134
+ omdev/dataclasses/codegen.py,sha256=kPCKttb0gQgV2ChkARFSUPA96DbrvFZV-GyOaO_yQto,3021
135
135
  omdev/dataserver/__init__.py,sha256=Y3l4WY4JRi2uLG6kgbGp93fuGfkxkKwZDvhsa0Rwgtk,15
136
136
  omdev/dataserver/handlers.py,sha256=q-kw-yiiRxJFmlPRdtqllsg7sv5Jz_ySsNl2xCoM7i4,5490
137
137
  omdev/dataserver/http.py,sha256=SMS6w-GVevG58FypqmPytcEqW8aUWpd2_F6JlBDIuBc,1730
@@ -219,8 +219,8 @@ omdev/precheck/base.py,sha256=fKdrfakq2u1UU1_JZFnl-non9bIAZMsSkVY1SMYn8xQ,662
219
219
  omdev/precheck/caches.py,sha256=OZKP20DIj6OpUzdNwrjCufv1GzndEbsc7tLD-qHNv9g,1736
220
220
  omdev/precheck/git.py,sha256=O8rNQZ_vlHec0pOFbK6LOkbly5ZIUYT_HXRMqQX8GaI,774
221
221
  omdev/precheck/imports.py,sha256=3loQxHMrpI0ce4-le77NCSxutLac_5vDW4UDX7KWWg8,2565
222
- omdev/precheck/lite.py,sha256=qd6nXWEVut8aBSRD_NxnxXGRNa9ue8mu8ND8rGLisE4,4710
223
- omdev/precheck/main.py,sha256=_1A5wiu9p2th1dn_17w1ZIFtMmCIOaTFpWyvK0jopEA,4374
222
+ omdev/precheck/lite.py,sha256=sseaKHMZgMhIEuifZvPJm0-wuRqRUrnyySJfHBMItOM,4737
223
+ omdev/precheck/main.py,sha256=nbTXR7d2vVMOyrXBVKFyQfmTm1H5tpk7Pe2Zphk-LqI,4365
224
224
  omdev/precheck/manifests.py,sha256=dxl7GSJHKjQrR6mbwvj6j92XDGHOpxxEEQ6smJkBEe4,810
225
225
  omdev/precheck/scripts.py,sha256=6nb_lDgyX7u9kdF_BU6ubY01q_jGk96VH9q9gpOieng,1753
226
226
  omdev/precheck/unicode.py,sha256=VUNDCrlfUas_U8ugV_q0eFUXuBgKjS8YdCFm0FXREXo,2583
@@ -259,7 +259,7 @@ omdev/py/scripts/execstat.py,sha256=-c5ioQRruBrD5M0QDzSMaaq4Oe3X3-1O_d63bXjE5EI,
259
259
  omdev/py/scripts/importtrace.py,sha256=OOf9GvB6PWP2uVzogSYsM5JGUAoSfMx1IKfYUXB8ABc,14245
260
260
  omdev/py/tools/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
261
261
  omdev/py/tools/importscan.py,sha256=4dCH0coX0OqNwesteKaTE8GxuSfLhgXYQlzNUXLiSNY,4640
262
- omdev/py/tools/mkrelimp.py,sha256=F7g6Cesdb4MPz1EKiN1iQpqOUUwTNQAVEQZhK0l-yhc,4049
262
+ omdev/py/tools/mkrelimp.py,sha256=40gE1p_w-f_oWptUiS8TqODhso6ow46UCEptw4VbH0c,4040
263
263
  omdev/pyproject/__init__.py,sha256=Y3l4WY4JRi2uLG6kgbGp93fuGfkxkKwZDvhsa0Rwgtk,15
264
264
  omdev/pyproject/__main__.py,sha256=gn3Rl1aYPYdiTtEqa9ifi0t-e4ZwPY0vhJ4UXvYdJDY,165
265
265
  omdev/pyproject/cexts.py,sha256=GLD4fe61M_fHhdMcKlcQNUoCb7MeVXY6Fw-grKH4hTU,4264
@@ -273,9 +273,9 @@ omdev/pyproject/resources/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJW
273
273
  omdev/pyproject/resources/docker-dev.sh,sha256=DHkz5D18jok_oDolfg2mqrvGRWFoCe9GQo04dR1czcc,838
274
274
  omdev/pyproject/resources/python.sh,sha256=rFaN4SiJ9hdLDXXsDTwugI6zsw6EPkgYMmtacZeTbvw,749
275
275
  omdev/scripts/__init__.py,sha256=MKCvUAEQwsIvwLixwtPlpBqmkMXLCnjjXyAXvVpDwVk,91
276
- omdev/scripts/ci.py,sha256=x9kaHiFye-5NXmQ-tAl2w8Wf5O-xpTQJ-fWpuiWAGiw,407069
277
- omdev/scripts/interp.py,sha256=b2l2cINVlk1TUfhzCJ2l6SWMkATVmc7KeXEvhaop0Fc,165392
278
- omdev/scripts/pyproject.py,sha256=AfZ3YHpPjMHlxKd1u37T8NuxRJEhPYDRzEAI-vGMvrY,314149
276
+ omdev/scripts/ci.py,sha256=2e3NgokoLd1SjHGLUKLcV_Bah3eBNBw_67hNT8XKe54,408056
277
+ omdev/scripts/interp.py,sha256=yJWWo_3qOmI2Evfel02j79KzfZqYN2eBCLnphZZFecs,166357
278
+ omdev/scripts/pyproject.py,sha256=LGUUUu4R2TRqUdEs5akqJkxFM7A-FI36I_SHSG3qJ4Y,315115
279
279
  omdev/scripts/slowcat.py,sha256=PwdT-pg62imEEb6kcOozl9_YUi-4KopvjvzWT1OmGb0,2717
280
280
  omdev/scripts/tmpexec.py,sha256=t0nErDRALjTk7H0X8ADjZUIDFjlPNzOOokmjCjBHdzs,1431
281
281
  omdev/tokens/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -298,7 +298,7 @@ omdev/tools/shell.py,sha256=5hF_8DCtB3XrzJSfmQDsr7X3Fi9KRV4M70q9qp0KREA,2341
298
298
  omdev/tools/sqlrepl.py,sha256=TcLJlElzfXqYUkfIOwhJHtXiQjXOg4xBTwSoSRDpNkg,5758
299
299
  omdev/tools/git/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
300
300
  omdev/tools/git/__main__.py,sha256=gI87SBUgTkKUcUM-RtZWnei-UUDDqzbr5aPztb-gvbE,168
301
- omdev/tools/git/cli.py,sha256=I4AiCTz4OCzK6s8J2TJF1eYw9FH2JIK_CsdjQH_9UTE,16757
301
+ omdev/tools/git/cli.py,sha256=6E-k-eiDn1gKyaRH_j5Ci_dgTmAl2pAbLtGmG3xgPAA,16748
302
302
  omdev/tools/git/cloning.py,sha256=CNGBBMoWaTBJW4SZTf1VvhDFSm0yg7qDfNwZun_PFbU,891
303
303
  omdev/tools/git/consts.py,sha256=JuXivUNDkNhM4pe97icjRVAKM8cNRbrODquHINNKqOE,40
304
304
  omdev/tools/git/messages.py,sha256=R39pXfXt8394eC99rpTdRlbcMrAdLxwsgTR4pwRRa-o,2321
@@ -319,9 +319,9 @@ omdev/tools/jsonview/resources/jsonview.js,sha256=faDvXDOXKvEvjOuIlz4D3F2ReQXb_b
319
319
  omdev/tools/pawk/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
320
320
  omdev/tools/pawk/__main__.py,sha256=VCqeRVnqT1RPEoIrqHFSu4PXVMg4YEgF4qCQm90-eRI,66
321
321
  omdev/tools/pawk/pawk.py,sha256=ao5mdrpiSU4AZ8mBozoEaV3UVlmVTnRG9wD9XP70MZE,11429
322
- omdev-0.0.0.dev428.dist-info/licenses/LICENSE,sha256=B_hVtavaA8zCYDW99DYdcpDLKz1n3BBRjZrcbv8uG8c,1451
323
- omdev-0.0.0.dev428.dist-info/METADATA,sha256=roKxde9gZ6yvwmj3QR5bnfv9CDR3G-4gZGxm35lBPuY,5100
324
- omdev-0.0.0.dev428.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
325
- omdev-0.0.0.dev428.dist-info/entry_points.txt,sha256=dHLXFmq5D9B8qUyhRtFqTGWGxlbx3t5ejedjrnXNYLU,33
326
- omdev-0.0.0.dev428.dist-info/top_level.txt,sha256=1nr7j30fEWgLYHW3lGR9pkdHkb7knv1U1ES1XRNVQ6k,6
327
- omdev-0.0.0.dev428.dist-info/RECORD,,
322
+ omdev-0.0.0.dev430.dist-info/licenses/LICENSE,sha256=B_hVtavaA8zCYDW99DYdcpDLKz1n3BBRjZrcbv8uG8c,1451
323
+ omdev-0.0.0.dev430.dist-info/METADATA,sha256=VDCfaZdGEwKcsAewHXSxMQRoZsHLoFpnGZ02o9WpORs,5100
324
+ omdev-0.0.0.dev430.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
325
+ omdev-0.0.0.dev430.dist-info/entry_points.txt,sha256=dHLXFmq5D9B8qUyhRtFqTGWGxlbx3t5ejedjrnXNYLU,33
326
+ omdev-0.0.0.dev430.dist-info/top_level.txt,sha256=1nr7j30fEWgLYHW3lGR9pkdHkb7knv1U1ES1XRNVQ6k,6
327
+ omdev-0.0.0.dev430.dist-info/RECORD,,