ominfra 0.0.0.dev440__tar.gz → 0.0.0.dev442__tar.gz
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 ominfra might be problematic. Click here for more details.
- {ominfra-0.0.0.dev440/ominfra.egg-info → ominfra-0.0.0.dev442}/PKG-INFO +3 -3
- ominfra-0.0.0.dev442/ominfra/clouds/aws/instancetypes/cache.json.gz +0 -0
- {ominfra-0.0.0.dev440 → ominfra-0.0.0.dev442}/ominfra/clouds/aws/models/services/ec2.py +2 -0
- {ominfra-0.0.0.dev440 → ominfra-0.0.0.dev442}/ominfra/scripts/journald2aws.py +147 -21
- {ominfra-0.0.0.dev440 → ominfra-0.0.0.dev442}/ominfra/scripts/manage.py +147 -23
- {ominfra-0.0.0.dev440 → ominfra-0.0.0.dev442}/ominfra/scripts/supervisor.py +232 -71
- {ominfra-0.0.0.dev440 → ominfra-0.0.0.dev442/ominfra.egg-info}/PKG-INFO +3 -3
- {ominfra-0.0.0.dev440 → ominfra-0.0.0.dev442}/ominfra.egg-info/requires.txt +2 -2
- {ominfra-0.0.0.dev440 → ominfra-0.0.0.dev442}/pyproject.toml +3 -3
- ominfra-0.0.0.dev440/ominfra/clouds/aws/instancetypes/cache.json.gz +0 -0
- {ominfra-0.0.0.dev440 → ominfra-0.0.0.dev442}/LICENSE +0 -0
- {ominfra-0.0.0.dev440 → ominfra-0.0.0.dev442}/MANIFEST.in +0 -0
- {ominfra-0.0.0.dev440 → ominfra-0.0.0.dev442}/README.md +0 -0
- {ominfra-0.0.0.dev440 → ominfra-0.0.0.dev442}/ominfra/.omlish-manifests.json +0 -0
- {ominfra-0.0.0.dev440 → ominfra-0.0.0.dev442}/ominfra/__about__.py +0 -0
- {ominfra-0.0.0.dev440 → ominfra-0.0.0.dev442}/ominfra/__init__.py +0 -0
- {ominfra-0.0.0.dev440 → ominfra-0.0.0.dev442}/ominfra/clouds/__init__.py +0 -0
- {ominfra-0.0.0.dev440 → ominfra-0.0.0.dev442}/ominfra/clouds/aws/__init__.py +0 -0
- {ominfra-0.0.0.dev440 → ominfra-0.0.0.dev442}/ominfra/clouds/aws/__main__.py +0 -0
- {ominfra-0.0.0.dev440 → ominfra-0.0.0.dev442}/ominfra/clouds/aws/auth.py +0 -0
- {ominfra-0.0.0.dev440 → ominfra-0.0.0.dev442}/ominfra/clouds/aws/cli.py +0 -0
- {ominfra-0.0.0.dev440 → ominfra-0.0.0.dev442}/ominfra/clouds/aws/dataclasses.py +0 -0
- {ominfra-0.0.0.dev440 → ominfra-0.0.0.dev442}/ominfra/clouds/aws/instancetypes/__init__.py +0 -0
- {ominfra-0.0.0.dev440 → ominfra-0.0.0.dev442}/ominfra/clouds/aws/instancetypes/__main__.py +0 -0
- {ominfra-0.0.0.dev440 → ominfra-0.0.0.dev442}/ominfra/clouds/aws/instancetypes/cache.py +0 -0
- {ominfra-0.0.0.dev440 → ominfra-0.0.0.dev442}/ominfra/clouds/aws/instancetypes/cli.py +0 -0
- {ominfra-0.0.0.dev440 → ominfra-0.0.0.dev442}/ominfra/clouds/aws/journald2aws/__init__.py +0 -0
- {ominfra-0.0.0.dev440 → ominfra-0.0.0.dev442}/ominfra/clouds/aws/journald2aws/__main__.py +0 -0
- {ominfra-0.0.0.dev440 → ominfra-0.0.0.dev442}/ominfra/clouds/aws/journald2aws/cursor.py +0 -0
- {ominfra-0.0.0.dev440 → ominfra-0.0.0.dev442}/ominfra/clouds/aws/journald2aws/driver.py +0 -0
- {ominfra-0.0.0.dev440 → ominfra-0.0.0.dev442}/ominfra/clouds/aws/journald2aws/main.py +0 -0
- {ominfra-0.0.0.dev440 → ominfra-0.0.0.dev442}/ominfra/clouds/aws/journald2aws/poster.py +0 -0
- {ominfra-0.0.0.dev440 → ominfra-0.0.0.dev442}/ominfra/clouds/aws/logs.py +0 -0
- {ominfra-0.0.0.dev440 → ominfra-0.0.0.dev442}/ominfra/clouds/aws/metadata.py +0 -0
- {ominfra-0.0.0.dev440 → ominfra-0.0.0.dev442}/ominfra/clouds/aws/models/__init__.py +0 -0
- {ominfra-0.0.0.dev440 → ominfra-0.0.0.dev442}/ominfra/clouds/aws/models/base.py +0 -0
- {ominfra-0.0.0.dev440 → ominfra-0.0.0.dev442}/ominfra/clouds/aws/models/gen/__init__.py +0 -0
- {ominfra-0.0.0.dev440 → ominfra-0.0.0.dev442}/ominfra/clouds/aws/models/gen/__main__.py +0 -0
- {ominfra-0.0.0.dev440 → ominfra-0.0.0.dev442}/ominfra/clouds/aws/models/gen/cli.py +0 -0
- {ominfra-0.0.0.dev440 → ominfra-0.0.0.dev442}/ominfra/clouds/aws/models/gen/gen.py +0 -0
- {ominfra-0.0.0.dev440 → ominfra-0.0.0.dev442}/ominfra/clouds/aws/models/services/__init__.py +0 -0
- {ominfra-0.0.0.dev440 → ominfra-0.0.0.dev442}/ominfra/clouds/aws/models/services/lambda_.py +0 -0
- {ominfra-0.0.0.dev440 → ominfra-0.0.0.dev442}/ominfra/clouds/aws/models/services/rds.py +0 -0
- {ominfra-0.0.0.dev440 → ominfra-0.0.0.dev442}/ominfra/clouds/aws/models/services/s3.py +0 -0
- {ominfra-0.0.0.dev440 → ominfra-0.0.0.dev442}/ominfra/clouds/aws/models/services/services.toml +0 -0
- {ominfra-0.0.0.dev440 → ominfra-0.0.0.dev442}/ominfra/clouds/gcp/__init__.py +0 -0
- {ominfra-0.0.0.dev440 → ominfra-0.0.0.dev442}/ominfra/clouds/gcp/api.py +0 -0
- {ominfra-0.0.0.dev440 → ominfra-0.0.0.dev442}/ominfra/clouds/gcp/auth.py +0 -0
- {ominfra-0.0.0.dev440 → ominfra-0.0.0.dev442}/ominfra/commands/__init__.py +0 -0
- {ominfra-0.0.0.dev440 → ominfra-0.0.0.dev442}/ominfra/commands/runners.py +0 -0
- {ominfra-0.0.0.dev440 → ominfra-0.0.0.dev442}/ominfra/commands/ssh.py +0 -0
- {ominfra-0.0.0.dev440 → ominfra-0.0.0.dev442}/ominfra/journald/__init__.py +0 -0
- {ominfra-0.0.0.dev440 → ominfra-0.0.0.dev442}/ominfra/journald/fields.py +0 -0
- {ominfra-0.0.0.dev440 → ominfra-0.0.0.dev442}/ominfra/journald/genmessages.py +0 -0
- {ominfra-0.0.0.dev440 → ominfra-0.0.0.dev442}/ominfra/journald/messages.py +0 -0
- {ominfra-0.0.0.dev440 → ominfra-0.0.0.dev442}/ominfra/journald/tailer.py +0 -0
- {ominfra-0.0.0.dev440 → ominfra-0.0.0.dev442}/ominfra/manage/__init__.py +0 -0
- {ominfra-0.0.0.dev440 → ominfra-0.0.0.dev442}/ominfra/manage/__main__.py +0 -0
- {ominfra-0.0.0.dev440 → ominfra-0.0.0.dev442}/ominfra/manage/bootstrap.py +0 -0
- {ominfra-0.0.0.dev440 → ominfra-0.0.0.dev442}/ominfra/manage/bootstrap_.py +0 -0
- {ominfra-0.0.0.dev440 → ominfra-0.0.0.dev442}/ominfra/manage/commands/__init__.py +0 -0
- {ominfra-0.0.0.dev440 → ominfra-0.0.0.dev442}/ominfra/manage/commands/base.py +0 -0
- {ominfra-0.0.0.dev440 → ominfra-0.0.0.dev442}/ominfra/manage/commands/inject.py +0 -0
- {ominfra-0.0.0.dev440 → ominfra-0.0.0.dev442}/ominfra/manage/commands/injection.py +0 -0
- {ominfra-0.0.0.dev440 → ominfra-0.0.0.dev442}/ominfra/manage/commands/local.py +0 -0
- {ominfra-0.0.0.dev440 → ominfra-0.0.0.dev442}/ominfra/manage/commands/marshal.py +0 -0
- {ominfra-0.0.0.dev440 → ominfra-0.0.0.dev442}/ominfra/manage/commands/ping.py +0 -0
- {ominfra-0.0.0.dev440 → ominfra-0.0.0.dev442}/ominfra/manage/commands/subprocess.py +0 -0
- {ominfra-0.0.0.dev440 → ominfra-0.0.0.dev442}/ominfra/manage/commands/types.py +0 -0
- {ominfra-0.0.0.dev440 → ominfra-0.0.0.dev442}/ominfra/manage/config.py +0 -0
- {ominfra-0.0.0.dev440 → ominfra-0.0.0.dev442}/ominfra/manage/deploy/__init__.py +0 -0
- {ominfra-0.0.0.dev440 → ominfra-0.0.0.dev442}/ominfra/manage/deploy/apps.py +0 -0
- {ominfra-0.0.0.dev440 → ominfra-0.0.0.dev442}/ominfra/manage/deploy/commands.py +0 -0
- {ominfra-0.0.0.dev440 → ominfra-0.0.0.dev442}/ominfra/manage/deploy/conf/__init__.py +0 -0
- {ominfra-0.0.0.dev440 → ominfra-0.0.0.dev442}/ominfra/manage/deploy/conf/inject.py +0 -0
- {ominfra-0.0.0.dev440 → ominfra-0.0.0.dev442}/ominfra/manage/deploy/conf/manager.py +0 -0
- {ominfra-0.0.0.dev440 → ominfra-0.0.0.dev442}/ominfra/manage/deploy/conf/specs.py +0 -0
- {ominfra-0.0.0.dev440 → ominfra-0.0.0.dev442}/ominfra/manage/deploy/config.py +0 -0
- {ominfra-0.0.0.dev440 → ominfra-0.0.0.dev442}/ominfra/manage/deploy/deploy.py +0 -0
- {ominfra-0.0.0.dev440 → ominfra-0.0.0.dev442}/ominfra/manage/deploy/git.py +0 -0
- {ominfra-0.0.0.dev440 → ominfra-0.0.0.dev442}/ominfra/manage/deploy/inject.py +0 -0
- {ominfra-0.0.0.dev440 → ominfra-0.0.0.dev442}/ominfra/manage/deploy/injection.py +0 -0
- {ominfra-0.0.0.dev440 → ominfra-0.0.0.dev442}/ominfra/manage/deploy/interp.py +0 -0
- {ominfra-0.0.0.dev440 → ominfra-0.0.0.dev442}/ominfra/manage/deploy/nginx.py +0 -0
- {ominfra-0.0.0.dev440 → ominfra-0.0.0.dev442}/ominfra/manage/deploy/paths/__init__.py +0 -0
- {ominfra-0.0.0.dev440 → ominfra-0.0.0.dev442}/ominfra/manage/deploy/paths/inject.py +0 -0
- {ominfra-0.0.0.dev440 → ominfra-0.0.0.dev442}/ominfra/manage/deploy/paths/manager.py +0 -0
- {ominfra-0.0.0.dev440 → ominfra-0.0.0.dev442}/ominfra/manage/deploy/paths/owners.py +0 -0
- {ominfra-0.0.0.dev440 → ominfra-0.0.0.dev442}/ominfra/manage/deploy/paths/paths.py +0 -0
- {ominfra-0.0.0.dev440 → ominfra-0.0.0.dev442}/ominfra/manage/deploy/paths/specs.py +0 -0
- {ominfra-0.0.0.dev440 → ominfra-0.0.0.dev442}/ominfra/manage/deploy/paths/types.py +0 -0
- {ominfra-0.0.0.dev440 → ominfra-0.0.0.dev442}/ominfra/manage/deploy/specs.py +0 -0
- {ominfra-0.0.0.dev440 → ominfra-0.0.0.dev442}/ominfra/manage/deploy/systemd.py +0 -0
- {ominfra-0.0.0.dev440 → ominfra-0.0.0.dev442}/ominfra/manage/deploy/tags.py +0 -0
- {ominfra-0.0.0.dev440 → ominfra-0.0.0.dev442}/ominfra/manage/deploy/tmp.py +0 -0
- {ominfra-0.0.0.dev440 → ominfra-0.0.0.dev442}/ominfra/manage/deploy/types.py +0 -0
- {ominfra-0.0.0.dev440 → ominfra-0.0.0.dev442}/ominfra/manage/deploy/venvs.py +0 -0
- {ominfra-0.0.0.dev440 → ominfra-0.0.0.dev442}/ominfra/manage/inject.py +0 -0
- {ominfra-0.0.0.dev440 → ominfra-0.0.0.dev442}/ominfra/manage/main.py +0 -0
- {ominfra-0.0.0.dev440 → ominfra-0.0.0.dev442}/ominfra/manage/marshal.py +0 -0
- {ominfra-0.0.0.dev440 → ominfra-0.0.0.dev442}/ominfra/manage/remote/__init__.py +0 -0
- {ominfra-0.0.0.dev440 → ominfra-0.0.0.dev442}/ominfra/manage/remote/_main.py +0 -0
- {ominfra-0.0.0.dev440 → ominfra-0.0.0.dev442}/ominfra/manage/remote/channel.py +0 -0
- {ominfra-0.0.0.dev440 → ominfra-0.0.0.dev442}/ominfra/manage/remote/config.py +0 -0
- {ominfra-0.0.0.dev440 → ominfra-0.0.0.dev442}/ominfra/manage/remote/connection.py +0 -0
- {ominfra-0.0.0.dev440 → ominfra-0.0.0.dev442}/ominfra/manage/remote/execution.py +0 -0
- {ominfra-0.0.0.dev440 → ominfra-0.0.0.dev442}/ominfra/manage/remote/inject.py +0 -0
- {ominfra-0.0.0.dev440 → ominfra-0.0.0.dev442}/ominfra/manage/remote/payload.py +0 -0
- {ominfra-0.0.0.dev440 → ominfra-0.0.0.dev442}/ominfra/manage/remote/spawning.py +0 -0
- {ominfra-0.0.0.dev440 → ominfra-0.0.0.dev442}/ominfra/manage/system/__init__.py +0 -0
- {ominfra-0.0.0.dev440 → ominfra-0.0.0.dev442}/ominfra/manage/system/commands.py +0 -0
- {ominfra-0.0.0.dev440 → ominfra-0.0.0.dev442}/ominfra/manage/system/config.py +0 -0
- {ominfra-0.0.0.dev440 → ominfra-0.0.0.dev442}/ominfra/manage/system/inject.py +0 -0
- {ominfra-0.0.0.dev440 → ominfra-0.0.0.dev442}/ominfra/manage/system/packages.py +0 -0
- {ominfra-0.0.0.dev440 → ominfra-0.0.0.dev442}/ominfra/manage/system/platforms.py +0 -0
- {ominfra-0.0.0.dev440 → ominfra-0.0.0.dev442}/ominfra/manage/targets/__init__.py +0 -0
- {ominfra-0.0.0.dev440 → ominfra-0.0.0.dev442}/ominfra/manage/targets/bestpython.py +0 -0
- {ominfra-0.0.0.dev440 → ominfra-0.0.0.dev442}/ominfra/manage/targets/bestpython.sh +0 -0
- {ominfra-0.0.0.dev440 → ominfra-0.0.0.dev442}/ominfra/manage/targets/connection.py +0 -0
- {ominfra-0.0.0.dev440 → ominfra-0.0.0.dev442}/ominfra/manage/targets/inject.py +0 -0
- {ominfra-0.0.0.dev440 → ominfra-0.0.0.dev442}/ominfra/manage/targets/targets.py +0 -0
- {ominfra-0.0.0.dev440 → ominfra-0.0.0.dev442}/ominfra/pyremote.py +0 -0
- {ominfra-0.0.0.dev440 → ominfra-0.0.0.dev442}/ominfra/scripts/__init__.py +0 -0
- {ominfra-0.0.0.dev440 → ominfra-0.0.0.dev442}/ominfra/supervisor/LICENSE.txt +0 -0
- {ominfra-0.0.0.dev440 → ominfra-0.0.0.dev442}/ominfra/supervisor/__init__.py +0 -0
- {ominfra-0.0.0.dev440 → ominfra-0.0.0.dev442}/ominfra/supervisor/__main__.py +0 -0
- {ominfra-0.0.0.dev440 → ominfra-0.0.0.dev442}/ominfra/supervisor/configs.py +0 -0
- {ominfra-0.0.0.dev440 → ominfra-0.0.0.dev442}/ominfra/supervisor/dispatchers.py +0 -0
- {ominfra-0.0.0.dev440 → ominfra-0.0.0.dev442}/ominfra/supervisor/dispatchersimpl.py +0 -0
- {ominfra-0.0.0.dev440 → ominfra-0.0.0.dev442}/ominfra/supervisor/errors.py +0 -0
- {ominfra-0.0.0.dev440 → ominfra-0.0.0.dev442}/ominfra/supervisor/events.py +0 -0
- {ominfra-0.0.0.dev440 → ominfra-0.0.0.dev442}/ominfra/supervisor/groups.py +0 -0
- {ominfra-0.0.0.dev440 → ominfra-0.0.0.dev442}/ominfra/supervisor/groupsimpl.py +0 -0
- {ominfra-0.0.0.dev440 → ominfra-0.0.0.dev442}/ominfra/supervisor/http.py +0 -0
- {ominfra-0.0.0.dev440 → ominfra-0.0.0.dev442}/ominfra/supervisor/inject.py +0 -0
- {ominfra-0.0.0.dev440 → ominfra-0.0.0.dev442}/ominfra/supervisor/io.py +0 -0
- {ominfra-0.0.0.dev440 → ominfra-0.0.0.dev442}/ominfra/supervisor/main.py +0 -0
- {ominfra-0.0.0.dev440 → ominfra-0.0.0.dev442}/ominfra/supervisor/pipes.py +0 -0
- {ominfra-0.0.0.dev440 → ominfra-0.0.0.dev442}/ominfra/supervisor/privileges.py +0 -0
- {ominfra-0.0.0.dev440 → ominfra-0.0.0.dev442}/ominfra/supervisor/process.py +0 -0
- {ominfra-0.0.0.dev440 → ominfra-0.0.0.dev442}/ominfra/supervisor/processimpl.py +0 -0
- {ominfra-0.0.0.dev440 → ominfra-0.0.0.dev442}/ominfra/supervisor/setup.py +0 -0
- {ominfra-0.0.0.dev440 → ominfra-0.0.0.dev442}/ominfra/supervisor/setupimpl.py +0 -0
- {ominfra-0.0.0.dev440 → ominfra-0.0.0.dev442}/ominfra/supervisor/signals.py +0 -0
- {ominfra-0.0.0.dev440 → ominfra-0.0.0.dev442}/ominfra/supervisor/spawning.py +0 -0
- {ominfra-0.0.0.dev440 → ominfra-0.0.0.dev442}/ominfra/supervisor/spawningimpl.py +0 -0
- {ominfra-0.0.0.dev440 → ominfra-0.0.0.dev442}/ominfra/supervisor/states.py +0 -0
- {ominfra-0.0.0.dev440 → ominfra-0.0.0.dev442}/ominfra/supervisor/supervisor.py +0 -0
- {ominfra-0.0.0.dev440 → ominfra-0.0.0.dev442}/ominfra/supervisor/types.py +0 -0
- {ominfra-0.0.0.dev440 → ominfra-0.0.0.dev442}/ominfra/supervisor/utils/__init__.py +0 -0
- {ominfra-0.0.0.dev440 → ominfra-0.0.0.dev442}/ominfra/supervisor/utils/collections.py +0 -0
- {ominfra-0.0.0.dev440 → ominfra-0.0.0.dev442}/ominfra/supervisor/utils/diag.py +0 -0
- {ominfra-0.0.0.dev440 → ominfra-0.0.0.dev442}/ominfra/supervisor/utils/fds.py +0 -0
- {ominfra-0.0.0.dev440 → ominfra-0.0.0.dev442}/ominfra/supervisor/utils/fs.py +0 -0
- {ominfra-0.0.0.dev440 → ominfra-0.0.0.dev442}/ominfra/supervisor/utils/os.py +0 -0
- {ominfra-0.0.0.dev440 → ominfra-0.0.0.dev442}/ominfra/supervisor/utils/ostypes.py +0 -0
- {ominfra-0.0.0.dev440 → ominfra-0.0.0.dev442}/ominfra/supervisor/utils/signals.py +0 -0
- {ominfra-0.0.0.dev440 → ominfra-0.0.0.dev442}/ominfra/supervisor/utils/strings.py +0 -0
- {ominfra-0.0.0.dev440 → ominfra-0.0.0.dev442}/ominfra/supervisor/utils/users.py +0 -0
- {ominfra-0.0.0.dev440 → ominfra-0.0.0.dev442}/ominfra/systemd.py +0 -0
- {ominfra-0.0.0.dev440 → ominfra-0.0.0.dev442}/ominfra/tailscale/__init__.py +0 -0
- {ominfra-0.0.0.dev440 → ominfra-0.0.0.dev442}/ominfra/tailscale/api.py +0 -0
- {ominfra-0.0.0.dev440 → ominfra-0.0.0.dev442}/ominfra/tailscale/cli.py +0 -0
- {ominfra-0.0.0.dev440 → ominfra-0.0.0.dev442}/ominfra/threadworkers.py +0 -0
- {ominfra-0.0.0.dev440 → ominfra-0.0.0.dev442}/ominfra/tools/__init__.py +0 -0
- {ominfra-0.0.0.dev440 → ominfra-0.0.0.dev442}/ominfra/tools/listresources.py +0 -0
- {ominfra-0.0.0.dev440 → ominfra-0.0.0.dev442}/ominfra.egg-info/SOURCES.txt +0 -0
- {ominfra-0.0.0.dev440 → ominfra-0.0.0.dev442}/ominfra.egg-info/dependency_links.txt +0 -0
- {ominfra-0.0.0.dev440 → ominfra-0.0.0.dev442}/ominfra.egg-info/entry_points.txt +0 -0
- {ominfra-0.0.0.dev440 → ominfra-0.0.0.dev442}/ominfra.egg-info/top_level.txt +0 -0
- {ominfra-0.0.0.dev440 → ominfra-0.0.0.dev442}/setup.cfg +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: ominfra
|
|
3
|
-
Version: 0.0.0.
|
|
3
|
+
Version: 0.0.0.dev442
|
|
4
4
|
Summary: ominfra
|
|
5
5
|
Author: wrmsr
|
|
6
6
|
License-Expression: BSD-3-Clause
|
|
@@ -14,8 +14,8 @@ 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: omdev==0.0.0.
|
|
18
|
-
Requires-Dist: omlish==0.0.0.
|
|
17
|
+
Requires-Dist: omdev==0.0.0.dev442
|
|
18
|
+
Requires-Dist: omlish==0.0.0.dev442
|
|
19
19
|
Provides-Extra: all
|
|
20
20
|
Requires-Dist: paramiko~=4.0; extra == "all"
|
|
21
21
|
Requires-Dist: asyncssh~=2.21; extra == "all"
|
|
Binary file
|
|
@@ -1359,6 +1359,8 @@ class InstanceType(_enum.Enum):
|
|
|
1359
1359
|
I8GE_48XLARGE = 'i8ge.48xlarge'
|
|
1360
1360
|
I8GE_METAL_24XL = 'i8ge.metal-24xl'
|
|
1361
1361
|
I8GE_METAL_48XL = 'i8ge.metal-48xl'
|
|
1362
|
+
MAC_M4_METAL = 'mac-m4.metal'
|
|
1363
|
+
MAC_M4PRO_METAL = 'mac-m4pro.metal'
|
|
1362
1364
|
|
|
1363
1365
|
|
|
1364
1366
|
class InstanceTypeHypervisor(_enum.Enum):
|
|
@@ -1345,6 +1345,8 @@ class AttrOps(ta.Generic[T]):
|
|
|
1345
1345
|
display: ta.Optional[str] = None,
|
|
1346
1346
|
|
|
1347
1347
|
repr: bool = True, # noqa
|
|
1348
|
+
repr_fn: ta.Optional[ta.Callable[[ta.Any], ta.Optional[str]]] = None,
|
|
1349
|
+
|
|
1348
1350
|
hash: bool = True, # noqa
|
|
1349
1351
|
eq: bool = True,
|
|
1350
1352
|
) -> None:
|
|
@@ -1359,6 +1361,8 @@ class AttrOps(ta.Generic[T]):
|
|
|
1359
1361
|
self._display = display
|
|
1360
1362
|
|
|
1361
1363
|
self._repr = repr
|
|
1364
|
+
self._repr_fn = repr_fn
|
|
1365
|
+
|
|
1362
1366
|
self._hash = hash
|
|
1363
1367
|
self._eq = eq
|
|
1364
1368
|
|
|
@@ -1366,10 +1370,10 @@ class AttrOps(ta.Generic[T]):
|
|
|
1366
1370
|
def of(
|
|
1367
1371
|
cls,
|
|
1368
1372
|
o: ta.Union[
|
|
1373
|
+
'AttrOps.Attr',
|
|
1369
1374
|
str,
|
|
1370
|
-
ta.Tuple[str, str],
|
|
1375
|
+
ta.Tuple[str, ta.Union[str, ta.Mapping[str, ta.Any]]],
|
|
1371
1376
|
ta.Mapping[str, ta.Any],
|
|
1372
|
-
'AttrOps.Attr',
|
|
1373
1377
|
],
|
|
1374
1378
|
) -> 'AttrOps.Attr':
|
|
1375
1379
|
if isinstance(o, AttrOps.Attr):
|
|
@@ -1377,11 +1381,15 @@ class AttrOps(ta.Generic[T]):
|
|
|
1377
1381
|
elif isinstance(o, str):
|
|
1378
1382
|
return cls(o)
|
|
1379
1383
|
elif isinstance(o, tuple):
|
|
1380
|
-
name,
|
|
1381
|
-
|
|
1382
|
-
|
|
1383
|
-
display=
|
|
1384
|
-
)
|
|
1384
|
+
name, x = o
|
|
1385
|
+
kw: ta.Mapping[str, ta.Any]
|
|
1386
|
+
if isinstance(x, str):
|
|
1387
|
+
kw = dict(display=x)
|
|
1388
|
+
elif isinstance(x, ta.Mapping):
|
|
1389
|
+
kw = x
|
|
1390
|
+
else:
|
|
1391
|
+
raise TypeError(x)
|
|
1392
|
+
return cls(name, **kw)
|
|
1385
1393
|
elif isinstance(o, ta.Mapping):
|
|
1386
1394
|
return cls(**o)
|
|
1387
1395
|
else:
|
|
@@ -1403,20 +1411,34 @@ class AttrOps(ta.Generic[T]):
|
|
|
1403
1411
|
def eq(self) -> bool:
|
|
1404
1412
|
return self._eq
|
|
1405
1413
|
|
|
1414
|
+
@staticmethod
|
|
1415
|
+
def opt_repr(o: ta.Any) -> ta.Optional[str]:
|
|
1416
|
+
return repr(o) if o is not None else None
|
|
1417
|
+
|
|
1418
|
+
@staticmethod
|
|
1419
|
+
def truthy_repr(o: ta.Any) -> ta.Optional[str]:
|
|
1420
|
+
return repr(o) if o else None
|
|
1421
|
+
|
|
1422
|
+
#
|
|
1423
|
+
|
|
1406
1424
|
@ta.overload
|
|
1407
1425
|
def __init__(
|
|
1408
1426
|
self,
|
|
1409
1427
|
*attrs: ta.Sequence[ta.Union[
|
|
1410
1428
|
str,
|
|
1411
|
-
ta.Tuple[str, str],
|
|
1429
|
+
ta.Tuple[str, ta.Union[str, ta.Mapping[str, ta.Any]]],
|
|
1412
1430
|
ta.Mapping[str, ta.Any],
|
|
1413
1431
|
Attr,
|
|
1414
1432
|
]],
|
|
1433
|
+
|
|
1415
1434
|
with_module: bool = False,
|
|
1416
1435
|
use_qualname: bool = False,
|
|
1417
1436
|
with_id: bool = False,
|
|
1437
|
+
terse: bool = False,
|
|
1418
1438
|
repr_filter: ta.Optional[ta.Callable[[ta.Any], bool]] = None,
|
|
1419
1439
|
recursive: bool = False,
|
|
1440
|
+
|
|
1441
|
+
cache_hash: ta.Union[bool, str] = False,
|
|
1420
1442
|
subtypes_eq: bool = False,
|
|
1421
1443
|
) -> None:
|
|
1422
1444
|
...
|
|
@@ -1426,16 +1448,20 @@ class AttrOps(ta.Generic[T]):
|
|
|
1426
1448
|
self,
|
|
1427
1449
|
attrs_fn: ta.Callable[[T], ta.Tuple[ta.Union[
|
|
1428
1450
|
ta.Any,
|
|
1429
|
-
ta.Tuple[str, ta.Any],
|
|
1451
|
+
ta.Tuple[ta.Any, ta.Union[str, ta.Mapping[str, ta.Any]]],
|
|
1430
1452
|
Attr,
|
|
1431
1453
|
], ...]],
|
|
1432
1454
|
/,
|
|
1433
1455
|
*,
|
|
1456
|
+
|
|
1434
1457
|
with_module: bool = False,
|
|
1435
1458
|
use_qualname: bool = False,
|
|
1436
1459
|
with_id: bool = False,
|
|
1460
|
+
terse: bool = False,
|
|
1437
1461
|
repr_filter: ta.Optional[ta.Callable[[ta.Any], bool]] = None,
|
|
1438
1462
|
recursive: bool = False,
|
|
1463
|
+
|
|
1464
|
+
cache_hash: ta.Union[bool, str] = False,
|
|
1439
1465
|
subtypes_eq: bool = False,
|
|
1440
1466
|
) -> None:
|
|
1441
1467
|
...
|
|
@@ -1443,11 +1469,15 @@ class AttrOps(ta.Generic[T]):
|
|
|
1443
1469
|
def __init__(
|
|
1444
1470
|
self,
|
|
1445
1471
|
*args,
|
|
1472
|
+
|
|
1446
1473
|
with_module=False,
|
|
1447
1474
|
use_qualname=False,
|
|
1448
1475
|
with_id=False,
|
|
1476
|
+
terse=False,
|
|
1449
1477
|
repr_filter=None,
|
|
1450
1478
|
recursive=False,
|
|
1479
|
+
|
|
1480
|
+
cache_hash=False,
|
|
1451
1481
|
subtypes_eq=False,
|
|
1452
1482
|
) -> None:
|
|
1453
1483
|
if args and len(args) == 1 and callable(args[0]):
|
|
@@ -1458,8 +1488,11 @@ class AttrOps(ta.Generic[T]):
|
|
|
1458
1488
|
self._with_module: bool = with_module
|
|
1459
1489
|
self._use_qualname: bool = use_qualname
|
|
1460
1490
|
self._with_id: bool = with_id
|
|
1491
|
+
self._terse: bool = terse
|
|
1461
1492
|
self._repr_filter: ta.Optional[ta.Callable[[ta.Any], bool]] = repr_filter
|
|
1462
1493
|
self._recursive: bool = recursive
|
|
1494
|
+
|
|
1495
|
+
self._cache_hash: ta.Union[bool, str] = cache_hash
|
|
1463
1496
|
self._subtypes_eq: bool = subtypes_eq
|
|
1464
1497
|
|
|
1465
1498
|
@property
|
|
@@ -1498,16 +1531,23 @@ class AttrOps(ta.Generic[T]):
|
|
|
1498
1531
|
attrs.append(AttrOps.Attr.of(o))
|
|
1499
1532
|
continue
|
|
1500
1533
|
|
|
1534
|
+
kw: ta.Mapping[str, ta.Any]
|
|
1501
1535
|
if isinstance(o, tuple):
|
|
1502
|
-
|
|
1536
|
+
cap, x = o
|
|
1537
|
+
if isinstance(x, str):
|
|
1538
|
+
kw = dict(display=x)
|
|
1539
|
+
elif isinstance(x, ta.Mapping):
|
|
1540
|
+
kw = x
|
|
1541
|
+
else:
|
|
1542
|
+
raise TypeError(x)
|
|
1503
1543
|
else:
|
|
1504
|
-
|
|
1544
|
+
cap, kw = o, {}
|
|
1505
1545
|
|
|
1506
1546
|
path = tuple(rec(cap))
|
|
1507
1547
|
|
|
1508
1548
|
attrs.append(AttrOps.Attr(
|
|
1509
1549
|
'.'.join(path),
|
|
1510
|
-
|
|
1550
|
+
**kw,
|
|
1511
1551
|
))
|
|
1512
1552
|
|
|
1513
1553
|
return attrs
|
|
@@ -1524,19 +1564,27 @@ class AttrOps(ta.Generic[T]):
|
|
|
1524
1564
|
pass
|
|
1525
1565
|
|
|
1526
1566
|
def _repr(o: T) -> str:
|
|
1527
|
-
vs =
|
|
1528
|
-
|
|
1529
|
-
|
|
1530
|
-
|
|
1531
|
-
|
|
1532
|
-
if self._repr_filter is None
|
|
1533
|
-
|
|
1567
|
+
vs: ta.List[str] = []
|
|
1568
|
+
for a in self._attrs:
|
|
1569
|
+
if not a._repr: # noqa
|
|
1570
|
+
continue
|
|
1571
|
+
v = getattr(o, a._name) # noqa
|
|
1572
|
+
if self._repr_filter is not None and not self._repr_filter(v):
|
|
1573
|
+
continue
|
|
1574
|
+
if (rfn := a._repr_fn) is None: # noqa
|
|
1575
|
+
rfn = repr
|
|
1576
|
+
if (vr := rfn(v)) is None:
|
|
1577
|
+
continue
|
|
1578
|
+
if self._terse:
|
|
1579
|
+
vs.append(vr)
|
|
1580
|
+
else:
|
|
1581
|
+
vs.append(f'{a._display}={vr}') # noqa
|
|
1534
1582
|
|
|
1535
1583
|
return (
|
|
1536
1584
|
f'{o.__class__.__module__ + "." if self._with_module else ""}'
|
|
1537
1585
|
f'{o.__class__.__qualname__ if self._use_qualname else o.__class__.__name__}'
|
|
1538
1586
|
f'{("@" + hex(id(o))[2:]) if self._with_id else ""}' # noqa
|
|
1539
|
-
f'({vs})'
|
|
1587
|
+
f'({", ".join(vs)})'
|
|
1540
1588
|
)
|
|
1541
1589
|
|
|
1542
1590
|
if self._recursive:
|
|
@@ -1561,6 +1609,8 @@ class AttrOps(ta.Generic[T]):
|
|
|
1561
1609
|
|
|
1562
1610
|
#
|
|
1563
1611
|
|
|
1612
|
+
_DEFAULT_CACHED_HASH_ATTR: ta.ClassVar[str] = '__cached_hash__'
|
|
1613
|
+
|
|
1564
1614
|
_hash: ta.Callable[[T], int]
|
|
1565
1615
|
|
|
1566
1616
|
@property
|
|
@@ -1570,13 +1620,33 @@ class AttrOps(ta.Generic[T]):
|
|
|
1570
1620
|
except AttributeError:
|
|
1571
1621
|
pass
|
|
1572
1622
|
|
|
1573
|
-
def
|
|
1623
|
+
def _calc_hash(o: T) -> int:
|
|
1574
1624
|
return hash(tuple(
|
|
1575
1625
|
getattr(o, a._name) # noqa
|
|
1576
1626
|
for a in self._attrs
|
|
1577
1627
|
if a._hash # noqa
|
|
1578
1628
|
))
|
|
1579
1629
|
|
|
1630
|
+
if (ch := self._cache_hash) is not False:
|
|
1631
|
+
if ch is True:
|
|
1632
|
+
cha = self._DEFAULT_CACHED_HASH_ATTR
|
|
1633
|
+
elif isinstance(ch, str):
|
|
1634
|
+
cha = ch
|
|
1635
|
+
else:
|
|
1636
|
+
raise TypeError(ch)
|
|
1637
|
+
|
|
1638
|
+
def _cached_hash(o: T) -> int:
|
|
1639
|
+
try:
|
|
1640
|
+
return object.__getattribute__(o, cha)
|
|
1641
|
+
except AttributeError:
|
|
1642
|
+
object.__setattr__(o, cha, h := _calc_hash(o))
|
|
1643
|
+
return h
|
|
1644
|
+
|
|
1645
|
+
_hash = _cached_hash
|
|
1646
|
+
|
|
1647
|
+
else:
|
|
1648
|
+
_hash = _calc_hash
|
|
1649
|
+
|
|
1580
1650
|
self._hash = _hash
|
|
1581
1651
|
return _hash
|
|
1582
1652
|
|
|
@@ -1717,6 +1787,62 @@ def async_cached_nullary(fn): # ta.Callable[..., T]) -> ta.Callable[..., T]:
|
|
|
1717
1787
|
return _AsyncCachedNullary(fn)
|
|
1718
1788
|
|
|
1719
1789
|
|
|
1790
|
+
##
|
|
1791
|
+
|
|
1792
|
+
|
|
1793
|
+
cached_property = functools.cached_property
|
|
1794
|
+
|
|
1795
|
+
|
|
1796
|
+
class _cached_property: # noqa
|
|
1797
|
+
"""Backported to pick up https://github.com/python/cpython/commit/056dfc71dce15f81887f0bd6da09d6099d71f979 ."""
|
|
1798
|
+
|
|
1799
|
+
def __init__(self, func):
|
|
1800
|
+
self.func = func
|
|
1801
|
+
self.attrname = None # noqa
|
|
1802
|
+
self.__doc__ = func.__doc__
|
|
1803
|
+
self.__module__ = func.__module__
|
|
1804
|
+
|
|
1805
|
+
_NOT_FOUND = object()
|
|
1806
|
+
|
|
1807
|
+
def __set_name__(self, owner, name):
|
|
1808
|
+
if self.attrname is None:
|
|
1809
|
+
self.attrname = name # noqa
|
|
1810
|
+
elif name != self.attrname:
|
|
1811
|
+
raise TypeError(
|
|
1812
|
+
f'Cannot assign the same cached_property to two different names ({self.attrname!r} and {name!r}).',
|
|
1813
|
+
)
|
|
1814
|
+
|
|
1815
|
+
def __get__(self, instance, owner=None):
|
|
1816
|
+
if instance is None:
|
|
1817
|
+
return self
|
|
1818
|
+
if self.attrname is None:
|
|
1819
|
+
raise TypeError('Cannot use cached_property instance without calling __set_name__ on it.')
|
|
1820
|
+
|
|
1821
|
+
try:
|
|
1822
|
+
cache = instance.__dict__
|
|
1823
|
+
except AttributeError: # not all objects have __dict__ (e.g. class defines slots)
|
|
1824
|
+
raise TypeError(
|
|
1825
|
+
f"No '__dict__' attribute on {type(instance).__name__!r} instance to cache {self.attrname!r} property.",
|
|
1826
|
+
) from None
|
|
1827
|
+
|
|
1828
|
+
val = cache.get(self.attrname, self._NOT_FOUND)
|
|
1829
|
+
|
|
1830
|
+
if val is self._NOT_FOUND:
|
|
1831
|
+
val = self.func(instance)
|
|
1832
|
+
try:
|
|
1833
|
+
cache[self.attrname] = val
|
|
1834
|
+
except TypeError:
|
|
1835
|
+
raise TypeError(
|
|
1836
|
+
f"The '__dict__' attribute on {type(instance).__name__!r} instance does not support item "
|
|
1837
|
+
f"assignment for caching {self.attrname!r} property.",
|
|
1838
|
+
) from None
|
|
1839
|
+
|
|
1840
|
+
return val
|
|
1841
|
+
|
|
1842
|
+
|
|
1843
|
+
globals()['cached_property'] = _cached_property
|
|
1844
|
+
|
|
1845
|
+
|
|
1720
1846
|
########################################
|
|
1721
1847
|
# ../../../../../omlish/lite/check.py
|
|
1722
1848
|
"""
|
|
@@ -2524,6 +2524,8 @@ class AttrOps(ta.Generic[T]):
|
|
|
2524
2524
|
display: ta.Optional[str] = None,
|
|
2525
2525
|
|
|
2526
2526
|
repr: bool = True, # noqa
|
|
2527
|
+
repr_fn: ta.Optional[ta.Callable[[ta.Any], ta.Optional[str]]] = None,
|
|
2528
|
+
|
|
2527
2529
|
hash: bool = True, # noqa
|
|
2528
2530
|
eq: bool = True,
|
|
2529
2531
|
) -> None:
|
|
@@ -2538,6 +2540,8 @@ class AttrOps(ta.Generic[T]):
|
|
|
2538
2540
|
self._display = display
|
|
2539
2541
|
|
|
2540
2542
|
self._repr = repr
|
|
2543
|
+
self._repr_fn = repr_fn
|
|
2544
|
+
|
|
2541
2545
|
self._hash = hash
|
|
2542
2546
|
self._eq = eq
|
|
2543
2547
|
|
|
@@ -2545,10 +2549,10 @@ class AttrOps(ta.Generic[T]):
|
|
|
2545
2549
|
def of(
|
|
2546
2550
|
cls,
|
|
2547
2551
|
o: ta.Union[
|
|
2552
|
+
'AttrOps.Attr',
|
|
2548
2553
|
str,
|
|
2549
|
-
ta.Tuple[str, str],
|
|
2554
|
+
ta.Tuple[str, ta.Union[str, ta.Mapping[str, ta.Any]]],
|
|
2550
2555
|
ta.Mapping[str, ta.Any],
|
|
2551
|
-
'AttrOps.Attr',
|
|
2552
2556
|
],
|
|
2553
2557
|
) -> 'AttrOps.Attr':
|
|
2554
2558
|
if isinstance(o, AttrOps.Attr):
|
|
@@ -2556,11 +2560,15 @@ class AttrOps(ta.Generic[T]):
|
|
|
2556
2560
|
elif isinstance(o, str):
|
|
2557
2561
|
return cls(o)
|
|
2558
2562
|
elif isinstance(o, tuple):
|
|
2559
|
-
name,
|
|
2560
|
-
|
|
2561
|
-
|
|
2562
|
-
display=
|
|
2563
|
-
)
|
|
2563
|
+
name, x = o
|
|
2564
|
+
kw: ta.Mapping[str, ta.Any]
|
|
2565
|
+
if isinstance(x, str):
|
|
2566
|
+
kw = dict(display=x)
|
|
2567
|
+
elif isinstance(x, ta.Mapping):
|
|
2568
|
+
kw = x
|
|
2569
|
+
else:
|
|
2570
|
+
raise TypeError(x)
|
|
2571
|
+
return cls(name, **kw)
|
|
2564
2572
|
elif isinstance(o, ta.Mapping):
|
|
2565
2573
|
return cls(**o)
|
|
2566
2574
|
else:
|
|
@@ -2582,20 +2590,34 @@ class AttrOps(ta.Generic[T]):
|
|
|
2582
2590
|
def eq(self) -> bool:
|
|
2583
2591
|
return self._eq
|
|
2584
2592
|
|
|
2593
|
+
@staticmethod
|
|
2594
|
+
def opt_repr(o: ta.Any) -> ta.Optional[str]:
|
|
2595
|
+
return repr(o) if o is not None else None
|
|
2596
|
+
|
|
2597
|
+
@staticmethod
|
|
2598
|
+
def truthy_repr(o: ta.Any) -> ta.Optional[str]:
|
|
2599
|
+
return repr(o) if o else None
|
|
2600
|
+
|
|
2601
|
+
#
|
|
2602
|
+
|
|
2585
2603
|
@ta.overload
|
|
2586
2604
|
def __init__(
|
|
2587
2605
|
self,
|
|
2588
2606
|
*attrs: ta.Sequence[ta.Union[
|
|
2589
2607
|
str,
|
|
2590
|
-
ta.Tuple[str, str],
|
|
2608
|
+
ta.Tuple[str, ta.Union[str, ta.Mapping[str, ta.Any]]],
|
|
2591
2609
|
ta.Mapping[str, ta.Any],
|
|
2592
2610
|
Attr,
|
|
2593
2611
|
]],
|
|
2612
|
+
|
|
2594
2613
|
with_module: bool = False,
|
|
2595
2614
|
use_qualname: bool = False,
|
|
2596
2615
|
with_id: bool = False,
|
|
2616
|
+
terse: bool = False,
|
|
2597
2617
|
repr_filter: ta.Optional[ta.Callable[[ta.Any], bool]] = None,
|
|
2598
2618
|
recursive: bool = False,
|
|
2619
|
+
|
|
2620
|
+
cache_hash: ta.Union[bool, str] = False,
|
|
2599
2621
|
subtypes_eq: bool = False,
|
|
2600
2622
|
) -> None:
|
|
2601
2623
|
...
|
|
@@ -2605,16 +2627,20 @@ class AttrOps(ta.Generic[T]):
|
|
|
2605
2627
|
self,
|
|
2606
2628
|
attrs_fn: ta.Callable[[T], ta.Tuple[ta.Union[
|
|
2607
2629
|
ta.Any,
|
|
2608
|
-
ta.Tuple[str, ta.Any],
|
|
2630
|
+
ta.Tuple[ta.Any, ta.Union[str, ta.Mapping[str, ta.Any]]],
|
|
2609
2631
|
Attr,
|
|
2610
2632
|
], ...]],
|
|
2611
2633
|
/,
|
|
2612
2634
|
*,
|
|
2635
|
+
|
|
2613
2636
|
with_module: bool = False,
|
|
2614
2637
|
use_qualname: bool = False,
|
|
2615
2638
|
with_id: bool = False,
|
|
2639
|
+
terse: bool = False,
|
|
2616
2640
|
repr_filter: ta.Optional[ta.Callable[[ta.Any], bool]] = None,
|
|
2617
2641
|
recursive: bool = False,
|
|
2642
|
+
|
|
2643
|
+
cache_hash: ta.Union[bool, str] = False,
|
|
2618
2644
|
subtypes_eq: bool = False,
|
|
2619
2645
|
) -> None:
|
|
2620
2646
|
...
|
|
@@ -2622,11 +2648,15 @@ class AttrOps(ta.Generic[T]):
|
|
|
2622
2648
|
def __init__(
|
|
2623
2649
|
self,
|
|
2624
2650
|
*args,
|
|
2651
|
+
|
|
2625
2652
|
with_module=False,
|
|
2626
2653
|
use_qualname=False,
|
|
2627
2654
|
with_id=False,
|
|
2655
|
+
terse=False,
|
|
2628
2656
|
repr_filter=None,
|
|
2629
2657
|
recursive=False,
|
|
2658
|
+
|
|
2659
|
+
cache_hash=False,
|
|
2630
2660
|
subtypes_eq=False,
|
|
2631
2661
|
) -> None:
|
|
2632
2662
|
if args and len(args) == 1 and callable(args[0]):
|
|
@@ -2637,8 +2667,11 @@ class AttrOps(ta.Generic[T]):
|
|
|
2637
2667
|
self._with_module: bool = with_module
|
|
2638
2668
|
self._use_qualname: bool = use_qualname
|
|
2639
2669
|
self._with_id: bool = with_id
|
|
2670
|
+
self._terse: bool = terse
|
|
2640
2671
|
self._repr_filter: ta.Optional[ta.Callable[[ta.Any], bool]] = repr_filter
|
|
2641
2672
|
self._recursive: bool = recursive
|
|
2673
|
+
|
|
2674
|
+
self._cache_hash: ta.Union[bool, str] = cache_hash
|
|
2642
2675
|
self._subtypes_eq: bool = subtypes_eq
|
|
2643
2676
|
|
|
2644
2677
|
@property
|
|
@@ -2677,16 +2710,23 @@ class AttrOps(ta.Generic[T]):
|
|
|
2677
2710
|
attrs.append(AttrOps.Attr.of(o))
|
|
2678
2711
|
continue
|
|
2679
2712
|
|
|
2713
|
+
kw: ta.Mapping[str, ta.Any]
|
|
2680
2714
|
if isinstance(o, tuple):
|
|
2681
|
-
|
|
2715
|
+
cap, x = o
|
|
2716
|
+
if isinstance(x, str):
|
|
2717
|
+
kw = dict(display=x)
|
|
2718
|
+
elif isinstance(x, ta.Mapping):
|
|
2719
|
+
kw = x
|
|
2720
|
+
else:
|
|
2721
|
+
raise TypeError(x)
|
|
2682
2722
|
else:
|
|
2683
|
-
|
|
2723
|
+
cap, kw = o, {}
|
|
2684
2724
|
|
|
2685
2725
|
path = tuple(rec(cap))
|
|
2686
2726
|
|
|
2687
2727
|
attrs.append(AttrOps.Attr(
|
|
2688
2728
|
'.'.join(path),
|
|
2689
|
-
|
|
2729
|
+
**kw,
|
|
2690
2730
|
))
|
|
2691
2731
|
|
|
2692
2732
|
return attrs
|
|
@@ -2703,19 +2743,27 @@ class AttrOps(ta.Generic[T]):
|
|
|
2703
2743
|
pass
|
|
2704
2744
|
|
|
2705
2745
|
def _repr(o: T) -> str:
|
|
2706
|
-
vs =
|
|
2707
|
-
|
|
2708
|
-
|
|
2709
|
-
|
|
2710
|
-
|
|
2711
|
-
if self._repr_filter is None
|
|
2712
|
-
|
|
2746
|
+
vs: ta.List[str] = []
|
|
2747
|
+
for a in self._attrs:
|
|
2748
|
+
if not a._repr: # noqa
|
|
2749
|
+
continue
|
|
2750
|
+
v = getattr(o, a._name) # noqa
|
|
2751
|
+
if self._repr_filter is not None and not self._repr_filter(v):
|
|
2752
|
+
continue
|
|
2753
|
+
if (rfn := a._repr_fn) is None: # noqa
|
|
2754
|
+
rfn = repr
|
|
2755
|
+
if (vr := rfn(v)) is None:
|
|
2756
|
+
continue
|
|
2757
|
+
if self._terse:
|
|
2758
|
+
vs.append(vr)
|
|
2759
|
+
else:
|
|
2760
|
+
vs.append(f'{a._display}={vr}') # noqa
|
|
2713
2761
|
|
|
2714
2762
|
return (
|
|
2715
2763
|
f'{o.__class__.__module__ + "." if self._with_module else ""}'
|
|
2716
2764
|
f'{o.__class__.__qualname__ if self._use_qualname else o.__class__.__name__}'
|
|
2717
2765
|
f'{("@" + hex(id(o))[2:]) if self._with_id else ""}' # noqa
|
|
2718
|
-
f'({vs})'
|
|
2766
|
+
f'({", ".join(vs)})'
|
|
2719
2767
|
)
|
|
2720
2768
|
|
|
2721
2769
|
if self._recursive:
|
|
@@ -2740,6 +2788,8 @@ class AttrOps(ta.Generic[T]):
|
|
|
2740
2788
|
|
|
2741
2789
|
#
|
|
2742
2790
|
|
|
2791
|
+
_DEFAULT_CACHED_HASH_ATTR: ta.ClassVar[str] = '__cached_hash__'
|
|
2792
|
+
|
|
2743
2793
|
_hash: ta.Callable[[T], int]
|
|
2744
2794
|
|
|
2745
2795
|
@property
|
|
@@ -2749,13 +2799,33 @@ class AttrOps(ta.Generic[T]):
|
|
|
2749
2799
|
except AttributeError:
|
|
2750
2800
|
pass
|
|
2751
2801
|
|
|
2752
|
-
def
|
|
2802
|
+
def _calc_hash(o: T) -> int:
|
|
2753
2803
|
return hash(tuple(
|
|
2754
2804
|
getattr(o, a._name) # noqa
|
|
2755
2805
|
for a in self._attrs
|
|
2756
2806
|
if a._hash # noqa
|
|
2757
2807
|
))
|
|
2758
2808
|
|
|
2809
|
+
if (ch := self._cache_hash) is not False:
|
|
2810
|
+
if ch is True:
|
|
2811
|
+
cha = self._DEFAULT_CACHED_HASH_ATTR
|
|
2812
|
+
elif isinstance(ch, str):
|
|
2813
|
+
cha = ch
|
|
2814
|
+
else:
|
|
2815
|
+
raise TypeError(ch)
|
|
2816
|
+
|
|
2817
|
+
def _cached_hash(o: T) -> int:
|
|
2818
|
+
try:
|
|
2819
|
+
return object.__getattribute__(o, cha)
|
|
2820
|
+
except AttributeError:
|
|
2821
|
+
object.__setattr__(o, cha, h := _calc_hash(o))
|
|
2822
|
+
return h
|
|
2823
|
+
|
|
2824
|
+
_hash = _cached_hash
|
|
2825
|
+
|
|
2826
|
+
else:
|
|
2827
|
+
_hash = _calc_hash
|
|
2828
|
+
|
|
2759
2829
|
self._hash = _hash
|
|
2760
2830
|
return _hash
|
|
2761
2831
|
|
|
@@ -2896,6 +2966,62 @@ def async_cached_nullary(fn): # ta.Callable[..., T]) -> ta.Callable[..., T]:
|
|
|
2896
2966
|
return _AsyncCachedNullary(fn)
|
|
2897
2967
|
|
|
2898
2968
|
|
|
2969
|
+
##
|
|
2970
|
+
|
|
2971
|
+
|
|
2972
|
+
cached_property = functools.cached_property
|
|
2973
|
+
|
|
2974
|
+
|
|
2975
|
+
class _cached_property: # noqa
|
|
2976
|
+
"""Backported to pick up https://github.com/python/cpython/commit/056dfc71dce15f81887f0bd6da09d6099d71f979 ."""
|
|
2977
|
+
|
|
2978
|
+
def __init__(self, func):
|
|
2979
|
+
self.func = func
|
|
2980
|
+
self.attrname = None # noqa
|
|
2981
|
+
self.__doc__ = func.__doc__
|
|
2982
|
+
self.__module__ = func.__module__
|
|
2983
|
+
|
|
2984
|
+
_NOT_FOUND = object()
|
|
2985
|
+
|
|
2986
|
+
def __set_name__(self, owner, name):
|
|
2987
|
+
if self.attrname is None:
|
|
2988
|
+
self.attrname = name # noqa
|
|
2989
|
+
elif name != self.attrname:
|
|
2990
|
+
raise TypeError(
|
|
2991
|
+
f'Cannot assign the same cached_property to two different names ({self.attrname!r} and {name!r}).',
|
|
2992
|
+
)
|
|
2993
|
+
|
|
2994
|
+
def __get__(self, instance, owner=None):
|
|
2995
|
+
if instance is None:
|
|
2996
|
+
return self
|
|
2997
|
+
if self.attrname is None:
|
|
2998
|
+
raise TypeError('Cannot use cached_property instance without calling __set_name__ on it.')
|
|
2999
|
+
|
|
3000
|
+
try:
|
|
3001
|
+
cache = instance.__dict__
|
|
3002
|
+
except AttributeError: # not all objects have __dict__ (e.g. class defines slots)
|
|
3003
|
+
raise TypeError(
|
|
3004
|
+
f"No '__dict__' attribute on {type(instance).__name__!r} instance to cache {self.attrname!r} property.",
|
|
3005
|
+
) from None
|
|
3006
|
+
|
|
3007
|
+
val = cache.get(self.attrname, self._NOT_FOUND)
|
|
3008
|
+
|
|
3009
|
+
if val is self._NOT_FOUND:
|
|
3010
|
+
val = self.func(instance)
|
|
3011
|
+
try:
|
|
3012
|
+
cache[self.attrname] = val
|
|
3013
|
+
except TypeError:
|
|
3014
|
+
raise TypeError(
|
|
3015
|
+
f"The '__dict__' attribute on {type(instance).__name__!r} instance does not support item "
|
|
3016
|
+
f"assignment for caching {self.attrname!r} property.",
|
|
3017
|
+
) from None
|
|
3018
|
+
|
|
3019
|
+
return val
|
|
3020
|
+
|
|
3021
|
+
|
|
3022
|
+
globals()['cached_property'] = _cached_property
|
|
3023
|
+
|
|
3024
|
+
|
|
2899
3025
|
########################################
|
|
2900
3026
|
# ../../../omlish/lite/check.py
|
|
2901
3027
|
"""
|
|
@@ -7234,8 +7360,6 @@ class _JustMaybe(_Maybe[T]):
|
|
|
7234
7360
|
__slots__ = ('_v', '_hash')
|
|
7235
7361
|
|
|
7236
7362
|
def __init__(self, v: T) -> None:
|
|
7237
|
-
super().__init__()
|
|
7238
|
-
|
|
7239
7363
|
self._v = v
|
|
7240
7364
|
|
|
7241
7365
|
@property
|