3
\� � @ sZ d Z ddlmZ ddlmZmZmZmZ ddlm Z m
Z
mZ dd� ZG dd � d ej
�Zd
S )z�Fixer for import statements.
If spam is being imported from the local directory, this import:
from spam import eggs
Becomes:
from .spam import eggs
And this import:
import spam
Becomes:
from . import spam
� )�
fixer_base� )�dirname�join�exists�sep)�
FromImport�syms�tokenc c s� | g}x�|r�|j � }|jtjkr*|jV q|jtjkrPdjdd� |jD ��V q|jtj krn|j
|jd � q|jtjkr�|j|jddd� � qt
d��qW dS ) zF
Walks over all the names imported in a dotted_as_names node.
� c S s g | ]
}|j �qS � )�value)�.0Zchr r �0/usr/lib64/python3.6/lib2to3/fixes/fix_import.py�
s z$traverse_imports..r Nr zunknown node type�����)�pop�typer
�NAMEr
r Zdotted_namer �childrenZdotted_as_name�appendZdotted_as_names�extend�AssertionError)�names�pending�noder r r �traverse_imports s
r c s4 e Zd ZdZdZ� fdd�Zdd� Zdd� Z� ZS ) � FixImportTzj
import_from< 'from' imp=any 'import' ['('] any [')'] >
|
import_name< 'import' imp=any >
c s" t t| �j||� d|jk| _d S )NZabsolute_import)�superr �
start_treeZfuture_features�skip)�selfZtree�name)� __class__r r r / s zFixImport.start_treec C s� | j r
d S |d }|jtjkrZxt|d�s6|jd }q W | j|j�r�d|j |_|j� n^d}d}x$t |�D ]}| j|�r�d}qld}qlW |r�|r�| j
|d� d S td|g�}|j|_|S d S )N�impr
r �.FTz#absolute and local imports together)
r r r Zimport_from�hasattrr �probably_a_local_importr
Zchangedr Zwarningr �prefix)r! r Zresultsr$ Z
have_localZ
have_absoluteZmod_name�newr r r � transform3 s,
zFixImport.transformc C sv |j d�rdS |jdd�d }t| j�}t||�}ttt|�d��sHdS x(dtddd d
gD ]}t|| �rZdS qZW dS )Nr% F� r z__init__.pyz.pyz.pycz.soz.slz.pydT)�
startswith�splitr �filenamer r r )r! Zimp_name� base_pathZextr r r r' U s
z!FixImport.probably_a_local_import) �__name__�
__module__�__qualname__Z
BM_compatibleZPATTERNr r* r' �
__classcell__r r )r# r r &