snowflake-ml-python 1.46.0__tar.gz → 1.48.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/CHANGELOG.md +48 -1
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/PKG-INFO +51 -3
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/pyproject.toml +1 -1
- snowflake_ml_python-1.48.0/snowflake/ml/experiment/_source_info.py +487 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/experiment/experiment_tracking.py +60 -5
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/feature_store/aggregation.py +10 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/feature_store/feature_group.py +21 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/feature_store/feature_store.py +199 -13
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/feature_store/feature_view.py +54 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/feature_store/realtime_registration.py +6 -4
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/feature_store/spec/builder.py +53 -35
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/feature_store/tile_sql_generator.py +26 -23
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/jobs/_utils/stage_utils.py +9 -1
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/jobs/job_definition.py +29 -6
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/jobs/manager.py +15 -6
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/lineage/lineage_node.py +1 -1
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/model/_client/model/batch_inference_specs.py +10 -3
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/model/_client/model/model_version_impl.py +3 -1
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/model/_client/ops/service_ops.py +3 -1
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/model/_model_composer/model_method/function_generator.py +5 -1
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/model/_model_composer/model_method/infer_function.py_template +11 -11
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/model/_model_composer/model_method/infer_function_init_once.py_template +11 -11
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/model/_model_composer/model_method/infer_partitioned.py_template +10 -10
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/model/_model_composer/model_method/infer_partitioned_init_once.py_template +10 -10
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/model/_model_composer/model_method/infer_table_function.py_template +10 -10
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/model/_model_composer/model_method/infer_table_function_init_once.py_template +10 -10
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/model/_packager/model_handlers/catboost.py +1 -2
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/model/_packager/model_handlers/huggingface/_handler.py +2 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/model/_packager/model_handlers/huggingface/_task_handler.py +2 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/model/_packager/model_handlers/huggingface/document_question_answering.py +2 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/model/_packager/model_handlers/huggingface/image_classification.py +2 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/model/_packager/model_handlers/huggingface/image_feature_extraction.py +2 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/model/_packager/model_handlers/huggingface/image_text_to_text.py +2 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/model/_packager/model_handlers/huggingface/image_to_text.py +2 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/model/_packager/model_handlers/huggingface/object_detection.py +2 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/model/_packager/model_handlers/huggingface/video_classification.py +2 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/model/_packager/model_handlers/huggingface/visual_question_answering.py +2 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/model/_packager/model_handlers/huggingface/zero_shot_image_classification.py +2 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/model/_packager/model_handlers/huggingface/zero_shot_object_detection.py +2 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/model/_packager/model_handlers/lightgbm.py +1 -2
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/model/_packager/model_handlers/sklearn.py +1 -18
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/model/_packager/model_handlers/snowmlmodel.py +17 -22
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/model/_packager/model_handlers/xgboost.py +1 -1
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/model/_packager/model_runtime/_snowml_inference_alternative_requirements.py +2 -1
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/model/_signatures/snowpark_handler.py +5 -1
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/model/openai_signatures.py +44 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/model/type_hints.py +1 -1
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/modeling/calibration/calibrated_classifier_cv.py +18 -5
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/modeling/cluster/affinity_propagation.py +18 -5
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/modeling/cluster/agglomerative_clustering.py +18 -5
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/modeling/cluster/birch.py +18 -5
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/modeling/cluster/bisecting_k_means.py +18 -5
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/modeling/cluster/dbscan.py +18 -5
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/modeling/cluster/feature_agglomeration.py +18 -5
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/modeling/cluster/k_means.py +18 -5
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/modeling/cluster/mean_shift.py +18 -5
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/modeling/cluster/mini_batch_k_means.py +18 -5
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/modeling/cluster/optics.py +18 -5
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/modeling/cluster/spectral_biclustering.py +18 -5
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/modeling/cluster/spectral_clustering.py +18 -5
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/modeling/cluster/spectral_coclustering.py +18 -5
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/modeling/compose/column_transformer.py +18 -5
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/modeling/compose/transformed_target_regressor.py +18 -5
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/modeling/covariance/elliptic_envelope.py +18 -5
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/modeling/covariance/empirical_covariance.py +18 -5
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/modeling/covariance/graphical_lasso.py +18 -5
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/modeling/covariance/graphical_lasso_cv.py +18 -5
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/modeling/covariance/ledoit_wolf.py +18 -5
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/modeling/covariance/min_cov_det.py +18 -5
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/modeling/covariance/oas.py +18 -5
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/modeling/covariance/shrunk_covariance.py +18 -5
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/modeling/decomposition/dictionary_learning.py +18 -5
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/modeling/decomposition/factor_analysis.py +18 -5
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/modeling/decomposition/fast_ica.py +18 -5
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/modeling/decomposition/incremental_pca.py +18 -5
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/modeling/decomposition/kernel_pca.py +18 -5
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/modeling/decomposition/mini_batch_dictionary_learning.py +18 -5
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/modeling/decomposition/mini_batch_sparse_pca.py +18 -5
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/modeling/decomposition/pca.py +18 -5
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/modeling/decomposition/sparse_pca.py +18 -5
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/modeling/decomposition/truncated_svd.py +18 -5
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/modeling/discriminant_analysis/linear_discriminant_analysis.py +18 -5
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/modeling/discriminant_analysis/quadratic_discriminant_analysis.py +18 -5
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/modeling/ensemble/ada_boost_classifier.py +18 -5
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/modeling/ensemble/ada_boost_regressor.py +18 -5
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/modeling/ensemble/bagging_classifier.py +18 -5
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/modeling/ensemble/bagging_regressor.py +18 -5
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/modeling/ensemble/extra_trees_classifier.py +18 -5
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/modeling/ensemble/extra_trees_regressor.py +18 -5
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/modeling/ensemble/gradient_boosting_classifier.py +18 -5
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/modeling/ensemble/gradient_boosting_regressor.py +18 -5
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/modeling/ensemble/hist_gradient_boosting_classifier.py +18 -5
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/modeling/ensemble/hist_gradient_boosting_regressor.py +18 -5
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/modeling/ensemble/isolation_forest.py +18 -5
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/modeling/ensemble/random_forest_classifier.py +18 -5
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/modeling/ensemble/random_forest_regressor.py +18 -5
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/modeling/ensemble/stacking_regressor.py +18 -5
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/modeling/ensemble/voting_classifier.py +18 -5
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/modeling/ensemble/voting_regressor.py +18 -5
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/modeling/feature_selection/generic_univariate_select.py +18 -5
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/modeling/feature_selection/select_fdr.py +18 -5
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/modeling/feature_selection/select_fpr.py +18 -5
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/modeling/feature_selection/select_fwe.py +18 -5
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/modeling/feature_selection/select_k_best.py +18 -5
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/modeling/feature_selection/select_percentile.py +18 -5
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/modeling/feature_selection/sequential_feature_selector.py +18 -5
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/modeling/feature_selection/variance_threshold.py +18 -5
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/modeling/framework/base.py +30 -5
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/modeling/gaussian_process/gaussian_process_classifier.py +18 -5
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/modeling/gaussian_process/gaussian_process_regressor.py +18 -5
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/modeling/impute/iterative_imputer.py +18 -5
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/modeling/impute/knn_imputer.py +18 -5
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/modeling/impute/missing_indicator.py +18 -5
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/modeling/impute/simple_imputer.py +6 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/modeling/kernel_approximation/additive_chi2_sampler.py +18 -5
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/modeling/kernel_approximation/nystroem.py +18 -5
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/modeling/kernel_approximation/polynomial_count_sketch.py +18 -5
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/modeling/kernel_approximation/rbf_sampler.py +18 -5
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/modeling/kernel_approximation/skewed_chi2_sampler.py +18 -5
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/modeling/kernel_ridge/kernel_ridge.py +18 -5
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/modeling/lightgbm/lgbm_classifier.py +18 -5
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/modeling/lightgbm/lgbm_regressor.py +18 -5
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/modeling/linear_model/ard_regression.py +18 -5
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/modeling/linear_model/bayesian_ridge.py +18 -5
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/modeling/linear_model/elastic_net.py +18 -5
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/modeling/linear_model/elastic_net_cv.py +18 -5
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/modeling/linear_model/gamma_regressor.py +18 -5
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/modeling/linear_model/huber_regressor.py +18 -5
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/modeling/linear_model/lars.py +18 -5
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/modeling/linear_model/lars_cv.py +18 -5
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/modeling/linear_model/lasso.py +18 -5
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/modeling/linear_model/lasso_cv.py +18 -5
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/modeling/linear_model/lasso_lars.py +18 -5
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/modeling/linear_model/lasso_lars_cv.py +18 -5
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/modeling/linear_model/lasso_lars_ic.py +18 -5
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/modeling/linear_model/linear_regression.py +18 -5
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/modeling/linear_model/logistic_regression.py +18 -5
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/modeling/linear_model/logistic_regression_cv.py +18 -5
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/modeling/linear_model/multi_task_elastic_net.py +18 -5
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/modeling/linear_model/multi_task_elastic_net_cv.py +18 -5
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/modeling/linear_model/multi_task_lasso.py +18 -5
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/modeling/linear_model/multi_task_lasso_cv.py +18 -5
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/modeling/linear_model/orthogonal_matching_pursuit.py +18 -5
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/modeling/linear_model/passive_aggressive_classifier.py +18 -5
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/modeling/linear_model/passive_aggressive_regressor.py +18 -5
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/modeling/linear_model/perceptron.py +18 -5
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/modeling/linear_model/poisson_regressor.py +18 -5
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/modeling/linear_model/ransac_regressor.py +18 -5
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/modeling/linear_model/ridge.py +18 -5
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/modeling/linear_model/ridge_classifier.py +18 -5
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/modeling/linear_model/ridge_classifier_cv.py +18 -5
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/modeling/linear_model/ridge_cv.py +18 -5
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/modeling/linear_model/sgd_classifier.py +18 -5
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/modeling/linear_model/sgd_one_class_svm.py +18 -5
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/modeling/linear_model/sgd_regressor.py +18 -5
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/modeling/linear_model/theil_sen_regressor.py +18 -5
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/modeling/linear_model/tweedie_regressor.py +18 -5
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/modeling/manifold/isomap.py +18 -5
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/modeling/manifold/mds.py +18 -5
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/modeling/manifold/spectral_embedding.py +18 -5
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/modeling/manifold/tsne.py +18 -5
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/modeling/mixture/bayesian_gaussian_mixture.py +18 -5
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/modeling/mixture/gaussian_mixture.py +18 -5
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/modeling/model_selection/grid_search_cv.py +5 -4
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/modeling/model_selection/randomized_search_cv.py +5 -4
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/modeling/multiclass/one_vs_one_classifier.py +18 -5
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/modeling/multiclass/one_vs_rest_classifier.py +18 -5
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/modeling/multiclass/output_code_classifier.py +18 -5
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/modeling/naive_bayes/bernoulli_nb.py +18 -5
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/modeling/naive_bayes/categorical_nb.py +18 -5
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/modeling/naive_bayes/complement_nb.py +18 -5
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/modeling/naive_bayes/gaussian_nb.py +18 -5
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/modeling/naive_bayes/multinomial_nb.py +18 -5
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/modeling/neighbors/k_neighbors_classifier.py +18 -5
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/modeling/neighbors/k_neighbors_regressor.py +18 -5
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/modeling/neighbors/kernel_density.py +18 -5
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/modeling/neighbors/local_outlier_factor.py +18 -5
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/modeling/neighbors/nearest_centroid.py +18 -5
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/modeling/neighbors/nearest_neighbors.py +18 -5
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/modeling/neighbors/neighborhood_components_analysis.py +18 -5
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/modeling/neighbors/radius_neighbors_classifier.py +18 -5
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/modeling/neighbors/radius_neighbors_regressor.py +18 -5
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/modeling/neural_network/bernoulli_rbm.py +18 -5
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/modeling/neural_network/mlp_classifier.py +18 -5
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/modeling/neural_network/mlp_regressor.py +18 -5
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/modeling/preprocessing/polynomial_features.py +18 -5
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/modeling/semi_supervised/label_propagation.py +18 -5
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/modeling/semi_supervised/label_spreading.py +18 -5
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/modeling/svm/linear_svc.py +18 -5
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/modeling/svm/linear_svr.py +18 -5
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/modeling/svm/nu_svc.py +18 -5
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/modeling/svm/nu_svr.py +18 -5
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/modeling/svm/svc.py +18 -5
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/modeling/svm/svr.py +18 -5
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/modeling/tree/decision_tree_classifier.py +18 -5
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/modeling/tree/decision_tree_regressor.py +18 -5
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/modeling/tree/extra_tree_classifier.py +18 -5
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/modeling/tree/extra_tree_regressor.py +18 -5
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/modeling/xgboost/xgb_classifier.py +18 -5
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/modeling/xgboost/xgb_regressor.py +18 -5
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/modeling/xgboost/xgbrf_classifier.py +18 -5
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/modeling/xgboost/xgbrf_regressor.py +18 -5
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/registry/_manager/model_parameter_reconciler.py +3 -61
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/registry/registry.py +6 -6
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/version.py +1 -1
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake_ml_python.egg-info/PKG-INFO +51 -3
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake_ml_python.egg-info/SOURCES.txt +1 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake_ml_python.egg-info/requires.txt +2 -1
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/LICENSE.txt +0 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/README.md +0 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/setup.cfg +0 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/cortex/__init__.py +0 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/cortex/_classify_text.py +0 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/cortex/_complete.py +0 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/cortex/_embed_text_1024.py +0 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/cortex/_embed_text_768.py +0 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/cortex/_extract_answer.py +0 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/cortex/_finetune.py +0 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/cortex/_sentiment.py +0 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/cortex/_sse_client.py +0 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/cortex/_summarize.py +0 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/cortex/_translate.py +0 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/cortex/_util.py +0 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/_internal/env.py +0 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/_internal/env_utils.py +0 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/_internal/exceptions/dataset_error_messages.py +0 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/_internal/exceptions/dataset_errors.py +0 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/_internal/exceptions/error_codes.py +0 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/_internal/exceptions/error_messages.py +0 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/_internal/exceptions/exceptions.py +0 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/_internal/exceptions/fileset_error_messages.py +0 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/_internal/exceptions/fileset_errors.py +0 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/_internal/exceptions/modeling_error_messages.py +0 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/_internal/exceptions/sql_error_codes.py +0 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/_internal/file_utils.py +0 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/_internal/human_readable_id/adjectives.txt +0 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/_internal/human_readable_id/animals.txt +0 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/_internal/human_readable_id/hrid_generator.py +0 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/_internal/human_readable_id/hrid_generator_base.py +0 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/_internal/init_utils.py +0 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/_internal/lineage/lineage_utils.py +0 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/_internal/migrator_utils.py +0 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/_internal/platform_capabilities.py +0 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/_internal/relax_version_strategy.py +0 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/_internal/telemetry.py +0 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/_internal/type_utils.py +0 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/_internal/utils/connection_params.py +0 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/_internal/utils/db_utils.py +0 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/_internal/utils/formatting.py +0 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/_internal/utils/identifier.py +0 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/_internal/utils/import_utils.py +0 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/_internal/utils/jwt_generator.py +0 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/_internal/utils/mixins.py +0 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/_internal/utils/parallelize.py +0 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/_internal/utils/pkg_version_utils.py +0 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/_internal/utils/query_result_checker.py +0 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/_internal/utils/result.py +0 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/_internal/utils/service_logger.py +0 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/_internal/utils/snowflake_env.py +0 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/_internal/utils/snowpark_dataframe_utils.py +0 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/_internal/utils/sql_identifier.py +0 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/_internal/utils/table_manager.py +0 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/_internal/utils/tee.py +0 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/_internal/utils/temp_file_utils.py +0 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/_internal/utils/url.py +0 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/data/__init__.py +0 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/data/_internal/arrow_ingestor.py +0 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/data/data_connector.py +0 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/data/data_ingestor.py +0 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/data/data_source.py +0 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/data/ingestor_utils.py +0 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/data/torch_utils.py +0 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/dataset/__init__.py +0 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/dataset/dataset.py +0 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/dataset/dataset_factory.py +0 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/dataset/dataset_metadata.py +0 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/dataset/dataset_reader.py +0 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/experiment/__init__.py +0 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/experiment/_client/artifact.py +0 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/experiment/_client/experiment_tracking_sql_client.py +0 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/experiment/_entities/__init__.py +0 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/experiment/_entities/experiment.py +0 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/experiment/_entities/run.py +0 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/experiment/_entities/run_metadata.py +0 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/experiment/_experiment_info.py +0 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/experiment/_logging/__init__.py +0 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/experiment/_logging/experiment_logger.py +0 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/experiment/_logging/experiment_logging_context.py +0 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/experiment/callback/keras.py +0 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/experiment/callback/lightgbm.py +0 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/experiment/callback/xgboost.py +0 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/experiment/utils.py +0 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/feature_store/__init__.py +0 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/feature_store/_compute_fn_validation.py +0 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/feature_store/access_manager.py +0 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/feature_store/entity.py +0 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/feature_store/examples/airline_features/entities.py +0 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/feature_store/examples/airline_features/features/plane_features.py +0 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/feature_store/examples/airline_features/features/weather_features.py +0 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/feature_store/examples/airline_features/source.yaml +0 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/feature_store/examples/citibike_trip_features/entities.py +0 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/feature_store/examples/citibike_trip_features/features/station_feature.py +0 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/feature_store/examples/citibike_trip_features/features/trip_feature.py +0 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/feature_store/examples/citibike_trip_features/source.yaml +0 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/feature_store/examples/example_helper.py +0 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/feature_store/examples/new_york_taxi_features/entities.py +0 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/feature_store/examples/new_york_taxi_features/features/location_features.py +0 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/feature_store/examples/new_york_taxi_features/features/trip_features.py +0 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/feature_store/examples/new_york_taxi_features/source.yaml +0 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/feature_store/examples/source_data/airline.yaml +0 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/feature_store/examples/source_data/citibike_trips.yaml +0 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/feature_store/examples/source_data/fraud_transactions.yaml +0 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/feature_store/examples/source_data/nyc_yellow_trips.yaml +0 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/feature_store/examples/source_data/winequality_red.yaml +0 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/feature_store/examples/wine_quality_features/entities.py +0 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/feature_store/examples/wine_quality_features/features/managed_wine_features.py +0 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/feature_store/examples/wine_quality_features/features/static_wine_features.py +0 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/feature_store/examples/wine_quality_features/source.yaml +0 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/feature_store/feature.py +0 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/feature_store/feature_view_append_only_validation.py +0 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/feature_store/feature_view_refresh_freq.py +0 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/feature_store/interval_utils.py +0 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/feature_store/metadata_manager.py +0 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/feature_store/online_service.py +0 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/feature_store/online_service_http_client.py +0 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/feature_store/realtime_config.py +0 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/feature_store/realtime_dataset.py +0 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/feature_store/realtime_dataset_udf.py +0 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/feature_store/request_source.py +0 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/feature_store/spec/__init__.py +0 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/feature_store/spec/enums.py +0 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/feature_store/spec/models.py +0 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/feature_store/spec/table_schema_evolution.py +0 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/feature_store/stream_config.py +0 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/feature_store/stream_source.py +0 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/feature_store/streaming_registration.py +0 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/fileset/embedded_stage_fs.py +0 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/fileset/fileset.py +0 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/fileset/sfcfs.py +0 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/fileset/snowfs.py +0 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/fileset/stage_fs.py +0 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/jobs/__init__.py +0 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/jobs/_interop/__init__.py +0 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/jobs/_interop/data_utils.py +0 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/jobs/_interop/dto_schema.py +0 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/jobs/_interop/exception_utils.py +0 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/jobs/_interop/legacy.py +0 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/jobs/_interop/protocols.py +0 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/jobs/_interop/results.py +0 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/jobs/_interop/utils.py +0 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/jobs/_utils/__init__.py +0 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/jobs/_utils/arg_protocol.py +0 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/jobs/_utils/constants.py +0 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/jobs/_utils/feature_flags.py +0 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/jobs/_utils/payload_utils.py +0 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/jobs/_utils/query_helper.py +0 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/jobs/_utils/runtime_env_utils.py +0 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/jobs/_utils/scripts/__init__.py +0 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/jobs/_utils/scripts/constants.py +0 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/jobs/_utils/scripts/get_instance_ip.py +0 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/jobs/_utils/scripts/mljob_launcher.py +0 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/jobs/_utils/scripts/signal_workers.py +0 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/jobs/_utils/scripts/start_mlruntime.sh +0 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/jobs/_utils/scripts/startup.sh +0 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/jobs/_utils/scripts/worker_shutdown_listener.py +0 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/jobs/_utils/type_utils.py +0 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/jobs/decorators.py +0 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/jobs/job.py +0 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/lineage/__init__.py +0 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/model/__init__.py +0 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/model/_client/model/batch_inference_serialization.py +0 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/model/_client/model/batch_inference_task.py +0 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/model/_client/model/inference_engine_utils.py +0 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/model/_client/model/model_impl.py +0 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/model/_client/ops/deployment_step.py +0 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/model/_client/ops/metadata_ops.py +0 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/model/_client/ops/model_ops.py +0 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/model/_client/ops/param_ops.py +0 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/model/_client/ops/param_utils.py +0 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/model/_client/service/import_model_spec_schema.py +0 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/model/_client/service/inference_job_service_spec.py +0 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/model/_client/service/model_deployment_spec.py +0 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/model/_client/service/model_deployment_spec_schema.py +0 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/model/_client/sql/_base.py +0 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/model/_client/sql/model.py +0 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/model/_client/sql/model_version.py +0 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/model/_client/sql/service.py +0 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/model/_client/sql/stage.py +0 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/model/_client/sql/tag.py +0 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/model/_model_composer/huggingface_lazy_uploader.py +0 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/model/_model_composer/model_composer.py +0 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/model/_model_composer/model_manifest/model_manifest.py +0 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/model/_model_composer/model_manifest/model_manifest_schema.py +0 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/model/_model_composer/model_method/constants.py +0 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/model/_model_composer/model_method/model_method.py +0 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/model/_model_composer/model_method/utils.py +0 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/model/_model_composer/model_user_file/model_user_file.py +0 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/model/_packager/model_env/model_env.py +0 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/model/_packager/model_handler.py +0 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/model/_packager/model_handlers/_base.py +0 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/model/_packager/model_handlers/_utils.py +0 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/model/_packager/model_handlers/custom.py +0 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/model/_packager/model_handlers/huggingface/__init__.py +0 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/model/_packager/model_handlers/huggingface/_default.py +0 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/model/_packager/model_handlers/huggingface/_openai_chat_wrapper.py +0 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/model/_packager/model_handlers/huggingface/_utils.py +0 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/model/_packager/model_handlers/huggingface/audio_classification.py +0 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/model/_packager/model_handlers/huggingface/audio_text_to_text.py +0 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/model/_packager/model_handlers/huggingface/automatic_speech_recognition.py +0 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/model/_packager/model_handlers/huggingface/conversational.py +0 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/model/_packager/model_handlers/huggingface/fill_mask.py +0 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/model/_packager/model_handlers/huggingface/question_answering.py +0 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/model/_packager/model_handlers/huggingface/summarization.py +0 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/model/_packager/model_handlers/huggingface/table_question_answering.py +0 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/model/_packager/model_handlers/huggingface/text2text_generation.py +0 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/model/_packager/model_handlers/huggingface/text_classification.py +0 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/model/_packager/model_handlers/huggingface/text_generation.py +0 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/model/_packager/model_handlers/huggingface/token_classification.py +0 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/model/_packager/model_handlers/huggingface/translation.py +0 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/model/_packager/model_handlers/huggingface/video_text_to_text.py +0 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/model/_packager/model_handlers/huggingface/zero_shot_audio_classification.py +0 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/model/_packager/model_handlers/huggingface/zero_shot_text_classification.py +0 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/model/_packager/model_handlers/keras.py +0 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/model/_packager/model_handlers/mlflow.py +0 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/model/_packager/model_handlers/prophet.py +0 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/model/_packager/model_handlers/pytorch.py +0 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/model/_packager/model_handlers/sentence_transformers.py +0 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/model/_packager/model_handlers/tensorflow.py +0 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/model/_packager/model_handlers/torchscript.py +0 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/model/_packager/model_handlers_migrator/base_migrator.py +0 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/model/_packager/model_handlers_migrator/pytorch_migrator_2023_12_01.py +0 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/model/_packager/model_handlers_migrator/tensorflow_migrator_2023_12_01.py +0 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/model/_packager/model_handlers_migrator/tensorflow_migrator_2025_01_01.py +0 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/model/_packager/model_handlers_migrator/torchscript_migrator_2023_12_01.py +0 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/model/_packager/model_meta/model_blob_meta.py +0 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/model/_packager/model_meta/model_meta.py +0 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/model/_packager/model_meta/model_meta_schema.py +0 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/model/_packager/model_meta/model_sample_input_data.py +0 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/model/_packager/model_meta_migrator/base_migrator.py +0 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/model/_packager/model_meta_migrator/migrator_plans.py +0 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/model/_packager/model_meta_migrator/migrator_v1.py +0 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/model/_packager/model_packager.py +0 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/model/_packager/model_runtime/model_runtime.py +0 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/model/_packager/model_save_options.py +0 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/model/_packager/model_task/model_task_utils.py +0 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/model/_signatures/base_handler.py +0 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/model/_signatures/builtins_handler.py +0 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/model/_signatures/core.py +0 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/model/_signatures/dmatrix_handler.py +0 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/model/_signatures/numpy_handler.py +0 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/model/_signatures/pandas_handler.py +0 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/model/_signatures/pytorch_handler.py +0 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/model/_signatures/tensorflow_handler.py +0 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/model/_signatures/utils.py +0 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/model/batch/__init__.py +0 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/model/code_path.py +0 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/model/compute_pool.py +0 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/model/custom_model.py +0 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/model/event_handler.py +0 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/model/inference_engine.py +0 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/model/model_signature.py +0 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/model/models/huggingface.py +0 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/model/models/huggingface_pipeline.py +0 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/model/target_platform.py +0 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/model/task.py +0 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/model/volatility.py +0 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/modeling/_internal/estimator_utils.py +0 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/modeling/_internal/local_implementations/pandas_handlers.py +0 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/modeling/_internal/local_implementations/pandas_trainer.py +0 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/modeling/_internal/model_specifications.py +0 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/modeling/_internal/model_trainer.py +0 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/modeling/_internal/model_trainer_builder.py +0 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/modeling/_internal/model_transformer_builder.py +0 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/modeling/_internal/snowpark_implementations/distributed_hpo_trainer.py +0 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/modeling/_internal/snowpark_implementations/distributed_search_udf_file.py +0 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/modeling/_internal/snowpark_implementations/snowpark_handlers.py +0 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/modeling/_internal/snowpark_implementations/snowpark_trainer.py +0 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/modeling/_internal/snowpark_implementations/xgboost_external_memory_trainer.py +0 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/modeling/_internal/transformer_protocols.py +0 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/modeling/calibration/__init__.py +0 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/modeling/cluster/__init__.py +0 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/modeling/compose/__init__.py +0 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/modeling/covariance/__init__.py +0 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/modeling/decomposition/__init__.py +0 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/modeling/discriminant_analysis/__init__.py +0 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/modeling/ensemble/__init__.py +0 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/modeling/feature_selection/__init__.py +0 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/modeling/framework/_utils.py +0 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/modeling/gaussian_process/__init__.py +0 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/modeling/impute/__init__.py +0 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/modeling/kernel_approximation/__init__.py +0 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/modeling/kernel_ridge/__init__.py +0 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/modeling/lightgbm/__init__.py +0 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/modeling/linear_model/__init__.py +0 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/modeling/manifold/__init__.py +0 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/modeling/metrics/__init__.py +0 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/modeling/metrics/classification.py +0 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/modeling/metrics/correlation.py +0 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/modeling/metrics/covariance.py +0 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/modeling/metrics/metrics_utils.py +0 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/modeling/metrics/ranking.py +0 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/modeling/metrics/regression.py +0 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/modeling/mixture/__init__.py +0 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/modeling/model_selection/__init__.py +0 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/modeling/multiclass/__init__.py +0 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/modeling/naive_bayes/__init__.py +0 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/modeling/neighbors/__init__.py +0 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/modeling/neural_network/__init__.py +0 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/modeling/parameters/disable_distributed_hpo.py +0 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/modeling/parameters/disable_model_tracer.py +0 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/modeling/parameters/enable_anonymous_sproc.py +0 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/modeling/pipeline/__init__.py +0 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/modeling/pipeline/pipeline.py +0 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/modeling/preprocessing/__init__.py +0 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/modeling/preprocessing/binarizer.py +0 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/modeling/preprocessing/k_bins_discretizer.py +0 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/modeling/preprocessing/label_encoder.py +0 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/modeling/preprocessing/max_abs_scaler.py +0 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/modeling/preprocessing/min_max_scaler.py +0 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/modeling/preprocessing/normalizer.py +0 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/modeling/preprocessing/one_hot_encoder.py +0 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/modeling/preprocessing/ordinal_encoder.py +0 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/modeling/preprocessing/robust_scaler.py +0 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/modeling/preprocessing/standard_scaler.py +0 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/modeling/semi_supervised/__init__.py +0 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/modeling/svm/__init__.py +0 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/modeling/tree/__init__.py +0 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/modeling/xgboost/__init__.py +0 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/monitoring/_client/model_monitor_sql_client.py +0 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/monitoring/_client/queries/record_count.ssql +0 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/monitoring/_client/queries/rmse.ssql +0 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/monitoring/_manager/model_monitor_manager.py +0 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/monitoring/entities/model_monitor_config.py +0 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/monitoring/explain_visualize.py +0 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/monitoring/model_monitor.py +0 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/monitoring/shap.py +0 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/registry/__init__.py +0 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/registry/_manager/model_manager.py +0 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/utils/authentication.py +0 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/utils/connection_params.py +0 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/utils/html_utils.py +0 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/utils/sparse.py +0 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/utils/sql_client.py +0 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake/ml/utils/stage_file.py +0 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake_ml_python.egg-info/dependency_links.txt +0 -0
- {snowflake_ml_python-1.46.0 → snowflake_ml_python-1.48.0}/snowflake_ml_python.egg-info/top_level.txt +0 -0
|
@@ -1,6 +1,53 @@
|
|
|
1
1
|
# Release History
|
|
2
2
|
|
|
3
|
-
## 1.
|
|
3
|
+
## 1.48.0
|
|
4
|
+
|
|
5
|
+
### New Features
|
|
6
|
+
|
|
7
|
+
* Experiment Tracking: `ExperimentTracking` now captures best-effort source provenance (entry-point filename and any
|
|
8
|
+
surrounding git commit, branch, and remote URL) for each new run by default. Pass `capture_source_info=False` to
|
|
9
|
+
disable it. Collection is always non-fatal and never blocks run creation.
|
|
10
|
+
|
|
11
|
+
### Bug Fixes
|
|
12
|
+
|
|
13
|
+
### Behavior Changes
|
|
14
|
+
|
|
15
|
+
### Deprecations
|
|
16
|
+
|
|
17
|
+
## 1.47.0 (2026-07-15)
|
|
18
|
+
|
|
19
|
+
### New Features
|
|
20
|
+
|
|
21
|
+
* Experiment Tracking: Added `ExperimentTracking.list_model_versions` to retrieve the model versions that were
|
|
22
|
+
logged under a run. Models logged via `log_model` inside a run are linked to that run through Snowflake lineage,
|
|
23
|
+
and this method traverses that lineage to return the corresponding `ModelVersion` objects.
|
|
24
|
+
|
|
25
|
+
```python
|
|
26
|
+
from snowflake.ml.experiment import ExperimentTracking
|
|
27
|
+
|
|
28
|
+
exp = ExperimentTracking(session)
|
|
29
|
+
exp.set_experiment("MY_EXPERIMENT")
|
|
30
|
+
with exp.start_run(run_name="MY_RUN"):
|
|
31
|
+
exp.log_model(model, model_name="MY_MODEL", sample_input_data=X)
|
|
32
|
+
|
|
33
|
+
model_versions = exp.list_model_versions(run_name="MY_RUN")
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
### Bug Fixes
|
|
37
|
+
|
|
38
|
+
* Experiment Tracking: Fix a bug where `.set_experiment` does not recreate an experiment deleted in Snowsight
|
|
39
|
+
|
|
40
|
+
### Behavior Changes
|
|
41
|
+
|
|
42
|
+
* Registry: `enable_explainability` now defaults to `False` for all model types when logging a model. Previously it
|
|
43
|
+
defaulted to `True` for XGBoost, LightGBM, and CatBoost models and was auto-enabled for supported scikit-learn and
|
|
44
|
+
Snowpark ML modeling models when running in the Warehouse. To generate an `explain` method, explicitly pass
|
|
45
|
+
`options={"enable_explainability": True}` to `log_model` (this requires `sample_input_data` for supported model
|
|
46
|
+
types).
|
|
47
|
+
|
|
48
|
+
### Deprecations
|
|
49
|
+
|
|
50
|
+
## 1.46.0 (2026-07-07)
|
|
4
51
|
|
|
5
52
|
### New Features
|
|
6
53
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: snowflake-ml-python
|
|
3
|
-
Version: 1.
|
|
3
|
+
Version: 1.48.0
|
|
4
4
|
Summary: The machine learning client library that is used for interacting with Snowflake to build machine learning solutions.
|
|
5
5
|
Author-email: "Snowflake, Inc" <support@snowflake.com>
|
|
6
6
|
License:
|
|
@@ -240,6 +240,7 @@ Requires-Dist: cryptography
|
|
|
240
240
|
Requires-Dist: fsspec[http]<2026,>=2024.6.1
|
|
241
241
|
Requires-Dist: h2<5,>=4.3.0
|
|
242
242
|
Requires-Dist: importlib_resources<7,>=6.1.1
|
|
243
|
+
Requires-Dist: jinja2<4,>=3.1.0
|
|
243
244
|
Requires-Dist: numpy<3,>=1.23
|
|
244
245
|
Requires-Dist: packaging<26,>=20.9
|
|
245
246
|
Requires-Dist: pandas<3,>=2.1.4
|
|
@@ -250,7 +251,7 @@ Requires-Dist: pyjwt<3,>=2.0.0
|
|
|
250
251
|
Requires-Dist: pytimeparse<2,>=1.1.8
|
|
251
252
|
Requires-Dist: pyyaml<7,>=6.0
|
|
252
253
|
Requires-Dist: retrying<2,>=1.3.3
|
|
253
|
-
Requires-Dist: scikit-learn<1.
|
|
254
|
+
Requires-Dist: scikit-learn<1.9
|
|
254
255
|
Requires-Dist: scipy<2,>=1.9
|
|
255
256
|
Requires-Dist: shap<1,>=0.46.0
|
|
256
257
|
Requires-Dist: snowflake-connector-python[pandas]<5,>=3.17.3
|
|
@@ -416,7 +417,54 @@ NOTE: Version 1.7.0 is used as example here. Please choose the the latest versio
|
|
|
416
417
|
|
|
417
418
|
# Release History
|
|
418
419
|
|
|
419
|
-
## 1.
|
|
420
|
+
## 1.48.0
|
|
421
|
+
|
|
422
|
+
### New Features
|
|
423
|
+
|
|
424
|
+
* Experiment Tracking: `ExperimentTracking` now captures best-effort source provenance (entry-point filename and any
|
|
425
|
+
surrounding git commit, branch, and remote URL) for each new run by default. Pass `capture_source_info=False` to
|
|
426
|
+
disable it. Collection is always non-fatal and never blocks run creation.
|
|
427
|
+
|
|
428
|
+
### Bug Fixes
|
|
429
|
+
|
|
430
|
+
### Behavior Changes
|
|
431
|
+
|
|
432
|
+
### Deprecations
|
|
433
|
+
|
|
434
|
+
## 1.47.0 (2026-07-15)
|
|
435
|
+
|
|
436
|
+
### New Features
|
|
437
|
+
|
|
438
|
+
* Experiment Tracking: Added `ExperimentTracking.list_model_versions` to retrieve the model versions that were
|
|
439
|
+
logged under a run. Models logged via `log_model` inside a run are linked to that run through Snowflake lineage,
|
|
440
|
+
and this method traverses that lineage to return the corresponding `ModelVersion` objects.
|
|
441
|
+
|
|
442
|
+
```python
|
|
443
|
+
from snowflake.ml.experiment import ExperimentTracking
|
|
444
|
+
|
|
445
|
+
exp = ExperimentTracking(session)
|
|
446
|
+
exp.set_experiment("MY_EXPERIMENT")
|
|
447
|
+
with exp.start_run(run_name="MY_RUN"):
|
|
448
|
+
exp.log_model(model, model_name="MY_MODEL", sample_input_data=X)
|
|
449
|
+
|
|
450
|
+
model_versions = exp.list_model_versions(run_name="MY_RUN")
|
|
451
|
+
```
|
|
452
|
+
|
|
453
|
+
### Bug Fixes
|
|
454
|
+
|
|
455
|
+
* Experiment Tracking: Fix a bug where `.set_experiment` does not recreate an experiment deleted in Snowsight
|
|
456
|
+
|
|
457
|
+
### Behavior Changes
|
|
458
|
+
|
|
459
|
+
* Registry: `enable_explainability` now defaults to `False` for all model types when logging a model. Previously it
|
|
460
|
+
defaulted to `True` for XGBoost, LightGBM, and CatBoost models and was auto-enabled for supported scikit-learn and
|
|
461
|
+
Snowpark ML modeling models when running in the Warehouse. To generate an `explain` method, explicitly pass
|
|
462
|
+
`options={"enable_explainability": True}` to `log_model` (this requires `sample_input_data` for supported model
|
|
463
|
+
types).
|
|
464
|
+
|
|
465
|
+
### Deprecations
|
|
466
|
+
|
|
467
|
+
## 1.46.0 (2026-07-07)
|
|
420
468
|
|
|
421
469
|
### New Features
|
|
422
470
|
|
|
@@ -8,7 +8,7 @@ description = "The machine learning client library that is used for interacting
|
|
|
8
8
|
classifiers = [ "Development Status :: 5 - Production/Stable", "Environment :: Console", "Environment :: Other Environment", "Intended Audience :: Developers", "Intended Audience :: Education", "Intended Audience :: Information Technology", "Intended Audience :: System Administrators", "License :: OSI Approved :: Apache Software License", "Operating System :: OS Independent", "Programming Language :: Python :: 3.9", "Programming Language :: Python :: 3.10", "Programming Language :: Python :: 3.11", "Programming Language :: Python :: 3.12", "Topic :: Database", "Topic :: Software Development", "Topic :: Software Development :: Libraries", "Topic :: Software Development :: Libraries :: Application Frameworks", "Topic :: Software Development :: Libraries :: Python Modules", "Topic :: Scientific/Engineering :: Information Analysis",]
|
|
9
9
|
requires-python = ">=3.9, <3.14"
|
|
10
10
|
dynamic = [ "version", "readme",]
|
|
11
|
-
dependencies = [ "anyio>=3.5.0,<5", "cachetools>=3.1.1,<6", "cloudpickle>=2.0.0", "cryptography", "fsspec[http]>=2024.6.1,<2026", "h2>=4.3.0,<5", "importlib_resources>=6.1.1, <7", "numpy>=1.23,<3", "packaging>=20.9,<26", "pandas>=2.1.4,<3", "platformdirs<5", "pyarrow", "pydantic>=2.8.2, <3", "pyjwt>=2.0.0, <3", "pytimeparse>=1.1.8,<2", "pyyaml>=6.0,<7", "retrying>=1.3.3,<2", "scikit-learn<1.
|
|
11
|
+
dependencies = [ "anyio>=3.5.0,<5", "cachetools>=3.1.1,<6", "cloudpickle>=2.0.0", "cryptography", "fsspec[http]>=2024.6.1,<2026", "h2>=4.3.0,<5", "importlib_resources>=6.1.1, <7", "jinja2>=3.1.0,<4", "numpy>=1.23,<3", "packaging>=20.9,<26", "pandas>=2.1.4,<3", "platformdirs<5", "pyarrow", "pydantic>=2.8.2, <3", "pyjwt>=2.0.0, <3", "pytimeparse>=1.1.8,<2", "pyyaml>=6.0,<7", "retrying>=1.3.3,<2", "scikit-learn<1.9", "scipy>=1.9,<2", "shap>=0.46.0,<1", "snowflake-connector-python[pandas]>=3.17.3,<5", "snowflake-snowpark-python>=1.17.0,<2,!=1.26.0", "sqlparse>=0.4,<1", "tqdm<5", "typing-extensions>=4.1.0,<5", "xgboost<4",]
|
|
12
12
|
[[project.authors]]
|
|
13
13
|
name = "Snowflake, Inc"
|
|
14
14
|
email = "support@snowflake.com"
|
|
@@ -0,0 +1,487 @@
|
|
|
1
|
+
"""Best-effort source provenance for ExperimentTracking.start_run().
|
|
2
|
+
|
|
3
|
+
The public entry point is :meth:`SourceInfo.collect`, which inspects the
|
|
4
|
+
surrounding environment and returns a :class:`SourceInfo`. Its
|
|
5
|
+
:meth:`SourceInfo.to_json_dict` renders the JSON-serializable shape embedded in
|
|
6
|
+
``ALTER EXPERIMENT ... ADD RUN ... WITH (SOURCE_INFO = ...)``.
|
|
7
|
+
|
|
8
|
+
Collection is strictly best-effort: any failure (missing ``git`` binary, not in a
|
|
9
|
+
repo, REPL) drops the field rather than raising.
|
|
10
|
+
"""
|
|
11
|
+
|
|
12
|
+
import dataclasses
|
|
13
|
+
import importlib
|
|
14
|
+
import ipaddress
|
|
15
|
+
import json
|
|
16
|
+
import os
|
|
17
|
+
import re
|
|
18
|
+
import socket
|
|
19
|
+
import subprocess
|
|
20
|
+
import sys
|
|
21
|
+
from typing import Any, Optional
|
|
22
|
+
from urllib import parse as urllib_parse, request as urllib_request
|
|
23
|
+
|
|
24
|
+
_GIT_TIMEOUT_SEC = 2.0
|
|
25
|
+
|
|
26
|
+
# Cap the localhost call to the Jupyter sessions API; notebook-name resolution is
|
|
27
|
+
# best-effort and must never noticeably delay run creation.
|
|
28
|
+
_JUPYTER_SESSIONS_TIMEOUT_SEC = 0.5
|
|
29
|
+
|
|
30
|
+
# Strip embedded credentials from git remote URLs before sending them upstream.
|
|
31
|
+
# Examples handled:
|
|
32
|
+
# https://user:token@github.com/foo/bar.git -> https://github.com/foo/bar.git
|
|
33
|
+
# ssh://git:secret@host.example/repo -> ssh://host.example/repo
|
|
34
|
+
_URL_HTTPS_CRED_RE = re.compile(r"^(https?://)[^/@]+@")
|
|
35
|
+
_URL_SSH_CRED_RE = re.compile(r"^(ssh://)[^/@]+@")
|
|
36
|
+
|
|
37
|
+
# Sentinel argv[0] values that don't point to a user file.
|
|
38
|
+
_NON_FILE_ARGV0 = frozenset({"", "-c", "-"})
|
|
39
|
+
|
|
40
|
+
# Environment variables Snowflake injects to describe the running file. Their
|
|
41
|
+
# presence is how we recognize a Snowflake-managed file (a notebook or a .py
|
|
42
|
+
# workspace file), where the active file has no resolvable local filesystem path.
|
|
43
|
+
_SNOWFLAKE_FILE_DOMAIN_TYPE_ENV = "SNOWFLAKE_FILE_DOMAIN_TYPE"
|
|
44
|
+
_SNOWFLAKE_FILE_DOMAIN_NAME_ENV = "SNOWFLAKE_FILE_DOMAIN_NAME"
|
|
45
|
+
_SNOWFLAKE_MAIN_FILE_PATH_ENV = "SNOWFLAKE_MAIN_FILE_PATH"
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
@dataclasses.dataclass(frozen=True)
|
|
49
|
+
class GitInfo:
|
|
50
|
+
"""Git provenance for the surrounding repository.
|
|
51
|
+
|
|
52
|
+
Any field may be ``None`` when it could not be resolved (e.g. ``remote_url``
|
|
53
|
+
when no ``origin`` remote is configured, or ``branch`` on a detached HEAD).
|
|
54
|
+
"""
|
|
55
|
+
|
|
56
|
+
remote_url: Optional[str] = None
|
|
57
|
+
commit_hash: Optional[str] = None
|
|
58
|
+
branch: Optional[str] = None
|
|
59
|
+
|
|
60
|
+
def is_empty(self) -> bool:
|
|
61
|
+
return self.remote_url is None and self.commit_hash is None and self.branch is None
|
|
62
|
+
|
|
63
|
+
|
|
64
|
+
@dataclasses.dataclass(frozen=True)
|
|
65
|
+
class SourceInfo:
|
|
66
|
+
"""Best-effort provenance attached to a run when it is created."""
|
|
67
|
+
|
|
68
|
+
entry_point: Optional[str] = None
|
|
69
|
+
git: Optional[GitInfo] = None
|
|
70
|
+
# Provenance specific to Snowflake-managed files (notebooks or .py workspace
|
|
71
|
+
# files), taken from the environment. The file's own path is carried by
|
|
72
|
+
# ``entry_point``, not duplicated here.
|
|
73
|
+
snowflake_file_domain_type: Optional[str] = None
|
|
74
|
+
snowflake_file_domain_name: Optional[str] = None
|
|
75
|
+
|
|
76
|
+
def is_empty(self) -> bool:
|
|
77
|
+
"""Return True when there is nothing useful to send."""
|
|
78
|
+
return (
|
|
79
|
+
self.entry_point is None
|
|
80
|
+
and (self.git is None or self.git.is_empty())
|
|
81
|
+
and self.snowflake_file_domain_type is None
|
|
82
|
+
and self.snowflake_file_domain_name is None
|
|
83
|
+
)
|
|
84
|
+
|
|
85
|
+
def to_json_dict(self) -> dict[str, Any]:
|
|
86
|
+
"""Render the payload for ``WITH (SOURCE_INFO = $$...$$)``.
|
|
87
|
+
|
|
88
|
+
Keys with no value are omitted entirely (rather than serialized as
|
|
89
|
+
``null``) so the server only sees fields that were actually resolved.
|
|
90
|
+
Values containing ``$$`` are also dropped, since the payload is embedded
|
|
91
|
+
in a ``$$``-dollar-quoted SQL literal that a ``$$`` would break.
|
|
92
|
+
|
|
93
|
+
Returns:
|
|
94
|
+
A JSON-serializable dict whose keys (``entry_point``, ``git``,
|
|
95
|
+
``snowflake_file_domain_type``, ``snowflake_file_domain_name``) are
|
|
96
|
+
included only when resolved. May be empty when nothing was collected.
|
|
97
|
+
"""
|
|
98
|
+
out: dict[str, Any] = {}
|
|
99
|
+
if self.entry_point is not None and "$$" not in self.entry_point:
|
|
100
|
+
out["entry_point"] = self.entry_point
|
|
101
|
+
if self.git is not None:
|
|
102
|
+
git_dict = {
|
|
103
|
+
key: value
|
|
104
|
+
for key, value in dataclasses.asdict(self.git).items()
|
|
105
|
+
if value is not None and "$$" not in value
|
|
106
|
+
}
|
|
107
|
+
if git_dict:
|
|
108
|
+
out["git"] = git_dict
|
|
109
|
+
if self.snowflake_file_domain_type is not None and "$$" not in self.snowflake_file_domain_type:
|
|
110
|
+
out["snowflake_file_domain_type"] = self.snowflake_file_domain_type
|
|
111
|
+
if self.snowflake_file_domain_name is not None and "$$" not in self.snowflake_file_domain_name:
|
|
112
|
+
out["snowflake_file_domain_name"] = self.snowflake_file_domain_name
|
|
113
|
+
return out
|
|
114
|
+
|
|
115
|
+
@classmethod
|
|
116
|
+
def collect(cls) -> "SourceInfo":
|
|
117
|
+
"""Collect source info from the surrounding environment. Never raises.
|
|
118
|
+
|
|
119
|
+
Returns:
|
|
120
|
+
A populated :class:`SourceInfo`, or an empty one when nothing could
|
|
121
|
+
be resolved or collection failed.
|
|
122
|
+
"""
|
|
123
|
+
try:
|
|
124
|
+
# Snowflake-managed files (notebooks or .py workspace files) describe
|
|
125
|
+
# the running file via environment variables rather than a resolvable
|
|
126
|
+
# local path, so they are handled first and independently of the
|
|
127
|
+
# git/notebook-path machinery.
|
|
128
|
+
snowflake_file = _collect_snowflake_file()
|
|
129
|
+
if snowflake_file is not None:
|
|
130
|
+
return snowflake_file
|
|
131
|
+
|
|
132
|
+
# Resolve the notebook once so entry-point and git agree on the same file.
|
|
133
|
+
notebook_path = _resolve_notebook_path() if _in_ipython_kernel() else None
|
|
134
|
+
return cls(
|
|
135
|
+
entry_point=_detect_entry_point(notebook_path),
|
|
136
|
+
git=_collect_git(notebook_path),
|
|
137
|
+
)
|
|
138
|
+
except Exception:
|
|
139
|
+
return cls()
|
|
140
|
+
|
|
141
|
+
|
|
142
|
+
def _collect_snowflake_file() -> Optional[SourceInfo]:
|
|
143
|
+
"""Collect source info when running inside a Snowflake-managed file.
|
|
144
|
+
|
|
145
|
+
Snowflake exposes the active file's location (a notebook or a .py workspace
|
|
146
|
+
file) through environment variables instead of a resolvable local filesystem
|
|
147
|
+
path. When any variable is present, the main-file path is recorded as the
|
|
148
|
+
entry point and the domain type and name are captured alongside it.
|
|
149
|
+
|
|
150
|
+
Returns:
|
|
151
|
+
A :class:`SourceInfo` populated from the Snowflake file environment, or
|
|
152
|
+
``None`` when not running inside a Snowflake-managed file.
|
|
153
|
+
"""
|
|
154
|
+
domain_type = os.environ.get(_SNOWFLAKE_FILE_DOMAIN_TYPE_ENV) or None
|
|
155
|
+
domain_name = os.environ.get(_SNOWFLAKE_FILE_DOMAIN_NAME_ENV) or None
|
|
156
|
+
main_file_path = os.environ.get(_SNOWFLAKE_MAIN_FILE_PATH_ENV) or None
|
|
157
|
+
if domain_type is None and domain_name is None and main_file_path is None:
|
|
158
|
+
return None
|
|
159
|
+
return SourceInfo(
|
|
160
|
+
entry_point=main_file_path,
|
|
161
|
+
snowflake_file_domain_type=domain_type,
|
|
162
|
+
snowflake_file_domain_name=domain_name,
|
|
163
|
+
)
|
|
164
|
+
|
|
165
|
+
|
|
166
|
+
def _git(*args: str, cwd: Optional[str] = None) -> Optional[str]:
|
|
167
|
+
"""Run ``git <args>`` and return stripped stdout, or ``None`` on any failure."""
|
|
168
|
+
try:
|
|
169
|
+
out = subprocess.check_output(
|
|
170
|
+
("git", *args),
|
|
171
|
+
cwd=cwd,
|
|
172
|
+
stderr=subprocess.DEVNULL,
|
|
173
|
+
timeout=_GIT_TIMEOUT_SEC,
|
|
174
|
+
text=True,
|
|
175
|
+
)
|
|
176
|
+
except Exception:
|
|
177
|
+
return None
|
|
178
|
+
out = out.strip()
|
|
179
|
+
return out or None
|
|
180
|
+
|
|
181
|
+
|
|
182
|
+
def _git_cwd(notebook_path: Optional[str] = None) -> Optional[str]:
|
|
183
|
+
"""Pick a working directory for git resolution.
|
|
184
|
+
|
|
185
|
+
In a notebook kernel, anchors on the resolved notebook's own directory so the
|
|
186
|
+
captured repo matches the user's work. ``sys.argv[0]`` points at the kernel
|
|
187
|
+
launcher in site-packages and ``os.getcwd()`` is wherever the kernel happened
|
|
188
|
+
to start (often an unrelated repo, e.g. a Homebrew checkout), so neither is a
|
|
189
|
+
safe fallback in a kernel — git is simply dropped when the notebook path is
|
|
190
|
+
unknown.
|
|
191
|
+
|
|
192
|
+
Outside a kernel, anchors on the directory of the user's script
|
|
193
|
+
(``dirname(sys.argv[0])``) when that directory is inside a git work tree. A
|
|
194
|
+
real script outside any work tree yields ``None`` rather than ``os.getcwd()``,
|
|
195
|
+
so a run isn't stamped with an unrelated repo that merely happens to be the
|
|
196
|
+
working directory. ``os.getcwd()`` is used only when ``sys.argv[0]`` is not a
|
|
197
|
+
usable path hint (REPL, ``python -c``).
|
|
198
|
+
|
|
199
|
+
Args:
|
|
200
|
+
notebook_path: The resolved notebook path when running in a kernel, or
|
|
201
|
+
``None``.
|
|
202
|
+
|
|
203
|
+
Returns:
|
|
204
|
+
An absolute directory to use as the git ``cwd``, or ``None`` if no safe
|
|
205
|
+
candidate is resolvable.
|
|
206
|
+
"""
|
|
207
|
+
if _in_ipython_kernel():
|
|
208
|
+
if notebook_path and os.path.isabs(notebook_path):
|
|
209
|
+
return os.path.dirname(notebook_path) or None
|
|
210
|
+
return None
|
|
211
|
+
|
|
212
|
+
argv0 = sys.argv[0] if sys.argv else ""
|
|
213
|
+
if argv0 in _NON_FILE_ARGV0:
|
|
214
|
+
try:
|
|
215
|
+
return os.getcwd()
|
|
216
|
+
except Exception:
|
|
217
|
+
return None
|
|
218
|
+
try:
|
|
219
|
+
script_dir = os.path.dirname(os.path.abspath(argv0)) or None
|
|
220
|
+
except Exception:
|
|
221
|
+
return None
|
|
222
|
+
if script_dir and _git("rev-parse", "--is-inside-work-tree", cwd=script_dir):
|
|
223
|
+
return script_dir
|
|
224
|
+
return None
|
|
225
|
+
|
|
226
|
+
|
|
227
|
+
def _scrub_url(url: str) -> str:
|
|
228
|
+
"""Remove embedded ``user[:pass]@`` credentials from a git remote URL."""
|
|
229
|
+
url = _URL_HTTPS_CRED_RE.sub(r"\1", url)
|
|
230
|
+
url = _URL_SSH_CRED_RE.sub(r"\1", url)
|
|
231
|
+
return url
|
|
232
|
+
|
|
233
|
+
|
|
234
|
+
def _collect_git(notebook_path: Optional[str] = None) -> Optional[GitInfo]:
|
|
235
|
+
"""Collect commit hash, remote URL, and branch from the surrounding git repo.
|
|
236
|
+
|
|
237
|
+
Args:
|
|
238
|
+
notebook_path: The resolved notebook path when running in a kernel, or
|
|
239
|
+
``None``. Used to anchor git resolution on the notebook's directory.
|
|
240
|
+
|
|
241
|
+
Returns:
|
|
242
|
+
A :class:`GitInfo` whose individual fields may be ``None`` when a single
|
|
243
|
+
field is unresolvable. Returns ``None`` when ``git`` is unavailable, the
|
|
244
|
+
directory is not a work tree, or every field came back empty.
|
|
245
|
+
"""
|
|
246
|
+
cwd = _git_cwd(notebook_path)
|
|
247
|
+
# No safe anchoring directory (e.g. a script outside any work tree, or a
|
|
248
|
+
# kernel whose notebook path is unknown). Passing cwd=None to git would fall
|
|
249
|
+
# back to the process's current directory, stamping the run with an unrelated
|
|
250
|
+
# repo that merely happens to be where the interpreter was launched.
|
|
251
|
+
if cwd is None:
|
|
252
|
+
return None
|
|
253
|
+
# Cheap probe — short-circuits to a single subprocess call when the script
|
|
254
|
+
# is not inside a repo (the overwhelmingly common case for SPCS jobs).
|
|
255
|
+
if not _git("rev-parse", "--is-inside-work-tree", cwd=cwd):
|
|
256
|
+
return None
|
|
257
|
+
|
|
258
|
+
commit = _git("rev-parse", "HEAD", cwd=cwd)
|
|
259
|
+
remote = _git("config", "--get", "remote.origin.url", cwd=cwd)
|
|
260
|
+
branch = _git("rev-parse", "--abbrev-ref", "HEAD", cwd=cwd)
|
|
261
|
+
if branch == "HEAD": # detached HEAD has no branch
|
|
262
|
+
branch = None
|
|
263
|
+
|
|
264
|
+
if not (commit or remote or branch):
|
|
265
|
+
return None
|
|
266
|
+
|
|
267
|
+
return GitInfo(
|
|
268
|
+
remote_url=_scrub_url(remote) if remote else None,
|
|
269
|
+
commit_hash=commit,
|
|
270
|
+
branch=branch,
|
|
271
|
+
)
|
|
272
|
+
|
|
273
|
+
|
|
274
|
+
def _ipython_shell() -> Optional[Any]:
|
|
275
|
+
"""Return the active IPython shell instance, or ``None`` if there isn't one.
|
|
276
|
+
|
|
277
|
+
Read-only: we never import IPython ourselves. If the ``IPython`` module is not
|
|
278
|
+
already loaded we are definitely not in an IPython session.
|
|
279
|
+
|
|
280
|
+
Returns:
|
|
281
|
+
The active IPython shell object, or ``None``.
|
|
282
|
+
"""
|
|
283
|
+
ipython_module = sys.modules.get("IPython")
|
|
284
|
+
if ipython_module is None:
|
|
285
|
+
return None
|
|
286
|
+
try:
|
|
287
|
+
return ipython_module.get_ipython()
|
|
288
|
+
except Exception:
|
|
289
|
+
return None
|
|
290
|
+
|
|
291
|
+
|
|
292
|
+
def _in_ipython_kernel() -> bool:
|
|
293
|
+
"""Return True when running inside an IPython/Jupyter kernel (incl. notebooks).
|
|
294
|
+
|
|
295
|
+
The active shell being a ``ZMQInteractiveShell`` distinguishes a kernel
|
|
296
|
+
(Jupyter, Snowflake Notebooks) from a plain terminal REPL
|
|
297
|
+
(``TerminalInteractiveShell``), where ``sys.argv[0]`` is still meaningful.
|
|
298
|
+
|
|
299
|
+
Returns:
|
|
300
|
+
True if the current process is an IPython kernel, False otherwise.
|
|
301
|
+
"""
|
|
302
|
+
shell = _ipython_shell()
|
|
303
|
+
return shell is not None and type(shell).__name__ == "ZMQInteractiveShell"
|
|
304
|
+
|
|
305
|
+
|
|
306
|
+
def _jupyter_kernel_id() -> Optional[str]:
|
|
307
|
+
"""Return this kernel's id from the ipykernel connection file, or ``None``.
|
|
308
|
+
|
|
309
|
+
The connection file is named ``kernel-<id>.json``.
|
|
310
|
+
|
|
311
|
+
Returns:
|
|
312
|
+
The kernel id, or ``None`` if it cannot be determined.
|
|
313
|
+
"""
|
|
314
|
+
try:
|
|
315
|
+
import ipykernel
|
|
316
|
+
|
|
317
|
+
stem = os.path.splitext(os.path.basename(ipykernel.get_connection_file()))[0]
|
|
318
|
+
except Exception:
|
|
319
|
+
return None
|
|
320
|
+
_, _, kernel_id = stem.partition("-")
|
|
321
|
+
return kernel_id or None
|
|
322
|
+
|
|
323
|
+
|
|
324
|
+
def _jupyter_running_servers() -> list[dict[str, Any]]:
|
|
325
|
+
"""Return info dicts for running Jupyter servers (``url``, ``token``, root).
|
|
326
|
+
|
|
327
|
+
Uses the canonical ``list_running_servers()`` from ``jupyter_server`` (modern)
|
|
328
|
+
and ``notebook`` (classic), covering both ``jupyter lab`` and ``jupyter
|
|
329
|
+
notebook``.
|
|
330
|
+
|
|
331
|
+
Returns:
|
|
332
|
+
Server info dicts; empty when the Jupyter packages are unavailable.
|
|
333
|
+
"""
|
|
334
|
+
servers: list[dict[str, Any]] = []
|
|
335
|
+
for module_name in ("jupyter_server.serverapp", "notebook.notebookapp"):
|
|
336
|
+
try:
|
|
337
|
+
servers.extend(importlib.import_module(module_name).list_running_servers())
|
|
338
|
+
except Exception:
|
|
339
|
+
continue
|
|
340
|
+
return servers
|
|
341
|
+
|
|
342
|
+
|
|
343
|
+
def _is_loopback_url(url: str) -> bool:
|
|
344
|
+
"""Return True only when ``url`` targets the local machine over http(s).
|
|
345
|
+
|
|
346
|
+
Confines the sessions-API request to the local Jupyter server: the scheme
|
|
347
|
+
must be ``http``/``https`` and the host must resolve exclusively to loopback
|
|
348
|
+
addresses. This prevents a stray or hostile ``list_running_servers()`` entry
|
|
349
|
+
from redirecting the request (and its auth token) to an off-box host.
|
|
350
|
+
|
|
351
|
+
Args:
|
|
352
|
+
url: The server URL reported by ``list_running_servers()``.
|
|
353
|
+
|
|
354
|
+
Returns:
|
|
355
|
+
True if the URL is safe to request against, False otherwise.
|
|
356
|
+
"""
|
|
357
|
+
try:
|
|
358
|
+
parsed = urllib_parse.urlsplit(url)
|
|
359
|
+
except ValueError:
|
|
360
|
+
return False
|
|
361
|
+
if parsed.scheme not in ("http", "https"):
|
|
362
|
+
return False
|
|
363
|
+
host = parsed.hostname
|
|
364
|
+
if not host:
|
|
365
|
+
return False
|
|
366
|
+
try:
|
|
367
|
+
addr_infos = socket.getaddrinfo(host, parsed.port, proto=socket.IPPROTO_TCP)
|
|
368
|
+
except OSError:
|
|
369
|
+
return False
|
|
370
|
+
if not addr_infos:
|
|
371
|
+
return False
|
|
372
|
+
for addr_info in addr_infos:
|
|
373
|
+
ip_text = addr_info[4][0]
|
|
374
|
+
try:
|
|
375
|
+
if not ipaddress.ip_address(ip_text).is_loopback:
|
|
376
|
+
return False
|
|
377
|
+
except ValueError:
|
|
378
|
+
return False
|
|
379
|
+
return True
|
|
380
|
+
|
|
381
|
+
|
|
382
|
+
def _jupyter_session_notebook_path() -> Optional[str]:
|
|
383
|
+
"""Resolve the active notebook path via the Jupyter server sessions API.
|
|
384
|
+
|
|
385
|
+
Matches this kernel's id against each running server's ``/api/sessions``
|
|
386
|
+
listing. The server-relative session path is joined with the server root to
|
|
387
|
+
yield an absolute path when the root is known. The HTTP call is capped by a
|
|
388
|
+
short timeout.
|
|
389
|
+
|
|
390
|
+
Returns:
|
|
391
|
+
The notebook path (absolute when the server root is known), or ``None``
|
|
392
|
+
if no session matches or the lookup fails.
|
|
393
|
+
"""
|
|
394
|
+
kernel_id = _jupyter_kernel_id()
|
|
395
|
+
if not kernel_id:
|
|
396
|
+
return None
|
|
397
|
+
for server in _jupyter_running_servers():
|
|
398
|
+
url = str(server.get("url", "")).rstrip("/")
|
|
399
|
+
# Confine the request to the local Jupyter server so the auth token can
|
|
400
|
+
# never be sent off-box via an unexpected server entry.
|
|
401
|
+
if not url or not _is_loopback_url(url):
|
|
402
|
+
continue
|
|
403
|
+
# Carry the token in an Authorization header rather than the query string,
|
|
404
|
+
# keeping the credential out of request/proxy logs and process listings.
|
|
405
|
+
token = server.get("token", "")
|
|
406
|
+
request = urllib_request.Request(f"{url}/api/sessions")
|
|
407
|
+
if token:
|
|
408
|
+
request.add_header("Authorization", f"token {token}")
|
|
409
|
+
try:
|
|
410
|
+
with urllib_request.urlopen(request, timeout=_JUPYTER_SESSIONS_TIMEOUT_SEC) as response:
|
|
411
|
+
sessions = json.load(response)
|
|
412
|
+
except Exception:
|
|
413
|
+
continue
|
|
414
|
+
for session in sessions:
|
|
415
|
+
if session.get("kernel", {}).get("id") != kernel_id:
|
|
416
|
+
continue
|
|
417
|
+
path = session.get("path")
|
|
418
|
+
if isinstance(path, str) and path:
|
|
419
|
+
root = server.get("root_dir") or server.get("notebook_dir")
|
|
420
|
+
return os.path.join(root, path) if isinstance(root, str) and root else path
|
|
421
|
+
return None
|
|
422
|
+
|
|
423
|
+
|
|
424
|
+
def _resolve_notebook_path() -> Optional[str]:
|
|
425
|
+
"""Best-effort resolution of the active notebook's absolute path.
|
|
426
|
+
|
|
427
|
+
Supports VS Code's Jupyter extension (the ``__vsc_ipynb_file__`` namespace
|
|
428
|
+
entry it injects) and vanilla ``jupyter notebook`` / JupyterLab servers
|
|
429
|
+
(matched via the sessions API). The path anchors both the entry point and
|
|
430
|
+
git resolution; unsupported frontends drop the field rather than guess.
|
|
431
|
+
Snowflake-managed files are handled separately via environment variables (see
|
|
432
|
+
:func:`_collect_snowflake_file`) and never reach this resolver.
|
|
433
|
+
|
|
434
|
+
Returns:
|
|
435
|
+
The notebook's absolute path, or ``None`` if it cannot be resolved.
|
|
436
|
+
"""
|
|
437
|
+
shell = _ipython_shell()
|
|
438
|
+
if shell is not None:
|
|
439
|
+
try:
|
|
440
|
+
path = shell.user_ns.get("__vsc_ipynb_file__")
|
|
441
|
+
except Exception:
|
|
442
|
+
path = None
|
|
443
|
+
if isinstance(path, str) and path:
|
|
444
|
+
return path
|
|
445
|
+
return _jupyter_session_notebook_path()
|
|
446
|
+
|
|
447
|
+
|
|
448
|
+
def _detect_entry_point(notebook_path: Optional[str] = None) -> Optional[str]:
|
|
449
|
+
"""Identify the user's entry-point file, git-root-relative when possible.
|
|
450
|
+
|
|
451
|
+
Falls back to a basename outside a repo to avoid leaking ``$HOME`` or
|
|
452
|
+
usernames.
|
|
453
|
+
|
|
454
|
+
Args:
|
|
455
|
+
notebook_path: The resolved notebook path when running in a kernel, or
|
|
456
|
+
``None``.
|
|
457
|
+
|
|
458
|
+
Returns:
|
|
459
|
+
The repo-relative path (e.g. ``"train/main.py"``) when inside a git
|
|
460
|
+
work tree, otherwise the basename. In a notebook kernel, the resolved
|
|
461
|
+
``.ipynb`` basename when available. ``None`` for REPL (``-c``, ``-``),
|
|
462
|
+
bare ``python`` invocations, and notebooks whose name cannot be resolved.
|
|
463
|
+
"""
|
|
464
|
+
# In a kernel, sys.argv[0] is the launcher (e.g. ipykernel_launcher.py), not user
|
|
465
|
+
# code. Record the resolved notebook basename instead, and drop the field when it
|
|
466
|
+
# cannot be determined rather than recording the launcher path.
|
|
467
|
+
if _in_ipython_kernel():
|
|
468
|
+
return os.path.basename(notebook_path) if notebook_path else None
|
|
469
|
+
|
|
470
|
+
argv0 = sys.argv[0] if sys.argv else ""
|
|
471
|
+
if argv0 in _NON_FILE_ARGV0:
|
|
472
|
+
return None
|
|
473
|
+
|
|
474
|
+
try:
|
|
475
|
+
abs_main = os.path.abspath(argv0)
|
|
476
|
+
except Exception:
|
|
477
|
+
return os.path.basename(argv0) or None
|
|
478
|
+
|
|
479
|
+
root = _git("rev-parse", "--show-toplevel", cwd=os.path.dirname(abs_main) or None)
|
|
480
|
+
if root:
|
|
481
|
+
try:
|
|
482
|
+
return os.path.relpath(abs_main, root)
|
|
483
|
+
except ValueError:
|
|
484
|
+
# relpath raises on Windows when paths span drive letters.
|
|
485
|
+
pass
|
|
486
|
+
|
|
487
|
+
return os.path.basename(abs_main) or None
|