omdev 0.0.0.dev384__py3-none-any.whl → 0.0.0.dev386__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.
omdev/home/paths.py CHANGED
@@ -7,16 +7,18 @@ TODO:
7
7
  import os.path
8
8
  import typing as ta
9
9
 
10
+ from omlish.os.environ import EnvVar
11
+
10
12
 
11
13
  ##
12
14
 
13
15
 
14
- HOME_DIR_ENV_VAR = 'OMLISH_HOME'
16
+ HOME_DIR_ENV_VAR = EnvVar('OMLISH_HOME')
15
17
  DEFAULT_HOME_DIR = '~/.omlish'
16
18
 
17
19
 
18
20
  def get_home_dir() -> str:
19
- return os.path.expanduser(os.getenv(HOME_DIR_ENV_VAR, DEFAULT_HOME_DIR))
21
+ return os.path.expanduser(HOME_DIR_ENV_VAR.get(DEFAULT_HOME_DIR))
20
22
 
21
23
 
22
24
  #
omdev/home/secrets.py CHANGED
@@ -2,6 +2,7 @@ import os.path
2
2
  import typing as ta
3
3
 
4
4
  from omlish import lang
5
+ from omlish.os.environ import EnvVar
5
6
  from omlish.secrets import all as sec
6
7
 
7
8
  from .paths import get_home_paths
@@ -16,16 +17,13 @@ else:
16
17
  ##
17
18
 
18
19
 
19
- SECRETS_FILE_ENV_VAR = 'OMLISH_SECRETS'
20
+ SECRETS_FILE_ENV_VAR = EnvVar('OMLISH_SECRETS')
20
21
  DEFAULT_SECRETS_FILE_NAME = 'secrets.yml'
21
22
 
22
23
 
23
24
  def get_secrets_file() -> str:
24
25
  return os.path.expanduser(
25
- os.getenv(
26
- SECRETS_FILE_ENV_VAR,
27
- os.path.join(get_home_paths().config_dir, DEFAULT_SECRETS_FILE_NAME),
28
- ),
26
+ SECRETS_FILE_ENV_VAR.get(lambda: os.path.join(get_home_paths().config_dir, DEFAULT_SECRETS_FILE_NAME)),
29
27
  )
30
28
 
31
29
 
omdev/ptk/__init__.py CHANGED
@@ -97,4 +97,7 @@ from prompt_toolkit.widgets.toolbars import SearchToolbar
97
97
  from prompt_toolkit.widgets.toolbars import SystemToolbar
98
98
  from prompt_toolkit.widgets.toolbars import ValidationToolbar
99
99
 
100
+ #
101
+ from .confirm import a_strict_confirm
102
+ from .confirm import create_strict_confirm_session
100
103
  from .confirm import strict_confirm
omdev/ptk/confirm.py CHANGED
@@ -1,9 +1,11 @@
1
+
1
2
  from prompt_toolkit.formatted_text import merge_formatted_text
2
3
  from prompt_toolkit.key_binding import KeyBindings
3
4
  from prompt_toolkit.key_binding import KeyPressEvent
4
5
  from prompt_toolkit.shortcuts import PromptSession
5
6
 
6
7
  from omlish import check
8
+ from omlish import lang
7
9
 
8
10
 
9
11
  ##
