U
    uiH                     @   s.  d 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ZddlZddl	m
Z
 ddlZddlmZ ddlmZmZ ddlmZ ddlZddlZdejdk d ZG d	d
 d
eZG dd deZejdd ZejejdejdG dd dejZ ejdejdG dd dejZ!dS )zTests for distutils.dist.    N)Command)Distributionfix_help_options)support.posixzpydistutils.cfgc                   @   s   e Zd ZdZdgZdd ZdS )	test_distz#Sample distutils extension command.)zsample-option=Sz	help textc                 C   s
   d | _ d S N)sample_optionself r   I/tmp/pip-unpacked-wheel-9osl9suo/setuptools/_distutils/tests/test_dist.pyinitialize_options   s    ztest_dist.initialize_optionsN)__name__
__module____qualname____doc__user_optionsr   r   r   r   r   r      s   r   c                   @   s   e Zd ZdZdd ZdS )TestDistributionzDistribution subclasses that avoids the default search for
    configuration files.

    The ._config_files attribute must be set before
    .parse_config_files() is called.
    c                 C   s   | j S r
   )_config_filesr   r   r   r   find_config_files*   s    z"TestDistribution.find_config_filesN)r   r   r   r   r   r   r   r   r   r   "   s   r   c                   C   s   t jdd = d S )N   )sysargvr   r   r   r   
clear_argv.   s    r   Zsave_env	save_argvc                   @   s   e Zd ZdddZdd Zdd Zejjde	j
jkd	d
dd Zdd Zdd Zdd Zdd Zdd Zdd Zejjddd
dd ZdS )TestDistributionBehaviorr   c                 C   s    t  }||_|  |  |S r
   )r   r   parse_config_filesparse_command_line)r   Zconfigfilesdr   r   r   create_distribution7   s
    z,TestDistributionBehavior.create_distributionc                 C   s*   t jd |  }| dgks&td S )Nbuilddistutils.command)r   r   appendr"   get_command_packagesAssertionError)r   r   r!   r   r   r   !test_command_packages_unspecified>   s    z:TestDistributionBehavior.test_command_packages_unspecifiedc                 C   sh   ddl m} tjddddg |  }| ddd	gks>t|d}t	||sVt|j
d
ksdtd S )Nr   )r   --command-packageszfoo.bar,distutils.testsr   z
-Ssometextr$   foo.barzdistutils.testsZsometext)Zdistutils.tests.test_distr   r   r   extendr"   r&   r'   get_command_obj
isinstancer   )r   r   r   r!   cmdr   r   r   test_command_packages_cmdlineC   s     

z6TestDistributionBehavior.test_command_packages_cmdline	distutilsz;Cannot test when virtualenv has monkey-patched Distribution)reasonc           
      C   sv  t jd t|d }d}tj|d| d| d| d| d| d	| d
| d| d| d| d| d| d| di tjj	t ddd | 
|g}W 5 Q R X ||f}|||||||||||||d}t|jd t| kst|jd D ]\}}	|	|| kstqtjj	t ddd | 
|g}W 5 Q R X | D ]}||jdi ksRtqRd S )Ninstallfilez/somedirzB
                    [install]
                    install-base = z(
                    install-platbase = z#
                    install-lib = z'
                    install-platlib = z'
                    install-purelib = z'
                    install-headers = z'
                    install-scripts = z$
                    install-data = z
                    prefix = z#
                    exec-prefix = z
                    home = z
                    user = z
                    root = z
                    z/a)prefixbase_prefix)install_baseinstall_platbaseinstall_libinstall_platlibinstall_purelibinstall_headersinstall_scriptsinstall_datar4   exec_prefixhomeuserrootz/b)r   r   r%   strjaracopathr#   mockpatchmultipler"   sortedcommand_optionsgetkeysr'   items)
