Skip to content

Commit 503dadd

Browse files
committed
[CM-1579]: Implemented OnlineExperiment.logText() methods and related test cases.
1 parent cb4cc2d commit 503dadd

File tree

6 files changed

+83
-4
lines changed

6 files changed

+83
-4
lines changed

comet-java-client/src/main/java/ml/comet/experiment/impl/BaseExperiment.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,7 @@
6666
import static ml.comet.experiment.impl.asset.AssetType.ALL;
6767
import static ml.comet.experiment.impl.asset.AssetType.SOURCE_CODE;
6868
import static ml.comet.experiment.impl.asset.AssetType.TEXT_SAMPLE;
69+
import static ml.comet.experiment.impl.constants.Common.AUTOGENERATED_LOGICAL_PATH_HOLDER;
6970
import static ml.comet.experiment.impl.constants.SdkErrorCodes.artifactVersionStateNotClosed;
7071
import static ml.comet.experiment.impl.constants.SdkErrorCodes.artifactVersionStateNotClosedErrorOccurred;
7172
import static ml.comet.experiment.impl.constants.SdkErrorCodes.noArtifactFound;
@@ -454,7 +455,7 @@ public void logText(String text, ExperimentContext context, Map<String, Object>
454455
getLogger().debug("logging text {} with context {}", text, context);
455456
}
456457
AssetImpl asset = createAssetFromData(text.getBytes(StandardCharsets.UTF_8),
457-
"auto-generated-in-the-backend", false,
458+
AUTOGENERATED_LOGICAL_PATH_HOLDER, false,
458459
Optional.ofNullable(metadata), Optional.of(TEXT_SAMPLE.type()));
459460
this.logAsset(asset, context);
460461
}

comet-java-client/src/main/java/ml/comet/experiment/impl/OnlineExperimentImpl.java

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,8 @@
3636
import static java.util.Optional.empty;
3737
import static java.util.Optional.ofNullable;
3838
import static ml.comet.experiment.impl.asset.AssetType.SOURCE_CODE;
39+
import static ml.comet.experiment.impl.asset.AssetType.TEXT_SAMPLE;
40+
import static ml.comet.experiment.impl.constants.Common.AUTOGENERATED_LOGICAL_PATH_HOLDER;
3941
import static ml.comet.experiment.impl.resources.LogMessages.EXPERIMENT_ALREADY_CLOSED_STATUS_ERROR;
4042
import static ml.comet.experiment.impl.resources.LogMessages.EXPERIMENT_CLEANUP_PROMPT;
4143
import static ml.comet.experiment.impl.resources.LogMessages.EXPERIMENT_HEARTBEAT_STOPPED_PROMPT;
@@ -48,6 +50,7 @@
4850
import static ml.comet.experiment.impl.resources.LogMessages.FAILED_TO_LOG_MODEL_ASSET;
4951
import static ml.comet.experiment.impl.resources.LogMessages.FAILED_TO_LOG_MODEL_FOLDER;
5052
import static ml.comet.experiment.impl.resources.LogMessages.FAILED_TO_LOG_REMOTE_ASSET;
53+
import static ml.comet.experiment.impl.resources.LogMessages.FAILED_TO_LOG_TEXT_ASSET;
5154
import static ml.comet.experiment.impl.resources.LogMessages.TIMEOUT_FOR_EXPERIMENT_INVENTORY_CLEANUP;
5255
import static ml.comet.experiment.impl.resources.LogMessages.getString;
5356

