
    Be                         d Z ddlZddlZddlZddlZddlZ ej                         dk(  Z ej                         dk(  Z	 G d de
      Zd Zd Zd	 Zdd
d
ddZy)a  
Allow a globally installed Pylint to lint an (active) virtual or Conda
environment.

If a globally installed Pylint is invoked from an active virtualenv or Conda
environment, add the environment's paths to Pylint.

If no virtualenv is active but the CWD contains a virtualenv in a  ``.venv``
folder, activate that env and add its paths to Pylint.

Do nothing if no virtualenv is active or if Pylint is installed within the
active virtualenv.

Activation logic taken from https://github.com/pypa/virtualenv

Usage:

- Add an init hook to your ``.pylintrc``::
    init-hook=
        try: import pylint_venv
        except ImportError: pass
        else: pylint_venv.inithook()

- Add the init hook as command line argument::

    pylint --init-hook="import pylint_venv; pylint_venv.inithook()"

- Add the init hook as command line argument and explicitly pass a venv::

    pylint --init-hook="import pylint_venv; pylint_venv.inithook('$(pwd)/env')"

- If Pylint itself is installed in a virtualenv, then you can ignore it by passing
``force_venv_activation=True`` to force activation of a different virtualenv::

    pylint --init--hook="import pylint_venv; pylint_venv.inithook(force_venv_activation=True)"

    NWindowsPyPyc                       e Zd Zy)IncompatibleVenvErrorN)__name__
__module____qualname__     +lib/python3.12/site-packages/pylint_venv.pyr   r   2   s    r   r   c                      t        t        dt        j                        t        j                  k7  } t        t        d      }| xs |S )z;Return *True* if a virtual environment is currently active.base_prefixreal_prefix)getattrsysprefixhasattr)is_conda_envis_virtualenvs     r   is_venvr   6   s4    3szz:cjjHLC/M(=(r   c            	         dD ]  } t        j                  | d      }|s|c S  t        j                  dd      j                  d      }t        j                         }t        rdnd}|D ]c  }t         j
                  j                  t         j
                  j                  |||d            sCt         j
                  j                  ||      c S  y	)
z#Check for a virtualenv or Conda env)VIRTUAL_ENVCONDA_PREFIX PYLINT_VENV_PATHz.venv:ScriptsbinactivateN)osgetenvsplitgetcwdIS_WINpathisfilejoin)varvenv
venv_pathscwd	exec_pathvenv_dirs         r   detect_venvr.   =   s    . yyb!K -w7==cBJ
))+C#	I /77>>"'',,sHiLM77<<X../ r   c                 F   t         r"t        j                  j                  | d      }n<t        r#t        j                  j                  | dd      }nt        j                  j                  | d      }t        j
                  |      D cg c]  }t        j                  d|      s| }}t        |D cg c]?  }t        j                  j                  t        j                  j                  ||            A c}      }t        |      dk(  rt        d| d      t        |      dkD  rt        d| d	      t        j                  j                  t        |      d   d      }t        t        j                        }t        j                  |       t        j                   t        _        | t        _        t        t        j                        }|D cg c]	  }||vs| }}|D cg c]	  }||v s| }	}||	z   t        j                  d
d
 y
c c}w c c}w c c}w c c}w )z3Activate the virtual environment with prefix *venv*zsite-packagesLiblibzpython\d+.\d+r   zThe virtual environment z& is missing a lib/pythonX.Y directory.   z( has multiple lib/pythonX.Y directories.N)IS_PYPYr    r%   r'   r$   listdirrematchsetrealpathlenr   listr   site
addsitedirr   r   )
r)   site_packageslib_dirdpython_dirsprevnewi	new_paths
kept_pathss
             r   activate_venvrF   P   s   T?;	T5/B'',,tU+"$**W"5WQBRTU9VqWW {[!277++BGGLL!,DE[\{q '*4(2XY  {a'*4(2Z[  T+%6q%9?Ksxx=DOOM"jjCOCJ sxx.C1q1D=1I1 .AI!.J.j(CHHQK1 X \& 2.s+   	H%H4AH	HH(	H2HF)force_venv_activationquietc                    |st               ry| 
t               } | y|st        d|  t        j                         t        |        y)a-  Add virtualenv's paths and site_packages to Pylint.

    Use environment with prefix *venv* if provided else try to auto-detect an active virtualenv.
    Pass *force_venv_activation=True* if Pylint itself is installed in a different virtualenv.

    Passing in *quiet=True* suppresses all output.
    NzUsing venv: )file)r   r.   printr   stderrrF   )r)   rG   rH   s      r   inithookrM   s   sB     !WY|}|TF##**5$r   )N)__doc__r    platformr5   r;   r   systemr$   python_implementationr3   	Exceptionr   r   r.   rF   rM   r
   r   r   <module>rS      sp   $L 
  	  
 
	i	'
((
(
(
*f
4	I 	)& )Fe r   