11.PHONY : help
2- .PHONY : test test-parallel test-serial test-benchmark test-watch test-coverage test-profile warm-fastembed-cache
2+ .PHONY : test test-parallel test-serial test-benchmark test-watch test-coverage test-profile record-cassettes rewrite-cassettes replay-cassettes snapshot-cassettes check-record-test-env warm-fastembed-cache
33.PHONY : docs-fern docs-fern-strict docs-fern-live docs-fern-preview-watch docs-fern-generate-sdk docs-fern-fix-empty-links docs-check-redirects docs-fern-publish-staging docs-fern-publish-public
44.PHONY : pre-commit
55
@@ -13,6 +13,11 @@ WORKERS ?= auto
1313DIST ?= worksteal
1414
1515PYTEST ?= poetry run pytest
16+ RECORDED_TESTS ?= tests/recorded
17+ RECORDED_RECORD_MODE ?= once
18+ RECORDED_SNAPSHOT_MODE ?= create
19+ RECORDED_REQUIRED_KEYS ?= OPENAI_API_KEY NVIDIA_API_KEY
20+ RECORDED_REPLAY_ENV ?= env -u HTTP_PROXY -u HTTPS_PROXY -u ALL_PROXY -u http_proxy -u https_proxy -u all_proxy
1621# These targets assume a Unix-like shell for env -u; use bash, Git Bash, or WSL on Windows.
1722UNIT_TEST_ENV ?= env -u OPENAI_API_KEY -u NVIDIA_API_KEY \
1823 -u LIVE_TEST -u LIVE_TEST_MODE -u TEST_LIVE_MODE
@@ -43,6 +48,33 @@ test-coverage:
4348test-profile :
4449 $(PYTEST ) -vv --profile-svg $(ARGS ) $(TEST )
4550
51+ record-cassettes : check-record-test-env
52+ $(PYTEST ) $(RECORDED_TESTS ) --record-mode=$(RECORDED_RECORD_MODE ) -m " not fake_cassette"
53+ $(RECORDED_REPLAY_ENV ) $(PYTEST ) $(RECORDED_TESTS ) --block-network --inline-snapshot=$(RECORDED_SNAPSHOT_MODE )
54+ $(RECORDED_REPLAY_ENV ) $(PYTEST ) $(RECORDED_TESTS ) --block-network
55+
56+ rewrite-cassettes :
57+ $(MAKE ) record-cassettes RECORDED_RECORD_MODE=rewrite RECORDED_SNAPSHOT_MODE=fix
58+
59+ replay-cassettes :
60+ $(RECORDED_REPLAY_ENV ) $(PYTEST ) $(RECORDED_TESTS ) --block-network
61+
62+ snapshot-cassettes :
63+ $(RECORDED_REPLAY_ENV ) $(PYTEST ) $(RECORDED_TESTS ) --block-network --inline-snapshot=fix
64+
65+ check-record-test-env :
66+ @missing=" " ; \
67+ for key in $( RECORDED_REQUIRED_KEYS) ; do \
68+ if [ -z " $$ (printenv " $$ key" )" ]; then \
69+ missing=" $$ missing $$ key" ; \
70+ fi ; \
71+ done ; \
72+ if [ -n " $$ missing" ]; then \
73+ printf ' %s\n' " Missing required env var(s):$$ missing" \
74+ " Set them before make record-cassettes, or override RECORDED_REQUIRED_KEYS for a focused refresh." ; \
75+ exit 2; \
76+ fi
77+
4678warm-fastembed-cache :
4779 $(FASTEMBED_ENV ) poetry run python -c ' from fastembed import TextEmbedding; model = TextEmbedding("$(FASTEMBED_MODEL)"); next(model.embed(["warmup"]))'
4880
@@ -86,6 +118,10 @@ help:
86118 ' make test-benchmark [ARGS="-q"]' \
87119 ' make test-parallel [TEST=path] [WORKERS=auto] [ARGS="-q --tb=short"]' \
88120 ' make test-watch [TEST=path]' \
121+ ' make record-cassettes [RECORDED_TESTS=tests/recorded] [RECORDED_RECORD_MODE=once] [RECORDED_SNAPSHOT_MODE=create] [RECORDED_REQUIRED_KEYS="OPENAI_API_KEY NVIDIA_API_KEY"]' \
122+ ' make rewrite-cassettes [RECORDED_TESTS=tests/recorded] [RECORDED_REQUIRED_KEYS="OPENAI_API_KEY NVIDIA_API_KEY"]' \
123+ ' make replay-cassettes [RECORDED_TESTS=tests/recorded]' \
124+ ' make snapshot-cassettes [RECORDED_TESTS=tests/recorded]' \
89125 ' ' \
90126 ' Tests:' \
91127 ' test Run pytest.ini testpaths with pytest-xdist' \
@@ -95,6 +131,10 @@ help:
95131 ' test-watch Run pytest in watch mode' \
96132 ' test-coverage Run pytest with coverage' \
97133 ' test-profile Run pytest with profiling' \
134+ ' record-cassettes Record missing or selected cassettes, fill snapshots, and verify replay' \
135+ ' rewrite-cassettes Rewrite selected cassettes, fill snapshots, and verify replay' \
136+ ' replay-cassettes Verify selected cassettes offline without recording' \
137+ ' snapshot-cassettes Update inline snapshots from existing cassettes offline' \
98138 ' warm-fastembed-cache Prime the repo-local FastEmbed cache' \
99139 ' ' \
100140 ' Docs:' \
0 commit comments