diff --git a/.efrocachemap b/.efrocachemap
index 02eef2d7..6ab041ee 100644
--- a/.efrocachemap
+++ b/.efrocachemap
@@ -4080,18 +4080,18 @@
"build/prefab/full/linux_x86_64_gui/release/ballisticakit": "https://files.ballistica.net/cache/ba1/58/55/8451262689d989ea20afb41de14c",
"build/prefab/full/linux_x86_64_server/debug/dist/ballisticakit_headless": "https://files.ballistica.net/cache/ba1/4f/52/dce0af89103a5a03d1bb5782e7d0",
"build/prefab/full/linux_x86_64_server/release/dist/ballisticakit_headless": "https://files.ballistica.net/cache/ba1/78/64/c34c3f8fb8bce1e08da4438b3350",
- "build/prefab/full/mac_arm64_gui/debug/ballisticakit": "https://files.ballistica.net/cache/ba1/13/2a/fb167b1965bf3ca42119752d6ee2",
+ "build/prefab/full/mac_arm64_gui/debug/ballisticakit": "https://files.ballistica.net/cache/ba1/d9/d3/f2534b750f825306be86e8a4e33c",
"build/prefab/full/mac_arm64_gui/release/ballisticakit": "https://files.ballistica.net/cache/ba1/14/fb/35f54fb4b97377263f6305bd45c1",
- "build/prefab/full/mac_arm64_server/debug/dist/ballisticakit_headless": "https://files.ballistica.net/cache/ba1/1c/9a/0254de072276e6b91ae6263a85d1",
+ "build/prefab/full/mac_arm64_server/debug/dist/ballisticakit_headless": "https://files.ballistica.net/cache/ba1/ac/2b/5674c57bbf90e1960a3d374fb259",
"build/prefab/full/mac_arm64_server/release/dist/ballisticakit_headless": "https://files.ballistica.net/cache/ba1/7b/7b/b41669c7b97755276ab1cbdcb92f",
- "build/prefab/full/mac_x86_64_gui/debug/ballisticakit": "https://files.ballistica.net/cache/ba1/44/8f/77ce1cdbe24402790934d8456cf6",
+ "build/prefab/full/mac_x86_64_gui/debug/ballisticakit": "https://files.ballistica.net/cache/ba1/fe/2c/2b5c06695ec891ca8d0d8d7c45bc",
"build/prefab/full/mac_x86_64_gui/release/ballisticakit": "https://files.ballistica.net/cache/ba1/f2/7b/7efa84c6410a671cf97586614669",
- "build/prefab/full/mac_x86_64_server/debug/dist/ballisticakit_headless": "https://files.ballistica.net/cache/ba1/38/a3/cb7f11f0b08bc8a3905e6e75acc3",
+ "build/prefab/full/mac_x86_64_server/debug/dist/ballisticakit_headless": "https://files.ballistica.net/cache/ba1/62/83/cb684ce43b1107b2142c3a815c5a",
"build/prefab/full/mac_x86_64_server/release/dist/ballisticakit_headless": "https://files.ballistica.net/cache/ba1/f6/6e/657e14ff3c06d29ad2541647b191",
- "build/prefab/full/windows_x86_gui/debug/BallisticaKit.exe": "https://files.ballistica.net/cache/ba1/81/92/588ad98e7d2239c7c93ce7c12513",
- "build/prefab/full/windows_x86_gui/release/BallisticaKit.exe": "https://files.ballistica.net/cache/ba1/57/99/d59f41ae43a3fcb78c5938fb5400",
- "build/prefab/full/windows_x86_server/debug/dist/BallisticaKitHeadless.exe": "https://files.ballistica.net/cache/ba1/a4/93/ffd30c21a736ffa4c444affeb880",
- "build/prefab/full/windows_x86_server/release/dist/BallisticaKitHeadless.exe": "https://files.ballistica.net/cache/ba1/ed/58/2b7bc79d98a4c317d8b8edf959b7",
+ "build/prefab/full/windows_x86_gui/debug/BallisticaKit.exe": "https://files.ballistica.net/cache/ba1/38/59/94bc622dbb1266ef0beddae47960",
+ "build/prefab/full/windows_x86_gui/release/BallisticaKit.exe": "https://files.ballistica.net/cache/ba1/3a/b9/d2b65f3a1144857a6d7876fe3c5d",
+ "build/prefab/full/windows_x86_server/debug/dist/BallisticaKitHeadless.exe": "https://files.ballistica.net/cache/ba1/d9/69/31178d0400435915eef3a57b7dc0",
+ "build/prefab/full/windows_x86_server/release/dist/BallisticaKitHeadless.exe": "https://files.ballistica.net/cache/ba1/91/84/64a2941c8a465e32f78198b1af1b",
"build/prefab/lib/linux_arm64_gui/debug/libballistica_plus.a": "https://files.ballistica.net/cache/ba1/fd/89/44e2ebc1017c94053d3df1f6cb8a",
"build/prefab/lib/linux_arm64_gui/release/libballistica_plus.a": "https://files.ballistica.net/cache/ba1/38/d7/7110069365b22bee424f36e1bf5a",
"build/prefab/lib/linux_arm64_server/debug/libballistica_plus.a": "https://files.ballistica.net/cache/ba1/6c/89/1c44605fe89b5faa9b1061455838",
@@ -4108,14 +4108,14 @@
"build/prefab/lib/mac_x86_64_gui/release/libballistica_plus.a": "https://files.ballistica.net/cache/ba1/58/12/59092d28e6e8e1923dfff8d7e5de",
"build/prefab/lib/mac_x86_64_server/debug/libballistica_plus.a": "https://files.ballistica.net/cache/ba1/2e/a0/a2a78934c1193505f3d62989a152",
"build/prefab/lib/mac_x86_64_server/release/libballistica_plus.a": "https://files.ballistica.net/cache/ba1/67/56/ea651dddf9502c0513f29fb1a8c0",
- "build/prefab/lib/windows/Debug_Win32/BallisticaKitGenericPlus.lib": "https://files.ballistica.net/cache/ba1/dd/f9/bd44a01e2a9ea3e7b8447fe9ba14",
- "build/prefab/lib/windows/Debug_Win32/BallisticaKitGenericPlus.pdb": "https://files.ballistica.net/cache/ba1/10/da/f0e257288f791617e39964e3574b",
- "build/prefab/lib/windows/Debug_Win32/BallisticaKitHeadlessPlus.lib": "https://files.ballistica.net/cache/ba1/a6/a0/8af0b0f7dcd39a4344b6c80a5337",
- "build/prefab/lib/windows/Debug_Win32/BallisticaKitHeadlessPlus.pdb": "https://files.ballistica.net/cache/ba1/a4/f9/783d551d07a180edf4890d0179a7",
- "build/prefab/lib/windows/Release_Win32/BallisticaKitGenericPlus.lib": "https://files.ballistica.net/cache/ba1/11/b6/c7b7b6d06f88b16f0658b250779c",
- "build/prefab/lib/windows/Release_Win32/BallisticaKitGenericPlus.pdb": "https://files.ballistica.net/cache/ba1/de/d7/cfcd914aca8ce6965c5909cbefc4",
- "build/prefab/lib/windows/Release_Win32/BallisticaKitHeadlessPlus.lib": "https://files.ballistica.net/cache/ba1/df/84/2e43399b6e5f1a2d7cdcb2e4b34c",
- "build/prefab/lib/windows/Release_Win32/BallisticaKitHeadlessPlus.pdb": "https://files.ballistica.net/cache/ba1/24/dc/c65be65095e292f0e4e04ad71c8a",
+ "build/prefab/lib/windows/Debug_Win32/BallisticaKitGenericPlus.lib": "https://files.ballistica.net/cache/ba1/2f/3d/64cb8a6a5cb2bcf78393a42ff099",
+ "build/prefab/lib/windows/Debug_Win32/BallisticaKitGenericPlus.pdb": "https://files.ballistica.net/cache/ba1/f4/45/99242dbb1e89b39fd5a56ea981da",
+ "build/prefab/lib/windows/Debug_Win32/BallisticaKitHeadlessPlus.lib": "https://files.ballistica.net/cache/ba1/9f/81/6f38faaba336a4ec79d59e6b35eb",
+ "build/prefab/lib/windows/Debug_Win32/BallisticaKitHeadlessPlus.pdb": "https://files.ballistica.net/cache/ba1/09/d1/8eca404f15f194fd1f63e69704e4",
+ "build/prefab/lib/windows/Release_Win32/BallisticaKitGenericPlus.lib": "https://files.ballistica.net/cache/ba1/59/0b/242de4373174cfeb4f24e20c2349",
+ "build/prefab/lib/windows/Release_Win32/BallisticaKitGenericPlus.pdb": "https://files.ballistica.net/cache/ba1/16/33/3c0a9952f075e1285d8e641505dc",
+ "build/prefab/lib/windows/Release_Win32/BallisticaKitHeadlessPlus.lib": "https://files.ballistica.net/cache/ba1/5d/51/ab816cc1673f3035a752535b6e9c",
+ "build/prefab/lib/windows/Release_Win32/BallisticaKitHeadlessPlus.pdb": "https://files.ballistica.net/cache/ba1/9a/d9/432c2b34912f7db690d2a1a07fd2",
"src/assets/ba_data/python/babase/_mgen/__init__.py": "https://files.ballistica.net/cache/ba1/52/c6/c11130af7b10d6c0321add5518fa",
"src/assets/ba_data/python/babase/_mgen/enums.py": "https://files.ballistica.net/cache/ba1/38/c3/1dedd5e74f2508efc5974c8815a1",
"src/ballistica/base/mgen/pyembed/binding_base.inc": "https://files.ballistica.net/cache/ba1/ea/6a/6a4721b144e5e297b542d2a0eea2",
diff --git a/.idea/scopes/PyIgnoreUnresolved.xml b/.idea/scopes/PyIgnoreUnresolved.xml
index 25bc847f..d469c4f5 100644
--- a/.idea/scopes/PyIgnoreUnresolved.xml
+++ b/.idea/scopes/PyIgnoreUnresolved.xml
@@ -1,3 +1,3 @@
-
-
+
+
\ No newline at end of file
diff --git a/config/featuresets/featureset_ui_v1.py b/config/featuresets/featureset_ui_v1.py
index 45daf7e1..ea22ddbf 100644
--- a/config/featuresets/featureset_ui_v1.py
+++ b/config/featuresets/featureset_ui_v1.py
@@ -1,6 +1,6 @@
# Released under the MIT License. See LICENSE for details.
#
-# pylint: disable=missing-module-docstring, invalid-name
+# pylint: disable=useless-suppression, missing-docstring, invalid-name
from __future__ import annotations
# This file is exec'ed by the spinoff system, allowing us to define
@@ -8,6 +8,7 @@ from __future__ import annotations
# that can also be type-checked alongside other project Python code.
from batools.featureset import FeatureSet
+from batools.dummymodule import DummyModuleDef
# Grab the FeatureSet we should apply to.
fset = FeatureSet.get_active()
@@ -19,3 +20,11 @@ fset.has_python_app_subsystem = True
# We'd prefer our name's title form to be 'UI V1', not the default 'Ui V1'.
fset.name_title = 'UI V1'
+
+
+# Customize how our dummy module is generated.
+class OurDummyModuleDef(DummyModuleDef):
+ pass
+
+
+fset.dummy_module_def = OurDummyModuleDef()
diff --git a/src/assets/ba_data/python/babase/__init__.py b/src/assets/ba_data/python/babase/__init__.py
index f942ea79..7dc76c58 100644
--- a/src/assets/ba_data/python/babase/__init__.py
+++ b/src/assets/ba_data/python/babase/__init__.py
@@ -69,6 +69,9 @@ from babase._plugin import PotentialPlugin, Plugin, PluginSubsystem
from babase._app import App
from babase._cloud import CloudSubsystem
from babase._net import get_ip_address_type
+
+# noinspection PyProtectedMember
+# (PyCharm inspection bug?)
from babase._mgen.enums import (
Permission,
SpecialChar,
diff --git a/src/assets/ba_data/python/babase/modutils.py b/src/assets/ba_data/python/babase/modutils.py
index 2c5d5335..e5bbd69b 100644
--- a/src/assets/ba_data/python/babase/modutils.py
+++ b/src/assets/ba_data/python/babase/modutils.py
@@ -46,6 +46,9 @@ def get_human_readable_user_scripts_path() -> str:
def _request_storage_permission() -> bool:
"""If needed, requests storage permission from the user (& return true)."""
from babase._language import Lstr
+
+ # noinspection PyProtectedMember
+ # (PyCharm inspection bug?)
from babase._mgen.enums import Permission
if not _babase.have_permission(Permission.STORAGE):
diff --git a/tools/bacloud b/tools/bacloud
index d074af6a..ca9902a7 100755
--- a/tools/bacloud
+++ b/tools/bacloud
@@ -30,7 +30,7 @@ from efro.dataclassio import (
from bacommon.bacloud import RequestData, ResponseData, BACLOUD_VERSION
if TYPE_CHECKING:
- from typing import BinaryIO, IO
+ from typing import IO
TOOL_NAME = 'bacloud'
@@ -367,6 +367,7 @@ class App:
if response.end_command is not None:
nextcall = response.end_command
for key, val in self._end_command_args.items():
+ # noinspection PyUnresolvedReferences
nextcall[1][key] = val
diff --git a/tools/batools/dummymodule.py b/tools/batools/dummymodule.py
index c1864727..3bdb2a75 100755
--- a/tools/batools/dummymodule.py
+++ b/tools/batools/dummymodule.py
@@ -12,7 +12,6 @@ from __future__ import annotations
import os
-# import sys
import types
import textwrap
import subprocess
@@ -27,6 +26,10 @@ if TYPE_CHECKING:
from batools.docs import AttributeInfo
+class DummyModuleDef:
+ """Defines custom dummy module generation behavior."""
+
+
def _get_varying_func_info(sig_in: str) -> tuple[str, str]:
"""Return overloaded signatures and return statements for varying funcs."""
returns = 'return None'
@@ -894,6 +897,7 @@ class Generator:
def generate_dummy_modules(projroot: str) -> None:
"""Generate all dummy-modules."""
+ # pylint: disable=cyclic-import
from batools.featureset import FeatureSet
diff --git a/tools/batools/featureset.py b/tools/batools/featureset.py
index d037e35c..42351f5f 100644
--- a/tools/batools/featureset.py
+++ b/tools/batools/featureset.py
@@ -15,6 +15,7 @@ from typing import TYPE_CHECKING
from efro.util import snake_case_to_title
from efro.error import CleanError
+from batools.dummymodule import DummyModuleDef
if TYPE_CHECKING:
pass
@@ -81,13 +82,16 @@ class FeatureSet:
# know).
self.allow_as_soft_requirement = False
- self.validate_name(name)
+ # Override this to customize how your dummy module is generated.
+ self.dummy_module_def = DummyModuleDef()
# Paths of files we should disable c++ namespace checks for.
# (generally external-originating code that doesn't conform to our
# ballistica feature-set based namespace scheme)
self.cpp_namespace_check_disable_files = set[str]()
+ self.validate_name(name)
+
# Our standard snake_case name.
self._name = name