예제 #1
0
def visit_Call(
    state: State,
    node: ast.Call,
    parent: ast.AST,
) -> Iterable[tuple[Offset, TokenFunc]]:
    if (OLD_NAME in state.from_imports[MODULE]
            and isinstance(node.func, ast.Name) and node.func.id == OLD_NAME):
        yield ast_start_offset(node), partial(fix_offset_arg, node=node)
예제 #2
0
def visit_ImportFrom(
    state: State,
    node: ast.ImportFrom,
    parent: ast.AST,
) -> Iterable[tuple[Offset, TokenFunc]]:
    if (node.module == MODULE and is_rewritable_import_from(node)
            and any(alias.name == OLD_NAME for alias in node.names)):
        yield ast_start_offset(node), partial(fix_import_from, node=node)
예제 #3
0
def visit_ImportFrom(
    state: State,
    node: ast.ImportFrom,
    parent: ast.AST,
) -> Iterable[tuple[Offset, TokenFunc]]:
    if node.module == MODULE and is_rewritable_import_from(node):
        yield ast_start_offset(node), partial(update_import_names,
                                              node=node,
                                              name_map=NAMES)
예제 #4
0
def visit_Name(
    state: State,
    node: ast.Name,
    parent: ast.AST,
) -> Iterable[tuple[Offset, TokenFunc]]:
    if (name := node.id) in NAMES and name in state.from_imports[MODULE]:
        yield ast_start_offset(node), partial(find_and_replace_name,
                                              name=name,
                                              new=NAMES[name])
예제 #5
0
def visit_ImportFrom(
    state: State,
    node: ast.ImportFrom,
    parent: ast.AST,
) -> Iterable[tuple[Offset, TokenFunc]]:
    if (node.level == 0 and node.module == MODULE and any(
        (alias.name == OLD_NAME and alias.asname is None)
            for alias in node.names)):
        yield ast_start_offset(node), partial(fix_import, node=node)
예제 #6
0
def visit_Name(
    state: State,
    node: ast.Name,
    parent: ast.AST,
) -> Iterable[tuple[Offset, TokenFunc]]:
    if node.id == OLD_NAME and OLD_NAME in state.from_imports[MODULE]:
        yield ast_start_offset(node), partial(find_and_replace_name,
                                              name=OLD_NAME,
                                              new="html.escape")
예제 #7
0
def visit_Attribute(
    state: State,
    node: ast.Attribute,
    parent: ast.AST,
) -> Iterable[tuple[Offset, TokenFunc]]:
    if ((name := node.attr) in NAMES and isinstance(node.value, ast.Name)
            and node.value.id == "encoding"
            and "encoding" in state.from_imports["django.utils"]):
        yield ast_start_offset(node), partial(find_and_replace_name,
                                              name=name,
                                              new=NAMES[name])
예제 #8
0
def visit_ImportFrom(
    state: State,
    node: ast.ImportFrom,
    parent: ast.AST,
) -> Iterable[tuple[Offset, TokenFunc]]:
    if (node.module == MODULE and is_rewritable_import_from(node)
            and any(alias.name == "lru_cache" for alias in node.names)):
        yield ast_start_offset(node), partial(
            update_import_modules,
            node=node,
            module_rewrites={"lru_cache": "functools"},
        )
def visit_Assign(
    state: State,
    node: ast.Assign,
    parent: ast.AST,
) -> Iterable[tuple[Offset, TokenFunc]]:
    if (
        len(node.targets) == 1
        and isinstance(node.targets[0], ast.Name)
        and node.targets[0].id == OLD_NAME
        and state.looks_like_settings_file()
    ):
        yield ast_start_offset(node), partial(rewrite_setting, node=node)
예제 #10
0
def visit_ImportFrom(
    state: State,
    node: ast.ImportFrom,
    parent: ast.AST,
) -> Iterable[tuple[Offset, TokenFunc]]:
    if (node.module in REWRITES and is_rewritable_import_from(node)
            and any(alias.name in REWRITES[node.module]
                    for alias in node.names)):
        yield ast_start_offset(node), partial(
            update_import_modules,
            node=node,
            module_rewrites=REWRITES[node.module])
