Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add new function - download targets and pseudolocalization #316

Merged
merged 12 commits into from
Nov 9, 2020
2 changes: 1 addition & 1 deletion build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,7 @@ dependencies {

implementation 'info.picocli:picocli:4.5.0'

implementation 'com.github.crowdin:crowdin-api-client-java:1.2.10'
implementation 'com.github.crowdin:crowdin-api-client-java:1.2.12'

testImplementation 'org.junit.jupiter:junit-jupiter:5.5.2'
testImplementation 'org.hamcrest:hamcrest:2.2'
Expand Down
12 changes: 12 additions & 0 deletions src/main/java/com/crowdin/cli/BaseCli.java
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,8 @@ public class BaseCli {
public static final String DEFAULT_GLOSSARY_NAME = "Created in Crowdin CLI (%s)";
public static final String DEFAULT_TM_NAME = "Created in Crowdin CLI (%s)";

public static final String ALL = "ALL";

public static final List<String> DEFAULT_IDENTITY_FILES = Collections.unmodifiableList(Arrays.asList(
System.getProperty("user.home") + Utils.PATH_SEPARATOR + ".crowdin.yml",
System.getProperty("user.home") + Utils.PATH_SEPARATOR + ".crowdin.yaml"
Expand All @@ -29,6 +31,16 @@ public class BaseCli {
}}
);

/**
* File format -> Export File Format (see https://support.crowdin.com/api/v2/#operation/api.projects.translations.exports.post)
*/
public static final Map<String, String> FILE_FORMAT_MAPPER = Collections.unmodifiableMap(new HashMap<String, String>() {{
put("xliff", "xliff");
put("xml", "android");
put("strings", "macosx");
}}
);

public static final ResourceBundle RESOURCE_BUNDLE = ResourceBundle.getBundle("messages/messages");

public static final String URL_OAUTH_AUTH = "https://accounts.crowdin.com/oauth/authorize?client_id=%s&redirect_uri=%s&response_type=token&scope=project";
Expand Down
6 changes: 4 additions & 2 deletions src/main/java/com/crowdin/cli/Cli.java
Original file line number Diff line number Diff line change
Expand Up @@ -4,16 +4,18 @@
import com.crowdin.cli.commands.actions.CliActions;
import com.crowdin.cli.commands.picocli.CommandNames;
import com.crowdin.cli.commands.picocli.PicocliRunner;
import com.crowdin.cli.properties.PropertiesBuilders;

public class Cli {

public static void main(String[] args) {
try {
PicocliRunner picocliRunner = PicocliRunner.getInstance();
Actions actions = new CliActions();
int exitCode = picocliRunner.execute(actions, args);
PropertiesBuilders propertiesBuilders = new PropertiesBuilders();
int exitCode = picocliRunner.execute(actions, propertiesBuilders, args);
if (exitCode != -1 && !picocliRunner.hasMatchedArg("plain")) {
picocliRunner.execute(actions, CommandNames.CHECK_NEW_VERSION);
picocliRunner.execute(actions, propertiesBuilders, CommandNames.CHECK_NEW_VERSION);
}

System.exit(exitCode);
Expand Down
145 changes: 0 additions & 145 deletions src/main/java/com/crowdin/cli/client/Client.java
Original file line number Diff line number Diff line change
@@ -1,149 +1,4 @@
package com.crowdin.cli.client;

import com.crowdin.cli.commands.functionality.PropertiesBeanUtils;
import com.crowdin.cli.utils.Utils;
import com.crowdin.client.core.http.impl.json.JacksonJsonTransformer;
import com.crowdin.client.core.model.ClientConfig;
import com.crowdin.client.core.model.Credentials;
import com.crowdin.client.core.model.PatchRequest;
import com.crowdin.client.glossaries.model.AddGlossaryRequest;
import com.crowdin.client.glossaries.model.ExportGlossaryRequest;
import com.crowdin.client.glossaries.model.Glossary;
import com.crowdin.client.glossaries.model.GlossaryExportStatus;
import com.crowdin.client.glossaries.model.GlossaryImportStatus;
import com.crowdin.client.glossaries.model.ImportGlossaryRequest;
import com.crowdin.client.glossaries.model.Term;
import com.crowdin.client.sourcefiles.model.AddBranchRequest;
import com.crowdin.client.sourcefiles.model.AddDirectoryRequest;
import com.crowdin.client.sourcefiles.model.AddFileRequest;
import com.crowdin.client.sourcefiles.model.Branch;
import com.crowdin.client.sourcefiles.model.Directory;
import com.crowdin.client.sourcefiles.model.UpdateFileRequest;
import com.crowdin.client.sourcestrings.model.AddSourceStringRequest;
import com.crowdin.client.sourcestrings.model.SourceString;
import com.crowdin.client.translationmemory.model.AddTranslationMemoryRequest;
import com.crowdin.client.translationmemory.model.TranslationMemory;
import com.crowdin.client.translationmemory.model.TranslationMemoryExportRequest;
import com.crowdin.client.translationmemory.model.TranslationMemoryExportStatus;
import com.crowdin.client.translationmemory.model.TranslationMemoryImportRequest;
import com.crowdin.client.translationmemory.model.TranslationMemoryImportStatus;
import com.crowdin.client.translations.model.BuildProjectTranslationRequest;
import com.crowdin.client.translations.model.ProjectBuild;
import com.crowdin.client.translations.model.UploadTranslationsRequest;
import com.crowdin.client.translationstatus.model.LanguageProgress;

import java.io.InputStream;
import java.net.Authenticator;
import java.net.PasswordAuthentication;
import java.net.URL;
import java.util.List;
import java.util.Optional;

public interface Client {

CrowdinProjectFull downloadFullProject();

CrowdinProject downloadProjectWithLanguages();

CrowdinProjectInfo downloadProjectInfo();

Branch addBranch(AddBranchRequest request);

Long uploadStorage(String fileName, InputStream content);

Directory addDirectory(AddDirectoryRequest request) throws ResponseException;

void updateSource(Long sourceId, UpdateFileRequest request);

void addSource(AddFileRequest request);

void uploadTranslations(String languageId, UploadTranslationsRequest request);

ProjectBuild startBuildingTranslation(BuildProjectTranslationRequest request);

ProjectBuild checkBuildingTranslation(Long buildId);

URL downloadBuild(Long buildId);

List<LanguageProgress> getProjectProgress(String languageId);

SourceString addSourceString(AddSourceStringRequest request);

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

void deleteSourceString(Long id);

SourceString editSourceString(Long sourceId, List<PatchRequest> requests);

List<Glossary> listGlossaries();

Optional<Glossary> getGlossary(Long glossaryId);

Glossary addGlossary(AddGlossaryRequest request);

GlossaryImportStatus importGlossary(Long glossaryId, ImportGlossaryRequest request);

List<Term> listTerms(Long glossaryId);

GlossaryExportStatus startExportingGlossary(Long glossaryId, ExportGlossaryRequest request);

GlossaryExportStatus checkExportingGlossary(Long glossaryId, String exportId);

URL downloadGlossary(Long glossaryId, String exportId);

List<TranslationMemory> listTms();

Optional<TranslationMemory> getTm(Long tmId);

TranslationMemory addTm(AddTranslationMemoryRequest request);

TranslationMemoryImportStatus importTm(Long tmId, TranslationMemoryImportRequest request);

TranslationMemoryExportStatus startExportingTm(Long tmId, TranslationMemoryExportRequest request);

TranslationMemoryExportStatus checkExportingTm(Long tmId, String exportId);

URL downloadTm(Long tmId, String exportId);

static Client getDefault(String apiToken, String baseUrl, long projectId) {
boolean isTesting = PropertiesBeanUtils.isUrlForTesting(baseUrl);
String organization = PropertiesBeanUtils.getOrganization(baseUrl);
Credentials credentials = (isTesting)
? new Credentials(apiToken, organization, baseUrl)
: new Credentials(apiToken, organization);
ClientConfig clientConfig = ClientConfig.builder()
.jsonTransformer(new JacksonJsonTransformer())
.userAgent(Utils.buildUserAgent())
.build();
Utils.proxyHost()
.map(pair -> new ClientConfig.Host(pair.getKey(), pair.getValue()))
.ifPresent(proxy -> {
clientConfig.setProxy(proxy);

System.setProperty("https.proxyHost", proxy.getHost());
System.setProperty("https.proxyPort", String.valueOf(proxy.getPort()));
});
Utils.proxyCredentials()
.map(pair -> new ClientConfig.UsernamePasswordCredentials(pair.getKey(), pair.getValue()))
.ifPresent(proxyCreds -> {
clientConfig.setProxyCreds(proxyCreds);
if (proxyCreds.getUsername() != null && proxyCreds.getPassword() != null) {
Authenticator.setDefault(
new Authenticator() {
@Override
public PasswordAuthentication getPasswordAuthentication() {
if (getRequestorType() == RequestorType.PROXY) {
return new PasswordAuthentication(proxyCreds.getUsername(), proxyCreds.getPassword().toCharArray());
} else {
return null;
}
}
}
);
System.setProperty("jdk.http.auth.tunneling.disabledSchemes", "");
}
});
com.crowdin.client.Client client = new com.crowdin.client.Client(credentials, clientConfig);
return new CrowdinClient(client, projectId);
}
}
35 changes: 35 additions & 0 deletions src/main/java/com/crowdin/cli/client/ClientGlossary.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
package com.crowdin.cli.client;

import com.crowdin.client.glossaries.model.AddGlossaryRequest;
import com.crowdin.client.glossaries.model.ExportGlossaryRequest;
import com.crowdin.client.glossaries.model.Glossary;
import com.crowdin.client.glossaries.model.GlossaryExportStatus;
import com.crowdin.client.glossaries.model.GlossaryImportStatus;
import com.crowdin.client.glossaries.model.ImportGlossaryRequest;
import com.crowdin.client.glossaries.model.Term;

import java.io.InputStream;
import java.net.URL;
import java.util.List;
import java.util.Optional;

public interface ClientGlossary extends Client {

List<Glossary> listGlossaries();

Optional<Glossary> getGlossary(Long glossaryId);

Glossary addGlossary(AddGlossaryRequest request);

GlossaryImportStatus importGlossary(Long glossaryId, ImportGlossaryRequest request);

GlossaryExportStatus startExportingGlossary(Long glossaryId, ExportGlossaryRequest request);

GlossaryExportStatus checkExportingGlossary(Long glossaryId, String exportId);

URL downloadGlossary(Long glossaryId, String exportId);

List<Term> listTerms(Long glossaryId);

Long uploadStorage(String fileName, InputStream content);
}
32 changes: 32 additions & 0 deletions src/main/java/com/crowdin/cli/client/ClientTm.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
package com.crowdin.cli.client;

import com.crowdin.client.translationmemory.model.AddTranslationMemoryRequest;
import com.crowdin.client.translationmemory.model.TranslationMemory;
import com.crowdin.client.translationmemory.model.TranslationMemoryExportRequest;
import com.crowdin.client.translationmemory.model.TranslationMemoryExportStatus;
import com.crowdin.client.translationmemory.model.TranslationMemoryImportRequest;
import com.crowdin.client.translationmemory.model.TranslationMemoryImportStatus;

import java.io.InputStream;
import java.net.URL;
import java.util.List;
import java.util.Optional;

public interface ClientTm extends Client {

List<TranslationMemory> listTms();

Optional<TranslationMemory> getTm(Long tmId);

TranslationMemory addTm(AddTranslationMemoryRequest request);

TranslationMemoryImportStatus importTm(Long tmId, TranslationMemoryImportRequest request);

TranslationMemoryExportStatus startExportingTm(Long tmId, TranslationMemoryExportRequest request);

TranslationMemoryExportStatus checkExportingTm(Long tmId, String exportId);

URL downloadTm(Long tmId, String exportId);

Long uploadStorage(String fileName, InputStream content);
}
78 changes: 78 additions & 0 deletions src/main/java/com/crowdin/cli/client/Clients.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,78 @@
package com.crowdin.cli.client;

import com.crowdin.cli.commands.functionality.PropertiesBeanUtils;
import com.crowdin.cli.utils.Utils;
import com.crowdin.client.core.http.impl.json.JacksonJsonTransformer;
import com.crowdin.client.core.model.ClientConfig;
import com.crowdin.client.core.model.Credentials;

import java.net.Authenticator;
import java.net.PasswordAuthentication;

public final class Clients {

private Clients() {}

public static NoClient noClient() {
return new NoClient() {

};
}

public static ClientGlossary getClientGlossary(String apiToken, String baseUrl) {
com.crowdin.client.Client client = prepareClient(apiToken, baseUrl);
return new CrowdinClientGlossary(client);
}

public static ClientTm getClientTm(String apiToken, String baseUrl) {
com.crowdin.client.Client client = prepareClient(apiToken, baseUrl);
return new CrowdinClientTm(client);
}

// mb divide args to move token and url to constructor?
public static ProjectClient getProjectClient(String apiToken, String baseUrl, long projectId) {
com.crowdin.client.Client client = prepareClient(apiToken, baseUrl);
return new CrowdinProjectClient(client, projectId);
}

public static com.crowdin.client.Client prepareClient(String apiToken, String baseUrl) {
boolean isTesting = PropertiesBeanUtils.isUrlForTesting(baseUrl);
String organization = PropertiesBeanUtils.getOrganization(baseUrl);
Credentials credentials = (isTesting)
? new Credentials(apiToken, organization, baseUrl)
: new Credentials(apiToken, organization);
ClientConfig clientConfig = ClientConfig.builder()
.jsonTransformer(new JacksonJsonTransformer())
.userAgent(Utils.buildUserAgent())
.build();
Utils.proxyHost()
.map(pair -> new ClientConfig.Host(pair.getKey(), pair.getValue()))
.ifPresent(proxy -> {
clientConfig.setProxy(proxy);

System.setProperty("https.proxyHost", proxy.getHost());
System.setProperty("https.proxyPort", String.valueOf(proxy.getPort()));
});
Utils.proxyCredentials()
.map(pair -> new ClientConfig.UsernamePasswordCredentials(pair.getKey(), pair.getValue()))
.ifPresent(proxyCreds -> {
clientConfig.setProxyCreds(proxyCreds);
if (proxyCreds.getUsername() != null && proxyCreds.getPassword() != null) {
Authenticator.setDefault(
new Authenticator() {
@Override
public PasswordAuthentication getPasswordAuthentication() {
if (getRequestorType() == RequestorType.PROXY) {
return new PasswordAuthentication(proxyCreds.getUsername(), proxyCreds.getPassword().toCharArray());
} else {
return null;
}
}
}
);
System.setProperty("jdk.http.auth.tunneling.disabledSchemes", "");
}
});
return new com.crowdin.client.Client(credentials, clientConfig);
}
}
13 changes: 13 additions & 0 deletions src/main/java/com/crowdin/cli/client/CrowdinClientCore.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,15 @@

import com.crowdin.client.core.http.exceptions.HttpBadRequestException;
import com.crowdin.client.core.http.exceptions.HttpException;
import com.crowdin.client.core.model.DownloadLink;
import com.crowdin.client.core.model.ResponseList;
import com.crowdin.client.core.model.ResponseObject;
import com.crowdin.client.storage.model.Storage;
import org.apache.commons.lang3.StringUtils;

import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.LinkedHashMap;
Expand Down Expand Up @@ -119,4 +124,12 @@ private static <T> List<T> unwrap(ResponseList<T> list) {
.map(ResponseObject::getData)
.collect(Collectors.toList());
}

protected URL url(DownloadLink downloadLink) {
try {
return new URL(downloadLink.getUrl());
} catch (IOException e) {
throw new RuntimeException("Unexpected exception: malformed download url: " + downloadLink.getUrl(), e);
}
}
}
Loading