Skip to content

Commit

Permalink
Merge pull request #316 from crowdin/download-targets
Browse files Browse the repository at this point in the history
Add new function - download targets and pseudolocalization
  • Loading branch information
andrii-bodnar committed Nov 9, 2020
2 parents 8875f43 + 275b262 commit 8b41ba6
Show file tree
Hide file tree
Showing 149 changed files with 4,001 additions and 2,664 deletions.
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

0 comments on commit 8b41ba6

Please sign in to comment.