Files @ 46ac91e86e90
Branch filter:

Location: NPO-Accounting/conservancy_beancount/conservancy_beancount/filters.py

Brett Smith
test_rtutil: Simplify setup.
"""filters.py - Common filters for postings"""
# Copyright © 2020  Brett Smith
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU Affero General Public License for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with this program.  If not, see <https://www.gnu.org/licenses/>.

import re

from . import data
from . import rtutil

from typing import (
    Iterable,
    Pattern,
    Union,
)
from .beancount_types import (
    MetaKey,
    MetaValue,
)

Postings = Iterable[data.Posting]
Regexp = Union[str, Pattern]

def filter_meta_equal(postings: Postings, key: MetaKey, value: MetaValue) -> Postings:
    for post in postings:
        try:
            if post.meta[key] == value:
                yield post
        except KeyError:
            pass

def filter_meta_match(postings: Postings, key: MetaKey, regexp: Regexp) -> Postings:
    for post in postings:
        try:
            if re.search(regexp, post.meta[key]):
                yield post
        except (KeyError, TypeError):
            pass

def filter_for_rt_id(postings: Postings, ticket_id: Union[int, str]) -> Postings:
    """Filter postings with a primary RT ticket

    This functions yields postings where the *first* rt-id matches the given
    ticket number.
    """
    regexp = rtutil.RT.metadata_regexp(ticket_id, first_link_only=True)
    return filter_meta_match(postings, 'rt-id', regexp)