r   tmp_pathr   r3   Zfakepathr!   option_tupleZresult_dictkeyvaluer   r   r   test_venv_install_optionsW   sv     
z2TestDistributionBehavior.test_venv_install_optionsc                 C   s   t jd t|d }tj|di | |g}| dddgksJt	dddgt jd	d < | |g}| ddgks~t	dd
dgt jd	d < | |g}| dgkst	d S )Nr#   r3   zh
                    [global]
                    command_packages = foo.bar, splat
                    r$   r*   Zsplatr)   Zsporkr    )
r   r   r%   rB   rC   rD   r#   r"   r&   r'   )r   rM   r   r3   r!   r   r   r    test_command_packages_configfile   s     z9TestDistributionBehavior.test_command_packages_configfilec                    sh   g   fdd}| tttdtj |t_tddddi dd}t dksTtd	t	|ksdtd S )
Nc                    s     |  d S r
   )r%   )msgZwarnsr   r   _warn   s    z:TestDistributionBehavior.test_empty_options.<locals>._warnwarnxxxZxxxx)authornameversionurloptionsattrsr   r]   )
Zaddfinalizer	functoolspartialsetattrwarningsrW   r   lenr'   dir)r   requestrV   distr   rU   r   test_empty_options   s     
z+TestDistributionBehavior.test_empty_optionsc                 C   s   ddd}t |d}|  |jjddgks0t|jjddgksDtddd}t |d}|  |jjdgksrt|jjdgkstd S )None,two)keywords	platformsr^   onetwozfoo bar)r   finalize_optionsmetadatark   r'   rj   r   r_   rg   r   r   r   test_finalize_options   s    



z.TestDistributionBehavior.test_finalize_optionsc                 C   s^   t  }|jd kst| }|dgks*t|jdgks:td|_| }|dddgksZtd S )Nr$   ri   rl   rm   )r   command_packagesr'   r&   )r   rg   Zcmdsr   r   r   test_get_command_packages   s    z2TestDistributionBehavior.test_get_command_packagesc              	   C   s.   t  }tt |jddd W 5 Q R X d S )NokZok2)level)r   pytestraises	TypeErrorannounce)r   rg   r   r   r   test_announce   s    z&TestDistributionBehavior.test_announcec                 C   sT   t jtdi| t }| }tddgid}| }t|d t|ksPtd S )Nz[distutils]
script_argsz--no-user-cfgr^   r   )rC   rD   r#   pydistutils_cfgr   r   rd   r'   )r   	temp_homer!   	all_filesfilesr   r   r   test_find_config_files_disable   s    z7TestDistributionBehavior.test_find_config_files_disablezplatform.system() == "Windows"z Windows does not honor chmod 000c                 C   s,   | tjddd |d t   dS )zV
        Finding config files should not fail when directory is inaccessible.
        rR   zutf-8)encodingr   N)joinpathr|   
write_textchmodr   r   )r   Z	fake_homer   r   r   'test_find_config_files_permission_error   s    
z@TestDistributionBehavior.test_find_config_files_permission_errorN)r   )r   r   r   r"   r(   r/   rv   markZskipifr   r   rQ   rS   rh   rq   rs   rz   r   r   r   r   r   r   r   3   s&   


=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
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!d" Zd#d$ Zd%d& Zd'd( Zd)d* Zd+d, Zd-d. Zd/d0 Zd1S )2TestMetadatac                 C   s   t  }|j| | S r
   )ioStringIOro   write_pkg_filegetvalue)r   rg   sior   r   r   format_metadata	  s    zTestMetadata.format_metadatac                 C   s\   ddd}t |}| |}d|ks(td| ks8td| ksHtd| ksXtd S )Npackage1.0)rZ   r[   zMetadata-Version: 1.0	provides:	requires:
obsoletes:)r   r   r'   lowerr   r_   rg   metar   r   r   test_simple_metadata  s    

