a
    #.cE                  
   @   sr  d Z ddlmZ ddlZddlZddl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mZmZ ddlmZmZmZmZ ddlmZmZmZ ddlZzdd	lmZmZ d
ZW n( e y Z! zdZW Y dZ![!n
dZ![!0 0 ej"d dkoej"dk Z#G dd deZ$G dd deZ%G dd deZ&G dd deZ'G dd deZ(G dd deZ)G dd deZ*dS )z#Tests of Beautiful Soup as a whole.    )	set_traceN)BeautifulSoupBeautifulStoneSoupGuessedAtParserWarningMarkupResemblesLocatorWarningdammit)builder_registryTreeBuilderParserRejectedMarkup)CommentSoupStrainerTagNavigableString   )default_builderSoupTestskipIf)LXMLTreeBuilderLXMLTreeBuilderForXMLTF   )r      c                   @   sL   e Zd Zdd Zdd Zdd Zdd Zd	d
 Zdd Zdd Z	dd Z
dS )TestConstructorc                 C   s"   d}|  |}d|jjksJ d S )Nu   <h1>éé</h1>u   éésoupZh1stringselfdatar    r   M/var/www/brookimports/venv/lib/python3.9/site-packages/bs4/tests/test_soup.pytest_short_unicode_input0   s    
z(TestConstructor.test_short_unicode_inputc                 C   s"   d}|  |}d|jjksJ d S )Nz<h1>foo bar</h1>zfoo barr   r   r   r   r   test_embedded_null5   s    
z"TestConstructor.test_embedded_nullc                 C   s,   d d}| j|dgd}d|jks(J d S )Nu   Räksmörgåsutf-8)Zexclude_encodingszwindows-1252)encoder   original_encoding)r   	utf8_datar   r   r   r   test_exclude_encodings:   s    
z&TestConstructor.test_exclude_encodingsc                 C   s  G dd dt }tddd}tjdd" tdd|i|}W d    n1 sP0    Y  t|j|sjJ tdd	|jjksJ d
|jjksJ |f i |}tjdd}td|dd}W d    n1 s0    Y  t	|d j
}|dsJ ||jksJ ||jksJ d S )Nc                   @   sD   e Zd Zdd Zdd Zdd Zdd Zd	d
 Ze ZZ	dd Z
dS )z7TestConstructor.test_custom_builder_class.<locals>.Mockc                 [   s(   || _ d| _d| _g | _g | _i | _d S )NTF)called_withZis_xmlZstore_line_numbersZcdata_list_attributesZpreserve_whitespace_tagsstring_containers)r   kwargsr   r   r   __init__C   s    z@TestConstructor.test_custom_builder_class.<locals>.Mock.__init__c                 S   s   d S Nr   r   r   r   r   r   initialize_soupJ   s    zGTestConstructor.test_custom_builder_class.<locals>.Mock.initialize_soupc                 S   s
   || _ d S r+   )fedr   markupr   r   r   feedL   s    z<TestConstructor.test_custom_builder_class.<locals>.Mock.feedc                 S   s   d S r+   r   r   r   r   r   resetN   s    z=TestConstructor.test_custom_builder_class.<locals>.Mock.resetc                 S   s   d S r+   r   )r   ignorer   r   r   r4   P   s    z>TestConstructor.test_custom_builder_class.<locals>.Mock.ignorec                    s
   dV  d S )N)prepared markupzoriginal encodingzdeclared encodingzcontains replacement charactersr   r   argsr)   r   r   r   prepare_markupS   s    zFTestConstructor.test_custom_builder_class.<locals>.Mock.prepare_markupN)__name__
