22
33import json
44from pathlib import Path
5+ from typing import Optional
56
67import typer
78from rich .console import Console
3031console = Console ()
3132
3233
34+ def _print_json (data : object ) -> None :
35+ console .print_json (data = data , ensure_ascii = True )
36+
37+
3338@app .command ("version" )
3439def version_cmd () -> None :
3540 console .print (f"NokaMan { __version__ } " )
@@ -50,7 +55,7 @@ def stats_cmd() -> None:
5055 skill = parts [1 ] if len (parts ) > 1 else "?"
5156 by_lang [lang ] += 1
5257 by_skill [skill ] += 1
53- console . print_json (
58+ _print_json (
5459 data = {
5560 "version" : __version__ ,
5661 "n_samples" : len (list_sample_files ()),
@@ -65,7 +70,7 @@ def stats_cmd() -> None:
6570def demo_cmd (lang : str = typer .Option ("en" , "--lang" , "-l" )) -> None :
6671 """Full multi-skill demo for a language (end-to-end runnable)."""
6772 result = evaluate_demo (lang )
68- console . print_json (data = result )
73+ _print_json (data = result )
6974 OUT_DIR .mkdir (parents = True , exist_ok = True )
7075 path = OUT_DIR / f"demo_{ lang } .json"
7176 path .write_text (json .dumps (result , indent = 2 ) + "\n " , encoding = "utf-8" )
@@ -85,7 +90,7 @@ def languages_list() -> None:
8590
8691
8792@rubrics_app .command ("list" )
88- def rubrics_list (lang : str | None = typer .Option (None , "--lang" , "-l" )) -> None :
93+ def rubrics_list (lang : Optional [ str ] = typer .Option (None , "--lang" , "-l" )) -> None :
8994 files = list_rubric_files ()
9095 if lang :
9196 files = [p for p in files if p .stem == lang .strip ().lower ()]
@@ -105,8 +110,8 @@ def rubrics_list(lang: str | None = typer.Option(None, "--lang", "-l")) -> None:
105110@eval_app .command ("text" )
106111def eval_text (
107112 lang : str = typer .Option ("en" , "--lang" , "-l" ),
108- text : str | None = typer .Option (None , "--text" , "-t" ),
109- file : Path | None = typer .Option (None , "--file" , "-f" , exists = True , dir_okay = False ),
113+ text : Optional [ str ] = typer .Option (None , "--text" , "-t" ),
114+ file : Optional [ Path ] = typer .Option (None , "--file" , "-f" , exists = True , dir_okay = False ),
110115 skill : str = typer .Option ("writing" , "--skill" , "-s" ),
111116) -> None :
112117 if file is not None :
@@ -116,12 +121,12 @@ def eval_text(
116121 else :
117122 console .print ("[red]Provide --text or --file[/red]" )
118123 raise typer .Exit (code = 1 )
119- console . print_json (data = result )
124+ _print_json (data = result )
120125
121126
122127@eval_app .command ("demo" )
123128def eval_demo (lang : str = typer .Option ("en" , "--lang" , "-l" )) -> None :
124- console . print_json (data = evaluate_demo (lang ))
129+ _print_json (data = evaluate_demo (lang ))
125130
126131
127132@eval_app .command ("samples" )
@@ -150,7 +155,7 @@ def eval_samples() -> None:
150155
151156@eval_app .command ("batch" )
152157def eval_batch (
153- out : Path | None = typer .Option (None , "--out" , "-o" ),
158+ out : Optional [ Path ] = typer .Option (None , "--out" , "-o" ),
154159 table : bool = typer .Option (True , "--table/--json-only" ),
155160) -> None :
156161 report = batch_evaluate ()
@@ -188,7 +193,7 @@ def eval_summary() -> None:
188193 lang = stem .split ("_" )[0 ] if "_" in stem else "?"
189194 by_lang [lang ] = by_lang .get (lang , 0 ) + 1
190195 report = batch_evaluate ()
191- console . print_json (
196+ _print_json (
192197 data = {
193198 "version" : __version__ ,
194199 "n_samples" : len (files ),
@@ -205,7 +210,7 @@ def eval_placement(
205210 answer : list [str ] = typer .Option (..., "--answer" , "-a" , help = "Repeat for multiple answers" ),
206211) -> None :
207212 result = placement_test (lang , answer )
208- console . print_json (data = result )
213+ _print_json (data = result )
209214
210215
211216@train_app .command ("toy" )
0 commit comments