U
    ui                     @   s  d dl Z d dlZd dlZd dlmZ d dlmZmZ d dlZd dl	m
Z
 d dlmZmZmZ d dlmZmZ d dlmZ dd	lmZ d d
lmZmZ G dd dee Zd!ddZd"ddZejd#ddZdd ZG dd dZG dd dZ G dd dZ!ej"Z#G dd  d Z$dS )$    N)Path)Mockpatch)InvalidRequirement)ConfigHandlerTargetread_configuration)Distribution_Distribution)SetuptoolsDeprecationWarning   )DALS)DistutilsFileErrorDistutilsOptionErrorc                   @   s   e Zd ZdZdZdS )ErrConfigHandlerz7Erroneous handler. Fails to implement required methods.z**err**N)__name__
__module____qualname____doc__Zsection_prefix r   r   I/tmp/pip-unpacked-wheel-9osl9suo/setuptools/tests/config/test_setupcfg.pyr      s   r   Fc                 C   sB   |}|  dD ]}||}qd }|s:|d}|d ||fS )N/__init__.py )splitmkdirjoinwrite)namebase_dirnsdir_packageZdir_name	init_filer   r   r   make_package_dir   s    

r#   asciifake_packagec                 C   sZ   |d krd}|  d| |  d}|j||dd t|| \}}|d ||fS )Nz%from setuptools import setup
setup()
setup.py	setup.cfgwb)modezWVERSION = (1, 2, 3)

VERSION_MAJOR = 1
def get_version():
    return [3, 4, 5, "dev"]

)r   r   encoder#   )tmpdir	setup_cfgsetup_pyencodingpackage_pathconfigpackage_dirr"   r   r   r   fake_env$   s    

r2   Tc              	   c   s@   |pi }|   & t|}d|_|o*|  |V  W 5 Q R X d S )Nr&   )Zas_cwdr	   script_nameparse_config_files)r+   Zkwargs_initialparsedistr   r   r   get_dist=   s    
r7   c               	   C   s0   t t td i dt } | j W 5 Q R X d S )NF)pytestraisesNotImplementedErrorr   r   parsers)handlerr   r   r   test_parsers_implementedI   s    r=   c                   @   s$   e Zd Zdd Zdd Zdd ZdS )TestConfigurationReaderc                 C   sb   t |d\}}td| }|d d dks.t|d d ddgksFt|d	 d
 ddgks^td S )NzX[metadata]
version = 10.1.1
keywords = one, two

[options]
scripts = bin/a.py, bin/b.py
%smetadataversion10.1.1keywordsonetwooptionsscriptszbin/a.pyzbin/b.py)r2   r   AssertionErrorselfr+   _r0   Zconfig_dictr   r   r   
test_basicP   s    	z"TestConfigurationReader.test_basicc              	   C   s,   t t td|d  W 5 Q R X d S )Nr?   r'   )r8   r9   r   r   r   rJ   r+   r   r   r   test_no_config_   s    z&TestConfigurationReader.test_no_configc              	   C   st   t |d\}}tt td|  W 5 Q R X td| dd}|d d ddgksXtd	|d ksht|  d S )
Nz<[metadata]
version = attr: none.VERSION
keywords = one, two
r?   T)Zignore_option_errorsr@   rC   rD   rE   rA   )r2   r8   r9   ImportErrorr   rH   removerI   r   r   r   test_ignore_errorsc   s    z*TestConfigurationReader.test_ignore_errorsN)r   r   r   rL   rN   rQ   r   r   r   r   r>   O   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ejjd)d*d+d, Zejjd)d*d-d. Zd/S )0TestMetadatac              	   C   s   t |d |dd ddi}t||}|j}|jdksBt|jdksPt|jdks^t|j	dkslt|j
d	d
gks~t|jdkst|jdkst|jddgkst|jdkst|jdkstW 5 Q R X d S )Na-  [metadata]
version = 10.1.1
description = Some description
long_description_content_type = text/something
long_description = file: README
name = fake_name
keywords = one, two
provides = package, package.sub
license = otherlic
download_url = http://test.test.com/test/
maintainer_email = test@test.com
READMEreadme contents
line2licensezBSD 3-Clause LicenserB   Some descriptiontext/somethingpackagezpackage.subZ	fake_namerD   rE   http://test.test.com/test/test@test.com)r2   r   r   r7   r@   rA   rH   descriptionlong_description_content_typelong_descriptionprovidesrU   r   rC   download_urlmaintainer_email)rJ   r+   Zmeta_initialr6   r@   r   r   r   rL   t   s(     zTestMetadata.test_basicc              	   C   sV   t |td t|6}|j}|jdks,t|jdks:t|jdksHtW 5 Q R X d S )Nzr
            [metadata]
            name=foo
            version=0.0.1
            license=Apache 2.0
            fooz0.0.1z
