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.

Files changed (171) hide show
  1. {ominfra-0.0.0.dev440/ominfra.egg-info → ominfra-0.0.0.dev442}/PKG-INFO +3 -3
  2. ominfra-0.0.0.dev442/ominfra/clouds/aws/instancetypes/cache.json.gz +0 -0
  3. {ominfra-0.0.0.dev440 → ominfra-0.0.0.dev442}/ominfra/clouds/aws/models/services/ec2.py +2 -0
  4. {ominfra-0.0.0.dev440 → ominfra-0.0.0.dev442}/ominfra/scripts/journald2aws.py +147 -21
  5. {ominfra-0.0.0.dev440 → ominfra-0.0.0.dev442}/ominfra/scripts/manage.py +147 -23
  6. {ominfra-0.0.0.dev440 → ominfra-0.0.0.dev442}/ominfra/scripts/supervisor.py +232 -71
  7. {ominfra-0.0.0.dev440 → ominfra-0.0.0.dev442/ominfra.egg-info}/PKG-INFO +3 -3
  8. {ominfra-0.0.0.dev440 → ominfra-0.0.0.dev442}/ominfra.egg-info/requires.txt +2 -2
  9. {ominfra-0.0.0.dev440 → ominfra-0.0.0.dev442}/pyproject.toml +3 -3
  10. ominfra-0.0.0.dev440/ominfra/clouds/aws/instancetypes/cache.json.gz +0 -0
  11. {ominfra-0.0.0.dev440 → ominfra-0.0.0.dev442}/LICENSE +0 -0
  12. {ominfra-0.0.0.dev440 → ominfra-0.0.0.dev442}/MANIFEST.in +0 -0
  13. {ominfra-0.0.0.dev440 → ominfra-0.0.0.dev442}/README.md +0 -0
  14. {ominfra-0.0.0.dev440 → ominfra-0.0.0.dev442}/ominfra/.omlish-manifests.json +0 -0
  15. {ominfra-0.0.0.dev440 → ominfra-0.0.0.dev442}/ominfra/__about__.py +0 -0
  16. {ominfra-0.0.0.dev440 → ominfra-0.0.0.dev442}/ominfra/__init__.py +0 -0
  17. {ominfra-0.0.0.dev440 → ominfra-0.0.0.dev442}/ominfra/clouds/__init__.py +0 -0
  18. {ominfra-0.0.0.dev440 → ominfra-0.0.0.dev442}/ominfra/clouds/aws/__init__.py +0 -0
  19. {ominfra-0.0.0.dev440 → ominfra-0.0.0.dev442}/ominfra/clouds/aws/__main__.py +0 -0
  20. {ominfra-0.0.0.dev440 → ominfra-0.0.0.dev442}/ominfra/clouds/aws/auth.py +0 -0
  21. {ominfra-0.0.0.dev440 → ominfra-0.0.0.dev442}/ominfra/clouds/aws/cli.py +0 -0
  22. {ominfra-0.0.0.dev440 → ominfra-0.0.0.dev442}/ominfra/clouds/aws/dataclasses.py +0 -0
  23. {ominfra-0.0.0.dev440 → ominfra-0.0.0.dev442}/ominfra/clouds/aws/instancetypes/__init__.py +0 -0
  24. {ominfra-0.0.0.dev440 → ominfra-0.0.0.dev442}/ominfra/clouds/aws/instancetypes/__main__.py +0 -0
  25. {ominfra-0.0.0.dev440 → ominfra-0.0.0.dev442}/ominfra/clouds/aws/instancetypes/cache.py +0 -0
  26. {ominfra-0.0.0.dev440 → ominfra-0.0.0.dev442}/ominfra/clouds/aws/instancetypes/cli.py +0 -0
  27. {ominfra-0.0.0.dev440 → ominfra-0.0.0.dev442}/ominfra/clouds/aws/journald2aws/__init__.py +0 -0
  28. {ominfra-0.0.0.dev440 → ominfra-0.0.0.dev442}/ominfra/clouds/aws/journald2aws/__main__.py +0 -0
  29. {ominfra-0.0.0.dev440 → ominfra-0.0.0.dev442}/ominfra/clouds/aws/journald2aws/cursor.py +0 -0
  30. {ominfra-0.0.0.dev440 → ominfra-0.0.0.dev442}/ominfra/clouds/aws/journald2aws/driver.py +0 -0
  31. {ominfra-0.0.0.dev440 → ominfra-0.0.0.dev442}/ominfra/clouds/aws/journald2aws/main.py +0 -0
  32. {ominfra-0.0.0.dev440 → ominfra-0.0.0.dev442}/ominfra/clouds/aws/journald2aws/poster.py +0 -0
  33. {ominfra-0.0.0.dev440 → ominfra-0.0.0.dev442}/ominfra/clouds/aws/logs.py +0 -0
  34. {ominfra-0.0.0.dev440 → ominfra-0.0.0.dev442}/ominfra/clouds/aws/metadata.py +0 -0
  35. {ominfra-0.0.0.dev440 → ominfra-0.0.0.dev442}/ominfra/clouds/aws/models/__init__.py +0 -0
  36. {ominfra-0.0.0.dev440 → ominfra-0.0.0.dev442}/ominfra/clouds/aws/models/base.py +0 -0
  37. {ominfra-0.0.0.dev440 → ominfra-0.0.0.dev442}/ominfra/clouds/aws/models/gen/__init__.py +0 -0
  38. {ominfra-0.0.0.dev440 → ominfra-0.0.0.dev442}/ominfra/clouds/aws/models/gen/__main__.py +0 -0
  39. {ominfra-0.0.0.dev440 → ominfra-0.0.0.dev442}/ominfra/clouds/aws/models/gen/cli.py +0 -0
  40. {ominfra-0.0.0.dev440 → ominfra-0.0.0.dev442}/ominfra/clouds/aws/models/gen/gen.py +0 -0
  41. {ominfra-0.0.0.dev440 → ominfra-0.0.0.dev442}/ominfra/clouds/aws/models/services/__init__.py +0 -0
  42. {ominfra-0.0.0.dev440 → ominfra-0.0.0.dev442}/ominfra/clouds/aws/models/services/lambda_.py +0 -0
  43. {ominfra-0.0.0.dev440 → ominfra-0.0.0.dev442}/ominfra/clouds/aws/models/services/rds.py +0 -0
  44. {ominfra-0.0.0.dev440 → ominfra-0.0.0.dev442}/ominfra/clouds/aws/models/services/s3.py +0 -0
  45. {ominfra-0.0.0.dev440 → ominfra-0.0.0.dev442}/ominfra/clouds/aws/models/services/services.toml +0 -0
  46. {ominfra-0.0.0.dev440 → ominfra-0.0.0.dev442}/ominfra/clouds/gcp/__init__.py +0 -0
  47. {ominfra-0.0.0.dev440 → ominfra-0.0.0.dev442}/ominfra/clouds/gcp/api.py +0 -0
  48. {ominfra-0.0.0.dev440 → ominfra-0.0.0.dev442}/ominfra/clouds/gcp/auth.py +0 -0
  49. {ominfra-0.0.0.dev440 → ominfra-0.0.0.dev442}/ominfra/commands/__init__.py +0 -0
  50. {ominfra-0.0.0.dev440 → ominfra-0.0.0.dev442}/ominfra/commands/runners.py +0 -0
  51. {ominfra-0.0.0.dev440 → ominfra-0.0.0.dev442}/ominfra/commands/ssh.py +0 -0
  52. {ominfra-0.0.0.dev440 → ominfra-0.0.0.dev442}/ominfra/journald/__init__.py +0 -0
  53. {ominfra-0.0.0.dev440 → ominfra-0.0.0.dev442}/ominfra/journald/fields.py +0 -0
  54. {ominfra-0.0.0.dev440 → ominfra-0.0.0.dev442}/ominfra/journald/genmessages.py +0 -0
  55. {ominfra-0.0.0.dev440 → ominfra-0.0.0.dev442}/ominfra/journald/messages.py +0 -0
  56. {ominfra-0.0.0.dev440 → ominfra-0.0.0.dev442}/ominfra/journald/tailer.py +0 -0
  57. {ominfra-0.0.0.dev440 → ominfra-0.0.0.dev442}/ominfra/manage/__init__.py +0 -0
  58. {ominfra-0.0.0.dev440 → ominfra-0.0.0.dev442}/ominfra/manage/__main__.py +0 -0
  59. {ominfra-0.0.0.dev440 → ominfra-0.0.0.dev442}/ominfra/manage/bootstrap.py +0 -0
  60. {ominfra-0.0.0.dev440 → ominfra-0.0.0.dev442}/ominfra/manage/bootstrap_.py +0 -0
  61. {ominfra-0.0.0.dev440 → ominfra-0.0.0.dev442}/ominfra/manage/commands/__init__.py +0 -0
  62. {ominfra-0.0.0.dev440 → ominfra-0.0.0.dev442}/ominfra/manage/commands/base.py +0 -0
  63. {ominfra-0.0.0.dev440 → ominfra-0.0.0.dev442}/ominfra/manage/commands/inject.py +0 -0
  64. {ominfra-0.0.0.dev440 → ominfra-0.0.0.dev442}/ominfra/manage/commands/injection.py +0 -0
  65. {ominfra-0.0.0.dev440 → ominfra-0.0.0.dev442}/ominfra/manage/commands/local.py +0 -0
  66. {ominfra-0.0.0.dev440 → ominfra-0.0.0.dev442}/ominfra/manage/commands/marshal.py +0 -0
  67. {ominfra-0.0.0.dev440 → ominfra-0.0.0.dev442}/ominfra/manage/commands/ping.py +0 -0
  68. {ominfra-0.0.0.dev440 → ominfra-0.0.0.dev442}/ominfra/manage/commands/subprocess.py +0 -0
  69. {ominfra-0.0.0.dev440 → ominfra-0.0.0.dev442}/ominfra/manage/commands/types.py +0 -0
  70. {ominfra-0.0.0.dev440 → ominfra-0.0.0.dev442}/ominfra/manage/config.py +0 -0
  71. {ominfra-0.0.0.dev440 → ominfra-0.0.0.dev442}/ominfra/manage/deploy/__init__.py +0 -0
  72. {ominfra-0.0.0.dev440 → ominfra-0.0.0.dev442}/ominfra/manage/deploy/apps.py +0 -0
  73. {ominfra-0.0.0.dev440 → ominfra-0.0.0.dev442}/ominfra/manage/deploy/commands.py +0 -0
  74. {ominfra-0.0.0.dev440 → ominfra-0.0.0.dev442}/ominfra/manage/deploy/conf/__init__.py +0 -0
  75. {ominfra-0.0.0.dev440 → ominfra-0.0.0.dev442}/ominfra/manage/deploy/conf/inject.py +0 -0
  76. {ominfra-0.0.0.dev440 → ominfra-0.0.0.dev442}/ominfra/manage/deploy/conf/manager.py +0 -0
  77. {ominfra-0.0.0.dev440 → ominfra-0.0.0.dev442}/ominfra/manage/deploy/conf/specs.py +0 -0
  78. {ominfra-0.0.0.dev440 → ominfra-0.0.0.dev442}/ominfra/manage/deploy/config.py +0 -0
  79. {ominfra-0.0.0.dev440 → ominfra-0.0.0.dev442}/ominfra/manage/deploy/deploy.py +0 -0
  80. {ominfra-0.0.0.dev440 → ominfra-0.0.0.dev442}/ominfra/manage/deploy/git.py +0 -0
  81. {ominfra-0.0.0.dev440 → ominfra-0.0.0.dev442}/ominfra/manage/deploy/inject.py +0 -0
  82. {ominfra-0.0.0.dev440 → ominfra-0.0.0.dev442}/ominfra/manage/deploy/injection.py +0 -0
  83. {ominfra-0.0.0.dev440 → ominfra-0.0.0.dev442}/ominfra/manage/deploy/interp.py +0 -0
  84. {ominfra-0.0.0.dev440 → ominfra-0.0.0.dev442}/ominfra/manage/deploy/nginx.py +0 -0
  85. {ominfra-0.0.0.dev440 → ominfra-0.0.0.dev442}/ominfra/manage/deploy/paths/__init__.py +0 -0
  86. {ominfra-0.0.0.dev440 → ominfra-0.0.0.dev442}/ominfra/manage/deploy/paths/inject.py +0 -0
  87. {ominfra-0.0.0.dev440 → ominfra-0.0.0.dev442}/ominfra/manage/deploy/paths/manager.py +0 -0
  88. {ominfra-0.0.0.dev440 → ominfra-0.0.0.dev442}/ominfra/manage/deploy/paths/owners.py +0 -0
  89. {ominfra-0.0.0.dev440 → ominfra-0.0.0.dev442}/ominfra/manage/deploy/paths/paths.py +0 -0
  90. {ominfra-0.0.0.dev440 → ominfra-0.0.0.dev442}/ominfra/manage/deploy/paths/specs.py +0 -0
  91. {ominfra-0.0.0.dev440 → ominfra-0.0.0.dev442}/ominfra/manage/deploy/paths/types.py +0 -0
  92. {ominfra-0.0.0.dev440 → ominfra-0.0.0.dev442}/ominfra/manage/deploy/specs.py +0 -0
  93. {ominfra-0.0.0.dev440 → ominfra-0.0.0.dev442}/ominfra/manage/deploy/systemd.py +0 -0
  94. {ominfra-0.0.0.dev440 → ominfra-0.0.0.dev442}/ominfra/manage/deploy/tags.py +0 -0
  95. {ominfra-0.0.0.dev440 → ominfra-0.0.0.dev442}/ominfra/manage/deploy/tmp.py +0 -0
  96. {ominfra-0.0.0.dev440 → ominfra-0.0.0.dev442}/ominfra/manage/deploy/types.py +0 -0
  97. {ominfra-0.0.0.dev440 → ominfra-0.0.0.dev442}/ominfra/manage/deploy/venvs.py +0 -0
  98. {ominfra-0.0.0.dev440 → ominfra-0.0.0.dev442}/ominfra/manage/inject.py +0 -0
  99. {ominfra-0.0.0.dev440 → ominfra-0.0.0.dev442}/ominfra/manage/main.py +0 -0
  100. {ominfra-0.0.0.dev440 → ominfra-0.0.0.dev442}/ominfra/manage/marshal.py +0 -0
  101. {ominfra-0.0.0.dev440 → ominfra-0.0.0.dev442}/ominfra/manage/remote/__init__.py +0 -0
  102. {ominfra-0.0.0.dev440 → ominfra-0.0.0.dev442}/ominfra/manage/remote/_main.py +0 -0
  103. {ominfra-0.0.0.dev440 → ominfra-0.0.0.dev442}/ominfra/manage/remote/channel.py +0 -0
  104. {ominfra-0.0.0.dev440 → ominfra-0.0.0.dev442}/ominfra/manage/remote/config.py +0 -0
  105. {ominfra-0.0.0.dev440 → ominfra-0.0.0.dev442}/ominfra/manage/remote/connection.py +0 -0
  106. {ominfra-0.0.0.dev440 → ominfra-0.0.0.dev442}/ominfra/manage/remote/execution.py +0 -0
  107. {ominfra-0.0.0.dev440 → ominfra-0.0.0.dev442}/ominfra/manage/remote/inject.py +0 -0
  108. {ominfra-0.0.0.dev440 → ominfra-0.0.0.dev442}/ominfra/manage/remote/payload.py +0 -0
  109. {ominfra-0.0.0.dev440 → ominfra-0.0.0.dev442}/ominfra/manage/remote/spawning.py +0 -0
  110. {ominfra-0.0.0.dev440 → ominfra-0.0.0.dev442}/ominfra/manage/system/__init__.py +0 -0
  111. {ominfra-0.0.0.dev440 → ominfra-0.0.0.dev442}/ominfra/manage/system/commands.py +0 -0
  112. {ominfra-0.0.0.dev440 → ominfra-0.0.0.dev442}/ominfra/manage/system/config.py +0 -0
  113. {ominfra-0.0.0.dev440 → ominfra-0.0.0.dev442}/ominfra/manage/system/inject.py +0 -0
  114. {ominfra-0.0.0.dev440 → ominfra-0.0.0.dev442}/ominfra/manage/system/packages.py +0 -0
  115. {ominfra-0.0.0.dev440 → ominfra-0.0.0.dev442}/ominfra/manage/system/platforms.py +0 -0
  116. {ominfra-0.0.0.dev440 → ominfra-0.0.0.dev442}/ominfra/manage/targets/__init__.py +0 -0
  117. {ominfra-0.0.0.dev440 → ominfra-0.0.0.dev442}/ominfra/manage/targets/bestpython.py +0 -0
  118. {ominfra-0.0.0.dev440 → ominfra-0.0.0.dev442}/ominfra/manage/targets/bestpython.sh +0 -0
  119. {ominfra-0.0.0.dev440 → ominfra-0.0.0.dev442}/ominfra/manage/targets/connection.py +0 -0
  120. {ominfra-0.0.0.dev440 → ominfra-0.0.0.dev442}/ominfra/manage/targets/inject.py +0 -0
  121. {ominfra-0.0.0.dev440 → ominfra-0.0.0.dev442}/ominfra/manage/targets/targets.py +0 -0
  122. {ominfra-0.0.0.dev440 → ominfra-0.0.0.dev442}/ominfra/pyremote.py +0 -0
  123. {ominfra-0.0.0.dev440 → ominfra-0.0.0.dev442}/ominfra/scripts/__init__.py +0 -0
  124. {ominfra-0.0.0.dev440 → ominfra-0.0.0.dev442}/ominfra/supervisor/LICENSE.txt +0 -0
  125. {ominfra-0.0.0.dev440 → ominfra-0.0.0.dev442}/ominfra/supervisor/__init__.py +0 -0
  126. {ominfra-0.0.0.dev440 → ominfra-0.0.0.dev442}/ominfra/supervisor/__main__.py +0 -0
  127. {ominfra-0.0.0.dev440 → ominfra-0.0.0.dev442}/ominfra/supervisor/configs.py +0 -0
  128. {ominfra-0.0.0.dev440 → ominfra-0.0.0.dev442}/ominfra/supervisor/dispatchers.py +0 -0
  129. {ominfra-0.0.0.dev440 → ominfra-0.0.0.dev442}/ominfra/supervisor/dispatchersimpl.py +0 -0
  130. {ominfra-0.0.0.dev440 → ominfra-0.0.0.dev442}/ominfra/supervisor/errors.py +0 -0
  131. {ominfra-0.0.0.dev440 → ominfra-0.0.0.dev442}/ominfra/supervisor/events.py +0 -0
  132. {ominfra-0.0.0.dev440 → ominfra-0.0.0.dev442}/ominfra/supervisor/groups.py +0 -0
  133. {ominfra-0.0.0.dev440 → ominfra-0.0.0.dev442}/ominfra/supervisor/groupsimpl.py +0 -0
  134. {ominfra-0.0.0.dev440 → ominfra-0.0.0.dev442}/ominfra/supervisor/http.py +0 -0
  135. {ominfra-0.0.0.dev440 → ominfra-0.0.0.dev442}/ominfra/supervisor/inject.py +0 -0
  136. {ominfra-0.0.0.dev440 → ominfra-0.0.0.dev442}/ominfra/supervisor/io.py +0 -0
  137. {ominfra-0.0.0.dev440 → ominfra-0.0.0.dev442}/ominfra/supervisor/main.py +0 -0
  138. {ominfra-0.0.0.dev440 → ominfra-0.0.0.dev442}/ominfra/supervisor/pipes.py +0 -0
  139. {ominfra-0.0.0.dev440 → ominfra-0.0.0.dev442}/ominfra/supervisor/privileges.py +0 -0
  140. {ominfra-0.0.0.dev440 → ominfra-0.0.0.dev442}/ominfra/supervisor/process.py +0 -0
  141. {ominfra-0.0.0.dev440 → ominfra-0.0.0.dev442}/ominfra/supervisor/processimpl.py +0 -0
  142. {ominfra-0.0.0.dev440 → ominfra-0.0.0.dev442}/ominfra/supervisor/setup.py +0 -0
  143. {ominfra-0.0.0.dev440 → ominfra-0.0.0.dev442}/ominfra/supervisor/setupimpl.py +0 -0
  144. {ominfra-0.0.0.dev440 → ominfra-0.0.0.dev442}/ominfra/supervisor/signals.py +0 -0
  145. {ominfra-0.0.0.dev440 → ominfra-0.0.0.dev442}/ominfra/supervisor/spawning.py +0 -0
  146. {ominfra-0.0.0.dev440 → ominfra-0.0.0.dev442}/ominfra/supervisor/spawningimpl.py +0 -0
  147. {ominfra-0.0.0.dev440 → ominfra-0.0.0.dev442}/ominfra/supervisor/states.py +0 -0
  148. {ominfra-0.0.0.dev440 → ominfra-0.0.0.dev442}/ominfra/supervisor/supervisor.py +0 -0
  149. {ominfra-0.0.0.dev440 → ominfra-0.0.0.dev442}/ominfra/supervisor/types.py +0 -0
  150. {ominfra-0.0.0.dev440 → ominfra-0.0.0.dev442}/ominfra/supervisor/utils/__init__.py +0 -0
  151. {ominfra-0.0.0.dev440 → ominfra-0.0.0.dev442}/ominfra/supervisor/utils/collections.py +0 -0
  152. {ominfra-0.0.0.dev440 → ominfra-0.0.0.dev442}/ominfra/supervisor/utils/diag.py +0 -0
  153. {ominfra-0.0.0.dev440 → ominfra-0.0.0.dev442}/ominfra/supervisor/utils/fds.py +0 -0
  154. {ominfra-0.0.0.dev440 → ominfra-0.0.0.dev442}/ominfra/supervisor/utils/fs.py +0 -0
  155. {ominfra-0.0.0.dev440 → ominfra-0.0.0.dev442}/ominfra/supervisor/utils/os.py +0 -0
  156. {ominfra-0.0.0.dev440 → ominfra-0.0.0.dev442}/ominfra/supervisor/utils/ostypes.py +0 -0
  157. {ominfra-0.0.0.dev440 → ominfra-0.0.0.dev442}/ominfra/supervisor/utils/signals.py +0 -0
  158. {ominfra-0.0.0.dev440 → ominfra-0.0.0.dev442}/ominfra/supervisor/utils/strings.py +0 -0
  159. {ominfra-0.0.0.dev440 → ominfra-0.0.0.dev442}/ominfra/supervisor/utils/users.py +0 -0
  160. {ominfra-0.0.0.dev440 → ominfra-0.0.0.dev442}/ominfra/systemd.py +0 -0
  161. {ominfra-0.0.0.dev440 → ominfra-0.0.0.dev442}/ominfra/tailscale/__init__.py +0 -0
  162. {ominfra-0.0.0.dev440 → ominfra-0.0.0.dev442}/ominfra/tailscale/api.py +0 -0
  163. {ominfra-0.0.0.dev440 → ominfra-0.0.0.dev442}/ominfra/tailscale/cli.py +0 -0
  164. {ominfra-0.0.0.dev440 → ominfra-0.0.0.dev442}/ominfra/threadworkers.py +0 -0
  165. {ominfra-0.0.0.dev440 → ominfra-0.0.0.dev442}/ominfra/tools/__init__.py +0 -0
  166. {ominfra-0.0.0.dev440 → ominfra-0.0.0.dev442}/ominfra/tools/listresources.py +0 -0
  167. {ominfra-0.0.0.dev440 → ominfra-0.0.0.dev442}/ominfra.egg-info/SOURCES.txt +0 -0
  168. {ominfra-0.0.0.dev440 → ominfra-0.0.0.dev442}/ominfra.egg-info/dependency_links.txt +0 -0
  169. {ominfra-0.0.0.dev440 → ominfra-0.0.0.dev442}/ominfra.egg-info/entry_points.txt +0 -0
  170. {ominfra-0.0.0.dev440 → ominfra-0.0.0.dev442}/ominfra.egg-info/top_level.txt +0 -0
  171. {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.dev440
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.dev440
18
- Requires-Dist: omlish==0.0.0.dev440
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"
@@ -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, disp = o
1381
- return cls(
1382
- name,
1383
- display=disp,
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
- disp, cap, = o
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
- disp, cap = None, o
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
- display=disp,
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 = ', '.join(
1528
- f'{a._display}={v!r}' # noqa
1529
- for a in self._attrs
1530
- if a._repr # noqa
1531
- for v in [getattr(o, a._name)] # noqa
1532
- if self._repr_filter is None or self._repr_filter(v)
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 _hash(o: T) -> int:
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, disp = o
2560
- return cls(
2561
- name,
2562
- display=disp,
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
- disp, cap, = o
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
- disp, cap = None, o
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
- display=disp,
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 = ', '.join(
2707
- f'{a._display}={v!r}' # noqa
2708
- for a in self._attrs
2709
- if a._repr # noqa
2710
- for v in [getattr(o, a._name)] # noqa
2711
- if self._repr_filter is None or self._repr_filter(v)
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 _hash(o: T) -> int:
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