omdev 0.0.0.dev385__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 +4 -2
- omdev/home/secrets.py +3 -5
- omdev/ptk/confirm.py +1 -1
- omdev/tokens/all.py +2 -0
- omdev/tokens/tokenizert.py +2 -2
- omdev/tokens/utils.py +16 -4
- omdev/tools/git/cli.py +63 -14
- omdev/tools/git/cloning.py +42 -0
- {omdev-0.0.0.dev385.dist-info → omdev-0.0.0.dev386.dist-info}/METADATA +2 -2
- {omdev-0.0.0.dev385.dist-info → omdev-0.0.0.dev386.dist-info}/RECORD +14 -13
- {omdev-0.0.0.dev385.dist-info → omdev-0.0.0.dev386.dist-info}/WHEEL +0 -0
- {omdev-0.0.0.dev385.dist-info → omdev-0.0.0.dev386.dist-info}/entry_points.txt +0 -0
- {omdev-0.0.0.dev385.dist-info → omdev-0.0.0.dev386.dist-info}/licenses/LICENSE +0 -0
- {omdev-0.0.0.dev385.dist-info → omdev-0.0.0.dev386.dist-info}/top_level.txt +0 -0
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(
|
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.
|
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/confirm.py
CHANGED
@@ -47,7 +47,7 @@ def _m_strict_confirm(message: str = 'Confirm?', suffix: str = ' (y/n) ') -> lan
|
|
47
47
|
|
48
48
|
while True:
|
49
49
|
session = create_strict_confirm_session(message, suffix)
|
50
|
-
ret =
|
50
|
+
ret = yield from lang.maysync_yield(session.prompt, session.prompt_async)()
|
51
51
|
|
52
52
|
if isinstance(ret, str):
|
53
53
|
check.empty(ret)
|
omdev/tokens/all.py
CHANGED
omdev/tokens/tokenizert.py
CHANGED
@@ -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/
|
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
|
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:
|
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:
|
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:
|
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:
|
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
|
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
|
-
|
170
|
-
|
171
|
-
|
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
|
-
|
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
|
-
|
187
|
-
parsed = urllib.parse.urlparse(
|
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
|
-
|
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.
|
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.
|
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=
|
141
|
-
omdev/home/secrets.py,sha256=
|
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
|
@@ -217,7 +217,7 @@ omdev/precheck/manifests.py,sha256=1CG0PG0feagydT-cgxiOBvQKhoILjZVXk4MYf65wkkM,7
|
|
217
217
|
omdev/precheck/scripts.py,sha256=244Jq5xee2QErn0gvpt0hmdYg95TYtuefMDXaE9YPws,1344
|
218
218
|
omdev/precheck/unicode.py,sha256=VUNDCrlfUas_U8ugV_q0eFUXuBgKjS8YdCFm0FXREXo,2583
|
219
219
|
omdev/ptk/__init__.py,sha256=EfZaAaPbOxgOt3-fdYS8ssI5A0KsCIIMbTRdalWSrR4,5233
|
220
|
-
omdev/ptk/confirm.py,sha256=
|
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=
|
275
|
-
omdev/tokens/tokenizert.py,sha256=
|
276
|
-
omdev/tokens/utils.py,sha256=
|
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=
|
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.
|
319
|
-
omdev-0.0.0.
|
320
|
-
omdev-0.0.0.
|
321
|
-
omdev-0.0.0.
|
322
|
-
omdev-0.0.0.
|
323
|
-
omdev-0.0.0.
|
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,,
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|