Skip to content

Commit

Permalink
feat: strings based project functionality (#714)
Browse files Browse the repository at this point in the history
  • Loading branch information
katerina20 committed Feb 5, 2024
1 parent e14a7a1 commit 8d00c4b
Show file tree
Hide file tree
Showing 33 changed files with 868 additions and 288 deletions.
10 changes: 7 additions & 3 deletions src/main/java/com/crowdin/cli/client/ClientDistribution.java
Original file line number Diff line number Diff line change
@@ -1,8 +1,6 @@
package com.crowdin.cli.client;

import com.crowdin.client.distributions.model.AddDistributionRequest;
import com.crowdin.client.distributions.model.Distribution;
import com.crowdin.client.distributions.model.DistributionRelease;
import com.crowdin.client.distributions.model.*;

import java.util.List;

Expand All @@ -12,7 +10,13 @@ public interface ClientDistribution extends Client {

Distribution addDistribution(AddDistributionRequest request);

Distribution addDistributionStringsBased(AddDistributionStringsBasedRequest request);

DistributionRelease release(String hash);

DistributionStringsBasedRelease releaseStringsBased(String hash);

DistributionRelease getDistributionRelease(String hash);

DistributionStringsBasedRelease getDistributionStringsBasedRelease(String hash);
}
Original file line number Diff line number Diff line change
@@ -1,8 +1,6 @@
package com.crowdin.cli.client;

import com.crowdin.client.distributions.model.AddDistributionRequest;
import com.crowdin.client.distributions.model.Distribution;
import com.crowdin.client.distributions.model.DistributionRelease;
import com.crowdin.client.distributions.model.*;

import java.util.List;

Expand All @@ -29,18 +27,38 @@ public Distribution addDistribution(AddDistributionRequest distributionRequest)
.getData());
}

@Override
public Distribution addDistributionStringsBased(AddDistributionStringsBasedRequest distributionRequest) {
return executeRequest(() -> this.client.getDistributionsApi()
.addDistributionStringsBased(Long.valueOf(projectId), distributionRequest)
.getData());
}

@Override
public DistributionRelease release(String hash) {
return executeRequest(() -> this.client.getDistributionsApi()
.createDistributionRelease(Long.valueOf(projectId), hash)
.getData());
}

@Override
public DistributionStringsBasedRelease releaseStringsBased(String hash) {
return executeRequest(() -> this.client.getDistributionsApi()
.createDistributionStringsBasedRelease(Long.valueOf(projectId), hash)
.getData());
}

@Override
public DistributionRelease getDistributionRelease(String hash) {
return executeRequest(() -> this.client.getDistributionsApi()
.getDistributionRelease(Long.valueOf(projectId), hash)
.getData());
}

