Scale typo gates with length and refuse destructive auto-runs
Similarity requirements now scale with word length (typo.floor_ok: single edit or ratio >= max(0.6, 1 - 3/max(len,3)), first char kept; zsh spdist / nushell did_you_mean derivation in the source). The fixed-cutoff gates are swapped: history_resolver._similar -> floor_ok with the divergence cap deleted (every diverged token is gated per-token, not counted), learned.guess_from_path and the help resolver candidate gates -> floor_ok, so _TOKEN_CUTOFF, _MAX_DIVERGED, GUESS_CUTOFF, _CUTOFF and their difflib plumbing are gone; unique-survivor, no-op and which/'/'/'.'/flag guards kept. New thefuck/danger.py is_dangerous(script) parses via bashlex directly and fail-safes to True when bashlex is unavailable or the script refuses to parse (the flat fallback is head-only); with a tree it matches rm/rmdir recursive flags, dd/mkfs*/shred/wipefs/ mkswap heads, git push --force/-f (not --force-with-lease), chmod/chown -R with a 777-style mode, kill -9, fork-bomb shapes, pipe-to-shell tails and file redirects outside /tmp and /dev/null. fix_command checks it before ANY auto-run, learned-db exact hits included: dangerous candidates fall through to rules+ask. Test-migration inventory (authorized semantic inversions): - tests/resolvers/test_history_resolver.py: declines-3-diverged -> corrects (cap deleted); 0.8-cutoff boundary arithmetic re-based to floor boundaries (len-3 0.6 / len-10 0.7 / len-30 0.9); _TOKEN_CUTOFF import removed with the constant; declines-just- below-cutoff re-based to the len-20 floor 0.85; added a 17-char below-floor decline. - tests/test_learned.py: returns-none-below-cutoff re-based to a same-first-char below-floor pair (0.6 < len-10 floor 0.7); added a ratio-0.7 acceptance pin; single-edit-under-cutoff renamed. - tests/resolvers/test_help_resolver.py: transposition comments re-based to the floor; added a below-floor subcommand decline. - tests/entrypoints/test_fix_command_learned.py: exact-learned-wins fixture's 'git push --force' correction (now correctly refused) replaced by benign scripts; mock_learned stubs danger benign for platform-neutral auto-apply tests; added TestDangerOverride (real module, all four sources: reaches select_command, nothing auto-runs).
This commit is contained in:
@@ -96,21 +96,31 @@ def test_returns_correction_when_subcommand_misspelled(
|
||||
|
||||
|
||||
def test_corrects_transposed_subcommand(fake_bin, argv_log, enable_cache):
|
||||
# bulid -> build scores 2 * 4 / 10 = 0.8, right at the cutoff,
|
||||
# and is also a single transposition (li <-> il).
|
||||
# bulid -> build is a single adjacent transposition (li <-> il),
|
||||
# so the length-scaled floor admits it on the single-edit path.
|
||||
fake_bin('fake')
|
||||
assert get_help_correction('fake bulid .') == 'fake build .'
|
||||
assert typo.single_edit('bulid', 'build')
|
||||
|
||||
|
||||
def test_corrects_transposition_under_cutoff(
|
||||
def test_corrects_transposition_via_single_edit(
|
||||
fake_bin, argv_log, enable_cache):
|
||||
# psuh -> push scores 2 * 3 / 8 = 0.75, under the cutoff, so only
|
||||
# the first-char-equal single-edit match fixes it.
|
||||
# psuh -> push scores 2 * 3 / 8 = 0.75, so only the single-edit
|
||||
# path of the floor admits it.
|
||||
fake_bin('fake', commands=('push', 'build', 'clean'))
|
||||
assert get_help_correction('fake psuh x') == 'fake push x'
|
||||
|
||||
|
||||
def test_declines_subcommand_below_scaled_floor(
|
||||
fake_bin, argv_log, enable_cache):
|
||||
# 10-char subcommand vs the listed 'burnno1234' scores
|
||||
# 2 * 6 / 20 = 0.6, under the len-10 floor 0.7, and is not a
|
||||
# single edit; no listed subcommand is close enough.
|
||||
fake_bin('fake', commands=('burnno1234', 'build', 'clean'))
|
||||
assert get_help_correction('fake burnnoabcd') is None
|
||||
assert _spawned(argv_log) == ['--help']
|
||||
|
||||
|
||||
def test_respawns_when_binary_mtime_changes(
|
||||
fake_bin, argv_log, enable_cache):
|
||||
path = fake_bin('fake')
|
||||
|
||||
Reference in New Issue
Block a user