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" )