From b1f69b4db039c8d3d91b6a6a10c0deb2ce091f05 Mon Sep 17 00:00:00 2001 From: Dan Albert Date: Sun, 23 Jul 2023 18:46:20 -0700 Subject: [PATCH] Use lupa to parse liveries. *Much* faster, and doesn't have any errors on the default liveries. https://github.com/pydcs/dcs/issues/317 --- dcs/liveries/livery.py | 15 +++++++++++---- requirements.txt | 1 + 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/dcs/liveries/livery.py b/dcs/liveries/livery.py index bd432fa8..b380c607 100644 --- a/dcs/liveries/livery.py +++ b/dcs/liveries/livery.py @@ -6,6 +6,7 @@ from zipfile import ZipFile import dcs.lua +from lupa import LuaRuntime def _attempt_read_from_filestream(filestream: bytes) -> Optional[str]: @@ -80,18 +81,24 @@ def from_lua(code: str, path: str) -> Optional[Livery]: # liveries to be suddenly unparseable), and so far we aren't interested in the # values of liveries that rely on undefined variables, just assume those are all # the empty string and move on. + lua = LuaRuntime() try: - data = dcs.lua.loads(code, unknown_variable_lookup=lambda _: "") + lua.execute(code) + data = lua.globals() except SyntaxError: logging.exception("Could not parse livery definition at %s", path) return None - livery_name = data.get("name", path_id) - countries_table = data.get("countries") + livery_name = data.name + if livery_name is None: + livery_name = path_id + countries_table = data.countries if countries_table is None: countries = None else: countries = set(countries_table.values()) - order = data.get("order", 0) + order = data.order + if order is None: + order = 0 order = None if path_id == "default" else order if order is not None and not isinstance(order, int): diff --git a/requirements.txt b/requirements.txt index 89db7aae..abb60a49 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1 +1,2 @@ +lupa pyproj