Apache 2.0)r2   r   r7   r@   r   rH   rA   rU   rJ   r+   r6   r@   r   r   r   test_license_cfg   s    
zTestMetadata.test_license_cfgc              	   C   sR   t |d |dd |dd t|}|jjdksDtW 5 Q R X d S )Nz=[metadata]
long_description = file: README.rst, CHANGES.rst

z
README.rstrT   zCHANGES.rstzchangelog contents
and stuffz2readme contents
line2
changelog contents
and stuff)r2   r   r   r7   r@   r]   rH   rJ   r+   r6   r   r   r   test_file_mixed   s    
zTestMetadata.test_file_mixedc              
   C   sf   | d |dd}|j dd t|d t|dd$}tt |  W 5 Q R X W 5 Q R X d S )	NrS   Zdepth1Zdepth2T)dirz1[metadata]
long_description = file: ../../README
Fr5   )Zensurer   r2   r7   r8   r9   r   r4   )rJ   r+   projectr6   r   r   r   test_file_sandboxed   s    

z TestMetadata.test_file_sandboxedc              	   C   sv   t |d t|Z}|j}|jdks(t|jdks6t|jdksDt|jddgksVt|jddgkshtW 5 Q R X d S )	Nz[metadata]
author_email = test@test.com
home_page = http://test.test.com/test/
summary = Short summary
platform = a, b
classifier =
  Framework :: Django
  Programming Language :: Python :: 3.5
rZ   rY   zShort summaryabFramework :: Django%Programming Language :: Python :: 3.5)	r2   r7   r@   author_emailrH   urlr[   	platformsclassifiersrb   r   r   r   test_aliases   s    
zTestMetadata.test_aliasesc              	   C   sL   t |d t|0}|j}|jddgks,t|jddgks>tW 5 Q R X d S )Nz[metadata]
name = fake_name
keywords =
  one
  two
classifiers =
  Framework :: Django
  Programming Language :: Python :: 3.5
rD   rE   rl   rm   )r2   r7   r@   rC   rH   rq   rb   r   r   r   test_multiline   s    
zTestMetadata.test_multilinec              	   C   s<   t |d t| }|j}|jdddks.tW 5 Q R X d S )Nzf[metadata]
project_urls =
  Link One = https://example.com/one/
  Link Two = https://example.com/two/
https://example.com/one/https://example.com/two/zLink OnezLink Two)r2   r7   r@   project_urlsrH   rb   r   r   r   	test_dict   s    
zTestMetadata.test_dictc              	   C   sF  t |d\}}|d}|dd |dd |d}|dd |dd t|}|jjd	ks|tW 5 Q R X |d
 t|}|jjdkstW 5 Q R X |d t|}|jjdkstW 5 Q R X |d t|}|jjdkstW 5 Q R X |d t|}|jjdks8tW 5 Q R X d S )Nz0[metadata]
version = attr: fake_package.VERSION
Zsubpkg_ar   r   zmod.pyzVERSION = (2016, 11, 26)Zsubpkg_bz2import third_party_module
VERSION = (2016, 11, 26)1.2.3z4[metadata]
version = attr: fake_package.get_version
z	3.4.5.devz6[metadata]
version = attr: fake_package.VERSION_MAJOR
1z=[metadata]
version = attr: fake_package.subpkg_a.mod.VERSION
z
2016.11.26z=[metadata]
version = attr: fake_package.subpkg_b.mod.VERSION
)r2   r   r   r   r7   r@   rA   rH   )rJ   r+   r1   r0   Zsub_aZsub_br6   r   r   r   test_version   s4     