z!TestMetadata.test_simple_metadatac                 C   s|   ddddgd}t |}|j ddgks.t| ddgksBt| |}d|ksXtd| kshtd| ksxtd S )Nr   r   zpackage.subrZ   r[   providesMetadata-Version: 1.1r   r   )r   ro   get_providesr'   r   r   r   r   r   r   test_provides  s    
zTestMetadata.test_providesc              	   C   s,   t t tdddgd W 5 Q R X d S )Nr   r   my.pkg (splat)r   rv   rw   
ValueErrorr   r   r   r   r   test_provides_illegal%  s    z"TestMetadata.test_provides_illegalc                 C   s   ddddgd}t |}|j ddgks.t| ddgksBt| |}d|ksXtd| kshtd|ksttd	|kstd
| kstd S )Nr   r   otherzanother (==1.0)rZ   r[   requiresr   r   zRequires: otherzRequires: another (==1.0)r   )r   ro   get_requiresr'   r   r   r   r   r   r   test_requires+  s    
zTestMetadata.test_requiresc              	   C   s,   t t tdddgd W 5 Q R X d S )Nr   r   r   r   r   r   r   r   r   test_requires_illegal;  s    z"TestMetadata.test_requires_illegalc                 C   s.   dt dgd}t|}t|jjts*td S )Nr   r   )rZ   r   )iterr   r-   ro   r   listr'   rp   r   r   r   test_requires_to_listA  s    z"TestMetadata.test_requires_to_listc                 C   s   ddddgd}t |}|j ddgks.t| ddgksBt| |}d|ksXtd| kshtd| ksxtd	|kstd
|kstd S )Nr   r   r   zanother (<1.0)rZ   r[   	obsoletesr   r   r   zObsoletes: otherzObsoletes: another (<1.0))r   ro   get_obsoletesr'   r   r   r   r   r   r   test_obsoletesF  s    
zTestMetadata.test_obsoletesc              	   C   s,   t t tdddgd W 5 Q R X d S )Nr   r   r   r   r   r   r   r   r   test_obsoletes_illegalV  s    z#TestMetadata.test_obsoletes_illegalc                 C   s.   dt dgd}t|}t|jjts*td S )Nr   r   )rZ   r   )r   r   r-   ro   r   r   r'   rp   r   r   r   test_obsoletes_to_list\  s    z#TestMetadata.test_obsoletes_to_listc                 C   sB   dddgd}t |}| dgks(t| |}d|ks>td S )NBoa3.0#Programming Language :: Python :: 3rZ   r[   classifiersr   )r   get_classifiersr'   r   r   r   r   r   test_classifiera  s    
zTestMetadata.test_classifierc                 C   sT   dddd}t |}d|jd ks&tt|jjts8t|jjt|d ksPtd S )Nr   r   )r   r   should be a listr   r   )r   messagesr'   r-   ro   r   r   r   Zcaplogr_   r!   r   r   r   test_classifier_invalid_typel  s    z)TestMetadata.test_classifier_invalid_typec                 C   s4   dddddgd}t |}| dddgks0td S )NMontyr   spameggslife of brianrZ   r[   rj   )r   get_keywordsr'   rp   r   r   r   test_keywordsy  s    zTestMetadata.test_keywordsc                 C   sT   dddd}t |}d|jd ks&tt|jjts8t|jjt|d ksPtd S )Nr   r   )r   r   r   r   r   r   rj   )r   r   r'   r-   ro   rj   r   r   r   r   r   test_keywords_invalid_type  s    z'TestMetadata.test_keywords_invalid_typec                 C   s0   ddddgd}t |}| ddgks,td S )Nr   r   	GNU/LinuxSome Evil PlatformrZ   r[   rk   )r   get_platformsr'   rp   r   r   r   test_platforms  s    zTestMetadata.test_platformsc                 C   sT   dddd}t |}d|jd ks&tt|jjts8t|jjt|d ksPtd S )Nr   r   )r   r   r   r   r   rk   )r   r   r'   r-   ro   rk   r   r   r   r   r   test_platforms_invalid_types  s    z)TestMetadata.test_platforms_invalid_typesc                 C   s.   dddd}t |}| |}d|ks*td S )Nr   r   zhttp://example.org/boa)rZ   r[   download_urlr   )r   r   r'   r   r   r   r   test_download_url  s    
zTestMetadata.test_download_urlc                 C   sD   t d}dd|d}t|}| |}|dd}||ks@td S )Nzc        example::
              We start here
            and continue here
          and end here.r   r   rZ   r[   long_descriptionz	
        
)textwrapdedentr   r   replacer'   )r   	long_descr_   rg   r   r   r   r   test_long_description  s    
z"TestMetadata.test_long_descriptionc                 C   s4   t jtdi| |t }t|t  ks0tdS )z*
        pydistutils.cfg is found
        rR   N)rC   rD   r#   r|   rB   r   r   r'   )r   r}   Zconfig_pathr   r   r   test_custom_pydistutils  s    z$TestMetadata.test_custom_pydistutilsc                 C   sD   t jddi| |d }|dt| t|t  ks@td S )Nzoverrides.cfgrR   ZDIST_EXTRA_CONFIG)rC   rD   r#   ZsetenvrB   r   r   r'   )r   ZmonkeypatchrM   filenamer   r   r   test_extra_pydistutils  s    z#TestMetadata.test_extra_pydistutilsc                 C   s4   ddg}t |}|d dks t|d dks0td S )N)abcr!   )r            r   )r   r   r   r   )r   r   r   )r   r'   )r   Zhelp_tuplesZfancy_optionsr   r   r   test_fix_help_options  s    z"TestMetadata.test_fix_help_optionsc                 C   sF   t  }g t_d|_d|_|  dd | jdD }|sBt	d S )NTzsetup.pyc                 S   s   g | ]}|  d kr|qS )rR   )strip).0liner   r   r   
