B
    XM\Xœ ã            5   @   s\  d dl mZmZm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mZmZ d dlZd dlZd dlZd dlmZ ddlmZmZmZ ddlmZ dd	lmZ dd
lmZ ddlmZ ddlmZ d dlmZmZmZm Z  d dl!m"Z" d dl#m$Z$ d dl%m&Z&m'Z' d dl(m)Z)m*Z*m+Z+m,Z,m-Z-m.Z. d dl/m0Z0 yd dl1Z1W n  e2k
rd   e 3d¡ Y nX y
e1j4Z5W n   e1j6Z5Y nX ej7dkZ8dddœZ9dZ:ej;dej<ej=B dZ>e ;d¡Z?e ;d¡Z@e ;d¡ZAi aBdd„ ZCe ;d ¡ZDd!d"„ ZEd#d$„ ZFd%d&„ ZGd'd(„ ZHd)d*„ ZId+d,„ ZJd-d.„ ZKdÅd0d1„ZLd2d3„ ZMd4d5„ ZNd6d7„ ZOdÆd8d9„ZPd:d;d<d=hZQd>d?d@dAhZReSeSeSeSeSeSeSeTeTeTeeTeTeTeSeeSeSeUeUeeeeeeSeSeTeeSeSeSeSeSeSeSeSeSeSeSeeeeeeeeeTeSeSeSdBœ4ZVdCdD„ ZWdEdF„ ZXdGdH„ ZYdIdJhdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd[d\hd]d^d_d`dadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzd{d|d}d~dd€dh%dIdJd]dfd‚dƒd„d…d†d‡dˆhdƒd‰dŠd‹dŒhddŽddˆdd‘hd’d“d‡d”d•d–hd—d˜d™dšd›dœdddždŸd d¡d¢d£hd¤œZZd¥Z[d¦d§„ Z\d¨d©„ Z]dªd«„ Z^d¬d­„ Z_d®d¯„ Z`d°d±„ ZadÇd²d³„ZbdÈdµd¶„Zcd·d¸„ ZddÉd¹dº„Zee"d»d¼„ ƒZfd½d¾„ Zgd¿dÀ„ ZhejidÁdÂ„ ƒZjG dÃdÄ„ dÄekƒZldS )Êé    )Úabsolute_importÚdivisionÚprint_function)ÚOrderedDictN)ÚisfileÚjoin)ÚUnicodeDammité   )Ú	iteritemsÚPY3Ú	text_type)Úmd5_file)Únon_x86_linux_machines)Ú	MatchSpec)Ú	envs_dirs)Ústring_types)Ú
exceptionsÚutilsÚvariantsÚenviron)Úmemoized)Úfeature_list)ÚConfigÚget_or_merge_config)Úensure_listÚfind_recipeÚexpand_globsÚget_installed_packagesÚHashableDictÚinsert_variant_versions)Úensure_valid_license_familyzPError: could not import yaml (required to read meta.yaml files of conda recipes)Úwin32Úx86Úx86_64)Z32Z64)ÚpythonZgenericTz9^\ +-\ +(?:name|type):.+?(?=^\w|\Z|^\ +-\ +(?:name|type)))ÚflagszD(numpy\s*x\.x)|pin_compatible\([\'\"]numpy.*max_pin=[\'\"]x\.x[\'\"]z?pin_\w+\([\'\"]numpy[\'\"].*((?<=x_pin=[\'\"])[x\.]*(?=[\'\"]))zpin_\w+\([\'\"]numpy[\'\"]c             C   sÆ  | j }t| d¡t|dkƒt|dkƒ| d¡| d¡| d¡| d¡t|dkƒt|d	kƒ| d
¡| d¡ttjtttj dd¡ƒƒd}t	 
| ¡}| j d|d ¡}t|dƒs¶|d }td | d¡d d… ¡ƒ}| t|td|  koîdk n  ƒtd|  ko
dk n  ƒt|dkƒt|dkƒt|dkƒt|dkƒt|dkƒt|dkƒd	¡ | j d¡}|s|d }| jrt t¡ d  |d ¡¡ td | d¡d d… ¡ƒ|d!< | j d"|d" ¡}||d#< | j d$|d$ ¡}||d$< t|d d%kƒ|d&< x"tD ]}t|d'| kƒ||< qþW xtD ]\}	}
|
||	< q"W | tj¡ x|| j ¡ D ]n\}}||krPyt|ƒ||< W nH ttfk
rº   t|tƒr®| ¡ d(kr®| ¡ d)k}|||< Y nX qPW |S )*Nzlinux-zlinux-32zlinux-64z	linux-armzosx-)zlinux-zosx-zwin-zwin-32zwin-64)z-32z-64z-64ZFEATURE_NOMKLF)ZlinuxZlinux32Zlinux64ZarmÚosxZunixÚwinr!   Zwin64r"   r#   Úosr   Znomklr$   Úsplitr   Ú Ú.é   é   é(   é   é   é   é!   é"   é#   é$   )	ÚpyZpy3kZpy2kZpy26Zpy27Zpy33Zpy34Zpy35Zpy36ÚnumpyzaNo numpy version specified in conda_build_config.yaml.  Falling back to default numpy value of {}ÚnpÚperlÚplÚluaÚ2Zluajitzlinux-%s)ÚfalseÚtruer>   )Zhost_subdirÚdictÚ
startswithÚboolÚendswithr(   r   ÚintÚgetr   Zget_default_variantÚvariantÚhasattrr   r)   ÚupdateÚverboser   Ú
get_loggerÚ__name__ÚwarnÚformatr   r   ÚitemsÚ	TypeErrorÚ
ValueErrorÚ
isinstancer   Úlower)ÚconfigÚplatÚdÚdefaultsr6   r8   r:   r;   ÚmachineÚfeatureÚvalueÚkÚv© r[   ú3lib/python3.7/site-packages/conda_build/metadata.pyÚns_cfgI   sp    










 

r]   z+(.+?)\s*(#.*)?\[([^\[\]]+)\](?(2)[^\(\)]*)$c             C   s2   t  dt| ƒ¡}t| ¡ ƒdkr*| d¡S dS d S )Nz'(.+?)'r	   r*   )ÚreÚsearchÚstrÚlenÚgroupsÚgroup)ÚerrorÚmr[   r[   r\   ÚparseNameNotFound¡   s    
rf   c          
   C   sp   yt | |i ƒS  tk
rj } z@t|ƒ}|rFt t¡}| d| d ¡ |  |d¡}t|||ƒS d }~X Y nX d S )NzTreating unknown selector 'z' as if it was False.ÚFalse)	ÚevalÚ	NameErrorrf   r   rI   rJ   ÚdebugÚreplaceÚeval_selector)Zselector_stringÚ	namespaceÚvariants_in_placeÚeZmissing_varÚlogZnext_stringr[   r[   r\   rl   ¬   s    

rl   c       
      C   sè   g }xÔt |  ¡ ƒD ]Ä\}}| ¡ }d}|r>|d dkr>|d }| ¡  d¡rNqt |¡}|rÌ| d¡}y$t|||ƒrˆ| 	| d¡| ¡ W qÖ t
k
rÈ }	 z t d|d |t|	ƒf ¡ W d d }	~	X Y qÖX q| 	|¡ qW d |¡d S )	Nr*   éÿÿÿÿ)ú'ú"ú#é   r	   zOError: Invalid selector in meta.yaml line %d:
offending line:
%s
exception:
%s
Ú
)Ú	enumerateÚ
splitlinesÚrstripÚlstripr@   Úsel_patÚmatchrc   rl   ÚappendÚ	ExceptionÚsysÚexitr`   r   )
Údatarm   rn   ÚlinesÚiÚlineZtrailing_quotere   Zcondro   r[   r[   r\   Úselect_lines»   s&    

,r…   c             C   s²   y$t ƒ  tj| td}W d Q R X |S  tjjk
r¬ } zfd| krtydd l}| W n  tk
rr   tj	|d‚Y nX t
dtjd t
| tjd tj|d‚W d d }~X Y nX d S )N)ÚLoaderz{{r   )ZoriginalzProblematic recipe:)Úfile)Ústringify_numbersÚyamlÚloadÚloaderrd   Z	YAMLErrorÚjinja2ÚImportErrorr   ZUnableToParseMissingJinja2Úprintr   ÚstderrZUnableToParse)r   Zloaded_dataro   rŒ   r[   r[   r\   ÚyamlizeÛ   s    r   c             C   s0   |   di ¡  dd¡}|r,|dkr,td| ƒ‚d S )NÚbuildÚpin_dependsr*   )r*   ÚrecordÚstrictz9build/pin_depends must be 'record' or 'strict' - not '%s')rD   ÚRuntimeError)Úmetar’   r[   r[   r\   Úensure_valid_fieldsì   s    r—   c             C   sÞ   t  t¡}xÎ|  ¡ D ]Â\}}t|dƒr4t|ƒ| |< q|rBt|dƒsLt|tƒrÀt|tƒrld|krbd n|| |< qÖg }ttt	|ƒƒdƒr¨x2|D ]}t|ƒ}|rˆ| 
|¡ qˆW ndd„ |D ƒ}|| |< q| d |t|ƒ¡¡ qW | S )NÚkeysÚ__iter__ÚNonec             S   s   g | ]}|d kr|‘qS ))rš   ZNoneTyper[   )Ú.0rƒ   r[   r[   r\   ú
<listcomp>  s    z&_trim_None_strings.<locals>.<listcomp>z:found unrecognized data type in dictionary: {0}, type: {1})r   rI   rJ   rM   rF   Ú_trim_None_stringsrP   r   ÚnextÚiterr}   rj   rL   Útype)Z	meta_dictrp   ÚkeyrX   ZkeeprT   Ztrimmed_dictr[   r[   r\   r   ó   s$    





r   c             C   s0   |   di ¡  d¡}|r,|tkr,t d| ¡‚d S )Nr‘   ÚnoarchzInvalid value for noarch: %s)rD   ÚNOARCH_TYPESr   ZCondaBuildException)r–   Úbuild_noarchr[   r[   r\   Úensure_valid_noarch_value  s    r¥   ©Úhostr‘   Úrunc             C   s2   g }x(|D ] }|  | j di ¡ |g ¡¡ q
W |S )NÚrequirements)Úextendr–   rD   )ÚmetadataÚenvsÚreqsZ_envr[   r[   r\   Ú_get_all_dependencies  s    
 r®   c                s¼   g }x„t |  ¡ ƒD ]t\}‰ xjt|  ¡ ƒ|d d … D ]N‰t‡ fdd„tˆƒD ƒƒr4t‡fdd„tˆ ƒD ƒƒr4| ˆ  ¡ ˆ ¡ f¡ q4W qW |r¸d}x|D ]}|dj|Ž 7 }q˜W t 	|¡‚d S )Nr	   c             3   s,   | ]$}ˆ   ¡ |kp"| ˆ   ¡ d  ¡V  qdS )ú N)Únamer@   )r›   Údep)re   r[   r\   ú	<genexpr>  s   z.check_circular_dependencies.<locals>.<genexpr>c             3   s,   | ]$}ˆ   ¡ |kp"| ˆ   ¡ d  ¡V  qdS )r¯   N)r°   r@   )r›   r±   )Úother_mr[   r\   r²      s   z"Circular dependencies in recipe: 
z    {0} <-> {1}
)
rw   ÚvaluesÚlistÚanyr®   r}   r°   rL   r   ÚRecipeError)Úrender_orderZpairsÚidxrd   Zpairr[   )re   r³   r\   Úcheck_circular_dependencies  s    
rº   c             C   sB   d}x8| j j ¡ D ](\}}||j jkr||j j| krd}qW |S )NTF)rR   rE   rM   )r«   Úoutput_metadatar|   r¡   Úvalr[   r[   r\   Ú_variants_equal*  s
    r½   c          
   C   s,  d}g }xè|   ¡ D ]Ü\}}xÒ|   ¡ D ]Æ\}}||kr$|j di ¡ dg ¡}t|dƒrl| dg ¡| dg ¡ }t||ƒ| }xn|D ]f}| | ¡ d ¡r€t| d¡ƒdkr€| d¡d	 | 	¡ kr€t
||ƒr€| | ¡ | 	¡ || ¡ f¡ q€W q$W qW |r(d
}	x|D ]}
|	dj|
Ž 7 }	qW t d|	 ¡‚d S )N)r‘   r§   r¨   r‘   Úrun_exportsr˜   ZstrongZweakr¯   ru   rq   r*   z?Mismatching package: {} (id {}); dep: {}; consumer package: {}
zÃMismatching hashes in recipe. Exact pins in dependencies that contribute to the hash often cause this. Can you change one or more exact pins to version bound constraints?
Involved packages were:
)r´   r–   rD   rF   r®   r@   r°   ra   r)   Úbuild_idr½   r}   rL   r   r·   )r»   r¬   Z	problemosÚ_re   Úomr¾   Údepsr±   rd   Zprobr[   r[   r\   Úensure_matching_hashes2  s&    

$ *
rÃ   c             C   sê   t | t|ƒt|jƒd} t| ƒ}|d kr,i }xœtD ]”}||kr@q2|| sPi ||< |tkržt|| tƒsÆt	|| dƒr‚t|| t
ƒrÆtd||| jj|f ƒ‚q2t|| tƒs2td||| jj|f ƒ‚q2W t|ƒ t|ƒ t|ƒ t|ƒS )N)rn   r™   zBThe %s field should be a dict or list of dicts, not %s in file %s.z1The %s field should be a dict, not %s in file %s.)r…   r]   rA   rE   r   ÚFIELDSÚOPTIONALLY_ITERABLE_FIELDSrP   r?   rF   r   r•   Ú	__class__rJ   r—   r    r¥   Úsanitize)r   rR   ÚpathÚresÚfieldr[   r[   r\   ÚparseK  s*    
rË   ÚyZonr>   ZyesÚnZnor=   Zoff)4zbuild/entry_pointszbuild/featureszsource/patcheszbuild/scriptzbuild/script_envzbuild/run_exportszbuild/track_featureszbuild/osx_is_appzbuild/preserve_egg_dirzbuild/binary_relocationzbuild/noarchzbuild/noarch_pythonz%build/detect_binary_files_with_prefixz
build/skipzbuild/skip_compile_pyczbuild/preferred_envz$build/preferred_env_executable_pathszbuild/ignore_run_exportszbuild/requires_featureszbuild/provides_featureszbuild/pre-linkzbuild/post-linkzbuild/pre-unlinkzbuild/stringzbuild/pin_dependszbuild/force_use_keyszbuild/force_ignore_keyszbuild/merge_build_hostzbuild/msvc_compilerzrequirements/buildzrequirements/hostzrequirements/runzrequirements/conflictszrequirements/run_constrainedztest/requiresz
test/filesztest/source_filesztest/commandsztest/importsztest/downstreamszpackage/versionzsource/svn_revzsource/git_tagzsource/git_branchz
source/md5zsource/git_revzsource/pathzsource/git_urlzapp/own_environmentzabout/identifierszabout/keywordsz
about/tagsc                sx   t gtgtgdœ}x`| ¡ D ]T\}}|| krxB|D ]:‰ | | }t|dƒrRˆ |ƒ}n‡ fdd„|D ƒ}|| |< q2W qW | S )zF
    Sanitize the meta-data to remove aliases/handle deprecation

    )ÚsourceÚpackager‘   r˜   c                s   g | ]}ˆ |ƒ‘qS r[   r[   )r›   Z_d)Úfuncr[   r\   rœ   ²  s    zsanitize.<locals>.<listcomp>)Ú
