wandb 0.22.1__py3-none-win_arm64.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.
- package_readme.md +97 -0
- wandb/__init__.py +248 -0
- wandb/__init__.pyi +1230 -0
- wandb/__main__.py +3 -0
- wandb/_analytics.py +65 -0
- wandb/_iterutils.py +73 -0
- wandb/_pydantic/__init__.py +30 -0
- wandb/_pydantic/base.py +108 -0
- wandb/_pydantic/field_types.py +29 -0
- wandb/_pydantic/utils.py +80 -0
- wandb/_pydantic/v1_compat.py +301 -0
- wandb/_strutils.py +40 -0
- wandb/agents/__init__.py +0 -0
- wandb/agents/pyagent.py +386 -0
- wandb/analytics/__init__.py +3 -0
- wandb/analytics/sentry.py +267 -0
- wandb/apis/__init__.py +50 -0
- wandb/apis/attrs.py +52 -0
- wandb/apis/importers/__init__.py +1 -0
- wandb/apis/importers/internals/internal.py +375 -0
- wandb/apis/importers/internals/protocols.py +103 -0
- wandb/apis/importers/internals/util.py +78 -0
- wandb/apis/importers/mlflow.py +254 -0
- wandb/apis/importers/validation.py +108 -0
- wandb/apis/importers/wandb.py +1608 -0
- wandb/apis/internal.py +241 -0
- wandb/apis/normalize.py +83 -0
- wandb/apis/paginator.py +138 -0
- wandb/apis/public/__init__.py +78 -0
- wandb/apis/public/api.py +2513 -0
- wandb/apis/public/artifacts.py +1050 -0
- wandb/apis/public/automations.py +86 -0
- wandb/apis/public/const.py +6 -0
- wandb/apis/public/files.py +411 -0
- wandb/apis/public/history.py +203 -0
- wandb/apis/public/integrations.py +203 -0
- wandb/apis/public/jobs.py +744 -0
- wandb/apis/public/projects.py +278 -0
- wandb/apis/public/query_generator.py +179 -0
- wandb/apis/public/registries/__init__.py +7 -0
- wandb/apis/public/registries/_freezable_list.py +176 -0
- wandb/apis/public/registries/_utils.py +139 -0
- wandb/apis/public/registries/registries_search.py +353 -0
- wandb/apis/public/registries/registry.py +370 -0
- wandb/apis/public/reports.py +597 -0
- wandb/apis/public/runs.py +1438 -0
- wandb/apis/public/sweeps.py +441 -0
- wandb/apis/public/teams.py +237 -0
- wandb/apis/public/users.py +179 -0
- wandb/apis/public/utils.py +211 -0
- wandb/apis/reports/__init__.py +1 -0
- wandb/apis/reports/v1/__init__.py +8 -0
- wandb/apis/reports/v2/__init__.py +8 -0
- wandb/apis/workspaces/__init__.py +8 -0
- wandb/automations/__init__.py +73 -0
- wandb/automations/_filters/__init__.py +40 -0
- wandb/automations/_filters/expressions.py +182 -0
- wandb/automations/_filters/operators.py +259 -0
- wandb/automations/_filters/run_metrics.py +330 -0
- wandb/automations/_generated/__init__.py +104 -0
- wandb/automations/_generated/create_automation.py +17 -0
- wandb/automations/_generated/create_generic_webhook_integration.py +37 -0
- wandb/automations/_generated/delete_automation.py +15 -0
- wandb/automations/_generated/enums.py +35 -0
- wandb/automations/_generated/fragments.py +293 -0
- wandb/automations/_generated/generic_webhook_integrations_by_entity.py +22 -0
- wandb/automations/_generated/get_automations.py +24 -0
- wandb/automations/_generated/get_automations_by_entity.py +26 -0
- wandb/automations/_generated/input_types.py +104 -0
- wandb/automations/_generated/integrations_by_entity.py +22 -0
- wandb/automations/_generated/operations.py +647 -0
- wandb/automations/_generated/slack_integrations_by_entity.py +22 -0
- wandb/automations/_generated/update_automation.py +17 -0
- wandb/automations/_utils.py +235 -0
- wandb/automations/_validators.py +185 -0
- wandb/automations/actions.py +220 -0
- wandb/automations/automations.py +85 -0
- wandb/automations/events.py +284 -0
- wandb/automations/integrations.py +45 -0
- wandb/automations/scopes.py +78 -0
- wandb/beta/workflows.py +324 -0
- wandb/bin/gpu_stats.exe +0 -0
- wandb/bin/wandb-core +0 -0
- wandb/cli/__init__.py +0 -0
- wandb/cli/beta.py +93 -0
- wandb/cli/beta_sync.py +224 -0
- wandb/cli/cli.py +2883 -0
- wandb/data_types.py +66 -0
- wandb/docker/__init__.py +290 -0
- wandb/docker/names.py +40 -0
- wandb/docker/wandb-entrypoint.sh +33 -0
- wandb/env.py +535 -0
- wandb/errors/__init__.py +17 -0
- wandb/errors/errors.py +40 -0
- wandb/errors/links.py +73 -0
- wandb/errors/term.py +415 -0
- wandb/errors/util.py +57 -0
- wandb/errors/warnings.py +2 -0
- wandb/filesync/__init__.py +0 -0
- wandb/filesync/dir_watcher.py +404 -0
- wandb/filesync/stats.py +100 -0
- wandb/filesync/step_checksum.py +142 -0
- wandb/filesync/step_prepare.py +179 -0
- wandb/filesync/step_upload.py +287 -0
- wandb/filesync/upload_job.py +142 -0
- wandb/integration/__init__.py +0 -0
- wandb/integration/catboost/__init__.py +5 -0
- wandb/integration/catboost/catboost.py +182 -0
- wandb/integration/cohere/__init__.py +3 -0
- wandb/integration/cohere/cohere.py +21 -0
- wandb/integration/cohere/resolver.py +347 -0
- wandb/integration/diffusers/__init__.py +3 -0
- wandb/integration/diffusers/autologger.py +76 -0
- wandb/integration/diffusers/pipeline_resolver.py +50 -0
- wandb/integration/diffusers/resolvers/__init__.py +9 -0
- wandb/integration/diffusers/resolvers/multimodal.py +881 -0
- wandb/integration/diffusers/resolvers/utils.py +102 -0
- wandb/integration/dspy/__init__.py +5 -0
- wandb/integration/dspy/dspy.py +422 -0
- wandb/integration/fastai/__init__.py +243 -0
- wandb/integration/gym/__init__.py +98 -0
- wandb/integration/huggingface/__init__.py +3 -0
- wandb/integration/huggingface/huggingface.py +18 -0
- wandb/integration/huggingface/resolver.py +213 -0
- wandb/integration/keras/__init__.py +11 -0
- wandb/integration/keras/callbacks/__init__.py +5 -0
- wandb/integration/keras/callbacks/metrics_logger.py +129 -0
- wandb/integration/keras/callbacks/model_checkpoint.py +188 -0
- wandb/integration/keras/callbacks/tables_builder.py +228 -0
- wandb/integration/keras/keras.py +1086 -0
- wandb/integration/kfp/__init__.py +6 -0
- wandb/integration/kfp/helpers.py +28 -0
- wandb/integration/kfp/kfp_patch.py +335 -0
- wandb/integration/kfp/wandb_logging.py +182 -0
- wandb/integration/langchain/__init__.py +3 -0
- wandb/integration/langchain/wandb_tracer.py +49 -0
- wandb/integration/lightgbm/__init__.py +239 -0
- wandb/integration/lightning/__init__.py +0 -0
- wandb/integration/lightning/fabric/__init__.py +3 -0
- wandb/integration/lightning/fabric/logger.py +763 -0
- wandb/integration/metaflow/__init__.py +9 -0
- wandb/integration/metaflow/data_pandas.py +74 -0
- wandb/integration/metaflow/data_pytorch.py +75 -0
- wandb/integration/metaflow/data_sklearn.py +76 -0
- wandb/integration/metaflow/errors.py +13 -0
- wandb/integration/metaflow/metaflow.py +327 -0
- wandb/integration/openai/__init__.py +3 -0
- wandb/integration/openai/fine_tuning.py +480 -0
- wandb/integration/openai/openai.py +22 -0
- wandb/integration/openai/resolver.py +240 -0
- wandb/integration/prodigy/__init__.py +3 -0
- wandb/integration/prodigy/prodigy.py +291 -0
- wandb/integration/sacred/__init__.py +117 -0
- wandb/integration/sagemaker/__init__.py +14 -0
- wandb/integration/sagemaker/auth.py +29 -0
- wandb/integration/sagemaker/config.py +58 -0
- wandb/integration/sagemaker/files.py +2 -0
- wandb/integration/sagemaker/resources.py +63 -0
- wandb/integration/sb3/__init__.py +3 -0
- wandb/integration/sb3/sb3.py +147 -0
- wandb/integration/sklearn/__init__.py +37 -0
- wandb/integration/sklearn/calculate/__init__.py +32 -0
- wandb/integration/sklearn/calculate/calibration_curves.py +125 -0
- wandb/integration/sklearn/calculate/class_proportions.py +68 -0
- wandb/integration/sklearn/calculate/confusion_matrix.py +93 -0
- wandb/integration/sklearn/calculate/decision_boundaries.py +40 -0
- wandb/integration/sklearn/calculate/elbow_curve.py +55 -0
- wandb/integration/sklearn/calculate/feature_importances.py +67 -0
- wandb/integration/sklearn/calculate/learning_curve.py +64 -0
- wandb/integration/sklearn/calculate/outlier_candidates.py +69 -0
- wandb/integration/sklearn/calculate/residuals.py +86 -0
- wandb/integration/sklearn/calculate/silhouette.py +118 -0
- wandb/integration/sklearn/calculate/summary_metrics.py +62 -0
- wandb/integration/sklearn/plot/__init__.py +35 -0
- wandb/integration/sklearn/plot/classifier.py +329 -0
- wandb/integration/sklearn/plot/clusterer.py +146 -0
- wandb/integration/sklearn/plot/regressor.py +121 -0
- wandb/integration/sklearn/plot/shared.py +91 -0
- wandb/integration/sklearn/utils.py +184 -0
- wandb/integration/tensorboard/__init__.py +10 -0
- wandb/integration/tensorboard/log.py +351 -0
- wandb/integration/tensorboard/monkeypatch.py +186 -0
- wandb/integration/tensorflow/__init__.py +5 -0
- wandb/integration/tensorflow/estimator_hook.py +54 -0
- wandb/integration/torch/__init__.py +0 -0
- wandb/integration/torch/wandb_torch.py +554 -0
- wandb/integration/ultralytics/__init__.py +11 -0
- wandb/integration/ultralytics/bbox_utils.py +215 -0
- wandb/integration/ultralytics/callback.py +528 -0
- wandb/integration/ultralytics/classification_utils.py +83 -0
- wandb/integration/ultralytics/mask_utils.py +202 -0
- wandb/integration/ultralytics/pose_utils.py +103 -0
- wandb/integration/weave/__init__.py +6 -0
- wandb/integration/weave/interface.py +49 -0
- wandb/integration/weave/weave.py +118 -0
- wandb/integration/xgboost/__init__.py +11 -0
- wandb/integration/xgboost/xgboost.py +189 -0
- wandb/integration/yolov8/__init__.py +0 -0
- wandb/integration/yolov8/yolov8.py +284 -0
- wandb/jupyter.py +538 -0
- wandb/mpmain/__init__.py +0 -0
- wandb/mpmain/__main__.py +1 -0
- wandb/old/__init__.py +0 -0
- wandb/old/core.py +53 -0
- wandb/old/settings.py +176 -0
- wandb/old/summary.py +438 -0
- wandb/plot/__init__.py +30 -0
- wandb/plot/bar.py +71 -0
- wandb/plot/confusion_matrix.py +185 -0
- wandb/plot/custom_chart.py +147 -0
- wandb/plot/histogram.py +66 -0
- wandb/plot/line.py +75 -0
- wandb/plot/line_series.py +173 -0
- wandb/plot/pr_curve.py +186 -0
- wandb/plot/roc_curve.py +163 -0
- wandb/plot/scatter.py +66 -0
- wandb/plot/utils.py +184 -0
- wandb/plot/viz.py +41 -0
- wandb/proto/__init__.py +0 -0
- wandb/proto/v3/__init__.py +0 -0
- wandb/proto/v3/wandb_base_pb2.py +55 -0
- wandb/proto/v3/wandb_internal_pb2.py +1738 -0
- wandb/proto/v3/wandb_server_pb2.py +209 -0
- wandb/proto/v3/wandb_settings_pb2.py +122 -0
- wandb/proto/v3/wandb_sync_pb2.py +100 -0
- wandb/proto/v3/wandb_telemetry_pb2.py +106 -0
- wandb/proto/v4/__init__.py +0 -0
- wandb/proto/v4/wandb_base_pb2.py +30 -0
- wandb/proto/v4/wandb_internal_pb2.py +384 -0
- wandb/proto/v4/wandb_server_pb2.py +64 -0
- wandb/proto/v4/wandb_settings_pb2.py +47 -0
- wandb/proto/v4/wandb_sync_pb2.py +42 -0
- wandb/proto/v4/wandb_telemetry_pb2.py +41 -0
- wandb/proto/v5/wandb_base_pb2.py +31 -0
- wandb/proto/v5/wandb_internal_pb2.py +385 -0
- wandb/proto/v5/wandb_server_pb2.py +65 -0
- wandb/proto/v5/wandb_settings_pb2.py +48 -0
- wandb/proto/v5/wandb_sync_pb2.py +43 -0
- wandb/proto/v5/wandb_telemetry_pb2.py +42 -0
- wandb/proto/v6/wandb_base_pb2.py +41 -0
- wandb/proto/v6/wandb_internal_pb2.py +395 -0
- wandb/proto/v6/wandb_server_pb2.py +75 -0
- wandb/proto/v6/wandb_settings_pb2.py +58 -0
- wandb/proto/v6/wandb_sync_pb2.py +53 -0
- wandb/proto/v6/wandb_telemetry_pb2.py +52 -0
- wandb/proto/wandb_base_pb2.py +12 -0
- wandb/proto/wandb_deprecated.py +59 -0
- wandb/proto/wandb_generate_deprecated.py +30 -0
- wandb/proto/wandb_generate_proto.py +50 -0
- wandb/proto/wandb_internal_pb2.py +18 -0
- wandb/proto/wandb_server_pb2.py +12 -0
- wandb/proto/wandb_settings_pb2.py +12 -0
- wandb/proto/wandb_sync_pb2.py +12 -0
- wandb/proto/wandb_telemetry_pb2.py +12 -0
- wandb/py.typed +0 -0
- wandb/sdk/__init__.py +37 -0
- wandb/sdk/artifacts/__init__.py +0 -0
- wandb/sdk/artifacts/_factories.py +22 -0
- wandb/sdk/artifacts/_generated/__init__.py +208 -0
- wandb/sdk/artifacts/_generated/add_aliases.py +21 -0
- wandb/sdk/artifacts/_generated/artifact_by_id.py +17 -0
- wandb/sdk/artifacts/_generated/artifact_by_name.py +22 -0
- wandb/sdk/artifacts/_generated/artifact_collection_membership_file_urls.py +43 -0
- wandb/sdk/artifacts/_generated/artifact_collection_membership_files.py +43 -0
- wandb/sdk/artifacts/_generated/artifact_created_by.py +47 -0
- wandb/sdk/artifacts/_generated/artifact_file_urls.py +22 -0
- wandb/sdk/artifacts/_generated/artifact_type.py +31 -0
- wandb/sdk/artifacts/_generated/artifact_used_by.py +43 -0
- wandb/sdk/artifacts/_generated/artifact_version_files.py +36 -0
- wandb/sdk/artifacts/_generated/artifact_via_membership_by_name.py +26 -0
- wandb/sdk/artifacts/_generated/create_artifact_collection_tag_assignments.py +36 -0
- wandb/sdk/artifacts/_generated/delete_aliases.py +21 -0
- wandb/sdk/artifacts/_generated/delete_artifact.py +28 -0
- wandb/sdk/artifacts/_generated/delete_artifact_collection_tag_assignments.py +25 -0
- wandb/sdk/artifacts/_generated/delete_artifact_portfolio.py +35 -0
- wandb/sdk/artifacts/_generated/delete_artifact_sequence.py +35 -0
- wandb/sdk/artifacts/_generated/enums.py +22 -0
- wandb/sdk/artifacts/_generated/fetch_artifact_manifest.py +38 -0
- wandb/sdk/artifacts/_generated/fetch_linked_artifacts.py +67 -0
- wandb/sdk/artifacts/_generated/fetch_registries.py +32 -0
- wandb/sdk/artifacts/_generated/fragments.py +524 -0
- wandb/sdk/artifacts/_generated/input_types.py +46 -0
- wandb/sdk/artifacts/_generated/link_artifact.py +27 -0
- wandb/sdk/artifacts/_generated/move_artifact_collection.py +35 -0
- wandb/sdk/artifacts/_generated/operations.py +1253 -0
- wandb/sdk/artifacts/_generated/project_artifact_collection.py +101 -0
- wandb/sdk/artifacts/_generated/project_artifact_collections.py +33 -0
- wandb/sdk/artifacts/_generated/project_artifact_type.py +24 -0
- wandb/sdk/artifacts/_generated/project_artifact_types.py +24 -0
- wandb/sdk/artifacts/_generated/project_artifacts.py +42 -0
- wandb/sdk/artifacts/_generated/registry_collections.py +34 -0
- wandb/sdk/artifacts/_generated/registry_versions.py +34 -0
- wandb/sdk/artifacts/_generated/run_input_artifacts.py +31 -0
- wandb/sdk/artifacts/_generated/run_output_artifacts.py +31 -0
- wandb/sdk/artifacts/_generated/type_info.py +19 -0
- wandb/sdk/artifacts/_generated/unlink_artifact.py +25 -0
- wandb/sdk/artifacts/_generated/update_artifact.py +26 -0
- wandb/sdk/artifacts/_generated/update_artifact_portfolio.py +35 -0
- wandb/sdk/artifacts/_generated/update_artifact_sequence.py +35 -0
- wandb/sdk/artifacts/_gqlutils.py +47 -0
- wandb/sdk/artifacts/_internal_artifact.py +54 -0
- wandb/sdk/artifacts/_models/__init__.py +4 -0
- wandb/sdk/artifacts/_models/base_model.py +20 -0
- wandb/sdk/artifacts/_validators.py +338 -0
- wandb/sdk/artifacts/artifact.py +2683 -0
- wandb/sdk/artifacts/artifact_download_logger.py +45 -0
- wandb/sdk/artifacts/artifact_file_cache.py +256 -0
- wandb/sdk/artifacts/artifact_instance_cache.py +17 -0
- wandb/sdk/artifacts/artifact_manifest.py +76 -0
- wandb/sdk/artifacts/artifact_manifest_entry.py +315 -0
- wandb/sdk/artifacts/artifact_manifests/__init__.py +0 -0
- wandb/sdk/artifacts/artifact_manifests/artifact_manifest_v1.py +94 -0
- wandb/sdk/artifacts/artifact_saver.py +277 -0
- wandb/sdk/artifacts/artifact_state.py +13 -0
- wandb/sdk/artifacts/artifact_ttl.py +9 -0
- wandb/sdk/artifacts/exceptions.py +72 -0
- wandb/sdk/artifacts/staging.py +27 -0
- wandb/sdk/artifacts/storage_handler.py +62 -0
- wandb/sdk/artifacts/storage_handlers/__init__.py +0 -0
- wandb/sdk/artifacts/storage_handlers/azure_handler.py +214 -0
- wandb/sdk/artifacts/storage_handlers/gcs_handler.py +224 -0
- wandb/sdk/artifacts/storage_handlers/http_handler.py +112 -0
- wandb/sdk/artifacts/storage_handlers/local_file_handler.py +142 -0
- wandb/sdk/artifacts/storage_handlers/multi_handler.py +56 -0
- wandb/sdk/artifacts/storage_handlers/s3_handler.py +340 -0
- wandb/sdk/artifacts/storage_handlers/tracking_handler.py +68 -0
- wandb/sdk/artifacts/storage_handlers/wb_artifact_handler.py +131 -0
- wandb/sdk/artifacts/storage_handlers/wb_local_artifact_handler.py +74 -0
- wandb/sdk/artifacts/storage_layout.py +8 -0
- wandb/sdk/artifacts/storage_policies/__init__.py +4 -0
- wandb/sdk/artifacts/storage_policies/_factories.py +63 -0
- wandb/sdk/artifacts/storage_policies/register.py +1 -0
- wandb/sdk/artifacts/storage_policies/wandb_storage_policy.py +525 -0
- wandb/sdk/artifacts/storage_policy.py +75 -0
- wandb/sdk/backend/__init__.py +0 -0
- wandb/sdk/backend/backend.py +57 -0
- wandb/sdk/data_types/__init__.py +0 -0
- wandb/sdk/data_types/_dtypes.py +914 -0
- wandb/sdk/data_types/_private.py +10 -0
- wandb/sdk/data_types/audio.py +208 -0
- wandb/sdk/data_types/base_types/__init__.py +0 -0
- wandb/sdk/data_types/base_types/json_metadata.py +55 -0
- wandb/sdk/data_types/base_types/media.py +339 -0
- wandb/sdk/data_types/base_types/wb_value.py +295 -0
- wandb/sdk/data_types/bokeh.py +91 -0
- wandb/sdk/data_types/graph.py +439 -0
- wandb/sdk/data_types/helper_types/__init__.py +0 -0
- wandb/sdk/data_types/helper_types/bounding_boxes_2d.py +327 -0
- wandb/sdk/data_types/helper_types/classes.py +159 -0
- wandb/sdk/data_types/helper_types/image_mask.py +251 -0
- wandb/sdk/data_types/histogram.py +107 -0
- wandb/sdk/data_types/html.py +165 -0
- wandb/sdk/data_types/image.py +985 -0
- wandb/sdk/data_types/molecule.py +250 -0
- wandb/sdk/data_types/object_3d.py +495 -0
- wandb/sdk/data_types/plotly.py +95 -0
- wandb/sdk/data_types/saved_model.py +435 -0
- wandb/sdk/data_types/table.py +1468 -0
- wandb/sdk/data_types/table_decorators.py +108 -0
- wandb/sdk/data_types/trace_tree.py +440 -0
- wandb/sdk/data_types/utils.py +260 -0
- wandb/sdk/data_types/video.py +303 -0
- wandb/sdk/integration_utils/__init__.py +0 -0
- wandb/sdk/integration_utils/auto_logging.py +232 -0
- wandb/sdk/integration_utils/data_logging.py +475 -0
- wandb/sdk/interface/__init__.py +0 -0
- wandb/sdk/interface/constants.py +4 -0
- wandb/sdk/interface/interface.py +1093 -0
- wandb/sdk/interface/interface_queue.py +50 -0
- wandb/sdk/interface/interface_shared.py +473 -0
- wandb/sdk/interface/interface_sock.py +55 -0
- wandb/sdk/interface/summary_record.py +67 -0
- wandb/sdk/internal/__init__.py +0 -0
- wandb/sdk/internal/_generated/__init__.py +5 -0
- wandb/sdk/internal/_generated/enums.py +4 -0
- wandb/sdk/internal/_generated/input_types.py +4 -0
- wandb/sdk/internal/_generated/operations.py +15 -0
- wandb/sdk/internal/_generated/server_features_query.py +27 -0
- wandb/sdk/internal/context.py +89 -0
- wandb/sdk/internal/datastore.py +293 -0
- wandb/sdk/internal/file_pusher.py +177 -0
- wandb/sdk/internal/file_stream.py +686 -0
- wandb/sdk/internal/handler.py +854 -0
- wandb/sdk/internal/incremental_table_util.py +53 -0
- wandb/sdk/internal/internal_api.py +4723 -0
- wandb/sdk/internal/job_builder.py +639 -0
- wandb/sdk/internal/profiler.py +79 -0
- wandb/sdk/internal/progress.py +77 -0
- wandb/sdk/internal/run.py +27 -0
- wandb/sdk/internal/sample.py +70 -0
- wandb/sdk/internal/sender.py +1692 -0
- wandb/sdk/internal/sender_config.py +203 -0
- wandb/sdk/internal/settings_static.py +40 -0
- wandb/sdk/internal/tb_watcher.py +519 -0
- wandb/sdk/internal/thread_local_settings.py +18 -0
- wandb/sdk/launch/__init__.py +15 -0
- wandb/sdk/launch/_launch.py +331 -0
- wandb/sdk/launch/_launch_add.py +255 -0
- wandb/sdk/launch/_project_spec.py +565 -0
- wandb/sdk/launch/agent/__init__.py +5 -0
- wandb/sdk/launch/agent/agent.py +931 -0
- wandb/sdk/launch/agent/config.py +296 -0
- wandb/sdk/launch/agent/job_status_tracker.py +55 -0
- wandb/sdk/launch/agent/run_queue_item_file_saver.py +39 -0
- wandb/sdk/launch/builder/__init__.py +0 -0
- wandb/sdk/launch/builder/abstract.py +156 -0
- wandb/sdk/launch/builder/build.py +296 -0
- wandb/sdk/launch/builder/context_manager.py +235 -0
- wandb/sdk/launch/builder/docker_builder.py +177 -0
- wandb/sdk/launch/builder/kaniko_builder.py +595 -0
- wandb/sdk/launch/builder/noop.py +58 -0
- wandb/sdk/launch/builder/templates/_wandb_bootstrap.py +188 -0
- wandb/sdk/launch/builder/templates/dockerfile.py +92 -0
- wandb/sdk/launch/create_job.py +541 -0
- wandb/sdk/launch/environment/abstract.py +29 -0
- wandb/sdk/launch/environment/aws_environment.py +322 -0
- wandb/sdk/launch/environment/azure_environment.py +105 -0
- wandb/sdk/launch/environment/gcp_environment.py +334 -0
- wandb/sdk/launch/environment/local_environment.py +65 -0
- wandb/sdk/launch/errors.py +13 -0
- wandb/sdk/launch/git_reference.py +109 -0
- wandb/sdk/launch/inputs/files.py +148 -0
- wandb/sdk/launch/inputs/internal.py +315 -0
- wandb/sdk/launch/inputs/manage.py +113 -0
- wandb/sdk/launch/inputs/schema.py +70 -0
- wandb/sdk/launch/loader.py +249 -0
- wandb/sdk/launch/registry/abstract.py +48 -0
- wandb/sdk/launch/registry/anon.py +29 -0
- wandb/sdk/launch/registry/azure_container_registry.py +124 -0
- wandb/sdk/launch/registry/elastic_container_registry.py +192 -0
- wandb/sdk/launch/registry/google_artifact_registry.py +219 -0
- wandb/sdk/launch/registry/local_registry.py +65 -0
- wandb/sdk/launch/runner/__init__.py +0 -0
- wandb/sdk/launch/runner/abstract.py +185 -0
- wandb/sdk/launch/runner/kubernetes_monitor.py +473 -0
- wandb/sdk/launch/runner/kubernetes_runner.py +1290 -0
- wandb/sdk/launch/runner/local_container.py +301 -0
- wandb/sdk/launch/runner/local_process.py +78 -0
- wandb/sdk/launch/runner/sagemaker_runner.py +424 -0
- wandb/sdk/launch/runner/vertex_runner.py +225 -0
- wandb/sdk/launch/sweeps/__init__.py +37 -0
- wandb/sdk/launch/sweeps/scheduler.py +739 -0
- wandb/sdk/launch/sweeps/scheduler_sweep.py +90 -0
- wandb/sdk/launch/sweeps/utils.py +324 -0
- wandb/sdk/launch/utils.py +827 -0
- wandb/sdk/launch/wandb_reference.py +138 -0
- wandb/sdk/lib/__init__.py +5 -0
- wandb/sdk/lib/apikey.py +334 -0
- wandb/sdk/lib/asyncio_compat.py +278 -0
- wandb/sdk/lib/asyncio_manager.py +252 -0
- wandb/sdk/lib/capped_dict.py +26 -0
- wandb/sdk/lib/config_util.py +101 -0
- wandb/sdk/lib/console_capture.py +219 -0
- wandb/sdk/lib/credentials.py +141 -0
- wandb/sdk/lib/deprecate.py +27 -0
- wandb/sdk/lib/disabled.py +30 -0
- wandb/sdk/lib/exit_hooks.py +54 -0
- wandb/sdk/lib/file_stream_utils.py +118 -0
- wandb/sdk/lib/filenames.py +64 -0
- wandb/sdk/lib/filesystem.py +372 -0
- wandb/sdk/lib/fsm.py +165 -0
- wandb/sdk/lib/gitlib.py +240 -0
- wandb/sdk/lib/gql_request.py +76 -0
- wandb/sdk/lib/handler_util.py +21 -0
- wandb/sdk/lib/hashutil.py +106 -0
- wandb/sdk/lib/import_hooks.py +275 -0
- wandb/sdk/lib/interrupt.py +37 -0
- wandb/sdk/lib/ipython.py +126 -0
- wandb/sdk/lib/json_util.py +75 -0
- wandb/sdk/lib/lazyloader.py +63 -0
- wandb/sdk/lib/module.py +72 -0
- wandb/sdk/lib/paths.py +108 -0
- wandb/sdk/lib/preinit.py +42 -0
- wandb/sdk/lib/printer.py +567 -0
- wandb/sdk/lib/printer_asyncio.py +48 -0
- wandb/sdk/lib/progress.py +325 -0
- wandb/sdk/lib/proto_util.py +90 -0
- wandb/sdk/lib/redirect.py +876 -0
- wandb/sdk/lib/retry.py +395 -0
- wandb/sdk/lib/run_moment.py +82 -0
- wandb/sdk/lib/runid.py +12 -0
- wandb/sdk/lib/server.py +58 -0
- wandb/sdk/lib/service/ipc_support.py +13 -0
- wandb/sdk/lib/service/service_client.py +102 -0
- wandb/sdk/lib/service/service_connection.py +238 -0
- wandb/sdk/lib/service/service_port_file.py +105 -0
- wandb/sdk/lib/service/service_process.py +111 -0
- wandb/sdk/lib/service/service_token.py +181 -0
- wandb/sdk/lib/sparkline.py +44 -0
- wandb/sdk/lib/telemetry.py +100 -0
- wandb/sdk/lib/timed_input.py +133 -0
- wandb/sdk/lib/timer.py +19 -0
- wandb/sdk/lib/wb_logging.py +161 -0
- wandb/sdk/mailbox/__init__.py +23 -0
- wandb/sdk/mailbox/mailbox.py +143 -0
- wandb/sdk/mailbox/mailbox_handle.py +134 -0
- wandb/sdk/mailbox/response_handle.py +99 -0
- wandb/sdk/mailbox/wait_with_progress.py +100 -0
- wandb/sdk/projects/_generated/__init__.py +26 -0
- wandb/sdk/projects/_generated/delete_project.py +22 -0
- wandb/sdk/projects/_generated/enums.py +4 -0
- wandb/sdk/projects/_generated/fetch_registry.py +22 -0
- wandb/sdk/projects/_generated/fragments.py +41 -0
- wandb/sdk/projects/_generated/input_types.py +13 -0
- wandb/sdk/projects/_generated/operations.py +88 -0
- wandb/sdk/projects/_generated/rename_project.py +27 -0
- wandb/sdk/projects/_generated/upsert_registry_project.py +27 -0
- wandb/sdk/verify/__init__.py +0 -0
- wandb/sdk/verify/verify.py +555 -0
- wandb/sdk/wandb_alerts.py +12 -0
- wandb/sdk/wandb_config.py +323 -0
- wandb/sdk/wandb_helper.py +54 -0
- wandb/sdk/wandb_init.py +1601 -0
- wandb/sdk/wandb_login.py +358 -0
- wandb/sdk/wandb_metric.py +112 -0
- wandb/sdk/wandb_require.py +88 -0
- wandb/sdk/wandb_require_helpers.py +44 -0
- wandb/sdk/wandb_run.py +4102 -0
- wandb/sdk/wandb_settings.py +2197 -0
- wandb/sdk/wandb_setup.py +560 -0
- wandb/sdk/wandb_summary.py +150 -0
- wandb/sdk/wandb_sweep.py +120 -0
- wandb/sdk/wandb_sync.py +71 -0
- wandb/sdk/wandb_watch.py +146 -0
- wandb/sklearn.py +35 -0
- wandb/sync/__init__.py +3 -0
- wandb/sync/sync.py +457 -0
- wandb/trigger.py +29 -0
- wandb/util.py +2040 -0
- wandb/vendor/__init__.py +0 -0
- wandb/vendor/gql-0.2.0/setup.py +40 -0
- wandb/vendor/gql-0.2.0/tests/__init__.py +0 -0
- wandb/vendor/gql-0.2.0/tests/starwars/__init__.py +0 -0
- wandb/vendor/gql-0.2.0/tests/starwars/fixtures.py +96 -0
- wandb/vendor/gql-0.2.0/tests/starwars/schema.py +146 -0
- wandb/vendor/gql-0.2.0/tests/starwars/test_dsl.py +293 -0
- wandb/vendor/gql-0.2.0/tests/starwars/test_query.py +355 -0
- wandb/vendor/gql-0.2.0/tests/starwars/test_validation.py +171 -0
- wandb/vendor/gql-0.2.0/tests/test_client.py +31 -0
- wandb/vendor/gql-0.2.0/tests/test_transport.py +89 -0
- wandb/vendor/gql-0.2.0/wandb_gql/__init__.py +4 -0
- wandb/vendor/gql-0.2.0/wandb_gql/client.py +75 -0
- wandb/vendor/gql-0.2.0/wandb_gql/dsl.py +152 -0
- wandb/vendor/gql-0.2.0/wandb_gql/gql.py +10 -0
- wandb/vendor/gql-0.2.0/wandb_gql/transport/__init__.py +0 -0
- wandb/vendor/gql-0.2.0/wandb_gql/transport/http.py +6 -0
- wandb/vendor/gql-0.2.0/wandb_gql/transport/local_schema.py +15 -0
- wandb/vendor/gql-0.2.0/wandb_gql/transport/requests.py +46 -0
- wandb/vendor/gql-0.2.0/wandb_gql/utils.py +21 -0
- wandb/vendor/graphql-core-1.1/setup.py +86 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/__init__.py +287 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/error/__init__.py +6 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/error/base.py +42 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/error/format_error.py +11 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/error/located_error.py +29 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/error/syntax_error.py +36 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/execution/__init__.py +26 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/execution/base.py +311 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/execution/executor.py +398 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/execution/executors/__init__.py +0 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/execution/executors/asyncio.py +53 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/execution/executors/gevent.py +22 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/execution/executors/process.py +32 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/execution/executors/sync.py +7 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/execution/executors/thread.py +35 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/execution/executors/utils.py +6 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/execution/experimental/__init__.py +0 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/execution/experimental/executor.py +66 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/execution/experimental/fragment.py +252 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/execution/experimental/resolver.py +151 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/execution/experimental/utils.py +7 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/execution/middleware.py +57 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/execution/values.py +145 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/graphql.py +60 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/language/__init__.py +0 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/language/ast.py +1349 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/language/base.py +19 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/language/lexer.py +435 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/language/location.py +30 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/language/parser.py +779 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/language/printer.py +193 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/language/source.py +18 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/language/visitor.py +222 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/language/visitor_meta.py +82 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/pyutils/__init__.py +0 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/pyutils/cached_property.py +17 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/pyutils/contain_subset.py +28 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/pyutils/default_ordered_dict.py +40 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/pyutils/ordereddict.py +8 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/pyutils/pair_set.py +43 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/pyutils/version.py +78 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/type/__init__.py +67 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/type/definition.py +619 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/type/directives.py +132 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/type/introspection.py +440 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/type/scalars.py +131 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/type/schema.py +100 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/type/typemap.py +145 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/utils/__init__.py +0 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/utils/assert_valid_name.py +9 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/utils/ast_from_value.py +65 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/utils/ast_to_code.py +49 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/utils/ast_to_dict.py +24 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/utils/base.py +75 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/utils/build_ast_schema.py +291 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/utils/build_client_schema.py +250 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/utils/concat_ast.py +9 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/utils/extend_schema.py +357 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/utils/get_field_def.py +27 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/utils/get_operation_ast.py +21 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/utils/introspection_query.py +90 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/utils/is_valid_literal_value.py +67 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/utils/is_valid_value.py +66 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/utils/quoted_or_list.py +21 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/utils/schema_printer.py +168 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/utils/suggestion_list.py +56 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/utils/type_comparators.py +69 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/utils/type_from_ast.py +21 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/utils/type_info.py +149 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/utils/value_from_ast.py +69 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/validation/__init__.py +4 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/validation/rules/__init__.py +79 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/validation/rules/arguments_of_correct_type.py +24 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/validation/rules/base.py +8 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/validation/rules/default_values_of_correct_type.py +44 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/validation/rules/fields_on_correct_type.py +113 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/validation/rules/fragments_on_composite_types.py +33 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/validation/rules/known_argument_names.py +70 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/validation/rules/known_directives.py +97 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/validation/rules/known_fragment_names.py +19 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/validation/rules/known_type_names.py +43 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/validation/rules/lone_anonymous_operation.py +23 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/validation/rules/no_fragment_cycles.py +59 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/validation/rules/no_undefined_variables.py +36 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/validation/rules/no_unused_fragments.py +38 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/validation/rules/no_unused_variables.py +37 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/validation/rules/overlapping_fields_can_be_merged.py +529 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/validation/rules/possible_fragment_spreads.py +44 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/validation/rules/provided_non_null_arguments.py +46 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/validation/rules/scalar_leafs.py +33 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/validation/rules/unique_argument_names.py +32 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/validation/rules/unique_fragment_names.py +28 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/validation/rules/unique_input_field_names.py +33 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/validation/rules/unique_operation_names.py +31 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/validation/rules/unique_variable_names.py +27 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/validation/rules/variables_are_input_types.py +21 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/validation/rules/variables_in_allowed_position.py +53 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/validation/validation.py +158 -0
- wandb/vendor/promise-2.3.0/conftest.py +30 -0
- wandb/vendor/promise-2.3.0/setup.py +64 -0
- wandb/vendor/promise-2.3.0/tests/__init__.py +0 -0
- wandb/vendor/promise-2.3.0/tests/conftest.py +8 -0
- wandb/vendor/promise-2.3.0/tests/test_awaitable.py +32 -0
- wandb/vendor/promise-2.3.0/tests/test_awaitable_35.py +47 -0
- wandb/vendor/promise-2.3.0/tests/test_benchmark.py +116 -0
- wandb/vendor/promise-2.3.0/tests/test_complex_threads.py +23 -0
- wandb/vendor/promise-2.3.0/tests/test_dataloader.py +452 -0
- wandb/vendor/promise-2.3.0/tests/test_dataloader_awaitable_35.py +99 -0
- wandb/vendor/promise-2.3.0/tests/test_dataloader_extra.py +65 -0
- wandb/vendor/promise-2.3.0/tests/test_extra.py +670 -0
- wandb/vendor/promise-2.3.0/tests/test_issues.py +132 -0
- wandb/vendor/promise-2.3.0/tests/test_promise_list.py +70 -0
- wandb/vendor/promise-2.3.0/tests/test_spec.py +584 -0
- wandb/vendor/promise-2.3.0/tests/test_thread_safety.py +115 -0
- wandb/vendor/promise-2.3.0/tests/utils.py +3 -0
- wandb/vendor/promise-2.3.0/wandb_promise/__init__.py +38 -0
- wandb/vendor/promise-2.3.0/wandb_promise/async_.py +135 -0
- wandb/vendor/promise-2.3.0/wandb_promise/compat.py +32 -0
- wandb/vendor/promise-2.3.0/wandb_promise/dataloader.py +326 -0
- wandb/vendor/promise-2.3.0/wandb_promise/iterate_promise.py +12 -0
- wandb/vendor/promise-2.3.0/wandb_promise/promise.py +848 -0
- wandb/vendor/promise-2.3.0/wandb_promise/promise_list.py +151 -0
- wandb/vendor/promise-2.3.0/wandb_promise/pyutils/__init__.py +0 -0
- wandb/vendor/promise-2.3.0/wandb_promise/pyutils/version.py +83 -0
- wandb/vendor/promise-2.3.0/wandb_promise/schedulers/__init__.py +0 -0
- wandb/vendor/promise-2.3.0/wandb_promise/schedulers/asyncio.py +22 -0
- wandb/vendor/promise-2.3.0/wandb_promise/schedulers/gevent.py +21 -0
- wandb/vendor/promise-2.3.0/wandb_promise/schedulers/immediate.py +27 -0
- wandb/vendor/promise-2.3.0/wandb_promise/schedulers/thread.py +18 -0
- wandb/vendor/promise-2.3.0/wandb_promise/utils.py +56 -0
- wandb/vendor/pygments/__init__.py +90 -0
- wandb/vendor/pygments/cmdline.py +568 -0
- wandb/vendor/pygments/console.py +74 -0
- wandb/vendor/pygments/filter.py +74 -0
- wandb/vendor/pygments/filters/__init__.py +350 -0
- wandb/vendor/pygments/formatter.py +95 -0
- wandb/vendor/pygments/formatters/__init__.py +153 -0
- wandb/vendor/pygments/formatters/_mapping.py +85 -0
- wandb/vendor/pygments/formatters/bbcode.py +109 -0
- wandb/vendor/pygments/formatters/html.py +851 -0
- wandb/vendor/pygments/formatters/img.py +600 -0
- wandb/vendor/pygments/formatters/irc.py +182 -0
- wandb/vendor/pygments/formatters/latex.py +482 -0
- wandb/vendor/pygments/formatters/other.py +160 -0
- wandb/vendor/pygments/formatters/rtf.py +147 -0
- wandb/vendor/pygments/formatters/svg.py +153 -0
- wandb/vendor/pygments/formatters/terminal.py +136 -0
- wandb/vendor/pygments/formatters/terminal256.py +309 -0
- wandb/vendor/pygments/lexer.py +871 -0
- wandb/vendor/pygments/lexers/__init__.py +329 -0
- wandb/vendor/pygments/lexers/_asy_builtins.py +1645 -0
- wandb/vendor/pygments/lexers/_cl_builtins.py +232 -0
- wandb/vendor/pygments/lexers/_cocoa_builtins.py +72 -0
- wandb/vendor/pygments/lexers/_csound_builtins.py +1346 -0
- wandb/vendor/pygments/lexers/_lasso_builtins.py +5327 -0
- wandb/vendor/pygments/lexers/_lua_builtins.py +295 -0
- wandb/vendor/pygments/lexers/_mapping.py +500 -0
- wandb/vendor/pygments/lexers/_mql_builtins.py +1172 -0
- wandb/vendor/pygments/lexers/_openedge_builtins.py +2547 -0
- wandb/vendor/pygments/lexers/_php_builtins.py +4756 -0
- wandb/vendor/pygments/lexers/_postgres_builtins.py +621 -0
- wandb/vendor/pygments/lexers/_scilab_builtins.py +3094 -0
- wandb/vendor/pygments/lexers/_sourcemod_builtins.py +1163 -0
- wandb/vendor/pygments/lexers/_stan_builtins.py +532 -0
- wandb/vendor/pygments/lexers/_stata_builtins.py +419 -0
- wandb/vendor/pygments/lexers/_tsql_builtins.py +1004 -0
- wandb/vendor/pygments/lexers/_vim_builtins.py +1939 -0
- wandb/vendor/pygments/lexers/actionscript.py +240 -0
- wandb/vendor/pygments/lexers/agile.py +24 -0
- wandb/vendor/pygments/lexers/algebra.py +221 -0
- wandb/vendor/pygments/lexers/ambient.py +76 -0
- wandb/vendor/pygments/lexers/ampl.py +87 -0
- wandb/vendor/pygments/lexers/apl.py +101 -0
- wandb/vendor/pygments/lexers/archetype.py +318 -0
- wandb/vendor/pygments/lexers/asm.py +641 -0
- wandb/vendor/pygments/lexers/automation.py +374 -0
- wandb/vendor/pygments/lexers/basic.py +500 -0
- wandb/vendor/pygments/lexers/bibtex.py +160 -0
- wandb/vendor/pygments/lexers/business.py +612 -0
- wandb/vendor/pygments/lexers/c_cpp.py +252 -0
- wandb/vendor/pygments/lexers/c_like.py +541 -0
- wandb/vendor/pygments/lexers/capnproto.py +78 -0
- wandb/vendor/pygments/lexers/chapel.py +102 -0
- wandb/vendor/pygments/lexers/clean.py +288 -0
- wandb/vendor/pygments/lexers/compiled.py +34 -0
- wandb/vendor/pygments/lexers/configs.py +833 -0
- wandb/vendor/pygments/lexers/console.py +114 -0
- wandb/vendor/pygments/lexers/crystal.py +393 -0
- wandb/vendor/pygments/lexers/csound.py +366 -0
- wandb/vendor/pygments/lexers/css.py +689 -0
- wandb/vendor/pygments/lexers/d.py +251 -0
- wandb/vendor/pygments/lexers/dalvik.py +125 -0
- wandb/vendor/pygments/lexers/data.py +555 -0
- wandb/vendor/pygments/lexers/diff.py +165 -0
- wandb/vendor/pygments/lexers/dotnet.py +691 -0
- wandb/vendor/pygments/lexers/dsls.py +878 -0
- wandb/vendor/pygments/lexers/dylan.py +289 -0
- wandb/vendor/pygments/lexers/ecl.py +125 -0
- wandb/vendor/pygments/lexers/eiffel.py +65 -0
- wandb/vendor/pygments/lexers/elm.py +121 -0
- wandb/vendor/pygments/lexers/erlang.py +533 -0
- wandb/vendor/pygments/lexers/esoteric.py +277 -0
- wandb/vendor/pygments/lexers/ezhil.py +69 -0
- wandb/vendor/pygments/lexers/factor.py +344 -0
- wandb/vendor/pygments/lexers/fantom.py +250 -0
- wandb/vendor/pygments/lexers/felix.py +273 -0
- wandb/vendor/pygments/lexers/forth.py +177 -0
- wandb/vendor/pygments/lexers/fortran.py +205 -0
- wandb/vendor/pygments/lexers/foxpro.py +428 -0
- wandb/vendor/pygments/lexers/functional.py +21 -0
- wandb/vendor/pygments/lexers/go.py +101 -0
- wandb/vendor/pygments/lexers/grammar_notation.py +213 -0
- wandb/vendor/pygments/lexers/graph.py +80 -0
- wandb/vendor/pygments/lexers/graphics.py +553 -0
- wandb/vendor/pygments/lexers/haskell.py +843 -0
- wandb/vendor/pygments/lexers/haxe.py +936 -0
- wandb/vendor/pygments/lexers/hdl.py +382 -0
- wandb/vendor/pygments/lexers/hexdump.py +103 -0
- wandb/vendor/pygments/lexers/html.py +602 -0
- wandb/vendor/pygments/lexers/idl.py +270 -0
- wandb/vendor/pygments/lexers/igor.py +288 -0
- wandb/vendor/pygments/lexers/inferno.py +96 -0
- wandb/vendor/pygments/lexers/installers.py +322 -0
- wandb/vendor/pygments/lexers/int_fiction.py +1343 -0
- wandb/vendor/pygments/lexers/iolang.py +63 -0
- wandb/vendor/pygments/lexers/j.py +146 -0
- wandb/vendor/pygments/lexers/javascript.py +1525 -0
- wandb/vendor/pygments/lexers/julia.py +333 -0
- wandb/vendor/pygments/lexers/jvm.py +1573 -0
- wandb/vendor/pygments/lexers/lisp.py +2621 -0
- wandb/vendor/pygments/lexers/make.py +202 -0
- wandb/vendor/pygments/lexers/markup.py +595 -0
- wandb/vendor/pygments/lexers/math.py +21 -0
- wandb/vendor/pygments/lexers/matlab.py +663 -0
- wandb/vendor/pygments/lexers/ml.py +769 -0
- wandb/vendor/pygments/lexers/modeling.py +358 -0
- wandb/vendor/pygments/lexers/modula2.py +1561 -0
- wandb/vendor/pygments/lexers/monte.py +204 -0
- wandb/vendor/pygments/lexers/ncl.py +894 -0
- wandb/vendor/pygments/lexers/nimrod.py +159 -0
- wandb/vendor/pygments/lexers/nit.py +64 -0
- wandb/vendor/pygments/lexers/nix.py +136 -0
- wandb/vendor/pygments/lexers/oberon.py +105 -0
- wandb/vendor/pygments/lexers/objective.py +504 -0
- wandb/vendor/pygments/lexers/ooc.py +85 -0
- wandb/vendor/pygments/lexers/other.py +41 -0
- wandb/vendor/pygments/lexers/parasail.py +79 -0
- wandb/vendor/pygments/lexers/parsers.py +835 -0
- wandb/vendor/pygments/lexers/pascal.py +644 -0
- wandb/vendor/pygments/lexers/pawn.py +199 -0
- wandb/vendor/pygments/lexers/perl.py +620 -0
- wandb/vendor/pygments/lexers/php.py +267 -0
- wandb/vendor/pygments/lexers/praat.py +294 -0
- wandb/vendor/pygments/lexers/prolog.py +306 -0
- wandb/vendor/pygments/lexers/python.py +939 -0
- wandb/vendor/pygments/lexers/qvt.py +152 -0
- wandb/vendor/pygments/lexers/r.py +453 -0
- wandb/vendor/pygments/lexers/rdf.py +270 -0
- wandb/vendor/pygments/lexers/rebol.py +431 -0
- wandb/vendor/pygments/lexers/resource.py +85 -0
- wandb/vendor/pygments/lexers/rnc.py +67 -0
- wandb/vendor/pygments/lexers/roboconf.py +82 -0
- wandb/vendor/pygments/lexers/robotframework.py +560 -0
- wandb/vendor/pygments/lexers/ruby.py +519 -0
- wandb/vendor/pygments/lexers/rust.py +220 -0
- wandb/vendor/pygments/lexers/sas.py +228 -0
- wandb/vendor/pygments/lexers/scripting.py +1222 -0
- wandb/vendor/pygments/lexers/shell.py +794 -0
- wandb/vendor/pygments/lexers/smalltalk.py +195 -0
- wandb/vendor/pygments/lexers/smv.py +79 -0
- wandb/vendor/pygments/lexers/snobol.py +83 -0
- wandb/vendor/pygments/lexers/special.py +103 -0
- wandb/vendor/pygments/lexers/sql.py +681 -0
- wandb/vendor/pygments/lexers/stata.py +108 -0
- wandb/vendor/pygments/lexers/supercollider.py +90 -0
- wandb/vendor/pygments/lexers/tcl.py +145 -0
- wandb/vendor/pygments/lexers/templates.py +2283 -0
- wandb/vendor/pygments/lexers/testing.py +207 -0
- wandb/vendor/pygments/lexers/text.py +25 -0
- wandb/vendor/pygments/lexers/textedit.py +169 -0
- wandb/vendor/pygments/lexers/textfmts.py +297 -0
- wandb/vendor/pygments/lexers/theorem.py +458 -0
- wandb/vendor/pygments/lexers/trafficscript.py +54 -0
- wandb/vendor/pygments/lexers/typoscript.py +226 -0
- wandb/vendor/pygments/lexers/urbi.py +133 -0
- wandb/vendor/pygments/lexers/varnish.py +190 -0
- wandb/vendor/pygments/lexers/verification.py +111 -0
- wandb/vendor/pygments/lexers/web.py +24 -0
- wandb/vendor/pygments/lexers/webmisc.py +988 -0
- wandb/vendor/pygments/lexers/whiley.py +116 -0
- wandb/vendor/pygments/lexers/x10.py +69 -0
- wandb/vendor/pygments/modeline.py +44 -0
- wandb/vendor/pygments/plugin.py +68 -0
- wandb/vendor/pygments/regexopt.py +92 -0
- wandb/vendor/pygments/scanner.py +105 -0
- wandb/vendor/pygments/sphinxext.py +158 -0
- wandb/vendor/pygments/style.py +155 -0
- wandb/vendor/pygments/styles/__init__.py +80 -0
- wandb/vendor/pygments/styles/abap.py +29 -0
- wandb/vendor/pygments/styles/algol.py +63 -0
- wandb/vendor/pygments/styles/algol_nu.py +63 -0
- wandb/vendor/pygments/styles/arduino.py +98 -0
- wandb/vendor/pygments/styles/autumn.py +65 -0
- wandb/vendor/pygments/styles/borland.py +51 -0
- wandb/vendor/pygments/styles/bw.py +49 -0
- wandb/vendor/pygments/styles/colorful.py +81 -0
- wandb/vendor/pygments/styles/default.py +73 -0
- wandb/vendor/pygments/styles/emacs.py +72 -0
- wandb/vendor/pygments/styles/friendly.py +72 -0
- wandb/vendor/pygments/styles/fruity.py +42 -0
- wandb/vendor/pygments/styles/igor.py +29 -0
- wandb/vendor/pygments/styles/lovelace.py +97 -0
- wandb/vendor/pygments/styles/manni.py +75 -0
- wandb/vendor/pygments/styles/monokai.py +106 -0
- wandb/vendor/pygments/styles/murphy.py +80 -0
- wandb/vendor/pygments/styles/native.py +65 -0
- wandb/vendor/pygments/styles/paraiso_dark.py +125 -0
- wandb/vendor/pygments/styles/paraiso_light.py +125 -0
- wandb/vendor/pygments/styles/pastie.py +75 -0
- wandb/vendor/pygments/styles/perldoc.py +69 -0
- wandb/vendor/pygments/styles/rainbow_dash.py +89 -0
- wandb/vendor/pygments/styles/rrt.py +33 -0
- wandb/vendor/pygments/styles/sas.py +44 -0
- wandb/vendor/pygments/styles/stata.py +40 -0
- wandb/vendor/pygments/styles/tango.py +141 -0
- wandb/vendor/pygments/styles/trac.py +63 -0
- wandb/vendor/pygments/styles/vim.py +63 -0
- wandb/vendor/pygments/styles/vs.py +38 -0
- wandb/vendor/pygments/styles/xcode.py +51 -0
- wandb/vendor/pygments/token.py +213 -0
- wandb/vendor/pygments/unistring.py +217 -0
- wandb/vendor/pygments/util.py +388 -0
- wandb/vendor/watchdog_0_9_0/wandb_watchdog/__init__.py +17 -0
- wandb/vendor/watchdog_0_9_0/wandb_watchdog/events.py +615 -0
- wandb/vendor/watchdog_0_9_0/wandb_watchdog/observers/__init__.py +98 -0
- wandb/vendor/watchdog_0_9_0/wandb_watchdog/observers/api.py +369 -0
- wandb/vendor/watchdog_0_9_0/wandb_watchdog/observers/fsevents.py +172 -0
- wandb/vendor/watchdog_0_9_0/wandb_watchdog/observers/fsevents2.py +239 -0
- wandb/vendor/watchdog_0_9_0/wandb_watchdog/observers/inotify.py +218 -0
- wandb/vendor/watchdog_0_9_0/wandb_watchdog/observers/inotify_buffer.py +81 -0
- wandb/vendor/watchdog_0_9_0/wandb_watchdog/observers/inotify_c.py +575 -0
- wandb/vendor/watchdog_0_9_0/wandb_watchdog/observers/kqueue.py +730 -0
- wandb/vendor/watchdog_0_9_0/wandb_watchdog/observers/polling.py +145 -0
- wandb/vendor/watchdog_0_9_0/wandb_watchdog/observers/read_directory_changes.py +133 -0
- wandb/vendor/watchdog_0_9_0/wandb_watchdog/observers/winapi.py +348 -0
- wandb/vendor/watchdog_0_9_0/wandb_watchdog/patterns.py +265 -0
- wandb/vendor/watchdog_0_9_0/wandb_watchdog/tricks/__init__.py +174 -0
- wandb/vendor/watchdog_0_9_0/wandb_watchdog/utils/__init__.py +151 -0
- wandb/vendor/watchdog_0_9_0/wandb_watchdog/utils/bricks.py +249 -0
- wandb/vendor/watchdog_0_9_0/wandb_watchdog/utils/compat.py +29 -0
- wandb/vendor/watchdog_0_9_0/wandb_watchdog/utils/decorators.py +198 -0
- wandb/vendor/watchdog_0_9_0/wandb_watchdog/utils/delayed_queue.py +88 -0
- wandb/vendor/watchdog_0_9_0/wandb_watchdog/utils/dirsnapshot.py +293 -0
- wandb/vendor/watchdog_0_9_0/wandb_watchdog/utils/echo.py +157 -0
- wandb/vendor/watchdog_0_9_0/wandb_watchdog/utils/event_backport.py +41 -0
- wandb/vendor/watchdog_0_9_0/wandb_watchdog/utils/importlib2.py +40 -0
- wandb/vendor/watchdog_0_9_0/wandb_watchdog/utils/platform.py +57 -0
- wandb/vendor/watchdog_0_9_0/wandb_watchdog/utils/unicode_paths.py +64 -0
- wandb/vendor/watchdog_0_9_0/wandb_watchdog/utils/win32stat.py +123 -0
- wandb/vendor/watchdog_0_9_0/wandb_watchdog/version.py +28 -0
- wandb/vendor/watchdog_0_9_0/wandb_watchdog/watchmedo.py +577 -0
- wandb/wandb_agent.py +611 -0
- wandb/wandb_controller.py +719 -0
- wandb/wandb_run.py +8 -0
- wandb-0.22.1.dist-info/METADATA +223 -0
- wandb-0.22.1.dist-info/RECORD +919 -0
- wandb-0.22.1.dist-info/WHEEL +4 -0
- wandb-0.22.1.dist-info/entry_points.txt +3 -0
- wandb-0.22.1.dist-info/licenses/LICENSE +21 -0
wandb/__main__.py
ADDED
wandb/_analytics.py
ADDED
@@ -0,0 +1,65 @@
|
|
1
|
+
from __future__ import annotations
|
2
|
+
|
3
|
+
from contextvars import ContextVar
|
4
|
+
from dataclasses import dataclass, field
|
5
|
+
from functools import wraps
|
6
|
+
from typing import Callable, Final, TypeVar
|
7
|
+
from uuid import UUID, uuid4
|
8
|
+
|
9
|
+
from typing_extensions import ParamSpec
|
10
|
+
|
11
|
+
from wandb._strutils import nameof
|
12
|
+
|
13
|
+
P = ParamSpec("P")
|
14
|
+
R = TypeVar("R")
|
15
|
+
|
16
|
+
# Header keys for tracking the calling function
|
17
|
+
X_WANDB_PYTHON_FUNC: Final[str] = "X-Wandb-Python-Func"
|
18
|
+
X_WANDB_PYTHON_CALL_ID: Final[str] = "X-Wandb-Python-Call-Id"
|
19
|
+
|
20
|
+
|
21
|
+
@dataclass(frozen=True)
|
22
|
+
class TrackedFuncInfo:
|
23
|
+
func: str
|
24
|
+
"""The fully qualified namespace of the tracked function."""
|
25
|
+
|
26
|
+
call_id: UUID = field(default_factory=uuid4)
|
27
|
+
"""A unique identifier assigned to each invocation."""
|
28
|
+
|
29
|
+
def to_headers(self) -> dict[str, str]:
|
30
|
+
return {
|
31
|
+
X_WANDB_PYTHON_FUNC: self.func,
|
32
|
+
X_WANDB_PYTHON_CALL_ID: str(self.call_id),
|
33
|
+
}
|
34
|
+
|
35
|
+
|
36
|
+
_current_func: ContextVar[TrackedFuncInfo] = ContextVar("_current_func")
|
37
|
+
"""An internal, threadsafe context variable to hold the current function being tracked."""
|
38
|
+
|
39
|
+
|
40
|
+
def tracked(func: Callable[P, R]) -> Callable[P, R]:
|
41
|
+
"""A decorator to inject the calling function name into any GraphQL request headers.
|
42
|
+
|
43
|
+
If a tracked function calls another tracked function, only the outermost function in
|
44
|
+
the call stack will be tracked.
|
45
|
+
"""
|
46
|
+
func_namespace = f"{func.__module__}.{nameof(func)}"
|
47
|
+
|
48
|
+
@wraps(func)
|
49
|
+
def wrapper(*args: P.args, **kwargs: P.kwargs) -> R:
|
50
|
+
# Don't override the current tracked function if it's already set
|
51
|
+
if tracked_func():
|
52
|
+
return func(*args, **kwargs)
|
53
|
+
|
54
|
+
token = _current_func.set(TrackedFuncInfo(func=func_namespace))
|
55
|
+
try:
|
56
|
+
return func(*args, **kwargs)
|
57
|
+
finally:
|
58
|
+
_current_func.reset(token)
|
59
|
+
|
60
|
+
return wrapper
|
61
|
+
|
62
|
+
|
63
|
+
def tracked_func() -> TrackedFuncInfo | None:
|
64
|
+
"""Returns info on the current tracked function, if any, otherwise None."""
|
65
|
+
return _current_func.get(None)
|
wandb/_iterutils.py
ADDED
@@ -0,0 +1,73 @@
|
|
1
|
+
from __future__ import annotations
|
2
|
+
|
3
|
+
from collections.abc import Hashable
|
4
|
+
from typing import TYPE_CHECKING, Any, Iterable, TypeVar, Union, overload
|
5
|
+
|
6
|
+
if TYPE_CHECKING:
|
7
|
+
T = TypeVar("T")
|
8
|
+
HashableT = TypeVar("HashableT", bound=Hashable)
|
9
|
+
ClassInfo = Union[type[T], tuple[type[T], ...]]
|
10
|
+
|
11
|
+
|
12
|
+
@overload
|
13
|
+
def always_list(obj: Iterable[T], base_type: ClassInfo = ...) -> list[T]: ...
|
14
|
+
@overload
|
15
|
+
def always_list(obj: T, base_type: ClassInfo = ...) -> list[T]: ...
|
16
|
+
def always_list(obj: Any, base_type: Any = (str, bytes)) -> list[T]:
|
17
|
+
"""Return a guaranteed list of objects from a single instance OR iterable of such objects.
|
18
|
+
|
19
|
+
By default, assume the returned list should have string-like elements (i.e. `str`/`bytes`).
|
20
|
+
|
21
|
+
Adapted from `more_itertools.always_iterable`, but simplified for internal use. See:
|
22
|
+
https://more-itertools.readthedocs.io/en/stable/api.html#more_itertools.always_iterable
|
23
|
+
"""
|
24
|
+
return [obj] if isinstance(obj, base_type) else list(obj)
|
25
|
+
|
26
|
+
|
27
|
+
def unique_list(iterable: Iterable[HashableT]) -> list[HashableT]:
|
28
|
+
"""Return a deduplicated list of items from the given iterable, preserving order."""
|
29
|
+
# Trick for O(1) uniqueness check that maintains order
|
30
|
+
return list(dict.fromkeys(iterable))
|
31
|
+
|
32
|
+
|
33
|
+
def one(
|
34
|
+
iterable: Iterable[T],
|
35
|
+
too_short: type[Exception] | Exception | None = None,
|
36
|
+
too_long: type[Exception] | Exception | None = None,
|
37
|
+
) -> T:
|
38
|
+
"""Return the only item in the iterable.
|
39
|
+
|
40
|
+
Note:
|
41
|
+
This is intended **only** as an internal helper/convenience function,
|
42
|
+
and its implementation is directly adapted from `more_itertools.one`.
|
43
|
+
Users needing similar functionality are strongly encouraged to use
|
44
|
+
that library instead:
|
45
|
+
https://more-itertools.readthedocs.io/en/stable/api.html#more_itertools.one
|
46
|
+
|
47
|
+
Args:
|
48
|
+
iterable: The iterable to get the only item from.
|
49
|
+
too_short: Custom exception to raise if the iterable has no items.
|
50
|
+
too_long: Custom exception to raise if the iterable has multiple items.
|
51
|
+
|
52
|
+
Raises:
|
53
|
+
ValueError or `too_short`: If the iterable has no items.
|
54
|
+
ValueError or `too_long`: If the iterable has multiple items.
|
55
|
+
"""
|
56
|
+
# For a general iterable, avoid inadvertently iterating through all values,
|
57
|
+
# which may be costly or impossible (e.g. if infinite). Only check that:
|
58
|
+
|
59
|
+
# ... the first item exists
|
60
|
+
it = iter(iterable)
|
61
|
+
try:
|
62
|
+
obj = next(it)
|
63
|
+
except StopIteration:
|
64
|
+
raise (too_short or ValueError("Expected 1 item in iterable, got 0")) from None
|
65
|
+
|
66
|
+
# ...the second item doesn't
|
67
|
+
try:
|
68
|
+
_ = next(it)
|
69
|
+
except StopIteration:
|
70
|
+
return obj
|
71
|
+
raise (
|
72
|
+
too_long or ValueError("Expected 1 item in iterable, got multiple")
|
73
|
+
) from None
|
@@ -0,0 +1,30 @@
|
|
1
|
+
"""Internal utilities for working with pydantic."""
|
2
|
+
|
3
|
+
__all__ = [
|
4
|
+
"IS_PYDANTIC_V2",
|
5
|
+
"CompatBaseModel",
|
6
|
+
"JsonableModel",
|
7
|
+
"GQLBase",
|
8
|
+
"Typename",
|
9
|
+
"GQLId",
|
10
|
+
"AliasChoices",
|
11
|
+
"computed_field",
|
12
|
+
"field_validator",
|
13
|
+
"model_validator",
|
14
|
+
"pydantic_isinstance",
|
15
|
+
"to_camel",
|
16
|
+
"to_json",
|
17
|
+
"from_json",
|
18
|
+
"gql_typename",
|
19
|
+
]
|
20
|
+
|
21
|
+
from .base import CompatBaseModel, GQLBase, JsonableModel
|
22
|
+
from .field_types import GQLId, Typename
|
23
|
+
from .utils import IS_PYDANTIC_V2, from_json, gql_typename, pydantic_isinstance, to_json
|
24
|
+
from .v1_compat import (
|
25
|
+
AliasChoices,
|
26
|
+
computed_field,
|
27
|
+
field_validator,
|
28
|
+
model_validator,
|
29
|
+
to_camel,
|
30
|
+
)
|
wandb/_pydantic/base.py
ADDED
@@ -0,0 +1,108 @@
|
|
1
|
+
"""Base classes and other customizations for generated pydantic types."""
|
2
|
+
|
3
|
+
from __future__ import annotations
|
4
|
+
|
5
|
+
from abc import ABC
|
6
|
+
from typing import TYPE_CHECKING, Any, Callable, ClassVar, Literal
|
7
|
+
|
8
|
+
from pydantic import BaseModel, ConfigDict
|
9
|
+
from typing_extensions import TypedDict, Unpack, override
|
10
|
+
|
11
|
+
from .v1_compat import PydanticCompatMixin
|
12
|
+
|
13
|
+
if TYPE_CHECKING:
|
14
|
+
from pydantic.main import IncEx
|
15
|
+
|
16
|
+
|
17
|
+
class ModelDumpKwargs(TypedDict, total=False):
|
18
|
+
"""Shared keyword arguments for `BaseModel.model_{dump,dump_json}`."""
|
19
|
+
|
20
|
+
include: IncEx | None
|
21
|
+
exclude: IncEx | None
|
22
|
+
context: dict[str, Any] | None
|
23
|
+
by_alias: bool | None
|
24
|
+
exclude_unset: bool
|
25
|
+
exclude_defaults: bool
|
26
|
+
exclude_none: bool
|
27
|
+
round_trip: bool
|
28
|
+
warnings: bool | Literal["none", "warn", "error"]
|
29
|
+
fallback: Callable[[Any], Any] | None
|
30
|
+
serialize_as_any: bool
|
31
|
+
|
32
|
+
|
33
|
+
# ---------------------------------------------------------------------------
|
34
|
+
# Base models and mixin classes.
|
35
|
+
#
|
36
|
+
# Extra info is provided for devs in inline comments, NOT docstrings. This
|
37
|
+
# prevents it from showing up in generated docs for subclasses.
|
38
|
+
|
39
|
+
|
40
|
+
# FOR INTERNAL USE ONLY: v1-compatible drop-in replacement for `pydantic.BaseModel`.
|
41
|
+
# If pydantic v2 is detected, this is just `pydantic.BaseModel`.
|
42
|
+
#
|
43
|
+
# Deliberately inherits ALL default configuration from `pydantic.BaseModel`.
|
44
|
+
class CompatBaseModel(PydanticCompatMixin, BaseModel):
|
45
|
+
__doc__ = None # Prevent subclasses from inheriting the BaseModel docstring
|
46
|
+
|
47
|
+
|
48
|
+
class JsonableModel(CompatBaseModel, ABC):
|
49
|
+
# Base class with sensible default behavior for classes that need to convert to/from JSON.
|
50
|
+
#
|
51
|
+
# Automatically parse/serialize "raw" API data (e.g. automatically convert to/from camelCase keys):
|
52
|
+
# - `.model_{dump,dump_json}()` should return "JSON-ready" dicts or JSON strings
|
53
|
+
# - `.model_{validate,validate_json}()` should accept "JSON-ready" dicts or JSON strings
|
54
|
+
#
|
55
|
+
# Ensure round-trip serialization <-> deserialization between:
|
56
|
+
# - `model_dump()` <-> `model_validate()`
|
57
|
+
# - `model_dump_json()` <-> `model_validate_json()`
|
58
|
+
#
|
59
|
+
# These behaviors are useful for models that need to predictably handle e.g. GraphQL request/response data.
|
60
|
+
|
61
|
+
model_config = ConfigDict(
|
62
|
+
# ---------------------------------------------------------------------------
|
63
|
+
# Discouraged in v2.11+, deprecated in v3. Kept here for compatibility.
|
64
|
+
populate_by_name=True,
|
65
|
+
# ---------------------------------------------------------------------------
|
66
|
+
# Introduced in v2.11, ignored in earlier versions
|
67
|
+
validate_by_name=True,
|
68
|
+
validate_by_alias=True,
|
69
|
+
serialize_by_alias=True,
|
70
|
+
# ---------------------------------------------------------------------------
|
71
|
+
validate_assignment=True,
|
72
|
+
use_attribute_docstrings=True,
|
73
|
+
from_attributes=True,
|
74
|
+
)
|
75
|
+
|
76
|
+
# Custom defaults keyword args for `JsonableModel.model_{dump,dump_json}`:
|
77
|
+
# - by_alias: Convert keys to JSON-ready names and objects to JSON-ready dicts.
|
78
|
+
# - round_trip: Ensure round-trippable result
|
79
|
+
__DUMP_DEFAULTS: ClassVar[ModelDumpKwargs] = dict(by_alias=True, round_trip=True)
|
80
|
+
|
81
|
+
@override
|
82
|
+
def model_dump(
|
83
|
+
self,
|
84
|
+
*,
|
85
|
+
mode: Literal["json", "python"] | str = "json", # NOTE: changed default
|
86
|
+
**kwargs: Unpack[ModelDumpKwargs],
|
87
|
+
) -> dict[str, Any]:
|
88
|
+
kwargs = {**self.__DUMP_DEFAULTS, **kwargs} # allows overrides, if needed
|
89
|
+
return super().model_dump(mode=mode, **kwargs)
|
90
|
+
|
91
|
+
@override
|
92
|
+
def model_dump_json(
|
93
|
+
self,
|
94
|
+
*,
|
95
|
+
indent: int | None = None,
|
96
|
+
**kwargs: Unpack[ModelDumpKwargs],
|
97
|
+
) -> str:
|
98
|
+
kwargs = {**self.__DUMP_DEFAULTS, **kwargs} # allows overrides, if needed
|
99
|
+
return super().model_dump_json(indent=indent, **kwargs)
|
100
|
+
|
101
|
+
|
102
|
+
# Base class for all GraphQL-generated types.
|
103
|
+
class GQLBase(JsonableModel, ABC):
|
104
|
+
model_config = ConfigDict(
|
105
|
+
validate_default=True,
|
106
|
+
revalidate_instances="always",
|
107
|
+
protected_namespaces=(), # Some GraphQL fields may begin with "model_"
|
108
|
+
)
|
@@ -0,0 +1,29 @@
|
|
1
|
+
"""Reusable field types and annotations for pydantic fields."""
|
2
|
+
|
3
|
+
from __future__ import annotations
|
4
|
+
|
5
|
+
from typing import TYPE_CHECKING, TypeVar
|
6
|
+
|
7
|
+
from pydantic import Field, StrictStr
|
8
|
+
from typing_extensions import Annotated
|
9
|
+
|
10
|
+
from .utils import IS_PYDANTIC_V2
|
11
|
+
|
12
|
+
T = TypeVar("T")
|
13
|
+
|
14
|
+
|
15
|
+
#: GraphQL `__typename` fields
|
16
|
+
Typename = Annotated[T, Field(repr=False, frozen=True, alias="__typename")]
|
17
|
+
|
18
|
+
|
19
|
+
if IS_PYDANTIC_V2 or TYPE_CHECKING:
|
20
|
+
GQLId = Annotated[StrictStr, Field(repr=False, frozen=True)]
|
21
|
+
|
22
|
+
else:
|
23
|
+
# FIXME: Find a way to fix this for pydantic v1, which doesn't like when
|
24
|
+
# `Field(...)` used in the field assignment AND `Annotated[...]`.
|
25
|
+
# This is a problem for codegen, which can currently output e.g.
|
26
|
+
#
|
27
|
+
# class MyModel(GQLBase):
|
28
|
+
# my_id: GQLId = Field(alias="myID")
|
29
|
+
GQLId = StrictStr # type: ignore[misc]
|
wandb/_pydantic/utils.py
ADDED
@@ -0,0 +1,80 @@
|
|
1
|
+
"""Internal utilities for working with Pydantic types and data."""
|
2
|
+
|
3
|
+
from __future__ import annotations
|
4
|
+
|
5
|
+
import json
|
6
|
+
import sys
|
7
|
+
from contextlib import suppress
|
8
|
+
from typing import Any, Type
|
9
|
+
|
10
|
+
import pydantic
|
11
|
+
from pydantic import BaseModel, ValidationError
|
12
|
+
from typing_extensions import TypeAlias
|
13
|
+
|
14
|
+
PYTHON_VERSION = sys.version_info
|
15
|
+
|
16
|
+
pydantic_major, *_ = pydantic.VERSION.split(".")
|
17
|
+
IS_PYDANTIC_V2: bool = int(pydantic_major) >= 2
|
18
|
+
|
19
|
+
|
20
|
+
BaseModelType: TypeAlias = Type[BaseModel]
|
21
|
+
|
22
|
+
|
23
|
+
def gql_typename(cls: type[BaseModel]) -> str:
|
24
|
+
"""Get the GraphQL typename for a Pydantic model."""
|
25
|
+
if (field := cls.model_fields.get("typename__")) and (typename := field.default):
|
26
|
+
return typename
|
27
|
+
raise TypeError(f"Cannot extract GraphQL typename from: {cls.__qualname__!r}.")
|
28
|
+
|
29
|
+
|
30
|
+
if IS_PYDANTIC_V2:
|
31
|
+
import pydantic_core # pydantic_core is only installed by pydantic v2
|
32
|
+
|
33
|
+
def from_json(s: str) -> Any:
|
34
|
+
"""Quickly deserialize a JSON string to a Python object."""
|
35
|
+
return pydantic_core.from_json(s)
|
36
|
+
|
37
|
+
def to_json(v: Any) -> str:
|
38
|
+
"""Quickly serialize a (possibly Pydantic) object to a JSON string."""
|
39
|
+
return pydantic_core.to_json(v, by_alias=True, round_trip=True).decode("utf-8")
|
40
|
+
|
41
|
+
def pydantic_isinstance(
|
42
|
+
v: Any, classinfo: BaseModelType | tuple[BaseModelType, ...]
|
43
|
+
) -> bool:
|
44
|
+
"""Return True if the object could be parsed into the given Pydantic type.
|
45
|
+
|
46
|
+
This is like a more lenient version of `isinstance()` for use with Pydantic.
|
47
|
+
In Pydantic v2, should be fast since the underlying implementation is in Rust,
|
48
|
+
and it may be preferable over `try:...except ValidationError:...`.
|
49
|
+
|
50
|
+
See: https://docs.pydantic.dev/latest/api/pydantic_core/#pydantic_core.SchemaValidator.isinstance_python
|
51
|
+
"""
|
52
|
+
if isinstance(classinfo, tuple):
|
53
|
+
return any(
|
54
|
+
cls.__pydantic_validator__.isinstance_python(v) for cls in classinfo
|
55
|
+
)
|
56
|
+
cls = classinfo
|
57
|
+
return cls.__pydantic_validator__.isinstance_python(v)
|
58
|
+
|
59
|
+
else:
|
60
|
+
# Pydantic v1 fallback implementations.
|
61
|
+
# These may be noticeably slower, but their primary goal is to ensure
|
62
|
+
# compatibility with Pydantic v1 so long as we need to support it.
|
63
|
+
|
64
|
+
from pydantic.json import pydantic_encoder # Only valid in pydantic v1
|
65
|
+
|
66
|
+
def from_json(s: str) -> Any:
|
67
|
+
return json.loads(s)
|
68
|
+
|
69
|
+
def to_json(v: Any) -> str:
|
70
|
+
return json.dumps(v, default=pydantic_encoder)
|
71
|
+
|
72
|
+
def pydantic_isinstance(
|
73
|
+
v: Any, classinfo: BaseModelType | tuple[BaseModelType, ...]
|
74
|
+
) -> bool:
|
75
|
+
classes = classinfo if isinstance(classinfo, tuple) else (classinfo,)
|
76
|
+
for cls in classes:
|
77
|
+
with suppress(ValidationError):
|
78
|
+
cls.model_validate(v)
|
79
|
+
return True
|
80
|
+
return False
|
@@ -0,0 +1,301 @@
|
|
1
|
+
"""Provides partial support for compatibility with Pydantic v1."""
|
2
|
+
|
3
|
+
from __future__ import annotations
|
4
|
+
|
5
|
+
import json
|
6
|
+
from functools import lru_cache
|
7
|
+
from inspect import signature
|
8
|
+
from operator import attrgetter
|
9
|
+
from typing import TYPE_CHECKING, Any, Callable, ClassVar, Literal, overload
|
10
|
+
|
11
|
+
import pydantic
|
12
|
+
|
13
|
+
from .utils import IS_PYDANTIC_V2, to_json
|
14
|
+
|
15
|
+
if TYPE_CHECKING:
|
16
|
+
from typing import Protocol
|
17
|
+
|
18
|
+
class V1Model(Protocol):
|
19
|
+
# ------------------------------------------------------------------------------
|
20
|
+
# NOTE: These aren't part of the original v1 BaseModel spec, but were added as
|
21
|
+
# internal helpers and are (re-)declared here to satisfy mypy checks.
|
22
|
+
@classmethod
|
23
|
+
def _dump_json_vals(cls, values: dict, by_alias: bool) -> dict: ...
|
24
|
+
|
25
|
+
# ------------------------------------------------------------------------------
|
26
|
+
# These methods are part of the original v1 BaseModel spec.
|
27
|
+
|
28
|
+
__config__: ClassVar[type]
|
29
|
+
__fields__: ClassVar[dict[str, Any]]
|
30
|
+
__fields_set__: set[str]
|
31
|
+
|
32
|
+
@classmethod
|
33
|
+
def update_forward_refs(cls, *args: Any, **kwargs: Any) -> None: ...
|
34
|
+
@classmethod
|
35
|
+
def construct(cls, *args: Any, **kwargs: Any) -> V1Model: ...
|
36
|
+
@classmethod
|
37
|
+
def parse_obj(cls, *args: Any, **kwargs: Any) -> V1Model: ...
|
38
|
+
@classmethod
|
39
|
+
def parse_raw(cls, *args: Any, **kwargs: Any) -> V1Model: ...
|
40
|
+
|
41
|
+
def dict(self, **kwargs: Any) -> dict[str, Any]: ...
|
42
|
+
def json(self, **kwargs: Any) -> str: ...
|
43
|
+
def copy(self, **kwargs: Any) -> V1Model: ...
|
44
|
+
|
45
|
+
|
46
|
+
# Maps {v2 -> v1} model config keys that were renamed in v2.
|
47
|
+
# See: https://docs.pydantic.dev/latest/migration/#changes-to-config
|
48
|
+
_V1_CONFIG_KEYS = {
|
49
|
+
"populate_by_name": "allow_population_by_field_name",
|
50
|
+
"str_to_lower": "anystr_lower",
|
51
|
+
"str_strip_whitespace": "anystr_strip_whitespace",
|
52
|
+
"str_to_upper": "anystr_upper",
|
53
|
+
"ignored_types": "keep_untouched",
|
54
|
+
"str_max_length": "max_anystr_length",
|
55
|
+
"str_min_length": "min_anystr_length",
|
56
|
+
"from_attributes": "orm_mode",
|
57
|
+
"json_schema_extra": "schema_extra",
|
58
|
+
"validate_default": "validate_all",
|
59
|
+
}
|
60
|
+
|
61
|
+
|
62
|
+
def convert_v2_config(v2_config: dict[str, Any]) -> dict[str, Any]:
|
63
|
+
"""Internal helper: Return a copy of the v2 ConfigDict with renamed v1 keys."""
|
64
|
+
return {
|
65
|
+
# Convert v2 config keys to v1 keys
|
66
|
+
**{_V1_CONFIG_KEYS.get(k, k): v for k, v in v2_config.items()},
|
67
|
+
# This is a v1-only config key. In v2, it no longer exists and is effectively always True.
|
68
|
+
"underscore_attrs_are_private": True,
|
69
|
+
}
|
70
|
+
|
71
|
+
|
72
|
+
@lru_cache(maxsize=None) # Reduce repeat introspection via `signature()`
|
73
|
+
def allowed_arg_names(func: Callable) -> set[str]:
|
74
|
+
"""Internal helper: Return the names of args accepted by the given function."""
|
75
|
+
return set(signature(func).parameters)
|
76
|
+
|
77
|
+
|
78
|
+
# Pydantic BaseModels are defined with a custom metaclass, but its namespace
|
79
|
+
# has changed between pydantic versions.
|
80
|
+
#
|
81
|
+
# In v1, it can be imported as `from pydantic.main import ModelMetaclass`
|
82
|
+
# In v2, it's defined in an internal module so we avoid directly importing it.
|
83
|
+
PydanticModelMetaclass: type = type(pydantic.BaseModel)
|
84
|
+
|
85
|
+
|
86
|
+
class V1MixinMetaclass(PydanticModelMetaclass):
|
87
|
+
def __new__(
|
88
|
+
cls,
|
89
|
+
name: str,
|
90
|
+
bases: tuple[type, ...],
|
91
|
+
namespace: dict[str, Any],
|
92
|
+
**kwargs: Any,
|
93
|
+
):
|
94
|
+
# In the class definition, convert the model config, if any:
|
95
|
+
# class MyModel(BaseModel): # BEFORE (v2)
|
96
|
+
# model_config = ConfigDict(populate_by_name=True)
|
97
|
+
#
|
98
|
+
# class MyModel(BaseModel): # AFTER (v1)
|
99
|
+
# class Config:
|
100
|
+
# allow_population_by_field_name = True
|
101
|
+
if config_dict := namespace.pop("model_config", None):
|
102
|
+
namespace["Config"] = type("Config", (), convert_v2_config(config_dict))
|
103
|
+
return super().__new__(cls, name, bases, namespace, **kwargs)
|
104
|
+
|
105
|
+
@property
|
106
|
+
def model_fields(self) -> dict[str, Any]:
|
107
|
+
return self.__fields__ # type: ignore[deprecated]
|
108
|
+
|
109
|
+
|
110
|
+
# Mixin to ensure compatibility of Pydantic models if Pydantic v1 is detected.
|
111
|
+
# These are "best effort" implementations and cannot guarantee complete
|
112
|
+
# compatibility in v1 environments.
|
113
|
+
#
|
114
|
+
# Whenever possible, users should strongly prefer upgrading to Pydantic v2 to
|
115
|
+
# ensure full compatibility.
|
116
|
+
class V1Mixin(metaclass=V1MixinMetaclass):
|
117
|
+
# Internal compat helpers
|
118
|
+
@classmethod
|
119
|
+
def _dump_json_vals(cls, values: dict[str, Any], by_alias: bool) -> dict[str, Any]:
|
120
|
+
"""Reserialize values from `Json`-typed fields after dumping the model to dict."""
|
121
|
+
# Get the expected keys (after `.model_dump()`) for `Json`-typed fields.
|
122
|
+
# Note: In v1, `Json` fields have `ModelField.parse_json == True`
|
123
|
+
json_fields = (f for f in cls.__fields__.values() if f.parse_json) # type: ignore[deprecated]
|
124
|
+
get_key = attrgetter("alias" if by_alias else "name")
|
125
|
+
json_field_keys = set(map(get_key, json_fields))
|
126
|
+
|
127
|
+
return {
|
128
|
+
# Only serialize `Json` fields with non-null values.
|
129
|
+
k: to_json(v) if ((v is not None) and (k in json_field_keys)) else v
|
130
|
+
for k, v in values.items()
|
131
|
+
}
|
132
|
+
|
133
|
+
# ------------------------------------------------------------------------------
|
134
|
+
@classmethod
|
135
|
+
def __try_update_forward_refs__(cls: type[V1Model], **localns: Any) -> None:
|
136
|
+
if hasattr(sup := super(), "__try_update_forward_refs__"):
|
137
|
+
sup.__try_update_forward_refs__(**localns)
|
138
|
+
|
139
|
+
@classmethod
|
140
|
+
def model_rebuild(cls, *args: Any, **kwargs: Any) -> None:
|
141
|
+
return cls.update_forward_refs(*args, **kwargs)
|
142
|
+
|
143
|
+
@classmethod
|
144
|
+
def model_construct(cls, *args: Any, **kwargs: Any) -> V1Model:
|
145
|
+
return cls.construct(*args, **kwargs)
|
146
|
+
|
147
|
+
@classmethod
|
148
|
+
def model_validate(cls, *args: Any, **kwargs: Any) -> V1Model:
|
149
|
+
return cls.parse_obj(*args, **kwargs)
|
150
|
+
|
151
|
+
@classmethod
|
152
|
+
def model_validate_json(cls, *args: Any, **kwargs: Any) -> V1Model:
|
153
|
+
return cls.parse_raw(*args, **kwargs)
|
154
|
+
|
155
|
+
def model_dump(self: V1Model, **kwargs: Any) -> dict[str, Any]:
|
156
|
+
# Pass only kwargs that are allowed in the V1 method.
|
157
|
+
allowed_keys = allowed_arg_names(self.dict) & kwargs.keys()
|
158
|
+
dict_ = self.dict(**{k: kwargs[k] for k in allowed_keys})
|
159
|
+
|
160
|
+
# Ugly hack: Try to serialize `Json` fields correctly when `round_trip=True` in pydantic v1
|
161
|
+
if kwargs.get("round_trip", False):
|
162
|
+
by_alias: bool = kwargs.get("by_alias", False)
|
163
|
+
return self._dump_json_vals(dict_, by_alias=by_alias)
|
164
|
+
|
165
|
+
return dict_
|
166
|
+
|
167
|
+
def model_dump_json(self: V1Model, **kwargs: Any) -> str:
|
168
|
+
# Pass only kwargs that are allowed in the V1 method.
|
169
|
+
allowed_keys = allowed_arg_names(self.json) & kwargs.keys()
|
170
|
+
json_ = self.json(**{k: kwargs[k] for k in allowed_keys})
|
171
|
+
|
172
|
+
# Ugly hack: Try to serialize `Json` fields correctly when `round_trip=True` in pydantic v1
|
173
|
+
if kwargs.get("round_trip", False):
|
174
|
+
by_alias: bool = kwargs.get("by_alias", False)
|
175
|
+
dict_ = json.loads(json_)
|
176
|
+
return json.dumps(self._dump_json_vals(dict_, by_alias=by_alias))
|
177
|
+
|
178
|
+
return json_
|
179
|
+
|
180
|
+
def model_copy(self: V1Model, **kwargs: Any) -> V1Model:
|
181
|
+
# Pass only kwargs that are allowed in the V1 method.
|
182
|
+
allowed_keys = allowed_arg_names(self.copy) & kwargs.keys()
|
183
|
+
return self.copy(**{k: kwargs[k] for k in allowed_keys})
|
184
|
+
|
185
|
+
@property
|
186
|
+
def model_fields_set(self: V1Model) -> set[str]:
|
187
|
+
return self.__fields_set__
|
188
|
+
|
189
|
+
|
190
|
+
# Placeholder. Pydantic v2 is already compatible with itself, so no need for extra mixins.
|
191
|
+
class V2Mixin:
|
192
|
+
pass
|
193
|
+
|
194
|
+
|
195
|
+
# Pick the mixin type based on the detected Pydantic version.
|
196
|
+
PydanticCompatMixin: type = V2Mixin if IS_PYDANTIC_V2 else V1Mixin
|
197
|
+
|
198
|
+
|
199
|
+
# ----------------------------------------------------------------------------
|
200
|
+
# Decorators and other pydantic helpers
|
201
|
+
# ----------------------------------------------------------------------------
|
202
|
+
if IS_PYDANTIC_V2:
|
203
|
+
from pydantic import alias_generators
|
204
|
+
|
205
|
+
# https://docs.pydantic.dev/latest/api/config/#pydantic.alias_generators.to_camel
|
206
|
+
to_camel = alias_generators.to_camel # e.g. "foo_bar" -> "fooBar"
|
207
|
+
|
208
|
+
# https://docs.pydantic.dev/latest/api/functional_validators/#pydantic.functional_validators.field_validator
|
209
|
+
field_validator = pydantic.field_validator
|
210
|
+
|
211
|
+
# https://docs.pydantic.dev/latest/api/functional_validators/#pydantic.functional_validators.model_validator
|
212
|
+
model_validator = pydantic.model_validator
|
213
|
+
|
214
|
+
# https://docs.pydantic.dev/latest/api/fields/#pydantic.fields.computed_field
|
215
|
+
computed_field = pydantic.computed_field
|
216
|
+
|
217
|
+
# https://docs.pydantic.dev/latest/api/aliases/#pydantic.aliases.AliasChoices
|
218
|
+
AliasChoices = pydantic.AliasChoices
|
219
|
+
|
220
|
+
else:
|
221
|
+
from pydantic.utils import to_lower_camel
|
222
|
+
|
223
|
+
V2ValidatorMode = Literal["before", "after", "wrap", "plain"]
|
224
|
+
|
225
|
+
# NOTE:
|
226
|
+
# - `to_lower_camel` in v1 is the equivalent of `to_camel` in v2 (i.e. to lowerCamelCase)
|
227
|
+
# - `to_camel` in v1 is the equivalent of `to_pascal` in v2 (i.e. to UpperCamelCase)
|
228
|
+
to_camel = to_lower_camel
|
229
|
+
|
230
|
+
# Lets us use `@field_validator` from v2, while calling `@validator` from v1 if needed.
|
231
|
+
def field_validator(
|
232
|
+
*fields: str,
|
233
|
+
mode: V2ValidatorMode = "after",
|
234
|
+
check_fields: bool | None = None,
|
235
|
+
**_: Any,
|
236
|
+
) -> Callable:
|
237
|
+
return pydantic.validator( # type: ignore[deprecated]
|
238
|
+
*fields,
|
239
|
+
pre=(mode == "before"),
|
240
|
+
always=True,
|
241
|
+
check_fields=bool(check_fields),
|
242
|
+
allow_reuse=True,
|
243
|
+
)
|
244
|
+
|
245
|
+
# Lets us use `@model_validator` from v2, while calling `@root_validator` from v1 if needed.
|
246
|
+
def model_validator(*, mode: V2ValidatorMode, **_: Any) -> Callable:
|
247
|
+
if mode == "after":
|
248
|
+
|
249
|
+
def _decorator(v2_method: Callable) -> Any:
|
250
|
+
# Patch the behavior for `@model_validator(mode="after")` in v1.
|
251
|
+
#
|
252
|
+
# This is necessarily complicated because:
|
253
|
+
# - `@model_validator(mode="after")` always decorates an instance method in v2,
|
254
|
+
# i.e. the decorated function has `self` as the first arg.
|
255
|
+
# - `@root_validator(pre=False)` always decorates a classmethod in v1,
|
256
|
+
# i.e. the decorated function has `cls` as the first arg.
|
257
|
+
|
258
|
+
def v1_method(
|
259
|
+
cls: type[V1Model], values: dict[str, Any]
|
260
|
+
) -> dict[str, Any]:
|
261
|
+
# values should already be validated in an "after" validator, so use `construct()`
|
262
|
+
# to instantiate without (re-)validating.
|
263
|
+
v_self = v2_method(cls.construct(**values))
|
264
|
+
|
265
|
+
# Pydantic v1 expects the validator to return a dict of {field_name -> value}
|
266
|
+
return {f: getattr(v_self, f) for f in v_self.__fields__}
|
267
|
+
|
268
|
+
return pydantic.root_validator(pre=False, allow_reuse=True)( # type: ignore[call-overload]
|
269
|
+
classmethod(v1_method)
|
270
|
+
)
|
271
|
+
|
272
|
+
return _decorator
|
273
|
+
else:
|
274
|
+
return pydantic.root_validator(pre=(mode == "before"), allow_reuse=True) # type: ignore[call-overload]
|
275
|
+
|
276
|
+
@overload # type: ignore[no-redef]
|
277
|
+
def computed_field(func: Callable | property, /) -> property: ...
|
278
|
+
@overload
|
279
|
+
def computed_field(
|
280
|
+
func: None, /, **_: Any
|
281
|
+
) -> Callable[[Callable | property], property]: ...
|
282
|
+
|
283
|
+
def computed_field(
|
284
|
+
func: Callable | property | None = None, /, **_: Any
|
285
|
+
) -> property | Callable[[Callable | property], property]:
|
286
|
+
"""Compatibility wrapper for Pydantic v2's `computed_field` in v1."""
|
287
|
+
|
288
|
+
def always_property(f: Callable | property) -> property:
|
289
|
+
# Convert the method to a property only if needed
|
290
|
+
return f if isinstance(f, property) else property(f)
|
291
|
+
|
292
|
+
# Handle both decorator styles
|
293
|
+
return always_property if (func is None) else always_property(func)
|
294
|
+
|
295
|
+
class AliasChoices: # type: ignore [no-redef]
|
296
|
+
"""Placeholder class for Pydantic v2's AliasChoices for partial v1 compatibility."""
|
297
|
+
|
298
|
+
aliases: list[str]
|
299
|
+
|
300
|
+
def __init__(self, *aliases: str):
|
301
|
+
self.aliases = list(aliases)
|