zTestMetadata.test_versionc              
   C   s   t |d\}}|ddd t|}|jjdks:tW 5 Q R X |ddd tt	" t|}|jj W 5 Q R X W 5 Q R X d S )Nz4[metadata]
version = file: fake_package/version.txt
r%   zversion.txtz1.2.3
ry   z1.2.3
4.5.6
)
r2   r   r   r7   r@   rA   rH   r8   r9   r   rJ   r+   rK   r0   r6   r   r   r   test_version_file"  s     

zTestMetadata.test_version_filec              	   C   s:   t |ddd\}}t|}|jjdks,tW 5 Q R X d S )NzY[metadata]
version = attr: fake_package_simple.VERSION
[options]
package_dir =
    = src
zsrc/fake_package_simpler/   ry   r2   r7   r@   rA   rH   r|   r   r   r   $test_version_with_package_dir_simple0  s    


z1TestMetadata.test_version_with_package_dir_simplec              	   C   s:   t |ddd\}}t|}|jjdks,tW 5 Q R X d S )Nzr[metadata]
version = attr: fake_package_rename.VERSION
[options]
package_dir =
    fake_package_rename = fake_dir
Zfake_dirr~   ry   r   r|   r   r   r   $test_version_with_package_dir_rename>  s    


z1TestMetadata.test_version_with_package_dir_renamec              	   C   s:   t |ddd\}}t|}|jjdks,tW 5 Q R X d S )Nzx[metadata]
version = attr: fake_package_complex.VERSION
[options]
package_dir =
    fake_package_complex = src/fake_dir
zsrc/fake_dirr~   ry   r   r|   r   r   r   %test_version_with_package_dir_complexL  s    


z2TestMetadata.test_version_with_package_dir_complexc              	   C   s.   t |d t|dd}|  W 5 Q R X d S )Nz+[metadata]
name = fake_name
unknown = some
Frg   )r2   r7   r4   rd   r   r   r   test_unknown_meta_itemZ  s    
z#TestMetadata.test_unknown_meta_itemc              
   C   sD   t |d t|dd$}tt |  W 5 Q R X W 5 Q R X d S )Nz[metadata.some]
key = val
Frg   r2   r7   r8   r9   r   r4   rd   r   r   r   test_usupported_section_  s    
z$TestMetadata.test_usupported_sectionc              	   C   s   t dddg}t|d\}}|dd t|}t |jj|ksJtW 5 Q R X |d t|}t |jj|ks|tW 5 Q R X d S )Nrl   z#Programming Language :: Python :: 3rm   z+[metadata]
classifiers = file: classifiers
rq   z^Framework :: Django
Programming Language :: Python :: 3
Programming Language :: Python :: 3.5
z[metadata]
classifiers =
    Framework :: Django
    Programming Language :: Python :: 3
    Programming Language :: Python :: 3.5
)setr2   r   r   r7   r@   rq   rH   )rJ   r+   expectedrK   r0   r6   r   r   r   test_classifierse  s     


zTestMetadata.test_classifiersc              
   C   s:   t |d ttj t| W 5 Q R X W 5 Q R X d S )Nz%[metadata]
description = %(message)s
)r2   r8   r9   configparserInterpolationMissingOptionErrorr7   rM   r   r   r   test_interpolation  s    

zTestMetadata.test_interpolationc              	   C   s&   t |ddd t| W 5 Q R X d S )Nu$   [metadata]
description = éàïôñ
utf-8r.   r2   r7   rM   r   r   r   test_non_ascii_1  s    
zTestMetadata.test_non_ascii_1c              	   C   s"   t |d t| W 5 Q R X d S )Nz
# -*- coding: invalid
r   rM   r   r   r   test_non_ascii_3  s    