_git_cleanÚ_str_versionrM   rF   )r–   Zsanitize_funsÚsectionZfunsÚsection_datar[   )rÐ   r\   rÇ   £  s    


rÇ   c       	         s´   d}d}|f| }t ‡ fdd„|D ƒƒ}t|ƒdkr`d}|d dd„ t||ƒD ƒ¡7 }t |¡ ˆ  ¡ }xFt|dd	… |dd	… ƒD ](\}}|r || ||d
 < | |d	¡ q„W |S )zÐ
    Reduce the redundancy in git specification by removing git_tag and
    git_branch.

    If one is specified, copy to git_rev.

    If more than one field is used to specified, exit
    and complain.
    )Ú
git_branchÚgit_tagÚgit_revc             3   s    | ]}t ˆ  |tƒ ¡ƒV  qd S )N)rA   rD   r   )r›   Útag)Úsource_metar[   r\   r²   Ç  s   z_git_clean.<locals>.<genexpr>r	   zError: multiple git_revs:z, c             s   s    | ]\}}|rd   |¡V  qdS )z{}N)rL   )r›   r¡   Úhasr[   r[   r\   r²   Ë  s    Nr   )ÚtupleÚsumr   Úzipr   r€   ÚcopyÚpop)	rÙ   Zgit_rev_tags_oldr×   Zgit_rev_tagsZhas_rev_tagsÚmsgZret_metar¡   rÚ   r[   )rÙ   r\   rÑ   ·  s     


$rÑ   c             C   s<   d| krt |  dd¡ƒ| d< d| kr8t |  dd¡ƒ| d< | S )NÚversionr*   Úmsvc_compiler)r`   rD   )Zpackage_metar[   r[   r\   rÒ   Ü  s
    rÒ   r°   rá   ÚfnZurlZmd5Úsha1Zsha256rÈ   Zgit_urlrÖ   rÕ   r×   Z	git_depthZhg_urlZhg_tagZsvn_urlZsvn_revZsvn_ignore_externalsZfolderZpatchesÚnumberÚstringÚentry_pointsZ
osx_is_appÚfeaturesÚtrack_featuresZpreserve_egg_dirZno_linkÚbinary_relocationÚscriptr¢   Únoarch_pythonÚhas_prefix_filesÚbinary_has_prefix_filesÚignore_prefix_filesZdetect_binary_files_with_prefixZskip_compile_pycZrpathsZ
script_envÚalways_include_filesÚskiprâ   r’   Úinclude_recipeÚpreferred_envZpreferred_env_executable_pathsr¾   Zignore_run_exportsÚrequires_featuresÚprovides_featuresÚforce_use_keysÚforce_ignore_keysÚmerge_build_hostzpre-linkz	post-linkz
pre-unlinkZmissing_dso_whitelistZscript_interpreterr‘   r©   ÚtestÚaboutÚfilesr    r§   r¨   Z	conflictsÚrun_constrainedÚentryÚiconÚsummaryZcli_optsZown_environmentZrequiresÚcommandsÚimportsZsource_filesZdownstreamsÚhomeZdev_urlZdoc_urlZdoc_source_urlZlicense_urlÚlicenseZdescriptionÚlicense_familyZidentifiersZtagsÚkeywordsZlicense_fileZreadme)rÏ   rÎ   r‘   Úoutputsr©   Úapprù   rú   )rÎ   r  c             C   sR   d}|dkr|d7 }|dkr$|d7 }x(|D ] }|| kr*t  d||| f ¡ q*W d S )Nz=@#$%^&*:;"'\|<>?/ )zpackage/versionzbuild/stringú-zpackage/versionú!z#Error: bad character '%s' in %s: %s)r   r€   )ÚsrÊ   Zbad_chrsÚcr[   r[   r\   Úcheck_bad_chrs  s    
r  c             C   sB   d}x8| D ]0}|  ¡ d |kr
t|  ¡ ƒdkr
|  ¡ d }q
W |S )Nr*   r   r	   )r)   ra   )Ú
build_reqsr°   rá   Úspecr[   r[   r\   Úget_package_version_pin  s
    
 r  c          
   C   sâ  | j  di ¡ d¡r"|  d¡}n¼g }| jr0dnd}dd„ |  |¡D ƒ}| j  di ¡ |g ¡}xdD ]\}}} xþ|  d	¡D ]ð}	xêt|ƒD ]Þ}
|	j|
krŽ|
|krŽ|
d
kr´| js´qŽ| j|
ksÐ|  d¡rÜ|
dkrÜ| 	|¡ qŽt
t|ƒƒ}| dd„ t|ƒD ƒ¡ x:|D ]2}t||ƒp,| jj | dd¡d¡}|rP qW d |g| d¡d |…  ¡}||krŽ| 	|¡ qŽW q€W qfW t|  dg ¡ƒ}|r˜| 	d¡ |r²| d |¡df¡ | 	d |  ¡ rÌ|  ¡ nd¡¡ d |¡}|S )Nr‘   ræ   zbuild/stringr§   c             S   s   g | ]
}|j ‘qS r[   )r°   )r›   Úmsr[   r[   r\   rœ   %  s    z.build_string_from_metadata.<locals>.<listcomp>r©   ))r8   r7   r,   )r6   r$   r,   )r:   r9   r,   )r;   r;   r,   )Úr)r  zr-baseru   )Úmrozmro-baseru   )r  zmro-base_implru   r¨   r7   zbuild/noarch_pythonr$   c             S   s    g | ]}d |kr|  d d¡‘qS )r  rÀ   )rk   )r›   Ú_nr[   r[   r\   rœ   8  s   r  rÀ   r*   r+   zbuild/featuresz{0}r   )r–   rD   Ú	get_valueÚis_crossÚ
ms_dependsr   r°   Únumpy_xxr¢   r}   rµ   rª   r  rR   rE   rk   r   r)   rL   Úbuild_number)r«   Z	build_strrÉ   Zbuild_or_hostZbuild_pkg_namesZ
build_depsr
  ÚnamesZplacesr  r°   Z	pkg_namesr  Zvariant_versionrý   rè   r[   r[   r\   Úbuild_string_from_metadata  sF    


"
r  c             C   s|   t j | ¡sHx:ttƒt  ¡ g D ]$}t j || ¡}t j |¡r |} P q W t j | d¡}t j |¡sxtd|  ƒ t 	d¡ | S )Nz
conda-metaz$Bootstrap environment '%s' not foundr	   )
r(   rÈ   Úisdirrµ   r   Úgetcwdr   rŽ   r   r€   )Úenv_name_or_pathZenvs_dirrÈ   Zbootstrap_metadirr[   r[   r\   Ú_get_env_pathP  s    
r  c             C   sR   t | ƒ}t|ƒ}g }x0| ¡ D ]$\}}| d||d |d f ¡ qW dd|iiS )Nz%s %s %srá   r‘   r©   )r  r   rM   r}   )r  rÈ   Zbootstrap_metadataZbootstrap_requirementsrÏ   r   r[   r[   r\   Ú"_get_dependencies_from_environment^  s     r  c                s@  ddl m} dd„ ˆ D ƒ}tƒ }tƒ }tƒ }x¶tˆ  ¡ ƒD ]¦\}\}}| dd¡dkrÖ| dg ¡| dg ¡ }	|js†|	 	| d	g ¡¡ |d
 }
|||
< tƒ ||
< x>|	D ]*}| 
d¡d }||kr¦||
  |f¡ q¦W q:| |¡ q:W t||ƒƒ}‡ fdd„|D ƒ}| 	‡ fdd„|D ƒ¡ tƒ }x|D ]}ˆ | ||< q&W |S )aô  This function is used to work out the order to run the install scripts
       for split packages based on any interdependencies. The result is just
       a re-ordering of outputs such that we can run them in that order and
       reset the initial set of files in the install prefix after each. This
       will naturally lead to non-overlapping files in each package and also
       the correct files being present during the install and test procedures,
       provided they are run in this order.r	   )Ú	_toposortc             S   s$   g | ]}|  d d¡dkr|d ‘qS )r    Úcondar°   )rD   )r›   Úoutput_dr[   r[   r\   rœ   t  s    ztoposort.<locals>.<listcomp>r    r!  zrequirements/runzrequirements/hostzrequirements/buildr°   r¯   r   c                s2   g | ]*}ˆ   ¡ D ]}d |kr|d  |kr|‘qqS )r°   )r˜   )r›   ÚpkgnamerY   )Úoutput_metadata_mapr[   r\   rœ   ‹  s    c                s:   g | ]2}ˆ   ¡ D ]$}d |kr(|d  |ks0d |kr|‘qqS )r°   )r˜   )r›   r#  rY   )r$  r[   r\   rœ     s    )Úconda_interfacer   r?   Úsetrw   rM   rD   r  r  rª   r)   rG   Úaddrµ   r   )r$  r   Zthese_packagesZtopodictÚorderZendorderr¹   r"  Zoutput_mrÂ   r°   r±   Z
