diff --git a/.github/workflows/build.yml b/.github/workflows/build-release.yml
similarity index 78%
rename from .github/workflows/build.yml
rename to .github/workflows/build-release.yml
index b7b2e67..f90255f 100644
--- a/.github/workflows/build.yml
+++ b/.github/workflows/build-release.yml
@@ -1,6 +1,8 @@
-name: Build executables
+name: Build and release
on:
+ release:
+ types: [created]
push:
branches:
- 'master'
@@ -11,9 +13,6 @@ concurrency:
group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}
cancel-in-progress: true
-env:
- ACTIONS_ALLOW_UNSECURE_COMMANDS: true
-
jobs:
build-jar:
name: "Build JAR"
@@ -30,12 +29,20 @@ jobs:
- name: "Build JAR"
run: mvn -DskipTests -Pfatjar clean package
- name: 'Get version'
- run: echo "::set-env name=VERSION::$(mvn help:evaluate -Dexpression=project.version -q -DforceStdout)"
+ run: echo "VERSION=$(mvn help:evaluate -Dexpression=project.version -q -DforceStdout)" >> $GITHUB_ENV
- name: 'Upload artifact'
uses: actions/upload-artifact@v4
with:
name: 'simplelocalize-cli-${{env.VERSION}}.jar'
path: 'target/simplelocalize-cli-${{env.VERSION}}.jar'
+ - name: 'Upload JAR to Release'
+ if: github.event_name == 'release'
+ uses: softprops/action-gh-release@v1
+ with:
+ files: 'target/simplelocalize-cli-${{env.VERSION}}.jar'
+ env:
+ GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+
build-executable:
name: "Build ${{ matrix.label }} executable"
strategy:
@@ -85,3 +92,10 @@ jobs:
with:
name: simplelocalize-cli-${{ matrix.label }}
path: ./target/${{ matrix.downloadFilename }}
+ - name: 'Upload Executable to Release'
+ if: github.event_name == 'release'
+ uses: softprops/action-gh-release@v1
+ with:
+ files: './target/${{ matrix.downloadFilename }}'
+ env:
+ GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
diff --git a/.github/workflows/run-tests.yml b/.github/workflows/run-tests.yml
index 36bc496..0f8b062 100644
--- a/.github/workflows/run-tests.yml
+++ b/.github/workflows/run-tests.yml
@@ -10,9 +10,6 @@ concurrency:
group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}
cancel-in-progress: true
-env:
- ACTIONS_ALLOW_UNSECURE_COMMANDS: true
-
jobs:
run_tests:
name: "Run tests"
@@ -36,8 +33,3 @@ jobs:
restore-keys: ${{ runner.os }}-sonar
- name: "Test with Maven"
run: mvn --settings .maven.xml clean install -B -V
-# - name: "SonarCloud Analyze"
-# env:
-# GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
-# SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }}
-# run: mvn clean -B verify -Ptest org.sonarsource.scanner.maven:sonar-maven-plugin:sonar
diff --git a/.github/workflows/install-execute.yml b/.github/workflows/test-executables.yml
similarity index 90%
rename from .github/workflows/install-execute.yml
rename to .github/workflows/test-executables.yml
index e21f0d8..069f205 100644
--- a/.github/workflows/install-execute.yml
+++ b/.github/workflows/test-executables.yml
@@ -1,9 +1,6 @@
-name: Install and execute
+name: Test executables
on:
- push:
- branches:
- - 'master'
release:
types: [published]
schedule:
@@ -21,7 +18,7 @@ jobs:
fail-fast: false
matrix:
os: [ macos-11, macos-12, macos-13, ubuntu-22.04 ]
- version: [ '2.5', '2.4', '2.3', '2.2' ]
+ version: [ '2.9', '2.8', '2.7', '2.6' ]
steps:
- uses: actions/checkout@v3
- name: Test on ${{ matrix.os }}
diff --git a/pom.xml b/pom.xml
index 94a1905..fbb2150 100644
--- a/pom.xml
+++ b/pom.xml
@@ -4,7 +4,7 @@
4.0.0
io.simplelocalize
simplelocalize-cli
- 2.9.0
+ 2.10.0
jar
simplelocalize-cli
Official SimpleLocalize Command Line Interface
diff --git a/reflect-config.json b/reflect-config.json
index df955d1..70c1469 100644
--- a/reflect-config.json
+++ b/reflect-config.json
@@ -15,6 +15,7 @@
"java.lang.String",
"java.lang.String",
"java.util.List",
+ "java.util.List",
"java.lang.String",
"java.lang.String",
"java.lang.String",
@@ -48,6 +49,7 @@
"java.lang.String",
"java.lang.String",
"java.util.List",
+ "java.util.List",
"java.lang.String",
"java.lang.String",
"java.lang.String",
diff --git a/src/main/java/io/simplelocalize/cli/SimplelocalizeCliCommand.java b/src/main/java/io/simplelocalize/cli/SimplelocalizeCliCommand.java
index 137c85d..c30f993 100644
--- a/src/main/java/io/simplelocalize/cli/SimplelocalizeCliCommand.java
+++ b/src/main/java/io/simplelocalize/cli/SimplelocalizeCliCommand.java
@@ -91,6 +91,7 @@ public void upload(
@Option(names = {"--uploadPath", "--path"}, description = "Path to file with translation or translation keys to upload. Use '{lang}' to define language key if you are uploading more than one file with translations.") String uploadPath,
@Option(names = {"--uploadFormat", "--format"}, description = "Translations file format") String uploadFormat,
@Option(names = {"--uploadOptions", "--options"}, split = ",", description = "(Optional) Upload options") List uploadOptions,
+ @Option(names = {"--uploadTags", "--tags"}, split = ",", description = "(Optional) Assign tags to translation keys") List tags,
@Option(names = {"--uploadNamespace", "--namespace"}, description = "(Optional) Specify namespace for single file upload (cannot be used with {ns} in uploadPath)") String namespace,
@Option(names = {"--uploadLanguageKey", "--languageKey"}, description = "(Optional) Specify language key for single file upload (cannot be used with {lang} in uploadPath)") String languageKey,
@Option(names = {"--uploadCustomerId", "--customerId"}, description = "(Optional) Assign customerId to uploaded translations") String customerId,
@@ -140,6 +141,11 @@ public void upload(
configuration.setUploadNamespace(namespace);
}
+ if (tags != null && !tags.isEmpty())
+ {
+ configuration.setUploadTags(tags);
+ }
+
List effectiveUploadOptions = new ArrayList<>();
List configurationUploadOptions = configuration.getUploadOptions();
if (configurationUploadOptions != null)
@@ -190,6 +196,7 @@ public void download(
@Option(names = {"--downloadPath", "--path"}, description = "Directory where translations should be downloaded") String downloadPath,
@Option(names = {"--downloadFormat", "--format"}, description = "Translations file format") String downloadFormat,
@Option(names = {"--downloadOptions", "--options"}, split = ",", description = "(Optional) Download options, use comma separated values for multiple options") List downloadOptions,
+ @Option(names = {"--downloadTags", "--tags"}, split = ",", description = "(Optional) Download translation keys with given tags") List tags,
@Option(names = {"--downloadSort", "--sort"}, description = "(Optional) Download sorting") String downloadSort,
@Option(names = {"--downloadLanguageKey", "--languageKey"}, split = ",", description = "(Optional) Download translations only for given language key, use comma separated values for multiple keys") List languageKeys,
@Option(names = {"--downloadCustomerId", "--customerId"}, description = "(Optional) Download translations only for given customerId") String customerId,
@@ -242,6 +249,11 @@ public void download(
configuration.setDownloadSort(downloadSort);
}
+ if (tags != null && !tags.isEmpty())
+ {
+ configuration.setDownloadTags(tags);
+ }
+
List nonNullConfigurationFileDownloadOptions = Objects.requireNonNullElse(configuration.getDownloadOptions(), List.of());
configuration.setDownloadOptions(nonNullConfigurationFileDownloadOptions);
boolean hasArgumentDownloadOptions = downloadOptions != null && !downloadOptions.isEmpty();
diff --git a/src/main/java/io/simplelocalize/cli/Version.java b/src/main/java/io/simplelocalize/cli/Version.java
index ff9a7f2..3d9f685 100644
--- a/src/main/java/io/simplelocalize/cli/Version.java
+++ b/src/main/java/io/simplelocalize/cli/Version.java
@@ -3,7 +3,7 @@
public class Version
{
- public static final String NUMBER = "2.9.0";
+ public static final String NUMBER = "2.10.0";
private Version()
{
diff --git a/src/main/java/io/simplelocalize/cli/client/SimpleLocalizeUriFactory.java b/src/main/java/io/simplelocalize/cli/client/SimpleLocalizeUriFactory.java
index 626c1b5..3c5e2c5 100644
--- a/src/main/java/io/simplelocalize/cli/client/SimpleLocalizeUriFactory.java
+++ b/src/main/java/io/simplelocalize/cli/client/SimpleLocalizeUriFactory.java
@@ -7,6 +7,7 @@
import java.net.URI;
import java.nio.file.Path;
import java.util.List;
+import java.util.Objects;
public class SimpleLocalizeUriFactory
{
@@ -33,6 +34,12 @@ URI buildDownloadUri(ExportRequest exportRequest)
endpointUrl += "&downloadOptions=" + String.join(",", downloadOptions);
}
+ List tags = Objects.requireNonNullElse(exportRequest.tags(), List.of());
+ if (!tags.isEmpty())
+ {
+ endpointUrl += "&tags=" + String.join(",", tags);
+ }
+
String namespace = exportRequest.namespace();
if (StringUtils.isNotEmpty(namespace))
{
@@ -76,6 +83,12 @@ URI buildUploadUri(UploadRequest uploadRequest, boolean isPreviewMode)
endpointUrl += "&uploadOptions=" + String.join(",", uploadOptions);
}
+ List tags = Objects.requireNonNullElse(uploadRequest.tags(), List.of());
+ if (!tags.isEmpty())
+ {
+ endpointUrl += "&tags=" + String.join(",", tags);
+ }
+
String namespace = uploadRequest.namespace();
if (StringUtils.isNotEmpty(namespace))
{
diff --git a/src/main/java/io/simplelocalize/cli/client/dto/ExportRequest.java b/src/main/java/io/simplelocalize/cli/client/dto/ExportRequest.java
index 25bb3f0..0b0ef73 100644
--- a/src/main/java/io/simplelocalize/cli/client/dto/ExportRequest.java
+++ b/src/main/java/io/simplelocalize/cli/client/dto/ExportRequest.java
@@ -11,7 +11,8 @@ public record ExportRequest(
String customerId,
String namespace,
List options,
- String sort
+ String sort,
+ List tags
)
{
}
diff --git a/src/main/java/io/simplelocalize/cli/client/dto/UploadRequest.java b/src/main/java/io/simplelocalize/cli/client/dto/UploadRequest.java
index dd4b49e..e759e54 100644
--- a/src/main/java/io/simplelocalize/cli/client/dto/UploadRequest.java
+++ b/src/main/java/io/simplelocalize/cli/client/dto/UploadRequest.java
@@ -13,7 +13,8 @@ public record UploadRequest(
List options,
String namespace,
String customerId,
- String translationKey
+ String translationKey,
+ List tags
)
{
}
diff --git a/src/main/java/io/simplelocalize/cli/client/dto/proxy/Configuration.java b/src/main/java/io/simplelocalize/cli/client/dto/proxy/Configuration.java
index 199ee79..7632bbe 100644
--- a/src/main/java/io/simplelocalize/cli/client/dto/proxy/Configuration.java
+++ b/src/main/java/io/simplelocalize/cli/client/dto/proxy/Configuration.java
@@ -52,6 +52,9 @@ public class Configuration
@Builder.Default
private List uploadOptions = new ArrayList<>();
+ @Builder.Default
+ private List uploadTags = new ArrayList<>();
+
@Builder.Default
private Boolean dryRun = false;
@@ -68,6 +71,9 @@ public class Configuration
@Builder.Default
private List downloadOptions = new ArrayList<>();
+ @Builder.Default
+ private List downloadTags = new ArrayList<>();
+
@Builder.Default
private List downloadLanguageKeys = new ArrayList<>();
diff --git a/src/main/java/io/simplelocalize/cli/command/DownloadCommand.java b/src/main/java/io/simplelocalize/cli/command/DownloadCommand.java
index 8b642a8..bf482ce 100644
--- a/src/main/java/io/simplelocalize/cli/command/DownloadCommand.java
+++ b/src/main/java/io/simplelocalize/cli/command/DownloadCommand.java
@@ -13,6 +13,7 @@
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
+import java.util.Objects;
public class DownloadCommand implements CliCommand
{
@@ -41,7 +42,13 @@ public void invoke() throws IOException, InterruptedException
final List languageKeys = configuration.getDownloadLanguageKeys();
if (!languageKeys.isEmpty())
{
- log.info("Language(s): {}", languageKeys);
+ log.info("Languages: {}", languageKeys);
+ }
+
+ final List tags = Objects.requireNonNullElse(configuration.getDownloadTags(), List.of());
+ if (!tags.isEmpty())
+ {
+ log.info("Tags: {}", tags);
}
final String sort = configuration.getDownloadSort();
@@ -90,6 +97,7 @@ public void invoke() throws IOException, InterruptedException
.withCustomerId(customerId)
.withOptions(downloadOptions)
.withSort(sort)
+ .withTags(tags)
.build();
final List downloadableFiles = client.exportFiles(exportRequest);
for (DownloadableFile downloadableFile : downloadableFiles)
diff --git a/src/main/java/io/simplelocalize/cli/command/UploadCommand.java b/src/main/java/io/simplelocalize/cli/command/UploadCommand.java
index 2face19..4d13ccf 100644
--- a/src/main/java/io/simplelocalize/cli/command/UploadCommand.java
+++ b/src/main/java/io/simplelocalize/cli/command/UploadCommand.java
@@ -63,6 +63,12 @@ public void invoke() throws IOException, InterruptedException
log.info("Language: {}", uploadLanguageKey);
}
+ final List uploadTags = configuration.getUploadTags();
+ if (!uploadTags.isEmpty())
+ {
+ log.info("Tags: {}", uploadTags);
+ }
+
final String uploadNamespace = configuration.getUploadNamespace();
final boolean hasDefinedNamespace = StringUtils.isNotBlank(uploadNamespace);
if (hasDefinedNamespace)
@@ -120,6 +126,7 @@ public void invoke() throws IOException, InterruptedException
.withNamespace(effectiveNamespace)
.withCustomerId(uploadCustomerId)
.withOptions(uploadOptions)
+ .withTags(uploadTags)
.build();
String logMessage = "";
diff --git a/src/test/java/io/simplelocalize/cli/command/DownloadCommandTest.java b/src/test/java/io/simplelocalize/cli/command/DownloadCommandTest.java
index ec59417..2335bff 100644
--- a/src/test/java/io/simplelocalize/cli/command/DownloadCommandTest.java
+++ b/src/test/java/io/simplelocalize/cli/command/DownloadCommandTest.java
@@ -36,6 +36,7 @@ void shouldDownloadMultipleFiles() throws Exception
.withFormat("android")
.withLanguageKeys(List.of("en"))
.withOptions(List.of("SPLIT_BY_NAMESPACES"))
+ .withTags(List.of())
.build()))
.thenReturn(List.of(
DownloadableFile.builder().withNamespace("common").withUrl("https://s3.simplelocalize.io/file1.xml").build(),
diff --git a/src/test/java/io/simplelocalize/cli/command/UploadCommandTest.java b/src/test/java/io/simplelocalize/cli/command/UploadCommandTest.java
index d771d82..4587445 100644
--- a/src/test/java/io/simplelocalize/cli/command/UploadCommandTest.java
+++ b/src/test/java/io/simplelocalize/cli/command/UploadCommandTest.java
@@ -13,6 +13,7 @@
import java.nio.file.Path;
import java.util.Collections;
+import java.util.List;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.Mockito.times;
@@ -58,6 +59,7 @@ public void shouldUploadTwelveFiles() throws Exception
.withPath(Path.of("./junit/download-test/values-{lang}/strings.xml"))
.withFormat("android")
.withOptions(Collections.emptyList())
+ .withTags(List.of())
.build(),
"languageKey", "path"
)
@@ -85,6 +87,7 @@ public void shouldUploadOneFileWithLangTemplate() throws Exception
.withFormat("android")
.withLanguageKey("en")
.withOptions(Collections.emptyList())
+ .withTags(List.of())
.build(),
"path"
)
@@ -112,6 +115,7 @@ public void shouldUploadOneFileWithOnlyTranslationKeys() throws Exception
.withFormat("android")
.withLanguageKey("en")
.withOptions(Collections.emptyList())
+ .withTags(List.of())
.build()
)
);
@@ -155,6 +159,7 @@ public void shouldUploadOneFile() throws Exception
.withFormat("android")
.withLanguageKey("en")
.withOptions(Collections.emptyList())
+ .withTags(List.of())
.build(),
"path"
)