zTestMetadata.test_non_ascii_3c              	   C   s6   t |ddd t|}|jjdks(tW 5 Q R X d S )Nu8   # -*- coding: utf-8
[metadata]
description = éàïôñ
r   r   u
   éàïôñ)r2   r7   r@   r[   rH   rd   r   r   r   test_non_ascii_4  s    
zTestMetadata.test_non_ascii_4c              
   C   s<   t |ddd tt t| W 5 Q R X W 5 Q R X dS )z=
        Config files encoded not in UTF-8 will fail
        uJ   # vim: set fileencoding=iso-8859-15 :
[metadata]
description = éàïôñ
ziso-8859-15r   N)r2   r8   r9   UnicodeDecodeErrorr7   rM   r   r   r   test_not_utf8  s    
zTestMetadata.test_not_utf8z#4864)reasonc              
   C   sb   t |d d}tjt|d  t|}|j}W 5 Q R X W 5 Q R X |jdksPt|jdks^td S )NzG[metadata]
author-email = test@test.com
maintainer_email = foo@foo.com
z<Usage of dash-separated 'author-email' will not be supportedmatchrZ   zfoo@foo.com)	r2   r8   warnsr   r7   r@   rn   rH   r`   rJ   r+   msgr6   r@   r   r   r   test_warn_dash_deprecation  s    
z'TestMetadata.test_warn_dash_deprecationc              
   C   sb   t |d d}tjt|d  t|}|j}W 5 Q R X W 5 Q R X |jdksPt|jdks^td S )Nz5[metadata]
Name = foo
description = Some description
zAUsage of uppercase key 'Name' in 'metadata' will not be supportedr   ra   rV   )	r2   r8   r   r   r7   r@   r   rH   r[   r   r   r   r   test_make_option_lowercase  s    

z'TestMetadata.test_make_option_lowercaseN)r   r   r   rL   rc   re   ri   rr   rs   rx   r{   r}   r   r   r   r   r   r   r   r   r   r   r   r8   markZxfailr   r   r   r   r   r   rR   s   s0   %
"	
rR   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ddddddddgdd Zejdddddgd d! Zejdd"d#d$d%d&d'd(d)d*d+g
ejd,d-d. Zd/d0 Zd1d2 Zd3d4 Zd5d6 Zd7d8 Zd9d: Zd;d< Zd=d> Zd?d@ ZdAdB ZdCS )DTestOptionsc              
   C   s   t |d tjtdd}| t|}|js2t|js<t|jdddksPt|j	ddgksbt|j
d	d
gkstt|jddgkst|jddgkst|jdddgkst|jdddgkst|jdkst|jddgkstW 5 Q R X W 5 Q R X d S )Na  [options]
zip_safe = True
include_package_data = yes
package_dir = b=c, =src
packages = pack_a, pack_b.subpack
namespace_packages = pack1, pack2
scripts = bin/one.py, bin/two.py
eager_resources = bin/one.py, bin/two.py
install_requires = docutils>=0.3; pack ==1.1, ==1.3; hey
setup_requires = docutils>=0.3; spack ==1.1, ==1.3; there
dependency_links = http://some.com/here/1, http://some.com/there/2
python_requires = >=1.0, !=2.8
py_modules = module1, module2
namespace_packagesr   srccr   rk   pack_apack_b.subpackpack1pack2
bin/one.py
bin/two.pyhttp://some.com/here/1http://some.com/there/2docutils>=0.3pack==1.1,==1.3heyspack ==1.1, ==1.3therez>=1.0, !=2.8Zmodule1Zmodule2)r2   r8   r   r   r7   Zzip_saferH   Zinclude_package_datar1   packagesr   rG   dependency_linksinstall_requiressetup_requiresZpython_requires
py_modulesrJ   r+   Zdeprecr6   r   r   r   rL     s8    




zTestOptions.test_basicc              
   C   s   t |d tjtdd}| t|}|jdddks<t|jddgksNt|jd	d
gks`t|j	ddgksrt|j
ddgkst|jdddgkst|jdddgkstW 5 Q R X W 5 Q R X d S )Na  [options]
package_dir = 
  b=c
  =src
