salesforce-data-customcode 7.0.0rc1__tar.gz → 7.0.0rc2__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 (121) hide show
  1. {salesforce_data_customcode-7.0.0rc1 → salesforce_data_customcode-7.0.0rc2}/PKG-INFO +1 -1
  2. {salesforce_data_customcode-7.0.0rc1 → salesforce_data_customcode-7.0.0rc2}/pyproject.toml +1 -1
  3. {salesforce_data_customcode-7.0.0rc1 → salesforce_data_customcode-7.0.0rc2}/src/datacustomcode/spark/column_hints.py +61 -0
  4. {salesforce_data_customcode-7.0.0rc1 → salesforce_data_customcode-7.0.0rc2}/LICENSE.txt +0 -0
  5. {salesforce_data_customcode-7.0.0rc1 → salesforce_data_customcode-7.0.0rc2}/README.md +0 -0
  6. {salesforce_data_customcode-7.0.0rc1 → salesforce_data_customcode-7.0.0rc2}/src/datacustomcode/__init__.py +0 -0
  7. {salesforce_data_customcode-7.0.0rc1 → salesforce_data_customcode-7.0.0rc2}/src/datacustomcode/auth.py +0 -0
  8. {salesforce_data_customcode-7.0.0rc1 → salesforce_data_customcode-7.0.0rc2}/src/datacustomcode/cli.py +0 -0
  9. {salesforce_data_customcode-7.0.0rc1 → salesforce_data_customcode-7.0.0rc2}/src/datacustomcode/client.py +0 -0
  10. {salesforce_data_customcode-7.0.0rc1 → salesforce_data_customcode-7.0.0rc2}/src/datacustomcode/cmd.py +0 -0
  11. {salesforce_data_customcode-7.0.0rc1 → salesforce_data_customcode-7.0.0rc2}/src/datacustomcode/common_config.py +0 -0
  12. {salesforce_data_customcode-7.0.0rc1 → salesforce_data_customcode-7.0.0rc2}/src/datacustomcode/config.py +0 -0
  13. {salesforce_data_customcode-7.0.0rc1 → salesforce_data_customcode-7.0.0rc2}/src/datacustomcode/config.yaml +0 -0
  14. {salesforce_data_customcode-7.0.0rc1 → salesforce_data_customcode-7.0.0rc2}/src/datacustomcode/constants.py +0 -0
  15. {salesforce_data_customcode-7.0.0rc1 → salesforce_data_customcode-7.0.0rc2}/src/datacustomcode/credentials.py +0 -0
  16. {salesforce_data_customcode-7.0.0rc1 → salesforce_data_customcode-7.0.0rc2}/src/datacustomcode/deploy.py +0 -0
  17. {salesforce_data_customcode-7.0.0rc1 → salesforce_data_customcode-7.0.0rc2}/src/datacustomcode/einstein_platform_client.py +0 -0
  18. {salesforce_data_customcode-7.0.0rc1 → salesforce_data_customcode-7.0.0rc2}/src/datacustomcode/einstein_platform_config.py +0 -0
  19. {salesforce_data_customcode-7.0.0rc1 → salesforce_data_customcode-7.0.0rc2}/src/datacustomcode/einstein_predictions/__init__.py +0 -0
  20. {salesforce_data_customcode-7.0.0rc1 → salesforce_data_customcode-7.0.0rc2}/src/datacustomcode/einstein_predictions/base.py +0 -0
  21. {salesforce_data_customcode-7.0.0rc1 → salesforce_data_customcode-7.0.0rc2}/src/datacustomcode/einstein_predictions/errors.py +0 -0
  22. {salesforce_data_customcode-7.0.0rc1 → salesforce_data_customcode-7.0.0rc2}/src/datacustomcode/einstein_predictions/impl/default.py +0 -0
  23. {salesforce_data_customcode-7.0.0rc1 → salesforce_data_customcode-7.0.0rc2}/src/datacustomcode/einstein_predictions/spark_base.py +0 -0
  24. {salesforce_data_customcode-7.0.0rc1 → salesforce_data_customcode-7.0.0rc2}/src/datacustomcode/einstein_predictions/spark_default.py +0 -0
  25. {salesforce_data_customcode-7.0.0rc1 → salesforce_data_customcode-7.0.0rc2}/src/datacustomcode/einstein_predictions/types.py +0 -0
  26. {salesforce_data_customcode-7.0.0rc1 → salesforce_data_customcode-7.0.0rc2}/src/datacustomcode/einstein_predictions_config.py +0 -0
  27. {salesforce_data_customcode-7.0.0rc1 → salesforce_data_customcode-7.0.0rc2}/src/datacustomcode/file/__init__.py +0 -0
  28. {salesforce_data_customcode-7.0.0rc1 → salesforce_data_customcode-7.0.0rc2}/src/datacustomcode/file/base.py +0 -0
  29. {salesforce_data_customcode-7.0.0rc1 → salesforce_data_customcode-7.0.0rc2}/src/datacustomcode/file/path/__init__.py +0 -0
  30. {salesforce_data_customcode-7.0.0rc1 → salesforce_data_customcode-7.0.0rc2}/src/datacustomcode/file/path/default.py +0 -0
  31. {salesforce_data_customcode-7.0.0rc1 → salesforce_data_customcode-7.0.0rc2}/src/datacustomcode/function/__init__.py +0 -0
  32. {salesforce_data_customcode-7.0.0rc1 → salesforce_data_customcode-7.0.0rc2}/src/datacustomcode/function/base.py +0 -0
  33. {salesforce_data_customcode-7.0.0rc1 → salesforce_data_customcode-7.0.0rc2}/src/datacustomcode/function/feature_types/__init__.py +0 -0
  34. {salesforce_data_customcode-7.0.0rc1 → salesforce_data_customcode-7.0.0rc2}/src/datacustomcode/function/feature_types/chunking.py +0 -0
  35. {salesforce_data_customcode-7.0.0rc1 → salesforce_data_customcode-7.0.0rc2}/src/datacustomcode/function/runtime.py +0 -0
  36. {salesforce_data_customcode-7.0.0rc1 → salesforce_data_customcode-7.0.0rc2}/src/datacustomcode/function_utils.py +0 -0
  37. {salesforce_data_customcode-7.0.0rc1 → salesforce_data_customcode-7.0.0rc2}/src/datacustomcode/io/__init__.py +0 -0
  38. {salesforce_data_customcode-7.0.0rc1 → salesforce_data_customcode-7.0.0rc2}/src/datacustomcode/io/base.py +0 -0
  39. {salesforce_data_customcode-7.0.0rc1 → salesforce_data_customcode-7.0.0rc2}/src/datacustomcode/io/reader/__init__.py +0 -0
  40. {salesforce_data_customcode-7.0.0rc1 → salesforce_data_customcode-7.0.0rc2}/src/datacustomcode/io/reader/base.py +0 -0
  41. {salesforce_data_customcode-7.0.0rc1 → salesforce_data_customcode-7.0.0rc2}/src/datacustomcode/io/reader/query_api.py +0 -0
  42. {salesforce_data_customcode-7.0.0rc1 → salesforce_data_customcode-7.0.0rc2}/src/datacustomcode/io/reader/sf_cli.py +0 -0
  43. {salesforce_data_customcode-7.0.0rc1 → salesforce_data_customcode-7.0.0rc2}/src/datacustomcode/io/reader/utils.py +0 -0
  44. {salesforce_data_customcode-7.0.0rc1 → salesforce_data_customcode-7.0.0rc2}/src/datacustomcode/io/writer/__init__.py +0 -0
  45. {salesforce_data_customcode-7.0.0rc1 → salesforce_data_customcode-7.0.0rc2}/src/datacustomcode/io/writer/base.py +0 -0
  46. {salesforce_data_customcode-7.0.0rc1 → salesforce_data_customcode-7.0.0rc2}/src/datacustomcode/io/writer/csv.py +0 -0
  47. {salesforce_data_customcode-7.0.0rc1 → salesforce_data_customcode-7.0.0rc2}/src/datacustomcode/io/writer/print.py +0 -0
  48. {salesforce_data_customcode-7.0.0rc1 → salesforce_data_customcode-7.0.0rc2}/src/datacustomcode/llm_gateway/__init__.py +0 -0
  49. {salesforce_data_customcode-7.0.0rc1 → salesforce_data_customcode-7.0.0rc2}/src/datacustomcode/llm_gateway/base.py +0 -0
  50. {salesforce_data_customcode-7.0.0rc1 → salesforce_data_customcode-7.0.0rc2}/src/datacustomcode/llm_gateway/default.py +0 -0
  51. {salesforce_data_customcode-7.0.0rc1 → salesforce_data_customcode-7.0.0rc2}/src/datacustomcode/llm_gateway/errors.py +0 -0
  52. {salesforce_data_customcode-7.0.0rc1 → salesforce_data_customcode-7.0.0rc2}/src/datacustomcode/llm_gateway/spark_base.py +0 -0
  53. {salesforce_data_customcode-7.0.0rc1 → salesforce_data_customcode-7.0.0rc2}/src/datacustomcode/llm_gateway/spark_default.py +0 -0
  54. {salesforce_data_customcode-7.0.0rc1 → salesforce_data_customcode-7.0.0rc2}/src/datacustomcode/llm_gateway/types/__init__.py +0 -0
  55. {salesforce_data_customcode-7.0.0rc1 → salesforce_data_customcode-7.0.0rc2}/src/datacustomcode/llm_gateway/types/generate_text_request.py +0 -0
  56. {salesforce_data_customcode-7.0.0rc1 → salesforce_data_customcode-7.0.0rc2}/src/datacustomcode/llm_gateway/types/generate_text_request_builder.py +0 -0
  57. {salesforce_data_customcode-7.0.0rc1 → salesforce_data_customcode-7.0.0rc2}/src/datacustomcode/llm_gateway/types/generate_text_response.py +0 -0
  58. {salesforce_data_customcode-7.0.0rc1 → salesforce_data_customcode-7.0.0rc2}/src/datacustomcode/llm_gateway/types/generate_text_response_builder.py +0 -0
  59. {salesforce_data_customcode-7.0.0rc1 → salesforce_data_customcode-7.0.0rc2}/src/datacustomcode/llm_gateway_config.py +0 -0
  60. {salesforce_data_customcode-7.0.0rc1 → salesforce_data_customcode-7.0.0rc2}/src/datacustomcode/mixin.py +0 -0
  61. {salesforce_data_customcode-7.0.0rc1 → salesforce_data_customcode-7.0.0rc2}/src/datacustomcode/named_credential/__init__.py +0 -0
  62. {salesforce_data_customcode-7.0.0rc1 → salesforce_data_customcode-7.0.0rc2}/src/datacustomcode/named_credential/base.py +0 -0
  63. {salesforce_data_customcode-7.0.0rc1 → salesforce_data_customcode-7.0.0rc2}/src/datacustomcode/named_credential/default.py +0 -0
  64. {salesforce_data_customcode-7.0.0rc1 → salesforce_data_customcode-7.0.0rc2}/src/datacustomcode/named_credential/direct/__init__.py +0 -0
  65. {salesforce_data_customcode-7.0.0rc1 → salesforce_data_customcode-7.0.0rc2}/src/datacustomcode/named_credential/direct/auth.py +0 -0
  66. {salesforce_data_customcode-7.0.0rc1 → salesforce_data_customcode-7.0.0rc2}/src/datacustomcode/named_credential/direct/credentials.py +0 -0
  67. {salesforce_data_customcode-7.0.0rc1 → salesforce_data_customcode-7.0.0rc2}/src/datacustomcode/named_credential/direct/transport.py +0 -0
  68. {salesforce_data_customcode-7.0.0rc1 → salesforce_data_customcode-7.0.0rc2}/src/datacustomcode/named_credential/direct/url_resolver.py +0 -0
  69. {salesforce_data_customcode-7.0.0rc1 → salesforce_data_customcode-7.0.0rc2}/src/datacustomcode/named_credential/errors.py +0 -0
  70. {salesforce_data_customcode-7.0.0rc1 → salesforce_data_customcode-7.0.0rc2}/src/datacustomcode/named_credential/spark_base.py +0 -0
  71. {salesforce_data_customcode-7.0.0rc1 → salesforce_data_customcode-7.0.0rc2}/src/datacustomcode/named_credential/spark_default.py +0 -0
  72. {salesforce_data_customcode-7.0.0rc1 → salesforce_data_customcode-7.0.0rc2}/src/datacustomcode/named_credential/types/__init__.py +0 -0
  73. {salesforce_data_customcode-7.0.0rc1 → salesforce_data_customcode-7.0.0rc2}/src/datacustomcode/named_credential/types/http_method.py +0 -0
  74. {salesforce_data_customcode-7.0.0rc1 → salesforce_data_customcode-7.0.0rc2}/src/datacustomcode/named_credential/types/http_request.py +0 -0
  75. {salesforce_data_customcode-7.0.0rc1 → salesforce_data_customcode-7.0.0rc2}/src/datacustomcode/named_credential/types/http_request_builder.py +0 -0
  76. {salesforce_data_customcode-7.0.0rc1 → salesforce_data_customcode-7.0.0rc2}/src/datacustomcode/named_credential/types/http_response.py +0 -0
  77. {salesforce_data_customcode-7.0.0rc1 → salesforce_data_customcode-7.0.0rc2}/src/datacustomcode/named_credential/types/http_response_builder.py +0 -0
  78. {salesforce_data_customcode-7.0.0rc1 → salesforce_data_customcode-7.0.0rc2}/src/datacustomcode/named_credential_config.py +0 -0
  79. {salesforce_data_customcode-7.0.0rc1 → salesforce_data_customcode-7.0.0rc2}/src/datacustomcode/py.typed +0 -0
  80. {salesforce_data_customcode-7.0.0rc1 → salesforce_data_customcode-7.0.0rc2}/src/datacustomcode/run.py +0 -0
  81. {salesforce_data_customcode-7.0.0rc1 → salesforce_data_customcode-7.0.0rc2}/src/datacustomcode/scan.py +0 -0
  82. {salesforce_data_customcode-7.0.0rc1 → salesforce_data_customcode-7.0.0rc2}/src/datacustomcode/spark/__init__.py +0 -0
  83. {salesforce_data_customcode-7.0.0rc1 → salesforce_data_customcode-7.0.0rc2}/src/datacustomcode/spark/base.py +0 -0
  84. {salesforce_data_customcode-7.0.0rc1 → salesforce_data_customcode-7.0.0rc2}/src/datacustomcode/spark/default.py +0 -0
  85. {salesforce_data_customcode-7.0.0rc1 → salesforce_data_customcode-7.0.0rc2}/src/datacustomcode/template.py +0 -0
  86. {salesforce_data_customcode-7.0.0rc1 → salesforce_data_customcode-7.0.0rc2}/src/datacustomcode/templates/__init__.py +0 -0
  87. {salesforce_data_customcode-7.0.0rc1 → salesforce_data_customcode-7.0.0rc2}/src/datacustomcode/templates/function/.devcontainer/devcontainer.json +0 -0
  88. {salesforce_data_customcode-7.0.0rc1 → salesforce_data_customcode-7.0.0rc2}/src/datacustomcode/templates/function/Dockerfile.dependencies +0 -0
  89. {salesforce_data_customcode-7.0.0rc1 → salesforce_data_customcode-7.0.0rc2}/src/datacustomcode/templates/function/README.md +0 -0
  90. {salesforce_data_customcode-7.0.0rc1 → salesforce_data_customcode-7.0.0rc2}/src/datacustomcode/templates/function/build_native_dependencies.sh +0 -0
  91. {salesforce_data_customcode-7.0.0rc1 → salesforce_data_customcode-7.0.0rc2}/src/datacustomcode/templates/function/chunking/payload/config.json +0 -0
  92. {salesforce_data_customcode-7.0.0rc1 → salesforce_data_customcode-7.0.0rc2}/src/datacustomcode/templates/function/chunking/payload/entrypoint.py +0 -0
  93. {salesforce_data_customcode-7.0.0rc1 → salesforce_data_customcode-7.0.0rc2}/src/datacustomcode/templates/function/chunking/requirements.txt +0 -0
  94. {salesforce_data_customcode-7.0.0rc1 → salesforce_data_customcode-7.0.0rc2}/src/datacustomcode/templates/function/example/chunking_with_llm/config.json +0 -0
  95. {salesforce_data_customcode-7.0.0rc1 → salesforce_data_customcode-7.0.0rc2}/src/datacustomcode/templates/function/example/chunking_with_llm/entrypoint.py +0 -0
  96. {salesforce_data_customcode-7.0.0rc1 → salesforce_data_customcode-7.0.0rc2}/src/datacustomcode/templates/function/example/chunking_with_llm/files/chunking_prompt.txt +0 -0
  97. {salesforce_data_customcode-7.0.0rc1 → salesforce_data_customcode-7.0.0rc2}/src/datacustomcode/templates/function/example/chunking_with_llm/tests/test.json +0 -0
  98. {salesforce_data_customcode-7.0.0rc1 → salesforce_data_customcode-7.0.0rc2}/src/datacustomcode/templates/function/example/chunking_with_prediction/config.json +0 -0
  99. {salesforce_data_customcode-7.0.0rc1 → salesforce_data_customcode-7.0.0rc2}/src/datacustomcode/templates/function/example/chunking_with_prediction/entrypoint.py +0 -0
  100. {salesforce_data_customcode-7.0.0rc1 → salesforce_data_customcode-7.0.0rc2}/src/datacustomcode/templates/function/example/chunking_with_prediction/tests/test.json +0 -0
  101. {salesforce_data_customcode-7.0.0rc1 → salesforce_data_customcode-7.0.0rc2}/src/datacustomcode/templates/function/payload/config.json +0 -0
  102. {salesforce_data_customcode-7.0.0rc1 → salesforce_data_customcode-7.0.0rc2}/src/datacustomcode/templates/function/payload/entrypoint.py +0 -0
  103. {salesforce_data_customcode-7.0.0rc1 → salesforce_data_customcode-7.0.0rc2}/src/datacustomcode/templates/function/payload/utility.py +0 -0
  104. {salesforce_data_customcode-7.0.0rc1 → salesforce_data_customcode-7.0.0rc2}/src/datacustomcode/templates/function/requirements-dev.txt +0 -0
  105. {salesforce_data_customcode-7.0.0rc1 → salesforce_data_customcode-7.0.0rc2}/src/datacustomcode/templates/function/requirements.txt +0 -0
  106. {salesforce_data_customcode-7.0.0rc1 → salesforce_data_customcode-7.0.0rc2}/src/datacustomcode/templates/script/.devcontainer/devcontainer.json +0 -0
  107. {salesforce_data_customcode-7.0.0rc1 → salesforce_data_customcode-7.0.0rc2}/src/datacustomcode/templates/script/Dockerfile +0 -0
  108. {salesforce_data_customcode-7.0.0rc1 → salesforce_data_customcode-7.0.0rc2}/src/datacustomcode/templates/script/Dockerfile.dependencies +0 -0
  109. {salesforce_data_customcode-7.0.0rc1 → salesforce_data_customcode-7.0.0rc2}/src/datacustomcode/templates/script/README.md +0 -0
  110. {salesforce_data_customcode-7.0.0rc1 → salesforce_data_customcode-7.0.0rc2}/src/datacustomcode/templates/script/account.ipynb +0 -0
  111. {salesforce_data_customcode-7.0.0rc1 → salesforce_data_customcode-7.0.0rc2}/src/datacustomcode/templates/script/build_native_dependencies.sh +0 -0
  112. {salesforce_data_customcode-7.0.0rc1 → salesforce_data_customcode-7.0.0rc2}/src/datacustomcode/templates/script/examples/employee_hierarchy/employee_data.csv +0 -0
  113. {salesforce_data_customcode-7.0.0rc1 → salesforce_data_customcode-7.0.0rc2}/src/datacustomcode/templates/script/examples/employee_hierarchy/entrypoint.py +0 -0
  114. {salesforce_data_customcode-7.0.0rc1 → salesforce_data_customcode-7.0.0rc2}/src/datacustomcode/templates/script/examples/streaming_deltas/entrypoint.py +0 -0
  115. {salesforce_data_customcode-7.0.0rc1 → salesforce_data_customcode-7.0.0rc2}/src/datacustomcode/templates/script/jupyterlab.sh +0 -0
  116. {salesforce_data_customcode-7.0.0rc1 → salesforce_data_customcode-7.0.0rc2}/src/datacustomcode/templates/script/payload/config.json +0 -0
  117. {salesforce_data_customcode-7.0.0rc1 → salesforce_data_customcode-7.0.0rc2}/src/datacustomcode/templates/script/payload/entrypoint.py +0 -0
  118. {salesforce_data_customcode-7.0.0rc1 → salesforce_data_customcode-7.0.0rc2}/src/datacustomcode/templates/script/requirements-dev.txt +0 -0
  119. {salesforce_data_customcode-7.0.0rc1 → salesforce_data_customcode-7.0.0rc2}/src/datacustomcode/templates/script/requirements.txt +0 -0
  120. {salesforce_data_customcode-7.0.0rc1 → salesforce_data_customcode-7.0.0rc2}/src/datacustomcode/token_provider.py +0 -0
  121. {salesforce_data_customcode-7.0.0rc1 → salesforce_data_customcode-7.0.0rc2}/src/datacustomcode/version.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: salesforce-data-customcode
