Skip to content

Commit f36f853

Browse files
authored
feat: bundle command improvements (#929)
1 parent a6d2a8e commit f36f853

28 files changed

+572
-12
lines changed

src/main/java/com/crowdin/cli/client/ClientBundle.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@ public interface ClientBundle extends Client {
1515

1616
Bundle getBundle(Long id);
1717

18+
void deleteBundle(Long bundleId);
19+
1820
URL downloadBundle(Long id, String exportId);
1921

2022
BundleExport startExportingBundle(Long id) throws ResponseException;

src/main/java/com/crowdin/cli/client/CrowdinClientBundle.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,12 @@ public Bundle getBundle(Long bundleId) {
4242
.getData();
4343
}
4444

45+
@Override
46+
public void deleteBundle(Long bundleId) {
47+
executeRequest(() -> this.client.getBundlesApi()
48+
.deleteBundle(Long.valueOf(projectId), bundleId));
49+
}
50+
4551
@Override
4652
public URL downloadBundle(Long id, String exportId) {
4753
return url(executeRequest(() -> this.client.getBundlesApi()

src/main/java/com/crowdin/cli/commands/Actions.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -106,10 +106,14 @@ NewAction<ProjectProperties, ClientTask> taskAdd(
106106

107107
NewAction<ProjectProperties, ClientBundle> bundleList(boolean plainView, boolean isVerbose);
108108

109-
NewAction<ProjectProperties, ClientBundle> bundleAdd(String name, String format, List<String> source, List<String> ignore, String translation, List<Long> labels, boolean plainView, boolean includeProjectSourceLanguage, boolean isMultilingual);
109+
NewAction<ProjectProperties, ClientBundle> bundleAdd(String name, String format, List<String> source, List<String> ignore, String translation, List<Long> labels, boolean plainView, boolean includeProjectSourceLanguage, boolean includePseudoLanguage, boolean isMultilingual);
110+
111+
NewAction<ProjectProperties, ClientBundle> bundleDelete(Long id);
110112

111113
NewAction<ProjectProperties, ClientBundle> bundleBrowse(Long id);
112114

115+
NewAction<ProjectProperties, ClientBundle> bundleClone(Long id, String name, String format, List<String> source, List<String> ignore, String translation, List<Long> labels, boolean plainView, Boolean includeProjectSourceLanguage, Boolean includePseudoLanguage, Boolean isMultilingual);
116+
113117
NewAction<NoProperties, NoClient> checkNewVersion();
114118

115119
NewAction<PropertiesWithFiles, ProjectClient> preTranslate(

src/main/java/com/crowdin/cli/commands/actions/BundleAddAction.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,8 @@ class BundleAddAction implements NewAction<ProjectProperties, ClientBundle> {
3434

3535
private boolean includeProjectSourceLanguage;
3636

37+
private boolean includePseudoLanguage;
38+
3739
private boolean isMultilingual;
3840

3941
@Override
@@ -46,6 +48,7 @@ public void act(Outputter out, ProjectProperties pb, ClientBundle client) {
4648
Optional.ofNullable(ignore).ifPresent(addBundleRequest::setIgnorePatterns);
4749
Optional.ofNullable(translation).ifPresent(addBundleRequest::setExportPattern);
4850
addBundleRequest.setIncludeProjectSourceLanguage(includeProjectSourceLanguage);
51+
addBundleRequest.setIncludeInContextPseudoLanguage(includePseudoLanguage);
4952
addBundleRequest.setIsMultilingual(isMultilingual);
5053

5154
Optional.ofNullable(labels).ifPresent(addBundleRequest::setLabelIds);
Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
package com.crowdin.cli.commands.actions;
2+
3+
import com.crowdin.cli.client.ClientBundle;
4+
import com.crowdin.cli.commands.NewAction;
5+
import com.crowdin.cli.commands.Outputter;
6+
import com.crowdin.cli.commands.picocli.ExitCodeExceptionMapper;
7+
import com.crowdin.cli.properties.ProjectProperties;
8+
import com.crowdin.client.bundles.model.AddBundleRequest;
9+
import com.crowdin.client.bundles.model.Bundle;
10+
import lombok.AllArgsConstructor;
11+
12+
import java.util.List;
13+
import java.util.Objects;
14+
import java.util.Optional;
15+
16+
import static com.crowdin.cli.BaseCli.RESOURCE_BUNDLE;
17+
import static com.crowdin.cli.utils.console.ExecutionStatus.OK;
18+
import static com.crowdin.cli.utils.console.ExecutionStatus.SKIPPED;
19+
20+
@AllArgsConstructor
21+
class BundleCloneAction implements NewAction<ProjectProperties, ClientBundle> {
22+
23+
private Long id;
24+
private String name;
25+
private String format;
26+
private List<String> source;
27+
private List<String> ignore;
28+
private String translation;
29+
private List<Long> labels;
30+
private boolean plainView;
31+
private Boolean includeProjectSourceLanguage;
32+
private Boolean includePseudoLanguage;
33+
private Boolean isMultilingual;
34+
35+
@Override
36+
public void act(Outputter out, ProjectProperties pb, ClientBundle client) {
37+
Bundle bundleToClone = client.getBundle(id);
38+
if (Objects.isNull(bundleToClone)) {
39+
out.println(SKIPPED.withIcon(RESOURCE_BUNDLE.getString("message.bundle.not_found")));
40+
return;
41+
}
42+
AddBundleRequest addBundleRequest = new AddBundleRequest();
43+
addBundleRequest.setName(
44+
Objects.isNull(name) ? bundleToClone.getName() + " (clone)" : name
45+
);
46+
addBundleRequest.setFormat(Optional.ofNullable(format).orElse(bundleToClone.getFormat()));
47+
addBundleRequest.setSourcePatterns(Optional.ofNullable(source).orElse(bundleToClone.getSourcePatterns()));
48+
addBundleRequest.setIgnorePatterns(Optional.ofNullable(ignore).orElse(bundleToClone.getIgnorePatterns()));
49+
addBundleRequest.setExportPattern(Optional.ofNullable(translation).orElse(bundleToClone.getExportPattern()));
50+
addBundleRequest.setIncludeProjectSourceLanguage(Optional.ofNullable(includeProjectSourceLanguage).orElse(bundleToClone.getIncludeProjectSourceLanguage()));
51+
addBundleRequest.setIncludeInContextPseudoLanguage(Optional.ofNullable(includePseudoLanguage).orElse(bundleToClone.getIncludeInContextPseudoLanguage()));
52+
addBundleRequest.setIsMultilingual(Optional.ofNullable(isMultilingual).orElse(bundleToClone.isMultilingual()));
53+
addBundleRequest.setLabelIds(labels != null ? labels : bundleToClone.getLabelIds());
54+
55+
Bundle createdBundle;
56+
try {
57+
createdBundle = client.addBundle(addBundleRequest);
58+
} catch (Exception e) {
59+
throw ExitCodeExceptionMapper.remap(e, String.format(RESOURCE_BUNDLE.getString("error.bundle_is_not_cloned"), addBundleRequest));
60+
}
61+
62+
if (!plainView) {
63+
out.println(OK.withIcon(String.format(RESOURCE_BUNDLE.getString("message.bundle.list"), createdBundle.getId(),
64+
createdBundle.getFormat(),
65+
createdBundle.getExportPattern(), createdBundle.getName())));
66+
} else {
67+
out.println(String.valueOf(createdBundle.getId()));
68+
}
69+
}
70+
}
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
package com.crowdin.cli.commands.actions;
2+
3+
import com.crowdin.cli.client.ClientBundle;
4+
import com.crowdin.cli.commands.NewAction;
5+
import com.crowdin.cli.commands.Outputter;
6+
import com.crowdin.cli.properties.ProjectProperties;
7+
import com.crowdin.cli.utils.console.ExecutionStatus;
8+
import com.crowdin.client.bundles.model.Bundle;
9+
10+
import java.util.List;
11+
import java.util.Objects;
12+
13+
import static com.crowdin.cli.BaseCli.RESOURCE_BUNDLE;
14+
import static com.crowdin.cli.utils.console.ExecutionStatus.WARNING;
15+
16+
class BundleDeleteAction implements NewAction<ProjectProperties, ClientBundle> {
17+
18+
private final Long id;
19+
20+
public BundleDeleteAction(Long id) {
21+
this.id = id;
22+
}
23+
24+
@Override
25+
public void act(Outputter out, ProjectProperties pb, ClientBundle client) {
26+
Bundle bundleToDelete = client.getBundle(id);
27+
if (Objects.isNull(bundleToDelete)) {
28+
out.println(WARNING.withIcon(RESOURCE_BUNDLE.getString("message.bundle.not_found")));
29+
return;
30+
}
31+
client.deleteBundle(id);
32+
out.println(ExecutionStatus.OK.withIcon(
33+
String.format(RESOURCE_BUNDLE.getString("message.bundle_deleted"), id)
34+
));
35+
}
36+
}

src/main/java/com/crowdin/cli/commands/actions/CliActions.java

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -215,15 +215,25 @@ public NewAction<ProjectProperties, ClientBundle> bundleList(boolean plainView,
215215
}
216216

217217
@Override
218-
public NewAction<ProjectProperties, ClientBundle> bundleAdd(String name, String format, List<String> source, List<String> ignore, String translation, List<Long> labels, boolean plainView, boolean includeProjectSourceLanguage, boolean isMultilingual) {
219-
return new BundleAddAction(name, format, source, ignore, translation, labels, plainView, includeProjectSourceLanguage, isMultilingual);
218+
public NewAction<ProjectProperties, ClientBundle> bundleAdd(String name, String format, List<String> source, List<String> ignore, String translation, List<Long> labels, boolean plainView, boolean includeProjectSourceLanguage, boolean includePseudoLanguage, boolean isMultilingual) {
219+
return new BundleAddAction(name, format, source, ignore, translation, labels, plainView, includeProjectSourceLanguage, includePseudoLanguage, isMultilingual);
220+
}
221+
222+
@Override
223+
public NewAction<ProjectProperties, ClientBundle> bundleDelete(Long id) {
224+
return new BundleDeleteAction(id);
220225
}
221226

222227
@Override
223228
public NewAction<ProjectProperties, ClientBundle> bundleBrowse(Long id) {
224229
return new BundleBrowseAction(id);
225230
}
226231

232+
@Override
233+
public NewAction<ProjectProperties, ClientBundle> bundleClone(Long id, String name, String format, List<String> source, List<String> ignore, String translation, List<Long> labels, boolean plainView, Boolean includeProjectSourceLanguage, Boolean includePseudoLanguage, Boolean isMultilingual) {
234+
return new BundleCloneAction(id, name, format, source, ignore, translation, labels, plainView, includeProjectSourceLanguage, includePseudoLanguage, isMultilingual);
235+
}
236+
227237
@Override
228238
public NewAction<NoProperties, NoClient> checkNewVersion() {
229239
return new CheckNewVersionAction();

src/main/java/com/crowdin/cli/commands/picocli/BranchCloneSubcommand.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010

1111
@Command(
1212
sortOptions = false,
13-
name = CommandNames.BRANCH_CLONE
13+
name = CommandNames.CLONE
1414
)
1515
class BranchCloneSubcommand extends ActCommandProject {
1616

src/main/java/com/crowdin/cli/commands/picocli/BundleAddSubcommand.java

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,8 @@
1111
import java.util.List;
1212

1313
@CommandLine.Command(
14-
name = CommandNames.ADD
14+
name = CommandNames.ADD,
15+
sortOptions = false
1516
)
1617
class BundleAddSubcommand extends ActCommandBundle {
1718

@@ -39,6 +40,9 @@ class BundleAddSubcommand extends ActCommandBundle {
3940
@CommandLine.Option(names = {"--include-source-language"}, paramLabel = "...", descriptionKey = "crowdin.bundle.add.includeProjectSourceLanguage", order = -2)
4041
protected boolean includeProjectSourceLanguage;
4142

43+
@CommandLine.Option(names = {"--include-pseudo-language"}, paramLabel = "...", descriptionKey = "crowdin.bundle.add.includePseudoLanguage", order = -2)
44+
protected boolean includePseudoLanguage = true;
45+
4246
@CommandLine.Option(names = {"--multilingual"}, paramLabel = "...", descriptionKey = "crowdin.bundle.add.isMultilingual", order = -2)
4347
protected boolean isMultilingual;
4448

@@ -49,7 +53,7 @@ protected final boolean isAnsi() {
4953

5054
@Override
5155
protected NewAction<ProjectProperties, ClientBundle> getAction(Actions actions) {
52-
return actions.bundleAdd(name, format, source, ignore, translation, labels, plainView, includeProjectSourceLanguage, isMultilingual);
56+
return actions.bundleAdd(name, format, source, ignore, translation, labels, plainView, includeProjectSourceLanguage, includePseudoLanguage, isMultilingual);
5357
}
5458

5559
@Override
Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
package com.crowdin.cli.commands.picocli;
2+
3+
import com.crowdin.cli.client.ClientBundle;
4+
import com.crowdin.cli.commands.Actions;
5+
import com.crowdin.cli.commands.NewAction;
6+
import com.crowdin.cli.properties.ProjectProperties;
7+
import org.apache.logging.log4j.util.Strings;
8+
import picocli.CommandLine;
9+
10+
import java.util.ArrayList;
11+
import java.util.List;
12+
13+
@CommandLine.Command(
14+
name = CommandNames.CLONE,
15+
sortOptions = false
16+
)
17+
class BundleCloneSubcommand extends ActCommandBundle {
18+
19+
@CommandLine.Parameters(descriptionKey = "crowdin.bundle.clone.id")
20+
protected Long id;
21+
22+
@CommandLine.Option(names = {"--name"}, paramLabel = "...", descriptionKey = "crowdin.bundle.add.name", order = -2)
23+
protected String name;
24+
25+
@CommandLine.Option(names = {"--format"}, paramLabel = "...", descriptionKey = "crowdin.bundle.add.format", order = -2)
26+
protected String format;
27+
28+
@CommandLine.Option(names = {"--source"}, paramLabel = "...", descriptionKey = "crowdin.bundle.add.source", order = -2)
29+
protected List<String> source;
30+
31+
@CommandLine.Option(names = {"--ignore"}, paramLabel = "...", descriptionKey = "crowdin.bundle.add.ignore", order = -2)
32+
protected List<String> ignore;
33+
34+
@CommandLine.Option(names = {"--translation"}, paramLabel = "...", descriptionKey = "crowdin.bundle.add.translation", order = -2)
35+
protected String translation;
36+
37+
@CommandLine.Option(names = {"--label"}, paramLabel = "...", descriptionKey = "crowdin.bundle.add.label", order = -2)
38+
protected List<Long> labels;
39+
40+
@CommandLine.Option(names = {"--plain"}, descriptionKey = "crowdin.list.usage.plain")
41+
protected boolean plainView;
42+
43+
@CommandLine.Option(names = {"--include-source-language"}, paramLabel = "...", descriptionKey = "crowdin.bundle.add.includeProjectSourceLanguage", order = -2)
44+
protected Boolean includeProjectSourceLanguage;
45+
46+
@CommandLine.Option(names = {"--include-pseudo-language"}, paramLabel = "...", descriptionKey = "crowdin.bundle.add.includePseudoLanguage", order = -2)
47+
protected Boolean includePseudoLanguage;
48+
49+
@CommandLine.Option(names = {"--multilingual"}, paramLabel = "...", descriptionKey = "crowdin.bundle.add.isMultilingual", order = -2)
50+
protected Boolean isMultilingual;
51+
52+
@Override
53+
protected final boolean isAnsi() {
54+
return super.isAnsi() && !plainView;
55+
}
56+
57+
@Override
58+
protected NewAction<ProjectProperties, ClientBundle> getAction(Actions actions) {
59+
return actions.bundleClone(id, name, format, source, ignore, translation, labels, plainView, includeProjectSourceLanguage, includePseudoLanguage, isMultilingual);
60+
}
61+
}

0 commit comments

Comments
 (0)