@@ -394,7 +394,7 @@ install-build-tools venv="": (create venv)
394394 ${VENV_PYTHON} -V
395395 ${VENV_PYTHON} -m pip -V
396396
397- ${VENV_PYTHON} -m pip install build twine
397+ ${VENV_PYTHON} -m pip install build twine auditwheel
398398
399399# Install the development tools for this Package in a single environment (usage: `just install-tools cpy312`)
400400install-tools venv = " ": (create venv)
@@ -413,7 +413,7 @@ install-tools venv="": (create venv)
413413 ${VENV_PYTHON} -V
414414 ${VENV_PYTHON} -m pip -V
415415
416- ${VENV_PYTHON} -m pip install -e .[dev,dev-latest ]
416+ ${VENV_PYTHON} -m pip install -e .[dev]
417417
418418# Meta-recipe to run `install-tools` on all environments
419419install-tools-all :
@@ -836,6 +836,222 @@ build-verifydist venv="": (install-build-tools venv)
836836# Legacy alias for build-verifydist
837837verify-dist venv = " ": (build-verifydist venv)
838838
839+ # Path to parent directory containing all WAMP Python repos
840+ WAMP_REPOS_DIR := parent_directory (justfile_directory ())
841+
842+ # List of all WAMP Python repos in dependency order
843+ WAMP_REPOS := ' txaio autobahn-python zlmdb cfxdb wamp-xbr crossbar'
844+
845+ # Build all 6 WAMP Python repos (all Python versions) and collect wheels/sdists into dist-universe
846+ build-universe :
847+ #!/usr/bin/env bash
848+ set -e
849+
850+ echo " ========================================================================"
851+ echo " Building WAMP Universe (all 6 Python repos, all Python versions)"
852+ echo " ========================================================================"
853+ echo " Repos dir: {{ WAMP_REPOS_DIR }}"
854+ echo " "
855+
856+ # Clean and create dist-universe directory
857+ rm -rf ./dist-universe
858+ mkdir -p ./dist-universe
859+
860+ FAILURES=0
861+ BUILT_REPOS=" "
862+
863+ for repo in {{ WAMP_REPOS }}; do
864+ REPO_PATH=" {{ WAMP_REPOS_DIR }}/${repo} "
865+ echo " "
866+ echo " ========================================================================"
867+ echo " Building: ${repo} "
868+ echo " ========================================================================"
869+
870+ if [ ! -d " ${REPO_PATH} " ]; then
871+ echo " ❌ ERROR: Repository not found at ${REPO_PATH} "
872+ (( ++ FAILURES))
873+ continue
874+ fi
875+
876+ if [ ! -f " ${REPO_PATH} /justfile" ]; then
877+ echo " ❌ ERROR: No justfile found in ${REPO_PATH} "
878+ (( ++ FAILURES))
879+ continue
880+ fi
881+
882+ # Clean repo dist directory first
883+ rm -rf " ${REPO_PATH} /dist"
884+
885+ # Build wheels for ALL Python versions (CPython + PyPy)
886+ echo " --> Building wheels for all Python versions..."
887+ if (cd " ${REPO_PATH} " && just build-all); then
888+ echo " ✓ Wheels built"
889+ else
890+ echo " ❌ FAIL: Wheel build failed"
891+ (( ++ FAILURES))
892+ continue
893+ fi
894+
895+ # Build source distribution (only need one, use system Python)
896+ echo " --> Building source distribution..."
897+ if (cd " ${REPO_PATH} " && just build-sourcedist); then
898+ echo " ✓ Source distribution built"
899+ else
900+ echo " ❌ FAIL: Source distribution build failed"
901+ (( ++ FAILURES))
902+ continue
903+ fi
904+
905+ # Copy artifacts to dist-universe
906+ echo " --> Copying artifacts to dist-universe..."
907+ cp " ${REPO_PATH} " /dist/* .whl ./dist-universe/ 2> /dev/null || true
908+ cp " ${REPO_PATH} " /dist/* .tar.gz ./dist-universe/ 2> /dev/null || true
909+
910+ BUILT_REPOS=" ${BUILT_REPOS} ${repo} "
911+ echo " ✓ ${repo} complete"
912+ done
913+
914+ echo " "
915+ echo " ========================================================================"
916+ echo " Build Universe Summary"
917+ echo " ========================================================================"
918+ echo " Successfully built:${BUILT_REPOS} "
919+ echo " Failures: ${FAILURES} "
920+ echo " "
921+ echo " Artifacts in dist-universe:"
922+ ls -la ./dist-universe/
923+ echo " "
924+
925+ if [ ${FAILURES} -gt 0 ]; then
926+ echo " ❌ BUILD UNIVERSE FAILED: ${FAILURES} repo(s) had errors"
927+ exit 1
928+ else
929+ WHEEL_COUNT=$( ls ./dist-universe/* .whl 2> /dev/null | wc -l)
930+ SDIST_COUNT=$( ls ./dist-universe/* .tar.gz 2> /dev/null | wc -l)
931+ echo " ✅ BUILD UNIVERSE COMPLETE"
932+ echo " Wheels: ${WHEEL_COUNT} "
933+ echo " Source dists: ${SDIST_COUNT} "
934+ fi
935+
936+ # Verify all wheels and source dists in dist-universe (usage: `just verify-universe`)
937+ verify-universe : (install-build-tools )
938+ #!/usr/bin/env bash
939+ set -e
940+ VENV_NAME=$( just --quiet _get-system-venv-name)
941+ VENV_PATH=" {{ VENV_DIR }}/${VENV_NAME} "
942+ VENV_PYTHON=$( just --quiet _get-venv-python " ${VENV_NAME} " )
943+
944+ echo " ========================================================================"
945+ echo " Verifying WAMP Universe (dist-universe)"
946+ echo " ========================================================================"
947+ echo " Using venv: ${VENV_NAME} "
948+ echo " "
949+
950+ # Check if dist-universe exists
951+ if [ ! -d " ./dist-universe" ]; then
952+ echo " ❌ ERROR: dist-universe/ directory not found"
953+ echo " Run 'just build-universe' first"
954+ exit 1
955+ fi
956+
957+ FAILURES=0
958+
959+ # Count distributions
960+ WHEEL_COUNT=$( ls ./dist-universe/* .whl 2> /dev/null | wc -l)
961+ SDIST_COUNT=$( ls ./dist-universe/* .tar.gz 2> /dev/null | wc -l)
962+
963+ echo " Found ${WHEEL_COUNT} wheel(s) and ${SDIST_COUNT} source dist(s)"
964+ echo " "
965+
966+ if [ " ${WHEEL_COUNT} " -eq 0 ] && [ " ${SDIST_COUNT} " -eq 0 ]; then
967+ echo " ❌ ERROR: No distributions found in dist-universe/"
968+ exit 1
969+ fi
970+
971+ # Verify with twine check
972+ echo " ========================================================================"
973+ echo " Running twine check"
974+ echo " ========================================================================"
975+ if ${VENV_PYTHON} -m twine check ./dist-universe/* ; then
976+ echo " ✓ Twine check passed for all packages"
977+ else
978+ echo " ❌ FAIL: Twine check failed"
979+ (( ++ FAILURES))
980+ fi
981+ echo " "
982+
983+ # Check wheel types
984+ echo " ========================================================================"
985+ echo " Checking wheel types"
986+ echo " ========================================================================"
987+ for wheel in ./dist-universe/* .whl; do
988+ WHEEL_NAME=$( basename " $wheel " )
989+ # Extract package name (everything before the version)
990+ PKG_NAME=$( echo " $WHEEL_NAME " | sed ' s/-[0-9].*//' )
991+
992+ if [[ " $WHEEL_NAME " == * " -py2.py3-none-any.whl" ]] || [[ " $WHEEL_NAME " == * " -py3-none-any.whl" ]]; then
993+ echo " ✓ ${PKG_NAME} : Pure Python wheel"
994+ elif [[ " $WHEEL_NAME " == * " -cp3" * " -linux" * ]] || [[ " $WHEEL_NAME " == * " -cp3" * " -manylinux" * ]]; then
995+ echo " ✓ ${PKG_NAME} : Platform-specific wheel (CPython/CFFI)"
996+ # Run auditwheel on platform-specific wheels
997+ echo " --> Running auditwheel show..."
998+ if [ -x " ${VENV_PATH} /bin/auditwheel" ]; then
999+ " ${VENV_PATH} /bin/auditwheel" show " $wheel " 2> /dev/null || echo " ⚠ auditwheel show had warnings"
1000+ else
1001+ echo " ⚠ auditwheel not available"
1002+ fi
1003+ elif [[ " $WHEEL_NAME " == * " -pp3" * " -linux" * ]] || [[ " $WHEEL_NAME " == * " -pp3" * " -manylinux" * ]]; then
1004+ echo " ✓ ${PKG_NAME} : Platform-specific wheel (PyPy/CFFI)"
1005+ else
1006+ echo " ⚠ ${PKG_NAME} : Unknown wheel type: ${WHEEL_NAME} "
1007+ fi
1008+ done
1009+ echo " "
1010+
1011+ # Summary by package
1012+ echo " ========================================================================"
1013+ echo " Package Summary"
1014+ echo " ========================================================================"
1015+ for repo in {{ WAMP_REPOS }}; do
1016+ # Convert repo name to package name (autobahn-python -> autobahn)
1017+ case " ${repo} " in
1018+ autobahn-python) PKG_PATTERN=" autobahn-" ;;
1019+ wamp-xbr) PKG_PATTERN=" xbr-" ;;
1020+ * ) PKG_PATTERN=" ${repo} -" ;;
1021+ esac
1022+
1023+ WHEEL_EXISTS=$( ls ./dist-universe/${PKG_PATTERN} * .whl 2> /dev/null | head -1)
1024+ SDIST_EXISTS=$( ls ./dist-universe/${PKG_PATTERN} * .tar.gz 2> /dev/null | head -1)
1025+
1026+ if [ -n " ${WHEEL_EXISTS} " ] && [ -n " ${SDIST_EXISTS} " ]; then
1027+ echo " ✓ ${repo} : wheel + sdist"
1028+ elif [ -n " ${WHEEL_EXISTS} " ]; then
1029+ echo " ⚠ ${repo} : wheel only (missing sdist)"
1030+ elif [ -n " ${SDIST_EXISTS} " ]; then
1031+ echo " ⚠ ${repo} : sdist only (missing wheel)"
1032+ else
1033+ echo " ❌ ${repo} : MISSING"
1034+ (( ++ FAILURES))
1035+ fi
1036+ done
1037+ echo " "
1038+
1039+ # Final summary
1040+ echo " ========================================================================"
1041+ echo " Verification Summary"
1042+ echo " ========================================================================"
1043+ echo " Wheels: ${WHEEL_COUNT} "
1044+ echo " Source dists: ${SDIST_COUNT} "
1045+ echo " Failures: ${FAILURES} "
1046+ echo " "
1047+
1048+ if [ ${FAILURES} -gt 0 ]; then
1049+ echo " ❌ VERIFICATION FAILED"
1050+ exit 1
1051+ else
1052+ echo " ✅ ALL DISTRIBUTIONS VERIFIED SUCCESSFULLY"
1053+ fi
1054+
8391055# Show dependency tree
8401056deps venv = " ": (install venv)
8411057 #!/usr/bin/env bash
0 commit comments