From 8ab596e2b57fd776957d30b651ef3699a08607a3 Mon Sep 17 00:00:00 2001 From: Eric Date: Wed, 29 May 2024 09:36:47 -0700 Subject: [PATCH] asset-package work and tidying --- .efrocachemap | 68 +++++++++++++------------- CHANGELOG.md | 2 +- config/requirements.txt | 10 ++-- src/assets/.asset_manifest_public.json | 4 ++ src/assets/Makefile | 4 ++ src/assets/ba_data/python/baenv.py | 2 +- src/ballistica/shared/ballistica.cc | 2 +- tools/bacommon/workspace/__init__.py | 3 ++ tools/bacommon/workspace/assetsv1.py | 34 +++++++++++++ tools/efro/dataclassio/_api.py | 18 +++++-- tools/efro/dataclassio/_base.py | 23 +++++++++ tools/efro/dataclassio/_inputter.py | 23 +++++++++ tools/efro/dataclassio/_outputter.py | 31 +++++++----- tools/efrotools/efrocache.py | 4 +- 14 files changed, 169 insertions(+), 59 deletions(-) create mode 100644 tools/bacommon/workspace/__init__.py create mode 100644 tools/bacommon/workspace/assetsv1.py diff --git a/.efrocachemap b/.efrocachemap index 856e00b0..0de71c38 100644 --- a/.efrocachemap +++ b/.efrocachemap @@ -421,9 +421,9 @@ "build/assets/ba_data/audio/zoeOw.ogg": "74befe45a8417e95b6a2233c51992a26", "build/assets/ba_data/audio/zoePickup01.ogg": "48ab8cddfcde36a750856f3f81dd20c8", "build/assets/ba_data/audio/zoeScream01.ogg": "2b468aedfa8741090247f04eb9e6df55", - "build/assets/ba_data/data/langdata.json": "faffc0854bc4c34f4ef427404ec75c4d", - "build/assets/ba_data/data/languages/arabic.json": "5c27239be3d4f8daefd9f3bd7e99ff8d", - "build/assets/ba_data/data/languages/belarussian.json": "260d190aae3282a726b4a27019972d58", + "build/assets/ba_data/data/langdata.json": "7e73466677344c1722aebe94003360d5", + "build/assets/ba_data/data/languages/arabic.json": "05040616cb7585e3cce2e9acba96aa75", + "build/assets/ba_data/data/languages/belarussian.json": "3d5523d0004293aa2df02f3f6f3b84f8", "build/assets/ba_data/data/languages/chinese.json": "2f67c6b127ae85492ac552af1a91e95a", "build/assets/ba_data/data/languages/chinesetraditional.json": "319565f8a15667488f48dbce59278e39", "build/assets/ba_data/data/languages/croatian.json": "e671b9d0c012be1a30f9c15eb1b81860", @@ -432,7 +432,7 @@ "build/assets/ba_data/data/languages/dutch.json": "b0900d572c9141897d53d6574c471343", "build/assets/ba_data/data/languages/english.json": "9754e816d3bc3214b7e809950d642309", "build/assets/ba_data/data/languages/esperanto.json": "0e397cfa5f3fb8cef5f4a64f21cda880", - "build/assets/ba_data/data/languages/filipino.json": "920fc429ec9b587edc2c6294fffada71", + "build/assets/ba_data/data/languages/filipino.json": "9c04219ceeb065b3bc751e6ab3731def", "build/assets/ba_data/data/languages/french.json": "ee2a81129519d7030a617308da8c9195", "build/assets/ba_data/data/languages/german.json": "198b9860c5b9df7b8e3e30b03d8755cb", "build/assets/ba_data/data/languages/gibberish.json": "3e68d809bd6ede3b9e2c57c147737e42", @@ -443,8 +443,8 @@ "build/assets/ba_data/data/languages/italian.json": "e1d69eb1eec31442bf981121c7cfaf17", "build/assets/ba_data/data/languages/korean.json": "4e3524327a0174250aff5e1ef4c0c597", "build/assets/ba_data/data/languages/malay.json": "f6ce0426d03a62612e3e436ed5d1be1f", - "build/assets/ba_data/data/languages/persian.json": "8bd6251e46c8ca7fcd075d989e79f0d9", - "build/assets/ba_data/data/languages/polish.json": "82ad9f88c7d0499a049d2008c85aa6f1", + "build/assets/ba_data/data/languages/persian.json": "c209f8f6d3b3dd40d5ca9d36fe0721fe", + "build/assets/ba_data/data/languages/polish.json": "59ff98adfb4f515f00769d1ec229c232", "build/assets/ba_data/data/languages/portuguese.json": "615a59bd03f84659158d9f2608a4ab21", "build/assets/ba_data/data/languages/romanian.json": "b3e46efd6f869dbd78014570e037c290", "build/assets/ba_data/data/languages/russian.json": "41e06eda170fb5960393dd6b58d046e1", @@ -4038,26 +4038,26 @@ "build/assets/windows/Win32/ucrtbased.dll": "2def5335207d41b21b9823f6805997f1", "build/assets/windows/Win32/vc_redist.x86.exe": "b08a55e2e77623fe657bea24f223a3ae", "build/assets/windows/Win32/vcruntime140d.dll": "865b2af4d1e26a1a8073c89acb06e599", - "build/prefab/full/linux_arm64_gui/debug/ballisticakit": "9ac7439035bfc6e58c09fd333be7bf32", - "build/prefab/full/linux_arm64_gui/release/ballisticakit": "0a6c29a617a2a7f75b5ea74ae31c00ba", - "build/prefab/full/linux_arm64_server/debug/dist/ballisticakit_headless": "090c580f73c18253ad03fa7bdb5410c6", - "build/prefab/full/linux_arm64_server/release/dist/ballisticakit_headless": "fb8aa86a244b28b683ea8148f63800e2", - "build/prefab/full/linux_x86_64_gui/debug/ballisticakit": "a6fb7f0164a400a8bce7c7cb2327f41b", - "build/prefab/full/linux_x86_64_gui/release/ballisticakit": "c6e86f716993e4db6d40b387c1887bf9", - "build/prefab/full/linux_x86_64_server/debug/dist/ballisticakit_headless": "fdb8c01b631d5475740f0101b301ff03", - "build/prefab/full/linux_x86_64_server/release/dist/ballisticakit_headless": "8c58b1dff5c711bf8dfe6bcc0c033e02", - "build/prefab/full/mac_arm64_gui/debug/ballisticakit": "68b0c339ca50a9d498f044d1b9c25665", - "build/prefab/full/mac_arm64_gui/release/ballisticakit": "4bd338604cf6288636422ef3b62e5d44", - "build/prefab/full/mac_arm64_server/debug/dist/ballisticakit_headless": "d585e0b8f0a2a1edefd52b9d9fb2fd40", - "build/prefab/full/mac_arm64_server/release/dist/ballisticakit_headless": "316e826a593499760060c1c2c09fe278", - "build/prefab/full/mac_x86_64_gui/debug/ballisticakit": "7070657c31c247dac4d1b14607a8435f", - "build/prefab/full/mac_x86_64_gui/release/ballisticakit": "606f7ed5a63fad5acbdba62b8f2e953f", - "build/prefab/full/mac_x86_64_server/debug/dist/ballisticakit_headless": "ccfa7d16a67a8b5e28b832861433b536", - "build/prefab/full/mac_x86_64_server/release/dist/ballisticakit_headless": "f98f149307ee2096aa5c82fb666d96b2", - "build/prefab/full/windows_x86_gui/debug/BallisticaKit.exe": "b3d826dae3e8105e5507a50d53142b56", - "build/prefab/full/windows_x86_gui/release/BallisticaKit.exe": "ffc3963828ad90d6da6237aa374909b9", - "build/prefab/full/windows_x86_server/debug/dist/BallisticaKitHeadless.exe": "21b69244af53ac854f513dbe574e9281", - "build/prefab/full/windows_x86_server/release/dist/BallisticaKitHeadless.exe": "92edda56e8cc74c3552f87d766a83a8c", + "build/prefab/full/linux_arm64_gui/debug/ballisticakit": "bfd2a477d0322f6fb74656f9a0dedae0", + "build/prefab/full/linux_arm64_gui/release/ballisticakit": "0d2f166f927785c9abbd7911b1940f4b", + "build/prefab/full/linux_arm64_server/debug/dist/ballisticakit_headless": "b0fb1c006ebf24c74084e94308f4dd0a", + "build/prefab/full/linux_arm64_server/release/dist/ballisticakit_headless": "a5d29314d5853e1a904f4b3ae48d6f21", + "build/prefab/full/linux_x86_64_gui/debug/ballisticakit": "d7182ecdcb53449fe67d54af9c088888", + "build/prefab/full/linux_x86_64_gui/release/ballisticakit": "7bb195668fa054394d03abf4b3ed2952", + "build/prefab/full/linux_x86_64_server/debug/dist/ballisticakit_headless": "22e16d10a41b36c5db277ec717488596", + "build/prefab/full/linux_x86_64_server/release/dist/ballisticakit_headless": "baa648fe7e976df9155b5e0994d334b6", + "build/prefab/full/mac_arm64_gui/debug/ballisticakit": "8c9b4d2626ce4674efa4a37d8cff6857", + "build/prefab/full/mac_arm64_gui/release/ballisticakit": "121545e12decb46689681cda8721f708", + "build/prefab/full/mac_arm64_server/debug/dist/ballisticakit_headless": "c72adfcd1ccc8bfc412e62efa98a8e14", + "build/prefab/full/mac_arm64_server/release/dist/ballisticakit_headless": "90ad3bc819d90bcfeb5563692a9606db", + "build/prefab/full/mac_x86_64_gui/debug/ballisticakit": "3ef248a8d70eaaedc6783898651bb668", + "build/prefab/full/mac_x86_64_gui/release/ballisticakit": "2cdfa98b7b372ee3d19446cf95ebb8ef", + "build/prefab/full/mac_x86_64_server/debug/dist/ballisticakit_headless": "715854042fe4f2470d67593bbad571d1", + "build/prefab/full/mac_x86_64_server/release/dist/ballisticakit_headless": "675ec134554280a37aaa2951adf48dac", + "build/prefab/full/windows_x86_gui/debug/BallisticaKit.exe": "c5b6443b911d21f020a8ff9c7bf23e98", + "build/prefab/full/windows_x86_gui/release/BallisticaKit.exe": "3ce98ab785f8c7656f3d7b2ee4491975", + "build/prefab/full/windows_x86_server/debug/dist/BallisticaKitHeadless.exe": "80c142f30aa63759bbe4d017f83d5977", + "build/prefab/full/windows_x86_server/release/dist/BallisticaKitHeadless.exe": "029360ae2dba2279d41022647afd0c52", "build/prefab/lib/linux_arm64_gui/debug/libballisticaplus.a": "9162b53189b80d4e5938cd142acd2a1a", "build/prefab/lib/linux_arm64_gui/release/libballisticaplus.a": "2226d0e2d34051d962320c86464f3a2d", "build/prefab/lib/linux_arm64_server/debug/libballisticaplus.a": "9162b53189b80d4e5938cd142acd2a1a", @@ -4074,14 +4074,14 @@ "build/prefab/lib/mac_x86_64_gui/release/libballisticaplus.a": "299b6c4b83966040618b27563b700c2a", "build/prefab/lib/mac_x86_64_server/debug/libballisticaplus.a": "08c2f91d086e6f3fa73ebc299112358a", "build/prefab/lib/mac_x86_64_server/release/libballisticaplus.a": "299b6c4b83966040618b27563b700c2a", - "build/prefab/lib/windows/Debug_Win32/BallisticaKitGenericPlus.lib": "50245294e53c993dd3a25db2868f22e0", - "build/prefab/lib/windows/Debug_Win32/BallisticaKitGenericPlus.pdb": "84d98c5f0dbab599afd67a0fcf8e28d8", - "build/prefab/lib/windows/Debug_Win32/BallisticaKitHeadlessPlus.lib": "08f5b3b61056a65d7f39009426d08c48", - "build/prefab/lib/windows/Debug_Win32/BallisticaKitHeadlessPlus.pdb": "3e4073e334438027320f3fcc2268357f", - "build/prefab/lib/windows/Release_Win32/BallisticaKitGenericPlus.lib": "51ac5f179b08a8892580ba915452b40a", - "build/prefab/lib/windows/Release_Win32/BallisticaKitGenericPlus.pdb": "a61545d3d93c89c5298536c133745c5d", - "build/prefab/lib/windows/Release_Win32/BallisticaKitHeadlessPlus.lib": "1a0c96f28a75527e975af1c023716f0f", - "build/prefab/lib/windows/Release_Win32/BallisticaKitHeadlessPlus.pdb": "0725628caf7f5baa9a59d1022f62a441", + "build/prefab/lib/windows/Debug_Win32/BallisticaKitGenericPlus.lib": "ec11bac6a42f25e02cd218928625c9b7", + "build/prefab/lib/windows/Debug_Win32/BallisticaKitGenericPlus.pdb": "4dc943a3a551a0615fe33c56ac8b5bd7", + "build/prefab/lib/windows/Debug_Win32/BallisticaKitHeadlessPlus.lib": "457df093184e56955a1170340e57cf43", + "build/prefab/lib/windows/Debug_Win32/BallisticaKitHeadlessPlus.pdb": "108e96eeda885404682b0762552e0f61", + "build/prefab/lib/windows/Release_Win32/BallisticaKitGenericPlus.lib": "11691eb6e947ee36f315c979a305533a", + "build/prefab/lib/windows/Release_Win32/BallisticaKitGenericPlus.pdb": "bdfa516a57bd798e482d20ebd074488c", + "build/prefab/lib/windows/Release_Win32/BallisticaKitHeadlessPlus.lib": "f25bf000209c0d97a852c71afa186c3a", + "build/prefab/lib/windows/Release_Win32/BallisticaKitHeadlessPlus.pdb": "d2aae5f895446cd23f2c5bb0656c79a3", "src/assets/ba_data/python/babase/_mgen/__init__.py": "f885fed7f2ed98ff2ba271f9dbe3391c", "src/assets/ba_data/python/babase/_mgen/enums.py": "5548f407d97e380069f6c596c4e36cd7", "src/ballistica/base/mgen/pyembed/binding_base.inc": "efa61468cf098f77cc6a234461d8b86d", diff --git a/CHANGELOG.md b/CHANGELOG.md index b48f8f45..b84cf353 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,4 +1,4 @@ -### 1.7.35 (build 21880, api 8, 2024-05-19) +### 1.7.35 (build 21882, api 8, 2024-05-29) - Fixed an issue where the engine would block at exit on some version of Linux until Ctrl-D was pressed in the calling terminal. - V2 accounts have been around for a while now, so the old V1 device login diff --git a/config/requirements.txt b/config/requirements.txt index 4988589f..f0c0d8b6 100644 --- a/config/requirements.txt +++ b/config/requirements.txt @@ -6,16 +6,16 @@ mypy==1.10.0 pbxproj==4.1.0 pdoc==14.5.0 pur==7.3.1 -pylint==3.2.1 +pylint==3.2.2 pylsp-mypy==0.6.8 -pytest==8.2.0 +pytest==8.2.1 python-daemon==3.0.1 python-lsp-black==2.0.0 python-lsp-server==1.11.0 -requests==2.31.0 +requests==2.32.3 Sphinx==7.3.7 tomlkit==0.12.5 types-certifi==2021.10.8.3 types-filelock==3.2.7 -types-requests==2.31.0.20240406 -typing_extensions==4.11.0 +types-requests==2.32.0.20240523 +typing_extensions==4.12.0 diff --git a/src/assets/.asset_manifest_public.json b/src/assets/.asset_manifest_public.json index 38cfd626..e7346f00 100644 --- a/src/assets/.asset_manifest_public.json +++ b/src/assets/.asset_manifest_public.json @@ -116,6 +116,10 @@ "ba_data/python/bacommon/net.py", "ba_data/python/bacommon/servermanager.py", "ba_data/python/bacommon/transfer.py", + "ba_data/python/bacommon/workspace/__init__.py", + "ba_data/python/bacommon/workspace/__pycache__/__init__.cpython-312.opt-1.pyc", + "ba_data/python/bacommon/workspace/__pycache__/assetsv1.cpython-312.opt-1.pyc", + "ba_data/python/bacommon/workspace/assetsv1.py", "ba_data/python/baenv.py", "ba_data/python/baplus/__init__.py", "ba_data/python/baplus/__pycache__/__init__.cpython-312.opt-1.pyc", diff --git a/src/assets/Makefile b/src/assets/Makefile index f7da779c..88ae95d2 100644 --- a/src/assets/Makefile +++ b/src/assets/Makefile @@ -733,6 +733,8 @@ SCRIPT_TARGETS_PY_PUBLIC_TOOLS = \ $(BUILD_DIR)/ba_data/python/bacommon/net.py \ $(BUILD_DIR)/ba_data/python/bacommon/servermanager.py \ $(BUILD_DIR)/ba_data/python/bacommon/transfer.py \ + $(BUILD_DIR)/ba_data/python/bacommon/workspace/__init__.py \ + $(BUILD_DIR)/ba_data/python/bacommon/workspace/assetsv1.py \ $(BUILD_DIR)/ba_data/python/efro/__init__.py \ $(BUILD_DIR)/ba_data/python/efro/call.py \ $(BUILD_DIR)/ba_data/python/efro/cloudshell.py \ @@ -768,6 +770,8 @@ SCRIPT_TARGETS_PYC_PUBLIC_TOOLS = \ $(BUILD_DIR)/ba_data/python/bacommon/__pycache__/net.cpython-312.opt-1.pyc \ $(BUILD_DIR)/ba_data/python/bacommon/__pycache__/servermanager.cpython-312.opt-1.pyc \ $(BUILD_DIR)/ba_data/python/bacommon/__pycache__/transfer.cpython-312.opt-1.pyc \ + $(BUILD_DIR)/ba_data/python/bacommon/workspace/__pycache__/__init__.cpython-312.opt-1.pyc \ + $(BUILD_DIR)/ba_data/python/bacommon/workspace/__pycache__/assetsv1.cpython-312.opt-1.pyc \ $(BUILD_DIR)/ba_data/python/efro/__pycache__/__init__.cpython-312.opt-1.pyc \ $(BUILD_DIR)/ba_data/python/efro/__pycache__/call.cpython-312.opt-1.pyc \ $(BUILD_DIR)/ba_data/python/efro/__pycache__/cloudshell.cpython-312.opt-1.pyc \ diff --git a/src/assets/ba_data/python/baenv.py b/src/assets/ba_data/python/baenv.py index 9acc46e5..e97c447a 100644 --- a/src/assets/ba_data/python/baenv.py +++ b/src/assets/ba_data/python/baenv.py @@ -52,7 +52,7 @@ if TYPE_CHECKING: # Build number and version of the ballistica binary we expect to be # using. -TARGET_BALLISTICA_BUILD = 21880 +TARGET_BALLISTICA_BUILD = 21882 TARGET_BALLISTICA_VERSION = '1.7.35' diff --git a/src/ballistica/shared/ballistica.cc b/src/ballistica/shared/ballistica.cc index 75acd734..1819455f 100644 --- a/src/ballistica/shared/ballistica.cc +++ b/src/ballistica/shared/ballistica.cc @@ -39,7 +39,7 @@ auto main(int argc, char** argv) -> int { namespace ballistica { // These are set automatically via script; don't modify them here. -const int kEngineBuildNumber = 21880; +const int kEngineBuildNumber = 21882; const char* kEngineVersion = "1.7.35"; const int kEngineApiVersion = 8; diff --git a/tools/bacommon/workspace/__init__.py b/tools/bacommon/workspace/__init__.py new file mode 100644 index 00000000..c17a0f04 --- /dev/null +++ b/tools/bacommon/workspace/__init__.py @@ -0,0 +1,3 @@ +# Released under the MIT License. See LICENSE for details. +# +"""Workspace functionality.""" diff --git a/tools/bacommon/workspace/assetsv1.py b/tools/bacommon/workspace/assetsv1.py new file mode 100644 index 00000000..1bc68c0a --- /dev/null +++ b/tools/bacommon/workspace/assetsv1.py @@ -0,0 +1,34 @@ +# Released under the MIT License. See LICENSE for details. +# +"""Defines workspace behavior.""" + +from __future__ import annotations + +from dataclasses import dataclass +from typing import TYPE_CHECKING, Annotated + +from efro.dataclassio import ioprepped, IOAttrs + + +if TYPE_CHECKING: + pass + + +@ioprepped +@dataclass +class AssetsV1GlobalVals: + """Global values for an assets_v1 workspace.""" + + # Just dummy testing values for now. + emit: Annotated[bool, IOAttrs('emit')] + aggro: Annotated[float, IOAttrs('aggro')] + + +@ioprepped +@dataclass +class AssetsV1PathVals: + """Path-specific values for an assets_v1 workspace path.""" + + # Just dummy testing values for now. + width: Annotated[int, IOAttrs('width')] + height: Annotated[int, IOAttrs('height')] diff --git a/tools/efro/dataclassio/_api.py b/tools/efro/dataclassio/_api.py index ae0554e3..7475cbab 100644 --- a/tools/efro/dataclassio/_api.py +++ b/tools/efro/dataclassio/_api.py @@ -44,6 +44,7 @@ def dataclass_to_dict( obj: Any, codec: Codec = Codec.JSON, coerce_to_float: bool = True, + discard_extra_attrs: bool = False, ) -> dict: """Given a dataclass object, return a json-friendly dict. @@ -62,7 +63,11 @@ def dataclass_to_dict( """ out = _Outputter( - obj, create=True, codec=codec, coerce_to_float=coerce_to_float + obj, + create=True, + codec=codec, + coerce_to_float=coerce_to_float, + discard_extra_attrs=discard_extra_attrs, ).run() assert isinstance(out, dict) return out @@ -157,14 +162,21 @@ def dataclass_from_json( def dataclass_validate( - obj: Any, coerce_to_float: bool = True, codec: Codec = Codec.JSON + obj: Any, + coerce_to_float: bool = True, + codec: Codec = Codec.JSON, + discard_extra_attrs: bool = False, ) -> None: """Ensure that values in a dataclass instance are the correct types.""" # Simply run an output pass but tell it not to generate data; # only run validation. _Outputter( - obj, create=False, codec=codec, coerce_to_float=coerce_to_float + obj, + create=False, + codec=codec, + coerce_to_float=coerce_to_float, + discard_extra_attrs=discard_extra_attrs, ).run() diff --git a/tools/efro/dataclassio/_base.py b/tools/efro/dataclassio/_base.py index 3c38975d..246b04e7 100644 --- a/tools/efro/dataclassio/_base.py +++ b/tools/efro/dataclassio/_base.py @@ -61,6 +61,29 @@ class IOExtendedData: type-safe form. """ + # pylint: disable=useless-return + + @classmethod + def handle_input_error(cls, exc: Exception) -> Self | None: + """Called when an error occurs during input decoding. + + This allows a type to optionally return substitute data + to be used in place of the failed decode. If it returns + None, the original exception is re-raised. + + It is generally a bad idea to apply catch-alls such as this, + as it can lead to silent data loss. This should only be used + in specific cases such as user settings where an occasional + reset is harmless and is preferable to keeping all contained + enums and other values backward compatible indefinitely. + """ + del exc # Unused. + + # By default we let things fail. + return None + + # pylint: enable=useless-return + EnumT = TypeVar('EnumT', bound=Enum) diff --git a/tools/efro/dataclassio/_inputter.py b/tools/efro/dataclassio/_inputter.py index 41588e98..e913816f 100644 --- a/tools/efro/dataclassio/_inputter.py +++ b/tools/efro/dataclassio/_inputter.py @@ -236,6 +236,28 @@ class _Inputter: sets should be passed as lists, enums should be passed as their associated values, and nested dataclasses should be passed as dicts. """ + try: + return self._do_dataclass_from_input(cls, fieldpath, values) + except Exception as exc: + # Extended data types can choose to sub default data in case + # of failures (generally not a good idea but occasionally + # useful). + if issubclass(cls, IOExtendedData): + fallback = cls.handle_input_error(exc) + if fallback is None: + raise + # Make sure fallback gave us the right type. + if not isinstance(fallback, cls): + raise RuntimeError( + f'handle_input_error() was expected to return a {cls}' + f' but returned a {type(fallback)}.' + ) from exc + return fallback + raise + + def _do_dataclass_from_input( + self, cls: type, fieldpath: str, values: dict + ) -> Any: # pylint: disable=too-many-locals # pylint: disable=too-many-statements # pylint: disable=too-many-branches @@ -377,6 +399,7 @@ class _Inputter: create=False, codec=self._codec, coerce_to_float=self._coerce_to_float, + discard_extra_attrs=False, ) self._soft_default_validator.soft_default_check( value=value, anntype=anntype, fieldpath=fieldpath diff --git a/tools/efro/dataclassio/_outputter.py b/tools/efro/dataclassio/_outputter.py index 56417ddc..d9f9acec 100644 --- a/tools/efro/dataclassio/_outputter.py +++ b/tools/efro/dataclassio/_outputter.py @@ -38,12 +38,18 @@ class _Outputter: """Validates or exports data contained in a dataclass instance.""" def __init__( - self, obj: Any, create: bool, codec: Codec, coerce_to_float: bool + self, + obj: Any, + create: bool, + codec: Codec, + coerce_to_float: bool, + discard_extra_attrs: bool, ) -> None: self._obj = obj self._create = create self._codec = codec self._coerce_to_float = coerce_to_float + self._discard_extra_attrs = discard_extra_attrs def run(self) -> Any: """Do the thing.""" @@ -133,17 +139,18 @@ class _Outputter: out[storagename] = outvalue # If there's extra-attrs stored on us, check/include them. - extra_attrs = getattr(obj, EXTRA_ATTRS_ATTR, None) - if isinstance(extra_attrs, dict): - if not _is_valid_for_codec(extra_attrs, self._codec): - raise TypeError( - f'Extra attrs on \'{fieldpath}\' contains data type(s)' - f' not supported by \'{self._codec.value}\' codec:' - f' {extra_attrs}.' - ) - if self._create: - assert out is not None - out.update(extra_attrs) + if not self._discard_extra_attrs: + extra_attrs = getattr(obj, EXTRA_ATTRS_ATTR, None) + if isinstance(extra_attrs, dict): + if not _is_valid_for_codec(extra_attrs, self._codec): + raise TypeError( + f'Extra attrs on \'{fieldpath}\' contains data type(s)' + f' not supported by \'{self._codec.value}\' codec:' + f' {extra_attrs}.' + ) + if self._create: + assert out is not None + out.update(extra_attrs) # If this obj inherits from multi-type, store its type id. if isinstance(obj, IOMultiType): diff --git a/tools/efrotools/efrocache.py b/tools/efrotools/efrocache.py index c25cbf04..6f92b731 100644 --- a/tools/efrotools/efrocache.py +++ b/tools/efrotools/efrocache.py @@ -28,8 +28,6 @@ from efro.dataclassio import ( ) from efro.terminal import Clr -from efrotools.util import is_wsl_windows_build_path - if TYPE_CHECKING: import efro.terminal @@ -661,6 +659,8 @@ def _write_cache_file(staging_dir: str, fname: str) -> tuple[str, str, str]: def _cache_prefix_for_file(fname: str) -> bytes: # pylint: disable=global-statement + from efrotools.util import is_wsl_windows_build_path + global g_cache_prefix_exec global g_cache_prefix_noexec