mlrun 1.3.3__py3-none-any.whl → 1.4.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of mlrun might be problematic. Click here for more details.
- mlrun/__init__.py +3 -3
- mlrun/__main__.py +79 -37
- mlrun/api/__init__.py +1 -1
- mlrun/api/api/__init__.py +1 -1
- mlrun/api/api/api.py +4 -4
- mlrun/api/api/deps.py +10 -21
- mlrun/api/api/endpoints/__init__.py +1 -1
- mlrun/api/api/endpoints/artifacts.py +64 -36
- mlrun/api/api/endpoints/auth.py +4 -4
- mlrun/api/api/endpoints/background_tasks.py +11 -11
- mlrun/api/api/endpoints/client_spec.py +5 -5
- mlrun/api/api/endpoints/clusterization_spec.py +6 -4
- mlrun/api/api/endpoints/feature_store.py +124 -115
- mlrun/api/api/endpoints/files.py +22 -14
- mlrun/api/api/endpoints/frontend_spec.py +28 -21
- mlrun/api/api/endpoints/functions.py +142 -87
- mlrun/api/api/endpoints/grafana_proxy.py +89 -442
- mlrun/api/api/endpoints/healthz.py +20 -7
- mlrun/api/api/endpoints/hub.py +320 -0
- mlrun/api/api/endpoints/internal/__init__.py +1 -1
- mlrun/api/api/endpoints/internal/config.py +1 -1
- mlrun/api/api/endpoints/internal/memory_reports.py +9 -9
- mlrun/api/api/endpoints/logs.py +11 -11
- mlrun/api/api/endpoints/model_endpoints.py +74 -70
- mlrun/api/api/endpoints/operations.py +13 -9
- mlrun/api/api/endpoints/pipelines.py +93 -88
- mlrun/api/api/endpoints/projects.py +35 -35
- mlrun/api/api/endpoints/runs.py +69 -27
- mlrun/api/api/endpoints/runtime_resources.py +28 -28
- mlrun/api/api/endpoints/schedules.py +98 -41
- mlrun/api/api/endpoints/secrets.py +37 -32
- mlrun/api/api/endpoints/submit.py +12 -12
- mlrun/api/api/endpoints/tags.py +20 -22
- mlrun/api/api/utils.py +251 -42
- mlrun/api/constants.py +1 -1
- mlrun/api/crud/__init__.py +18 -15
- mlrun/api/crud/artifacts.py +10 -10
- mlrun/api/crud/client_spec.py +4 -4
- mlrun/api/crud/clusterization_spec.py +3 -3
- mlrun/api/crud/feature_store.py +54 -46
- mlrun/api/crud/functions.py +3 -3
- mlrun/api/crud/hub.py +312 -0
- mlrun/api/crud/logs.py +11 -9
- mlrun/api/crud/model_monitoring/__init__.py +3 -3
- mlrun/api/crud/model_monitoring/grafana.py +435 -0
- mlrun/api/crud/model_monitoring/model_endpoints.py +352 -129
- mlrun/api/crud/notifications.py +149 -0
- mlrun/api/crud/pipelines.py +67 -52
- mlrun/api/crud/projects.py +51 -23
- mlrun/api/crud/runs.py +7 -5
- mlrun/api/crud/runtime_resources.py +13 -13
- mlrun/api/{db/filedb → crud/runtimes}/__init__.py +1 -1
- mlrun/api/crud/runtimes/nuclio/__init__.py +14 -0
- mlrun/api/crud/runtimes/nuclio/function.py +505 -0
- mlrun/api/crud/runtimes/nuclio/helpers.py +310 -0
- mlrun/api/crud/secrets.py +88 -46
- mlrun/api/crud/tags.py +5 -5
- mlrun/api/db/__init__.py +1 -1
- mlrun/api/db/base.py +102 -54
- mlrun/api/db/init_db.py +2 -3
- mlrun/api/db/session.py +4 -12
- mlrun/api/db/sqldb/__init__.py +1 -1
- mlrun/api/db/sqldb/db.py +439 -196
- mlrun/api/db/sqldb/helpers.py +1 -1
- mlrun/api/db/sqldb/models/__init__.py +3 -3
- mlrun/api/db/sqldb/models/models_mysql.py +82 -64
- mlrun/api/db/sqldb/models/models_sqlite.py +76 -64
- mlrun/api/db/sqldb/session.py +27 -20
- mlrun/api/initial_data.py +82 -24
- mlrun/api/launcher.py +196 -0
- mlrun/api/main.py +91 -22
- mlrun/api/middlewares.py +6 -5
- mlrun/api/migrations_mysql/env.py +1 -1
- mlrun/api/migrations_mysql/versions/28383af526f3_market_place_to_hub.py +40 -0
- mlrun/api/migrations_mysql/versions/32bae1b0e29c_increase_timestamp_fields_precision.py +1 -1
- mlrun/api/migrations_mysql/versions/4903aef6a91d_tag_foreign_key_and_cascades.py +1 -1
- mlrun/api/migrations_mysql/versions/5f1351c88a19_adding_background_tasks_table.py +1 -1
- mlrun/api/migrations_mysql/versions/88e656800d6a_add_requested_logs_column_and_index_to_.py +1 -1
- mlrun/api/migrations_mysql/versions/9d16de5f03a7_adding_data_versions_table.py +1 -1
- mlrun/api/migrations_mysql/versions/b86f5b53f3d7_adding_name_and_updated_to_runs_table.py +1 -1
- mlrun/api/migrations_mysql/versions/c4af40b0bf61_init.py +1 -1
- mlrun/api/migrations_mysql/versions/c905d15bd91d_notifications.py +72 -0
- mlrun/api/migrations_mysql/versions/ee041e8fdaa0_adding_next_run_time_column_to_schedule_.py +1 -1
- mlrun/api/migrations_sqlite/env.py +1 -1
- mlrun/api/migrations_sqlite/versions/11f8dd2dc9fe_init.py +1 -1
- mlrun/api/migrations_sqlite/versions/1c954f8cb32d_schedule_last_run_uri.py +1 -1
- mlrun/api/migrations_sqlite/versions/2b6d23c715aa_adding_feature_sets.py +1 -1
- mlrun/api/migrations_sqlite/versions/4acd9430b093_market_place_to_hub.py +77 -0
- mlrun/api/migrations_sqlite/versions/6401142f2d7c_adding_next_run_time_column_to_schedule_.py +1 -1
- mlrun/api/migrations_sqlite/versions/64d90a1a69bc_adding_background_tasks_table.py +1 -1
- mlrun/api/migrations_sqlite/versions/803438ecd005_add_requested_logs_column_to_runs.py +1 -1
- mlrun/api/migrations_sqlite/versions/863114f0c659_refactoring_feature_set.py +1 -1
- mlrun/api/migrations_sqlite/versions/959ae00528ad_notifications.py +63 -0
- mlrun/api/migrations_sqlite/versions/accf9fc83d38_adding_data_versions_table.py +1 -1
- mlrun/api/migrations_sqlite/versions/b68e8e897a28_schedule_labels.py +1 -1
- mlrun/api/migrations_sqlite/versions/bcd0c1f9720c_adding_project_labels.py +1 -1
- mlrun/api/migrations_sqlite/versions/cf21882f938e_schedule_id.py +1 -1
- mlrun/api/migrations_sqlite/versions/d781f58f607f_tag_object_name_string.py +1 -1
- mlrun/api/migrations_sqlite/versions/deac06871ace_adding_marketplace_sources_table.py +1 -1
- mlrun/api/migrations_sqlite/versions/e1dd5983c06b_schedule_concurrency_limit.py +1 -1
- mlrun/api/migrations_sqlite/versions/e5594ed3ab53_adding_name_and_updated_to_runs_table.py +1 -1
- mlrun/api/migrations_sqlite/versions/f4249b4ba6fa_adding_feature_vectors.py +1 -1
- mlrun/api/migrations_sqlite/versions/f7b5a1a03629_adding_feature_labels.py +1 -1
- mlrun/api/schemas/__init__.py +216 -138
- mlrun/api/utils/__init__.py +1 -1
- mlrun/api/utils/asyncio.py +1 -1
- mlrun/api/utils/auth/__init__.py +1 -1
- mlrun/api/utils/auth/providers/__init__.py +1 -1
- mlrun/api/utils/auth/providers/base.py +7 -7
- mlrun/api/utils/auth/providers/nop.py +6 -7
- mlrun/api/utils/auth/providers/opa.py +17 -17
- mlrun/api/utils/auth/verifier.py +36 -34
- mlrun/api/utils/background_tasks.py +24 -24
- mlrun/{builder.py → api/utils/builder.py} +216 -123
- mlrun/api/utils/clients/__init__.py +1 -1
- mlrun/api/utils/clients/chief.py +19 -4
- mlrun/api/utils/clients/iguazio.py +106 -60
- mlrun/api/utils/clients/log_collector.py +1 -1
- mlrun/api/utils/clients/nuclio.py +23 -23
- mlrun/api/utils/clients/protocols/grpc.py +2 -2
- mlrun/api/utils/db/__init__.py +1 -1
- mlrun/api/utils/db/alembic.py +1 -1
- mlrun/api/utils/db/backup.py +1 -1
- mlrun/api/utils/db/mysql.py +24 -25
- mlrun/api/utils/db/sql_collation.py +1 -1
- mlrun/api/utils/db/sqlite_migration.py +2 -2
- mlrun/api/utils/events/__init__.py +14 -0
- mlrun/api/utils/events/base.py +57 -0
- mlrun/api/utils/events/events_factory.py +41 -0
- mlrun/api/utils/events/iguazio.py +217 -0
- mlrun/api/utils/events/nop.py +55 -0
- mlrun/api/utils/helpers.py +16 -13
- mlrun/api/utils/memory_reports.py +1 -1
- mlrun/api/utils/periodic.py +6 -3
- mlrun/api/utils/projects/__init__.py +1 -1
- mlrun/api/utils/projects/follower.py +33 -33
- mlrun/api/utils/projects/leader.py +36 -34
- mlrun/api/utils/projects/member.py +27 -27
- mlrun/api/utils/projects/remotes/__init__.py +1 -1
- mlrun/api/utils/projects/remotes/follower.py +13 -13
- mlrun/api/utils/projects/remotes/leader.py +10 -10
- mlrun/api/utils/projects/remotes/nop_follower.py +27 -21
- mlrun/api/utils/projects/remotes/nop_leader.py +17 -16
- mlrun/api/utils/scheduler.py +140 -51
- mlrun/api/utils/singletons/__init__.py +1 -1
- mlrun/api/utils/singletons/db.py +9 -15
- mlrun/api/utils/singletons/k8s.py +677 -5
- mlrun/api/utils/singletons/logs_dir.py +1 -1
- mlrun/api/utils/singletons/project_member.py +1 -1
- mlrun/api/utils/singletons/scheduler.py +1 -1
- mlrun/artifacts/__init__.py +2 -2
- mlrun/artifacts/base.py +8 -2
- mlrun/artifacts/dataset.py +5 -3
- mlrun/artifacts/manager.py +7 -1
- mlrun/artifacts/model.py +15 -4
- mlrun/artifacts/plots.py +1 -1
- mlrun/common/__init__.py +1 -1
- mlrun/common/constants.py +15 -0
- mlrun/common/model_monitoring.py +209 -0
- mlrun/common/schemas/__init__.py +167 -0
- mlrun/{api → common}/schemas/artifact.py +13 -14
- mlrun/{api → common}/schemas/auth.py +10 -8
- mlrun/{api → common}/schemas/background_task.py +3 -3
- mlrun/{api → common}/schemas/client_spec.py +1 -1
- mlrun/{api → common}/schemas/clusterization_spec.py +3 -3
- mlrun/{api → common}/schemas/constants.py +21 -8
- mlrun/common/schemas/events.py +36 -0
- mlrun/{api → common}/schemas/feature_store.py +2 -1
- mlrun/{api → common}/schemas/frontend_spec.py +7 -6
- mlrun/{api → common}/schemas/function.py +5 -5
- mlrun/{api → common}/schemas/http.py +3 -3
- mlrun/common/schemas/hub.py +134 -0
- mlrun/{api → common}/schemas/k8s.py +3 -3
- mlrun/{api → common}/schemas/memory_reports.py +1 -1
- mlrun/common/schemas/model_endpoints.py +342 -0
- mlrun/common/schemas/notification.py +57 -0
- mlrun/{api → common}/schemas/object.py +6 -6
- mlrun/{api → common}/schemas/pipeline.py +3 -3
- mlrun/{api → common}/schemas/project.py +6 -5
- mlrun/common/schemas/regex.py +24 -0
- mlrun/common/schemas/runs.py +30 -0
- mlrun/{api → common}/schemas/runtime_resource.py +3 -3
- mlrun/{api → common}/schemas/schedule.py +19 -7
- mlrun/{api → common}/schemas/secret.py +3 -3
- mlrun/{api → common}/schemas/tag.py +2 -2
- mlrun/common/types.py +25 -0
- mlrun/config.py +152 -20
- mlrun/data_types/__init__.py +7 -2
- mlrun/data_types/data_types.py +4 -2
- mlrun/data_types/infer.py +1 -1
- mlrun/data_types/spark.py +10 -3
- mlrun/datastore/__init__.py +10 -3
- mlrun/datastore/azure_blob.py +1 -1
- mlrun/datastore/base.py +185 -53
- mlrun/datastore/datastore.py +1 -1
- mlrun/datastore/filestore.py +1 -1
- mlrun/datastore/google_cloud_storage.py +1 -1
- mlrun/datastore/inmem.py +4 -1
- mlrun/datastore/redis.py +1 -1
- mlrun/datastore/s3.py +1 -1
- mlrun/datastore/sources.py +192 -70
- mlrun/datastore/spark_udf.py +44 -0
- mlrun/datastore/store_resources.py +4 -4
- mlrun/datastore/targets.py +115 -45
- mlrun/datastore/utils.py +127 -5
- mlrun/datastore/v3io.py +1 -1
- mlrun/datastore/wasbfs/__init__.py +1 -1
- mlrun/datastore/wasbfs/fs.py +1 -1
- mlrun/db/__init__.py +7 -5
- mlrun/db/base.py +112 -68
- mlrun/db/httpdb.py +445 -277
- mlrun/db/nopdb.py +491 -0
- mlrun/db/sqldb.py +112 -65
- mlrun/errors.py +6 -1
- mlrun/execution.py +44 -22
- mlrun/feature_store/__init__.py +1 -1
- mlrun/feature_store/api.py +143 -95
- mlrun/feature_store/common.py +16 -20
- mlrun/feature_store/feature_set.py +42 -12
- mlrun/feature_store/feature_vector.py +32 -21
- mlrun/feature_store/ingestion.py +9 -12
- mlrun/feature_store/retrieval/__init__.py +3 -2
- mlrun/feature_store/retrieval/base.py +388 -66
- mlrun/feature_store/retrieval/dask_merger.py +63 -151
- mlrun/feature_store/retrieval/job.py +30 -12
- mlrun/feature_store/retrieval/local_merger.py +40 -133
- mlrun/feature_store/retrieval/spark_merger.py +129 -127
- mlrun/feature_store/retrieval/storey_merger.py +173 -0
- mlrun/feature_store/steps.py +132 -15
- mlrun/features.py +8 -3
- mlrun/frameworks/__init__.py +1 -1
- mlrun/frameworks/_common/__init__.py +1 -1
- mlrun/frameworks/_common/artifacts_library.py +1 -1
- mlrun/frameworks/_common/mlrun_interface.py +1 -1
- mlrun/frameworks/_common/model_handler.py +1 -1
- mlrun/frameworks/_common/plan.py +1 -1
- mlrun/frameworks/_common/producer.py +1 -1
- mlrun/frameworks/_common/utils.py +1 -1
- mlrun/frameworks/_dl_common/__init__.py +1 -1
- mlrun/frameworks/_dl_common/loggers/__init__.py +1 -1
- mlrun/frameworks/_dl_common/loggers/logger.py +1 -1
- mlrun/frameworks/_dl_common/loggers/mlrun_logger.py +1 -1
- mlrun/frameworks/_dl_common/loggers/tensorboard_logger.py +1 -1
- mlrun/frameworks/_dl_common/model_handler.py +1 -1
- mlrun/frameworks/_dl_common/utils.py +1 -1
- mlrun/frameworks/_ml_common/__init__.py +1 -1
- mlrun/frameworks/_ml_common/artifacts_library.py +1 -1
- mlrun/frameworks/_ml_common/loggers/__init__.py +1 -1
- mlrun/frameworks/_ml_common/loggers/logger.py +1 -1
- mlrun/frameworks/_ml_common/loggers/mlrun_logger.py +1 -1
- mlrun/frameworks/_ml_common/model_handler.py +1 -1
- mlrun/frameworks/_ml_common/pkl_model_server.py +13 -1
- mlrun/frameworks/_ml_common/plan.py +1 -1
- mlrun/frameworks/_ml_common/plans/__init__.py +1 -1
- mlrun/frameworks/_ml_common/plans/calibration_curve_plan.py +1 -6
- mlrun/frameworks/_ml_common/plans/confusion_matrix_plan.py +1 -1
- mlrun/frameworks/_ml_common/plans/dataset_plan.py +1 -1
- mlrun/frameworks/_ml_common/plans/feature_importance_plan.py +1 -1
- mlrun/frameworks/_ml_common/plans/roc_curve_plan.py +1 -1
- mlrun/frameworks/_ml_common/producer.py +1 -1
- mlrun/frameworks/_ml_common/utils.py +1 -1
- mlrun/frameworks/auto_mlrun/__init__.py +1 -1
- mlrun/frameworks/auto_mlrun/auto_mlrun.py +1 -1
- mlrun/frameworks/huggingface/__init__.py +1 -1
- mlrun/frameworks/huggingface/model_server.py +1 -1
- mlrun/frameworks/lgbm/__init__.py +1 -1
- mlrun/frameworks/lgbm/callbacks/__init__.py +1 -1
- mlrun/frameworks/lgbm/callbacks/callback.py +1 -1
- mlrun/frameworks/lgbm/callbacks/logging_callback.py +1 -1
- mlrun/frameworks/lgbm/callbacks/mlrun_logging_callback.py +1 -1
- mlrun/frameworks/lgbm/mlrun_interfaces/__init__.py +1 -1
- mlrun/frameworks/lgbm/mlrun_interfaces/booster_mlrun_interface.py +1 -1
- mlrun/frameworks/lgbm/mlrun_interfaces/mlrun_interface.py +1 -1
- mlrun/frameworks/lgbm/mlrun_interfaces/model_mlrun_interface.py +1 -1
- mlrun/frameworks/lgbm/model_handler.py +1 -1
- mlrun/frameworks/lgbm/model_server.py +1 -1
- mlrun/frameworks/lgbm/utils.py +1 -1
- mlrun/frameworks/onnx/__init__.py +1 -1
- mlrun/frameworks/onnx/dataset.py +1 -1
- mlrun/frameworks/onnx/mlrun_interface.py +1 -1
- mlrun/frameworks/onnx/model_handler.py +1 -1
- mlrun/frameworks/onnx/model_server.py +1 -1
- mlrun/frameworks/parallel_coordinates.py +1 -1
- mlrun/frameworks/pytorch/__init__.py +1 -1
- mlrun/frameworks/pytorch/callbacks/__init__.py +1 -1
- mlrun/frameworks/pytorch/callbacks/callback.py +1 -1
- mlrun/frameworks/pytorch/callbacks/logging_callback.py +1 -1
- mlrun/frameworks/pytorch/callbacks/mlrun_logging_callback.py +1 -1
- mlrun/frameworks/pytorch/callbacks/tensorboard_logging_callback.py +1 -1
- mlrun/frameworks/pytorch/callbacks_handler.py +1 -1
- mlrun/frameworks/pytorch/mlrun_interface.py +1 -1
- mlrun/frameworks/pytorch/model_handler.py +1 -1
- mlrun/frameworks/pytorch/model_server.py +1 -1
- mlrun/frameworks/pytorch/utils.py +1 -1
- mlrun/frameworks/sklearn/__init__.py +1 -1
- mlrun/frameworks/sklearn/estimator.py +1 -1
- mlrun/frameworks/sklearn/metric.py +1 -1
- mlrun/frameworks/sklearn/metrics_library.py +1 -1
- mlrun/frameworks/sklearn/mlrun_interface.py +1 -1
- mlrun/frameworks/sklearn/model_handler.py +1 -1
- mlrun/frameworks/sklearn/utils.py +1 -1
- mlrun/frameworks/tf_keras/__init__.py +1 -1
- mlrun/frameworks/tf_keras/callbacks/__init__.py +1 -1
- mlrun/frameworks/tf_keras/callbacks/logging_callback.py +1 -1
- mlrun/frameworks/tf_keras/callbacks/mlrun_logging_callback.py +1 -1
- mlrun/frameworks/tf_keras/callbacks/tensorboard_logging_callback.py +1 -1
- mlrun/frameworks/tf_keras/mlrun_interface.py +1 -1
- mlrun/frameworks/tf_keras/model_handler.py +1 -1
- mlrun/frameworks/tf_keras/model_server.py +1 -1
- mlrun/frameworks/tf_keras/utils.py +1 -1
- mlrun/frameworks/xgboost/__init__.py +1 -1
- mlrun/frameworks/xgboost/mlrun_interface.py +1 -1
- mlrun/frameworks/xgboost/model_handler.py +1 -1
- mlrun/frameworks/xgboost/utils.py +1 -1
- mlrun/k8s_utils.py +14 -765
- mlrun/kfpops.py +14 -17
- mlrun/launcher/__init__.py +13 -0
- mlrun/launcher/base.py +406 -0
- mlrun/launcher/client.py +159 -0
- mlrun/launcher/factory.py +50 -0
- mlrun/launcher/local.py +276 -0
- mlrun/launcher/remote.py +178 -0
- mlrun/lists.py +10 -2
- mlrun/mlutils/__init__.py +1 -1
- mlrun/mlutils/data.py +1 -1
- mlrun/mlutils/models.py +1 -1
- mlrun/mlutils/plots.py +1 -1
- mlrun/model.py +252 -14
- mlrun/model_monitoring/__init__.py +41 -0
- mlrun/model_monitoring/features_drift_table.py +1 -1
- mlrun/model_monitoring/helpers.py +123 -38
- mlrun/model_monitoring/model_endpoint.py +144 -0
- mlrun/model_monitoring/model_monitoring_batch.py +310 -259
- mlrun/model_monitoring/stores/__init__.py +106 -0
- mlrun/model_monitoring/stores/kv_model_endpoint_store.py +448 -0
- mlrun/model_monitoring/stores/model_endpoint_store.py +147 -0
- mlrun/model_monitoring/stores/models/__init__.py +23 -0
- mlrun/model_monitoring/stores/models/base.py +18 -0
- mlrun/model_monitoring/stores/models/mysql.py +100 -0
- mlrun/model_monitoring/stores/models/sqlite.py +98 -0
- mlrun/model_monitoring/stores/sql_model_endpoint_store.py +370 -0
- mlrun/model_monitoring/stream_processing_fs.py +239 -271
- mlrun/package/__init__.py +163 -0
- mlrun/package/context_handler.py +325 -0
- mlrun/package/errors.py +47 -0
- mlrun/package/packager.py +298 -0
- mlrun/{runtimes/package → package/packagers}/__init__.py +3 -1
- mlrun/package/packagers/default_packager.py +422 -0
- mlrun/package/packagers/numpy_packagers.py +612 -0
- mlrun/package/packagers/pandas_packagers.py +968 -0
- mlrun/package/packagers/python_standard_library_packagers.py +616 -0
- mlrun/package/packagers_manager.py +786 -0
- mlrun/package/utils/__init__.py +53 -0
- mlrun/package/utils/_archiver.py +226 -0
- mlrun/package/utils/_formatter.py +211 -0
- mlrun/package/utils/_pickler.py +234 -0
- mlrun/package/utils/_supported_format.py +71 -0
- mlrun/package/utils/log_hint_utils.py +93 -0
- mlrun/package/utils/type_hint_utils.py +298 -0
- mlrun/platforms/__init__.py +1 -1
- mlrun/platforms/iguazio.py +34 -2
- mlrun/platforms/other.py +1 -1
- mlrun/projects/__init__.py +1 -1
- mlrun/projects/operations.py +14 -9
- mlrun/projects/pipelines.py +31 -13
- mlrun/projects/project.py +762 -238
- mlrun/render.py +49 -19
- mlrun/run.py +57 -326
- mlrun/runtimes/__init__.py +3 -9
- mlrun/runtimes/base.py +247 -784
- mlrun/runtimes/constants.py +1 -1
- mlrun/runtimes/daskjob.py +45 -41
- mlrun/runtimes/funcdoc.py +43 -7
- mlrun/runtimes/function.py +66 -656
- mlrun/runtimes/function_reference.py +1 -1
- mlrun/runtimes/generators.py +1 -1
- mlrun/runtimes/kubejob.py +99 -116
- mlrun/runtimes/local.py +59 -66
- mlrun/runtimes/mpijob/__init__.py +1 -1
- mlrun/runtimes/mpijob/abstract.py +13 -15
- mlrun/runtimes/mpijob/v1.py +3 -1
- mlrun/runtimes/mpijob/v1alpha1.py +1 -1
- mlrun/runtimes/nuclio.py +1 -1
- mlrun/runtimes/pod.py +51 -26
- mlrun/runtimes/remotesparkjob.py +3 -1
- mlrun/runtimes/serving.py +12 -4
- mlrun/runtimes/sparkjob/__init__.py +1 -2
- mlrun/runtimes/sparkjob/abstract.py +44 -31
- mlrun/runtimes/sparkjob/spark3job.py +11 -9
- mlrun/runtimes/utils.py +61 -42
- mlrun/secrets.py +16 -18
- mlrun/serving/__init__.py +3 -2
- mlrun/serving/merger.py +1 -1
- mlrun/serving/remote.py +1 -1
- mlrun/serving/routers.py +39 -42
- mlrun/serving/server.py +23 -13
- mlrun/serving/serving_wrapper.py +1 -1
- mlrun/serving/states.py +172 -39
- mlrun/serving/utils.py +1 -1
- mlrun/serving/v1_serving.py +1 -1
- mlrun/serving/v2_serving.py +29 -21
- mlrun/utils/__init__.py +1 -2
- mlrun/utils/async_http.py +8 -1
- mlrun/utils/azure_vault.py +1 -1
- mlrun/utils/clones.py +2 -2
- mlrun/utils/condition_evaluator.py +65 -0
- mlrun/utils/db.py +52 -0
- mlrun/utils/helpers.py +188 -13
- mlrun/utils/http.py +89 -54
- mlrun/utils/logger.py +48 -8
- mlrun/utils/model_monitoring.py +132 -100
- mlrun/utils/notifications/__init__.py +1 -1
- mlrun/utils/notifications/notification/__init__.py +8 -6
- mlrun/utils/notifications/notification/base.py +20 -14
- mlrun/utils/notifications/notification/console.py +7 -4
- mlrun/utils/notifications/notification/git.py +36 -19
- mlrun/utils/notifications/notification/ipython.py +10 -8
- mlrun/utils/notifications/notification/slack.py +18 -13
- mlrun/utils/notifications/notification_pusher.py +377 -56
- mlrun/utils/regex.py +6 -1
- mlrun/utils/singleton.py +1 -1
- mlrun/utils/v3io_clients.py +1 -1
- mlrun/utils/vault.py +270 -269
- mlrun/utils/version/__init__.py +1 -1
- mlrun/utils/version/version.json +2 -2
- mlrun/utils/version/version.py +1 -1
- {mlrun-1.3.3.dist-info → mlrun-1.4.0.dist-info}/METADATA +16 -10
- mlrun-1.4.0.dist-info/RECORD +434 -0
- mlrun/api/api/endpoints/marketplace.py +0 -257
- mlrun/api/crud/marketplace.py +0 -221
- mlrun/api/crud/model_monitoring/model_endpoint_store.py +0 -847
- mlrun/api/db/filedb/db.py +0 -518
- mlrun/api/schemas/marketplace.py +0 -128
- mlrun/api/schemas/model_endpoints.py +0 -185
- mlrun/db/filedb.py +0 -891
- mlrun/feature_store/retrieval/online.py +0 -92
- mlrun/model_monitoring/constants.py +0 -67
- mlrun/runtimes/package/context_handler.py +0 -711
- mlrun/runtimes/sparkjob/spark2job.py +0 -59
- mlrun-1.3.3.dist-info/RECORD +0 -381
- {mlrun-1.3.3.dist-info → mlrun-1.4.0.dist-info}/LICENSE +0 -0
- {mlrun-1.3.3.dist-info → mlrun-1.4.0.dist-info}/WHEEL +0 -0
- {mlrun-1.3.3.dist-info → mlrun-1.4.0.dist-info}/entry_points.txt +0 -0
- {mlrun-1.3.3.dist-info → mlrun-1.4.0.dist-info}/top_level.txt +0 -0
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
# Copyright 2023 Iguazio
|
|
2
|
+
#
|
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
4
|
+
# you may not use this file except in compliance with the License.
|
|
5
|
+
# You may obtain a copy of the License at
|
|
6
|
+
#
|
|
7
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
8
|
+
#
|
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
10
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
11
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
12
|
+
# See the License for the specific language governing permissions and
|
|
13
|
+
# limitations under the License.
|
|
14
|
+
#
|
|
15
|
+
|
|
16
|
+
# flake8: noqa - this is until we take care of the F401 violations with respect to __all__ & sphinx
|
|
17
|
+
|
|
18
|
+
from ._archiver import ArchiveSupportedFormat
|
|
19
|
+
from ._formatter import StructFileSupportedFormat
|
|
20
|
+
from ._pickler import Pickler
|
|
21
|
+
from ._supported_format import SupportedFormat
|
|
22
|
+
from .log_hint_utils import LogHintKey, LogHintUtils
|
|
23
|
+
from .type_hint_utils import TypeHintUtils
|
|
24
|
+
|
|
25
|
+
# The default pickle module to use for pickling objects:
|
|
26
|
+
DEFAULT_PICKLE_MODULE = "cloudpickle"
|
|
27
|
+
# The default archive format to use for archiving directories:
|
|
28
|
+
DEFAULT_ARCHIVE_FORMAT = ArchiveSupportedFormat.ZIP
|
|
29
|
+
# The default struct file format to use for savings python struct objects (dictionaries and lists):
|
|
30
|
+
DEFAULT_STRUCT_FILE_FORMAT = StructFileSupportedFormat.JSON
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
class ArtifactType:
|
|
34
|
+
"""
|
|
35
|
+
Possible artifact types to pack objects as and log using a `mlrun.Packager`.
|
|
36
|
+
"""
|
|
37
|
+
|
|
38
|
+
OBJECT = "object"
|
|
39
|
+
PATH = "path"
|
|
40
|
+
FILE = "file"
|
|
41
|
+
DATASET = "dataset"
|
|
42
|
+
MODEL = "model"
|
|
43
|
+
PLOT = "plot"
|
|
44
|
+
RESULT = "result"
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
class DatasetFileFormat:
|
|
48
|
+
"""
|
|
49
|
+
All file format for logging objects as `DatasetArtifact`.
|
|
50
|
+
"""
|
|
51
|
+
|
|
52
|
+
CSV = "csv"
|
|
53
|
+
PARQUET = "parquet"
|
|
@@ -0,0 +1,226 @@
|
|
|
1
|
+
# Copyright 2023 Iguazio
|
|
2
|
+
#
|
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
4
|
+
# you may not use this file except in compliance with the License.
|
|
5
|
+
# You may obtain a copy of the License at
|
|
6
|
+
#
|
|
7
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
8
|
+
#
|
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
10
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
11
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
12
|
+
# See the License for the specific language governing permissions and
|
|
13
|
+
# limitations under the License.
|
|
14
|
+
#
|
|
15
|
+
import os
|
|
16
|
+
import tarfile
|
|
17
|
+
import zipfile
|
|
18
|
+
from abc import ABC, abstractmethod
|
|
19
|
+
from pathlib import Path
|
|
20
|
+
|
|
21
|
+
from ._supported_format import SupportedFormat
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
class _Archiver(ABC):
|
|
25
|
+
"""
|
|
26
|
+
An abstract base class for an archiver - a class to manage archives of multiple files.
|
|
27
|
+
"""
|
|
28
|
+
|
|
29
|
+
@classmethod
|
|
30
|
+
@abstractmethod
|
|
31
|
+
def create_archive(cls, directory_path: str, output_path: str) -> str:
|
|
32
|
+
"""
|
|
33
|
+
Create an archive of all the contents in the given directory and save it to an archive file named as the
|
|
34
|
+
directory in the provided output path.
|
|
35
|
+
|
|
36
|
+
:param directory_path: The directory with the files to archive.
|
|
37
|
+
:param output_path: The output path to store the created archive file.
|
|
38
|
+
|
|
39
|
+
:return: The created archive path.
|
|
40
|
+
"""
|
|
41
|
+
pass
|
|
42
|
+
|
|
43
|
+
@classmethod
|
|
44
|
+
@abstractmethod
|
|
45
|
+
def extract_archive(cls, archive_path: str, output_path: str) -> str:
|
|
46
|
+
"""
|
|
47
|
+
Extract the given archive to a directory named as the archive file (without the extension) located in the
|
|
48
|
+
provided output path.
|
|
49
|
+
|
|
50
|
+
:param archive_path: The archive file to extract its contents.
|
|
51
|
+
:param output_path: The output path to extract the directory of the archive to.
|
|
52
|
+
|
|
53
|
+
:return: The extracted contents directory path.
|
|
54
|
+
"""
|
|
55
|
+
pass
|
|
56
|
+
|
|
57
|
+
|
|
58
|
+
class _ZipArchiver(_Archiver):
|
|
59
|
+
"""
|
|
60
|
+
A static class for managing zip archives.
|
|
61
|
+
"""
|
|
62
|
+
|
|
63
|
+
@classmethod
|
|
64
|
+
def create_archive(cls, directory_path: str, output_path: str) -> str:
|
|
65
|
+
"""
|
|
66
|
+
Create an archive of all the contents in the given directory and save it to an archive file named as the
|
|
67
|
+
directory in the provided output path.
|
|
68
|
+
|
|
69
|
+
:param directory_path: The directory with the files to archive.
|
|
70
|
+
:param output_path: The output path to store the created archive file.
|
|
71
|
+
|
|
72
|
+
:return: The created archive path.
|
|
73
|
+
"""
|
|
74
|
+
# Convert to `pathlib.Path` objects:
|
|
75
|
+
directory_path = Path(directory_path)
|
|
76
|
+
output_path = Path(output_path)
|
|
77
|
+
|
|
78
|
+
# Construct the archive file path:
|
|
79
|
+
archive_path = output_path / f"{directory_path.stem}.zip"
|
|
80
|
+
|
|
81
|
+
# Archive:
|
|
82
|
+
with zipfile.ZipFile(archive_path, "w") as zip_file:
|
|
83
|
+
for path in directory_path.rglob("*"):
|
|
84
|
+
zip_file.write(filename=path, arcname=path.relative_to(directory_path))
|
|
85
|
+
|
|
86
|
+
return str(archive_path)
|
|
87
|
+
|
|
88
|
+
@classmethod
|
|
89
|
+
def extract_archive(cls, archive_path: str, output_path: str) -> str:
|
|
90
|
+
"""
|
|
91
|
+
Extract the given archive to a directory named as the archive file (without the extension) located in the
|
|
92
|
+
provided output path.
|
|
93
|
+
|
|
94
|
+
:param archive_path: The archive file to extract its contents.
|
|
95
|
+
:param output_path: The output path to extract the directory of the archive to.
|
|
96
|
+
|
|
97
|
+
:return: The extracted contents directory path.
|
|
98
|
+
"""
|
|
99
|
+
# Convert to `pathlib.Path` objects:
|
|
100
|
+
archive_path = Path(archive_path)
|
|
101
|
+
output_path = Path(output_path)
|
|
102
|
+
|
|
103
|
+
# Create the directory path:
|
|
104
|
+
directory_path = output_path / archive_path.stem
|
|
105
|
+
os.makedirs(directory_path)
|
|
106
|
+
|
|
107
|
+
# Extract:
|
|
108
|
+
with zipfile.ZipFile(archive_path, "r") as zip_file:
|
|
109
|
+
zip_file.extractall(directory_path)
|
|
110
|
+
|
|
111
|
+
return str(directory_path)
|
|
112
|
+
|
|
113
|
+
|
|
114
|
+
class _TarArchiver(_Archiver):
|
|
115
|
+
"""
|
|
116
|
+
A static class for managing tar archives.
|
|
117
|
+
"""
|
|
118
|
+
|
|
119
|
+
# Inner class variable to note how to open a `TarFile` object for reading and writing:
|
|
120
|
+
_MODE_STRING = ""
|
|
121
|
+
|
|
122
|
+
@classmethod
|
|
123
|
+
def create_archive(cls, directory_path: str, output_path: str) -> str:
|
|
124
|
+
"""
|
|
125
|
+
Create an archive of all the contents in the given directory and save it to an archive file named as the
|
|
126
|
+
directory in the provided output path.
|
|
127
|
+
|
|
128
|
+
:param directory_path: The directory with the files to archive.
|
|
129
|
+
:param output_path: The output path to store the created archive file.
|
|
130
|
+
|
|
131
|
+
:return: The created archive path.
|
|
132
|
+
"""
|
|
133
|
+
# Convert to `pathlib.Path` objects:
|
|
134
|
+
directory_path = Path(directory_path)
|
|
135
|
+
output_path = Path(output_path)
|
|
136
|
+
|
|
137
|
+
# Construct the archive file path:
|
|
138
|
+
archive_file_extension = (
|
|
139
|
+
"tar" if cls._MODE_STRING == "" else f"tar.{cls._MODE_STRING}"
|
|
140
|
+
)
|
|
141
|
+
archive_path = output_path / f"{directory_path.stem}.{archive_file_extension}"
|
|
142
|
+
|
|
143
|
+
# Archive:
|
|
144
|
+
with tarfile.open(archive_path, f"w:{cls._MODE_STRING}") as tar_file:
|
|
145
|
+
for path in directory_path.rglob("*"):
|
|
146
|
+
tar_file.add(name=path, arcname=path.relative_to(directory_path))
|
|
147
|
+
|
|
148
|
+
return str(archive_path)
|
|
149
|
+
|
|
150
|
+
@classmethod
|
|
151
|
+
def extract_archive(cls, archive_path: str, output_path: str) -> str:
|
|
152
|
+
"""
|
|
153
|
+
Extract the given archive to a directory named as the archive file (without the extension) located in the
|
|
154
|
+
provided output path.
|
|
155
|
+
|
|
156
|
+
:param archive_path: The archive file to extract its contents.
|
|
157
|
+
:param output_path: The output path to extract the directory of the archive to.
|
|
158
|
+
|
|
159
|
+
:return: The extracted contents directory path.
|
|
160
|
+
"""
|
|
161
|
+
# Convert to `pathlib.Path` objects:
|
|
162
|
+
archive_path = Path(archive_path)
|
|
163
|
+
output_path = Path(output_path)
|
|
164
|
+
|
|
165
|
+
# Get the archive file name (can be constructed of multiple extensions like tar.gz so `Path.stem` won't work):
|
|
166
|
+
archive_file_name = archive_path
|
|
167
|
+
while archive_file_name.with_suffix(suffix="") != archive_file_name:
|
|
168
|
+
archive_file_name = archive_file_name.with_suffix(suffix="")
|
|
169
|
+
archive_file_name = archive_file_name.stem
|
|
170
|
+
|
|
171
|
+
# Create the directory path:
|
|
172
|
+
directory_path = output_path / archive_file_name
|
|
173
|
+
os.makedirs(directory_path)
|
|
174
|
+
|
|
175
|
+
# Extract:
|
|
176
|
+
with tarfile.open(archive_path, f"r:{cls._MODE_STRING}") as tar_file:
|
|
177
|
+
tar_file.extractall(directory_path)
|
|
178
|
+
|
|
179
|
+
return str(directory_path)
|
|
180
|
+
|
|
181
|
+
|
|
182
|
+
class _TarGZArchiver(_TarArchiver):
|
|
183
|
+
"""
|
|
184
|
+
A static class for managing tar.gz archives.
|
|
185
|
+
"""
|
|
186
|
+
|
|
187
|
+
# Inner class variable to note how to open a `TarFile` object for reading and writing:
|
|
188
|
+
_MODE_STRING = "gz"
|
|
189
|
+
|
|
190
|
+
|
|
191
|
+
class _TarBZ2Archiver(_TarArchiver):
|
|
192
|
+
"""
|
|
193
|
+
A static class for managing tar.bz2 archives.
|
|
194
|
+
"""
|
|
195
|
+
|
|
196
|
+
# Inner class variable to note how to open a `TarFile` object for reading and writing:
|
|
197
|
+
_MODE_STRING = "bz2"
|
|
198
|
+
|
|
199
|
+
|
|
200
|
+
class _TarXZArchiver(_TarArchiver):
|
|
201
|
+
"""
|
|
202
|
+
A static class for managing tar.gz archives.
|
|
203
|
+
"""
|
|
204
|
+
|
|
205
|
+
# Inner class variable to note how to open a `TarFile` object for reading and writing:
|
|
206
|
+
_MODE_STRING = "xz"
|
|
207
|
+
|
|
208
|
+
|
|
209
|
+
class ArchiveSupportedFormat(SupportedFormat[_Archiver]):
|
|
210
|
+
"""
|
|
211
|
+
Library of archive formats (file extensions) supported by some builtin MLRun packagers.
|
|
212
|
+
"""
|
|
213
|
+
|
|
214
|
+
ZIP = "zip"
|
|
215
|
+
TAR = "tar"
|
|
216
|
+
TAR_GZ = "tar.gz"
|
|
217
|
+
TAR_BZ2 = "tar.bz2"
|
|
218
|
+
TAR_XZ = "tar.xz"
|
|
219
|
+
|
|
220
|
+
_FORMAT_HANDLERS_MAP = {
|
|
221
|
+
ZIP: _ZipArchiver,
|
|
222
|
+
TAR: _TarArchiver,
|
|
223
|
+
TAR_GZ: _TarGZArchiver,
|
|
224
|
+
TAR_BZ2: _TarBZ2Archiver,
|
|
225
|
+
TAR_XZ: _TarXZArchiver,
|
|
226
|
+
}
|
|
@@ -0,0 +1,211 @@
|
|
|
1
|
+
# Copyright 2023 Iguazio
|
|
2
|
+
#
|
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
4
|
+
# you may not use this file except in compliance with the License.
|
|
5
|
+
# You may obtain a copy of the License at
|
|
6
|
+
#
|
|
7
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
8
|
+
#
|
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
10
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
11
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
12
|
+
# See the License for the specific language governing permissions and
|
|
13
|
+
# limitations under the License.
|
|
14
|
+
#
|
|
15
|
+
import ast
|
|
16
|
+
import json
|
|
17
|
+
from abc import ABC, abstractmethod
|
|
18
|
+
from typing import Any, Union
|
|
19
|
+
|
|
20
|
+
import yaml
|
|
21
|
+
|
|
22
|
+
from ._supported_format import SupportedFormat
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
class _Formatter(ABC):
|
|
26
|
+
"""
|
|
27
|
+
An abstract base class for a formatter - a class to format python structures into and from files.
|
|
28
|
+
"""
|
|
29
|
+
|
|
30
|
+
@classmethod
|
|
31
|
+
@abstractmethod
|
|
32
|
+
def write(cls, obj: Any, file_path: str, **dump_kwargs: dict):
|
|
33
|
+
"""
|
|
34
|
+
Write the object to a file. The object must be serializable according to the used format.
|
|
35
|
+
|
|
36
|
+
:param obj: The object to write.
|
|
37
|
+
:param file_path: The file path to write to.
|
|
38
|
+
:param dump_kwargs: Additional keyword arguments to pass to the dump method of the formatter in use.
|
|
39
|
+
"""
|
|
40
|
+
pass
|
|
41
|
+
|
|
42
|
+
@classmethod
|
|
43
|
+
@abstractmethod
|
|
44
|
+
def read(cls, file_path: str) -> Any:
|
|
45
|
+
"""
|
|
46
|
+
Read an object from the file given.
|
|
47
|
+
|
|
48
|
+
:param file_path: The file to read the object from.
|
|
49
|
+
|
|
50
|
+
:return: The read object.
|
|
51
|
+
"""
|
|
52
|
+
pass
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
class _JSONFormatter(_Formatter):
|
|
56
|
+
"""
|
|
57
|
+
A static class for managing json files.
|
|
58
|
+
"""
|
|
59
|
+
|
|
60
|
+
# A set of default configurations to pass to the dump function:
|
|
61
|
+
DEFAULT_DUMP_KWARGS = {"indent": 4}
|
|
62
|
+
|
|
63
|
+
@classmethod
|
|
64
|
+
def write(cls, obj: Union[list, dict], file_path: str, **dump_kwargs: dict):
|
|
65
|
+
"""
|
|
66
|
+
Write the object to a json file. The object must be serializable according to the json format.
|
|
67
|
+
|
|
68
|
+
:param obj: The object to write.
|
|
69
|
+
:param file_path: The file path to write to.
|
|
70
|
+
:param dump_kwargs: Additional keyword arguments to pass to the `json.dump` method of the formatter in use.
|
|
71
|
+
"""
|
|
72
|
+
dump_kwargs = dump_kwargs or cls.DEFAULT_DUMP_KWARGS
|
|
73
|
+
with open(file_path, "w") as file:
|
|
74
|
+
json.dump(obj, file, **dump_kwargs)
|
|
75
|
+
|
|
76
|
+
@classmethod
|
|
77
|
+
def read(cls, file_path: str) -> Union[list, dict]:
|
|
78
|
+
"""
|
|
79
|
+
Read an object from the json file given.
|
|
80
|
+
|
|
81
|
+
:param file_path: The json file to read the object from.
|
|
82
|
+
|
|
83
|
+
:return: The read object.
|
|
84
|
+
"""
|
|
85
|
+
with open(file_path, "r") as file:
|
|
86
|
+
obj = json.load(file)
|
|
87
|
+
return obj
|
|
88
|
+
|
|
89
|
+
|
|
90
|
+
class _JSONLFormatter(_Formatter):
|
|
91
|
+
"""
|
|
92
|
+
A static class for managing jsonl files.
|
|
93
|
+
"""
|
|
94
|
+
|
|
95
|
+
@classmethod
|
|
96
|
+
def write(cls, obj: Union[list, dict], file_path: str, **dump_kwargs: dict):
|
|
97
|
+
"""
|
|
98
|
+
Write the object to a jsonl file. The object must be serializable according to the json format.
|
|
99
|
+
|
|
100
|
+
:param obj: The object to write.
|
|
101
|
+
:param file_path: The file path to write to.
|
|
102
|
+
:param dump_kwargs: Additional keyword arguments to pass to the `json.dumps` method of the formatter in use.
|
|
103
|
+
"""
|
|
104
|
+
if isinstance(obj, dict):
|
|
105
|
+
obj = [obj]
|
|
106
|
+
|
|
107
|
+
with open(file_path, "w") as file:
|
|
108
|
+
for line in obj:
|
|
109
|
+
file.write(json.dumps(obj=line, **dump_kwargs) + "\n")
|
|
110
|
+
|
|
111
|
+
@classmethod
|
|
112
|
+
def read(cls, file_path: str) -> Union[list, dict]:
|
|
113
|
+
"""
|
|
114
|
+
Read an object from the jsonl file given.
|
|
115
|
+
|
|
116
|
+
:param file_path: The jsonl file to read the object from.
|
|
117
|
+
|
|
118
|
+
:return: The read object.
|
|
119
|
+
"""
|
|
120
|
+
with open(file_path, "r") as file:
|
|
121
|
+
lines = file.readlines()
|
|
122
|
+
|
|
123
|
+
obj = []
|
|
124
|
+
for line in lines:
|
|
125
|
+
obj.append(json.loads(s=line))
|
|
126
|
+
|
|
127
|
+
return obj[0] if len(obj) == 1 else obj
|
|
128
|
+
|
|
129
|
+
|
|
130
|
+
class _YAMLFormatter(_Formatter):
|
|
131
|
+
"""
|
|
132
|
+
A static class for managing yaml files.
|
|
133
|
+
"""
|
|
134
|
+
|
|
135
|
+
# A set of default configurations to pass to the dump function:
|
|
136
|
+
DEFAULT_DUMP_KWARGS = {"default_flow_style": False, "indent": 4}
|
|
137
|
+
|
|
138
|
+
@classmethod
|
|
139
|
+
def write(cls, obj: Union[list, dict], file_path: str, **dump_kwargs: dict):
|
|
140
|
+
"""
|
|
141
|
+
Write the object to a yaml file. The object must be serializable according to the yaml format.
|
|
142
|
+
|
|
143
|
+
:param obj: The object to write.
|
|
144
|
+
:param file_path: The file path to write to.
|
|
145
|
+
:param dump_kwargs: Additional keyword arguments to pass to the `yaml.dump` method of the formatter in use.
|
|
146
|
+
"""
|
|
147
|
+
dump_kwargs = dump_kwargs or cls.DEFAULT_DUMP_KWARGS
|
|
148
|
+
with open(file_path, "w") as file:
|
|
149
|
+
yaml.dump(obj, file, **dump_kwargs)
|
|
150
|
+
|
|
151
|
+
@classmethod
|
|
152
|
+
def read(cls, file_path: str) -> Union[list, dict]:
|
|
153
|
+
"""
|
|
154
|
+
Read an object from the yaml file given.
|
|
155
|
+
|
|
156
|
+
:param file_path: The yaml file to read the object from.
|
|
157
|
+
|
|
158
|
+
:return: The read object.
|
|
159
|
+
"""
|
|
160
|
+
with open(file_path, "r") as file:
|
|
161
|
+
obj = yaml.safe_load(file)
|
|
162
|
+
return obj
|
|
163
|
+
|
|
164
|
+
|
|
165
|
+
class _TXTFormatter(_Formatter):
|
|
166
|
+
"""
|
|
167
|
+
A static class for managing txt files.
|
|
168
|
+
"""
|
|
169
|
+
|
|
170
|
+
@classmethod
|
|
171
|
+
def write(cls, obj: Any, file_path: str, **dump_kwargs: dict):
|
|
172
|
+
"""
|
|
173
|
+
Write the object to a text file. The object must be serializable according to python's ast module.
|
|
174
|
+
|
|
175
|
+
:param obj: The object to write.
|
|
176
|
+
:param file_path: The file path to write to.
|
|
177
|
+
:param dump_kwargs: Ignored.
|
|
178
|
+
"""
|
|
179
|
+
with open(file_path, "w") as file:
|
|
180
|
+
file.write(str(obj))
|
|
181
|
+
|
|
182
|
+
@classmethod
|
|
183
|
+
def read(cls, file_path: str) -> Any:
|
|
184
|
+
"""
|
|
185
|
+
Read an object from the yaml file given.
|
|
186
|
+
|
|
187
|
+
:param file_path: The yaml file to read the object from.
|
|
188
|
+
|
|
189
|
+
:return: The read object.
|
|
190
|
+
"""
|
|
191
|
+
with open(file_path, "r") as file:
|
|
192
|
+
obj = ast.literal_eval(file.read())
|
|
193
|
+
return obj
|
|
194
|
+
|
|
195
|
+
|
|
196
|
+
class StructFileSupportedFormat(SupportedFormat[_Formatter]):
|
|
197
|
+
"""
|
|
198
|
+
Library of struct formats (file extensions) supported by some builtin MLRun packagers.
|
|
199
|
+
"""
|
|
200
|
+
|
|
201
|
+
JSON = "json"
|
|
202
|
+
JSONL = "jsonl"
|
|
203
|
+
YAML = "yaml"
|
|
204
|
+
TXT = "txt"
|
|
205
|
+
|
|
206
|
+
_FORMAT_HANDLERS_MAP = {
|
|
207
|
+
JSON: _JSONFormatter,
|
|
208
|
+
JSONL: _JSONLFormatter,
|
|
209
|
+
YAML: _YAMLFormatter,
|
|
210
|
+
TXT: _TXTFormatter,
|
|
211
|
+
}
|