3
- Version: 7.0.0rc1
3
+ Version: 7.0.0rc2
4
4
  Summary: Data Cloud Custom Code SDK
5
5
  License-Expression: Apache-2.0
6
6
  License-File: LICENSE.txt
@@ -18,7 +18,7 @@ license = "Apache-2.0"
18
18
  name = "salesforce-data-customcode"
19
19
  readme = "README.md"
20
20
  requires-python = ">=3.10,<3.12"
21
- version = "7.0.0rc1"
21
+ version = "7.0.0rc2"
22
22
 
23
23
  [tool.black]
24
24
  exclude = '''
@@ -28,7 +28,14 @@ error that was already going to be raised, and only for a pure casing mismatch.
28
28
  """
29
29
  from __future__ import annotations
30
30
 
31
+ import importlib.abc
31
32
  import logging
33
+ import sys
34
+ from typing import TYPE_CHECKING
35
+
36
+ if TYPE_CHECKING:
37
+ from importlib.machinery import ModuleSpec
38
+ from types import ModuleType
32
39
 
33
40
  logger = logging.getLogger(__name__)
34
41
 
@@ -125,9 +132,63 @@ def _install_getattr_hook() -> None:
125
132
 
126
133
 
127
134
  def install_column_casing_hints() -> None:
135
+ """Arrange for the column-casing hint hooks to be installed.
136
+
137
+ Never imports pyspark directly. If pyspark is already loaded, the hooks
138
+ are installed immediately; otherwise, installation is deferred until
139
+ ``pyspark.sql`` is actually imported by someone. Idempotent; never raises.
140
+ """
141
+ if "pyspark.sql" in sys.modules:
142
+ _install_hooks_now()
143
+ return
144
+ if any(isinstance(finder, _PySparkImportHook) for finder in sys.meta_path):
145
+ return
146
+ try:
147
+ sys.meta_path.insert(0, _PySparkImportHook())
148
+ except Exception as exc: # pragma: no cover - defensive
149
+ logger.debug(f"Could not defer column-casing hint installation: {exc}")
150
+
151
+
152
+ def _install_hooks_now() -> None:
128
153
  """Install the column-casing hint hooks. Idempotent; never raises."""
129
154
  try:
130
155
  _install_analysis_exception_hook()
131
156
  _install_getattr_hook()
132
157
  except Exception as exc: # pragma: no cover - defensive
133
158
  logger.debug(f"Could not install column-casing hint hooks: {exc}")
159
+
160
+
161
+ class _PySparkImportHook(importlib.abc.MetaPathFinder):
162
+ """Installs the hint hooks right after ``pyspark.sql`` finishes loading.
163
+
164
+ ``install_column_casing_hints`` must not import pyspark itself: this
165
+ package is also used in the pyspark-free Function code path that must
166
+ not pull pyspark in as a side effect of importing ``datacustomcode``.
167
+ Wrapping the real loader lets us defer the pyspark import until whoever
168
+ actually needs it (the SDK's own lazy accessors, or user code) imports
169
+ ``pyspark.sql`` on their own.
170
+ """
171
+
172
+ def find_spec(
173
+ self, fullname: str, path: object, target: ModuleType | None = None
174
+ ) -> ModuleSpec | None:
175
+ if fullname != "pyspark.sql":
176
+ return None
177
+
178
+ for finder in sys.meta_path:
179
+ if finder is self:
180
+ continue
181
+ find_spec = getattr(finder, "find_spec", None)
182
+ if find_spec is None:
183
+ continue
184
+ spec = find_spec(fullname, path, target)
185
+ if spec is not None and spec.loader is not None:
186
+ original_exec_module = spec.loader.exec_module
187
+
188
+ def exec_module(module: ModuleType, _orig=original_exec_module) -> None:
189
+ _orig(module)
190
+ _install_hooks_now()
191
+
192
+ spec.loader.exec_module = exec_module # type: ignore[method-assign]
193
+ return spec # type: ignore[no-any-return]
194
+ return None