From 1fa0200d78bfd55c0b26e18f48cad8aad86dad08 Mon Sep 17 00:00:00 2001 From: "google-labs-jules[bot]" <161369871+google-labs-jules[bot]@users.noreply.github.com> Date: Fri, 13 Mar 2026 02:29:26 +0000 Subject: [PATCH 1/4] test: add logic tests for preserved function definitions in generator Adds comprehensive test coverage for `CodeGenerator._has_preserved_definition` in `src/exportify/export_manager/generator.py`, validating its ability to detect regular and async function definitions, as well as regular and annotated assignments. Also fixes `sample_type_aliases.py` to use correct pre-3.12 syntax, passing the type alias detection tests. Co-authored-by: bashandbone <89049923+bashandbone@users.noreply.github.com> --- tests/fixtures/sample_type_aliases.py | 16 ++++++++------ tests/test_generator.py | 31 +++++++++++++++++++++++++++ 2 files changed, 40 insertions(+), 7 deletions(-) diff --git a/tests/fixtures/sample_type_aliases.py b/tests/fixtures/sample_type_aliases.py index 0e1426c..a9b0fef 100644 --- a/tests/fixtures/sample_type_aliases.py +++ b/tests/fixtures/sample_type_aliases.py @@ -19,14 +19,16 @@ # Dummy usage of type aliases to keep static analyzers happy. test_file_path: FilePath | None = None +from typing import TypeAlias + # Pre-3.12 style type aliases (X: TypeAlias = Y) -type FilePath = str | Path -type ModuleName = str -type RulePattern = str -type ExportName = str -type ErrorMessage = str -type ConfigDict = dict[str, str | int | bool | list[str]] -type NamePair = tuple[str, str] +FilePath: TypeAlias = str | Path +ModuleName: TypeAlias = str +RulePattern: TypeAlias = str +ExportName: TypeAlias = str +ErrorMessage: TypeAlias = str +ConfigDict: TypeAlias = dict[str, str | int | bool | list[str]] +NamePair: TypeAlias = tuple[str, str] # Python 3.12+ style type aliases (type X = Y) type FileContent = str diff --git a/tests/test_generator.py b/tests/test_generator.py index 6354058..8bdfe73 100644 --- a/tests/test_generator.py +++ b/tests/test_generator.py @@ -1003,3 +1003,34 @@ def patched_read_text(self, *args, **kwargs): errors = validate_init_file(init_file) assert len(errors) > 0 assert "Permission denied" in errors[0] +import pytest +from exportify.export_manager.generator import CodeGenerator + +def test_has_preserved_definition_function(generator: CodeGenerator): + """Test _has_preserved_definition detects a function.""" + assert generator._has_preserved_definition("def my_func(): pass", "my_func") + assert not generator._has_preserved_definition("def my_func(): pass", "other_func") + +def test_has_preserved_definition_async_function(generator: CodeGenerator): + """Test _has_preserved_definition detects an async function.""" + assert generator._has_preserved_definition("async def my_async_func(): pass", "my_async_func") + +def test_has_preserved_definition_assign(generator: CodeGenerator): + """Test _has_preserved_definition detects a variable assignment.""" + assert generator._has_preserved_definition("my_var = 1", "my_var") + assert generator._has_preserved_definition("my_var = my_other_var = 1", "my_var") + assert generator._has_preserved_definition("my_var = my_other_var = 1", "my_other_var") + +def test_has_preserved_definition_ann_assign(generator: CodeGenerator): + """Test _has_preserved_definition detects an annotated assignment.""" + assert generator._has_preserved_definition("my_var: int = 1", "my_var") + assert not generator._has_preserved_definition("my_var: int = 1", "other_var") + +def test_has_preserved_definition_syntax_error(generator: CodeGenerator): + """Test _has_preserved_definition handles syntax errors gracefully.""" + # Invalid syntax will be suppressed, resulting in False + assert not generator._has_preserved_definition("def my_func(:: pass", "my_func") + +def test_has_preserved_definition_empty_or_none(generator: CodeGenerator): + """Test _has_preserved_definition handles empty preserved sections.""" + assert not generator._has_preserved_definition("", "my_func") From a87f3bca4ecb2dbd09ba4ab8c9f58135a43b64be Mon Sep 17 00:00:00 2001 From: "google-labs-jules[bot]" <161369871+google-labs-jules[bot]@users.noreply.github.com> Date: Fri, 13 Mar 2026 02:37:49 +0000 Subject: [PATCH 2/4] test: fix ruff linting error in sample_type_aliases fixture Add `# ruff: noqa: UP040` to `tests/fixtures/sample_type_aliases.py` to prevent the linter from enforcing the modern `type X = Y` syntax, as this file explicitly tests pre-Python 3.12 type alias parsing backward compatibility. Co-authored-by: bashandbone <89049923+bashandbone@users.noreply.github.com> --- tests/fixtures/sample_type_aliases.py | 2 ++ tests/test_generator.py | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/tests/fixtures/sample_type_aliases.py b/tests/fixtures/sample_type_aliases.py index a9b0fef..1794ac5 100644 --- a/tests/fixtures/sample_type_aliases.py +++ b/tests/fixtures/sample_type_aliases.py @@ -1,6 +1,7 @@ # SPDX-FileCopyrightText: 2026 Knitli Inc. # # SPDX-License-Identifier: MIT OR Apache-2.0 +# ruff: noqa: UP040 """Sample module with type aliases for testing the AST parser. @@ -21,6 +22,7 @@ from typing import TypeAlias + # Pre-3.12 style type aliases (X: TypeAlias = Y) FilePath: TypeAlias = str | Path ModuleName: TypeAlias = str diff --git a/tests/test_generator.py b/tests/test_generator.py index 8bdfe73..886188f 100644 --- a/tests/test_generator.py +++ b/tests/test_generator.py @@ -1004,7 +1004,7 @@ def patched_read_text(self, *args, **kwargs): assert len(errors) > 0 assert "Permission denied" in errors[0] import pytest -from exportify.export_manager.generator import CodeGenerator + def test_has_preserved_definition_function(generator: CodeGenerator): """Test _has_preserved_definition detects a function.""" From d1ad424f2db8178391b1012c369d1dec72022aa9 Mon Sep 17 00:00:00 2001 From: Adam Poulemanos <89049923+bashandbone@users.noreply.github.com> Date: Thu, 12 Mar 2026 23:34:25 -0400 Subject: [PATCH 3/4] Potential fix for pull request finding Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> Signed-off-by: Adam Poulemanos <89049923+bashandbone@users.noreply.github.com> --- tests/test_generator.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/test_generator.py b/tests/test_generator.py index 886188f..1b1dde3 100644 --- a/tests/test_generator.py +++ b/tests/test_generator.py @@ -1031,6 +1031,6 @@ def test_has_preserved_definition_syntax_error(generator: CodeGenerator): # Invalid syntax will be suppressed, resulting in False assert not generator._has_preserved_definition("def my_func(:: pass", "my_func") -def test_has_preserved_definition_empty_or_none(generator: CodeGenerator): +def test_has_preserved_definition_empty(generator: CodeGenerator): """Test _has_preserved_definition handles empty preserved sections.""" assert not generator._has_preserved_definition("", "my_func") From 58525750eae2fc40255ebbb454db750167635ad7 Mon Sep 17 00:00:00 2001 From: Adam Poulemanos <89049923+bashandbone@users.noreply.github.com> Date: Thu, 12 Mar 2026 23:38:20 -0400 Subject: [PATCH 4/4] Remove unused pytest import Removed unused import of pytest from test_generator.py Signed-off-by: Adam Poulemanos <89049923+bashandbone@users.noreply.github.com> --- tests/test_generator.py | 1 - 1 file changed, 1 deletion(-) diff --git a/tests/test_generator.py b/tests/test_generator.py index 1b1dde3..0d42d92 100644 --- a/tests/test_generator.py +++ b/tests/test_generator.py @@ -1003,7 +1003,6 @@ def patched_read_text(self, *args, **kwargs): errors = validate_init_file(init_file) assert len(errors) > 0 assert "Permission denied" in errors[0] -import pytest def test_has_preserved_definition_function(generator: CodeGenerator):