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.
- genesis_flow-1.0.0.dist-info/METADATA +822 -0
- genesis_flow-1.0.0.dist-info/RECORD +645 -0
- genesis_flow-1.0.0.dist-info/WHEEL +5 -0
- genesis_flow-1.0.0.dist-info/entry_points.txt +19 -0
- genesis_flow-1.0.0.dist-info/licenses/LICENSE.txt +202 -0
- genesis_flow-1.0.0.dist-info/top_level.txt +1 -0
- mlflow/__init__.py +367 -0
- mlflow/__main__.py +3 -0
- mlflow/ag2/__init__.py +56 -0
- mlflow/ag2/ag2_logger.py +294 -0
- mlflow/anthropic/__init__.py +40 -0
- mlflow/anthropic/autolog.py +129 -0
- mlflow/anthropic/chat.py +144 -0
- mlflow/artifacts/__init__.py +268 -0
- mlflow/autogen/__init__.py +144 -0
- mlflow/autogen/chat.py +142 -0
- mlflow/azure/__init__.py +26 -0
- mlflow/azure/auth_handler.py +257 -0
- mlflow/azure/client.py +319 -0
- mlflow/azure/config.py +120 -0
- mlflow/azure/connection_factory.py +340 -0
- mlflow/azure/exceptions.py +27 -0
- mlflow/azure/stores.py +327 -0
- mlflow/azure/utils.py +183 -0
- mlflow/bedrock/__init__.py +45 -0
- mlflow/bedrock/_autolog.py +202 -0
- mlflow/bedrock/chat.py +122 -0
- mlflow/bedrock/stream.py +160 -0
- mlflow/bedrock/utils.py +43 -0
- mlflow/cli.py +707 -0
- mlflow/client.py +12 -0
- mlflow/config/__init__.py +56 -0
- mlflow/crewai/__init__.py +79 -0
- mlflow/crewai/autolog.py +253 -0
- mlflow/crewai/chat.py +29 -0
- mlflow/data/__init__.py +75 -0
- mlflow/data/artifact_dataset_sources.py +170 -0
- mlflow/data/code_dataset_source.py +40 -0
- mlflow/data/dataset.py +123 -0
- mlflow/data/dataset_registry.py +168 -0
- mlflow/data/dataset_source.py +110 -0
- mlflow/data/dataset_source_registry.py +219 -0
- mlflow/data/delta_dataset_source.py +167 -0
- mlflow/data/digest_utils.py +108 -0
- mlflow/data/evaluation_dataset.py +562 -0
- mlflow/data/filesystem_dataset_source.py +81 -0
- mlflow/data/http_dataset_source.py +145 -0
- mlflow/data/huggingface_dataset.py +258 -0
- mlflow/data/huggingface_dataset_source.py +118 -0
- mlflow/data/meta_dataset.py +104 -0
- mlflow/data/numpy_dataset.py +223 -0
- mlflow/data/pandas_dataset.py +231 -0
- mlflow/data/polars_dataset.py +352 -0
- mlflow/data/pyfunc_dataset_mixin.py +31 -0
- mlflow/data/schema.py +76 -0
- mlflow/data/sources.py +1 -0
- mlflow/data/spark_dataset.py +406 -0
- mlflow/data/spark_dataset_source.py +74 -0
- mlflow/data/spark_delta_utils.py +118 -0
- mlflow/data/tensorflow_dataset.py +350 -0
- mlflow/data/uc_volume_dataset_source.py +81 -0
- mlflow/db.py +27 -0
- mlflow/dspy/__init__.py +17 -0
- mlflow/dspy/autolog.py +197 -0
- mlflow/dspy/callback.py +398 -0
- mlflow/dspy/constant.py +1 -0
- mlflow/dspy/load.py +93 -0
- mlflow/dspy/save.py +393 -0
- mlflow/dspy/util.py +109 -0
- mlflow/dspy/wrapper.py +226 -0
- mlflow/entities/__init__.py +104 -0
- mlflow/entities/_mlflow_object.py +52 -0
- mlflow/entities/assessment.py +545 -0
- mlflow/entities/assessment_error.py +80 -0
- mlflow/entities/assessment_source.py +141 -0
- mlflow/entities/dataset.py +92 -0
- mlflow/entities/dataset_input.py +51 -0
- mlflow/entities/dataset_summary.py +62 -0
- mlflow/entities/document.py +48 -0
- mlflow/entities/experiment.py +109 -0
- mlflow/entities/experiment_tag.py +35 -0
- mlflow/entities/file_info.py +45 -0
- mlflow/entities/input_tag.py +35 -0
- mlflow/entities/lifecycle_stage.py +35 -0
- mlflow/entities/logged_model.py +228 -0
- mlflow/entities/logged_model_input.py +26 -0
- mlflow/entities/logged_model_output.py +32 -0
- mlflow/entities/logged_model_parameter.py +46 -0
- mlflow/entities/logged_model_status.py +74 -0
- mlflow/entities/logged_model_tag.py +33 -0
- mlflow/entities/metric.py +200 -0
- mlflow/entities/model_registry/__init__.py +29 -0
- mlflow/entities/model_registry/_model_registry_entity.py +13 -0
- mlflow/entities/model_registry/model_version.py +243 -0
- mlflow/entities/model_registry/model_version_deployment_job_run_state.py +44 -0
- mlflow/entities/model_registry/model_version_deployment_job_state.py +70 -0
- mlflow/entities/model_registry/model_version_search.py +25 -0
- mlflow/entities/model_registry/model_version_stages.py +25 -0
- mlflow/entities/model_registry/model_version_status.py +35 -0
- mlflow/entities/model_registry/model_version_tag.py +35 -0
- mlflow/entities/model_registry/prompt.py +73 -0
- mlflow/entities/model_registry/prompt_version.py +244 -0
- mlflow/entities/model_registry/registered_model.py +175 -0
- mlflow/entities/model_registry/registered_model_alias.py +35 -0
- mlflow/entities/model_registry/registered_model_deployment_job_state.py +39 -0
- mlflow/entities/model_registry/registered_model_search.py +25 -0
- mlflow/entities/model_registry/registered_model_tag.py +35 -0
- mlflow/entities/multipart_upload.py +74 -0
- mlflow/entities/param.py +49 -0
- mlflow/entities/run.py +97 -0
- mlflow/entities/run_data.py +84 -0
- mlflow/entities/run_info.py +188 -0
- mlflow/entities/run_inputs.py +59 -0
- mlflow/entities/run_outputs.py +43 -0
- mlflow/entities/run_status.py +41 -0
- mlflow/entities/run_tag.py +36 -0
- mlflow/entities/source_type.py +31 -0
- mlflow/entities/span.py +774 -0
- mlflow/entities/span_event.py +96 -0
- mlflow/entities/span_status.py +102 -0
- mlflow/entities/trace.py +317 -0
- mlflow/entities/trace_data.py +71 -0
- mlflow/entities/trace_info.py +220 -0
- mlflow/entities/trace_info_v2.py +162 -0
- mlflow/entities/trace_location.py +173 -0
- mlflow/entities/trace_state.py +39 -0
- mlflow/entities/trace_status.py +68 -0
- mlflow/entities/view_type.py +51 -0
- mlflow/environment_variables.py +866 -0
- mlflow/evaluation/__init__.py +16 -0
- mlflow/evaluation/assessment.py +369 -0
- mlflow/evaluation/evaluation.py +411 -0
- mlflow/evaluation/evaluation_tag.py +61 -0
- mlflow/evaluation/fluent.py +48 -0
- mlflow/evaluation/utils.py +201 -0
- mlflow/exceptions.py +213 -0
- mlflow/experiments.py +140 -0
- mlflow/gemini/__init__.py +81 -0
- mlflow/gemini/autolog.py +186 -0
- mlflow/gemini/chat.py +261 -0
- mlflow/genai/__init__.py +71 -0
- mlflow/genai/datasets/__init__.py +67 -0
- mlflow/genai/datasets/evaluation_dataset.py +131 -0
- mlflow/genai/evaluation/__init__.py +3 -0
- mlflow/genai/evaluation/base.py +411 -0
- mlflow/genai/evaluation/constant.py +23 -0
- mlflow/genai/evaluation/utils.py +244 -0
- mlflow/genai/judges/__init__.py +21 -0
- mlflow/genai/judges/databricks.py +404 -0
- mlflow/genai/label_schemas/__init__.py +153 -0
- mlflow/genai/label_schemas/label_schemas.py +209 -0
- mlflow/genai/labeling/__init__.py +159 -0
- mlflow/genai/labeling/labeling.py +250 -0
- mlflow/genai/optimize/__init__.py +13 -0
- mlflow/genai/optimize/base.py +198 -0
- mlflow/genai/optimize/optimizers/__init__.py +4 -0
- mlflow/genai/optimize/optimizers/base_optimizer.py +38 -0
- mlflow/genai/optimize/optimizers/dspy_mipro_optimizer.py +221 -0
- mlflow/genai/optimize/optimizers/dspy_optimizer.py +91 -0
- mlflow/genai/optimize/optimizers/utils/dspy_mipro_callback.py +76 -0
- mlflow/genai/optimize/optimizers/utils/dspy_mipro_utils.py +18 -0
- mlflow/genai/optimize/types.py +75 -0
- mlflow/genai/optimize/util.py +30 -0
- mlflow/genai/prompts/__init__.py +206 -0
- mlflow/genai/scheduled_scorers.py +431 -0
- mlflow/genai/scorers/__init__.py +26 -0
- mlflow/genai/scorers/base.py +492 -0
- mlflow/genai/scorers/builtin_scorers.py +765 -0
- mlflow/genai/scorers/scorer_utils.py +138 -0
- mlflow/genai/scorers/validation.py +165 -0
- mlflow/genai/utils/data_validation.py +146 -0
- mlflow/genai/utils/enum_utils.py +23 -0
- mlflow/genai/utils/trace_utils.py +211 -0
- mlflow/groq/__init__.py +42 -0
- mlflow/groq/_groq_autolog.py +74 -0
- mlflow/johnsnowlabs/__init__.py +888 -0
- mlflow/langchain/__init__.py +24 -0
- mlflow/langchain/api_request_parallel_processor.py +330 -0
- mlflow/langchain/autolog.py +147 -0
- mlflow/langchain/chat_agent_langgraph.py +340 -0
- mlflow/langchain/constant.py +1 -0
- mlflow/langchain/constants.py +1 -0
- mlflow/langchain/databricks_dependencies.py +444 -0
- mlflow/langchain/langchain_tracer.py +597 -0
- mlflow/langchain/model.py +919 -0
- mlflow/langchain/output_parsers.py +142 -0
- mlflow/langchain/retriever_chain.py +153 -0
- mlflow/langchain/runnables.py +527 -0
- mlflow/langchain/utils/chat.py +402 -0
- mlflow/langchain/utils/logging.py +671 -0
- mlflow/langchain/utils/serialization.py +36 -0
- mlflow/legacy_databricks_cli/__init__.py +0 -0
- mlflow/legacy_databricks_cli/configure/__init__.py +0 -0
- mlflow/legacy_databricks_cli/configure/provider.py +482 -0
- mlflow/litellm/__init__.py +175 -0
- mlflow/llama_index/__init__.py +22 -0
- mlflow/llama_index/autolog.py +55 -0
- mlflow/llama_index/chat.py +43 -0
- mlflow/llama_index/constant.py +1 -0
- mlflow/llama_index/model.py +577 -0
- mlflow/llama_index/pyfunc_wrapper.py +332 -0
- mlflow/llama_index/serialize_objects.py +188 -0
- mlflow/llama_index/tracer.py +561 -0
- mlflow/metrics/__init__.py +479 -0
- mlflow/metrics/base.py +39 -0
- mlflow/metrics/genai/__init__.py +25 -0
- mlflow/metrics/genai/base.py +101 -0
- mlflow/metrics/genai/genai_metric.py +771 -0
- mlflow/metrics/genai/metric_definitions.py +450 -0
- mlflow/metrics/genai/model_utils.py +371 -0
- mlflow/metrics/genai/prompt_template.py +68 -0
- mlflow/metrics/genai/prompts/__init__.py +0 -0
- mlflow/metrics/genai/prompts/v1.py +422 -0
- mlflow/metrics/genai/utils.py +6 -0
- mlflow/metrics/metric_definitions.py +619 -0
- mlflow/mismatch.py +34 -0
- mlflow/mistral/__init__.py +34 -0
- mlflow/mistral/autolog.py +71 -0
- mlflow/mistral/chat.py +135 -0
- mlflow/ml_package_versions.py +452 -0
- mlflow/models/__init__.py +97 -0
- mlflow/models/auth_policy.py +83 -0
- mlflow/models/cli.py +354 -0
- mlflow/models/container/__init__.py +294 -0
- mlflow/models/container/scoring_server/__init__.py +0 -0
- mlflow/models/container/scoring_server/nginx.conf +39 -0
- mlflow/models/dependencies_schemas.py +287 -0
- mlflow/models/display_utils.py +158 -0
- mlflow/models/docker_utils.py +211 -0
- mlflow/models/evaluation/__init__.py +23 -0
- mlflow/models/evaluation/_shap_patch.py +64 -0
- mlflow/models/evaluation/artifacts.py +194 -0
- mlflow/models/evaluation/base.py +1811 -0
- mlflow/models/evaluation/calibration_curve.py +109 -0
- mlflow/models/evaluation/default_evaluator.py +996 -0
- mlflow/models/evaluation/deprecated.py +23 -0
- mlflow/models/evaluation/evaluator_registry.py +80 -0
- mlflow/models/evaluation/evaluators/classifier.py +704 -0
- mlflow/models/evaluation/evaluators/default.py +233 -0
- mlflow/models/evaluation/evaluators/regressor.py +96 -0
- mlflow/models/evaluation/evaluators/shap.py +296 -0
- mlflow/models/evaluation/lift_curve.py +178 -0
- mlflow/models/evaluation/utils/metric.py +123 -0
- mlflow/models/evaluation/utils/trace.py +179 -0
- mlflow/models/evaluation/validation.py +434 -0
- mlflow/models/flavor_backend.py +93 -0
- mlflow/models/flavor_backend_registry.py +53 -0
- mlflow/models/model.py +1639 -0
- mlflow/models/model_config.py +150 -0
- mlflow/models/notebook_resources/agent_evaluation_template.html +235 -0
- mlflow/models/notebook_resources/eval_with_dataset_example.py +22 -0
- mlflow/models/notebook_resources/eval_with_synthetic_example.py +22 -0
- mlflow/models/python_api.py +369 -0
- mlflow/models/rag_signatures.py +128 -0
- mlflow/models/resources.py +321 -0
- mlflow/models/signature.py +662 -0
- mlflow/models/utils.py +2054 -0
- mlflow/models/wheeled_model.py +280 -0
- mlflow/openai/__init__.py +57 -0
- mlflow/openai/_agent_tracer.py +364 -0
- mlflow/openai/api_request_parallel_processor.py +131 -0
- mlflow/openai/autolog.py +509 -0
- mlflow/openai/constant.py +1 -0
- mlflow/openai/model.py +824 -0
- mlflow/openai/utils/chat_schema.py +367 -0
- mlflow/optuna/__init__.py +3 -0
- mlflow/optuna/storage.py +646 -0
- mlflow/plugins/__init__.py +72 -0
- mlflow/plugins/base.py +358 -0
- mlflow/plugins/builtin/__init__.py +24 -0
- mlflow/plugins/builtin/pytorch_plugin.py +150 -0
- mlflow/plugins/builtin/sklearn_plugin.py +158 -0
- mlflow/plugins/builtin/transformers_plugin.py +187 -0
- mlflow/plugins/cli.py +321 -0
- mlflow/plugins/discovery.py +340 -0
- mlflow/plugins/manager.py +465 -0
- mlflow/plugins/registry.py +316 -0
- mlflow/plugins/templates/framework_plugin_template.py +329 -0
- mlflow/prompt/constants.py +20 -0
- mlflow/prompt/promptlab_model.py +197 -0
- mlflow/prompt/registry_utils.py +248 -0
- mlflow/promptflow/__init__.py +495 -0
- mlflow/protos/__init__.py +0 -0
- mlflow/protos/assessments_pb2.py +174 -0
- mlflow/protos/databricks_artifacts_pb2.py +489 -0
- mlflow/protos/databricks_filesystem_service_pb2.py +196 -0
- mlflow/protos/databricks_managed_catalog_messages_pb2.py +95 -0
- mlflow/protos/databricks_managed_catalog_service_pb2.py +86 -0
- mlflow/protos/databricks_pb2.py +267 -0
- mlflow/protos/databricks_trace_server_pb2.py +374 -0
- mlflow/protos/databricks_uc_registry_messages_pb2.py +1249 -0
- mlflow/protos/databricks_uc_registry_service_pb2.py +170 -0
- mlflow/protos/facet_feature_statistics_pb2.py +296 -0
- mlflow/protos/internal_pb2.py +77 -0
- mlflow/protos/mlflow_artifacts_pb2.py +336 -0
- mlflow/protos/model_registry_pb2.py +1073 -0
- mlflow/protos/scalapb/__init__.py +0 -0
- mlflow/protos/scalapb/scalapb_pb2.py +104 -0
- mlflow/protos/service_pb2.py +2600 -0
- mlflow/protos/unity_catalog_oss_messages_pb2.py +457 -0
- mlflow/protos/unity_catalog_oss_service_pb2.py +130 -0
- mlflow/protos/unity_catalog_prompt_messages_pb2.py +447 -0
- mlflow/protos/unity_catalog_prompt_messages_pb2_grpc.py +24 -0
- mlflow/protos/unity_catalog_prompt_service_pb2.py +164 -0
- mlflow/protos/unity_catalog_prompt_service_pb2_grpc.py +785 -0
- mlflow/py.typed +0 -0
- mlflow/pydantic_ai/__init__.py +57 -0
- mlflow/pydantic_ai/autolog.py +173 -0
- mlflow/pyfunc/__init__.py +3844 -0
- mlflow/pyfunc/_mlflow_pyfunc_backend_predict.py +61 -0
- mlflow/pyfunc/backend.py +523 -0
- mlflow/pyfunc/context.py +78 -0
- mlflow/pyfunc/dbconnect_artifact_cache.py +144 -0
- mlflow/pyfunc/loaders/__init__.py +7 -0
- mlflow/pyfunc/loaders/chat_agent.py +117 -0
- mlflow/pyfunc/loaders/chat_model.py +125 -0
- mlflow/pyfunc/loaders/code_model.py +31 -0
- mlflow/pyfunc/loaders/responses_agent.py +112 -0
- mlflow/pyfunc/mlserver.py +46 -0
- mlflow/pyfunc/model.py +1473 -0
- mlflow/pyfunc/scoring_server/__init__.py +604 -0
- mlflow/pyfunc/scoring_server/app.py +7 -0
- mlflow/pyfunc/scoring_server/client.py +146 -0
- mlflow/pyfunc/spark_model_cache.py +48 -0
- mlflow/pyfunc/stdin_server.py +44 -0
- mlflow/pyfunc/utils/__init__.py +3 -0
- mlflow/pyfunc/utils/data_validation.py +224 -0
- mlflow/pyfunc/utils/environment.py +22 -0
- mlflow/pyfunc/utils/input_converter.py +47 -0
- mlflow/pyfunc/utils/serving_data_parser.py +11 -0
- mlflow/pytorch/__init__.py +1171 -0
- mlflow/pytorch/_lightning_autolog.py +580 -0
- mlflow/pytorch/_pytorch_autolog.py +50 -0
- mlflow/pytorch/pickle_module.py +35 -0
- mlflow/rfunc/__init__.py +42 -0
- mlflow/rfunc/backend.py +134 -0
- mlflow/runs.py +89 -0
- mlflow/server/__init__.py +302 -0
- mlflow/server/auth/__init__.py +1224 -0
- mlflow/server/auth/__main__.py +4 -0
- mlflow/server/auth/basic_auth.ini +6 -0
- mlflow/server/auth/cli.py +11 -0
- mlflow/server/auth/client.py +537 -0
- mlflow/server/auth/config.py +34 -0
- mlflow/server/auth/db/__init__.py +0 -0
- mlflow/server/auth/db/cli.py +18 -0
- mlflow/server/auth/db/migrations/__init__.py +0 -0
- mlflow/server/auth/db/migrations/alembic.ini +110 -0
- mlflow/server/auth/db/migrations/env.py +76 -0
- mlflow/server/auth/db/migrations/versions/8606fa83a998_initial_migration.py +51 -0
- mlflow/server/auth/db/migrations/versions/__init__.py +0 -0
- mlflow/server/auth/db/models.py +67 -0
- mlflow/server/auth/db/utils.py +37 -0
- mlflow/server/auth/entities.py +165 -0
- mlflow/server/auth/logo.py +14 -0
- mlflow/server/auth/permissions.py +65 -0
- mlflow/server/auth/routes.py +18 -0
- mlflow/server/auth/sqlalchemy_store.py +263 -0
- mlflow/server/graphql/__init__.py +0 -0
- mlflow/server/graphql/autogenerated_graphql_schema.py +353 -0
- mlflow/server/graphql/graphql_custom_scalars.py +24 -0
- mlflow/server/graphql/graphql_errors.py +15 -0
- mlflow/server/graphql/graphql_no_batching.py +89 -0
- mlflow/server/graphql/graphql_schema_extensions.py +74 -0
- mlflow/server/handlers.py +3217 -0
- mlflow/server/prometheus_exporter.py +17 -0
- mlflow/server/validation.py +30 -0
- mlflow/shap/__init__.py +691 -0
- mlflow/sklearn/__init__.py +1994 -0
- mlflow/sklearn/utils.py +1041 -0
- mlflow/smolagents/__init__.py +66 -0
- mlflow/smolagents/autolog.py +139 -0
- mlflow/smolagents/chat.py +29 -0
- mlflow/store/__init__.py +10 -0
- mlflow/store/_unity_catalog/__init__.py +1 -0
- mlflow/store/_unity_catalog/lineage/__init__.py +1 -0
- mlflow/store/_unity_catalog/lineage/constants.py +2 -0
- mlflow/store/_unity_catalog/registry/__init__.py +6 -0
- mlflow/store/_unity_catalog/registry/prompt_info.py +75 -0
- mlflow/store/_unity_catalog/registry/rest_store.py +1740 -0
- mlflow/store/_unity_catalog/registry/uc_oss_rest_store.py +507 -0
- mlflow/store/_unity_catalog/registry/utils.py +121 -0
- mlflow/store/artifact/__init__.py +0 -0
- mlflow/store/artifact/artifact_repo.py +472 -0
- mlflow/store/artifact/artifact_repository_registry.py +154 -0
- mlflow/store/artifact/azure_blob_artifact_repo.py +275 -0
- mlflow/store/artifact/azure_data_lake_artifact_repo.py +295 -0
- mlflow/store/artifact/cli.py +141 -0
- mlflow/store/artifact/cloud_artifact_repo.py +332 -0
- mlflow/store/artifact/databricks_artifact_repo.py +729 -0
- mlflow/store/artifact/databricks_artifact_repo_resources.py +301 -0
- mlflow/store/artifact/databricks_logged_model_artifact_repo.py +93 -0
- mlflow/store/artifact/databricks_models_artifact_repo.py +216 -0
- mlflow/store/artifact/databricks_sdk_artifact_repo.py +134 -0
- mlflow/store/artifact/databricks_sdk_models_artifact_repo.py +97 -0
- mlflow/store/artifact/dbfs_artifact_repo.py +240 -0
- mlflow/store/artifact/ftp_artifact_repo.py +132 -0
- mlflow/store/artifact/gcs_artifact_repo.py +296 -0
- mlflow/store/artifact/hdfs_artifact_repo.py +209 -0
- mlflow/store/artifact/http_artifact_repo.py +218 -0
- mlflow/store/artifact/local_artifact_repo.py +142 -0
- mlflow/store/artifact/mlflow_artifacts_repo.py +94 -0
- mlflow/store/artifact/models_artifact_repo.py +259 -0
- mlflow/store/artifact/optimized_s3_artifact_repo.py +356 -0
- mlflow/store/artifact/presigned_url_artifact_repo.py +173 -0
- mlflow/store/artifact/r2_artifact_repo.py +70 -0
- mlflow/store/artifact/runs_artifact_repo.py +265 -0
- mlflow/store/artifact/s3_artifact_repo.py +330 -0
- mlflow/store/artifact/sftp_artifact_repo.py +141 -0
- mlflow/store/artifact/uc_volume_artifact_repo.py +76 -0
- mlflow/store/artifact/unity_catalog_models_artifact_repo.py +168 -0
- mlflow/store/artifact/unity_catalog_oss_models_artifact_repo.py +168 -0
- mlflow/store/artifact/utils/__init__.py +0 -0
- mlflow/store/artifact/utils/models.py +148 -0
- mlflow/store/db/__init__.py +0 -0
- mlflow/store/db/base_sql_model.py +3 -0
- mlflow/store/db/db_types.py +10 -0
- mlflow/store/db/utils.py +314 -0
- mlflow/store/db_migrations/__init__.py +0 -0
- mlflow/store/db_migrations/alembic.ini +74 -0
- mlflow/store/db_migrations/env.py +84 -0
- mlflow/store/db_migrations/versions/0584bdc529eb_add_cascading_deletion_to_datasets_from_experiments.py +88 -0
- mlflow/store/db_migrations/versions/0a8213491aaa_drop_duplicate_killed_constraint.py +49 -0
- mlflow/store/db_migrations/versions/0c779009ac13_add_deleted_time_field_to_runs_table.py +24 -0
- mlflow/store/db_migrations/versions/181f10493468_allow_nulls_for_metric_values.py +35 -0
- mlflow/store/db_migrations/versions/27a6a02d2cf1_add_model_version_tags_table.py +38 -0
- mlflow/store/db_migrations/versions/2b4d017a5e9b_add_model_registry_tables_to_db.py +77 -0
- mlflow/store/db_migrations/versions/2d6e25af4d3e_increase_max_param_val_length.py +33 -0
- mlflow/store/db_migrations/versions/3500859a5d39_add_model_aliases_table.py +50 -0
- mlflow/store/db_migrations/versions/39d1c3be5f05_add_is_nan_constraint_for_metrics_tables_if_necessary.py +41 -0
- mlflow/store/db_migrations/versions/400f98739977_add_logged_model_tables.py +123 -0
- mlflow/store/db_migrations/versions/4465047574b1_increase_max_dataset_schema_size.py +38 -0
- mlflow/store/db_migrations/versions/451aebb31d03_add_metric_step.py +35 -0
- mlflow/store/db_migrations/versions/5b0e9adcef9c_add_cascade_deletion_to_trace_tables_fk.py +40 -0
- mlflow/store/db_migrations/versions/6953534de441_add_step_to_inputs_table.py +25 -0
- mlflow/store/db_migrations/versions/728d730b5ebd_add_registered_model_tags_table.py +38 -0
- mlflow/store/db_migrations/versions/7ac759974ad8_update_run_tags_with_larger_limit.py +36 -0
- mlflow/store/db_migrations/versions/7f2a7d5fae7d_add_datasets_inputs_input_tags_tables.py +82 -0
- mlflow/store/db_migrations/versions/84291f40a231_add_run_link_to_model_version.py +26 -0
- mlflow/store/db_migrations/versions/867495a8f9d4_add_trace_tables.py +90 -0
- mlflow/store/db_migrations/versions/89d4b8295536_create_latest_metrics_table.py +169 -0
- mlflow/store/db_migrations/versions/90e64c465722_migrate_user_column_to_tags.py +64 -0
- mlflow/store/db_migrations/versions/97727af70f4d_creation_time_last_update_time_experiments.py +25 -0
- mlflow/store/db_migrations/versions/__init__.py +0 -0
- mlflow/store/db_migrations/versions/a8c4a736bde6_allow_nulls_for_run_id.py +27 -0
- mlflow/store/db_migrations/versions/acf3f17fdcc7_add_storage_location_field_to_model_.py +29 -0
- mlflow/store/db_migrations/versions/bd07f7e963c5_create_index_on_run_uuid.py +26 -0
- mlflow/store/db_migrations/versions/bda7b8c39065_increase_model_version_tag_value_limit.py +38 -0
- mlflow/store/db_migrations/versions/c48cb773bb87_reset_default_value_for_is_nan_in_metrics_table_for_mysql.py +41 -0
- mlflow/store/db_migrations/versions/cbc13b556ace_add_v3_trace_schema_columns.py +31 -0
- mlflow/store/db_migrations/versions/cc1f77228345_change_param_value_length_to_500.py +34 -0
- mlflow/store/db_migrations/versions/cfd24bdc0731_update_run_status_constraint_with_killed.py +78 -0
- mlflow/store/db_migrations/versions/df50e92ffc5e_add_experiment_tags_table.py +38 -0
- mlflow/store/db_migrations/versions/f5a4f2784254_increase_run_tag_value_limit.py +36 -0
- mlflow/store/entities/__init__.py +3 -0
- mlflow/store/entities/paged_list.py +18 -0
- mlflow/store/model_registry/__init__.py +10 -0
- mlflow/store/model_registry/abstract_store.py +1081 -0
- mlflow/store/model_registry/base_rest_store.py +44 -0
- mlflow/store/model_registry/databricks_workspace_model_registry_rest_store.py +37 -0
- mlflow/store/model_registry/dbmodels/__init__.py +0 -0
- mlflow/store/model_registry/dbmodels/models.py +206 -0
- mlflow/store/model_registry/file_store.py +1091 -0
- mlflow/store/model_registry/rest_store.py +481 -0
- mlflow/store/model_registry/sqlalchemy_store.py +1286 -0
- mlflow/store/tracking/__init__.py +23 -0
- mlflow/store/tracking/abstract_store.py +816 -0
- mlflow/store/tracking/dbmodels/__init__.py +0 -0
- mlflow/store/tracking/dbmodels/initial_models.py +243 -0
- mlflow/store/tracking/dbmodels/models.py +1073 -0
- mlflow/store/tracking/file_store.py +2438 -0
- mlflow/store/tracking/postgres_managed_identity.py +146 -0
- mlflow/store/tracking/rest_store.py +1131 -0
- mlflow/store/tracking/sqlalchemy_store.py +2785 -0
- mlflow/system_metrics/__init__.py +61 -0
- mlflow/system_metrics/metrics/__init__.py +0 -0
- mlflow/system_metrics/metrics/base_metrics_monitor.py +32 -0
- mlflow/system_metrics/metrics/cpu_monitor.py +23 -0
- mlflow/system_metrics/metrics/disk_monitor.py +21 -0
- mlflow/system_metrics/metrics/gpu_monitor.py +71 -0
- mlflow/system_metrics/metrics/network_monitor.py +34 -0
- mlflow/system_metrics/metrics/rocm_monitor.py +123 -0
- mlflow/system_metrics/system_metrics_monitor.py +198 -0
- mlflow/tracing/__init__.py +16 -0
- mlflow/tracing/assessment.py +356 -0
- mlflow/tracing/client.py +531 -0
- mlflow/tracing/config.py +125 -0
- mlflow/tracing/constant.py +105 -0
- mlflow/tracing/destination.py +81 -0
- mlflow/tracing/display/__init__.py +40 -0
- mlflow/tracing/display/display_handler.py +196 -0
- mlflow/tracing/export/async_export_queue.py +186 -0
- mlflow/tracing/export/inference_table.py +138 -0
- mlflow/tracing/export/mlflow_v3.py +137 -0
- mlflow/tracing/export/utils.py +70 -0
- mlflow/tracing/fluent.py +1417 -0
- mlflow/tracing/processor/base_mlflow.py +199 -0
- mlflow/tracing/processor/inference_table.py +175 -0
- mlflow/tracing/processor/mlflow_v3.py +47 -0
- mlflow/tracing/processor/otel.py +73 -0
- mlflow/tracing/provider.py +487 -0
- mlflow/tracing/trace_manager.py +200 -0
- mlflow/tracing/utils/__init__.py +616 -0
- mlflow/tracing/utils/artifact_utils.py +28 -0
- mlflow/tracing/utils/copy.py +55 -0
- mlflow/tracing/utils/environment.py +55 -0
- mlflow/tracing/utils/exception.py +21 -0
- mlflow/tracing/utils/once.py +35 -0
- mlflow/tracing/utils/otlp.py +63 -0
- mlflow/tracing/utils/processor.py +54 -0
- mlflow/tracing/utils/search.py +292 -0
- mlflow/tracing/utils/timeout.py +250 -0
- mlflow/tracing/utils/token.py +19 -0
- mlflow/tracing/utils/truncation.py +124 -0
- mlflow/tracing/utils/warning.py +76 -0
- mlflow/tracking/__init__.py +39 -0
- mlflow/tracking/_model_registry/__init__.py +1 -0
- mlflow/tracking/_model_registry/client.py +764 -0
- mlflow/tracking/_model_registry/fluent.py +853 -0
- mlflow/tracking/_model_registry/registry.py +67 -0
- mlflow/tracking/_model_registry/utils.py +251 -0
- mlflow/tracking/_tracking_service/__init__.py +0 -0
- mlflow/tracking/_tracking_service/client.py +883 -0
- mlflow/tracking/_tracking_service/registry.py +56 -0
- mlflow/tracking/_tracking_service/utils.py +275 -0
- mlflow/tracking/artifact_utils.py +179 -0
- mlflow/tracking/client.py +5900 -0
- mlflow/tracking/context/__init__.py +0 -0
- mlflow/tracking/context/abstract_context.py +35 -0
- mlflow/tracking/context/databricks_cluster_context.py +15 -0
- mlflow/tracking/context/databricks_command_context.py +15 -0
- mlflow/tracking/context/databricks_job_context.py +49 -0
- mlflow/tracking/context/databricks_notebook_context.py +41 -0
- mlflow/tracking/context/databricks_repo_context.py +43 -0
- mlflow/tracking/context/default_context.py +51 -0
- mlflow/tracking/context/git_context.py +32 -0
- mlflow/tracking/context/registry.py +98 -0
- mlflow/tracking/context/system_environment_context.py +15 -0
- mlflow/tracking/default_experiment/__init__.py +1 -0
- mlflow/tracking/default_experiment/abstract_context.py +43 -0
- mlflow/tracking/default_experiment/databricks_notebook_experiment_provider.py +44 -0
- mlflow/tracking/default_experiment/registry.py +75 -0
- mlflow/tracking/fluent.py +3595 -0
- mlflow/tracking/metric_value_conversion_utils.py +93 -0
- mlflow/tracking/multimedia.py +206 -0
- mlflow/tracking/registry.py +86 -0
- mlflow/tracking/request_auth/__init__.py +0 -0
- mlflow/tracking/request_auth/abstract_request_auth_provider.py +34 -0
- mlflow/tracking/request_auth/registry.py +60 -0
- mlflow/tracking/request_header/__init__.py +0 -0
- mlflow/tracking/request_header/abstract_request_header_provider.py +36 -0
- mlflow/tracking/request_header/databricks_request_header_provider.py +38 -0
- mlflow/tracking/request_header/default_request_header_provider.py +17 -0
- mlflow/tracking/request_header/registry.py +79 -0
- mlflow/transformers/__init__.py +2982 -0
- mlflow/transformers/flavor_config.py +258 -0
- mlflow/transformers/hub_utils.py +83 -0
- mlflow/transformers/llm_inference_utils.py +468 -0
- mlflow/transformers/model_io.py +301 -0
- mlflow/transformers/peft.py +51 -0
- mlflow/transformers/signature.py +183 -0
- mlflow/transformers/torch_utils.py +55 -0
- mlflow/types/__init__.py +21 -0
- mlflow/types/agent.py +270 -0
- mlflow/types/chat.py +240 -0
- mlflow/types/llm.py +935 -0
- mlflow/types/responses.py +139 -0
- mlflow/types/responses_helpers.py +416 -0
- mlflow/types/schema.py +1505 -0
- mlflow/types/type_hints.py +647 -0
- mlflow/types/utils.py +753 -0
- mlflow/utils/__init__.py +283 -0
- mlflow/utils/_capture_modules.py +256 -0
- mlflow/utils/_capture_transformers_modules.py +75 -0
- mlflow/utils/_spark_utils.py +201 -0
- mlflow/utils/_unity_catalog_oss_utils.py +97 -0
- mlflow/utils/_unity_catalog_utils.py +479 -0
- mlflow/utils/annotations.py +218 -0
- mlflow/utils/arguments_utils.py +16 -0
- mlflow/utils/async_logging/__init__.py +1 -0
- mlflow/utils/async_logging/async_artifacts_logging_queue.py +258 -0
- mlflow/utils/async_logging/async_logging_queue.py +366 -0
- mlflow/utils/async_logging/run_artifact.py +38 -0
- mlflow/utils/async_logging/run_batch.py +58 -0
- mlflow/utils/async_logging/run_operations.py +49 -0
- mlflow/utils/autologging_utils/__init__.py +737 -0
- mlflow/utils/autologging_utils/client.py +432 -0
- mlflow/utils/autologging_utils/config.py +33 -0
- mlflow/utils/autologging_utils/events.py +294 -0
- mlflow/utils/autologging_utils/logging_and_warnings.py +328 -0
- mlflow/utils/autologging_utils/metrics_queue.py +71 -0
- mlflow/utils/autologging_utils/safety.py +1104 -0
- mlflow/utils/autologging_utils/versioning.py +95 -0
- mlflow/utils/checkpoint_utils.py +206 -0
- mlflow/utils/class_utils.py +6 -0
- mlflow/utils/cli_args.py +257 -0
- mlflow/utils/conda.py +354 -0
- mlflow/utils/credentials.py +231 -0
- mlflow/utils/data_utils.py +17 -0
- mlflow/utils/databricks_utils.py +1436 -0
- mlflow/utils/docstring_utils.py +477 -0
- mlflow/utils/doctor.py +133 -0
- mlflow/utils/download_cloud_file_chunk.py +43 -0
- mlflow/utils/env_manager.py +16 -0
- mlflow/utils/env_pack.py +131 -0
- mlflow/utils/environment.py +1009 -0
- mlflow/utils/exception_utils.py +14 -0
- mlflow/utils/file_utils.py +978 -0
- mlflow/utils/git_utils.py +77 -0
- mlflow/utils/gorilla.py +797 -0
- mlflow/utils/import_hooks/__init__.py +363 -0
- mlflow/utils/lazy_load.py +51 -0
- mlflow/utils/logging_utils.py +168 -0
- mlflow/utils/mime_type_utils.py +58 -0
- mlflow/utils/mlflow_tags.py +103 -0
- mlflow/utils/model_utils.py +486 -0
- mlflow/utils/name_utils.py +346 -0
- mlflow/utils/nfs_on_spark.py +62 -0
- mlflow/utils/openai_utils.py +164 -0
- mlflow/utils/os.py +12 -0
- mlflow/utils/oss_registry_utils.py +29 -0
- mlflow/utils/plugins.py +17 -0
- mlflow/utils/process.py +182 -0
- mlflow/utils/promptlab_utils.py +146 -0
- mlflow/utils/proto_json_utils.py +743 -0
- mlflow/utils/pydantic_utils.py +54 -0
- mlflow/utils/request_utils.py +279 -0
- mlflow/utils/requirements_utils.py +704 -0
- mlflow/utils/rest_utils.py +673 -0
- mlflow/utils/search_logged_model_utils.py +127 -0
- mlflow/utils/search_utils.py +2111 -0
- mlflow/utils/secure_loading.py +221 -0
- mlflow/utils/security_validation.py +384 -0
- mlflow/utils/server_cli_utils.py +61 -0
- mlflow/utils/spark_utils.py +15 -0
- mlflow/utils/string_utils.py +138 -0
- mlflow/utils/thread_utils.py +63 -0
- mlflow/utils/time.py +54 -0
- mlflow/utils/timeout.py +42 -0
- mlflow/utils/uri.py +572 -0
- mlflow/utils/validation.py +662 -0
- mlflow/utils/virtualenv.py +458 -0
- mlflow/utils/warnings_utils.py +25 -0
- mlflow/utils/yaml_utils.py +179 -0
- mlflow/version.py +24 -0
mlflow/utils/gorilla.py
ADDED
@@ -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
|