Обновление структуры проекта, использование pydantic для конфигураций, улучшение отчёта о патчах

This commit is contained in:
2025-10-01 23:07:37 +03:00
parent 5ba590cc31
commit fbc8b3e017
25 changed files with 406 additions and 315 deletions
+47 -22
View File
@@ -3,16 +3,19 @@
"color_theme": {
"enabled": true,
"logo": {
"gradient": {
"angle": 0.0,
"start_color": "#ffccff00",
"end_color": "#ffcccc00"
},
"ears_color": "#ffffd0d0"
},
"colors": {
"primary": "#ccff00",
"secondary": "#ffffd700",
"secondary": "#ffcccc00",
"background": "#ffffff",
"text": "#000000"
},
"gradient": {
"angle": "135.0",
"from": "#ffff6060",
"to": "#ffccff00"
}
}
"""
@@ -21,20 +24,40 @@ priority = 0
# imports
from lxml import etree
from typing import Dict, Any
from pydantic import Field, BaseModel
from utils.config import PatchConfig
from utils.public import (
insert_after_public,
insert_after_color,
change_color,
)
#Config
class Gradient(BaseModel):
angle: float = Field(0.0, description="Угол градиента")
start_color: str = Field("#ffccff00", description="Начальный цвет градиента")
end_color: str = Field("#ffcccc00", description="Конечный цвет градиента")
class Logo(BaseModel):
gradient: Gradient = Field(Gradient(), description="Настройки градиента") # type: ignore [reportCallIssue]
ears_color: str = Field("#ffd0d0d0", description="Цвет ушей логотипа")
class Colors(BaseModel):
primary: str = Field("#ccff00", description="Основной цвет")
secondary: str = Field("#ffcccc00", description="Вторичный цвет")
background: str = Field("#ffffff", description="Фоновый цвет")
text: str = Field("#000000", description="Цвет текста")
class Config(PatchConfig):
logo: Logo = Field(Logo(), description="Настройки цветов логотипа") # type: ignore [reportCallIssue]
colors: Colors = Field(Colors(), description="Настройки цветов") # type: ignore [reportCallIssue]
# Patch
def apply(config: dict) -> bool:
main_color = config["colors"]["primary"]
splash_color = config["colors"]["secondary"]
gradient_angle = config["gradient"]["angle"]
gradient_from = config["gradient"]["from"]
gradient_to = config["gradient"]["to"]
def apply(config: Config, base: Dict[str, Any]) -> bool:
main_color = config.colors.primary
splash_color = config.colors.secondary
# No connection alert coolor
with open("./decompiled/assets/no_connection.html", "r", encoding="utf-8") as file:
@@ -57,9 +80,9 @@ def apply(config: dict) -> bool:
root = tree.getroot()
# Change attributes with namespace
root.set(f"{{{config['xml_ns']['android']}}}angle", gradient_angle)
root.set(f"{{{config['xml_ns']['android']}}}startColor", gradient_from)
root.set(f"{{{config['xml_ns']['android']}}}endColor", gradient_to)
root.set(f"{{{base['xml_ns']['android']}}}angle", str(config.logo.gradient.angle))
root.set(f"{{{base['xml_ns']['android']}}}startColor", config.logo.gradient.start_color)
root.set(f"{{{base['xml_ns']['android']}}}endColor", config.logo.gradient.end_color)
# Save back
tree.write(file_path, pretty_print=True, xml_declaration=True, encoding="utf-8")
@@ -72,10 +95,12 @@ def apply(config: dict) -> bool:
root = tree.getroot()
# Finding "path"
for el in root.findall("path", namespaces=config["xml_ns"]):
name = el.get(f"{{{config['xml_ns']['android']}}}name")
for el in root.findall("path", namespaces=base["xml_ns"]):
name = el.get(f"{{{base['xml_ns']['android']}}}name")
if name == "path":
el.set(f"{{{config['xml_ns']['android']}}}fillColor", splash_color)
el.set(f"{{{base['xml_ns']['android']}}}fillColor", config.colors.secondary)
elif name in ["path_1", "path_2"]:
el.set(f"{{{base['xml_ns']['android']}}}fillColor", config.logo.ears_color)
# Save back
tree.write(file_path, pretty_print=True, xml_declaration=True, encoding="utf-8")
@@ -88,11 +113,11 @@ def apply(config: dict) -> bool:
root = tree.getroot()
# Change attributes with namespace
root.set(f"{{{config['xml_ns']['android']}}}angle", gradient_angle)
items = root.findall("item", namespaces=config['xml_ns'])
root.set(f"{{{base['xml_ns']['android']}}}angle", str(config.logo.gradient.angle))
items = root.findall("item", namespaces=base['xml_ns'])
assert len(items) == 2
items[0].set(f"{{{config['xml_ns']['android']}}}color", gradient_from)
items[1].set(f"{{{config['xml_ns']['android']}}}color", gradient_to)
items[0].set(f"{{{base['xml_ns']['android']}}}color", config.logo.gradient.start_color)
items[1].set(f"{{{base['xml_ns']['android']}}}color", config.logo.gradient.end_color)
# Save back
tree.write(file_path, pretty_print=True, xml_declaration=True, encoding="utf-8")