packages = 
  pack_a
  pack_b.subpack
namespace_packages = 
  pack1
  pack2
scripts = 
  bin/one.py
  bin/two.py
eager_resources = 
  bin/one.py
  bin/two.py
install_requires = 
  docutils>=0.3
  pack ==1.1, ==1.3
  hey
setup_requires = 
  docutils>=0.3
  spack ==1.1, ==1.3
  there
dependency_links = 
  http://some.com/here/1
  http://some.com/there/2
r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   )r2   r8   r   r   r7   r1   rH   r   r   rG   r   r   r   r   r   r   r   rs     s0    

zTestOptions.test_multilinec              
   C   sD   t |d t|dd$}tt |  W 5 Q R X W 5 Q R X d S )Nz[options]
package_dir = a b
Frg   r   rd   r   r   r   test_package_dir_fail)  s    
z!TestOptions.test_package_dir_failc              	   C   sV   t |d t|:}|jddgdgdks.t|jddgdgdksHtW 5 Q R X d S )	Nz}[options.package_data]
* = *.txt, *.rst
hello = *.msg

[options.exclude_package_data]
* = fake1.txt, fake2.txt
hello = *.dat
z*.txtz*.rstz*.msg)r   Zhelloz	fake1.txtz	fake2.txtz*.dat)r2   r7   package_datarH   Zexclude_package_datard   r   r   r   test_package_data/  s    
zTestOptions.test_package_datac              	   C   s2   t |d t|}|jdgks$tW 5 Q R X d S )N[options]
packages = find:
r%   )r2   r7   r   rH   rd   r   r   r   test_packagesE  s    

zTestOptions.test_packagesc              	   C   s   t |d\}}td|\}}td|\}}t|"}t|jtdddgksPtW 5 Q R X |d t|}|jdgks~tW 5 Q R X |d t| }t|jtddgkstW 5 Q R X d S )	Nr   sub_onesub_twor%   fake_package.sub_twofake_package.sub_onezi[options]
packages = find:

[options.packages.find]
where = .
include =
    fake_package.sub_one
    two
zW[options]
packages = find:

[options.packages.find]
exclude =
    fake_package.sub_one
r2   r#   r7   r   r   rH   r   rJ   r+   r!   r0   Zdir_sub_onerK   Zdir_sub_twor6   r   r   r   test_find_directiveK  s&    




zTestOptions.test_find_directivec              	   C   s   t |d\}}td|\}}td|dd\}}t|}t|jdddhksPtW 5 Q R X |d	 t|}|jdgks~tW 5 Q R X |d
 t|}t|jddhkstW 5 Q R X d S )Nz%[options]
packages = find_namespace:
r   r   T)r    r%   r   r   zs[options]
packages = find_namespace:

[options.packages.find]
where = .
include =
    fake_package.sub_one
    two
za[options]
packages = find_namespace:

[options.packages.find]
exclude =
    fake_package.sub_one
r   r   r   r   r   test_find_namespace_directivep  s,     



z)TestOptions.test_find_namespace_directivec              	   C   sV   t |d t|:}|jddgddgdks0tt|jjddhksHtW 5 Q R X d S )	Nz_[options.extras_require]
pdf = ReportLab>=1.2; RXP
rest = 
  docutils>=0.3
  pack ==1.1, ==1.3
zReportLab>=1.2ZRXPr   r   )pdfrestr   r   )r2   r7   extras_requirerH   r   r@   Zprovides_extrasrd   r   r   r   test_extras_require  s    	
zTestOptions.test_extras_requirer0   z5[options.extras_require]
foo = bar;python_version<'3'z3[options.extras_require]
foo = bar;os_name=='linux'z6[options.extras_require]
foo = bar;python_version<'3'
z4[options.extras_require]
foo = bar;os_name=='linux'
z3[options]
install_requires = bar;python_version<'3'z1[options]
install_requires = bar;os_name=='linux'z4[options]
install_requires = bar;python_version<'3'
z2[options]
install_requires = bar;os_name=='linux'
c              
   C   s@   t || d}tjt|d t|}W 5 Q R X W 5 Q R X d S NzoOne of the parsed requirements in `(install_requires|extras_require.+)` looks like a valid environment marker.*r   )r2   r8   r9   r   r7   rJ   r0   r+   r   rK   r   r   r   +test_raises_accidental_env_marker_misconfig  s    

