def issues(
        self,
        use_pager: bool = None,
        *,
        codes: Optional[Union[int, List[int]]] = None,
        callables: Optional[Union[str, List[str]]] = None,
        filenames: Optional[Union[str, List[str]]] = None,
    ):
        """Lists issues for the selected run.

        Parameters (all optional):
            use_pager: bool                use a unix style pager for output
            codes: int or list[int]        issue codes to filter on
            callables: str or list[str]    callables to filter on (supports wildcards)
            filenames: str or list[str]    filenames to filter on (supports wildcards)

        String filters support LIKE wildcards (%, _) from SQL:
            % matches anything (like .* in regex)
            _ matches 1 character (like . in regex)

        For example:
            callables=[
                "%occurs.anywhere%",
                "%at.end",
                "at.start%",
                "etc.",
            ])
        """
        pager = self._resolve_pager(use_pager)

        with self.db.make_session() as session:
            query = (
                session.query(
                    IssueInstance.id,
                    FilenameText.contents.label("filename"),
                    IssueInstance.location,
                    Issue.code,
                    CallableText.contents.label("callable"),
                    MessageText.contents.label("message"),
                )
                .filter(IssueInstance.run_id == self.current_run_id)
                .join(FilenameText, FilenameText.id == IssueInstance.filename_id)
                .join(CallableText, CallableText.id == IssueInstance.callable_id)
            )

            if codes is not None:
                query = self._add_list_or_int_filter_to_query(
                    codes, query, Issue.code, "codes"
                )

            if callables is not None:
                query = self._add_list_or_string_filter_to_query(
                    callables, query, CallableText.contents, "callables"
                )

            if filenames is not None:
                query = self._add_list_or_string_filter_to_query(
                    filenames, query, FilenameText.contents, "filenames"
                )

            issues = query.join(Issue, IssueInstance.issue_id == Issue.id).join(
                MessageText, MessageText.id == IssueInstance.message_id
            )

            sources_list = [
                self._get_leaves_issue_instance(
                    session, int(issue.id), SharedTextKind.SOURCE
                )
                for issue in issues
            ]
            sinks_list = [
                self._get_leaves_issue_instance(
                    session, int(issue.id), SharedTextKind.SINK
                )
                for issue in issues
            ]

            issue_strings = [
                self._create_issue_output_string(issue, sources, sinks)
                for issue, sources, sinks in zip(issues, sources_list, sinks_list)
            ]
        issue_output = f"\n{'-' * 80}\n".join(issue_strings)
        pager(issue_output)
        print(f"Found {len(issue_strings)} issues with run_id {self.current_run_id}.")
def issues ( self , use_pager : bool = None , * , codes : Optional [ Union [ int , List [ int ] ] ] = None , callables : Optional [ Union [ str , List [ str ] ] ] = None , filenames : Optional [ Union [ str , List [ str ] ] ] = None , ) : pager = self . _resolve_pager ( use_pager ) with self . db . make_session ( ) as session : query = ( session . query ( IssueInstance . id , FilenameText . contents . label ( "filename" ) , IssueInstance . location , Issue . code , CallableText . contents . label ( "callable" ) , MessageText . contents . label ( "message" ) , ) . filter ( IssueInstance . run_id == self . current_run_id ) . join ( FilenameText , FilenameText . id == IssueInstance . filename_id ) . join ( CallableText , CallableText . id == IssueInstance . callable_id ) ) if codes is not None : query = self . _add_list_or_int_filter_to_query ( codes , query , Issue . code , "codes" ) if callables is not None : query = self . _add_list_or_string_filter_to_query ( callables , query , CallableText . contents , "callables" ) if filenames is not None : query = self . _add_list_or_string_filter_to_query ( filenames , query , FilenameText . contents , "filenames" ) issues = query . join ( Issue , IssueInstance . issue_id == Issue . id ) . join ( MessageText , MessageText . id == IssueInstance . message_id ) sources_list = [ self . _get_leaves_issue_instance ( session , int ( issue . id ) , SharedTextKind . SOURCE ) for issue in issues ] sinks_list = [ self . _get_leaves_issue_instance ( session , int ( issue . id ) , SharedTextKind . SINK ) for issue in issues ] issue_strings = [ self . _create_issue_output_string ( issue , sources , sinks ) for issue , sources , sinks in zip ( issues , sources_list , sinks_list ) ] issue_output = f"\n{'-' * 80}\n" . join ( issue_strings ) pager ( issue_output ) print ( f"Found {len(issue_strings)} issues with run_id {self.current_run_id}." )
Lists issues for the selected run.

        Parameters (all optional):
            use_pager: bool                use a unix style pager for output
            codes: int or list[int]        issue codes to filter on
            callables: str or list[str]    callables to filter on (supports wildcards)
            filenames: str or list[str]    filenames to filter on (supports wildcards)

        String filters support LIKE wildcards (%, _) from SQL:
            % matches anything (like .* in regex)
            _ matches 1 character (like . in regex)

        For example:
            callables=[
                "%occurs.anywhere%",
                "%at.end",
                "at.start%",
                "etc.",
            ])