o
    ë6Wj\<  ã                   @   s^   d dl mZ d dlZd dlZd dlZddlmZmZmZm	Z	m
Z
 ddlmZ G dd„ dƒZdS )é    )ÚcontextmanagerNé   )ÚParserElementÚParseExceptionÚKeywordÚ__diag__Ú
__compat__)Úcore_builtin_exprsc                   @   sž   e Zd ZdZG dd„ dƒZG dd„ dejƒZe						dd	dd
œde	de
je de
je dede	de
je	 de
je	 de
je	ef dede	fdd„ƒZdS )Úpyparsing_testzB
    namespace class for classes useful in writing unit tests
    c                   @   s@   e Zd ZdZdd„ Zdd„ Zdd„ Zdd	„ Zd
d„ Zdd„ Z	dS )z&pyparsing_test.reset_pyparsing_contexta?  
        Context manager to be used when writing unit tests that modify pyparsing config values:
        - packrat parsing
        - bounded recursion parsing
        - default whitespace characters
        - default keyword characters
        - literal string auto-conversion class
        - ``__diag__`` settings

        Example:

        .. testcode::

            ppt = pyparsing.pyparsing_test

            class MyTestClass(ppt.TestParseResultsAsserts):
                def test_literal(self):
                    with ppt.reset_pyparsing_context():
                        # test that literals used to construct
                        # a grammar are automatically suppressed
                        ParserElement.inline_literals_using(Suppress)

                        term = Word(alphas) | Word(nums)
                        group = Group('(' + term[...] + ')')

                        # assert that the '()' characters
                        # are not included in the parsed tokens
                        self.assertParseAndCheckList(
                            group,
                            "(abc 123 def)",
                            ['abc', '123', 'def']
                        )

                    # after exiting context manager, literals
                    # are converted to Literal expressions again
        c                 C   s
   i | _ d S ©N)Ú_save_context©Úself© r   ú`/home/esfera/Documents/content_generation/venv/lib/python3.10/site-packages/pyparsing/testing.pyÚ__init__>   s   
z/pyparsing_test.reset_pyparsing_context.__init__c                 C   sž   t j| jd< tj| jd< t j| jd< t j| jd< t j| jd< t jr)t jj	| jd< nd | jd< t j
| jd< t j| jd< d	d
„ tjD ƒ| jd< dtji| jd< | S )NÚdefault_whitespaceÚdefault_keyword_charsÚliteral_string_classÚverbose_stacktraceÚpackrat_enabledÚpackrat_cache_sizeÚpackrat_parseÚrecursion_enabledc                 S   s   i | ]}|t t|ƒ“qS r   )Úgetattrr   )Ú.0Únamer   r   r   Ú
<dictcomp>W   s    ÿz?pyparsing_test.reset_pyparsing_context.save.<locals>.<dictcomp>r   Úcollect_all_And_tokensr   )r   ÚDEFAULT_WHITE_CHARSr   r   ÚDEFAULT_KEYWORD_CHARSÚ_literalStringClassr   Ú_packratEnabledÚpackrat_cacheÚsizeÚ_parseÚ_left_recursion_enabledr   Ú
_all_namesr   r   r   r   r   r   ÚsaveA   s&   ÿ
ÿ
ÿÿ
ÿz+pyparsing_test.reset_pyparsing_context.savec                 C   sÒ   t j| jd krt  | jd ¡ | jd t _| jd t_t  | jd ¡ | jd  ¡ D ]\}}|r4t	j
nt	j|ƒ q+dt _| jd rKt  | jd ¡ n| jd	 t _| jd
 t _tD ]}| d¡ qY| jd t_| S )Nr   r   r   r   r   Fr   r   r   r   r   )r   r   r   Úset_default_whitespace_charsr   r   r    Úinline_literals_usingÚitemsr   ÚenableÚdisabler"   Úenable_packratr%   r&   r	   Ú	set_debugr   r   )r   r   ÚvalueÚexprr   r   r   Úrestorea   s0   ÿÿÿ
ÿz.pyparsing_test.reset_pyparsing_context.restorec                 C   s   t | ƒƒ }|j | j¡ |S r   )Útyper   Úupdate)r   Úretr   r   r   Úcopy†   s   
z+pyparsing_test.reset_pyparsing_context.copyc                 C   s   |   ¡ S r   )r(   r   r   r   r   Ú	__enter__‹   s   z0pyparsing_test.reset_pyparsing_context.__enter__c                 G   s   |   ¡  d S r   )r2   )r   Úargsr   r   r   Ú__exit__Ž   s   z/pyparsing_test.reset_pyparsing_context.__exit__N)
Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r(   r2   r6   r7   r9   r   r   r   r   Úreset_pyparsing_context   s    % %r>   c                   @   sT   e Zd ZdZ	ddd„Z	ddd„Z	ddd	„Z	dd
d„Zee	ddfdd„ƒZ
dS )z&pyparsing_test.TestParseResultsAssertszk
        A mixin class to add parse results assertion methods to normal unittest.TestCase classes.
        Nc                 C   s@   |dur| j || ¡ |d� |dur| j || ¡ |d� dS dS )zÑ
            Unit test assertion to compare a :class:`ParseResults` object with an optional ``expected_list``,
            and compare any defined results names with an optional ``expected_dict``.
            N©Úmsg)ÚassertEqualÚas_listÚas_dict)r   ÚresultÚexpected_listÚexpected_dictr@   r   r   r   ÚassertParseResultsEquals–   s
   ÿz?pyparsing_test.TestParseResultsAsserts.assertParseResultsEqualsTc                 C   ó@   |j |dd�}|rt| ¡ ƒ nt| ¡ ƒ | j|||d� dS )zÉ
            Convenience wrapper assert to test a parser element and input string, and assert that
            the resulting :meth:`ParseResults.as_list` is equal to the ``expected_list``.
            T©Ú	parse_all)rE   r@   N©Úparse_stringÚprintÚdumprB   rG   )r   r1   Útest_stringrE   r@   ÚverboserD   r   r   r   ÚassertParseAndCheckList¢   ó
   z>pyparsing_test.TestParseResultsAsserts.assertParseAndCheckListc                 C   rH   )zÉ
            Convenience wrapper assert to test a parser element and input string, and assert that
            the resulting :meth:`ParseResults.as_dict` is equal to the ``expected_dict``.
            TrI   )rF   r@   NrK   )r   r1   rO   rF   r@   rP   rD   r   r   r   ÚassertParseAndCheckDict°   rR   z>pyparsing_test.TestParseResultsAsserts.assertParseAndCheckDictc              	   C   s<  |\}}|du r| j ||dur|ndd� dS dd„ t||ƒD ƒ}|D ]k\}}}	tdd„ |	D ƒdƒ}
tdd„ |	D ƒdƒ}|dura| j||
pF|d	�� t|tƒrQ|‚W d  ƒ n1 s[w   Y  q#td
d„ |	D ƒdƒ}tdd„ |	D ƒdƒ}||fdkr‡| j||||
pƒ|d� q#td|›�ƒ q#| j ||dur˜|ndd� dS )a2  
            Unit test assertion to evaluate output of
            :meth:`~ParserElement.run_tests`.

            If a list of list-dict tuples is given as the
            ``expected_parse_results`` argument, then these are zipped
            with the report tuples returned by ``run_tests()``
            and evaluated using :meth:`assertParseResultsEquals`.
            Finally, asserts that the overall
            `:meth:~ParserElement.run_tests` success value is ``True``.

            :param run_tests_report: the return value from :meth:`ParserElement.run_tests`
            :type run_tests_report: tuple[bool, list[tuple[str, ParseResults | Exception]]]
            :param expected_parse_results: (optional)
            :type expected_parse_results: list[tuple[str | list | dict | Exception, ...]]
            Nzfailed runTestsr?   c                 S   s   g | ]\}}g |¢|‘R ‘qS r   r   )r   ÚrptÚexpectedr   r   r   Ú
<listcomp>Ù   s    ÿÿzOpyparsing_test.TestParseResultsAsserts.assertRunTestResults.<locals>.<listcomp>c                 s   ó   � | ]
}t |tƒr|V  qd S r   )Ú
isinstanceÚstr©r   Úexpr   r   r   Ú	<genexpr>á   ó   € zNpyparsing_test.TestParseResultsAsserts.assertRunTestResults.<locals>.<genexpr>c                 s   s(   � | ]}t |tƒrt|tƒr|V  qd S r   )rX   r3   Ú
issubclassÚ	ExceptionrZ   r   r   r   r\   ã   s   € ýý
ÿ)Úexpected_exceptionr@   c                 s   rW   r   )rX   ÚlistrZ   r   r   r   r\   ò   r]   c                 s   rW   r   )rX   ÚdictrZ   r   r   r   r\   õ   r]   ©NN)rE   rF   r@   zno validation for )Ú
assertTrueÚzipÚnextÚassertRaisesrX   r_   rG   rM   )r   Úrun_tests_reportÚexpected_parse_resultsr@   Úrun_test_successÚrun_test_resultsÚmergedrO   rD   rU   Úfail_msgr`   rE   rF   r   r   r   ÚassertRunTestResults¾   sV   ÿþþúÿ
ÿý€ÿÿü
ÿz;pyparsing_test.TestParseResultsAsserts.assertRunTestResultsc                 c   s”   � |d ur-t |tƒrt |¡}| j|||d��}|V  W d   ƒ d S 1 s&w   Y  d S | j||d��}|V  W d   ƒ d S 1 sCw   Y  d S )Nr?   )rX   rY   ÚreÚescapeÚassertRaisesRegexrg   )r   Úexc_typeÚexpected_msgr@   Úctxr   r   r   ÚassertRaisesParseException  s   €