topo_orderr˜   Úresultr¡   r[   )r$  r\   Útoposorti  s4    



r*  c                sž   |pˆ   d¡}|s"dˆ  ¡ ig}nBt|dƒr4tdƒ‚ˆ jrdt‡ fdd„|D ƒƒsd| tˆ  ¡ d¡ x4|D ],}dˆ  ¡ krj| 	d¡ˆ  ¡ krjt
ˆ |ƒ qjW |S )	Nr  r°   r˜   zoutputs specified as dictionary, but must be a list of dictionaries.  YAML syntax is: 

outputs:
    - name: subpkg

(note the - before the inner dictionary)c             3   s"   | ]}ˆ   ¡ | d d¡kV  qdS )r°   r*   N)r°   rD   )r›   Úout)r«   r[   r\   r²   ¤  s   z1get_output_dicts_from_metadata.<locals>.<genexpr>)r°   zpackage:)Úget_sectionr°   rF   ÚAssertionErrorÚuses_subpackager¶   r}   r   Úget_recipe_textrD   Ú&combine_top_level_metadata_with_output)r«   r  r+  r[   )r«   r\   Úget_output_dicts_from_metadata—  s    

r1  Fc                sò  ddl m} tƒ }x€| ¡ D ]r\}‰ˆ ¡ r2qyèt t¡}| jj	rZ| 
d ˆ ¡ ¡¡ |  ¡ }	ˆj|	_ˆjj|	j_|	 ¡ }
|	j |¡ d|	_|	 ˆ ¡ ¡p¨dˆ ¡ i}|	 |¡}	|
 ¡  |sÐ||	|
|d‰ n|	‰ | d¡rî| d¡dkr|ˆ f|ˆ  ¡ t‡ fd	d
„ˆ  ¡ D ƒƒf< W q tjk
r } zT|s:‚ nFt t¡}| d |j¡¡ |ˆf|ˆ ¡ t‡fdd
„ˆ ¡ D ƒƒf< W d d }~X Y qX qW || _d| _tƒ }xD| ¡ D ]8\}\}‰|ˆf|ˆ ¡ t‡fdd
„ˆ ¡ D ƒƒf< q²W |S )Nr	   )Úfinalize_metadataz&Attempting to finalize metadata for {}Fr°   )Úparent_metadataÚpermit_unsatisfiable_variantsr    r!  c                s   i | ]}ˆ j j| |“qS r[   )rR   rE   )r›   rY   )Úfmr[   r\   ú
<dictcomp>Õ  s   z)finalize_outputs_pass.<locals>.<dictcomp>z;Could not finalize metadata due to missing dependencies: {}c                s   i | ]}ˆ j j| |“qS r[   )rR   rE   )r›   rY   )r«   r[   r\   r6  Þ  s   c                s   i | ]}ˆ j j| |“qS r[   )rR   rE   )r›   rY   )re   r[   r\   r6  æ  s   )Úrenderr2  r   r´   rñ   r   rI   rJ   rR   rH   ÚinforL   r°   rÞ   Úother_outputsrE   rG   ÚfinalÚget_rendered_outputÚget_output_metadataÚparse_until_resolvedrD   r   Úget_used_varsr   ZDependencyNeedsBuildingErrorrK   ZpackagesrM   )Zbase_metadatar¸   Úpass_nor  r4  Úbypass_env_checkr2  r"  rp   rÁ   r3  ro   Zfinal_outputsrY   Úout_dr[   )r5  re   r«   r\   Úfinalize_outputs_pass­  sJ    


.

@0rB  c                s:   ˆ }dˆ kr6‡ fdd„|D ƒ}t |ƒdks.t‚|d }|S )Nr°   c                s(   g | ] }d |kr|d  ˆ d  kr|‘qS )r°   r[   )r›   r+  )Úoriginal_dictr[   r\   rœ   î  s    
zBget_updated_output_dict_from_reparsed_metadata.<locals>.<listcomp>r	   r   )ra   r-  )rC  Znew_outputsr"  Z	output_dsr[   )rC  r\   Ú.get_updated_output_dict_from_reparsed_metadataë  s    rD  c             C   sD   |r@t j|| t jt jB d}|r<d tdd„ | ¡ D ƒƒ¡nd} | S )N)r%   rv   c             s   s   | ]}|r|V  qd S )Nr[   )r›   ræ   r[   r[   r\   r²   ø  s    z&_filter_recipe_text.<locals>.<genexpr>r*   )r^   r_   Ú	MULTILINEÚDOTALLr   r&  rb   )ÚtextÚextract_patternr|   r[   r[   r\   Ú_filter_recipe_textõ  s    $rI  c          	   C   s>   t | dƒ}t| ¡ ƒj}W d Q R X tr:t|dƒr:| ¡ }|S )NÚrbÚdecode)Úopenr   ÚreadÚunicode_markupr   rF   rK  )Ú	meta_pathÚfÚrecipe_textr[   r[   r\   Úread_meta_fileü  s
    rR  c             C   sŠ   d}x€|D ]x}| j  |i ¡pi }| |i ¡p.i }|dkrJt | |i ¡¡}x$| ¡ D ]\}}||krT|||< qTW |||< || j |< q
