U
    ÇZj�µ  ã                   @   s  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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 d dlmZ d dlmZ ej ej eddd¡¡ZG dd	„ d	ejƒZG d
d„ dejƒZG dd„ dejƒZG dd„ dejƒZ G dd„ dej!ƒZ"G dd„ dej!ƒZ#G dd„ dej!ƒZ$G dd„ dej!ƒZ%G dd„ dej&ƒZ'G dd„ dej!ƒZ(G dd„ dej!ƒZ)G dd„ dej!ƒZ*G d d!„ d!ej!ƒZ+G d"d#„ d#ej!ƒZ,G d$d%„ d%ej!ƒZ-G d&d'„ d'ej!ƒZ.G d(d)„ d)ej!ƒZ/d*d+„ Z0dS ),é    N)Úmatchers)Ú	wheelfile)Úgit)Ú	packaging)Úbasez..c                       sF   e Zd ZdZ‡ fdd„Z‡ fdd„Zddd„Zd	d
„ Zdd„ Z‡  Z	S )ÚTestRepozäA git repo for testing with.

    Use of TempHomeDir with this fixture is strongly recommended as due to the
    lack of config --local in older gits, it will write to the users global
    configuration without TempHomeDir.
    c                    s   t t| ƒ ¡  || _d S ©N)Úsuperr   Ú__init__Ú_basedir)ÚselfZbasedir©Ú	__class__© ú[/var/www/html/TRUCKING_PROJECT/venv/lib/python3.8/site-packages/pbr/tests/test_packaging.pyr
   L   s    zTestRepo.__init__c                    sB   t t| ƒ ¡  t dddg| j¡ t ¡  t dddg| j¡ d S )Nr   ÚinitÚ.Úadd)r	   r   ÚsetUpr   Ú_run_cmdr   Z_config_git©r   r   r   r   r   P   s    zTestRepo.setUpútest commitc                 C   sZ   t t | j¡ƒ}| jd|  }t|dƒ ¡  t dd|g| j¡ t ddd|g| j¡ d S )Nz/%dÚwtr   r   Úcommitú-m)ÚlenÚosÚlistdirr   ÚopenÚcloser   r   )r   Úmessage_contentÚfilesÚpathr   r   r   r   V   s
    zTestRepo.commitc                 C   s   t  ddddg| j¡ d S )Nr   Úresetz--hardzHEAD^©r   r   r   r   r   r   r   Úuncommit]   s    zTestRepo.uncommitc                 C   s   t  dddd|g| j¡ d S )Nr   Útagz-smztest tagr$   ©r   Úversionr   r   r   r&   `   s     ÿzTestRepo.tag)r   )
Ú__name__Ú
__module__Ú__qualname__Ú__doc__r
   r   r   r%   r&   Ú__classcell__r   r   r   r   r   D   s   
r   c                       s    e Zd ZdZ‡ fdd„Z‡  ZS )ÚGPGKeyFixturezxCreates a GPG key for testing.

    It's recommended that this be used in concert with a unique home
    directory.
    c              	      s*  t t| ƒ ¡  |  t ¡ ¡}t d¡}t 	ddg|j
¡}|d  d¡D ]>}| |¡}|rFt| d¡ƒt| d¡ƒt| d¡ƒf} q’qF|d kr’d	}tj
 |j
d
¡}t|dƒ�2}|d dkrÐ|d dkrÐ| d¡ | d¡ W 5 Q R X |d dkröd}n|d dk�r
d}nd}t 	ddd||g|j
¡ d S )Nz#^gpg\s.*\s([\d+])\.([\d+])\.([\d+])Zgpgz	--versionr   Ú
é   é   é   )r   r   r   z
key-configr   zO
                %no-protection
                %transient-key
                a  
            %no-ask-passphrase
            Key-Type: RSA
            Name-Real: Example Key
            Name-Comment: N/A
            Name-Email: example@example.com
            Expire-Date: 2d
            Preferences: (setpref)
            %commit
            z--quick-randomz--debug-quick-randomÚ z	--gen-keyz--batch)r	   r.   r   Ú
useFixtureÚfixturesÚTempDirÚreÚcompiler   r   r"   ÚsplitÚmatchÚintÚgroupr   Újoinr   Úwrite)r   ÚtempdirZgnupg_version_reZgnupg_versionÚlineÚconfig_fileÚfZgnupg_randomr   r   r   r   l   s8    

þ
þzGPGKeyFixture.setUp)r)   r*   r+   r,   r   r-   r   r   r   r   r.   e   s   r.   c                   @   s"   e Zd ZdZddd„Zdd„ ZdS )	ÚVenvzªCreate a virtual environment for testing with.

    :attr path: The path to the environment root.
    :attr python: The path to the python binary in the environment.
    r   Nc                 C   sF   || _ |dkr dt }dd|g}|| _|dkr<dddg| _n|| _dS )až  Create a Venv fixture.

        :param reason: A human readable string to bake into the venv
            file path to aid diagnostics in the case of failures.
        :param modules: A list of modules to install, defaults to latest
            pip, wheel, and the working copy of PBR.
        :attr pip_cmd: A list to override the default pip_cmd passed to
            python for installing base packages.
        r   zfile://%s#egg=pbrÚpipÚwheelNr   Úinstall)Ú_reasonÚPBR_ROOTÚmodulesÚpip_cmd)r   ÚreasonrI   rJ   Úpbrr   r   r   r
   ¤   s    

zVenv.__init__c                 C   s¨   |   t ¡ ¡j}tj|dd� tj |dd¡}|g| j dg }| j	rxt
| j	ƒdkrx| | j	¡ |   t d| j |¡¡ |  t| d¡ |  t| d¡ || _|| _||fS )	NT)ÚclearÚbinÚpythonz-Ur   zmkvenv-r"   )r4   r5   r6   r"   Ú
virtualenvZcreate_environmentr   r=   rJ   rI   r   Úextendr   ZCapturedSubprocessrG   Ú
addCleanupÚdelattrrO   )r   r"   rO   Úcommandr   r   r   Ú_setUp¸   s     ÿzVenv._setUp)r   N)r)   r*   r+   r,   r
   rU   r   r   r   r   rC   �   s   
rC   c                   @   sJ   e Zd ZdZe e d¡¡e e d¡¡dœZdd„ Z	dd„ Z
d	d
„ ZdS )ÚCreatePackageszÆCreates packages from dict with defaults

        :param package_dirs: A dict of package name to directory strings
        {'pkg_a': '/tmp/path/to/tmp/pkg_a', 'pkg_b': '/tmp/path/to/tmp/pkg_b'}
    z¶            #!/usr/bin/env python
            import setuptools
            setuptools.setup(
                setup_requires=['pbr'],
                pbr=True,
            )
        z=            [metadata]
            name = {pkg_name}
        ©úsetup.pyú	setup.cfgc                 C   s
   || _ dS )aX  Creates packages from dict with defaults

            :param packages: a dict where the keys are the package name and a
            value that is a second dict that may be empty, containing keys of
            filenames and a string value of the contents.
            {'package-a': {'requirements.txt': 'string', 'setup.cfg': 'string'}
        N)Úpackages)r   rZ   r   r   r   r
   Þ   s    zCreatePackages.__init__c              	   C   sl   t j t j ||¡¡}t j |¡}t j |¡sH| |¡rDt  |¡ nt‚t	|dƒ�}| 
|¡ W 5 Q R X d S )Nr   )r   r"   Úabspathr=   ÚdirnameÚexistsÚ
startswithÚmakedirsÚ
ValueErrorr   r>   )r   Ú	directoryÚ	file_nameÚcontentsr"   Zpath_dirrB   r   r   r   Ú
_writeFileè   s    
zCreatePackages._writeFilec                 C   sÜ   |   t ¡ ¡j}i }| jD ]¨}tj ||¡}|||< t |¡ dD ]D}|| j| krf| j|  |¡}n| j	| j
|d�}|  |||¡ qB| j| D ]}|  ||| j| | ¡ q’|   t|ƒ¡ ¡  q|  t| d¡ || _|S )NrW   )Úpkg_nameÚpackage_dirs)r4   r5   r6   r"   rZ   r   r=   ÚmkdirÚpopÚdefaultsÚformatrd   r   r   rR   rS   rf   )r   Ztmpdirrf   re   Zpkg_pathÚcfrc   r   r   r   rU   ó   s"    

zCreatePackages._setUpN)r)   r*   r+   r,   ÚtextwrapÚdedentÚsixÚuri   r
   rd   rU   r   r   r   r   rV   È   s   ÷
rV   c                       sp   e Zd Zdedd�fdedd�fgZ‡ fdd„Zdd	„ Zd
d„ Zdd„ Zdd„ Z	dd„ Z
dd„ Zdd„ Z‡  ZS )Ú TestPackagingInGitRepoWithCommitÚpreversionedT©rq   ÚpostversionedFc                    s.   t t| ƒ ¡  |  t| jƒ¡| _| j ¡  d S r   )r	   rp   r   r4   r   Úpackage_dirÚrepor   r   r   r   r   r     s    z&TestPackagingInGitRepoWithCommit.setUpc              	   C   sH   | j ddd� ttj | jd¡dƒ�}| ¡ }W 5 Q R X |  |d¡ d S )NÚsdistF©Ú
allow_failÚAUTHORSÚrr3   ©Ú	run_setupr   r   r"   r=   rt   ÚreadZassertNotEqual©r   rB   Úbodyr   r   r   Útest_authors  s    z-TestPackagingInGitRepoWithCommit.test_authorsc              	   C   sH   | j ddd� ttj | jd¡dƒ�}| ¡ }W 5 Q R X |  |d¡ d S )Nrv   Frw   Ú	ChangeLogrz   r3   r{   r~   r   r   r   Útest_changelog  s    z/TestPackagingInGitRepoWithCommit.test_changelogc              	   C   sV   | j jdd� | jddd� ttj | jd¡dƒ�}| ¡ }W 5 Q R X |  	d|¡ d S )	NzAllow *.openstack.org to work©r    rv   Frw   r�   rz   z\*©
ru   r   r|   r   r   r"   r=   rt   r}   ÚassertInr~   r   r   r   Útest_changelog_handles_astrisk#  s
    z?TestPackagingInGitRepoWithCommit.test_changelog_handles_astriskc              	   C   sn   | j jdd� | jddd� ttj | jd¡dƒ�}| ¡ }W 5 Q R X |  	d|¡ |  	d	|¡ |  	d
|¡ d S )NzSee os_ for to_do about qemu_.rƒ   rv   Frw   r�   rz   zos\_zto\_dozqemu\_r„   r~   r   r   r   Ú+test_changelog_handles_dead_links_in_commit*  s    zLTestPackagingInGitRepoWithCommit.test_changelog_handles_dead_links_in_commitc              	   C   sV   | j jdd� | jddd� ttj | jd¡dƒ�}| ¡ }W 5 Q R X |  	d|¡ d S )	NzAllow `openstack.org` to `workrƒ   rv   Frw   r�   rz   z\`r„   r~   r   r   r   Ú test_changelog_handles_backticks3  s
    zATestPackagingInGitRepoWithCommit.test_changelog_handles_backticksc              	   C   sf   | j ddd� ttj | jd¡dƒ�}| ¡ }W 5 Q R X |  |t 	t 
d¡¡¡ |  |t 
d¡¡ d S )Nrv   Frw   z$pbr_testpackage.egg-info/SOURCES.txtrz   zpbr_testpackage/extra.pyzpbr_testpackage/__init__.py)r|   r   r   r"   r=   rt   r}   Ú
assertThatr   ÚNotÚContainsr~   r   r   r   Útest_manifest_exclude_honoured:  s    þþ ÿz?TestPackagingInGitRepoWithCommit.test_manifest_exclude_honouredc                 C   s4   | j dd| jd dd�\}}}|  |t d¡¡ d S ©NrF   ú--rootÚ	installedFrw   zGenerating ChangeLog©r|   Útemp_dirÚ
expectThatr   r‹   ©r   ÚstdoutÚ_r   r   r   Útest_install_writes_changelogD  s      þz>TestPackagingInGitRepoWithCommit.test_install_writes_changelog)r)   r*   r+   ÚdictÚ	scenariosr   r€   r‚   r†   r‡   rˆ   rŒ   r–   r-   r   r   r   r   rp   	  s   þ	
rp   c                   @   s   e Zd Zdd„ ZdS )ÚTestExtrafileInstallationc                 C   sF   | j dd| jd dd�\}}}|  |t d¡¡ |  |t d¡¡ d S )NrF   rŽ   r�   Frw   zcopying data_files/a.txtzcopying data_files/b.txtr�   r“   r   r   r   Útest_install_globL  s      þ ÿ ÿz+TestExtrafileInstallation.test_install_globN)r)   r*   r+   rš   r   r   r   r   r™   K  s   r™   c                       s,   e Zd Z‡ fdd„Zdd„ Zdd„ Z‡  ZS )Ú#TestPackagingInGitRepoWithoutCommitc                    s0   t t| ƒ ¡  |  t| jƒ¡ | jddd� d S )Nrv   Frw   )r	   r›   r   r4   r   rt   r|   r   r   r   r   r   X  s    z)TestPackagingInGitRepoWithoutCommit.setUpc              	   C   s:   t tj | jd¡dƒ�}| ¡ }W 5 Q R X |  d|¡ d S )Nry   rz   r/   ©r   r   r"   r=   rt   r}   ÚassertEqualr~   r   r   r   r€   ]  s    z0TestPackagingInGitRepoWithoutCommit.test_authorsc              	   C   s:   t tj | jd¡dƒ�}| ¡ }W 5 Q R X |  d|¡ d S )Nr�   rz   zCHANGES
=======

rœ   r~   r   r   r   r‚   c  s    z2TestPackagingInGitRepoWithoutCommit.test_changelog)r)   r*   r+   r   r€   r‚   r-   r   r   r   r   r›   V  s   r›   c                       s,   e Zd Z‡ fdd„Zdd„ Zdd„ Z‡  ZS )ÚTestPackagingWheelsc                    s–   t t| ƒ ¡  |  t| jƒ¡ | jddd� tj 	| jd¡}t 
|¡d }tj 	||¡}t |¡}|j d¡}tj 	||¡| _| | j¡ | ¡  d S )NÚbdist_wheelFrw   Údistr   Znamever)r	   rž   r   r4   r   rt   r|   r   r"   r=   r   r   Z	WheelFileZparsed_filenamer<   Úextracted_wheel_dirÚ
extractallr   )r   Údist_dirZrelative_wheel_filenameZabsolute_wheel_filenameÚ
wheel_fileÚ
wheel_namer   r   r   r   l  s     ÿ
zTestPackagingWheels.setUpc                 C   s`   t j | jd¡}|  t j |¡¡ t  |¡}|  d|¡ |  d|¡ |  d|¡ |  d|¡ d S )Nz pbr_testpackage-0.0.data/scriptsZpbr_test_wsgiZpbr_test_wsgi_with_classZpbr_test_cmdZpbr_test_cmd_with_class)	r   r"   r=   r¡   Ú
assertTruer]   r   r…   ZassertNotIn)r   Zscripts_dirÚscriptsr   r   r   Ú$test_data_directory_has_wsgi_scripts~  s     ÿ
z8TestPackagingWheels.test_data_directory_has_wsgi_scriptsc                 C   s^   t j | jd¡}d}tƒ }|r(d |¡}t j ||¡}|  t j |¡¡ |  t j |¡¡ d S )NÚpbr_testpackagez
testext.soztestext.{0}.so)r   r"   r=   r¡   Ú	get_soabirj   r¦   r]   )r   Zbuilt_package_dirZstatic_object_filenameÚsoabiZstatic_object_pathr   r   r   Útest_generates_c_extensionsŠ  s     ÿ
 ÿz/TestPackagingWheels.test_generates_c_extensions)r)   r*   r+   r   r¨   r¬   r-   r   r   r   r   rž   j  s   rž   c                   @   s   e Zd Zdd„ Zdd„ ZdS )ÚTestPackagingHelpersc                 C   s@   d}t jdddd�}d}d}t ||||¡}d}|  ||¡ d S )	NÚconsole_scriptsútest-epúpbr.packaging)ZLocalInstallScripts©ÚnameÚmodule_nameÚattrsú#!/usr/bin/env fake-header
