Metadata-Version: 2.4
Name: abstract_search
Version: 0.0.0.1
Summary: Standalone string search across files and directories with allow/exclude filtering; stdlib-only core that reads code, text, pdf, office, and archive-based formats.
Author-email: putkoff <partners@abstractendeavors.com>
License: MIT
Project-URL: Homepage, https://github.com/AbstractEndeavors/abstract_search
Keywords: search,grep,files,filters,text-extraction,dependency-free
Classifier: Development Status :: 4 - Beta
Classifier: Intended Audience :: Developers
Classifier: License :: OSI Approved :: MIT License
Classifier: Programming Language :: Python :: 3
Classifier: Operating System :: OS Independent
Classifier: Topic :: Software Development :: Libraries
Requires-Python: >=3.8
Description-Content-Type: text/markdown
Provides-Extra: pdf
Requires-Dist: pdfplumber; extra == "pdf"
Provides-Extra: ocr
Requires-Dist: pytesseract; extra == "ocr"
Requires-Dist: pdf2image; extra == "ocr"
Provides-Extra: xls
Requires-Dist: xlrd; extra == "xls"
Provides-Extra: xlsb
Requires-Dist: pyxlsb; extra == "xlsb"
Provides-Extra: dbf
Requires-Dist: dbfread; extra == "dbf"
Provides-Extra: parquet
Requires-Dist: pyarrow; extra == "parquet"
Provides-Extra: all
Requires-Dist: pdfplumber; extra == "all"
Requires-Dist: pytesseract; extra == "all"
Requires-Dist: pdf2image; extra == "all"
Requires-Dist: xlrd; extra == "all"
Requires-Dist: pyxlsb; extra == "all"
Requires-Dist: dbfread; extra == "all"
Requires-Dist: pyarrow; extra == "all"

# abstract_search

Standalone string search across files and directories with allow/exclude
filtering. Stdlib-only at import time — pdf, office, and spreadsheet readers
load lazily and are optional extras.

```python
from abstract_search import findContent

# search every readable file under a directory
hits = findContent("/path/to/project", strings=["needle"], get_lines=True)

# narrow by extension, merge extra excludes with the defaults
hits = findContent("/path/to/project", strings=["needle"],
                   allowed_exts="py", exclude_dirs="tests", add=True)

# exact multi-line match locations
locs = findContent("/path/to/project", strings=["def main(", "return"],
                   structured=True)
```

Filter semantics: passing a filter kwarg **replaces** its default set;
`add=True` **merges** with the defaults instead. Defaults skip
`node_modules`, `__pycache__`, backups, media/binary extensions, and
`__init__*` files (see `constants.py`).

```python
from abstract_search import make_allowed_predicate, filter_allowed_items, search_files

allowed = make_allowed_predicate(exclude_exts=".log", add=True)
kept = filter_allowed_items(paths, allowed_exts=[".py", ".md"])
hits = search_files("needle", "/path/to/project")   # line-level SearchHit records
```

Optional readers: `pip install abstract_search[pdf]` (pdfplumber),
`[ocr]`, `[xls]`, `[xlsb]`, `[dbf]`, `[parquet]`, or `[all]`.
