From 17b5c63dc882b2221d7bd61281e895f0f55199e0 Mon Sep 17 00:00:00 2001 From: tomcodegen Date: Fri, 14 Feb 2025 10:06:08 -0800 Subject: [PATCH 1/6] unpacking --- src/codegen/sdk/python/assignment.py | 71 +++++++++++ .../sdk/python/expressions/test_unpacking.py | 116 ++++++++++++++++++ 2 files changed, 187 insertions(+) create mode 100644 tests/unit/codegen/sdk/python/expressions/test_unpacking.py diff --git a/src/codegen/sdk/python/assignment.py b/src/codegen/sdk/python/assignment.py index f295f741c..e12db5fd0 100644 --- a/src/codegen/sdk/python/assignment.py +++ b/src/codegen/sdk/python/assignment.py @@ -1,9 +1,13 @@ from __future__ import annotations +from collections.abc import Collection from typing import TYPE_CHECKING +from codegen.sdk.codebase.transactions import RemoveTransaction, TransactionPriority from codegen.sdk.core.assignment import Assignment +from codegen.sdk.core.autocommit.decorators import remover from codegen.sdk.core.expressions.multi_expression import MultiExpression +from codegen.sdk.core.statements.assignment_statement import AssignmentStatement from codegen.sdk.extensions.autocommit import reader from codegen.sdk.python.symbol import PySymbol from codegen.sdk.python.symbol_groups.comment_group import PyCommentGroup @@ -96,3 +100,70 @@ def inline_comment(self) -> PyCommentGroup | None: """ # HACK: This is a temporary solution until comments are fixed return PyCommentGroup.from_symbol_inline_comments(self, self.ts_node.parent) + + @remover + def remove(self, delete_formatting: bool = True, priority: int = 0, dedupe: bool = True) -> None: + """Deletes this assignment and its related extended nodes (e.g. decorators, comments). + + + Removes the current node and its extended nodes (e.g. decorators, comments) from the codebase. + After removing the node, it handles cleanup of any surrounding formatting based on the context. + + Args: + delete_formatting (bool): Whether to delete surrounding whitespace and formatting. Defaults to True. + priority (int): Priority of the removal transaction. Higher priority transactions are executed first. Defaults to 0. + dedupe (bool): Whether to deduplicate removal transactions at the same location. Defaults to True. + + Returns: + None + """ + if isinstance(self.parent,AssignmentStatement) and len(self.parent.assignments) > 1: + # Unpacking assignments + name = self.get_name() + if isinstance(self.value, Collection): + # Tuples + transaction_count = [ + any( + self.transaction_manager.get_transactions_at_range( + self.file.path, start_byte=asgnmt.get_name().start_byte, end_byte=asgnmt.get_name().end_byte, transaction_order=TransactionPriority.Remove + ) + ) + for asgnmt in self.parent.assignments + ].count(True) + # Check for existing transactions + if transaction_count < len(self.parent.assignments) - 1: + idx = self.parent.left.index(name) + value = self.value[idx] + removal_queue_values = getattr(self.parent, "removal_queue", []) + self.parent.removal_queue = removal_queue_values + removal_queue_values.append(str(value)) + if len(self.value) - transaction_count == 2: + remainder = str(next(x for x in self.value if x not in removal_queue_values)) + r_t = RemoveTransaction(self.value.start_byte, self.value.end_byte, self.file, priority=priority) + self.transaction_manager.add_transaction(r_t) + self.value.insert_at(self.value.start_byte, remainder, priority=priority) + else: + value.remove(delete_formatting=delete_formatting, priority=priority, dedupe=dedupe) + name.remove(delete_formatting=delete_formatting, priority=priority, dedupe=dedupe) + return + else: + transaction_count = [ + any( + self.transaction_manager.get_transactions_at_range( + self.file.path, start_byte=asgnmt.get_name().start_byte, end_byte=asgnmt.get_name().end_byte, transaction_order=TransactionPriority.Edit + ) + ) + for asgnmt in self.parent.assignments + ].count(True) + throwaway = [asgnmt.name == "_" for asgnmt in self.parent.assignments].count(True) + if transaction_count + throwaway < len(self.parent.assignments) - 1: + name.edit("_", priority=priority, dedupe=dedupe) + return + if getattr(self.parent, "removal_queue", None): + for node in self.extended_nodes: + transactions = self.transaction_manager.get_transactions_at_range(self.file.path, start_byte=node.start_byte, end_byte=node.end_byte) + for transaction in transactions: + self.transaction_manager.queued_transactions[self.file.path].remove(transaction) + + for node in self.extended_nodes: + node._remove(delete_formatting=delete_formatting, priority=priority, dedupe=dedupe) diff --git a/tests/unit/codegen/sdk/python/expressions/test_unpacking.py b/tests/unit/codegen/sdk/python/expressions/test_unpacking.py new file mode 100644 index 000000000..098ef3bdf --- /dev/null +++ b/tests/unit/codegen/sdk/python/expressions/test_unpacking.py @@ -0,0 +1,116 @@ +from codegen.sdk.codebase.factory.get_session import get_codebase_session + + +def test_remove_unpacking_assignment(tmpdir) -> None: + # language=python + content = """foo,bar,buzz = (a, b, c)""" + + with get_codebase_session(tmpdir=tmpdir, files={"test1.py": content, "test2.py": content, "test3.py": content}) as codebase: + file1 = codebase.get_file("test1.py") + file2 = codebase.get_file("test2.py") + file3 = codebase.get_file("test3.py") + + foo = file1.get_symbol("foo") + foo.remove() + codebase.commit() + + assert len(file1.symbols) == 2 + statement = file1.symbols[0].parent + assert len(statement.assignments) == 2 + assert len(statement.value) == 2 + assert file1.source == """bar,buzz = (b, c)""" + bar = file2.get_symbol("bar") + bar.remove() + codebase.commit() + assert len(file2.symbols) == 2 + statement = file2.symbols[0].parent + assert len(statement.assignments) == 2 + assert len(statement.value) == 2 + assert file2.source == """foo,buzz = (a, c)""" + + buzz = file3.get_symbol("buzz") + buzz.remove() + codebase.commit() + + assert len(file3.symbols) == 2 + statement = file3.symbols[0].parent + assert len(statement.assignments) == 2 + assert len(statement.value) == 2 + assert file3.source == """foo,bar = (a, b)""" + + file1_bar = file1.get_symbol("bar") + + file1_bar.remove() + codebase.commit() + assert file1.source == """buzz = c""" + + file1_buzz = file1.get_symbol("buzz") + file1_buzz.remove() + + codebase.commit() + assert len(file1.symbols) == 0 + assert file1.source == """""" + + +def test_remove_unpacking_assignment_funct(tmpdir) -> None: + # language=python + content = """foo,bar,buzz = f()""" + + with get_codebase_session(tmpdir=tmpdir, files={"test1.py": content, "test2.py": content, "test3.py": content}) as codebase: + file1 = codebase.get_file("test1.py") + file2 = codebase.get_file("test2.py") + file3 = codebase.get_file("test3.py") + + foo = file1.get_symbol("foo") + foo.remove() + codebase.commit() + + assert len(file1.symbols) == 3 + statement = file1.symbols[0].parent + assert len(statement.assignments) == 3 + assert file1.source == """_,bar,buzz = f()""" + bar = file2.get_symbol("bar") + bar.remove() + codebase.commit() + assert len(file2.symbols) == 3 + statement = file2.symbols[0].parent + assert len(statement.assignments) == 3 + assert file2.source == """foo,_,buzz = f()""" + + buzz = file3.get_symbol("buzz") + buzz.remove() + codebase.commit() + + assert len(file3.symbols) == 3 + statement = file3.symbols[0].parent + assert len(statement.assignments) == 3 + assert file3.source == """foo,bar,_ = f()""" + + file1_bar = file1.get_symbol("bar") + file1_buzz = file1.get_symbol("buzz") + + file1_bar.remove() + file1_buzz.remove() + codebase.commit() + assert len(file1.symbols) == 0 + assert file1.source == """""" + + +def test_remove_unpacking_assignment_num(tmpdir) -> None: + # language=python + content = """foo,bar,buzz = (1, 2, 3)""" + + with get_codebase_session(tmpdir=tmpdir, files={"test1.py": content}) as codebase: + file1 = codebase.get_file("test1.py") + + foo = file1.get_symbol("foo") + buzz = file1.get_symbol("buzz") + + foo.remove() + buzz.remove() + codebase.commit() + + assert len(file1.symbols) == 1 + statement = file1.symbols[0].parent + assert len(statement.assignments) == 1 + assert file1.source == """bar = 2""" From 26b29e167d2d6961345ff3f0a5709e6b1c414d32 Mon Sep 17 00:00:00 2001 From: tomcodgen <191515280+tomcodgen@users.noreply.github.com> Date: Fri, 14 Feb 2025 18:08:18 +0000 Subject: [PATCH 2/6] Automated pre-commit update --- src/codegen/sdk/python/assignment.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/codegen/sdk/python/assignment.py b/src/codegen/sdk/python/assignment.py index e12db5fd0..9325963b8 100644 --- a/src/codegen/sdk/python/assignment.py +++ b/src/codegen/sdk/python/assignment.py @@ -117,7 +117,7 @@ def remove(self, delete_formatting: bool = True, priority: int = 0, dedupe: bool Returns: None """ - if isinstance(self.parent,AssignmentStatement) and len(self.parent.assignments) > 1: + if isinstance(self.parent, AssignmentStatement) and len(self.parent.assignments) > 1: # Unpacking assignments name = self.get_name() if isinstance(self.value, Collection): From 20c4af1d7ab3515d9621d0937b45dd06e43d8e21 Mon Sep 17 00:00:00 2001 From: tomcodegen Date: Tue, 18 Feb 2025 17:17:55 -0800 Subject: [PATCH 3/6] unpacking --- src/codegen/sdk/python/assignment.py | 90 +++++++++---------- .../python/statements/assignment_statement.py | 4 + .../shared/configs/models/feature_flags.py | 2 +- .../sdk/python/expressions/test_unpacking.py | 58 ++++++++++-- 4 files changed, 100 insertions(+), 54 deletions(-) diff --git a/src/codegen/sdk/python/assignment.py b/src/codegen/sdk/python/assignment.py index 9325963b8..5aa5d5ffa 100644 --- a/src/codegen/sdk/python/assignment.py +++ b/src/codegen/sdk/python/assignment.py @@ -101,6 +101,34 @@ def inline_comment(self) -> PyCommentGroup | None: # HACK: This is a temporary solution until comments are fixed return PyCommentGroup.from_symbol_inline_comments(self, self.ts_node.parent) + @noapidoc + def _partial_remove_when_tuple(self,name, delete_formatting: bool = True, priority: int = 0, dedupe: bool = True): + idx = self.parent.left.index(name) + value = self.value[idx] + self.parent._values_scheduled_for_removal.append(value) + #Special case for removing brackets of value + if len(self.value) - len(self.parent._values_scheduled_for_removal) == 1: + remainder = str(next(x for x in self.value if x not in self.parent._values_scheduled_for_removal and x != value)) + r_t = RemoveTransaction(self.value.start_byte, self.value.end_byte, self.file, priority=priority) + self.transaction_manager.add_transaction(r_t) + self.value.insert_at(self.value.start_byte, remainder, priority=priority) + else: + #Normal just remove one value + value.remove(delete_formatting=delete_formatting, priority=priority, dedupe=dedupe) + #Remove assignment name + name.remove(delete_formatting=delete_formatting, priority=priority, dedupe=dedupe) + + @noapidoc + def _active_transactions_on_assignment_names(self,transaction_order:TransactionPriority) -> int: + return[ + any( + self.transaction_manager.get_transactions_at_range( + self.file.path, start_byte=asgnmt.get_name().start_byte, end_byte=asgnmt.get_name().end_byte, transaction_order=transaction_order + ) + ) + for asgnmt in self.parent.assignments + ].count(True) + @remover def remove(self, delete_formatting: bool = True, priority: int = 0, dedupe: bool = True) -> None: """Deletes this assignment and its related extended nodes (e.g. decorators, comments). @@ -117,53 +145,23 @@ def remove(self, delete_formatting: bool = True, priority: int = 0, dedupe: bool Returns: None """ - if isinstance(self.parent, AssignmentStatement) and len(self.parent.assignments) > 1: - # Unpacking assignments - name = self.get_name() - if isinstance(self.value, Collection): - # Tuples - transaction_count = [ - any( - self.transaction_manager.get_transactions_at_range( - self.file.path, start_byte=asgnmt.get_name().start_byte, end_byte=asgnmt.get_name().end_byte, transaction_order=TransactionPriority.Remove - ) - ) - for asgnmt in self.parent.assignments - ].count(True) - # Check for existing transactions - if transaction_count < len(self.parent.assignments) - 1: - idx = self.parent.left.index(name) - value = self.value[idx] - removal_queue_values = getattr(self.parent, "removal_queue", []) - self.parent.removal_queue = removal_queue_values - removal_queue_values.append(str(value)) - if len(self.value) - transaction_count == 2: - remainder = str(next(x for x in self.value if x not in removal_queue_values)) - r_t = RemoveTransaction(self.value.start_byte, self.value.end_byte, self.file, priority=priority) - self.transaction_manager.add_transaction(r_t) - self.value.insert_at(self.value.start_byte, remainder, priority=priority) + if self.ctx.config.feature_flags.unpacking_assignment_partial_removal: + if isinstance(self.parent, AssignmentStatement) and len(self.parent.assignments) > 1: + # Unpacking assignments + name = self.get_name() + if isinstance(self.value, Collection): + if len(self.parent._values_scheduled_for_removal) < len(self.parent.assignments) - 1: + self._partial_remove_when_tuple(name,delete_formatting,priority,dedupe) + return else: - value.remove(delete_formatting=delete_formatting, priority=priority, dedupe=dedupe) - name.remove(delete_formatting=delete_formatting, priority=priority, dedupe=dedupe) - return - else: - transaction_count = [ - any( - self.transaction_manager.get_transactions_at_range( - self.file.path, start_byte=asgnmt.get_name().start_byte, end_byte=asgnmt.get_name().end_byte, transaction_order=TransactionPriority.Edit - ) - ) - for asgnmt in self.parent.assignments - ].count(True) - throwaway = [asgnmt.name == "_" for asgnmt in self.parent.assignments].count(True) - if transaction_count + throwaway < len(self.parent.assignments) - 1: - name.edit("_", priority=priority, dedupe=dedupe) - return - if getattr(self.parent, "removal_queue", None): - for node in self.extended_nodes: - transactions = self.transaction_manager.get_transactions_at_range(self.file.path, start_byte=node.start_byte, end_byte=node.end_byte) - for transaction in transactions: - self.transaction_manager.queued_transactions[self.file.path].remove(transaction) + self.parent._values_scheduled_for_removal=[] + else: + transaction_count=self._active_transactions_on_assignment_names(TransactionPriority.Edit) + throwaway = [asgnmt.name == "_" for asgnmt in self.parent.assignments].count(True) + #Only edit if we didn't already omit all the other assignments, otherwise just remove the whole thing + if transaction_count + throwaway < len(self.parent.assignments) - 1: + name.edit("_", priority=priority, dedupe=dedupe) + return for node in self.extended_nodes: node._remove(delete_formatting=delete_formatting, priority=priority, dedupe=dedupe) diff --git a/src/codegen/sdk/python/statements/assignment_statement.py b/src/codegen/sdk/python/statements/assignment_statement.py index a53690fcd..789027abf 100644 --- a/src/codegen/sdk/python/statements/assignment_statement.py +++ b/src/codegen/sdk/python/statements/assignment_statement.py @@ -30,6 +30,10 @@ class PyAssignmentStatement(AssignmentStatement["PyCodeBlock", PyAssignment]): assignment_types = {"assignment", "augmented_assignment", "named_expression"} + def __init__(self, ts_node, file_node_id, ctx, parent, pos, assignment_node): + super().__init__(ts_node, file_node_id, ctx, parent, pos, assignment_node) + self._values_scheduled_for_removal=[] + @classmethod def from_assignment(cls, ts_node: TSNode, file_node_id: NodeId, ctx: CodebaseContext, parent: PyCodeBlock, pos: int, assignment_node: TSNode) -> PyAssignmentStatement: """Creates a PyAssignmentStatement instance from a TreeSitter assignment node. diff --git a/src/codegen/shared/configs/models/feature_flags.py b/src/codegen/shared/configs/models/feature_flags.py index 8cecd1dca..ff2b2c622 100644 --- a/src/codegen/shared/configs/models/feature_flags.py +++ b/src/codegen/shared/configs/models/feature_flags.py @@ -28,7 +28,7 @@ class CodebaseFeatureFlags(BaseSettings): generics: bool = True import_resolution_overrides: dict[str, str] = Field(default_factory=lambda: {}) typescript: TypescriptConfig = Field(default_factory=TypescriptConfig) - + unpacking_assignment_partial_removal: bool = True class FeatureFlagsConfig(BaseModel): codebase: CodebaseFeatureFlags = Field(default_factory=CodebaseFeatureFlags) diff --git a/tests/unit/codegen/sdk/python/expressions/test_unpacking.py b/tests/unit/codegen/sdk/python/expressions/test_unpacking.py index 098ef3bdf..b010ad312 100644 --- a/tests/unit/codegen/sdk/python/expressions/test_unpacking.py +++ b/tests/unit/codegen/sdk/python/expressions/test_unpacking.py @@ -98,19 +98,63 @@ def test_remove_unpacking_assignment_funct(tmpdir) -> None: def test_remove_unpacking_assignment_num(tmpdir) -> None: # language=python - content = """foo,bar,buzz = (1, 2, 3)""" + content = """a,b,c,d,e,f = (1, 2, 2, 4, 5, 3)""" - with get_codebase_session(tmpdir=tmpdir, files={"test1.py": content}) as codebase: + with get_codebase_session(tmpdir=tmpdir, files={"test1.py": content,"test2.py":content}) as codebase: file1 = codebase.get_file("test1.py") - foo = file1.get_symbol("foo") - buzz = file1.get_symbol("buzz") + a = file1.get_symbol("a") + d = file1.get_symbol("d") - foo.remove() - buzz.remove() + a.remove() + d.remove() + codebase.commit() + + assert len(file1.symbols) == 4 + statement = file1.symbols[0].parent + assert len(statement.assignments) == 4 + assert file1.source == """b,c,e,f = (2, 2, 5, 3)""" + + e = file1.get_symbol("e") + c = file1.get_symbol("c") + + e.remove() + c.remove() + codebase.commit() + + assert len(file1.symbols) == 2 + statement = file1.symbols[0].parent + assert len(statement.assignments) == 2 + assert file1.source == """b,f = (2, 3)""" + + f = file1.get_symbol("f") + + f.remove() codebase.commit() assert len(file1.symbols) == 1 statement = file1.symbols[0].parent assert len(statement.assignments) == 1 - assert file1.source == """bar = 2""" + assert file1.source == """b = 2""" + file2 = codebase.get_file("test2.py") + a = file2.get_symbol("a") + d = file2.get_symbol("d") + e = file2.get_symbol("e") + c = file2.get_symbol("c") + f = file2.get_symbol("f") + b = file2.get_symbol("b") + + a.remove() + b.remove() + c.remove() + d.remove() + e.remove() + f.remove() + + codebase.commit() + + assert len(file2.symbols) == 0 + assert file2.source == """""" + + + From 815ab08eabf99a61a7e5a3d2c9820f6d8941e366 Mon Sep 17 00:00:00 2001 From: tomcodgen <191515280+tomcodgen@users.noreply.github.com> Date: Wed, 19 Feb 2025 01:19:45 +0000 Subject: [PATCH 4/6] Automated pre-commit update --- src/codegen/sdk/python/assignment.py | 30 ++++++++----------- .../python/statements/assignment_statement.py | 2 +- .../shared/configs/models/feature_flags.py | 1 + .../sdk/python/expressions/test_unpacking.py | 5 +--- 4 files changed, 16 insertions(+), 22 deletions(-) diff --git a/src/codegen/sdk/python/assignment.py b/src/codegen/sdk/python/assignment.py index 5aa5d5ffa..08576cca1 100644 --- a/src/codegen/sdk/python/assignment.py +++ b/src/codegen/sdk/python/assignment.py @@ -102,32 +102,28 @@ def inline_comment(self) -> PyCommentGroup | None: return PyCommentGroup.from_symbol_inline_comments(self, self.ts_node.parent) @noapidoc - def _partial_remove_when_tuple(self,name, delete_formatting: bool = True, priority: int = 0, dedupe: bool = True): + def _partial_remove_when_tuple(self, name, delete_formatting: bool = True, priority: int = 0, dedupe: bool = True): idx = self.parent.left.index(name) value = self.value[idx] self.parent._values_scheduled_for_removal.append(value) - #Special case for removing brackets of value + # Special case for removing brackets of value if len(self.value) - len(self.parent._values_scheduled_for_removal) == 1: remainder = str(next(x for x in self.value if x not in self.parent._values_scheduled_for_removal and x != value)) r_t = RemoveTransaction(self.value.start_byte, self.value.end_byte, self.file, priority=priority) self.transaction_manager.add_transaction(r_t) self.value.insert_at(self.value.start_byte, remainder, priority=priority) else: - #Normal just remove one value + # Normal just remove one value value.remove(delete_formatting=delete_formatting, priority=priority, dedupe=dedupe) - #Remove assignment name + # Remove assignment name name.remove(delete_formatting=delete_formatting, priority=priority, dedupe=dedupe) @noapidoc - def _active_transactions_on_assignment_names(self,transaction_order:TransactionPriority) -> int: - return[ - any( - self.transaction_manager.get_transactions_at_range( - self.file.path, start_byte=asgnmt.get_name().start_byte, end_byte=asgnmt.get_name().end_byte, transaction_order=transaction_order - ) - ) - for asgnmt in self.parent.assignments - ].count(True) + def _active_transactions_on_assignment_names(self, transaction_order: TransactionPriority) -> int: + return [ + any(self.transaction_manager.get_transactions_at_range(self.file.path, start_byte=asgnmt.get_name().start_byte, end_byte=asgnmt.get_name().end_byte, transaction_order=transaction_order)) + for asgnmt in self.parent.assignments + ].count(True) @remover def remove(self, delete_formatting: bool = True, priority: int = 0, dedupe: bool = True) -> None: @@ -151,14 +147,14 @@ def remove(self, delete_formatting: bool = True, priority: int = 0, dedupe: bool name = self.get_name() if isinstance(self.value, Collection): if len(self.parent._values_scheduled_for_removal) < len(self.parent.assignments) - 1: - self._partial_remove_when_tuple(name,delete_formatting,priority,dedupe) + self._partial_remove_when_tuple(name, delete_formatting, priority, dedupe) return else: - self.parent._values_scheduled_for_removal=[] + self.parent._values_scheduled_for_removal = [] else: - transaction_count=self._active_transactions_on_assignment_names(TransactionPriority.Edit) + transaction_count = self._active_transactions_on_assignment_names(TransactionPriority.Edit) throwaway = [asgnmt.name == "_" for asgnmt in self.parent.assignments].count(True) - #Only edit if we didn't already omit all the other assignments, otherwise just remove the whole thing + # Only edit if we didn't already omit all the other assignments, otherwise just remove the whole thing if transaction_count + throwaway < len(self.parent.assignments) - 1: name.edit("_", priority=priority, dedupe=dedupe) return diff --git a/src/codegen/sdk/python/statements/assignment_statement.py b/src/codegen/sdk/python/statements/assignment_statement.py index 789027abf..ad433ab3c 100644 --- a/src/codegen/sdk/python/statements/assignment_statement.py +++ b/src/codegen/sdk/python/statements/assignment_statement.py @@ -32,7 +32,7 @@ class PyAssignmentStatement(AssignmentStatement["PyCodeBlock", PyAssignment]): def __init__(self, ts_node, file_node_id, ctx, parent, pos, assignment_node): super().__init__(ts_node, file_node_id, ctx, parent, pos, assignment_node) - self._values_scheduled_for_removal=[] + self._values_scheduled_for_removal = [] @classmethod def from_assignment(cls, ts_node: TSNode, file_node_id: NodeId, ctx: CodebaseContext, parent: PyCodeBlock, pos: int, assignment_node: TSNode) -> PyAssignmentStatement: diff --git a/src/codegen/shared/configs/models/feature_flags.py b/src/codegen/shared/configs/models/feature_flags.py index ff2b2c622..f1030f9fb 100644 --- a/src/codegen/shared/configs/models/feature_flags.py +++ b/src/codegen/shared/configs/models/feature_flags.py @@ -30,5 +30,6 @@ class CodebaseFeatureFlags(BaseSettings): typescript: TypescriptConfig = Field(default_factory=TypescriptConfig) unpacking_assignment_partial_removal: bool = True + class FeatureFlagsConfig(BaseModel): codebase: CodebaseFeatureFlags = Field(default_factory=CodebaseFeatureFlags) diff --git a/tests/unit/codegen/sdk/python/expressions/test_unpacking.py b/tests/unit/codegen/sdk/python/expressions/test_unpacking.py index b010ad312..cdf853e37 100644 --- a/tests/unit/codegen/sdk/python/expressions/test_unpacking.py +++ b/tests/unit/codegen/sdk/python/expressions/test_unpacking.py @@ -100,7 +100,7 @@ def test_remove_unpacking_assignment_num(tmpdir) -> None: # language=python content = """a,b,c,d,e,f = (1, 2, 2, 4, 5, 3)""" - with get_codebase_session(tmpdir=tmpdir, files={"test1.py": content,"test2.py":content}) as codebase: + with get_codebase_session(tmpdir=tmpdir, files={"test1.py": content, "test2.py": content}) as codebase: file1 = codebase.get_file("test1.py") a = file1.get_symbol("a") @@ -155,6 +155,3 @@ def test_remove_unpacking_assignment_num(tmpdir) -> None: assert len(file2.symbols) == 0 assert file2.source == """""" - - - From 5779db51b21bf37ab1f103779f85855ad30c2837 Mon Sep 17 00:00:00 2001 From: tkucar Date: Thu, 20 Feb 2025 18:22:34 +0100 Subject: [PATCH 5/6] use super --- src/codegen/sdk/python/assignment.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/codegen/sdk/python/assignment.py b/src/codegen/sdk/python/assignment.py index 08576cca1..1c8d5c8d8 100644 --- a/src/codegen/sdk/python/assignment.py +++ b/src/codegen/sdk/python/assignment.py @@ -159,5 +159,4 @@ def remove(self, delete_formatting: bool = True, priority: int = 0, dedupe: bool name.edit("_", priority=priority, dedupe=dedupe) return - for node in self.extended_nodes: - node._remove(delete_formatting=delete_formatting, priority=priority, dedupe=dedupe) + super().remove(delete_formatting=delete_formatting,priority=priority,dedupe=dedupe) From a8ee770a27e92c1bc73cf8da2c8ce6cbd209723c Mon Sep 17 00:00:00 2001 From: tomcodgen <191515280+tomcodgen@users.noreply.github.com> Date: Thu, 20 Feb 2025 17:23:42 +0000 Subject: [PATCH 6/6] Automated pre-commit update --- src/codegen/sdk/python/assignment.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/codegen/sdk/python/assignment.py b/src/codegen/sdk/python/assignment.py index 1c8d5c8d8..7a521e67b 100644 --- a/src/codegen/sdk/python/assignment.py +++ b/src/codegen/sdk/python/assignment.py @@ -159,4 +159,4 @@ def remove(self, delete_formatting: bool = True, priority: int = 0, dedupe: bool name.edit("_", priority=priority, dedupe=dedupe) return - super().remove(delete_formatting=delete_formatting,priority=priority,dedupe=dedupe) + super().remove(delete_formatting=delete_formatting, priority=priority, dedupe=dedupe)