Skip to content

Commit 6e20332

Browse files
committed
Add 'expect' parameter to check-compressors and check-serializers recipes
- Both recipes now accept optional 'expect' parameter with comma-separated list - Validates actual available items match expected list exactly - Shows clear error message with missing/extra items on mismatch - Exits with error code 1 if validation fails Usage examples: just check-compressors "" "permessage-deflate, permessage-bzip2, permessage-brotli" just check-serializers "" "json, msgpack, cbor, ubjson, flatbuffers" Error output example: Expected: cbor json msgpack Actual: cbor flatbuffers json msgpack ubjson Missing: Extra: flatbuffers ubjson Enables strict CI/CD validation of batteries-included features (#1760)
1 parent c6c3354 commit 6e20332

1 file changed

Lines changed: 88 additions & 12 deletions

File tree

justfile

Lines changed: 88 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -674,8 +674,8 @@ check-coverage venv="" use_nvx="": (install-tools venv) (install venv)
674674

675675
echo "--> Coverage report generated in docs/_build/html/coverage${NVX_SUFFIX}/index.html"
676676

677-
# Verify all WebSocket compression methods are available (usage: `just check-compressors cpy314`)
678-
check-compressors venv="": (install venv)
677+
# Verify all WebSocket compression methods are available (usage: `just check-compressors cpy314 "permessage-deflate, permessage-brotli"`)
678+
check-compressors venv="" expect="": (install venv)
679679
#!/usr/bin/env bash
680680
set -e
681681
VENV_NAME="{{ venv }}"
@@ -685,15 +685,19 @@ check-compressors venv="": (install venv)
685685
echo "==> Defaulting to venv: '${VENV_NAME}'"
686686
fi
687687
VENV_PATH="{{ VENV_DIR }}/${VENV_NAME}"
688+
EXPECT_LIST="{{ expect }}"
688689

689690
echo "==> Checking WebSocket compression methods in ${VENV_NAME}..."
690691
TMP_SCRIPT="/tmp/check_compressors_$$.py"
691692
{
693+
echo "import sys"
692694
echo "from autobahn.websocket.compress import PERMESSAGE_COMPRESSION_EXTENSION"
693695
echo ""
696+
echo "available = sorted(PERMESSAGE_COMPRESSION_EXTENSION.keys())"
697+
echo ""
694698
echo "print('Available WebSocket Compression Methods:')"
695699
echo "print('=' * 70)"
696-
echo "for ext_name in sorted(PERMESSAGE_COMPRESSION_EXTENSION.keys()):"
700+
echo "for ext_name in available:"
697701
echo " ext_classes = PERMESSAGE_COMPRESSION_EXTENSION[ext_name]"
698702
echo " pmce_class = ext_classes.get('PMCE')"
699703
echo " if pmce_class:"
@@ -702,14 +706,48 @@ check-compressors venv="": (install venv)
702706
echo " else:"
703707
echo " print(f' {ext_name:25s} -> (no PMCE class found)')"
704708
echo "print('=' * 70)"
705-
echo "print(f'Total: {len(PERMESSAGE_COMPRESSION_EXTENSION)} compression methods available')"
709+
echo "print(f'Total: {len(available)} compression methods available')"
710+
echo ""
711+
echo "# Output list for bash validation"
712+
echo "print('ACTUAL_LIST:' + ','.join(available))"
706713
} > "${TMP_SCRIPT}"
707-
"${VENV_PATH}/bin/python" "${TMP_SCRIPT}"
714+
OUTPUT=$("${VENV_PATH}/bin/python" "${TMP_SCRIPT}")
708715
rm "${TMP_SCRIPT}"
709-
echo "✅ Compression methods check completed"
716+
echo "${OUTPUT}" | grep -v "^ACTUAL_LIST:"
717+
718+
if [ -n "${EXPECT_LIST}" ]; then
719+
echo ""
720+
echo "==> Validating against expected list..."
721+
ACTUAL=$(echo "${OUTPUT}" | grep "^ACTUAL_LIST:" | cut -d: -f2)
722+
723+
# Convert comma-separated strings to sorted arrays
724+
IFS=',' read -ra EXPECTED_ARRAY <<< "${EXPECT_LIST}"
725+
IFS=',' read -ra ACTUAL_ARRAY <<< "${ACTUAL}"
726+
727+
# Trim whitespace and sort
728+
EXPECTED_SORTED=($(for item in "${EXPECTED_ARRAY[@]}"; do echo "${item}" | xargs; done | sort))
729+
ACTUAL_SORTED=($(for item in "${ACTUAL_ARRAY[@]}"; do echo "${item}" | xargs; done | sort))
730+
731+
# Compare arrays
732+
if [ "${EXPECTED_SORTED[*]}" != "${ACTUAL_SORTED[*]}" ]; then
733+
echo "❌ ERROR: Compression methods mismatch!"
734+
echo ""
735+
echo "Expected: ${EXPECTED_SORTED[*]}"
736+
echo "Actual: ${ACTUAL_SORTED[*]}"
737+
echo ""
738+
# Show differences
739+
echo "Missing: $(comm -23 <(printf '%s\n' "${EXPECTED_SORTED[@]}") <(printf '%s\n' "${ACTUAL_SORTED[@]}") | tr '\n' ' ')"
740+
echo "Extra: $(comm -13 <(printf '%s\n' "${EXPECTED_SORTED[@]}") <(printf '%s\n' "${ACTUAL_SORTED[@]}") | tr '\n' ' ')"
741+
exit 1
742+
else
743+
echo "✅ Compression methods match expected list"
744+
fi
745+
else
746+
echo "✅ Compression methods check completed"
747+
fi
710748

711-
# Verify all WAMP serializers are available (usage: `just check-serializers cpy314`)
712-
check-serializers venv="": (install venv)
749+
# Verify all WAMP serializers are available (usage: `just check-serializers cpy314 "json, msgpack, cbor, ubjson, flatbuffers"`)
750+
check-serializers venv="" expect="": (install venv)
713751
#!/usr/bin/env bash
714752
set -e
715753
VENV_NAME="{{ venv }}"
@@ -719,24 +757,62 @@ check-serializers venv="": (install venv)
719757
echo "==> Defaulting to venv: '${VENV_NAME}'"
720758
fi
721759
VENV_PATH="{{ VENV_DIR }}/${VENV_NAME}"
760+
EXPECT_LIST="{{ expect }}"
722761

723762
echo "==> Checking WAMP serializers in ${VENV_NAME}..."
724763
TMP_SCRIPT="/tmp/check_serializers_$$.py"
725764
{
765+
echo "import sys"
726766
echo "from autobahn.wamp.serializer import SERID_TO_OBJSER"
727767
echo ""
768+
echo "available = sorted(SERID_TO_OBJSER.keys())"
769+
echo ""
728770
echo "print('Available WAMP Serializers:')"
729771
echo "print('=' * 70)"
730-
echo "for ser_name in sorted(SERID_TO_OBJSER.keys()):"
772+
echo "for ser_name in available:"
731773
echo " ser_class = SERID_TO_OBJSER[ser_name]"
732774
echo " class_ref = f\"{ser_class.__module__}.{ser_class.__name__}\""
733775
echo " print(f' {ser_name:25s} -> {class_ref}')"
734776
echo "print('=' * 70)"
735-
echo "print(f'Total: {len(SERID_TO_OBJSER)} serializers available')"
777+
echo "print(f'Total: {len(available)} serializers available')"
778+
echo ""
779+
echo "# Output list for bash validation"
780+
echo "print('ACTUAL_LIST:' + ','.join(available))"
736781
} > "${TMP_SCRIPT}"
737-
"${VENV_PATH}/bin/python" "${TMP_SCRIPT}"
782+
OUTPUT=$("${VENV_PATH}/bin/python" "${TMP_SCRIPT}")
738783
rm "${TMP_SCRIPT}"
739-
echo "✅ Serializers check completed"
784+
echo "${OUTPUT}" | grep -v "^ACTUAL_LIST:"
785+
786+
if [ -n "${EXPECT_LIST}" ]; then
787+
echo ""
788+
echo "==> Validating against expected list..."
789+
ACTUAL=$(echo "${OUTPUT}" | grep "^ACTUAL_LIST:" | cut -d: -f2)
790+
791+
# Convert comma-separated strings to sorted arrays
792+
IFS=',' read -ra EXPECTED_ARRAY <<< "${EXPECT_LIST}"
793+
IFS=',' read -ra ACTUAL_ARRAY <<< "${ACTUAL}"
794+
795+
# Trim whitespace and sort
796+
EXPECTED_SORTED=($(for item in "${EXPECTED_ARRAY[@]}"; do echo "${item}" | xargs; done | sort))
797+
ACTUAL_SORTED=($(for item in "${ACTUAL_ARRAY[@]}"; do echo "${item}" | xargs; done | sort))
798+
799+
# Compare arrays
800+
if [ "${EXPECTED_SORTED[*]}" != "${ACTUAL_SORTED[*]}" ]; then
801+
echo "❌ ERROR: WAMP serializers mismatch!"
802+
echo ""
803+
echo "Expected: ${EXPECTED_SORTED[*]}"
804+
echo "Actual: ${ACTUAL_SORTED[*]}"
805+
echo ""
806+
# Show differences
807+
echo "Missing: $(comm -23 <(printf '%s\n' "${EXPECTED_SORTED[@]}") <(printf '%s\n' "${ACTUAL_SORTED[@]}") | tr '\n' ' ')"
808+
echo "Extra: $(comm -13 <(printf '%s\n' "${EXPECTED_SORTED[@]}") <(printf '%s\n' "${ACTUAL_SORTED[@]}") | tr '\n' ' ')"
809+
exit 1
810+
else
811+
echo "✅ WAMP serializers match expected list"
812+
fi
813+
else
814+
echo "✅ Serializers check completed"
815+
fi
740816

741817
# Run all checks in single environment (usage: `just check cpy314`)
742818
check venv="": (check-compressors venv) (check-serializers venv) (check-format venv) (check-typing venv) (check-coverage-combined venv)

0 commit comments

Comments
 (0)