You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
131 lines
3.0 KiB
131 lines
3.0 KiB
import argparse
|
|
import re
|
|
from copy import deepcopy
|
|
|
|
def to_camel(name):
|
|
parts = name.split("_")
|
|
return parts[0] + "".join(p.capitalize() for p in parts[1:])
|
|
|
|
def to_m_camel(name):
|
|
return "".join(p.capitalize() for p in name.split("_"))
|
|
|
|
def to_class(name):
|
|
return "".join(p.capitalize() for p in name.split("_"))
|
|
|
|
def lower_first(s: str) -> str:
|
|
if not s:
|
|
return s
|
|
return s[0].lower() + s[1:]
|
|
|
|
def to_path(name):
|
|
parts = name.split(".")
|
|
if len(parts) < 2: # 如果没有".",parts长度就是1
|
|
return ""
|
|
return parts[0] + "/" + "/".join(p for p in parts[1:])
|
|
|
|
|
|
def get_first_part(name, default=""):
|
|
delimiter="_"
|
|
if delimiter not in name:
|
|
return default
|
|
|
|
parts = name.split(delimiter)
|
|
if not parts or not parts[0]:
|
|
return default
|
|
|
|
return parts[0].capitalize()
|
|
|
|
def parse_args():
|
|
parser = argparse.ArgumentParser(description="Java Code Generator")
|
|
|
|
parser.add_argument(
|
|
"--tab",
|
|
default="",
|
|
help="表名,多个用逗号分隔,例如: tab,tab2"
|
|
)
|
|
|
|
parser.add_argument(
|
|
"--model",
|
|
default="",
|
|
help="可选模块 xxlJob,minio,saToken,swagger"
|
|
)
|
|
|
|
parser.add_argument(
|
|
"--re",
|
|
action="store_true",
|
|
help="是否覆盖已存在文件(默认不覆盖)"
|
|
)
|
|
|
|
parser.add_argument(
|
|
"--conf",
|
|
required=True,
|
|
default="",
|
|
help="配置文件路径"
|
|
)
|
|
|
|
return parser.parse_args()
|
|
|
|
|
|
VAR_PATTERN = re.compile(r"\$\{([^}]+)\}")
|
|
def get_by_path(data: dict, path: str):
|
|
"""
|
|
从 dict 中通过 a.b.c 取值
|
|
"""
|
|
cur = data
|
|
for key in path.split("."):
|
|
if not isinstance(cur, dict) or key not in cur:
|
|
return None
|
|
cur = cur[key]
|
|
return cur
|
|
|
|
def resolve_string(value: str, data: dict) -> str:
|
|
def replacer(match):
|
|
expr = match.group(1)
|
|
v = get_by_path(data, expr)
|
|
return str(v) if v is not None else match.group(0)
|
|
|
|
return VAR_PATTERN.sub(replacer, value)
|
|
|
|
def resolve_config(config: dict, max_rounds=5) -> dict:
|
|
"""
|
|
递归解析配置中的 ${xxx}
|
|
"""
|
|
result = deepcopy(config)
|
|
|
|
for _ in range(max_rounds):
|
|
changed = False
|
|
|
|
def walk(obj):
|
|
nonlocal changed
|
|
if isinstance(obj, dict):
|
|
for k, v in obj.items():
|
|
obj[k] = walk(v)
|
|
elif isinstance(obj, list):
|
|
return [walk(i) for i in obj]
|
|
elif isinstance(obj, str):
|
|
new = resolve_string(obj, result)
|
|
if new != obj:
|
|
changed = True
|
|
return new
|
|
return obj
|
|
|
|
walk(result)
|
|
|
|
if not changed:
|
|
break
|
|
|
|
return result
|
|
|
|
|
|
def mysql_to_java(mysql_type):
|
|
mapping = {
|
|
"bigint": "Long",
|
|
"int": "Integer",
|
|
"tinyint": "Integer",
|
|
"varchar": "String",
|
|
"mediumtext": "String",
|
|
"datetime": "Date",
|
|
"date": "Date",
|
|
"decimal": "BigDecimal"
|
|
}
|
|
return mapping.get(mysql_type, "String")
|
|
|