예제 #11
0
def visit_ImportFrom(
    state: State,
    node: ast.ImportFrom,
    parent: ast.AST,
) -> Iterable[tuple[Offset, TokenFunc]]:
    if (is_rewritable_import_from(node) and node.module == "django.db.models"
            and not state.looks_like_migrations_file()):
        yield ast_start_offset(node), partial(
            update_import_names,
            node=node,
            name_map={"NullBooleanField": "BooleanField"},
        )
예제 #12
0
def visit_Call(
    state: State,
    node: ast.Call,
    parent: ast.AST,
) -> Iterable[tuple[Offset, TokenFunc]]:
    if (isinstance(node.func, ast.Attribute)
            and node.func.attr in {"ForeignKey", "OneToOneField"}
            and "models" in state.from_imports["django.db"]
            and isinstance(node.func.value, ast.Name)
            and node.func.value.id == "models" and len(node.args) < 2
            and all(kw.arg != "on_delete" for kw in node.keywords)):
        yield ast_start_offset(node), partial(add_on_delete_keyword,
                                              num_pos_args=len(node.args))
def visit_ImportFrom(
    state: State,
    node: ast.ImportFrom,
    parent: ast.AST,
) -> Iterable[tuple[Offset, TokenFunc]]:
    if (
        node.module in MODULES
        and is_rewritable_import_from(node)
        and any(alias.name in NAME_MAP for alias in node.names)
    ):
        yield ast_start_offset(node), partial(
            update_import_names, node=node, name_map=NAME_MAP
        )
예제 #14
0
def visit_Subscript(
    state: State,
    node: ast.Subscript,
    parent: ast.AST,
) -> Iterable[tuple[Offset, TokenFunc]]:
    if (
        not isinstance(parent, ast.Assign)
        and is_request_or_self_request_meta(node.value)
        and (meta_name := extract_constant(node.slice)) is not None
        and meta_name.startswith("HTTP_")
    ):
        yield ast_start_offset(node), partial(
            rewrite_header_access, meta_name=meta_name
        )
예제 #15
0
def visit_Call(
    state: State,
    node: ast.Call,
    parent: ast.AST,
) -> Iterable[tuple[Offset, TokenFunc]]:
    if ((isinstance(node.func, ast.Name)
         and "NullBooleanField" in state.from_imports["django.db.models"]
         and node.func.id == "NullBooleanField") or
        (isinstance(node.func, ast.Attribute) and node.func.attr
         == "NullBooleanField" and "models" in state.from_imports["django.db"]
         and isinstance(node.func.value, ast.Name) and node.func.value.id
         == "models")) and not state.looks_like_migrations_file():
        yield ast_start_offset(node), partial(fix_null_boolean_field,
                                              node=node)
예제 #16
0
def visit_Assign(
    state: State,
    node: ast.Assign,
    parent: ast.AST,
) -> Iterable[tuple[Offset, TokenFunc]]:
    if (
        state.looks_like_dunder_init_file()
        and isinstance(parent, ast.Module)
        and len(node.targets) == 1
        and isinstance(node.targets[0], ast.Name)
        and node.targets[0].id == "default_app_config"
        and isinstance(node.value, ast.Constant)
        and isinstance(node.value.value, str)
    ):
        yield ast_start_offset(node), partial(remove_assignment, node=node)
예제 #17
0
def visit_ImportFrom(
    state: State,
    node: ast.ImportFrom,
    parent: ast.AST,
) -> Iterable[tuple[Offset, TokenFunc]]:
    if (
        node.module == "django.conf.urls"
        and is_rewritable_import_from(node)
        and any(alias.name in ("include", "url") for alias in node.names)
    ):
        yield ast_start_offset(node), partial(
            update_import,
            node=node,
            state=state,
        )