ú=%(group)s %(module_name)s %(import_target)s %(invoke_target)sz`#!/usr/bin/env fake-header
console_scripts pbr.packaging LocalInstallScripts LocalInstallScripts)Úpkg_resourcesÚ
EntryPointr   Úgenerate_scriptr�   )r   r<   Úentry_pointÚheaderÚtemplateZgenerated_scriptZexpected_scriptr   r   r   Útest_generate_scriptš  s"    ý   ÿÿz)TestPackagingHelpers.test_generate_scriptc                 C   sZ   d}t jddd�}d}d}|  ttj||||¡ t jdddd�}|  ttj||||¡ d S )	Nr®   r¯   r°   )r²   r³   rµ   r¶   )Zattr1Zattr2Zattr3r±   )r·   r¸   ÚassertRaisesr`   r   r¹   )r   r<   rº   r»   r¼   r   r   r   Ú+test_generate_script_validates_expectations­  s8    þ    þý    þz@TestPackagingHelpers.test_generate_script_validates_expectationsN)r)   r*   r+   r½   r¿   r   r   r   r   r­   ˜  s   r­   c                       s4   e Zd Z‡ fdd„Zdd„ Zdd„ Zdd„ Z‡  ZS )	ÚTestPackagingInPlainDirectoryc                    s   t t| ƒ ¡  d S r   )r	   rÀ   r   r   r   r   r   r   Ä  s    z#TestPackagingInPlainDirectory.setUpc                 C   s4   | j ddd� tj | jd¡}|  tj |¡¡ d S )Nrv   Frw   ry   ©r|   r   r"   r=   rt   ZassertFalser]   ©r   Úfilenamer   r   r   r€   Ç  s    z*TestPackagingInPlainDirectory.test_authorsc                 C   s4   | j ddd� tj | jd¡}|  tj |¡¡ d S )Nrv   Frw   r�   rÁ   rÂ   r   r   r   r‚   Í  s    z,TestPackagingInPlainDirectory.test_changelogc                 C   s:   | j dd| jd dd�\}}}|  |t t d¡¡¡ d S r�   )r|   r‘   r’   r   rŠ   r‹   r“   r   r   r   Útest_install_no_ChangeLogÓ  s      þ ÿz7TestPackagingInPlainDirectory.test_install_no_ChangeLog)r)   r*   r+   r   r€   r‚   rÄ   r-   r   r   r   r   rÀ   Â  s   rÀ   c                   @   s   e Zd Zdd„ Zdd„ ZdS )ÚTestPresenceOfGitc              	   C   s4   t j td¡�}d|_|  dt ¡ ¡ W 5 Q R X d S )NÚ_run_shell_commandzgit version 1.8.4.1T)ÚmockÚpatchÚobjectr   Zreturn_valuer�   Ú_git_is_installed©r   Z_commandr   r   r   ÚtestGitIsInstalledÝ  s    ÿz$TestPresenceOfGit.testGitIsInstalledc              	   C   s4   t j td¡�}t|_|  dt ¡ ¡ W 5 Q R X d S )NrÆ   F)rÇ   rÈ   rÉ   r   ÚOSErrorÚside_effectr�   rÊ   rË   r   r   r   ÚtestGitIsNotInstalledã  s    ÿz'TestPresenceOfGit.testGitIsNotInstalledN)r)   r*   r+   rÌ   rÏ   r   r   r   r   rÅ   Û  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S )ÚParseRequirementsTestc                 C   s   t  g ¡}|  g |¡ d S r   )r   Úparse_requirementsr�   )r   Úactualr   r   r   Útest_empty_requirementsì  s    
z-ParseRequirementsTest.test_empty_requirementsc              	   C   sn   t  ¡ }tj |d¡}t|dƒ�}| d¡ W 5 Q R X tj 	t
d|f¡� t
 ¡ }W 5 Q R X |  dg|¡ dS )z/Ensure default files used if no files provided.úrequirements.txtÚwrL   ZREQUIREMENTS_FILESN)ÚtempfileÚmkdtempr   r"   r=   r   r>   rÇ   rÈ   rÉ   r   rÑ   r�   ©r   r?   ÚrequirementsrB   Úresultr   r   r   Útest_default_requirementsð  s    
