genesis-flow 1.0.0__py3-none-any.whl

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 (645) hide show
  1. genesis_flow-1.0.0.dist-info/METADATA +822 -0
  2. genesis_flow-1.0.0.dist-info/RECORD +645 -0
  3. genesis_flow-1.0.0.dist-info/WHEEL +5 -0
  4. genesis_flow-1.0.0.dist-info/entry_points.txt +19 -0
  5. genesis_flow-1.0.0.dist-info/licenses/LICENSE.txt +202 -0
  6. genesis_flow-1.0.0.dist-info/top_level.txt +1 -0
  7. mlflow/__init__.py +367 -0
  8. mlflow/__main__.py +3 -0
  9. mlflow/ag2/__init__.py +56 -0
  10. mlflow/ag2/ag2_logger.py +294 -0
  11. mlflow/anthropic/__init__.py +40 -0
  12. mlflow/anthropic/autolog.py +129 -0
  13. mlflow/anthropic/chat.py +144 -0
  14. mlflow/artifacts/__init__.py +268 -0
  15. mlflow/autogen/__init__.py +144 -0
  16. mlflow/autogen/chat.py +142 -0
  17. mlflow/azure/__init__.py +26 -0
  18. mlflow/azure/auth_handler.py +257 -0
  19. mlflow/azure/client.py +319 -0
  20. mlflow/azure/config.py +120 -0
  21. mlflow/azure/connection_factory.py +340 -0
  22. mlflow/azure/exceptions.py +27 -0
  23. mlflow/azure/stores.py +327 -0
  24. mlflow/azure/utils.py +183 -0
  25. mlflow/bedrock/__init__.py +45 -0
  26. mlflow/bedrock/_autolog.py +202 -0
  27. mlflow/bedrock/chat.py +122 -0
  28. mlflow/bedrock/stream.py +160 -0
  29. mlflow/bedrock/utils.py +43 -0
  30. mlflow/cli.py +707 -0
  31. mlflow/client.py +12 -0
  32. mlflow/config/__init__.py +56 -0
  33. mlflow/crewai/__init__.py +79 -0
  34. mlflow/crewai/autolog.py +253 -0
  35. mlflow/crewai/chat.py +29 -0
  36. mlflow/data/__init__.py +75 -0
  37. mlflow/data/artifact_dataset_sources.py +170 -0
  38. mlflow/data/code_dataset_source.py +40 -0
  39. mlflow/data/dataset.py +123 -0
  40. mlflow/data/dataset_registry.py +168 -0
  41. mlflow/data/dataset_source.py +110 -0
  42. mlflow/data/dataset_source_registry.py +219 -0
  43. mlflow/data/delta_dataset_source.py +167 -0
  44. mlflow/data/digest_utils.py +108 -0
  45. mlflow/data/evaluation_dataset.py +562 -0
  46. mlflow/data/filesystem_dataset_source.py +81 -0
  47. mlflow/data/http_dataset_source.py +145 -0
  48. mlflow/data/huggingface_dataset.py +258 -0
  49. mlflow/data/huggingface_dataset_source.py +118 -0
  50. mlflow/data/meta_dataset.py +104 -0
  51. mlflow/data/numpy_dataset.py +223 -0
  52. mlflow/data/pandas_dataset.py +231 -0
  53. mlflow/data/polars_dataset.py +352 -0
  54. mlflow/data/pyfunc_dataset_mixin.py +31 -0
  55. mlflow/data/schema.py +76 -0
  56. mlflow/data/sources.py +1 -0
  57. mlflow/data/spark_dataset.py +406 -0
  58. mlflow/data/spark_dataset_source.py +74 -0
  59. mlflow/data/spark_delta_utils.py +118 -0
  60. mlflow/data/tensorflow_dataset.py +350 -0
  61. mlflow/data/uc_volume_dataset_source.py +81 -0
  62. mlflow/db.py +27 -0
  63. mlflow/dspy/__init__.py +17 -0
  64. mlflow/dspy/autolog.py +197 -0
  65. mlflow/dspy/callback.py +398 -0
  66. mlflow/dspy/constant.py +1 -0
  67. mlflow/dspy/load.py +93 -0
  68. mlflow/dspy/save.py +393 -0
  69. mlflow/dspy/util.py +109 -0
  70. mlflow/dspy/wrapper.py +226 -0
  71. mlflow/entities/__init__.py +104 -0
  72. mlflow/entities/_mlflow_object.py +52 -0
  73. mlflow/entities/assessment.py +545 -0
  74. mlflow/entities/assessment_error.py +80 -0
  75. mlflow/entities/assessment_source.py +141 -0
  76. mlflow/entities/dataset.py +92 -0
  77. mlflow/entities/dataset_input.py +51 -0
  78. mlflow/entities/dataset_summary.py +62 -0
  79. mlflow/entities/document.py +48 -0
  80. mlflow/entities/experiment.py +109 -0
  81. mlflow/entities/experiment_tag.py +35 -0
  82. mlflow/entities/file_info.py +45 -0
  83. mlflow/entities/input_tag.py +35 -0
  84. mlflow/entities/lifecycle_stage.py +35 -0
  85. mlflow/entities/logged_model.py +228 -0
  86. mlflow/entities/logged_model_input.py +26 -0
  87. mlflow/entities/logged_model_output.py +32 -0
  88. mlflow/entities/logged_model_parameter.py +46 -0
  89. mlflow/entities/logged_model_status.py +74 -0
  90. mlflow/entities/logged_model_tag.py +33 -0
  91. mlflow/entities/metric.py +200 -0
  92. mlflow/entities/model_registry/__init__.py +29 -0
  93. mlflow/entities/model_registry/_model_registry_entity.py +13 -0
  94. mlflow/entities/model_registry/model_version.py +243 -0
  95. mlflow/entities/model_registry/model_version_deployment_job_run_state.py +44 -0
  96. mlflow/entities/model_registry/model_version_deployment_job_state.py +70 -0
  97. mlflow/entities/model_registry/model_version_search.py +25 -0
  98. mlflow/entities/model_registry/model_version_stages.py +25 -0
  99. mlflow/entities/model_registry/model_version_status.py +35 -0
  100. mlflow/entities/model_registry/model_version_tag.py +35 -0
  101. mlflow/entities/model_registry/prompt.py +73 -0
  102. mlflow/entities/model_registry/prompt_version.py +244 -0
  103. mlflow/entities/model_registry/registered_model.py +175 -0
  104. mlflow/entities/model_registry/registered_model_alias.py +35 -0
  105. mlflow/entities/model_registry/registered_model_deployment_job_state.py +39 -0
  106. mlflow/entities/model_registry/registered_model_search.py +25 -0
  107. mlflow/entities/model_registry/registered_model_tag.py +35 -0
  108. mlflow/entities/multipart_upload.py +74 -0
  109. mlflow/entities/param.py +49 -0
  110. mlflow/entities/run.py +97 -0
  111. mlflow/entities/run_data.py +84 -0
  112. mlflow/entities/run_info.py +188 -0
  113. mlflow/entities/run_inputs.py +59 -0
  114. mlflow/entities/run_outputs.py +43 -0
  115. mlflow/entities/run_status.py +41 -0
  116. mlflow/entities/run_tag.py +36 -0
  117. mlflow/entities/source_type.py +31 -0
  118. mlflow/entities/span.py +774 -0
  119. mlflow/entities/span_event.py +96 -0
  120. mlflow/entities/span_status.py +102 -0
  121. mlflow/entities/trace.py +317 -0
  122. mlflow/entities/trace_data.py +71 -0
  123. mlflow/entities/trace_info.py +220 -0
  124. mlflow/entities/trace_info_v2.py +162 -0
  125. mlflow/entities/trace_location.py +173 -0
  126. mlflow/entities/trace_state.py +39 -0
  127. mlflow/entities/trace_status.py +68 -0
  128. mlflow/entities/view_type.py +51 -0
  129. mlflow/environment_variables.py +866 -0
  130. mlflow/evaluation/__init__.py +16 -0
  131. mlflow/evaluation/assessment.py +369 -0
  132. mlflow/evaluation/evaluation.py +411 -0
  133. mlflow/evaluation/evaluation_tag.py +61 -0
  134. mlflow/evaluation/fluent.py +48 -0
  135. mlflow/evaluation/utils.py +201 -0
  136. mlflow/exceptions.py +213 -0
  137. mlflow/experiments.py +140 -0
  138. mlflow/gemini/__init__.py +81 -0
  139. mlflow/gemini/autolog.py +186 -0
  140. mlflow/gemini/chat.py +261 -0
  141. mlflow/genai/__init__.py +71 -0
  142. mlflow/genai/datasets/__init__.py +67 -0
  143. mlflow/genai/datasets/evaluation_dataset.py +131 -0
  144. mlflow/genai/evaluation/__init__.py +3 -0
  145. mlflow/genai/evaluation/base.py +411 -0
  146. mlflow/genai/evaluation/constant.py +23 -0
  147. mlflow/genai/evaluation/utils.py +244 -0
  148. mlflow/genai/judges/__init__.py +21 -0
  149. mlflow/genai/judges/databricks.py +404 -0
  150. mlflow/genai/label_schemas/__init__.py +153 -0
  151. mlflow/genai/label_schemas/label_schemas.py +209 -0
  152. mlflow/genai/labeling/__init__.py +159 -0
  153. mlflow/genai/labeling/labeling.py +250 -0
  154. mlflow/genai/optimize/__init__.py +13 -0
  155. mlflow/genai/optimize/base.py +198 -0
  156. mlflow/genai/optimize/optimizers/__init__.py +4 -0
  157. mlflow/genai/optimize/optimizers/base_optimizer.py +38 -0
  158. mlflow/genai/optimize/optimizers/dspy_mipro_optimizer.py +221 -0
  159. mlflow/genai/optimize/optimizers/dspy_optimizer.py +91 -0
  160. mlflow/genai/optimize/optimizers/utils/dspy_mipro_callback.py +76 -0
  161. mlflow/genai/optimize/optimizers/utils/dspy_mipro_utils.py +18 -0
  162. mlflow/genai/optimize/types.py +75 -0
  163. mlflow/genai/optimize/util.py +30 -0
  164. mlflow/genai/prompts/__init__.py +206 -0
  165. mlflow/genai/scheduled_scorers.py +431 -0
  166. mlflow/genai/scorers/__init__.py +26 -0
  167. mlflow/genai/scorers/base.py +492 -0
  168. mlflow/genai/scorers/builtin_scorers.py +765 -0
  169. mlflow/genai/scorers/scorer_utils.py +138 -0
  170. mlflow/genai/scorers/validation.py +165 -0
  171. mlflow/genai/utils/data_validation.py +146 -0
  172. mlflow/genai/utils/enum_utils.py +23 -0
  173. mlflow/genai/utils/trace_utils.py +211 -0
  174. mlflow/groq/__init__.py +42 -0
  175. mlflow/groq/_groq_autolog.py +74 -0
  176. mlflow/johnsnowlabs/__init__.py +888 -0
  177. mlflow/langchain/__init__.py +24 -0
  178. mlflow/langchain/api_request_parallel_processor.py +330 -0
  179. mlflow/langchain/autolog.py +147 -0
  180. mlflow/langchain/chat_agent_langgraph.py +340 -0
  181. mlflow/langchain/constant.py +1 -0
  182. mlflow/langchain/constants.py +1 -0
  183. mlflow/langchain/databricks_dependencies.py +444 -0
  184. mlflow/langchain/langchain_tracer.py +597 -0
  185. mlflow/langchain/model.py +919 -0
  186. mlflow/langchain/output_parsers.py +142 -0
  187. mlflow/langchain/retriever_chain.py +153 -0
  188. mlflow/langchain/runnables.py +527 -0
  189. mlflow/langchain/utils/chat.py +402 -0
  190. mlflow/langchain/utils/logging.py +671 -0
  191. mlflow/langchain/utils/serialization.py +36 -0
  192. mlflow/legacy_databricks_cli/__init__.py +0 -0
  193. mlflow/legacy_databricks_cli/configure/__init__.py +0 -0
  194. mlflow/legacy_databricks_cli/configure/provider.py +482 -0
  195. mlflow/litellm/__init__.py +175 -0
  196. mlflow/llama_index/__init__.py +22 -0
  197. mlflow/llama_index/autolog.py +55 -0
  198. mlflow/llama_index/chat.py +43 -0
  199. mlflow/llama_index/constant.py +1 -0
  200. mlflow/llama_index/model.py +577 -0
  201. mlflow/llama_index/pyfunc_wrapper.py +332 -0
  202. mlflow/llama_index/serialize_objects.py +188 -0
  203. mlflow/llama_index/tracer.py +561 -0
  204. mlflow/metrics/__init__.py +479 -0
  205. mlflow/metrics/base.py +39 -0
  206. mlflow/metrics/genai/__init__.py +25 -0
  207. mlflow/metrics/genai/base.py +101 -0
  208. mlflow/metrics/genai/genai_metric.py +771 -0
  209. mlflow/metrics/genai/metric_definitions.py +450 -0
  210. mlflow/metrics/genai/model_utils.py +371 -0
  211. mlflow/metrics/genai/prompt_template.py +68 -0
  212. mlflow/metrics/genai/prompts/__init__.py +0 -0
  213. mlflow/metrics/genai/prompts/v1.py +422 -0
  214. mlflow/metrics/genai/utils.py +6 -0
  215. mlflow/metrics/metric_definitions.py +619 -0
  216. mlflow/mismatch.py +34 -0
  217. mlflow/mistral/__init__.py +34 -0
  218. mlflow/mistral/autolog.py +71 -0
  219. mlflow/mistral/chat.py +135 -0
  220. mlflow/ml_package_versions.py +452 -0
  221. mlflow/models/__init__.py +97 -0
  222. mlflow/models/auth_policy.py +83 -0
  223. mlflow/models/cli.py +354 -0
  224. mlflow/models/container/__init__.py +294 -0
  225. mlflow/models/container/scoring_server/__init__.py +0 -0
  226. mlflow/models/container/scoring_server/nginx.conf +39 -0
  227. mlflow/models/dependencies_schemas.py +287 -0
  228. mlflow/models/display_utils.py +158 -0
  229. mlflow/models/docker_utils.py +211 -0
  230. mlflow/models/evaluation/__init__.py +23 -0
  231. mlflow/models/evaluation/_shap_patch.py +64 -0
  232. mlflow/models/evaluation/artifacts.py +194 -0
  233. mlflow/models/evaluation/base.py +1811 -0
  234. mlflow/models/evaluation/calibration_curve.py +109 -0
  235. mlflow/models/evaluation/default_evaluator.py +996 -0
  236. mlflow/models/evaluation/deprecated.py +23 -0
  237. mlflow/models/evaluation/evaluator_registry.py +80 -0
  238. mlflow/models/evaluation/evaluators/classifier.py +704 -0
  239. mlflow/models/evaluation/evaluators/default.py +233 -0
  240. mlflow/models/evaluation/evaluators/regressor.py +96 -0
  241. mlflow/models/evaluation/evaluators/shap.py +296 -0
  242. mlflow/models/evaluation/lift_curve.py +178 -0
  243. mlflow/models/evaluation/utils/metric.py +123 -0
  244. mlflow/models/evaluation/utils/trace.py +179 -0
  245. mlflow/models/evaluation/validation.py +434 -0
  246. mlflow/models/flavor_backend.py +93 -0
  247. mlflow/models/flavor_backend_registry.py +53 -0
  248. mlflow/models/model.py +1639 -0
  249. mlflow/models/model_config.py +150 -0
  250. mlflow/models/notebook_resources/agent_evaluation_template.html +235 -0
  251. mlflow/models/notebook_resources/eval_with_dataset_example.py +22 -0
  252. mlflow/models/notebook_resources/eval_with_synthetic_example.py +22 -0
  253. mlflow/models/python_api.py +369 -0
  254. mlflow/models/rag_signatures.py +128 -0
  255. mlflow/models/resources.py +321 -0
  256. mlflow/models/signature.py +662 -0
  257. mlflow/models/utils.py +2054 -0
  258. mlflow/models/wheeled_model.py +280 -0
  259. mlflow/openai/__init__.py +57 -0
  260. mlflow/openai/_agent_tracer.py +364 -0
  261. mlflow/openai/api_request_parallel_processor.py +131 -0
  262. mlflow/openai/autolog.py +509 -0
  263. mlflow/openai/constant.py +1 -0
  264. mlflow/openai/model.py +824 -0
  265. mlflow/openai/utils/chat_schema.py +367 -0
  266. mlflow/optuna/__init__.py +3 -0
  267. mlflow/optuna/storage.py +646 -0
  268. mlflow/plugins/__init__.py +72 -0
  269. mlflow/plugins/base.py +358 -0
  270. mlflow/plugins/builtin/__init__.py +24 -0
  271. mlflow/plugins/builtin/pytorch_plugin.py +150 -0
  272. mlflow/plugins/builtin/sklearn_plugin.py +158 -0
  273. mlflow/plugins/builtin/transformers_plugin.py +187 -0
  274. mlflow/plugins/cli.py +321 -0
  275. mlflow/plugins/discovery.py +340 -0
  276. mlflow/plugins/manager.py +465 -0
  277. mlflow/plugins/registry.py +316 -0
  278. mlflow/plugins/templates/framework_plugin_template.py +329 -0
  279. mlflow/prompt/constants.py +20 -0
  280. mlflow/prompt/promptlab_model.py +197 -0
  281. mlflow/prompt/registry_utils.py +248 -0
  282. mlflow/promptflow/__init__.py +495 -0
  283. mlflow/protos/__init__.py +0 -0
  284. mlflow/protos/assessments_pb2.py +174 -0
  285. mlflow/protos/databricks_artifacts_pb2.py +489 -0
  286. mlflow/protos/databricks_filesystem_service_pb2.py +196 -0
  287. mlflow/protos/databricks_managed_catalog_messages_pb2.py +95 -0
  288. mlflow/protos/databricks_managed_catalog_service_pb2.py +86 -0
  289. mlflow/protos/databricks_pb2.py +267 -0
  290. mlflow/protos/databricks_trace_server_pb2.py +374 -0
  291. mlflow/protos/databricks_uc_registry_messages_pb2.py +1249 -0
  292. mlflow/protos/databricks_uc_registry_service_pb2.py +170 -0
  293. mlflow/protos/facet_feature_statistics_pb2.py +296 -0
  294. mlflow/protos/internal_pb2.py +77 -0
  295. mlflow/protos/mlflow_artifacts_pb2.py +336 -0
  296. mlflow/protos/model_registry_pb2.py +1073 -0
  297. mlflow/protos/scalapb/__init__.py +0 -0
  298. mlflow/protos/scalapb/scalapb_pb2.py +104 -0
  299. mlflow/protos/service_pb2.py +2600 -0
  300. mlflow/protos/unity_catalog_oss_messages_pb2.py +457 -0
  301. mlflow/protos/unity_catalog_oss_service_pb2.py +130 -0
  302. mlflow/protos/unity_catalog_prompt_messages_pb2.py +447 -0
  303. mlflow/protos/unity_catalog_prompt_messages_pb2_grpc.py +24 -0
  304. mlflow/protos/unity_catalog_prompt_service_pb2.py +164 -0
  305. mlflow/protos/unity_catalog_prompt_service_pb2_grpc.py +785 -0
  306. mlflow/py.typed +0 -0
  307. mlflow/pydantic_ai/__init__.py +57 -0
  308. mlflow/pydantic_ai/autolog.py +173 -0
  309. mlflow/pyfunc/__init__.py +3844 -0
  310. mlflow/pyfunc/_mlflow_pyfunc_backend_predict.py +61 -0
  311. mlflow/pyfunc/backend.py +523 -0
  312. mlflow/pyfunc/context.py +78 -0
  313. mlflow/pyfunc/dbconnect_artifact_cache.py +144 -0
  314. mlflow/pyfunc/loaders/__init__.py +7 -0
  315. mlflow/pyfunc/loaders/chat_agent.py +117 -0
  316. mlflow/pyfunc/loaders/chat_model.py +125 -0
  317. mlflow/pyfunc/loaders/code_model.py +31 -0
  318. mlflow/pyfunc/loaders/responses_agent.py +112 -0
  319. mlflow/pyfunc/mlserver.py +46 -0
  320. mlflow/pyfunc/model.py +1473 -0
  321. mlflow/pyfunc/scoring_server/__init__.py +604 -0
  322. mlflow/pyfunc/scoring_server/app.py +7 -0
  323. mlflow/pyfunc/scoring_server/client.py +146 -0
  324. mlflow/pyfunc/spark_model_cache.py +48 -0
  325. mlflow/pyfunc/stdin_server.py +44 -0
  326. mlflow/pyfunc/utils/__init__.py +3 -0
  327. mlflow/pyfunc/utils/data_validation.py +224 -0
  328. mlflow/pyfunc/utils/environment.py +22 -0
  329. mlflow/pyfunc/utils/input_converter.py +47 -0
  330. mlflow/pyfunc/utils/serving_data_parser.py +11 -0
  331. mlflow/pytorch/__init__.py +1171 -0
  332. mlflow/pytorch/_lightning_autolog.py +580 -0
  333. mlflow/pytorch/_pytorch_autolog.py +50 -0
  334. mlflow/pytorch/pickle_module.py +35 -0
  335. mlflow/rfunc/__init__.py +42 -0
  336. mlflow/rfunc/backend.py +134 -0
  337. mlflow/runs.py +89 -0
  338. mlflow/server/__init__.py +302 -0
  339. mlflow/server/auth/__init__.py +1224 -0
  340. mlflow/server/auth/__main__.py +4 -0
  341. mlflow/server/auth/basic_auth.ini +6 -0
  342. mlflow/server/auth/cli.py +11 -0
  343. mlflow/server/auth/client.py +537 -0
  344. mlflow/server/auth/config.py +34 -0
  345. mlflow/server/auth/db/__init__.py +0 -0
  346. mlflow/server/auth/db/cli.py +18 -0
  347. mlflow/server/auth/db/migrations/__init__.py +0 -0
  348. mlflow/server/auth/db/migrations/alembic.ini +110 -0
  349. mlflow/server/auth/db/migrations/env.py +76 -0
  350. mlflow/server/auth/db/migrations/versions/8606fa83a998_initial_migration.py +51 -0
  351. mlflow/server/auth/db/migrations/versions/__init__.py +0 -0
  352. mlflow/server/auth/db/models.py +67 -0
  353. mlflow/server/auth/db/utils.py +37 -0
  354. mlflow/server/auth/entities.py +165 -0
  355. mlflow/server/auth/logo.py +14 -0
  356. mlflow/server/auth/permissions.py +65 -0
  357. mlflow/server/auth/routes.py +18 -0
  358. mlflow/server/auth/sqlalchemy_store.py +263 -0
  359. mlflow/server/graphql/__init__.py +0 -0
  360. mlflow/server/graphql/autogenerated_graphql_schema.py +353 -0
  361. mlflow/server/graphql/graphql_custom_scalars.py +24 -0
  362. mlflow/server/graphql/graphql_errors.py +15 -0
  363. mlflow/server/graphql/graphql_no_batching.py +89 -0
  364. mlflow/server/graphql/graphql_schema_extensions.py +74 -0
  365. mlflow/server/handlers.py +3217 -0
  366. mlflow/server/prometheus_exporter.py +17 -0
  367. mlflow/server/validation.py +30 -0
  368. mlflow/shap/__init__.py +691 -0
  369. mlflow/sklearn/__init__.py +1994 -0
  370. mlflow/sklearn/utils.py +1041 -0
  371. mlflow/smolagents/__init__.py +66 -0
  372. mlflow/smolagents/autolog.py +139 -0
  373. mlflow/smolagents/chat.py +29 -0
  374. mlflow/store/__init__.py +10 -0
  375. mlflow/store/_unity_catalog/__init__.py +1 -0
  376. mlflow/store/_unity_catalog/lineage/__init__.py +1 -0
  377. mlflow/store/_unity_catalog/lineage/constants.py +2 -0
  378. mlflow/store/_unity_catalog/registry/__init__.py +6 -0
  379. mlflow/store/_unity_catalog/registry/prompt_info.py +75 -0
  380. mlflow/store/_unity_catalog/registry/rest_store.py +1740 -0
  381. mlflow/store/_unity_catalog/registry/uc_oss_rest_store.py +507 -0
  382. mlflow/store/_unity_catalog/registry/utils.py +121 -0
  383. mlflow/store/artifact/__init__.py +0 -0
  384. mlflow/store/artifact/artifact_repo.py +472 -0
  385. mlflow/store/artifact/artifact_repository_registry.py +154 -0
  386. mlflow/store/artifact/azure_blob_artifact_repo.py +275 -0
  387. mlflow/store/artifact/azure_data_lake_artifact_repo.py +295 -0
  388. mlflow/store/artifact/cli.py +141 -0
  389. mlflow/store/artifact/cloud_artifact_repo.py +332 -0
  390. mlflow/store/artifact/databricks_artifact_repo.py +729 -0
  391. mlflow/store/artifact/databricks_artifact_repo_resources.py +301 -0
  392. mlflow/store/artifact/databricks_logged_model_artifact_repo.py +93 -0
  393. mlflow/store/artifact/databricks_models_artifact_repo.py +216 -0
  394. mlflow/store/artifact/databricks_sdk_artifact_repo.py +134 -0
  395. mlflow/store/artifact/databricks_sdk_models_artifact_repo.py +97 -0
  396. mlflow/store/artifact/dbfs_artifact_repo.py +240 -0
  397. mlflow/store/artifact/ftp_artifact_repo.py +132 -0
  398. mlflow/store/artifact/gcs_artifact_repo.py +296 -0
  399. mlflow/store/artifact/hdfs_artifact_repo.py +209 -0
  400. mlflow/store/artifact/http_artifact_repo.py +218 -0
  401. mlflow/store/artifact/local_artifact_repo.py +142 -0
  402. mlflow/store/artifact/mlflow_artifacts_repo.py +94 -0
  403. mlflow/store/artifact/models_artifact_repo.py +259 -0
  404. mlflow/store/artifact/optimized_s3_artifact_repo.py +356 -0
  405. mlflow/store/artifact/presigned_url_artifact_repo.py +173 -0
  406. mlflow/store/artifact/r2_artifact_repo.py +70 -0
  407. mlflow/store/artifact/runs_artifact_repo.py +265 -0
  408. mlflow/store/artifact/s3_artifact_repo.py +330 -0
  409. mlflow/store/artifact/sftp_artifact_repo.py +141 -0
  410. mlflow/store/artifact/uc_volume_artifact_repo.py +76 -0
  411. mlflow/store/artifact/unity_catalog_models_artifact_repo.py +168 -0
  412. mlflow/store/artifact/unity_catalog_oss_models_artifact_repo.py +168 -0
  413. mlflow/store/artifact/utils/__init__.py +0 -0
  414. mlflow/store/artifact/utils/models.py +148 -0
  415. mlflow/store/db/__init__.py +0 -0
  416. mlflow/store/db/base_sql_model.py +3 -0
  417. mlflow/store/db/db_types.py +10 -0
  418. mlflow/store/db/utils.py +314 -0
  419. mlflow/store/db_migrations/__init__.py +0 -0
  420. mlflow/store/db_migrations/alembic.ini +74 -0
  421. mlflow/store/db_migrations/env.py +84 -0
  422. mlflow/store/db_migrations/versions/0584bdc529eb_add_cascading_deletion_to_datasets_from_experiments.py +88 -0
  423. mlflow/store/db_migrations/versions/0a8213491aaa_drop_duplicate_killed_constraint.py +49 -0
  424. mlflow/store/db_migrations/versions/0c779009ac13_add_deleted_time_field_to_runs_table.py +24 -0
  425. mlflow/store/db_migrations/versions/181f10493468_allow_nulls_for_metric_values.py +35 -0
  426. mlflow/store/db_migrations/versions/27a6a02d2cf1_add_model_version_tags_table.py +38 -0
  427. mlflow/store/db_migrations/versions/2b4d017a5e9b_add_model_registry_tables_to_db.py +77 -0
  428. mlflow/store/db_migrations/versions/2d6e25af4d3e_increase_max_param_val_length.py +33 -0
  429. mlflow/store/db_migrations/versions/3500859a5d39_add_model_aliases_table.py +50 -0
  430. mlflow/store/db_migrations/versions/39d1c3be5f05_add_is_nan_constraint_for_metrics_tables_if_necessary.py +41 -0
  431. mlflow/store/db_migrations/versions/400f98739977_add_logged_model_tables.py +123 -0
  432. mlflow/store/db_migrations/versions/4465047574b1_increase_max_dataset_schema_size.py +38 -0
  433. mlflow/store/db_migrations/versions/451aebb31d03_add_metric_step.py +35 -0
  434. mlflow/store/db_migrations/versions/5b0e9adcef9c_add_cascade_deletion_to_trace_tables_fk.py +40 -0
  435. mlflow/store/db_migrations/versions/6953534de441_add_step_to_inputs_table.py +25 -0
  436. mlflow/store/db_migrations/versions/728d730b5ebd_add_registered_model_tags_table.py +38 -0
  437. mlflow/store/db_migrations/versions/7ac759974ad8_update_run_tags_with_larger_limit.py +36 -0
  438. mlflow/store/db_migrations/versions/7f2a7d5fae7d_add_datasets_inputs_input_tags_tables.py +82 -0
  439. mlflow/store/db_migrations/versions/84291f40a231_add_run_link_to_model_version.py +26 -0
  440. mlflow/store/db_migrations/versions/867495a8f9d4_add_trace_tables.py +90 -0
  441. mlflow/store/db_migrations/versions/89d4b8295536_create_latest_metrics_table.py +169 -0
  442. mlflow/store/db_migrations/versions/90e64c465722_migrate_user_column_to_tags.py +64 -0
  443. mlflow/store/db_migrations/versions/97727af70f4d_creation_time_last_update_time_experiments.py +25 -0
  444. mlflow/store/db_migrations/versions/__init__.py +0 -0
  445. mlflow/store/db_migrations/versions/a8c4a736bde6_allow_nulls_for_run_id.py +27 -0
  446. mlflow/store/db_migrations/versions/acf3f17fdcc7_add_storage_location_field_to_model_.py +29 -0
  447. mlflow/store/db_migrations/versions/bd07f7e963c5_create_index_on_run_uuid.py +26 -0
  448. mlflow/store/db_migrations/versions/bda7b8c39065_increase_model_version_tag_value_limit.py +38 -0
  449. mlflow/store/db_migrations/versions/c48cb773bb87_reset_default_value_for_is_nan_in_metrics_table_for_mysql.py +41 -0
  450. mlflow/store/db_migrations/versions/cbc13b556ace_add_v3_trace_schema_columns.py +31 -0
  451. mlflow/store/db_migrations/versions/cc1f77228345_change_param_value_length_to_500.py +34 -0
  452. mlflow/store/db_migrations/versions/cfd24bdc0731_update_run_status_constraint_with_killed.py +78 -0
  453. mlflow/store/db_migrations/versions/df50e92ffc5e_add_experiment_tags_table.py +38 -0
  454. mlflow/store/db_migrations/versions/f5a4f2784254_increase_run_tag_value_limit.py +36 -0
  455. mlflow/store/entities/__init__.py +3 -0
  456. mlflow/store/entities/paged_list.py +18 -0
  457. mlflow/store/model_registry/__init__.py +10 -0
  458. mlflow/store/model_registry/abstract_store.py +1081 -0
  459. mlflow/store/model_registry/base_rest_store.py +44 -0
  460. mlflow/store/model_registry/databricks_workspace_model_registry_rest_store.py +37 -0
  461. mlflow/store/model_registry/dbmodels/__init__.py +0 -0
  462. mlflow/store/model_registry/dbmodels/models.py +206 -0
  463. mlflow/store/model_registry/file_store.py +1091 -0
  464. mlflow/store/model_registry/rest_store.py +481 -0
  465. mlflow/store/model_registry/sqlalchemy_store.py +1286 -0
  466. mlflow/store/tracking/__init__.py +23 -0
  467. mlflow/store/tracking/abstract_store.py +816 -0
  468. mlflow/store/tracking/dbmodels/__init__.py +0 -0
  469. mlflow/store/tracking/dbmodels/initial_models.py +243 -0
  470. mlflow/store/tracking/dbmodels/models.py +1073 -0
  471. mlflow/store/tracking/file_store.py +2438 -0
  472. mlflow/store/tracking/postgres_managed_identity.py +146 -0
  473. mlflow/store/tracking/rest_store.py +1131 -0
  474. mlflow/store/tracking/sqlalchemy_store.py +2785 -0
  475. mlflow/system_metrics/__init__.py +61 -0
  476. mlflow/system_metrics/metrics/__init__.py +0 -0
  477. mlflow/system_metrics/metrics/base_metrics_monitor.py +32 -0
  478. mlflow/system_metrics/metrics/cpu_monitor.py +23 -0
  479. mlflow/system_metrics/metrics/disk_monitor.py +21 -0
  480. mlflow/system_metrics/metrics/gpu_monitor.py +71 -0
  481. mlflow/system_metrics/metrics/network_monitor.py +34 -0
  482. mlflow/system_metrics/metrics/rocm_monitor.py +123 -0
  483. mlflow/system_metrics/system_metrics_monitor.py +198 -0
  484. mlflow/tracing/__init__.py +16 -0
  485. mlflow/tracing/assessment.py +356 -0
  486. mlflow/tracing/client.py +531 -0
  487. mlflow/tracing/config.py +125 -0
  488. mlflow/tracing/constant.py +105 -0
  489. mlflow/tracing/destination.py +81 -0
  490. mlflow/tracing/display/__init__.py +40 -0
  491. mlflow/tracing/display/display_handler.py +196 -0
  492. mlflow/tracing/export/async_export_queue.py +186 -0
  493. mlflow/tracing/export/inference_table.py +138 -0
  494. mlflow/tracing/export/mlflow_v3.py +137 -0
  495. mlflow/tracing/export/utils.py +70 -0
  496. mlflow/tracing/fluent.py +1417 -0
  497. mlflow/tracing/processor/base_mlflow.py +199 -0
  498. mlflow/tracing/processor/inference_table.py +175 -0
  499. mlflow/tracing/processor/mlflow_v3.py +47 -0
  500. mlflow/tracing/processor/otel.py +73 -0
  501. mlflow/tracing/provider.py +487 -0
  502. mlflow/tracing/trace_manager.py +200 -0
  503. mlflow/tracing/utils/__init__.py +616 -0
  504. mlflow/tracing/utils/artifact_utils.py +28 -0
  505. mlflow/tracing/utils/copy.py +55 -0
  506. mlflow/tracing/utils/environment.py +55 -0
  507. mlflow/tracing/utils/exception.py +21 -0
  508. mlflow/tracing/utils/once.py +35 -0
  509. mlflow/tracing/utils/otlp.py +63 -0
  510. mlflow/tracing/utils/processor.py +54 -0
  511. mlflow/tracing/utils/search.py +292 -0
  512. mlflow/tracing/utils/timeout.py +250 -0
  513. mlflow/tracing/utils/token.py +19 -0
  514. mlflow/tracing/utils/truncation.py +124 -0
  515. mlflow/tracing/utils/warning.py +76 -0
  516. mlflow/tracking/__init__.py +39 -0
  517. mlflow/tracking/_model_registry/__init__.py +1 -0
  518. mlflow/tracking/_model_registry/client.py +764 -0
  519. mlflow/tracking/_model_registry/fluent.py +853 -0
  520. mlflow/tracking/_model_registry/registry.py +67 -0
  521. mlflow/tracking/_model_registry/utils.py +251 -0
  522. mlflow/tracking/_tracking_service/__init__.py +0 -0
  523. mlflow/tracking/_tracking_service/client.py +883 -0
  524. mlflow/tracking/_tracking_service/registry.py +56 -0
  525. mlflow/tracking/_tracking_service/utils.py +275 -0
  526. mlflow/tracking/artifact_utils.py +179 -0
  527. mlflow/tracking/client.py +5900 -0
  528. mlflow/tracking/context/__init__.py +0 -0
  529. mlflow/tracking/context/abstract_context.py +35 -0
  530. mlflow/tracking/context/databricks_cluster_context.py +15 -0
  531. mlflow/tracking/context/databricks_command_context.py +15 -0
  532. mlflow/tracking/context/databricks_job_context.py +49 -0
  533. mlflow/tracking/context/databricks_notebook_context.py +41 -0
  534. mlflow/tracking/context/databricks_repo_context.py +43 -0
  535. mlflow/tracking/context/default_context.py +51 -0
  536. mlflow/tracking/context/git_context.py +32 -0
  537. mlflow/tracking/context/registry.py +98 -0
  538. mlflow/tracking/context/system_environment_context.py +15 -0
  539. mlflow/tracking/default_experiment/__init__.py +1 -0
  540. mlflow/tracking/default_experiment/abstract_context.py +43 -0
  541. mlflow/tracking/default_experiment/databricks_notebook_experiment_provider.py +44 -0
  542. mlflow/tracking/default_experiment/registry.py +75 -0
  543. mlflow/tracking/fluent.py +3595 -0
  544. mlflow/tracking/metric_value_conversion_utils.py +93 -0
  545. mlflow/tracking/multimedia.py +206 -0
  546. mlflow/tracking/registry.py +86 -0
  547. mlflow/tracking/request_auth/__init__.py +0 -0
  548. mlflow/tracking/request_auth/abstract_request_auth_provider.py +34 -0
  549. mlflow/tracking/request_auth/registry.py +60 -0
  550. mlflow/tracking/request_header/__init__.py +0 -0
  551. mlflow/tracking/request_header/abstract_request_header_provider.py +36 -0
  552. mlflow/tracking/request_header/databricks_request_header_provider.py +38 -0
  553. mlflow/tracking/request_header/default_request_header_provider.py +17 -0
  554. mlflow/tracking/request_header/registry.py +79 -0
  555. mlflow/transformers/__init__.py +2982 -0
  556. mlflow/transformers/flavor_config.py +258 -0
  557. mlflow/transformers/hub_utils.py +83 -0
  558. mlflow/transformers/llm_inference_utils.py +468 -0
  559. mlflow/transformers/model_io.py +301 -0
  560. mlflow/transformers/peft.py +51 -0
  561. mlflow/transformers/signature.py +183 -0
  562. mlflow/transformers/torch_utils.py +55 -0
  563. mlflow/types/__init__.py +21 -0
  564. mlflow/types/agent.py +270 -0
  565. mlflow/types/chat.py +240 -0
  566. mlflow/types/llm.py +935 -0
  567. mlflow/types/responses.py +139 -0
  568. mlflow/types/responses_helpers.py +416 -0
  569. mlflow/types/schema.py +1505 -0
  570. mlflow/types/type_hints.py +647 -0
  571. mlflow/types/utils.py +753 -0
  572. mlflow/utils/__init__.py +283 -0
  573. mlflow/utils/_capture_modules.py +256 -0
  574. mlflow/utils/_capture_transformers_modules.py +75 -0
  575. mlflow/utils/_spark_utils.py +201 -0
  576. mlflow/utils/_unity_catalog_oss_utils.py +97 -0
  577. mlflow/utils/_unity_catalog_utils.py +479 -0
  578. mlflow/utils/annotations.py +218 -0
  579. mlflow/utils/arguments_utils.py +16 -0
  580. mlflow/utils/async_logging/__init__.py +1 -0
  581. mlflow/utils/async_logging/async_artifacts_logging_queue.py +258 -0
  582. mlflow/utils/async_logging/async_logging_queue.py +366 -0
  583. mlflow/utils/async_logging/run_artifact.py +38 -0
  584. mlflow/utils/async_logging/run_batch.py +58 -0
  585. mlflow/utils/async_logging/run_operations.py +49 -0
  586. mlflow/utils/autologging_utils/__init__.py +737 -0
  587. mlflow/utils/autologging_utils/client.py +432 -0
  588. mlflow/utils/autologging_utils/config.py +33 -0
  589. mlflow/utils/autologging_utils/events.py +294 -0
  590. mlflow/utils/autologging_utils/logging_and_warnings.py +328 -0
  591. mlflow/utils/autologging_utils/metrics_queue.py +71 -0
  592. mlflow/utils/autologging_utils/safety.py +1104 -0
  593. mlflow/utils/autologging_utils/versioning.py +95 -0
  594. mlflow/utils/checkpoint_utils.py +206 -0
  595. mlflow/utils/class_utils.py +6 -0
  596. mlflow/utils/cli_args.py +257 -0
  597. mlflow/utils/conda.py +354 -0
  598. mlflow/utils/credentials.py +231 -0
  599. mlflow/utils/data_utils.py +17 -0
  600. mlflow/utils/databricks_utils.py +1436 -0
  601. mlflow/utils/docstring_utils.py +477 -0
  602. mlflow/utils/doctor.py +133 -0
  603. mlflow/utils/download_cloud_file_chunk.py +43 -0
  604. mlflow/utils/env_manager.py +16 -0
  605. mlflow/utils/env_pack.py +131 -0
  606. mlflow/utils/environment.py +1009 -0
  607. mlflow/utils/exception_utils.py +14 -0
  608. mlflow/utils/file_utils.py +978 -0
  609. mlflow/utils/git_utils.py +77 -0
  610. mlflow/utils/gorilla.py +797 -0
  611. mlflow/utils/import_hooks/__init__.py +363 -0
  612. mlflow/utils/lazy_load.py +51 -0
  613. mlflow/utils/logging_utils.py +168 -0
  614. mlflow/utils/mime_type_utils.py +58 -0
  615. mlflow/utils/mlflow_tags.py +103 -0
  616. mlflow/utils/model_utils.py +486 -0
  617. mlflow/utils/name_utils.py +346 -0
  618. mlflow/utils/nfs_on_spark.py +62 -0
  619. mlflow/utils/openai_utils.py +164 -0
  620. mlflow/utils/os.py +12 -0
  621. mlflow/utils/oss_registry_utils.py +29 -0
  622. mlflow/utils/plugins.py +17 -0
  623. mlflow/utils/process.py +182 -0
  624. mlflow/utils/promptlab_utils.py +146 -0
  625. mlflow/utils/proto_json_utils.py +743 -0
  626. mlflow/utils/pydantic_utils.py +54 -0
  627. mlflow/utils/request_utils.py +279 -0
  628. mlflow/utils/requirements_utils.py +704 -0
  629. mlflow/utils/rest_utils.py +673 -0
  630. mlflow/utils/search_logged_model_utils.py +127 -0
  631. mlflow/utils/search_utils.py +2111 -0
  632. mlflow/utils/secure_loading.py +221 -0
  633. mlflow/utils/security_validation.py +384 -0
  634. mlflow/utils/server_cli_utils.py +61 -0
  635. mlflow/utils/spark_utils.py +15 -0
  636. mlflow/utils/string_utils.py +138 -0
  637. mlflow/utils/thread_utils.py +63 -0
  638. mlflow/utils/time.py +54 -0
  639. mlflow/utils/timeout.py +42 -0
  640. mlflow/utils/uri.py +572 -0
  641. mlflow/utils/validation.py +662 -0
  642. mlflow/utils/virtualenv.py +458 -0
  643. mlflow/utils/warnings_utils.py +25 -0
  644. mlflow/utils/yaml_utils.py +179 -0
  645. mlflow/version.py +24 -0
