Source code for fastrag.ingestion.filters.url
"""``URLFilter``: filters sources or documents by URI regex patterns."""
from __future__ import annotations
import re
from collections.abc import Sequence
from fastrag.ingestion.filters.base import Filter
from fastrag.ingestion.models import Source
from fastrag.models import Document
[docs]
class URLFilter(Filter[Source | Document]):
"""Filters sources or documents by URI regex patterns."""
def __init__(
self,
include_patterns: Sequence[str] | None = None,
exclude_patterns: Sequence[str] | None = None,
) -> None:
"""Initialize URLFilter.
Args:
include_patterns: Regex patterns an ID must match.
exclude_patterns: Regex patterns an ID must not match.
"""
self._include_patterns = tuple(include_patterns) if include_patterns else ()
self._exclude_patterns = tuple(exclude_patterns) if exclude_patterns else ()
@property
def header_safe(self) -> bool:
"""This predicate uses identity/metadata only."""
return True
[docs]
def matches(self, item: Source | Document) -> bool:
"""Return True when ``item``'s URI passes the filter.
Reads ``Source.uri`` directly, and a ``Document``'s
``metadata["source_uri"]``, falling back to ``source_id`` when absent.
"""
uri = (
item.uri
if isinstance(item, Source)
else item.metadata.get("source_uri", item.source_id)
)
if self._exclude_patterns and any(
re.search(pattern, uri) for pattern in self._exclude_patterns
):
return False
if self._include_patterns:
return any(re.search(pattern, uri) for pattern in self._include_patterns)
return True