PyAPI: make internal modules explicitly "private"

Rename modules in `./scripts/modules/` to use an underscore prefix to
make it clear they aren't intended to be part of public API's. This
also means there is no implication that these modules should be stable,
allowing us to change them based on Blender's internal usage.

The following modules have been marked as private:

- `animsys_refactor`
- `bl_console_utils`
- `bl_i18n_utils`
- `bl_previews_utils`
- `bl_rna_utils`
- `bl_text_utils`
- `bl_ui_utils`
- `bpy_restrict_state`
- `console_python`
- `console_shell`
- `graphviz_export`
- `keyingsets_utils`
- `rna_info`
- `rna_manual_reference`
- `rna_xml`

Note that we could further re-arrange these modules
(under `_bpy_internal` in some cases), this change is mainly to mark
them as private, further changes can be handed on a case-by-case basis.

Ref !147773
This commit is contained in:
Campbell Barton
2025-10-13 09:35:09 +00:00
parent d7555b5064
commit 1216651ca9
63 changed files with 54 additions and 54 deletions

View File

@@ -15,7 +15,7 @@ from bpy.types import (
UILayout,
UIList,
)
from bl_ui_utils.layout import operator_context
from _bl_ui_utils.layout import operator_context
class VIEW3D_MT_pose_modify(Menu):

View File

@@ -17,7 +17,7 @@ else:
BoolProperty,
StringProperty,
)
from bl_i18n_utils import settings as settings_i18n
from _bl_i18n_utils import settings as settings_i18n
settings = settings_i18n.I18nSettings()

View File

@@ -16,8 +16,8 @@ else:
StringProperty,
)
from . import settings
from bl_i18n_utils import utils as utils_i18n
from bl_i18n_utils import bl_extract_messages
from _bl_i18n_utils import utils as utils_i18n
from _bl_i18n_utils import bl_extract_messages
from bpy.app.translations import pgettext_rpt as rpt_
import addon_utils

View File

@@ -15,8 +15,8 @@ else:
EnumProperty,
)
from . import settings
from bl_i18n_utils import utils as utils_i18n
from bl_i18n_utils import utils_languages_menu
from _bl_i18n_utils import utils as utils_i18n
from _bl_i18n_utils import utils_languages_menu
import concurrent.futures
import io
@@ -85,7 +85,7 @@ class UI_OT_i18n_updatetranslation_work_repo(Operator):
# This is a problem because spawned processes do not inherit the whole environment
# of the current (Blender-customized) python. In practice, the `bpy` module won't load e.g.
# So care must be taken that the callback passed to the executor does not rely on any
# Blender-specific modules etc. This is why it is using a class method from `bl_i18n_utils`
# Blender-specific modules etc. This is why it is using a class method from `_bl_i18n_utils`
# module, rather than a local function of this current Blender-only module.
# FIXME: This can easily deadlock on powerful machine with lots of RAM (128GB) and cores (32)...
# ~ with concurrent.futures.ProcessPoolExecutor() as exctr:

View File

@@ -23,7 +23,7 @@ else:
CollectionProperty,
)
from . import settings
from bl_i18n_utils import utils as utils_i18n
from _bl_i18n_utils import utils as utils_i18n
from bpy.app.translations import pgettext_iface as iface_

View File

@@ -18,7 +18,7 @@ import glob
from pathlib import PurePath
# XXX Relative import does not work here when used from Blender...
from bl_i18n_utils import settings as settings_i18n, utils
from _bl_i18n_utils import settings as settings_i18n, utils
import bpy
@@ -31,7 +31,7 @@ filter_message = ignore_reg.match
def init_spell_check(settings, lang="en_US"):
try:
from bl_i18n_utils import utils_spell_check
from _bl_i18n_utils import utils_spell_check
return utils_spell_check.SpellChecker(settings, lang)
except Exception as ex:
print("Failed to import utils_spell_check ({})".format(str(ex)))
@@ -1231,7 +1231,7 @@ def dump_messages(do_messages, do_checks, settings):
# Get strings specific to translations' menu.
for lng in settings.LANGUAGES:
process_msg(
msgs, settings.DEFAULT_CONTEXT, lng[1], "Languages labels from bl_i18n_utils/settings.py",
msgs, settings.DEFAULT_CONTEXT, lng[1], "Languages labels from _bl_i18n_utils/settings.py",
reports, None, settings,
)