W dS )zJMerge top-level metadata into output when output is same name as top-level)r©   r‘   rú   r©   N)r–   rD   r   Úexpand_reqsrM   )r«   ÚoutputZsectionsrÓ   Zmetadata_sectionZoutput_sectionrY   rZ   r[   r[   r\   r0    s    
r0  c       	      C   sè   t  | j di ¡¡}t  | dg ¡¡}t  | dg ¡¡}| dg ¡}dd„ |D ƒ}dd„ |D ƒ}tƒ }t  | jj dg ¡¡}xb|D ]Z}||kr²||krÜ||krÜ||krÜ| |¡ q‚||kr‚||kr‚||kr‚||kr‚| |¡ q‚W || S )	z²things can be used as dependencies or elsewhere in the recipe.  If it's only used
    elsewhere, keep it. If it's a dep-related thing, only keep it if
    it's in the build deps.r©   r‘   r§   r¨   c             S   s$   h | ]}|r|  ¡ d   dd¡’qS )r   r  rÀ   )r)   rk   )r›   Úreqr[   r[   r\   ú	<setcomp>   s    z'trim_build_only_deps.<locals>.<setcomp>c             S   s$   h | ]}|r|  ¡ d   dd¡’qS )r   r  rÀ   )r)   rk   )r›   rU  r[   r[   r\   rV  !  s    Úignore_build_only_deps)	r   rS  r–   rD   r   r&  rR   rE   r'  )	r«   Úrequirements_usedÚoutput_reqsr  Ú	host_reqsÚrun_reqsZ	to_removerW  r±   r[   r[   r\   Útrim_build_only_deps  s(    
r\  c              c   s`   t j ¡ } x"tdƒD ]}|t jkrt j|= qW d V  x&tdƒD ]}|| kr>| | t j|< q>W d S )NÚ
0123456789)r‹   Zyaml_implicit_resolversrÞ   rµ   )Zimplicit_resolver_backupZchr[   r[   r\   rˆ   7  s    

rˆ   c                   sœ  e Zd Zd·dd„Zedd„ ƒZedd„ ƒZejdd„ ƒZed	d
„ ƒZejdd
„ ƒZd¸dd„Z	edd„ ƒZ
d¹dd„Zdd„ Zdd„ Zdºdd„Zed»‡ fdd„	ƒZed¼‡ fdd„	ƒZdd„ Zd½d d!„Zd"d#„ Zd¾d$d%„Zd&d'„ Zd(d)„ Zd*d+„ Z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#dCdD„ Z$dEdF„ Z%dGdH„ Z&dIdJ„ Z'dKdL„ Z(dMdN„ Z)dÀdOdP„Z*dQdR„ Z+dSdT„ Z,dUdV„ Z-edWdX„ ƒZ.edYdZ„ ƒZ/ed[d\„ ƒZ0ed]d^„ ƒZ1ed_d`„ ƒZ2edadb„ ƒZ3edcdd„ ƒZ4dÁdedf„Z5dÂdgdh„Z6dÃdidj„Z7dkdl„ Z8dmdn„ Z9dÄdodp„Z:edqdr„ ƒZ;edsdt„ ƒZ<edudv„ ƒZ=edwdx„ ƒZ>dydz„ Z?d{d|„ Z@ed}d~„ ƒZAeAjdd~„ ƒZAed€d„ ƒZBeBjd‚d„ ƒZBedƒd„„ ƒZCed…d†„ ƒZDed‡dˆ„ ƒZEd‰dŠ„ ZFd‹dŒ„ ZGddŽ„ ZHdd„ ZIdÅd‘d’„ZJd“d”„ ZKdÆd•d–„ZLdÇd—d˜„ZMdÈd™dš„ZNdÉd›dœ„ZOeddž„ ƒZPedŸd „ ƒZQdÊd¡d¢„ZRdËd£d¤„ZSdÌd¥d¦„ZTd§d¨„ ZUd©dª„ ZVd«d¬„ ZWd­d®„ ZXed¯d°„ ƒZYed±d²„ ƒZZd³d´„ Z[dµd¶„ Z\‡  Z]S )ÍÚMetaDataNc             C   s~   g | _ t||d| _t|ƒr2|| _tj |¡| _nt|ƒ| _tj | j	¡| _t
| jdƒ| _tƒ | _| jddd | j| j_d S )N)rE   zrequirements.txtT)Úpermit_undefined_jinjaÚallow_no_other_outputs)Úundefined_jinja_varsr   rR   r   Ú
_meta_pathr(   rÈ   Údirnamer   rO  r   Úrequirements_pathr?   r–   Úparse_againÚdisable_pip)ÚselfrÈ   rR   rE   r[   r[   r\   Ú__init__F  s    
zMetaData.__init__c             C   s    t |  d¡ƒpd| j di ¡kS )Nr§   r©   )rA   Úget_depends_top_and_outr–   rD   )rg  r[   r[   r\   r  `  s    zMetaData.is_crossc             C   s
   |   d¡S )Nzextra/final)r  )rg  r[   r[   r\   r:  e  s    zMetaData.finalc             C   s$   | j  di ¡}||d< || j d< d S )NÚextrar:  )r–   rD   )rg  Zbooleanrj  r[   r[   r\   r:  i  s    c             C   s    | j jpd| jkod| jd kS )Nr‘   rf  )rR   rf  r–   )rg  r[   r[   r\   rf  o  s    zMetaData.disable_pipc             C   s,   || j _| j di ¡}||d< || jd< d S )Nr‘   rf  )rR   rf  r–   rD   )rg  rX   r‘   r[   r[   r\   rf  t  s    Fc          	   C   sR   t |dƒr|}n&t|ƒ}t| ¡ | jd}W dQ R X tj| j|| j||d dS )ai  Append to or replace subsections to meta.yaml

        This is used to alter input recipes, so that a given requirement or
        setting is applied without manually altering the input recipe. It is
        intended for vendors who want to extend existing recipes without
        necessarily removing information. pass merge=False to replace sections.
        r˜   )rR   N)ÚmergeÚraise_on_clobber)	rF   rL  rË   rM  rR   r   Zmerge_or_update_dictr–   rÈ   )rg  Zsections_file_or_dictrk  rl  Zbuild_configZ
configfiler[   r[   r\   Úappend_metadata_sections{  s    

z!MetaData.append_metadata_sectionsc             C   s8   | j dd}| j di ¡ di ¡ d¡}t|ƒo6||kS )NT)Úfail_okrj  Úparent_reciper°   )r°   r–   rD   rA   )rg  Z	self_nameÚparent_namer[   r[   r\   Ú	is_output‹  s    zMetaData.is_outputc       	      K   s|  | j rtdƒ‚t t¡}|r&| d¡ d}d}| jrtt| j|||d| j	| jd| _
tj | jd¡}tj | jd¡}| j	jp~|}|r tj |¡s | d|¡ d}| j	jpª|}|rÌtj |¡sÌ| d	|¡ d}|rÞ| j|d
d |rð| j|dd | j	jrt| j	jƒ}| j|d
d | j
 di ¡ dd¡r>| j
d d | j	_| j
 di ¡ dd¡rh| j
d d | j	_|  ¡  |  ¡  dS )a†  Redo parsing for key-value pairs that are not initialized in the
        first pass.

        config: a conda-build Config object.  If None, the config object passed at creation
                time is used.

        permit_undefined_jinja: If True, *any* use of undefined jinja variables will
                                evaluate to an emtpy string, without emitting an error.
        z%modifying metadata after finalizationzjusing unsupported internal conda-build function `parse_again`.  Please use conda_build.api.render instead.N)r`  r@  )rR   rÈ   zrecipe_append.yamlzrecipe_clobber.yamlz,input append sections file did not exist: %sz-input clobber sections file did not exist: %sT)rk  Fr‘   Úerror_overlinkingÚerror_overdepending)r:  r-  r   rI   rJ   rK   rO  rË   Ú_get_contentsrR   r–   r(   rÈ   r   Úappend_sections_filer   rj   Úclobber_sections_filerm  Z	bootstrapr  rD   rr  rs  Úvalidate_featuresÚensure_no_pip_requirements)	rg  r_  r`  r@  Úkwrp   ru  rv  Údependenciesr[   r[   r\   re  ‘  sF    


zMetaData.parse_againc             C   s:   d}x0|D ](}t dd„ |  |¡p"g D ƒƒr
tdƒ‚q
W d S )N)zrequirements/buildzrequirements/runztest/requiresc             s   s   | ]}t |d ƒV  qdS )r˜   N)rF   )r›   Úitemr[   r[   r\   r²   Ì  s    z6MetaData.ensure_no_pip_requirements.<locals>.<genexpr>z«Dictionaries are not supported as values in requirements sections.  Note that pip requirements as used in conda-env environment.yml files are not supported by conda-build.)r¶   r  rO   )rg  r˜   r¡   r[   r[   r\   rx  É  s    
z#MetaData.ensure_no_pip_requirementsc             C   sV   | j  di ¡}| dg ¡}t|  dd¡ƒrH| jjdkrHd|krH| d¡ || j d< dS )zFFor dynamic determination of build or run reqs, based on configurationr©   r¨   zbuild/osx_is_appFr&   z
python.appN)r–   rD   rA   r  rR   Úplatformr}   )rg  r­   r[  r[   r[   r\   Úappend_requirementsÑ  s    
zMetaData.append_requirementsc             C   s”   d}| j }| jd||d || _ x2t|ƒt| jƒkrR| j}| jd||d || _ q"W |rz| jd||d t d | j¡¡ | jd||d || _ dS )zcvariant contains key-value mapping for additional functions and values
        for jinja2 variablesr[   T)r_  r`  r@  FzXUndefined Jinja2 variables remain ({}).  Please enable source downloading and try again.N)r:  re  r&  ra  r   r€   rL   )rg  r`  r@  ra  r:  r[   r[   r\   r=  Ú  s*    

zMetaData.parse_until_resolvedc                sB   t t| ƒ | ¡}|stƒ }t||d|d|_||_|jdd |S )Nr*   )rR   rÈ   rE   T)r_  )Úsuperr^  Ú__new__r   rË   r–   rR   re  )Úclsr«   rR   rE   re   )rÆ   r[   r\   Ú
fromstringú  s    zMetaData.fromstringc                sP   t t| ƒ | ¡}d|_d|_d|_t|ƒ|_|s:t|d}||_	g |_
d|_|S )zG
        Create a MetaData object from metadata dict directly.
        r*   )rE   F)r~  r^  r  rÈ   rb  rd  rÇ   r–   r   rR   ra  r:  )r€  r«   rR   rE   re   )rÆ   r[   r\   Úfromdict  s    

zMetaData.fromdictc             C   s   | j  |i ¡S )N)r–   rD   )rg  rÓ   r[   r[   r\   r,    s    zMetaData.get_sectionTc             C   s|  |  d¡}t|ƒdks"td| ƒ‚t|ƒdkr<|\}}d}n2t|ƒdkrn|\}}}|dksftd| ƒ‚t|ƒ}|d | }|r˜|dkr˜|tkr˜t| ƒ }|  |¡}	t|	tƒrÂ|rÀtd	 ||¡ƒ‚njt|	t	ƒr,|dkrôt
 t¡}
|
 d
 |¡¡ d}t|	ƒdkri }	n$|	| }	t|	tƒs,td ||¡ƒ‚|	 ||¡}t|tƒrj| ¡ tkrXd}n| ¡ tkrjd}|dkrx|}|S )aë  
        Get a value from a meta.yaml.
        :param field: Field to return, e.g. 'package/name'.
                      If the section might be a list, specify an index,
                      e.g. 'source/0/git_url'.
        :param default: Default object to return if field doesn't exist
        :param autotype: If True, return the default type of field if one exists.
                         False will return the default object.
        :return: The named value from meta.yaml
        ú/)r,   ru   zBad field name: r,   Nru   rÎ   zSection is not a list: z6Got non-zero index ({}), but section {} is not a list.z8No index specified in get_value('{}'). Assuming index 0.r   zExpected {}/{} to be a dictTF)r)   ra   r-  rC   Údefault_structsr,  rP   r?   rL   rµ   r   rI   rJ   rK   rD   r   rQ   ÚtruesÚfalses)rg  r°   ÚdefaultZautotyper  rÓ   r¡   ÚindexrÊ   rÔ   rp   rX   r[   r[   r\   r    sF    






zMetaData.get_valuec             C   sŠ   dd„ }x|t | jƒD ]n\}}|dkr&q|tkr:td| ƒ‚xF|D ]>}|tkrtt|tƒrtx&| ¡ D ]}|||ƒ q`W q@|||ƒ q@W qW dS )Nc             S   s    | t | krtd|| f ƒ‚d S )Nzin section %r: unknown key %r)rÄ   rO   )r¡   rÓ   r[   r[   r\   Úcheck_fieldW  s    z*MetaData.check_fields.<locals>.check_fieldrj  zunknown section: %sT)r
   r–   rÄ   rO   rÅ   rP   r?   r˜   )rg  r‰  rÓ   ZsubmetaZkey_or_dictr¡   r[   r[   r\   Úcheck_fieldsV  s    
zMetaData.check_fieldsc             C   s^   | j  di ¡ dd¡}|s.|s.t d| j ¡ t|ƒ}|| ¡ krPt d| ¡ t|dƒ |S )NrÏ   r°   r*   z"Error: package/name missing in: %rz.Error: package/name must be lowercase, got: %rzpackage/name)r–   rD   r   r€   rO  r   rQ   r  )rg  rn  rÉ   r[   r[   r\   r°   i  s    
zMetaData.namec             C   sN   t |  d¡ƒ}|d kr&t d| j ¡ t|dƒ | jrJ| d¡rJtd|ƒ‚|S )Nzpackage/versionz%Error: package/version missing in: %rr+   z8Fully-rendered version can't start with period -  got %s)	r`   r  r   r€   rO  r  r:  r@   rO   )rg  rÉ   r[   r[   r\   rá   s  s    

zMetaData.versionc          	   C   s8   |   d¡}yt|ƒ}W n ttfk
r2   d}Y nX |S )Nzbuild/numberr*   )r  rC   rO   rN   )rg  rå   Z	build_intr[   r[   r\   r  |  s    

zMetaData.build_numberc                s¦   t ˆ d| g ¡ƒd d … }tdd„ |D ƒƒ‰ g }ˆjsˆ‡fdd„ˆj dg ¡D ƒ}|rˆt |d  dg ¡¡ |g ¡}‡ fd	d„|D ƒ}d
d„ t|ƒt|ƒB D ƒ}|S )Nzrequirements/c             s   s   | ]}|r|  ¡ d  V  qdS )r   N)r)   )r›   rU  r[   r[   r\   r²   ‡  s    z3MetaData.get_depends_top_and_out.<locals>.<genexpr>c                s"   g | ]}|  d ¡ˆ  ¡ kr|‘qS )r°   )rD   r°   )r›   r+  )rg  r[   r\   rœ   ‹  s    z4MetaData.get_depends_top_and_out.<locals>.<listcomp>r  r   r©   c                s    g | ]}|  ¡ d  ˆ kr|‘qS )r   )r)   )r›   r±   )Ú	req_namesr[   r\   rœ     s    c             S   s   g | ]}|r|‘qS r[   r[   )r›   rU  r[   r[   r\   rœ   ‘  s    )r   r  r&  rq  r–   rD   r   rS  )rg  ÚtypZmeta_requirementsZ
extra_reqsZmatching_outputr[   )r‹  rg  r\   ri  …  s    z MetaData.get_depends_top_and_outr¨   c          
      s´  d}‡ fdd„|D ƒ}ˆ j j d¡rJ| dˆ j jd fdˆ j jd fg¡ tƒ }xTtˆ  d| g ¡ƒD ]:}|stqhyt|ƒ}W n> tk