__module____qualname__r*   r-   r1   r3   r4   Zset_up_substitutionsZcan_be_empty_elementr8   r   r   r   r   MockB   s   r<   valueT)varZconvertEntitiesrecord builder)r>   r5   )rB   Zignored_valuer   zCKeyword arguments to the BeautifulSoup constructor will be ignored.)rA   )objectdictwarningscatch_warningsr   
isinstancerB   r'   r.   strmessage
startswith)r   r<   r)   r   rB   wmsgr   r   r   test_custom_builder_class?   s&    0$z)TestConstructor.test_custom_builder_classc                 C   sl   G dd dt }dd }dd l}tt}td|d W d    n1 sL0    Y  dt|jv shJ d S )	Nc                   @   s   e Zd Zdd ZdS )z:TestConstructor.test_parser_markup_rejection.<locals>.Mockc                 _   s   t dd S )NzNope.)r
   r6   r   r   r   r1   s   s    z?TestConstructor.test_parser_markup_rejection.<locals>.Mock.feedN)r9   r:   r;   r1   r   r   r   r   r<   r   s   r<   c                    s    t d d dfV  t d d dfV  d S )NF)r0   r6   r   r   r   r8   v   s    zDTestConstructor.test_parser_markup_rejection.<locals>.prepare_markupr   rA   )rB   zoThe markup you provided was rejected by the parser. Trying a different parser or a different encoding may help.)r	   repytestraisesr
   r   rH   r=   )r   r<   r8   rN   exc_infor   r   r   test_parser_markup_rejectiono   s    *z,TestConstructor.test_parser_markup_rejectionc              	   C   s   d}|  |}|j}d|d ks$J ddg|d ks8J | j |td d}d|jd ksZJ ddiddifD ]j}tjd	d
 }| j |d |d}W d    n1 s0    Y  |j}ddg|d ksJ d|d ksjJ qjd S )Nz&<a id=" an id " class=" a class "></a>z an id idaclass)rB   Zmulti_valued_attributesz	 a class *Tr?   Zan)r   rT   r   rE   rF   )r   r0   r   rT   Z
