发布

  • feat(python): add PyO3-based Python bindings (#600)

    frostbyte_neo 发布于 2026-06-17 01:06:42 +00:00

    • feat(python): migrate Python bindings from ctypes to PyO3
    • Add native PyO3 extension in crates/fff-python
    • Replace ctypes wrapper with maturin-built package in packages/fff-python
    • Expose FileFinder, search/glob/directory/mixed/grep APIs and result types
    • Use PyPI package name fff-python (import name remains fff)
    • Update workspace Cargo.toml/Cargo.lock and .gitignore for Python artifacts
    • ci: add Python CI workflow and release wheel builds
    • Add .github/workflows/python.yml to test bindings on Ubuntu/macOS/Windows
    • Extend release.yaml with Python wheel builds (x86_64/aarch64) and sdist
    • Add optional PyPI publish job using trusted publishing
    • fix(python): address review feedback and release CI

    Rust bindings:

    • Release GIL during heavy search/grep operations via py.allow_threads

    • Add MixedFileItem/MixedDirItem::from_core to avoid double-cloning

    • Return PyDict directly from health_check and drop serde_json dependency

    • Call destroy() in exit so the context manager releases resources

    • Add mode parameter to multi_grep for parity with grep

    • Preserve cache budget overrides across reindex()

    • Rename combo_boost param to match FuzzySearchOptions field

    Docs/tests:

    • Update Python test for dict-returning health_check

    • Add Python bindings section to main README

    CI:

    • Fix pypi-publish job to depend on build-python/build-python-sdist

      instead of release, making the workflow_dispatch checkbox functional

    • fix(python): sync release versions and expand tests

    • refactor(python): split lib.rs and improve Pythonic API

    • Split crates/fff-python/src/lib.rs into modules:

      • types.rs: all pyclass result types
      • finder.rs: FileFinder implementation
      • conversions.rs: From/core conversions
    • Make API more Pythonic:

      • FileFinder now accepts pathlib.Path / os.PathLike for base_path and reindex
      • Add close() alias for destroy()
      • grep/multi_grep now raise FFFException for invalid modes
      • GrepResult gains has_more property and next_cursor() method
    • Add type stubs:

      • packages/fff-python/src/fff/__init__.pyi
      • packages/fff-python/src/fff/py.typed
    • Add repr implementations for all exposed pyclasses

    • Expand Python tests for pathlib, close(), reprs, invalid mode, and cursor pagination

    • fix(python): align type stubs and runtime API

    • refactor(python): polish binding API and GIL handling

    Make the Python binding API more idiomatic before merge: replace getter-style methods with properties, keep close() as the single explicit shutdown API, add container semantics for result objects, and tighten type stubs with Literal/Sequence/PathLike support.

    Also reduce Rust binding duplication with shared option/result helpers and release the Python GIL around blocking filesystem, git, and query-history operations.

    • feat(python): async wait_for_scan with blocking variant

    • fix(python): consistent frecency type and combo defaults matching node

    • fix(python): health_check defaults to indexed path and reports cwd errors; expand readme

    • chore(python): rename pypi distribution to fff-search

    • chore(python): align version to 0.9.4 for unified release

    • chore(release): bump python version with sed instead of inline python

    • refactor(python): use From trait for core type conversions

    • chore: do not run full prebuild of python wheels on PR


    Co-authored-by: Dmitriy Kovalenko dmtr.kovalenko@outlook.com

    下载附件