ÿz/ParseRequirementsTest.test_default_requirementsc              	   C   s\   t jddd�\}}t|dƒ�}| d¡ W 5 Q R X |  t d|¡¡ |  ddgt 	¡ ¡ d	S )
z6Ensure environment variable used if no files provided.Ú	openstackú.setup©ÚprefixÚsuffixrÕ   úfoo
barÚPBR_REQUIREMENTS_FILESÚfooÚbarN©
rÖ   Úmkstempr   r>   r4   r5   ZEnvironmentVariabler�   r   rÑ   ©r   r•   Útmp_fileÚfhr   r   r   Útest_override_with_envþ  s    
ÿ
ÿz,ParseRequirementsTest.test_override_with_envc              	   C   s`   t jddd�\}}t|dƒ�}| d¡ W 5 Q R X |  t dd| ¡¡ |  dd	gt 	¡ ¡ d S )
NrÜ   rÝ   rÞ   rÕ   rá   râ   zno-such-file,rã   rä   rå   rç   r   r   r   Ú%test_override_with_env_multiple_files  s    ÿÿ
ÿz;ParseRequirementsTest.test_override_with_env_multiple_filesc              	   C   s|   t  ¡ }tj |d¡}t|dƒ�8}| d¡ | d¡ | d¡ | d¡ | d¡ W 5 Q R X t |g¡}|  	dg|¡ d S )	NrÔ   rÕ   z-i https://myindex.local
z$  --index-url https://myindex.local
z) --extra-index-url https://myindex.local
z#--find-links https://myindex.local
zarequirement>=1.0
zarequirement>=1.0©
rÖ   r×   r   r"   r=   r   r>   r   rÑ   r�   rØ   r   r   r   Útest_index_present  s    



z(ParseRequirementsTest.test_index_presentc              	   C   s†   t  ¡ }tj |d¡}tj |d¡}t|dƒ�}| d| ¡ W 5 Q R X t|dƒ�}| d¡ W 5 Q R X t |g¡}|  	dg|¡ d S )NrÔ   z
nested.txtrÕ   z-r rL   rì   )r   r?   rÙ   ÚnestedrB   rÚ   r   r   r   Útest_nested_requirements  s    z.ParseRequirementsTest.test_nested_requirementsN)	r)   r*   r+   rÓ   rÛ   rê   rë   rí   rï   r   r   r   r   rÐ   ê  s   

rÐ   c                   @   sà   e Zd ZdddgdœfdddgdœfgZdd	difd
d	difgZddddgdœfddddgdœfddg dœfgZee dddifdddifdddifgee¡ Zee ddddœfgdddifdddifgee¡ Zdd „ Zd!S )"ÚParseRequirementsTestScenariosznon-versionedFrä   )Ú	versionedÚexpectedrñ   Tz
bar>=1.2.3znon-subdirectoryÚhas_subdirectoryzhas-subdirectoryÚnormalrá   rã   )Úurlrò   Znormal_with_commentsz-# this is a comment
foo
# and another one
barZremoves_index_linesz	-f foobarZssh_egg_urlrõ   z!git+ssh://foo.com/zipball#egg=barZgit_https_egg_urlz#git+https://foo.com/zipball#egg=barZhttp_egg_urlzhttps://foo.com/zipball#egg=barZgit_egg_urlúgit://foo.com/zipball#egg=bar)rõ   r²   znon-editableÚeditablec              	   C   s”   t  ¡ }| j}t| dƒr&| jr&d| }t| dƒr>| jr>d| }t| dƒrV| jrVd| }t|jdƒ�}| 	|¡ W 5 Q R X |  
| jt |jg¡¡ d S )Nr÷   z-e %srñ   z%s-1.2.3ró   z%s&subdirectory=bazrÕ   )rÖ   ÚNamedTemporaryFilerõ   Úhasattrr÷   rñ   ró   r   r²   r>   r�   rò   r   rÑ   )r   rè   Ú
req_stringré   r   r   r   Útest_parse_requirementsN  s    ÿz6ParseRequirementsTestScenarios.test_parse_requirementsN)	r)   r*   r+   Zversioned_scenariosZsubdirectory_scenariosr˜   ÚtestscenariosZmultiply_scenariosrû   r   r   r   r   rð   *  sB   þ

þþû


ý üÿÿ

þ ø
rð   c                       s,   e Zd Z‡ fdd„Zdd„ Zdd„ Z‡  ZS )ÚParseDependencyLinksTestc                    s&   t t| ƒ ¡  tjddd�\}| _d S )NrÜ   rÝ   rÞ   )r	   rý   r   rÖ   ræ   rè   )r   r•   r   r   r   r   _  s    ÿzParseDependencyLinksTest.setUpc              	   C   s>   t | jdƒ�}| d¡ W 5 Q R X |  dgt | jg¡¡ d S )NrÕ   zhttp://test.com
zhttp://test.com©r   rè   r>   r�   r   Úparse_dependency_links©r   ré   r   r   r   Útest_parse_dependency_normald  s    þz5ParseDependencyLinksTest.test_parse_dependency_normalc              	   C   s>   t | jdƒ�}| d¡ W 5 Q R X |  dgt | jg¡¡ d S )NrÕ   z -e git://foo.com/zipball#egg=barrö   rþ   r   r   r   r   Ú&test_parse_dependency_with_git_egg_urlk  s    þz?ParseDependencyLinksTest.test_parse_dependency_with_git_egg_url)r)   r*   r+   r   r  r  r-   r   r   r   r   rý   ]  s   rý   c                       sä   e Zd Zdedd�fdedd�fgZ‡ f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‡ fd0d1„Z‡  ZS )2ÚTestVersionsrq   Trr   rs   Fc                    sB   t t| ƒ ¡  |  t| jƒ¡| _|  tƒ ¡ |  t 	| j¡¡ d S r   )
r	   r  r   r4   r   rt   ru   r.   r   ZDiveDirr   r   r   r   r   z  s    zTestVersions.setUpc              
   C   sp   t  ¡ }t  d|¡�< t  d¡�&}tj d¡ddig|_t d¡}W 5 Q R X W 5 Q R X |  	|j
¡ |  |¡ d S )Nzpbr.packaging.openzemail.message_from_fileZTestÚNamer©   )rÇ   Z	mock_openrÈ   ÚemailÚerrorsÚMessageErrorrÎ   r   Z_get_version_from_pkg_metadatar¦   ZcalledZassertIsNone)r   Zmocked_openÚmessage_from_filer(   r   r   r   Ú%test_email_parsing_errors_are_handled€  s    
þÿz2TestVersions.test_email_parsing_errors_are_handledc                 C   s@   | j  ¡  | j  d¡ | j  d¡ t ¡ }|  |t d¡¡ d S )Nú1.2.3úSem-Ver: api-breakú
2.0.0.dev1©ru   r   r&   r   Ú_get_version_from_gitr‰   r   Ú
StartsWithr'   r   r   r   Útest_capitalized_headers�  s
    
z%TestVersions.test_capitalized_headersc                 C   s@   | j  ¡  | j  d¡ | j  d¡ t ¡ }|  |t d¡¡ d S )Nr
  zSem-ver: api-breakr  r  r'   r   r   r   Ú test_capitalized_headers_partial”  s
    
z-TestVersions.test_capitalized_headers_partialc                 C   s0   | j  ¡  | j  d¡ t d¡}|  d|¡ d S )Nr
  ©ru   r   r&   r   r  r�   r'   r   r   r   Ú#test_tagged_version_has_tag_version›  s    

z0TestVersions.test_tagged_version_has_tag_versionc                 C   s.   | j  ¡  | j  d¡ t ¡ }|  d|¡ d S )Nú	1.2.3-rc2z
1.2.3.0rc2r  r'   r   r   r   Ú4test_tagged_version_with_semver_compliant_prerelease¡  s    
zATestVersions.test_tagged_version_with_semver_compliant_prereleasec                 C   s@   | j  ¡  | j  d¡ | j  d¡ t ¡ }|  |t d¡¡ d S )Nz1.4r  r  r  r'   r   r   r   Ú&test_non_canonical_tagged_version_bump§  s
    
z3TestVersions.test_non_canonical_tagged_version_bumpc                 C   s>   | j  ¡  | j  d¡ | j  ¡  t ¡ }|  |t d¡¡ d S )Nr
  ú
1.2.4.dev1r  r'   r   r   r   Ú1test_untagged_version_has_dev_version_postversion®  s
    

z>TestVersions.test_untagged_version_has_dev_version_postversionc                 C   s>   | j  ¡  | j  d¡ | j  ¡  t ¡ }|  |t d¡¡ d S )Nú	1.2.3.0a1ú1.2.3.0a2.dev1r  r'   r   r   r   Ú9test_untagged_pre_release_has_pre_dev_version_postversionµ  s
    

zFTestVersions.test_untagged_pre_release_has_pre_dev_version_postversionc                 C   s@   | j  ¡  | j  d¡ | j  d¡ t ¡ }|  |t d¡¡ d S )Nr
  úsem-ver: deprecationz
1.3.0.dev1r  r'   r   r   r   Ú test_untagged_version_minor_bump¼  s
    
z-TestVersions.test_untagged_version_minor_bumpc                 C   s@   | j  ¡  | j  d¡ | j  d¡ t ¡ }|  |t d¡¡ d S )Nr
  úsem-ver: api-breakr  r  r'   r   r   r   Ú test_untagged_version_major_bumpÃ  s
    
z-TestVersions.test_untagged_version_major_bumpc                 C   s@   | j  ¡  | j  d¡ | j  ¡  t d¡}|  |t d¡¡ d S )Nr
  ú1.2.5ú
1.2.5.dev1r  r'   r   r   r   Ú0test_untagged_version_has_dev_version_preversionÊ  s
    


z=TestVersions.test_untagged_version_has_dev_version_preversionc                 C   s@   | j  ¡  | j  d¡ | j  ¡  t d¡}|  |t d¡¡ d S )Nr  r   r!  r  r'   r   r   r   Ú:test_untagged_version_after_pre_has_dev_version_preversionÑ  s
    


zGTestVersions.test_untagged_version_after_pre_has_dev_version_preversionc                 C   s@   | j  ¡  | j  d¡ | j  ¡  t d¡}|  |t d¡¡ d S )Nr  r
  r  r  r'   r   r   r   Ú9test_untagged_version_after_rc_has_dev_version_preversionØ  s
    


zFTestVersions.test_untagged_version_after_rc_has_dev_version_preversionc                 C   s8   | j  ¡  | j  d¡ | j  ¡  t ¡ }|  d|¡ d S )Nr  z1.2.3.0rc3.dev1r  r'   r   r   r   Ú;test_untagged_version_after_semver_compliant_prerelease_tagß  s
    

zHTestVersions.test_untagged_version_after_semver_compliant_prerelease_tagc                 C   sL   | j  ¡  | j  d¡ | j  ¡  |  ttjd¡}|  |jd t	 
d¡¡ d S )Nr
  r   úgit history©ru   r   r&   r¾   r`   r   r  r‰   Úargsr   r  ©r   Úerrr   r   r   Útest_preversion_too_low_simpleæ  s    

  ÿz+TestVersions.test_preversion_too_low_simplec                 C   sN   | j  ¡  | j  d¡ | j  d¡ |  ttjd¡}|  |jd t	 