switcheroorK   r   r   r   test_cdata_list_attributes   s    
.z*TestConstructor.test_cdata_list_attributesc                    sp   G dd dt G dd dtG dd dt | jdt tt id}t fd	d
| D slJ d S )Nc                   @   s   e Zd ZdS )z9TestConstructor.test_replacement_classes.<locals>.TagPlusNr9   r:   r;   r   r   r   r   TagPlus   s   rY   c                   @   s   e Zd ZdS )z<TestConstructor.test_replacement_classes.<locals>.StringPlusNrX   r   r   r   r   
StringPlus   s   rZ   c                   @   s   e Zd ZdS )z=TestConstructor.test_replacement_classes.<locals>.CommentPlusNrX   r   r   r   r   CommentPlus   s   r[   z<a><b>foo</b>bar</a><!--whee-->)Zelement_classesc                 3   s   | ]}t | fV  qd S r+   )rG   ).0xr[   rZ   rY   r   r   	<genexpr>   s   z;TestConstructor.test_replacement_classes.<locals>.<genexpr>)r   r   r   r   allZrecursiveChildGeneratorr,   r   r^   r   test_replacement_classes   s    z(TestConstructor.test_replacement_classesc                 C   s   G dd dt }G dd dt }| jd||dd}t|jjd t sJJ t|jjd |s`J |jjD ]}t||shJ qhg |jksJ d S )	Nc                   @   s   e Zd ZdS )zATestConstructor.test_alternate_string_containers.<locals>.PStringNrX   r   r   r   r   PString   s   rb   c                   @   s   e Zd ZdS )zATestConstructor.test_alternate_string_containers.<locals>.BStringNrX   r   r   r   r   BString   s   rc   z4<div>Hello.<p>Here is <b>some <i>bolded</i></b> text)bp)r(   r   )	r   r   rG   divcontentsre   rd   stringsZstring_container_stack)r   rb   rc   r   sr   r   r    test_alternate_string_containers   s    	z0TestConstructor.test_alternate_string_containersN)r9   r:   r;   r    r!   r&   rM   rR   rW   ra   rj   r   r   r   r   r   .   s   0r   c                   @   s   e Zd Zdd Zdd Zdd Zdd Zd	d
 Zdd Zdd Z	dd Z
ejdg ddd Zejdg ddd Zdd Zdd Zdd Zdd Zd S )!TestWarningsc                 C   s2   |D ]}t |j|r|  S qtd||f d S )Nz%s warning not found in %r)rG   rI   	Exception)r   rE   clsrK   r   r   r   _assert_warning   s    
zTestWarnings._assert_warningc                 C   s2   |  |t}t|j}|tjd d s.J d S )N<   )rn   r   rH   rI   rJ   r   ZNO_PARSER_SPECIFIED_WARNING)r   rK   warningrI   r   r   r   _assert_no_parser_specified   s    
z(TestWarnings._assert_no_parser_specifiedc                 C   sB   t jdd}td}W d    n1 s*0    Y  | | d S )NTr?   <a><b></b></a>rE   rF   r   rq   r   rK   r   r   r   r   #test_warning_if_no_parser_specified   s    &z0TestWarnings.test_warning_if_no_parser_specifiedc                 C   sD   t jdd}tdd}W d    n1 s,0    Y  | | d S )NTr?   rr   htmlrs   rt   r   r   r   *test_warning_if_parser_specified_too_vague   s    (z7TestWarnings.test_warning_if_parser_specified_too_vaguec                 C   sF   t jdd}tdd}W d    n1 s,0    Y  g |ksBJ d S )NTr?   rr   html.parser)rE   rF   r   rt   r   r   r   ,test_no_warning_if_explicit_parser_specified   s    (z9TestWarnings.test_no_warning_if_explicit_parser_specifiedc                 C   sx   t jdd"}| jdtdd}W d    n1 s40    Y  t|d j}d|v sXJ d|v sdJ d	| kstJ d S )
NTr?   rr   rd   )parseOnlyTheser   rz   
parse_onlys   <b></b>)rE   rF   r   r   rH   rI   r#   )r   rK   r   rL   r   r   r   )test_parseOnlyThese_renamed_to_parse_only   s    0z6TestWarnings.test_parseOnlyThese_renamed_to_parse_onlyc                 C   sv   t jdd"}d}| j|dd}W d    n1 s40    Y  t|d j}d|v sXJ d|v sdJ d|jksrJ d S )	NTr?   s   éutf8)fromEncodingr   r~   Zfrom_encoding)rE   rF   r   rH   rI   r$   )r   rK   r}   r   rL   r   r   r   *test_fromEncoding_renamed_to_from_encoding  s    ,z7TestWarnings.test_fromEncoding_renamed_to_from_encodingc                 C   s<   t t | jddd W d    n1 s.0    Y  d S )Nz<a>T)Zno_such_argument)rO   rP   	TypeErrorr   r2   r   r   r   "test_unrecognized_keyword_argument
  s    z/TestWarnings.test_unrecognized_keyword_argument	extension)zmarkup.htmlz
markup.htmzmarkup.HTMLz
markup.txtzmarkup.xhtmlz
markup.xmlz/home/user/filezc:\userilec                 C   s\   t jdd<}| d| }| |t}dt|jv s:J W d    n1 sN0    Y  d S )NTr?   r0   zlooks more like a filenamerE   rF   r   rn   r   rH   rI   )r   r   rK   r   rp   r   r   r   test_resembles_filename_warning  s    z,TestWarnings.test_resembles_filename_warning)Z
markuphtmlz
markup.comrA   z	markup.jsc                 C   sJ   t jdd}| d| }W d    n1 s00    Y  g |ksFJ d S )NTr?   r0   )rE   rF   r   )r   r   rK   r   r   r   r   "test_resembles_filename_no_warning  s    ,z/TestWarnings.test_resembles_filename_no_warningc                 C   st   d}t jdd}| |}W d    n1 s00    Y  | |t}dt|jv sXJ |t|jdvspJ d S )Ns   http://www.crummybytes.com/Tr?   looks more like a URLr}   )rE   rF   r   rn   r   rH   rI   r#   r   urlwarning_listr   rp   r   r   r   test_url_warning_with_bytes_url'  s    (z,TestWarnings.test_url_warning_with_bytes_urlc                 C   sn   d}t jdd}| |}W d    n1 s00    Y  | |t}dt|jv sXJ |t|jvsjJ d S )Nzhttp://www.crummyunicode.com/Tr?   r   r   r   r   r   r   !test_url_warning_with_unicode_url1  s    (z.TestWarnings.test_url_warning_with_unicode_urlc                 C   sP   t jdd}| d}W d    n1 s,0    Y  tdd |D rLJ d S )NTr?   s$   http://www.crummybytes.com/ is greatc                 s   s   | ]}d t |jv V  qdS r   NrH   rI   r\   rK   r   r   r   r_   B  s   zETestWarnings.test_url_warning_with_bytes_and_space.<locals>.<genexpr>rE   rF   r   anyr   r   r   r   r   r   %test_url_warning_with_bytes_and_space=  s
    (z2TestWarnings.test_url_warning_with_bytes_and_spacec                 C   sP   t jdd}| d}W d    n1 s,0    Y  tdd |D rLJ d S )NTr?   z&http://www.crummyunicode.com/ is greatc                 s   s   | ]}d t |jv V  qdS r   r   r   r   r   r   r_   H  s   zGTestWarnings.test_url_warning_with_unicode_and_space.<locals>.<genexpr>r   r   r   r   r   'test_url_warning_with_unicode_and_spaceE  s
    (z4TestWarnings.test_url_warning_with_unicode_and_spaceN)r9   r:   r;   rn   rq   ru   rw   ry   r|   r   r   rO   markZparametrizer   r   r   r   r   r   r   r   r   r   rk      s,   	


rk   c                   @   s   e Zd Zdd ZdS )TestSelectiveParsingc                 C   s.   d}t d}| j||d}| dks*J d S )Nz&No<b>Yes</b><a>No<b>Yes <c>Yes</c></b>rd   )r{   s   <b>Yes</b><b>Yes <c>Yes</c></b>)r   r   r#   )r   r0   Zstrainerr   r   r   r   test_parse_with_soupstrainerN  s    z1TestSelectiveParsing.test_parse_with_soupstrainerN)r9   r:   r;   r   r   r   r   r   r   L  s   r   c                   @   s    e Zd ZdZdd Zdd ZdS )
TestNewTagz(Test the BeautifulSoup.new_tag() method.c                 C   sb   |  d}|jddddid}t|ts,J d|jks:J tddd|jksPJ d |jks^J d S )NrA   fooZbaznameza name)barattrs)r   r   )r   new_tagrG   r   r   rD   r   parent)r   r   r   r   r   r   test_new_tagW  s    
zTestNewTag.test_new_tagc                 C   s   t rBtdd}|d}|d}d| ks2J d| ksBJ tdd}|d}|d}d| kspJ d| ksJ d S )	NrA   zlxml-xmlbrre   s   <br/>s   <p/>rx   s   <p></p>)LXML_PRESENTr   r   r#   )r   Zxml_soupZxml_brZxml_pZ	html_soupZhtml_brZhtml_pr   r   r   1test_tag_inherits_self_closing_rules_from_builder_  s    





z<TestNewTag.test_tag_inherits_self_closing_rules_from_builderN)r9   r:   r;   __doc__r   r   r   r   r   r   r   U  s   r   c                   @   s    e Zd ZdZdd Zdd ZdS )TestNewStringz+Test the BeautifulSoup.new_string() method.c                 C   s2   |  d}|d}d|ks J t|ts.J d S NrA   r   )r   
new_stringrG   r   r   r   ri   r   r   r   'test_new_string_creates_navigablestringu  s    

z5TestNewString.test_new_string_creates_navigablestringc                 C   s4   |  d}|dt}d|ks"J t|ts0J d S r   )r   r   r   rG   r   r   r   r   3test_new_string_can_create_navigablestring_subclass{  s    
zATestNewString.test_new_string_can_create_navigablestring_subclassN)r9   r:   r;   r   r   r   r   r   r   r   r   s  s   r   c                   @   s   e Zd Zdd Zdd ZdS )
TestPicklec                 C   s2   |  d}t|}t|}d|jjks.J d S )Nz<a>some markup</a>some markup)r   pickledumpsloadsrT   r   r   r   ZpickledZ	unpickledr   r   r   test_normal_pickle  s    


zTestPickle.test_normal_picklec                 C   s6   |  d}d |_t|}t|}d|jks2J d S )Nr   )r   rB   r   r   r   r   r   r   r   r   test_pickle_with_no_builder  s
    


z&TestPickle.test_pickle_with_no_builderN)r9   r:   r;   r   r   r   r   r   r   r     s   r   c                   @   sF   e Zd Zdd Zdd Zdd Zdd Zd	d
 Zee	ddd Z
dS )TestEncodingConversionc                 C   s&   d| _ | j d| _| jdks"J d S )NuU   <html><head><meta charset="utf-8"/></head><body><foo>Sacré bleu!</foo></body></html>r"   sU   <html><head><meta charset="utf-8"/></head><body><foo>Sacré bleu!</foo></body></html>)unicode_datar#   r%   r2   r   r   r   setup_method  s    z#TestEncodingConversion.setup_methodc              	   C   s   t j}ttj zpdd }|t _d}| |}| }t|tsFJ || 	| ks\J |j
 dksnJ W ttj |t _nttj |t _0 d S )Nc                 S   s   d S r+   r   )rH   r   r   r   noop  s    z>TestEncodingConversion.test_ascii_in_unicode_out.<locals>.noops   <foo>a</foo>r"   )r   Zchardet_dammitloggingdisableWARNINGr   decoderG   rH   Zdocument_forr$   lowerNOTSET)r   chardetr   asciiZsoup_from_asciiZunicode_outputr   r   r   test_ascii_in_unicode_out  s    
z0TestEncodingConversion.test_ascii_in_unicode_outc                 C   s@   |  | j}| | jksJ |jjdks.J |jd ks<J d S Nu   Sacré bleu!)r   r   r   r   r   r$   r   Zsoup_from_unicoder   r   r   test_unicode_in_unicode_out  s    z2TestEncodingConversion.test_unicode_in_unicode_outc                 C   s2   |  | j}| | jksJ |jjdks.J d S r   )r   r%   r   r   r   r   )r   Zsoup_from_utf8r   r   r   test_utf8_in_unicode_out  s    z/TestEncodingConversion.test_utf8_in_unicode_outc                 C   s$   |  | j}|d| jks J d S )Nr"   )r   r   r#   r%   r   r   r   r   test_utf8_out  s    z$TestEncodingConversion.test_utf8_outzQBad HTMLParser detected; skipping test of non-ASCII characters in attribute name.c                 C   s(   d}|  |jd|dks$J d S )Nu    <div><a ☃="snowman"></a></div>r}   )r   rf   r#   r/   r   r   r   1test_attribute_name_containing_unicode_characters  s    zHTestEncodingConversion.test_attribute_name_containing_unicode_charactersN)r9   r:   r;   r   r   r   r   r   r   PYTHON_3_PRE_3_2r   r   r   r   r   r     s   r   )+r   pdbr   r   osr   rO   systempfileZbs4r   r   r   r   r   Zbs4.builderr   r	   r
   Zbs4.elementr   r   r   r   rA   r   r   r   rE   r   r   r   ImportErroreversion_infor   r   rk   r   r   r   r   r   r   r   r   r   <module>   s4    0o	