r    t	d| ƒ‚Y n  t
tfk
r¾   t	d	ƒ‚Y nX |jˆ  ¡ krÞt	d
ˆ  ¡  ƒ‚x"|D ]\}}|j|kräˆ jräqäqäW x.dD ]&}	|	|jkrt d|	|jf ¡ qW | ¡ }
t|
ƒdkrœ|
d dkrœd|
d |jf }t|
ƒdkr’|d|j|
d |
d f 7 }t |¡ |||< qhW t| ¡ ƒS )N)r$   r7   r9   r;   c                s*   g | ]"}ˆ j j |¡r|ˆ j j| f‘qS r[   )rR   rE   rD   )r›   r°   )rg  r[   r\   rœ   –  s   z'MetaData.ms_depends.<locals>.<listcomp>Úr_baser  zr-basezrequirements/z!Invalid package specification: %rzdReceived dictionary as spec.  Note that pip requirements are not supported in conda-build meta.yaml.z%s cannot depend on itselfz=!@#$%^&*:;"'\|<>?/z9Error: bad character '%s' in package name dependency '%s'r,   r	   >   ú<=ú==ú>ú!=ú>=ú<ú=z<Error: bad character '%s' in package version dependency '%s'ru   z
Perhaps you meant '%s %s%s')rR   rE   rD   rª   r   r   r  r   r-  r•   ÚAttributeErrorrO   r°   r¢   r   r€   r)   ra   rµ   r´   )rg  rŒ  r  Zname_ver_listÚspecsr  r  r°   Zverr  Úpartsrà   r[   )rg  r\   r  ”  sJ    



zMetaData.ms_dependsc                sª   t ˆ ¡ ƒ}tˆ|ƒ dddddg}| tˆjj dg ¡ƒ¡ d|krhˆj\}}ˆj	s^|rh|sh| 
d¡ |r˜t d d	d
„ |D ƒ¡¡‰ ‡ fdd„|D ƒ}‡fdd„|D ƒS )aÁ  
        # A hash will be added if all of these are true for any dependency:
        #
        # 1. package is an explicit dependency in build, host, or run deps
        # 2. package has a matching entry in conda_build_config.yaml which is a pin to a specific
        #    version, not a lower bound
        # 3. that package is not ignored by ignore_version
        #
        # The hash is computed based on the pinning value, NOT the build
        #    dependency build string. This means hashes won't change as often,
        #    but it also means that if run_exports is overly permissive,
        #    software may break more often.
        #
        # A hash will also ALWAYS be added when a compiler package is a build
        #    or host dependency. Reasoning for that is that the compiler
        #    package represents compiler flags and other things that can and do
        #    dramatically change compatibility. It is much more risky to drop
        #    this info (by dropping the hash) than it is for other software.

        # used variables - anything with a value in conda_build_config.yaml that applies to this
        #    recipe.  Includes compiler if compiler jinja2 function is used.
        r$   r  r9   r;   Útarget_platformZignore_versionr7   ú|c             s   s   | ]}d   |¡V  qdS )z
{}[\s$]?.*N)rL   )r›   Úexcr[   r[   r\   r²   æ  s   z-MetaData.get_hash_contents.<locals>.<genexpr>c                s   g | ]}ˆ   |¡s|‘qS r[   )r|   )r›   rU  )Úexclude_patternr[   r\   rœ   è  s    z.MetaData.get_hash_contents.<locals>.<listcomp>c                s   i | ]}ˆ j j| |“qS r[   )rR   rE   )r›   r¡   )rg  r[   r\   r6  ë  s    z.MetaData.get_hash_contents.<locals>.<dictcomp>)r&  r>  r\  rª   r   rR   rE   rD   Ú$uses_numpy_pin_compatible_without_xxr  r}   r^   Úcompiler   )rg  rz  Zbuild_string_excludesZpin_compatibleZnot_xxr[   )r›  rg  r\   Úget_hash_contentsÀ  s    


zMetaData.get_hash_contentsc             C   sJ   d}|   ¡ }|rFt tj|dd ¡ ¡}d | ¡ ¡d| jj	d … }|S )al  With arbitrary pinning, we can't depend on the build string as done in
        build_string_from_metadata - there's just too much info.  Instead, we keep that as-is, to
        not be disruptive, but we add this extra hash, which is just a way of distinguishing files
        on disk.  The actual determination of dependencies is done in the repository metadata.

        This was revised in conda-build 3.1.0: hashing caused too many package
            rebuilds. We reduce the scope to include only the pins added by conda_build_config.yaml,
            and no longer hash files that contribute to the recipe.
        r*   T)Z	sort_keyszh{0}Nr	   )
rž  Úhashlibrä   ÚjsonÚdumpsÚencoderL   Z	hexdigestrR   Úhash_length)rg  Úhash_Zhashing_dependenciesr[   r[   r\   Úhash_dependenciesí  s    
zMetaData.hash_dependenciesc             C   sF  |   d¡}|  ¡ }|s,|s,td |  ¡ ¡ƒ‚|  ¡ }t d|¡}|rf|rVt d|j¡sft	|dƒ |}nÜt
| ƒ}| jjrB| jrB|  ¡ }t d| jj |¡s,| dd¡}y6t|d ƒ |rÒd |t|d ƒf¡n
t|d ƒ}W n" tk
r   |d | }Y nX t|ƒdkrBd |g|dd …  ¡}nt d| jj ||¡}|S )	Nzbuild/stringz.Couldn't extract raw recipe text for {} outputz
\s*string:zh\{\{\s*PKG_HASH\s*\}\}zh[0-9a-f]{%s}rÀ   r	   r   )r  Úextract_package_and_build_textr•   rL   r°   r^   r_   Úfindallræ   r  r  rR   Zfilename_hashingr:  r¥  r£  ÚrsplitrC   r   r`   rO   ra   Úsub)rg  Zmanual_build_stringZraw_recipe_textZraw_manual_build_stringr+  r¤  Úretr[   r[   r\   r¿     s0    

*zMetaData.build_idc             C   s   d|   ¡ |  ¡ |  ¡ f S )Nz%s-%s-%s)r°   rá   r¿   )rg  r[   r[   r\   Údist!  s    zMetaData.distc             C   s   d|   ¡  S )Nz
%s.tar.bz2)r«  )rg  r[   r[   r\   Úpkg_fn$  s    zMetaData.pkg_fnc             C   s   t |  d¡ƒS )Nz	app/entry)rA   r  )rg  r[   r[   r\   Úis_app'  s    zMetaData.is_appc             C   s\   ddi}|   d¡r0dtt| j|   d¡ƒƒ |d< x&dD ]\}}|   |¡}|r6|||< q6W |S )Nr    r  zapp/iconz%s.pngrþ   ))z	app/entryZ	app_entry)zapp/typeZapp_type)zapp/cli_optsZapp_cli_opts)zapp/summaryrÿ   )zapp/own_environmentZapp_own_environment)r  r   r   rÈ   )rg  rT   rÊ   r¡   rX   r[   r[   r\   Úapp_meta*  s    

zMetaData.app_metac             C   sÂ  | j jdkrdn| j j}t|  ¡ |  ¡ |  ¡ |  ¡ r<|  ¡ nd| j jdkrZ|dkrZ| j jnd t	 
||¡| j jtdd„ |  ¡ D ƒƒtt ¡ d ƒd	}x&dD ]}|  d| ¡}|rš|||< qšW |  d	¡}|rÒ||d
< t|  d¡ƒ}dd„ |D ƒ}|rú||d< |  d¡rd |  d¡¡|d< |  d¡r:d |  d¡¡|d< |  d¡rT|  d¡|d< |  d¡rn|  d¡|d< | jr¦d  |d< |d< d|d< |  d¡}|r¦||d< |  ¡ r¾| |  ¡ ¡ |S )Nr¢   r   c             s   s   | ]}d   |j ¡ ¡V  qdS )r¯   N)r   r  r)   )r›   r  r[   r[   r\   r²   E  s   z&MetaData.info_index.<locals>.<genexpr>iè  )	r°   rá   r‘   r  r|  ÚarchÚsubdirZdependsZ	timestamp)r  r  zabout/zbuild/preferred_envró   zrequirements/run_constrainedc             S   s   g | ]}|r|‘qS r[   r[   )r›   rZ   r[   r[   r\   rœ   U  s    z'MetaData.info_index.<locals>.<listcomp>Ú
constrainszbuild/featuresr¯   rè   zbuild/track_featuresré   zbuild/provides_featuresrõ   zbuild/requires_featuresrô   r|  r¯  r°  zbuild/noarch)rR   Útarget_subdirZ	host_archr?   r°   rá   r¿   r  r|  ÚARCH_MAPrD   Úsortedr  rC   Útimer  r   r   r¢   r­  rG   r®  )rg  r¯  rT   r¡   rX   ró   r±  r¤   r[   r[   r\   Ú
info_index:  sR    




zMetaData.info_indexc             C   sT   t |  dg ¡ƒ}t|tƒs"tdƒ‚tjdkrFtdd„ |D ƒƒrFtdƒ‚t|| j	j
ƒS )Nzbuild/has_prefix_filesz0build/has_prefix_files should be a list of pathsr!   c             s   s   | ]}d |kV  qdS )ú\Nr[   )r›   rƒ   r[   r[   r\   r²   r  s    z,MetaData.has_prefix_files.<locals>.<genexpr>zHbuild/has_prefix_files paths must use / as the path delimiter on Windows)r   r  rP   rµ   r•   r   r|  r¶   r   rR   Úhost_prefix)rg  rª  r[   r[   r\   rí   m  s    

zMetaData.has_prefix_filesc             C   sr   |   dd¡}t|ƒttfkr$tdƒ‚tjdkrTt|ƒtkrTtdd„ |D ƒƒrTtdƒ‚t|ƒtkrnt|| j	j
ƒS |S )Nzbuild/ignore_prefix_filesFzQbuild/ignore_prefix_files should be boolean or a list of paths (optionally globs)r!   c             s   s   | ]}d |kV  qdS )r·  Nr[   )r›   rƒ   r[   r[   r\   r²   }  s    z/MetaData.ignore_prefix_files.<locals>.<genexpr>zKbuild/ignore_prefix_files paths must use / as the path delimiter on Windows)r  r    rµ   rA   r•   r   r|  r¶   r   rR   r¸  )rg  rª  r[   r[   r\   rï   w  s    
zMetaData.ignore_prefix_filesc             C   sJ   t |  dg ¡ƒ}tdd„ |D ƒƒr*tdƒ‚tr<dd„ |D ƒ}t|| jjƒS )Nzbuild/always_include_filesc             s   s   | ]}d |kV  qdS )r·  Nr[   )r›   rƒ   r[   r[   r\   r²   „  s    z0MetaData.always_include_files.<locals>.<genexpr>zLbuild/always_include_files paths must use / as the path delimiter on Windowsc             S   s   g | ]}|  d d¡‘qS )rƒ  r·  )rk   )r›   rP  r[   r[   r\   rœ   ˆ  s    z1MetaData.always_include_files.<locals>.<listcomp>)r   r  r¶   r•   Úon_winr   rR   r¸  )rg  rû   r[   r[   r\   rð   ‚  s    zMetaData.always_include_filesc             C   s   t |  dg ¡ƒS )Nzbuild/ignore_verify_codes)r   r  )rg  r[   r[   r\   Úignore_verify_codesŒ  s    zMetaData.ignore_verify_codesc             C   sr   |   dd¡}t|ƒttfkr$tdƒ‚tjdkrTt|ƒtkrTtdd„ |D ƒƒrTtdƒ‚t|ƒtkrnt|| j	j
ƒS |S )Nzbuild/binary_relocationTzObuild/binary_relocation should be boolean or a list of paths (optionally globs)r!   c             s   s   | ]}d |kV  qdS )r·  Nr[   )r›   rƒ   r[   r[   r\   r²   •  s    z-MetaData.binary_relocation.<locals>.<genexpr>zIbuild/binary_relocation paths must use / as the path delimiter on Windows)r  r    rµ   rA   r•   r   r|  r¶   r   rR   r¸  )rg  rª  r[   r[   r\   rê     s    
zMetaData.binary_relocationc             C   s   |   dd¡S )Nzbuild/include_recipeT)r  )rg  r[   r[   r\   rò   š  s    zMetaData.include_recipec             C   sT   t |  dg ¡ƒ}t|tƒs"tdƒ‚tjdkrFtdd„ |D ƒƒrFtdƒ‚t|| j	j
ƒS )Nzbuild/binary_has_prefix_filesz7build/binary_has_prefix_files should be a list of pathsr!   c             s   s   | ]}d |kV  qdS )r·  Nr[   )r›   rƒ   r[   r[   r\   r²   ¢  s    z3MetaData.binary_has_prefix_files.<locals>.<genexpr>zObuild/binary_has_prefix_files paths must use / as the path delimiter on Windows)r   r  rP   rµ   r•   r   r|  r¶   r   rR   r¸  )rg  rª  r[   r[   r\   rî     s    

z MetaData.binary_has_prefix_filesc             C   s   |   dd¡S )Nz
build/skipF)r  )rg  r[   r[   r\   rñ   §  s    zMetaData.skipc             C   sV  yddl }W nJ tk
rV   tdtjd tdtjd t| jƒ
}| ¡ S Q R X Y nX ddlm	}	m
}
m} tj | j¡\}}| d¡| |¡g}tj d¡}|rätj |¡rätj |¡}| d	d
¡}| |¡}| | d|i¡¡ |j}|røg |
_|
}|| |¡| jd}|j||d}|j t| jƒ¡ |j tj | d¡ |j ddi¡ |j |	| || j||||d¡ |r†|j d|i¡ z´y^|rœ| !|¡}n|r®| "|¡}n
| !d¡}dtjd< |j#|d}|rÞ|
j| _$ng | _$W nP |j%k
r6 } z.dt&|ƒkrd}t 'd (| jt&|ƒ¡¡ W dd}~X Y nX W ddtjkrPtjd= X |S )ao  
        Get the contents of our [meta.yaml|conda.yaml] file.
        If jinja is installed, then the template.render function is called
        before standard conda macro processors.

        permit_undefined_jinja: If True, *any* use of undefined jinja variables will
                                evaluate to an emtpy string, without emitting an error.
        r   Nz$There was an error importing jinja2.)r‡   zBPlease run `conda install jinja2` to enable jinja template support)Úcontext_processorÚUndefinedNeverFailÚFilteredLoaderÚconda_buildZCONDA_DEFAULT_ENVr·  rƒ  z$CONDA_DEFAULT_ENV)rR   )r‹   Z	undefined)re   ZCONDA_BUILD_STATEZRENDER)rR   r_  r`  r@  Úskip_build_idZPKG_NAMEr*   )Zenvironmentz'None' has not attributez$Failed to run jinja context functionz0Error: Failed to render jinja template in {}:
{}))rŒ   r   rŽ   r   r   rL  rO  rM  Zconda_build.jinja_contextr»  r¼  r½  r(   rÈ   r)   ZPackageLoaderZFileSystemLoaderr   rD   r  Úabspathrk   r}   ZPrefixLoaderZStrictUndefinedZall_undefined_namesZChoiceLoaderrR   ZEnvironmentÚglobalsrG   r]   Zget_dictZfrom_stringZget_or_select_templater7  ra  ZTemplateErrorr`   r€   rL   )rg  r_  r`  r@  Útemplate_stringr¿  Úalt_namerŒ   Úfdr»  r¼  r½  rÈ   ÚfilenameÚloadersZconda_env_pathZ
env_loaderZundefined_typer‹   ÚenvÚtemplateZrenderedÚexr[   r[   r\   rt  ª  sh    

	



&
zMetaData._get_contentsc             C   s
   t | jƒS )z8
        String representation of the MetaData.
        )r   Ú__dict__)rg  r[   r[   r\   Ú__unicode__  s    zMetaData.__unicode__c             C   s   t r|  ¡ S |  ¡  d¡S d S )Nzutf-8)r   rË  r¢  )rg  r[   r[   r\   Ú__str__  s    zMetaData.__str__c             C   s   |   ¡ S )z8
        String representation of the MetaData.
        )rÌ  )rg  r[   r[   r\   Ú__repr__  s    zMetaData.__repr__c             C   sJ   | j p"| j di ¡ di ¡ dd¡}|rFtj |¡dkrFtj |d¡}|S )Nrj  ro  rÈ   r*   z	meta.yaml)rb  r–   rD   r(   rÈ   Úbasenamer   )rg  rO  r[   r[   r\   rO    s    $zMetaData.meta_pathc          	   C   s@   d}| j r0t| j dƒ}t| ¡ ƒj}W d Q R X d|kp>d|kS )Nr*   rJ  Zload_setup_py_dataZload_setuptools)rO  rL  r   rM  rN  )rg  Ú	meta_textrP  r[   r[   r\   Úuses_setup_py_in_meta  s
    zMetaData.uses_setup_py_in_metac          	   C   s8   d}| j r0t| j dƒ}t| ¡ ƒj}W d Q R X d|kS )Nr*   rJ  Zload_file_regex)rO  rL  r   rM  rN  )rg  rÏ  rP  r[   r[   r\   Úuses_regex_in_meta'  s
    zMetaData.uses_regex_in_metac             C   s   | j p| jp| jS )N)Úuses_vcs_in_metarÐ  rÑ  )rg  r[   r[   r\   Úneeds_source_for_render/  s    z MetaData.needs_source_for_renderc          	   C   sH   | j s
dS t| j dƒ }t| ¡ ƒj}t d|¡}W d Q R X t|ƒdkS )NFrJ  z{{.*}}r   )rO  rL  r   rM  rN  r^   r§  ra   )rg  rP  rÏ  Úmatchesr[   r[   r\   Ú
uses_jinja3  s    zMetaData.uses_jinjac          	   C   s’   d}dddg}| j rŽt| j dƒh}t| ¡ ƒj}xR|D ]J}t d | ¡ ¡|¡}t	|ƒdkr6|| j
d d	 kr6|dkrzd
}|}P q6W W dQ R X |S )zÄreturns name of vcs used if recipe contains metadata associated with version control systems.
        If this metadata is present, a download/copy will be forced in parse_or_try_download.
        NÚgitÚsvnÚhgrJ  z{}_[^\.\s\'\"]+r   rÏ   r°   Ú	mercurial)rO  rL  r   rM  rN  r^   r§  rL   Úupperra   r–   )rg  ÚvcsÚ	vcs_typesrP  rÏ  Z_vcsrÔ  r[   r[   r\   rÒ  <  s    

zMetaData.uses_vcs_in_metac          
   C   sÄ   t rdnd}tj | j|¡}x¢|| jfD ]”}tj |¡r(dddg}t| jdƒh}t| ¡ ƒj	}xR|D ]J}t