d¡¡ d S )Nr
  úsem-ver: featurez1.2.4r   r&  r'  r)  r   r   r   Ú&test_preversion_too_low_semver_headersò  s    
  ÿz3TestVersions.test_preversion_too_low_semver_headersc                    s:   ‡fdd„‰ ‡ ‡fdd„}|dƒ ˆj  d¡ |dƒ d S )Nc                    s   ˆ j jd }t || ¡S )Nz/.git)ru   r   r   Z_get_increment_kwargs)r&   Úgit_dirr   r   r   Ú
get_kwargs  s    z=TestVersions.test_get_kwargs_corner_cases.<locals>.get_kwargsc                    sÜ   ˆj  ¡  ˆ tƒ ˆ | ƒ¡ ˆj  d¡ ˆ tƒ ˆ | ƒ¡ ˆj  d¡ ˆ tdd�ˆ | ƒ¡ ˆj  ¡  ˆj  d¡ ˆ tdd�ˆ | ƒ¡ ˆj  ¡  ˆj  d¡ ˆ tdd�ˆ | ƒ¡ ˆj  d¡ ˆ tddd�ˆ | ƒ¡ d S )	Nzsem-ver: bugfixr,  T)Úminorr  r  )Úmajor)r1  r0  )ru   r   r�   r—   r%   )r&   ©r/  r   r   r   Ú_check_combinations  s    


