σ
ΌS]c           @@  sΤ   d  Z  d d l m Z d d l 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 e f d	     YZ d
 e f d     YZ d e	 e  f d     YZ d Z d e f d     YZ d S(   s&   Types related to project requirements.i    (   t   absolute_import(   t   ABCMetat   abstractmethod(   t   deepcopy(   t   with_metaclass(   t	   is_string(   t   Statust   UserConfigOverridesc           B@  sM   e  Z d  Z d d d  Z e d    Z e d    Z e j d    Z RS(   sC   Class containing user-forced configuration for the prepare process.c         C@  s   | |  _  | |  _ d S(   s:   Construct a set of user overrides for the prepare process.N(   t   _inherited_envt   _env_spec_name(   t   selft   inherited_envt   env_spec_name(    (    sQ   lib/python2.7/site-packages/anaconda_project/requirements_registry/requirement.pyt   __init__   s    	c         C@  s   |  j  S(   sW   The user-specified name of the conda environment spec to use, or None if not specified.(   R	   (   R
   (    (    sQ   lib/python2.7/site-packages/anaconda_project/requirements_registry/requirement.pyR      s    c         C@  s   |  j  S(   sB   The environment we started with before we ran the prepare process.(   R   (   R
   (    (    sQ   lib/python2.7/site-packages/anaconda_project/requirements_registry/requirement.pyR       s    c         C@  s   | |  _  d S(   s+   Change the conda environment name override.N(   R	   (   R
   t   value(    (    sQ   lib/python2.7/site-packages/anaconda_project/requirements_registry/requirement.pyR   %   s    N(	   t   __name__t
   __module__t   __doc__t   NoneR   t   propertyR   R   t   setter(    (    (    sQ   lib/python2.7/site-packages/anaconda_project/requirements_registry/requirement.pyR      s
   t   RequirementStatusc           B@  sΉ   e  Z d  Z d   Z d   Z d   Z 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 d d  Z RS(   s©   Class describing the status of a requirement.

    Values of this class are immutable; to get updated status, you
    would call ``recheck()`` to get a new status.

    c         C@  sC   | |  _  | |  _ | |  _ | |  _ | |  _ | |  _ | |  _ d S(   s(   Construct an abstract RequirementStatus.N(   t   _requirementt   _has_been_providedt   _status_descriptiont	   _providert	   _analysist   _latest_provide_resultR	   (   R
   t   requirementt   has_been_providedt   status_descriptiont   providert   analysist   latest_provide_resultR   (    (    sQ   lib/python2.7/site-packages/anaconda_project/requirements_registry/requirement.pyR   3   s    						c         C@  s   d |  j  |  j |  j f S(   s   Repr of the status.s   RequirementStatus(%r,%r,%r)(   R   R   R   (   R
   (    (    sQ   lib/python2.7/site-packages/anaconda_project/requirements_registry/requirement.pyt   __repr__>   s    c         C@  s   |  j  S(   s   True if the requirement is met.(   R   (   R
   (    (    sQ   lib/python2.7/site-packages/anaconda_project/requirements_registry/requirement.pyt   __bool__B   s    c         C@  s
   |  j    S(   s   True if the requirement is met.(   R#   (   R
   (    (    sQ   lib/python2.7/site-packages/anaconda_project/requirements_registry/requirement.pyt   __nonzero__F   s    c         C@  s   |  j  S(   s)   Get the requirement we are the status of.(   R   (   R
   (    (    sQ   lib/python2.7/site-packages/anaconda_project/requirements_registry/requirement.pyR   J   s    c         C@  s   |  j  S(   s)   Get True if the requirement has been met.(   R   (   R
   (    (    sQ   lib/python2.7/site-packages/anaconda_project/requirements_registry/requirement.pyR   O   s    c         C@  s   |  j  S(   sN   Get a description of how the requirement has been met (or why it hasn't been).(   R   (   R
   (    (    sQ   lib/python2.7/site-packages/anaconda_project/requirements_registry/requirement.pyR   T   s    c         C@  s   |  j  S(   s&   Get the provider for this requirement.(   R   (   R
   (    (    sQ   lib/python2.7/site-packages/anaconda_project/requirements_registry/requirement.pyR   Y   s    c         C@  s   |  j  S(   s*   Get the provider's analysis of the status.(   R   (   R
   (    (    sQ   lib/python2.7/site-packages/anaconda_project/requirements_registry/requirement.pyR    ^   s    c         C@  s   |  j  S(   sD   Get the latest ``ProvideResult`` or None if we haven't provided yet.(   R   (   R
   (    (    sQ   lib/python2.7/site-packages/anaconda_project/requirements_registry/requirement.pyR!   c   s    c         C@  s!   |  j  d k r g  S|  j  j Sd S(   s_   Get error logs relevant to the status, from either checking status or attempting to provide it.N(   R!   R   t   errors(   R
   (    (    sQ   lib/python2.7/site-packages/anaconda_project/requirements_registry/requirement.pyR%   h   s    c         C@  s   |  j  S(   sZ   Get the env spec name used to meet the requirement, None if not a ``CondaEnvRequirement``.(   R	   (   R
   (    (    sQ   lib/python2.7/site-packages/anaconda_project/requirements_registry/requirement.pyR   p   s    c         C@  s4   | d k r |  j } n  |  j j | | | | |  S(   sΡ   Get a new ``RequirementStatus`` reflecting the current state.

        This calls ``Requirement.check_status()`` which can do network and filesystem IO,
        so be cautious about where you call it.
        N(   R   R   R   t   check_status(   R
   t   environt   local_state_filet   default_env_spec_namet	   overridesR!   (    (    sQ   lib/python2.7/site-packages/anaconda_project/requirements_registry/requirement.pyt   rechecku   s    N(   R   R   R   R   R"   R#   R$   R   R   R   R   R   R    R!   R%   R   R   R+   (    (    (    sQ   lib/python2.7/site-packages/anaconda_project/requirements_registry/requirement.pyR   +   s   				t   Requirementc           B@  s}   e  Z d  Z d   Z e e d     Z d   Z e e d     Z e d    Z	 d   Z
 d   Z e d	 d   Z RS(
   sT  Describes a requirement of the project (from the project config).

    Note that this is not specifically a package requirement;
    this class is more general, it can be a requirement for any
    condition at all (that a service is running, that a file
    exists, or even that a package is intalled - anything you can
    think of).

    c         C@  s   | |  _  | d k r$ t   |  _ ne t |  |  _ d |  j k r t |  j d  ph t |  j d t  r t |  j d  |  j d <n  d S(   sΞ   Construct a Requirement.

        Args:
            registry (RequirementsRegistry): the plugin registry we came from
            options (dict): dict of requirement options from the project config
        t   defaultN(   t   registryR   t   dictt   optionsR   R   t
   isinstancet   str(   R
   R.   R0   (    (    sQ   lib/python2.7/site-packages/anaconda_project/requirements_registry/requirement.pyR      s    	"c         C@  s   d S(   s-   Human-readable short name of the requirement.N(    (   R
   (    (    sQ   lib/python2.7/site-packages/anaconda_project/requirements_registry/requirement.pyt   title    s    c         C@  s"   d |  j  k r |  j  d S| Sd S(   s=   Use this in subclasses to implement the description property.t   descriptionN(   R0   (   R
   R-   (    (    sQ   lib/python2.7/site-packages/anaconda_project/requirements_registry/requirement.pyt   _description¦   s    c         C@  s   d S(   sF   Human-readable about-one-sentence hint or tooltip for the requirement.N(    (   R
   (    (    sQ   lib/python2.7/site-packages/anaconda_project/requirements_registry/requirement.pyR4   ­   s    c         C@  s   t    S(   sP   Set of ignore patterns for files this requirement's provider might autogenerate.(   t   set(   R
   (    (    sQ   lib/python2.7/site-packages/anaconda_project/requirements_registry/requirement.pyt   ignore_patterns³   s    c	         C@  sp   |  j  j |  }	 |	 j |  | | | |  }
 |
 j j d d   } t |  d | d | d |	 d |
 d | d | S(   Nt   env_nameR   R   R   R    R!   R   (   R.   t   find_provider_by_class_namet   analyzet   configt   getR   R   (   R
   R'   R(   R)   R*   R!   R   R   t   provider_class_nameR   R    R   (    (    sQ   lib/python2.7/site-packages/anaconda_project/requirements_registry/requirement.pyt   _create_statusΈ   s    c         C@  s   |  j  j |  } | j |  | | | |  }	 | | | |	  \ }
 } |	 j j d d   } t |  d |
 d | d | d |	 d | d | S(   NR8   R   R   R   R    R!   R   (   R.   R9   R:   R;   R<   R   R   (   R
   R'   R(   R)   R*   R!   R=   t   status_getterR   R    R   R   R   (    (    sQ   lib/python2.7/site-packages/anaconda_project/requirements_registry/requirement.pyt   _create_status_from_analysisΖ   s    c         C@  s   d S(   s  Check on the requirement and return a ``RequirementStatus`` with the current status.

        This may attempt to talk to servers, check that files
        exist on disk, and other work of that nature to verify the
        requirement's status, so be careful about when and how
        often this gets called.

        Args:
            environ (dict): use this rather than the system environment directly
            local_state_file (LocalStateFile): project local state
            default_env_spec_name (str): fallback env spec name
            overrides (UserConfigOverrides): user-supplied forced choices
            latest_provide_result (ProvideResult): most recent result of ``provide()`` or None

        Returns:
            a ``RequirementStatus``

        N(    (   R
   R'   R(   R)   R*   R!   (    (    sQ   lib/python2.7/site-packages/anaconda_project/requirements_registry/requirement.pyR&   Φ   s    N(   R   R   R   R   R   R   R3   R5   R4   R7   R>   R@   R   R&   (    (    (    sQ   lib/python2.7/site-packages/anaconda_project/requirements_registry/requirement.pyR,      s   					t	   _PASSWORDt   _SECRET_KEYt   _SECRETt   EnvVarRequirementc           B@  s   e  Z d  Z e d    Z d d  Z d   Z e d    Z	 e d    Z
 e d    Z e d    Z d   Z d	   Z d
   Z d d  Z RS(   s9   A requirement that a certain environment variable be set.c         C@  sΧ   t  | t  s t  | j d d   } | d  k r< t } nH t  | t  rT t } n0 t |  su t  | t	 t
 f  r~ t } n t } d | k r¦ | d  k r¦ | d =n  | r° t S| j d j d | d |   t Sd  S(   NR-   sV   default value for variable {env_var} must be null, a string, or a number, not {value}.t   env_varR   (   R1   R/   t   AssertionErrorR<   R   t   Truet   boolt   FalseR   t   intt   floatt   appendt   format(   R
   R0   RE   t   problemst   raw_defaultt   good_default(    (    sQ   lib/python2.7/site-packages/anaconda_project/requirements_registry/requirement.pyt   _parse_defaultτ   s"    		!	
	c         C@  s8   t  t |   j | |  | d k	 s+ t  | |  _ d S(   sP   Construct an EnvVarRequirement for the given ``env_var`` with the given options.N(   t   superRD   R   R   RF   RE   (   R
   R.   RE   R0   (    (    sQ   lib/python2.7/site-packages/anaconda_project/requirements_registry/requirement.pyR     s    c         C@  s   d |  j  j |  j f S(   s!   Custom repr of EnvVarRequirement.s   %s(env_var='%s')(   t	   __class__R   RE   (   R
   (    (    sQ   lib/python2.7/site-packages/anaconda_project/requirements_registry/requirement.pyR"     s    c         C@  s   |  j  S(   s   Override superclass title.(   RE   (   R
   (    (    sQ   lib/python2.7/site-packages/anaconda_project/requirements_registry/requirement.pyR3     s    c         C@  s   |  j  d |  j  S(   s    Override superclass description.s$   %s environment variable must be set.(   R5   RE   (   R
   (    (    sQ   lib/python2.7/site-packages/anaconda_project/requirements_registry/requirement.pyR4     s    c         @  s8   d   j  k r   j  d St   f d   t D  Sd S(   sJ   Get whether this is a password-type value we should encrypt when possible.t	   encryptedc         3@  s!   |  ] }   j  j |  Vq d  S(   N(   RE   t   endswith(   t   .0t   suffix(   R
   (    sQ   lib/python2.7/site-packages/anaconda_project/requirements_registry/requirement.pys	   <genexpr>*  s    N(   R0   t   anyt   _secret_suffixes(   R
   (    (   R
   sQ   lib/python2.7/site-packages/anaconda_project/requirements_registry/requirement.pyRT   $  s    c         C@  s3   |  j  j d d  } | d k r% d St |  Sd S(   s*   Get the default, forced to string or None.R-   N(   R0   R<   R   R2   (   R
   R   (    (    sQ   lib/python2.7/site-packages/anaconda_project/requirements_registry/requirement.pyt   default_as_string,  s    c         C@  s.   | j  |  j d  } | d k r* d } n  | S(   s)   A "protected" method for subtypes to use.t    N(   R<   RE   R   (   R
   R'   R   (    (    sQ   lib/python2.7/site-packages/anaconda_project/requirements_registry/requirement.pyt   _get_value_of_env_var7  s    	c         C@  s   d j  d |  j  S(   s)   A "protected" method for subtypes to use.s*   Environment variable {env_var} is not set.RE   (   RM   RE   (   R
   (    (    sQ   lib/python2.7/site-packages/anaconda_project/requirements_registry/requirement.pyt   _unset_message>  s    c         C@  sB   |  j  r d j d |  j  Sd j d |  j d |  j |   Sd S(   s)   A "protected" method for subtypes to use.s&   Environment variable {env_var} is set.RE   s/   Environment variable {env_var} set to '{value}'R   N(   RT   RM   RE   R\   (   R
   R'   (    (    sQ   lib/python2.7/site-packages/anaconda_project/requirements_registry/requirement.pyt   _set_messageB  s    		c   	      C@  ss   |  j  |  } | d k	 } | r3 |  j |  } n |  j   } |  j | | d | d | d | d | d d d | S(	   s&   Override superclass to get our status.R)   R*   R   R   R=   t   EnvVarProviderR!   N(   R\   R   R^   R]   R>   (	   R
   R'   R(   R)   R*   R!   R   R   R   (    (    sQ   lib/python2.7/site-packages/anaconda_project/requirements_registry/requirement.pyR&   K  s    N(   R   R   R   t   classmethodRQ   R   R   R"   R   R3   R4   RT   RZ   R\   R]   R^   R&   (    (    (    sQ   lib/python2.7/site-packages/anaconda_project/requirements_registry/requirement.pyRD   ρ   s   					N(   RA   RB   RC   (   R   t
   __future__R    t   abcR   R   t   copyR   t#   anaconda_project.internal.metaclassR   t$   anaconda_project.internal.py2_compatR   t   anaconda_project.statusR   t   objectR   R   R,   RY   RD   (    (    (    sQ   lib/python2.7/site-packages/anaconda_project/requirements_registry/requirement.pyt   <module>   s   Vm