ó
¼S]c           @@  s+  d  Z  d d l m Z d d l Z d d l Z d d l Z d d l Z d d l j j	 Z	 d d l
 j j Z d d l m Z d d l m Z m Z m Z m Z e d „ Z d „  Z d „  Z d	 „  Z d
 e f d „  ƒ  YZ d „  Z e j d ƒ Z d „  Z d „  Z d „  Z d „  Z  d „  Z! d „  Z" d S(   s3   Environment class representing a conda environment.i    (   t   absolute_importN(   t	   is_string(   t   _load_stringt
   _save_filet
   _YAMLErrort   ryamlc         C@  sŽ   d „  } | d  k r | } n  t g  | D] } | | ƒ ^ q( ƒ } t g  |  D] } | | ƒ | k rM | ^ qM ƒ } | t | ƒ } t | ƒ S(   Nc         S@  s   |  S(   N(    (   t   item(    (    s8   lib/python2.7/site-packages/anaconda_project/env_spec.pyt   default_key   s    (   t   Nonet   sett   listt   tuple(   t   items1t   items2t   key_funcR   R   t   items2_keyst   combined(    (    s8   lib/python2.7/site-packages/anaconda_project/env_spec.pyt   _combine_keeping_last_duplicate   s    		%1c         C@  s*   t  j |  ƒ } | d  k r |  S| j Sd  S(   N(   t	   conda_apit
   parse_specR   t   name(   t   spect   parsed(    (    s8   lib/python2.7/site-packages/anaconda_project/env_spec.pyt   _conda_combine_key#   s    c         C@  s*   t  j |  ƒ } | d  k r |  S| j Sd  S(   N(   t   pip_apiR   R   R   (   R   R   (    (    s8   lib/python2.7/site-packages/anaconda_project/env_spec.pyt   _pip_combine_key,   s    c         C@  s   t  |  | d t ƒS(   NR   (   R   R   (   t   firstt   second(    (    s8   lib/python2.7/site-packages/anaconda_project/env_spec.pyt   _combine_conda_package_lists5   s    t   EnvSpecc           B@  sš  e  Z d  Z d d  d! d" d# d  d „ Z e d „  ƒ Z e d „  ƒ Z d „  Z e d „  ƒ Z	 e d „  ƒ Z
 e d „  ƒ Z d  d „ Z d  d	 „ Z e d
 „  ƒ Z e d „  ƒ Z e d „  ƒ Z e d „  ƒ Z e d „  ƒ Z e d „  ƒ Z e d „  ƒ Z e d „  ƒ Z e d „  ƒ Z e d „  ƒ Z d „  Z d „  Z d „  Z e d „  ƒ Z e d „  ƒ Z d „  Z d „  Z d „  Z d „  Z  d „  Z! d „  Z" RS($   sd   Represents a set of required conda packages we could potentially instantiate as a Conda environment.c
         C@  s?  | d k	 s t ‚ | d k	 s$ t ‚ | |  _ t | ƒ |  _ t | ƒ |  _ t | ƒ |  _ | |  _ d |  _ d |  _	 d |  _
 | |  _ | |  _ |	 |  _ t t j | ƒ ƒ |  _ xN t g  |  j D] }
 |
 j ^ qÁ ƒ D]' } | d k s× | |  j k s× t ‚ q× Wt ƒ  } x< |  j D]1 }
 t j |
 ƒ } | d k	 r|
 | | j <qqW| |  _ t ƒ  } g  } xm |  j D]b }
 t j |
 ƒ } | d k	 rl| j | j ƒ | j d k	 s»| j d k	 rÎ| j |
 ƒ qÎqlqlW| |  _ t | ƒ |  _ t ƒ  } x< |  j D]1 }
 t  j |
 ƒ } | d k	 rý|
 | | j <qýqýW| |  _! d S(   sz  Construct a package set with the given name and packages.

        Args:
            name (str): name of the package set
            conda_packages (list): list of package specs to pass to conda install
            channels (list): list of channel names
            pip_packages (list): list of pip package specs to pass to pip
            description (str or None): one-sentence-ish summary of what this env is
            inherit_from_name (str or None): name of what we inherit from
            inherit_from (EnvSpec or None): pull in packages and channels from
            lock_set (CondaLockSet): locked packages or None
        N("   R   t   AssertionErrort   _nameR   t   _conda_packagest	   _channelst   _pip_packagest   _descriptiont   _logical_hasht   _locked_hasht   _import_hasht   _inherit_from_namest   _inherit_fromt	   _lock_setR   t   sort_platform_listt
   _platformsR   t   dictt   conda_packages_for_createR   t   _conda_specs_for_create_by_nameR	   t   conda_packagest   addt   conda_constraintt   pip_constraintt   appendt   _conda_logical_specs_name_sett   sortedt   conda_constrained_packagest   pip_packagesR   t   _pip_specs_by_name(   t   selfR   R/   t   channelsR7   t   descriptiont   inherit_from_namest   inherit_fromt	   platformst   lock_setR   t   conda_specs_by_nameR   t   name_setR6   t   pip_specs_by_name(    (    s8   lib/python2.7/site-packages/anaconda_project/env_spec.pyt   __init__<   sL    								,%					c         C@  s   |  j  S(   s   Get name of the package set.

        May be None for the anonymous shared base spec
        (toplevel packages, channels sections).
        (   R   (   R9   (    (    s8   lib/python2.7/site-packages/anaconda_project/env_spec.pyR   ˆ   s    c         C@  s!   |  j  d k r |  j S|  j  Sd S(   s'   Get the description of the environment.N(   R#   R   R   (   R9   (    (    s8   lib/python2.7/site-packages/anaconda_project/env_spec.pyR;   ‘   s    c         C@  sÊ   d d  l  } | j ƒ  } x$ | D] } | j | j d ƒ ƒ q Wx' |  j D] } | j | j d ƒ ƒ qI Wx' |  j D] } | j | j d ƒ ƒ qs Wx$ | D] } | j | j d ƒ ƒ qš W| j ƒ  } | S(   Ni    s   utf-8(   t   hashlibt   sha1t   updatet   encodeR7   R:   t	   hexdigest(   R9   R/   R>   RD   t   mt   pt   ct   result(    (    s8   lib/python2.7/site-packages/anaconda_project/env_spec.pyt   _compute_hash™   s    c         C@  s4   |  j  d k r- |  j |  j |  j ƒ |  _  n  |  j  S(   sÒ   Get a hash of our "logical" requirements.

        (Changing logical requirements could change the lock set
        if we recreate it.)

        Order matters (change in order will count as a change).

        N(   R$   R   RM   R/   R>   (   R9   (    (    s8   lib/python2.7/site-packages/anaconda_project/env_spec.pyt   logical_hash§   s    
c         C@  s4   |  j  d k r- |  j |  j d d ƒ|  _  n  |  j  S(   s×   Get a hash of our locked packages (what we'd pass to conda create).

        This is used to see if we need to reprepare
        environments. Order matters (change in order will count as
        a change).
        R>   N(    (   R%   R   RM   R-   (   R9   (    (    s8   lib/python2.7/site-packages/anaconda_project/env_spec.pyt   locked_hashµ   s    c         C@  s4   |  j  d k r- |  j |  j d d ƒ|  _  n  |  j  S(   sí   Get a hash of parts of the env spec that can appear in environment.yml.

        This is used to see if we need to re-import the environment.yml, requirements.txt
        or whatever. Those files don't have platform information.
        R>   N(    (   R&   R   RM   R/   (   R9   (    (    s8   lib/python2.7/site-packages/anaconda_project/env_spec.pyt   import_hashÁ   s    c         @  s,   d | ‰  ‡  f d †  } |  j  | d | ƒS(   Nt   _c         @  s   t  |  ˆ  ƒ S(   N(   t   getattr(   R   (   t   private_attr(    s8   lib/python2.7/site-packages/anaconda_project/env_spec.pyt   getterÏ   s    R   (   t   _get_inherited_with_getter(   R9   t   public_attrR   RT   (    (   RS   s8   lib/python2.7/site-packages/anaconda_project/env_spec.pyt   _get_inheritedÌ   s    
c         @  s•   ‡  f d †  ‰  g  } ˆ  |  g | ƒ | d |  k s; t  ‚ g  } x! | D] } | j | | ƒ ƒ qH Wg  } x# | D] } t | | d | ƒ} qr W| S(   Nc         @  sA   x: |  D]2 } | | k r ˆ  | j  | ƒ | j | ƒ q q Wd  S(   N(   R(   R3   (   t   specst   accumulatorR   (   t   _linearized_ancestors(    s8   lib/python2.7/site-packages/anaconda_project/env_spec.pyRZ   Õ   s    iÿÿÿÿR   (   R   R3   R   (   R9   RT   R   t	   ancestorst
   to_combineR   R   R   (    (   RZ   s8   lib/python2.7/site-packages/anaconda_project/env_spec.pyRU   Ô   s    c         C@  s   |  j  d t ƒ S(   sD   Get the conda packages to install in the environment as an iterable.R/   (   RW   R   (   R9   (    (    s8   lib/python2.7/site-packages/anaconda_project/env_spec.pyR/   ç   s    c         C@  s   |  j  d ƒ S(   s0   Get the channels to install conda packages from.R:   (   RW   (   R9   (    (    s8   lib/python2.7/site-packages/anaconda_project/env_spec.pyR:   ì   s    c         C@  s   |  j  d ƒ S(   s,   Get the platforms the environment can be on.R>   (   RW   (   R9   (    (    s8   lib/python2.7/site-packages/anaconda_project/env_spec.pyR>   ñ   s    c         C@  s   |  j  d t ƒ S(   sB   Get the pip packages to install in the environment as an iterable.R7   (   RW   R   (   R9   (    (    s8   lib/python2.7/site-packages/anaconda_project/env_spec.pyR7   ö   s    c         C@  s   |  j  S(   s5   Conda package names that we require, as a Python set.(   R4   (   R9   (    (    s8   lib/python2.7/site-packages/anaconda_project/env_spec.pyt   conda_package_names_setû   s    c         C@  s   t  |  j j ƒ  ƒ S(   s5   Conda package names that we require, as a Python set.(   R	   R.   t   keys(   R9   (    (    s8   lib/python2.7/site-packages/anaconda_project/env_spec.pyt"   conda_package_names_for_create_set   s    c         C@  s   t  |  j ƒ S(   s5   List of conda package names with version constraints.(   R	   t   _conda_names_constrained(   R9   (    (    s8   lib/python2.7/site-packages/anaconda_project/env_spec.pyt#   conda_package_names_constrained_set  s    c         C@  s   t  |  j j ƒ  ƒ S(   s3   Pip package names that we require, as a Python set.(   R	   R8   R^   (   R9   (    (    s8   lib/python2.7/site-packages/anaconda_project/env_spec.pyt   pip_package_names_set
  s    c         C@  s   |  j  S(   s'   Get ``CondaLockSet`` for this env spec.(   R)   (   R9   (    (    s8   lib/python2.7/site-packages/anaconda_project/env_spec.pyR?     s    c         C@  s<   |  j  d k	 r1 |  j  j r1 |  j  j r1 |  j  j S|  j Sd S(   s=   Get conda packages (preferring the lock set list if present).N(   R)   R   t   enabledt   supports_current_platformt"   package_specs_for_current_platformR/   (   R9   (    (    s8   lib/python2.7/site-packages/anaconda_project/env_spec.pyR-     s    '
c         C@  sI   g  } x< | D]4 } | j  | d  ƒ } | d  k	 r | j | ƒ q q W| S(   N(   t   getR   R3   (   R9   t   namest   mappingRX   R   R   (    (    s8   lib/python2.7/site-packages/anaconda_project/env_spec.pyt   _specs_for_package_names  s    c         C@  s   |  j  | |  j ƒ S(   s>   Get the full install specs given an iterable of package names.(   Ri   R.   (   R9   Rg   (    (    s8   lib/python2.7/site-packages/anaconda_project/env_spec.pyt   specs_for_conda_package_names$  s    c         C@  s   |  j  | |  j ƒ S(   s>   Get the full install specs given an iterable of package names.(   Ri   R8   (   R9   Rg   (    (    s8   lib/python2.7/site-packages/anaconda_project/env_spec.pyt   specs_for_pip_package_names(  s    c         C@  s   |  j  S(   s$   Env spec that we inherit stuff from.(   R(   (   R9   (    (    s8   lib/python2.7/site-packages/anaconda_project/env_spec.pyR=   ,  s    c         C@  s   |  j  S(   s*   Env spec names that we inherit stuff from.(   R'   (   R9   (    (    s8   lib/python2.7/site-packages/anaconda_project/env_spec.pyR<   1  s    c         C@  s:   t  j j d t  j j | d ƒ ƒ } t  j j | |  j ƒ S(   sE   The filesystem path to the default conda env containing our packages.t   ANACONDA_PROJECT_ENVS_PATHt   envs(   t   ost   environRf   t   patht   joinR   (   R9   t   project_dirt	   envs_path(    (    s8   lib/python2.7/site-packages/anaconda_project/env_spec.pyRp   6  s    $c         C@  s¿   t  t j | j |  j ƒ ƒ } t  t j | j |  j ƒ ƒ } t  t j | j |  j ƒ ƒ } | r‚ d g t  t d „  | ƒ ƒ } n  | rª d g t  t d „  | ƒ ƒ } n  d j | | | ƒ S(   sF   A string showing the comparison between this env spec and another one.s     pip:c         S@  s   d |  S(   Ns       (    (   t   x(    (    s8   lib/python2.7/site-packages/anaconda_project/env_spec.pyt   <lambda>B  t    s     channels:c         S@  s   d |  S(   Ns       (    (   Rt   (    (    s8   lib/python2.7/site-packages/anaconda_project/env_spec.pyRu   D  Rv   s   
(   R
   t   difflibt   ndiffR:   R/   R7   t   mapRq   (   R9   t   oldt   channels_difft
   conda_difft   pip_diff(    (    s8   lib/python2.7/site-packages/anaconda_project/env_spec.pyt	   diff_from<  s    ""c         C@  só   g  d D] } d | ^ q } d „  } | t  j | j |  j ƒ ƒ } x* | D]" } | | k rK | j | ƒ qK qK Wt | ƒ d k r‡ t S| t  j | j |  j ƒ ƒ } t | ƒ d k r» t S| t  j | j |  j ƒ ƒ } t | ƒ d k rï t St S(   s%  Check whether the diff is exclusively removing 'bokeh' or 'notebook'.

        This is used for a hack, because we can auto-add 'bokeh' or 'notebook'
        packages when we anaconda-project init, and that alone shouldn't result
        in being out of sync with the environment.yml.
        t   bokeht   notebooks   - c         S@  s   t  t d „  |  ƒ ƒ S(   Nc         S@  s   |  j  d ƒ p |  j  d ƒ S(   Ns   - s   + (   t
   startswith(   t   line(    (    s8   lib/python2.7/site-packages/anaconda_project/env_spec.pyRu   Q  Rv   (   R
   t   filter(   t   items(    (    s8   lib/python2.7/site-packages/anaconda_project/env_spec.pyt   filter_contextP  s    i    (   R   R€   (	   Rw   Rx   R/   t   removet   lent   FalseR:   R7   t   True(   R9   Rz   t   rt	   to_removeR…   R|   R{   R}   (    (    s8   lib/python2.7/site-packages/anaconda_project/env_spec.pyt#   diff_only_removes_notebook_or_bokehG  s    	c         C@  sJ  t  |  j ƒ } t  |  j ƒ } | r= | j t d | ƒ ƒ n  t  |  j ƒ } t  |  j ƒ } t j d d d d t j	 ƒ} |  j
 d k	 rž |  j
 | d d <n | d d =| | d d <| | d d	 <t | ƒ d
 k rè | | d d <n  t |  j ƒ d
 k rBt |  j ƒ d k r"|  j d
 } n t  |  j ƒ } | | d d <n  | d S(   s6   Get JSON for an anaconda-project.yml env spec section.t   pips!   something:
    description: null
s       packages: []
s       channels: []
t   Loadert	   somethingR;   t   packagesR:   i    R>   i   R=   N(   R
   R    R"   R3   R,   R!   R+   R   t   loadt   RoundTripLoaderR#   R   R‡   R<   (   R9   R   R7   R:   R>   t   template_jsonRg   (    (    s8   lib/python2.7/site-packages/anaconda_project/env_spec.pyt   to_jsone  s,    c         C@  s0  t  j j | d ƒ } t  j j | ƒ s? t d j | ƒ ƒ ‚ n  t  j j | d ƒ } t  j j | ƒ r t | d ƒ  } | j ƒ  } Wd QXn d } d j |  j	 ƒ } | | k r,| rã t | d d	 ƒ  } | j
 | ƒ Wd QXn  t  j j | ƒ rt  j | | d
 ƒ n  | r,t  j | d | ƒ q,n  d S(   s3   Write the augmented pinned file in the environment.s
   conda-metas   Expected path {} to existt   pinnedRŠ   NRv   s   
s	   .__ap_newt   ws
   .__ap_orig(   Rn   Rp   Rq   t   isdirt   RuntimeErrort   formatt   existst   opent   readR6   t   writet   rename(   R9   t   prefixt   conda_meta_patht   fnamet   fpt   old_listt   new_list(    (    s8   lib/python2.7/site-packages/anaconda_project/env_spec.pyt
   apply_pinsŽ  s"    c         C@  s«   t  |  j ƒ } t  |  j ƒ } | r= | j t d | ƒ ƒ n  t  |  j ƒ } t j d d t j ƒ} |  j	 d k	 sy t ‚ |  j	 | d <| | d <| | d <t | | ƒ d S(   s    Save as an environment.yml file.R   s%   name: 
dependencies: []
channels: []
RŽ   R   t   dependenciesR:   N(   R
   R/   R7   R3   R,   R:   R   R‘   R’   R   R   R   R   (   R9   t   filenameR   R7   R:   t   yaml(    (    s8   lib/python2.7/site-packages/anaconda_project/env_spec.pyt   save_environment_yml£  s    

(    N(    (    (    (#   t   __name__t
   __module__t   __doc__R   RC   t   propertyR   R;   RM   RN   RO   RP   RW   RU   R/   R:   R>   R7   R]   R_   Ra   Rb   R?   R-   Ri   Rj   Rk   R=   R<   Rp   R~   RŒ   R”   R¥   R©   (    (    (    s8   lib/python2.7/site-packages/anaconda_project/env_spec.pyR   9   sH   C									)	c         C@  sE  y: t  j |  d d ƒ  } | j ƒ  } Wd QXt | ƒ } Wn t t f k
 rT d SXd } d | k rt | d } n  | s¬ d | k r¬ | d r¬ t j j	 | d ƒ } q¬ n  | sÇ t j j	 |  ƒ } n  | j
 d g  ƒ } t | t ƒ sû t | ƒ d k r(| j
 d g  ƒ } t | t ƒ s(g  } q(n  | j
 d	 g  ƒ } t | t ƒ sRg  } n  g  } g  } xŒ | D]„ }	 t |	 ƒ r‡| j |	 ƒ qet |	 t ƒ red
 |	 k ret |	 d
 t ƒ rex1 |	 d
 D]" }
 t |
 ƒ rÀ| j |
 ƒ qÀqÀWqeqeWg  } x* | D]" } t | ƒ rú| j | ƒ qúqúWt d | d | d	 | d | d d ƒ S(   s=   Load an environment.yml as an EnvSpec, or None if not loaded.RŠ   s   utf-8NR   RŸ   R¦   i    R   R:   R   R/   R7   R>   (    (   t   codecsR›   Rœ   R   t   IOErrorR   R   Rn   Rp   t   basenameRf   t
   isinstanceR
   R‡   R   R3   R,   R   (   R§   t   filet   contentsR¨   R   t   raw_dependenciest   raw_channelsR/   R7   t   dept   pip_depR:   t   channel(    (    s8   lib/python2.7/site-packages/anaconda_project/env_spec.pyt   _load_environment_yml¶  sH    	"	.s   ^-([-a-zA-Z0-9]+)\s(.*)c   
   
   C@  sl  y. t  j |  d d ƒ  } | j ƒ  } Wd QXWn t t f k
 rH d SXg  } xû | D]ó } | j ƒ  } | j d ƒ sV | d k r‰ qV n  t j	 | ƒ } | d k	 r<| j
 d ƒ } | j
 d ƒ } | d k rÞ | j | ƒ qI| d k rIt j j t j j |  ƒ | ƒ } t | ƒ }	 |	 d k	 r9| j |	 j ƒ q9qIqV | j | ƒ qV Wt d	 d
 d d d d d | ƒ S(   s=   Load a requirements.txt as an EnvSpec, or None if not loaded.RŠ   s   utf-8Nt   #Rv   i   i   t   eR   t   defaultR/   R:   R7   (    (    (   R®   R›   t	   readlinesR¯   R   R   t   stripR   t   _requirement_option_ret   searcht   groupR3   Rn   Rp   Rq   t   dirnamet   _load_requirements_txtt   extendR7   R   (
   R§   R²   t   linesR   R‚   RI   t   optiont   packageRp   t
   child_spec(    (    s8   lib/python2.7/site-packages/anaconda_project/env_spec.pyRÃ   ð  s.    	!c         C@  s'   |  j  d ƒ r t |  ƒ St |  ƒ Sd  S(   Ns   .txt(   t   endswithRÃ   R¹   (   R§   (    (    s8   lib/python2.7/site-packages/anaconda_project/env_spec.pyt   _load_importable  s    
c         C@  sR   d } xE | D]= } t  j j |  | ƒ } t | ƒ } | d  k	 r | | f Sq Wd S(   Ns   environment.ymls   environment.yamls   requirements.txt(   s   environment.ymls   environment.yamls   requirements.txt(   NN(   Rn   Rp   Rq   RÊ   R   (   t   directory_patht	   filenamesR§   t   fullR   (    (    s8   lib/python2.7/site-packages/anaconda_project/env_spec.pyt   _find_importable_spec"  s    c         C@  se   t  | ƒ \ } } | d  k r" d Sx6 |  D]. } | j | j k r) | j | j k r) d Sq) W| | f S(   N(   NN(   NN(   RÎ   R   R   RP   (   t   project_specsRË   R   R§   t   existing(    (    s8   lib/python2.7/site-packages/anaconda_project/env_spec.pyt!   _find_out_of_sync_importable_spec-  s    c           C@  s   d g S(   Nt   anaconda(    (    (    (    s8   lib/python2.7/site-packages/anaconda_project/env_spec.pyt   _default_env_spec_packages<  s    c         C@  sX   |  d  k r d
 } n	 |  f } t d d d t ƒ  d g  d t j ƒ  d d d d d	 | ƒ S(   NR   R¼   R/   R:   R>   R;   s-   Default environment spec for running commandsR<   R=   (    (    (   R   R   RÓ   R   t   default_platforms_with_current(   t   shared_base_specR=   (    (    s8   lib/python2.7/site-packages/anaconda_project/env_spec.pyt   _anaconda_default_env_spec@  s    			(#   R¬   t
   __future__R    R®   Rw   Rn   t   ret#   anaconda_project.internal.conda_apit   internalR   t!   anaconda_project.internal.pip_apiR   t$   anaconda_project.internal.py2_compatR   t   anaconda_project.yaml_fileR   R   R   R   R   R   R   R   R   t   objectR   R¹   t   compileR¿   RÃ   RÊ   RÎ   RÑ   RÓ   RÖ   (    (    (    s8   lib/python2.7/site-packages/anaconda_project/env_spec.pyt   <module>   s.   "					ÿ ~	7	+				