python-tools.sh, py-mod.mk: Use --symbol-filter #13

Merged
Jan Lindemann merged 1 commit from jan/feature/20260612-python-tools-sh-py-mod-mk-use-symbol-filter into master 2026-06-12 07:39:54 +02:00 AGit
2 changed files with 41 additions and 10 deletions

View file

@ -6,6 +6,10 @@ include $(JWBDIR)/make/dev-utils.mk
PY_INIT_TMPL = $(wildcard __init__.py.tmpl) PY_INIT_TMPL = $(wildcard __init__.py.tmpl)
PY_SED_EXTRACT_EXPORT ?= /\(\(class\|def\)\s\+[a-zA-Z_].*\|^ *\S\+\s*=.*\)\# *export/ !d; /^\s*\#/ d; s/\(async\)* *\(class\|def\) *//; s/[(:=].*// PY_SED_EXTRACT_EXPORT ?= /\(\(class\|def\)\s\+[a-zA-Z_].*\|^ *\S\+\s*=.*\)\# *export/ !d; /^\s*\#/ d; s/\(async\)* *\(class\|def\) *//; s/[(:=].*//
PY_INIT_FILTER ?= cat PY_INIT_FILTER ?= cat
PY_GENERATE_INIT_PY ?= /bin/bash $(JWB_SCRIPT_DIR)/python-tools.sh create-init -m . -e "$(PY_SED_EXTRACT_EXPORT)"
ifneq ($(PY_SYMBOL_FILTER),)
PY_GENERATE_INIT_PY += --symbol-filter "$(PY_SYMBOL_FILTER)"
endif
#leftparen := ( #leftparen := (
#PY_EXPORT ?= $(shell sed '/\(class\|def\) ..*\# *export/ !d; s/\(class\|def\) *//; s/[$(leftparen):].*//' $(PY_SRC_PY)) #PY_EXPORT ?= $(shell sed '/\(class\|def\) ..*\# *export/ !d; s/\(class\|def\) *//; s/[$(leftparen):].*//' $(PY_SRC_PY))
@ -20,7 +24,7 @@ include $(JWBDIR)/make/py-rules.mk
ifeq ($(PY_UPDATE_INIT_PY),true) ifeq ($(PY_UPDATE_INIT_PY),true)
__init__.py: $(PY_INIT_TMPL) $(filter-out __init__.py,$(PY_SRC_PY)) __init__.py: $(PY_INIT_TMPL) $(filter-out __init__.py,$(PY_SRC_PY))
if [ "$(PY_INIT_TMPL)" ]; then cat "$(PY_INIT_TMPL)" > $@.tmp; else > $@.tmp; fi if [ "$(PY_INIT_TMPL)" ]; then cat "$(PY_INIT_TMPL)" > $@.tmp; else > $@.tmp; fi
set -e -o pipefail; /bin/bash $(JWB_SCRIPT_DIR)/python-tools.sh create-init -m . -e "$(PY_SED_EXTRACT_EXPORT)" \ set -e -o pipefail; $(PY_GENERATE_INIT_PY) \
$(filter-out __init__.py,$(PY_ALL_PY)) $(SUBDIRS_TO_ITERATE) | $(PY_INIT_FILTER) | tee -a $@.tmp $(filter-out __init__.py,$(PY_ALL_PY)) $(SUBDIRS_TO_ITERATE) | $(PY_INIT_FILTER) | tee -a $@.tmp
mv $@.tmp $@ mv $@.tmp $@
endif endif

View file

@ -34,6 +34,12 @@ module_path()
cmd_create_init() cmd_create_init()
{ {
__add_seen() {
local type="$1"
[[ -n "${seen[$type]+x}" ]] && fatal "Duplicate symbol: $type"
seen["$type"]=1
}
local import_submodules=0 local import_submodules=0
local files="$*" local files="$*"
local del="-------------------------- generated by $myname" local del="-------------------------- generated by $myname"
@ -42,26 +48,43 @@ cmd_create_init()
echo "from pkgutil import extend_path" echo "from pkgutil import extend_path"
echo "" echo ""
echo "__path__ = extend_path(__path__, __name__)" echo "__path__ = extend_path(__path__, __name__)"
echo
local f local f
local -A seen=() local -A seen=()
local dst_type
for f in $files; do for f in $files; do
test -d $f && continue test -d $f && continue
local base=${f##*/} local base=${f##*/}
base=${base%.py} base=${base%.py}
if [ "$sed_extract_command" ]; then if [ "$sed_extract_cmd" ]; then
local type types=`sed "$sed_extract_command" $f` local src_type types=$(sed "$sed_extract_cmd" $f)
for type in $types; do for src_type in $types; do
echo "from `module_path $base` import $type as $type" if [ -z "$sed_symbol_filter_cmd" ]; then
[[ -n "${seen[$type]+x}" ]] && fatal "Duplicate symbol: $type" dst_type="$src_type"
seen["$type"]=1 else
dst_type=$(echo $base $src_type | sed "$sed_symbol_filter_cmd")
fi
[ "$sed_symbol_filter_cmd" ] && dst_type=$(echo $base $src_type | sed "$sed_symbol_filter_cmd")
echo "from `module_path $base` import $src_type as $dst_type"
__add_seen $dst_type
done done
fi fi
done done
if [ "$import_submodules" = 1 ]; then if [ "$import_submodules" = 1 ]; then
for f in $files; do for f in $files; do
[ -f $f/__init__.py ] && echo "import `module_path $f` as $f" [ -f $f/__init__.py ] || continue
echo "import `module_path $f` as $f"
__add_seen $f
done done
fi fi
echo
echo "__all__ = ["
for dst_type in ${!seen[@]}; do
echo " \"$dst_type\","
done
echo "]"
echo "# << $del <<" echo "# << $del <<"
} }
@ -69,11 +92,15 @@ cmd_create_init()
myname=`basename $0` myname=`basename $0`
eval set -- `getopt -o 'he:m:' "$@"` eval set -- `getopt -l 'symbol-filter:' -o 'he:m:' "$@"`
while [ "$1" != -- ]; do while [ "$1" != -- ]; do
case $1 in case $1 in
-e) -e)
sed_extract_command="$2" sed_extract_cmd="$2"
shift
;;
--symbol-filter)
sed_symbol_filter_cmd="$2"
shift shift
;; ;;
-m) -m)