@Override
public DistributionStringsBasedRelease getDistributionStringsBasedRelease(String hash) {
return executeRequest(() -> this.client.getDistributionsApi()
.getDistributionStringsBasedRelease(Long.valueOf(projectId), hash)
.getData());
}
}
22 changes: 17 additions & 5 deletions src/main/java/com/crowdin/cli/client/CrowdinProjectClient.java
Original file line number Diff line number Diff line change
Expand Up @@ -6,10 +6,7 @@
import com.crowdin.client.projectsgroups.model.ProjectSettings;
import com.crowdin.client.projectsgroups.model.Type;
import com.crowdin.client.sourcefiles.model.*;
import com.crowdin.client.sourcestrings.model.AddSourceStringRequest;
import com.crowdin.client.sourcestrings.model.SourceString;
import com.crowdin.client.sourcestrings.model.UploadStringsProgress;
import com.crowdin.client.sourcestrings.model.UploadStringsRequest;
import com.crowdin.client.sourcestrings.model.*;
import com.crowdin.client.storage.model.Storage;
import com.crowdin.client.stringcomments.model.AddStringCommentRequest;
import com.crowdin.client.stringcomments.model.StringComment;
Expand Down Expand Up @@ -67,7 +64,8 @@ private void populateProjectWithStructure(CrowdinProjectFull project, String bra
.ifPresent(project::setBranch);
Long branchId = Optional.ofNullable(project.getBranch()).map(Branch::getId).orElse(null);

if (Objects.equals(project.getType(), Type.STRINGS_BASED)) {
boolean isStringsBasedProject = Objects.equals(project.getType(), Type.STRINGS_BASED);
if (isStringsBasedProject) {
return;
}
project.setFiles(executeRequestFullList((limit, offset) -> this.client.getSourceFilesApi()
Expand Down Expand Up @@ -328,6 +326,13 @@ public SourceString addSourceString(AddSourceStringRequest request) {
.getData());
}

@Override
public SourceString addSourceStringStringsBased(AddSourceStringStringsBasedRequest request) {
return executeRequest(() -> this.client.getSourceStringsApi()
.addSourceStringStringsBased(this.projectId, request)
.getData());
}

@Override
public List<SourceString> listSourceString(Long fileId, Long branchId, String labelIds, String filter, String croql) {
return executeRequestFullList((limit, offset) -> this.client.getSourceStringsApi()
Expand Down Expand Up @@ -391,6 +396,13 @@ public PreTranslationStatus startPreTranslation(ApplyPreTranslationRequest reque
.getData());
}

@Override
public PreTranslationStatus startPreTranslationStringsBased(ApplyPreTranslationStringsBasedRequest request) {
return executeRequest(() ->this.client.getTranslationsApi()
.applyPreTranslationStringsBased(this.projectId, request)
.getData());
}

@Override
public PreTranslationStatus checkPreTranslation(String preTranslationId) {
return executeRequest(() -> this.client.getTranslationsApi()
Expand Down
9 changes: 5 additions & 4 deletions src/main/java/com/crowdin/cli/client/ProjectClient.java
Original file line number Diff line number Diff line change
Expand Up @@ -6,10 +6,7 @@
import com.crowdin.client.labels.model.AddLabelRequest;
import com.crowdin.client.labels.model.Label;
import com.crowdin.client.sourcefiles.model.*;
import com.crowdin.client.sourcestrings.model.AddSourceStringRequest;
import com.crowdin.client.sourcestrings.model.SourceString;
import com.crowdin.client.sourcestrings.model.UploadStringsProgress;
import com.crowdin.client.sourcestrings.model.UploadStringsRequest;
import com.crowdin.client.sourcestrings.model.*;
import com.crowdin.client.stringcomments.model.AddStringCommentRequest;
import com.crowdin.client.stringcomments.model.StringComment;
import com.crowdin.client.translations.model.*;
Expand Down Expand Up @@ -83,6 +80,8 @@ default CrowdinProjectFull downloadFullProject() {

SourceString addSourceString(AddSourceStringRequest request);

SourceString addSourceStringStringsBased(AddSourceStringStringsBasedRequest request);

List<SourceString> listSourceString(Long fileId, Long branchId, String labelIds, String filter, String croql);

void deleteSourceString(Long id);
Expand All @@ -101,5 +100,7 @@ default CrowdinProjectFull downloadFullProject() {

PreTranslationStatus startPreTranslation(ApplyPreTranslationRequest request);

PreTranslationStatus startPreTranslationStringsBased(ApplyPreTranslationStringsBasedRequest request);

PreTranslationStatus checkPreTranslation(String preTranslationId);
}
4 changes: 2 additions & 2 deletions src/main/java/com/crowdin/cli/commands/Actions.java
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,7 @@ NewAction<ProjectProperties, ProjectClient> status(
boolean noProgress, String branchName, String languageId, String file, String directory, boolean isVerbose, boolean showTranslated, boolean showApproved, boolean failIfIncomplete);

NewAction<ProjectProperties, ProjectClient> stringAdd(
boolean noProgress, String text, String identifier, Integer maxLength, String context, List<String> files, List<String> labelNames, Boolean hidden);
boolean noProgress, String text, String identifier, Integer maxLength, String context, List<String> files, List<String> labelNames, String branch, Boolean hidden);

NewAction<ProjectProperties, ProjectClient> stringComment(boolean plainView,
boolean noProgress, String text, String stringId, String language, String type, String issueType);
Expand Down Expand Up @@ -97,7 +97,7 @@ NewAction<ProjectProperties, ClientTask> taskAdd(

NewAction<ProjectProperties, ClientDistribution> distributionAdd(boolean noProgress, boolean plainView, String name, ExportMode exportMode, List<String> files, List<Integer> bundleIds, String branch, ProjectClient projectClient);

NewAction<ProjectProperties, ClientDistribution> distributionRelease(boolean noProgress, boolean plainView, String hash);
NewAction<ProjectProperties, ClientDistribution> distributionRelease(boolean noProgress, boolean plainView, String hash, ProjectClient projectClient);

NewAction<ProjectProperties, ClientComment> commentList(boolean plainView, boolean isVerbose, String stringId, com.crowdin.client.stringcomments.model.Type type, com.crowdin.client.issues.model.Type issueType, IssueStatus status);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -80,9 +80,9 @@ public NewAction<ProjectProperties, ProjectClient> status(

@Override
public NewAction<ProjectProperties, ProjectClient> stringAdd(
boolean noProgress, String text, String identifier, Integer maxLength, String context, List<String> files, List<String> labelNames, Boolean hidden
boolean noProgress, String text, String identifier, Integer maxLength, String context, List<String> files, List<String> labelNames, String branch, Boolean hidden
) {
return new StringAddAction(noProgress, text, identifier, maxLength, context, files, labelNames, hidden);
return new StringAddAction(noProgress, text, identifier, maxLength, context, files, labelNames, branch, hidden);
}
@Override
public NewAction<ProjectProperties, ProjectClient> stringComment(boolean plainView,
Expand Down Expand Up @@ -189,8 +189,8 @@ public NewAction<ProjectProperties, ClientDistribution> distributionAdd(boolean
}

@Override
public NewAction<ProjectProperties, ClientDistribution> distributionRelease(boolean noProgress, boolean plainView, String hash) {
return new DistributionReleaseAction(noProgress, plainView, hash);
public NewAction<ProjectProperties, ClientDistribution> distributionRelease(boolean noProgress, boolean plainView, String hash, ProjectClient projectClient) {
return new DistributionReleaseAction(noProgress, plainView, hash, projectClient);
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,20 +10,24 @@
import com.crowdin.cli.utils.Utils;
import com.crowdin.cli.utils.console.ConsoleSpinner;
import com.crowdin.client.distributions.model.AddDistributionRequest;
import com.crowdin.client.distributions.model.AddDistributionStringsBasedRequest;
import com.crowdin.client.distributions.model.Distribution;
import com.crowdin.client.distributions.model.ExportMode;
import com.crowdin.client.projectsgroups.model.Type;
import com.crowdin.client.sourcefiles.model.Branch;
import com.crowdin.client.sourcefiles.model.FileInfo;
import lombok.AllArgsConstructor;

import java.nio.file.Paths;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.Optional;
import java.util.stream.Collectors;

import static com.crowdin.cli.BaseCli.RESOURCE_BUNDLE;
import static com.crowdin.cli.utils.console.ExecutionStatus.OK;
import static com.crowdin.client.distributions.model.ExportMode.DEFAULT;

@AllArgsConstructor
class DistributionAddAction implements NewAction<ProjectProperties, ClientDistribution> {
Expand All @@ -47,8 +51,13 @@ public void act(Outputter out, ProjectProperties pb, ClientDistribution client)
this.plainView,
() -> this.projectClient.downloadFullProject(this.branch)
);
boolean isStringsBasedProject = Objects.equals(project.getType(), Type.STRINGS_BASED);

List<Long> fileIds = null;
if (files != null) {
if (isStringsBasedProject) {
throw new RuntimeException(RESOURCE_BUNDLE.getString("message.no_file_string_project"));
}
Map<String, Long> projectBranches = project.getBranches().values().stream()
.collect(Collectors.toMap(Branch::getName, Branch::getId));
List<String> projectFiles = project.getFiles().stream()
Expand All @@ -74,19 +83,36 @@ public void act(Outputter out, ProjectProperties pb, ClientDistribution client)
.filter(file -> files.contains(file.getPath()))
.map(FileInfo::getId)
.collect(Collectors.toList());
} else if (exportMode == DEFAULT && !isStringsBasedProject) {
throw new RuntimeException(RESOURCE_BUNDLE.getString("error.distribution.empty_file"));
}

Distribution distribution;
AddDistributionRequest addDistributionRequest = RequestBuilder.addDistribution(name, exportMode, fileIds, bundleIds);
Optional.ofNullable(name).ifPresent(addDistributionRequest::setName);
Optional.ofNullable(exportMode).ifPresent(addDistributionRequest::setExportMode);
Optional.ofNullable(fileIds).ifPresent(addDistributionRequest::setFileIds);
Optional.ofNullable(bundleIds).ifPresent(addDistributionRequest::setBundleIds);
Distribution distribution = null;
if (!isStringsBasedProject) {
AddDistributionRequest addDistributionRequest = RequestBuilder.addDistribution(name, exportMode, fileIds, bundleIds);
Optional.ofNullable(name).ifPresent(addDistributionRequest::setName);
Optional.ofNullable(exportMode).ifPresent(addDistributionRequest::setExportMode);
Optional.ofNullable(fileIds).ifPresent(addDistributionRequest::setFileIds);
Optional.ofNullable(bundleIds).ifPresent(addDistributionRequest::setBundleIds);

try {
distribution = client.addDistribution(addDistributionRequest);
} catch (Exception e) {
throw new RuntimeException(String.format(RESOURCE_BUNDLE.getString("error.distribution_is_not_added"), addDistributionRequest), e);
}
} else if (isStringsBasedProject) {
AddDistributionStringsBasedRequest addDistributionRequest = new AddDistributionStringsBasedRequest();
addDistributionRequest.setName(name);
if (Objects.isNull(bundleIds)) {
throw new RuntimeException(RESOURCE_BUNDLE.getString("error.distribution.empty_bundle_ids"));
}
addDistributionRequest.setBundleIds(bundleIds);

try {
distribution = client.addDistribution(addDistributionRequest);
} catch (Exception e) {
throw new RuntimeException(String.format(RESOURCE_BUNDLE.getString("error.distribution_is_not_added"), addDistributionRequest), e);
try {
distribution = client.addDistributionStringsBased(addDistributionRequest);
} catch (Exception e) {
throw new RuntimeException(String.format(RESOURCE_BUNDLE.getString("error.distribution_is_not_added"), addDistributionRequest), e);
}
}

if (!plainView) {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,13 +1,19 @@
package com.crowdin.cli.commands.actions;

import com.crowdin.cli.client.ClientDistribution;
import com.crowdin.cli.client.CrowdinProjectInfo;
import com.crowdin.cli.client.ProjectClient;
import com.crowdin.cli.commands.NewAction;
import com.crowdin.cli.commands.Outputter;
import com.crowdin.cli.properties.ProjectProperties;
import com.crowdin.cli.utils.console.ConsoleSpinner;
import com.crowdin.client.distributions.model.DistributionRelease;
import com.crowdin.client.distributions.model.DistributionStringsBasedRelease;
import com.crowdin.client.projectsgroups.model.Type;
import lombok.AllArgsConstructor;

import java.util.Objects;

import static com.crowdin.cli.BaseCli.RESOURCE_BUNDLE;
import static com.crowdin.cli.utils.console.ExecutionStatus.OK;

Expand All @@ -18,13 +24,28 @@ class DistributionReleaseAction implements NewAction<ProjectProperties, ClientDi
private boolean plainView;
private String hash;

private ProjectClient projectClient;

@Override
public void act(Outputter out, ProjectProperties pb, ClientDistribution client) {
this.releaseDistribution(out, client);
CrowdinProjectInfo project = ConsoleSpinner.execute(
out,
"message.spinner.fetching_project_info", "error.collect_project_info",
this.noProgress,
this.plainView,
() -> this.projectClient.downloadProjectInfo()
);
boolean isStringsBasedProject = Objects.equals(project.getType(), Type.STRINGS_BASED);

if (!isStringsBasedProject) {
this.releaseDistributionFilesBased(out, client);
} else {
this.releaseDistributionStringsBased(out, client);
}
out.println(OK.withIcon(String.format(RESOURCE_BUNDLE.getString("message.distribution.released"), hash)));
}

private DistributionRelease releaseDistribution(Outputter out, ClientDistribution client) {
private DistributionRelease releaseDistributionFilesBased(Outputter out, ClientDistribution client) {
return ConsoleSpinner.execute(
out,
"message.spinner.releasing_distribution",
Expand All @@ -43,7 +64,37 @@ private DistributionRelease releaseDistribution(Outputter out, ClientDistributio
release = client.getDistributionRelease(hash);

if ("failed".equalsIgnoreCase(release.getStatus())) {
throw new RuntimeException(RESOURCE_BUNDLE.getString("message.spinner.build_has_failed"));
throw new RuntimeException(RESOURCE_BUNDLE.getString("error.distribution_failed"));
}
}

ConsoleSpinner.update(String.format(RESOURCE_BUNDLE.getString("message.spinner.releasing_distribution_percents"), 100));

return release;
}
);
}

private DistributionStringsBasedRelease releaseDistributionStringsBased(Outputter out, ClientDistribution client) {
return ConsoleSpinner.execute(
out,
"message.spinner.releasing_distribution",
"error.distribution_is_not_released",
this.noProgress,
false,
() -> {
DistributionStringsBasedRelease release = client.releaseStringsBased(hash);

while (!"success".equalsIgnoreCase(release.getStatus())) {
ConsoleSpinner.update(
String.format(RESOURCE_BUNDLE.getString("message.spinner.releasing_distribution_percents"),
release.getProgress()));
Thread.sleep(1000);

release = client.getDistributionStringsBasedRelease(hash);

if ("failed".equalsIgnoreCase(release.getStatus())) {
throw new RuntimeException(RESOURCE_BUNDLE.getString("error.distribution_failed"));
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,8 @@ public void act(Outputter out, ProjectProperties properties, ProjectClient clien
CrowdinProjectFull project = ConsoleSpinner
.execute(out, "message.spinner.fetching_project_info", "error.collect_project_info",
true, true, client::downloadFullProject);
if (Objects.equals(project.getType(), Type.STRINGS_BASED)) {
boolean isStringsBasedProject = Objects.equals(project.getType(), Type.STRINGS_BASED);
if (isStringsBasedProject) {
out.println(SKIPPED.withIcon(RESOURCE_BUNDLE.getString("message.no_file_string_project")));
return;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,8 @@ public void act(Outputter out, ProjectProperties properties, ProjectClient clien
CrowdinProjectFull project = ConsoleSpinner
.execute(out, "message.spinner.fetching_project_info", "error.collect_project_info",
false, false, () -> client.downloadFullProject(branch));
if (Objects.equals(project.getType(), Type.STRINGS_BASED)) {
boolean isStringsBasedProject = Objects.equals(project.getType(), Type.STRINGS_BASED);
if (isStringsBasedProject) {
out.println(WARNING.withIcon(RESOURCE_BUNDLE.getString("message.no_file_string_project")));
return;
}
Expand Down
Loading

0 comments on commit 8d00c4b

Please sign in to comment.