Skip to content

Commit 1236f65

Browse files
authored
feat: support snake case with keywords (#137)
1 parent 9a95ef8 commit 1236f65

File tree

13 files changed

+188
-60
lines changed

13 files changed

+188
-60
lines changed

lib/generator.js

Lines changed: 50 additions & 50 deletions
Large diffs are not rendered by default.

lib/helper.js

Lines changed: 45 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -213,13 +213,34 @@ function _camelCase(str, split = '_') {
213213
return str;
214214
}
215215

216-
function _snakeCase(str) {
216+
function _snakeCase(str, keys = []) {
217217
if (!str) {
218218
return '';
219219
}
220+
221+
// Convert keys to array if it's a single string
222+
if (typeof keys === 'string') {
223+
keys = [keys];
224+
}
225+
226+
let result = str;
227+
228+
// First, handle the keywords by replacing them with placeholders
229+
const placeholders = {};
230+
for (let i = 0; i < keys.length; i++) {
231+
const key = keys[i];
232+
if (key && result.includes(key)) {
233+
const placeholder = `@@_${i}@@`;
234+
placeholders[placeholder] = `_${key.toLowerCase()}_`;
235+
result = result.split(key).join(placeholder);
236+
}
237+
}
238+
239+
// Process the string normally
220240
let res = '';
221241
let tmp = '';
222-
for (const c of str) {
242+
243+
for (const c of result) {
223244
if (/[A-Z|0-9]/.test(c)) {
224245
tmp += c;
225246
} else {
@@ -230,13 +251,34 @@ function _snakeCase(str) {
230251
res += c;
231252
}
232253
}
254+
233255
if (tmp.length > 0) {
234-
res += '_' + tmp.toLowerCase();
256+
res += (res === '' ? '' : '_') + tmp.toLowerCase();
235257
}
258+
236259
res = res.replace(/-/g, '_');
260+
261+
// Clean up any double underscores
262+
res = res.replace(/_+/g, '_');
263+
264+
// Restore the special keywords from placeholders
265+
for (const [placeholder, value] of Object.entries(placeholders)) {
266+
const regex = new RegExp(placeholder, 'g');
267+
res = res.replace(regex, value);
268+
}
269+
270+
res = res.replace(/_+/g, '_');
271+
272+
// Remove leading underscore if original string didn't start with one
237273
if (res[0] === '_' && str[0] !== '_') {
238274
res = res.substring(1);
239275
}
276+
277+
// Remove trailing underscore if original string didn't end with one
278+
if (res[res.length - 1] === '_' && str[str.length - 1] !== '_') {
279+
res = res.substring(0, res.length - 1);
280+
}
281+
240282
return res;
241283
}
242284

tests/expected/complex/tea_python_tests/client.py

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@
2020
class Client(SourceClient):
2121
_protocol: str = None
2222
_pathname: str = None
23-
__strs: List[str] = None
23+
_strs: List[str] = None
2424
_comple_list: List[List[str]] = None
2525
_endpoint_map: Dict[str, str] = None
2626
_configs: List[source_models.Config] = None
@@ -206,11 +206,11 @@ def complex_1(
206206
any_map = {}
207207
any_map[item] = 'test'
208208
break
209-
self.__strs = request.strs
209+
self._strs = request.strs
210210
self._protocol = 'test'
211211
self._endpoint_map.get(self._protocol)
212212
self._endpoint_map['test'] = 'ok'
213-
request.strs = self.__strs
213+
request.strs = self._strs
214214
_request.protocol = self._protocol
215215
_request.port = request.num
216216
_request.method = 'GET'
@@ -421,11 +421,11 @@ async def complex_1_async(
421421
any_map = {}
422422
any_map[item] = 'test'
423423
break
424-
self.__strs = request.strs
424+
self._strs = request.strs
425425
self._protocol = 'test'
426426
self._endpoint_map.get(self._protocol)
427427
self._endpoint_map['test'] = 'ok'
428-
request.strs = self.__strs
428+
request.strs = self._strs
429429
_request.protocol = self._protocol
430430
_request.port = request.num
431431
_request.method = 'GET'
@@ -611,6 +611,7 @@ def complex_3(
611611
x = y
612612
resp = _response
613613
req = source_models.Request(
614+
cors_rules = 'test',
614615
accesskey = request.access_key,
615616
region = resp.status_message
616617
)
@@ -653,6 +654,7 @@ async def complex_3_async(
653654
x = y
654655
resp = _response
655656
req = source_models.Request(
657+
cors_rules = 'test',
656658
accesskey = request.access_key,
657659
region = resp.status_message
658660
)

tests/expected/function/tea_python_tests/client.py

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,3 +63,15 @@ def a_params(self) -> None:
6363

6464
async def a_params_async(self) -> None:
6565
await self.hello_params_async('a', 'b')
66+
67+
def test_jwt_with_option(self) -> None:
68+
self.hello_params('a', 'b')
69+
70+
async def test_jwt_with_option_async(self) -> None:
71+
await self.hello_params_async('a', 'b')
72+
73+
def test_oauth2_for_option(self) -> None:
74+
self.hello_params('a', 'b')
75+
76+
async def test_oauth2_for_option_async(self) -> None:
77+
await self.hello_params_async('a', 'b')

tests/expected/model/tea_python_tests/models/_my_model.py

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,10 @@ class MyModel(DaraModel):
1414
def __init__(
1515
self,
1616
model: main_models.MyModelModel = None,
17+
cors_rules: str = None,
18+
cors_rules_cors_r: str = None,
19+
xml_parser_http_message: str = None,
20+
test_oauth2_name: str = None,
1721
stringfield: str = None,
1822
bytesfield: bytes = None,
1923
stringarrayfield: List[str] = None,
@@ -60,6 +64,10 @@ def __init__(
6064
link: str = None,
6165
):
6266
self.model = model
67+
self.cors_rules = cors_rules
68+
self.cors_rules_cors_r = cors_rules_cors_r
69+
self.xml_parser_http_message = xml_parser_http_message
70+
self.test_oauth2_name = test_oauth2_name
6371
self.stringfield = stringfield
6472
self.bytesfield = bytesfield
6573
self.stringarrayfield = stringarrayfield
@@ -109,6 +117,10 @@ def validate(self):
109117
self.validate_required(self.model, 'model')
110118
if self.model:
111119
self.model.validate()
120+
self.validate_required(self.cors_rules, 'cors_rules')
121+
self.validate_required(self.cors_rules_cors_r, 'cors_rules_cors_r')
122+
self.validate_required(self.xml_parser_http_message, 'xml_parser_http_message')
123+
self.validate_required(self.test_oauth2_name, 'test_oauth2_name')
112124
self.validate_required(self.stringfield, 'stringfield')
113125
self.validate_required(self.bytesfield, 'bytesfield')
114126
self.validate_required(self.stringarrayfield, 'stringarrayfield')
@@ -220,6 +232,18 @@ def to_map(self):
220232
if self.model is not None:
221233
result['model'] = self.model.to_map()
222234

235+
if self.cors_rules is not None:
236+
result['CORSRules'] = self.cors_rules
237+
238+
if self.cors_rules_cors_r is not None:
239+
result['CORSRulesCORSR'] = self.cors_rules_cors_r
240+
241+
if self.xml_parser_http_message is not None:
242+
result['XMLParserHTTPMessage'] = self.xml_parser_http_message
243+
244+
if self.test_oauth2_name is not None:
245+
result['TestOAuth2Name'] = self.test_oauth2_name
246+
223247
if self.stringfield is not None:
224248
result['stringfield'] = self.stringfield
225249

@@ -405,6 +429,18 @@ def from_map(self, m: dict = None):
405429
temp_model = main_models.MyModelModel()
406430
self.model = temp_model.from_map(m.get('model'))
407431

432+
if m.get('CORSRules') is not None:
433+
self.cors_rules = m.get('CORSRules')
434+
435+
if m.get('CORSRulesCORSR') is not None:
436+
self.cors_rules_cors_r = m.get('CORSRulesCORSR')
437+
438+
if m.get('XMLParserHTTPMessage') is not None:
439+
self.xml_parser_http_message = m.get('XMLParserHTTPMessage')
440+
441+
if m.get('TestOAuth2Name') is not None:
442+
self.test_oauth2_name = m.get('TestOAuth2Name')
443+
408444
if m.get('stringfield') is not None:
409445
self.stringfield = m.get('stringfield')
410446

tests/fixtures/complex/Darafile

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,5 +5,10 @@
55
"main": "./main.dara",
66
"libraries": {
77
"Source": "alibabacloud:Import:*"
8+
},
9+
"python": {
10+
"keywords": [
11+
"CORS"
12+
]
813
}
914
}

tests/fixtures/complex/libraries/Darafile

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,10 @@
2323
},
2424
"python": {
2525
"package": "Source",
26-
"clientName": "source_client"
26+
"clientName": "source_client",
27+
"keywords": [
28+
"CORS"
29+
]
2730
},
2831
"python2": {
2932
"package": "Source",

tests/fixtures/complex/libraries/import.dara

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ static function parse(c: class): void;
3030
static async function asyncFunc(): void;
3131

3232
model Request = {
33+
CORSRules: string,
3334
accesskey?: string(name='accesskey', description='accesskey'),
3435
region?: string(name='region', description='region'),
3536
instance: {

tests/fixtures/complex/main.dara

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -300,6 +300,7 @@ api Complex3(request: ComplexRequest, name: string): ComplexRequest {
300300
}
301301
var resp = __response;
302302
var req = new Source.Request{
303+
CORSRules = "test",
303304
accesskey = request.accessKey,
304305
region = resp.statusMessage
305306
};

tests/fixtures/function/Darafile

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,5 +2,11 @@
22
"scope": "alibabacloud",
33
"name": "main",
44
"version": "0.0.1",
5-
"main": "./main.dara"
5+
"main": "./main.dara",
6+
"python": {
7+
"keywords": [
8+
"JWT",
9+
"OAuth2"
10+
]
11+
}
612
}

0 commit comments

Comments
 (0)