-
Notifications
You must be signed in to change notification settings - Fork 3.3k
Migrate 6 API versions to shared arm_ml_service client #47787
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Merged
saanikaguptamicrosoft
merged 149 commits into
Azure:main
from
saanikaguptamicrosoft:saanika/migrate_tsp_final
Jul 27, 2026
Merged
Changes from 1 commit
Commits
Show all changes
149 commits
Select commit
Hold shift + click to select a range
d09d8ac
fix(datastore): resolve create_or_update mixed-tree serialization reg…
saanikaguptamicrosoft 17a6736
fix(datastore): use arm resource_url field for certificate credentials
saanikaguptamicrosoft 34e2b09
migrate(assets): move asset entities to arm_ml_service (2023-04)
saanikaguptamicrosoft d3da0ed
migrate(automl): move AutoML job surface to arm_ml_service (2023-04/2…
saanikaguptamicrosoft bdbea08
migrate(automl): move public AutoML enum re-exports to arm_ml_service
saanikaguptamicrosoft 3fd9646
fix(automl): complete NLP arm migration + preserve isArchived/sweep/m…
saanikaguptamicrosoft c9bbf44
fix(spark,assets): boundary-wrap spark children + preserve isArchived…
saanikaguptamicrosoft 9a10989
fix(jobs,deployments): keep shared job leaves msrest at boundary + ar…
saanikaguptamicrosoft 13d0b9b
fix(schedule): arm spark job embedded in schedule + inline env assertion
saanikaguptamicrosoft e702aee
fix(datastore): JSON-direct HDFS/Kerberos on-prem (absent from arm) t…
saanikaguptamicrosoft 930a1ad
feat(dsl): handle arm hybrid children in get_rest_dict_for_node_attrs…
saanikaguptamicrosoft 67f671f
migrate(jobs): CommandJobLimits to arm_ml_service (arm envelope, wrap…
saanikaguptamicrosoft 4bd978a
migrate(jobs): SweepJob envelope + sampling_algorithm to arm_ml_service
saanikaguptamicrosoft cef4650
migrate(sweep): Objective, sampling_algorithm, SweepJobLimits to arm_…
saanikaguptamicrosoft e274f50
migrate(finetuning): AzureOpenAI finetuning job + hyperparameters to …
saanikaguptamicrosoft 9de1fa9
migrate(finetuning): ModelProvider enum in schemas to arm_ml_service
saanikaguptamicrosoft dbb9834
migrate(jobs): to_rest_functions JobBase type-annotation to arm_ml_se…
saanikaguptamicrosoft bad5d8c
migrate(jobs): PipelineJob envelope to arm_ml_service
saanikaguptamicrosoft e082467
migrate(jobs): _input_output_helpers JobInput/JobOutput to arm_ml_ser…
saanikaguptamicrosoft 020cb97
migrate(sweep): early_termination_policy to arm_ml_service
saanikaguptamicrosoft 2d9387d
migrate(spark): spark_job_entry + spark_resource_configuration to arm…
saanikaguptamicrosoft 804ece3
migrate(jobs): queue_settings to arm_ml_service
saanikaguptamicrosoft f51c536
Migrate distribution configs (Mpi/PyTorch/TensorFlow) to arm_ml_service
saanikaguptamicrosoft 6b40a79
Migrate base ResourceConfiguration to arm_ml_service
saanikaguptamicrosoft 0327f21
Migrate job_service to arm_ml_service JobService/AllNodes
saanikaguptamicrosoft 5df0520
Add CHANGELOG entry for arm_ml_service client migration
saanikaguptamicrosoft 5ca4776
Migrate job identity models in _credentials.py to arm_ml_service
saanikaguptamicrosoft 6539326
Migrate spark builder read-path annotations to arm_ml_service JobBase…
saanikaguptamicrosoft 1e14cd5
Migrate _util.py normalize_job_input_output_type imports to arm_ml_se…
saanikaguptamicrosoft cb65616
Migrate pipeline IO read helpers to arm_ml_service JobInput/JobOutput
saanikaguptamicrosoft fd80f90
Migrate base Component entity to arm_ml_service ComponentVersion models
saanikaguptamicrosoft d770750
Migrate BatchDeployment entity to arm_ml_service models (byte-identic…
saanikaguptamicrosoft 8a3f197
Migrate PipelineComponentBatchDeployment entity to arm_ml_service models
saanikaguptamicrosoft 8b1fa48
Migrate DistillationJob to arm_ml_service with custom read-path handling
saanikaguptamicrosoft 2164ae8
Migrate job.py off v2024_01: arm JobBase + literal FineTuning discrim…
saanikaguptamicrosoft f7d174e
Migrate workspace connection entity family to arm_ml_service models
saanikaguptamicrosoft 7cef3ee
Repoint workspace connections operation to arm_ml_service client
saanikaguptamicrosoft 7902c23
Normalize formatting to repo black config (line-length 120)
saanikaguptamicrosoft ed6342d
Migrate ListViewType/ComponentVersion enum+annotation imports in oper…
saanikaguptamicrosoft 95ae6e6
Migrate RestJobType enum import in job operations to arm_ml_service
saanikaguptamicrosoft f7e3497
Repoint marketplace + serverless endpoint operations to arm_ml_servic…
saanikaguptamicrosoft 9bb6dc4
Repoint batch deployment operation to arm_ml_service client
saanikaguptamicrosoft 4dd10d8
Repoint component operation (workspace path) to arm_ml_service client
saanikaguptamicrosoft e23fc4a
Route pipeline/automl/sweep job create to arm_ml_service client
saanikaguptamicrosoft c22751d
Migrate schedule trigger off v2024_01; fix arm job result deserializa…
saanikaguptamicrosoft 58eb448
Migrate data/datastore compute-mount off v2024_01 via arm client send…
saanikaguptamicrosoft efbb0d8
Migrate job reads off v2024_01; remove the v2024_01 msrest client ent…
saanikaguptamicrosoft 9d7bf9f
Remove RCA.md scratch doc from branch (keep local copy only)
saanikaguptamicrosoft bd75dbf
Flip aoai finetuning test RestFineTuningJob annotation to arm_ml_service
saanikaguptamicrosoft c2caa31
Move batch pipeline-component deployment test off v2024_01 rest models
saanikaguptamicrosoft 75aed33
Delete the now-unused v2024_01_01_preview restclient folder
saanikaguptamicrosoft e5e422d
Merge remote-tracking branch 'upstream/main' into saanika/migrate_tsp…
saanikaguptamicrosoft ad7c2bf
Apply isort/black import formatting to datastore and job operations
saanikaguptamicrosoft 99f2146
Migrate connection schema enums (ConnectionCategory/ConnectionAuthTyp…
saanikaguptamicrosoft beb2901
Migrate data-import entity + schedule off v2023_08 to JSON-direct wir…
saanikaguptamicrosoft 7c7640f
Migrate registry ManagedServiceIdentity + WorkspaceConnectionAccessKe…
saanikaguptamicrosoft bc2a5a4
Make datastore credential deserialization arm-only (drop dead v2023_0…
saanikaguptamicrosoft 70cf124
Migrate Azure OpenAI deployment list off v2024_04 to arm send_request…
saanikaguptamicrosoft a4c7df1
Migrate compute enable_sso off v2024_04 to arm send_request (JSON-dir…
saanikaguptamicrosoft e353dd2
Delete v2024_04_01_preview restclient folder (all consumers migrated …
saanikaguptamicrosoft 75c29a2
Migrate batch endpoint/deployment invoke + list_jobs off v2020_09 and…
saanikaguptamicrosoft 1701e3a
Fix stale v2023_04 docstring type refs in evaluator/model operations …
saanikaguptamicrosoft c7ad518
Add byte-identical arm-MFE registry client builder (foundation for v2…
saanikaguptamicrosoft e9eb19d
Thread byte-identical arm-MFE registry client through construction (d…
saanikaguptamicrosoft 8082c22
Migrate registry model get in _endpoint_utils to byte-identical arm-M…
saanikaguptamicrosoft fa2d566
Migrate registry sas-uri helpers to byte-identical arm-MFE send_reque…
saanikaguptamicrosoft c3d1d15
Migrate registry code get to byte-identical arm-MFE send_request + ar…
saanikaguptamicrosoft 8dfafde
Migrate registry code create to byte-identical arm-MFE send_request LRO
saanikaguptamicrosoft 5ad3f37
Migrate registry data get (version+container) to byte-identical arm-M…
saanikaguptamicrosoft aa3c42f
Migrate registry data list (versions+containers) to byte-identical ar…
saanikaguptamicrosoft ef0b71f
Migrate registry data create LRO + existence check; map registry get …
saanikaguptamicrosoft cfc017d
Migrate registry environment get/list/create to byte-identical arm-MF…
saanikaguptamicrosoft 1a09a3b
Migrate registry component list/get to byte-identical arm-MFE send_re…
saanikaguptamicrosoft 68877c3
Migrate registry component create to byte-identical arm-MFE LRO with …
saanikaguptamicrosoft c14f678
Migrate registry asset import (begin_import_method) to byte-identical…
saanikaguptamicrosoft 62045eb
Migrate registry model get/list/existence-check to arm-MFE send_reque…
saanikaguptamicrosoft d31bd23
Migrate registry evaluator list to byte-identical arm-MFE send_reques…
saanikaguptamicrosoft f6d2455
Migrate registry model create Path B (model_versions) to byte-identic…
saanikaguptamicrosoft 3ed5821
Migrate registry container-version readers to byte-identical arm-MFE …
saanikaguptamicrosoft fdaa889
Migrate registry _get_latest + latest-version-from-container to byte-…
saanikaguptamicrosoft 1cd7168
Migrate registry archive/restore (_archive_or_restore) to byte-identi…
saanikaguptamicrosoft c2d3d61
Flip registry asset ops to the arm-MFE client; fix missing registry_s…
saanikaguptamicrosoft 0adf574
Drop unused v2021_10 client imports + type hints from asset ops (regi…
saanikaguptamicrosoft 2667f26
Drop v2021_10 ModelVersionData annotations from model operations (use…
saanikaguptamicrosoft acb6c0d
Migrate Model._to_rest_object off v2021_10 to arm (byte-identical tem…
saanikaguptamicrosoft 9861b0b
Keep model/evaluator on v2021_10 client until registry begin_package …
saanikaguptamicrosoft 0d812d8
Migrate registry model begin_package to byte-identical arm-MFE send_r…
saanikaguptamicrosoft de3509b
Convert registry package request to byte-identical JSON-direct dict (…
saanikaguptamicrosoft ca997b6
Flip model/evaluator registry ops to arm-MFE client; drop v2021_10 cl…
saanikaguptamicrosoft 507fcd9
Thread arm-MFE client into share-to-registry (_set_registry_client) s…
saanikaguptamicrosoft ece206d
Stop building the v2021_10 msrest registry client; registry runs enti…
saanikaguptamicrosoft 2554b5a
Migrate test_model_default_deployment_template off v2021_10 to arm mo…
saanikaguptamicrosoft d026c4b
Migrate remaining tests and docstrings off v2021_10 dataplane client
saanikaguptamicrosoft 9dc0ab1
Remove v2021_10_01_dataplanepreview REST client (migrated to shared a…
saanikaguptamicrosoft ef2751c
Migrate distribution/pipeline/job-resource-config off v2023_04 to arm…
saanikaguptamicrosoft 40da23e
Migrate model-package tree + workspace client off v2023_04/v2023_08 t…
saanikaguptamicrosoft 2db98ed
Migrate tests off v2023_04/v2023_08 and delete both client folders (a…
saanikaguptamicrosoft d44f08f
Add explicit CHANGELOG entry for datastore mixed-tree serialization fix
saanikaguptamicrosoft 1bcf981
Revert duplicate datastore CHANGELOG entry (already documented on ups…
saanikaguptamicrosoft 13b60f3
Merge remote-tracking branch 'upstream/main' into saanika/migrate_tsp…
saanikaguptamicrosoft 5df2e44
Regenerate api.md + api.metadata.yml for arm_ml_service migration
saanikaguptamicrosoft 674c5c6
Fix ComputeOperations test fixture: service_client_2024 -> service_cl…
saanikaguptamicrosoft fdbafd8
Fix stage param leak + rewrite registry unit tests for arm_ml_service…
saanikaguptamicrosoft 6f9f3b7
Rewrite model registry get tests for arm_ml_service raw-HTTP paths
saanikaguptamicrosoft 4ad927b
Fix job runhistory test attr, UnsupportedCompute additional_propertie…
saanikaguptamicrosoft 0a0dd58
Fix command_builder tests: arm as_dict camelCase resources + version-…
saanikaguptamicrosoft e75d8e6
Fix model deployment-template tests for arm hybrid wire-key storage
saanikaguptamicrosoft 6e1e057
Fix mfe_url test (_config.base_url for TSP clients) + storage_utils r…
saanikaguptamicrosoft f7bd0a3
Fix batch deployment list_jobs test: mock requests pipeline (raw MFE …
saanikaguptamicrosoft d30c604
Fix batch endpoint list_jobs tests (pipeline mock) + pipeline-compone…
saanikaguptamicrosoft 25eda61
Fix pipeline_job_entity rest-fixture deserialize: camelize snake fixt…
saanikaguptamicrosoft b87c8e0
Fix wire helper to serialize plain-dict rest objects (feature store)
saanikaguptamicrosoft a44a31a
Apply black formatting to migration-modified source and test files
saanikaguptamicrosoft cddcc16
Fix pylint: add missing Any import, resolve unused/reimported imports…
saanikaguptamicrosoft a633d9f
Fix mypy: type annotations, Optional guards, and targeted ignores for…
saanikaguptamicrosoft ab4acce
fix(assets): byte-identical archive/restore PUT body (prune None prop…
saanikaguptamicrosoft 0a7b848
fix(data): read untyped autoDeleteSetting wire key on _from_rest_object
saanikaguptamicrosoft 9ff1795
fix(validation,tests): serialize arm properties as object for remote …
saanikaguptamicrosoft 5b5ae08
fix(model,tests): str-coerce model tags/properties + ignore query-par…
saanikaguptamicrosoft 030a9d9
fix(sweep): deserialize untyped resources dict on read so instance_co…
saanikaguptamicrosoft 9f40f74
fix(pipeline): read snake_case queue_settings on node round-trip + as…
saanikaguptamicrosoft 8707997
fix(pipeline-io): drop stray camelCase assetVersion from node IO so r…
saanikaguptamicrosoft 05a7153
fix(dsl): resolve arbitrary-attr data bindings for arm encoder + as_a…
saanikaguptamicrosoft 00a6f1e
fix(model-package): omit None mountPath and empty tags to match legac…
saanikaguptamicrosoft 4a5a72c
fix(resources): normalize camelCase keys in JobResourceConfiguration.…
saanikaguptamicrosoft f0937ca
fix(mypy): ensure str keys in JobResourceConfiguration dict normaliza…
saanikaguptamicrosoft 7ed7875
Merge upstream/main; migrate #47997 model deployment-template test to…
saanikaguptamicrosoft 75ac450
style: black-format job_resource_configuration.py
saanikaguptamicrosoft a278bdf
fix(test): give build_data_asset_uri a str return so mount test doesn…
saanikaguptamicrosoft 6910301
fix(test): give build_datastore_uri a str return so datastore mount t…
saanikaguptamicrosoft 83cf427
fix(jobs): strip None-valued fields from job PUT body to match msrest…
saanikaguptamicrosoft bb634e6
fix(jobs): only strip None from local-run re-PUT body, not fresh creates
saanikaguptamicrosoft 3be248f
chore: remove leftover _tmp_inspect.py debug scratch file
saanikaguptamicrosoft d11398a
test(smoke): add model_package, connection, deployment + round-trip w…
saanikaguptamicrosoft 39b9b68
ci: skip azureml-dataprep-rslex on macOS arm64 (no wheel available)
saanikaguptamicrosoft 0c09a16
chore: bump api.metadata.yml parserVersion to 0.3.30 (matches upstrea…
saanikaguptamicrosoft 2671706
test: skip rslex-dependent tests on macOS arm64 (matches dev_requirem…
saanikaguptamicrosoft 516c24d
test(smoke): add pipeline_job write + round-trip wire coverage
saanikaguptamicrosoft bcc5907
fix(distillation): stringify properties bag + emit isArchived to matc…
saanikaguptamicrosoft 2a9b88c
test(smoke): add serverless_endpoint + marketplace_subscription wire …
saanikaguptamicrosoft d125556
test(smoke): cover remaining connection subtypes (7 more category/aut…
saanikaguptamicrosoft 6f2c6ab
test(smoke): add certificate + none-credential datastore variants
saanikaguptamicrosoft 2431f86
test(smoke): cover arm-absent families (HDFS datastore, data_import, …
saanikaguptamicrosoft b507adc
test(smoke): cover model deployment-templates + WorkspaceAssetReference
saanikaguptamicrosoft 61ffbaf
fix(environment): preserve inference_config route wire + guard regist…
saanikaguptamicrosoft 6a0d858
test(environment): cover inference_config route wire + registry-creat…
saanikaguptamicrosoft 4902c2d
fix(code,data): guard registry-create None LRO body (same class as en…
saanikaguptamicrosoft adf137a
fix: arm-migration read regressions caught by notebook samples + pyli…
saanikaguptamicrosoft cea3411
test: registry env-create mock must return an id (matches the real LR…
saanikaguptamicrosoft File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
95 changes: 95 additions & 0 deletions
95
sdk/ml/azure-ai-ml/tests/datastore/unittests/test_datastore_serialization_regression.py
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,95 @@ | ||
| # --------------------------------------------------------- | ||
| # Copyright (c) Microsoft Corporation. All rights reserved. | ||
| # --------------------------------------------------------- | ||
| """Regression test for the datastore create_or_update mixed-tree serialization bug. | ||
|
|
||
| Context (production regression, azure-ai-ml 1.34.0/1.35.0): | ||
| ``DatastoreOperations.create_or_update`` was migrated to the arm_ml_service client (its operation | ||
| serializes the request body with ``json.dumps(body, cls=SdkJSONEncoder, ...)``), but the datastore | ||
| ENTITIES still returned an old ``v2023_04_01_preview`` msrest ``Datastore`` model. ``SdkJSONEncoder`` | ||
| can only serialize arm hybrid models, so a msrest datastore body raised | ||
| ``TypeError: Object of type Datastore is not JSON serializable`` on every create/update — a hard | ||
| failure for customers, invisible to the mocked unit tests and the (skipped/live-only) e2e tests. | ||
|
|
||
| This test freezes the fix: every datastore entity's ``_to_rest_object()`` must serialize cleanly | ||
| through the arm operation's encoder. It is the offline Class-A (mixed-tree) guard the original | ||
| migration lacked. | ||
| """ | ||
| import json | ||
|
|
||
| import pytest | ||
|
|
||
| from azure.ai.ml._restclient.arm_ml_service._utils.model_base import SdkJSONEncoder | ||
| from azure.ai.ml.entities._credentials import ( | ||
| AccountKeyConfiguration, | ||
| ServicePrincipalConfiguration, | ||
| ) | ||
| from azure.ai.ml.entities._datastore.adls_gen1 import AzureDataLakeGen1Datastore | ||
| from azure.ai.ml.entities._datastore.azure_storage import ( | ||
| AzureBlobDatastore, | ||
| AzureDataLakeGen2Datastore, | ||
| AzureFileDatastore, | ||
| ) | ||
| from azure.ai.ml.entities._datastore.one_lake import OneLakeDatastore | ||
|
|
||
|
|
||
| def _serializes_via_arm_operation(rest_obj) -> dict: | ||
| """Serialize exactly the way ``DatastoreOperations.create_or_update`` does on the arm client.""" | ||
| return json.loads(json.dumps(rest_obj, cls=SdkJSONEncoder, exclude_readonly=True)) | ||
|
|
||
|
|
||
| @pytest.mark.unittest | ||
| @pytest.mark.data_experiences_test | ||
| class TestDatastoreSerializationRegression: | ||
| def test_blob_datastore_body_serializes(self) -> None: | ||
| ds = AzureBlobDatastore( | ||
| name="ds", | ||
| account_name="acct", | ||
| container_name="container", | ||
| credentials=AccountKeyConfiguration(account_key="fake"), | ||
| ) | ||
| wire = _serializes_via_arm_operation(ds._to_rest_object()) | ||
| assert wire["properties"]["datastoreType"] == "AzureBlob" | ||
| assert wire["properties"]["accountName"] == "acct" | ||
|
|
||
| def test_file_datastore_body_serializes(self) -> None: | ||
| ds = AzureFileDatastore( | ||
| name="ds", | ||
| account_name="acct", | ||
| file_share_name="share", | ||
| credentials=AccountKeyConfiguration(account_key="fake"), | ||
| ) | ||
| wire = _serializes_via_arm_operation(ds._to_rest_object()) | ||
| assert wire["properties"]["datastoreType"] == "AzureFile" | ||
|
|
||
| def test_adls_gen2_datastore_body_serializes(self) -> None: | ||
| ds = AzureDataLakeGen2Datastore( | ||
| name="ds", | ||
| account_name="acct", | ||
| filesystem="fs", | ||
| credentials=ServicePrincipalConfiguration(tenant_id="t", client_id="c", client_secret="s"), | ||
| ) | ||
| wire = _serializes_via_arm_operation(ds._to_rest_object()) | ||
| assert wire["properties"]["datastoreType"] == "AzureDataLakeGen2" | ||
|
|
||
| def test_adls_gen1_datastore_body_serializes(self) -> None: | ||
| ds = AzureDataLakeGen1Datastore( | ||
| name="ds", | ||
| store_name="store", | ||
| credentials=ServicePrincipalConfiguration(tenant_id="t", client_id="c", client_secret="s"), | ||
| ) | ||
| wire = _serializes_via_arm_operation(ds._to_rest_object()) | ||
| assert wire["properties"]["datastoreType"] == "AzureDataLakeGen1" | ||
|
|
||
| def test_one_lake_datastore_body_serializes(self) -> None: | ||
| from azure.ai.ml.entities._datastore.one_lake import LakeHouseArtifact | ||
|
|
||
| ds = OneLakeDatastore( | ||
| name="ds", | ||
| one_lake_workspace_name="ws", | ||
| endpoint="onelake.dfs.fabric.microsoft.com", | ||
| artifact=LakeHouseArtifact(name="artifact"), | ||
| credentials=ServicePrincipalConfiguration(tenant_id="t", client_id="c", client_secret="s"), | ||
| ) | ||
| wire = _serializes_via_arm_operation(ds._to_rest_object()) | ||
| assert wire["properties"]["datastoreType"] == "OneLake" |
Oops, something went wrong.
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Uh oh!
There was an error while loading. Please reload this page.