jd |¡|t
jd}t|ƒd	krd|| jd
 d krd|dkrªd}|S qdW W d Q R X q(W d S )Nzbld.batzbuild.shrÖ  r×  rØ  rJ  z${}(?:\.exe)?(?:\s+\w+\s+[\w\/\.:@]+))r%   r   rÏ   r°   rÙ  )r¹  r(   rÈ   r   rO  r   rL  r   rM  rN  r^   r§  rL   Ú
IGNORECASEra   r–   )rg  Zbuild_scriptZrecipe_filerÜ  rP  rÛ  rÔ  r[   r[   r\   Úuses_vcs_in_buildP  s    

zMetaData.uses_vcs_in_buildc             C   s|   | j }|r6t|ƒ}| jrJ|sJ|  |  ¡ t| dd ƒ¡}nddlm} || ƒ}t||ƒ}|rtt	|t
| jƒt| jjƒd}| ¡ S )Nr    r   )Úoutput_yaml)rn   )rO  rR  rq  Úextract_single_output_textr°   ÚgetattrZconda_build.renderrß  rI  r…   r]   rR   rA   rE   ry   )rg  rH  Úforce_top_levelÚapply_selectorsrO  rQ  rß  r[   r[   r\   r/  f  s    

zMetaData.get_recipe_textc             C   s&   d}d| j |dkrd}| j ||dS )NzT(^\s*requirements:.*?)(?=^\s*test:|^\s*extra:|^\s*about:|^\s*-\s+name:|^outputs:|\Z)zpackage:)râ  z:(^requirements:.*?)(?=^test:|^extra:|^about:|^outputs:|\Z))r/  )rg  râ  rP  r[   r[   r\   Úextract_requirements_textu  s    z"MetaData.extract_requirements_textc             C   s   | j dd|dS )Nz+(^outputs:.*?)(?=^test:|^extra:|^about:|\Z)T)râ  rã  )r/  )rg  rã  r[   r[   r\   Úextract_outputs_text‚  s    zMetaData.extract_outputs_textc             C   s
   |   d¡S )NzM(\s*source:.*?)(?=^build:|^requirements:|^test:|^extra:|^about:|^outputs:|\Z))r/  )rg  r[   r[   r\   Úextract_source_text†  s    zMetaData.extract_source_textc             C   s
   |   d¡S )Nz<(^.*?)(?=^requirements:|^test:|^extra:|^about:|^outputs:|\Z))r/  )rg  r[   r[   r\   r¦  Š  s    z'MetaData.extract_package_and_build_textc       
         sö   ˆ j |d}t |¡}ˆ j d¡p4tˆ dƒr2ˆ jnd }|sHdˆ  ¡ ig}yV|rp‡ fdd„|D ƒ}| ||f¡}n‡ fdd„|D ƒ}| |¡}|r˜|| nd}	W nR t	k
rð   ˆ j
säˆ j d	i ¡ d
¡rät t¡ d |¡¡ d}	nˆ  ¡ }	Y nX |	S )N)rã  r  Úparent_outputsr°   c                s(   g | ] }|  d ˆ  ¡ ¡|  dd¡f‘qS )r°   r    r!  )rD   r°   )r›   r+  )rg  r[   r\   rœ   ˜  s    z7MetaData.extract_single_output_text.<locals>.<listcomp>c                s   g | ]}|  d ˆ  ¡ ¡‘qS )r°   )rD   r°   )r›   r+  )rg  r[   r\   rœ   ›  s    r*   rj  ro  z>Didn't match any output in raw metadata.  Target value was: {})rå  Ú	output_rer§  r–   rD   rF   rç  r°   rˆ  rO   rÈ   r   rI   rJ   rK   rL   )
rg  Zoutput_nameZoutput_typerã  rQ  Zoutput_matchesr  Úoutput_tuplesZoutput_indexrT  r[   )rg  r\   rà    s$    
 
z#MetaData.extract_single_output_textc             C   s   |   ¡ }tt |¡ƒ}|S )z–This is legacy syntax that we need to support for a while.  numpy x.x means
        "pin run as build" for numpy.  It was special-cased to only numpy.)rä  rA   Únumpy_xx_rer_   )rg  rG  Zuses_xxr[   r[   r\   r  ¦  s    zMetaData.numpy_xxc             C   sH   |   ¡ }t |¡}d }|r$t |¡}t|ƒ|rB| d¡ d¡dkndfS )Nr	   Úxr,   T)rä  Únumpy_compatible_rer_   Únumpy_compatible_x_rerA   rc   Úcount)rg  rG  Zcompatible_searchZmax_pin_searchr[   r[   r\   rœ  ®  s    

z-MetaData.uses_numpy_pin_compatible_without_xxc                s   |   d¡}d}xJ|D ]B}d|krt d |d ¡¡‰ t‡ fdd„|  d¡D ƒƒ}|rP qW d}|s„| jr„| jdd	}|r„t d
|¡}|pŽt	|ƒS )Nr  Fr°   z^{}(\s|\Z|$)c             3   s   | ]}ˆ   |¡V  qd S )N)r|   )r›   rU  )Úname_rer[   r\   r²   Â  s    z+MetaData.uses_subpackage.<locals>.<genexpr>r¨   T)râ  z{{\s*pin_subpackage\(.*\)\s*}})
r,  r^   r  rL   r¶   ri  rO  rä  r_   rA   )rg  r  Zin_reqsr+  Zsubpackage_pinr   r[   )rï  r\   r.  »  s    


