Skip to content

Commit b9ab863

Browse files
authored
Merge pull request #26 from Kucoin/release/2025.03.04
Release/2025.03.04
2 parents 5feae81 + 08f0598 commit b9ab863

File tree

51 files changed

+1091
-112
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

51 files changed

+1091
-112
lines changed

CHANGELOG.md

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,13 @@
11
# Changelog
22

3+
## 2025-03-04(Python 1.1.1)
4+
- Update __init__.py to enhance the import experience
5+
- Reduce unnecessary log output
6+
- Optimize WebSocket reconnection logic
7+
8+
## 2025-02-26(Nodejs 0.1.0-alpha)
9+
- Release Node.js implementation
10+
311
## 2025-01-16(1.1.0)
412
- Updated the API sequence to be consistent with the documentation.
513
- Updated the license.

README.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -32,9 +32,9 @@ The **KuCoin Universal SDK** is the official SDK provided by KuCoin, offering a
3232

3333
## 🛠️ Installation
3434

35-
### Latest Version: `1.1.0`
35+
### Latest Version: `1.1.0`(Global API version)
3636

37-
### Python Installation
37+
### Python Installation(`1.1.1`)
3838

3939
```bash
4040
pip install kucoin-universal-sdk
@@ -47,7 +47,7 @@ go get github.com/Kucoin/kucoin-universal-sdk/sdk/golang
4747
go mod tidy
4848
```
4949

