omdev 0.0.0.dev431__tar.gz → 0.0.0.dev433__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.
Files changed (333) hide show
  1. {omdev-0.0.0.dev431/omdev.egg-info → omdev-0.0.0.dev433}/PKG-INFO +4 -4
  2. {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/.omlish-manifests.json +1 -1
  3. {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/__about__.py +1 -1
  4. {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/py/scripts/execstat.py +20 -20
  5. {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/scripts/ci.py +105 -39
  6. {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/scripts/interp.py +10 -6
  7. {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/scripts/pyproject.py +105 -39
  8. {omdev-0.0.0.dev431 → omdev-0.0.0.dev433/omdev.egg-info}/PKG-INFO +4 -4
  9. {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev.egg-info/requires.txt +3 -3
  10. {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/pyproject.toml +4 -4
  11. {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/LICENSE +0 -0
  12. {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/MANIFEST.in +0 -0
  13. {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/README.md +0 -0
  14. {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/__init__.py +0 -0
  15. {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/amalg/__init__.py +0 -0
  16. {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/amalg/__main__.py +0 -0
  17. {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/amalg/cli/__init__.py +0 -0
  18. {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/amalg/cli/main.py +0 -0
  19. {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/amalg/gen/__init__.py +0 -0
  20. {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/amalg/gen/gen.py +0 -0
  21. {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/amalg/gen/imports.py +0 -0
  22. {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/amalg/gen/manifests.py +0 -0
  23. {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/amalg/gen/resources.py +0 -0
  24. {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/amalg/gen/srcfiles.py +0 -0
  25. {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/amalg/gen/strip.py +0 -0
  26. {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/amalg/gen/types.py +0 -0
  27. {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/amalg/gen/typing.py +0 -0
  28. {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/amalg/sources.py +0 -0
  29. {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/cache/__init__.py +0 -0
  30. {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/cache/compute/__init__.py +0 -0
  31. {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/cache/compute/cache.py +0 -0
  32. {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/cache/compute/contexts.py +0 -0
  33. {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/cache/compute/currents.py +0 -0
  34. {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/cache/compute/fns.py +0 -0
  35. {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/cache/compute/resolvers.py +0 -0
  36. {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/cache/compute/storage.py +0 -0
  37. {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/cache/compute/types.py +0 -0
  38. {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/cache/data/__init__.py +0 -0
  39. {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/cache/data/actions.py +0 -0
  40. {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/cache/data/cache.py +0 -0
  41. {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/cache/data/consts.py +0 -0
  42. {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/cache/data/defaults.py +0 -0
  43. {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/cache/data/manifests.py +0 -0
  44. {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/cache/data/specs.py +0 -0
  45. {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/capi/__init__.py +0 -0
  46. {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/capi/darwin/__init__.py +0 -0
  47. {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/capi/darwin/aps.py +0 -0
  48. {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/capi/darwin/ax.py +0 -0
  49. {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/capi/darwin/cf.py +0 -0
  50. {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/capi/darwin/cg.py +0 -0
  51. {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/capi/linux/__init__.py +0 -0
  52. {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/capi/linux/x11.py +0 -0
  53. {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/cc/__init__.py +0 -0
  54. {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/cc/__main__.py +0 -0
  55. {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/cc/cdeps.py +0 -0
  56. {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/cc/cdeps.toml +0 -0
  57. {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/cc/cli.py +0 -0
  58. {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/cc/srclangs.py +0 -0
  59. {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/cexts/__init__.py +0 -0
  60. {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/cexts/_boilerplate.cc +0 -0
  61. {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/cexts/_distutils/LICENSE +0 -0
  62. {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/cexts/_distutils/__init__.py +0 -0
  63. {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/cexts/_distutils/build_ext.py +0 -0
  64. {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/cexts/_distutils/compilers/__init__.py +0 -0
  65. {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/cexts/_distutils/compilers/ccompiler.py +0 -0
  66. {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/cexts/_distutils/compilers/options.py +0 -0
  67. {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/cexts/_distutils/compilers/unixccompiler.py +0 -0
  68. {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/cexts/_distutils/dir_util.py +0 -0
  69. {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/cexts/_distutils/errors.py +0 -0
  70. {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/cexts/_distutils/extension.py +0 -0
  71. {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/cexts/_distutils/file_util.py +0 -0
  72. {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/cexts/_distutils/modified.py +0 -0
  73. {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/cexts/_distutils/spawn.py +0 -0
  74. {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/cexts/_distutils/sysconfig.py +0 -0
  75. {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/cexts/_distutils/util.py +0 -0
  76. {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/cexts/_distutils/version.py +0 -0
  77. {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/cexts/build.py +0 -0
  78. {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/cexts/cmake.py +0 -0
  79. {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/cexts/importhook.py +0 -0
  80. {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/cexts/magic.py +0 -0
  81. {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/cexts/scan.py +0 -0
  82. {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/ci/__init__.py +0 -0
  83. {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/ci/__main__.py +0 -0
  84. {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/ci/cache.py +0 -0
  85. {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/ci/ci.py +0 -0
  86. {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/ci/cli.py +0 -0
  87. {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/ci/compose.py +0 -0
  88. {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/ci/consts.py +0 -0
  89. {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/ci/docker/__init__.py +0 -0
  90. {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/ci/docker/buildcaching.py +0 -0
  91. {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/ci/docker/cache.py +0 -0
  92. {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/ci/docker/cacheserved/__init__.py +0 -0
  93. {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/ci/docker/cacheserved/cache.py +0 -0
  94. {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/ci/docker/cacheserved/manifests.py +0 -0
  95. {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/ci/docker/cmds.py +0 -0
  96. {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/ci/docker/dataserver.py +0 -0
  97. {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/ci/docker/imagepulling.py +0 -0
  98. {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/ci/docker/inject.py +0 -0
  99. {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/ci/docker/packing.py +0 -0
  100. {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/ci/docker/repositories.py +0 -0
  101. {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/ci/docker/utils.py +0 -0
  102. {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/ci/github/__init__.py +0 -0
  103. {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/ci/github/api/__init__.py +0 -0
  104. {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/ci/github/api/clients.py +0 -0
  105. {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/ci/github/api/v1/__init__.py +0 -0
  106. {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/ci/github/api/v1/api.py +0 -0
  107. {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/ci/github/api/v1/client.py +0 -0
  108. {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/ci/github/api/v2/__init__.py +0 -0
  109. {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/ci/github/api/v2/api.py +0 -0
  110. {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/ci/github/api/v2/azure.py +0 -0
  111. {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/ci/github/api/v2/client.py +0 -0
  112. {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/ci/github/bootstrap.py +0 -0
  113. {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/ci/github/cache.py +0 -0
  114. {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/ci/github/cli.py +0 -0
  115. {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/ci/github/env.py +0 -0
  116. {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/ci/github/inject.py +0 -0
  117. {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/ci/inject.py +0 -0
  118. {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/ci/requirements.py +0 -0
  119. {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/ci/shell.py +0 -0
  120. {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/ci/utils.py +0 -0
  121. {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/cli/__init__.py +0 -0
  122. {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/cli/__main__.py +0 -0
  123. {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/cli/_pathhack.py +0 -0
  124. {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/cli/clicli.py +0 -0
  125. {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/cli/install.py +0 -0
  126. {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/cli/main.py +0 -0
  127. {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/cli/managers.py +0 -0
  128. {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/cli/types.py +0 -0
  129. {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/clipboard/__init__.py +0 -0
  130. {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/clipboard/clipboard.py +0 -0
  131. {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/clipboard/darwin_cf.py +0 -0
  132. {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/clipboard/linux_x11.py +0 -0
  133. {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/cmake.py +0 -0
  134. {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/cmdlog/__init__.py +0 -0
  135. {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/cmdlog/__main__.py +0 -0
  136. {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/cmdlog/_cmdlog.py +0 -0
  137. {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/cmdlog/cli.py +0 -0
  138. {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/cmdlog/cmdlog.py +0 -0
  139. {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/dataclasses/__init__.py +0 -0
  140. {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/dataclasses/__main__.py +0 -0
  141. {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/dataclasses/cli.py +0 -0
  142. {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/dataclasses/codegen.py +0 -0
  143. {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/dataserver/__init__.py +0 -0
  144. {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/dataserver/handlers.py +0 -0
  145. {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/dataserver/http.py +0 -0
  146. {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/dataserver/routes.py +0 -0
  147. {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/dataserver/server.py +0 -0
  148. {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/dataserver/targets.py +0 -0
  149. {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/git/__init__.py +0 -0
  150. {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/git/magic.py +0 -0
  151. {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/git/revisions.py +0 -0
  152. {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/git/shallow.py +0 -0
  153. {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/git/status.py +0 -0
  154. {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/home/__init__.py +0 -0
  155. {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/home/paths.py +0 -0
  156. {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/home/secrets.py +0 -0
  157. {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/home/shadow.py +0 -0
  158. {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/imgur.py +0 -0
  159. {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/intellij/__init__.py +0 -0
  160. {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/intellij/cli.py +0 -0
  161. {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/intellij/ides.py +0 -0
  162. {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/intellij/open.py +0 -0
  163. {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/interp/__init__.py +0 -0
  164. {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/interp/__main__.py +0 -0
  165. {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/interp/cli.py +0 -0
  166. {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/interp/default.py +0 -0
  167. {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/interp/inject.py +0 -0
  168. {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/interp/inspect.py +0 -0
  169. {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/interp/providers/__init__.py +0 -0
  170. {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/interp/providers/base.py +0 -0
  171. {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/interp/providers/inject.py +0 -0
  172. {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/interp/providers/running.py +0 -0
  173. {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/interp/providers/standalone.py +0 -0
  174. {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/interp/providers/system.py +0 -0
  175. {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/interp/pyenv/__init__.py +0 -0
  176. {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/interp/pyenv/inject.py +0 -0
  177. {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/interp/pyenv/install.py +0 -0
  178. {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/interp/pyenv/provider.py +0 -0
  179. {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/interp/pyenv/pyenv.py +0 -0
  180. {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/interp/resolvers.py +0 -0
  181. {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/interp/types.py +0 -0
  182. {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/interp/uv/__init__.py +0 -0
  183. {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/interp/uv/inject.py +0 -0
  184. {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/interp/uv/provider.py +0 -0
  185. {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/interp/uv/uv.py +0 -0
  186. {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/interp/venvs.py +0 -0
  187. {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/magic/__init__.py +0 -0
  188. {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/magic/__main__.py +0 -0
  189. {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/magic/cli.py +0 -0
  190. {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/magic/find.py +0 -0
  191. {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/magic/magic.py +0 -0
  192. {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/magic/prepare.py +0 -0
  193. {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/magic/styles.py +0 -0
  194. {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/manifests/__init__.py +0 -0
  195. {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/manifests/__main__.py +0 -0
  196. {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/manifests/_dumping.py +0 -0
  197. {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/manifests/building.py +0 -0
  198. {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/manifests/dumping.py +0 -0
  199. {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/manifests/main.py +0 -0
  200. {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/mypy/__init__.py +0 -0
  201. {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/mypy/debug.py +0 -0
  202. {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/mypy/report.py +0 -0
  203. {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/oci/__init__.py +0 -0
  204. {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/oci/building.py +0 -0
  205. {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/oci/compression.py +0 -0
  206. {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/oci/data.py +0 -0
  207. {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/oci/datarefs.py +0 -0
  208. {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/oci/dataserver.py +0 -0
  209. {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/oci/loading.py +0 -0
  210. {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/oci/media.py +0 -0
  211. {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/oci/pack/__init__.py +0 -0
  212. {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/oci/pack/packing.py +0 -0
  213. {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/oci/pack/repositories.py +0 -0
  214. {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/oci/pack/unpacking.py +0 -0
  215. {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/oci/repositories.py +0 -0
  216. {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/oci/tars.py +0 -0
  217. {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/packaging/__init__.py +0 -0
  218. {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/packaging/marshal.py +0 -0
  219. {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/packaging/names.py +0 -0
  220. {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/packaging/requires.py +0 -0
  221. {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/packaging/revisions.py +0 -0
  222. {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/packaging/specifiers.py +0 -0
  223. {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/packaging/versions.py +0 -0
  224. {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/packaging/wheelfile.py +0 -0
  225. {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/pip.py +0 -0
  226. {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/precheck/__init__.py +0 -0
  227. {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/precheck/__main__.py +0 -0
  228. {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/precheck/base.py +0 -0
  229. {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/precheck/caches.py +0 -0
  230. {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/precheck/git.py +0 -0
  231. {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/precheck/imports.py +0 -0
  232. {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/precheck/lite.py +0 -0
  233. {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/precheck/main.py +0 -0
  234. {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/precheck/manifests.py +0 -0
  235. {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/precheck/scripts.py +0 -0
  236. {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/precheck/unicode.py +0 -0
  237. {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/ptk/__init__.py +0 -0
  238. {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/ptk/apps/__init__.py +0 -0
  239. {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/ptk/apps/ncdu.py +0 -0
  240. {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/ptk/confirm.py +0 -0
  241. {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/ptk/markdown/LICENSE +0 -0
  242. {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/ptk/markdown/__init__.py +0 -0
  243. {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/ptk/markdown/__main__.py +0 -0
  244. {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/ptk/markdown/border.py +0 -0
  245. {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/ptk/markdown/cli.py +0 -0
  246. {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/ptk/markdown/markdown.py +0 -0
  247. {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/ptk/markdown/parser.py +0 -0
  248. {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/ptk/markdown/styles.py +0 -0
  249. {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/ptk/markdown/tags.py +0 -0
  250. {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/ptk/markdown/utils.py +0 -0
  251. {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/py/__init__.py +0 -0
  252. {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/py/attrdocs.py +0 -0
  253. {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/py/bracepy.py +0 -0
  254. {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/py/classdot.py +0 -0
  255. {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/py/docstrings/LICENSE +0 -0
  256. {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/py/docstrings/__init__.py +0 -0
  257. {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/py/docstrings/attrdoc.py +0 -0
  258. {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/py/docstrings/common.py +0 -0
  259. {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/py/docstrings/epydoc.py +0 -0
  260. {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/py/docstrings/google.py +0 -0
  261. {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/py/docstrings/numpydoc.py +0 -0
  262. {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/py/docstrings/parser.py +0 -0
  263. {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/py/docstrings/rest.py +0 -0
  264. {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/py/findimports.py +0 -0
  265. {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/py/scripts/__init__.py +0 -0
  266. {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/py/scripts/bumpversion.py +0 -0
  267. {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/py/scripts/importtrace.py +0 -0
  268. {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/py/srcheaders.py +0 -0
  269. {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/py/tools/__init__.py +0 -0
  270. {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/py/tools/importscan.py +0 -0
  271. {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/py/tools/mkrelimp.py +0 -0
  272. {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/pyproject/__init__.py +0 -0
  273. {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/pyproject/__main__.py +0 -0
  274. {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/pyproject/cexts.py +0 -0
  275. {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/pyproject/cli.py +0 -0
  276. {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/pyproject/configs.py +0 -0
  277. {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/pyproject/inject.py +0 -0
  278. {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/pyproject/pkg.py +0 -0
  279. {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/pyproject/reqs.py +0 -0
  280. {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/pyproject/resources/__init__.py +0 -0
  281. {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/pyproject/resources/docker-dev.sh +0 -0
  282. {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/pyproject/resources/python.sh +0 -0
  283. {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/pyproject/venvs.py +0 -0
  284. {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/scripts/__init__.py +0 -0
  285. {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/scripts/slowcat.py +0 -0
  286. {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/scripts/tmpexec.py +0 -0
  287. {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/tagstrings.py +0 -0
  288. {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/tokens/__init__.py +0 -0
  289. {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/tokens/all.py +0 -0
  290. {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/tokens/tokenizert.py +0 -0
  291. {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/tokens/utils.py +0 -0
  292. {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/tools/__init__.py +0 -0
  293. {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/tools/cloc.py +0 -0
  294. {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/tools/diff.py +0 -0
  295. {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/tools/doc.py +0 -0
  296. {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/tools/docker.py +0 -0
  297. {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/tools/git/__init__.py +0 -0
  298. {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/tools/git/__main__.py +0 -0
  299. {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/tools/git/cli.py +0 -0
  300. {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/tools/git/cloning.py +0 -0
  301. {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/tools/git/consts.py +0 -0
  302. {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/tools/git/messages.py +0 -0
  303. {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/tools/json/__init__.py +0 -0
  304. {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/tools/json/__main__.py +0 -0
  305. {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/tools/json/cli.py +0 -0
  306. {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/tools/json/formats.py +0 -0
  307. {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/tools/json/io.py +0 -0
  308. {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/tools/json/parsing.py +0 -0
  309. {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/tools/json/processing.py +0 -0
  310. {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/tools/json/rendering.py +0 -0
  311. {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/tools/jsonview/__init__.py +0 -0
  312. {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/tools/jsonview/__main__.py +0 -0
  313. {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/tools/jsonview/cli.py +0 -0
  314. {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/tools/jsonview/resources/__init__.py +0 -0
  315. {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/tools/jsonview/resources/jsonview.css +0 -0
  316. {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/tools/jsonview/resources/jsonview.js +0 -0
  317. {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/tools/linehisto.py +0 -0
  318. {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/tools/mkenv.py +0 -0
  319. {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/tools/notebook.py +0 -0
  320. {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/tools/pawk/__init__.py +0 -0
  321. {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/tools/pawk/__main__.py +0 -0
  322. {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/tools/pawk/pawk.py +0 -0
  323. {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/tools/pip.py +0 -0
  324. {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/tools/prof.py +0 -0
  325. {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/tools/qr.py +0 -0
  326. {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/tools/shadow.py +0 -0
  327. {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/tools/shell.py +0 -0
  328. {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev/tools/sqlrepl.py +0 -0
  329. {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev.egg-info/SOURCES.txt +0 -0
  330. {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev.egg-info/dependency_links.txt +0 -0
  331. {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev.egg-info/entry_points.txt +0 -0
  332. {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/omdev.egg-info/top_level.txt +0 -0
  333. {omdev-0.0.0.dev431 → omdev-0.0.0.dev433}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: omdev
3
- Version: 0.0.0.dev431
3
+ Version: 0.0.0.dev433
4
4
  Summary: omdev
5
5
  Author: wrmsr
6
6
  License-Expression: BSD-3-Clause
@@ -14,10 +14,10 @@ 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: omlish==0.0.0.dev431
17
+ Requires-Dist: omlish==0.0.0.dev433
18
18
  Provides-Extra: all
19
19
  Requires-Dist: black~=25.1; extra == "all"
20
- Requires-Dist: pycparser~=2.22; extra == "all"
20
+ Requires-Dist: pycparser~=2.23; extra == "all"
21
21
  Requires-Dist: pcpp~=1.30; extra == "all"
22
22
  Requires-Dist: docutils~=0.22; extra == "all"
23
23
  Requires-Dist: markdown-it-py~=4.0; extra == "all"
@@ -30,7 +30,7 @@ Requires-Dist: segno~=1.6; extra == "all"
30
30
  Provides-Extra: black
31
31
  Requires-Dist: black~=25.1; extra == "black"
32
32
  Provides-Extra: c
33
- Requires-Dist: pycparser~=2.22; extra == "c"
33
+ Requires-Dist: pycparser~=2.23; extra == "c"
34
34
  Requires-Dist: pcpp~=1.30; extra == "c"
35
35
  Provides-Extra: doc
36
36
  Requires-Dist: docutils~=0.22; extra == "doc"
@@ -236,7 +236,7 @@
236
236
  "module": ".py.scripts.execstat",
237
237
  "attr": "_CLI_MODULE",
238
238
  "file": "omdev/py/scripts/execstat.py",
239
- "line": 89,
239
+ "line": 92,
240
240
  "value": {
241
241
  "!.cli.types.CliModule": {
242
242
  "name": "py/execstat",
@@ -17,7 +17,7 @@ class Project(ProjectBase):
17
17
  ],
18
18
 
19
19
  'c': [
20
- 'pycparser ~= 2.22',
20
+ 'pycparser ~= 2.23',
21
21
  'pcpp ~= 1.30',
22
22
  ],
23
23
 
@@ -17,13 +17,14 @@ import typing as ta
17
17
 
18
18
 
19
19
  def _run(
20
+ report: 'ta.Callable[[dict], None]',
20
21
  src: str,
21
22
  *,
22
23
  setup: 'ta.Optional[str]' = None,
23
24
  time: bool = False,
24
25
  rss: bool = False,
25
26
  modules: bool = False,
26
- ) -> dict:
27
+ ) -> None:
27
28
  if rss:
28
29
  import resource # noqa
29
30
 
@@ -61,26 +62,28 @@ def _run(
61
62
 
62
63
  #
63
64
 
64
- exec(code, globals(), ns)
65
+ try:
66
+ exec(code, globals(), ns)
65
67
 
66
- #
68
+ finally:
69
+ #
67
70
 
68
- if time:
69
- end_time = get_time()
71
+ if time:
72
+ end_time = get_time()
70
73
 
71
- if rss:
72
- end_rss = get_rss()
74
+ if rss:
75
+ end_rss = get_rss()
73
76
 
74
- if modules:
75
- end_modules = get_modules()
77
+ if modules:
78
+ end_modules = get_modules()
76
79
 
77
- #
80
+ #
78
81
 
79
- return {
80
- **({'time': (end_time - start_time)} if time else {}), # noqa
81
- **({'rss': (end_rss - start_rss)} if rss else {}), # noqa
82
- **({'modules': [m for m in end_modules if m not in start_modules]} if modules else {}), # noqa
83
- }
82
+ report({
83
+ **({'time': (end_time - start_time)} if time else {}), # noqa
84
+ **({'rss': (end_rss - start_rss)} if rss else {}), # noqa
85
+ **({'modules': [m for m in end_modules if m not in start_modules]} if modules else {}), # noqa
86
+ })
84
87
 
85
88
 
86
89
  #
@@ -145,13 +148,10 @@ def _main() -> None:
145
148
 
146
149
  payload = '\n'.join([
147
150
  inspect.getsource(_run),
148
- f'dct = _run(**{run_kw!r})',
149
- f'import json',
150
- f'with open({out_file!r}, "w") as f:', # noqa
151
- f' f.write(json.dumps(dct))',
151
+ f'with open({out_file!r}, "w") as f: _run(lambda dct: f.write(__import__("json").dumps(dct)), **{run_kw!r})', # noqa
152
152
  ])
153
153
 
154
- subprocess.check_call([exe, '-c', payload])
154
+ subprocess.call([exe, '-c', payload])
155
155
 
156
156
  with open(out_file) as f:
157
157
  result = json.load(f)
@@ -7653,6 +7653,16 @@ class LoggingContext(Abstract):
7653
7653
  raise TypeError(f'LoggingContextInfo absent: {ty}')
7654
7654
  return info
7655
7655
 
7656
+
7657
+ @ta.final
7658
+ class SimpleLoggingContext(LoggingContext):
7659
+ def __init__(self, *infos: LoggingContextInfo) -> None:
7660
+ self._infos: ta.Dict[ta.Type[LoggingContextInfo], LoggingContextInfo] = {type(i): i for i in infos}
7661
+
7662
+ def get_info(self, ty: ta.Type[LoggingContextInfoT]) -> ta.Optional[LoggingContextInfoT]:
7663
+ return self._infos.get(ty)
7664
+
7665
+
7656
7666
  ##
7657
7667
 
7658
7668
 
@@ -7703,16 +7713,17 @@ class CaptureLoggingContextImpl(CaptureLoggingContext):
7703
7713
  stack_offset: int = 0,
7704
7714
  stack_info: bool = False,
7705
7715
  ) -> None:
7706
- # TODO: Name, Msg, Extra
7707
-
7708
7716
  if time_ns is None:
7709
7717
  time_ns = time.time_ns()
7710
7718
 
7719
+ # Done early to not trample on sys.exc_info()
7720
+ exc = LoggingContextInfos.Exc.build(exc_info)
7721
+
7711
7722
  self._infos: ta.Dict[ta.Type[LoggingContextInfo], LoggingContextInfo] = {}
7712
7723
  self._set_info(
7713
7724
  LoggingContextInfos.Level.build(level),
7725
+ exc,
7714
7726
  LoggingContextInfos.Time.build(time_ns),
7715
- LoggingContextInfos.Exc.build(exc_info),
7716
7727
  )
7717
7728
 
7718
7729
  if caller is not CaptureLoggingContextImpl.NOT_SET:
@@ -7854,10 +7865,14 @@ def _locking_logging_module_lock() -> ta.Iterator[None]:
7854
7865
  def configure_standard_logging(
7855
7866
  level: ta.Union[int, str] = logging.INFO,
7856
7867
  *,
7857
- json: bool = False,
7858
7868
  target: ta.Optional[logging.Logger] = None,
7869
+
7859
7870
  force: bool = False,
7871
+
7860
7872
  handler_factory: ta.Optional[ta.Callable[[], logging.Handler]] = None,
7873
+
7874
+ formatter: ta.Optional[logging.Formatter] = None, # noqa
7875
+ json: bool = False,
7861
7876
  ) -> ta.Optional[StandardConfiguredLoggingHandler]:
7862
7877
  with _locking_logging_module_lock():
7863
7878
  if target is None:
@@ -7878,11 +7893,11 @@ def configure_standard_logging(
7878
7893
 
7879
7894
  #
7880
7895
 
7881
- formatter: logging.Formatter
7882
- if json:
7883
- formatter = JsonLoggingFormatter()
7884
- else:
7885
- formatter = StandardLoggingFormatter(StandardLoggingFormatter.build_log_format(STANDARD_LOG_FORMAT_PARTS))
7896
+ if formatter is None:
7897
+ if json:
7898
+ formatter = JsonLoggingFormatter()
7899
+ else:
7900
+ formatter = StandardLoggingFormatter(StandardLoggingFormatter.build_log_format(STANDARD_LOG_FORMAT_PARTS)) # noqa
7886
7901
  handler.setFormatter(formatter)
7887
7902
 
7888
7903
  #
@@ -9855,22 +9870,6 @@ class LoggingContextInfoRecordAdapters:
9855
9870
  args=rec.args,
9856
9871
  )
9857
9872
 
9858
- # FIXME: handled specially - all unknown attrs on LogRecord
9859
- # class Extra(Adapter[LoggingContextInfos.Extra]):
9860
- # _record_attrs: ta.ClassVar[ta.Mapping[str, ta.Union[ta.Any, ta.Tuple[ta.Any, ta.Any]]]] = dict()
9861
- #
9862
- # def info_to_record(self, info: ta.Optional[LoggingContextInfos.Extra]) -> ta.Mapping[str, ta.Any]:
9863
- # # FIXME:
9864
- # # if extra is not None:
9865
- # # for key in extra:
9866
- # # if (key in ["message", "asctime"]) or (key in rv.__dict__):
9867
- # # raise KeyError("Attempt to overwrite %r in LogRecord" % key)
9868
- # # rv.__dict__[key] = extra[key]
9869
- # return dict()
9870
- #
9871
- # def record_to_info(self, rec: logging.LogRecord) -> ta.Optional[LoggingContextInfos.Extra]:
9872
- # return None
9873
-
9874
9873
  class Time(RequiredAdapter[LoggingContextInfos.Time]):
9875
9874
  info_cls: ta.ClassVar[ta.Type[LoggingContextInfos.Time]] = LoggingContextInfos.Time
9876
9875
 
@@ -9976,8 +9975,23 @@ class LoggingContextInfoRecordAdapters:
9976
9975
 
9977
9976
  def record_to_info(self, rec: logging.LogRecord) -> ta.Optional[LoggingContextInfos.Caller]:
9978
9977
  # FIXME: piecemeal?
9979
- # FIXME: strip _STACK_INFO_PREFIX
9980
- raise NotImplementedError
9978
+ if (
9979
+ rec.pathname != self._UNKNOWN_PATH_NAME and
9980
+ rec.lineno != 0 and
9981
+ rec.funcName != self._UNKNOWN_FUNC_NAME
9982
+ ):
9983
+ if (sinfo := rec.stack_info) is not None and sinfo.startswith(self._STACK_INFO_PREFIX):
9984
+ sinfo = sinfo[len(self._STACK_INFO_PREFIX):]
9985
+ return LoggingContextInfos.Caller(
9986
+ file_path=rec.pathname,
9987
+
9988
+ line_no=rec.lineno,
9989
+ func_name=rec.funcName,
9990
+
9991
+ stack_info=sinfo,
9992
+ )
9993
+
9994
+ return None
9981
9995
 
9982
9996
  class SourceFile(Adapter[LoggingContextInfos.SourceFile]):
9983
9997
  info_cls: ta.ClassVar[ta.Type[LoggingContextInfos.SourceFile]] = LoggingContextInfos.SourceFile
@@ -10013,9 +10027,9 @@ class LoggingContextInfoRecordAdapters:
10013
10027
  )
10014
10028
 
10015
10029
  def record_to_info(self, rec: logging.LogRecord) -> ta.Optional[LoggingContextInfos.SourceFile]:
10016
- if not (
10017
- rec.module is None or
10018
- rec.module == self._UNKNOWN_MODULE
10030
+ if (
10031
+ rec.module is not None and
10032
+ rec.module != self._UNKNOWN_MODULE
10019
10033
  ):
10020
10034
  return LoggingContextInfos.SourceFile(
10021
10035
  file_name=rec.filename,
@@ -10168,16 +10182,11 @@ _LOGGING_CONTEXT_INFO_RECORD_ADAPTERS: ta.Mapping[ta.Type[LoggingContextInfo], L
10168
10182
  ##
10169
10183
 
10170
10184
 
10171
- KNOWN_STD_LOGGING_RECORD_ATTR_SET: ta.FrozenSet[str] = frozenset(
10172
- a for ad in _LOGGING_CONTEXT_INFO_RECORD_ADAPTERS.values() for a in ad.record_attrs
10173
- )
10174
-
10175
-
10176
10185
  # Formatter:
10177
10186
  # - https://github.com/python/cpython/blob/39b2f82717a69dde7212bc39b673b0f55c99e6a3/Lib/logging/__init__.py#L514 (3.8)
10178
10187
  # - https://github.com/python/cpython/blob/f070f54c5f4a42c7c61d1d5d3b8f3b7203b4a0fb/Lib/logging/__init__.py#L554 (~3.14) # noqa
10179
10188
  #
10180
- KNOWN_STD_LOGGING_FORMATTER_RECORD_ATTRS: ta.Dict[str, ta.Any] = dict(
10189
+ _KNOWN_STD_LOGGING_FORMATTER_RECORD_ATTRS: ta.Dict[str, ta.Any] = dict(
10181
10190
  # The logged message, computed as msg % args. Set to `record.getMessage()`.
10182
10191
  message=str,
10183
10192
 
@@ -10191,7 +10200,15 @@ KNOWN_STD_LOGGING_FORMATTER_RECORD_ATTRS: ta.Dict[str, ta.Any] = dict(
10191
10200
  exc_text=ta.Optional[str],
10192
10201
  )
10193
10202
 
10194
- KNOWN_STD_LOGGING_FORMATTER_RECORD_ATTR_SET: ta.FrozenSet[str] = frozenset(KNOWN_STD_LOGGING_FORMATTER_RECORD_ATTRS)
10203
+
10204
+ ##
10205
+
10206
+
10207
+ _KNOWN_STD_LOGGING_RECORD_ATTR_SET: ta.FrozenSet[str] = frozenset(
10208
+ a for ad in _LOGGING_CONTEXT_INFO_RECORD_ADAPTERS.values() for a in ad.record_attrs
10209
+ )
10210
+
10211
+ _KNOWN_STD_LOGGING_FORMATTER_RECORD_ATTR_SET: ta.FrozenSet[str] = frozenset(_KNOWN_STD_LOGGING_FORMATTER_RECORD_ATTRS)
10195
10212
 
10196
10213
 
10197
10214
  class UnknownStdLoggingRecordAttrsWarning(LoggingSetupWarning):
@@ -10201,13 +10218,13 @@ class UnknownStdLoggingRecordAttrsWarning(LoggingSetupWarning):
10201
10218
  def _check_std_logging_record_attrs() -> None:
10202
10219
  if (
10203
10220
  len([a for ad in _LOGGING_CONTEXT_INFO_RECORD_ADAPTERS.values() for a in ad.record_attrs]) !=
10204
- len(KNOWN_STD_LOGGING_RECORD_ATTR_SET)
10221
+ len(_KNOWN_STD_LOGGING_RECORD_ATTR_SET)
10205
10222
  ):
10206
10223
  raise RuntimeError('Duplicate LoggingContextInfoRecordAdapter record attrs')
10207
10224
 
10208
10225
  rec_dct = dict(logging.makeLogRecord({}).__dict__)
10209
10226
 
10210
- if (unk_rec_fields := frozenset(rec_dct) - KNOWN_STD_LOGGING_RECORD_ATTR_SET):
10227
+ if (unk_rec_fields := frozenset(rec_dct) - _KNOWN_STD_LOGGING_RECORD_ATTR_SET):
10211
10228
  import warnings # noqa
10212
10229
 
10213
10230
  warnings.warn(
@@ -10233,11 +10250,60 @@ class LoggingContextLogRecord(logging.LogRecord):
10233
10250
  # - exc_info: LoggingExcInfoTuple | None
10234
10251
  # - func: str | None = None -> funcName
10235
10252
  # - sinfo: str | None = None -> stack_info
10253
+ #
10236
10254
 
10237
10255
  def __init__(self, *, _logging_context: LoggingContext) -> None: # noqa
10256
+ self.__dict__.update(_logging_context=_logging_context)
10257
+
10238
10258
  for ad in _LOGGING_CONTEXT_INFO_RECORD_ADAPTERS_:
10239
10259
  self.__dict__.update(ad.context_to_record(_logging_context))
10240
10260
 
10261
+ _logging_context: LoggingContext
10262
+
10263
+ # FIXME: track extra
10264
+ # def __setattr__(self, key, value):
10265
+ # super().__setattr__(key, value)
10266
+
10267
+
10268
+ ##
10269
+
10270
+
10271
+ @ta.final
10272
+ class LogRecordLoggingContext(LoggingContext):
10273
+ def __init__(self, rec: logging.LogRecord) -> None:
10274
+ if isinstance(rec, LoggingContextLogRecord):
10275
+ raise TypeError(rec)
10276
+
10277
+ self._rec = rec
10278
+
10279
+ infos: ta.List[LoggingContextInfo] = [
10280
+ info
10281
+ for ad in _LOGGING_CONTEXT_INFO_RECORD_ADAPTERS_
10282
+ if (info := ad.record_to_info(rec)) is not None
10283
+ ]
10284
+
10285
+ # FIXME:
10286
+ # if extra is not None:
10287
+ # for key in extra:
10288
+ # if (key in ["message", "asctime"]) or (key in rv.__dict__):
10289
+ # raise KeyError("Attempt to overwrite %r in LogRecord" % key)
10290
+ # rv.__dict__[key] = extra[key]
10291
+
10292
+ if (extra := {
10293
+ a: v
10294
+ for a, v in rec.__dict__.items()
10295
+ if a not in _KNOWN_STD_LOGGING_RECORD_ATTR_SET
10296
+ }):
10297
+ infos.append(LoggingContextInfos.Extra(extra))
10298
+
10299
+ self._infos: ta.Dict[ta.Type[LoggingContextInfo], LoggingContextInfo] = {
10300
+ type(info): info
10301
+ for info in infos
10302
+ }
10303
+
10304
+ def get_info(self, ty: ta.Type[LoggingContextInfoT]) -> ta.Optional[LoggingContextInfoT]:
10305
+ return self._infos.get(ty)
10306
+
10241
10307
 
10242
10308
  ########################################
10243
10309
  # ../../../omlish/secrets/tempssl.py
@@ -4220,10 +4220,14 @@ def _locking_logging_module_lock() -> ta.Iterator[None]:
4220
4220
  def configure_standard_logging(
4221
4221
  level: ta.Union[int, str] = logging.INFO,
4222
4222
  *,
4223
- json: bool = False,
4224
4223
  target: ta.Optional[logging.Logger] = None,
4224
+
4225
4225
  force: bool = False,
4226
+
4226
4227
  handler_factory: ta.Optional[ta.Callable[[], logging.Handler]] = None,
4228
+
4229
+ formatter: ta.Optional[logging.Formatter] = None, # noqa
4230
+ json: bool = False,
4227
4231
  ) -> ta.Optional[StandardConfiguredLoggingHandler]:
4228
4232
  with _locking_logging_module_lock():
4229
4233
  if target is None:
@@ -4244,11 +4248,11 @@ def configure_standard_logging(
4244
4248
 
4245
4249
  #
4246
4250
 
4247
- formatter: logging.Formatter
4248
- if json:
4249
- formatter = JsonLoggingFormatter()
4250
- else:
4251
- formatter = StandardLoggingFormatter(StandardLoggingFormatter.build_log_format(STANDARD_LOG_FORMAT_PARTS))
4251
+ if formatter is None:
4252
+ if json:
4253
+ formatter = JsonLoggingFormatter()
4254
+ else:
4255
+ formatter = StandardLoggingFormatter(StandardLoggingFormatter.build_log_format(STANDARD_LOG_FORMAT_PARTS)) # noqa
4252
4256
  handler.setFormatter(formatter)
4253
4257
 
4254
4258
  #
@@ -7116,6 +7116,16 @@ class LoggingContext(Abstract):
7116
7116
  raise TypeError(f'LoggingContextInfo absent: {ty}')
7117
7117
  return info
7118
7118
 
7119
+
7120
+ @ta.final
7121
+ class SimpleLoggingContext(LoggingContext):
7122
+ def __init__(self, *infos: LoggingContextInfo) -> None:
7123
+ self._infos: ta.Dict[ta.Type[LoggingContextInfo], LoggingContextInfo] = {type(i): i for i in infos}
7124
+
7125
+ def get_info(self, ty: ta.Type[LoggingContextInfoT]) -> ta.Optional[LoggingContextInfoT]:
7126
+ return self._infos.get(ty)
7127
+
7128
+
7119
7129
  ##
7120
7130
 
7121
7131
 
@@ -7166,16 +7176,17 @@ class CaptureLoggingContextImpl(CaptureLoggingContext):
7166
7176
  stack_offset: int = 0,
7167
7177
  stack_info: bool = False,
7168
7178
  ) -> None:
7169
- # TODO: Name, Msg, Extra
7170
-
7171
7179
  if time_ns is None:
7172
7180
  time_ns = time.time_ns()
7173
7181
 
7182
+ # Done early to not trample on sys.exc_info()
7183
+ exc = LoggingContextInfos.Exc.build(exc_info)
7184
+
7174
7185
  self._infos: ta.Dict[ta.Type[LoggingContextInfo], LoggingContextInfo] = {}
7175
7186
  self._set_info(
7176
7187
  LoggingContextInfos.Level.build(level),
7188
+ exc,
7177
7189
  LoggingContextInfos.Time.build(time_ns),
7178
- LoggingContextInfos.Exc.build(exc_info),
7179
7190
  )
7180
7191
 
7181
7192
  if caller is not CaptureLoggingContextImpl.NOT_SET:
@@ -7317,10 +7328,14 @@ def _locking_logging_module_lock() -> ta.Iterator[None]:
7317
7328
  def configure_standard_logging(
7318
7329
  level: ta.Union[int, str] = logging.INFO,
7319
7330
  *,
7320
- json: bool = False,
7321
7331
  target: ta.Optional[logging.Logger] = None,
7332
+
7322
7333
  force: bool = False,
7334
+
7323
7335
  handler_factory: ta.Optional[ta.Callable[[], logging.Handler]] = None,
7336
+
7337
+ formatter: ta.Optional[logging.Formatter] = None, # noqa
7338
+ json: bool = False,
7324
7339
  ) -> ta.Optional[StandardConfiguredLoggingHandler]:
7325
7340
  with _locking_logging_module_lock():
7326
7341
  if target is None:
@@ -7341,11 +7356,11 @@ def configure_standard_logging(
7341
7356
 
7342
7357
  #
7343
7358
 
7344
- formatter: logging.Formatter
7345
- if json:
7346
- formatter = JsonLoggingFormatter()
7347
- else:
7348
- formatter = StandardLoggingFormatter(StandardLoggingFormatter.build_log_format(STANDARD_LOG_FORMAT_PARTS))
7359
+ if formatter is None:
7360
+ if json:
7361
+ formatter = JsonLoggingFormatter()
7362
+ else:
7363
+ formatter = StandardLoggingFormatter(StandardLoggingFormatter.build_log_format(STANDARD_LOG_FORMAT_PARTS)) # noqa
7349
7364
  handler.setFormatter(formatter)
7350
7365
 
7351
7366
  #
@@ -8000,22 +8015,6 @@ class LoggingContextInfoRecordAdapters:
8000
8015
  args=rec.args,
8001
8016
  )
8002
8017
 
8003
- # FIXME: handled specially - all unknown attrs on LogRecord
8004
- # class Extra(Adapter[LoggingContextInfos.Extra]):
8005
- # _record_attrs: ta.ClassVar[ta.Mapping[str, ta.Union[ta.Any, ta.Tuple[ta.Any, ta.Any]]]] = dict()
8006
- #
8007
- # def info_to_record(self, info: ta.Optional[LoggingContextInfos.Extra]) -> ta.Mapping[str, ta.Any]:
8008
- # # FIXME:
8009
- # # if extra is not None:
8010
- # # for key in extra:
8011
- # # if (key in ["message", "asctime"]) or (key in rv.__dict__):
8012
- # # raise KeyError("Attempt to overwrite %r in LogRecord" % key)
8013
- # # rv.__dict__[key] = extra[key]
8014
- # return dict()
8015
- #
8016
- # def record_to_info(self, rec: logging.LogRecord) -> ta.Optional[LoggingContextInfos.Extra]:
8017
- # return None
8018
-
8019
8018
  class Time(RequiredAdapter[LoggingContextInfos.Time]):
8020
8019
  info_cls: ta.ClassVar[ta.Type[LoggingContextInfos.Time]] = LoggingContextInfos.Time
8021
8020
 
@@ -8121,8 +8120,23 @@ class LoggingContextInfoRecordAdapters:
8121
8120
 
8122
8121
  def record_to_info(self, rec: logging.LogRecord) -> ta.Optional[LoggingContextInfos.Caller]:
8123
8122
  # FIXME: piecemeal?
8124
- # FIXME: strip _STACK_INFO_PREFIX
8125
- raise NotImplementedError
8123
+ if (
8124
+ rec.pathname != self._UNKNOWN_PATH_NAME and
8125
+ rec.lineno != 0 and
8126
+ rec.funcName != self._UNKNOWN_FUNC_NAME
8127
+ ):
8128
+ if (sinfo := rec.stack_info) is not None and sinfo.startswith(self._STACK_INFO_PREFIX):
8129
+ sinfo = sinfo[len(self._STACK_INFO_PREFIX):]
8130
+ return LoggingContextInfos.Caller(
8131
+ file_path=rec.pathname,
8132
+
8133
+ line_no=rec.lineno,
8134
+ func_name=rec.funcName,
8135
+
8136
+ stack_info=sinfo,
8137
+ )
8138
+
8139
+ return None
8126
8140
 
8127
8141
  class SourceFile(Adapter[LoggingContextInfos.SourceFile]):
8128
8142
  info_cls: ta.ClassVar[ta.Type[LoggingContextInfos.SourceFile]] = LoggingContextInfos.SourceFile
@@ -8158,9 +8172,9 @@ class LoggingContextInfoRecordAdapters:
8158
8172
  )
8159
8173
 
8160
8174
  def record_to_info(self, rec: logging.LogRecord) -> ta.Optional[LoggingContextInfos.SourceFile]:
8161
- if not (
8162
- rec.module is None or
8163
- rec.module == self._UNKNOWN_MODULE
8175
+ if (
8176
+ rec.module is not None and
8177
+ rec.module != self._UNKNOWN_MODULE
8164
8178
  ):
8165
8179
  return LoggingContextInfos.SourceFile(
8166
8180
  file_name=rec.filename,
@@ -8313,16 +8327,11 @@ _LOGGING_CONTEXT_INFO_RECORD_ADAPTERS: ta.Mapping[ta.Type[LoggingContextInfo], L
8313
8327
  ##
8314
8328
 
8315
8329
 
8316
- KNOWN_STD_LOGGING_RECORD_ATTR_SET: ta.FrozenSet[str] = frozenset(
8317
- a for ad in _LOGGING_CONTEXT_INFO_RECORD_ADAPTERS.values() for a in ad.record_attrs
8318
- )
8319
-
8320
-
8321
8330
  # Formatter:
8322
8331
  # - https://github.com/python/cpython/blob/39b2f82717a69dde7212bc39b673b0f55c99e6a3/Lib/logging/__init__.py#L514 (3.8)
8323
8332
  # - https://github.com/python/cpython/blob/f070f54c5f4a42c7c61d1d5d3b8f3b7203b4a0fb/Lib/logging/__init__.py#L554 (~3.14) # noqa
8324
8333
  #
8325
- KNOWN_STD_LOGGING_FORMATTER_RECORD_ATTRS: ta.Dict[str, ta.Any] = dict(
8334
+ _KNOWN_STD_LOGGING_FORMATTER_RECORD_ATTRS: ta.Dict[str, ta.Any] = dict(
8326
8335
  # The logged message, computed as msg % args. Set to `record.getMessage()`.
8327
8336
  message=str,
8328
8337
 
@@ -8336,7 +8345,15 @@ KNOWN_STD_LOGGING_FORMATTER_RECORD_ATTRS: ta.Dict[str, ta.Any] = dict(
8336
8345
  exc_text=ta.Optional[str],
8337
8346
  )
8338
8347
 
8339
- KNOWN_STD_LOGGING_FORMATTER_RECORD_ATTR_SET: ta.FrozenSet[str] = frozenset(KNOWN_STD_LOGGING_FORMATTER_RECORD_ATTRS)
8348
+
8349
+ ##
8350
+
8351
+
8352
+ _KNOWN_STD_LOGGING_RECORD_ATTR_SET: ta.FrozenSet[str] = frozenset(
8353
+ a for ad in _LOGGING_CONTEXT_INFO_RECORD_ADAPTERS.values() for a in ad.record_attrs
8354
+ )
8355
+
8356
+ _KNOWN_STD_LOGGING_FORMATTER_RECORD_ATTR_SET: ta.FrozenSet[str] = frozenset(_KNOWN_STD_LOGGING_FORMATTER_RECORD_ATTRS)
8340
8357
 
8341
8358
 
8342
8359
  class UnknownStdLoggingRecordAttrsWarning(LoggingSetupWarning):
@@ -8346,13 +8363,13 @@ class UnknownStdLoggingRecordAttrsWarning(LoggingSetupWarning):
8346
8363
  def _check_std_logging_record_attrs() -> None:
8347
8364
  if (
8348
8365
  len([a for ad in _LOGGING_CONTEXT_INFO_RECORD_ADAPTERS.values() for a in ad.record_attrs]) !=
8349
- len(KNOWN_STD_LOGGING_RECORD_ATTR_SET)
8366
+ len(_KNOWN_STD_LOGGING_RECORD_ATTR_SET)
8350
8367
  ):
8351
8368
  raise RuntimeError('Duplicate LoggingContextInfoRecordAdapter record attrs')
8352
8369
 
8353
8370
  rec_dct = dict(logging.makeLogRecord({}).__dict__)
8354
8371
 
8355
- if (unk_rec_fields := frozenset(rec_dct) - KNOWN_STD_LOGGING_RECORD_ATTR_SET):
8372
+ if (unk_rec_fields := frozenset(rec_dct) - _KNOWN_STD_LOGGING_RECORD_ATTR_SET):
8356
8373
  import warnings # noqa
8357
8374
 
8358
8375
  warnings.warn(
@@ -8378,11 +8395,60 @@ class LoggingContextLogRecord(logging.LogRecord):
8378
8395
  # - exc_info: LoggingExcInfoTuple | None
8379
8396
  # - func: str | None = None -> funcName
8380
8397
  # - sinfo: str | None = None -> stack_info
8398
+ #
8381
8399
 
8382
8400
  def __init__(self, *, _logging_context: LoggingContext) -> None: # noqa
8401
+ self.__dict__.update(_logging_context=_logging_context)
8402
+
8383
8403
  for ad in _LOGGING_CONTEXT_INFO_RECORD_ADAPTERS_:
8384
8404
  self.__dict__.update(ad.context_to_record(_logging_context))
8385
8405
 
8406
+ _logging_context: LoggingContext
8407
+
8408
+ # FIXME: track extra
8409
+ # def __setattr__(self, key, value):
8410
+ # super().__setattr__(key, value)
8411
+
8412
+
8413
+ ##
8414
+
8415
+
8416
+ @ta.final
8417
+ class LogRecordLoggingContext(LoggingContext):
8418
+ def __init__(self, rec: logging.LogRecord) -> None:
8419
+ if isinstance(rec, LoggingContextLogRecord):
8420
+ raise TypeError(rec)
8421
+
8422
+ self._rec = rec
8423
+
8424
+ infos: ta.List[LoggingContextInfo] = [
8425
+ info
8426
+ for ad in _LOGGING_CONTEXT_INFO_RECORD_ADAPTERS_
8427
+ if (info := ad.record_to_info(rec)) is not None
8428
+ ]
8429
+
8430
+ # FIXME:
8431
+ # if extra is not None:
8432
+ # for key in extra:
8433
+ # if (key in ["message", "asctime"]) or (key in rv.__dict__):
8434
+ # raise KeyError("Attempt to overwrite %r in LogRecord" % key)
8435
+ # rv.__dict__[key] = extra[key]
8436
+
8437
+ if (extra := {
8438
+ a: v
8439
+ for a, v in rec.__dict__.items()
8440
+ if a not in _KNOWN_STD_LOGGING_RECORD_ATTR_SET
8441
+ }):
8442
+ infos.append(LoggingContextInfos.Extra(extra))
8443
+
8444
+ self._infos: ta.Dict[ta.Type[LoggingContextInfo], LoggingContextInfo] = {
8445
+ type(info): info
8446
+ for info in infos
8447
+ }
8448
+
8449
+ def get_info(self, ty: ta.Type[LoggingContextInfoT]) -> ta.Optional[LoggingContextInfoT]:
8450
+ return self._infos.get(ty)
8451
+
8386
8452
 
8387
8453
  ########################################
8388
8454
  # ../../../omlish/subprocesses/base.py
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: omdev
3
- Version: 0.0.0.dev431
3
+ Version: 0.0.0.dev433
4
4
  Summary: omdev
5
5
  Author: wrmsr
6
6
  License-Expression: BSD-3-Clause
@@ -14,10 +14,10 @@ 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: omlish==0.0.0.dev431
17
+ Requires-Dist: omlish==0.0.0.dev433
18
18
  Provides-Extra: all
19
19
  Requires-Dist: black~=25.1; extra == "all"
20
- Requires-Dist: pycparser~=2.22; extra == "all"
20
+ Requires-Dist: pycparser~=2.23; extra == "all"
21
21
  Requires-Dist: pcpp~=1.30; extra == "all"
22
22
  Requires-Dist: docutils~=0.22; extra == "all"
23
23
  Requires-Dist: markdown-it-py~=4.0; extra == "all"
@@ -30,7 +30,7 @@ Requires-Dist: segno~=1.6; extra == "all"
30
30
  Provides-Extra: black
31
31
  Requires-Dist: black~=25.1; extra == "black"
32
32
  Provides-Extra: c
33
- Requires-Dist: pycparser~=2.22; extra == "c"
33
+ Requires-Dist: pycparser~=2.23; extra == "c"
34
34
  Requires-Dist: pcpp~=1.30; extra == "c"
35
35
  Provides-Extra: doc
36
36
  Requires-Dist: docutils~=0.22; extra == "doc"