@@ -464,12 +467,17 @@ public void logCode(@NonNull File file) {
464467

465468
@Override
466469
public void logText(String text, ExperimentContext context, Map<String, Object> metadata) {
467-
470+
this.executeLogAction(() ->
471+
this.logAssetDataAsync(
472+
text.getBytes(StandardCharsets.UTF_8), AUTOGENERATED_LOGICAL_PATH_HOLDER,
473+
false, Optional.of(TEXT_SAMPLE.type()), empty(),
474+
Optional.ofNullable(metadata), context, this.getLogAssetOnCompleteAction()),
475+
this.assetsInProgress, getString(FAILED_TO_LOG_TEXT_ASSET));
468476
}
469477

470478
@Override
471479
public void logText(String text, ExperimentContext context) {
472-
480+
this.logText(text, context, null);
473481
}
474482

475483
@Override
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
package ml.comet.experiment.impl.constants;
2+
3+
/**
4+
* Common constants used by implementation.
5+
*/
6+
public class Common {
7+
public static final String AUTOGENERATED_LOGICAL_PATH_HOLDER = "auto-generated-in-the-backend";
8+
}

comet-java-client/src/main/java/ml/comet/experiment/impl/resources/LogMessages.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,7 @@ public class LogMessages {
5454
public static final String FAILED_TO_LOG_ASSET = "FAILED_TO_LOG_ASSET";
5555
public static final String FAILED_TO_LOG_REMOTE_ASSET = "FAILED_TO_LOG_REMOTE_ASSET";
5656
public static final String FAILED_TO_LOG_CODE_ASSET = "FAILED_TO_LOG_CODE_ASSET";
57+
public static final String FAILED_TO_LOG_TEXT_ASSET = "FAILED_TO_LOG_TEXT_ASSET";
5758
public static final String FAILED_TO_LOG_SOME_ASSET_FROM_FOLDER = "FAILED_TO_LOG_SOME_ASSET_FROM_FOLDER";
5859
public static final String ARTIFACT_NOT_FOUND = "ARTIFACT_NOT_FOUND";
5960
public static final String ARTIFACT_NOT_READY = "ARTIFACT_NOT_READY";

comet-java-client/src/main/resources/messages.properties

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@ FAILED_TO_LOG_SOME_ASSET_FROM_FOLDER=We failed to upload some asset from directo
4343
FAILED_TO_LOG_ASSET=Failed to log asset: %s
4444
FAILED_TO_LOG_REMOTE_ASSET=Failed to log remote asset: %s
4545
FAILED_TO_LOG_CODE_ASSET=Failed to log code asset: %s
46+
FAILED_TO_LOG_TEXT_ASSET=Failed to log text asset.
4647
ARTIFACT_NOT_FOUND=Artifact not found with options: %s
4748
ARTIFACT_NOT_READY=Artifact (%s) is not ready and cannot be accessed. You need to finalize it.
4849
ARTIFACT_HAS_NO_DETAILS=Artifact (%s) returned by server has no data.

comet-java-client/src/test/java/ml/comet/experiment/impl/OnlineExperimentTest.java

Lines changed: 61 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
import ml.comet.experiment.asset.LoggedExperimentAsset;
77
import ml.comet.experiment.context.ExperimentContext;
88
import ml.comet.experiment.exception.CometGeneralException;
9+
import ml.comet.experiment.impl.asset.LoggedExperimentAssetImpl;
910
import ml.comet.experiment.model.ExperimentMetadata;
1011
import ml.comet.experiment.model.GitMetaData;
1112
import ml.comet.experiment.model.Value;
@@ -25,9 +26,12 @@
2526

2627
import static ml.comet.experiment.impl.ExperimentTestFactory.API_KEY;
2728
import static ml.comet.experiment.impl.ExperimentTestFactory.createOnlineExperiment;
29+
import static ml.comet.experiment.impl.TestUtils.SOME_CONTEXT_ID;
2830
import static ml.comet.experiment.impl.TestUtils.SOME_FULL_CONTEXT;
31+
import static ml.comet.experiment.impl.TestUtils.SOME_METADATA;
2932
import static ml.comet.experiment.impl.TestUtils.awaitForCondition;
3033
import static ml.comet.experiment.impl.asset.AssetType.SOURCE_CODE;
34+
import static ml.comet.experiment.impl.asset.AssetType.TEXT_SAMPLE;
3135
import static ml.comet.experiment.impl.resources.LogMessages.FAILED_REGISTER_EXPERIMENT;
3236
import static ml.comet.experiment.impl.resources.LogMessages.getString;
3337
import static ml.comet.experiment.impl.utils.CometUtils.fullMetricName;
@@ -525,7 +529,7 @@ public void testLogAndGetRawCode() {
525529
experiment.logCode(SOME_TEXT, CODE_FILE_NAME, SOME_FULL_CONTEXT);
526530

527531
awaitForCondition(() -> !experiment.getAssetList(SOURCE_CODE.type()).isEmpty(),
528-
"Experiment raw code added");
532+
"Experiment raw code not added");
529533
List<LoggedExperimentAsset> assets = experiment.getAssetList(SOURCE_CODE.type());
530534
validateAsset(assets, CODE_FILE_NAME, SOME_TEXT_FILE_SIZE, SOME_FULL_CONTEXT);
531535

@@ -534,6 +538,62 @@ public void testLogAndGetRawCode() {
534538
}
535539
}
536540

541+
@Test
542+
public void testLogAndGetText_contextOverride() throws Exception {
543+
try (OnlineExperimentImpl experiment = (OnlineExperimentImpl) createOnlineExperiment()) {
544+
// check that no text was logged
545+
//
546+
assertTrue(experiment.getAllAssetList().isEmpty());
547+
548+
// log text with context set
549+
//
550+
experiment.logText(SOME_TEXT, SOME_FULL_CONTEXT, SOME_METADATA);
551+
552+
awaitForCondition(() -> !experiment.getAssetList(TEXT_SAMPLE.type()).isEmpty(),
553+
"Experiment text not added");
554+
555+
List<LoggedExperimentAsset> assets = experiment.getAssetList(TEXT_SAMPLE.type());
556+
assertEquals(1, assets.size(), "wrong number of assets returned");
557+
558+
LoggedExperimentAsset asset = assets.get(0);
559+
assertEquals(TEXT_SAMPLE.type(), asset.getType(), "wrong asset type");
560+
ExperimentContext assetContext = ((LoggedExperimentAssetImpl) asset).getContext();
561+
assertEquals(SOME_FULL_CONTEXT.getStep(), assetContext.getStep(), "wrong asset's context step");
562+
assertEquals(SOME_FULL_CONTEXT.getContext(), assetContext.getContext(), "wrong asset's context ID");
563+
assertEquals(SOME_METADATA, asset.getMetadata(), "wrong metadata");
564+
assertEquals(SOME_TEXT.length(), asset.getSize().orElse(0L), "wrong asset size");
565+
}
566+
}
567+
568+
@Test
569+
public void testLogAndGetText() throws Exception {
570+
try (OnlineExperimentImpl experiment = (OnlineExperimentImpl) createOnlineExperiment()) {
571+
// check that no text was logged
572+
//
573+
assertTrue(experiment.getAllAssetList().isEmpty());
574+
575+
// log text with context set tto experiment
576+
//
577+
int expectedStep = 102;
578+
experiment.setStep(expectedStep);
579+
experiment.setContext(SOME_CONTEXT_ID);
580+
experiment.logText(SOME_TEXT);
581+
582+
awaitForCondition(() -> !experiment.getAssetList(TEXT_SAMPLE.type()).isEmpty(),
583+
"Experiment text not added");
584+
585+
List<LoggedExperimentAsset> assets = experiment.getAssetList(TEXT_SAMPLE.type());
586+
assertEquals(1, assets.size(), "wrong number of assets returned");
587+
588+
LoggedExperimentAsset asset = assets.get(0);
589+
assertEquals(TEXT_SAMPLE.type(), asset.getType(), "wrong asset type");
590+
ExperimentContext assetContext = ((LoggedExperimentAssetImpl) asset).getContext();
591+
assertEquals(expectedStep, assetContext.getStep(), "wrong asset's context step");
592+
assertEquals(SOME_CONTEXT_ID, assetContext.getContext(), "wrong asset's context ID");
593+
assertEquals(SOME_TEXT.length(), asset.getSize().orElse(0L), "wrong asset size");
594+
}
595+
}
596+
537597
@Test
538598
@Timeout(60)
539599
public void testCreateExperiment_wrongApiKey() {

0 commit comments

Comments
 (0)