<listcomp>  s     z/TestMetadata.test_show_help.<locals>.<listcomp>r   )
r   r   r   helpscript_namer    Z
readouterroutsplitr'   )r   rf   Zcapsysrg   outputr   r   r   test_show_help  s    zTestMetadata.test_show_helpc                 C   s   dddddddgdgd	}t |}|j}t }|| |d
 || |jdks\t|j	dksjt|j
dksxt|jdkst|jddgkst|jd kst|jd kst|jdgkstd S )Nr   r   descrX   zhttp://example.comrl   rm   Zfoo)rZ   r[   r   descriptionr   rj   r   r   )r   ro   r   r   r   seekread_pkg_filerZ   r'   r[   r   r   rj   rk   r   r   )r   r_   rg   ro   PKG_INFOr   r   r   test_read_metadata  s,    



zTestMetadata.test_read_metadatac              	   C   s   dddd}t |}|j}t }|| | }W 5 Q R X t|}tjj	dddd}t 0}tj
j||d	| |d t|}W 5 Q R X t|d
  }	t|d
  }
|
|	kstdS )z
        In pypa/setuptools#4033, it was shown that once PKG-INFO is
        re-generated using ``email.generator.Generator``, some control
        characters might cause problems.
        r   r   zhello
world
r   TFr   )utf8mangle_from_max_line_length)policyDescriptionN)r   ro   r   r   r   r   emailmessage_from_stringr   ZEmailPolicy	generator	Generatorflattenr   message_from_fileset
splitlinesr'   )r   r_   rg   ro   bufferrT   origr   ZregenZ	orig_descZ
regen_descr   r   r   'test_round_trip_through_email_generator  s,    




z4TestMetadata.test_round_trip_through_email_generatorN)r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r     s0   			
	r   )"r   r   email.generatoremail.policyr`   r   osr   r   Zunittest.mockrE   rc   distutils.cmdr   distutils.distr   r   Zdistutils.testsr   Zjaraco.pathrC   rv   rZ   r|   r   r   Zfixturer   Zcombine_markersr   ZusefixturesZTempdirManagerr   r   r   r   r   r   <module>   s8   


 Q