zFTestVersions.test_get_kwargs_corner_cases.<locals>._check_combinationsr3   r
  )ru   r&   )r   r3  r   r2  r   Útest_get_kwargs_corner_casesþ  s
    z)TestVersions.test_get_kwargs_corner_casesc                 C   s†  | j  ¡  | j  d¡ | j  ¡  | j  d¡ t ¡ }|  |t d¡¡ | j  ¡  t ¡ }|  |t d¡¡ | j  ¡  | j  d¡ | j  ¡  | j  d¡ t ¡ }|  |t d¡¡ | j  ¡  | j  d¡ | j  ¡  | j  d	¡ t ¡ }|  |t d
¡¡ | j  ¡  | j  d¡ | j  ¡  | j  d¡ t ¡ }|  |t d¡¡ | j  ¡  | j  d¡ | j  ¡  | j  d¡ t ¡ }|  |t d¡¡ d S )NÚ1Zbadverz
1.0.1.dev1z
1.0.1.dev2z1.2Zbadver2z
1.2.1.dev1r
  Zbadver3r  z	1.2.4.0a1Zbadver4z1.2.4.0a2.dev1Ú2znon-release-tag/2014.12.16-1z
2.0.1.dev1r  r'   r   r   r   Útest_invalid_tag_ignored  sB    










