omdev 0.0.0.dev28__py3-none-any.whl → 0.0.0.dev29__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.

Potentially problematic release.


This version of omdev might be problematic. Click here for more details.

@@ -71,7 +71,7 @@ class CacheableContext(lang.Final):
71
71
  return self._key
72
72
 
73
73
  @property
74
- def parent(self) -> 'CacheableContext | None':
74
+ def parent(self) -> ta.Optional['CacheableContext']:
75
75
  return self._parent
76
76
 
77
77
  @property
@@ -1,5 +1,5 @@
1
1
  from .cache import ( # noqa
2
- DataCache,
2
+ Cache,
3
3
  )
4
4
 
5
5
  from .defaults import ( # noqa
omdev/cache/data/cache.py CHANGED
@@ -32,7 +32,7 @@ log = logging.getLogger(__name__)
32
32
  ##
33
33
 
34
34
 
35
- class DataCache:
35
+ class Cache:
36
36
  def __init__(self, base_dir: str) -> None:
37
37
  super().__init__()
38
38
  self._base_dir = base_dir
@@ -2,7 +2,7 @@ import os.path
2
2
 
3
3
  from omlish import lang
4
4
 
5
- from .cache import DataCache
5
+ from .cache import Cache
6
6
 
7
7
 
8
8
  ##
@@ -14,5 +14,5 @@ def default_dir() -> str:
14
14
 
15
15
 
16
16
  @lang.cached_function(lock=True)
17
- def default() -> DataCache:
18
- return DataCache(default_dir())
17
+ def default() -> Cache:
18
+ return Cache(default_dir())
omdev/precheck/base.py ADDED
@@ -0,0 +1,37 @@
1
+ import abc
2
+ import dataclasses as dc
3
+ import typing as ta
4
+
5
+
6
+ PrecheckConfigT = ta.TypeVar('PrecheckConfigT', bound='Precheck.Config')
7
+
8
+
9
+ ##
10
+
11
+
12
+ @dc.dataclass(frozen=True, kw_only=True)
13
+ class PrecheckContext:
14
+ src_roots: ta.Sequence[str]
15
+
16
+
17
+ ##
18
+
19
+
20
+ class Precheck(abc.ABC, ta.Generic[PrecheckConfigT]):
21
+ @dc.dataclass(frozen=True)
22
+ class Config:
23
+ pass
24
+
25
+ def __init__(self, context: PrecheckContext, config: PrecheckConfigT) -> None:
26
+ super().__init__()
27
+ self._context = context
28
+ self._config = config
29
+
30
+ @dc.dataclass(frozen=True)
31
+ class Violation:
32
+ pc: 'Precheck'
33
+ msg: str
34
+
35
+ @abc.abstractmethod
36
+ def run(self) -> ta.AsyncIterator[Violation]:
37
+ raise NotImplementedError
omdev/precheck/git.py ADDED
@@ -0,0 +1,34 @@
1
+ import asyncio
2
+ import dataclasses as dc
3
+ import typing as ta
4
+
5
+ from .base import Precheck
6
+ from .base import PrecheckContext
7
+
8
+
9
+ ##
10
+
11
+
12
+ class GitBlacklistPrecheck(Precheck['GitBlacklistPrecheck.Config']):
13
+ """
14
+ TODO:
15
+ - globs
16
+ - regex
17
+ """
18
+
19
+ @dc.dataclass(frozen=True)
20
+ class Config(Precheck.Config):
21
+ files: ta.Sequence[str] = (
22
+ '.env',
23
+ 'secrets.yml',
24
+ )
25
+
26
+ def __init__(self, context: PrecheckContext, config: Config = Config()) -> None:
27
+ super().__init__(context, config)
28
+
29
+ async def run(self) -> ta.AsyncGenerator[Precheck.Violation, None]:
30
+ for f in self._config.files:
31
+ proc = await asyncio.create_subprocess_exec('git', 'status', '-s', f)
32
+ await proc.communicate()
33
+ if proc.returncode:
34
+ yield Precheck.Violation(self, f)
omdev/precheck/lite.py ADDED
@@ -0,0 +1,135 @@
1
+ import asyncio
2
+ import dataclasses as dc
3
+ import glob
4
+ import inspect
5
+ import logging
6
+ import os.path
7
+ import subprocess
8
+ import textwrap
9
+ import typing as ta
10
+
11
+ from omdev import findmagic
12
+ from omlish import cached
13
+
14
+ from .base import Precheck
15
+ from .base import PrecheckContext
16
+
17
+
18
+ log = logging.getLogger(__name__)
19
+
20
+
21
+ ##
22
+
23
+
24
+ class LitePython8Precheck(Precheck['LitePython8Precheck.Config']):
25
+ @dc.dataclass(frozen=True)
26
+ class Config(Precheck.Config):
27
+ pass
28
+
29
+ def __init__(self, context: PrecheckContext, config: Config = Config()) -> None:
30
+ super().__init__(context, config)
31
+
32
+ #
33
+
34
+ @staticmethod
35
+ def _load_file_module(fp: str) -> None:
36
+ import os.path # noqa
37
+ import types # noqa
38
+
39
+ fp = os.path.abspath(fp)
40
+
41
+ with open(fp) as f:
42
+ src = f.read()
43
+
44
+ mn = os.path.basename(fp).rpartition('.')[0]
45
+
46
+ mod = types.ModuleType(mn)
47
+ mod.__name__ = mn
48
+ mod.__file__ = fp
49
+ mod.__builtins__ = __builtins__ # type: ignore
50
+ mod.__spec__ = None
51
+
52
+ code = compile(src, fp, 'exec')
53
+ exec(code, mod.__dict__, mod.__dict__)
54
+
55
+ @cached.function
56
+ def _load_file_module_payload(self) -> str:
57
+ return '\n'.join([
58
+ 'import sys',
59
+ 'fp = sys.argv[-1]',
60
+ '',
61
+ textwrap.dedent('\n'.join(inspect.getsource(LitePython8Precheck._load_file_module).splitlines()[2:])),
62
+ ])
63
+
64
+ #
65
+
66
+ async def _run_script(self, fp: str) -> list[Precheck.Violation]:
67
+ log.debug('%s: loading script %s', self.__class__.__name__, fp)
68
+
69
+ vs: list[Precheck.Violation] = []
70
+
71
+ proc = await asyncio.create_subprocess_exec(
72
+ '.venvs/8/bin/python',
73
+ '-c',
74
+ self._load_file_module_payload(),
75
+ fp,
76
+ stderr=subprocess.PIPE,
77
+ )
78
+
79
+ _, stderr = await proc.communicate()
80
+ if proc.returncode != 0:
81
+ vs.append(Precheck.Violation(self, f'lite script {fp} failed to load in python8: {stderr.decode()}'))
82
+
83
+ return vs
84
+
85
+ async def _run_one_module(self, fp: str) -> list[Precheck.Violation]:
86
+ vs: list[Precheck.Violation] = []
87
+
88
+ mod = fp.rpartition('.')[0].replace(os.sep, '.')
89
+
90
+ log.debug('%s: loading module %s', self.__class__.__name__, mod)
91
+
92
+ proc = await asyncio.create_subprocess_exec(
93
+ '.venvs/8/bin/python',
94
+ '-c',
95
+ f'import {mod}',
96
+ stderr=subprocess.PIPE,
97
+ )
98
+
99
+ _, stderr = await proc.communicate()
100
+ if proc.returncode != 0:
101
+ vs.append(Precheck.Violation(self, f'lite module {fp} failed to import in python8: {stderr.decode()}')) # noqa
102
+
103
+ return vs
104
+
105
+ async def _run_module(self, fp: str) -> list[Precheck.Violation]:
106
+ vs: list[Precheck.Violation] = []
107
+
108
+ if fp.endswith('__init__.py'):
109
+ pfps = glob.glob(os.path.join(os.path.dirname(fp), '**/*.py'), recursive=True)
110
+ else:
111
+ pfps = [fp]
112
+
113
+ for pfp in pfps:
114
+ vs.extend(await self._run_one_module(pfp))
115
+
116
+ return vs
117
+
118
+ async def run(self) -> ta.AsyncGenerator[Precheck.Violation, None]:
119
+ for fp in findmagic.find_magic(
120
+ self._context.src_roots,
121
+ ['# @omlish-lite'],
122
+ ['py'],
123
+ ):
124
+ with open(fp) as f: # noqa # FIXME
125
+ src = f.read()
126
+
127
+ is_script = '# @omlish-script' in src.splitlines()
128
+
129
+ if is_script:
130
+ for v in await self._run_script(fp):
131
+ yield v
132
+
133
+ else:
134
+ for v in await self._run_module(fp):
135
+ yield v
@@ -17,28 +17,20 @@ TODO:
17
17
  - https://github.com/pre-commit/pre-commit-hooks?tab=readme-ov-file#forbid-new-submodules
18
18
  - don't check in .o's (omdev.ext import hook is dumb w build dir)
19
19
  """
20
- import abc
21
20
  import argparse
22
21
  import asyncio
23
- import dataclasses as dc
24
- import glob
25
- import inspect
26
22
  import logging
27
23
  import os.path
28
- import stat
29
- import subprocess
30
24
  import sys
31
- import textwrap
32
25
  import typing as ta
33
26
 
34
- from omdev import findimports
35
- from omdev import findmagic
36
- from omlish import cached
37
27
  from omlish import logs
38
28
 
39
-
40
- T = ta.TypeVar('T')
41
- PrecheckConfigT = ta.TypeVar('PrecheckConfigT', bound='Precheck.Config')
29
+ from .base import Precheck
30
+ from .base import PrecheckContext
31
+ from .git import GitBlacklistPrecheck
32
+ from .lite import LitePython8Precheck
33
+ from .scripts import ScriptDepsPrecheck
42
34
 
43
35
 
44
36
  log = logging.getLogger(__name__)
@@ -47,214 +39,6 @@ log = logging.getLogger(__name__)
47
39
  ##
48
40
 
49
41
 
50
- @dc.dataclass(frozen=True, kw_only=True)
51
- class PrecheckContext:
52
- src_roots: ta.Sequence[str]
53
-
54
-
55
- ##
56
-
57
-
58
- class Precheck(abc.ABC, ta.Generic[PrecheckConfigT]):
59
- @dc.dataclass(frozen=True)
60
- class Config:
61
- pass
62
-
63
- def __init__(self, context: PrecheckContext, config: PrecheckConfigT) -> None:
64
- super().__init__()
65
- self._context = context
66
- self._config = config
67
-
68
- @dc.dataclass(frozen=True)
69
- class Violation:
70
- pc: 'Precheck'
71
- msg: str
72
-
73
- @abc.abstractmethod
74
- def run(self) -> ta.AsyncIterator[Violation]:
75
- raise NotImplementedError
76
-
77
-
78
- ##
79
-
80
-
81
- class GitBlacklistPrecheck(Precheck['GitBlacklistPrecheck.Config']):
82
- """
83
- TODO:
84
- - globs
85
- - regex
86
- """
87
-
88
- @dc.dataclass(frozen=True)
89
- class Config(Precheck.Config):
90
- files: ta.Sequence[str] = (
91
- '.env',
92
- 'secrets.yml',
93
- )
94
-
95
- def __init__(self, context: PrecheckContext, config: Config = Config()) -> None:
96
- super().__init__(context, config)
97
-
98
- async def run(self) -> ta.AsyncGenerator[Precheck.Violation, None]:
99
- for f in self._config.files:
100
- proc = await asyncio.create_subprocess_exec('git', 'status', '-s', f)
101
- await proc.communicate()
102
- if proc.returncode:
103
- yield Precheck.Violation(self, f)
104
-
105
-
106
- ##
107
-
108
-
109
- class ScriptDepsPrecheck(Precheck['ScriptDepsPrecheck.Config']):
110
- @dc.dataclass(frozen=True)
111
- class Config(Precheck.Config):
112
- pass
113
-
114
- def __init__(self, context: PrecheckContext, config: Config = Config()) -> None:
115
- super().__init__(context, config)
116
-
117
- async def run(self) -> ta.AsyncGenerator[Precheck.Violation, None]:
118
- for fp in findmagic.find_magic(
119
- self._context.src_roots,
120
- ['# @omlish-script'],
121
- ['py'],
122
- ):
123
- if not (stat.S_IXUSR & os.stat(fp).st_mode):
124
- yield Precheck.Violation(self, f'script {fp} is not executable')
125
-
126
- with open(fp) as f: # noqa # FIXME
127
- src = f.read()
128
-
129
- if not src.startswith('#!/usr/bin/env python3\n'):
130
- yield Precheck.Violation(self, f'script {fp} lacks correct shebang')
131
-
132
- imps = findimports.find_imports(fp)
133
- deps = findimports.get_import_deps(imps)
134
- if deps:
135
- yield Precheck.Violation(self, f'script {fp} has deps: {deps}')
136
-
137
-
138
- ##
139
-
140
-
141
- class LitePython8Precheck(Precheck['LitePython8Precheck.Config']):
142
- @dc.dataclass(frozen=True)
143
- class Config(Precheck.Config):
144
- pass
145
-
146
- def __init__(self, context: PrecheckContext, config: Config = Config()) -> None:
147
- super().__init__(context, config)
148
-
149
- #
150
-
151
- @staticmethod
152
- def _load_file_module(fp: str) -> None:
153
- import os.path # noqa
154
- import types # noqa
155
-
156
- fp = os.path.abspath(fp)
157
-
158
- with open(fp) as f:
159
- src = f.read()
160
-
161
- mn = os.path.basename(fp).rpartition('.')[0]
162
-
163
- mod = types.ModuleType(mn)
164
- mod.__name__ = mn
165
- mod.__file__ = fp
166
- mod.__builtins__ = __builtins__ # type: ignore
167
- mod.__spec__ = None
168
-
169
- code = compile(src, fp, 'exec')
170
- exec(code, mod.__dict__, mod.__dict__)
171
-
172
- @cached.function
173
- def _load_file_module_payload(self) -> str:
174
- return '\n'.join([
175
- 'import sys',
176
- 'fp = sys.argv[-1]',
177
- '',
178
- textwrap.dedent('\n'.join(inspect.getsource(LitePython8Precheck._load_file_module).splitlines()[2:])),
179
- ])
180
-
181
- #
182
-
183
- async def _run_script(self, fp: str) -> list[Precheck.Violation]:
184
- log.debug('%s: loading script %s', self.__class__.__name__, fp)
185
-
186
- vs: list[Precheck.Violation] = []
187
-
188
- proc = await asyncio.create_subprocess_exec(
189
- '.venvs/8/bin/python',
190
- '-c',
191
- self._load_file_module_payload(),
192
- fp,
193
- stderr=subprocess.PIPE,
194
- )
195
-
196
- _, stderr = await proc.communicate()
197
- if proc.returncode != 0:
198
- vs.append(Precheck.Violation(self, f'lite script {fp} failed to load in python8: {stderr.decode()}'))
199
-
200
- return vs
201
-
202
- async def _run_one_module(self, fp: str) -> list[Precheck.Violation]:
203
- vs: list[Precheck.Violation] = []
204
-
205
- mod = fp.rpartition('.')[0].replace(os.sep, '.')
206
-
207
- log.debug('%s: loading module %s', self.__class__.__name__, mod)
208
-
209
- proc = await asyncio.create_subprocess_exec(
210
- '.venvs/8/bin/python',
211
- '-c',
212
- f'import {mod}',
213
- stderr=subprocess.PIPE,
214
- )
215
-
216
- _, stderr = await proc.communicate()
217
- if proc.returncode != 0:
218
- vs.append(Precheck.Violation(self, f'lite module {fp} failed to import in python8: {stderr.decode()}')) # noqa
219
-
220
- return vs
221
-
222
- async def _run_module(self, fp: str) -> list[Precheck.Violation]:
223
- vs: list[Precheck.Violation] = []
224
-
225
- if fp.endswith('__init__.py'):
226
- pfps = glob.glob(os.path.join(os.path.dirname(fp), '**/*.py'), recursive=True)
227
- else:
228
- pfps = [fp]
229
-
230
- for pfp in pfps:
231
- vs.extend(await self._run_one_module(pfp))
232
-
233
- return vs
234
-
235
- async def run(self) -> ta.AsyncGenerator[Precheck.Violation, None]:
236
- for fp in findmagic.find_magic(
237
- self._context.src_roots,
238
- ['# @omlish-lite'],
239
- ['py'],
240
- ):
241
- with open(fp) as f: # noqa # FIXME
242
- src = f.read()
243
-
244
- is_script = '# @omlish-script' in src.splitlines()
245
-
246
- if is_script:
247
- for v in await self._run_script(fp):
248
- yield v
249
-
250
- else:
251
- for v in await self._run_module(fp):
252
- yield v
253
-
254
-
255
- ##
256
-
257
-
258
42
  def _check_cmd(args) -> None:
259
43
  if not os.path.isfile('pyproject.toml'):
260
44
  raise RuntimeError('must run in project root')
@@ -0,0 +1,42 @@
1
+ import dataclasses as dc
2
+ import os
3
+ import stat
4
+ import typing as ta
5
+
6
+ from omdev import findimports
7
+ from omdev import findmagic
8
+
9
+ from .base import Precheck
10
+ from .base import PrecheckContext
11
+
12
+
13
+ ##
14
+
15
+
16
+ class ScriptDepsPrecheck(Precheck['ScriptDepsPrecheck.Config']):
17
+ @dc.dataclass(frozen=True)
18
+ class Config(Precheck.Config):
19
+ pass
20
+
21
+ def __init__(self, context: PrecheckContext, config: Config = Config()) -> None:
22
+ super().__init__(context, config)
23
+
24
+ async def run(self) -> ta.AsyncGenerator[Precheck.Violation, None]:
25
+ for fp in findmagic.find_magic(
26
+ self._context.src_roots,
27
+ ['# @omlish-script'],
28
+ ['py'],
29
+ ):
30
+ if not (stat.S_IXUSR & os.stat(fp).st_mode):
31
+ yield Precheck.Violation(self, f'script {fp} is not executable')
32
+
33
+ with open(fp) as f: # noqa # FIXME
34
+ src = f.read()
35
+
36
+ if not src.startswith('#!/usr/bin/env python3\n'):
37
+ yield Precheck.Violation(self, f'script {fp} lacks correct shebang')
38
+
39
+ imps = findimports.find_imports(fp)
40
+ deps = findimports.get_import_deps(imps)
41
+ if deps:
42
+ yield Precheck.Violation(self, f'script {fp} has deps: {deps}')
@@ -0,0 +1,26 @@
1
+ import io
2
+ import urllib.request
3
+ import xml.etree.ElementTree as ET # noqa
4
+
5
+ from omlish import argparse as ap
6
+ from omlish import check
7
+
8
+
9
+ PYPI_URL = 'https://pypi.org/'
10
+
11
+
12
+ class Cli(ap.Cli):
13
+ @ap.command(
14
+ ap.arg('package'),
15
+ )
16
+ def lookup_latest_version(self) -> None:
17
+ pkg_name = check.non_empty_str(self.args.package)
18
+ with urllib.request.urlopen(f'{PYPI_URL}rss/project/{pkg_name}/releases.xml') as resp: # noqa
19
+ rss = resp.read()
20
+ doc = ET.parse(io.BytesIO(rss)) # noqa
21
+ latest = check.not_none(doc.find('./channel/item/title')).text
22
+ print(latest)
23
+
24
+
25
+ if __name__ == '__main__':
26
+ Cli()()
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: omdev
3
- Version: 0.0.0.dev28
3
+ Version: 0.0.0.dev29
4
4
  Summary: omdev
5
5
  Author: wrmsr
6
6
  License: BSD-3-Clause
@@ -12,7 +12,7 @@ Classifier: Operating System :: OS Independent
12
12
  Classifier: Operating System :: POSIX
13
13
  Requires-Python: ~=3.12
14
14
  License-File: LICENSE
15
- Requires-Dist: omlish ==0.0.0.dev28
15
+ Requires-Dist: omlish ==0.0.0.dev29
16
16
  Provides-Extra: all
17
17
  Requires-Dist: pycparser ~=2.22 ; extra == 'all'
18
18
  Requires-Dist: cffi ~=1.17 ; extra == 'all'
@@ -17,15 +17,15 @@ omdev/amalg/amalg.py,sha256=g7wwcPE2G9qmzh8M9eZAscOYWKo3ldI8bNxEXFnmzLE,14064
17
17
  omdev/cache/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
18
18
  omdev/cache/comp/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
19
19
  omdev/cache/comp/cache.py,sha256=0VDub_za4GlR5gIynqK4CnhhZFs-cdtlf_lwMhgtFa4,3387
20
- omdev/cache/comp/contexts.py,sha256=LHCzt9x3s35Xc1jW5U7GWkhi-z-Z0_KA47IcfqgmNvU,3085
20
+ omdev/cache/comp/contexts.py,sha256=1pkZXeNG3Ehrwb6vZHWOgR0zDSXSTKsPrdSDW5tIRKs,3091
21
21
  omdev/cache/comp/fns.py,sha256=72yQ1e7NH8GxZ-ppcik1JLMEJGzrBvHgI5PSp4HcXVM,2943
22
22
  omdev/cache/comp/resolvers.py,sha256=Do7_PKy-09hyptgKel1vKQnHcpc3wjCP-1St3unTspc,614
23
23
  omdev/cache/comp/types.py,sha256=vFrcB8WftWDHQnrHG0lRXMBStWCm2M_Q4Xft-Rz7xnc,1907
24
- omdev/cache/data/__init__.py,sha256=Jn_QRQn8L3-L0P-w9s5sBBku2tnFTOS3oc_U2PF8SSk,298
24
+ omdev/cache/data/__init__.py,sha256=7286T46a7gUEvC0gvSYZtfyS_h2oZJx0I2zE6UUTJkc,294
25
25
  omdev/cache/data/actions.py,sha256=OrCjo0INKeG8iEvXnQ9LI8PD8WF4d1vxrBwQzuA2ASw,829
26
- omdev/cache/data/cache.py,sha256=HfxoXRmzVeqMDUKyqY3PSJShuqtcYjkuA14T2kz3uzE,4772
26
+ omdev/cache/data/cache.py,sha256=VQQpC5c2TcpLtFG87nkMdJ6_jgmRsocRuZe2FdzTddo,4768
27
27
  omdev/cache/data/consts.py,sha256=d6W_aeMqgah6PmPYi9RA8Be54oQ4BcNCy8kDQ7FlB_Q,26
28
- omdev/cache/data/defaults.py,sha256=eRwkBRVaPSgYsfejgo-3SJGx2vyX_H4azhJ_un6-f74,289
28
+ omdev/cache/data/defaults.py,sha256=HrapVUIf9Ozu3qSfRPyQj-vx-dz6Yyedjb-k3yV4CW8,277
29
29
  omdev/cache/data/manifests.py,sha256=6SqUiAlzkuDwIApEjzh5P6VimRVGk3iMwXjEPH2zvrc,1006
30
30
  omdev/cache/data/specs.py,sha256=ggvbp4nSEnXJImt_stVh4OsOYNzPIVGXAWplr17yEyg,2290
31
31
  omdev/cexts/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -65,7 +65,11 @@ omdev/mypy/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
65
65
  omdev/mypy/debug.py,sha256=WcZw-3Z1njg_KFGqi3DB6RuqbBa3dLArJnjVCuY1Mn0,3003
66
66
  omdev/precheck/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
67
67
  omdev/precheck/__main__.py,sha256=wKF_2KP2Yn1hKDEOCGR_fm5zu9UHMWCZtuEmWjpprrU,72
68
- omdev/precheck/precheck.py,sha256=2yTjNGvjPYf3QxUBbCbehBYYuB8gDR_dYSTrlNCs9qU,8322
68
+ omdev/precheck/base.py,sha256=a_lGoFM-QhL8u8XDUYFhb-feEyfPbP4j8lcmNO51sHY,732
69
+ omdev/precheck/git.py,sha256=APC5Ln7x0zDrQiGPRWPsBcVJK3vWhbU-brqR5M63JQA,849
70
+ omdev/precheck/lite.py,sha256=MLeDZP2UexNZzYTcSx4-LrhA97kCKn8tXrGkhsJb6I0,3649
71
+ omdev/precheck/precheck.py,sha256=LUqh501TpLgBL_ZBW-enEMqaYnWzPMViECpnHGKaCIc,2462
72
+ omdev/precheck/scripts.py,sha256=qq6MXkxgrYngPg5pWnXH4uRSuRkP3mFqbeml1UmvGBc,1265
69
73
  omdev/pyproject/__init__.py,sha256=Y3l4WY4JRi2uLG6kgbGp93fuGfkxkKwZDvhsa0Rwgtk,15
70
74
  omdev/pyproject/__main__.py,sha256=gFhR9DikwDZk0LqgdR3qq_aXQHThUOPllDmHDOfnFAU,67
71
75
  omdev/pyproject/cexts.py,sha256=x13piOOnNrYbA17qZLDVuR0p1sqhgEwpk4FtImX-klM,4281
@@ -86,13 +90,14 @@ omdev/tools/dockertools.py,sha256=0RoUThTqv4ySJZX0aufYeQWD2bp-BMplQ8Y4WvDpguA,52
86
90
  omdev/tools/gittools.py,sha256=zPy2D5WDs-CbwT86_T_hbaq5yCuss5e-ouUccXC6xlg,578
87
91
  omdev/tools/importscan.py,sha256=XRLiasVSaTIp-jnO0-Nfhi0t6gnv_hVy5j2nVfEvuMI,3831
88
92
  omdev/tools/importtrace.py,sha256=oDry9CwIv5h96wSaTVKJ0qQ5vMGxYE5oBtfF-GYNLJs,13430
93
+ omdev/tools/piptools.py,sha256=etJBfjtUZ5HeQ7C4sxWmeshT-xXPdhScqEHWbca98n0,657
89
94
  omdev/tools/rst.py,sha256=6dWk8QZHoGiLSuBw3TKsXZjjFK6wWBEtPi9krdCLKKg,977
90
95
  omdev/tools/sqlrepl.py,sha256=v9uVQ4nvquSXcQVYIFq34ikumSILvKqzD6lUKLcncCE,5646
91
96
  omdev/versioning/__init__.py,sha256=Y3l4WY4JRi2uLG6kgbGp93fuGfkxkKwZDvhsa0Rwgtk,15
92
97
  omdev/versioning/specifiers.py,sha256=6Odf9e6farwlPRsD_YqwTfYKG-BXn_dIcKtqfkhfodI,17432
93
98
  omdev/versioning/versions.py,sha256=ei2eopEsJq3zSMJmezK1nzZgikgCdxFtnF3f69nCRZQ,12246
94
- omdev-0.0.0.dev28.dist-info/LICENSE,sha256=B_hVtavaA8zCYDW99DYdcpDLKz1n3BBRjZrcbv8uG8c,1451
95
- omdev-0.0.0.dev28.dist-info/METADATA,sha256=QoShpM9YgegstZpXpp-S85RypV0WYAwkbIHwJ8ZIfsI,1252
96
- omdev-0.0.0.dev28.dist-info/WHEEL,sha256=GV9aMThwP_4oNCtvEC2ec3qUYutgWeAzklro_0m4WJQ,91
97
- omdev-0.0.0.dev28.dist-info/top_level.txt,sha256=1nr7j30fEWgLYHW3lGR9pkdHkb7knv1U1ES1XRNVQ6k,6
98
- omdev-0.0.0.dev28.dist-info/RECORD,,
99
+ omdev-0.0.0.dev29.dist-info/LICENSE,sha256=B_hVtavaA8zCYDW99DYdcpDLKz1n3BBRjZrcbv8uG8c,1451
100
+ omdev-0.0.0.dev29.dist-info/METADATA,sha256=_kVRNNJ4CIoIyEtgTCcAJzicnJevUfpkRjtXGcONxCQ,1252
101
+ omdev-0.0.0.dev29.dist-info/WHEEL,sha256=GV9aMThwP_4oNCtvEC2ec3qUYutgWeAzklro_0m4WJQ,91
102
+ omdev-0.0.0.dev29.dist-info/top_level.txt,sha256=1nr7j30fEWgLYHW3lGR9pkdHkb7knv1U1ES1XRNVQ6k,6
103
+ omdev-0.0.0.dev29.dist-info/RECORD,,