50-
### Node.js Installation (`0.1.0-alpha`)
50+
### Node.js Installation (`0.1.1-alpha`)
5151
Note: This SDK is currently in the Alpha phase. We are actively iterating and improving its features, stability, and documentation. Feedback and contributions are highly encouraged to help us refine the SDK.
5252
```bash
5353
npm install kucoin-universal-sdk

generator/plugin/src/main/java/com/kucoin/universal/sdk/plugin/generator/PythonSdkGenerator.java

Lines changed: 69 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
import com.kucoin.universal.sdk.plugin.service.impl.OperationServiceImpl;
1010
import com.kucoin.universal.sdk.plugin.service.impl.SchemaServiceImpl;
1111
import com.kucoin.universal.sdk.plugin.util.SpecificationUtil;
12+
import com.opencsv.CSVReader;
1213
import io.swagger.v3.oas.models.OpenAPI;
1314
import io.swagger.v3.oas.models.Operation;
1415
import io.swagger.v3.oas.models.media.Schema;
@@ -25,6 +26,7 @@
2526

2627
import javax.annotation.Nullable;
2728
import java.io.File;
29+
import java.io.FileReader;
2830
import java.util.*;
2931

3032
import static org.openapitools.codegen.utils.CamelizeOption.LOWERCASE_FIRST_LETTER;
@@ -44,6 +46,10 @@ public class PythonSdkGenerator extends AbstractPythonCodegen implements NameSer
4446
// map of codegen models
4547
private HashMap<String, CodegenModel> codegenModelMap = new HashMap<>();
4648

49+
// model export(init.py)
50+
private Set<String> exports = new LinkedHashSet<>();
51+
private Set<String> serviceExports = new LinkedHashSet<>();
52+
4753
private String service;
4854
private String subService;
4955

@@ -99,7 +105,7 @@ public void processOpts() {
99105
}
100106
case ENTRY: {
101107
apiTemplateFiles.put("api_entry.mustache", ".py");
102-
supportingFiles.add(new SupportingFile("module.mustache", String.format("./%s/__init__.py", "service")));
108+
supportingFiles.add(new SupportingFile("module_service.mustache", String.format("./%s/__init__.py", "service")));
103109
break;
104110
}
105111
case TEST: {
@@ -111,8 +117,8 @@ public void processOpts() {
111117
}
112118

113119
supportingFiles.add(new SupportingFile("version.mustache", "version.py"));
114-
supportingFiles.add(new SupportingFile("module.mustache", "__init__.py"));
115-
supportingFiles.add(new SupportingFile("module.mustache", String.format("./%s/__init__.py", service)));
120+
supportingFiles.add(new SupportingFile("module_empty.mustache", "__init__.py"));
121+
supportingFiles.add(new SupportingFile("module_empty.mustache", String.format("./%s/__init__.py", service)));
116122

117123
templateDir = "python-sdk";
118124

@@ -446,6 +452,18 @@ public OperationsMap postProcessOperationsWithModels(OperationsMap objs, List<Mo
446452

447453
case API:
448454
case TEST: {
455+
allModels.forEach(m-> {
456+
String importName = (String)m.get("importPath");
457+
String fileName = m.getModel().getClassFilename();
458+
// from .model_get_part_order_book_req import GetPartOrderBookReqBuilder
459+
exports.add(String.format("from .%s import %s", fileName, importName));
460+
if (m.getModel().getVendorExtensions().containsKey("x-request-model")) {
461+
exports.add(String.format("from .%s import %s", fileName, importName+"Builder"));
462+
}
463+
});
464+
exports.add(String.format("from .%s import %sAPI", toApiFilename(meta.getSubService()), formatService(meta.getSubService())));
465+
466+
449467
if (op.hasParams) {
450468
modelImport.addAll(generateApiImport(meta, true));
451469
}
@@ -459,6 +477,14 @@ public OperationsMap postProcessOperationsWithModels(OperationsMap objs, List<Mo
459477
}
460478
case WS:
461479
case WS_TEST: {
480+
allModels.forEach(m-> {
481+
String importName = (String)m.get("importPath");
482+
String fileName = m.getModel().getClassFilename();
483+
// from .model_get_part_order_book_req import GetPartOrderBookReqBuilder
484+
exports.add(String.format("from .%s import %s", fileName, importName));
485+
});
486+
exports.add(String.format("from .%s import %sWS", toApiFilename(meta.getSubService()), formatService(meta.getSubService())));
487+
462488
modelImport.addAll(generateApiImport(meta, false));
463489
break;
464490
}
@@ -719,6 +745,46 @@ private ModelsMap postProcessModelsMap(ModelsMap objs) {
719745
return objs;
720746
}
721747

748+
749+
@Override
750+
public Map<String, Object> postProcessSupportingFileData(Map<String, Object> objs) {
751+
Map<String, Object> data = super.postProcessSupportingFileData(objs);
752+
data.put("exports", exports);
753+
754+
if (!modeSwitch.isEntry()) {
755+
return data;
756+
}
757+
758+
String csvPath = (String) additionalProperties.get("CSV_PATH");
759+
if (csvPath == null) {
760+
log.error("no csv path found");
761+
return data;
762+
}
763+
764+
String apiCsvFile = csvPath + "/apis.csv";
765+
766+
Set<String> services = new TreeSet<>();
767+
try {
768+
769+
CSVReader reader = new CSVReader(new FileReader(apiCsvFile));
770+
List<String[]> rows = reader.readAll();
771+
for (int i = 1; i < rows.size(); i++) {
772+
services.add(rows.get(i)[0].toLowerCase());
773+
}
774+
} catch (Exception e) {
775+
throw new RuntimeException("read csv fail", e);
776+
}
777+
778+
services.forEach(s-> {
779+
Map<String,String> specialKeywords = Map.of("copytrading", "CopyTrading", "viplending", "VIPLending");
780+
String service = formatService(specialKeywords.getOrDefault(s, s));
781+
serviceExports.add(String.format("from .%s_api import %sService", s, service));
782+
});
783+
data.put("serviceExports", serviceExports);
784+
785+
return data;
786+
}
787+
722788
private PythonType getPydanticType(CodegenProperty cp,
723789
Set<String> modelImports,
724790
Set<String> exampleImports,
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
{{#exports}}
2+
{{{.}}}
3+
{{/exports}}

generator/plugin/src/main/resources/python-sdk/module_empty.mustache

Whitespace-only changes.
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
{{#serviceExports}}
2+
{{{.}}}
3+
{{/serviceExports}}

generator/plugin/src/test/java/com/kucoin/universal/sdk/plugin/SdkGeneratorTest.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,9 @@
77

88
public class SdkGeneratorTest {
99

10-
private static final String SDK_NAME = "node-sdk";
11-
private static final String SPEC_NAME = "../../spec/rest/api/openapi-spot-market.json";
12-
private static final String SPEC_ENTRY_NAME = "../../spec/rest/entry/openapi-spot.json";
10+
private static final String SDK_NAME = "python-sdk";
11+
private static final String SPEC_NAME = "../../spec/rest/api/openapi-account-subaccount.json";
12+
private static final String SPEC_ENTRY_NAME = "../../spec/rest/entry/openapi-account.json";
1313
private static final String WS_SPEC_NAME = "../../spec/ws/openapi-spot-public.json";
1414
private static final String OUTPUT_DIR = "./out";
1515
private static final String CSV_PATH = "../../spec";

sdk/python/CHANGELOG.md

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,13 @@
11
# Changelog
22

3+
## 2025-03-04(Python 1.1.1)
4+
- Update __init__.py to enhance the import experience
5+
- Reduce unnecessary log output
6+
- Optimize WebSocket reconnection logic
7+
8+
## 2025-02-26(Nodejs 0.1.0-alpha)
9+
- Release Node.js implementation
10+
311
## 2025-01-16(1.1.0)
412
- Updated the API sequence to be consistent with the documentation.
513
- Updated the license.

sdk/python/README.md

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ For an overview of the project and SDKs in other languages, refer to the [Main R
88

99
## 📦 Installation
1010

11-
### Latest Version: `1.1.0`
11+
### Latest Version: `1.1.1`
1212
Install the Python SDK using `pip`:
1313

1414
```bash
@@ -23,12 +23,12 @@ Here's a quick example to get you started with the SDK in **Python**.
2323
import logging
2424
import os
2525

