From 8cc6758eb1deef63e8e8cad966dcf61c0e85ab3e Mon Sep 17 00:00:00 2001 From: Damien Elmes Date: Fri, 26 Mar 2021 16:33:53 +1000 Subject: [PATCH] declare variables with some common names as int instead of a union --- pylib/anki/_backend/genfluent.py | 27 ++++++++++++++++++++++----- qt/aqt/clayout.py | 3 ++- rslib/i18n/build/extract.rs | 31 ++++++++++++++++++++++++++++--- 3 files changed, 52 insertions(+), 9 deletions(-) diff --git a/pylib/anki/_backend/genfluent.py b/pylib/anki/_backend/genfluent.py index 2e185e8ec..6b73ec365 100644 --- a/pylib/anki/_backend/genfluent.py +++ b/pylib/anki/_backend/genfluent.py @@ -3,7 +3,7 @@ import json import sys -from typing import List +from typing import List, Literal, TypedDict import stringcase @@ -11,6 +11,11 @@ strings_json, outfile = sys.argv[1:] modules = json.load(open(strings_json)) +class Variable(TypedDict): + name: str + kind: Literal["Any", "Int"] + + def legacy_enum() -> str: out = ["class LegacyTranslationEnum(enum.Enum):"] for module in modules: @@ -45,12 +50,24 @@ def methods() -> str: return "\n".join(out) + "\n" -def get_arg_types(args: List[str]) -> str: - return ", ".join([f"{stringcase.snakecase(arg)}: FluentVariable" for arg in args]) +def get_arg_types(args: List[Variable]) -> str: + + return ", ".join( + [f"{stringcase.snakecase(arg['name'])}: {arg_kind(arg)}" for arg in args] + ) -def get_args(args: List[str]) -> str: - return ", ".join([f'"{arg}": {stringcase.snakecase(arg)}' for arg in args]) +def arg_kind(arg: Variable) -> str: + if arg["kind"] == "Int": + return "int" + else: + return "FluentVariable" + + +def get_args(args: List[Variable]) -> str: + return ", ".join( + [f'"{arg["name"]}": {stringcase.snakecase(arg["name"])}' for arg in args] + ) out = "" diff --git a/qt/aqt/clayout.py b/qt/aqt/clayout.py index 465c3ae88..bf0d4718c 100644 --- a/qt/aqt/clayout.py +++ b/qt/aqt/clayout.py @@ -560,7 +560,8 @@ class CardLayout(QDialog): cards = tr.card_templates_card_count(count=card_cnt) msg = tr.card_templates_delete_the_as_card_type_and( template=template["name"], - cards=cards, + # unlike most cases, 'cards' is a string in this message + cards=cards, # type: ignore[arg-type] ) if not askUser(msg): return diff --git a/rslib/i18n/build/extract.rs b/rslib/i18n/build/extract.rs index 4e2630efc..7e633e6f5 100644 --- a/rslib/i18n/build/extract.rs +++ b/rslib/i18n/build/extract.rs @@ -17,10 +17,25 @@ pub struct Module { pub struct Translation { pub key: String, pub text: String, - pub variables: Vec, + pub variables: Vec, pub index: usize, } +#[derive(Debug, PartialOrd, Ord, PartialEq, Eq, Serialize)] +pub struct Variable { + name: String, + kind: VariableKind, +} + +#[derive(Debug, PartialOrd, Ord, PartialEq, Eq, Serialize)] +enum VariableKind { + Int, + // Float, + // Number, + // String, + Any, +} + pub fn get_modules(data: &TranslationsByLang) -> Vec { let mut output = vec![]; @@ -80,8 +95,8 @@ struct Visitor { } impl Visitor { - fn into_output(self) -> (String, Vec) { - let mut vars: Vec<_> = self.variables.into_iter().collect(); + fn into_output(self) -> (String, Vec) { + let mut vars: Vec<_> = self.variables.into_iter().map(Into::into).collect(); vars.sort_unstable(); (self.text, vars) } @@ -118,3 +133,13 @@ impl Visitor { } } } + +impl From for Variable { + fn from(name: String) -> Self { + let kind = match name.as_str() { + "cards" | "notes" | "count" | "amount" => VariableKind::Int, + _ => VariableKind::Any, + }; + Variable { name, kind } + } +}