ominfra 0.0.0.dev439__tar.gz → 0.0.0.dev441__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.dev439/ominfra.egg-info → ominfra-0.0.0.dev441}/PKG-INFO +3 -3
- ominfra-0.0.0.dev441/ominfra/clouds/aws/instancetypes/cache.json.gz +0 -0
- {ominfra-0.0.0.dev439 → ominfra-0.0.0.dev441}/ominfra/scripts/journald2aws.py +155 -23
- {ominfra-0.0.0.dev439 → ominfra-0.0.0.dev441}/ominfra/scripts/manage.py +155 -23
- {ominfra-0.0.0.dev439 → ominfra-0.0.0.dev441}/ominfra/scripts/supervisor.py +240 -71
- {ominfra-0.0.0.dev439 → ominfra-0.0.0.dev441/ominfra.egg-info}/PKG-INFO +3 -3
- {ominfra-0.0.0.dev439 → ominfra-0.0.0.dev441}/ominfra.egg-info/requires.txt +2 -2
- {ominfra-0.0.0.dev439 → ominfra-0.0.0.dev441}/pyproject.toml +3 -3
- ominfra-0.0.0.dev439/ominfra/clouds/aws/instancetypes/cache.json.gz +0 -0
- {ominfra-0.0.0.dev439 → ominfra-0.0.0.dev441}/LICENSE +0 -0
- {ominfra-0.0.0.dev439 → ominfra-0.0.0.dev441}/MANIFEST.in +0 -0
- {ominfra-0.0.0.dev439 → ominfra-0.0.0.dev441}/README.md +0 -0
- {ominfra-0.0.0.dev439 → ominfra-0.0.0.dev441}/ominfra/.omlish-manifests.json +0 -0
- {ominfra-0.0.0.dev439 → ominfra-0.0.0.dev441}/ominfra/__about__.py +0 -0
- {ominfra-0.0.0.dev439 → ominfra-0.0.0.dev441}/ominfra/__init__.py +0 -0
- {ominfra-0.0.0.dev439 → ominfra-0.0.0.dev441}/ominfra/clouds/__init__.py +0 -0
- {ominfra-0.0.0.dev439 → ominfra-0.0.0.dev441}/ominfra/clouds/aws/__init__.py +0 -0
- {ominfra-0.0.0.dev439 → ominfra-0.0.0.dev441}/ominfra/clouds/aws/__main__.py +0 -0
- {ominfra-0.0.0.dev439 → ominfra-0.0.0.dev441}/ominfra/clouds/aws/auth.py +0 -0
- {ominfra-0.0.0.dev439 → ominfra-0.0.0.dev441}/ominfra/clouds/aws/cli.py +0 -0
- {ominfra-0.0.0.dev439 → ominfra-0.0.0.dev441}/ominfra/clouds/aws/dataclasses.py +0 -0
- {ominfra-0.0.0.dev439 → ominfra-0.0.0.dev441}/ominfra/clouds/aws/instancetypes/__init__.py +0 -0
- {ominfra-0.0.0.dev439 → ominfra-0.0.0.dev441}/ominfra/clouds/aws/instancetypes/__main__.py +0 -0
- {ominfra-0.0.0.dev439 → ominfra-0.0.0.dev441}/ominfra/clouds/aws/instancetypes/cache.py +0 -0
- {ominfra-0.0.0.dev439 → ominfra-0.0.0.dev441}/ominfra/clouds/aws/instancetypes/cli.py +0 -0
- {ominfra-0.0.0.dev439 → ominfra-0.0.0.dev441}/ominfra/clouds/aws/journald2aws/__init__.py +0 -0
- {ominfra-0.0.0.dev439 → ominfra-0.0.0.dev441}/ominfra/clouds/aws/journald2aws/__main__.py +0 -0
- {ominfra-0.0.0.dev439 → ominfra-0.0.0.dev441}/ominfra/clouds/aws/journald2aws/cursor.py +0 -0
- {ominfra-0.0.0.dev439 → ominfra-0.0.0.dev441}/ominfra/clouds/aws/journald2aws/driver.py +0 -0
- {ominfra-0.0.0.dev439 → ominfra-0.0.0.dev441}/ominfra/clouds/aws/journald2aws/main.py +0 -0
- {ominfra-0.0.0.dev439 → ominfra-0.0.0.dev441}/ominfra/clouds/aws/journald2aws/poster.py +0 -0
- {ominfra-0.0.0.dev439 → ominfra-0.0.0.dev441}/ominfra/clouds/aws/logs.py +0 -0
- {ominfra-0.0.0.dev439 → ominfra-0.0.0.dev441}/ominfra/clouds/aws/metadata.py +0 -0
- {ominfra-0.0.0.dev439 → ominfra-0.0.0.dev441}/ominfra/clouds/aws/models/__init__.py +0 -0
- {ominfra-0.0.0.dev439 → ominfra-0.0.0.dev441}/ominfra/clouds/aws/models/base.py +0 -0
- {ominfra-0.0.0.dev439 → ominfra-0.0.0.dev441}/ominfra/clouds/aws/models/gen/__init__.py +0 -0
- {ominfra-0.0.0.dev439 → ominfra-0.0.0.dev441}/ominfra/clouds/aws/models/gen/__main__.py +0 -0
- {ominfra-0.0.0.dev439 → ominfra-0.0.0.dev441}/ominfra/clouds/aws/models/gen/cli.py +0 -0
- {ominfra-0.0.0.dev439 → ominfra-0.0.0.dev441}/ominfra/clouds/aws/models/gen/gen.py +0 -0
- {ominfra-0.0.0.dev439 → ominfra-0.0.0.dev441}/ominfra/clouds/aws/models/services/__init__.py +0 -0
- {ominfra-0.0.0.dev439 → ominfra-0.0.0.dev441}/ominfra/clouds/aws/models/services/ec2.py +0 -0
- {ominfra-0.0.0.dev439 → ominfra-0.0.0.dev441}/ominfra/clouds/aws/models/services/lambda_.py +0 -0
- {ominfra-0.0.0.dev439 → ominfra-0.0.0.dev441}/ominfra/clouds/aws/models/services/rds.py +0 -0
- {ominfra-0.0.0.dev439 → ominfra-0.0.0.dev441}/ominfra/clouds/aws/models/services/s3.py +0 -0
- {ominfra-0.0.0.dev439 → ominfra-0.0.0.dev441}/ominfra/clouds/aws/models/services/services.toml +0 -0
- {ominfra-0.0.0.dev439 → ominfra-0.0.0.dev441}/ominfra/clouds/gcp/__init__.py +0 -0
- {ominfra-0.0.0.dev439 → ominfra-0.0.0.dev441}/ominfra/clouds/gcp/api.py +0 -0
- {ominfra-0.0.0.dev439 → ominfra-0.0.0.dev441}/ominfra/clouds/gcp/auth.py +0 -0
- {ominfra-0.0.0.dev439 → ominfra-0.0.0.dev441}/ominfra/commands/__init__.py +0 -0
- {ominfra-0.0.0.dev439 → ominfra-0.0.0.dev441}/ominfra/commands/runners.py +0 -0
- {ominfra-0.0.0.dev439 → ominfra-0.0.0.dev441}/ominfra/commands/ssh.py +0 -0
- {ominfra-0.0.0.dev439 → ominfra-0.0.0.dev441}/ominfra/journald/__init__.py +0 -0
- {ominfra-0.0.0.dev439 → ominfra-0.0.0.dev441}/ominfra/journald/fields.py +0 -0
- {ominfra-0.0.0.dev439 → ominfra-0.0.0.dev441}/ominfra/journald/genmessages.py +0 -0
- {ominfra-0.0.0.dev439 → ominfra-0.0.0.dev441}/ominfra/journald/messages.py +0 -0
- {ominfra-0.0.0.dev439 → ominfra-0.0.0.dev441}/ominfra/journald/tailer.py +0 -0
- {ominfra-0.0.0.dev439 → ominfra-0.0.0.dev441}/ominfra/manage/__init__.py +0 -0
- {ominfra-0.0.0.dev439 → ominfra-0.0.0.dev441}/ominfra/manage/__main__.py +0 -0
- {ominfra-0.0.0.dev439 → ominfra-0.0.0.dev441}/ominfra/manage/bootstrap.py +0 -0
- {ominfra-0.0.0.dev439 → ominfra-0.0.0.dev441}/ominfra/manage/bootstrap_.py +0 -0
- {ominfra-0.0.0.dev439 → ominfra-0.0.0.dev441}/ominfra/manage/commands/__init__.py +0 -0
- {ominfra-0.0.0.dev439 → ominfra-0.0.0.dev441}/ominfra/manage/commands/base.py +0 -0
- {ominfra-0.0.0.dev439 → ominfra-0.0.0.dev441}/ominfra/manage/commands/inject.py +0 -0
- {ominfra-0.0.0.dev439 → ominfra-0.0.0.dev441}/ominfra/manage/commands/injection.py +0 -0
- {ominfra-0.0.0.dev439 → ominfra-0.0.0.dev441}/ominfra/manage/commands/local.py +0 -0
- {ominfra-0.0.0.dev439 → ominfra-0.0.0.dev441}/ominfra/manage/commands/marshal.py +0 -0
- {ominfra-0.0.0.dev439 → ominfra-0.0.0.dev441}/ominfra/manage/commands/ping.py +0 -0
- {ominfra-0.0.0.dev439 → ominfra-0.0.0.dev441}/ominfra/manage/commands/subprocess.py +0 -0
- {ominfra-0.0.0.dev439 → ominfra-0.0.0.dev441}/ominfra/manage/commands/types.py +0 -0
- {ominfra-0.0.0.dev439 → ominfra-0.0.0.dev441}/ominfra/manage/config.py +0 -0
- {ominfra-0.0.0.dev439 → ominfra-0.0.0.dev441}/ominfra/manage/deploy/__init__.py +0 -0
- {ominfra-0.0.0.dev439 → ominfra-0.0.0.dev441}/ominfra/manage/deploy/apps.py +0 -0
- {ominfra-0.0.0.dev439 → ominfra-0.0.0.dev441}/ominfra/manage/deploy/commands.py +0 -0
- {ominfra-0.0.0.dev439 → ominfra-0.0.0.dev441}/ominfra/manage/deploy/conf/__init__.py +0 -0
- {ominfra-0.0.0.dev439 → ominfra-0.0.0.dev441}/ominfra/manage/deploy/conf/inject.py +0 -0
- {ominfra-0.0.0.dev439 → ominfra-0.0.0.dev441}/ominfra/manage/deploy/conf/manager.py +0 -0
- {ominfra-0.0.0.dev439 → ominfra-0.0.0.dev441}/ominfra/manage/deploy/conf/specs.py +0 -0
- {ominfra-0.0.0.dev439 → ominfra-0.0.0.dev441}/ominfra/manage/deploy/config.py +0 -0
- {ominfra-0.0.0.dev439 → ominfra-0.0.0.dev441}/ominfra/manage/deploy/deploy.py +0 -0
- {ominfra-0.0.0.dev439 → ominfra-0.0.0.dev441}/ominfra/manage/deploy/git.py +0 -0
- {ominfra-0.0.0.dev439 → ominfra-0.0.0.dev441}/ominfra/manage/deploy/inject.py +0 -0
- {ominfra-0.0.0.dev439 → ominfra-0.0.0.dev441}/ominfra/manage/deploy/injection.py +0 -0
- {ominfra-0.0.0.dev439 → ominfra-0.0.0.dev441}/ominfra/manage/deploy/interp.py +0 -0
- {ominfra-0.0.0.dev439 → ominfra-0.0.0.dev441}/ominfra/manage/deploy/nginx.py +0 -0
- {ominfra-0.0.0.dev439 → ominfra-0.0.0.dev441}/ominfra/manage/deploy/paths/__init__.py +0 -0
- {ominfra-0.0.0.dev439 → ominfra-0.0.0.dev441}/ominfra/manage/deploy/paths/inject.py +0 -0
- {ominfra-0.0.0.dev439 → ominfra-0.0.0.dev441}/ominfra/manage/deploy/paths/manager.py +0 -0
- {ominfra-0.0.0.dev439 → ominfra-0.0.0.dev441}/ominfra/manage/deploy/paths/owners.py +0 -0
- {ominfra-0.0.0.dev439 → ominfra-0.0.0.dev441}/ominfra/manage/deploy/paths/paths.py +0 -0
- {ominfra-0.0.0.dev439 → ominfra-0.0.0.dev441}/ominfra/manage/deploy/paths/specs.py +0 -0
- {ominfra-0.0.0.dev439 → ominfra-0.0.0.dev441}/ominfra/manage/deploy/paths/types.py +0 -0
- {ominfra-0.0.0.dev439 → ominfra-0.0.0.dev441}/ominfra/manage/deploy/specs.py +0 -0
- {ominfra-0.0.0.dev439 → ominfra-0.0.0.dev441}/ominfra/manage/deploy/systemd.py +0 -0
- {ominfra-0.0.0.dev439 → ominfra-0.0.0.dev441}/ominfra/manage/deploy/tags.py +0 -0
- {ominfra-0.0.0.dev439 → ominfra-0.0.0.dev441}/ominfra/manage/deploy/tmp.py +0 -0
- {ominfra-0.0.0.dev439 → ominfra-0.0.0.dev441}/ominfra/manage/deploy/types.py +0 -0
- {ominfra-0.0.0.dev439 → ominfra-0.0.0.dev441}/ominfra/manage/deploy/venvs.py +0 -0
- {ominfra-0.0.0.dev439 → ominfra-0.0.0.dev441}/ominfra/manage/inject.py +0 -0
- {ominfra-0.0.0.dev439 → ominfra-0.0.0.dev441}/ominfra/manage/main.py +0 -0
- {ominfra-0.0.0.dev439 → ominfra-0.0.0.dev441}/ominfra/manage/marshal.py +0 -0
- {ominfra-0.0.0.dev439 → ominfra-0.0.0.dev441}/ominfra/manage/remote/__init__.py +0 -0
- {ominfra-0.0.0.dev439 → ominfra-0.0.0.dev441}/ominfra/manage/remote/_main.py +0 -0
- {ominfra-0.0.0.dev439 → ominfra-0.0.0.dev441}/ominfra/manage/remote/channel.py +0 -0
- {ominfra-0.0.0.dev439 → ominfra-0.0.0.dev441}/ominfra/manage/remote/config.py +0 -0
- {ominfra-0.0.0.dev439 → ominfra-0.0.0.dev441}/ominfra/manage/remote/connection.py +0 -0
- {ominfra-0.0.0.dev439 → ominfra-0.0.0.dev441}/ominfra/manage/remote/execution.py +0 -0
- {ominfra-0.0.0.dev439 → ominfra-0.0.0.dev441}/ominfra/manage/remote/inject.py +0 -0
- {ominfra-0.0.0.dev439 → ominfra-0.0.0.dev441}/ominfra/manage/remote/payload.py +0 -0
- {ominfra-0.0.0.dev439 → ominfra-0.0.0.dev441}/ominfra/manage/remote/spawning.py +0 -0
- {ominfra-0.0.0.dev439 → ominfra-0.0.0.dev441}/ominfra/manage/system/__init__.py +0 -0
- {ominfra-0.0.0.dev439 → ominfra-0.0.0.dev441}/ominfra/manage/system/commands.py +0 -0
- {ominfra-0.0.0.dev439 → ominfra-0.0.0.dev441}/ominfra/manage/system/config.py +0 -0
- {ominfra-0.0.0.dev439 → ominfra-0.0.0.dev441}/ominfra/manage/system/inject.py +0 -0
- {ominfra-0.0.0.dev439 → ominfra-0.0.0.dev441}/ominfra/manage/system/packages.py +0 -0
- {ominfra-0.0.0.dev439 → ominfra-0.0.0.dev441}/ominfra/manage/system/platforms.py +0 -0
- {ominfra-0.0.0.dev439 → ominfra-0.0.0.dev441}/ominfra/manage/targets/__init__.py +0 -0
- {ominfra-0.0.0.dev439 → ominfra-0.0.0.dev441}/ominfra/manage/targets/bestpython.py +0 -0
- {ominfra-0.0.0.dev439 → ominfra-0.0.0.dev441}/ominfra/manage/targets/bestpython.sh +0 -0
- {ominfra-0.0.0.dev439 → ominfra-0.0.0.dev441}/ominfra/manage/targets/connection.py +0 -0
- {ominfra-0.0.0.dev439 → ominfra-0.0.0.dev441}/ominfra/manage/targets/inject.py +0 -0
- {ominfra-0.0.0.dev439 → ominfra-0.0.0.dev441}/ominfra/manage/targets/targets.py +0 -0
- {ominfra-0.0.0.dev439 → ominfra-0.0.0.dev441}/ominfra/pyremote.py +0 -0
- {ominfra-0.0.0.dev439 → ominfra-0.0.0.dev441}/ominfra/scripts/__init__.py +0 -0
- {ominfra-0.0.0.dev439 → ominfra-0.0.0.dev441}/ominfra/supervisor/LICENSE.txt +0 -0
- {ominfra-0.0.0.dev439 → ominfra-0.0.0.dev441}/ominfra/supervisor/__init__.py +0 -0
- {ominfra-0.0.0.dev439 → ominfra-0.0.0.dev441}/ominfra/supervisor/__main__.py +0 -0
- {ominfra-0.0.0.dev439 → ominfra-0.0.0.dev441}/ominfra/supervisor/configs.py +0 -0
- {ominfra-0.0.0.dev439 → ominfra-0.0.0.dev441}/ominfra/supervisor/dispatchers.py +0 -0
- {ominfra-0.0.0.dev439 → ominfra-0.0.0.dev441}/ominfra/supervisor/dispatchersimpl.py +0 -0
- {ominfra-0.0.0.dev439 → ominfra-0.0.0.dev441}/ominfra/supervisor/errors.py +0 -0
- {ominfra-0.0.0.dev439 → ominfra-0.0.0.dev441}/ominfra/supervisor/events.py +0 -0
- {ominfra-0.0.0.dev439 → ominfra-0.0.0.dev441}/ominfra/supervisor/groups.py +0 -0
- {ominfra-0.0.0.dev439 → ominfra-0.0.0.dev441}/ominfra/supervisor/groupsimpl.py +0 -0
- {ominfra-0.0.0.dev439 → ominfra-0.0.0.dev441}/ominfra/supervisor/http.py +0 -0
- {ominfra-0.0.0.dev439 → ominfra-0.0.0.dev441}/ominfra/supervisor/inject.py +0 -0
- {ominfra-0.0.0.dev439 → ominfra-0.0.0.dev441}/ominfra/supervisor/io.py +0 -0
- {ominfra-0.0.0.dev439 → ominfra-0.0.0.dev441}/ominfra/supervisor/main.py +0 -0
- {ominfra-0.0.0.dev439 → ominfra-0.0.0.dev441}/ominfra/supervisor/pipes.py +0 -0
- {ominfra-0.0.0.dev439 → ominfra-0.0.0.dev441}/ominfra/supervisor/privileges.py +0 -0
- {ominfra-0.0.0.dev439 → ominfra-0.0.0.dev441}/ominfra/supervisor/process.py +0 -0
- {ominfra-0.0.0.dev439 → ominfra-0.0.0.dev441}/ominfra/supervisor/processimpl.py +0 -0
- {ominfra-0.0.0.dev439 → ominfra-0.0.0.dev441}/ominfra/supervisor/setup.py +0 -0
- {ominfra-0.0.0.dev439 → ominfra-0.0.0.dev441}/ominfra/supervisor/setupimpl.py +0 -0
- {ominfra-0.0.0.dev439 → ominfra-0.0.0.dev441}/ominfra/supervisor/signals.py +0 -0
- {ominfra-0.0.0.dev439 → ominfra-0.0.0.dev441}/ominfra/supervisor/spawning.py +0 -0
- {ominfra-0.0.0.dev439 → ominfra-0.0.0.dev441}/ominfra/supervisor/spawningimpl.py +0 -0
- {ominfra-0.0.0.dev439 → ominfra-0.0.0.dev441}/ominfra/supervisor/states.py +0 -0
- {ominfra-0.0.0.dev439 → ominfra-0.0.0.dev441}/ominfra/supervisor/supervisor.py +0 -0
- {ominfra-0.0.0.dev439 → ominfra-0.0.0.dev441}/ominfra/supervisor/types.py +0 -0
- {ominfra-0.0.0.dev439 → ominfra-0.0.0.dev441}/ominfra/supervisor/utils/__init__.py +0 -0
- {ominfra-0.0.0.dev439 → ominfra-0.0.0.dev441}/ominfra/supervisor/utils/collections.py +0 -0
- {ominfra-0.0.0.dev439 → ominfra-0.0.0.dev441}/ominfra/supervisor/utils/diag.py +0 -0
- {ominfra-0.0.0.dev439 → ominfra-0.0.0.dev441}/ominfra/supervisor/utils/fds.py +0 -0
- {ominfra-0.0.0.dev439 → ominfra-0.0.0.dev441}/ominfra/supervisor/utils/fs.py +0 -0
- {ominfra-0.0.0.dev439 → ominfra-0.0.0.dev441}/ominfra/supervisor/utils/os.py +0 -0
- {ominfra-0.0.0.dev439 → ominfra-0.0.0.dev441}/ominfra/supervisor/utils/ostypes.py +0 -0
- {ominfra-0.0.0.dev439 → ominfra-0.0.0.dev441}/ominfra/supervisor/utils/signals.py +0 -0
- {ominfra-0.0.0.dev439 → ominfra-0.0.0.dev441}/ominfra/supervisor/utils/strings.py +0 -0
- {ominfra-0.0.0.dev439 → ominfra-0.0.0.dev441}/ominfra/supervisor/utils/users.py +0 -0
- {ominfra-0.0.0.dev439 → ominfra-0.0.0.dev441}/ominfra/systemd.py +0 -0
- {ominfra-0.0.0.dev439 → ominfra-0.0.0.dev441}/ominfra/tailscale/__init__.py +0 -0
- {ominfra-0.0.0.dev439 → ominfra-0.0.0.dev441}/ominfra/tailscale/api.py +0 -0
- {ominfra-0.0.0.dev439 → ominfra-0.0.0.dev441}/ominfra/tailscale/cli.py +0 -0
- {ominfra-0.0.0.dev439 → ominfra-0.0.0.dev441}/ominfra/threadworkers.py +0 -0
- {ominfra-0.0.0.dev439 → ominfra-0.0.0.dev441}/ominfra/tools/__init__.py +0 -0
- {ominfra-0.0.0.dev439 → ominfra-0.0.0.dev441}/ominfra/tools/listresources.py +0 -0
- {ominfra-0.0.0.dev439 → ominfra-0.0.0.dev441}/ominfra.egg-info/SOURCES.txt +0 -0
- {ominfra-0.0.0.dev439 → ominfra-0.0.0.dev441}/ominfra.egg-info/dependency_links.txt +0 -0
- {ominfra-0.0.0.dev439 → ominfra-0.0.0.dev441}/ominfra.egg-info/entry_points.txt +0 -0
- {ominfra-0.0.0.dev439 → ominfra-0.0.0.dev441}/ominfra.egg-info/top_level.txt +0 -0
- {ominfra-0.0.0.dev439 → ominfra-0.0.0.dev441}/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.dev441
|
|
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.dev441
|
|
18
|
+
Requires-Dist: omlish==0.0.0.dev441
|
|
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
|
|
@@ -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,21 +1370,30 @@ class AttrOps(ta.Generic[T]):
|
|
|
1366
1370
|
def of(
|
|
1367
1371
|
cls,
|
|
1368
1372
|
o: ta.Union[
|
|
1369
|
-
str,
|
|
1370
|
-
ta.Tuple[str, str],
|
|
1371
1373
|
'AttrOps.Attr',
|
|
1374
|
+
str,
|
|
1375
|
+
ta.Tuple[str, ta.Union[str, ta.Mapping[str, ta.Any]]],
|
|
1376
|
+
ta.Mapping[str, ta.Any],
|
|
1372
1377
|
],
|
|
1373
1378
|
) -> 'AttrOps.Attr':
|
|
1374
1379
|
if isinstance(o, AttrOps.Attr):
|
|
1375
1380
|
return o
|
|
1376
1381
|
elif isinstance(o, str):
|
|
1377
1382
|
return cls(o)
|
|
1383
|
+
elif isinstance(o, tuple):
|
|
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)
|
|
1393
|
+
elif isinstance(o, ta.Mapping):
|
|
1394
|
+
return cls(**o)
|
|
1378
1395
|
else:
|
|
1379
|
-
|
|
1380
|
-
return cls(
|
|
1381
|
-
name,
|
|
1382
|
-
display=disp,
|
|
1383
|
-
)
|
|
1396
|
+
raise TypeError(o)
|
|
1384
1397
|
|
|
1385
1398
|
@property
|
|
1386
1399
|
def name(self) -> str:
|
|
@@ -1398,19 +1411,34 @@ class AttrOps(ta.Generic[T]):
|
|
|
1398
1411
|
def eq(self) -> bool:
|
|
1399
1412
|
return self._eq
|
|
1400
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
|
+
|
|
1401
1424
|
@ta.overload
|
|
1402
1425
|
def __init__(
|
|
1403
1426
|
self,
|
|
1404
1427
|
*attrs: ta.Sequence[ta.Union[
|
|
1405
1428
|
str,
|
|
1406
|
-
ta.Tuple[str, str],
|
|
1429
|
+
ta.Tuple[str, ta.Union[str, ta.Mapping[str, ta.Any]]],
|
|
1430
|
+
ta.Mapping[str, ta.Any],
|
|
1407
1431
|
Attr,
|
|
1408
1432
|
]],
|
|
1433
|
+
|
|
1409
1434
|
with_module: bool = False,
|
|
1410
1435
|
use_qualname: bool = False,
|
|
1411
1436
|
with_id: bool = False,
|
|
1437
|
+
terse: bool = False,
|
|
1412
1438
|
repr_filter: ta.Optional[ta.Callable[[ta.Any], bool]] = None,
|
|
1413
1439
|
recursive: bool = False,
|
|
1440
|
+
|
|
1441
|
+
cache_hash: ta.Union[bool, str] = False,
|
|
1414
1442
|
subtypes_eq: bool = False,
|
|
1415
1443
|
) -> None:
|
|
1416
1444
|
...
|
|
@@ -1420,16 +1448,20 @@ class AttrOps(ta.Generic[T]):
|
|
|
1420
1448
|
self,
|
|
1421
1449
|
attrs_fn: ta.Callable[[T], ta.Tuple[ta.Union[
|
|
1422
1450
|
ta.Any,
|
|
1423
|
-
ta.Tuple[str, ta.Any],
|
|
1451
|
+
ta.Tuple[ta.Any, ta.Union[str, ta.Mapping[str, ta.Any]]],
|
|
1424
1452
|
Attr,
|
|
1425
1453
|
], ...]],
|
|
1426
1454
|
/,
|
|
1427
1455
|
*,
|
|
1456
|
+
|
|
1428
1457
|
with_module: bool = False,
|
|
1429
1458
|
use_qualname: bool = False,
|
|
1430
1459
|
with_id: bool = False,
|
|
1460
|
+
terse: bool = False,
|
|
1431
1461
|
repr_filter: ta.Optional[ta.Callable[[ta.Any], bool]] = None,
|
|
1432
1462
|
recursive: bool = False,
|
|
1463
|
+
|
|
1464
|
+
cache_hash: ta.Union[bool, str] = False,
|
|
1433
1465
|
subtypes_eq: bool = False,
|
|
1434
1466
|
) -> None:
|
|
1435
1467
|
...
|
|
@@ -1437,11 +1469,15 @@ class AttrOps(ta.Generic[T]):
|
|
|
1437
1469
|
def __init__(
|
|
1438
1470
|
self,
|
|
1439
1471
|
*args,
|
|
1472
|
+
|
|
1440
1473
|
with_module=False,
|
|
1441
1474
|
use_qualname=False,
|
|
1442
1475
|
with_id=False,
|
|
1476
|
+
terse=False,
|
|
1443
1477
|
repr_filter=None,
|
|
1444
1478
|
recursive=False,
|
|
1479
|
+
|
|
1480
|
+
cache_hash=False,
|
|
1445
1481
|
subtypes_eq=False,
|
|
1446
1482
|
) -> None:
|
|
1447
1483
|
if args and len(args) == 1 and callable(args[0]):
|
|
@@ -1452,8 +1488,11 @@ class AttrOps(ta.Generic[T]):
|
|
|
1452
1488
|
self._with_module: bool = with_module
|
|
1453
1489
|
self._use_qualname: bool = use_qualname
|
|
1454
1490
|
self._with_id: bool = with_id
|
|
1491
|
+
self._terse: bool = terse
|
|
1455
1492
|
self._repr_filter: ta.Optional[ta.Callable[[ta.Any], bool]] = repr_filter
|
|
1456
1493
|
self._recursive: bool = recursive
|
|
1494
|
+
|
|
1495
|
+
self._cache_hash: ta.Union[bool, str] = cache_hash
|
|
1457
1496
|
self._subtypes_eq: bool = subtypes_eq
|
|
1458
1497
|
|
|
1459
1498
|
@property
|
|
@@ -1488,20 +1527,27 @@ class AttrOps(ta.Generic[T]):
|
|
|
1488
1527
|
|
|
1489
1528
|
attrs: ta.List[AttrOps.Attr] = []
|
|
1490
1529
|
for o in raw:
|
|
1491
|
-
if isinstance(o, AttrOps.Attr):
|
|
1492
|
-
attrs.append(o)
|
|
1530
|
+
if isinstance(o, (AttrOps.Attr, ta.Mapping)):
|
|
1531
|
+
attrs.append(AttrOps.Attr.of(o))
|
|
1493
1532
|
continue
|
|
1494
1533
|
|
|
1534
|
+
kw: ta.Mapping[str, ta.Any]
|
|
1495
1535
|
if isinstance(o, tuple):
|
|
1496
|
-
|
|
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)
|
|
1497
1543
|
else:
|
|
1498
|
-
|
|
1544
|
+
cap, kw = o, {}
|
|
1499
1545
|
|
|
1500
1546
|
path = tuple(rec(cap))
|
|
1501
1547
|
|
|
1502
1548
|
attrs.append(AttrOps.Attr(
|
|
1503
1549
|
'.'.join(path),
|
|
1504
|
-
|
|
1550
|
+
**kw,
|
|
1505
1551
|
))
|
|
1506
1552
|
|
|
1507
1553
|
return attrs
|
|
@@ -1518,19 +1564,27 @@ class AttrOps(ta.Generic[T]):
|
|
|
1518
1564
|
pass
|
|
1519
1565
|
|
|
1520
1566
|
def _repr(o: T) -> str:
|
|
1521
|
-
vs =
|
|
1522
|
-
|
|
1523
|
-
|
|
1524
|
-
|
|
1525
|
-
|
|
1526
|
-
if self._repr_filter is None
|
|
1527
|
-
|
|
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
|
|
1528
1582
|
|
|
1529
1583
|
return (
|
|
1530
1584
|
f'{o.__class__.__module__ + "." if self._with_module else ""}'
|
|
1531
1585
|
f'{o.__class__.__qualname__ if self._use_qualname else o.__class__.__name__}'
|
|
1532
1586
|
f'{("@" + hex(id(o))[2:]) if self._with_id else ""}' # noqa
|
|
1533
|
-
f'({vs})'
|
|
1587
|
+
f'({", ".join(vs)})'
|
|
1534
1588
|
)
|
|
1535
1589
|
|
|
1536
1590
|
if self._recursive:
|
|
@@ -1555,6 +1609,8 @@ class AttrOps(ta.Generic[T]):
|
|
|
1555
1609
|
|
|
1556
1610
|
#
|
|
1557
1611
|
|
|
1612
|
+
_DEFAULT_CACHED_HASH_ATTR: ta.ClassVar[str] = '__cached_hash__'
|
|
1613
|
+
|
|
1558
1614
|
_hash: ta.Callable[[T], int]
|
|
1559
1615
|
|
|
1560
1616
|
@property
|
|
@@ -1564,13 +1620,33 @@ class AttrOps(ta.Generic[T]):
|
|
|
1564
1620
|
except AttributeError:
|
|
1565
1621
|
pass
|
|
1566
1622
|
|
|
1567
|
-
def
|
|
1623
|
+
def _calc_hash(o: T) -> int:
|
|
1568
1624
|
return hash(tuple(
|
|
1569
1625
|
getattr(o, a._name) # noqa
|
|
1570
1626
|
for a in self._attrs
|
|
1571
1627
|
if a._hash # noqa
|
|
1572
1628
|
))
|
|
1573
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
|
+
|
|
1574
1650
|
self._hash = _hash
|
|
1575
1651
|
return _hash
|
|
1576
1652
|
|
|
@@ -1711,6 +1787,62 @@ def async_cached_nullary(fn): # ta.Callable[..., T]) -> ta.Callable[..., T]:
|
|
|
1711
1787
|
return _AsyncCachedNullary(fn)
|
|
1712
1788
|
|
|
1713
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
|
+
|
|
1714
1846
|
########################################
|
|
1715
1847
|
# ../../../../../omlish/lite/check.py
|
|
1716
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,21 +2549,30 @@ class AttrOps(ta.Generic[T]):
|
|
|
2545
2549
|
def of(
|
|
2546
2550
|
cls,
|
|
2547
2551
|
o: ta.Union[
|
|
2548
|
-
str,
|
|
2549
|
-
ta.Tuple[str, str],
|
|
2550
2552
|
'AttrOps.Attr',
|
|
2553
|
+
str,
|
|
2554
|
+
ta.Tuple[str, ta.Union[str, ta.Mapping[str, ta.Any]]],
|
|
2555
|
+
ta.Mapping[str, ta.Any],
|
|
2551
2556
|
],
|
|
2552
2557
|
) -> 'AttrOps.Attr':
|
|
2553
2558
|
if isinstance(o, AttrOps.Attr):
|
|
2554
2559
|
return o
|
|
2555
2560
|
elif isinstance(o, str):
|
|
2556
2561
|
return cls(o)
|
|
2562
|
+
elif isinstance(o, tuple):
|
|
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)
|
|
2572
|
+
elif isinstance(o, ta.Mapping):
|
|
2573
|
+
return cls(**o)
|
|
2557
2574
|
else:
|
|
2558
|
-
|
|
2559
|
-
return cls(
|
|
2560
|
-
name,
|
|
2561
|
-
display=disp,
|
|
2562
|
-
)
|
|
2575
|
+
raise TypeError(o)
|
|
2563
2576
|
|
|
2564
2577
|
@property
|
|
2565
2578
|
def name(self) -> str:
|
|
@@ -2577,19 +2590,34 @@ class AttrOps(ta.Generic[T]):
|
|
|
2577
2590
|
def eq(self) -> bool:
|
|
2578
2591
|
return self._eq
|
|
2579
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
|
+
|
|
2580
2603
|
@ta.overload
|
|
2581
2604
|
def __init__(
|
|
2582
2605
|
self,
|
|
2583
2606
|
*attrs: ta.Sequence[ta.Union[
|
|
2584
2607
|
str,
|
|
2585
|
-
ta.Tuple[str, str],
|
|
2608
|
+
ta.Tuple[str, ta.Union[str, ta.Mapping[str, ta.Any]]],
|
|
2609
|
+
ta.Mapping[str, ta.Any],
|
|
2586
2610
|
Attr,
|
|
2587
2611
|
]],
|
|
2612
|
+
|
|
2588
2613
|
with_module: bool = False,
|
|
2589
2614
|
use_qualname: bool = False,
|
|
2590
2615
|
with_id: bool = False,
|
|
2616
|
+
terse: bool = False,
|
|
2591
2617
|
repr_filter: ta.Optional[ta.Callable[[ta.Any], bool]] = None,
|
|
2592
2618
|
recursive: bool = False,
|
|
2619
|
+
|
|
2620
|
+
cache_hash: ta.Union[bool, str] = False,
|
|
2593
2621
|
subtypes_eq: bool = False,
|
|
2594
2622
|
) -> None:
|
|
2595
2623
|
...
|
|
@@ -2599,16 +2627,20 @@ class AttrOps(ta.Generic[T]):
|
|
|
2599
2627
|
self,
|
|
2600
2628
|
attrs_fn: ta.Callable[[T], ta.Tuple[ta.Union[
|
|
2601
2629
|
ta.Any,
|
|
2602
|
-
ta.Tuple[str, ta.Any],
|
|
2630
|
+
ta.Tuple[ta.Any, ta.Union[str, ta.Mapping[str, ta.Any]]],
|
|
2603
2631
|
Attr,
|
|
2604
2632
|
], ...]],
|
|
2605
2633
|
/,
|
|
2606
2634
|
*,
|
|
2635
|
+
|
|
2607
2636
|
with_module: bool = False,
|
|
2608
2637
|
use_qualname: bool = False,
|
|
2609
2638
|
with_id: bool = False,
|
|
2639
|
+
terse: bool = False,
|
|
2610
2640
|
repr_filter: ta.Optional[ta.Callable[[ta.Any], bool]] = None,
|
|
2611
2641
|
recursive: bool = False,
|
|
2642
|
+
|
|
2643
|
+
cache_hash: ta.Union[bool, str] = False,
|
|
2612
2644
|
subtypes_eq: bool = False,
|
|
2613
2645
|
) -> None:
|
|
2614
2646
|
...
|
|
@@ -2616,11 +2648,15 @@ class AttrOps(ta.Generic[T]):
|
|
|
2616
2648
|
def __init__(
|
|
2617
2649
|
self,
|
|
2618
2650
|
*args,
|
|
2651
|
+
|
|
2619
2652
|
with_module=False,
|
|
2620
2653
|
use_qualname=False,
|
|
2621
2654
|
with_id=False,
|
|
2655
|
+
terse=False,
|
|
2622
2656
|
repr_filter=None,
|
|
2623
2657
|
recursive=False,
|
|
2658
|
+
|
|
2659
|
+
cache_hash=False,
|
|
2624
2660
|
subtypes_eq=False,
|
|
2625
2661
|
) -> None:
|
|
2626
2662
|
if args and len(args) == 1 and callable(args[0]):
|
|
@@ -2631,8 +2667,11 @@ class AttrOps(ta.Generic[T]):
|
|
|
2631
2667
|
self._with_module: bool = with_module
|
|
2632
2668
|
self._use_qualname: bool = use_qualname
|
|
2633
2669
|
self._with_id: bool = with_id
|
|
2670
|
+
self._terse: bool = terse
|
|
2634
2671
|
self._repr_filter: ta.Optional[ta.Callable[[ta.Any], bool]] = repr_filter
|
|
2635
2672
|
self._recursive: bool = recursive
|
|
2673
|
+
|
|
2674
|
+
self._cache_hash: ta.Union[bool, str] = cache_hash
|
|
2636
2675
|
self._subtypes_eq: bool = subtypes_eq
|
|
2637
2676
|
|
|
2638
2677
|
@property
|
|
@@ -2667,20 +2706,27 @@ class AttrOps(ta.Generic[T]):
|
|
|
2667
2706
|
|
|
2668
2707
|
attrs: ta.List[AttrOps.Attr] = []
|
|
2669
2708
|
for o in raw:
|
|
2670
|
-
if isinstance(o, AttrOps.Attr):
|
|
2671
|
-
attrs.append(o)
|
|
2709
|
+
if isinstance(o, (AttrOps.Attr, ta.Mapping)):
|
|
2710
|
+
attrs.append(AttrOps.Attr.of(o))
|
|
2672
2711
|
continue
|
|
2673
2712
|
|
|
2713
|
+
kw: ta.Mapping[str, ta.Any]
|
|
2674
2714
|
if isinstance(o, tuple):
|
|
2675
|
-
|
|
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)
|
|
2676
2722
|
else:
|
|
2677
|
-
|
|
2723
|
+
cap, kw = o, {}
|
|
2678
2724
|
|
|
2679
2725
|
path = tuple(rec(cap))
|
|
2680
2726
|
|
|
2681
2727
|
attrs.append(AttrOps.Attr(
|
|
2682
2728
|
'.'.join(path),
|
|
2683
|
-
|
|
2729
|
+
**kw,
|
|
2684
2730
|
))
|
|
2685
2731
|
|
|
2686
2732
|
return attrs
|
|
@@ -2697,19 +2743,27 @@ class AttrOps(ta.Generic[T]):
|
|
|
2697
2743
|
pass
|
|
2698
2744
|
|
|
2699
2745
|
def _repr(o: T) -> str:
|
|
2700
|
-
vs =
|
|
2701
|
-
|
|
2702
|
-
|
|
2703
|
-
|
|
2704
|
-
|
|
2705
|
-
if self._repr_filter is None
|
|
2706
|
-
|
|
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
|
|
2707
2761
|
|
|
2708
2762
|
return (
|
|
2709
2763
|
f'{o.__class__.__module__ + "." if self._with_module else ""}'
|
|
2710
2764
|
f'{o.__class__.__qualname__ if self._use_qualname else o.__class__.__name__}'
|
|
2711
2765
|
f'{("@" + hex(id(o))[2:]) if self._with_id else ""}' # noqa
|
|
2712
|
-
f'({vs})'
|
|
2766
|
+
f'({", ".join(vs)})'
|
|
2713
2767
|
)
|
|
2714
2768
|
|
|
2715
2769
|
if self._recursive:
|
|
@@ -2734,6 +2788,8 @@ class AttrOps(ta.Generic[T]):
|
|
|
2734
2788
|
|
|
2735
2789
|
#
|
|
2736
2790
|
|
|
2791
|
+
_DEFAULT_CACHED_HASH_ATTR: ta.ClassVar[str] = '__cached_hash__'
|
|
2792
|
+
|
|
2737
2793
|
_hash: ta.Callable[[T], int]
|
|
2738
2794
|
|
|
2739
2795
|
@property
|
|
@@ -2743,13 +2799,33 @@ class AttrOps(ta.Generic[T]):
|
|
|
2743
2799
|
except AttributeError:
|
|
2744
2800
|
pass
|
|
2745
2801
|
|
|
2746
|
-
def
|
|
2802
|
+
def _calc_hash(o: T) -> int:
|
|
2747
2803
|
return hash(tuple(
|
|
2748
2804
|
getattr(o, a._name) # noqa
|
|
2749
2805
|
for a in self._attrs
|
|
2750
2806
|
if a._hash # noqa
|
|
2751
2807
|
))
|
|
2752
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
|
+
|
|
2753
2829
|
self._hash = _hash
|
|
2754
2830
|
return _hash
|
|
2755
2831
|
|
|
@@ -2890,6 +2966,62 @@ def async_cached_nullary(fn): # ta.Callable[..., T]) -> ta.Callable[..., T]:
|
|
|
2890
2966
|
return _AsyncCachedNullary(fn)
|
|
2891
2967
|
|
|
2892
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
|
+
|
|
2893
3025
|
########################################
|
|
2894
3026
|
# ../../../omlish/lite/check.py
|
|
2895
3027
|
"""
|