"ÿ"ÿzApyparsing_test.TestParseResultsAsserts.assertRaisesParseException)NNN)NTrc   )r:   r;   r<   r=   rG   rQ   rS   rn   r   r   ru   r   r   r   r   ÚTestParseResultsAsserts‘   s    
ÿ
ÿ
ÿ
ÿIÿrv   NTú|Ú )ÚindentÚbase_1ÚsÚ
start_lineÚend_lineÚexpand_tabsÚeol_markÚmark_spacesÚmark_controlry   rz   Úreturnc                   s–  |r|   ¡ } tˆtƒrdˆ ‰ˆ  ¡ ‰|durZt t|¡}|dkr=dd„ ttddƒtdd	ƒƒD ƒ}	d
|	d< t |	¡}
d‰ nt	|ƒ‰t ‡fdd„t
tddƒƒdg D ƒ¡}
|  |
¡} |durz|dkrz|dkrtt dddœ¡}
|  |
¡} n|  d|¡} |du r€d}|du rŠt|  ¡ ƒ}t|t|  ¡ ƒƒ}ttd|ƒ|ƒ}|dkr­|  ¡ t|| dƒ|… }ndd„ |  d¡t|| dƒ|… D ƒ}|sÄdS tt|ƒƒ‰tdd„ |D ƒƒ}ˆ› dˆd  › �}|dkrý||rædnd d dd„ tt|d dƒƒD ƒ¡ d }nd}|�rdnd| d dd„ t| d  ƒD ƒ¡ d }d}||�r"dnd || d    d }|| | d ‡ ‡‡fd d„t||| d!�D ƒ¡ d S )"u^  
        Helpful method for debugging a parser - prints a string with line and column numbers.
        (Line and column numbers are 1-based by default - if debugging a parse action,
        pass base_1=False, to correspond to the loc value passed to the parse action.)

        :param s: string to be printed with line and column numbers
        :param start_line: starting line number in s to print (default=1)
        :param end_line: ending line number in s to print (default=len(s))
        :param expand_tabs: expand tabs to spaces, to match the pyparsing default
        :param eol_mark: string to mark the end of lines, helps visualize trailing spaces
        :param mark_spaces: special character to display in place of spaces
        :param mark_control: convert non-printing control characters to a placeholding
                             character; valid values:

                             - ``"unicode"`` - replaces control chars with Unicode symbols, such as "â��" and "â�Š"
                             - any single character string - replace control characters with given string
                             - ``None`` (default) - string is displayed as-is


        :param indent: string to indent with line and column numbers; if an int
                       is passed, converted to ``" " * indent``
        :param base_1: whether to label string using base 1; if False, string will be
                       labeled based at 0

        :returns: input string with leading line numbers and column number headers

        .. versionchanged:: 3.2.0
           New ``indent`` and ``base_1`` arguments.
        ú NÚunicodec                 S   s   i | ]\}}||“qS r   r   )r   ÚcÚur   r   r   r   G  s    