z%TestVersions.test_invalid_tag_ignoredc                 C   s.   | j  ¡  | j  d¡ t ¡ }|  d|¡ d S )Nz	1.3.0.0a1r  r'   r   r   r   Útest_valid_tag_honouredC  s    
z$TestVersions.test_valid_tag_honouredc                 C   s:   | j  ¡  | j  d¡ dtjd< t d¡}|  d|¡ d S )Nr
  r5  ÚSKIP_WRITE_GIT_CHANGELOG)ru   r   r&   r   Úenvironr   r  r�   r'   r   r   r   Útest_skip_write_git_changelogL  s
    


z*TestVersions.test_skip_write_git_changelogc                    s    t t| ƒ ¡  tj dd ¡ d S )Nr9  )r	   r  ÚtearDownr   r:  rh   r   r   r   r   r<  T  s    zTestVersions.tearDown)r)   r*   r+   r—   r˜   r   r	  r  r  r  r  r  r  r  r  r  r"  r#  r$  r%  r+  r-  r4  r7  r8  r;  r<  r-   r   r   r   r   r  s  s2   þ+	r  c                   @   s   e Zd Zdd„ ZdS )ÚTestRequirementParsingc              	   C   sú   dt  d¡t  d¡dœi}|  t|ƒ¡j}|d }ddgdgdd	gd
gddgdœ}|  tdƒ¡}|j}| j|dd|d� tj	 
|d¡}tj	 
|d¡}t|dƒ�}	tt |	¡ƒ}
W 5 Q R X | ¡ D ]4\}}dd„ |D ƒ}dd„ |
| D ƒ}|  ||¡ qÀd S )NZtest_reqparseaD                          bar
                        quux<1.0; python_version=='2.6'
                        requests-aws>=0.1.4    # BSD License (3 clause)
                        Routes>=1.12.3,!=2.0,!=2.1;python_version=='2.7'
                        requests-kerberos>=0.6;python_version=='2.7' # MIT
                    aP                          [metadata]
                        name = test_reqparse

                        [extras]
                        test =
                            foo
                            baz>3.2 :python_version=='2.7' # MIT
                            bar>3.3 :python_version=='2.7' # MIT # Apache
                    )rÔ   rY   rä   zrequests-aws>=0.1.4zquux<1.0zRoutes!=2.0,!=2.1,>=1.12.3zrequests-kerberos>=0.6rã   zbaz>3.2zbar>3.3)Nz:(python_version=='2.6')z:(python_version=='2.7')Útestztest:(python_version=='2.7')ZreqParse)rX   rŸ   F)rx   Úcwdztest_reqparse.egg-infozrequires.txtÚrtc                 S   s   g | ]}t j |¡‘qS r   ©r·   ÚRequirementÚparse©Ú.0Úsr   r   r   Ú