z7TestOptions.test_raises_accidental_env_marker_misconfigz3[options.extras_require]
foo = bar;python_version<3z4[options.extras_require]
foo = bar;python_version<3
z1[options]
install_requires = bar;python_version<3z2[options]
install_requires = bar;python_version<3
c              
   C   s@   t || d}tjt|d t|}W 5 Q R X W 5 Q R X d S r   )r2   r8   r   r   r7   r   r   r   r   )test_warn_accidental_env_marker_misconfig  s    


z5TestOptions.test_warn_accidental_env_marker_misconfigz9[options.extras_require]
foo =
    bar;python_version<'3'z4[options.extras_require]
foo = bar;baz
boo = xxx;yyyz:[options.extras_require]
foo =
    bar;python_version<'3'
z5[options.extras_require]
foo = bar;baz
boo = xxx;yyy
z<[options.extras_require]
foo =
    bar
    python_version<3
z7[options]
install_requires =
    bar;python_version<'3'z2[options]
install_requires = bar;baz
boo = xxx;yyyz8[options]
install_requires =
    bar;python_version<'3'
z3[options]
install_requires = bar;baz
boo = xxx;yyy
z:[options]
install_requires =
    bar
    python_version<3
z.error::setuptools.SetuptoolsDeprecationWarningc              	   C   s:   t || t|}t|}W 5 Q R X t||ks6td S )N)r2   lenr7   rH   )rJ   r0   r+   ZrecwarnZnum_warningsrK   r   r   r   +test_nowarn_accidental_env_marker_misconfig  s
    


z7TestOptions.test_nowarn_accidental_env_marker_misconfigc              	   C   s:   t |d t|}|jdgdgdks,tW 5 Q R X d S )Nz2[options.extras_require]
foo-a = foo
foo_b = test
ra   test)zfoo-aZfoo_b)r2   r7   r   rH   rd   r   r   r   "test_dash_preserved_extras_require  s    

z.TestOptions.test_dash_preserved_extras_requirec              	   C   s   t |d\}}t| }|jddgdgdks2tW 5 Q R X d}|d| |d t|}|j|ksrtW 5 Q R X d S )	Nz[options.entry_points]
group1 = point1 = pack.module:func, .point2 = pack.module2:func_rest [rest]
group2 = point3 = pack.module:func2
point1 = pack.module:func'.point2 = pack.module2:func_rest [rest]point3 = pack.module:func2)Zgroup1group2zN[blogtool.parsers]
.rst = some.nested.module:SomeClass.some_classmethod[reST]
entry_pointsz,[options]
entry_points = file: entry_points
)r2   r7   r   rH   r   r   )rJ   r+   rK   r0   r6   r   r   r   r   test_entry_points  s"    
	

zTestOptions.test_entry_pointsc              	   C   s@   t |d\}}t| }|jddgdgdks2tW 5 Q R X d S )Nz[options.entry_points]
GROUP1 = point1 = pack.module:func, .point2 = pack.module2:func_rest [rest]
group2 = point3 = pack.module:func2
r   r   r   )ZGROUP1r   )r2   r7   r   rH   r|   r   r   r    test_case_sensitive_entry_points  s    
z,TestOptions.test_case_sensitive_entry_pointsc              	   C   sP   t |d t|4}dddgfdddgfg}t|jt|ksBtW 5 Q R X d S )NzQ[options.data_files]
cfg =
      a/b.conf
      c/d.conf
data = e/f.dat, g/h.dat
cfga/b.confc/d.confdataze/f.datzg/h.dat)r2   r7   sorted
data_filesrH   rJ   r+   r6   r   r   r   r   test_data_files!  s    	