@@ -0,0 +1,797 @@
1
+ # __ __ __
2
+ # .-----.-----.----|__| | .---.-.
3
+ # | _ | _ | _| | | | _ |
4
+ # |___ |_____|__| |__|__|__|___._|
5
+ # |_____|
6
+ #
7
+
8
+ """
9
+ NOTE: The contents of this file have been inlined from the gorilla package's source code
10
+ https://github.com/christophercrouzet/gorilla/blob/v0.3.0/gorilla.py
11
+
12
+ This module has fixes / adaptations for MLflow use cases that make it different from the original
13
+ gorilla library
14
+
15
+ The following modifications have been made:
16
+ - Modify `get_original_attribute` logic, search from children classes to parent classes,
17
+ and for each class check "_gorilla_original_{attr_name}" attribute first.
18
+ first. This will ensure get the correct original attribute in any cases, e.g.,
19
+ the case some classes in the hierarchy haven't been patched, but some others are
20
+ patched, this case the previous code is risky to get wrong original attribute.
21
+ - Make `get_original_attribute` support bypassing descriptor protocol.
22
+ - remove `get_attribute` method, use `get_original_attribute` with
23
+ `bypass_descriptor_protocol=True` instead of calling it.
24
+ - After reverting patch, there will be no side-effect, restore object to be exactly the
25
+ original status.
26
+ - Remove `create_patches` and `patches` methods.
27
+
28
+ gorilla
29
+ ~~~~~~~
30
+
31
+ Convenient approach to monkey patching.
32
+
33
+ :copyright: Copyright 2014-2017 by Christopher Crouzet.
34
+ :license: MIT, see LICENSE for details.
35
+ """
36
+
37
+ import collections
38
+ import copy
39
+ import inspect
40
+ import logging
41
+ import pkgutil
42
+ import sys
43
+ import types
44
+
45
+ __version__ = "0.3.0"
46
+ _logger = logging.getLogger(__name__)
47
+
48
+
49
+ def _iteritems(d, **kwargs):
50
+ return iter(d.items(**kwargs))
51
+
52
+
53
+ def _load_module(finder, name):
54
+ loader, _ = finder.find_loader(name)
55
+ return loader.load_module()
56
+
57
+
58
+ # Pattern for each internal attribute name.
59
+ _PATTERN = "_gorilla_%s"
60
+
61
+ # Pattern for the name of the overidden attributes to be stored.
62
+ _ORIGINAL_NAME = _PATTERN % ("original_%s",)
63
+
64
+ # Pattern for the name of the patch attributes to be stored.
65
+ _ACTIVE_PATCH = "_gorilla_active_patch_%s"
66
+
67
+ # Attribute for the decorator data.
68
+ _DECORATOR_DATA = _PATTERN % ("decorator_data",)
69
+
70
+
71
+ def default_filter(name, obj):
72
+ """Attribute filter.
73
+
74
+ It filters out module attributes, and also methods starting with an
75
+ underscore ``_``.
76
+
77
+ This is used as the default filter for the :func:`create_patches` function
78
+ and the :func:`patches` decorator.
79
+
80
+ Parameters
81
+ ----------
82
+ name : str
83
+ Attribute name.
84
+ obj : object
85
+ Attribute value.
86
+
87
+ Returns
88
+ -------
89
+ bool
90
+ Whether the attribute should be returned.
91
+ """
92
+ return not (isinstance(obj, types.ModuleType) or name.startswith("_"))
93
+
94
+
95
+ class DecoratorData:
96
+ """Decorator data.
97
+
98
+ Attributes
99
+ ----------
100
+ patches : list of gorilla.Patch
101
+ Patches created through the decorators.
102
+ override : dict
103
+ Any overriding value defined by the :func:`destination`, :func:`name`,
104
+ and :func:`settings` decorators.
105
+ filter : bool or None
106
+ Value defined by the :func:`filter` decorator, if any, or ``None``
107
+ otherwise.
108
+ """
109
+
110
+ def __init__(self):
111
+ """Constructor."""
112
+ self.patches = []
113
+ self.override = {}
114
+ self.filter = None
115
+
116
+
117
+ class Settings:
118
+ """Define the patching behaviour.
119
+
120
+ Attributes
121
+ ----------
122
+ allow_hit : bool
123
+ A hit occurs when an attribute at the destination already exists with
124
+ the name given by the patch. If ``False``, the patch process won't
125
+ allow setting a new value for the attribute by raising an exception.
126
+ Defaults to ``False``.
127
+ store_hit : bool
128
+ If ``True`` and :attr:`allow_hit` is also set to ``True``, then any
129
+ attribute at the destination that is hit is stored under a different
130
+ name before being overwritten by the patch. Defaults to ``True``.
131
+ """
132
+
133
+ def __init__(self, **kwargs):
134
+ """Constructor.
135
+
136
+ Parameters
137
+ ----------
138
+ kwargs
139
+ Keyword arguments, see the attributes.
140
+ """
141
+ self.allow_hit = False
142
+ self.store_hit = True
143
+ self._update(**kwargs)
144
+
145
+ def __repr__(self):
146
+ values = ", ".join([f"{key}={value!r}" for key, value in sorted(_iteritems(self.__dict__))])
147
+ return f"{type(self).__name__}({values})"
148
+
149
+ def __eq__(self, other):
150
+ if isinstance(other, type(self)):
151
+ return self.__dict__ == other.__dict__
152
+
153
+ return NotImplemented
154
+
155
+ def __ne__(self, other):
156
+ is_equal = self.__eq__(other)
157
+ return is_equal if is_equal is NotImplemented else not is_equal
158
+
159
+ def _update(self, **kwargs):
160
+ """Update some settings.
161
+
162
+ Parameters
163
+ ----------
164
+ kwargs
165
+ Settings to update.
166
+ """
167
+ self.__dict__.update(**kwargs)
168
+
169
+
170
+ class Patch:
171
+ """Describe all the information required to apply a patch.
172
+
173
+ Attributes
174
+ ----------
175
+ destination : obj
176
+ Patch destination.
177
+ name : str
178
+ Name of the attribute at the destination.
179
+ obj : obj
180
+ Attribute value.
181
+ settings : gorilla.Settings or None
182
+ Settings. If ``None``, the default settings are used.
183
+
184
+ Warning
185
+ -------
186
+ It is highly recommended to use the output of the function
187
+ :func:`get_attribute` for setting the attribute :attr:`obj`. This will
188
+ ensure that the descriptor protocol is bypassed instead of possibly
189
+ retrieving attributes invalid for patching, such as bound methods.
190
+ """
191
+
192
+ def __init__(self, destination, name, obj, settings=None):
193
+ """Constructor.
194
+
195
+ Parameters
196
+ ----------
197
+ destination : object
198
+ See the :attr:`~Patch.destination` attribute.
199
+ name : str
200
+ See the :attr:`~Patch.name` attribute.
201
+ obj : object
202
+ See the :attr:`~Patch.obj` attribute.
203
+ settings : gorilla.Settings
204
+ See the :attr:`~Patch.settings` attribute.
205
+ """
206
+ self.destination = destination
207
+ self.name = name
208
+ self.obj = obj
209
+ self.settings = settings
210
+ self.is_inplace_patch = None
211
+
212
+ def __repr__(self):
213
+ return "{}(destination={!r}, name={!r}, obj={!r}, settings={!r})".format(
214
+ type(self).__name__,
215
+ self.destination,
216
+ self.name,
217
+ self.obj,
218
+ self.settings,
219
+ )
220
+
221
+ def __eq__(self, other):
222
+ if isinstance(other, type(self)):
223
+ return self.__dict__ == other.__dict__
224
+
225
+ return NotImplemented
226
+
227
+ def __ne__(self, other):
228
+ is_equal = self.__eq__(other)
229
+ return is_equal if is_equal is NotImplemented else not is_equal
230
+
231
+ def __hash__(self):
232
+ return super().__hash__()
233
+
234
+ def _update(self, **kwargs):
235
+ """Update some attributes.
236
+
237
+ If a 'settings' attribute is passed as a dict, then it will update the
238
+ content of the settings, if any, instead of completely overwriting it.
239
+
240
+ Parameters
241
+ ----------
242
+ kwargs
243
+ Attributes to update.
244
+
245
+ Raises
246
+ ------
247
+ ValueError
248
+ The setting doesn't exist.
249
+ """
250
+ for key, value in _iteritems(kwargs):
251
+ if key == "settings":
252
+ if isinstance(value, dict):
253
+ if self.settings is None:
254
+ self.settings = Settings(**value)
255
+ else:
256
+ self.settings._update(**value)
257
+ else:
258
+ self.settings = copy.deepcopy(value)
259
+ else:
260
+ setattr(self, key, value)
261
+
262
+
263
+ def apply(patch):
264
+ """Apply a patch.
265
+
266
+ The patch's :attr:`~Patch.obj` attribute is injected into the patch's
267
+ :attr:`~Patch.destination` under the patch's :attr:`~Patch.name`.
268
+
269
+ This is a wrapper around calling
270
+ ``setattr(patch.destination, patch.name, patch.obj)``.
271
+
272
+ Parameters
273
+ ----------
274
+ patch : gorilla.Patch
275
+ Patch.
276
+
277
+ Raises
278
+ ------
279
+ RuntimeError
280
+ Overwriting an existing attribute is not allowed when the setting
281
+ :attr:`Settings.allow_hit` is set to ``True``.
282
+
283
+ Note
284
+ ----
285
+ If both the attributes :attr:`Settings.allow_hit` and
286
+ :attr:`Settings.store_hit` are ``True`` but that the target attribute seems
287
+ to have already been stored, then it won't be stored again to avoid losing
288
+ the original attribute that was stored the first time around.
289
+ """
290
+ # is_inplace_patch = True represents the patch object will overwrite the original
291
+ # attribute
292
+ patch.is_inplace_patch = patch.name in patch.destination.__dict__
293
+ settings = Settings() if patch.settings is None else patch.settings
294
+
295
+ curr_active_patch = _ACTIVE_PATCH % (patch.name,)
296
+ if curr_active_patch in patch.destination.__dict__:
297
+ _logger.debug(
298
+ f"Patch {patch.name} on {destination.__name__} already existed. Overwrite old patch."
299
+ )
300
+
301
+ # When a hit occurs due to an attribute at the destination already existing
302
+ # with the patch's name, the existing attribute is referred to as 'target'.
303
+ try:
304
+ target = get_original_attribute(
305
+ patch.destination, patch.name, bypass_descriptor_protocol=True
306
+ )
307
+ except AttributeError:
308
+ pass
309
+ else:
310
+ if not settings.allow_hit:
311
+ raise RuntimeError(
312
+ "An attribute named '%s' already exists at the destination " # noqa: UP031
313
+ "'%s'. Set a different name through the patch object to avoid "
314
+ "a name clash or set the setting 'allow_hit' to True to "
315
+ "overwrite the attribute. In the latter case, it is "
316
+ "recommended to also set the 'store_hit' setting to True in "
317
+ "order to store the original attribute under a different "
318
+ "name so it can still be accessed." % (patch.name, patch.destination.__name__)
319
+ )
320
+
321
+ if settings.store_hit:
322
+ original_name = _ORIGINAL_NAME % (patch.name,)
323
+ setattr(patch.destination, original_name, target)
324
+
325
+ setattr(patch.destination, patch.name, patch.obj)
326
+ setattr(patch.destination, curr_active_patch, patch)
327
+
328
+
329
+ def revert(patch):
330
+ """Revert a patch.
331
+ Parameters
332
+ ----------
333
+ patch : gorilla.Patch
334
+ Patch.
335
+
336
+ Note
337
+ ----
338
+ This is only possible if the attribute :attr:`Settings.store_hit` was set
339
+ to ``True`` when applying the patch and overriding an existing attribute.
340
+
341
+ Notice:
342
+ This method is taken from
343
+ https://github.com/christophercrouzet/gorilla/blob/v0.4.0/gorilla.py#L318-L351
344
+ with modifictions for autologging disablement purposes.
345
+ """
346
+ # If an curr_active_patch has not been set on destination class for the current patch,
347
+ # then the patch has not been applied and we do not need to revert anything.
348
+ curr_active_patch = _ACTIVE_PATCH % (patch.name,)
349
+ if curr_active_patch not in patch.destination.__dict__:
350
+ # already reverted.
351
+ return
352
+
353
+ original_name = _ORIGINAL_NAME % (patch.name,)
354
+
355
+ if patch.is_inplace_patch:
356
+ # check whether original_name is in destination. We cannot use hasattr because it will
357
+ # try to get attribute from parent classes if attribute not found in destination class.
358
+ if original_name not in patch.destination.__dict__:
359
+ raise RuntimeError(
360
+ "Cannot revert the attribute named '%s' since the setting " # noqa: UP031
361
+ "'store_hit' was not set to True when applying the patch."
362
+ % (patch.destination.__name__,)
363
+ )
364
+ # restore original method
365
+ # during reverting patch, we need restore the raw attribute to the patch point
366
+ # so get original attribute bypassing descriptor protocal
367
+ original = object.__getattribute__(patch.destination, original_name)
368
+ setattr(patch.destination, patch.name, original)
369
+ else:
370
+ # delete patched method
371
+ delattr(patch.destination, patch.name)
372
+
373
+ if original_name in patch.destination.__dict__:
374
+ delattr(patch.destination, original_name)
375
+ delattr(patch.destination, curr_active_patch)
376
+
377
+
378
+ def patch(destination, name=None, settings=None):
379
+ """Decorator to create a patch.
380
+
381
+ The object being decorated becomes the :attr:`~Patch.obj` attribute of the
382
+ patch.
383
+
384
+ Parameters
385
+ ----------
386
+ destination : object
387
+ Patch destination.
388
+ name : str
389
+ Name of the attribute at the destination.
390
+ settings : gorilla.Settings
391
+ Settings.
392
+
393
+ Returns
394
+ -------
395
+ object
396
+ The decorated object.
397
+
398
+ See Also
399
+ --------
400
+ :class:`Patch`.
401
+ """
402
+
403
+ def decorator(wrapped):
404
+ base = _get_base(wrapped)
405
+ name_ = base.__name__ if name is None else name
406
+ settings_ = copy.deepcopy(settings)
407
+ patch = Patch(destination, name_, wrapped, settings=settings_)
408
+ data = get_decorator_data(base, set_default=True)
409
+ data.patches.append(patch)
410
+ return wrapped
411
+
412
+ return decorator
413
+
414
+
415
+ def destination(value):
416
+ """Modifier decorator to update a patch's destination.
417
+
418
+ This only modifies the behaviour of the :func:`create_patches` function
419
+ and the :func:`patches` decorator, given that their parameter
420
+ ``use_decorators`` is set to ``True``.
421
+
422
+ Parameters
423
+ ----------
424
+ value : object
425
+ Patch destination.
426
+
427
+ Returns
428
+ -------
429
+ object
430
+ The decorated object.
431
+ """
432
+
433
+ def decorator(wrapped):
434
+ data = get_decorator_data(_get_base(wrapped), set_default=True)
435
+ data.override["destination"] = value
436
+ return wrapped
437
+
438
+ return decorator
439
+
440
+
441
+ def name(value):
442
+ """Modifier decorator to update a patch's name.
443
+
444
+ This only modifies the behaviour of the :func:`create_patches` function
445
+ and the :func:`patches` decorator, given that their parameter
446
+ ``use_decorators`` is set to ``True``.
447
+
448
+ Parameters
449
+ ----------
450
+ value : object
451
+ Patch name.
452
+
453
+ Returns
454
+ -------
455
+ object
456
+ The decorated object.
457
+ """
458
+
459
+ def decorator(wrapped):
460
+ data = get_decorator_data(_get_base(wrapped), set_default=True)
461
+ data.override["name"] = value
462
+ return wrapped
463
+
464
+ return decorator
465
+
466
+
467
+ def settings(**kwargs):
468
+ """Modifier decorator to update a patch's settings.
469
+
470
+ This only modifies the behaviour of the :func:`create_patches` function
471
+ and the :func:`patches` decorator, given that their parameter
472
+ ``use_decorators`` is set to ``True``.
473
+
474
+ Parameters
475
+ ----------
476
+ kwargs
477
+ Settings to update. See :class:`Settings` for the list.
478
+
479
+ Returns
480
+ -------
481
+ object
482
+ The decorated object.
483
+ """
484
+
485
+ def decorator(wrapped):
486
+ data = get_decorator_data(_get_base(wrapped), set_default=True)
487
+ data.override.setdefault("settings", {}).update(kwargs)
488
+ return wrapped
489
+
490
+ return decorator
491
+
492
+
493
+ def filter(value):
494
+ """Modifier decorator to force the inclusion or exclusion of an attribute.
495
+
496
+ This only modifies the behaviour of the :func:`create_patches` function
497
+ and the :func:`patches` decorator, given that their parameter
498
+ ``use_decorators`` is set to ``True``.
499
+
500
+ Parameters
501
+ ----------
502
+ value : bool
503
+ ``True`` to force inclusion, ``False`` to force exclusion, and ``None``
504
+ to inherit from the behaviour defined by :func:`create_patches` or
505
+ :func:`patches`.
506
+
507
+ Returns
508
+ -------
509
+ object
510
+ The decorated object.
511
+ """
512
+
513
+ def decorator(wrapped):
514
+ data = get_decorator_data(_get_base(wrapped), set_default=True)
515
+ data.filter = value
516
+ return wrapped
517
+
518
+ return decorator
519
+
520
+
521
+ def find_patches(modules, recursive=True):
522
+ """Find all the patches created through decorators.
523
+
524
+ Parameters
525
+ ----------
526
+ modules : list of module
527
+ Modules and/or packages to search the patches in.
528
+ recursive : bool
529
+ ``True`` to search recursively in subpackages.
530
+
531
+ Returns
532
+ -------
533
+ list of gorilla.Patch
534
+ Patches found.
535
+
536
+ Raises
537
+ ------
538
+ TypeError
539
+ The input is not a valid package or module.
540
+
541
+ See Also
542
+ --------
543
+ :func:`patch`, :func:`patches`.
544
+ """
545
+ out = []
546
+ modules = (
547
+ module for package in modules for module in _module_iterator(package, recursive=recursive)
548
+ )
549
+ for module in modules:
550
+ members = _get_members(module, filter=None)
551
+ for _, value in members:
552
+ base = _get_base(value)
553
+ decorator_data = get_decorator_data(base)
554
+ if decorator_data is None:
555
+ continue
556
+
557
+ out.extend(decorator_data.patches)
558
+
559
+ return out
560
+
561
+
562
+ def get_original_attribute(obj, name, bypass_descriptor_protocol=False):
563
+ """Retrieve an overridden attribute that has been stored.
564
+
565
+ Parameters
566
+ ----------
567
+ obj : object
568
+ Object to search the attribute in.
569
+ name : str
570
+ Name of the attribute.
571
+ bypass_descriptor_protocol: boolean
572
+ bypassing descriptor protocol if true. When storing original method during patching or
573
+ restoring original method during reverting patch, we need set bypass_descriptor_protocol
574
+ to be True to ensure get the raw attribute object.
575
+
576
+ Returns
577
+ -------
578
+ object
579
+ The attribute found.
580
+
581
+ Raises
582
+ ------
583
+ AttributeError
584
+ The attribute couldn't be found.
585
+
586
+ Note
587
+ ----
588
+ if setting store_hit=False, then after patch applied, this methods may return patched
589
+ attribute instead of original attribute in specific cases.
590
+
591
+ See Also
592
+ --------
593
+ :attr:`Settings.allow_hit`.
594
+ """
595
+
596
+ original_name = _ORIGINAL_NAME % (name,)
597
+ curr_active_patch = _ACTIVE_PATCH % (name,)
598
+
599
+ def _get_attr(obj_, name_):
600
+ if bypass_descriptor_protocol:
601
+ return object.__getattribute__(obj_, name_)
602
+ else:
603
+ return getattr(obj_, name_)
604
+
605
+ no_original_stored_err = (
606
+ "Original attribute %s was not stored when patching, set store_hit=True will address this."
607
+ )
608
+
609
+ if inspect.isclass(obj):
610
+ # Search from children classes to parent classes, and check "original_name" attribute
611
+ # first. This will ensure get the correct original attribute in any cases, e.g.,
612
+ # the case some classes in the hierarchy haven't been patched, but some others are
613
+ # patched, this case the previous code is risky to get wrong original attribute.
614
+ for obj_ in inspect.getmro(obj):
615
+ if original_name in obj_.__dict__:
616
+ return _get_attr(obj_, original_name)
617
+ elif name in obj_.__dict__:
618
+ if curr_active_patch in obj_.__dict__:
619
+ patch = getattr(obj, curr_active_patch)
620
+ if patch.is_inplace_patch:
621
+ raise RuntimeError(no_original_stored_err % (f"{obj_.__name__}.{name}",))
622
+ else:
623
+ # non inplace patch, we can get original methods in parent classes.
624
+ # so go on checking parent classes
625
+ continue
626
+ return _get_attr(obj_, name)
627
+ else:
628
+ # go on checking parent classes
629
+ continue
630
+ raise AttributeError(f"'{type(obj)}' object has no attribute '{name}'")
631
+ else:
632
+ try:
633
+ return _get_attr(obj, original_name)
634
+ except AttributeError:
635
+ if curr_active_patch in obj.__dict__:
636
+ raise RuntimeError(no_original_stored_err % (f"{type(obj).__name__}.{name}",))
637
+ return _get_attr(obj, name)
638
+
639
+
640
+ def get_decorator_data(obj, set_default=False):
641
+ """Retrieve any decorator data from an object.
642
+
643
+ Parameters
644
+ ----------
645
+ obj : object
646
+ Object.
647
+ set_default : bool
648
+ If no data is found, a default one is set on the object and returned,
649
+ otherwise ``None`` is returned.
650
+
651
+ Returns
652
+ -------
653
+ gorilla.DecoratorData
654
+ The decorator data or ``None``.
655
+ """
656
+ if inspect.isclass(obj):
657
+ datas = getattr(obj, _DECORATOR_DATA, {})
658
+ data = datas.setdefault(obj, None)
659
+ if data is None and set_default:
660
+ data = DecoratorData()
661
+ datas[obj] = data
662
+ setattr(obj, _DECORATOR_DATA, datas)
663
+ else:
664
+ data = getattr(obj, _DECORATOR_DATA, None)
665
+ if data is None and set_default:
666
+ data = DecoratorData()
667
+ setattr(obj, _DECORATOR_DATA, data)
668
+
669
+ return data
670
+
671
+
672
+ def _get_base(obj):
673
+ """Unwrap decorators to retrieve the base object.
674
+
675
+ Parameters
676
+ ----------
677
+ obj : object
678
+ Object.
679
+
680
+ Returns
681
+ -------
682
+ object
683
+ The base object found or the input object otherwise.
684
+ """
685
+ if hasattr(obj, "__func__"):
686
+ obj = obj.__func__
687
+ elif isinstance(obj, property):
688
+ obj = obj.fget
689
+ elif isinstance(obj, (classmethod, staticmethod)):
690
+ # Fallback for Python < 2.7 back when no `__func__` attribute
691
+ # was defined for those descriptors.
692
+ obj = obj.__get__(None, object)
693
+ else:
694
+ return obj
695
+
696
+ return _get_base(obj)
697
+
698
+
699
+ def _get_members(obj, traverse_bases=True, filter=default_filter, recursive=True):
700
+ """Retrieve the member attributes of a module or a class.
701
+
702
+ The descriptor protocol is bypassed.
703
+
704
+ Parameters
705
+ ----------
706
+ obj : module or class
707
+ Object.
708
+ traverse_bases : bool
709
+ If the object is a class, the base classes are also traversed.
710
+ filter : function
711
+ Attributes for which the function returns ``False`` are skipped. The
712
+ function needs to define two parameters: ``name``, the attribute name,
713
+ and ``obj``, the attribute value. If ``None``, no attribute is skipped.
714
+ recursive : bool
715
+ ``True`` to search recursively through subclasses.
716
+
717
+ Returns
718
+ ------
719
+ list of (name, value)
720
+ A list of tuples each containing the name and the value of the
721
+ attribute.
722
+ """
723
+ if filter is None:
724
+ filter = _true
725
+
726
+ out = []
727
+ stack = collections.deque((obj,))
728
+ while stack:
729
+ obj = stack.popleft()
730
+ if traverse_bases and inspect.isclass(obj):
731
+ roots = [base for base in inspect.getmro(obj) if base not in (type, object)]
732
+ else:
733
+ roots = [obj]
734
+
735
+ members = []
736
+ seen = set()
737
+ for root in roots:
738
+ for name, value in _iteritems(getattr(root, "__dict__", {})):
739
+ if name not in seen and filter(name, value):
740
+ members.append((name, value))
741
+
742
+ seen.add(name)
743
+
744
+ members = sorted(members)
745
+ for _, value in members:
746
+ if recursive and inspect.isclass(value):
747
+ stack.append(value)
748
+
749
+ out.extend(members)
750
+
751
+ return out
752
+
753
+
754
+ def _module_iterator(root, recursive=True):
755
+ """Iterate over modules.
756
+
757
+ Parameters
758
+ ----------
759
+ root : module
760
+ Root module or package to iterate from.
761
+ recursive : bool
762
+ ``True`` to iterate within subpackages.
763
+
764
+ Yields
765
+ ------
766
+ module
767
+ The modules found.
768
+ """
769
+ yield root
770
+
771
+ stack = collections.deque((root,))
772
+ while stack:
773
+ package = stack.popleft()
774
+ # The '__path__' attribute of a package might return a list of paths if
775
+ # the package is referenced as a namespace.
776
+ paths = getattr(package, "__path__", [])
777
+ for path in paths:
778
+ modules = pkgutil.iter_modules([path])
779
+ for finder, name, is_package in modules:
780
+ module_name = f"{package.__name__}.{name}"
781
+ module = sys.modules.get(module_name, None)
782
+ if module is None:
783
+ # Import the module through the finder to support package
784
+ # namespaces.
785
+ module = _load_module(finder, module_name)
786
+
787
+ if is_package:
788
+ if recursive:
789
+ stack.append(module)
790
+ yield module
791
+ else:
792
+ yield module
793
+
794
+
795
+ def _true(*args, **kwargs):
796
+ """Return ``True``."""
797
+ return True