|
|
|
@@ -19,6 +19,7 @@ def _load_effective_pack(project: Path, lang: str) -> dict:
|
|
|
|
2. installed pack via entry points
|
|
|
|
2. installed pack via entry points
|
|
|
|
"""
|
|
|
|
"""
|
|
|
|
import json
|
|
|
|
import json
|
|
|
|
|
|
|
|
|
|
|
|
from .pack import load_pack
|
|
|
|
from .pack import load_pack
|
|
|
|
|
|
|
|
|
|
|
|
# Walk up to find .foreignthon.toml
|
|
|
|
# Walk up to find .foreignthon.toml
|
|
|
|
@@ -253,26 +254,58 @@ def compile(file: Path, output: str | None):
|
|
|
|
out_path.write_text(transpiled, encoding="utf-8")
|
|
|
|
out_path.write_text(transpiled, encoding="utf-8")
|
|
|
|
click.echo(f"Compiled: {out_path}")
|
|
|
|
click.echo(f"Compiled: {out_path}")
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@main.command(context_settings=CONTEXT_SETTINGS)
|
|
|
|
@main.command(context_settings=CONTEXT_SETTINGS)
|
|
|
|
@click.argument("file", type=click.Path(exists=True, path_type=Path))
|
|
|
|
@click.argument("files", nargs=-1, required=True, type=click.Path(exists=True, path_type=Path))
|
|
|
|
def check(file: Path):
|
|
|
|
def check(files: tuple):
|
|
|
|
"""Validate a foreign-language file without running it."""
|
|
|
|
"""Validate one or more foreign-language files without running them."""
|
|
|
|
import ast
|
|
|
|
import ast
|
|
|
|
|
|
|
|
import io
|
|
|
|
|
|
|
|
import tokenize as _tokenize
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
from .transpiler import _build_mapping, transpile_file
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
failed = False
|
|
|
|
|
|
|
|
for file in files:
|
|
|
|
detected_lang = _lang_from_file(file)
|
|
|
|
detected_lang = _lang_from_file(file)
|
|
|
|
try:
|
|
|
|
try:
|
|
|
|
pack = _load_effective_pack(file, detected_lang)
|
|
|
|
pack = _load_effective_pack(file, detected_lang)
|
|
|
|
transpiled = transpile_file(file, pack=pack)
|
|
|
|
transpiled = transpile_file(file, pack=pack)
|
|
|
|
ast.parse(transpiled)
|
|
|
|
ast.parse(transpiled)
|
|
|
|
click.echo(f"✓ {file.name} looks good.")
|
|
|
|
|
|
|
|
|
|
|
|
source = file.read_text(encoding="utf-8")
|
|
|
|
|
|
|
|
mapping = _build_mapping(pack)
|
|
|
|
|
|
|
|
tokens = list(_tokenize.generate_tokens(io.StringIO(source).readline))
|
|
|
|
|
|
|
|
count = sum(1 for t in tokens if t.type == _tokenize.NAME and t.string in mapping)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
click.echo(f"✓ {file.name} looks good. ({count} tokens translated)")
|
|
|
|
except SyntaxError as e:
|
|
|
|
except SyntaxError as e:
|
|
|
|
click.echo(f"✗ Syntax error: {e}", err=True)
|
|
|
|
click.echo(f"✗ {file.name}: Syntax error: {e}", err=True)
|
|
|
|
sys.exit(1)
|
|
|
|
failed = True
|
|
|
|
except Exception as e:
|
|
|
|
except Exception as e:
|
|
|
|
click.echo(f"✗ {e}", err=True)
|
|
|
|
click.echo(f"✗ {file.name}: {e}", err=True)
|
|
|
|
|
|
|
|
failed = True
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if failed:
|
|
|
|
sys.exit(1)
|
|
|
|
sys.exit(1)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@main.command(context_settings=CONTEXT_SETTINGS)
|
|
|
|
|
|
|
|
def langs():
|
|
|
|
|
|
|
|
"""List all installed language packs."""
|
|
|
|
|
|
|
|
from .pack import _discover_packs
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
packs = _discover_packs()
|
|
|
|
|
|
|
|
if not packs:
|
|
|
|
|
|
|
|
click.echo("No language packs installed.")
|
|
|
|
|
|
|
|
click.echo("Try: pip install foreignthon-es")
|
|
|
|
|
|
|
|
return
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
click.echo("Installed language packs:")
|
|
|
|
|
|
|
|
for code, module in sorted(packs.items()):
|
|
|
|
|
|
|
|
import json
|
|
|
|
|
|
|
|
data = json.loads(module.get_pack_path().read_text(encoding="utf-8"))
|
|
|
|
|
|
|
|
name = data["meta"].get("name", code)
|
|
|
|
|
|
|
|
native = data["meta"].get("native_name", "")
|
|
|
|
|
|
|
|
click.echo(f" {code:<6} {name} ({native})")
|
|
|
|
|
|
|
|
|
|
|
|
@main.command("pack", context_settings=CONTEXT_SETTINGS)
|
|
|
|
@main.command("pack", context_settings=CONTEXT_SETTINGS)
|
|
|
|
@click.argument("json_file", type=click.Path(exists=True, path_type=Path))
|
|
|
|
@click.argument("json_file", type=click.Path(exists=True, path_type=Path))
|
|
|
|
|