zTestOptions.test_data_filesc              	   C   s   t |d |dd |dd |dd |dd |dd |dd |d	d |d
d |dd t|N}dddgfddddgfddddgfdd	d
dgfg}t|jt|kstW 5 Q R X d S )Nz[options.data_files]
cfg =
      a/b.conf
      c/d.conf
data = *.dat
icons = 
      *.ico
audio = 
      *.wav
      sounds.db
za.datr   zb.datzc.datza.icozb.icozc.icozbeep.wavzboop.wavz	sounds.dbr   r   r   r   Ziconsaudio)r2   r   r   r7   r   r   rH   r   r   r   r   test_data_files_globby2  s(    

z"TestOptions.test_data_files_globbyc              	   C   s.   t |td t|}|  W 5 Q R X d S )NzE
            [options]
            python_requires=>=2.7
            r2   r   r7   r4   rd   r   r   r   test_python_requires_simpleU  s    	
z'TestOptions.test_python_requires_simplec              	   C   s.   t |td t|}|  W 5 Q R X d S )NzM
            [options]
            python_requires=>=2.7,!=3.0.*
            r   rd   r   r   r   test_python_requires_compoundb  s    	
z)TestOptions.test_python_requires_compoundc              
   C   sD   t |td tt" t|}|  W 5 Q R X W 5 Q R X d S )NzG
            [options]
            python_requires=invalid
            )r2   r   r8   r9   	Exceptionr7   r4   rd   r   r   r   test_python_requires_invalido  s    	
z(TestOptions.test_python_requires_invalidc              	   C   s   t |d}|jjddd |jddd d}t|t| t|@}|jd }|j	d	ks^t
|jd
kslt
|t|st
W 5 Q R X d S )Nzsrc/custom_build.pyT)parentsexist_okzBfrom distutils.core import Command
class CustomCmd(Command): pass
r   r   zi
            [options]
            cmdclass =
                customcmd = custom_build.CustomCmd
        Z	customcmdZ	CustomCmdZcustom_build)r   parentr   
write_textr2   inspectcleandocr7   cmdclassr   rH   r   samefilegetfile)rJ   r+   module_pathr,   r6   r   r   r   r   test_cmdclass}  s    


zTestOptions.test_cmdclassc              	   C   sj   t |td |dd |dd t|*}|jdgksHt|jddgiks\tW 5 Q R X d S )Nz
            [options]
            install_requires = file:requirements.txt
            [options.extras_require]
            colors = file:requirements-extra.txt
            zrequirements.txtz
docutils>=0.3

zrequirements-extra.txtcoloramar   colors)r2   r   r   r   r7   r   rH   r   rd   r   r   r   test_requirements_file  s    
z"TestOptions.test_requirements_fileN)r   r   r   rL   rs   r   r   r   r   r   r   r8   r   Zparametrizer   r   filterwarningsr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r     sp   +4%'

	


#r   c                   @   s,   e Zd Zdd Zejeddddd ZdS )	TestExternalSettersc                 C   s$   t || d|j_ddd|j_d S )NrW   rt   ru   rv   )saved_dist_initr@   r\   rw   )rJ   r6   attrsr   r   r   _fake_distribution_init  s
    
z+TestExternalSetters._fake_distribution_init__init__T)Zautospecc                 C   sD   | j |_tdddiid}|jjdks*t|jjdddks@td S )	Nrw   Zwill_beZignored)r   rW   rt   ru   rv   )r   Zside_effectr	   r@   r\   rH   rw   )rJ   Zmock_parent_initr+   r6   r   r   r   test_external_setters  s    z)TestExternalSetters.test_external_settersN)r   r   r   r   r   objectr
   r   r   r   r   r   r     s   
r   )F)Nr$   r%   )NT)%r   
contextlibr   pathlibr   Zunittest.mockr   r   r8   Zpackaging.requirementsr   Zsetuptools.config.setupcfgr   r   r   Zsetuptools.distr	   r
   Zsetuptools.warningsr   textwrapr   distutils.errorsr   r   r   r#   r2   contextmanagerr7   r=   r>   rR   r   r   r   r   r   r   r   r   <module>   s<   
     
$  X   a