View File

@@ -22,7 +22,7 @@ import struct
import tempfile
import time
from bl_i18n_utils import (
from _bl_i18n_utils import (
settings,
utils_rtl,
)

View File

@@ -56,7 +56,7 @@ def gen_menu_file(stats, settings):
"# ID must be unique, except for 0 value (marks categories for menu).",
"# Line starting with a # are comments!",
"#",
"# Automatically generated by bl_i18n_utils/utils_languages_menu.py script.",
"# Automatically generated by _bl_i18n_utils/utils_languages_menu.py script.",
"# Highest ID currently in use: {}".format(highest_uid),
]
for uid_num, label, uid, flag, lvl in langs:

View File

@@ -237,7 +237,7 @@ execute.hooks = []
def autocomplete(context):
from bl_console_utils.autocomplete import intellisense
from _bl_console_utils.autocomplete import intellisense
sc = context.space_data

View File

@@ -332,7 +332,7 @@ def enable(module_name, *, default_set=False, persistent=False, refresh_handled=
import os
import sys
import importlib
from bpy_restrict_state import RestrictBlend
from _bpy_restrict_state import RestrictBlend
if handle_error is None:
def handle_error(ex):

View File

@@ -35,7 +35,7 @@ _modules = {}
def _enable(template_id, *, handle_error=None, ignore_not_found=False):
from bpy_restrict_state import RestrictBlend
from _bpy_restrict_state import RestrictBlend
if handle_error is None:
def handle_error(_ex):

View File

@@ -321,7 +321,7 @@ def load_scripts(*, reload_scripts=False, refresh_scripts=False, extensions=True
# Without this, add-on register functions accessing key-map properties can crash, see: #111702.
_bpy.context.window_manager.keyconfigs.update(keep_properties=True)
from bpy_restrict_state import RestrictBlend
from _bpy_restrict_state import RestrictBlend
with RestrictBlend():
for base_path in script_paths(use_user=use_user):
@@ -367,7 +367,7 @@ def _on_exit():
# Call `unregister` function on internal startup module.
# Must only be used as part of Blender 'exit' process.
from bpy_restrict_state import RestrictBlend
from _bpy_restrict_state import RestrictBlend
with RestrictBlend():
for mod_name in reversed(_registered_module_names):
if (mod := _sys.modules.get(mod_name)) is None:
@@ -1231,7 +1231,7 @@ def _blender_default_map():
# NOTE(@ideasman42): Avoid importing this as there is no need to keep the lookup table in memory.
# As this runs when the user accesses the "Online Manual", the overhead loading the file is acceptable.
# In my tests it's under 1/100th of a second loading from a `pyc`.
ref_mod = execfile(_os.path.join(_script_base_dir, "modules", "rna_manual_reference.py"))
ref_mod = execfile(_os.path.join(_script_base_dir, "modules", "_rna_manual_reference.py"))
return (ref_mod.url_manual_prefix, ref_mod.url_manual_mapping)

View File

@@ -398,7 +398,7 @@ class UpdateAnimatedTransformConstraint(Operator):
)
def execute(self, context):
import animsys_refactor
import _animsys_refactor as animsys_refactor
from math import radians
import io

View File

@@ -15,7 +15,7 @@ from bpy.app.translations import contexts as i18n_contexts
def _lang_module_get(sc):
return __import__(
"console_" + sc.language,
"_console_" + sc.language,
# for python 3.3, maybe a bug???
level=0,
)

View File

@@ -95,7 +95,7 @@ class WM_OT_previews_batch_generate(Operator):
def execute(self, context):
import os
import subprocess
from bl_previews_utils import bl_previews_render as preview_render
from _bl_previews_utils import bl_previews_render as preview_render
context.window_manager.progress_begin(0, len(self.files))
context.window_manager.progress_update(0)
@@ -204,7 +204,7 @@ class WM_OT_previews_batch_clear(Operator):
def execute(self, context):
import os
import subprocess
from bl_previews_utils import bl_previews_render as preview_render
from _bl_previews_utils import bl_previews_render as preview_render
context.window_manager.progress_begin(0, len(self.files))
context.window_manager.progress_update(0)

View File

@@ -164,7 +164,7 @@ class AddPresetBase:
print("Writing Preset: {!r}".format(filepath))
if is_xml:
import rna_xml
import _rna_xml as rna_xml
rna_xml.xml_file_write(context, filepath, preset_menu_class.preset_xml_map)
else:
@@ -304,7 +304,7 @@ class ExecutePreset(Operator):
self.report({'ERROR'}, "Failed to execute the preset: " + repr(ex))
elif ext == ".xml":
import rna_xml
import _rna_xml as rna_xml
preset_xml_map = preset_class.preset_xml_map
preset_xml_secure_types = getattr(preset_class, "preset_xml_secure_types", None)
@@ -708,7 +708,7 @@ class SavePresetInterfaceTheme(AddPresetBase, Operator):
# while redrawing as it may involve remote file-system access.
def execute(self, context):
import rna_xml
import _rna_xml as rna_xml
filepath = context.preferences.themes[0].filepath
if (not filepath) or _is_path_readonly(filepath):
self.report({'ERROR'}, "Built-in themes cannot be overwritten")

View File

@@ -31,7 +31,7 @@ from bpy.app.translations import (
def _rna_path_prop_search_for_context_impl(context, edit_text, unique_attrs):
# Use the same logic as auto-completing in the Python console to expand the data-path.
from bl_console_utils.autocomplete import intellisense
from _bl_console_utils.autocomplete import intellisense
context_prefix = "context."
line = context_prefix + edit_text
cursor = len(line)
@@ -148,7 +148,7 @@ def context_path_validate(context, data_path):
def context_path_to_rna_property(context, data_path):
from bl_rna_utils.data_path import property_definition_from_data_path
from _bl_rna_utils.data_path import property_definition_from_data_path
rna_prop = property_definition_from_data_path(context, "." + data_path)
if rna_prop is not None:
return rna_prop
@@ -167,7 +167,7 @@ def context_path_decompose(data_path):
# Note that the `.` is removed from the start of the first and second values,
# this is done because `.attr` isn't convenient to use as an argument,
# also the convention is not to include this within the data paths or the operator logic for `bpy.ops.wm.*`.
from bl_rna_utils.data_path import decompose_data_path
from _bl_rna_utils.data_path import decompose_data_path
path_split = decompose_data_path("." + data_path)
# Find the last property that isn't a function call.
@@ -1342,7 +1342,7 @@ class WM_OT_doc_view_manual(Operator):
self.report(
{'WARNING'},
rpt_("No reference available {!r}, "
"Update info in 'rna_manual_reference.py' "
"Update info in '_rna_manual_reference.py' "
"or callback to bpy.utils.manual_map()").format(self.doc_id)
)
return {'CANCELLED'}

View File

@@ -384,7 +384,7 @@ class GRAPH_MT_key_density(Menu):
bl_label = "Density"
def draw(self, _context):
from bl_ui_utils.layout import operator_context
from _bl_ui_utils.layout import operator_context
layout = self.layout
layout.operator("graph.decimate", text="Decimate (Ratio)").mode = 'RATIO'
# Using the modal operation doesn't make sense for this variant

View File

@@ -1075,7 +1075,7 @@ class SEQUENCER_MT_strip(Menu):
bl_label = "Strip"
def draw(self, context):
from bl_ui_utils.layout import operator_context
from _bl_ui_utils.layout import operator_context
layout = self.layout
st = context.space_data

View File

@@ -553,7 +553,7 @@ class TOPBAR_MT_window(Menu):
def draw(self, context):
import sys
from bl_ui_utils.layout import operator_context
from _bl_ui_utils.layout import operator_context
layout = self.layout

View File

@@ -3212,7 +3212,7 @@ class VIEW3D_MT_object_parent(Menu):
bl_translation_context = i18n_contexts.operator_default
def draw(self, _context):
from bl_ui_utils.layout import operator_context
from _bl_ui_utils.layout import operator_context
layout = self.layout

View File

@@ -15,7 +15,7 @@ are supported.
"""
import bpy
import keyingsets_utils
import _keyingsets_utils as keyingsets_utils
from bpy.types import KeyingSetInfo
###############################