zMetaData.uses_subpackagec             C   s   |   ¡ }tt d|¡ƒS )Nz\{\{\s*compiler\(.*\)\s*\}\})rä  rA   r^   r_   )rg  rG  r[   r[   r\   Ú"uses_new_style_compiler_activationÌ  s    z+MetaData.uses_new_style_compiler_activationc             C   s(   t dd„ t|  d¡ƒD ƒƒr$tdƒ‚d S )Nc             s   s   | ]}d |kV  qdS )r  Nr[   )r›   rW   r[   r[   r\   r²   Ò  s    z-MetaData.validate_features.<locals>.<genexpr>zbuild/featureszV- is a disallowed character in features.  Please change this character in your recipe.)r¶   r   r  rO   )rg  r[   r[   r\   rw  Ñ  s    zMetaData.validate_featuresc             C   sH   t   | ¡}| j  ¡ |_t  | jj¡|j_t  | j¡|_t| ddƒ|_|S )Nr    r!  )rÞ   rR   ÚdeepcopyrE   r–   rá  r    )rg  Únewr[   r[   r\   rÞ   Ö  s    
zMetaData.copyc             C   s
   |   d¡S )Nzbuild/noarch)r  )rg  r[   r[   r\   r¢   Þ  s    zMetaData.noarchc             C   sF   | j  di ¡}||d< || j d< | js6|s6| j ¡  n|rBd| j_d S )Nr‘   r¢   )r–   rD   rì   rR   Úreset_platformÚhost_platform)rg  rX   r‘   r[   r[   r\   r¢   â  s    

c             C   s
   |   d¡S )Nzbuild/noarch_python)r  )rg  r[   r[   r\   rì   ì  s    zMetaData.noarch_pythonc             C   sF   | j  di ¡}||d< || j d< | js6|s6| j ¡  n|rBd| j_d S )Nr‘   rì   r¢   )r–   rD   r¢   rR   ró  rô  )rg  rX   r‘   r[   r[   r\   rì   ð  s    

c             C   sh   | j j}i | j _| jdddd t| jƒ}|| j _x0|t| ¡ ƒ@ D ]}t d| |  ¡ ¡rDdS qDW dS )NT)r_  r`  r@  z\s*\{\{\s*%s\s*(?:.*?)?\}\}F)	rR   rE   re  r&  ra  r˜   r^   r_   ræ  )rg  rE   Zvars_in_reciper¡   r[   r[   r\   Úvariant_in_sourceú  s    
zMetaData.variant_in_sourcec             C   s   |   dd¡ ¡ S )Nzbuild/pin_dependsr*   )r  rQ   )rg  r[   r[   r\   r’     s    zMetaData.pin_dependsc             C   s8   t | j d¡ƒ p6tj | jj¡o6tt 	| jj¡ƒdkS )NrÎ   r   )
rA   r–   rD   r(   rÈ   r  rR   Úwork_dirra   Úlistdir)rg  r[   r[   r\   Úsource_provided  s    zMetaData.source_providedc             C   sÂ   |  d|  ¡ ¡|jd d< |j  di ¡}|  d¡|  ¡ ksN|  d¡sj|  d¡sjd|kr\|d= d|krj|d= |j  di ¡}d	}x0|D ](}||krœ|| ||< q‚||kr‚||= q‚W ||jd< d
|_d S )Nr°   rÏ   rù   rë   rû   r   r  r‘   )rç   r¾   rë   r*   )rD   r°   r–   rb  )rg  r»   Zoutput_dictrù   r‘   Ztransfer_keysr¡   r[   r[   r\   Ú#reconcile_metadata_with_output_dict  s"    



z,MetaData.reconcile_metadata_with_output_dictc                s8  |  d¡|  ¡ kr| }n|  ¡ }t |  di ¡¡}|  dg ¡}|  dg ¡}|  dg ¡}|  dg ¡}dd„ | ¡ D ƒ}|  d	¡rŒ|d	 |j_|  ¡ |  d¡ks²|  d
¡s²|  d¡r¾|  ||¡ |  dd¡|_	d|kr2t
 d |d ¡¡‰ |r‡ fdd„|D ƒ}|r‡ fdd„|D ƒ}|r2‡ fdd„|D ƒ}i }	|rJ|	 d|i¡nd  |rb|	 d|i¡nd  |rz|	 d|i¡nd  |r’|	 d|i¡nd  |	 |¡ |	|jd< |  d¡p¼|  ¡ |jd d< d|_|  dd¡|_|  dd¡|_|js|js| jj|jjkr| jj|j_|j  di ¡}
d|kr<|d |
d< d|krR|d |
d< d|krr|d rr|d |
d< d|kr’|d r’|d |
d< d|kr²|d r²|d |
d< d|krð|d }
|
d krÒi }
d|
krð|  d| ¡ ¡|
d< |
|jd< d|kr|d |jd< d|kr*|d |jd< |  |¡ |S )Nr°   r©   r‘   r§   r¨   rü   c             S   s   i | ]\}}|d kr||“qS ))r‘   r§   r¨   rü   r[   )r›   rY   rZ   r[   r[   r\   r6  8  s    z0MetaData.get_output_metadata.<locals>.<dictcomp>Útargetrë   rû   r    r!  z(?:^{}(?:\s|$|\Z))c                s   g | ]}ˆ   |¡s|‘qS r[   )r|   )r›   rU  )Úsubpackage_patternr[   r\   rœ   I  s    z0MetaData.get_output_metadata.<locals>.<listcomp>c                s   g | ]}ˆ   |¡s|‘qS r[   )r|   )r›   rU  )rû  r[   r\   rœ   K  s    c                s   g | ]}ˆ   |¡s|‘qS r[   )r|   )r›   rU  )rû  r[   r\   rœ   M  s    rá   rÏ   Fr¢   rì   rå   ræ   r¾   ré   rè   rù   rú   )rD   r°   rÞ   r   rS  rM   rR   r²  rù  r    r^   r  rL   rG   r–   rá   r:  r¢   rì   r|  r  Úappend_parent_metadata)rg  rT  r»   rY  r  rZ  r[  Zconstrain_reqsZ
other_reqsr©   r‘   r[   )rû  r\   r<  -  sx    
&











zMetaData.get_output_metadatac             C   s6   | j  di ¡}| j|  ¡ |  ¡ dœ|d< ||j d< d S )Nrj  )rÈ   r°   rá   ro  )r–   rD   rÈ   r°   rá   )rg  Úout_metadatarj  r[   r[   r\   rü    s    
zMetaData.append_parent_metadatac       	         sî   t  | jj ¡}| ¡ }t| jj d  ¡ ƒtˆƒ }| jj dg ¡}|rZt|d t	ƒrZ|gn|}‡fdd„|D ƒ‰| dg ¡‰ ‡ ‡fdd„|D ƒ}xN|D ]F}| |¡}|d k	r–t
|ƒr–t|dƒs–|dkr–t tt|ƒƒ¡||< q–W t  |¡}|S )Nr   Zzip_keysc                s$   g | ]}t t|ƒtˆ ƒ@ ƒr|‘qS r[   )r¶   r&  )r›   rc   )Úused_variablesr[   r\   rœ   Ž  s    z4MetaData.get_reduced_variant_set.<locals>.<listcomp>Úextend_keysc                s.   g | ]&‰ t ‡ fd d„ˆD ƒƒsˆ ˆkrˆ ‘qS )c             3   s   | ]}ˆ |kV  qd S )Nr[   )r›   rc   )r¡   r[   r\   r²   ’  s    z>MetaData.get_reduced_variant_set.<locals>.<listcomp>.<genexpr>)r¶   )r›   )rÿ  Úused_zip_key_groups)r¡   r\   rœ   ’  s    r˜   )r   Úlist_of_dicts_to_dict_of_listsrR   rÞ   r&  r˜   rE   rD   rP   r   ra   rF   r   r   rž   rŸ   Zdict_of_lists_to_list_of_dicts)	rg  rþ  Zfull_collapsed_variantsZreduced_collapsed_variantsZreduce_keysZzip_key_groupsr¡   r´   r+  r[   )rÿ  rþ  r   r\   Úget_reduced_variant_set…  s    

"
z MetaData.get_reduced_variant_setc          	      s|  ddl m} i }| jr0t| ƒd }|| fg}nHtƒ }| jdd}	|  |	¡pZ| jjd d… }
x`t	| jdƒrx| jjrx|
n| jj
gD ]8}|  ¡ }||j_
|jrÊ| jrÊ| ¡  t |jj¡ ||ƒ | ¡  y|jddd W n tk
rð   Y nX t|ƒ}yžx˜|D ]}| d¡}|rDt |¡}xd	D ]}t|||ƒ q&W ||d< | |¡‰|ˆf|ˆ ¡ t‡fd
d„ˆ ¡ D ƒƒf< ˆ|t|ƒ< | |_ˆ_qW W q‚ tk
rº   |s²‚ i }Y q‚X q‚W |sÎtdƒ‚t|ƒ}t|ƒ tƒ }g }x*| ¡ D ]\}‰ | d¡r|d dkrD|ˆ f|ˆ  ¡ t‡ fdd„ˆ  ¡ D ƒƒf< nÌ| d¡dkr| di ¡ d¡r„t dd„ |d d D ƒƒsò| di ¡ dg ¡}| !dd "ˆ jj
d ¡g¡ | di ¡|d< ||d d< ˆ j# di ¡ˆ j#d< |ˆ j#d d< | $|ˆ f¡ n| $|ˆ f¡ qôW |s@| %¡ s@t&||d||d}t'|ƒ g }x*| (¡ D ]\}‰ dˆ _| $|ˆ f¡ qNW || }|S )Nr   )ÚprovideT)Úforce_globalr	   r   )r`  r@  r©   )r‘   r§   r¨   c                s   i | ]}ˆ j j| |“qS r[   )rR   rE   )r›   rY   )rý  r[   r\   r6  É  s   z4MetaData.get_output_metadata_set.<locals>.<dictcomp>z„Error: output metadata set is empty.  Please file an issue on the conda-build tracker at https://github.com/conda/conda-build/issuesr    r!  c                s   i | ]}ˆ j j| |“qS r[   )rR   rE   )r›   rY   )re   r[   r\   r6  Ý  s   Zwheelr‘   c             s   s   | ]}d |kV  qdS )ÚpipNr[   )r›   rU  r[   r[   r\   r²   á  s    z3MetaData.get_output_metadata_set.<locals>.<genexpr>r  z	python {}r$   )r?  r4  r@  ))Zconda_build.sourcer  r:  r1  r   Úget_used_loop_varsr  rR   r   rF   rE   rÞ   rÓ  rõ  re  r   Zrm_rfrö  r=  Ú
SystemExitrD   rS  r   r<  r°   r   r>  r9  r-  r*  rº   rM   r¶   rª   rL   r–   r}   rñ   rB  rÃ   r´   )rg  r_  r4  r@  r  Zout_metadata_mapr  ré  Zall_output_metadatarþ  Ztop_looprE   Zref_metadatar+  r©   rÇ  r¸   Zconda_packagesZnon_conda_packagesr"  r  Zfinal_conda_packagesrA  r[   )re   rý  r\   Úget_output_metadata_set  s†    ,




	*,z MetaData.get_output_metadata_setc             C   s*   t | jdƒr| jjn| jj}tj|ddS )NÚinput_variantsT)Z	loop_only)rF   rR   r	  r   Zget_vars)rg  Z	_variantsr[   r[   r\   Úget_loop_vars  s    zMetaData.get_loop_varsc                s   ‡ fdd„ˆ j ||dD ƒS )Nc                s   h | ]}|ˆ   ¡ kr|’qS r[   )r
  )r›   Úvar)rg  r[   r\   rV    s    z.MetaData.get_used_loop_vars.<locals>.<setcomp>)râ  r  )r>  )rg  râ  r  r[   )rg  r\   r    s    zMetaData.get_used_loop_varsc             C   s,   | j |dd ¡ }t | j||dd¡p*i S )NT)rH  râ  )r_  rÂ  r¿  )r/  ry   r‰   Ú	safe_loadrt  )rg  r_  rH  rÂ  r[   r[   r\   Úget_rendered_recipe_text  s
    
z!MetaData.get_rendered_recipe_textc             C   sT   d}d  | j|dd|  ¡ f¡ ¡ }t | j||d|d¡p>i  dg ¡}t| |dS )Nz(.*)package:rv   T)rH  râ  )r_  rÂ  r¿  r`  r  )r  )	r   r/  rå  ry   r‰   r  rt  rD   r1  )rg  r_  rH  rÂ  r  r[   r[   r\   Úget_rendered_outputs_section  s    


z%MetaData.get_rendered_outputs_sectionc             C   s2   d}x(| j |dD ]}| d¡|kr|}P qW |S )a1  This is for obtaining the rendered, parsed, dictionary-object representation of an
        output. It's not useful for saying what variables are used. You need earlier, more raw
        versions of the metadata for that. It is useful, however, for getting updated, re-rendered
        contents of outputs.N)r_  r°   )r  rD   )rg  r°   r_  rT  Zoutput_r[   r[   r\   r;  (  s    zMetaData.get_rendered_outputc             C   s   t |  d¡ƒS )Nzbuild/force_ignore_keys)r   r  )rg  r[   r[   r\   r÷   5  s    zMetaData.force_ignore_keysc             C   s   t |  d¡ƒS )Nzbuild/force_use_keys)r   r  )rg  r[   r[   r\   rö   9  s    zMetaData.force_use_keysc          	      s  ˆ j }tˆ jdƒrˆ jj}nþˆ  ¡ |||ˆ jjtˆ jjƒftkrftˆ  ¡ |||ˆ jjtˆ jjƒf }n´ˆ j	||d}dˆ  
¡ k}|rŽˆ  ¡ }nˆ  ¡ }||B }dˆ jjkrÒt‡ fdd„ˆ  ¡ d D ƒƒrÒ| d¡ ˆ jsÞˆ jrö|tˆ jƒ tˆ jƒB }|tˆ  ¡ |||ˆ jjtˆ jjƒf< |S )NÚ	used_vars)râ  r  zpackage:r˜  c             3   s   | ]}|ˆ j jkV  qd S )N)rR   r°  )r›   rS   )rg  r[   r\   r²   U  s    z)MetaData.get_used_vars.<locals>.<genexpr>)rÈ   rF   rR   r  r°   r°  r   rE   Úused_vars_cacheÚ_get_used_vars_meta_yamlr/  Ú_get_used_vars_output_scriptÚ_get_used_vars_build_scriptsr¶   Úget_variants_as_dict_of_listsr'  rö   r÷   r&  )rg  râ  r  Z
recipe_dirr  Zmeta_yaml_reqsrq  Zscript_reqsr[   )rg  r\   r>  =  s.    




$zMetaData.get_used_varsc             C   s¶   |r| j ||d}|}n–| jr@|s@| j|  ¡ t| dd ƒ|d}n>| j ||d | j|d ¡ d¡| j|  ¡ t| dd ƒ|d }tj	dtj
tjB d}| |¡}|rª| ¡ nd}||fS )N)râ  rã  r    )rã  r*   z/requirements:.+?(?=^\w|\Z|^\s+-\s(?=name|type)))r%   )r/  rq  rà  r°   rá  rk   rå  Ústripr^   r  ÚMÚSr_   rc   )rg  râ  r  rã  rQ  Ú	reqs_textZreqs_rer[   r[   r\   Ú_get_used_vars_meta_yaml_helper`  s$    