ÿz4pyparsing_test.with_line_numbers.<locals>.<dictcomp>r   é!   i $  i3$  i!$  é   rx   c                    s   i | ]}|ˆ “qS r   r   )r   r…   )Úord_mark_controlr   r   r   P  s    é    i	$  i#$  )é	   rŠ   c                 S   s   g | ]}|d  ‘qS )õ   â�Šr   ©r   Úliner   r   r   rV   c  s    ÿÿz4pyparsing_test.with_line_numbers.<locals>.<listcomp>rŒ   c                 s   s   � | ]}t |ƒV  qd S r   )Úlenr�   r   r   r   r\   k  s   € z3pyparsing_test.with_line_numbers.<locals>.<genexpr>r   éc   c                 s   s$   � | ]}d › |d d › �V  qdS )zc                                                                                                   r   éd   Nr   ©r   Úir   r   r   r\   r  s
   € ÿ
ÿr‘   Ú
c                 s   s"   � | ]}d |d d › �V  qdS )z	         r   é
   Nr   r’   r   r   r   r\   ~  s   €  r•   Ú
1234567890Ú0c                 3   s2   � | ]\}}ˆ› |ˆ› d �›d|› ˆ › �V  qdS )Údú:Nr   )r   r“   rŽ   )r   ry   Úlineno_widthr   r   r\   ‰  s
   € ÿ
ÿ)Ústart)Ú
expandtabsrX   ÚintÚtypingÚcastrY   re   ÚrangeÚ	maketransÚordra   Ú	translateÚreplacer�   Ú
splitlinesÚminÚmaxÚsplitÚjoinÚ	enumerate)r{   r|   r}   r~   r   r€   r�   ry   rz   Útranstable_mapÚtblÚs_linesÚmax_line_lenÚleadÚheader0Úheader1ÚdigitsÚheader2r   )r   ry   rš   r‰   r   Úwith_line_numbers  s–   *
ÿ
 ÿ
þ
ÿ
þþúÿ
ÿþýÿ$ÿÿþþýùÿz pyparsing_test.with_line_numbers)NNTrw   NN)r:   r;   r<   r=   r>   ÚunittestÚTestCaserv   ÚstaticmethodrY   rž   ÚOptionalr�   ÚboolÚUnionr´   r   r   r   r   r
      sH    y ù	öÿþýüûúù	÷
öõr
   )Ú
contextlibr   ro   rž   rµ   Úcorer   r   r   r   r   rx   r	   r
   r   r   r   r   Ú<module>   s   