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)
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)
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)
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])
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)
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")
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])
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)
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])
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"}, )
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 )
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 )
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)
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)
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, )
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 )
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 )
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, )
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)
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, )
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, )