예제 #18
0
def visit_Call(
    state: State,
    node: ast.Call,
    parent: ast.AST,
) -> Iterable[tuple[Offset, TokenFunc]]:
    if (
        isinstance(node.func, ast.Attribute)
        and node.func.attr == "get"
        and is_request_or_self_request_meta(node.func.value)
        and len(node.args) >= 1
        and isinstance(node.args[0], ast.Constant)
        and isinstance(meta_name := node.args[0].value, str)
        and meta_name.startswith("HTTP_")
    ):
        yield ast_start_offset(node), partial(
            rewrite_header_access, meta_name=meta_name
        )
예제 #19
0
def visit_Assign(
    state: State,
    node: ast.Assign,
    parent: ast.AST,
) -> Iterable[tuple[Offset, TokenFunc]]:
    if (
        isinstance(parent, ast.ClassDef)
        and len(node.targets) == 1
        and isinstance(node.targets[0], ast.Name)
        and node.targets[0].id in ("allow_database_queries", "multi_db")
        and isinstance(node.value, ast.Constant)
        and (node.value.value is True or node.value.value is False)
        and state.looks_like_test_file()
    ):
        yield ast_start_offset(node), partial(
            replace_assignment, node=node, value=node.value.value
        )
예제 #20
0
def visit_Call(
    state: State,
    node: ast.Call,
    parent: ast.AST,
) -> Iterable[tuple[Offset, TokenFunc]]:
    if (isinstance(node.func, ast.Name) and NAME in state.from_imports[MODULE]
            and node.func.id == NAME) or (
                isinstance(node.func, ast.Attribute) and node.func.attr == NAME
                and isinstance(node.func.value, ast.Name)
                and node.func.value.id == "dispatch"
                and "dispatch" in state.from_imports["django"]):
        if len(node.args) > 0 or any(k.arg == "providing_args"
                                     for k in node.keywords):
            yield ast_start_offset(node), partial(
                remove_providing_args,
                node=node,
            )
예제 #21
0
def visit_Name(
    state: State,
    node: ast.Name,
    parent: ast.AST,
) -> Iterable[tuple[Offset, TokenFunc]]:
    if (name := node.id) in state.from_imports[MODULE]:
        new_name: str | None
        if name in RENAMES:
            new_name = RENAMES[name]
        elif name in URLLIB_NAMES:
            new_name = URLLIB_NAMES[name]
        else:
            new_name = None

        if new_name is not None:
            yield ast_start_offset(node), partial(find_and_replace_name,
                                                  name=name,
                                                  new=new_name)
예제 #22
0
def visit_ImportFrom(
    state: State,
    node: ast.ImportFrom,
    parent: ast.AST,
) -> Iterable[tuple[Offset, TokenFunc]]:
    if node.module == MODULE and is_rewritable_import_from(node):
        name_map = {}
        urllib_names = {}
        for alias in node.names:
            if alias.name in RENAMES:
                name_map[alias.name] = RENAMES[alias.name]
            elif alias.name in URLLIB_NAMES:
                name_map[alias.name] = ""
                urllib_names[alias.name] = alias.asname

        if name_map:
            yield ast_start_offset(node), partial(
                fix_import,
                node=node,
                name_map=name_map,
                urllib_names=urllib_names,
            )
예제 #23
0
def visit_Call(
    state: State,
    node: ast.Call,
    parent: ast.AST,
) -> Iterable[tuple[Offset, TokenFunc]]:
    if (
        isinstance(node.func, ast.Name)
        and node.func.id == "url"
        and "url" in state.from_imports["django.conf.urls"]
        # cannot convert where called with all kwargs as names don't align
        and len(node.args) >= 1
    ):
        regex_path: str | None = None
        if isinstance(node.args[0], ast.Constant) and isinstance(
            node.args[0].value, str
        ):
            regex_path = node.args[0].value

        yield ast_start_offset(node), partial(
            fix_url_call,
            regex_path=regex_path,
            state=state,
        )