omdev 0.0.0.dev30__py3-none-any.whl → 0.0.0.dev31__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/interp/pyenv.py +8 -1
- omdev/manifests.py +111 -17
- omdev/pyproject/cli.py +1 -1
- omdev/scripts/interp.py +8 -1
- omdev/scripts/pyproject.py +9 -2
- omdev/secrets.py +12 -0
- {omdev-0.0.0.dev30.dist-info → omdev-0.0.0.dev31.dist-info}/METADATA +2 -2
- {omdev-0.0.0.dev30.dist-info → omdev-0.0.0.dev31.dist-info}/RECORD +11 -10
- {omdev-0.0.0.dev30.dist-info → omdev-0.0.0.dev31.dist-info}/LICENSE +0 -0
- {omdev-0.0.0.dev30.dist-info → omdev-0.0.0.dev31.dist-info}/WHEEL +0 -0
- {omdev-0.0.0.dev30.dist-info → omdev-0.0.0.dev31.dist-info}/top_level.txt +0 -0
omdev/interp/pyenv.py
CHANGED
|
@@ -3,7 +3,14 @@ TODO:
|
|
|
3
3
|
- custom tags
|
|
4
4
|
- optionally install / upgrade pyenv itself
|
|
5
5
|
- new vers dont need these custom mac opts, only run on old vers
|
|
6
|
-
|
|
6
|
+
|
|
7
|
+
TODO opts:
|
|
8
|
+
- --enable-loadable-sqlite-extensions LDFLAGS="-L/opt/homebrew/opt/sqlite/lib" CPPFLAGS="-I/opt/homebrew/opt/sqlite/include"
|
|
9
|
+
- --enable-shared
|
|
10
|
+
- --enable-optimizations
|
|
11
|
+
- --enable-profiling ?
|
|
12
|
+
- --enable-ipv6 ?
|
|
13
|
+
""" # noqa
|
|
7
14
|
# ruff: noqa: UP006 UP007
|
|
8
15
|
import abc
|
|
9
16
|
import dataclasses as dc
|
omdev/manifests.py
CHANGED
|
@@ -1,20 +1,15 @@
|
|
|
1
1
|
"""
|
|
2
|
-
|
|
3
|
-
-
|
|
4
|
-
-
|
|
5
|
-
|
|
6
|
-
- comment must immediately precede a global val setter
|
|
7
|
-
- val is grabbed from imported module dict by name
|
|
8
|
-
- value is repr'd somehow (roundtrip checked) (naw, json lol)
|
|
9
|
-
- dumped in _manifest.py
|
|
10
|
-
- # @omlish-manifest \n _CACHE_MANIFEST = {'cache': {'name': 'llm', …
|
|
11
|
-
- also can do prechecks!
|
|
2
|
+
TODO:
|
|
3
|
+
- split, cli.py / types.py
|
|
4
|
+
- opt to load only specified types
|
|
5
|
+
- prechecks
|
|
12
6
|
"""
|
|
13
7
|
# ruff: noqa: UP006 UP007
|
|
14
8
|
# @omlish-lite
|
|
15
9
|
import argparse
|
|
16
10
|
import collections
|
|
17
11
|
import dataclasses as dc
|
|
12
|
+
import importlib
|
|
18
13
|
import inspect
|
|
19
14
|
import json
|
|
20
15
|
import os.path
|
|
@@ -50,12 +45,50 @@ class Manifest(ManifestOrigin):
|
|
|
50
45
|
value: ta.Any
|
|
51
46
|
|
|
52
47
|
|
|
48
|
+
def load_manifest_entry(
|
|
49
|
+
entry: ta.Mapping[str, ta.Any],
|
|
50
|
+
*,
|
|
51
|
+
raw_values: bool = False,
|
|
52
|
+
) -> Manifest:
|
|
53
|
+
manifest = Manifest(**entry)
|
|
54
|
+
|
|
55
|
+
[(key, value_dct)] = manifest.value.items()
|
|
56
|
+
if not key.startswith('$'):
|
|
57
|
+
raise Exception(f'Bad key: {key}')
|
|
58
|
+
|
|
59
|
+
if not raw_values:
|
|
60
|
+
parts = key[1:].split('.')
|
|
61
|
+
pos = next(i for i, p in enumerate(parts) if p[0].isupper())
|
|
62
|
+
mod_name = '.'.join(parts[:pos])
|
|
63
|
+
mod = importlib.import_module(mod_name)
|
|
64
|
+
|
|
65
|
+
obj: ta.Any = mod
|
|
66
|
+
for ca in parts[pos:]:
|
|
67
|
+
obj = getattr(obj, ca)
|
|
68
|
+
cls = obj
|
|
69
|
+
if not isinstance(cls, type):
|
|
70
|
+
raise TypeError(cls)
|
|
71
|
+
|
|
72
|
+
if not dc.is_dataclass(cls):
|
|
73
|
+
raise TypeError(cls)
|
|
74
|
+
obj = cls(**value_dct) # noqa
|
|
75
|
+
|
|
76
|
+
manifest = dc.replace(manifest, value=obj)
|
|
77
|
+
|
|
78
|
+
return manifest
|
|
79
|
+
|
|
80
|
+
|
|
81
|
+
##
|
|
82
|
+
|
|
83
|
+
|
|
53
84
|
MANIFEST_MAGIC = '# @omlish-manifest'
|
|
54
85
|
|
|
55
86
|
_MANIFEST_GLOBAL_PAT = re.compile(r'^(?P<name>[A-Za-z_][A-Za-z0-9_]*)\s*=.*')
|
|
56
87
|
|
|
57
88
|
|
|
58
89
|
def _dump_module_manifests(spec: str, *attrs: str) -> None:
|
|
90
|
+
import collections.abc
|
|
91
|
+
import dataclasses as dc # noqa
|
|
59
92
|
import importlib
|
|
60
93
|
import json
|
|
61
94
|
|
|
@@ -65,13 +98,35 @@ def _dump_module_manifests(spec: str, *attrs: str) -> None:
|
|
|
65
98
|
for attr in attrs:
|
|
66
99
|
manifest = getattr(mod, attr)
|
|
67
100
|
|
|
68
|
-
|
|
69
|
-
|
|
101
|
+
if dc.is_dataclass(manifest):
|
|
102
|
+
cls = type(manifest)
|
|
103
|
+
manifest_json = json.dumps(dc.asdict(manifest)) # type: ignore
|
|
104
|
+
manifest_dct = json.loads(manifest_json)
|
|
105
|
+
|
|
106
|
+
rt_manifest = cls(**manifest_dct) # type: ignore
|
|
107
|
+
if rt_manifest != manifest:
|
|
108
|
+
raise Exception(f'Manifest failed to roundtrip: {manifest} -> {manifest_dct} != {rt_manifest}')
|
|
109
|
+
|
|
110
|
+
key = f'${cls.__module__}.{cls.__qualname__}'
|
|
111
|
+
out[attr] = {key: manifest_dct}
|
|
112
|
+
|
|
113
|
+
elif isinstance(manifest, collections.abc.Mapping):
|
|
114
|
+
[(key, manifest_dct)] = manifest.items()
|
|
115
|
+
if not key.startswith('$'): # noqa
|
|
116
|
+
raise Exception(f'Bad key: {key}')
|
|
117
|
+
|
|
118
|
+
if not isinstance(manifest_dct, collections.abc.Mapping):
|
|
119
|
+
raise Exception(f'Bad value: {manifest_dct}')
|
|
70
120
|
|
|
71
|
-
|
|
72
|
-
|
|
121
|
+
manifest_json = json.dumps(manifest_dct)
|
|
122
|
+
rt_manifest_dct = json.loads(manifest_json)
|
|
123
|
+
if manifest_dct != rt_manifest_dct:
|
|
124
|
+
raise Exception(f'Manifest failed to roundtrip: {manifest_dct} != {rt_manifest_dct}')
|
|
73
125
|
|
|
74
|
-
|
|
126
|
+
out[attr] = {key: manifest_dct}
|
|
127
|
+
|
|
128
|
+
else:
|
|
129
|
+
raise TypeError(f'Manifest must be dataclass or mapping: {manifest!r}')
|
|
75
130
|
|
|
76
131
|
out_json = json.dumps(out, indent=None, separators=(',', ':'))
|
|
77
132
|
print(out_json)
|
|
@@ -205,8 +260,30 @@ def build_package_manifests(
|
|
|
205
260
|
##
|
|
206
261
|
|
|
207
262
|
|
|
263
|
+
def check_package_manifests(
|
|
264
|
+
name: str,
|
|
265
|
+
base: str,
|
|
266
|
+
) -> None:
|
|
267
|
+
pkg_dir = os.path.join(base, name)
|
|
268
|
+
if not os.path.isdir(pkg_dir) or not os.path.isfile(os.path.join(pkg_dir, '__init__.py')):
|
|
269
|
+
raise Exception(pkg_dir)
|
|
270
|
+
|
|
271
|
+
manifests_file = os.path.join(pkg_dir, '.manifests.json')
|
|
272
|
+
if not os.path.isfile(manifests_file):
|
|
273
|
+
raise Exception(f'No manifests file: {manifests_file}')
|
|
274
|
+
|
|
275
|
+
with open(manifests_file) as f:
|
|
276
|
+
manifests_json = json.load(f)
|
|
277
|
+
|
|
278
|
+
for entry in manifests_json:
|
|
279
|
+
load_manifest_entry(entry)
|
|
280
|
+
|
|
281
|
+
|
|
282
|
+
##
|
|
283
|
+
|
|
284
|
+
|
|
208
285
|
if __name__ == '__main__':
|
|
209
|
-
def
|
|
286
|
+
def _get_base(args) -> str:
|
|
210
287
|
if args.base is not None:
|
|
211
288
|
base = args.base
|
|
212
289
|
else:
|
|
@@ -214,6 +291,10 @@ if __name__ == '__main__':
|
|
|
214
291
|
base = os.path.abspath(base)
|
|
215
292
|
if not os.path.isdir(base):
|
|
216
293
|
raise RuntimeError(base)
|
|
294
|
+
return base
|
|
295
|
+
|
|
296
|
+
def _gen_cmd(args) -> None:
|
|
297
|
+
base = _get_base(args)
|
|
217
298
|
|
|
218
299
|
for pkg in args.package:
|
|
219
300
|
ms = build_package_manifests(
|
|
@@ -224,6 +305,15 @@ if __name__ == '__main__':
|
|
|
224
305
|
if not args.quiet:
|
|
225
306
|
print(json_dumps_pretty([dc.asdict(m) for m in ms]))
|
|
226
307
|
|
|
308
|
+
def _check_cmd(args) -> None:
|
|
309
|
+
base = _get_base(args)
|
|
310
|
+
|
|
311
|
+
for pkg in args.package:
|
|
312
|
+
check_package_manifests(
|
|
313
|
+
pkg,
|
|
314
|
+
base,
|
|
315
|
+
)
|
|
316
|
+
|
|
227
317
|
def _main(argv=None) -> None:
|
|
228
318
|
configure_standard_logging('INFO')
|
|
229
319
|
|
|
@@ -235,9 +325,13 @@ if __name__ == '__main__':
|
|
|
235
325
|
parser_gen.add_argument('-w', '--write', action='store_true')
|
|
236
326
|
parser_gen.add_argument('-q', '--quiet', action='store_true')
|
|
237
327
|
parser_gen.add_argument('package', nargs='*')
|
|
238
|
-
|
|
239
328
|
parser_gen.set_defaults(func=_gen_cmd)
|
|
240
329
|
|
|
330
|
+
parser_check = subparsers.add_parser('check')
|
|
331
|
+
parser_check.add_argument('-b', '--base')
|
|
332
|
+
parser_check.add_argument('package', nargs='*')
|
|
333
|
+
parser_check.set_defaults(func=_check_cmd)
|
|
334
|
+
|
|
241
335
|
args = parser.parse_args(argv)
|
|
242
336
|
if not getattr(args, 'func', None):
|
|
243
337
|
parser.print_help()
|
omdev/pyproject/cli.py
CHANGED
|
@@ -9,7 +9,7 @@ TODO:
|
|
|
9
9
|
- {pkg_name: [src_dirs]}, default excludes, generate MANIFST.in, ...
|
|
10
10
|
- env vars - PYTHONPATH
|
|
11
11
|
|
|
12
|
-
|
|
12
|
+
See:
|
|
13
13
|
- https://pdm-project.org/en/latest/
|
|
14
14
|
- https://rye.astral.sh/philosophy/
|
|
15
15
|
- https://github.com/indygreg/python-build-standalone/blob/main/pythonbuild/cpython.py
|
omdev/scripts/interp.py
CHANGED
|
@@ -1798,7 +1798,14 @@ TODO:
|
|
|
1798
1798
|
- custom tags
|
|
1799
1799
|
- optionally install / upgrade pyenv itself
|
|
1800
1800
|
- new vers dont need these custom mac opts, only run on old vers
|
|
1801
|
-
|
|
1801
|
+
|
|
1802
|
+
TODO opts:
|
|
1803
|
+
- --enable-loadable-sqlite-extensions LDFLAGS="-L/opt/homebrew/opt/sqlite/lib" CPPFLAGS="-I/opt/homebrew/opt/sqlite/include"
|
|
1804
|
+
- --enable-shared
|
|
1805
|
+
- --enable-optimizations
|
|
1806
|
+
- --enable-profiling ?
|
|
1807
|
+
- --enable-ipv6 ?
|
|
1808
|
+
""" # noqa
|
|
1802
1809
|
|
|
1803
1810
|
|
|
1804
1811
|
##
|
omdev/scripts/pyproject.py
CHANGED
|
@@ -12,7 +12,7 @@ TODO:
|
|
|
12
12
|
- {pkg_name: [src_dirs]}, default excludes, generate MANIFST.in, ...
|
|
13
13
|
- env vars - PYTHONPATH
|
|
14
14
|
|
|
15
|
-
|
|
15
|
+
See:
|
|
16
16
|
- https://pdm-project.org/en/latest/
|
|
17
17
|
- https://rye.astral.sh/philosophy/
|
|
18
18
|
- https://github.com/indygreg/python-build-standalone/blob/main/pythonbuild/cpython.py
|
|
@@ -4235,7 +4235,14 @@ TODO:
|
|
|
4235
4235
|
- custom tags
|
|
4236
4236
|
- optionally install / upgrade pyenv itself
|
|
4237
4237
|
- new vers dont need these custom mac opts, only run on old vers
|
|
4238
|
-
|
|
4238
|
+
|
|
4239
|
+
TODO opts:
|
|
4240
|
+
- --enable-loadable-sqlite-extensions LDFLAGS="-L/opt/homebrew/opt/sqlite/lib" CPPFLAGS="-I/opt/homebrew/opt/sqlite/include"
|
|
4241
|
+
- --enable-shared
|
|
4242
|
+
- --enable-optimizations
|
|
4243
|
+
- --enable-profiling ?
|
|
4244
|
+
- --enable-ipv6 ?
|
|
4245
|
+
""" # noqa
|
|
4239
4246
|
|
|
4240
4247
|
|
|
4241
4248
|
##
|
omdev/secrets.py
ADDED
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import os.path
|
|
2
|
+
import typing as ta
|
|
3
|
+
|
|
4
|
+
import yaml
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
SECRETS_PATH = os.getenv('SECRETS_PATH', os.path.expanduser('~/Dropbox/.dotfiles/secrets.yml'))
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
def load_secrets() -> dict[str, ta.Any]:
|
|
11
|
+
with open(SECRETS_PATH) as f:
|
|
12
|
+
return yaml.safe_load(f)
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: omdev
|
|
3
|
-
Version: 0.0.0.
|
|
3
|
+
Version: 0.0.0.dev31
|
|
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.
|
|
15
|
+
Requires-Dist: omlish ==0.0.0.dev31
|
|
16
16
|
Provides-Extra: all
|
|
17
17
|
Requires-Dist: pycparser ~=2.22 ; extra == 'all'
|
|
18
18
|
Requires-Dist: cffi ~=1.17 ; extra == 'all'
|
|
@@ -7,8 +7,9 @@ omdev/cmake.py,sha256=Diy2ry65806dQP125DAstD3w46z_wszMH7PwC2-6iik,4578
|
|
|
7
7
|
omdev/findimports.py,sha256=P8v4I1tm6g-PEWJiNwAKxErvWwL-Nop83vAuwq1kR5A,2246
|
|
8
8
|
omdev/findmagic.py,sha256=DhBYHHP_dzwM5pIh21xnQPnkZ2YmAXCjithsr7X0ScU,2357
|
|
9
9
|
omdev/git.py,sha256=OzP4xHVboaa7GhS-mg4F3lYWf3HLa5aMm6V6PtIw_3U,2137
|
|
10
|
-
omdev/manifests.py,sha256=
|
|
10
|
+
omdev/manifests.py,sha256=bn8FzgYvC7L70mRXvu8TSc41eGp-BSVzuRvGuYj3FC8,9225
|
|
11
11
|
omdev/revisions.py,sha256=U657hf4zeEN32y3g4CzqCAodx_HlfkHj2cIIKALNFDo,5009
|
|
12
|
+
omdev/secrets.py,sha256=ja0VsCB01MHxYwn5OHjFeXV9cRah9AQl-0uJzZELpic,256
|
|
12
13
|
omdev/tokens.py,sha256=GusxQ1Cd_eiScuR8XTTtc9QFhOgYviYGBZmFnn3Hj7s,756
|
|
13
14
|
omdev/wheelfile.py,sha256=yfupGcGkbFlmzGzKU64k_vmOKpaKnUlDWxeGn2KdekU,10005
|
|
14
15
|
omdev/amalg/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
@@ -58,7 +59,7 @@ omdev/interp/__main__.py,sha256=gFhR9DikwDZk0LqgdR3qq_aXQHThUOPllDmHDOfnFAU,67
|
|
|
58
59
|
omdev/interp/cli.py,sha256=8T3qLXTC2mni5FXDHkHN3mZG9_BnjkDMXYy6EYbAYR8,1679
|
|
59
60
|
omdev/interp/inspect.py,sha256=SI4jQmWfXCnlceFTxlVRfTlEYYCjO_X12wuG5e74yto,2849
|
|
60
61
|
omdev/interp/providers.py,sha256=PFEjozW0c33eqg8sno-GHMKbhVUzQF9jrAx-M0uQimk,1787
|
|
61
|
-
omdev/interp/pyenv.py,sha256=
|
|
62
|
+
omdev/interp/pyenv.py,sha256=s7nY2c6g3dOzvEefB_lgDjs6XSJ_u1ClCXQlWnCk6oM,12688
|
|
62
63
|
omdev/interp/resolvers.py,sha256=tpzlmqGp1C4QKdA6TfcPmtmaygu7mb6WK2RPSbyNQ6s,3022
|
|
63
64
|
omdev/interp/standalone.py,sha256=XcltiL7ypcfV89C82_3knQ3Kx7aW4wnnxf2056ZXC3A,7731
|
|
64
65
|
omdev/interp/system.py,sha256=UFHfMR0CHCEnNx5fhrze8esAwigpRrJUA33ftq6nA0I,3514
|
|
@@ -75,15 +76,15 @@ omdev/precheck/scripts.py,sha256=qq6MXkxgrYngPg5pWnXH4uRSuRkP3mFqbeml1UmvGBc,126
|
|
|
75
76
|
omdev/pyproject/__init__.py,sha256=Y3l4WY4JRi2uLG6kgbGp93fuGfkxkKwZDvhsa0Rwgtk,15
|
|
76
77
|
omdev/pyproject/__main__.py,sha256=gFhR9DikwDZk0LqgdR3qq_aXQHThUOPllDmHDOfnFAU,67
|
|
77
78
|
omdev/pyproject/cexts.py,sha256=x13piOOnNrYbA17qZLDVuR0p1sqhgEwpk4FtImX-klM,4281
|
|
78
|
-
omdev/pyproject/cli.py,sha256=
|
|
79
|
+
omdev/pyproject/cli.py,sha256=gRUsTcVQDx9u6hZNOGAHG-4pccF6tS3I1fHBzgS1Tb0,10908
|
|
79
80
|
omdev/pyproject/configs.py,sha256=K9H5cGwVLgHi8wKwtYvlXHZ9ThtmnI4jo8JAb-t1-70,2859
|
|
80
81
|
omdev/pyproject/pkg.py,sha256=GlZvDcLbo7HmiV2SgQnJdgAswr9IoJpy5gOeTRXG2RM,12576
|
|
81
82
|
omdev/pyproject/reqs.py,sha256=coq21cdWQIPs06-iuRnwc6F2Sf-IxpqoT6DEMhol2kA,2298
|
|
82
83
|
omdev/scripts/__init__.py,sha256=MKCvUAEQwsIvwLixwtPlpBqmkMXLCnjjXyAXvVpDwVk,91
|
|
83
84
|
omdev/scripts/bumpversion.py,sha256=Kn7fo73Hs8uJh3Hi3EIyLOlzLPWAC6dwuD_lZ3cIzuY,1064
|
|
84
85
|
omdev/scripts/execrss.py,sha256=HzDNmwXOO8fMwIRXw9q8CUnVfLFCQASyU2tfY_y2Vf8,324
|
|
85
|
-
omdev/scripts/interp.py,sha256=
|
|
86
|
-
omdev/scripts/pyproject.py,sha256=
|
|
86
|
+
omdev/scripts/interp.py,sha256=f_BDB7gQTnGMQk-kzUHcBbtl1RGpFIqQskOCODHir50,69488
|
|
87
|
+
omdev/scripts/pyproject.py,sha256=zL2MPdN1tyEBXzZc6rmB86cTdAZUCtmB9ICtaMGIxj4,153598
|
|
87
88
|
omdev/toml/__init__.py,sha256=Y3l4WY4JRi2uLG6kgbGp93fuGfkxkKwZDvhsa0Rwgtk,15
|
|
88
89
|
omdev/toml/parser.py,sha256=84bn09uhYHwQGyfww6Rw6y1RxPAE_HDltODOSakcqDM,29186
|
|
89
90
|
omdev/toml/writer.py,sha256=dwz_Qw8z5Z_nmWpXqch63W6S_j6n256erb7AGFTVzB4,2872
|
|
@@ -98,8 +99,8 @@ omdev/tools/sqlrepl.py,sha256=v9uVQ4nvquSXcQVYIFq34ikumSILvKqzD6lUKLcncCE,5646
|
|
|
98
99
|
omdev/versioning/__init__.py,sha256=Y3l4WY4JRi2uLG6kgbGp93fuGfkxkKwZDvhsa0Rwgtk,15
|
|
99
100
|
omdev/versioning/specifiers.py,sha256=6Odf9e6farwlPRsD_YqwTfYKG-BXn_dIcKtqfkhfodI,17432
|
|
100
101
|
omdev/versioning/versions.py,sha256=ei2eopEsJq3zSMJmezK1nzZgikgCdxFtnF3f69nCRZQ,12246
|
|
101
|
-
omdev-0.0.0.
|
|
102
|
-
omdev-0.0.0.
|
|
103
|
-
omdev-0.0.0.
|
|
104
|
-
omdev-0.0.0.
|
|
105
|
-
omdev-0.0.0.
|
|
102
|
+
omdev-0.0.0.dev31.dist-info/LICENSE,sha256=B_hVtavaA8zCYDW99DYdcpDLKz1n3BBRjZrcbv8uG8c,1451
|
|
103
|
+
omdev-0.0.0.dev31.dist-info/METADATA,sha256=PPt5cs_yozGg6dBtCj2mS1oviINmxzj1NVOmhIxa0Vg,1252
|
|
104
|
+
omdev-0.0.0.dev31.dist-info/WHEEL,sha256=GV9aMThwP_4oNCtvEC2ec3qUYutgWeAzklro_0m4WJQ,91
|
|
105
|
+
omdev-0.0.0.dev31.dist-info/top_level.txt,sha256=1nr7j30fEWgLYHW3lGR9pkdHkb7knv1U1ES1XRNVQ6k,6
|
|
106
|
+
omdev-0.0.0.dev31.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|