z(MetaData._get_used_vars_meta_yaml_helperc             C   sš   t t| jj ¡ ƒƒ}| j||dd\}}tj||dd}| j||dd\}}tj||dd}| |¡}|rp|}	n&t ||¡}
||
 }t	| |
ƒ}
||
B }	|	S )NF)râ  r  rã  T)Z	selectors)
rÛ   r´  rR   rE   r˜   r  r   Zfind_used_variables_in_textÚunionr\  )rg  râ  r  Zvariant_keysr  rQ  Zall_used_selectorsZall_used_reqsZall_usedZusedrX  Zoutside_reqs_usedr[   r[   r\   r  z  s"    

z!MetaData._get_used_vars_meta_yamlc             C   sz   t ƒ }tj | jd¡}tj |¡r8| t | jj	|¡¡ tj | jd¡}| jj
dkrvtj |¡rv| t | jj	|¡¡ |S )Nzbuild.shzbld.batr'   )r&  r(   rÈ   r   r   rG   r   Ú#find_used_variables_in_shell_scriptrR   rE   r|  Ú#find_used_variables_in_batch_script)rg  r  ZbuildshZbldbatr[   r[   r\   r  ˜  s    z%MetaData._get_used_vars_build_scriptsc             C   s®   | j |  ¡ ddpi }tƒ }d|krªtj | j|d ¡}tj |¡d dkrd| t 	| j
j|¡¡ nFtj |¡d dkr| t | j
j|¡¡ nt t¡}| d |¡¡ |S )NT)r_  rë   r	   z.shz.batztNot detecting used variables in output script {}; conda-build only knows how to search .sh and .bat files right now.)r;  r°   r&  r(   rÈ   r   ÚsplitextrG   r   r  rR   rE   r  r   rI   rJ   rK   rL   )rg  Zthis_outputr  rë   rp   r[   r[   r\   r  ¤  s    



z%MetaData._get_used_vars_output_scriptc             C   s   t  | jj ¡S )N)r   r  rR   )rg  r[   r[   r\   r  ¶  s    z&MetaData.get_variants_as_dict_of_listsc             C   s   | j  ¡  dS )z;This ensures that clean is called with the correct build idN)rR   Úclean)rg  r[   r[   r\   r  ¹  s    zMetaData.cleanc             C   sD   | j  di ¡pi }| jp$| d¡dk	}t| jjo2|ƒoB|  ¡ dk S )Nr‘   Zactivate_in_scriptFr!  )r–   rD   rð  rA   rR   Zactivater°   )rg  ÚbZshould_activater[   r[   r\   Úactivate_build_script½  s    zMetaData.activate_build_scriptc             C   sd   | j  di ¡ d¡dkp| jj}| j  di ¡ d¡dk}|pb| jjob| obd| j  di ¡kob| j S )Nr‘   rø   TFr§   r©   )r–   rD   rR   Úbuild_is_hostZsubdirs_samerð  )rg  Zmanual_overridesZmanually_disabledr[   r[   r\   r!  Ã  s     zMetaData.build_is_hostc             C   sf   | j dd |  ¡ d¡}i }| j di ¡ di ¡}| jr@|d nd }|r^t | jd||d¡}|pdi S )	NT)râ  r*   rj  ro  r°   F)rÂ  rÃ  )	r/  rk   rå  r–   rD   rq  r‰   r  rt  )rg  Zrecipe_no_outputsZtop_no_outputsro  rÃ  r[   r[   r\   Ú$get_top_level_recipe_without_outputsÊ  s    

z-MetaData.get_top_level_recipe_without_outputsc             C   s®   d|   ¡ |  ¡ |  ¡ f g}| dd„ |  d¡D ƒ¡ |t |  dg ¡¡7 }|rZ|dg7 }|rh|dg7 }|rv|dg7 }|r–td	d„ |D ƒƒs–|d
g7 }| t | j	j
¡¡ |S )Nz%s %s %sc             s   s   | ]}|j V  qd S )N)r  )r›   r  r[   r[   r\   r²   Þ  s    z)MetaData.get_test_deps.<locals>.<genexpr>r¨   ztest/requiresr$   r9   r;   c             s   s   | ]}|  ¡ d  dkV  qdS )r   )zr-basezmro-baseN)r)   )r›   r
  r[   r[   r\   r²   ì  s    zr-base)r°   rá   r¿   rª   r  r   r   r  r¶   rR   Z
extra_deps)rg  Zpy_filesZpl_filesZ	lua_filesZr_filesr–  r[   r[   r\   Úget_test_depsÚ  s    



zMetaData.get_test_deps)NN)F)FFF)FF)NN)NN)NT)F)r¨   )FFNFN)NFT)F)T)T)FFF)FF)FN)F)F)FF)FFF)FF)^rJ   Ú
__module__Ú__qualname__rh  Úpropertyr  r:  Úsetterrf  rm  rq  re  rx  r}  r=  Úclassmethodr  r‚  r,  r  rŠ  r°   rá   r  ri  r  rž  r¥  r¿   r«  r¬  r­  r®  r¶  rí   rï   rð   rº  rê   rò   rî   rñ   rt  rË  rÌ  rÍ  rO  rÐ  rÑ  rÓ  rÕ  rÒ  rÞ  r/  rä  rå  ræ  r¦  rà  r  rœ  r.  rð  rw  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#  Ú__classcell__r[   r[   )rÆ   r\   r^  E  sÆ   

 
7	
 	
;

		
,- 3


  
Z	





R  
h




# 

r^  )r¦   )N)N)NFF)N)mZ
__future__r   r   r   Úcollectionsr   Ú
contextlibrÞ   rŸ  r   r(   Úos.pathr   r   r^   r   rµ  Zbs4r   r%  r
   r   r   r   r   r   r   r   r¾  r   r   r   r   Zconda_build.conda_interfacer   Zconda_build.featuresr   Zconda_build.configr   r   Zconda_build.utilsr   r   r   r   r   r   Zconda_build.license_familyr    r‰   r   r€   ZCLoaderr‹   r†   r|  r¹  r³  r£   r  r  r  rè  rê  rí  rì  r  r]   r{   rf   rl   r…   r   r—   r   r¥   r®   rº   r½   rÃ   rË   r…  r†  rµ   rA   r?   r„  rÇ   rÑ   rÒ   rÄ   rÅ   r  r  r  r  r  r*  r1  rB  rD  rI  rR  r0  r\  Úcontextmanagerrˆ   Úobjectr^  r[   r[   r[   r\   Ú<module>   s<   



R
 

%




1.
 
=

	"