2025-11-14 17:15:24 +01:00
|
|
|
#!/bin/bash
|
|
|
|
|
|
2026-05-30 09:00:04 +02:00
|
|
|
log()
|
|
|
|
|
{
|
|
|
|
|
echo "$myname: $*" >&2
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
fatal()
|
|
|
|
|
{
|
|
|
|
|
echo "$myname: Fatal: $*" >&2
|
|
|
|
|
exit 1
|
|
|
|
|
}
|
|
|
|
|
|
2025-11-14 17:15:24 +01:00
|
|
|
usage()
|
|
|
|
|
{
|
|
|
|
|
cat <<-EOT
|
|
|
|
|
|
|
|
|
|
usage $myname [-e sed-extract-command] [-m module] file.py ...
|
|
|
|
|
|
|
|
|
|
EOT
|
|
|
|
|
[ "$1" ] && exit $1
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
module_path()
|
|
|
|
|
{
|
2026-05-30 09:00:04 +02:00
|
|
|
if [ "$module" = "." ]; then
|
|
|
|
|
echo .$1
|
|
|
|
|
elif [ "$module" ]; then
|
2025-11-14 17:15:24 +01:00
|
|
|
echo $module.$1
|
2026-05-30 09:00:04 +02:00
|
|
|
else
|
|
|
|
|
echo $1
|
2025-11-14 17:15:24 +01:00
|
|
|
fi
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
cmd_create_init()
|
|
|
|
|
{
|
2026-06-12 06:57:23 +02:00
|
|
|
__add_seen() {
|
|
|
|
|
local type="$1"
|
|
|
|
|
[[ -n "${seen[$type]+x}" ]] && fatal "Duplicate symbol: $type"
|
|
|
|
|
seen["$type"]=1
|
|
|
|
|
}
|
|
|
|
|
|
2025-11-14 17:15:24 +01:00
|
|
|
local import_submodules=0
|
2026-05-30 09:00:04 +02:00
|
|
|
local files="$*"
|
2025-11-14 17:15:24 +01:00
|
|
|
local del="-------------------------- generated by $myname"
|
|
|
|
|
echo "# >> $del >>"
|
2026-05-30 09:00:04 +02:00
|
|
|
echo "# ruff: noqa: E501"
|
2025-11-14 17:15:24 +01:00
|
|
|
echo "from pkgutil import extend_path"
|
2026-06-01 20:13:12 +02:00
|
|
|
echo ""
|
2026-05-30 09:00:04 +02:00
|
|
|
echo "__path__ = extend_path(__path__, __name__)"
|
2026-06-12 06:57:23 +02:00
|
|
|
echo
|
2026-05-30 09:00:04 +02:00
|
|
|
local f
|
|
|
|
|
local -A seen=()
|
2026-06-12 06:57:23 +02:00
|
|
|
local dst_type
|
2025-11-14 17:15:24 +01:00
|
|
|
for f in $files; do
|
|
|
|
|
test -d $f && continue
|
2026-05-30 09:00:04 +02:00
|
|
|
local base=${f##*/}
|
2025-11-14 17:15:24 +01:00
|
|
|
base=${base%.py}
|
2026-06-12 06:57:23 +02:00
|
|
|
if [ "$sed_extract_cmd" ]; then
|
|
|
|
|
local src_type types=$(sed "$sed_extract_cmd" $f)
|
|
|
|
|
for src_type in $types; do
|
|
|
|
|
if [ -z "$sed_symbol_filter_cmd" ]; then
|
|
|
|
|
dst_type="$src_type"
|
|
|
|
|
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
|
2025-11-14 17:15:24 +01:00
|
|
|
done
|
|
|
|
|
fi
|
|
|
|
|
done
|
|
|
|
|
if [ "$import_submodules" = 1 ]; then
|
|
|
|
|
for f in $files; do
|
2026-06-12 06:57:23 +02:00
|
|
|
[ -f $f/__init__.py ] || continue
|
|
|
|
|
echo "import `module_path $f` as $f"
|
|
|
|
|
__add_seen $f
|
2025-11-14 17:15:24 +01:00
|
|
|
done
|
|
|
|
|
fi
|
2026-06-12 06:57:23 +02:00
|
|
|
|
|
|
|
|
echo
|
|
|
|
|
echo "__all__ = ["
|
|
|
|
|
for dst_type in ${!seen[@]}; do
|
|
|
|
|
echo " \"$dst_type\","
|
|
|
|
|
done
|
|
|
|
|
echo "]"
|
|
|
|
|
|
2025-11-14 17:15:24 +01:00
|
|
|
echo "# << $del <<"
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
# --------------------- here we go
|
|
|
|
|
|
|
|
|
|
myname=`basename $0`
|
|
|
|
|
|
2026-06-12 06:57:23 +02:00
|
|
|
eval set -- `getopt -l 'symbol-filter:' -o 'he:m:' "$@"`
|
2025-11-14 17:15:24 +01:00
|
|
|
while [ "$1" != -- ]; do
|
|
|
|
|
case $1 in
|
|
|
|
|
-e)
|
2026-06-12 06:57:23 +02:00
|
|
|
sed_extract_cmd="$2"
|
|
|
|
|
shift
|
|
|
|
|
;;
|
|
|
|
|
--symbol-filter)
|
|
|
|
|
sed_symbol_filter_cmd="$2"
|
2025-11-14 17:15:24 +01:00
|
|
|
shift
|
|
|
|
|
;;
|
|
|
|
|
-m)
|
|
|
|
|
module=$2
|
|
|
|
|
shift
|
|
|
|
|
;;
|
|
|
|
|
-h)
|
|
|
|
|
usage 0;;
|
|
|
|
|
*)
|
|
|
|
|
echo unknown argument $1
|
|
|
|
|
usage 1;;
|
|
|
|
|
esac
|
|
|
|
|
shift
|
|
|
|
|
done
|
|
|
|
|
shift
|
|
|
|
|
|
|
|
|
|
cmd=cmd_${1//-/_}
|
|
|
|
|
shift
|
|
|
|
|
|
|
|
|
|
eval $cmd $*
|