@@ -37,12 +39,15 @@ def create_strict_confirm_session(
37
39
  return session
38
40
 
39
41
 
40
- def strict_confirm(message: str = 'Confirm?', suffix: str = ' (y/n) ') -> bool:
42
+ ##
43
+
44
+
45
+ def _m_strict_confirm(message: str = 'Confirm?', suffix: str = ' (y/n) ') -> lang.MaysyncGen[bool]:
41
46
  """Display a confirmation prompt that returns True/False. Requires an explicit answer."""
42
47
 
43
48
  while True:
44
49
  session = create_strict_confirm_session(message, suffix)
45
- ret = session.prompt()
50
+ ret = yield from lang.maysync_yield(session.prompt, session.prompt_async)()
46
51
 
47
52
  if isinstance(ret, str):
48
53
  check.empty(ret)
@@ -52,3 +57,7 @@ def strict_confirm(message: str = 'Confirm?', suffix: str = ' (y/n) ') -> bool:
52
57
 
53
58
  else:
54
59
  raise TypeError(ret)
60
+
61
+
62
+ strict_confirm = lang.maysync_wrap(_m_strict_confirm)
63
+ a_strict_confirm = lang.a_maysync_wrap(_m_strict_confirm)
omdev/tokens/all.py CHANGED
@@ -8,10 +8,12 @@ from .tokenizert import ( # noqa
8
8
 
9
9
  from .utils import ( # noqa
10
10
  Tokens,
11
+ TokensIterable,
11
12
 
12
13
  WS_NAMES,
13
14
  is_ws,
14
15
  ignore_ws,
16
+ ignore_ws_,
15
17
 
16
18
  split_lines,
17
19
  split_lines_dense,
@@ -14,7 +14,7 @@
14
14
  # WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
15
15
  # COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
16
16
  # OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
17
- # https://github.com/asottile/tokenize-rt/blob/413692b7c1ad8a873caec39dd4f427d55ee538ea/tokenize_rt.py
17
+ # https://github.com/asottile/tokenize-rt/blob/d3874b787677593fc34aedf7174a2934e2caa94b/tokenize_rt.py
18
18
  import argparse
19
19
  import io
20
20
  import keyword
@@ -123,7 +123,7 @@ class Tokenization:
123
123
 
124
124
  tok_name = tokenize.tok_name[tok_type]
125
125
 
126
- if tok_name == 'FSTRING_MIDDLE': # pragma: >=3.12 cover
126
+ if tok_name in {'FSTRING_MIDDLE', 'TSTRING_MIDDLE'}: # pragma: >=3.12 cover
127
127
  if '{' in tok_text or '}' in tok_text:
128
128
  new_tok_text = cls.curly_escape(tok_text)
129
129
  ecol += len(new_tok_text) - len(tok_text)
omdev/tokens/utils.py CHANGED
@@ -5,6 +5,7 @@ from .tokenizert import Token
5
5
 
6
6
 
7
7
  Tokens: ta.TypeAlias = ta.Sequence[Token]
8
+ TokensIterable: ta.TypeAlias = ta.Iterable[Token]
8
9
 
9
10
 
10
11
  ##
@@ -37,14 +38,25 @@ def ignore_ws(
37
38
  )
38
39
 
39
40
 
41
+ def ignore_ws_(
42
+ toks: ta.Iterable[Token],
43
+ *,
44
+ keep: ta.Container[str] = (),
45
+ ) -> list[Token]:
46
+ return list(ignore_ws(
47
+ toks,
48
+ keep=keep,
49
+ ))
50
+
51
+
40
52
  ##
41
53
 
42
54
 
43
- def split_lines(ts: Tokens) -> list[Tokens]:
55
+ def split_lines(ts: TokensIterable) -> list[Tokens]:
44
56
  return [list(it) for g, it in itertools.groupby(ts, lambda t: t.line)]
45
57
 
46
58
 
47
- def split_lines_dense(ts: Tokens) -> list[Tokens]:
59
+ def split_lines_dense(ts: TokensIterable) -> list[Tokens]:
48
60
  lines: list[list[Token]] = []
49
61
  for t in ts:
50
62
  while len(lines) < (t.line or 0):
@@ -53,7 +65,7 @@ def split_lines_dense(ts: Tokens) -> list[Tokens]:
53
65
  return lines # type: ignore[return-value]
54
66
 
55
67
 
56
- def join_toks(ts: Tokens) -> str:
68
+ def join_toks(ts: TokensIterable) -> str:
57
69
  return ''.join(t.src for t in ts)
58
70
 
59
71
 
@@ -65,7 +77,7 @@ def join_lines(ls: ta.Iterable[Tokens]) -> str:
65
77
 
66
78
 
67
79
  def match_toks(
68
- ts: ta.Iterable[Token],
80
+ ts: TokensIterable,
69
81
  pat: ta.Sequence[tuple[str | None, str | tuple[str, ...] | None]],
70
82
  ) -> bool:
71
83
  it = iter(ts)
omdev/tools/git/cli.py CHANGED
@@ -23,7 +23,8 @@ TODO:
23
23
  import dataclasses as dc
24
24
  import logging
25
25
  import os
26
- import re
26
+ import shutil
27
+ import tempfile
27
28
  import typing as ta
28
29
  import urllib.parse
29
30
 
@@ -42,6 +43,9 @@ from ...git.status import get_git_status
42
43
  from ...home.paths import get_home_paths
43
44
  from ...home.shadow import get_shadow_configs
44
45
  from . import consts
46
+ from .cloning import GithubCloneTarget
47
+ from .cloning import OtherCloneTarget
48
+ from .cloning import parse_clone_target
45
49
  from .messages import GitMessageGenerator
46
50
  from .messages import TimestampGitMessageGenerator
47
51
  from .messages import load_message_generator_manifests
@@ -153,8 +157,6 @@ class Cli(ap.Cli):
153
157
 
154
158
  #
155
159
 
156
- _GITHUB_PAT = re.compile(r'((http(s)?://)?(www\./)?github(\.com)?/)?(?P<user>[^/.]+)/(?P<repo>[^/.]+)(/.*)?')
157
-
158
160
  @ap.cmd(
159
161
  ap.arg('repo'),
160
162
  ap.arg('args', nargs=ap.REMAINDER),
@@ -166,25 +168,23 @@ class Cli(ap.Cli):
166
168
  # fails.
167
169
  out_dir = '.'
168
170
  try:
169
- if (m := self._GITHUB_PAT.fullmatch(self.args.repo)):
170
- user = m.group('user')
171
- repo = m.group('repo')
172
-
173
- os.makedirs(user, 0o755, exist_ok=True)
171
+ ct = parse_clone_target(self.args.repo)
172
+ if isinstance(ct, GithubCloneTarget):
173
+ os.makedirs(ct.user, 0o755, exist_ok=True)
174
174
 
175
175
  subprocesses.check_call(
176
176
  'git',
177
177
  'clone',
178
178
  *self.unknown_args,
179
179
  *self.args.args,
180
- f'git@github.com:{user}/{repo}.git',
181
- os.path.join(user, repo),
180
+ ct.render(),
181
+ os.path.join(ct.user, ct.repo),
182
182
  )
183
183
 
184
- out_dir = os.path.join(user, repo)
184
+ out_dir = os.path.join(ct.user, ct.repo)
185
185
 
186
- else:
187
- parsed = urllib.parse.urlparse(self.args.repo)
186
+ elif isinstance(ct, OtherCloneTarget):
187
+ parsed = urllib.parse.urlparse(ct.s)
188
188
  out_dir = parsed.path.split('/')[-1]
189
189
 
190
190
  subprocesses.check_call(
@@ -192,12 +192,17 @@ class Cli(ap.Cli):
192
192
  'clone',
193
193
  *self.unknown_args,
194
194
  *self.args.args,
195
- self.args.repo,
195
+ ct.render(),
196
196
  )
197
197
 
198
+ else:
199
+ raise TypeError(ct)
200
+
198
201
  finally:
199
202
  print(out_dir)
200
203
 
204
+ #
205
+
201
206
  @ap.cmd(
202
207
  ap.arg('rev', nargs='?', default='HEAD'),
203
208
  ap.arg('-d', '--diff', action='store_true'),
@@ -466,6 +471,50 @@ class Cli(ap.Cli):
466
471
  *self.unknown_args,
467
472
  )
468
473
 
474
+ #
475
+
476
+ @ap.cmd(
477
+ ap.arg('repo'),
478
+ ap.arg('args', nargs=ap.REMAINDER),
479
+ accepts_unknown=True,
480
+ )
481
+ def anon_clone(self) -> None:
482
+ cwd = os.getcwd()
483
+
484
+ # As with the clone command, we always print a cd-able path to stdout, even on failure.
485
+ out_dir = '.'
486
+ try:
487
+ tmp_dir = tempfile.mkdtemp()
488
+ try:
489
+ ct = parse_clone_target(self.args.repo)
490
+
491
+ subprocesses.check_call(
492
+ 'git',
493
+ 'clone',
494
+ *self.unknown_args,
495
+ *self.args.args,
496
+ ct.render(),
497
+ cwd=tmp_dir,
498
+ )
499
+
500
+ repo_dir_name = check.single(os.listdir(tmp_dir))
501
+ repo_dir = os.path.join(tmp_dir, repo_dir_name)
502
+ check.state(os.path.isdir(repo_dir))
503
+
504
+ git_dir = os.path.join(repo_dir, '.git')
505
+ check.state(os.path.isdir(git_dir))
506
+ shutil.rmtree(git_dir)
507
+
508
+ shutil.move(repo_dir, cwd)
509
+
510
+ out_dir = repo_dir_name
511
+
512
+ finally:
513
+ shutil.rmtree(tmp_dir)
514
+
515
+ finally:
516
+ print(out_dir)
517
+
469
518
 
470
519
  ##
471
520
 
@@ -0,0 +1,42 @@
1
+ import abc
2
+ import dataclasses as dc
3
+ import re
4
+
5
+ from omlish import lang
6
+
7
+
8
+ ##
9
+
10
+
11
+ @dc.dataclass(frozen=True)
12
+ class CloneTarget(lang.Abstract, lang.Sealed):
13
+ @abc.abstractmethod
14
+ def render(self) -> str:
15
+ raise NotImplementedError
16
+
17
+
18
+ @dc.dataclass(frozen=True)
19
+ class GithubCloneTarget(CloneTarget, lang.Final):
20
+ user: str
21
+ repo: str
22
+
23
+ def render(self) -> str:
24
+ return f'git@github.com:{self.user}/{self.repo}.git'
25
+
26
+
27
+ @dc.dataclass(frozen=True)
28
+ class OtherCloneTarget(CloneTarget, lang.Final):
29
+ s: str
30
+
31
+ def render(self) -> str:
32
+ return self.s
33
+
34
+
35
+ _GITHUB_PAT = re.compile(r'((http(s)?://)?(www\./)?github(\.com)?/)?(?P<user>[^/.]+)/(?P<repo>[^/.]+)(/.*)?')
36
+
37
+
38
+ def parse_clone_target(s: str) -> CloneTarget:
39
+ if (m := _GITHUB_PAT.fullmatch(s)):
40
+ return GithubCloneTarget(m.group('user'), m.group('repo'))
41
+ else:
42
+ return OtherCloneTarget(s)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: omdev
3
- Version: 0.0.0.dev384
3
+ Version: 0.0.0.dev386
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.dev384
17
+ Requires-Dist: omlish==0.0.0.dev386
18
18
  Provides-Extra: all
19
19
  Requires-Dist: black~=25.1; extra == "all"
20
20
  Requires-Dist: pycparser~=2.22; extra == "all"
@@ -137,8 +137,8 @@ omdev/git/revisions.py,sha256=2UVEji6ORC3StQDL47CAsqKRkuOvQg8Us5Cm7pK66RM,1182
137
137
  omdev/git/shallow.py,sha256=9BDdxDBmWgfWpbfUqjwIl-3lSVEDde1cXNZcqLB-gM0,2541
138
138
  omdev/git/status.py,sha256=HYNoSxsiZUypQU7itWTKx3uHkjGpY0_5J2q5QeaP794,8456
139
139
  omdev/home/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
140
- omdev/home/paths.py,sha256=tnRuEzA1nRc9NJKGSxyZMOLlZBk5Da0AQhNeSmBozYA,1331
141
- omdev/home/secrets.py,sha256=XarB-uhwjRc3dpT5ZF-9yoRPDr7kpyr4Hgs0I4kKL4I,1992
140
+ omdev/home/paths.py,sha256=stc3VvTmxRYQaGln3WPs2Tou3D7sy0OC_ydft_aJPM0,1370
141
+ omdev/home/secrets.py,sha256=Bq9Pak4lzsogw5GvOeQ4zs3Yatmn7glGH0q-b0Sf6h8,2003
142
142
  omdev/home/shadow.py,sha256=6mGDJV70IExa-nzd7mOUW4R3OZIXO0fBwmOUU9T9f4M,295
143
143
  omdev/intellij/__init__.py,sha256=OkihYdld_LTk_gTcyzOWc9Nze_drjsIYMYpbA5DG6m4,132
144
144
  omdev/intellij/cli.py,sha256=Sds9Xj_OHgbm76j70frhwrZEzlVi-1Rd93g0ypIe6t4,2038
@@ -216,8 +216,8 @@ omdev/precheck/main.py,sha256=_1A5wiu9p2th1dn_17w1ZIFtMmCIOaTFpWyvK0jopEA,4374
216
216
  omdev/precheck/manifests.py,sha256=1CG0PG0feagydT-cgxiOBvQKhoILjZVXk4MYf65wkkM,786
217
217
  omdev/precheck/scripts.py,sha256=244Jq5xee2QErn0gvpt0hmdYg95TYtuefMDXaE9YPws,1344
218
218
  omdev/precheck/unicode.py,sha256=VUNDCrlfUas_U8ugV_q0eFUXuBgKjS8YdCFm0FXREXo,2583
219
- omdev/ptk/__init__.py,sha256=IemfBhxxqZe1GeZ2_IMQzqWAB5j0XyARp_aajnonyKY,5142
220
- omdev/ptk/confirm.py,sha256=kObMUAu-EZC0vdT9LLwtbNA6YLLNmn-Uy18SQTWBTb8,1471
219
+ omdev/ptk/__init__.py,sha256=EfZaAaPbOxgOt3-fdYS8ssI5A0KsCIIMbTRdalWSrR4,5233
220
+ omdev/ptk/confirm.py,sha256=kqz7PUnrNztF7UT1sCMtJa-p4jaRTz047veKWKOYfpU,1688
221
221
  omdev/ptk/apps/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
222
222
  omdev/ptk/apps/ncdu.py,sha256=KTbAgwhzcROOvq20VGN92UwMWcgkMMVOeFfpjZAsKUk,4561
223
223
  omdev/ptk/markdown/LICENSE,sha256=oSmc9j-n23wTJUO0TbY8sIHrf9pFZUovFWfDL7D53IA,1489
@@ -271,9 +271,9 @@ omdev/scripts/pyproject.py,sha256=Z4rhwcD4l3_tszNdKFwd4TlmvGEKNmr8EYPaHNXwux8,26
271
271
  omdev/scripts/slowcat.py,sha256=lssv4yrgJHiWfOiHkUut2p8E8Tq32zB-ujXESQxFFHY,2728
272
272
  omdev/scripts/tmpexec.py,sha256=WTYcf56Tj2qjYV14AWmV8SfT0u6Y8eIU6cKgQRvEK3c,1442
273
273
  omdev/tokens/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
274
- omdev/tokens/all.py,sha256=a_fJ9vp9_Sky4OgtxQ6e6JXwvFSaY0XluVjKeBYCheU,770
275
- omdev/tokens/tokenizert.py,sha256=66tTP7J4vCYMgn-EKtfLBmc8SfycL1llvI4Q7LSxOk4,7890
276
- omdev/tokens/utils.py,sha256=vF2c8vHwe1zfSXNeU0q1CaA_66oZl0YdkqBKzNhFsAM,1758
274
+ omdev/tokens/all.py,sha256=Zz7miOWeBDYfOEgKyeIGHooLvr9r31HlI04eqYWBUpU,806
275
+ omdev/tokens/tokenizert.py,sha256=BvDjXjaeM3_sMq9i-oojuKcAuGzSkbCso-Yt-gNKxeQ,7910
276
+ omdev/tokens/utils.py,sha256=6dey8Oh78cIWqhGh7zfW3cmZjnBZPRpR8FQ8ntwAz9A,2014
277
277
  omdev/tools/__init__.py,sha256=iVJAOQ0viGTQOm0DLX4uZLro-9jOioYJGLg9s0kDx1A,78
278
278
  omdev/tools/cloc.py,sha256=BiIf2PnnoRH6ByH4mnua69Vv-ZDPHsSAPUds7giRolI,6013
279
279
  omdev/tools/diff.py,sha256=S6ddB7pBeMtzKh2hiHfzQ93pj6mclKt1UZQMKy4Bt5M,520
@@ -295,7 +295,8 @@ omdev/tools/antlr/consts.py,sha256=4xH4jyNE5czXRWCn65jFF0MrAodMPe_kYMWpgMxWmpo,2
295
295
  omdev/tools/antlr/gen.py,sha256=spYfyfX_r_1YT4uZ_bEhtGwANenUtZvSOFck5eiNHhQ,5122
296
296
  omdev/tools/git/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
297
297
  omdev/tools/git/__main__.py,sha256=gI87SBUgTkKUcUM-RtZWnei-UUDDqzbr5aPztb-gvbE,168
298
- omdev/tools/git/cli.py,sha256=UxxyQcYF2--Q7UcLJFWXew8_rwLJJNENACplwdFEEKM,15491
298
+ omdev/tools/git/cli.py,sha256=I4AiCTz4OCzK6s8J2TJF1eYw9FH2JIK_CsdjQH_9UTE,16757
299
+ omdev/tools/git/cloning.py,sha256=CNGBBMoWaTBJW4SZTf1VvhDFSm0yg7qDfNwZun_PFbU,891
299
300
  omdev/tools/git/consts.py,sha256=JuXivUNDkNhM4pe97icjRVAKM8cNRbrODquHINNKqOE,40
300
301
  omdev/tools/git/messages.py,sha256=NWztIK0nAKJIOVzuVQcR_5LHZUgqyVkrOlpl7dFLMdU,2424
301
302
  omdev/tools/json/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -315,9 +316,9 @@ omdev/tools/jsonview/resources/jsonview.js,sha256=faDvXDOXKvEvjOuIlz4D3F2ReQXb_b
315
316
  omdev/tools/pawk/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
316
317
  omdev/tools/pawk/__main__.py,sha256=VCqeRVnqT1RPEoIrqHFSu4PXVMg4YEgF4qCQm90-eRI,66
317
318
  omdev/tools/pawk/pawk.py,sha256=ao5mdrpiSU4AZ8mBozoEaV3UVlmVTnRG9wD9XP70MZE,11429
318
- omdev-0.0.0.dev384.dist-info/licenses/LICENSE,sha256=B_hVtavaA8zCYDW99DYdcpDLKz1n3BBRjZrcbv8uG8c,1451
319
- omdev-0.0.0.dev384.dist-info/METADATA,sha256=me8bhIqvWw_vowECE008JbiG1QtzfRuNZFf5dpt7H1Q,5094
320
- omdev-0.0.0.dev384.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
321
- omdev-0.0.0.dev384.dist-info/entry_points.txt,sha256=dHLXFmq5D9B8qUyhRtFqTGWGxlbx3t5ejedjrnXNYLU,33
322
- omdev-0.0.0.dev384.dist-info/top_level.txt,sha256=1nr7j30fEWgLYHW3lGR9pkdHkb7knv1U1ES1XRNVQ6k,6
323
- omdev-0.0.0.dev384.dist-info/RECORD,,
319
+ omdev-0.0.0.dev386.dist-info/licenses/LICENSE,sha256=B_hVtavaA8zCYDW99DYdcpDLKz1n3BBRjZrcbv8uG8c,1451
320
+ omdev-0.0.0.dev386.dist-info/METADATA,sha256=r8UoB7YL9vOS2m4Bd_xOemEghT1Ow2biR65h-Cr5Rdk,5094
321
+ omdev-0.0.0.dev386.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
322
+ omdev-0.0.0.dev386.dist-info/entry_points.txt,sha256=dHLXFmq5D9B8qUyhRtFqTGWGxlbx3t5ejedjrnXNYLU,33
323
+ omdev-0.0.0.dev386.dist-info/top_level.txt,sha256=1nr7j30fEWgLYHW3lGR9pkdHkb7knv1U1ES1XRNVQ6k,6
324
+ omdev-0.0.0.dev386.dist-info/RECORD,,