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.

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