26-
from kucoin_universal_sdk.api.client import DefaultClient
27-
from kucoin_universal_sdk.generate.spot.market.model_get_part_order_book_req import GetPartOrderBookReqBuilder
28-
from kucoin_universal_sdk.model.client_option import ClientOptionBuilder
29-
from kucoin_universal_sdk.model.constants import GLOBAL_API_ENDPOINT, GLOBAL_FUTURES_API_ENDPOINT, \
26+
from kucoin_universal_sdk.api import DefaultClient
27+
from kucoin_universal_sdk.generate.spot.market import GetPartOrderBookReqBuilder
28+
from kucoin_universal_sdk.model import ClientOptionBuilder
29+
from kucoin_universal_sdk.model import GLOBAL_API_ENDPOINT, GLOBAL_FUTURES_API_ENDPOINT, \
3030
GLOBAL_BROKER_API_ENDPOINT
31-
from kucoin_universal_sdk.model.transport_option import TransportOptionBuilder
31+
from kucoin_universal_sdk.model import TransportOptionBuilder
3232

3333

3434
def example():

sdk/python/example/example_api.py

Lines changed: 12 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -3,20 +3,19 @@
33
import uuid
44
from datetime import datetime, timedelta
55

6-
from kucoin_universal_sdk.api.client import DefaultClient
7-
from kucoin_universal_sdk.generate.account.fee.model_get_spot_actual_fee_req import GetSpotActualFeeReqBuilder
8-
from kucoin_universal_sdk.generate.futures.market.model_get_klines_req import GetKlinesReqBuilder, GetKlinesReq
9-
from kucoin_universal_sdk.generate.service.account_api import AccountService
10-
from kucoin_universal_sdk.generate.service.futures_api import FuturesService
11-
from kucoin_universal_sdk.generate.service.spot_api import SpotService
12-
from kucoin_universal_sdk.generate.spot.order.model_add_order_sync_req import AddOrderSyncReqBuilder, AddOrderSyncReq
13-
from kucoin_universal_sdk.generate.spot.order.model_cancel_order_by_order_id_sync_req import \
14-
CancelOrderByOrderIdSyncReqBuilder
15-
from kucoin_universal_sdk.generate.spot.order.model_get_order_by_order_id_req import GetOrderByOrderIdReqBuilder
16-
from kucoin_universal_sdk.model.client_option import ClientOptionBuilder
17-
from kucoin_universal_sdk.model.constants import GLOBAL_API_ENDPOINT, GLOBAL_FUTURES_API_ENDPOINT, \
6+
from kucoin_universal_sdk.api import DefaultClient
7+
from kucoin_universal_sdk.generate.account.fee import GetSpotActualFeeReqBuilder
8+
from kucoin_universal_sdk.generate.futures.market import GetKlinesReqBuilder, GetKlinesReq
9+
from kucoin_universal_sdk.generate.service import AccountService
10+
from kucoin_universal_sdk.generate.service import FuturesService
11+
from kucoin_universal_sdk.generate.service import SpotService
12+
from kucoin_universal_sdk.generate.spot.order import AddOrderSyncReqBuilder, AddOrderSyncReq
13+
from kucoin_universal_sdk.generate.spot.order import CancelOrderByOrderIdSyncReqBuilder
14+
from kucoin_universal_sdk.generate.spot.order import GetOrderByOrderIdReqBuilder
15+
from kucoin_universal_sdk.model import ClientOptionBuilder
16+
from kucoin_universal_sdk.model import GLOBAL_API_ENDPOINT, GLOBAL_FUTURES_API_ENDPOINT, \
1817
GLOBAL_BROKER_API_ENDPOINT
19-
from kucoin_universal_sdk.model.transport_option import TransportOptionBuilder
18+
from kucoin_universal_sdk.model import TransportOptionBuilder
2019

2120

2221
def rest_example():

0 commit comments

Comments
 (0)