<listcomp>�  s   ÿzCTestRequirementParsing.test_requirement_parsing.<locals>.<listcomp>c                 S   s   g | ]}t j |¡‘qS r   rA  rD  r   r   r   rG  ”  s   ÿ)rl   rm   r4   rV   rf   rC   rO   r   r   r"   r=   r   r—   r·   Úsplit_sectionsÚitemsr�   )r   ÚpkgsZpkg_dirsZpkg_dirZexpected_requirementsÚvenvZ
bin_pythonÚegg_infoZrequires_txtÚrequiresZgenerated_requirementsÚsectionrò   Z
exp_parsedZ
gen_parsedr   r   r   Útest_requirement_parsing[  sF    øþÿú ÿÿþþz/TestRequirementParsing.test_requirement_parsingN)r)   r*   r+   rO  r   r   r   r   r=  Y  s   r=  c                       s4   e Zd Z‡ fdd„Zdd„ Zdd„ Zdd„ Z‡  ZS )	ÚTestRepositoryURLDependenciesc                    sv   t t| ƒ ¡  tj t ¡ d¡| _t	| jdƒ�>}| 
d dddddd	d
dddddddddddddg¡¡ W 5 Q R X d S )NrÔ   rÕ   r/   zH-e git+git://git.pro-ject.org/oslo.messaging#egg=oslo.messaging-1.0.0-rczE-e git+git://git.pro-ject.org/django-thumborize#egg=django-thumborizezJ-e git+git://git.pro-ject.org/django-thumborize#egg=django-thumborize-betazK-e git+git://git.pro-ject.org/django-thumborize#egg=django-thumborize2-betazQ-e git+git://git.pro-ject.org/django-thumborize#egg=django-thumborize2-beta-4.0.1z^-e git+git://git.pro-ject.org/django-thumborize#egg=django-thumborize2-beta-1.0.0-alpha.beta.1z‚-e git+git://git.pro-ject.org/django-thumborize#egg=django-thumborize2-beta-1.0.0-alpha-a.b-c-somethinglong+build.1-aef.1-its-okayz`-e git+git://git.pro-ject.org/django-thumborize#egg=django-thumborize2-beta-2.0.0-rc.1+build.123z+-e git+git://git.project.org/Proj#egg=Proj1ú0git+https://git.project.org/Proj#egg=Proj2-0.0.1z+-e git+ssh://git.project.org/Proj#egg=Proj3ú2svn+svn://svn.project.org/svn/Proj#egg=Proj4-0.0.2z;-e svn+http://svn.project.org/svn/Proj/trunk@2019#egg=Proj5ú9hg+http://hg.project.org/Proj@da39a3ee5e6b#egg=Proj-0.0.3z.-e hg+http://hg.project.org/Proj@2019#egg=Projú1hg+http://hg.project.org/Proj@v1.0#egg=Proj-0.0.4z9-e hg+http://hg.project.org/Proj@special_feature#egg=Projú'git://foo.com/zipball#egg=foo-bar-1.2.4ú
pypi-proj1ú
pypi-proj2)r	   rP  r   r   r"   r=   rÖ   r×   rÙ   r   r>   )r   rB   r   r   r   r   �  s6    ÿ íz#TestRepositoryURLDependencies.setUpc              /   C   sö   ddddddddd	d
dddddddddddddddddddddd d!d"d#d$d%d&d'd(d)d*d+d,d-d,d.g/}d/d0d1d2d3d4d5d6d7d8d9d:d;d<d=d>d?d@dAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd[dZd\g/}t |ƒD ]$\}}|  || t d]tj|¡¡ qÌd S )^Núdjango-thumborizeúdjango-thumborize-betaúdjango-thumborize2-betaúdjango-thumborize2-beta>=4.0.1ú+django-thumborize2-beta>=1.0.0-alpha.beta.1zFdjango-thumborize2-beta>=1.0.0-alpha-a.b-c-long+build.1-aef.1-its-okayú-django-thumborize2-beta>=2.0.0-rc.1+build.123zdjango-thumborize-beta>=0.0.4zdjango-thumborize-beta>=1.2.3z django-thumborize-beta>=10.20.30z-django-thumborize-beta>=1.1.2-prerelease+metaz"django-thumborize-beta>=1.1.2+metaz(django-thumborize-beta>=1.1.2+meta-validz#django-thumborize-beta>=1.0.0-alphaz"django-thumborize-beta>=1.0.0-betaz(django-thumborize-beta>=1.0.0-alpha.betaz*django-thumborize-beta>=1.0.0-alpha.beta.1z%django-thumborize-beta>=1.0.0-alpha.1z*django-thumborize-beta>=1.0.0-alpha0.validz*django-thumborize-beta>=1.0.0-alpha.0validzNdjango-thumborize-beta>=1.0.0-alpha-a.b-c-somethinglong+build.1-aef.1-its-okayz*django-thumborize-beta>=1.0.0-rc.1+build.1z,django-thumborize-beta>=2.0.0-rc.1+build.123z"django-thumborize-beta>=1.2.3-betaz+django-thumborize-beta>=10.2.3-DEV-SNAPSHOTz*django-thumborize-beta>=1.2.3-SNAPSHOT-123zdjango-thumborize-beta>=1.0.0zdjango-thumborize-beta>=2.0.0zdjango-thumborize-beta>=1.1.7z(django-thumborize-beta>=2.0.0+build.1848z(django-thumborize-beta>=2.0.1-alpha.1227z(django-thumborize-beta>=1.0.0-alpha+betaz<django-thumborize-beta>=1.2.3----RC-SNAPSHOT.12.9.1--.12+788z5django-thumborize-beta>=1.2.3----R-S.12.9.1--.12+metaz8django-thumborize-beta>=1.2.3----RC-SNAPSHOT.12.9.1--.12z:django-thumborize-beta>=1.0.0+0.build.1-rc.10000aaa-kk-0.1zGdjango-thumborize-beta>=999999999999999999.99999999999999.9999999999999ÚProj1úProj2>=0.0.1ÚProj3úProj4>=0.0.2ÚProj5úProj>=0.0.3ÚProjúProj>=0.0.4úfoo-bar>=1.2.4zegg=django-thumborizezegg=django-thumborize-betazegg=django-thumborize2-betaz!egg=django-thumborize2-beta-4.0.1z.egg=django-thumborize2-beta-1.0.0-alpha.beta.1zIegg=django-thumborize2-beta-1.0.0-alpha-a.b-c-long+build.1-aef.1-its-okayz0egg=django-thumborize2-beta-2.0.0-rc.1+build.123z egg=django-thumborize-beta-0.0.4z egg=django-thumborize-beta-1.2.3z#egg=django-thumborize-beta-10.20.30z0egg=django-thumborize-beta-1.1.2-prerelease+metaz%egg=django-thumborize-beta-1.1.2+metaz+egg=django-thumborize-beta-1.1.2+meta-validz&egg=django-thumborize-beta-1.0.0-alphaz%egg=django-thumborize-beta-1.0.0-betaz+egg=django-thumborize-beta-1.0.0-alpha.betaz-egg=django-thumborize-beta-1.0.0-alpha.beta.1z(egg=django-thumborize-beta-1.0.0-alpha.1z-egg=django-thumborize-beta-1.0.0-alpha0.validz-egg=django-thumborize-beta-1.0.0-alpha.0validzQegg=django-thumborize-beta-1.0.0-alpha-a.b-c-somethinglong+build.1-aef.1-its-okayz-egg=django-thumborize-beta-1.0.0-rc.1+build.1z/egg=django-thumborize-beta-2.0.0-rc.1+build.123z%egg=django-thumborize-beta-1.2.3-betaz.egg=django-thumborize-beta-10.2.3-DEV-SNAPSHOTz-egg=django-thumborize-beta-1.2.3-SNAPSHOT-123z egg=django-thumborize-beta-1.0.0z egg=django-thumborize-beta-2.0.0z egg=django-thumborize-beta-1.1.7z+egg=django-thumborize-beta-2.0.0+build.1848z+egg=django-thumborize-beta-2.0.1-alpha.1227z+egg=django-thumborize-beta-1.0.0-alpha+betaz?egg=django-thumborize-beta-1.2.3----RC-SNAPSHOT.12.9.1--.12+788z8egg=django-thumborize-beta-1.2.3----R-S.12.9.1--.12+metaz;egg=django-thumborize-beta-1.2.3----RC-SNAPSHOT.12.9.1--.12z=egg=django-thumborize-beta-1.0.0+0.build.1-rc.10000aaa-kk-0.1zJegg=django-thumborize-beta-999999999999999999.99999999999999.9999999999999z	egg=Proj1zegg=Proj2-0.0.1z	egg=Proj3zegg=Proj4-0.0.2z	egg=Proj5zegg=Proj-0.0.3zegg=Projzegg=Proj-0.0.4zegg=foo-bar-1.2.4zegg=([^&]+).*$)Ú	enumerater�   r7   Úsubr   Úegg_fragment)r   rò   ZtestsÚindexr>  r   r   r   Útest_egg_fragment·  sÎ    Ñ2Ñ1
þÿz/TestRepositoryURLDependencies.test_egg_fragmentc                 C   sF   t  | jg¡}|  ddddddddd	d
ddddddddddg|¡ d S )Nzoslo.messaging>=1.0.0-rcrX  rY  rZ  r[  r\  zOdjango-thumborize2-beta>=1.0.0-alpha-a.b-c-somethinglong+build.1-aef.1-its-okayr]  r^  r_  r`  ra  rb  rc  rd  re  rf  rV  rW  )r   rÑ   rÙ   r�   ©r   rÚ   r   r   r   Ú test_parse_repo_url_requirements   s0           ôôz>TestRepositoryURLDependencies.test_parse_repo_url_requirementsc                 C   sB   t  | jg¡}|  ddddddddd	d
ddddddddg|¡ d S )NzEgit+git://git.pro-ject.org/oslo.messaging#egg=oslo.messaging-1.0.0-rczBgit+git://git.pro-ject.org/django-thumborize#egg=django-thumborizezGgit+git://git.pro-ject.org/django-thumborize#egg=django-thumborize-betazHgit+git://git.pro-ject.org/django-thumborize#egg=django-thumborize2-betazNgit+git://git.pro-ject.org/django-thumborize#egg=django-thumborize2-beta-4.0.1z[git+git://git.pro-ject.org/django-thumborize#egg=django-thumborize2-beta-1.0.0-alpha.beta.1zgit+git://git.pro-ject.org/django-thumborize#egg=django-thumborize2-beta-1.0.0-alpha-a.b-c-somethinglong+build.1-aef.1-its-okayz]git+git://git.pro-ject.org/django-thumborize#egg=django-thumborize2-beta-2.0.0-rc.1+build.123z(git+git://git.project.org/Proj#egg=Proj1rQ  z(git+ssh://git.project.org/Proj#egg=Proj3rR  z8svn+http://svn.project.org/svn/Proj/trunk@2019#egg=Proj5rS  z+hg+http://hg.project.org/Proj@2019#egg=ProjrT  z6hg+http://hg.project.org/Proj@special_feature#egg=ProjrU  )r   rÿ   rÙ   r�   rl  r   r   r   Ú$test_parse_repo_url_dependency_links0  s.    îízBTestRepositoryURLDependencies.test_parse_repo_url_dependency_links)r)   r*   r+   r   rk  rm  rn  r-   r   r   r   r   rP  ›  s   irP  c                  C   s¤   d } zt  d¡} t  d¡}W n tk
r0   Y nX | rR|rRdt  ¡ krRd| |f } | d kr dt  ¡ kr t ¡ D ]0\}}}| d¡rn| d¡rn| d¡d }  q qn| S )	NÚSOABIÚ	MULTIARCHÚpypyz%s-%sz.pypyz.sor   r0   )	Ú	sysconfigÚget_config_varÚIOErrorÚget_scheme_namesÚimpZget_suffixesr^   Úendswithr9   )r«   Úarchrà   r•   r   r   r   rª   H  s    
rª   )1r  Zemail.errorsrv  r   r7   rr  rÖ   rl   r5   rÇ   r·   rn   rü   Z	testtoolsr   rP   rE   r   rL   r   r   Z	pbr.testsr   r"   r[   r=   Ú__file__rH   ZFixturer   r.   rC   rV   ZBaseTestCaserp   r™   r›   rž   ZTestCaser­   rÀ   rÅ   rÐ   rð   rý   r  r=  rP  rª   r   r   r   r   Ú<module>)   sP   !8+AB.*@3 gB .