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 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
- !!! manifests! get-manifest, .manifest.json
3
- - dumb dicts, root keys are 'types'
4
- - get put in _manifest.py, root level dict or smth
5
- - IMPORT files w comment
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
- manifest_json = json.dumps(manifest)
69
- rt_manifest = json.loads(manifest_json)
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
- if rt_manifest != manifest:
72
- raise Exception(f'Manifest failed to roundtrip: {manifest} != {rt_manifest}')
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
- out[attr] = rt_manifest
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 _gen_cmd(args) -> None:
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
- lookit:
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
  ##
@@ -12,7 +12,7 @@ TODO:
12
12
  - {pkg_name: [src_dirs]}, default excludes, generate MANIFST.in, ...
13
13
  - env vars - PYTHONPATH
14
14
 
15
- lookit:
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.dev30
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.dev30
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=jGqG3u8AQwaGUga449SA1-HwfWyEbrj2MCHQP5jqpO4,6580
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=whNOnNnt01rRL6pe3Ew-o84_V84bBTG6mR-wro0Vh3Q,12454
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=UKheeQ8E1vZpR2My3ykelDxD_Mcu3O0zA1HqkkAH0cs,10911
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=cJ1iprqgMZONNTJeXQ3gvyp7-UQqKiRstdRw-jR3xFI,69254
86
- omdev/scripts/pyproject.py,sha256=01U-hNp4NTU-OnNOYE8UK_2T_1Ai3-fbyOvOdCbzdsw,153367
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.dev30.dist-info/LICENSE,sha256=B_hVtavaA8zCYDW99DYdcpDLKz1n3BBRjZrcbv8uG8c,1451
102
- omdev-0.0.0.dev30.dist-info/METADATA,sha256=D_vc3bQN6-PBXjlDMj_rVGwp8a_XeyCDGtcJVLihokw,1252
103
- omdev-0.0.0.dev30.dist-info/WHEEL,sha256=GV9aMThwP_4oNCtvEC2ec3qUYutgWeAzklro_0m4WJQ,91
104
- omdev-0.0.0.dev30.dist-info/top_level.txt,sha256=1nr7j30fEWgLYHW3lGR9pkdHkb7knv1U1ES1XRNVQ6k,6
105
- omdev-0.0.0.dev30.dist-info/RECORD,,
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,,