diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 0120b2aaf..904116cfb 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -2,6 +2,11 @@ default_language_version: python: python3.12 fail_fast: true repos: + + - repo: https://github.com/ComPWA/taplo-pre-commit + rev: v0.9.3 + hooks: + - id: taplo-format - repo: https://github.com/astral-sh/ruff-pre-commit rev: v0.9.3 hooks: @@ -20,10 +25,6 @@ repos: - id: biome-check additional_dependencies: ["@biomejs/biome@1.9.4"] exclude: (src/codemods/eval)|(tests/unit/skills/snapshots)|(tests/unit/codegen/sdk/output)|(tests/integration/verified_codemods)|(docs/samples) - - repo: https://github.com/ComPWA/taplo-pre-commit - rev: v0.9.3 - hooks: - - id: taplo-format - repo: https://github.com/MarcoGorelli/cython-lint rev: v0.16.6 hooks: @@ -73,19 +74,7 @@ repos: pass_filenames: false always_run: true entry: bash -c "uv run --frozen --all-extras --dev deptry src --ignore DEP001" - - repo: "local" - hooks: - - id: disallowed-words-check - name: Check for disallowed words - entry: scripts/disallowed-words-check.sh - language: script - files: '' # Check all files - - id: generate-runner-imports - name: Generate Runner Imports - entry: bash -c "uv run --frozen python -m codegen.gscli.main generate runner-imports src/codegen/shared/compilation/function_imports.py" - language: system - pass_filenames: false - always_run: true + - repo: https://github.com/renovatebot/pre-commit-hooks rev: 39.120.4 @@ -100,3 +89,16 @@ repos: rev: v1.1.0 hooks: - id: circleci_validate + - repo: "local" + hooks: + - id: disallowed-words-check + name: Check for disallowed words + entry: scripts/disallowed-words-check.sh + language: script + files: '' # Check all files + - id: generate-runner-imports + name: Generate Runner Imports + entry: bash -c "uv run --frozen python -m codegen.gscli.main generate runner-imports src/codegen/shared/compilation/function_imports.py" + language: system + pass_filenames: false + always_run: true diff --git a/pyproject.toml b/pyproject.toml index 8c8ebef25..ffae1d311 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -59,6 +59,7 @@ dependencies = [ "fastapi[standard]<1.0.0,>=0.115.2", "starlette<1.0.0,>=0.16.0", "tqdm>=4.67.1", + "tomlkit>=0.13.2", ] license = { text = "Apache-2.0" } @@ -152,41 +153,6 @@ members = [] [tool.cython-lint] max-line-length = 200 -[tool.ruff] -line-length = 200 -exclude = ["src/codegen/shared/compilation/function_imports.py", 'docs/**'] - -lint.select = ["F", "E", "W", "I", "UP", "D", "RUF", "DTZ"] -lint.ignore = [ - "D100", - "D101", - "D102", - "D103", - "D104", - "D105", - "D106", - "D107", - "D203", - "D205", - "D213", - "D400", - "D401", - "D402", - "D404", - "D415", - "D417", - "E712", # https://github.com/astral-sh/ruff/issues/4560 - "F841", - "F842", - "RUF012", - "RUF007", -] -lint.exclude = [ - "*.ipynb", -] # disable just linting for notebooks (allow for formatting) -lint.pydocstyle.convention = "google" -[tool.ruff.lint.isort] -known-first-party = ["codegen"] [tool.coverage.run] branch = true @@ -236,12 +202,7 @@ junit_duration_report = "call" junit_logging = "all" [build-system] -requires = [ - "hatchling>=1.26.3", - "hatch-vcs>=0.4.0", - "setuptools-scm>=8.0.0", - "setuptools>=75.8.0", -] +requires = ["hatchling>=1.26.3", "hatch-vcs>=0.4.0", "setuptools-scm>=8.0.0"] build-backend = "hatchling.build" [tool.deptry] diff --git a/ruff.toml b/ruff.toml new file mode 100644 index 000000000..64eb33912 --- /dev/null +++ b/ruff.toml @@ -0,0 +1,218 @@ +line-length = 200 +exclude = [ + "src/codegen/shared/compilation/function_imports.py", + 'docs/**', + "src/codegen/sdk/__init__.py", +] +unsafe-fixes = true +[lint] +select = ["F", "E", "W", "I", "UP", "D", "RUF", "DTZ", "TC", "EM", "TRY400"] +ignore = [ + "D100", + "D101", + "D102", + "D103", + "D104", + "D105", + "D106", + "D107", + "D203", + "D205", + "D213", + "D400", + "D401", + "D402", + "D404", + "D415", + "D417", + "E712", # https://github.com/astral-sh/ruff/issues/4560 + "F841", + "F842", + "RUF012", + "RUF007", +] +exclude = [ + "*.ipynb", +] # disable just linting for notebooks (allow for formatting) +[lint.pydocstyle] +convention = "google" +[lint.pyflakes] +extend-generics = [ + "codegen.sdk.codebase.flagging.enums.MessageType", + "codegen.sdk.codebase.flagging.enums.FlagKwargs", + "codegen.sdk.codebase.span.Span", + "codegen.sdk.core.assignment.Assignment", + "codegen.sdk.core.class_definition.Class", + "codegen.sdk.core.codebase.Codebase", + "codegen.sdk.core.dataclasses.usage.Usage", + "codegen.sdk.core.dataclasses.usage.UsageType", + "codegen.sdk.core.dataclasses.usage.UsageKind", + "codegen.sdk.core.detached_symbols.argument.Argument", + "codegen.sdk.core.detached_symbols.code_block.CodeBlock", + "codegen.sdk.core.detached_symbols.decorator.Decorator", + "codegen.sdk.core.detached_symbols.function_call.FunctionCall", + "codegen.sdk.core.detached_symbols.parameter.Parameter", + "codegen.sdk.core.directory.Directory", + "codegen.sdk.core.export.Export", + "codegen.sdk.core.expressions.await_expression.AwaitExpression", + "codegen.sdk.core.expressions.binary_expression.BinaryExpression", + "codegen.sdk.core.expressions.boolean.Boolean", + "codegen.sdk.core.expressions.chained_attribute.ChainedAttribute", + "codegen.sdk.core.expressions.comparison_expression.ComparisonExpression", + "codegen.sdk.core.expressions.expression.Expression", + "codegen.sdk.core.expressions.generic_type.GenericType", + "codegen.sdk.core.expressions.multi_expression.MultiExpression", + "codegen.sdk.core.expressions.name.Name", + "codegen.sdk.core.expressions.named_type.NamedType", + "codegen.sdk.core.expressions.none_type.NoneType", + "codegen.sdk.core.expressions.number.Number", + "codegen.sdk.core.expressions.parenthesized_expression.ParenthesizedExpression", + "codegen.sdk.core.expressions.placeholder_type.PlaceholderType", + "codegen.sdk.core.expressions.string.String", + "codegen.sdk.core.expressions.subscript_expression.SubscriptExpression", + "codegen.sdk.core.expressions.ternary_expression.TernaryExpression", + "codegen.sdk.core.expressions.tuple_type.TupleType", + "codegen.sdk.core.expressions.type.Type", + "codegen.sdk.core.expressions.unary_expression.UnaryExpression", + "codegen.sdk.core.expressions.union_type.UnionType", + "codegen.sdk.core.expressions.unpack.Unpack", + "codegen.sdk.core.expressions.value.Value", + "codegen.sdk.core.external_module.ExternalModule", + "codegen.sdk.core.file.File", + "codegen.sdk.core.file.SourceFile", + "codegen.sdk.core.function.Function", + "codegen.sdk.core.import_resolution.Import", + "codegen.sdk.core.interfaces.callable.Callable", + "codegen.sdk.core.interfaces.editable.Editable", + "codegen.sdk.core.interfaces.exportable.Exportable", + "codegen.sdk.core.interfaces.has_block.HasBlock", + "codegen.sdk.core.interfaces.has_name.HasName", + "codegen.sdk.core.interfaces.has_value.HasValue", + "codegen.sdk.core.interfaces.importable.Importable", + "codegen.sdk.core.interfaces.typeable.Typeable", + "codegen.sdk.core.interfaces.unwrappable.Unwrappable", + "codegen.sdk.core.interfaces.usable.Usable", + "codegen.sdk.core.placeholder.placeholder.Placeholder", + "codegen.sdk.core.placeholder.placeholder_stub.StubPlaceholder", + "codegen.sdk.core.placeholder.placeholder_type.TypePlaceholder", + "codegen.sdk.core.statements.assignment_statement.AssignmentStatement", + "codegen.sdk.core.statements.attribute.Attribute", + "codegen.sdk.core.statements.block_statement.BlockStatement", + "codegen.sdk.core.statements.catch_statement.CatchStatement", + "codegen.sdk.core.statements.comment.Comment", + "codegen.sdk.core.statements.export_statement.ExportStatement", + "codegen.sdk.core.statements.expression_statement.ExpressionStatement", + "codegen.sdk.core.statements.for_loop_statement.ForLoopStatement", + "codegen.sdk.core.statements.if_block_statement.IfBlockStatement", + "codegen.sdk.core.statements.import_statement.ImportStatement", + "codegen.sdk.core.statements.raise_statement.RaiseStatement", + "codegen.sdk.core.statements.return_statement.ReturnStatement", + "codegen.sdk.core.statements.statement.StatementType", + "codegen.sdk.core.statements.statement.Statement", + "codegen.sdk.core.statements.switch_case.SwitchCase", + "codegen.sdk.core.statements.switch_statement.SwitchStatement", + "codegen.sdk.core.statements.symbol_statement.SymbolStatement", + "codegen.sdk.core.statements.try_catch_statement.TryCatchStatement", + "codegen.sdk.core.statements.while_statement.WhileStatement", + "codegen.sdk.core.symbol.Symbol", + "codegen.sdk.core.symbol_group.SymbolGroup", + "codegen.sdk.core.symbol_groups.comment_group.CommentGroup", + "codegen.sdk.core.symbol_groups.dict.Pair", + "codegen.sdk.core.symbol_groups.dict.Dict", + "codegen.sdk.core.symbol_groups.expression_group.ExpressionGroup", + "codegen.sdk.core.symbol_groups.list.List", + "codegen.sdk.core.symbol_groups.multi_line_collection.MultiLineCollection", + "codegen.sdk.core.symbol_groups.tuple.Tuple", + "codegen.sdk.core.type_alias.TypeAlias", + "codegen.sdk.python.statements.if_block_statement.PyIfBlockStatement", + "codegen.sdk.python.statements.with_statement.WithStatement", + "codegen.sdk.typescript.statements.block_statement.TSBlockStatement", + "codegen.sdk.typescript.statements.catch_statement.TSCatchStatement", + "codegen.sdk.typescript.statements.if_block_statement.TSIfBlockStatement", + "codegen.sdk.typescript.symbol_groups.dict.TSDict", + "codegen.sdk.core.codebase.PyCodebaseType", + "codegen.sdk.core.codebase.TSCodebaseType", + "codegen.sdk.core.codebase.CodebaseType", + "codegen.sdk.python.assignment.PyAssignment", + "codegen.sdk.python.class_definition.PyClass", + "codegen.sdk.python.detached_symbols.code_block.PyCodeBlock", + "codegen.sdk.python.detached_symbols.decorator.PyDecorator", + "codegen.sdk.python.detached_symbols.parameter.PyParameter", + "codegen.sdk.python.expressions.chained_attribute.PyChainedAttribute", + "codegen.sdk.python.expressions.conditional_expression.PyConditionalExpression", + "codegen.sdk.python.expressions.generic_type.PyGenericType", + "codegen.sdk.python.expressions.named_type.PyNamedType", + "codegen.sdk.python.expressions.string.PyString", + "codegen.sdk.python.expressions.union_type.PyUnionType", + "codegen.sdk.python.file.PyFile", + "codegen.sdk.python.function.PyFunction", + "codegen.sdk.python.import_resolution.PyImport", + "codegen.sdk.python.interfaces.has_block.PyHasBlock", + "codegen.sdk.python.placeholder.placeholder_return_type.PyReturnTypePlaceholder", + "codegen.sdk.python.statements.assignment_statement.PyAssignmentStatement", + "codegen.sdk.python.statements.attribute.PyAttribute", + "codegen.sdk.python.statements.block_statement.PyBlockStatement", + "codegen.sdk.python.statements.break_statement.PyBreakStatement", + "codegen.sdk.python.statements.catch_statement.PyCatchStatement", + "codegen.sdk.python.statements.comment.PyCommentType", + "codegen.sdk.python.statements.comment.PyComment", + "codegen.sdk.python.statements.for_loop_statement.PyForLoopStatement", + "codegen.sdk.python.statements.import_statement.PyImportStatement", + "codegen.sdk.python.statements.match_case.PyMatchCase", + "codegen.sdk.python.statements.match_statement.PyMatchStatement", + "codegen.sdk.python.statements.pass_statement.PyPassStatement", + "codegen.sdk.python.statements.try_catch_statement.PyTryCatchStatement", + "codegen.sdk.python.statements.while_statement.PyWhileStatement", + "codegen.sdk.python.symbol.PySymbol", + "codegen.sdk.python.symbol_groups.comment_group.PyCommentGroup", + "codegen.sdk.typescript.assignment.TSAssignment", + "codegen.sdk.typescript.class_definition.TSClass", + "codegen.sdk.typescript.detached_symbols.code_block.TSCodeBlock", + "codegen.sdk.typescript.detached_symbols.decorator.TSDecorator", + "codegen.sdk.typescript.detached_symbols.jsx.element.JSXElement", + "codegen.sdk.typescript.detached_symbols.jsx.expression.JSXExpression", + "codegen.sdk.typescript.detached_symbols.jsx.prop.JSXProp", + "codegen.sdk.typescript.detached_symbols.parameter.TSParameter", + "codegen.sdk.typescript.enum_definition.TSEnum", + "codegen.sdk.typescript.export.TSExport", + "codegen.sdk.typescript.expressions.array_type.TSArrayType", + "codegen.sdk.typescript.expressions.chained_attribute.TSChainedAttribute", + "codegen.sdk.typescript.expressions.conditional_type.TSConditionalType", + "codegen.sdk.typescript.expressions.expression_type.TSExpressionType", + "codegen.sdk.typescript.expressions.function_type.TSFunctionType", + "codegen.sdk.typescript.expressions.generic_type.TSGenericType", + "codegen.sdk.typescript.expressions.lookup_type.TSLookupType", + "codegen.sdk.typescript.expressions.named_type.TSNamedType", + "codegen.sdk.typescript.expressions.object_type.TSObjectType", + "codegen.sdk.typescript.expressions.query_type.TSQueryType", + "codegen.sdk.typescript.expressions.readonly_type.TSReadonlyType", + "codegen.sdk.typescript.expressions.string.TSString", + "codegen.sdk.typescript.expressions.ternary_expression.TSTernaryExpression", + "codegen.sdk.typescript.expressions.undefined_type.TSUndefinedType", + "codegen.sdk.typescript.expressions.union_type.TSUnionType", + "codegen.sdk.typescript.file.TSFile", + "codegen.sdk.typescript.function.TSFunction", + "codegen.sdk.typescript.import_resolution.TSImport", + "codegen.sdk.typescript.interface.TSInterface", + "codegen.sdk.typescript.interfaces.has_block.TSHasBlock", + "codegen.sdk.typescript.namespace.TSNamespace", + "codegen.sdk.typescript.placeholder.placeholder_return_type.TSReturnTypePlaceholder", + "codegen.sdk.typescript.statements.assignment_statement.TSAssignmentStatement", + "codegen.sdk.typescript.statements.attribute.TSAttribute", + "codegen.sdk.typescript.statements.comment.TSCommentType", + "codegen.sdk.typescript.statements.comment.TSComment", + "codegen.sdk.typescript.statements.for_loop_statement.TSForLoopStatement", + "codegen.sdk.typescript.statements.import_statement.TSImportStatement", + "codegen.sdk.typescript.statements.labeled_statement.TSLabeledStatement", + "codegen.sdk.typescript.statements.switch_case.TSSwitchCase", + "codegen.sdk.typescript.statements.switch_statement.TSSwitchStatement", + "codegen.sdk.typescript.statements.try_catch_statement.TSTryCatchStatement", + "codegen.sdk.typescript.statements.while_statement.TSWhileStatement", + "codegen.sdk.typescript.symbol.TSSymbol", + "codegen.sdk.typescript.symbol_groups.comment_group.TSCommentGroup", + "codegen.sdk.typescript.symbol_groups.dict.TSPair", + "codegen.sdk.typescript.ts_config.TSConfig", + "codegen.sdk.typescript.type_alias.TSTypeAlias", +] +[lint.isort] +known-first-party = ["codegen"] diff --git a/src/codegen/cli/api/client.py b/src/codegen/cli/api/client.py index ff81459ab..442928231 100644 --- a/src/codegen/cli/api/client.py +++ b/src/codegen/cli/api/client.py @@ -91,21 +91,26 @@ def _make_request( try: return output_model.model_validate(response.json()) except ValueError as e: - raise ServerError(f"Invalid response format: {e}") + msg = f"Invalid response format: {e}" + raise ServerError(msg) elif response.status_code == 401: - raise InvalidTokenError("Invalid or expired authentication token") + msg = "Invalid or expired authentication token" + raise InvalidTokenError(msg) elif response.status_code == 500: - raise ServerError("The server encountered an error while processing your request") + msg = "The server encountered an error while processing your request" + raise ServerError(msg) else: try: error_json = response.json() error_msg = error_json.get("detail", error_json) except Exception: error_msg = response.text - raise ServerError(f"Error ({response.status_code}): {error_msg}") + msg = f"Error ({response.status_code}): {error_msg}" + raise ServerError(msg) except requests.RequestException as e: - raise ServerError(f"Network error: {e!s}") + msg = f"Network error: {e!s}" + raise ServerError(msg) def run( self, diff --git a/src/codegen/cli/api/modal.py b/src/codegen/cli/api/modal.py index 534717407..16b4e3d62 100644 --- a/src/codegen/cli/api/modal.py +++ b/src/codegen/cli/api/modal.py @@ -11,7 +11,8 @@ def get_modal_workspace(): case Environment.DEVELOP: return "codegen-sh-develop" case _: - raise ValueError(f"Invalid environment: {global_env.ENV}") + msg = f"Invalid environment: {global_env.ENV}" + raise ValueError(msg) def get_modal_prefix(): diff --git a/src/codegen/cli/auth/login.py b/src/codegen/cli/auth/login.py index 0f1cc78c1..195263615 100644 --- a/src/codegen/cli/auth/login.py +++ b/src/codegen/cli/auth/login.py @@ -34,7 +34,8 @@ def login_routine(token: str | None = None) -> CodegenSession: _token = click.prompt("Please enter your authentication token from the browser", hide_input=False) if not _token: - raise click.ClickException("Token must be provided via CODEGEN_USER_ACCESS_TOKEN environment variable or manual input") + msg = "Token must be provided via CODEGEN_USER_ACCESS_TOKEN environment variable or manual input" + raise click.ClickException(msg) # Validate and store token token_manager = TokenManager() @@ -46,4 +47,5 @@ def login_routine(token: str | None = None) -> CodegenSession: rich.print(f"[green]✓ Stored token to:[/green] {token_manager.token_file}") return session except AuthError as e: - raise click.ClickException(f"Error: {e!s}") + msg = f"Error: {e!s}" + raise click.ClickException(msg) diff --git a/src/codegen/cli/auth/session.py b/src/codegen/cli/auth/session.py index 07dddb3b1..caba48958 100644 --- a/src/codegen/cli/auth/session.py +++ b/src/codegen/cli/auth/session.py @@ -63,7 +63,8 @@ def identity(self) -> Identity | None: if self._identity: return self._identity if not self.token: - raise NoTokenError("No authentication token found") + msg = "No authentication token found" + raise NoTokenError(msg) from codegen.cli.api.client import RestAPI @@ -102,7 +103,8 @@ def profile(self) -> UserProfile | None: def git_repo(self) -> Repository: git_repo = get_git_repo(Path.cwd()) if not git_repo: - raise ValueError("No git repository found") + msg = "No git repository found" + raise ValueError(msg) return git_repo @property @@ -132,9 +134,11 @@ def is_authenticated(self) -> bool: def assert_authenticated(self) -> None: """Raise an AuthError if the session is not fully authenticated""" if not self.identity: - raise AuthError("No identity found for session") + msg = "No identity found for session" + raise AuthError(msg) if self.identity.status != "active": - raise AuthError("Current session is not active. API Token may be invalid or may have expired.") + msg = "Current session is not active. API Token may be invalid or may have expired." + raise AuthError(msg) def write_config(self) -> None: """Write the config to the codegen-sh/config.toml file""" diff --git a/src/codegen/cli/commands/deploy/main.py b/src/codegen/cli/commands/deploy/main.py index 873b93b55..8963a3385 100644 --- a/src/codegen/cli/commands/deploy/main.py +++ b/src/codegen/cli/commands/deploy/main.py @@ -61,17 +61,20 @@ def deploy_command(session: CodegenSession, name: str | None = None, directory: functions = CodemodManager.get_decorated(search_path) matching = [f for f in functions if f.name == name] if not matching: - raise click.ClickException(f"No function found with name '{name}'") + msg = f"No function found with name '{name}'" + raise click.ClickException(msg) if len(matching) > 1: # If multiple matches, show their locations rich.print(f"[yellow]Multiple functions found with name '{name}':[/yellow]") for func in matching: rich.print(f" • {func.filepath}") - raise click.ClickException("Please specify the exact directory with --directory") + msg = "Please specify the exact directory with --directory" + raise click.ClickException(msg) deploy_functions(session, matching, message=message) else: # Deploy all functions in the directory functions = CodemodManager.get_decorated(search_path) deploy_functions(session, functions) except Exception as e: - raise click.ClickException(f"Failed to deploy: {e!s}") + msg = f"Failed to deploy: {e!s}" + raise click.ClickException(msg) diff --git a/src/codegen/cli/commands/login/main.py b/src/codegen/cli/commands/login/main.py index 414cab15d..67c7d46db 100644 --- a/src/codegen/cli/commands/login/main.py +++ b/src/codegen/cli/commands/login/main.py @@ -13,7 +13,8 @@ def login_command(token: str): # Check if already authenticated token_manager = TokenManager() if token_manager.get_token(): - raise click.ClickException("Already authenticated. Use 'codegen logout' to clear the token.") + msg = "Already authenticated. Use 'codegen logout' to clear the token." + raise click.ClickException(msg) # Use provided token or go through login flow if token: @@ -25,6 +26,7 @@ def login_command(token: str): rich.print("[cyan]📊 Hey![/cyan] We collect anonymous usage data to improve your experience 🔒") rich.print("To opt out, set [green]telemetry_enabled = false[/green] in [cyan]~/.config/codegen-sh/analytics.json[/cyan] ✨") except ValueError as e: - raise click.ClickException(f"Error: {e!s}") + msg = f"Error: {e!s}" + raise click.ClickException(msg) else: login_routine(token) diff --git a/src/codegen/cli/commands/run/main.py b/src/codegen/cli/commands/run/main.py index 161814473..13e9cf843 100644 --- a/src/codegen/cli/commands/run/main.py +++ b/src/codegen/cli/commands/run/main.py @@ -27,7 +27,8 @@ def run_command( # Ensure venv is initialized venv = VenvManager() if not venv.is_initialized(): - raise click.ClickException("Virtual environment not found. Please run 'codegen init' first.") + msg = "Virtual environment not found. Please run 'codegen init' first." + raise click.ClickException(msg) # Set up environment with venv os.environ["VIRTUAL_ENV"] = str(venv.venv_dir) @@ -38,13 +39,15 @@ def run_command( # Handle arguments if needed if codemod.arguments_type_schema and not arguments: - raise click.ClickException(f"This function requires the --arguments parameter. Expected schema: {codemod.arguments_type_schema}") + msg = f"This function requires the --arguments parameter. Expected schema: {codemod.arguments_type_schema}" + raise click.ClickException(msg) if codemod.arguments_type_schema and arguments: arguments_json = json.loads(arguments) is_valid = validate_json(codemod.arguments_type_schema, arguments_json) if not is_valid: - raise click.ClickException(f"Invalid arguments format. Expected schema: {codemod.arguments_type_schema}") + msg = f"Invalid arguments format. Expected schema: {codemod.arguments_type_schema}" + raise click.ClickException(msg) # Run the codemod if web: diff --git a/src/codegen/cli/commands/run/run_cloud.py b/src/codegen/cli/commands/run/run_cloud.py index f2c38a971..e066b3967 100644 --- a/src/codegen/cli/commands/run/run_cloud.py +++ b/src/codegen/cli/commands/run/run_cloud.py @@ -105,7 +105,8 @@ def run_cloud(session: CodegenSession, function, apply_local: bool = False, diff rich.print(" 1. [red]git reset --hard HEAD[/red] (⚠️ discards all uncommitted changes)") rich.print(" 2. [red]git clean -fd[/red] (⚠️ removes all untracked files)") rich.print(" 3. Run this command again\n") - raise click.ClickException("Failed to apply patch to local filesystem") + msg = "Failed to apply patch to local filesystem" + raise click.ClickException(msg) except ServerError as e: status.stop() diff --git a/src/codegen/cli/commands/run_on_pr/main.py b/src/codegen/cli/commands/run_on_pr/main.py index 223ee4adb..d3b28c471 100644 --- a/src/codegen/cli/commands/run_on_pr/main.py +++ b/src/codegen/cli/commands/run_on_pr/main.py @@ -13,7 +13,8 @@ def run_on_pr(session: CodegenSession, codemod_name: str, pr_number: int) -> Non # Find the codemod codemod = CodemodManager.get(codemod_name) if not codemod: - raise click.ClickException(f"No function found with name '{codemod_name}'") + msg = f"No function found with name '{codemod_name}'" + raise click.ClickException(msg) with create_spinner(f"Testing webhook '{codemod_name}' on PR #{pr_number}...") as status: try: @@ -27,7 +28,8 @@ def run_on_pr(session: CodegenSession, codemod_name: str, pr_number: int) -> Non rich.print(f" [dim]View results:[/dim] [blue underline]{response.web_url}[/blue underline]") except Exception as e: status.stop() - raise click.ClickException(f"Failed to test webhook: {e!s}") + msg = f"Failed to test webhook: {e!s}" + raise click.ClickException(msg) @click.command(name="run-on-pr") diff --git a/src/codegen/cli/env/global_env.py b/src/codegen/cli/env/global_env.py index dc5699f11..51c3772d1 100644 --- a/src/codegen/cli/env/global_env.py +++ b/src/codegen/cli/env/global_env.py @@ -31,7 +31,8 @@ def _parse_env(self) -> Environment: if not env_envvar: return DEFAULT_ENV if env_envvar not in Environment: - raise ValueError(f"Invalid environment: {env_envvar}") + msg = f"Invalid environment: {env_envvar}" + raise ValueError(msg) return Environment(env_envvar) def _load_dotenv(self) -> None: @@ -47,7 +48,8 @@ def _get_env_var(self, var_name, required: bool = False) -> str: if value: return value if required: - raise ValueError(f"Environment variable {var_name} is not set with ENV={self.ENV}!") + msg = f"Environment variable {var_name} is not set with ENV={self.ENV}!" + raise ValueError(msg) return "" diff --git a/src/codegen/cli/git/url.py b/src/codegen/cli/git/url.py index d5f0d3be8..b3334ed2d 100644 --- a/src/codegen/cli/git/url.py +++ b/src/codegen/cli/git/url.py @@ -7,4 +7,5 @@ def get_git_organization_and_repo(repo: Repository) -> tuple[str, str]: if remote.name == "origin": parsed = giturlparse.parse(remote.url) return parsed.owner, parsed.name - raise ValueError("No git remote found") + msg = "No git remote found" + raise ValueError(msg) diff --git a/src/codegen/cli/utils/codemod_manager.py b/src/codegen/cli/utils/codemod_manager.py index 9361ceda4..34803bf0d 100644 --- a/src/codegen/cli/utils/codemod_manager.py +++ b/src/codegen/cli/utils/codemod_manager.py @@ -50,7 +50,8 @@ def get_codemod(cls, name: str, start_path: Path | None = None) -> DecoratedFunc raise click.ClickException("No codemods found. Create one with:\n" + " codegen create my-codemod") else: available = "\n ".join(f"- {c.name}" for c in all_codemods) - raise click.ClickException(f"Codemod '{name}' not found. Available codemods:\n {available}") + msg = f"Codemod '{name}' not found. Available codemods:\n {available}" + raise click.ClickException(msg) # Verify we can import it try: @@ -58,7 +59,8 @@ def get_codemod(cls, name: str, start_path: Path | None = None) -> DecoratedFunc codemod.validate() return codemod except Exception as e: - raise click.ClickException(f"Error loading codemod '{name}': {e!s}") + msg = f"Error loading codemod '{name}': {e!s}" + raise click.ClickException(msg) @classmethod def list(cls, start_path: Path | None = None) -> builtins.list[DecoratedFunction]: diff --git a/src/codegen/cli/utils/function_finder.py b/src/codegen/cli/utils/function_finder.py index 1874fbbe0..0d77a71fd 100644 --- a/src/codegen/cli/utils/function_finder.py +++ b/src/codegen/cli/utils/function_finder.py @@ -28,12 +28,14 @@ def run(self, codebase) -> str | None: The result of running the function (usually a diff string) """ if not self.filepath: - raise ValueError("Cannot run function without filepath") + msg = "Cannot run function without filepath" + raise ValueError(msg) # Import the module containing the function spec = importlib.util.spec_from_file_location("module", self.filepath) if not spec or not spec.loader: - raise ImportError(f"Could not load module from {self.filepath}") + msg = f"Could not load module from {self.filepath}" + raise ImportError(msg) module = importlib.util.module_from_spec(spec) spec.loader.exec_module(module) @@ -45,7 +47,8 @@ def run(self, codebase) -> str | None: # Found our function, run it return item(codebase) - raise ValueError(f"Could not find function '{self.name}' in {self.filepath}") + msg = f"Could not find function '{self.name}' in {self.filepath}" + raise ValueError(msg) def validate(self) -> None: """Verify that this function can be imported and accessed. @@ -54,12 +57,14 @@ def validate(self) -> None: ValueError: If the function can't be found or imported """ if not self.filepath: - raise ValueError("Cannot validate function without filepath") + msg = "Cannot validate function without filepath" + raise ValueError(msg) # Import the module containing the function spec = importlib.util.spec_from_file_location("module", self.filepath) if not spec or not spec.loader: - raise ImportError(f"Could not load module from {self.filepath}") + msg = f"Could not load module from {self.filepath}" + raise ImportError(msg) module = importlib.util.module_from_spec(spec) spec.loader.exec_module(module) @@ -70,7 +75,8 @@ def validate(self) -> None: if hasattr(item, "__codegen_name__") and item.__codegen_name__ == self.name: return # Found it! - raise ValueError(f"Could not find function '{self.name}' in {self.filepath}") + msg = f"Could not find function '{self.name}' in {self.filepath}" + raise ValueError(msg) class CodegenFunctionVisitor(ast.NodeVisitor): diff --git a/src/codegen/git/clients/git_repo_client.py b/src/codegen/git/clients/git_repo_client.py index 7e8d70263..aab02affe 100644 --- a/src/codegen/git/clients/git_repo_client.py +++ b/src/codegen/git/clients/git_repo_client.py @@ -44,13 +44,15 @@ def __init__(self, repo_config: RepoConfig, github_type: GithubType = GithubType def _create_client(self, github_scope: GithubScope = GithubScope.READ) -> Repository: client = self.gh_client.get_repo_by_full_name(self.repo.full_name, github_scope=github_scope) if not client: - raise ValueError(f"Repo {self.repo.full_name} not found in {self.github_type.value}!") + msg = f"Repo {self.repo.full_name} not found in {self.github_type.value}!" + raise ValueError(msg) return client @property def _write_client(self) -> Repository: if self.__write_client is None: - raise ValueError("Cannot perform write operations with read-only client! Try setting github_scope to GithubScope.WRITE.") + msg = "Cannot perform write operations with read-only client! Try setting github_scope to GithubScope.WRITE." + raise ValueError(msg) return self.__write_client #################################################################################################################### @@ -251,7 +253,7 @@ def get_or_create_branch(self, new_branch_name: str, base_branch_name: str | Non new_branch = self.create_branch(new_branch_name, base_branch_name=base_branch_name) return new_branch except Exception as e: - logger.error(f"Unexpected error creating branch: {new_branch_name}\n\t{e}") + logger.exception(f"Unexpected error creating branch: {new_branch_name}\n\t{e}") return None def get_branch_safe(self, branch_name: str, attempts: int = 1, wait_seconds: int = 1) -> Branch | None: diff --git a/src/codegen/git/clients/github_client.py b/src/codegen/git/clients/github_client.py index 903cdbfd8..70d34f7dc 100644 --- a/src/codegen/git/clients/github_client.py +++ b/src/codegen/git/clients/github_client.py @@ -46,7 +46,8 @@ def _get_client_for_scope(self, github_scope: GithubScope) -> Github: return self.read_client elif github_scope is GithubScope.WRITE: return self._write_client - raise ValueError(f"Invalid github scope: {github_scope}") + msg = f"Invalid github scope: {github_scope}" + raise ValueError(msg) #################################################################################################################### # CHECK RUNS diff --git a/src/codegen/git/clients/github_client_factory.py b/src/codegen/git/clients/github_client_factory.py index c6e2ba1a5..12139c8db 100644 --- a/src/codegen/git/clients/github_client_factory.py +++ b/src/codegen/git/clients/github_client_factory.py @@ -38,7 +38,8 @@ def create_from_repo(cls, repo_config: RepoConfig, github_type: GithubType = Git elif github_type == GithubType.Github: return GithubClient.from_repo_config(repo_config=repo_config) else: - raise Exception(f"Unknown GithubType: {github_type}") + msg = f"Unknown GithubType: {github_type}" + raise Exception(msg) @classmethod def create_from_token(cls, token: str | None = None, github_type: GithubType = GithubType.GithubEnterprise) -> GithubClientType: @@ -47,4 +48,5 @@ def create_from_token(cls, token: str | None = None, github_type: GithubType = G elif github_type == GithubType.Github: return GithubClient.from_token(token=token) else: - raise Exception(f"Unknown GithubType: {github_type}") + msg = f"Unknown GithubType: {github_type}" + raise Exception(msg) diff --git a/src/codegen/git/configs/config.py b/src/codegen/git/configs/config.py index 5acb1fc1a..305b68697 100644 --- a/src/codegen/git/configs/config.py +++ b/src/codegen/git/configs/config.py @@ -13,7 +13,8 @@ def _get_env_var(self, var_name, required: bool = False) -> str | None: if value: return value if required: - raise ValueError(f"Environment variable {var_name} is not set with ENV={self.ENV}!") + msg = f"Environment variable {var_name} is not set with ENV={self.ENV}!" + raise ValueError(msg) return None diff --git a/src/codegen/git/repo_operator/repo_operator.py b/src/codegen/git/repo_operator/repo_operator.py index 3a96d06ad..0fc5034bc 100644 --- a/src/codegen/git/repo_operator/repo_operator.py +++ b/src/codegen/git/repo_operator/repo_operator.py @@ -239,7 +239,8 @@ def delete_local_branch(self, branch_name: str) -> None: logger.info(f"Branch {branch_name} does not exist locally. Skipping delete_local_branch.") return if branch_name is self.default_branch: - raise NotImplementedError("Deleting the default branch is not implemented yet.") + msg = "Deleting the default branch is not implemented yet." + raise NotImplementedError(msg) if self.is_branch_checked_out(branch_name): self.checkout_branch(self.default_branch) @@ -317,7 +318,7 @@ def checkout_branch(self, branch_name: str | None, *, remote: bool = False, remo logger.warning(f"Branch {branch_name} was not found in remote {remote_name}. Unable to checkout.") return CheckoutResult.NOT_FOUND else: - logger.error(f"Error with Git operations: {e}") + logger.exception(f"Error with Git operations: {e}") raise def get_diff_files_from_ref(self, ref: str): diff --git a/src/codegen/git/schemas/github.py b/src/codegen/git/schemas/github.py index 4f71742ea..5f04f94ca 100644 --- a/src/codegen/git/schemas/github.py +++ b/src/codegen/git/schemas/github.py @@ -21,7 +21,8 @@ def hostname(self) -> str: elif self == GithubType.GithubEnterprise: return "github.codegen.app" else: - raise ValueError(f"Invalid GithubType: {self}") + msg = f"Invalid GithubType: {self}" + raise ValueError(msg) @property def base_url(self) -> str: @@ -32,11 +33,13 @@ def from_url(cls, url: str) -> Self: for github_type in cls: if github_type.hostname in url: return github_type - raise ValueError(f"Could not find GithubType from url: {url}") + msg = f"Could not find GithubType from url: {url}" + raise ValueError(msg) @classmethod def from_string(cls, value: str) -> Self: try: return cls[value] # This will match the exact name except KeyError: - raise ValueError(f"'{value}' is not a valid GithubType. Valid values are: {[e.name for e in cls]}") + msg = f"'{value}' is not a valid GithubType. Valid values are: {[e.name for e in cls]}" + raise ValueError(msg) diff --git a/src/codegen/git/utils/file_utils.py b/src/codegen/git/utils/file_utils.py index c283618fb..5aa3af80a 100644 --- a/src/codegen/git/utils/file_utils.py +++ b/src/codegen/git/utils/file_utils.py @@ -21,12 +21,14 @@ def create_file(file_path: str, content: str | bytes) -> str: with open(file_path, "wb") as file: file.write(content) else: - raise ValueError(f"Invalid content type: {type(content)}") + msg = f"Invalid content type: {type(content)}" + raise ValueError(msg) # Check if the file was created file_path = os.path.join(filepath, filename) if not os.path.exists(file_path): - raise FileNotFoundError(f"Failed to create file {format(file_path)}") + msg = f"Failed to create file {format(file_path)}" + raise FileNotFoundError(msg) return file_path diff --git a/src/codegen/gscli/generate/runner_imports.py b/src/codegen/gscli/generate/runner_imports.py index 02daedbba..f06c2301a 100644 --- a/src/codegen/gscli/generate/runner_imports.py +++ b/src/codegen/gscli/generate/runner_imports.py @@ -1,8 +1,12 @@ from itertools import chain +from pathlib import Path +import tomlkit from termcolor import colored from codegen.sdk.code_generation.current_code_codebase import get_documented_objects +from codegen.sdk.utils import split_git_path +from codegen.shared.decorators.docs import DocumentedObject EXTERNAL_IMPORTS = """ import os @@ -47,10 +51,26 @@ def get_generated_imports(): ) +def fix_ruff_imports(objects: list[DocumentedObject]): + root, _ = split_git_path(str(Path(__file__))) + to_add = [] + for obj in objects: + to_add.append(f"{obj.module}.{obj.name}") + generics = tomlkit.array() + for val in dict.fromkeys(to_add): + generics.add_line(val, indent=" ") + generics.add_line(indent="") + config = Path(root) / "ruff.toml" + toml_config = tomlkit.parse(config.read_text()) + toml_config["lint"]["pyflakes"]["extend-generics"] = generics + config.write_text(tomlkit.dumps(toml_config)) + + def get_runner_imports(include_codegen=True, include_private_imports: bool = True) -> str: # get the imports from the apidoc, py_apidoc, and ts_apidoc gs_objects = get_documented_objects() gs_public_objects = list(chain(gs_objects["apidoc"], gs_objects["py_apidoc"], gs_objects["ts_apidoc"])) + fix_ruff_imports(gs_public_objects) gs_public_imports = {f"from {obj.module} import {obj.name}" for obj in gs_public_objects} # construct import string with all imports diff --git a/src/codegen/runner/models/configs.py b/src/codegen/runner/models/configs.py index ea613e8cc..7d27596c9 100644 --- a/src/codegen/runner/models/configs.py +++ b/src/codegen/runner/models/configs.py @@ -42,12 +42,14 @@ def get_codebase_config() -> CodebaseConfig: def get_runner_feature_flags() -> RunnerFeatureFlags: encoded_ffs = os.environ.get(FEATURE_FLAGS_BASE64) if not encoded_ffs: - raise ValueError("FEATURE_FLAGS_BASE64 environment variable not found") + msg = "FEATURE_FLAGS_BASE64 environment variable not found" + raise ValueError(msg) return RunnerFeatureFlags.from_encoded_json(encoded_ffs) def get_repo_config() -> RepoConfig: encoded_repo_config = os.environ.get(REPO_CONFIG_BASE64) if not encoded_repo_config: - raise ValueError("REPO_CONFIG_BASE64 environment variable not found") + msg = "REPO_CONFIG_BASE64 environment variable not found" + raise ValueError(msg) return RepoConfig.from_encoded_json(encoded_repo_config) diff --git a/src/codegen/runner/utils/branch_name.py b/src/codegen/runner/utils/branch_name.py index 04c59946c..9711410a3 100644 --- a/src/codegen/runner/utils/branch_name.py +++ b/src/codegen/runner/utils/branch_name.py @@ -15,11 +15,14 @@ def get_head_branch_name(codemod: Codemod, group: Group | None = None) -> str: if not codemod.version_id: - raise ValueError(f"CodemodRun: {codemod.run_id} does not have a codemod version!") + msg = f"CodemodRun: {codemod.run_id} does not have a codemod version!" + raise ValueError(msg) if not codemod.epic_id: - raise ValueError(f"CodemodRun: {codemod.run_id} does not have an epic!") + msg = f"CodemodRun: {codemod.run_id} does not have an epic!" + raise ValueError(msg) if group and group.id is None: - raise ValueError("Group ID is required to create a branch name") + msg = "Group ID is required to create a branch name" + raise ValueError(msg) group_id = group.id if group else DEFAULT_GROUP_ID return CODEGEN_BRANCH_TEMPLATE.format(codemod.epic_id, codemod.version_id, codemod.run_id, group_id) diff --git a/src/codegen/sdk/ai/helpers.py b/src/codegen/sdk/ai/helpers.py index e9d0634c3..a5fe6b3bd 100644 --- a/src/codegen/sdk/ai/helpers.py +++ b/src/codegen/sdk/ai/helpers.py @@ -60,39 +60,48 @@ class AbstractAIHelper(ABC): @abstractmethod def __init__(self) -> None: - raise NotImplementedError("This is an abstract class") + msg = "This is an abstract class" + raise NotImplementedError(msg) @abstractmethod def embeddings_with_backoff(self, **kwargs): - raise NotImplementedError("This is an abstract class") + msg = "This is an abstract class" + raise NotImplementedError(msg) @abstractmethod def get_embeddings(self, content_strs: list[str]) -> list[list[float]]: - raise NotImplementedError("This is an abstract class") + msg = "This is an abstract class" + raise NotImplementedError(msg) @abstractmethod def get_embedding(self, content_str: str) -> list[float]: - raise NotImplementedError("This is an abstract class") + msg = "This is an abstract class" + raise NotImplementedError(msg) @abstractmethod def llm_query_with_retry(self, **kwargs): - raise NotImplementedError("This is an abstract class") + msg = "This is an abstract class" + raise NotImplementedError(msg) @abstractmethod def llm_query_no_retry(self, messages: list = [], model: str = "gpt-4-32k", max_tokens: int | None = None): - raise NotImplementedError("This is an abstract class") + msg = "This is an abstract class" + raise NotImplementedError(msg) @abstractmethod def llm_query_functions_with_retry(self, model: str, messages: list, functions: list[dict], max_tokens: int | None = None): - raise NotImplementedError("This is an abstract class") + msg = "This is an abstract class" + raise NotImplementedError(msg) @abstractmethod def llm_query_functions(self, model: str, messages: list, functions: list[dict], max_tokens: int | None = None): - raise NotImplementedError("This is an abstract class") + msg = "This is an abstract class" + raise NotImplementedError(msg) @abstractmethod def llm_response_to_json(response) -> str: - raise NotImplementedError("This is an abstract class") + msg = "This is an abstract class" + raise NotImplementedError(msg) # TODO: move into utils/ai folder @@ -107,7 +116,8 @@ def __init__( cache: bool | None = True, ) -> None: if openai_key is None: - raise ValueError("The openai_key must be provided") + msg = "The openai_key must be provided" + raise ValueError(msg) self.openai_key = openai_key self.api_base = api_base @@ -193,7 +203,8 @@ def __init__( cache: bool | None = True, ) -> None: if anthropic_key is None: - raise ValueError("The anthropic_key must be provided") + msg = "The anthropic_key must be provided" + raise ValueError(msg) self.anthropic_key = anthropic_key self.api_base = api_base @@ -274,24 +285,28 @@ def _convert_claude_response_to_openai( @backoff.on_exception(backoff.expo, anthropic.RateLimitError) def embeddings_with_backoff(self, **kwargs): - raise NotImplementedError("Embeddings are not supported for AnthropicHelper") + msg = "Embeddings are not supported for AnthropicHelper" + raise NotImplementedError(msg) # response = self.client.embeddings.create(**kwargs) # return response def get_embeddings(self, content_strs: list[str]) -> list[list[float]]: - raise NotImplementedError("Embeddings are not supported for AnthropicHelper") + msg = "Embeddings are not supported for AnthropicHelper" + raise NotImplementedError(msg) # content_strs = [c[:1000] if type(c) in (str, bytes) else " " for c in content_strs] # response = self.embeddings_with_backoff(input=content_strs, model=self.embedding_model_name) # return [x.embedding for x in response.data] def get_embedding(self, content_str: str) -> list[float]: - raise NotImplementedError("Embeddings are not supported for AnthropicHelper") + msg = "Embeddings are not supported for AnthropicHelper" + raise NotImplementedError(msg) # embeddings = self.get_embeddings([content_str]) # return embeddings[0] @backoff.on_exception(backoff.expo, anthropic.RateLimitError) def completions_with_backoff(self, **kwargs): - raise Exception("Claude's completion api is deprecated. Please use messages_with_backoff instead.") + msg = "Claude's completion api is deprecated. Please use messages_with_backoff instead." + raise Exception(msg) @backoff.on_exception(backoff.expo, anthropic.RateLimitError) def messages_with_backoff(self, **kwargs): @@ -386,7 +401,8 @@ def __init__( self.openai_helper = OpenAIHelper(openai_key, api_base=openai_base, headers=headers, cache=self.cache) if self.use_claude: if anthropic_key is None: - raise ValueError("Anthropic Key must be provided if use_claude is True") + msg = "Anthropic Key must be provided if use_claude is True" + raise ValueError(msg) self.anthropic_helper = AnthropicHelper(anthropic_key, api_base=anthropic_base, headers=headers, openai_anthropic_translation=True, cache=self.cache) @@ -398,7 +414,8 @@ def embeddings_with_backoff(self, **kwargs): elif self.use_claude: return self.anthropic_helper.embeddings_with_backoff(**kwargs) else: - raise Exception("MultiProviderAIHelper: No AI helper is enabled") + msg = "MultiProviderAIHelper: No AI helper is enabled" + raise Exception(msg) def get_embeddings(self, content_strs: list[str]) -> list[list[float]]: # Prioritize OpenAI First @@ -407,7 +424,8 @@ def get_embeddings(self, content_strs: list[str]) -> list[list[float]]: elif self.use_claude: return self.anthropic_helper.get_embeddings(content_strs) else: - raise Exception("MultiProviderAIHelper: No AI helper is enabled") + msg = "MultiProviderAIHelper: No AI helper is enabled" + raise Exception(msg) def get_embedding(self, content_str: str) -> list[float]: # Prioritize OpenAI First @@ -416,7 +434,8 @@ def get_embedding(self, content_str: str) -> list[float]: elif self.use_claude: return self.anthropic_helper.get_embedding(content_str) else: - raise Exception("MultiProviderAIHelper: No AI helper is enabled") + msg = "MultiProviderAIHelper: No AI helper is enabled" + raise Exception(msg) @backoff.on_exception(backoff.expo, anthropic.RateLimitError) def completions_with_backoff(self, **kwargs): @@ -424,7 +443,8 @@ def completions_with_backoff(self, **kwargs): if self.use_openai: return self.openai_helper.completions_with_backoff(**kwargs) else: - raise Exception("MultiProviderAIHelper: OpenAI Helper is not enabled") + msg = "MultiProviderAIHelper: OpenAI Helper is not enabled" + raise Exception(msg) @backoff.on_exception(backoff.expo, anthropic.RateLimitError) def messages_with_backoff(self, **kwargs): @@ -432,7 +452,8 @@ def messages_with_backoff(self, **kwargs): if self.use_claude: return self.anthropic_helper.messages_with_backoff(**kwargs) else: - raise Exception("MultiProviderAIHelper: Anthropic Helper is not enabled") + msg = "MultiProviderAIHelper: Anthropic Helper is not enabled" + raise Exception(msg) @retry(wait=wait_random_exponential(min=70, max=600), stop=stop_after_attempt(10)) def llm_query_with_retry(self, **kwargs): @@ -444,7 +465,8 @@ def llm_query_no_retry(self, messages: list = [], model: str = "gpt-4-32k", max_ elif self.use_claude and model.startswith("claude"): return self.anthropic_helper.llm_query_no_retry(messages=messages, model=model, max_tokens=max_tokens, **kwargs) else: - raise Exception(f"MultiProviderAIHelper: Unknown Model {model}") + msg = f"MultiProviderAIHelper: Unknown Model {model}" + raise Exception(msg) @retry(wait=wait_random_exponential(min=70, max=600), stop=stop_after_attempt(10)) def llm_query_functions_with_retry(self, **kwargs): @@ -456,7 +478,8 @@ def llm_query_functions(self, model: str, messages: list, functions: list[dict], elif self.use_claude and model.startswith("claude"): return self.anthropic_helper.llm_query_functions(model, messages, functions, max_tokens, **kwargs) else: - raise Exception(f"MultiProviderAIHelper: Unknown Model {model}") + msg = f"MultiProviderAIHelper: Unknown Model {model}" + raise Exception(msg) @staticmethod def llm_response_to_json(response) -> str: diff --git a/src/codegen/sdk/code_generation/doc_utils/generate_docs_json.py b/src/codegen/sdk/code_generation/doc_utils/generate_docs_json.py index 1682fd010..c2f332f6a 100644 --- a/src/codegen/sdk/code_generation/doc_utils/generate_docs_json.py +++ b/src/codegen/sdk/code_generation/doc_utils/generate_docs_json.py @@ -52,14 +52,16 @@ def process_method(method, cls, cls_doc, seen_methods): return if not method.docstring: - raise ValueError(f"Method {cls.name}.{method.name} does not have a docstring") + msg = f"Method {cls.name}.{method.name} does not have a docstring" + raise ValueError(msg) method_path = create_path(method, cls) parameters = [] parsed = parse_docstring(method.docstring.source) if parsed is None: - raise ValueError(f"Method {cls.name}.{method.name} docstring does not exist or has incorrect format.") + msg = f"Method {cls.name}.{method.name} docstring does not exist or has incorrect format." + raise ValueError(msg) # Update parameter types for param, parsed_param in zip(method.parameters[1:], parsed["arguments"]): diff --git a/src/codegen/sdk/code_generation/doc_utils/utils.py b/src/codegen/sdk/code_generation/doc_utils/utils.py index ab2ac5f1e..d0b939de2 100644 --- a/src/codegen/sdk/code_generation/doc_utils/utils.py +++ b/src/codegen/sdk/code_generation/doc_utils/utils.py @@ -197,7 +197,8 @@ def safe_get_class(codebase: Codebase, class_name: str) -> Class | None: return None if len(possible_classes) == 1: return possible_classes[0] - raise ValueError(f"Found {len(possible_classes)} classes with name {class_name}") + msg = f"Found {len(possible_classes)} classes with name {class_name}" + raise ValueError(msg) def find_symbol(codebase: Codebase, symbol_name: str, resolved_types: list[Type], parent_class: Class, parent_symbol: Symbol, types_cache: dict): diff --git a/src/codegen/sdk/codebase/codebase_graph.py b/src/codegen/sdk/codebase/codebase_graph.py index 775643a37..7014a2a52 100644 --- a/src/codegen/sdk/codebase/codebase_graph.py +++ b/src/codegen/sdk/codebase/codebase_graph.py @@ -2,7 +2,6 @@ import os from collections import Counter, defaultdict -from collections.abc import Generator, Mapping, Sequence from concurrent.futures import ThreadPoolExecutor from contextlib import contextmanager from enum import IntEnum, auto, unique @@ -11,11 +10,8 @@ from pathlib import Path from typing import TYPE_CHECKING, Any -from codeowners import CodeOwners as CodeOwnersParser -from git import Commit as GitCommit from rustworkx import PyDiGraph, WeightedEdgeList -from codegen.git.repo_operator.repo_operator import RepoOperator from codegen.sdk.codebase.config import CodebaseConfig, DefaultConfig, ProjectConfig, SessionOptions from codegen.sdk.codebase.config_parser import ConfigParser, get_config_parser_for_language from codegen.sdk.codebase.diff_lite import ChangeType, DiffLite @@ -23,12 +19,9 @@ from codegen.sdk.codebase.transaction_manager import TransactionManager from codegen.sdk.codebase.validation import get_edges, post_reset_validation from codegen.sdk.core.autocommit import AutoCommit, commiter -from codegen.sdk.core.dataclasses.usage import Usage from codegen.sdk.core.directory import Directory from codegen.sdk.core.external.dependency_manager import DependencyManager, get_dependency_manager from codegen.sdk.core.external.language_engine import LanguageEngine, get_language_engine -from codegen.sdk.core.interfaces.importable import Importable -from codegen.sdk.core.node_id_factory import NodeId from codegen.sdk.enums import Edge, EdgeType, NodeType, ProgrammingLanguage from codegen.sdk.extensions.io import write_changes from codegen.sdk.extensions.sort import sort_editables @@ -38,10 +31,19 @@ from codegen.shared.performance.stopwatch_utils import stopwatch, stopwatch_with_sentry if TYPE_CHECKING: + from collections.abc import Generator, Mapping, Sequence + + from codeowners import CodeOwners as CodeOwnersParser + from git import Commit as GitCommit + + from codegen.git.repo_operator.repo_operator import RepoOperator from codegen.sdk.codebase.node_classes.node_classes import NodeClasses + from codegen.sdk.core.dataclasses.usage import Usage from codegen.sdk.core.expressions import Expression from codegen.sdk.core.external_module import ExternalModule from codegen.sdk.core.file import SourceFile + from codegen.sdk.core.interfaces.importable import Importable + from codegen.sdk.core.node_id_factory import NodeId from codegen.sdk.core.parser import Parser import logging @@ -69,7 +71,8 @@ def get_node_classes(programming_language: ProgrammingLanguage) -> NodeClasses: return TSNodeClasses else: - raise ValueError(f"Unsupported programming language: {programming_language}!") + msg = f"Unsupported programming language: {programming_language}!" + raise ValueError(msg) class CodebaseGraph: @@ -156,7 +159,7 @@ def __init__( try: self.synced_commit = context.repo_operator.head_commit except ValueError as e: - logger.error("Error getting commit head %s", e) + logger.exception("Error getting commit head %s", e) self.synced_commit = None self.pending_syncs = [] self.all_syncs = [] @@ -512,7 +515,8 @@ def get_node(self, node_id: int) -> Any: def get_nodes(self, node_type: NodeType | None = None, exclude_type: NodeType | None = None) -> list[Importable]: if node_type is not None and exclude_type is not None: - raise ValueError("node_type and exclude_type cannot both be specified") + msg = "node_type and exclude_type cannot both be specified" + raise ValueError(msg) if node_type is not None: return [self.get_node(node_id) for node_id in self._graph.filter_nodes(lambda node: node.node_type == node_type)] if exclude_type is not None: @@ -543,7 +547,8 @@ def get_external_module(self, module: str, import_name: str) -> ExternalModule | def add_node(self, node: Importable) -> int: if self.config.feature_flags.debug: if self._graph.find_node_by_weight(node.__eq__): - raise Exception("Node already exists") + msg = "Node already exists" + raise Exception(msg) if self.config.feature_flags.debug and self._computing and node.node_type != NodeType.EXTERNAL: assert False, f"Adding node during compute dependencies: {node!r}" return self._graph.add_node(node) @@ -551,7 +556,8 @@ def add_node(self, node: Importable) -> int: def add_child(self, parent: NodeId, node: Importable, type: EdgeType, usage: Usage | None = None) -> int: if self.config.feature_flags.debug: if self._graph.find_node_by_weight(node.__eq__): - raise Exception("Node already exists") + msg = "Node already exists" + raise Exception(msg) if self.config.feature_flags.debug and self._computing and node.node_type != NodeType.EXTERNAL: assert False, f"Adding node during compute dependencies: {node!r}" return self._graph.add_child(parent, node, Edge(type, usage)) @@ -709,9 +715,11 @@ def remove_directory(self, directory_path: PathLike, force: bool = False, cleanu # Check errors if directory is None: - raise ValueError(f"Directory {directory_path} does not exist") + msg = f"Directory {directory_path} does not exist" + raise ValueError(msg) if not force and len(directory.items) > 0: - raise ValueError(f"Directory {directory_path} is not empty") + msg = f"Directory {directory_path} is not empty" + raise ValueError(msg) # Remove the directory from the tree if str(directory_path) in self.directories: diff --git a/src/codegen/sdk/codebase/diff_lite.py b/src/codegen/sdk/codebase/diff_lite.py index f38839ef5..b923488ef 100644 --- a/src/codegen/sdk/codebase/diff_lite.py +++ b/src/codegen/sdk/codebase/diff_lite.py @@ -32,7 +32,8 @@ def from_git_change_type(change_type: str | None): return ChangeType.Renamed if change_type == "A": return ChangeType.Added - raise ValueError(f"Invalid change type: {change_type}") + msg = f"Invalid change type: {change_type}" + raise ValueError(msg) class DiffLite(NamedTuple): diff --git a/src/codegen/sdk/codebase/flagging/groupers/all_grouper.py b/src/codegen/sdk/codebase/flagging/groupers/all_grouper.py index 7eaac241f..64ef65d6e 100644 --- a/src/codegen/sdk/codebase/flagging/groupers/all_grouper.py +++ b/src/codegen/sdk/codebase/flagging/groupers/all_grouper.py @@ -17,5 +17,6 @@ def create_all_groups(flags: list[CodeFlag], repo_operator: RemoteRepoOperator | @staticmethod def create_single_group(flags: list[CodeFlag], segment: str, repo_operator: RemoteRepoOperator | None = None) -> Group: if segment != "all": - raise ValueError(f"❌ Invalid segment for AllGrouper: {segment}. Only 'all' is a valid segment.") + msg = f"❌ Invalid segment for AllGrouper: {segment}. Only 'all' is a valid segment." + raise ValueError(msg) return Group(group_by=GroupBy.ALL, segment=segment, flags=flags) diff --git a/src/codegen/sdk/codebase/flagging/groupers/base_grouper.py b/src/codegen/sdk/codebase/flagging/groupers/base_grouper.py index 56ada1612..f2b93017a 100644 --- a/src/codegen/sdk/codebase/flagging/groupers/base_grouper.py +++ b/src/codegen/sdk/codebase/flagging/groupers/base_grouper.py @@ -14,13 +14,16 @@ class BaseGrouper: def __init__(self) -> None: if type is None: - raise ValueError("Must set type in BaseGrouper") + msg = "Must set type in BaseGrouper" + raise ValueError(msg) @staticmethod def create_all_groups(flags: list[CodeFlag], repo_operator: RemoteRepoOperator | None = None) -> list[Group]: - raise NotImplementedError("Must implement create_all_groups in BaseGrouper") + msg = "Must implement create_all_groups in BaseGrouper" + raise NotImplementedError(msg) @staticmethod def create_single_group(flags: list[CodeFlag], segment: str, repo_operator: RemoteRepoOperator | None = None) -> Group: """TODO: handle the case when 0 flags are passed in""" - raise NotImplementedError("Must implement create_single_group in BaseGrouper") + msg = "Must implement create_single_group in BaseGrouper" + raise NotImplementedError(msg) diff --git a/src/codegen/sdk/codebase/flagging/groupers/codeowner_grouper.py b/src/codegen/sdk/codebase/flagging/groupers/codeowner_grouper.py index 8e01f6ba1..d7ff0a51a 100644 --- a/src/codegen/sdk/codebase/flagging/groupers/codeowner_grouper.py +++ b/src/codegen/sdk/codebase/flagging/groupers/codeowner_grouper.py @@ -37,4 +37,5 @@ def create_all_groups(flags: list[CodeFlag], repo_operator: RemoteRepoOperator | @staticmethod def create_single_group(flags: list[CodeFlag], segment: str, repo_operator: RemoteRepoOperator | None = None) -> Group: - raise NotImplementedError("TODO: implement single group creation") + msg = "TODO: implement single group creation" + raise NotImplementedError(msg) diff --git a/src/codegen/sdk/codebase/flagging/groupers/instance_grouper.py b/src/codegen/sdk/codebase/flagging/groupers/instance_grouper.py index 6607c58cc..953c7f355 100644 --- a/src/codegen/sdk/codebase/flagging/groupers/instance_grouper.py +++ b/src/codegen/sdk/codebase/flagging/groupers/instance_grouper.py @@ -23,4 +23,5 @@ def create_single_group(flags: list[CodeFlag], segment: str, repo_operator: Remo flag = CodeFlag.from_json(segment) return Group(group_by=GroupBy.INSTANCE, segment=segment, flags=[flag]) except Exception as e: - raise ValueError(f"Unable to deserialize segment ({segment}) into CodeFlag. Unable to create group.") + msg = f"Unable to deserialize segment ({segment}) into CodeFlag. Unable to create group." + raise ValueError(msg) diff --git a/src/codegen/sdk/codebase/flagging/groupers/utils.py b/src/codegen/sdk/codebase/flagging/groupers/utils.py index 64bc737c1..38d43cfa2 100644 --- a/src/codegen/sdk/codebase/flagging/groupers/utils.py +++ b/src/codegen/sdk/codebase/flagging/groupers/utils.py @@ -10,4 +10,5 @@ def get_grouper_by_group_by(group_by: GroupBy | None) -> type[BaseGrouper]: matched_groupers = [x for x in ALL_GROUPERS if x.type == group_by] if len(matched_groupers) > 0: return matched_groupers[0] - raise ValueError(f"No grouper found for group_by={group_by}. Did you add to ALL_GROUPERS?") + msg = f"No grouper found for group_by={group_by}. Did you add to ALL_GROUPERS?" + raise ValueError(msg) diff --git a/src/codegen/sdk/codebase/span.py b/src/codegen/sdk/codebase/span.py index 1fb3052f2..1f8b6644f 100644 --- a/src/codegen/sdk/codebase/span.py +++ b/src/codegen/sdk/codebase/span.py @@ -16,7 +16,8 @@ def validate_range(value: Any, info: ValidationInfo) -> Range: end_point=Point(**value["end_point"]), ) elif not isinstance(value, Range): - raise ValueError("Invalid type for range field. Expected tree_sitter.Range or dict.") + msg = "Invalid type for range field. Expected tree_sitter.Range or dict." + raise ValueError(msg) return value diff --git a/src/codegen/sdk/codebase/transaction_manager.py b/src/codegen/sdk/codebase/transaction_manager.py index f91e13142..bba56b1bc 100644 --- a/src/codegen/sdk/codebase/transaction_manager.py +++ b/src/codegen/sdk/codebase/transaction_manager.py @@ -144,14 +144,16 @@ def check_max_transactions(self): # of the results to the user. This may result in errors that do not get covered. if self.max_transactions_exceeded(): logger.info(f"Max transactions reached: {self.max_transactions}. Stopping codemod.") - raise MaxTransactionsExceeded(f"Max transactions reached: {self.max_transactions}", threshold=self.max_transactions) + msg = f"Max transactions reached: {self.max_transactions}" + raise MaxTransactionsExceeded(msg, threshold=self.max_transactions) def check_max_preview_time(self): # =====[ Max preview time ]===== # This is to prevent the preview from taking too long. We want to keep it at like ~5s in the frontend during debugging if self.is_time_exceeded(): logger.info(f"Max preview time exceeded: {self.stopwatch_max_seconds}. Stopping codemod.") - raise MaxPreviewTimeExceeded(f"Max preview time exceeded: {self.is_time_exceeded()}", threshold=self.stopwatch_max_seconds) + msg = f"Max preview time exceeded: {self.is_time_exceeded()}" + raise MaxPreviewTimeExceeded(msg, threshold=self.stopwatch_max_seconds) #################################################################################################################### # Commit @@ -249,8 +251,8 @@ def break_down(to_break: EditTransaction) -> bool: # Add to priority queue and rebuild the queue return transaction except TransactionError as e: - logger.error(e) - raise TransactionError( + logger.exception(e) + msg = ( f"Potential conflict detected in file {transaction.file_path}!\n" "Attempted to perform code modification:\n" "\n" @@ -264,6 +266,7 @@ def break_down(to_break: EditTransaction) -> bool: "\n" f"[Conflict Detected] Potential Modification Conflict in File {transaction.file_path}!" ) + raise TransactionError(msg) def get_transactions_at_range(self, file_path: Path, start_byte: int, end_byte: int, transaction_order: TransactionPriority | None = None, *, combined: bool = False) -> list[Transaction]: """Returns list of queued transactions that matches the given filtering criteria. diff --git a/src/codegen/sdk/codebase/transactions.py b/src/codegen/sdk/codebase/transactions.py index a43d0c399..1abdf912c 100644 --- a/src/codegen/sdk/codebase/transactions.py +++ b/src/codegen/sdk/codebase/transactions.py @@ -79,15 +79,18 @@ def length(self): return self.end_byte - self.start_byte def execute(self): - raise NotImplementedError("Transaction.execute() must be implemented by subclasses") + msg = "Transaction.execute() must be implemented by subclasses" + raise NotImplementedError(msg) def get_diff(self) -> DiffLite: """Gets the diff produced by this transaction""" - raise NotImplementedError("Transaction.get_diff() must be implemented by subclasses") + msg = "Transaction.get_diff() must be implemented by subclasses" + raise NotImplementedError(msg) def diff_str(self): """Human-readable string representation of the change""" - raise NotImplementedError("Transaction.diff_str() must be implemented by subclasses") + msg = "Transaction.diff_str() must be implemented by subclasses" + raise NotImplementedError(msg) def _to_sort_key(transaction: "Transaction"): # Sort by: diff --git a/src/codegen/sdk/codebase/validation.py b/src/codegen/sdk/codebase/validation.py index 3ce05da38..ce3163528 100644 --- a/src/codegen/sdk/codebase/validation.py +++ b/src/codegen/sdk/codebase/validation.py @@ -7,7 +7,6 @@ from enum import StrEnum from typing import TYPE_CHECKING -from rustworkx import PyDiGraph from tabulate import tabulate from codegen.sdk.enums import NodeType @@ -16,6 +15,8 @@ logger = logging.getLogger(__name__) if TYPE_CHECKING: + from rustworkx import PyDiGraph + from codegen.sdk.core.codebase import CodebaseType @@ -62,9 +63,11 @@ def post_reset_validation(init_nodes, nodes, init_edges, edges, repo_name: str, def post_sync_validation(codebase: CodebaseType) -> bool: """Post codebase.sync, checks that the codebase graph is in a valid state (i.e. not corrupted by codebase.sync)""" if len(codebase.G.all_syncs) > 0 or len(codebase.G.pending_syncs) > 0 or len(codebase.G.transaction_manager.to_commit()) > 0: - raise NotImplementedError("Can only be called on a reset codebase") + msg = "Can only be called on a reset codebase" + raise NotImplementedError(msg) if not codebase.G.config.feature_flags.track_graph: - raise NotImplementedError("Can only be called with track_graph=true") + msg = "Can only be called with track_graph=true" + raise NotImplementedError(msg) return len(dict.fromkeys(codebase.G.old_graph.nodes())) == len(dict.fromkeys(codebase.G.nodes)) and len(dict.fromkeys(codebase.G.old_graph.weighted_edge_list())) == len( dict.fromkeys(codebase.G.edges) ) @@ -75,7 +78,8 @@ def log_or_throw(message, thread_message: str): logger.error(message) # logger.error(thread_message) if hostname != "modal": - raise Exception(f"{message}\n{thread_message}") + msg = f"{message}\n{thread_message}" + raise Exception(msg) return diff --git a/src/codegen/sdk/core/assignment.py b/src/codegen/sdk/core/assignment.py index 8d4e1d2b6..3f09e1050 100644 --- a/src/codegen/sdk/core/assignment.py +++ b/src/codegen/sdk/core/assignment.py @@ -1,13 +1,8 @@ from __future__ import annotations -from collections.abc import Generator from typing import TYPE_CHECKING, Generic, Self, TypeVar, override -from tree_sitter import Node as TSNode - from codegen.sdk._proxy import proxy_property -from codegen.sdk.codebase.codebase_graph import CodebaseGraph -from codegen.sdk.codebase.resolution_stack import ResolutionStack from codegen.sdk.core.autocommit import writer from codegen.sdk.core.dataclasses.usage import UsageKind from codegen.sdk.core.expressions import Expression, Name @@ -15,13 +10,8 @@ from codegen.sdk.core.expressions.multi_expression import MultiExpression from codegen.sdk.core.expressions.subscript_expression import SubscriptExpression from codegen.sdk.core.interfaces.chainable import Chainable -from codegen.sdk.core.interfaces.editable import Editable -from codegen.sdk.core.interfaces.has_name import HasName from codegen.sdk.core.interfaces.has_value import HasValue -from codegen.sdk.core.interfaces.importable import Importable from codegen.sdk.core.interfaces.typeable import Typeable -from codegen.sdk.core.node_id_factory import NodeId -from codegen.sdk.core.statements.statement import Statement from codegen.sdk.core.symbol import Symbol from codegen.sdk.core.symbol_groups.collection import Collection from codegen.sdk.core.symbol_groups.dict import Dict @@ -33,9 +23,20 @@ from codegen.shared.decorators.docs import apidoc, noapidoc if TYPE_CHECKING: + from collections.abc import Generator + + from tree_sitter import Node as TSNode + + from codegen.sdk.codebase.codebase_graph import CodebaseGraph + from codegen.sdk.codebase.resolution_stack import ResolutionStack from codegen.sdk.core.expressions.type import Type + from codegen.sdk.core.interfaces.editable import Editable + from codegen.sdk.core.interfaces.has_name import HasName + from codegen.sdk.core.interfaces.importable import Importable + from codegen.sdk.core.node_id_factory import NodeId from codegen.sdk.core.statements.assignment_statement import AssignmentStatement from codegen.sdk.core.statements.export_statement import ExportStatement + from codegen.sdk.core.statements.statement import Statement Parent = TypeVar("Parent", bound="AssignmentStatement | ExportStatement") diff --git a/src/codegen/sdk/core/autocommit/__init__.py b/src/codegen/sdk/core/autocommit/__init__.py index fabd6f4bd..188109bf1 100644 --- a/src/codegen/sdk/core/autocommit/__init__.py +++ b/src/codegen/sdk/core/autocommit/__init__.py @@ -22,4 +22,13 @@ from codegen.sdk.core.autocommit.manager import AutoCommit from codegen.sdk.extensions.autocommit import commiter, reader -__all__ = ["AutoCommit", "commiter", "enabled", "mover", "reader", "remover", "repr_func", "writer"] +__all__ = [ + "AutoCommit", + "commiter", + "enabled", + "mover", + "reader", + "remover", + "repr_func", + "writer", +] diff --git a/src/codegen/sdk/core/autocommit/constants.py b/src/codegen/sdk/core/autocommit/constants.py index 2d3b50969..9bcb051d2 100644 --- a/src/codegen/sdk/core/autocommit/constants.py +++ b/src/codegen/sdk/core/autocommit/constants.py @@ -45,7 +45,11 @@ def __init__(self, node: "Editable") -> None: super().__init__( f"Using an outdated node {node}.\n" + "This can happen if you cache a detached symbol, then update a related symbol or file.\n" - + (f"Try acquiring the node from it's parent symbol: {parent}.\n" + "For example if the node was the first parameter of a function, " + f"call {node.name} = {parent.name}.parameters[0]") + + ( + f"Try acquiring the node from it's parent symbol: {parent}.\n" + + "For example if the node was the first parameter of a function, " + + f"call {node.name} = {parent.name}.parameters[0]" + ) if parent else "" ) diff --git a/src/codegen/sdk/core/autocommit/decorators.py b/src/codegen/sdk/core/autocommit/decorators.py index 44700cf6b..e12a1f30c 100644 --- a/src/codegen/sdk/core/autocommit/decorators.py +++ b/src/codegen/sdk/core/autocommit/decorators.py @@ -23,10 +23,14 @@ def writer(wrapped: Callable[P, T]) -> Callable[P, T]: ... @overload -def writer(wrapped: None = None, *, commit: bool = ...) -> Callable[[Callable[P, T]], Callable[P, T]]: ... +def writer( + wrapped: None = None, *, commit: bool = ... +) -> Callable[[Callable[P, T]], Callable[P, T]]: ... -def writer(wrapped: Callable[P, T] | None = None, *, commit: bool = True) -> Callable[P, T] | Callable[[Callable[P, T]], Callable[P, T]]: +def writer( + wrapped: Callable[P, T] | None = None, *, commit: bool = True +) -> Callable[P, T] | Callable[[Callable[P, T]], Callable[P, T]]: """Indicates the method is a writer. This will automatically update if the original is out of date. @@ -52,7 +56,12 @@ def wrapper(wrapped: Callable[P, T], instance: "Editable", args, kwargs) -> T: @wrapt.decorator(enabled=enabled) -def remover(wrapped: Callable[P, T], instance: Union["Symbol", None] = None, args: P.args = None, kwargs: P.kwargs = None) -> Callable[P, T]: +def remover( + wrapped: Callable[P, T], + instance: Union["Symbol", None] = None, + args: P.args = None, + kwargs: P.kwargs = None, +) -> Callable[P, T]: """Indicates the node will be removed at the end of this method. Further usage of the node will result in undefined behaviour and a warning. @@ -68,7 +77,12 @@ def remover(wrapped: Callable[P, T], instance: Union["Symbol", None] = None, arg @wrapt.decorator(enabled=enabled) -def repr_func(wrapped: Callable[P, T], instance: Union["Editable", None] = None, args: P.args = None, kwargs: P.kwargs = None) -> Callable[P, T]: +def repr_func( + wrapped: Callable[P, T], + instance: Union["Editable", None] = None, + args: P.args = None, + kwargs: P.kwargs = None, +) -> Callable[P, T]: """Indicates the method is use in debugging/logs.""" if instance is None: instance = args[0] @@ -82,7 +96,12 @@ def repr_func(wrapped: Callable[P, T], instance: Union["Editable", None] = None, @wrapt.decorator(enabled=enabled) -def mover(wrapped: Callable[P, tuple[NodeId, NodeId]], instance: Union["Symbol", None] = None, args: P.args = None, kwargs: P.kwargs = None) -> Callable[P, None]: +def mover( + wrapped: Callable[P, tuple[NodeId, NodeId]], + instance: Union["Symbol", None] = None, + args: P.args = None, + kwargs: P.kwargs = None, +) -> Callable[P, None]: """Indicates the Node will be moved by the end of this method. It should also return the node_id of itself and the new file diff --git a/src/codegen/sdk/core/autocommit/manager.py b/src/codegen/sdk/core/autocommit/manager.py index 52a72d678..5e7370db8 100644 --- a/src/codegen/sdk/core/autocommit/manager.py +++ b/src/codegen/sdk/core/autocommit/manager.py @@ -4,7 +4,14 @@ from pathlib import Path from typing import TYPE_CHECKING, Optional, Union -from codegen.sdk.core.autocommit.constants import REMOVED, AutoCommitState, AutoCommitSymbol, IllegalWriteError, NodeNotFoundError, OutdatedNodeError +from codegen.sdk.core.autocommit.constants import ( + REMOVED, + AutoCommitState, + AutoCommitSymbol, + IllegalWriteError, + NodeNotFoundError, + OutdatedNodeError, +) from codegen.sdk.core.autocommit.utils import is_file, is_on_graph, is_symbol from codegen.sdk.core.node_id_factory import NodeId from codegen.sdk.extensions.autocommit import update_dict @@ -81,7 +88,9 @@ def __repr__(self) -> str: def _commit(self, lock: PendingFiles, additional: str | None = None) -> None: if lock: - logger.debug("Running autocommit on %s", "all files" if lock.all else lock.files) + logger.debug( + "Running autocommit on %s", "all files" if lock.all else lock.files + ) files = lock.files if not lock.all else None if additional and files: files.add(additional) @@ -96,12 +105,19 @@ def _update_file(self, symbol: "File", lock: PendingFiles) -> None: return self._commit(lock, new_id) old_node = self.G.get_node(symbol.file_node_id) - new_node = self.G.get_node(new_id if new_id is not None else symbol.file_node_id) + new_node = self.G.get_node( + new_id if new_id is not None else symbol.file_node_id + ) old_node.__dict__ = new_node.__dict__ if not lock: self._files[symbol.file_node_id] = new_id - def _reaquire_node(self, symbol: Union["Symbol", "Import"], new_node_id: NodeId, missing_ok: bool = False): + def _reaquire_node( + self, + symbol: Union["Symbol", "Import"], + new_node_id: NodeId, + missing_ok: bool = False, + ): """Re-aquire a symbol.""" # Prevent double re-aquire new_node = self.G.get_node(new_node_id) @@ -113,7 +129,9 @@ def _reaquire_node(self, symbol: Union["Symbol", "Import"], new_node_id: NodeId, ) update_dict(set(), symbol, new_node) - def _update_symbol(self, symbol: Union["Symbol", "Import"], lock: PendingFiles) -> None: + def _update_symbol( + self, symbol: Union["Symbol", "Import"], lock: PendingFiles + ) -> None: """Check for an update to a symbol, and if there is one, copy its dict.""" node_id = symbol.node_id if symbol_update := self._nodes.pop(node_id, None): @@ -129,7 +147,9 @@ def _update_symbol(self, symbol: Union["Symbol", "Import"], lock: PendingFiles) self._reaquire_node(symbol, node_id) self._nodes[node_id] = symbol_update else: - new_id = node_id if (symbol_update.new_id is None) else symbol_update.new_id + new_id = ( + node_id if (symbol_update.new_id is None) else symbol_update.new_id + ) self._reaquire_node(symbol, new_id) if symbol_update.new_id == REMOVED: # Incredibly cursed, but keep the update around to make re-acquire succeed @@ -138,7 +158,9 @@ def _update_symbol(self, symbol: Union["Symbol", "Import"], lock: PendingFiles) # We can't re-acquire a node twice self._reaquire_node(symbol, node_id, missing_ok=True) - def check_update(self, node: AutoCommitSymbol, lock: PendingFiles, must_be_updated: bool = True) -> None: + def check_update( + self, node: AutoCommitSymbol, lock: PendingFiles, must_be_updated: bool = True + ) -> None: """Check for an update to a node if possible.""" assert self.state is not None if is_on_graph(node): @@ -148,20 +170,33 @@ def check_update(self, node: AutoCommitSymbol, lock: PendingFiles, must_be_updat else: if node.is_outdated: if node.parent is not None: - self.check_update(node.parent, lock=lock, must_be_updated=must_be_updated) + self.check_update( + node.parent, lock=lock, must_be_updated=must_be_updated + ) if not node.is_outdated: return if must_be_updated: raise OutdatedNodeError(node) - def set_pending_file(self, file: AutoCommitSymbol, *, update_id: NodeId | None = None, new_id: NodeId | None = None) -> None: + def set_pending_file( + self, + file: AutoCommitSymbol, + *, + update_id: NodeId | None = None, + new_id: NodeId | None = None, + ) -> None: """Mark a file as pending.""" if update_id is None: update_id = file.filepath if new_id is not None or update_id not in self._files: self._files[update_id] = new_id - def set_pending(self, node: AutoCommitSymbol, new_id: NodeId | None = None, new_file: NodeId | None = None) -> None: + def set_pending( + self, + node: AutoCommitSymbol, + new_id: NodeId | None = None, + new_file: NodeId | None = None, + ) -> None: """Mark a node as pending. This also mark the file it's in, the file it's moved to, and it's parent if the node is @@ -183,14 +218,18 @@ def set_pending(self, node: AutoCommitSymbol, new_id: NodeId | None = None, new_ symbol_update.new_file = new_file_node symbol_update.generation = node.file._generation else: - self._nodes[node.node_id] = AutoCommitNode(node, node.file._generation, new_id, new_file_node) + self._nodes[node.node_id] = AutoCommitNode( + node, node.file._generation, new_id, new_file_node + ) elif node.parent: self.set_pending(node.parent, None, None) else: logger.warning("Could not find parent node of %r", node) @contextmanager - def write_state(self, node: AutoCommitSymbol, *, commit: bool = True, move: bool = False) -> Iterator[None]: + def write_state( + self, node: AutoCommitSymbol, *, commit: bool = True, move: bool = False + ) -> Iterator[None]: """Enter a write state.""" if self.state not in (AutoCommitState.Write, None): # Can't write in a read or commit @@ -208,19 +247,27 @@ def write_state(self, node: AutoCommitSymbol, *, commit: bool = True, move: bool def enter_state(self, state: AutoCommitState) -> AutoCommitState | None: """Begin a new state.""" old_state = self.state - logger.debug("Starting %s, previous: %s", state.name, old_state.name if old_state else None) + logger.debug( + "Starting %s, previous: %s", + state.name, + old_state.name if old_state else None, + ) self.state = state return old_state @contextmanager - def lock_files(self, files: set[Path], all: bool = False, commit: bool = True) -> Iterator[PendingFiles]: + def lock_files( + self, files: set[Path], all: bool = False, commit: bool = True + ) -> Iterator[PendingFiles]: to_unlock = self.try_lock_files(files, all, commit) try: yield to_unlock finally: self.unlock_files(to_unlock) - def try_lock_files(self, files: set[Path], all: bool = False, commit: bool = True) -> PendingFiles: + def try_lock_files( + self, files: set[Path], all: bool = False, commit: bool = True + ) -> PendingFiles: if self._lock_all or not commit: return PendingFiles(set()) if all: diff --git a/src/codegen/sdk/core/class_definition.py b/src/codegen/sdk/core/class_definition.py index f9fd2906d..9fe1c207b 100644 --- a/src/codegen/sdk/core/class_definition.py +++ b/src/codegen/sdk/core/class_definition.py @@ -3,39 +3,39 @@ from abc import abstractmethod from typing import TYPE_CHECKING, Generic, Literal, Self, TypeVar, overload, override -from tree_sitter import Node as TSNode - from codegen.sdk._proxy import proxy_property -from codegen.sdk.codebase.codebase_graph import CodebaseGraph from codegen.sdk.core.autocommit import commiter, reader, writer -from codegen.sdk.core.detached_symbols.decorator import Decorator -from codegen.sdk.core.detached_symbols.parameter import Parameter -from codegen.sdk.core.expressions import Name -from codegen.sdk.core.expressions.chained_attribute import ChainedAttribute -from codegen.sdk.core.external_module import ExternalModule -from codegen.sdk.core.function import Function from codegen.sdk.core.import_resolution import Import -from codegen.sdk.core.interface import Interface from codegen.sdk.core.interfaces.callable import Callable -from codegen.sdk.core.interfaces.editable import Editable from codegen.sdk.core.interfaces.has_attribute import HasAttribute from codegen.sdk.core.interfaces.has_block import HasBlock from codegen.sdk.core.interfaces.inherits import Inherits -from codegen.sdk.core.node_id_factory import NodeId from codegen.sdk.core.statements.attribute import Attribute from codegen.sdk.core.statements.statement import StatementType -from codegen.sdk.core.statements.symbol_statement import SymbolStatement from codegen.sdk.core.symbol import Symbol -from codegen.sdk.core.symbol_groups.multi_line_collection import MultiLineCollection -from codegen.sdk.core.symbol_groups.parents import Parents from codegen.sdk.enums import SymbolType from codegen.sdk.extensions.utils import cached_property from codegen.shared.decorators.docs import apidoc, noapidoc from codegen.visualizations.enums import VizNode if TYPE_CHECKING: + from tree_sitter import Node as TSNode + + from codegen.sdk.codebase.codebase_graph import CodebaseGraph from codegen.sdk.core.detached_symbols.code_block import CodeBlock + from codegen.sdk.core.detached_symbols.decorator import Decorator + from codegen.sdk.core.detached_symbols.parameter import Parameter + from codegen.sdk.core.expressions import Name + from codegen.sdk.core.expressions.chained_attribute import ChainedAttribute from codegen.sdk.core.expressions.type import Type + from codegen.sdk.core.external_module import ExternalModule + from codegen.sdk.core.function import Function + from codegen.sdk.core.interface import Interface + from codegen.sdk.core.interfaces.editable import Editable + from codegen.sdk.core.node_id_factory import NodeId + from codegen.sdk.core.statements.symbol_statement import SymbolStatement + from codegen.sdk.core.symbol_groups.multi_line_collection import MultiLineCollection + from codegen.sdk.core.symbol_groups.parents import Parents import logging diff --git a/src/codegen/sdk/core/codebase.py b/src/codegen/sdk/core/codebase.py index 66c336d76..8aec1dc65 100644 --- a/src/codegen/sdk/core/codebase.py +++ b/src/codegen/sdk/core/codebase.py @@ -8,7 +8,7 @@ from collections.abc import Generator from contextlib import contextmanager from pathlib import Path -from typing import Generic, Literal, TypeVar, Unpack, overload +from typing import TYPE_CHECKING, Generic, Literal, TypeVar, Unpack, overload import plotly.graph_objects as go import rich.repr @@ -38,7 +38,6 @@ from codegen.sdk.core.detached_symbols.code_block import CodeBlock from codegen.sdk.core.detached_symbols.parameter import Parameter from codegen.sdk.core.directory import Directory -from codegen.sdk.core.export import Export from codegen.sdk.core.external_module import ExternalModule from codegen.sdk.core.file import File, SourceFile from codegen.sdk.core.function import Function @@ -78,6 +77,9 @@ from codegen.shared.performance.stopwatch_utils import stopwatch from codegen.visualizations.visualization_manager import VisualizationManager +if TYPE_CHECKING: + from codegen.sdk.core.export import Export + logger = logging.getLogger(__name__) MAX_LINES = 10000 # Maximum number of lines of text allowed to be logged @@ -142,13 +144,16 @@ def __init__( ) -> None: # Sanity check inputs if repo_path is not None and projects is not None: - raise ValueError("Cannot specify both repo_path and projects") + msg = "Cannot specify both repo_path and projects" + raise ValueError(msg) if repo_path is None and projects is None: - raise ValueError("Must specify either repo_path or projects") + msg = "Must specify either repo_path or projects" + raise ValueError(msg) if projects is not None and programming_language is not None: - raise ValueError("Cannot specify both projects and programming_language. Use ProjectConfig.from_path() to create projects with a custom programming_language.") + msg = "Cannot specify both projects and programming_language. Use ProjectConfig.from_path() to create projects with a custom programming_language." + raise ValueError(msg) # If projects is a single ProjectConfig, convert it to a list if isinstance(projects, ProjectConfig): @@ -238,7 +243,8 @@ def files(self, *, extensions: list[str] | Literal["*"] | None = None) -> list[T # Return all source files files = self.G.get_nodes(NodeType.FILE) elif isinstance(extensions, str) and extensions != "*": - raise ValueError("extensions must be a list of extensions or '*'") + msg = "extensions must be a list of extensions or '*'" + raise ValueError(msg) else: files = [] # Get all files with the specified extensions @@ -292,7 +298,8 @@ def exports(self: "TSCodebaseType") -> list[TSExport]: """ if self.language == ProgrammingLanguage.PYTHON: - raise NotImplementedError("Exports are not supported for Python codebases since Python does not have an export mechanism.") + msg = "Exports are not supported for Python codebases since Python does not have an export mechanism." + raise NotImplementedError(msg) return self.G.get_nodes(NodeType.EXPORT) @@ -412,7 +419,8 @@ def create_file(self, filepath: str, content: str = "", sync: bool = True) -> Fi file_cls = self.G.node_classes.file_cls file = file_cls.from_content(filepath, content, self.G, sync=sync) if file is None: - raise ValueError(f"Failed to parse file with content {content}. Please make sure the content syntax is valid with respect to the filepath extension.") + msg = f"Failed to parse file with content {content}. Please make sure the content syntax is valid with respect to the filepath extension." + raise ValueError(msg) else: # Create file as non-source file file = File.from_content(filepath, content, self.G, sync=False) @@ -495,7 +503,8 @@ def get_file_from_path(path: Path) -> File | None: if str(absolute_path).lower() == str(file).lower(): return get_file_from_path(file) elif not optional: - raise ValueError(f"File {filepath} not found in codebase. Use optional=True to return None instead.") + msg = f"File {filepath} not found in codebase. Use optional=True to return None instead." + raise ValueError(msg) return None def has_directory(self, dir_path: str, ignore_case: bool = False) -> bool: @@ -529,7 +538,8 @@ def get_directory(self, dir_path: str, optional: bool = False, ignore_case: bool dir_path = "" if dir_path == "." else dir_path directory = self.G.get_directory(self.G.to_absolute(dir_path), ignore_case=ignore_case) if directory is None and not optional: - raise ValueError(f"Directory {dir_path} not found in codebase. Use optional=True to return None instead.") + msg = f"Directory {dir_path} not found in codebase. Use optional=True to return None instead." + raise ValueError(msg) return directory def has_symbol(self, symbol_name: str) -> bool: @@ -564,10 +574,12 @@ def get_symbol(self, symbol_name: str, optional: bool = False) -> TSymbol | None symbols = self.get_symbols(symbol_name) if len(symbols) == 0: if not optional: - raise ValueError(f"Symbol {symbol_name} not found in codebase. Use optional=True to return None instead.") + msg = f"Symbol {symbol_name} not found in codebase. Use optional=True to return None instead." + raise ValueError(msg) return None if len(symbols) > 1: - raise ValueError(f"Symbol {symbol_name} is ambiguous in codebase - more than one instance") + msg = f"Symbol {symbol_name} is ambiguous in codebase - more than one instance" + raise ValueError(msg) return symbols[0] def get_symbols(self, symbol_name: str) -> list[TSymbol]: @@ -602,10 +614,12 @@ def get_class(self, class_name: str, optional: bool = False) -> TClass | None: matches = [c for c in self.classes if c.name == class_name] if len(matches) == 0: if not optional: - raise ValueError(f"Class {class_name} not found in codebase. Use optional=True to return None instead.") + msg = f"Class {class_name} not found in codebase. Use optional=True to return None instead." + raise ValueError(msg) return None if len(matches) > 1: - raise ValueError(f"Class {class_name} is ambiguous in codebase - more than one instance") + msg = f"Class {class_name} is ambiguous in codebase - more than one instance" + raise ValueError(msg) return matches[0] def get_function(self, function_name: str, optional: bool = False) -> TFunction | None: @@ -629,10 +643,12 @@ def get_function(self, function_name: str, optional: bool = False) -> TFunction matches = [f for f in self.functions if f.name == function_name] if len(matches) == 0: if not optional: - raise ValueError(f"Function {function_name} not found in codebase. Use optional=True to return None instead.") + msg = f"Function {function_name} not found in codebase. Use optional=True to return None instead." + raise ValueError(msg) return None if len(matches) > 1: - raise ValueError(f"Function {function_name} is ambiguous in codebase - more than one instance") + msg = f"Function {function_name} is ambiguous in codebase - more than one instance" + raise ValueError(msg) return matches[0] @noapidoc @@ -1017,7 +1033,8 @@ def ai_client(self) -> AbstractAIHelper: # Create a singleton AIHelper instance if self._ai_helper is None: if self.G.config.secrets.openai_key is None: - raise ValueError("OpenAI key is not set") + msg = "OpenAI key is not set" + raise ValueError(msg) self._ai_helper = MultiProviderAIHelper(openai_key=self.G.config.secrets.openai_key, use_openai=True, use_claude=False) return self._ai_helper @@ -1045,7 +1062,8 @@ def ai(self, prompt: str, target: Editable | None = None, context: Editable | li self._num_ai_requests += 1 if self.G.session_options.max_ai_requests is not None and self._num_ai_requests > self.G.session_options.max_ai_requests: logger.info(f"Max AI requests reached: {self.G.session_options.max_ai_requests}. Stopping codemod.") - raise MaxAIRequestsError(f"Maximum number of AI requests reached: {self.G.session_options.max_ai_requests}", threshold=self.G.session_options.max_ai_requests) + msg = f"Maximum number of AI requests reached: {self.G.session_options.max_ai_requests}" + raise MaxAIRequestsError(msg, threshold=self.G.session_options.max_ai_requests) params = { "messages": [{"role": "system", "content": generate_system_prompt(target, context)}, {"role": "user", "content": prompt}], @@ -1072,17 +1090,23 @@ def ai(self, prompt: str, target: Editable | None = None, context: Editable | li if "answer" in response_answer: response_answer = response_answer["answer"] else: - raise ValueError("No answer found in tool call. (tool_call.function.arguments does not contain answer)") + msg = "No answer found in tool call. (tool_call.function.arguments does not contain answer)" + raise ValueError(msg) else: - raise ValueError("No tool call found in AI response. (choice.message.tool_calls is empty)") + msg = "No tool call found in AI response. (choice.message.tool_calls is empty)" + raise ValueError(msg) elif choice.finish_reason == "length": - raise ValueError("AI response too long / ran out of tokens. (choice.finish_reason == length)") + msg = "AI response too long / ran out of tokens. (choice.finish_reason == length)" + raise ValueError(msg) elif choice.finish_reason == "content_filter": - raise ValueError("AI response was blocked by OpenAI's content filter. (choice.finish_reason == content_filter)") + msg = "AI response was blocked by OpenAI's content filter. (choice.finish_reason == content_filter)" + raise ValueError(msg) else: - raise ValueError(f"Unknown finish reason from AI: {choice.finish_reason}") + msg = f"Unknown finish reason from AI: {choice.finish_reason}" + raise ValueError(msg) else: - raise ValueError("No response from AI Provider. (response.choices is empty)") + msg = "No response from AI Provider. (response.choices is empty)" + raise ValueError(msg) # Agent sometimes fucks up and does \\\\n for some reason. response_answer = codecs.decode(response_answer, "unicode_escape") @@ -1152,7 +1176,8 @@ def from_repo(cls, repo_name: str, *, tmp_dir: str | None = None, commit: str | # Parse repo name if "/" not in repo_name: - raise ValueError("repo_name must be in format 'owner/repo'") + msg = "repo_name must be in format 'owner/repo'" + raise ValueError(msg) owner, repo = repo_name.split("/") # Setup temp directory @@ -1187,7 +1212,7 @@ def from_repo(cls, repo_name: str, *, tmp_dir: str | None = None, commit: str | logger.info("Codebase initialization complete") return codebase except Exception as e: - logger.error(f"Failed to initialize codebase: {e}") + logger.exception(f"Failed to initialize codebase: {e}") raise diff --git a/src/codegen/sdk/core/detached_symbols/argument.py b/src/codegen/sdk/core/detached_symbols/argument.py index c9c2fd963..beacbc4bf 100644 --- a/src/codegen/sdk/core/detached_symbols/argument.py +++ b/src/codegen/sdk/core/detached_symbols/argument.py @@ -2,24 +2,24 @@ from typing import TYPE_CHECKING, Generic, TypeVar, override -from tree_sitter import Node as TSNode - from codegen.sdk.core.autocommit import reader, writer -from codegen.sdk.core.dataclasses.usage import UsageKind -from codegen.sdk.core.detached_symbols.parameter import Parameter from codegen.sdk.core.expressions import Expression from codegen.sdk.core.expressions.multi_expression import MultiExpression from codegen.sdk.core.expressions.name import Name from codegen.sdk.core.interfaces.has_name import HasName from codegen.sdk.core.interfaces.has_value import HasValue -from codegen.sdk.core.interfaces.importable import Importable -from codegen.sdk.core.node_id_factory import NodeId from codegen.sdk.extensions.autocommit import commiter from codegen.shared.decorators.docs import apidoc, noapidoc if TYPE_CHECKING: + from tree_sitter import Node as TSNode + from codegen.sdk.codebase.codebase_graph import CodebaseGraph + from codegen.sdk.core.dataclasses.usage import UsageKind from codegen.sdk.core.detached_symbols.function_call import FunctionCall + from codegen.sdk.core.detached_symbols.parameter import Parameter + from codegen.sdk.core.interfaces.importable import Importable + from codegen.sdk.core.node_id_factory import NodeId Parent = TypeVar("Parent", bound="FunctionCall") @@ -115,7 +115,8 @@ def add_keyword(self, keyword: str) -> None: ValueError: If the argument is already a named argument. """ if self.is_named: - raise ValueError(f"Argument {self.source} already has a keyword argument at file {self.file_node_id}") + msg = f"Argument {self.source} already has a keyword argument at file {self.file_node_id}" + raise ValueError(msg) self.insert_before(f"{keyword}=", newline=False) diff --git a/src/codegen/sdk/core/detached_symbols/code_block.py b/src/codegen/sdk/core/detached_symbols/code_block.py index e9d7e5714..dff0144ab 100644 --- a/src/codegen/sdk/core/detached_symbols/code_block.py +++ b/src/codegen/sdk/core/detached_symbols/code_block.py @@ -2,35 +2,37 @@ from abc import abstractmethod from collections import deque -from collections.abc import Generator from typing import TYPE_CHECKING, Generic, Self, TypeVar, override -from tree_sitter import Node as TSNode from typing_extensions import deprecated -from codegen.sdk.core.assignment import Assignment from codegen.sdk.core.autocommit import reader, writer from codegen.sdk.core.dataclasses.usage import UsageKind, UsageType -from codegen.sdk.core.detached_symbols.function_call import FunctionCall from codegen.sdk.core.expressions import Expression, Value -from codegen.sdk.core.interfaces.editable import Editable -from codegen.sdk.core.interfaces.has_name import HasName -from codegen.sdk.core.interfaces.importable import Importable -from codegen.sdk.core.statements.assignment_statement import AssignmentStatement -from codegen.sdk.core.statements.attribute import Attribute -from codegen.sdk.core.statements.return_statement import ReturnStatement from codegen.sdk.core.statements.statement import Statement, StatementType -from codegen.sdk.core.statements.symbol_statement import SymbolStatement -from codegen.sdk.core.symbol_groups.multi_line_collection import MultiLineCollection from codegen.sdk.extensions.sort import sort_editables from codegen.sdk.extensions.utils import find_line_start_and_end_nodes -from codegen.sdk.output.ast import AST from codegen.shared.decorators.docs import apidoc, noapidoc if TYPE_CHECKING: + from collections.abc import Generator + + from tree_sitter import Node as TSNode + + from codegen.sdk.core.assignment import Assignment + from codegen.sdk.core.detached_symbols.function_call import FunctionCall + from codegen.sdk.core.interfaces.editable import Editable from codegen.sdk.core.interfaces.has_block import HasBlock + from codegen.sdk.core.interfaces.has_name import HasName + from codegen.sdk.core.interfaces.importable import Importable + from codegen.sdk.core.statements.assignment_statement import AssignmentStatement + from codegen.sdk.core.statements.attribute import Attribute from codegen.sdk.core.statements.comment import Comment from codegen.sdk.core.statements.if_block_statement import IfBlockStatement + from codegen.sdk.core.statements.return_statement import ReturnStatement + from codegen.sdk.core.statements.symbol_statement import SymbolStatement + from codegen.sdk.core.symbol_groups.multi_line_collection import MultiLineCollection + from codegen.sdk.output.ast import AST Parent = TypeVar("Parent", bound="HasBlock") diff --git a/src/codegen/sdk/core/detached_symbols/decorator.py b/src/codegen/sdk/core/detached_symbols/decorator.py index 214784ac9..8371ad98a 100644 --- a/src/codegen/sdk/core/detached_symbols/decorator.py +++ b/src/codegen/sdk/core/detached_symbols/decorator.py @@ -3,18 +3,18 @@ from abc import abstractmethod from typing import TYPE_CHECKING, Generic, TypeVar -from tree_sitter import Node as TSNode - from codegen.sdk.core.autocommit import reader from codegen.sdk.core.dataclasses.usage import UsageKind -from codegen.sdk.core.detached_symbols.function_call import FunctionCall from codegen.sdk.core.expressions import Expression from codegen.sdk.core.expressions.name import Name from codegen.sdk.core.interfaces.has_name import HasName from codegen.shared.decorators.docs import apidoc, noapidoc if TYPE_CHECKING: + from tree_sitter import Node as TSNode + from codegen.sdk.core.class_definition import Class + from codegen.sdk.core.detached_symbols.function_call import FunctionCall from codegen.sdk.core.detached_symbols.parameter import Parameter from codegen.sdk.core.function import Function diff --git a/src/codegen/sdk/core/detached_symbols/function_call.py b/src/codegen/sdk/core/detached_symbols/function_call.py index 5a50a8fcc..7699343e9 100644 --- a/src/codegen/sdk/core/detached_symbols/function_call.py +++ b/src/codegen/sdk/core/detached_symbols/function_call.py @@ -1,24 +1,17 @@ from __future__ import annotations -from collections.abc import Generator from typing import TYPE_CHECKING, Generic, Self, TypeVar, override -from tree_sitter import Node as TSNode - from codegen.sdk.codebase.resolution_stack import ResolutionStack from codegen.sdk.core.autocommit import reader, remover, writer from codegen.sdk.core.dataclasses.usage import UsageKind from codegen.sdk.core.detached_symbols.argument import Argument -from codegen.sdk.core.detached_symbols.parameter import Parameter from codegen.sdk.core.expressions import Expression, Name, Value from codegen.sdk.core.expressions.chained_attribute import ChainedAttribute from codegen.sdk.core.expressions.generic_type import GenericType from codegen.sdk.core.expressions.unpack import Unpack -from codegen.sdk.core.interfaces.editable import Editable from codegen.sdk.core.interfaces.has_name import HasName -from codegen.sdk.core.interfaces.importable import Importable from codegen.sdk.core.interfaces.resolvable import Resolvable -from codegen.sdk.core.node_id_factory import NodeId from codegen.sdk.core.symbol_groups.collection import Collection from codegen.sdk.enums import NodeType, ProgrammingLanguage from codegen.sdk.extensions.sort import sort_editables @@ -28,9 +21,17 @@ from codegen.shared.decorators.docs import apidoc, noapidoc if TYPE_CHECKING: + from collections.abc import Generator + + from tree_sitter import Node as TSNode + from codegen.sdk.codebase.codebase_graph import CodebaseGraph + from codegen.sdk.core.detached_symbols.parameter import Parameter from codegen.sdk.core.function import Function from codegen.sdk.core.interfaces.callable import Callable + from codegen.sdk.core.interfaces.editable import Editable + from codegen.sdk.core.interfaces.importable import Importable + from codegen.sdk.core.node_id_factory import NodeId from codegen.visualizations.enums import VizNode Parent = TypeVar("Parent", bound="Expression | None") @@ -56,7 +57,8 @@ def __init__(self, node: TSNode, file_node_id: NodeId, G: CodebaseGraph, parent: # =====[ Grab the arg list ]===== arg_list_node = node.child_by_field_name("arguments") if arg_list_node is None: - raise ValueError(f"Failed to parse function call. Child 'argument_list' node does not exist. Source: {self.source}") + msg = f"Failed to parse function call. Child 'argument_list' node does not exist. Source: {self.source}" + raise ValueError(msg) args = [Argument(x, i, self) for i, x in enumerate(arg_list_node.named_children) if x.type != "comment"] self._arg_list = Collection(arg_list_node, self.file_node_id, self.G, self, children=args) diff --git a/src/codegen/sdk/core/detached_symbols/parameter.py b/src/codegen/sdk/core/detached_symbols/parameter.py index df638af2b..e07192220 100644 --- a/src/codegen/sdk/core/detached_symbols/parameter.py +++ b/src/codegen/sdk/core/detached_symbols/parameter.py @@ -1,31 +1,33 @@ from __future__ import annotations from abc import abstractmethod -from collections.abc import Generator from typing import TYPE_CHECKING, Generic, Self, TypeVar, override -from tree_sitter import Node as TSNode from typing_extensions import deprecated -from codegen.sdk.codebase.resolution_stack import ResolutionStack from codegen.sdk.core.autocommit import reader, writer from codegen.sdk.core.dataclasses.usage import UsageType from codegen.sdk.core.expressions import Expression from codegen.sdk.core.expressions.name import Name -from codegen.sdk.core.interfaces.has_name import HasName from codegen.sdk.core.interfaces.has_value import HasValue -from codegen.sdk.core.interfaces.importable import Importable from codegen.sdk.core.interfaces.typeable import Typeable from codegen.sdk.core.interfaces.usable import Usable -from codegen.sdk.core.symbol_groups.collection import Collection from codegen.sdk.extensions.autocommit import commiter from codegen.sdk.extensions.resolution import UsageKind from codegen.sdk.utils import find_first_descendant from codegen.shared.decorators.docs import apidoc, noapidoc if TYPE_CHECKING: + from collections.abc import Generator + + from tree_sitter import Node as TSNode + + from codegen.sdk.codebase.resolution_stack import ResolutionStack from codegen.sdk.core.expressions.type import Type from codegen.sdk.core.function import Function + from codegen.sdk.core.interfaces.has_name import HasName + from codegen.sdk.core.interfaces.importable import Importable + from codegen.sdk.core.symbol_groups.collection import Collection import logging @@ -125,7 +127,8 @@ def is_optional(self) -> bool: Returns: bool: True if the parameter is optional, False otherwise """ - raise NotImplementedError("Subclasses must implement this method") + msg = "Subclasses must implement this method" + raise NotImplementedError(msg) @property @abstractmethod @@ -138,7 +141,8 @@ def is_variadic(self) -> bool: bool: True if the parameter is variadic (can accept variable number of arguments), False otherwise. """ - raise NotImplementedError("Subclasses must implement this method") + msg = "Subclasses must implement this method" + raise NotImplementedError(msg) @writer def remove(self, delete_formatting: bool = True, priority: int = 0, dedupe: bool = True) -> None: diff --git a/src/codegen/sdk/core/directory.py b/src/codegen/sdk/core/directory.py index e2097bc21..0254b6af8 100644 --- a/src/codegen/sdk/core/directory.py +++ b/src/codegen/sdk/core/directory.py @@ -73,7 +73,8 @@ def __setitem__(self, item_name: str, item: TFile | Self) -> None: def __delitem__(self, item_name: str) -> None: del self.items[item_name] - raise KeyError(f"Item {item_name} not found in directory {self.dirpath}") + msg = f"Item {item_name} not found in directory {self.dirpath}" + raise KeyError(msg) def __repr__(self) -> str: return f"Directory({self.dirpath}, {self.items.keys()})" diff --git a/src/codegen/sdk/core/export.py b/src/codegen/sdk/core/export.py index 097b71aae..4a9eeb1c4 100644 --- a/src/codegen/sdk/core/export.py +++ b/src/codegen/sdk/core/export.py @@ -3,17 +3,17 @@ from abc import abstractmethod from typing import TYPE_CHECKING, Generic, Self, TypeVar -from tree_sitter import Node as TSNode - -from codegen.sdk.codebase.codebase_graph import CodebaseGraph from codegen.sdk.core.interfaces.exportable import Exportable -from codegen.sdk.core.node_id_factory import NodeId -from codegen.sdk.core.symbol_groups.collection import Collection from codegen.sdk.extensions.autocommit import commiter from codegen.shared.decorators.docs import apidoc, noapidoc if TYPE_CHECKING: + from tree_sitter import Node as TSNode + + from codegen.sdk.codebase.codebase_graph import CodebaseGraph + from codegen.sdk.core.node_id_factory import NodeId from codegen.sdk.core.statements.export_statement import ExportStatement + from codegen.sdk.core.symbol_groups.collection import Collection Parent = TypeVar("Parent", bound="Collection[Export, ExportStatement]") diff --git a/src/codegen/sdk/core/expressions/__init__.py b/src/codegen/sdk/core/expressions/__init__.py index b2add957e..28664353e 100644 --- a/src/codegen/sdk/core/expressions/__init__.py +++ b/src/codegen/sdk/core/expressions/__init__.py @@ -9,5 +9,6 @@ from codegen.sdk.core.symbol_groups.list import List if TYPE_CHECKING: - from codegen.sdk.core.detached_symbols.function_call import FunctionCall + from codegen.sdk.core.detached_symbols.function_call import FunctionCall # noqa: TC004 + __all__ = ["Dict", "Expression", "FunctionCall", "List", "Name", "String", "Type", "Value"] diff --git a/src/codegen/sdk/core/expressions/await_expression.py b/src/codegen/sdk/core/expressions/await_expression.py index a10139ca0..15e2a9083 100644 --- a/src/codegen/sdk/core/expressions/await_expression.py +++ b/src/codegen/sdk/core/expressions/await_expression.py @@ -1,13 +1,15 @@ -from typing import Generic, TypeVar +from typing import TYPE_CHECKING, Generic, TypeVar from codegen.sdk.core.detached_symbols.function_call import FunctionCall from codegen.sdk.core.expressions import Expression -from codegen.sdk.core.interfaces.editable import Editable from codegen.sdk.core.interfaces.has_value import HasValue from codegen.sdk.core.interfaces.wrapper_expression import IWrapper from codegen.sdk.extensions.autocommit import reader from codegen.shared.decorators.docs import apidoc +if TYPE_CHECKING: + from codegen.sdk.core.interfaces.editable import Editable + Parent = TypeVar("Parent", bound="Editable") diff --git a/src/codegen/sdk/core/expressions/chained_attribute.py b/src/codegen/sdk/core/expressions/chained_attribute.py index 673d50b22..aec915dcd 100644 --- a/src/codegen/sdk/core/expressions/chained_attribute.py +++ b/src/codegen/sdk/core/expressions/chained_attribute.py @@ -39,11 +39,13 @@ def __init__(self, ts_node, file_node_id, G, parent: Parent, object: TSNode, att self._object = self._parse_expression(object, default=Name) if self.G.parser._should_log: if not isinstance(self._object, Chainable): - raise ValueError(f"{self._object.__class__} is not chainable: {self._object.source}\nfile: {self.filepath}") + msg = f"{self._object.__class__} is not chainable: {self._object.source}\nfile: {self.filepath}" + raise ValueError(msg) self._attribute = self._parse_expression(attribute, default=Name) if self.G.parser._should_log: if not isinstance(self._attribute, Resolvable): - raise ValueError(f"{self._attribute.__class__} is not resolvable: {self._attribute.source}\nfile: {self.filepath}") + msg = f"{self._attribute.__class__} is not resolvable: {self._attribute.source}\nfile: {self.filepath}" + raise ValueError(msg) @property @reader diff --git a/src/codegen/sdk/core/expressions/generic_type.py b/src/codegen/sdk/core/expressions/generic_type.py index 9fa8458a7..34f0d56f8 100644 --- a/src/codegen/sdk/core/expressions/generic_type.py +++ b/src/codegen/sdk/core/expressions/generic_type.py @@ -7,8 +7,6 @@ from codegen.sdk.core.autocommit import commiter, reader from codegen.sdk.core.dataclasses.usage import UsageKind from codegen.sdk.core.expressions.named_type import NamedType -from codegen.sdk.core.expressions.type import Type -from codegen.sdk.core.interfaces.editable import Editable from codegen.sdk.core.interfaces.importable import Importable from codegen.sdk.core.node_id_factory import NodeId from codegen.sdk.core.symbol_groups.collection import Collection @@ -17,7 +15,8 @@ if TYPE_CHECKING: from codegen.sdk.codebase.codebase_graph import CodebaseGraph - from codegen.sdk.core.interfaces.importable import Importable + from codegen.sdk.core.expressions.type import Type + from codegen.sdk.core.interfaces.editable import Editable Parent = TypeVar("Parent") diff --git a/src/codegen/sdk/core/expressions/multi_expression.py b/src/codegen/sdk/core/expressions/multi_expression.py index 111c698a5..fb65ffa94 100644 --- a/src/codegen/sdk/core/expressions/multi_expression.py +++ b/src/codegen/sdk/core/expressions/multi_expression.py @@ -2,17 +2,17 @@ from typing import TYPE_CHECKING, Generic, TypeVar, override -from tree_sitter import Node as TSNode - -from codegen.sdk.core.dataclasses.usage import UsageKind from codegen.sdk.core.expressions import Expression -from codegen.sdk.core.interfaces.has_name import HasName -from codegen.sdk.core.node_id_factory import NodeId from codegen.sdk.extensions.autocommit import commiter from codegen.shared.decorators.docs import apidoc, noapidoc if TYPE_CHECKING: + from tree_sitter import Node as TSNode + from codegen.sdk.codebase.codebase_graph import CodebaseGraph + from codegen.sdk.core.dataclasses.usage import UsageKind + from codegen.sdk.core.interfaces.has_name import HasName + from codegen.sdk.core.node_id_factory import NodeId Parent = TypeVar("Parent", bound="Expression") diff --git a/src/codegen/sdk/core/expressions/named_type.py b/src/codegen/sdk/core/expressions/named_type.py index 5273ab2ce..7628a1291 100644 --- a/src/codegen/sdk/core/expressions/named_type.py +++ b/src/codegen/sdk/core/expressions/named_type.py @@ -9,7 +9,6 @@ from codegen.sdk.core.dataclasses.usage import UsageKind from codegen.sdk.core.expressions import Name, String from codegen.sdk.core.expressions.type import Type -from codegen.sdk.core.interfaces.editable import Editable from codegen.sdk.core.interfaces.has_name import HasName from codegen.sdk.core.interfaces.importable import Importable from codegen.sdk.core.interfaces.resolvable import Resolvable @@ -18,6 +17,7 @@ if TYPE_CHECKING: from codegen.sdk.codebase.codebase_graph import CodebaseGraph + from codegen.sdk.core.interfaces.editable import Editable Parent = TypeVar("Parent", bound="Editable") diff --git a/src/codegen/sdk/core/expressions/none_type.py b/src/codegen/sdk/core/expressions/none_type.py index 5e305cc3c..8a5956090 100644 --- a/src/codegen/sdk/core/expressions/none_type.py +++ b/src/codegen/sdk/core/expressions/none_type.py @@ -1,14 +1,16 @@ from collections.abc import Generator -from typing import Generic, Self, TypeVar, override +from typing import TYPE_CHECKING, Generic, Self, TypeVar, override from codegen.sdk.codebase.resolution_stack import ResolutionStack from codegen.sdk.core.dataclasses.usage import UsageKind from codegen.sdk.core.expressions.type import Type -from codegen.sdk.core.interfaces.editable import Editable from codegen.sdk.core.interfaces.importable import Importable from codegen.sdk.extensions.autocommit import reader from codegen.shared.decorators.docs import apidoc, noapidoc +if TYPE_CHECKING: + from codegen.sdk.core.interfaces.editable import Editable + Parent = TypeVar("Parent", bound="Editable") diff --git a/src/codegen/sdk/core/expressions/placeholder_type.py b/src/codegen/sdk/core/expressions/placeholder_type.py index 7db5492d1..5ce966f21 100644 --- a/src/codegen/sdk/core/expressions/placeholder_type.py +++ b/src/codegen/sdk/core/expressions/placeholder_type.py @@ -1,15 +1,17 @@ from collections.abc import Generator -from typing import Generic, Self, TypeVar, override +from typing import TYPE_CHECKING, Generic, Self, TypeVar, override from codegen.sdk.codebase.resolution_stack import ResolutionStack from codegen.sdk.core.autocommit import commiter from codegen.sdk.core.dataclasses.usage import UsageKind from codegen.sdk.core.expressions.type import Type -from codegen.sdk.core.interfaces.editable import Editable from codegen.sdk.core.interfaces.importable import Importable from codegen.sdk.extensions.autocommit import reader from codegen.shared.decorators.docs import apidoc, noapidoc +if TYPE_CHECKING: + from codegen.sdk.core.interfaces.editable import Editable + TType = TypeVar("TType", bound="Type") Parent = TypeVar("Parent", bound="Editable") diff --git a/src/codegen/sdk/core/expressions/subscript_expression.py b/src/codegen/sdk/core/expressions/subscript_expression.py index 260d59128..5de07b529 100644 --- a/src/codegen/sdk/core/expressions/subscript_expression.py +++ b/src/codegen/sdk/core/expressions/subscript_expression.py @@ -6,12 +6,12 @@ from codegen.sdk.core.dataclasses.usage import UsageKind from codegen.sdk.core.expressions import Name from codegen.sdk.core.expressions.expression import Expression -from codegen.sdk.core.interfaces.chainable import Chainable from codegen.sdk.core.interfaces.resolvable import Resolvable from codegen.sdk.extensions.autocommit import commiter from codegen.shared.decorators.docs import apidoc, noapidoc if TYPE_CHECKING: + from codegen.sdk.core.interfaces.chainable import Chainable from codegen.sdk.core.interfaces.has_name import HasName diff --git a/src/codegen/sdk/core/expressions/tuple_type.py b/src/codegen/sdk/core/expressions/tuple_type.py index 64d26d8d0..315c9ed09 100644 --- a/src/codegen/sdk/core/expressions/tuple_type.py +++ b/src/codegen/sdk/core/expressions/tuple_type.py @@ -5,7 +5,6 @@ from codegen.sdk.codebase.resolution_stack import ResolutionStack from codegen.sdk.core.expressions.type import Type -from codegen.sdk.core.interfaces.editable import Editable from codegen.sdk.core.node_id_factory import NodeId from codegen.sdk.core.symbol_groups.collection import Collection from codegen.sdk.extensions.autocommit import reader @@ -13,6 +12,7 @@ if TYPE_CHECKING: from codegen.sdk.codebase.codebase_graph import CodebaseGraph + from codegen.sdk.core.interfaces.editable import Editable from codegen.sdk.core.interfaces.importable import Importable diff --git a/src/codegen/sdk/core/expressions/type.py b/src/codegen/sdk/core/expressions/type.py index be4aa349c..2630427d4 100644 --- a/src/codegen/sdk/core/expressions/type.py +++ b/src/codegen/sdk/core/expressions/type.py @@ -7,11 +7,11 @@ from codegen.sdk.core.dataclasses.usage import UsageKind from codegen.sdk.core.expressions.expression import Expression from codegen.sdk.core.interfaces.chainable import Chainable -from codegen.sdk.core.interfaces.editable import Editable from codegen.sdk.extensions.autocommit import reader from codegen.shared.decorators.docs import apidoc, noapidoc if TYPE_CHECKING: + from codegen.sdk.core.interfaces.editable import Editable from codegen.sdk.core.interfaces.importable import Importable from codegen.sdk.core.symbol import Symbol diff --git a/src/codegen/sdk/core/expressions/union_type.py b/src/codegen/sdk/core/expressions/union_type.py index 48bb401c3..877a6ef9d 100644 --- a/src/codegen/sdk/core/expressions/union_type.py +++ b/src/codegen/sdk/core/expressions/union_type.py @@ -5,7 +5,6 @@ from codegen.sdk.codebase.resolution_stack import ResolutionStack from codegen.sdk.core.expressions.type import Type -from codegen.sdk.core.interfaces.editable import Editable from codegen.sdk.core.node_id_factory import NodeId from codegen.sdk.core.symbol_groups.collection import Collection from codegen.sdk.extensions.autocommit import reader @@ -13,6 +12,7 @@ if TYPE_CHECKING: from codegen.sdk.codebase.codebase_graph import CodebaseGraph + from codegen.sdk.core.interfaces.editable import Editable from codegen.sdk.core.interfaces.importable import Importable diff --git a/src/codegen/sdk/core/expressions/unpack.py b/src/codegen/sdk/core/expressions/unpack.py index 8eb1c8a37..6a2c8b814 100644 --- a/src/codegen/sdk/core/expressions/unpack.py +++ b/src/codegen/sdk/core/expressions/unpack.py @@ -1,12 +1,14 @@ -from typing import Generic, TypeVar +from typing import TYPE_CHECKING, Generic, TypeVar from codegen.sdk.core.expressions import Expression -from codegen.sdk.core.interfaces.editable import Editable from codegen.sdk.core.interfaces.has_value import HasValue from codegen.sdk.core.interfaces.unwrappable import Unwrappable from codegen.sdk.core.interfaces.wrapper_expression import IWrapper from codegen.shared.decorators.docs import apidoc +if TYPE_CHECKING: + from codegen.sdk.core.interfaces.editable import Editable + Parent = TypeVar("Parent", bound="Editable") diff --git a/src/codegen/sdk/core/expressions/value.py b/src/codegen/sdk/core/expressions/value.py index c25855b93..b6116dd7e 100644 --- a/src/codegen/sdk/core/expressions/value.py +++ b/src/codegen/sdk/core/expressions/value.py @@ -1,14 +1,16 @@ from __future__ import annotations -from typing import Generic, TypeVar +from typing import TYPE_CHECKING, Generic, TypeVar -from codegen.sdk.core.dataclasses.usage import UsageKind from codegen.sdk.core.expressions.expression import Expression -from codegen.sdk.core.interfaces.editable import Editable -from codegen.sdk.core.interfaces.has_name import HasName from codegen.sdk.extensions.autocommit import commiter from codegen.shared.decorators.docs import apidoc, noapidoc +if TYPE_CHECKING: + from codegen.sdk.core.dataclasses.usage import UsageKind + from codegen.sdk.core.interfaces.editable import Editable + from codegen.sdk.core.interfaces.has_name import HasName + Parent = TypeVar("Parent", bound="Editable") diff --git a/src/codegen/sdk/core/external_module.py b/src/codegen/sdk/core/external_module.py index c3cbe6288..9a61b297f 100644 --- a/src/codegen/sdk/core/external_module.py +++ b/src/codegen/sdk/core/external_module.py @@ -2,24 +2,24 @@ from typing import TYPE_CHECKING, Literal, override -from tree_sitter import Node as TSNode - -from codegen.sdk.codebase.codebase_graph import CodebaseGraph from codegen.sdk.core.autocommit import commiter, reader -from codegen.sdk.core.dataclasses.usage import UsageKind -from codegen.sdk.core.expressions.name import Name from codegen.sdk.core.interfaces.callable import Callable from codegen.sdk.core.interfaces.has_attribute import HasAttribute -from codegen.sdk.core.interfaces.has_name import HasName -from codegen.sdk.core.node_id_factory import NodeId from codegen.sdk.core.placeholder.placeholder_stub import StubPlaceholder from codegen.sdk.enums import ImportType, NodeType from codegen.shared.decorators.docs import apidoc, noapidoc from codegen.visualizations.enums import VizNode if TYPE_CHECKING: + from tree_sitter import Node as TSNode + + from codegen.sdk.codebase.codebase_graph import CodebaseGraph + from codegen.sdk.core.dataclasses.usage import UsageKind from codegen.sdk.core.detached_symbols.parameter import Parameter + from codegen.sdk.core.expressions.name import Name from codegen.sdk.core.import_resolution import Import + from codegen.sdk.core.interfaces.has_name import HasName + from codegen.sdk.core.node_id_factory import NodeId @apidoc @@ -51,7 +51,8 @@ def _idx_key(self) -> str: @noapidoc @commiter def parse(self, G: CodebaseGraph) -> None: - raise NotImplementedError(f"{type(self)} is not part of the graph at the moment") + msg = f"{type(self)} is not part of the graph at the moment" + raise NotImplementedError(msg) @classmethod def from_import(cls, imp: Import) -> ExternalModule: @@ -83,7 +84,8 @@ def parameters(self) -> list[Parameter]: NotImplementedError: This functionality is not yet supported for external modules. """ # TODO: figure out how to get parameters from this module - raise NotImplementedError("Parsing parameters from an external module is not yet supported.") + msg = "Parsing parameters from an external module is not yet supported." + raise NotImplementedError(msg) @reader def get_import_string(self, alias: str | None = None, module: str | None = None, import_type: ImportType = ImportType.UNKNOWN, is_type_import: bool = False) -> str: diff --git a/src/codegen/sdk/core/file.py b/src/codegen/sdk/core/file.py index d22cd227d..259bd9961 100644 --- a/src/codegen/sdk/core/file.py +++ b/src/codegen/sdk/core/file.py @@ -8,7 +8,7 @@ from functools import cached_property from os import PathLike from pathlib import Path -from typing import Generic, Literal, Self, TypeVar, override +from typing import TYPE_CHECKING, Generic, Literal, Self, TypeVar, override from tree_sitter import Node as TSNode @@ -16,15 +16,11 @@ from codegen.sdk.codebase.codebase_graph import CodebaseGraph from codegen.sdk.codebase.range_index import RangeIndex from codegen.sdk.codebase.span import Range -from codegen.sdk.core.assignment import Assignment from codegen.sdk.core.autocommit import commiter, mover, reader, remover, writer from codegen.sdk.core.class_definition import Class from codegen.sdk.core.dataclasses.usage import UsageType -from codegen.sdk.core.detached_symbols.code_block import CodeBlock from codegen.sdk.core.directory import Directory -from codegen.sdk.core.function import Function from codegen.sdk.core.import_resolution import Import, WildcardImport -from codegen.sdk.core.interface import Interface from codegen.sdk.core.interfaces.editable import Editable from codegen.sdk.core.interfaces.has_attribute import HasAttribute from codegen.sdk.core.interfaces.has_block import HasBlock @@ -40,6 +36,12 @@ from codegen.shared.decorators.docs import apidoc, noapidoc from codegen.visualizations.enums import VizNode +if TYPE_CHECKING: + from codegen.sdk.core.assignment import Assignment + from codegen.sdk.core.detached_symbols.code_block import CodeBlock + from codegen.sdk.core.function import Function + from codegen.sdk.core.interface import Interface + logger = logging.getLogger(__name__) @@ -147,7 +149,8 @@ def content(self) -> str: ValueError: If the file is binary. Use content_bytes instead for binary files. """ if self._binary: - raise ValueError("Cannot read binary file as string. Use content_bytes instead.") + msg = "Cannot read binary file as string. Use content_bytes instead." + raise ValueError(msg) return self.content_bytes.decode(encoding="utf-8") @@ -378,10 +381,10 @@ def __init__(self, ts_node: TSNode, filepath: PathLike, G: CodebaseGraph) -> Non try: self.parse(G) except RecursionError as e: - logger.error(f"RecursionError parsing file {filepath}: {e} at depth {sys.getrecursionlimit()} and {resource.getrlimit(resource.RLIMIT_STACK)}") + logger.exception(f"RecursionError parsing file {filepath}: {e} at depth {sys.getrecursionlimit()} and {resource.getrlimit(resource.RLIMIT_STACK)}") raise e except Exception as e: - logger.error(f"Failed to parse file {filepath}: {e}") + logger.exception(f"Failed to parse file {filepath}: {e}") raise e @property @@ -536,7 +539,8 @@ def create_from_filepath(cls, filepath: str, G: CodebaseGraph) -> Self | None: Graph-safe. """ if filepath in G.filepath_idx: - raise ValueError(f"File already exists in graph: {filepath}") + msg = f"File already exists in graph: {filepath}" + raise ValueError(msg) ts_node = parse_file(filepath, "") if ts_node.has_error: @@ -978,7 +982,8 @@ def add_symbol(self, symbol: Symbol, should_export: bool = True) -> Symbol | Non if existing_symbol is not None: return existing_symbol if not self.symbol_can_be_added(symbol): - raise ValueError(f"Symbol {symbol.name} cannot be added to this file type.") + msg = f"Symbol {symbol.name} cannot be added to this file type." + raise ValueError(msg) source = symbol.source if isinstance(symbol, TSFunction) and symbol.is_arrow: diff --git a/src/codegen/sdk/core/function.py b/src/codegen/sdk/core/function.py index 349b4d705..d40cd1fa4 100644 --- a/src/codegen/sdk/core/function.py +++ b/src/codegen/sdk/core/function.py @@ -1,24 +1,15 @@ from __future__ import annotations from abc import abstractmethod -from collections.abc import Generator from typing import TYPE_CHECKING, Generic, Self, TypeVar, override from codegen.sdk.codebase.resolution_stack import ResolutionStack from codegen.sdk.core.autocommit import reader, writer -from codegen.sdk.core.detached_symbols.code_block import CodeBlock -from codegen.sdk.core.detached_symbols.decorator import Decorator -from codegen.sdk.core.detached_symbols.function_call import FunctionCall -from codegen.sdk.core.detached_symbols.parameter import Parameter -from codegen.sdk.core.import_resolution import Import, WildcardImport from codegen.sdk.core.interfaces.callable import Callable from codegen.sdk.core.interfaces.chainable import Chainable from codegen.sdk.core.interfaces.has_block import HasBlock -from codegen.sdk.core.interfaces.importable import Importable from codegen.sdk.core.interfaces.supports_generic import SupportsGenerics -from codegen.sdk.core.statements.return_statement import ReturnStatement from codegen.sdk.core.statements.statement import StatementType -from codegen.sdk.core.symbol import Symbol from codegen.sdk.enums import SymbolType from codegen.sdk.extensions.sort import sort_editables from codegen.sdk.extensions.utils import cached_property @@ -26,9 +17,19 @@ from codegen.visualizations.enums import VizNode if TYPE_CHECKING: + from collections.abc import Generator, Sequence + + from codegen.sdk.core.detached_symbols.code_block import CodeBlock + from codegen.sdk.core.detached_symbols.decorator import Decorator + from codegen.sdk.core.detached_symbols.function_call import FunctionCall + from codegen.sdk.core.detached_symbols.parameter import Parameter from codegen.sdk.core.export import Export from codegen.sdk.core.expressions.type import Type from codegen.sdk.core.file import File + from codegen.sdk.core.import_resolution import Import, WildcardImport + from codegen.sdk.core.interfaces.importable import Importable + from codegen.sdk.core.statements.return_statement import ReturnStatement + from codegen.sdk.core.symbol import Symbol TFunction = TypeVar("TFunction", bound="Function") @@ -301,7 +302,8 @@ def insert_statements(self, lines: str, index: int = 0) -> None: statements = self.code_block.statements if index >= len(statements): - raise ValueError(f"Index {index} out of range for function {self.name}") + msg = f"Index {index} out of range for function {self.name}" + raise ValueError(msg) first_statement = self.code_block.statements[index] first_statement.insert_before(lines) @@ -394,11 +396,12 @@ def inferred_return_type(self) -> str | None: if self.G.language_engine: return self.G.language_engine.get_return_type(self) else: - raise NotImplementedError("Language engine not enabled for this repo or language.") + msg = "Language engine not enabled for this repo or language." + raise NotImplementedError(msg) @property @noapidoc - def descendant_symbols(self) -> list[Importable]: + def descendant_symbols(self) -> Sequence[Importable]: symbols = [self] for param in self.parameters: symbols.extend(param.descendant_symbols) diff --git a/src/codegen/sdk/core/import_resolution.py b/src/codegen/sdk/core/import_resolution.py index a4b9999b5..432ec2ab5 100644 --- a/src/codegen/sdk/core/import_resolution.py +++ b/src/codegen/sdk/core/import_resolution.py @@ -1,14 +1,9 @@ from __future__ import annotations from abc import abstractmethod -from collections.abc import Generator from dataclasses import dataclass from typing import TYPE_CHECKING, Generic, Literal, Self, TypeVar, override -import rich.repr -from tree_sitter import Node as TSNode - -from codegen.sdk.codebase.codebase_graph import CodebaseGraph from codegen.sdk.codebase.resolution_stack import ResolutionStack from codegen.sdk.codebase.transactions import TransactionPriority from codegen.sdk.core.autocommit import commiter, reader, remover, writer @@ -16,12 +11,7 @@ from codegen.sdk.core.expressions.name import Name from codegen.sdk.core.external_module import ExternalModule from codegen.sdk.core.interfaces.chainable import Chainable -from codegen.sdk.core.interfaces.editable import Editable -from codegen.sdk.core.interfaces.exportable import Exportable -from codegen.sdk.core.interfaces.has_name import HasName -from codegen.sdk.core.interfaces.importable import Importable from codegen.sdk.core.interfaces.usable import Usable -from codegen.sdk.core.node_id_factory import NodeId from codegen.sdk.core.statements.import_statement import ImportStatement from codegen.sdk.enums import EdgeType, ImportType, NodeType from codegen.sdk.extensions.utils import cached_property @@ -30,7 +20,18 @@ from codegen.visualizations.enums import VizNode if TYPE_CHECKING: + from collections.abc import Generator + + import rich.repr + from tree_sitter import Node as TSNode + + from codegen.sdk.codebase.codebase_graph import CodebaseGraph from codegen.sdk.core.file import SourceFile + from codegen.sdk.core.interfaces.editable import Editable + from codegen.sdk.core.interfaces.exportable import Exportable + from codegen.sdk.core.interfaces.has_name import HasName + from codegen.sdk.core.interfaces.importable import Importable + from codegen.sdk.core.node_id_factory import NodeId from codegen.sdk.core.symbol import Symbol @@ -538,7 +539,8 @@ def import_specifier(self) -> Editable: Raises: ValueError: If the subclass does not implement this property. """ - raise ValueError("Subclass must implement `import_specifier`") + msg = "Subclass must implement `import_specifier`" + raise ValueError(msg) @reader def is_reexport(self) -> bool: diff --git a/src/codegen/sdk/core/interface.py b/src/codegen/sdk/core/interface.py index 0d6718f9d..dcc7964d4 100644 --- a/src/codegen/sdk/core/interface.py +++ b/src/codegen/sdk/core/interface.py @@ -4,20 +4,20 @@ from codegen.sdk._proxy import proxy_property from codegen.sdk.core.autocommit import reader -from codegen.sdk.core.detached_symbols.code_block import CodeBlock -from codegen.sdk.core.expressions.type import Type -from codegen.sdk.core.function import Function from codegen.sdk.core.interfaces.has_attribute import HasAttribute from codegen.sdk.core.interfaces.has_block import HasBlock from codegen.sdk.core.interfaces.inherits import Inherits -from codegen.sdk.core.statements.attribute import Attribute -from codegen.sdk.core.symbol_groups.parents import Parents from codegen.sdk.enums import SymbolType from codegen.sdk.extensions.autocommit import commiter from codegen.shared.decorators.docs import noapidoc if TYPE_CHECKING: from codegen.sdk.core.class_definition import Class + from codegen.sdk.core.detached_symbols.code_block import CodeBlock + from codegen.sdk.core.expressions.type import Type + from codegen.sdk.core.function import Function + from codegen.sdk.core.statements.attribute import Attribute + from codegen.sdk.core.symbol_groups.parents import Parents TCodeBlock = TypeVar("TCodeBlock", bound="CodeBlock") @@ -47,7 +47,8 @@ def compute_superclass_dependencies(self) -> None: @reader def attributes(self) -> list[TAttribute]: """List of attributes defined in this Interface.""" - raise NotImplementedError("Subclass must implement `parse`") + msg = "Subclass must implement `parse`" + raise NotImplementedError(msg) @reader def get_attribute(self, name: str) -> TAttribute | None: diff --git a/src/codegen/sdk/core/interfaces/callable.py b/src/codegen/sdk/core/interfaces/callable.py index 7ee0fc883..6479dd4cb 100644 --- a/src/codegen/sdk/core/interfaces/callable.py +++ b/src/codegen/sdk/core/interfaces/callable.py @@ -3,7 +3,6 @@ from codegen.sdk.core.autocommit import reader from codegen.sdk.core.detached_symbols.function_call import FunctionCall -from codegen.sdk.core.detached_symbols.parameter import Parameter from codegen.sdk.core.interfaces.usable import Usable from codegen.sdk.core.placeholder.placeholder import Placeholder from codegen.sdk.core.symbol_group import SymbolGroup @@ -11,6 +10,7 @@ if TYPE_CHECKING: from codegen.sdk.core.class_definition import Class + from codegen.sdk.core.detached_symbols.parameter import Parameter from codegen.sdk.core.expressions.type import Type from codegen.sdk.core.external_module import ExternalModule from codegen.sdk.core.function import Function diff --git a/src/codegen/sdk/core/interfaces/editable.py b/src/codegen/sdk/core/interfaces/editable.py index 0e31e5a4c..87378165c 100644 --- a/src/codegen/sdk/core/interfaces/editable.py +++ b/src/codegen/sdk/core/interfaces/editable.py @@ -3,27 +3,16 @@ import itertools import re from abc import abstractmethod -from collections.abc import Callable, Generator, Iterable from functools import cached_property from typing import TYPE_CHECKING, Generic, Self, TypeVar, Unpack, final, overload -import rich.repr -from rich.console import Console, ConsoleOptions, RenderResult from rich.markup import escape from rich.pretty import Pretty -from tree_sitter import Node as TSNode -from tree_sitter import Point, Range -from codegen.sdk.codebase.flagging.code_flag import CodeFlag -from codegen.sdk.codebase.flagging.enums import FlagKwargs from codegen.sdk.codebase.span import Span -from codegen.sdk.codebase.transaction_manager import TransactionManager from codegen.sdk.codebase.transactions import EditTransaction, InsertTransaction, RemoveTransaction, TransactionPriority from codegen.sdk.core.autocommit import commiter, reader, remover, repr_func, writer -from codegen.sdk.core.dataclasses.usage import UsageKind -from codegen.sdk.core.node_id_factory import NodeId from codegen.sdk.core.placeholder.placeholder import Placeholder -from codegen.sdk.enums import NodeType from codegen.sdk.extensions.utils import get_all_identifiers from codegen.sdk.output.ast import AST from codegen.sdk.output.constants import ANGULAR_STYLE, MAX_STRING_LENGTH @@ -33,8 +22,19 @@ from codegen.shared.decorators.docs import apidoc, noapidoc if TYPE_CHECKING: + from collections.abc import Callable, Generator, Iterable + + import rich.repr + from rich.console import Console, ConsoleOptions, RenderResult + from tree_sitter import Node as TSNode + from tree_sitter import Point, Range + from codegen.sdk.codebase.codebase_graph import CodebaseGraph + from codegen.sdk.codebase.flagging.code_flag import CodeFlag + from codegen.sdk.codebase.flagging.enums import FlagKwargs + from codegen.sdk.codebase.transaction_manager import TransactionManager from codegen.sdk.core.class_definition import Class + from codegen.sdk.core.dataclasses.usage import UsageKind from codegen.sdk.core.detached_symbols.function_call import FunctionCall from codegen.sdk.core.export import Export from codegen.sdk.core.expressions import Expression @@ -44,9 +44,11 @@ from codegen.sdk.core.import_resolution import Import, WildcardImport from codegen.sdk.core.interfaces.has_name import HasName from codegen.sdk.core.interfaces.importable import Importable + from codegen.sdk.core.node_id_factory import NodeId from codegen.sdk.core.statements.statement import Statement from codegen.sdk.core.symbol import Symbol from codegen.sdk.core.symbol_group import SymbolGroup + from codegen.sdk.enums import NodeType from codegen.visualizations.enums import VizNode CONTAINER_CHARS = (b"(", b")", b"{", b"}", b"[", b"]", b"<", b">", b"import") MAX_REPR_LEN: int = 200 diff --git a/src/codegen/sdk/core/interfaces/exportable.py b/src/codegen/sdk/core/interfaces/exportable.py index fc4daf03e..28f77b963 100644 --- a/src/codegen/sdk/core/interfaces/exportable.py +++ b/src/codegen/sdk/core/interfaces/exportable.py @@ -101,4 +101,5 @@ def get_import_string(self, alias: str | None = None, module: str | None = None, Raises: NotImplementedError: If called on the base class. """ - raise NotImplementedError("The subclass must implement `to_import_string`.") + msg = "The subclass must implement `to_import_string`." + raise NotImplementedError(msg) diff --git a/src/codegen/sdk/core/interfaces/has_block.py b/src/codegen/sdk/core/interfaces/has_block.py index 1058a7e10..6f791c716 100644 --- a/src/codegen/sdk/core/interfaces/has_block.py +++ b/src/codegen/sdk/core/interfaces/has_block.py @@ -1,20 +1,22 @@ from __future__ import annotations from abc import abstractmethod -from typing import Generic, TypeVar - -from tree_sitter import Node as TSNode +from typing import TYPE_CHECKING, Generic, TypeVar from codegen.sdk.core.autocommit import reader, writer -from codegen.sdk.core.detached_symbols.code_block import CodeBlock -from codegen.sdk.core.detached_symbols.decorator import Decorator -from codegen.sdk.core.detached_symbols.function_call import FunctionCall from codegen.sdk.core.expressions import Expression from codegen.sdk.core.statements.comment import Comment -from codegen.sdk.core.symbol_groups.comment_group import CommentGroup from codegen.sdk.extensions.sort import sort_editables from codegen.shared.decorators.docs import apidoc +if TYPE_CHECKING: + from tree_sitter import Node as TSNode + + from codegen.sdk.core.detached_symbols.code_block import CodeBlock + from codegen.sdk.core.detached_symbols.decorator import Decorator + from codegen.sdk.core.detached_symbols.function_call import FunctionCall + from codegen.sdk.core.symbol_groups.comment_group import CommentGroup + TCodeBlock = TypeVar("TCodeBlock", bound="CodeBlock") TDecorator = TypeVar("TDecorator", bound="Decorator") diff --git a/src/codegen/sdk/core/interfaces/importable.py b/src/codegen/sdk/core/interfaces/importable.py index f84442cba..237606640 100644 --- a/src/codegen/sdk/core/interfaces/importable.py +++ b/src/codegen/sdk/core/interfaces/importable.py @@ -6,7 +6,6 @@ from codegen.sdk.core.autocommit import reader from codegen.sdk.core.dataclasses.usage import UsageType from codegen.sdk.core.expressions.expression import Expression -from codegen.sdk.core.interfaces.editable import Editable from codegen.sdk.core.interfaces.has_name import HasName from codegen.sdk.core.node_id_factory import NodeId from codegen.sdk.enums import EdgeType @@ -17,6 +16,7 @@ if TYPE_CHECKING: from codegen.sdk.codebase.codebase_graph import CodebaseGraph from codegen.sdk.core.import_resolution import Import + from codegen.sdk.core.interfaces.editable import Editable from codegen.sdk.core.symbol import Symbol Parent = TypeVar("Parent", bound="Editable") @@ -96,7 +96,7 @@ def recompute(self, incremental: bool = False) -> list["Importable"]: try: self._compute_dependencies() except Exception as e: - logger.error(f"Error in file {self.file.path} while computing dependencies for symbol {self.name}") + logger.exception(f"Error in file {self.file.path} while computing dependencies for symbol {self.name}") raise e if incremental: return self.descendant_symbols + self.file.get_nodes(sort=False) diff --git a/src/codegen/sdk/core/interfaces/inherits.py b/src/codegen/sdk/core/interfaces/inherits.py index 2d29bc1dc..73778d971 100644 --- a/src/codegen/sdk/core/interfaces/inherits.py +++ b/src/codegen/sdk/core/interfaces/inherits.py @@ -1,7 +1,6 @@ from __future__ import annotations from abc import abstractmethod -from collections.abc import Generator from typing import TYPE_CHECKING, Generic, TypeVar from codegen.sdk.core.autocommit import commiter, reader @@ -10,6 +9,8 @@ from codegen.sdk.enums import EdgeType if TYPE_CHECKING: + from collections.abc import Generator + from codegen.sdk.core.class_definition import Class from codegen.sdk.core.external_module import ExternalModule from codegen.sdk.core.interface import Interface diff --git a/src/codegen/sdk/core/interfaces/typeable.py b/src/codegen/sdk/core/interfaces/typeable.py index d34a080bd..3d23a4f93 100644 --- a/src/codegen/sdk/core/interfaces/typeable.py +++ b/src/codegen/sdk/core/interfaces/typeable.py @@ -1,17 +1,18 @@ from __future__ import annotations -from collections.abc import Generator from typing import TYPE_CHECKING, Generic, Self, TypeVar, override -from codegen.sdk.codebase.resolution_stack import ResolutionStack from codegen.sdk.core.autocommit import commiter, reader from codegen.sdk.core.interfaces.chainable import Chainable -from codegen.sdk.core.interfaces.editable import Editable from codegen.sdk.core.placeholder.placeholder_type import TypePlaceholder from codegen.shared.decorators.docs import apidoc, noapidoc if TYPE_CHECKING: + from collections.abc import Generator + + from codegen.sdk.codebase.resolution_stack import ResolutionStack from codegen.sdk.core.expressions.type import Type + from codegen.sdk.core.interfaces.editable import Editable TType = TypeVar("TType", bound="Type") diff --git a/src/codegen/sdk/core/interfaces/usable.py b/src/codegen/sdk/core/interfaces/usable.py index 58707f0cc..8c9ab922d 100644 --- a/src/codegen/sdk/core/interfaces/usable.py +++ b/src/codegen/sdk/core/interfaces/usable.py @@ -5,15 +5,15 @@ from codegen.sdk._proxy import proxy_property from codegen.sdk.core.autocommit import reader from codegen.sdk.core.dataclasses.usage import Usage, UsageType -from codegen.sdk.core.interfaces.editable import Editable from codegen.sdk.core.interfaces.importable import Importable -from codegen.sdk.core.node_id_factory import NodeId from codegen.sdk.enums import EdgeType from codegen.shared.decorators.docs import apidoc if TYPE_CHECKING: from codegen.sdk.core.export import Export from codegen.sdk.core.import_resolution import Import + from codegen.sdk.core.interfaces.editable import Editable + from codegen.sdk.core.node_id_factory import NodeId from codegen.sdk.core.symbol import Symbol Parent = TypeVar("Parent", bound="Editable") @@ -61,7 +61,8 @@ def usages(self, usage_types: UsageType | None = None) -> list[Usage]: This method can be called as both a property or a method. If used as a property, it is equivalent to invoking it without arguments. """ if usage_types == UsageType.DIRECT | UsageType.ALIASED: - raise ValueError("Combination of only Aliased and Direct usages makes no sense") + msg = "Combination of only Aliased and Direct usages makes no sense" + raise ValueError(msg) assert self.node_id is not None usages_to_return = [] diff --git a/src/codegen/sdk/core/parser.py b/src/codegen/sdk/core/parser.py index 2947b6076..37be5d4d0 100644 --- a/src/codegen/sdk/core/parser.py +++ b/src/codegen/sdk/core/parser.py @@ -4,20 +4,21 @@ from typing import TYPE_CHECKING, Generic, Protocol, Self, TypeVar from rich.console import Console -from tree_sitter import Node as TSNode -from codegen.sdk.codebase.node_classes.node_classes import NodeClasses from codegen.sdk.core.expressions.placeholder_type import PlaceholderType from codegen.sdk.core.expressions.value import Value -from codegen.sdk.core.interfaces.editable import Editable -from codegen.sdk.core.node_id_factory import NodeId -from codegen.sdk.core.statements.statement import Statement from codegen.sdk.core.statements.symbol_statement import SymbolStatement from codegen.sdk.utils import find_first_function_descendant if TYPE_CHECKING: + from tree_sitter import Node as TSNode + from codegen.sdk.codebase.codebase_graph import CodebaseGraph + from codegen.sdk.codebase.node_classes.node_classes import NodeClasses from codegen.sdk.core.expressions.type import Type + from codegen.sdk.core.interfaces.editable import Editable + from codegen.sdk.core.node_id_factory import NodeId + from codegen.sdk.core.statements.statement import Statement from codegen.sdk.core.symbol import Symbol from codegen.sdk.python.detached_symbols.code_block import PyCodeBlock from codegen.sdk.typescript.detached_symbols.code_block import TSCodeBlock diff --git a/src/codegen/sdk/core/placeholder/placeholder_stub.py b/src/codegen/sdk/core/placeholder/placeholder_stub.py index af576dba7..d99b375a9 100644 --- a/src/codegen/sdk/core/placeholder/placeholder_stub.py +++ b/src/codegen/sdk/core/placeholder/placeholder_stub.py @@ -1,9 +1,11 @@ -from typing import Generic, TypeVar +from typing import TYPE_CHECKING, Generic, TypeVar -from codegen.sdk.core.interfaces.editable import Editable from codegen.sdk.core.placeholder.placeholder import Placeholder from codegen.shared.decorators.docs import apidoc +if TYPE_CHECKING: + from codegen.sdk.core.interfaces.editable import Editable + Parent = TypeVar("Parent", bound="Editable") diff --git a/src/codegen/sdk/core/placeholder/placeholder_type.py b/src/codegen/sdk/core/placeholder/placeholder_type.py index b4008e87d..5beeddf46 100644 --- a/src/codegen/sdk/core/placeholder/placeholder_type.py +++ b/src/codegen/sdk/core/placeholder/placeholder_type.py @@ -1,9 +1,11 @@ -from typing import Generic, TypeVar +from typing import TYPE_CHECKING, Generic, TypeVar -from codegen.sdk.core.interfaces.editable import Editable from codegen.sdk.core.placeholder.placeholder import Placeholder from codegen.shared.decorators.docs import apidoc +if TYPE_CHECKING: + from codegen.sdk.core.interfaces.editable import Editable + Parent = TypeVar("Parent", bound="Editable") diff --git a/src/codegen/sdk/core/statements/assignment_statement.py b/src/codegen/sdk/core/statements/assignment_statement.py index 9571336d0..f35d76f9b 100644 --- a/src/codegen/sdk/core/statements/assignment_statement.py +++ b/src/codegen/sdk/core/statements/assignment_statement.py @@ -3,25 +3,25 @@ from abc import abstractmethod from typing import TYPE_CHECKING, Generic, TypeVar -from tree_sitter import Node as TSNode - -from codegen.sdk.codebase.codebase_graph import CodebaseGraph -from codegen.sdk.core.assignment import Assignment from codegen.sdk.core.dataclasses.usage import UsageKind -from codegen.sdk.core.expressions import Expression -from codegen.sdk.core.expressions.multi_expression import MultiExpression from codegen.sdk.core.expressions.name import Name -from codegen.sdk.core.interfaces.has_name import HasName from codegen.sdk.core.interfaces.has_value import HasValue -from codegen.sdk.core.interfaces.importable import Importable -from codegen.sdk.core.node_id_factory import NodeId from codegen.sdk.core.statements.statement import Statement, StatementType from codegen.sdk.extensions.autocommit import commiter from codegen.shared.decorators.docs import apidoc, noapidoc if TYPE_CHECKING: + from tree_sitter import Node as TSNode + + from codegen.sdk.codebase.codebase_graph import CodebaseGraph + from codegen.sdk.core.assignment import Assignment from codegen.sdk.core.detached_symbols.code_block import CodeBlock + from codegen.sdk.core.expressions import Expression + from codegen.sdk.core.expressions.multi_expression import MultiExpression from codegen.sdk.core.interfaces.has_block import HasBlock + from codegen.sdk.core.interfaces.has_name import HasName + from codegen.sdk.core.interfaces.importable import Importable + from codegen.sdk.core.node_id_factory import NodeId TCodeBlock = TypeVar("TCodeBlock", bound="CodeBlock") @@ -46,7 +46,8 @@ def __init__(self, ts_node: TSNode, file_node_id: NodeId, G: CodebaseGraph, pare super().__init__(ts_node, file_node_id, G, parent, pos=pos) self.assignments = self._DEPRECATED_parse_assignments().expressions if len(self.assignments) == 0: - raise ValueError(f"No assignments found: {self.ts_node}\n\n{self.source}") + msg = f"No assignments found: {self.ts_node}\n\n{self.source}" + raise ValueError(msg) first_assignment: TAssignment = self.assignments[0] self._name_node = self.G.parser.parse_expression(first_assignment.ts_node, self.file_node_id, self.G, parent, default=Name) diff --git a/src/codegen/sdk/core/statements/attribute.py b/src/codegen/sdk/core/statements/attribute.py index 6ae393c1c..ab1692acc 100644 --- a/src/codegen/sdk/core/statements/attribute.py +++ b/src/codegen/sdk/core/statements/attribute.py @@ -2,26 +2,27 @@ import itertools from abc import abstractmethod -from collections.abc import Generator from typing import TYPE_CHECKING, Generic, Self, TypeVar, override -from tree_sitter import Node as TSNode - -from codegen.sdk.codebase.codebase_graph import CodebaseGraph -from codegen.sdk.core.assignment import Assignment from codegen.sdk.core.autocommit import writer from codegen.sdk.core.interfaces.chainable import Chainable -from codegen.sdk.core.interfaces.importable import Importable from codegen.sdk.core.interfaces.usable import Usable -from codegen.sdk.core.node_id_factory import NodeId from codegen.sdk.core.statements.assignment_statement import AssignmentStatement from codegen.sdk.core.statements.statement import StatementType from codegen.sdk.extensions.autocommit import reader -from codegen.sdk.extensions.resolution import ResolutionStack from codegen.shared.decorators.docs import apidoc, noapidoc if TYPE_CHECKING: + from collections.abc import Generator + + from tree_sitter import Node as TSNode + + from codegen.sdk.codebase.codebase_graph import CodebaseGraph + from codegen.sdk.core.assignment import Assignment from codegen.sdk.core.detached_symbols.code_block import CodeBlock + from codegen.sdk.core.interfaces.importable import Importable + from codegen.sdk.core.node_id_factory import NodeId + from codegen.sdk.extensions.resolution import ResolutionStack TCodeBlock = TypeVar("TCodeBlock", bound="CodeBlock | None") TAssignment = TypeVar("TAssignment", bound="Assignment") diff --git a/src/codegen/sdk/core/statements/block_statement.py b/src/codegen/sdk/core/statements/block_statement.py index baaf27e26..0597c9262 100644 --- a/src/codegen/sdk/core/statements/block_statement.py +++ b/src/codegen/sdk/core/statements/block_statement.py @@ -3,21 +3,21 @@ from abc import ABC from typing import TYPE_CHECKING, Generic, TypeVar -from tree_sitter import Node as TSNode - -from codegen.sdk.core.dataclasses.usage import UsageKind -from codegen.sdk.core.detached_symbols.function_call import FunctionCall from codegen.sdk.core.interfaces.has_block import HasBlock -from codegen.sdk.core.interfaces.has_name import HasName -from codegen.sdk.core.interfaces.importable import Importable -from codegen.sdk.core.node_id_factory import NodeId from codegen.sdk.core.statements.statement import Statement from codegen.sdk.extensions.autocommit import commiter, reader from codegen.shared.decorators.docs import apidoc, noapidoc if TYPE_CHECKING: + from tree_sitter import Node as TSNode + from codegen.sdk.codebase.codebase_graph import CodebaseGraph + from codegen.sdk.core.dataclasses.usage import UsageKind from codegen.sdk.core.detached_symbols.code_block import CodeBlock + from codegen.sdk.core.detached_symbols.function_call import FunctionCall + from codegen.sdk.core.interfaces.has_name import HasName + from codegen.sdk.core.interfaces.importable import Importable + from codegen.sdk.core.node_id_factory import NodeId TCodeBlock = TypeVar("TCodeBlock", bound="CodeBlock") diff --git a/src/codegen/sdk/core/statements/catch_statement.py b/src/codegen/sdk/core/statements/catch_statement.py index f6aed02d7..e9e96fa09 100644 --- a/src/codegen/sdk/core/statements/catch_statement.py +++ b/src/codegen/sdk/core/statements/catch_statement.py @@ -2,15 +2,15 @@ from typing import TYPE_CHECKING, Generic, Self, TypeVar -from codegen.sdk.core.dataclasses.usage import UsageKind -from codegen.sdk.core.expressions import Expression -from codegen.sdk.core.interfaces.has_name import HasName from codegen.sdk.core.statements.block_statement import BlockStatement from codegen.sdk.extensions.autocommit import commiter from codegen.shared.decorators.docs import apidoc, noapidoc if TYPE_CHECKING: + from codegen.sdk.core.dataclasses.usage import UsageKind from codegen.sdk.core.detached_symbols.code_block import CodeBlock + from codegen.sdk.core.expressions import Expression + from codegen.sdk.core.interfaces.has_name import HasName Parent = TypeVar("Parent", bound="CodeBlock") diff --git a/src/codegen/sdk/core/statements/comment.py b/src/codegen/sdk/core/statements/comment.py index 910dbf62b..46c5f8c15 100644 --- a/src/codegen/sdk/core/statements/comment.py +++ b/src/codegen/sdk/core/statements/comment.py @@ -2,18 +2,18 @@ from typing import TYPE_CHECKING, Generic, TypeVar -from tree_sitter import Node as TSNode - -from codegen.sdk.codebase.codebase_graph import CodebaseGraph from codegen.sdk.core.autocommit import commiter, reader, writer from codegen.sdk.core.dataclasses.usage import UsageKind -from codegen.sdk.core.interfaces.has_name import HasName -from codegen.sdk.core.node_id_factory import NodeId from codegen.sdk.core.statements.statement import Statement, StatementType from codegen.shared.decorators.docs import apidoc, noapidoc if TYPE_CHECKING: + from tree_sitter import Node as TSNode + + from codegen.sdk.codebase.codebase_graph import CodebaseGraph from codegen.sdk.core.detached_symbols.code_block import CodeBlock + from codegen.sdk.core.interfaces.has_name import HasName + from codegen.sdk.core.node_id_factory import NodeId def lowest_indentation(text_blocks, skip_lines: int = 0): @@ -114,13 +114,15 @@ def edit_text(self, new_text: str) -> None: @commiter def _parse_comment(self) -> str: """Parse out the comment into its text content.""" - raise NotImplementedError("This method should be implemented by the subclass") + msg = "This method should be implemented by the subclass" + raise NotImplementedError(msg) @noapidoc @commiter def _unparse_comment(self, new_src: str): """Unparses cleaned text content into a comment block.""" - raise NotImplementedError("This method should be implemented by the subclass") + msg = "This method should be implemented by the subclass" + raise NotImplementedError(msg) @commiter @noapidoc diff --git a/src/codegen/sdk/core/statements/export_statement.py b/src/codegen/sdk/core/statements/export_statement.py index 6ceb2f0c9..67d4fbbb3 100644 --- a/src/codegen/sdk/core/statements/export_statement.py +++ b/src/codegen/sdk/core/statements/export_statement.py @@ -1,23 +1,25 @@ from __future__ import annotations -from typing import Generic, Self, TypeVar +from typing import TYPE_CHECKING, Generic, Self, TypeVar -from tree_sitter import Node as TSNode - -from codegen.sdk.codebase.codebase_graph import CodebaseGraph from codegen.sdk.core.dataclasses.usage import UsageKind -from codegen.sdk.core.export import Export -from codegen.sdk.core.interfaces.has_name import HasName -from codegen.sdk.core.node_id_factory import NodeId from codegen.sdk.core.statements.statement import Statement, StatementType from codegen.sdk.core.symbol_groups.collection import Collection from codegen.sdk.extensions.autocommit import commiter -from codegen.sdk.typescript.detached_symbols.code_block import TSCodeBlock from codegen.sdk.typescript.export import TSExport from codegen.sdk.typescript.statements.import_statement import TSImportStatement from codegen.sdk.utils import find_first_ancestor from codegen.shared.decorators.docs import apidoc, noapidoc +if TYPE_CHECKING: + from tree_sitter import Node as TSNode + + from codegen.sdk.codebase.codebase_graph import CodebaseGraph + from codegen.sdk.core.export import Export + from codegen.sdk.core.interfaces.has_name import HasName + from codegen.sdk.core.node_id_factory import NodeId + from codegen.sdk.typescript.detached_symbols.code_block import TSCodeBlock + TExport = TypeVar("TExport", bound="Export") diff --git a/src/codegen/sdk/core/statements/expression_statement.py b/src/codegen/sdk/core/statements/expression_statement.py index 1dbbd3e47..142fdf1f7 100644 --- a/src/codegen/sdk/core/statements/expression_statement.py +++ b/src/codegen/sdk/core/statements/expression_statement.py @@ -2,22 +2,22 @@ from typing import TYPE_CHECKING, Generic, TypeVar -from tree_sitter import Node as TSNode - -from codegen.sdk.codebase.codebase_graph import CodebaseGraph -from codegen.sdk.core.dataclasses.usage import UsageKind -from codegen.sdk.core.detached_symbols.function_call import FunctionCall -from codegen.sdk.core.interfaces.has_name import HasName from codegen.sdk.core.interfaces.has_value import HasValue from codegen.sdk.core.interfaces.wrapper_expression import IWrapper -from codegen.sdk.core.node_id_factory import NodeId from codegen.sdk.core.statements.statement import Statement, StatementType from codegen.sdk.extensions.autocommit import commiter, reader from codegen.shared.decorators.docs import apidoc, noapidoc if TYPE_CHECKING: + from tree_sitter import Node as TSNode + + from codegen.sdk.codebase.codebase_graph import CodebaseGraph + from codegen.sdk.core.dataclasses.usage import UsageKind from codegen.sdk.core.detached_symbols.code_block import CodeBlock + from codegen.sdk.core.detached_symbols.function_call import FunctionCall from codegen.sdk.core.interfaces.has_block import HasBlock + from codegen.sdk.core.interfaces.has_name import HasName + from codegen.sdk.core.node_id_factory import NodeId Parent = TypeVar("Parent", bound="HasBlock") diff --git a/src/codegen/sdk/core/statements/for_loop_statement.py b/src/codegen/sdk/core/statements/for_loop_statement.py index 643d23f20..3d3e635b1 100644 --- a/src/codegen/sdk/core/statements/for_loop_statement.py +++ b/src/codegen/sdk/core/statements/for_loop_statement.py @@ -4,18 +4,18 @@ from typing import TYPE_CHECKING, Generic, Self, TypeVar from codegen.sdk.core.autocommit import reader -from codegen.sdk.core.expressions import Expression -from codegen.sdk.core.import_resolution import Import, WildcardImport from codegen.sdk.core.interfaces.chainable import Chainable from codegen.sdk.core.interfaces.has_block import HasBlock from codegen.sdk.core.statements.block_statement import BlockStatement from codegen.sdk.core.statements.statement import StatementType -from codegen.sdk.core.symbol import Symbol from codegen.sdk.core.symbol_groups.collection import Collection from codegen.shared.decorators.docs import apidoc, noapidoc if TYPE_CHECKING: from codegen.sdk.core.detached_symbols.code_block import CodeBlock + from codegen.sdk.core.expressions import Expression + from codegen.sdk.core.import_resolution import Import, WildcardImport + from codegen.sdk.core.symbol import Symbol Parent = TypeVar("Parent", bound="CodeBlock") diff --git a/src/codegen/sdk/core/statements/if_block_statement.py b/src/codegen/sdk/core/statements/if_block_statement.py index 939765026..db8b347f6 100644 --- a/src/codegen/sdk/core/statements/if_block_statement.py +++ b/src/codegen/sdk/core/statements/if_block_statement.py @@ -7,18 +7,18 @@ from codegen.sdk._proxy import proxy_property from codegen.sdk.core.autocommit import reader, writer from codegen.sdk.core.dataclasses.usage import UsageKind -from codegen.sdk.core.detached_symbols.function_call import FunctionCall -from codegen.sdk.core.expressions import Expression from codegen.sdk.core.function import Function -from codegen.sdk.core.interfaces.editable import Editable -from codegen.sdk.core.interfaces.has_name import HasName -from codegen.sdk.core.interfaces.importable import Importable from codegen.sdk.core.statements.statement import Statement, StatementType from codegen.sdk.extensions.autocommit import commiter from codegen.shared.decorators.docs import apidoc, noapidoc if TYPE_CHECKING: from codegen.sdk.core.detached_symbols.code_block import CodeBlock + from codegen.sdk.core.detached_symbols.function_call import FunctionCall + from codegen.sdk.core.expressions import Expression + from codegen.sdk.core.interfaces.editable import Editable + from codegen.sdk.core.interfaces.has_name import HasName + from codegen.sdk.core.interfaces.importable import Importable TIfBlockStatement = TypeVar("TIfBlockStatement", bound="IfBlockStatement") @@ -228,7 +228,8 @@ def reduce_condition(self, bool_condition: bool, node: Editable | None = None) - (like an else block). """ if self.condition is None: - raise ValueError("Cannot reduce condition of an IfBlockStatement without a condition.") + msg = "Cannot reduce condition of an IfBlockStatement without a condition." + raise ValueError(msg) first_elif = next((x for x in self.elif_statements()), None) diff --git a/src/codegen/sdk/core/statements/import_statement.py b/src/codegen/sdk/core/statements/import_statement.py index 03f43bb7c..c1a18bf8f 100644 --- a/src/codegen/sdk/core/statements/import_statement.py +++ b/src/codegen/sdk/core/statements/import_statement.py @@ -2,21 +2,21 @@ from typing import TYPE_CHECKING, Generic, Self, TypeVar -from tree_sitter import Node as TSNode - -from codegen.sdk.codebase.codebase_graph import CodebaseGraph from codegen.sdk.core.dataclasses.usage import UsageKind -from codegen.sdk.core.interfaces.has_name import HasName -from codegen.sdk.core.node_id_factory import NodeId from codegen.sdk.core.statements.statement import Statement -from codegen.sdk.core.symbol_groups.collection import Collection from codegen.sdk.extensions.autocommit import commiter from codegen.shared.decorators.docs import apidoc, noapidoc if TYPE_CHECKING: + from tree_sitter import Node as TSNode + + from codegen.sdk.codebase.codebase_graph import CodebaseGraph from codegen.sdk.core.detached_symbols.code_block import CodeBlock from codegen.sdk.core.file import SourceFile from codegen.sdk.core.import_resolution import Import + from codegen.sdk.core.interfaces.has_name import HasName + from codegen.sdk.core.node_id_factory import NodeId + from codegen.sdk.core.symbol_groups.collection import Collection TSourceFile = TypeVar("TSourceFile", bound="SourceFile") diff --git a/src/codegen/sdk/core/statements/raise_statement.py b/src/codegen/sdk/core/statements/raise_statement.py index 16ef7a59a..71e582294 100644 --- a/src/codegen/sdk/core/statements/raise_statement.py +++ b/src/codegen/sdk/core/statements/raise_statement.py @@ -2,20 +2,20 @@ from typing import TYPE_CHECKING, Generic, TypeVar -from tree_sitter import Node as TSNode - -from codegen.sdk.core.dataclasses.usage import UsageKind -from codegen.sdk.core.detached_symbols.function_call import FunctionCall -from codegen.sdk.core.interfaces.has_name import HasName from codegen.sdk.core.interfaces.has_value import HasValue -from codegen.sdk.core.node_id_factory import NodeId from codegen.sdk.core.statements.statement import Statement, StatementType from codegen.sdk.extensions.autocommit import commiter, reader from codegen.shared.decorators.docs import apidoc, noapidoc if TYPE_CHECKING: + from tree_sitter import Node as TSNode + from codegen.sdk.codebase.codebase_graph import CodebaseGraph + from codegen.sdk.core.dataclasses.usage import UsageKind from codegen.sdk.core.detached_symbols.code_block import CodeBlock + from codegen.sdk.core.detached_symbols.function_call import FunctionCall + from codegen.sdk.core.interfaces.has_name import HasName + from codegen.sdk.core.node_id_factory import NodeId Parent = TypeVar("Parent", bound="CodeBlock") diff --git a/src/codegen/sdk/core/statements/return_statement.py b/src/codegen/sdk/core/statements/return_statement.py index 0bfca196b..3b716362c 100644 --- a/src/codegen/sdk/core/statements/return_statement.py +++ b/src/codegen/sdk/core/statements/return_statement.py @@ -2,21 +2,21 @@ from typing import TYPE_CHECKING, Generic, TypeVar -from tree_sitter import Node as TSNode - -from codegen.sdk.core.dataclasses.usage import UsageKind -from codegen.sdk.core.detached_symbols.function_call import FunctionCall -from codegen.sdk.core.interfaces.has_name import HasName from codegen.sdk.core.interfaces.has_value import HasValue -from codegen.sdk.core.node_id_factory import NodeId from codegen.sdk.core.statements.statement import Statement, StatementType from codegen.sdk.extensions.autocommit import commiter, reader from codegen.shared.decorators.docs import apidoc, noapidoc if TYPE_CHECKING: + from tree_sitter import Node as TSNode + from codegen.sdk.codebase.codebase_graph import CodebaseGraph + from codegen.sdk.core.dataclasses.usage import UsageKind from codegen.sdk.core.detached_symbols.code_block import CodeBlock + from codegen.sdk.core.detached_symbols.function_call import FunctionCall from codegen.sdk.core.interfaces.has_block import HasBlock + from codegen.sdk.core.interfaces.has_name import HasName + from codegen.sdk.core.node_id_factory import NodeId Parent = TypeVar("Parent", bound="HasBlock") diff --git a/src/codegen/sdk/core/statements/statement.py b/src/codegen/sdk/core/statements/statement.py index 7773692e1..7d4175c6e 100644 --- a/src/codegen/sdk/core/statements/statement.py +++ b/src/codegen/sdk/core/statements/statement.py @@ -4,24 +4,23 @@ from functools import cached_property from typing import TYPE_CHECKING, Generic, Self, TypeVar, final -import rich.repr - from codegen.sdk.core.autocommit import reader -from codegen.sdk.core.dataclasses.usage import UsageKind from codegen.sdk.core.expressions import Expression -from codegen.sdk.core.interfaces.has_name import HasName -from codegen.sdk.core.node_id_factory import NodeId -from codegen.sdk.core.symbol_groups.multi_line_collection import MultiLineCollection from codegen.sdk.extensions.autocommit import commiter from codegen.sdk.output.constants import ANGULAR_STYLE from codegen.sdk.utils import find_all_descendants from codegen.shared.decorators.docs import apidoc, noapidoc if TYPE_CHECKING: + import rich.repr + from tree_sitter import Node as TSNode + from codegen.sdk.codebase.codebase_graph import CodebaseGraph + from codegen.sdk.core.dataclasses.usage import UsageKind from codegen.sdk.core.detached_symbols.code_block import CodeBlock - -from tree_sitter import Node as TSNode + from codegen.sdk.core.interfaces.has_name import HasName + from codegen.sdk.core.node_id_factory import NodeId + from codegen.sdk.core.symbol_groups.multi_line_collection import MultiLineCollection @apidoc diff --git a/src/codegen/sdk/core/statements/switch_case.py b/src/codegen/sdk/core/statements/switch_case.py index 7bc64be6f..3ebafb57e 100644 --- a/src/codegen/sdk/core/statements/switch_case.py +++ b/src/codegen/sdk/core/statements/switch_case.py @@ -2,16 +2,16 @@ from typing import TYPE_CHECKING, Generic, Self, TypeVar -from codegen.sdk.core.dataclasses.usage import UsageKind -from codegen.sdk.core.expressions import Expression -from codegen.sdk.core.interfaces.has_name import HasName from codegen.sdk.core.statements.block_statement import BlockStatement from codegen.sdk.extensions.autocommit import commiter from codegen.shared.decorators.docs import apidoc, noapidoc if TYPE_CHECKING: from codegen.sdk.core.assignment import Assignment + from codegen.sdk.core.dataclasses.usage import UsageKind from codegen.sdk.core.detached_symbols.code_block import CodeBlock + from codegen.sdk.core.expressions import Expression + from codegen.sdk.core.interfaces.has_name import HasName from codegen.sdk.core.statements.switch_statement import SwitchStatement Parent = TypeVar("Parent", bound="CodeBlock[SwitchStatement, Assignment]") diff --git a/src/codegen/sdk/core/statements/switch_statement.py b/src/codegen/sdk/core/statements/switch_statement.py index d883b705f..02276a081 100644 --- a/src/codegen/sdk/core/statements/switch_statement.py +++ b/src/codegen/sdk/core/statements/switch_statement.py @@ -2,18 +2,18 @@ from typing import TYPE_CHECKING, Generic, Self, TypeVar, override -from codegen.sdk.core.dataclasses.usage import UsageKind -from codegen.sdk.core.detached_symbols.function_call import FunctionCall -from codegen.sdk.core.expressions import Expression -from codegen.sdk.core.interfaces.has_name import HasName -from codegen.sdk.core.interfaces.importable import Importable from codegen.sdk.core.statements.statement import Statement, StatementType -from codegen.sdk.core.statements.switch_case import SwitchCase from codegen.sdk.extensions.autocommit import commiter, reader from codegen.shared.decorators.docs import apidoc, noapidoc if TYPE_CHECKING: + from codegen.sdk.core.dataclasses.usage import UsageKind from codegen.sdk.core.detached_symbols.code_block import CodeBlock + from codegen.sdk.core.detached_symbols.function_call import FunctionCall + from codegen.sdk.core.expressions import Expression + from codegen.sdk.core.interfaces.has_name import HasName + from codegen.sdk.core.interfaces.importable import Importable + from codegen.sdk.core.statements.switch_case import SwitchCase Parent = TypeVar("Parent", bound="CodeBlock") diff --git a/src/codegen/sdk/core/statements/symbol_statement.py b/src/codegen/sdk/core/statements/symbol_statement.py index 233f3644d..095a75288 100644 --- a/src/codegen/sdk/core/statements/symbol_statement.py +++ b/src/codegen/sdk/core/statements/symbol_statement.py @@ -2,20 +2,20 @@ from typing import TYPE_CHECKING, Generic, TypeVar -from tree_sitter import Node as TSNode - -from codegen.sdk.core.dataclasses.usage import UsageKind -from codegen.sdk.core.detached_symbols.function_call import FunctionCall -from codegen.sdk.core.interfaces.has_name import HasName -from codegen.sdk.core.node_id_factory import NodeId from codegen.sdk.core.statements.statement import Statement, StatementType from codegen.sdk.extensions.autocommit import reader from codegen.shared.decorators.docs import apidoc, noapidoc if TYPE_CHECKING: + from tree_sitter import Node as TSNode + from codegen.sdk.codebase.codebase_graph import CodebaseGraph + from codegen.sdk.core.dataclasses.usage import UsageKind from codegen.sdk.core.detached_symbols.code_block import CodeBlock + from codegen.sdk.core.detached_symbols.function_call import FunctionCall + from codegen.sdk.core.interfaces.has_name import HasName from codegen.sdk.core.interfaces.importable import Importable + from codegen.sdk.core.node_id_factory import NodeId from codegen.sdk.core.symbol import Symbol diff --git a/src/codegen/sdk/core/statements/while_statement.py b/src/codegen/sdk/core/statements/while_statement.py index f73b5bade..338f860da 100644 --- a/src/codegen/sdk/core/statements/while_statement.py +++ b/src/codegen/sdk/core/statements/while_statement.py @@ -3,22 +3,22 @@ from abc import ABC from typing import TYPE_CHECKING, Generic, Self, TypeVar -from tree_sitter import Node as TSNode - -from codegen.sdk.core.dataclasses.usage import UsageKind -from codegen.sdk.core.detached_symbols.function_call import FunctionCall -from codegen.sdk.core.expressions import Expression from codegen.sdk.core.interfaces.has_block import HasBlock -from codegen.sdk.core.interfaces.has_name import HasName -from codegen.sdk.core.interfaces.importable import Importable -from codegen.sdk.core.node_id_factory import NodeId from codegen.sdk.core.statements.statement import Statement, StatementType from codegen.sdk.extensions.autocommit import commiter, reader from codegen.shared.decorators.docs import apidoc, noapidoc if TYPE_CHECKING: + from tree_sitter import Node as TSNode + from codegen.sdk.codebase.codebase_graph import CodebaseGraph + from codegen.sdk.core.dataclasses.usage import UsageKind from codegen.sdk.core.detached_symbols.code_block import CodeBlock + from codegen.sdk.core.detached_symbols.function_call import FunctionCall + from codegen.sdk.core.expressions import Expression + from codegen.sdk.core.interfaces.has_name import HasName + from codegen.sdk.core.interfaces.importable import Importable + from codegen.sdk.core.node_id_factory import NodeId TCodeBlock = TypeVar("TCodeBlock", bound="CodeBlock") diff --git a/src/codegen/sdk/core/symbol.py b/src/codegen/sdk/core/symbol.py index b4761ecc3..b939a7cc4 100644 --- a/src/codegen/sdk/core/symbol.py +++ b/src/codegen/sdk/core/symbol.py @@ -3,11 +3,8 @@ from abc import abstractmethod from typing import TYPE_CHECKING, Generic, Literal, TypeVar -import rich.repr from rich.markup import escape -from tree_sitter import Node as TSNode -from codegen.sdk.codebase.codebase_graph import CodebaseGraph from codegen.sdk.core.autocommit import commiter, reader, writer from codegen.sdk.core.dataclasses.usage import UsageKind, UsageType from codegen.sdk.core.detached_symbols.argument import Argument @@ -15,23 +12,27 @@ from codegen.sdk.core.expressions import Name, Value from codegen.sdk.core.expressions.chained_attribute import ChainedAttribute from codegen.sdk.core.expressions.defined_name import DefinedName -from codegen.sdk.core.interfaces.editable import Editable -from codegen.sdk.core.interfaces.importable import Importable from codegen.sdk.core.interfaces.usable import Usable -from codegen.sdk.core.node_id_factory import NodeId from codegen.sdk.core.statements.statement import Statement -from codegen.sdk.core.symbol_groups.comment_group import CommentGroup from codegen.sdk.enums import ImportType, NodeType, SymbolType from codegen.sdk.extensions.sort import sort_editables from codegen.sdk.output.constants import ANGULAR_STYLE from codegen.shared.decorators.docs import apidoc, noapidoc if TYPE_CHECKING: + import rich.repr + from tree_sitter import Node as TSNode + + from codegen.sdk.codebase.codebase_graph import CodebaseGraph from codegen.sdk.core.detached_symbols.code_block import CodeBlock from codegen.sdk.core.export import Export from codegen.sdk.core.file import SourceFile from codegen.sdk.core.import_resolution import Import + from codegen.sdk.core.interfaces.editable import Editable from codegen.sdk.core.interfaces.has_block import HasBlock + from codegen.sdk.core.interfaces.importable import Importable + from codegen.sdk.core.node_id_factory import NodeId + from codegen.sdk.core.symbol_groups.comment_group import CommentGroup Parent = TypeVar("Parent", bound="HasBlock") TCodeBlock = TypeVar("TCodeBlock", bound="CodeBlock") diff --git a/src/codegen/sdk/core/symbol_group.py b/src/codegen/sdk/core/symbol_group.py index 7babbfbe2..c8340e012 100644 --- a/src/codegen/sdk/core/symbol_group.py +++ b/src/codegen/sdk/core/symbol_group.py @@ -3,23 +3,23 @@ from collections.abc import Collection, Iterator from typing import TYPE_CHECKING, Generic, TypeVar, override -from tree_sitter import Node as TSNode - from codegen.sdk.core.autocommit import reader, repr_func, writer -from codegen.sdk.core.dataclasses.usage import UsageKind from codegen.sdk.core.interfaces.editable import Editable -from codegen.sdk.core.interfaces.has_name import HasName -from codegen.sdk.core.node_id_factory import NodeId from codegen.sdk.extensions.autocommit import commiter -from codegen.sdk.output.ast import AST from codegen.shared.decorators.docs import apidoc, noapidoc if TYPE_CHECKING: + from tree_sitter import Node as TSNode + from codegen.sdk.codebase.codebase_graph import CodebaseGraph + from codegen.sdk.core.dataclasses.usage import UsageKind + from codegen.sdk.core.interfaces.has_name import HasName + from codegen.sdk.core.node_id_factory import NodeId + from codegen.sdk.output.ast import AST Child = TypeVar("Child", bound="Editable") -Parent = TypeVar("Parent", bound="Parent") +Parent = TypeVar("Parent", bound="Editable") @apidoc diff --git a/src/codegen/sdk/core/symbol_groups/comment_group.py b/src/codegen/sdk/core/symbol_groups/comment_group.py index 33e8f6416..8e36eaa81 100644 --- a/src/codegen/sdk/core/symbol_groups/comment_group.py +++ b/src/codegen/sdk/core/symbol_groups/comment_group.py @@ -1,14 +1,16 @@ from __future__ import annotations -from typing import TypeVar +from typing import TYPE_CHECKING, TypeVar -from codegen.sdk.codebase.codebase_graph import CodebaseGraph from codegen.sdk.core.autocommit import reader, writer -from codegen.sdk.core.node_id_factory import NodeId from codegen.sdk.core.statements.comment import Comment from codegen.sdk.core.symbol_group import SymbolGroup from codegen.shared.decorators.docs import apidoc, noapidoc +if TYPE_CHECKING: + from codegen.sdk.codebase.codebase_graph import CodebaseGraph + from codegen.sdk.core.node_id_factory import NodeId + Parent = TypeVar("Parent") diff --git a/src/codegen/sdk/core/symbol_groups/dict.py b/src/codegen/sdk/core/symbol_groups/dict.py index 8324d709d..7af4cb0d9 100644 --- a/src/codegen/sdk/core/symbol_groups/dict.py +++ b/src/codegen/sdk/core/symbol_groups/dict.py @@ -120,7 +120,8 @@ def __getitem__(self, __key) -> TExpression: elif pair.key is not None: if pair.key.source == str(__key): return pair.value - raise KeyError(f"Key {__key} not found in {list(self.keys())} {self._underlying!r}") + msg = f"Key {__key} not found in {list(self.keys())} {self._underlying!r}" + raise KeyError(msg) def __setitem__(self, __key, __value: TExpression) -> None: new_value = __value.source if isinstance(__value, Editable) else str(__value) @@ -146,7 +147,8 @@ def __delitem__(self, __key) -> None: if pair.key.source == str(__key): del self._underlying[idx] return - raise KeyError(f"Key {__key} not found in {list(self.keys())} {self._underlying!r}") + msg = f"Key {__key} not found in {list(self.keys())} {self._underlying!r}" + raise KeyError(msg) def _removed_child_commit(self): return self._underlying._removed_child_commit() diff --git a/src/codegen/sdk/core/symbol_groups/expression_group.py b/src/codegen/sdk/core/symbol_groups/expression_group.py index 492b656f0..82f6da266 100644 --- a/src/codegen/sdk/core/symbol_groups/expression_group.py +++ b/src/codegen/sdk/core/symbol_groups/expression_group.py @@ -1,13 +1,15 @@ from __future__ import annotations -from typing import Generic, TypeVar +from typing import TYPE_CHECKING, Generic, TypeVar -from codegen.sdk.core.detached_symbols.function_call import FunctionCall -from codegen.sdk.core.expressions import Expression from codegen.sdk.core.symbol_group import SymbolGroup from codegen.sdk.extensions.autocommit import reader from codegen.shared.decorators.docs import apidoc +if TYPE_CHECKING: + from codegen.sdk.core.detached_symbols.function_call import FunctionCall + from codegen.sdk.core.expressions import Expression + Parent = TypeVar("Parent") diff --git a/src/codegen/sdk/core/symbol_groups/multi_line_collection.py b/src/codegen/sdk/core/symbol_groups/multi_line_collection.py index 049c41d8a..bdc176042 100644 --- a/src/codegen/sdk/core/symbol_groups/multi_line_collection.py +++ b/src/codegen/sdk/core/symbol_groups/multi_line_collection.py @@ -77,7 +77,8 @@ def _get_insert_source(self, src: str | Child, insert_idx: int) -> str: src_lines = src.split("\n") src_lines = [line if line == "" else f"{indent}{line}" for line in src_lines] else: - raise ValueError(f"Invalid source type: {type(src)}") + msg = f"Invalid source type: {type(src)}" + raise ValueError(msg) src = "\n".join(src_lines) # Only add the leading delimiter if it's inserted before or after existing elements diff --git a/src/codegen/sdk/core/symbol_groups/parents.py b/src/codegen/sdk/core/symbol_groups/parents.py index 385125b69..f302b3a73 100644 --- a/src/codegen/sdk/core/symbol_groups/parents.py +++ b/src/codegen/sdk/core/symbol_groups/parents.py @@ -1,24 +1,25 @@ from __future__ import annotations -from collections.abc import Iterator from typing import TYPE_CHECKING, Generic, TypeVar -from tree_sitter import Node as TSNode - -from codegen.sdk.codebase.codebase_graph import CodebaseGraph -from codegen.sdk.codebase.resolution_stack import ResolutionStack from codegen.sdk.core.autocommit import reader from codegen.sdk.core.dataclasses.usage import UsageKind -from codegen.sdk.core.expressions.chained_attribute import ChainedAttribute -from codegen.sdk.core.expressions.name import Name from codegen.sdk.core.interfaces.has_name import HasName -from codegen.sdk.core.node_id_factory import NodeId from codegen.sdk.core.symbol_groups.collection import Collection from codegen.sdk.enums import EdgeType if TYPE_CHECKING: + from collections.abc import Iterator + + from tree_sitter import Node as TSNode + + from codegen.sdk.codebase.codebase_graph import CodebaseGraph + from codegen.sdk.codebase.resolution_stack import ResolutionStack + from codegen.sdk.core.expressions.chained_attribute import ChainedAttribute + from codegen.sdk.core.expressions.name import Name from codegen.sdk.core.expressions.type import Type from codegen.sdk.core.interfaces.inherits import Inherits + from codegen.sdk.core.node_id_factory import NodeId TType = TypeVar("TType", bound="Type") diff --git a/src/codegen/sdk/core/symbol_groups/type_parameters.py b/src/codegen/sdk/core/symbol_groups/type_parameters.py index 6d3079576..1061658ac 100644 --- a/src/codegen/sdk/core/symbol_groups/type_parameters.py +++ b/src/codegen/sdk/core/symbol_groups/type_parameters.py @@ -2,15 +2,15 @@ from typing import TYPE_CHECKING, Generic, TypeVar -from tree_sitter import Node as TSNode - -from codegen.sdk.codebase.codebase_graph import CodebaseGraph -from codegen.sdk.core.node_id_factory import NodeId from codegen.sdk.core.symbol_groups.collection import Collection if TYPE_CHECKING: + from tree_sitter import Node as TSNode + + from codegen.sdk.codebase.codebase_graph import CodebaseGraph from codegen.sdk.core.expressions.type import Type from codegen.sdk.core.interfaces.supports_generic import SupportsGenerics + from codegen.sdk.core.node_id_factory import NodeId TType = TypeVar("TType", bound="Type") diff --git a/src/codegen/sdk/core/type_alias.py b/src/codegen/sdk/core/type_alias.py index 4f494d679..7a74ab9db 100644 --- a/src/codegen/sdk/core/type_alias.py +++ b/src/codegen/sdk/core/type_alias.py @@ -3,23 +3,23 @@ from abc import abstractmethod from typing import TYPE_CHECKING, Generic, TypeVar, override -from tree_sitter import Node as TSNode - from codegen.sdk.core.autocommit import reader -from codegen.sdk.core.detached_symbols.code_block import CodeBlock from codegen.sdk.core.interfaces.has_attribute import HasAttribute from codegen.sdk.core.interfaces.has_block import HasBlock from codegen.sdk.core.interfaces.has_value import HasValue -from codegen.sdk.core.interfaces.importable import Importable from codegen.sdk.core.interfaces.supports_generic import SupportsGenerics -from codegen.sdk.core.node_id_factory import NodeId -from codegen.sdk.core.statements.attribute import Attribute -from codegen.sdk.core.statements.statement import Statement from codegen.sdk.enums import SymbolType from codegen.shared.decorators.docs import apidoc, noapidoc if TYPE_CHECKING: + from tree_sitter import Node as TSNode + from codegen.sdk.codebase.codebase_graph import CodebaseGraph + from codegen.sdk.core.detached_symbols.code_block import CodeBlock + from codegen.sdk.core.interfaces.importable import Importable + from codegen.sdk.core.node_id_factory import NodeId + from codegen.sdk.core.statements.attribute import Attribute + from codegen.sdk.core.statements.statement import Statement TCodeBlock = TypeVar("TCodeBlock", bound="CodeBlock") diff --git a/src/codegen/sdk/python/assignment.py b/src/codegen/sdk/python/assignment.py index 80f6a3fe8..9dfa593e4 100644 --- a/src/codegen/sdk/python/assignment.py +++ b/src/codegen/sdk/python/assignment.py @@ -2,18 +2,18 @@ from typing import TYPE_CHECKING -from tree_sitter import Node as TSNode - -from codegen.sdk.codebase.codebase_graph import CodebaseGraph from codegen.sdk.core.assignment import Assignment from codegen.sdk.core.expressions.multi_expression import MultiExpression -from codegen.sdk.core.node_id_factory import NodeId from codegen.sdk.extensions.autocommit import reader from codegen.sdk.python.symbol import PySymbol from codegen.sdk.python.symbol_groups.comment_group import PyCommentGroup from codegen.shared.decorators.docs import noapidoc, py_apidoc if TYPE_CHECKING: + from tree_sitter import Node as TSNode + + from codegen.sdk.codebase.codebase_graph import CodebaseGraph + from codegen.sdk.core.node_id_factory import NodeId from codegen.sdk.python.statements.assignment_statement import PyAssignmentStatement @@ -28,7 +28,8 @@ class PyAssignment(Assignment["PyAssignmentStatement"], PySymbol): @classmethod def from_assignment(cls, ts_node: TSNode, file_node_id: NodeId, G: CodebaseGraph, parent: PyAssignmentStatement) -> MultiExpression[PyAssignmentStatement, PyAssignment]: if ts_node.type not in ["assignment", "augmented_assignment"]: - raise ValueError(f"Unknown assignment type: {ts_node.type}") + msg = f"Unknown assignment type: {ts_node.type}" + raise ValueError(msg) left_node = ts_node.child_by_field_name("left") right_node = ts_node.child_by_field_name("right") @@ -54,7 +55,8 @@ def from_named_expression(cls, ts_node: TSNode, file_node_id: NodeId, G: Codebas ValueError: If the provided ts_node is not of type 'named_expression'. """ if ts_node.type != "named_expression": - raise ValueError(f"Unknown assignment type: {ts_node.type}") + msg = f"Unknown assignment type: {ts_node.type}" + raise ValueError(msg) left_node = ts_node.child_by_field_name("name") right_node = ts_node.child_by_field_name("value") diff --git a/src/codegen/sdk/python/class_definition.py b/src/codegen/sdk/python/class_definition.py index 135b1674c..f9648f8ab 100644 --- a/src/codegen/sdk/python/class_definition.py +++ b/src/codegen/sdk/python/class_definition.py @@ -94,7 +94,8 @@ def add_source(self, source: str) -> None: """ class_body = self.child_by_field_name("body") if class_body is None: - raise ValueError("Could not find class body") + msg = "Could not find class body" + raise ValueError(msg) # Mimic previous behaviour source = source if source.startswith("\n") else " " + source # TODO: use real fix_indentation behaviour diff --git a/src/codegen/sdk/python/detached_symbols/code_block.py b/src/codegen/sdk/python/detached_symbols/code_block.py index ba40209f9..4f09d2ad9 100644 --- a/src/codegen/sdk/python/detached_symbols/code_block.py +++ b/src/codegen/sdk/python/detached_symbols/code_block.py @@ -11,6 +11,7 @@ from codegen.shared.decorators.docs import noapidoc, py_apidoc if TYPE_CHECKING: + from codegen.sdk.python.assignment import PyAssignment from codegen.sdk.python.interfaces.has_block import PyHasBlock from codegen.sdk.python.statements.with_statement import WithStatement diff --git a/src/codegen/sdk/python/detached_symbols/decorator.py b/src/codegen/sdk/python/detached_symbols/decorator.py index 14ba24631..e56902edc 100644 --- a/src/codegen/sdk/python/detached_symbols/decorator.py +++ b/src/codegen/sdk/python/detached_symbols/decorator.py @@ -1,12 +1,19 @@ from __future__ import annotations -from tree_sitter import Node as TSNode +from typing import TYPE_CHECKING from codegen.sdk.core.autocommit import reader from codegen.sdk.core.detached_symbols.decorator import Decorator from codegen.sdk.core.detached_symbols.function_call import FunctionCall from codegen.shared.decorators.docs import py_apidoc +if TYPE_CHECKING: + from tree_sitter import Node as TSNode + + from codegen.sdk.python.class_definition import PyClass + from codegen.sdk.python.detached_symbols.parameter import PyParameter + from codegen.sdk.python.function import PyFunction + @py_apidoc class PyDecorator(Decorator["PyClass", "PyFunction", "PyParameter"]): @@ -32,7 +39,8 @@ def _get_name_node(self) -> TSNode: func = child.child_by_field_name("function") return func - raise ValueError(f"Could not find decorator name within {self.source}") + msg = f"Could not find decorator name within {self.source}" + raise ValueError(msg) @property @reader diff --git a/src/codegen/sdk/python/detached_symbols/parameter.py b/src/codegen/sdk/python/detached_symbols/parameter.py index 1119d4322..7eccd7aae 100644 --- a/src/codegen/sdk/python/detached_symbols/parameter.py +++ b/src/codegen/sdk/python/detached_symbols/parameter.py @@ -1,3 +1,5 @@ +from typing import TYPE_CHECKING + from typing_extensions import deprecated from codegen.sdk.core.autocommit import reader, writer @@ -6,6 +8,9 @@ from codegen.sdk.python.expressions.type import PyType from codegen.shared.decorators.docs import py_apidoc +if TYPE_CHECKING: + from codegen.sdk.python.function import PyFunction + @py_apidoc class PyParameter(Parameter[PyType, Collection["PyParameter", "PyFunction"]]): diff --git a/src/codegen/sdk/python/expressions/chained_attribute.py b/src/codegen/sdk/python/expressions/chained_attribute.py index d44b95ac8..b540ddee0 100644 --- a/src/codegen/sdk/python/expressions/chained_attribute.py +++ b/src/codegen/sdk/python/expressions/chained_attribute.py @@ -1,10 +1,12 @@ -from typing import Generic, TypeVar +from typing import TYPE_CHECKING, Generic, TypeVar from codegen.sdk.core.expressions import Expression, Name from codegen.sdk.core.expressions.chained_attribute import ChainedAttribute -from codegen.sdk.core.interfaces.editable import Editable from codegen.shared.decorators.docs import py_apidoc +if TYPE_CHECKING: + from codegen.sdk.core.interfaces.editable import Editable + Parent = TypeVar("Parent", bound="Editable") diff --git a/src/codegen/sdk/python/expressions/conditional_expression.py b/src/codegen/sdk/python/expressions/conditional_expression.py index 4549688c0..01cd0c73e 100644 --- a/src/codegen/sdk/python/expressions/conditional_expression.py +++ b/src/codegen/sdk/python/expressions/conditional_expression.py @@ -1,9 +1,11 @@ -from typing import TypeVar +from typing import TYPE_CHECKING, TypeVar from codegen.sdk.core.expressions.ternary_expression import TernaryExpression -from codegen.sdk.core.interfaces.editable import Editable from codegen.shared.decorators.docs import py_apidoc +if TYPE_CHECKING: + from codegen.sdk.core.interfaces.editable import Editable + Parent = TypeVar("Parent", bound="Editable") diff --git a/src/codegen/sdk/python/expressions/union_type.py b/src/codegen/sdk/python/expressions/union_type.py index d982d0bf1..d6181989e 100644 --- a/src/codegen/sdk/python/expressions/union_type.py +++ b/src/codegen/sdk/python/expressions/union_type.py @@ -1,8 +1,11 @@ -from typing import Generic, TypeVar +from typing import TYPE_CHECKING, Generic, TypeVar from codegen.sdk.core.expressions.union_type import UnionType from codegen.shared.decorators.docs import py_apidoc +if TYPE_CHECKING: + from codegen.sdk.python.expressions.type import PyType + Parent = TypeVar("Parent") diff --git a/src/codegen/sdk/python/file.py b/src/codegen/sdk/python/file.py index 825e1d279..4a38f4e06 100644 --- a/src/codegen/sdk/python/file.py +++ b/src/codegen/sdk/python/file.py @@ -1,6 +1,7 @@ from __future__ import annotations -from codegen.sdk.codebase.codebase_graph import CodebaseGraph +from typing import TYPE_CHECKING + from codegen.sdk.core.autocommit import commiter, reader, writer from codegen.sdk.core.file import SourceFile from codegen.sdk.core.interface import Interface @@ -15,9 +16,12 @@ from codegen.sdk.python.interfaces.has_block import PyHasBlock from codegen.sdk.python.statements.attribute import PyAttribute from codegen.sdk.python.statements.import_statement import PyImportStatement -from codegen.sdk.python.symbol import PySymbol from codegen.shared.decorators.docs import noapidoc, py_apidoc +if TYPE_CHECKING: + from codegen.sdk.codebase.codebase_graph import CodebaseGraph + from codegen.sdk.python.symbol import PySymbol + @py_apidoc class PyFile(SourceFile[PyImport, PyFunction, PyClass, PyAssignment, Interface[PyCodeBlock, PyAttribute, PyFunction, PyType], PyCodeBlock], PyHasBlock): diff --git a/src/codegen/sdk/python/function.py b/src/codegen/sdk/python/function.py index b4bb47aa6..2c9deb424 100644 --- a/src/codegen/sdk/python/function.py +++ b/src/codegen/sdk/python/function.py @@ -2,18 +2,11 @@ import logging import re -from typing import override +from typing import TYPE_CHECKING, override -from tree_sitter import Node as TSNode - -from codegen.sdk.codebase.codebase_graph import CodebaseGraph from codegen.sdk.core.autocommit import commiter, reader, writer from codegen.sdk.core.dataclasses.usage import UsageKind from codegen.sdk.core.function import Function -from codegen.sdk.core.import_resolution import Import, WildcardImport -from codegen.sdk.core.interfaces.has_name import HasName -from codegen.sdk.core.node_id_factory import NodeId -from codegen.sdk.core.symbol import Symbol from codegen.sdk.core.symbol_groups.collection import Collection from codegen.sdk.extensions.utils import cached_property from codegen.sdk.python.detached_symbols.code_block import PyCodeBlock @@ -25,6 +18,15 @@ from codegen.sdk.python.symbol import PySymbol from codegen.shared.decorators.docs import noapidoc, py_apidoc +if TYPE_CHECKING: + from tree_sitter import Node as TSNode + + from codegen.sdk.codebase.codebase_graph import CodebaseGraph + from codegen.sdk.core.import_resolution import Import, WildcardImport + from codegen.sdk.core.interfaces.has_name import HasName + from codegen.sdk.core.node_id_factory import NodeId + from codegen.sdk.core.symbol import Symbol + logger = logging.getLogger(__name__) diff --git a/src/codegen/sdk/python/import_resolution.py b/src/codegen/sdk/python/import_resolution.py index 1fc1e2f57..070d815d6 100644 --- a/src/codegen/sdk/python/import_resolution.py +++ b/src/codegen/sdk/python/import_resolution.py @@ -3,20 +3,20 @@ import os from typing import TYPE_CHECKING -from tree_sitter import Node as TSNode - -from codegen.sdk.codebase.codebase_graph import CodebaseGraph from codegen.sdk.core.autocommit import reader from codegen.sdk.core.expressions import Name from codegen.sdk.core.import_resolution import ExternalImportResolver, Import, ImportResolution -from codegen.sdk.core.interfaces.editable import Editable -from codegen.sdk.core.interfaces.exportable import Exportable -from codegen.sdk.core.node_id_factory import NodeId -from codegen.sdk.core.statements.import_statement import ImportStatement from codegen.sdk.enums import ImportType, NodeType from codegen.shared.decorators.docs import noapidoc, py_apidoc if TYPE_CHECKING: + from tree_sitter import Node as TSNode + + from codegen.sdk.codebase.codebase_graph import CodebaseGraph + from codegen.sdk.core.interfaces.editable import Editable + from codegen.sdk.core.interfaces.exportable import Exportable + from codegen.sdk.core.node_id_factory import NodeId + from codegen.sdk.core.statements.import_statement import ImportStatement from codegen.sdk.python.file import PyFile import logging @@ -202,7 +202,8 @@ def from_import_from_statement(cls, import_statement: TSNode, file_node_id: Node if len(import_symbols) == 0: wildcard_import = next((node for node in import_statement.children if node.type == "wildcard_import"), None) if wildcard_import is None: - raise ValueError(f"Unsupported import statement: {import_statement.text.decode('utf-8')}") + msg = f"Unsupported import statement: {import_statement.text.decode('utf-8')}" + raise ValueError(msg) return [cls(import_statement, file_node_id, G, parent, module_node=module_node, name_node=module_node, alias_node=module_node, import_type=ImportType.WILDCARD)] imports = [] @@ -214,7 +215,8 @@ def from_import_from_statement(cls, import_statement: TSNode, file_node_id: Node alias = import_symbol.child_by_field_name("alias") imp = cls(import_statement, file_node_id, G, parent, module_node=module_node, name_node=symbol_name, alias_node=alias, import_type=ImportType.NAMED_EXPORT) else: - raise ValueError(f"Unsupported import statement: {import_statement.text.decode('utf-8')}") + msg = f"Unsupported import statement: {import_statement.text.decode('utf-8')}" + raise ValueError(msg) imports.append(imp) return imports diff --git a/src/codegen/sdk/python/placeholder/placeholder_return_type.py b/src/codegen/sdk/python/placeholder/placeholder_return_type.py index 32f0b241c..7e2c92a3d 100644 --- a/src/codegen/sdk/python/placeholder/placeholder_return_type.py +++ b/src/codegen/sdk/python/placeholder/placeholder_return_type.py @@ -1,9 +1,11 @@ -from typing import Generic, TypeVar +from typing import TYPE_CHECKING, Generic, TypeVar -from codegen.sdk.core.interfaces.editable import Editable from codegen.sdk.core.placeholder.placeholder import Placeholder from codegen.shared.decorators.docs import py_apidoc +if TYPE_CHECKING: + from codegen.sdk.core.interfaces.editable import Editable + Parent = TypeVar("Parent", bound="Editable") diff --git a/src/codegen/sdk/python/statements/assignment_statement.py b/src/codegen/sdk/python/statements/assignment_statement.py index 52373e465..9d18ab657 100644 --- a/src/codegen/sdk/python/statements/assignment_statement.py +++ b/src/codegen/sdk/python/statements/assignment_statement.py @@ -2,17 +2,17 @@ from typing import TYPE_CHECKING -from tree_sitter import Node as TSNode - -from codegen.sdk.codebase.codebase_graph import CodebaseGraph from codegen.sdk.core.expressions.multi_expression import MultiExpression -from codegen.sdk.core.node_id_factory import NodeId from codegen.sdk.core.statements.assignment_statement import AssignmentStatement from codegen.sdk.extensions.utils import find_all_descendants from codegen.sdk.python.assignment import PyAssignment from codegen.shared.decorators.docs import py_apidoc if TYPE_CHECKING: + from tree_sitter import Node as TSNode + + from codegen.sdk.codebase.codebase_graph import CodebaseGraph + from codegen.sdk.core.node_id_factory import NodeId from codegen.sdk.python.detached_symbols.code_block import PyCodeBlock from codegen.sdk.python.interfaces.has_block import PyHasBlock @@ -55,7 +55,8 @@ def from_assignment(cls, ts_node: TSNode, file_node_id: NodeId, G: CodebaseGraph ValueError: If the assignment_node type is not one of the supported assignment types. """ if assignment_node.type not in cls.assignment_types: - raise ValueError(f"Invalid assignment node type: {assignment_node.type}") + msg = f"Invalid assignment node type: {assignment_node.type}" + raise ValueError(msg) from codegen.sdk.python.class_definition import PyClass diff --git a/src/codegen/sdk/python/statements/attribute.py b/src/codegen/sdk/python/statements/attribute.py index 363e92142..f8f24375f 100644 --- a/src/codegen/sdk/python/statements/attribute.py +++ b/src/codegen/sdk/python/statements/attribute.py @@ -13,6 +13,7 @@ if TYPE_CHECKING: from codegen.sdk.python.class_definition import PyClass + from codegen.sdk.python.detached_symbols.code_block import PyCodeBlock @py_apidoc @@ -80,7 +81,8 @@ def is_optional(self) -> bool: Raises: APINotApplicableForLanguageError: Always raised as Python does not have explicit optional attribute syntax. """ - raise APINotApplicableForLanguageError("Python doesn't have an explicit syntax for optional attributes") + msg = "Python doesn't have an explicit syntax for optional attributes" + raise APINotApplicableForLanguageError(msg) @property @reader diff --git a/src/codegen/sdk/python/statements/block_statement.py b/src/codegen/sdk/python/statements/block_statement.py index b8b68b27e..0482fda76 100644 --- a/src/codegen/sdk/python/statements/block_statement.py +++ b/src/codegen/sdk/python/statements/block_statement.py @@ -1,13 +1,15 @@ from __future__ import annotations -from typing import Generic, TypeVar +from typing import TYPE_CHECKING, Generic, TypeVar from codegen.sdk.core.statements.block_statement import BlockStatement from codegen.sdk.extensions.autocommit import reader -from codegen.sdk.python.detached_symbols.code_block import PyCodeBlock from codegen.sdk.python.interfaces.has_block import PyHasBlock from codegen.shared.decorators.docs import py_apidoc +if TYPE_CHECKING: + from codegen.sdk.python.detached_symbols.code_block import PyCodeBlock + Parent = TypeVar("Parent", bound="PyCodeBlock") diff --git a/src/codegen/sdk/python/statements/break_statement.py b/src/codegen/sdk/python/statements/break_statement.py index 8b7a8d9b7..f19b64b3e 100644 --- a/src/codegen/sdk/python/statements/break_statement.py +++ b/src/codegen/sdk/python/statements/break_statement.py @@ -1,13 +1,16 @@ from __future__ import annotations -from typing import override +from typing import TYPE_CHECKING, override -from codegen.sdk.core.dataclasses.usage import UsageKind -from codegen.sdk.core.interfaces.has_name import HasName from codegen.sdk.core.statements.statement import Statement, StatementType from codegen.sdk.extensions.autocommit import commiter from codegen.shared.decorators.docs import noapidoc, py_apidoc +if TYPE_CHECKING: + from codegen.sdk.core.dataclasses.usage import UsageKind + from codegen.sdk.core.interfaces.has_name import HasName + from codegen.sdk.python.detached_symbols.code_block import PyCodeBlock + @py_apidoc class PyBreakStatement(Statement["PyCodeBlock"]): diff --git a/src/codegen/sdk/python/statements/catch_statement.py b/src/codegen/sdk/python/statements/catch_statement.py index 20640d945..2821c4f51 100644 --- a/src/codegen/sdk/python/statements/catch_statement.py +++ b/src/codegen/sdk/python/statements/catch_statement.py @@ -2,16 +2,16 @@ from typing import TYPE_CHECKING -from tree_sitter import Node as PyNode - -from codegen.sdk.core.node_id_factory import NodeId from codegen.sdk.core.statements.catch_statement import CatchStatement from codegen.sdk.python.detached_symbols.code_block import PyCodeBlock from codegen.sdk.python.statements.block_statement import PyBlockStatement from codegen.shared.decorators.docs import py_apidoc if TYPE_CHECKING: + from tree_sitter import Node as PyNode + from codegen.sdk.codebase.codebase_graph import CodebaseGraph + from codegen.sdk.core.node_id_factory import NodeId @py_apidoc diff --git a/src/codegen/sdk/python/statements/for_loop_statement.py b/src/codegen/sdk/python/statements/for_loop_statement.py index e772682b7..cbd212bcd 100644 --- a/src/codegen/sdk/python/statements/for_loop_statement.py +++ b/src/codegen/sdk/python/statements/for_loop_statement.py @@ -2,21 +2,21 @@ from typing import TYPE_CHECKING -from tree_sitter import Node as TSNode - -from codegen.sdk.core.dataclasses.usage import UsageKind -from codegen.sdk.core.detached_symbols.function_call import FunctionCall -from codegen.sdk.core.expressions import Expression -from codegen.sdk.core.interfaces.has_name import HasName -from codegen.sdk.core.interfaces.importable import Importable -from codegen.sdk.core.node_id_factory import NodeId from codegen.sdk.core.statements.for_loop_statement import ForLoopStatement from codegen.sdk.extensions.autocommit import commiter, reader from codegen.sdk.python.statements.block_statement import PyBlockStatement from codegen.shared.decorators.docs import noapidoc, py_apidoc if TYPE_CHECKING: + from tree_sitter import Node as TSNode + from codegen.sdk.codebase.codebase_graph import CodebaseGraph + from codegen.sdk.core.dataclasses.usage import UsageKind + from codegen.sdk.core.detached_symbols.function_call import FunctionCall + from codegen.sdk.core.expressions import Expression + from codegen.sdk.core.interfaces.has_name import HasName + from codegen.sdk.core.interfaces.importable import Importable + from codegen.sdk.core.node_id_factory import NodeId from codegen.sdk.python.detached_symbols.code_block import PyCodeBlock diff --git a/src/codegen/sdk/python/statements/if_block_statement.py b/src/codegen/sdk/python/statements/if_block_statement.py index 298896ccd..c0f8a4c09 100644 --- a/src/codegen/sdk/python/statements/if_block_statement.py +++ b/src/codegen/sdk/python/statements/if_block_statement.py @@ -2,16 +2,16 @@ from typing import TYPE_CHECKING, Generic, TypeVar -from tree_sitter import Node as TSNode - -from codegen.sdk.codebase.codebase_graph import CodebaseGraph from codegen.sdk.core.autocommit import reader, writer -from codegen.sdk.core.node_id_factory import NodeId from codegen.sdk.core.statements.if_block_statement import IfBlockStatement from codegen.sdk.core.statements.statement import StatementType from codegen.shared.decorators.docs import apidoc if TYPE_CHECKING: + from tree_sitter import Node as TSNode + + from codegen.sdk.codebase.codebase_graph import CodebaseGraph + from codegen.sdk.core.node_id_factory import NodeId from codegen.sdk.python.detached_symbols.code_block import PyCodeBlock diff --git a/src/codegen/sdk/python/statements/import_statement.py b/src/codegen/sdk/python/statements/import_statement.py index ae353a138..81473009e 100644 --- a/src/codegen/sdk/python/statements/import_statement.py +++ b/src/codegen/sdk/python/statements/import_statement.py @@ -1,15 +1,20 @@ from __future__ import annotations -from tree_sitter import Node as TSNode +from typing import TYPE_CHECKING -from codegen.sdk.codebase.codebase_graph import CodebaseGraph -from codegen.sdk.core.node_id_factory import NodeId from codegen.sdk.core.statements.import_statement import ImportStatement from codegen.sdk.core.symbol_groups.collection import Collection from codegen.sdk.python.detached_symbols.code_block import PyCodeBlock from codegen.sdk.python.import_resolution import PyImport from codegen.shared.decorators.docs import py_apidoc +if TYPE_CHECKING: + from tree_sitter import Node as TSNode + + from codegen.sdk.codebase.codebase_graph import CodebaseGraph + from codegen.sdk.core.node_id_factory import NodeId + from codegen.sdk.python.file import PyFile + @py_apidoc class PyImportStatement(ImportStatement["PyFile", PyImport, PyCodeBlock]): diff --git a/src/codegen/sdk/python/statements/match_case.py b/src/codegen/sdk/python/statements/match_case.py index 2e84150cd..978e1a386 100644 --- a/src/codegen/sdk/python/statements/match_case.py +++ b/src/codegen/sdk/python/statements/match_case.py @@ -10,6 +10,7 @@ if TYPE_CHECKING: from codegen.sdk.codebase.codebase_graph import CodebaseGraph + from codegen.sdk.python.statements.match_statement import PyMatchStatement @py_apidoc diff --git a/src/codegen/sdk/python/statements/match_statement.py b/src/codegen/sdk/python/statements/match_statement.py index 8dfee7284..520a6fb06 100644 --- a/src/codegen/sdk/python/statements/match_statement.py +++ b/src/codegen/sdk/python/statements/match_statement.py @@ -2,16 +2,16 @@ from typing import TYPE_CHECKING -from tree_sitter import Node as PyNode - -from codegen.sdk.core.node_id_factory import NodeId from codegen.sdk.core.statements.switch_statement import SwitchStatement -from codegen.sdk.python.detached_symbols.code_block import PyCodeBlock from codegen.sdk.python.statements.match_case import PyMatchCase from codegen.shared.decorators.docs import py_apidoc if TYPE_CHECKING: + from tree_sitter import Node as PyNode + from codegen.sdk.codebase.codebase_graph import CodebaseGraph + from codegen.sdk.core.node_id_factory import NodeId + from codegen.sdk.python.detached_symbols.code_block import PyCodeBlock @py_apidoc diff --git a/src/codegen/sdk/python/statements/pass_statement.py b/src/codegen/sdk/python/statements/pass_statement.py index 2bf6833d0..fb73d2758 100644 --- a/src/codegen/sdk/python/statements/pass_statement.py +++ b/src/codegen/sdk/python/statements/pass_statement.py @@ -1,13 +1,16 @@ from __future__ import annotations -from typing import override +from typing import TYPE_CHECKING, override -from codegen.sdk.core.dataclasses.usage import UsageKind -from codegen.sdk.core.interfaces.has_name import HasName from codegen.sdk.core.statements.statement import Statement, StatementType from codegen.sdk.extensions.autocommit import commiter from codegen.shared.decorators.docs import noapidoc, py_apidoc +if TYPE_CHECKING: + from codegen.sdk.core.dataclasses.usage import UsageKind + from codegen.sdk.core.interfaces.has_name import HasName + from codegen.sdk.python.detached_symbols.code_block import PyCodeBlock + @py_apidoc class PyPassStatement(Statement["PyCodeBlock"]): diff --git a/src/codegen/sdk/python/statements/try_catch_statement.py b/src/codegen/sdk/python/statements/try_catch_statement.py index e873725ed..06e1f5863 100644 --- a/src/codegen/sdk/python/statements/try_catch_statement.py +++ b/src/codegen/sdk/python/statements/try_catch_statement.py @@ -2,22 +2,22 @@ from typing import TYPE_CHECKING, Self, override -from tree_sitter import Node as PyNode - -from codegen.sdk.core.dataclasses.usage import UsageKind -from codegen.sdk.core.detached_symbols.function_call import FunctionCall -from codegen.sdk.core.interfaces.has_name import HasName -from codegen.sdk.core.node_id_factory import NodeId from codegen.sdk.core.statements.try_catch_statement import TryCatchStatement from codegen.sdk.extensions.autocommit import commiter, reader -from codegen.sdk.python.detached_symbols.code_block import PyCodeBlock from codegen.sdk.python.statements.block_statement import PyBlockStatement from codegen.sdk.python.statements.catch_statement import PyCatchStatement from codegen.shared.decorators.docs import noapidoc, py_apidoc if TYPE_CHECKING: + from tree_sitter import Node as PyNode + from codegen.sdk.codebase.codebase_graph import CodebaseGraph + from codegen.sdk.core.dataclasses.usage import UsageKind + from codegen.sdk.core.detached_symbols.function_call import FunctionCall + from codegen.sdk.core.interfaces.has_name import HasName from codegen.sdk.core.interfaces.importable import Importable + from codegen.sdk.core.node_id_factory import NodeId + from codegen.sdk.python.detached_symbols.code_block import PyCodeBlock @py_apidoc diff --git a/src/codegen/sdk/python/statements/while_statement.py b/src/codegen/sdk/python/statements/while_statement.py index ed6636d21..9182f5e52 100644 --- a/src/codegen/sdk/python/statements/while_statement.py +++ b/src/codegen/sdk/python/statements/while_statement.py @@ -2,13 +2,6 @@ from typing import TYPE_CHECKING -from tree_sitter import Node as TSNode - -from codegen.sdk.core.dataclasses.usage import UsageKind -from codegen.sdk.core.detached_symbols.function_call import FunctionCall -from codegen.sdk.core.interfaces.has_name import HasName -from codegen.sdk.core.interfaces.importable import Importable -from codegen.sdk.core.node_id_factory import NodeId from codegen.sdk.core.statements.while_statement import WhileStatement from codegen.sdk.extensions.autocommit import commiter, reader from codegen.sdk.extensions.sort import sort_editables @@ -17,7 +10,14 @@ from codegen.shared.decorators.docs import noapidoc, py_apidoc if TYPE_CHECKING: + from tree_sitter import Node as TSNode + from codegen.sdk.codebase.codebase_graph import CodebaseGraph + from codegen.sdk.core.dataclasses.usage import UsageKind + from codegen.sdk.core.detached_symbols.function_call import FunctionCall + from codegen.sdk.core.interfaces.has_name import HasName + from codegen.sdk.core.interfaces.importable import Importable + from codegen.sdk.core.node_id_factory import NodeId from codegen.sdk.python.detached_symbols.code_block import PyCodeBlock diff --git a/src/codegen/sdk/python/statements/with_statement.py b/src/codegen/sdk/python/statements/with_statement.py index 16b3545f6..3f8954c00 100644 --- a/src/codegen/sdk/python/statements/with_statement.py +++ b/src/codegen/sdk/python/statements/with_statement.py @@ -3,13 +3,7 @@ from functools import cached_property from typing import TYPE_CHECKING -from tree_sitter import Node as TSNode - from codegen.sdk.core.autocommit import reader -from codegen.sdk.core.dataclasses.usage import UsageKind -from codegen.sdk.core.detached_symbols.function_call import FunctionCall -from codegen.sdk.core.interfaces.has_name import HasName -from codegen.sdk.core.node_id_factory import NodeId from codegen.sdk.core.statements.statement import Statement, StatementType from codegen.sdk.core.symbol_groups.expression_group import ExpressionGroup from codegen.sdk.extensions.autocommit import commiter @@ -18,7 +12,13 @@ from codegen.shared.decorators.docs import apidoc, noapidoc if TYPE_CHECKING: + from tree_sitter import Node as TSNode + from codegen.sdk.codebase.codebase_graph import CodebaseGraph + from codegen.sdk.core.dataclasses.usage import UsageKind + from codegen.sdk.core.detached_symbols.function_call import FunctionCall + from codegen.sdk.core.interfaces.has_name import HasName + from codegen.sdk.core.node_id_factory import NodeId from codegen.sdk.python.detached_symbols.code_block import PyCodeBlock diff --git a/src/codegen/sdk/python/symbol.py b/src/codegen/sdk/python/symbol.py index 815c0e201..d173b6cf9 100644 --- a/src/codegen/sdk/python/symbol.py +++ b/src/codegen/sdk/python/symbol.py @@ -1,17 +1,23 @@ from __future__ import annotations -from tree_sitter import Node as TSNode +from typing import TYPE_CHECKING -from codegen.sdk.codebase.codebase_graph import CodebaseGraph from codegen.sdk.core.autocommit import reader, writer -from codegen.sdk.core.interfaces.has_block import HasBlock -from codegen.sdk.core.node_id_factory import NodeId from codegen.sdk.core.symbol import Symbol from codegen.sdk.enums import ImportType from codegen.sdk.python.statements.comment import PyComment, PyCommentType from codegen.sdk.python.symbol_groups.comment_group import PyCommentGroup from codegen.shared.decorators.docs import noapidoc, py_apidoc +if TYPE_CHECKING: + from tree_sitter import Node as TSNode + + from codegen.sdk.codebase.codebase_graph import CodebaseGraph + from codegen.sdk.core.interfaces.has_block import HasBlock + from codegen.sdk.core.node_id_factory import NodeId + from codegen.sdk.python.detached_symbols.code_block import PyCodeBlock + from codegen.sdk.python.interfaces.has_block import PyHasBlock + @py_apidoc class PySymbol(Symbol["PyHasBlock", "PyCodeBlock"]): diff --git a/src/codegen/sdk/python/symbol_groups/comment_group.py b/src/codegen/sdk/python/symbol_groups/comment_group.py index 42f5191c3..701445fab 100644 --- a/src/codegen/sdk/python/symbol_groups/comment_group.py +++ b/src/codegen/sdk/python/symbol_groups/comment_group.py @@ -4,7 +4,6 @@ from typing import TYPE_CHECKING from docstring_parser import Docstring, DocstringStyle, parse -from tree_sitter import Node as TSNode from codegen.sdk.core.autocommit import reader from codegen.sdk.core.statements.statement import StatementType @@ -14,6 +13,8 @@ from codegen.shared.decorators.docs import noapidoc, py_apidoc if TYPE_CHECKING: + from tree_sitter import Node as TSNode + from codegen.sdk.python.function import PyFunction from codegen.sdk.python.symbol import PySymbol diff --git a/src/codegen/sdk/typescript/assignment.py b/src/codegen/sdk/typescript/assignment.py index 424dafd24..b9a3ec6a1 100644 --- a/src/codegen/sdk/typescript/assignment.py +++ b/src/codegen/sdk/typescript/assignment.py @@ -2,17 +2,18 @@ from typing import TYPE_CHECKING -from tree_sitter import Node as TSNode - -from codegen.sdk.codebase.codebase_graph import CodebaseGraph from codegen.sdk.core.assignment import Assignment from codegen.sdk.core.autocommit import writer from codegen.sdk.core.expressions.multi_expression import MultiExpression -from codegen.sdk.core.node_id_factory import NodeId from codegen.sdk.typescript.symbol import TSSymbol from codegen.shared.decorators.docs import noapidoc, ts_apidoc if TYPE_CHECKING: + from tree_sitter import Node as TSNode + + from codegen.sdk.codebase.codebase_graph import CodebaseGraph + from codegen.sdk.core.node_id_factory import NodeId + from codegen.sdk.core.statements.export_statement import ExportStatement from codegen.sdk.typescript.statements.assignment_statement import TSAssignmentStatement @@ -34,7 +35,8 @@ class TSAssignment(Assignment["TSAssignmentStatement | ExportStatement"], TSSymb @classmethod def from_assignment(cls, ts_node: TSNode, file_node_id: NodeId, G: CodebaseGraph, parent: TSAssignmentStatement) -> MultiExpression[TSAssignmentStatement, TSAssignment]: if ts_node.type not in ["assignment_expression", "augmented_assignment_expression"]: - raise ValueError(f"Unknown assignment type: {ts_node.type}") + msg = f"Unknown assignment type: {ts_node.type}" + raise ValueError(msg) left_node = ts_node.child_by_field_name("left") right_node = ts_node.child_by_field_name("right") @@ -60,7 +62,8 @@ def from_named_expression(cls, ts_node: TSNode, file_node_id: NodeId, G: Codebas ValueError: If the node type is not one of: "variable_declarator", "public_field_definition", or "property_signature". """ if ts_node.type not in ["variable_declarator", "public_field_definition", "property_signature"]: - raise ValueError(f"Unknown assignment type: {ts_node.type}") + msg = f"Unknown assignment type: {ts_node.type}" + raise ValueError(msg) left_node = ts_node.child_by_field_name("name") right_node = ts_node.child_by_field_name("value") diff --git a/src/codegen/sdk/typescript/class_definition.py b/src/codegen/sdk/typescript/class_definition.py index c53404c52..f5cdcb6ff 100644 --- a/src/codegen/sdk/typescript/class_definition.py +++ b/src/codegen/sdk/typescript/class_definition.py @@ -1,11 +1,8 @@ from __future__ import annotations import os -from typing import Self +from typing import TYPE_CHECKING, Self -from tree_sitter import Node as TSNode - -from codegen.sdk.codebase.codebase_graph import CodebaseGraph from codegen.sdk.core.autocommit import commiter, reader, writer from codegen.sdk.core.class_definition import Class from codegen.sdk.core.dataclasses.usage import UsageKind @@ -13,8 +10,6 @@ from codegen.sdk.core.expressions.placeholder_type import PlaceholderType from codegen.sdk.core.external_module import ExternalModule from codegen.sdk.core.interfaces.has_name import HasName -from codegen.sdk.core.node_id_factory import NodeId -from codegen.sdk.core.statements.symbol_statement import SymbolStatement from codegen.sdk.core.symbol_group import SymbolGroup from codegen.sdk.core.symbol_groups.multi_line_collection import MultiLineCollection from codegen.sdk.core.symbol_groups.parents import Parents @@ -26,6 +21,14 @@ from codegen.sdk.typescript.symbol import TSSymbol from codegen.shared.decorators.docs import noapidoc, ts_apidoc +if TYPE_CHECKING: + from tree_sitter import Node as TSNode + + from codegen.sdk.codebase.codebase_graph import CodebaseGraph + from codegen.sdk.core.node_id_factory import NodeId + from codegen.sdk.core.statements.symbol_statement import SymbolStatement + from codegen.sdk.typescript.detached_symbols.code_block import TSCodeBlock + @ts_apidoc class TSClass(Class[TSFunction, TSDecorator, "TSCodeBlock", TSParameter, TSType], TSHasBlock, TSSymbol): @@ -141,7 +144,8 @@ def add_source(self, source: str) -> None: Returns: None """ - raise NotImplementedError("TODO") + msg = "TODO" + raise NotImplementedError(msg) @writer def add_attribute_from_source(self, source: str) -> None: diff --git a/src/codegen/sdk/typescript/detached_symbols/code_block.py b/src/codegen/sdk/typescript/detached_symbols/code_block.py index 79872150a..c69d73f73 100644 --- a/src/codegen/sdk/typescript/detached_symbols/code_block.py +++ b/src/codegen/sdk/typescript/detached_symbols/code_block.py @@ -9,6 +9,7 @@ from codegen.shared.decorators.docs import noapidoc, ts_apidoc if TYPE_CHECKING: + from codegen.sdk.typescript.assignment import TSAssignment from codegen.sdk.typescript.interfaces.has_block import TSHasBlock diff --git a/src/codegen/sdk/typescript/detached_symbols/decorator.py b/src/codegen/sdk/typescript/detached_symbols/decorator.py index d4d5ae901..e06da867e 100644 --- a/src/codegen/sdk/typescript/detached_symbols/decorator.py +++ b/src/codegen/sdk/typescript/detached_symbols/decorator.py @@ -1,15 +1,22 @@ from __future__ import annotations -from tree_sitter import Node as TSNode +from typing import TYPE_CHECKING from codegen.sdk.core.autocommit import reader from codegen.sdk.core.detached_symbols.decorator import Decorator from codegen.sdk.core.detached_symbols.function_call import FunctionCall from codegen.shared.decorators.docs import ts_apidoc +if TYPE_CHECKING: + from tree_sitter import Node as TSNode + + from codegen.sdk.typescript.class_definition import TSClass + from codegen.sdk.typescript.detached_symbols.parameter import TSParameter + from codegen.sdk.typescript.function import TSFunction + @ts_apidoc -class TSDecorator(Decorator["JSClass", "TSFunction", "TsParameter"]): +class TSDecorator(Decorator["TSClass", "TSFunction", "TSParameter"]): """Abstract representation of a Decorator""" @reader @@ -32,7 +39,8 @@ def _get_name_node(self) -> TSNode: func = child.child_by_field_name("function") return func - raise ValueError(f"Could not find decorator name within {self.source}") + msg = f"Could not find decorator name within {self.source}" + raise ValueError(msg) @property @reader diff --git a/src/codegen/sdk/typescript/detached_symbols/jsx/element.py b/src/codegen/sdk/typescript/detached_symbols/jsx/element.py index 55e64a597..407e9f47b 100644 --- a/src/codegen/sdk/typescript/detached_symbols/jsx/element.py +++ b/src/codegen/sdk/typescript/detached_symbols/jsx/element.py @@ -1,24 +1,26 @@ from __future__ import annotations from functools import cached_property -from typing import Generic, TypeVar, override +from typing import TYPE_CHECKING, Generic, TypeVar, override -from tree_sitter import Node as TSNode - -from codegen.sdk.codebase.codebase_graph import CodebaseGraph from codegen.sdk.core.autocommit import reader, writer -from codegen.sdk.core.dataclasses.usage import UsageKind from codegen.sdk.core.expressions import Expression, Value from codegen.sdk.core.expressions.name import Name -from codegen.sdk.core.interfaces.editable import Editable from codegen.sdk.core.interfaces.has_name import HasName -from codegen.sdk.core.node_id_factory import NodeId from codegen.sdk.extensions.autocommit import commiter -from codegen.sdk.typescript.detached_symbols.jsx.expression import JSXExpression from codegen.sdk.typescript.detached_symbols.jsx.prop import JSXProp from codegen.sdk.utils import find_all_descendants from codegen.shared.decorators.docs import noapidoc, ts_apidoc +if TYPE_CHECKING: + from tree_sitter import Node as TSNode + + from codegen.sdk.codebase.codebase_graph import CodebaseGraph + from codegen.sdk.core.dataclasses.usage import UsageKind + from codegen.sdk.core.interfaces.editable import Editable + from codegen.sdk.core.node_id_factory import NodeId + from codegen.sdk.typescript.detached_symbols.jsx.expression import JSXExpression + Parent = TypeVar("Parent", bound="Editable") diff --git a/src/codegen/sdk/typescript/detached_symbols/jsx/expression.py b/src/codegen/sdk/typescript/detached_symbols/jsx/expression.py index 11b0bcfa3..833e1ec77 100644 --- a/src/codegen/sdk/typescript/detached_symbols/jsx/expression.py +++ b/src/codegen/sdk/typescript/detached_symbols/jsx/expression.py @@ -1,5 +1,5 @@ from functools import cached_property -from typing import Self, override +from typing import TYPE_CHECKING, Self, override from codegen.sdk.core.autocommit import reader, writer from codegen.sdk.core.dataclasses.usage import UsageKind @@ -10,6 +10,11 @@ from codegen.sdk.extensions.autocommit import commiter from codegen.shared.decorators.docs import noapidoc, ts_apidoc +if TYPE_CHECKING: + from codegen.sdk.core.function import Function + from codegen.sdk.typescript.detached_symbols.jsx.element import JSXElement + from codegen.sdk.typescript.detached_symbols.jsx.prop import JSXProp + @ts_apidoc class JSXExpression(Unwrappable["Function | JSXElement | JSXProp"]): diff --git a/src/codegen/sdk/typescript/detached_symbols/parameter.py b/src/codegen/sdk/typescript/detached_symbols/parameter.py index fb18fc944..3a3a67dae 100644 --- a/src/codegen/sdk/typescript/detached_symbols/parameter.py +++ b/src/codegen/sdk/typescript/detached_symbols/parameter.py @@ -2,15 +2,11 @@ from typing import TYPE_CHECKING, override -from tree_sitter import Node as TSNode - from codegen.sdk.core.autocommit import reader from codegen.sdk.core.autocommit.decorators import writer from codegen.sdk.core.dataclasses.usage import UsageKind from codegen.sdk.core.detached_symbols.parameter import Parameter from codegen.sdk.core.expressions.union_type import UnionType -from codegen.sdk.core.interfaces.has_name import HasName -from codegen.sdk.core.placeholder.placeholder import Placeholder from codegen.sdk.core.symbol_groups.collection import Collection from codegen.sdk.extensions.autocommit import commiter from codegen.sdk.typescript.expressions.object_type import TSObjectType @@ -19,6 +15,10 @@ from codegen.shared.decorators.docs import noapidoc, ts_apidoc if TYPE_CHECKING: + from tree_sitter import Node as TSNode + + from codegen.sdk.core.interfaces.has_name import HasName + from codegen.sdk.core.placeholder.placeholder import Placeholder from codegen.sdk.typescript.function import TSFunction diff --git a/src/codegen/sdk/typescript/enum_definition.py b/src/codegen/sdk/typescript/enum_definition.py index dd27f5b11..51c853170 100644 --- a/src/codegen/sdk/typescript/enum_definition.py +++ b/src/codegen/sdk/typescript/enum_definition.py @@ -2,18 +2,9 @@ from typing import TYPE_CHECKING, Self, TypeVar, override -from tree_sitter import Node as TSNode - -from codegen.sdk.codebase.codebase_graph import CodebaseGraph from codegen.sdk.core.autocommit import commiter, reader from codegen.sdk.core.dataclasses.usage import UsageKind -from codegen.sdk.core.detached_symbols.code_block import CodeBlock -from codegen.sdk.core.expressions import Expression from codegen.sdk.core.interfaces.has_attribute import HasAttribute -from codegen.sdk.core.interfaces.has_name import HasName -from codegen.sdk.core.interfaces.importable import Importable -from codegen.sdk.core.node_id_factory import NodeId -from codegen.sdk.core.statements.statement import Statement from codegen.sdk.enums import SymbolType from codegen.sdk.typescript.interfaces.has_block import TSHasBlock from codegen.sdk.typescript.statements.attribute import TSAttribute @@ -21,6 +12,15 @@ from codegen.shared.decorators.docs import noapidoc, ts_apidoc if TYPE_CHECKING: + from tree_sitter import Node as TSNode + + from codegen.sdk.codebase.codebase_graph import CodebaseGraph + from codegen.sdk.core.detached_symbols.code_block import CodeBlock + from codegen.sdk.core.expressions import Expression + from codegen.sdk.core.interfaces.has_name import HasName + from codegen.sdk.core.interfaces.importable import Importable + from codegen.sdk.core.node_id_factory import NodeId + from codegen.sdk.core.statements.statement import Statement from codegen.sdk.typescript.detached_symbols.code_block import TSCodeBlock Parent = TypeVar("Parent", bound="TSHasBlock") diff --git a/src/codegen/sdk/typescript/export.py b/src/codegen/sdk/typescript/export.py index bc0a85bc2..24967852b 100644 --- a/src/codegen/sdk/typescript/export.py +++ b/src/codegen/sdk/typescript/export.py @@ -1,12 +1,7 @@ from __future__ import annotations -from collections.abc import Generator from typing import TYPE_CHECKING, Generic, Literal, Self, TypeVar, override -from tree_sitter import Node as TSNode - -from codegen.sdk.codebase.codebase_graph import CodebaseGraph -from codegen.sdk.codebase.resolution_stack import ResolutionStack from codegen.sdk.core.autocommit import commiter, reader from codegen.sdk.core.autocommit.decorators import writer from codegen.sdk.core.dataclasses.usage import UsageKind, UsageType @@ -15,12 +10,8 @@ from codegen.sdk.core.external_module import ExternalModule from codegen.sdk.core.import_resolution import Import from codegen.sdk.core.interfaces.chainable import Chainable -from codegen.sdk.core.interfaces.exportable import Exportable -from codegen.sdk.core.interfaces.has_name import HasName from codegen.sdk.core.interfaces.has_value import HasValue from codegen.sdk.core.interfaces.importable import Importable -from codegen.sdk.core.node_id_factory import NodeId -from codegen.sdk.core.symbol_groups.collection import Collection from codegen.sdk.enums import EdgeType, ImportType, NodeType from codegen.sdk.extensions.utils import cached_property from codegen.sdk.typescript.assignment import TSAssignment @@ -32,13 +23,23 @@ from codegen.sdk.typescript.interface import TSInterface from codegen.sdk.typescript.namespace import TSNamespace from codegen.sdk.typescript.statements.assignment_statement import TSAssignmentStatement -from codegen.sdk.typescript.symbol import TSSymbol from codegen.sdk.typescript.type_alias import TSTypeAlias from codegen.sdk.utils import find_all_descendants from codegen.shared.decorators.docs import noapidoc, ts_apidoc if TYPE_CHECKING: + from collections.abc import Generator + + from tree_sitter import Node as TSNode + + from codegen.sdk.codebase.codebase_graph import CodebaseGraph + from codegen.sdk.codebase.resolution_stack import ResolutionStack + from codegen.sdk.core.interfaces.exportable import Exportable + from codegen.sdk.core.interfaces.has_name import HasName + from codegen.sdk.core.node_id_factory import NodeId from codegen.sdk.core.statements.export_statement import ExportStatement + from codegen.sdk.core.symbol_groups.collection import Collection + from codegen.sdk.typescript.symbol import TSSymbol @ts_apidoc @@ -63,7 +64,8 @@ def __init__( ) -> None: """Given an `export_statement` tree sitter node, parses all implicit export symbols.""" if declared_symbol and exported_symbol and declared_symbol.name != exported_symbol.text.decode("utf-8"): - raise ValueError("The exported symbol name must match the declared symbol name") + msg = "The exported symbol name must match the declared symbol name" + raise ValueError(msg) super().__init__(ts_node, file_node_id, G, parent) self._name_node = self._parse_expression(name_node, default=Name) diff --git a/src/codegen/sdk/typescript/expressions/chained_attribute.py b/src/codegen/sdk/typescript/expressions/chained_attribute.py index cd74f5437..5277ceb20 100644 --- a/src/codegen/sdk/typescript/expressions/chained_attribute.py +++ b/src/codegen/sdk/typescript/expressions/chained_attribute.py @@ -1,12 +1,14 @@ -from typing import Generic, TypeVar +from typing import TYPE_CHECKING, Generic, TypeVar from codegen.sdk.core.detached_symbols.function_call import FunctionCall from codegen.sdk.core.expressions import Expression, Name from codegen.sdk.core.expressions.chained_attribute import ChainedAttribute -from codegen.sdk.core.interfaces.editable import Editable from codegen.sdk.extensions.autocommit import reader from codegen.shared.decorators.docs import ts_apidoc +if TYPE_CHECKING: + from codegen.sdk.core.interfaces.editable import Editable + Parent = TypeVar("Parent", bound="Editable") diff --git a/src/codegen/sdk/typescript/expressions/expression_type.py b/src/codegen/sdk/typescript/expressions/expression_type.py index 257f42e12..6f40dd3e1 100644 --- a/src/codegen/sdk/typescript/expressions/expression_type.py +++ b/src/codegen/sdk/typescript/expressions/expression_type.py @@ -1,14 +1,16 @@ -from typing import Generic, TypeVar +from typing import TYPE_CHECKING, Generic, TypeVar from tree_sitter import Node as TSNode -from codegen.sdk.codebase.codebase_graph import CodebaseGraph from codegen.sdk.core.expressions import Expression -from codegen.sdk.core.interfaces.editable import Editable from codegen.sdk.core.node_id_factory import NodeId from codegen.sdk.typescript.expressions.named_type import TSNamedType from codegen.shared.decorators.docs import ts_apidoc +if TYPE_CHECKING: + from codegen.sdk.codebase.codebase_graph import CodebaseGraph + from codegen.sdk.core.interfaces.editable import Editable + Parent = TypeVar("Parent", bound="Editable") diff --git a/src/codegen/sdk/typescript/expressions/generic_type.py b/src/codegen/sdk/typescript/expressions/generic_type.py index 320c39df5..71c0b9971 100644 --- a/src/codegen/sdk/typescript/expressions/generic_type.py +++ b/src/codegen/sdk/typescript/expressions/generic_type.py @@ -1,4 +1,4 @@ -from typing import Self, TypeVar +from typing import TYPE_CHECKING, Self, TypeVar from tree_sitter import Node as TSNode @@ -7,6 +7,9 @@ from codegen.sdk.core.symbol_groups.dict import Dict from codegen.shared.decorators.docs import ts_apidoc +if TYPE_CHECKING: + from codegen.sdk.typescript.expressions.type import TSType + Parent = TypeVar("Parent") diff --git a/src/codegen/sdk/typescript/expressions/ternary_expression.py b/src/codegen/sdk/typescript/expressions/ternary_expression.py index 90c2f2f8a..aa141978d 100644 --- a/src/codegen/sdk/typescript/expressions/ternary_expression.py +++ b/src/codegen/sdk/typescript/expressions/ternary_expression.py @@ -1,9 +1,11 @@ -from typing import TypeVar +from typing import TYPE_CHECKING, TypeVar from codegen.sdk.core.expressions.ternary_expression import TernaryExpression -from codegen.sdk.core.interfaces.editable import Editable from codegen.shared.decorators.docs import ts_apidoc +if TYPE_CHECKING: + from codegen.sdk.core.interfaces.editable import Editable + Parent = TypeVar("Parent", bound="Editable") diff --git a/src/codegen/sdk/typescript/expressions/union_type.py b/src/codegen/sdk/typescript/expressions/union_type.py index c6a2a319d..b0df5b24d 100644 --- a/src/codegen/sdk/typescript/expressions/union_type.py +++ b/src/codegen/sdk/typescript/expressions/union_type.py @@ -1,8 +1,11 @@ -from typing import Generic, TypeVar +from typing import TYPE_CHECKING, Generic, TypeVar from codegen.sdk.core.expressions.union_type import UnionType from codegen.shared.decorators.docs import ts_apidoc +if TYPE_CHECKING: + from codegen.sdk.typescript.expressions.type import TSType + Parent = TypeVar("Parent") diff --git a/src/codegen/sdk/typescript/external/dependency_manager.py b/src/codegen/sdk/typescript/external/dependency_manager.py index 053fd00e5..d968a2bac 100644 --- a/src/codegen/sdk/typescript/external/dependency_manager.py +++ b/src/codegen/sdk/typescript/external/dependency_manager.py @@ -44,15 +44,20 @@ def __init__(self, repo_path: str, base_path: str | None = None, should_install_ logger.info(f"Initializing TypescriptDependencyManager with should_install_dependencies={should_install_dependencies}") # Ensure that node, npm, yarn, and pnpm are installed if not shutil.which("node"): - raise RuntimeError("NodeJS is not installed") + msg = "NodeJS is not installed" + raise RuntimeError(msg) if not shutil.which("corepack"): - raise RuntimeError("corepack is not installed") + msg = "corepack is not installed" + raise RuntimeError(msg) if not shutil.which("npm"): - raise RuntimeError("npm is not installed") + msg = "npm is not installed" + raise RuntimeError(msg) if not shutil.which("yarn"): - raise RuntimeError("yarn is not installed") + msg = "yarn is not installed" + raise RuntimeError(msg) if not shutil.which("pnpm"): - raise RuntimeError("pnpm is not installed") + msg = "pnpm is not installed" + raise RuntimeError(msg) self.should_install_dependencies = should_install_dependencies # Detect the installer type @@ -111,7 +116,7 @@ def _validate_dependencies(cls, deps: dict[str, str]) -> tuple[dict[str, str], d else: invalid_deps[package] = version except Exception as e: - logger.error(f"Error checking package {package}: {e}") + logger.exception(f"Error checking package {package}: {e}") return valid_deps, invalid_deps @@ -143,9 +148,9 @@ def parse_dependencies(self): self.package_json_data[package_json_path] = PackageJsonData(dependencies, dev_dependencies, package_data) except FileNotFoundError: - logger.error(f"Could not find package.json at {package_json_path}") + logger.exception(f"Could not find package.json at {package_json_path}") except ValueError: - logger.error(f"Invalid json in package.json at {package_json_path}") + logger.exception(f"Invalid json in package.json at {package_json_path}") except Exception as e: raise e @@ -178,9 +183,9 @@ def _install_dependencies_npm(self): logger.info(f"Running npm install with cwd {self.full_path}") subprocess.run(["npm", "install"], cwd=self.full_path, check=True, capture_output=True, text=True) except subprocess.CalledProcessError as e: - logger.error(f"NPM FAIL: npm install failed with exit code {e.returncode}") - logger.error(f"NPM FAIL stdout: {e.stdout}") - logger.error(f"NPM FAIL stderr: {e.stderr}") + logger.exception(f"NPM FAIL: npm install failed with exit code {e.returncode}") + logger.exception(f"NPM FAIL stdout: {e.stdout}") + logger.exception(f"NPM FAIL stderr: {e.stderr}") raise def _install_dependencies_yarn(self): @@ -249,9 +254,9 @@ def _install_dependencies_yarn(self): subprocess.run(["corepack", "prepare", "--activate"], cwd=self.full_path, check=True, capture_output=True, text=True) subprocess.run(["yarn", "install"], cwd=self.full_path, check=True, capture_output=True, text=True, env=yarn_environ) except subprocess.CalledProcessError as e: - logger.error(f"Yarn FAIL: yarn install failed with exit code {e.returncode}") - logger.error(f"Yarn FAIL stdout: {e.stdout}") - logger.error(f"Yarn FAIL stderr: {e.stderr}") + logger.exception(f"Yarn FAIL: yarn install failed with exit code {e.returncode}") + logger.exception(f"Yarn FAIL stdout: {e.stdout}") + logger.exception(f"Yarn FAIL stderr: {e.stderr}") raise finally: # Clean up the temporary global directory @@ -287,9 +292,9 @@ def _install_dependencies_pnpm(self): logger.info(f"Running pnpm install with cwd {self.full_path}") subprocess.run(["pnpm", "install"], cwd=self.full_path, check=True, capture_output=True, text=True) except subprocess.CalledProcessError as e: - logger.error(f"PNPM FAIL: pnpm install failed with exit code {e.returncode}") - logger.error(f"PNPM FAIL stdout: {e.stdout}") - logger.error(f"PNPM FAIL stderr: {e.stderr}") + logger.exception(f"PNPM FAIL: pnpm install failed with exit code {e.returncode}") + logger.exception(f"PNPM FAIL stdout: {e.stdout}") + logger.exception(f"PNPM FAIL stderr: {e.stderr}") raise def _clean_package_json(self, package_json_path: str): diff --git a/src/codegen/sdk/typescript/external/ts_analyzer_engine.py b/src/codegen/sdk/typescript/external/ts_analyzer_engine.py index 89b321554..921cca499 100644 --- a/src/codegen/sdk/typescript/external/ts_analyzer_engine.py +++ b/src/codegen/sdk/typescript/external/ts_analyzer_engine.py @@ -74,7 +74,8 @@ def __init__( # Get the path of the language engine self.engine_path: str = os.path.join(os.path.dirname(self.current_file_path), "typescript_analyzer", "dist", "index.js") if not os.path.exists(self.engine_path): - raise FileNotFoundError(f"Typescript analyzer engine not found at {self.engine_path}") + msg = f"Typescript analyzer engine not found at {self.engine_path}" + raise FileNotFoundError(msg) self.engine_source: str = open(self.engine_path).read() self._patch_engine_source() @@ -176,13 +177,15 @@ def __init__(self, repo_path: str, base_path: str | None = None, dependency_mana self.current_file_path: str = os.path.abspath(__file__) # Ensure NodeJS and npm are installed if not shutil.which("node") or not shutil.which("npm"): - raise RuntimeError("NodeJS or npm is not installed") + msg = "NodeJS or npm is not installed" + raise RuntimeError(msg) # Get the path to the typescript analyzer self.analyzer_path: str = os.path.join(os.path.dirname(self.current_file_path), "typescript_analyzer") self.analyzer_entry: str = os.path.join(self.analyzer_path, "src", "run_full.ts") if not os.path.exists(self.analyzer_path): - raise FileNotFoundError(f"Typescript analyzer not found at {self.analyzer_path}") + msg = f"Typescript analyzer not found at {self.analyzer_path}" + raise FileNotFoundError(msg) def _start(self): try: @@ -193,9 +196,9 @@ def _start(self): logger.info("Installing typescript analyzer dependencies") subprocess.run(["npm", "install"], cwd=self.analyzer_path, check=True, capture_output=True, text=True) except subprocess.CalledProcessError as e: - logger.error(f"NPM FAIL: npm install failed with exit code {e.returncode}") - logger.error(f"NPM FAIL stdout: {e.stdout}") - logger.error(f"NPM FAIL stderr: {e.stderr}") + logger.exception(f"NPM FAIL: npm install failed with exit code {e.returncode}") + logger.exception(f"NPM FAIL stdout: {e.stdout}") + logger.exception(f"NPM FAIL stderr: {e.stderr}") raise # Create a temporary output file with a random name @@ -217,9 +220,9 @@ def _start(self): env=node_environ, ) except subprocess.CalledProcessError as e: - logger.error(f"ANALYZER FAIL: analyzer failed with exit code {e.returncode}") - logger.error(f"ANALYZER FAIL stdout: {e.stdout}") - logger.error(f"ANALYZER FAIL stderr: {e.stderr}") + logger.exception(f"ANALYZER FAIL: analyzer failed with exit code {e.returncode}") + logger.exception(f"ANALYZER FAIL stdout: {e.stdout}") + logger.exception(f"ANALYZER FAIL stderr: {e.stderr}") raise # Load the type data diff --git a/src/codegen/sdk/typescript/external/ts_declassify/ts_declassify.py b/src/codegen/sdk/typescript/external/ts_declassify/ts_declassify.py index 312908f78..b196fdc53 100644 --- a/src/codegen/sdk/typescript/external/ts_declassify/ts_declassify.py +++ b/src/codegen/sdk/typescript/external/ts_declassify/ts_declassify.py @@ -15,7 +15,8 @@ def __init__(self, repo_path: str, base_path: str, working_dir: str = "/tmp/ts_d # Ensure NodeJS and npm are installed if not shutil.which("node") or not shutil.which("npm"): - raise RuntimeError("NodeJS or npm is not installed") + msg = "NodeJS or npm is not installed" + raise RuntimeError(msg) def _start(self): try: @@ -33,9 +34,9 @@ def _start(self): logger.info(f"Running npm init in {self.working_dir}") subprocess.run(["npm", "init", "-y"], cwd=self.working_dir, check=True, capture_output=True, text=True) except subprocess.CalledProcessError as e: - logger.error(f"NPM FAIL: npm init failed with exit code {e.returncode}") - logger.error(f"NPM FAIL stdout: {e.stdout}") - logger.error(f"NPM FAIL stderr: {e.stderr}") + logger.exception(f"NPM FAIL: npm init failed with exit code {e.returncode}") + logger.exception(f"NPM FAIL stdout: {e.stdout}") + logger.exception(f"NPM FAIL stderr: {e.stderr}") raise # NPM Install @@ -43,20 +44,21 @@ def _start(self): logger.info(f"Running npm install in {self.working_dir}") subprocess.run(["npm", "install", "-D", "@codemod/cli", "react-declassify"], cwd=self.working_dir, check=True, capture_output=True, text=True) except subprocess.CalledProcessError as e: - logger.error(f"NPM FAIL: npm install failed with exit code {e.returncode}") - logger.error(f"NPM FAIL stdout: {e.stdout}") - logger.error(f"NPM FAIL stderr: {e.stderr}") + logger.exception(f"NPM FAIL: npm install failed with exit code {e.returncode}") + logger.exception(f"NPM FAIL stdout: {e.stdout}") + logger.exception(f"NPM FAIL stderr: {e.stderr}") raise # Finalize self.is_ready = True except Exception as e: self._error = e - logger.error(f"Error installing ts-declassify: {e}") + logger.exception(f"Error installing ts-declassify: {e}") raise e def reparse(self): - raise NotImplementedError("TSDeclassify does not support reparse") + msg = "TSDeclassify does not support reparse" + raise NotImplementedError(msg) def declassify(self, source: str, filename: str = "file.tsx", error_on_failure: bool = True): assert self.ready(), "TSDeclassify is not ready" @@ -71,9 +73,9 @@ def declassify(self, source: str, filename: str = "file.tsx", error_on_failure: try: subprocess.run(["npx", "codemod", "--plugin", "react-declassify", source_file], cwd=self.working_dir, check=True, capture_output=True, text=True) except subprocess.CalledProcessError as e: - logger.error(f"DECLASSIFY FAIL: declassify failed with exit code {e.returncode}") - logger.error(f"DECLASSIFY FAIL stdout: {e.stdout}") - logger.error(f"DECLASSIFY FAIL stderr: {e.stderr}") + logger.exception(f"DECLASSIFY FAIL: declassify failed with exit code {e.returncode}") + logger.exception(f"DECLASSIFY FAIL stdout: {e.stdout}") + logger.exception(f"DECLASSIFY FAIL stderr: {e.stderr}") raise # Get the declassified source @@ -82,7 +84,8 @@ def declassify(self, source: str, filename: str = "file.tsx", error_on_failure: # Raise an error if the declassification failed if error_on_failure and "Cannot perform transformation" in declassified_source: - raise RuntimeError("Declassification failed!") + msg = "Declassification failed!" + raise RuntimeError(msg) finally: # Remove file.tsx if it exists if os.path.exists(source_file): diff --git a/src/codegen/sdk/typescript/file.py b/src/codegen/sdk/typescript/file.py index 1c35299a9..6ba3d2d7a 100644 --- a/src/codegen/sdk/typescript/file.py +++ b/src/codegen/sdk/typescript/file.py @@ -1,13 +1,11 @@ from __future__ import annotations import os +from typing import TYPE_CHECKING -from codegen.sdk.codebase.codebase_graph import CodebaseGraph from codegen.sdk.core.autocommit import commiter, mover, reader, writer from codegen.sdk.core.file import SourceFile from codegen.sdk.core.interfaces.exportable import Exportable -from codegen.sdk.core.statements.export_statement import ExportStatement -from codegen.sdk.core.symbol import Symbol from codegen.sdk.enums import ImportType, NodeType, ProgrammingLanguage, SymbolType from codegen.sdk.extensions.sort import sort_editables from codegen.sdk.extensions.utils import cached_property @@ -21,12 +19,17 @@ from codegen.sdk.typescript.interfaces.has_block import TSHasBlock from codegen.sdk.typescript.namespace import TSNamespace from codegen.sdk.typescript.statements.import_statement import TSImportStatement -from codegen.sdk.typescript.symbol import TSSymbol -from codegen.sdk.typescript.ts_config import TSConfig -from codegen.sdk.typescript.type_alias import TSTypeAlias from codegen.sdk.utils import calculate_base_path, find_all_descendants from codegen.shared.decorators.docs import noapidoc, ts_apidoc +if TYPE_CHECKING: + from codegen.sdk.codebase.codebase_graph import CodebaseGraph + from codegen.sdk.core.statements.export_statement import ExportStatement + from codegen.sdk.core.symbol import Symbol + from codegen.sdk.typescript.symbol import TSSymbol + from codegen.sdk.typescript.ts_config import TSConfig + from codegen.sdk.typescript.type_alias import TSTypeAlias + @ts_apidoc class TSFile(SourceFile[TSImport, TSFunction, TSClass, TSAssignment, TSInterface, TSCodeBlock], TSHasBlock, Exportable): diff --git a/src/codegen/sdk/typescript/function.py b/src/codegen/sdk/typescript/function.py index f7f164551..af5c5c020 100644 --- a/src/codegen/sdk/typescript/function.py +++ b/src/codegen/sdk/typescript/function.py @@ -4,16 +4,9 @@ from functools import cached_property from typing import TYPE_CHECKING -from tree_sitter import Node as TSNode - -from codegen.sdk.codebase.codebase_graph import CodebaseGraph from codegen.sdk.core.autocommit import commiter, reader, writer from codegen.sdk.core.dataclasses.usage import UsageKind from codegen.sdk.core.function import Function -from codegen.sdk.core.import_resolution import Import, WildcardImport -from codegen.sdk.core.interfaces.has_name import HasName -from codegen.sdk.core.node_id_factory import NodeId -from codegen.sdk.core.symbol import Symbol from codegen.sdk.core.symbol_groups.collection import Collection from codegen.sdk.typescript.detached_symbols.decorator import TSDecorator from codegen.sdk.typescript.detached_symbols.parameter import TSParameter @@ -26,8 +19,16 @@ from codegen.shared.decorators.docs import noapidoc, ts_apidoc if TYPE_CHECKING: + from tree_sitter import Node as TSNode + + from codegen.sdk.codebase.codebase_graph import CodebaseGraph + from codegen.sdk.core.import_resolution import Import, WildcardImport + from codegen.sdk.core.interfaces.has_name import HasName + from codegen.sdk.core.node_id_factory import NodeId from codegen.sdk.core.statements.export_statement import ExportStatement from codegen.sdk.core.statements.symbol_statement import SymbolStatement + from codegen.sdk.core.symbol import Symbol + from codegen.sdk.typescript.detached_symbols.code_block import TSCodeBlock _VALID_TYPE_NAMES = {function_type.value for function_type in TSFunctionTypeNames} logger = logging.getLogger(__name__) @@ -112,7 +113,8 @@ def _compute_dependencies(self, usage_type: UsageKind | None = None, dest: HasNa def from_function_type(cls, ts_node: TSNode, file_node_id: NodeId, G: CodebaseGraph, parent: SymbolStatement | ExportStatement) -> TSFunction: """Creates a TSFunction object from a function declaration.""" if ts_node.type not in [function_type.value for function_type in TSFunctionTypeNames]: - raise ValueError(f"Node type={ts_node.type} is not a function declaration") + msg = f"Node type={ts_node.type} is not a function declaration" + raise ValueError(msg) file = G.get_node(file_node_id) if canonical := file._range_index.get_canonical_for_range(ts_node.range, ts_node.kind_id): return canonical @@ -162,7 +164,8 @@ def function_signature(self) -> str: elif self.function_type == TSFunctionTypeNames.FunctionExpression: func_def_src = f"{self.name} = function" else: - raise NotImplementedError("function type not implemented") + msg = "function type not implemented" + raise NotImplementedError(msg) if self.parameters is not None: func_def_src += self.parameters.source if self.return_type: @@ -319,7 +322,8 @@ def arrow_to_named(self, name: str | None = None) -> None: return if name is None and self._name_node is None: - raise ValueError("The `name` argument must be provided when converting an arrow function that is not assigned to any variable.") + msg = "The `name` argument must be provided when converting an arrow function that is not assigned to any variable." + raise ValueError(msg) node = self._named_arrow_function # Replace variable declaration with function declaration diff --git a/src/codegen/sdk/typescript/import_resolution.py b/src/codegen/sdk/typescript/import_resolution.py index 6d4c4f8ce..810843483 100644 --- a/src/codegen/sdk/typescript/import_resolution.py +++ b/src/codegen/sdk/typescript/import_resolution.py @@ -2,26 +2,27 @@ import os from collections import deque -from collections.abc import Generator from typing import TYPE_CHECKING, Self, override -from tree_sitter import Node as TSNode - -from codegen.sdk.codebase.codebase_graph import CodebaseGraph from codegen.sdk.core.autocommit import reader from codegen.sdk.core.expressions import Name -from codegen.sdk.core.external_module import ExternalModule from codegen.sdk.core.import_resolution import Import, ImportResolution, WildcardImport -from codegen.sdk.core.interfaces.editable import Editable from codegen.sdk.core.interfaces.exportable import Exportable -from codegen.sdk.core.node_id_factory import NodeId -from codegen.sdk.core.statements.import_statement import ImportStatement -from codegen.sdk.core.symbol import Symbol from codegen.sdk.enums import ImportType, NodeType from codegen.sdk.utils import find_all_descendants, find_first_ancestor, find_first_descendant from codegen.shared.decorators.docs import noapidoc, ts_apidoc if TYPE_CHECKING: + from collections.abc import Generator + + from tree_sitter import Node as TSNode + + from codegen.sdk.codebase.codebase_graph import CodebaseGraph + from codegen.sdk.core.external_module import ExternalModule + from codegen.sdk.core.interfaces.editable import Editable + from codegen.sdk.core.node_id_factory import NodeId + from codegen.sdk.core.statements.import_statement import ImportStatement + from codegen.sdk.core.symbol import Symbol from codegen.sdk.typescript.file import TSFile from codegen.sdk.typescript.statements.import_statement import TSImportStatement diff --git a/src/codegen/sdk/typescript/interface.py b/src/codegen/sdk/typescript/interface.py index f200c919c..53d891e7d 100644 --- a/src/codegen/sdk/typescript/interface.py +++ b/src/codegen/sdk/typescript/interface.py @@ -1,17 +1,10 @@ from __future__ import annotations -from typing import TypeVar +from typing import TYPE_CHECKING, TypeVar -from tree_sitter import Node as TSNode - -from codegen.sdk.codebase.codebase_graph import CodebaseGraph from codegen.sdk.core.autocommit import commiter, reader from codegen.sdk.core.dataclasses.usage import UsageKind -from codegen.sdk.core.detached_symbols.code_block import CodeBlock from codegen.sdk.core.interface import Interface -from codegen.sdk.core.interfaces.has_name import HasName -from codegen.sdk.core.node_id_factory import NodeId -from codegen.sdk.core.statements.statement import Statement from codegen.sdk.core.symbol_groups.parents import Parents from codegen.sdk.typescript.detached_symbols.code_block import TSCodeBlock from codegen.sdk.typescript.expressions.type import TSType @@ -21,6 +14,15 @@ from codegen.sdk.typescript.symbol import TSSymbol from codegen.shared.decorators.docs import noapidoc, ts_apidoc +if TYPE_CHECKING: + from tree_sitter import Node as TSNode + + from codegen.sdk.codebase.codebase_graph import CodebaseGraph + from codegen.sdk.core.detached_symbols.code_block import CodeBlock + from codegen.sdk.core.interfaces.has_name import HasName + from codegen.sdk.core.node_id_factory import NodeId + from codegen.sdk.core.statements.statement import Statement + Parent = TypeVar("Parent", bound="TSHasBlock") diff --git a/src/codegen/sdk/typescript/interfaces/has_block.py b/src/codegen/sdk/typescript/interfaces/has_block.py index 597bda0f4..be8bb68c4 100644 --- a/src/codegen/sdk/typescript/interfaces/has_block.py +++ b/src/codegen/sdk/typescript/interfaces/has_block.py @@ -15,6 +15,7 @@ from codegen.shared.decorators.docs import ts_apidoc if TYPE_CHECKING: + from codegen.sdk.typescript.detached_symbols.code_block import TSCodeBlock from codegen.sdk.typescript.detached_symbols.jsx.element import JSXElement diff --git a/src/codegen/sdk/typescript/namespace.py b/src/codegen/sdk/typescript/namespace.py index a1ceebbe4..f4131d67b 100644 --- a/src/codegen/sdk/typescript/namespace.py +++ b/src/codegen/sdk/typescript/namespace.py @@ -2,16 +2,9 @@ from typing import TYPE_CHECKING -from tree_sitter import Node as TSNode - -from codegen.sdk.codebase.codebase_graph import CodebaseGraph from codegen.sdk.core.autocommit import commiter -from codegen.sdk.core.dataclasses.usage import UsageKind from codegen.sdk.core.interfaces.has_name import HasName -from codegen.sdk.core.node_id_factory import NodeId -from codegen.sdk.core.statements.statement import Statement from codegen.sdk.core.statements.symbol_statement import SymbolStatement -from codegen.sdk.core.symbol import Symbol from codegen.sdk.enums import SymbolType from codegen.sdk.extensions.utils import cached_property from codegen.sdk.typescript.class_definition import TSClass @@ -24,6 +17,13 @@ from codegen.shared.decorators.docs import noapidoc, ts_apidoc if TYPE_CHECKING: + from tree_sitter import Node as TSNode + + from codegen.sdk.codebase.codebase_graph import CodebaseGraph + from codegen.sdk.core.dataclasses.usage import UsageKind + from codegen.sdk.core.node_id_factory import NodeId + from codegen.sdk.core.statements.statement import Statement + from codegen.sdk.core.symbol import Symbol from codegen.sdk.typescript.detached_symbols.code_block import TSCodeBlock diff --git a/src/codegen/sdk/typescript/placeholder/placeholder_return_type.py b/src/codegen/sdk/typescript/placeholder/placeholder_return_type.py index 4c66a5188..8a7a8bd8c 100644 --- a/src/codegen/sdk/typescript/placeholder/placeholder_return_type.py +++ b/src/codegen/sdk/typescript/placeholder/placeholder_return_type.py @@ -1,9 +1,11 @@ -from typing import Generic, TypeVar +from typing import TYPE_CHECKING, Generic, TypeVar -from codegen.sdk.core.interfaces.editable import Editable from codegen.sdk.core.placeholder.placeholder import Placeholder from codegen.shared.decorators.docs import ts_apidoc +if TYPE_CHECKING: + from codegen.sdk.core.interfaces.editable import Editable + Parent = TypeVar("Parent", bound="Editable") diff --git a/src/codegen/sdk/typescript/statements/assignment_statement.py b/src/codegen/sdk/typescript/statements/assignment_statement.py index 104d05c3e..2b49b923c 100644 --- a/src/codegen/sdk/typescript/statements/assignment_statement.py +++ b/src/codegen/sdk/typescript/statements/assignment_statement.py @@ -3,17 +3,17 @@ from collections import deque from typing import TYPE_CHECKING, Self -from tree_sitter import Node as TSNode - -from codegen.sdk.codebase.codebase_graph import CodebaseGraph from codegen.sdk.core.expressions.multi_expression import MultiExpression -from codegen.sdk.core.node_id_factory import NodeId from codegen.sdk.core.statements.assignment_statement import AssignmentStatement from codegen.sdk.extensions.autocommit import reader from codegen.sdk.typescript.assignment import TSAssignment from codegen.shared.decorators.docs import noapidoc, ts_apidoc if TYPE_CHECKING: + from tree_sitter import Node as TSNode + + from codegen.sdk.codebase.codebase_graph import CodebaseGraph + from codegen.sdk.core.node_id_factory import NodeId from codegen.sdk.typescript.detached_symbols.code_block import TSCodeBlock from codegen.sdk.typescript.interfaces.has_block import TSHasBlock @@ -58,7 +58,8 @@ def from_assignment(cls, ts_node: TSNode, file_node_id: NodeId, G: CodebaseGraph ValueError: If the assignment_node.type is not one of the supported assignment types. """ if assignment_node.type not in cls.assignment_types: - raise ValueError(f"Invalid assignment node type: {assignment_node.type}") + msg = f"Invalid assignment node type: {assignment_node.type}" + raise ValueError(msg) return cls(ts_node, file_node_id, G, parent, pos, assignment_node=assignment_node) @@ -79,7 +80,8 @@ def _DEPRECATED_parse_assignments(self) -> MultiExpression[TSHasBlock, TSAssignm elif self.ts_node.type in ["public_field_definition", "property_signature", "enum_assignment"]: return MultiExpression(self.ts_node, self.file_node_id, self.G, self.parent, self._DEPRECATED_parse_attribute_assignments()) else: - raise ValueError(f"Unknown assignment type: {self.ts_node.type}") + msg = f"Unknown assignment type: {self.ts_node.type}" + raise ValueError(msg) def _DEPRECATED_parse_attribute_assignments(self) -> list[TSAssignment]: left = self.ts_node.child_by_field_name("name") diff --git a/src/codegen/sdk/typescript/statements/attribute.py b/src/codegen/sdk/typescript/statements/attribute.py index 51f761647..15d818936 100644 --- a/src/codegen/sdk/typescript/statements/attribute.py +++ b/src/codegen/sdk/typescript/statements/attribute.py @@ -2,13 +2,8 @@ from typing import TYPE_CHECKING -from tree_sitter import Node as TSNode - from codegen.sdk._proxy import proxy_property -from codegen.sdk.codebase.codebase_graph import CodebaseGraph from codegen.sdk.core.autocommit import reader -from codegen.sdk.core.interfaces.editable import Editable -from codegen.sdk.core.node_id_factory import NodeId from codegen.sdk.core.statements.attribute import Attribute from codegen.sdk.typescript.assignment import TSAssignment from codegen.sdk.typescript.detached_symbols.code_block import TSCodeBlock @@ -16,6 +11,11 @@ from codegen.shared.decorators.docs import ts_apidoc if TYPE_CHECKING: + from tree_sitter import Node as TSNode + + from codegen.sdk.codebase.codebase_graph import CodebaseGraph + from codegen.sdk.core.interfaces.editable import Editable + from codegen.sdk.core.node_id_factory import NodeId from codegen.sdk.typescript.interfaces.has_block import TSHasBlock diff --git a/src/codegen/sdk/typescript/statements/block_statement.py b/src/codegen/sdk/typescript/statements/block_statement.py index 5596bdae3..98c995a74 100644 --- a/src/codegen/sdk/typescript/statements/block_statement.py +++ b/src/codegen/sdk/typescript/statements/block_statement.py @@ -1,12 +1,14 @@ from __future__ import annotations -from typing import Generic, TypeVar +from typing import TYPE_CHECKING, Generic, TypeVar from codegen.sdk.core.statements.block_statement import BlockStatement -from codegen.sdk.typescript.detached_symbols.code_block import TSCodeBlock from codegen.sdk.typescript.interfaces.has_block import TSHasBlock from codegen.shared.decorators.docs import apidoc +if TYPE_CHECKING: + from codegen.sdk.typescript.detached_symbols.code_block import TSCodeBlock + Parent = TypeVar("Parent", bound="TSCodeBlock") diff --git a/src/codegen/sdk/typescript/statements/catch_statement.py b/src/codegen/sdk/typescript/statements/catch_statement.py index d71451365..33cfdf5c5 100644 --- a/src/codegen/sdk/typescript/statements/catch_statement.py +++ b/src/codegen/sdk/typescript/statements/catch_statement.py @@ -2,16 +2,16 @@ from typing import TYPE_CHECKING, Generic, TypeVar -from tree_sitter import Node as TSNode - -from codegen.sdk.core.node_id_factory import NodeId from codegen.sdk.core.statements.catch_statement import CatchStatement -from codegen.sdk.typescript.detached_symbols.code_block import TSCodeBlock from codegen.sdk.typescript.statements.block_statement import TSBlockStatement from codegen.shared.decorators.docs import apidoc if TYPE_CHECKING: + from tree_sitter import Node as TSNode + from codegen.sdk.codebase.codebase_graph import CodebaseGraph + from codegen.sdk.core.node_id_factory import NodeId + from codegen.sdk.typescript.detached_symbols.code_block import TSCodeBlock Parent = TypeVar("Parent", bound="TSCodeBlock") diff --git a/src/codegen/sdk/typescript/statements/for_loop_statement.py b/src/codegen/sdk/typescript/statements/for_loop_statement.py index 50b60347a..30fe2c0d0 100644 --- a/src/codegen/sdk/typescript/statements/for_loop_statement.py +++ b/src/codegen/sdk/typescript/statements/for_loop_statement.py @@ -2,21 +2,21 @@ from typing import TYPE_CHECKING -from tree_sitter import Node as TSNode - -from codegen.sdk.core.dataclasses.usage import UsageKind -from codegen.sdk.core.detached_symbols.function_call import FunctionCall -from codegen.sdk.core.expressions import Expression -from codegen.sdk.core.interfaces.has_name import HasName -from codegen.sdk.core.interfaces.importable import Importable -from codegen.sdk.core.node_id_factory import NodeId from codegen.sdk.core.statements.for_loop_statement import ForLoopStatement from codegen.sdk.extensions.autocommit import commiter, reader from codegen.sdk.typescript.statements.block_statement import TSBlockStatement from codegen.shared.decorators.docs import noapidoc, ts_apidoc if TYPE_CHECKING: + from tree_sitter import Node as TSNode + from codegen.sdk.codebase.codebase_graph import CodebaseGraph + from codegen.sdk.core.dataclasses.usage import UsageKind + from codegen.sdk.core.detached_symbols.function_call import FunctionCall + from codegen.sdk.core.expressions import Expression + from codegen.sdk.core.interfaces.has_name import HasName + from codegen.sdk.core.interfaces.importable import Importable + from codegen.sdk.core.node_id_factory import NodeId from codegen.sdk.typescript.detached_symbols.code_block import TSCodeBlock @@ -52,7 +52,8 @@ def __init__(self, ts_node: TSNode, file_node_id: NodeId, G: CodebaseGraph, pare self.item = self.child_by_field_name("left") self.iterable = self.child_by_field_name("right") else: - raise ValueError(f"Invalid for loop type: {ts_node.type}") + msg = f"Invalid for loop type: {ts_node.type}" + raise ValueError(msg) @property @reader diff --git a/src/codegen/sdk/typescript/statements/if_block_statement.py b/src/codegen/sdk/typescript/statements/if_block_statement.py index 86dce0535..aff9dee22 100644 --- a/src/codegen/sdk/typescript/statements/if_block_statement.py +++ b/src/codegen/sdk/typescript/statements/if_block_statement.py @@ -2,16 +2,16 @@ from typing import TYPE_CHECKING, Generic, TypeVar -from tree_sitter import Node as TSNode - -from codegen.sdk.codebase.codebase_graph import CodebaseGraph from codegen.sdk.core.autocommit import reader, writer -from codegen.sdk.core.node_id_factory import NodeId from codegen.sdk.core.statements.if_block_statement import IfBlockStatement from codegen.sdk.core.statements.statement import StatementType from codegen.shared.decorators.docs import apidoc if TYPE_CHECKING: + from tree_sitter import Node as TSNode + + from codegen.sdk.codebase.codebase_graph import CodebaseGraph + from codegen.sdk.core.node_id_factory import NodeId from codegen.sdk.typescript.detached_symbols.code_block import TSCodeBlock import logging diff --git a/src/codegen/sdk/typescript/statements/import_statement.py b/src/codegen/sdk/typescript/statements/import_statement.py index e01a5ad07..458007005 100644 --- a/src/codegen/sdk/typescript/statements/import_statement.py +++ b/src/codegen/sdk/typescript/statements/import_statement.py @@ -2,18 +2,19 @@ from typing import TYPE_CHECKING -from tree_sitter import Node as TSNode - -from codegen.sdk.codebase.codebase_graph import CodebaseGraph from codegen.sdk.core.expressions.builtin import Builtin -from codegen.sdk.core.node_id_factory import NodeId from codegen.sdk.core.statements.import_statement import ImportStatement from codegen.sdk.core.symbol_groups.collection import Collection from codegen.sdk.typescript.import_resolution import TSImport from codegen.shared.decorators.docs import ts_apidoc if TYPE_CHECKING: + from tree_sitter import Node as TSNode + + from codegen.sdk.codebase.codebase_graph import CodebaseGraph + from codegen.sdk.core.node_id_factory import NodeId from codegen.sdk.typescript.detached_symbols.code_block import TSCodeBlock + from codegen.sdk.typescript.file import TSFile @ts_apidoc diff --git a/src/codegen/sdk/typescript/statements/labeled_statement.py b/src/codegen/sdk/typescript/statements/labeled_statement.py index 0f0d421c7..d8f2c38e4 100644 --- a/src/codegen/sdk/typescript/statements/labeled_statement.py +++ b/src/codegen/sdk/typescript/statements/labeled_statement.py @@ -2,16 +2,16 @@ from typing import TYPE_CHECKING, Generic, TypeVar -from tree_sitter import Node as TSNode - -from codegen.sdk.codebase.codebase_graph import CodebaseGraph from codegen.sdk.core.expressions import Expression, Name from codegen.sdk.core.interfaces.has_name import HasName -from codegen.sdk.core.node_id_factory import NodeId from codegen.sdk.core.statements.statement import Statement, StatementType from codegen.shared.decorators.docs import ts_apidoc if TYPE_CHECKING: + from tree_sitter import Node as TSNode + + from codegen.sdk.codebase.codebase_graph import CodebaseGraph + from codegen.sdk.core.node_id_factory import NodeId from codegen.sdk.typescript.detached_symbols.code_block import TSCodeBlock diff --git a/src/codegen/sdk/typescript/statements/switch_case.py b/src/codegen/sdk/typescript/statements/switch_case.py index 58d650a35..01a49d72c 100644 --- a/src/codegen/sdk/typescript/statements/switch_case.py +++ b/src/codegen/sdk/typescript/statements/switch_case.py @@ -10,6 +10,7 @@ if TYPE_CHECKING: from codegen.sdk.codebase.codebase_graph import CodebaseGraph + from src.codegen.sdk.typescript.statements.switch_statement import TSSwitchStatement @ts_apidoc diff --git a/src/codegen/sdk/typescript/statements/switch_statement.py b/src/codegen/sdk/typescript/statements/switch_statement.py index f32ad5c1b..a633fe402 100644 --- a/src/codegen/sdk/typescript/statements/switch_statement.py +++ b/src/codegen/sdk/typescript/statements/switch_statement.py @@ -1,17 +1,17 @@ from __future__ import annotations -from typing import TYPE_CHECKING +from typing import TYPE_CHECKING, Self -from tree_sitter import Node as TSNode - -from codegen.sdk.core.node_id_factory import NodeId from codegen.sdk.core.statements.switch_statement import SwitchStatement -from codegen.sdk.typescript.detached_symbols.code_block import TSCodeBlock from codegen.sdk.typescript.statements.switch_case import TSSwitchCase from codegen.shared.decorators.docs import ts_apidoc if TYPE_CHECKING: + from tree_sitter import Node as TSNode + from codegen.sdk.codebase.codebase_graph import CodebaseGraph + from codegen.sdk.core.node_id_factory import NodeId + from codegen.sdk.typescript.detached_symbols.code_block import TSCodeBlock @ts_apidoc diff --git a/src/codegen/sdk/typescript/statements/try_catch_statement.py b/src/codegen/sdk/typescript/statements/try_catch_statement.py index 5c1466eff..28d39b64a 100644 --- a/src/codegen/sdk/typescript/statements/try_catch_statement.py +++ b/src/codegen/sdk/typescript/statements/try_catch_statement.py @@ -2,12 +2,6 @@ from typing import TYPE_CHECKING, Self, override -from tree_sitter import Node as TSNode - -from codegen.sdk.core.dataclasses.usage import UsageKind -from codegen.sdk.core.detached_symbols.function_call import FunctionCall -from codegen.sdk.core.interfaces.has_name import HasName -from codegen.sdk.core.node_id_factory import NodeId from codegen.sdk.core.statements.try_catch_statement import TryCatchStatement from codegen.sdk.extensions.autocommit import commiter, reader from codegen.sdk.typescript.statements.block_statement import TSBlockStatement @@ -15,8 +9,14 @@ from codegen.shared.decorators.docs import noapidoc, ts_apidoc if TYPE_CHECKING: + from tree_sitter import Node as TSNode + from codegen.sdk.codebase.codebase_graph import CodebaseGraph + from codegen.sdk.core.dataclasses.usage import UsageKind + from codegen.sdk.core.detached_symbols.function_call import FunctionCall + from codegen.sdk.core.interfaces.has_name import HasName from codegen.sdk.core.interfaces.importable import Importable + from codegen.sdk.core.node_id_factory import NodeId from codegen.sdk.typescript.detached_symbols.code_block import TSCodeBlock diff --git a/src/codegen/sdk/typescript/statements/while_statement.py b/src/codegen/sdk/typescript/statements/while_statement.py index 3e6f6d178..5d2583ac7 100644 --- a/src/codegen/sdk/typescript/statements/while_statement.py +++ b/src/codegen/sdk/typescript/statements/while_statement.py @@ -2,15 +2,15 @@ from typing import TYPE_CHECKING -from tree_sitter import Node as TSNode - -from codegen.sdk.core.node_id_factory import NodeId from codegen.sdk.core.statements.while_statement import WhileStatement from codegen.sdk.typescript.interfaces.has_block import TSHasBlock from codegen.shared.decorators.docs import ts_apidoc if TYPE_CHECKING: + from tree_sitter import Node as TSNode + from codegen.sdk.codebase.codebase_graph import CodebaseGraph + from codegen.sdk.core.node_id_factory import NodeId from codegen.sdk.typescript.detached_symbols.code_block import TSCodeBlock diff --git a/src/codegen/sdk/typescript/symbol.py b/src/codegen/sdk/typescript/symbol.py index d77029cc4..844c53436 100644 --- a/src/codegen/sdk/typescript/symbol.py +++ b/src/codegen/sdk/typescript/symbol.py @@ -2,20 +2,14 @@ from typing import TYPE_CHECKING -from tree_sitter import Node as TSNode - from codegen.sdk.core.assignment import Assignment from codegen.sdk.core.autocommit import reader, writer from codegen.sdk.core.dataclasses.usage import UsageType from codegen.sdk.core.detached_symbols.function_call import FunctionCall -from codegen.sdk.core.detached_symbols.parameter import Parameter from codegen.sdk.core.expressions import Value from codegen.sdk.core.expressions.chained_attribute import ChainedAttribute from codegen.sdk.core.expressions.type import Type -from codegen.sdk.core.import_resolution import Import -from codegen.sdk.core.interfaces.editable import Editable from codegen.sdk.core.interfaces.exportable import Exportable -from codegen.sdk.core.node_id_factory import NodeId from codegen.sdk.core.symbol import Symbol from codegen.sdk.core.type_alias import TypeAlias from codegen.sdk.enums import ImportType, NodeType @@ -25,7 +19,15 @@ from codegen.shared.decorators.docs import noapidoc, ts_apidoc if TYPE_CHECKING: + from tree_sitter import Node as TSNode + + from codegen.sdk.core.detached_symbols.parameter import Parameter from codegen.sdk.core.file import SourceFile + from codegen.sdk.core.import_resolution import Import + from codegen.sdk.core.interfaces.editable import Editable + from codegen.sdk.core.node_id_factory import NodeId + from codegen.sdk.typescript.detached_symbols.code_block import TSCodeBlock + from codegen.sdk.typescript.interfaces.has_block import TSHasBlock @ts_apidoc @@ -279,14 +281,16 @@ def _move_to_file(self, file: SourceFile, encountered_symbols: set[Symbol | Impo file.add_import_from_import_string(dep.source) else: - raise ValueError(f"Unknown dependency type {type(dep)}") + msg = f"Unknown dependency type {type(dep)}" + raise ValueError(msg) except Exception as e: print(f"Failed to move dependencies of {self.name}: {e}") else: try: for dep in self.dependencies: if isinstance(dep, Assignment): - raise NotImplementedError("Assignment not implemented yet") + msg = "Assignment not implemented yet" + raise NotImplementedError(msg) # =====[ Symbols - move over ]===== elif isinstance(dep, Symbol) and dep.is_top_level: diff --git a/src/codegen/sdk/typescript/symbol_groups/dict.py b/src/codegen/sdk/typescript/symbol_groups/dict.py index a5bbcc647..78f37cfcc 100644 --- a/src/codegen/sdk/typescript/symbol_groups/dict.py +++ b/src/codegen/sdk/typescript/symbol_groups/dict.py @@ -94,7 +94,8 @@ def __getitem__(self, __key: str) -> TExpression: return pair_match.value else: return pair_match.key - raise KeyError(f"Key {__key} not found in {list(self.keys())} {self._underlying!r}") + msg = f"Key {__key} not found in {list(self.keys())} {self._underlying!r}" + raise KeyError(msg) def __setitem__(self, __key: str, __value: TExpression) -> None: new_value = __value.source if isinstance(__value, Editable) else str(__value) diff --git a/src/codegen/sdk/typescript/ts_config.py b/src/codegen/sdk/typescript/ts_config.py index 243aa8867..806621c5c 100644 --- a/src/codegen/sdk/typescript/ts_config.py +++ b/src/codegen/sdk/typescript/ts_config.py @@ -58,7 +58,7 @@ def __init__(self, config_file: File, config_parser: "TSConfigParser"): try: self.config = pyjson5.loads(config_file.content) except pyjson5.Json5Exception: - logger.error(f"Failed to parse tsconfig.json file: {config_file.filepath}") + logger.exception(f"Failed to parse tsconfig.json file: {config_file.filepath}") self.config = {} # Precompute the base config, base url, paths, and references diff --git a/src/codegen/sdk/utils.py b/src/codegen/sdk/utils.py index 80985e20b..7216811a1 100644 --- a/src/codegen/sdk/utils.py +++ b/src/codegen/sdk/utils.py @@ -26,7 +26,8 @@ class XMLUtils: def dict_to_xml(data: dict | list, format: bool = False, **kwargs) -> str: result = dicttoxml.dicttoxml(data, return_bytes=False, **kwargs) if not isinstance(result, str): - raise ValueError("Failed to convert dict to XML") + msg = "Failed to convert dict to XML" + raise ValueError(msg) if format: result = parseString(result).toprettyxml() return result @@ -262,7 +263,8 @@ def determine_project_language(folder_path: str): """ folder = Path(folder_path) if not folder.exists() or not folder.is_dir(): - raise ValueError(f"Invalid folder path: {folder_path}") + msg = f"Invalid folder path: {folder_path}" + raise ValueError(msg) # Initialize counters for each language language_counts = Counter() @@ -321,7 +323,8 @@ def split_git_path(filepath: str) -> tuple[str, str | None]: current = current.parent # If we get here, we didn't find a .git directory - raise ValueError(f"Path '{filepath}' is not in a git repository!") + msg = f"Path '{filepath}' is not in a git repository!" + raise ValueError(msg) def truncate_line(input: str, max_chars: int) -> str: diff --git a/src/codegen/sdk/writer_decorators.py b/src/codegen/sdk/writer_decorators.py index 91f677a51..d4ca3b72f 100644 --- a/src/codegen/sdk/writer_decorators.py +++ b/src/codegen/sdk/writer_decorators.py @@ -5,5 +5,6 @@ def canonical(codemod): """Decorator for canonical Codemods that will be used for AI-agent prompts.""" codemod._canonical = True if not hasattr(codemod, "language") or codemod.language not in (ProgrammingLanguage.PYTHON, ProgrammingLanguage.TYPESCRIPT): - raise AttributeError("Canonical codemods must have a `language` attribute (PYTHON or TYPESCRIPT).") + msg = "Canonical codemods must have a `language` attribute (PYTHON or TYPESCRIPT)." + raise AttributeError(msg) return codemod diff --git a/src/codegen/shared/compilation/codeblock_validation.py b/src/codegen/shared/compilation/codeblock_validation.py index 9e46bc6ca..1d9672b03 100644 --- a/src/codegen/shared/compilation/codeblock_validation.py +++ b/src/codegen/shared/compilation/codeblock_validation.py @@ -10,4 +10,5 @@ def check_for_dangerous_operations(user_code: str) -> None: ] pattern = "|".join(dangerous_operation_patterns) if re.search(pattern, user_code, re.IGNORECASE): - raise DangerousUserCodeException("The codeblock contains potentially dangerous operations that are not allowed.") + msg = "The codeblock contains potentially dangerous operations that are not allowed." + raise DangerousUserCodeException(msg) diff --git a/src/codegen/visualizations/viz_utils.py b/src/codegen/visualizations/viz_utils.py index 603eb1412..f1cefeee9 100644 --- a/src/codegen/visualizations/viz_utils.py +++ b/src/codegen/visualizations/viz_utils.py @@ -1,16 +1,19 @@ import json import os from dataclasses import asdict +from typing import TYPE_CHECKING import networkx as nx from networkx import DiGraph, Graph -from codegen.git.repo_operator.repo_operator import RepoOperator from codegen.sdk.core.interfaces.editable import Editable from codegen.sdk.core.interfaces.importable import Importable from codegen.sdk.output.utils import DeterministicJSONEncoder from codegen.visualizations.enums import GraphJson, GraphType +if TYPE_CHECKING: + from codegen.git.repo_operator.repo_operator import RepoOperator + #################################################################################################################### # READING GRAPH VISUALIZATION DATA #################################################################################################################### diff --git a/src/codemods/canonical/change_component_tag_names/change_component_tag_names.py b/src/codemods/canonical/change_component_tag_names/change_component_tag_names.py index 6a013c9b8..ab93b59ea 100644 --- a/src/codemods/canonical/change_component_tag_names/change_component_tag_names.py +++ b/src/codemods/canonical/change_component_tag_names/change_component_tag_names.py @@ -39,7 +39,8 @@ def execute(self, codebase: Codebase): # Grab the NewName component PrivateRoutesContainer = codebase.get_symbol("PrivateRoutesContainer", optional=True) if PrivateRoutesContainer is None or not PrivateRoutesContainer.is_jsx: - raise ValueError("PrivateRoutesContainer component not found in codebase") + msg = "PrivateRoutesContainer component not found in codebase" + raise ValueError(msg) # Iterate over all functions in the codebase for file in codebase.files: diff --git a/src/codemods/canonical/move_functions_to_new_file/move_functions_to_new_file.py b/src/codemods/canonical/move_functions_to_new_file/move_functions_to_new_file.py index a888f7002..7ac12fed6 100644 --- a/src/codemods/canonical/move_functions_to_new_file/move_functions_to_new_file.py +++ b/src/codemods/canonical/move_functions_to_new_file/move_functions_to_new_file.py @@ -1,11 +1,15 @@ +from typing import TYPE_CHECKING + from codegen.sdk.core.codebase import Codebase -from codegen.sdk.core.file import SourceFile from codegen.sdk.enums import ProgrammingLanguage from codegen.sdk.writer_decorators import canonical from codemods.codemod import Codemod from tests.shared.skills.decorators import skill, skill_impl from tests.shared.skills.skill import Skill +if TYPE_CHECKING: + from codegen.sdk.core.file import SourceFile + @skill( canonical=True, diff --git a/src/codemods/canonical/split_file/split_file.py b/src/codemods/canonical/split_file/split_file.py index ee6e5a7ac..a61dc6401 100644 --- a/src/codemods/canonical/split_file/split_file.py +++ b/src/codemods/canonical/split_file/split_file.py @@ -24,7 +24,8 @@ def execute(self, codebase: Codebase): # Grab large file to split file = codebase.get_file("sqlglot/optimizer/scope.py", optional=True) if file is None: - raise FileNotFoundError("The file `sqlglot/optimizer/scope.py` was not found.") + msg = "The file `sqlglot/optimizer/scope.py` was not found." + raise FileNotFoundError(msg) # Create a new file for storing all our 'Enum' classes new_file = codebase.create_file("sqlglot/optimizer/enums.py") diff --git a/src/codemods/canonical/split_file_and_rename_symbols/split_file_and_rename_symbols.py b/src/codemods/canonical/split_file_and_rename_symbols/split_file_and_rename_symbols.py index 6a8bd2603..85e757dba 100644 --- a/src/codemods/canonical/split_file_and_rename_symbols/split_file_and_rename_symbols.py +++ b/src/codemods/canonical/split_file_and_rename_symbols/split_file_and_rename_symbols.py @@ -29,7 +29,8 @@ def execute(self, codebase: CodebaseType): # Get file to split up source_file = codebase.get_file("redash/models/types.py", optional=True) if source_file is None: - raise FileNotFoundError("[1] The file `redash/models/types.py` was not found.") + msg = "[1] The file `redash/models/types.py` was not found." + raise FileNotFoundError(msg) # Get file symbols will be moved to configuration_file = codebase.create_file("redash/models/configuration.py") diff --git a/tests/conftest.py b/tests/conftest.py index 0a861780f..df179d306 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -96,7 +96,8 @@ def pytest_runtest_makereport(item, call): if report.when == "call" and report.failed: if "NodeJS or npm is not installed" in str(report.longrepr): - raise RuntimeError("This test requires NodeJS and npm to be installed. Please install them before running the tests.") + msg = "This test requires NodeJS and npm to be installed. Please install them before running the tests." + raise RuntimeError(msg) @pytest.fixture(autouse=True) diff --git a/tests/unit/codegen/test_imports.py b/tests/integration/codegen/test_imports.py similarity index 100% rename from tests/unit/codegen/test_imports.py rename to tests/integration/codegen/test_imports.py diff --git a/tests/integration/codemod/test_parse.py b/tests/integration/codemod/test_parse.py index 6bd124c2c..0f5edb72f 100644 --- a/tests/integration/codemod/test_parse.py +++ b/tests/integration/codemod/test_parse.py @@ -46,4 +46,5 @@ def test_codemods_parse(repo: Repo, op: RepoOperator, request) -> None: assert memory_used <= BYTES_IN_GIGABYTE * MAX_ALLOWED_GIGABYTES, "Graph is using too much memory!" validation_res = post_init_validation(codebase) if validation_res != PostInitValidationStatus.SUCCESS: - raise Exception(f"Graph failed post init validation: {validation_res}!") + msg = f"Graph failed post init validation: {validation_res}!" + raise Exception(msg) diff --git a/tests/shared/codemod/codebase_comparison_utils.py b/tests/shared/codemod/codebase_comparison_utils.py index 35306cf75..85659d307 100644 --- a/tests/shared/codemod/codebase_comparison_utils.py +++ b/tests/shared/codemod/codebase_comparison_utils.py @@ -123,7 +123,8 @@ def compare_expected_actual_diffs(codebase: Codebase, actual_diff: str, expected # === [Apply Actual Diff to Codebase] === subprocess.run(["git", "apply", str(actual_diff_path.absolute())], cwd=codebase.repo_path) else: - raise ValueError("failed to convert diff to repo") + msg = "failed to convert diff to repo" + raise ValueError(msg) # === [Generate a Diff of Diffs] === analyze_codebase_diff(expected_dir, codebase.repo_path, tmp_dir, extensions, capture_stats=False, single_diff_file=True) diff --git a/tests/shared/codemod/commands.py b/tests/shared/codemod/commands.py index 26e9f5918..b7d2984dc 100644 --- a/tests/shared/codemod/commands.py +++ b/tests/shared/codemod/commands.py @@ -153,7 +153,8 @@ def report_repos(extra_repos: bool = False, size: str | None = None, language: s def clone_repos(clean_cache: bool = False, extra_repos: bool = False, token: str | None = None, verified_codemod_repos: bool = False) -> None: """Clone all repositories for codemod testing.""" if extra_repos and not token: - raise ValueError("Token is required for extra repos") + msg = "Token is required for extra repos" + raise ValueError(msg) repo_dir = BASE_TMP_DIR / ("extra_repos" if extra_repos or verified_codemod_repos else "oss_repos") if clean_cache and repo_dir.exists(): diff --git a/tests/shared/codemod/verified_codemod_utils.py b/tests/shared/codemod/verified_codemod_utils.py index 84b4960e4..af5984158 100644 --- a/tests/shared/codemod/verified_codemod_utils.py +++ b/tests/shared/codemod/verified_codemod_utils.py @@ -105,10 +105,11 @@ def _make_request(self, url: str, input_data: dict) -> requests.Response: ) if response.status_code != 200: logger.error(f"Error making request: {response.status_code} {response.text}") - raise Exception(f"Error making request: {response.status_code} {response.text}") + msg = f"Error making request: {response.status_code} {response.text}" + raise Exception(msg) return response except requests.RequestException as e: - logger.error(f"Error making request: {e}") + logger.exception(f"Error making request: {e}") raise e def get_verified_codemods(self, repo_id: int, codemod_id: int | None = None, base_commit: str | None = None) -> RepoCodemodMetadata: diff --git a/tests/shared/skills/decorators.py b/tests/shared/skills/decorators.py index c85c0cd4e..c6acec556 100644 --- a/tests/shared/skills/decorators.py +++ b/tests/shared/skills/decorators.py @@ -1,15 +1,18 @@ import inspect from collections.abc import Callable +from typing import TYPE_CHECKING import inflection from codegen.sdk.core.codebase import CodebaseType from codegen.sdk.enums import ProgrammingLanguage -from tests.shared.skills.skill import Skill from tests.shared.skills.skill_implementation import SkillImplementation from tests.shared.skills.skill_test import SkillTestCase from tests.shared.skills.utils import skill_name_to_skill_implementations, skills +if TYPE_CHECKING: + from tests.shared.skills.skill import Skill + ExecuteFuncType = Callable[[CodebaseType], None] @@ -55,10 +58,12 @@ def decorator(func: [ExecuteFuncType | type]) -> Callable[[CodebaseType], None]: return func elif inspect.isfunction(func): - raise ValueError("Please structure your skill as a Class.") + msg = "Please structure your skill as a Class." + raise ValueError(msg) else: - raise ValueError(f"Unsupported function type: {type(func)}") + msg = f"Unsupported function type: {type(func)}" + raise ValueError(msg) return decorator @@ -88,12 +93,14 @@ def populate_skill_implementation(skill_imp: "SkillImplementation", sk: "Skill") skill_imp.guide_skill = sk.guide if skill_imp.prompt is None: if sk.prompt is None: - raise ValueError(f"Prompt is not set for skill: {sk.__name__} ({skill_imp.language}). Prompt must be set in either skill or skill implementation.") + msg = f"Prompt is not set for skill: {sk.__name__} ({skill_imp.language}). Prompt must be set in either skill or skill implementation." + raise ValueError(msg) else: skill_imp.prompt = sk.prompt if skill_imp.doc is None: if sk.doc is None: - raise ValueError(f"Docstring is not set for skill: {sk.__name__} ({skill_imp.language}). Docstring must be set in either skill or skill implementation.") + msg = f"Docstring is not set for skill: {sk.__name__} ({skill_imp.language}). Docstring must be set in either skill or skill implementation." + raise ValueError(msg) else: skill_imp.doc = sk.doc return skill_imp @@ -133,7 +140,8 @@ def decorator(cls): skill_name_to_skill_implementations[cls.name] = cls.implementations() skills.append(cls) else: - raise ValueError(f"Skill with name {cls.name} ({cls.__name__}) already exists. Please Rename the skill class.") + msg = f"Skill with name {cls.name} ({cls.__name__}) already exists. Please Rename the skill class." + raise ValueError(msg) return cls return decorator diff --git a/tests/shared/skills/skill.py b/tests/shared/skills/skill.py index cfb4e09ec..17b695faa 100644 --- a/tests/shared/skills/skill.py +++ b/tests/shared/skills/skill.py @@ -1,10 +1,13 @@ import inspect from abc import ABC from pathlib import Path +from typing import TYPE_CHECKING from codegen.sdk.core.codebase import Codebase, CodebaseType, PyCodebaseType, TSCodebaseType from codegen.sdk.enums import ProgrammingLanguage -from tests.shared.skills.skill_implementation import SkillImplementation + +if TYPE_CHECKING: + from tests.shared.skills.skill_implementation import SkillImplementation class Skill(ABC): @@ -89,7 +92,8 @@ def guide_path(cls) -> Path: # ===== [Path from Guides] ===== if "guides" not in filepath_tuple: - raise ValueError(f"Skill {cls.name} is not in a guides directory") + msg = f"Skill {cls.name} is not in a guides directory" + raise ValueError(msg) guides_index = filepath_tuple.index("guides") guides_path = Path("/".join(filepath.parts[guides_index:])) diff --git a/tests/shared/skills/skill_implementation.py b/tests/shared/skills/skill_implementation.py index 4d2d8e61e..dc83a7049 100644 --- a/tests/shared/skills/skill_implementation.py +++ b/tests/shared/skills/skill_implementation.py @@ -42,7 +42,8 @@ def __init__( self.language = language self.test_cases = [] if skip_test else test_cases if not (skip_test or from_app) and len(self.test_cases) == 0: - raise Exception("Skill must have at least one test case") + msg = "Skill must have at least one test case" + raise Exception(msg) self.repo_id = repo_id self._skill_func = skill_func self.eval_skill = eval_skill diff --git a/tests/shared/skills/skill_test.py b/tests/shared/skills/skill_test.py index 7558425b1..c99530c0b 100644 --- a/tests/shared/skills/skill_test.py +++ b/tests/shared/skills/skill_test.py @@ -64,7 +64,8 @@ def from_dir(cls, filepath: Path) -> "SkillTestCase": elif relative_path.suffix in TSFile.get_extensions(): files.append(SkillTestCaseTSFile(input=input_content, output=output_content, filepath=str(relative_path))) else: - raise ValueError(f"Unsupported file extension: {relative_path.suffix} for file: {relative_path}") + msg = f"Unsupported file extension: {relative_path.suffix} for file: {relative_path}" + raise ValueError(msg) return cls(files=files, filepath=str(filepath)) diff --git a/tests/shared/skills/verify_skill_output.py b/tests/shared/skills/verify_skill_output.py index e73a82e33..c043de7c0 100644 --- a/tests/shared/skills/verify_skill_output.py +++ b/tests/shared/skills/verify_skill_output.py @@ -39,7 +39,8 @@ def reformat_code_string(code: str, language: ProgrammingLanguage) -> str: options = get_jsbeautifier_options() return jsbeautifier.beautify(code, options) else: - raise ValueError(f"Unsupported programming language: {language}!") + msg = f"Unsupported programming language: {language}!" + raise ValueError(msg) def verify_skill_output(codebase: Codebase, skill, test_case, get_diff, snapshot) -> str | None: diff --git a/tests/unit/codegen/runner/sandbox/test_executor.py b/tests/unit/codegen/runner/sandbox/test_executor.py index e10e8df20..0c1fa5f7a 100644 --- a/tests/unit/codegen/runner/sandbox/test_executor.py +++ b/tests/unit/codegen/runner/sandbox/test_executor.py @@ -1,17 +1,20 @@ from __future__ import annotations +from typing import TYPE_CHECKING from unittest.mock import MagicMock import pytest from codegen.git.models.codemod_context import CodemodContext from codegen.runner.models.codemod import GroupingConfig -from codegen.runner.sandbox.executor import SandboxExecutor from codegen.sdk.codebase.config import SessionOptions from codegen.sdk.codebase.flagging.code_flag import CodeFlag from codegen.sdk.codebase.flagging.groupers.enums import GroupBy from codegen.shared.compilation.string_to_code import create_execute_function_from_codeblock +if TYPE_CHECKING: + from codegen.runner.sandbox.executor import SandboxExecutor + @pytest.mark.asyncio async def test_execute_func_pass_in_codemod_context_takes_priority(executor: SandboxExecutor): diff --git a/tests/unit/codegen/sdk/codebase/file_graph/test_symbol_parent_statement.py b/tests/unit/codegen/sdk/codebase/file_graph/test_symbol_parent_statement.py index 7f5fdb06d..5eb6e77e2 100644 --- a/tests/unit/codegen/sdk/codebase/file_graph/test_symbol_parent_statement.py +++ b/tests/unit/codegen/sdk/codebase/file_graph/test_symbol_parent_statement.py @@ -1,5 +1,9 @@ +from typing import TYPE_CHECKING + from codegen.sdk.codebase.factory.get_session import get_codebase_session -from codegen.sdk.python import PyFile + +if TYPE_CHECKING: + from codegen.sdk.python import PyFile def test_parent_statement_function(tmpdir): diff --git a/tests/unit/codegen/sdk/python/class_definition/test_class_add_method.py b/tests/unit/codegen/sdk/python/class_definition/test_class_add_method.py index eb0b0d84a..7ea471a8a 100644 --- a/tests/unit/codegen/sdk/python/class_definition/test_class_add_method.py +++ b/tests/unit/codegen/sdk/python/class_definition/test_class_add_method.py @@ -1,5 +1,9 @@ +from typing import TYPE_CHECKING + from codegen.sdk.codebase.factory.get_session import get_codebase_session -from codegen.sdk.python import PyClass, PyFile + +if TYPE_CHECKING: + from codegen.sdk.python import PyClass, PyFile def test_add_method_basic(tmpdir) -> None: diff --git a/tests/unit/codegen/sdk/python/class_definition/test_class_constructor_usages.py b/tests/unit/codegen/sdk/python/class_definition/test_class_constructor_usages.py index 67b15d6d7..fe4a07dac 100644 --- a/tests/unit/codegen/sdk/python/class_definition/test_class_constructor_usages.py +++ b/tests/unit/codegen/sdk/python/class_definition/test_class_constructor_usages.py @@ -1,8 +1,12 @@ +from typing import TYPE_CHECKING + from codegen.sdk.codebase.factory.get_session import get_codebase_session -from codegen.sdk.core.class_definition import Class -from codegen.sdk.core.detached_symbols.function_call import FunctionCall from codegen.sdk.enums import ProgrammingLanguage +if TYPE_CHECKING: + from codegen.sdk.core.class_definition import Class + from codegen.sdk.core.detached_symbols.function_call import FunctionCall + def test_class_definition_parent_class_names_single(tmpdir) -> None: FILENAME = "test.py" diff --git a/tests/unit/codegen/sdk/python/class_definition/test_class_properties.py b/tests/unit/codegen/sdk/python/class_definition/test_class_properties.py index 7b4fcd2a1..ccefcab61 100644 --- a/tests/unit/codegen/sdk/python/class_definition/test_class_properties.py +++ b/tests/unit/codegen/sdk/python/class_definition/test_class_properties.py @@ -1,7 +1,11 @@ +from typing import TYPE_CHECKING + import pytest from codegen.sdk.codebase.factory.get_session import get_codebase_session -from codegen.sdk.python import PyClass + +if TYPE_CHECKING: + from codegen.sdk.python import PyClass def test_classes(tmpdir) -> None: diff --git a/tests/unit/codegen/sdk/python/codebase/test_control_flow.py b/tests/unit/codegen/sdk/python/codebase/test_control_flow.py index a5759697d..589f2a2fd 100644 --- a/tests/unit/codegen/sdk/python/codebase/test_control_flow.py +++ b/tests/unit/codegen/sdk/python/codebase/test_control_flow.py @@ -15,14 +15,16 @@ def test_max_transactions_exceeded_reached_set_threshold(tmpdir): def test_raise_max_transactions_exceeded_reached_no_threshold(tmpdir): with pytest.raises(MaxTransactionsExceeded) as exc_info: - raise MaxTransactionsExceeded("test exception") + msg = "test exception" + raise MaxTransactionsExceeded(msg) assert str(exc_info.value) == "test exception" assert exc_info.value.threshold is None def test_raise_max_transactions_exceeded_reached_with_threshold(tmpdir): with pytest.raises(MaxTransactionsExceeded) as exc_info: - raise MaxTransactionsExceeded("test exception", threshold=1) + msg = "test exception" + raise MaxTransactionsExceeded(msg, threshold=1) assert str(exc_info.value) == "test exception" assert exc_info.value.threshold == 1 diff --git a/tests/unit/codegen/sdk/python/detached_symbols/code_block/test_code_block.py b/tests/unit/codegen/sdk/python/detached_symbols/code_block/test_code_block.py index 610054cff..3ef552301 100644 --- a/tests/unit/codegen/sdk/python/detached_symbols/code_block/test_code_block.py +++ b/tests/unit/codegen/sdk/python/detached_symbols/code_block/test_code_block.py @@ -1,9 +1,12 @@ import re +from typing import TYPE_CHECKING from codegen.sdk.codebase.factory.get_session import get_codebase_session from codegen.sdk.core.statements.statement import StatementType from codegen.sdk.enums import ProgrammingLanguage -from codegen.sdk.python import PyFile + +if TYPE_CHECKING: + from codegen.sdk.python import PyFile def test_code_block(tmpdir) -> None: diff --git a/tests/unit/codegen/sdk/python/detached_symbols/code_block/test_code_block_indent.py b/tests/unit/codegen/sdk/python/detached_symbols/code_block/test_code_block_indent.py index c626d77aa..4bd8a726f 100644 --- a/tests/unit/codegen/sdk/python/detached_symbols/code_block/test_code_block_indent.py +++ b/tests/unit/codegen/sdk/python/detached_symbols/code_block/test_code_block_indent.py @@ -1,6 +1,10 @@ +from typing import TYPE_CHECKING + from codegen.sdk.codebase.factory.get_session import get_codebase_session from codegen.sdk.core.statements.statement import StatementType -from codegen.sdk.python import PyFile + +if TYPE_CHECKING: + from codegen.sdk.python import PyFile def test_indent_left_once(tmpdir): diff --git a/tests/unit/codegen/sdk/python/detached_symbols/code_block/test_code_block_unwrap.py b/tests/unit/codegen/sdk/python/detached_symbols/code_block/test_code_block_unwrap.py index c64a05a0c..df9419975 100644 --- a/tests/unit/codegen/sdk/python/detached_symbols/code_block/test_code_block_unwrap.py +++ b/tests/unit/codegen/sdk/python/detached_symbols/code_block/test_code_block_unwrap.py @@ -1,6 +1,10 @@ +from typing import TYPE_CHECKING + from codegen.sdk.codebase.factory.get_session import get_codebase_session from codegen.sdk.core.statements.statement import StatementType -from codegen.sdk.python import PyFile + +if TYPE_CHECKING: + from codegen.sdk.python import PyFile def test_unwrap_flat_statements(tmpdir): diff --git a/tests/unit/codegen/sdk/python/detached_symbols/code_block/test_code_block_wrap.py b/tests/unit/codegen/sdk/python/detached_symbols/code_block/test_code_block_wrap.py index 1691c69e5..046be8ff5 100644 --- a/tests/unit/codegen/sdk/python/detached_symbols/code_block/test_code_block_wrap.py +++ b/tests/unit/codegen/sdk/python/detached_symbols/code_block/test_code_block_wrap.py @@ -1,5 +1,9 @@ +from typing import TYPE_CHECKING + from codegen.sdk.codebase.factory.get_session import get_codebase_session -from codegen.sdk.python import PyFile + +if TYPE_CHECKING: + from codegen.sdk.python import PyFile def test_wrap_with_with_statement(tmpdir): diff --git a/tests/unit/codegen/sdk/python/detached_symbols/function_call/test_function_call.py b/tests/unit/codegen/sdk/python/detached_symbols/function_call/test_function_call.py index 7e25c83ff..d8a735e8d 100644 --- a/tests/unit/codegen/sdk/python/detached_symbols/function_call/test_function_call.py +++ b/tests/unit/codegen/sdk/python/detached_symbols/function_call/test_function_call.py @@ -1,6 +1,10 @@ # TODO: this file needs to be broken up into API specific tests +from typing import TYPE_CHECKING + from codegen.sdk.codebase.factory.get_session import get_codebase_session -from codegen.sdk.python import PyFunction + +if TYPE_CHECKING: + from codegen.sdk.python import PyFunction def test_basic(tmpdir) -> None: diff --git a/tests/unit/codegen/sdk/python/detached_symbols/function_call/test_function_call_add_argument.py b/tests/unit/codegen/sdk/python/detached_symbols/function_call/test_function_call_add_argument.py index 17bb5cc7d..4dfde1cdf 100644 --- a/tests/unit/codegen/sdk/python/detached_symbols/function_call/test_function_call_add_argument.py +++ b/tests/unit/codegen/sdk/python/detached_symbols/function_call/test_function_call_add_argument.py @@ -1,5 +1,9 @@ +from typing import TYPE_CHECKING + from codegen.sdk.codebase.factory.get_session import get_codebase_session -from codegen.sdk.core.function import Function + +if TYPE_CHECKING: + from codegen.sdk.core.function import Function def test_function_call_insert_argument(tmpdir) -> None: diff --git a/tests/unit/codegen/sdk/python/detached_symbols/function_call/test_manipulations_function_call.py b/tests/unit/codegen/sdk/python/detached_symbols/function_call/test_manipulations_function_call.py index ef0d591b5..969162444 100644 --- a/tests/unit/codegen/sdk/python/detached_symbols/function_call/test_manipulations_function_call.py +++ b/tests/unit/codegen/sdk/python/detached_symbols/function_call/test_manipulations_function_call.py @@ -1,10 +1,14 @@ # TODO: convert all of this to use mock files/tmpdir +from typing import TYPE_CHECKING + from codegen.sdk.codebase.factory.get_session import get_codebase_session -from codegen.sdk.core.file import SourceFile -from codegen.sdk.core.function import Function from codegen.sdk.enums import ProgrammingLanguage +if TYPE_CHECKING: + from codegen.sdk.core.file import SourceFile + from codegen.sdk.core.function import Function + def test_replace_function_call_arg(tmpdir) -> None: filename = "test_arg.py" diff --git a/tests/unit/codegen/sdk/python/detached_symbols/parameter/test_parameter_edit.py b/tests/unit/codegen/sdk/python/detached_symbols/parameter/test_parameter_edit.py index dc5b077c4..5ee686918 100644 --- a/tests/unit/codegen/sdk/python/detached_symbols/parameter/test_parameter_edit.py +++ b/tests/unit/codegen/sdk/python/detached_symbols/parameter/test_parameter_edit.py @@ -1,7 +1,11 @@ +from typing import TYPE_CHECKING + from codegen.sdk.codebase.factory.get_session import get_codebase_session -from codegen.sdk.core.function import Function from codegen.sdk.enums import ProgrammingLanguage +if TYPE_CHECKING: + from codegen.sdk.core.function import Function + def test_edit_parameter_in_function_definition(tmpdir) -> None: filename = "test.py" diff --git a/tests/unit/codegen/sdk/python/detached_symbols/parameter/test_parameter_is_optional.py b/tests/unit/codegen/sdk/python/detached_symbols/parameter/test_parameter_is_optional.py index e31075178..ac4f99862 100644 --- a/tests/unit/codegen/sdk/python/detached_symbols/parameter/test_parameter_is_optional.py +++ b/tests/unit/codegen/sdk/python/detached_symbols/parameter/test_parameter_is_optional.py @@ -1,7 +1,11 @@ +from typing import TYPE_CHECKING + from codegen.sdk.codebase.factory.get_session import get_codebase_session -from codegen.sdk.core.function import Function from codegen.sdk.enums import ProgrammingLanguage +if TYPE_CHECKING: + from codegen.sdk.core.function import Function + def test_parameter_is_optional_should_return_true(tmpdir) -> None: filename = "test.py" diff --git a/tests/unit/codegen/sdk/python/detached_symbols/parameter/test_parameter_is_variadic.py b/tests/unit/codegen/sdk/python/detached_symbols/parameter/test_parameter_is_variadic.py index 02c058281..4e4950551 100644 --- a/tests/unit/codegen/sdk/python/detached_symbols/parameter/test_parameter_is_variadic.py +++ b/tests/unit/codegen/sdk/python/detached_symbols/parameter/test_parameter_is_variadic.py @@ -1,7 +1,11 @@ +from typing import TYPE_CHECKING + from codegen.sdk.codebase.factory.get_session import get_codebase_session -from codegen.sdk.core.function import Function from codegen.sdk.enums import ProgrammingLanguage +if TYPE_CHECKING: + from codegen.sdk.core.function import Function + def test_parameter_args_is_variadic_should_return_true(tmpdir) -> None: filename = "test.py" diff --git a/tests/unit/codegen/sdk/python/expressions/test_binary_expression.py b/tests/unit/codegen/sdk/python/expressions/test_binary_expression.py index 8f1869c1e..918d7d171 100644 --- a/tests/unit/codegen/sdk/python/expressions/test_binary_expression.py +++ b/tests/unit/codegen/sdk/python/expressions/test_binary_expression.py @@ -1,8 +1,12 @@ +from typing import TYPE_CHECKING + import pytest from codegen.sdk.codebase.factory.get_session import get_codebase_session from codegen.sdk.core.expressions.binary_expression import BinaryExpression -from codegen.sdk.python import PyFile + +if TYPE_CHECKING: + from codegen.sdk.python import PyFile def test_all_binary_expression_types(tmpdir): diff --git a/tests/unit/codegen/sdk/python/expressions/test_binary_reduce_condition.py b/tests/unit/codegen/sdk/python/expressions/test_binary_reduce_condition.py index 96341a81c..1e63e0fd1 100644 --- a/tests/unit/codegen/sdk/python/expressions/test_binary_reduce_condition.py +++ b/tests/unit/codegen/sdk/python/expressions/test_binary_reduce_condition.py @@ -1,6 +1,10 @@ +from typing import TYPE_CHECKING + from codegen.sdk.codebase.factory.get_session import get_codebase_session from codegen.sdk.enums import ProgrammingLanguage -from codegen.sdk.python.file import PyFile + +if TYPE_CHECKING: + from codegen.sdk.python.file import PyFile def test_reduce_binary_simple(tmpdir): diff --git a/tests/unit/codegen/sdk/python/expressions/test_conditional_properties.py b/tests/unit/codegen/sdk/python/expressions/test_conditional_properties.py index 6de9751d0..7eefc78a4 100644 --- a/tests/unit/codegen/sdk/python/expressions/test_conditional_properties.py +++ b/tests/unit/codegen/sdk/python/expressions/test_conditional_properties.py @@ -1,6 +1,10 @@ +from typing import TYPE_CHECKING + from codegen.sdk.codebase.factory.get_session import get_codebase_session from codegen.sdk.enums import ProgrammingLanguage -from codegen.sdk.python.file import PyFile + +if TYPE_CHECKING: + from codegen.sdk.python.file import PyFile def test_parse_simple_conditional_expression(tmpdir: str) -> None: diff --git a/tests/unit/codegen/sdk/python/expressions/test_conditional_reduce_condition.py b/tests/unit/codegen/sdk/python/expressions/test_conditional_reduce_condition.py index fc89932ad..6aae29192 100644 --- a/tests/unit/codegen/sdk/python/expressions/test_conditional_reduce_condition.py +++ b/tests/unit/codegen/sdk/python/expressions/test_conditional_reduce_condition.py @@ -1,8 +1,10 @@ -from typing import Any +from typing import TYPE_CHECKING, Any from codegen.sdk.codebase.factory.get_session import get_codebase_session from codegen.sdk.enums import ProgrammingLanguage -from codegen.sdk.python.file import PyFile + +if TYPE_CHECKING: + from codegen.sdk.python.file import PyFile def test_reduce_ternary_condition_to_true(tmpdir: Any) -> None: diff --git a/tests/unit/codegen/sdk/python/expressions/test_dict.py b/tests/unit/codegen/sdk/python/expressions/test_dict.py index 8d08bdd04..5749ac1c1 100644 --- a/tests/unit/codegen/sdk/python/expressions/test_dict.py +++ b/tests/unit/codegen/sdk/python/expressions/test_dict.py @@ -1,9 +1,12 @@ from itertools import product +from typing import TYPE_CHECKING import pytest from codegen.sdk.codebase.factory.get_session import get_codebase_session -from codegen.sdk.core.symbol_groups.dict import Dict + +if TYPE_CHECKING: + from codegen.sdk.core.symbol_groups.dict import Dict def test_dict_basic(tmpdir) -> None: diff --git a/tests/unit/codegen/sdk/python/expressions/test_list.py b/tests/unit/codegen/sdk/python/expressions/test_list.py index 57ba0db51..74388999c 100644 --- a/tests/unit/codegen/sdk/python/expressions/test_list.py +++ b/tests/unit/codegen/sdk/python/expressions/test_list.py @@ -1,9 +1,12 @@ from itertools import product +from typing import TYPE_CHECKING import pytest from codegen.sdk.codebase.factory.get_session import get_codebase_session -from codegen.sdk.core.symbol_groups.list import List + +if TYPE_CHECKING: + from codegen.sdk.core.symbol_groups.list import List def test_list_basic(tmpdir) -> None: diff --git a/tests/unit/codegen/sdk/python/expressions/test_tuple.py b/tests/unit/codegen/sdk/python/expressions/test_tuple.py index c54d1f2b2..359060546 100644 --- a/tests/unit/codegen/sdk/python/expressions/test_tuple.py +++ b/tests/unit/codegen/sdk/python/expressions/test_tuple.py @@ -1,5 +1,9 @@ +from typing import TYPE_CHECKING + from codegen.sdk.codebase.factory.get_session import get_codebase_session -from codegen.sdk.core.symbol_groups.tuple import Tuple + +if TYPE_CHECKING: + from codegen.sdk.core.symbol_groups.tuple import Tuple def test_tuple_basic(tmpdir) -> None: diff --git a/tests/unit/codegen/sdk/python/expressions/test_type.py b/tests/unit/codegen/sdk/python/expressions/test_type.py index b67cac15f..22cd7f8f5 100644 --- a/tests/unit/codegen/sdk/python/expressions/test_type.py +++ b/tests/unit/codegen/sdk/python/expressions/test_type.py @@ -1,9 +1,13 @@ +from typing import TYPE_CHECKING + from codegen.sdk.codebase.factory.get_session import get_codebase_session from codegen.sdk.core.expressions.none_type import NoneType from codegen.sdk.core.expressions.type import Type -from codegen.sdk.python import PyAssignment, PyClass, PyFunction from codegen.sdk.python.expressions.union_type import PyUnionType +if TYPE_CHECKING: + from codegen.sdk.python import PyAssignment, PyClass, PyFunction + def test_type_basic(tmpdir): file = "test.py" diff --git a/tests/unit/codegen/sdk/python/function/test_function_call_sites.py b/tests/unit/codegen/sdk/python/function/test_function_call_sites.py index 614eaf1dd..84578a37e 100644 --- a/tests/unit/codegen/sdk/python/function/test_function_call_sites.py +++ b/tests/unit/codegen/sdk/python/function/test_function_call_sites.py @@ -1,5 +1,9 @@ +from typing import TYPE_CHECKING + from codegen.sdk.codebase.factory.get_session import get_codebase_session -from codegen.sdk.python import PyFile, PyFunction + +if TYPE_CHECKING: + from codegen.sdk.python import PyFile, PyFunction def test_function_callsites(tmpdir) -> None: diff --git a/tests/unit/codegen/sdk/python/function/test_function_function_calls.py b/tests/unit/codegen/sdk/python/function/test_function_function_calls.py index e6cca748a..3a6ea7b26 100644 --- a/tests/unit/codegen/sdk/python/function/test_function_function_calls.py +++ b/tests/unit/codegen/sdk/python/function/test_function_function_calls.py @@ -1,5 +1,9 @@ +from typing import TYPE_CHECKING + from codegen.sdk.codebase.factory.get_session import get_codebase_session -from codegen.sdk.python import PyFunction + +if TYPE_CHECKING: + from codegen.sdk.python import PyFunction def test_function_calls(tmpdir) -> None: diff --git a/tests/unit/codegen/sdk/python/function/test_function_parse.py b/tests/unit/codegen/sdk/python/function/test_function_parse.py index 48d2bad30..5b7406a87 100644 --- a/tests/unit/codegen/sdk/python/function/test_function_parse.py +++ b/tests/unit/codegen/sdk/python/function/test_function_parse.py @@ -1,7 +1,11 @@ # TODO: break-up this file into one for each API +from typing import TYPE_CHECKING + from codegen.sdk.codebase.factory.get_session import get_codebase_session -from codegen.sdk.core.file import SourceFile + +if TYPE_CHECKING: + from codegen.sdk.core.file import SourceFile def test_local_import(tmpdir) -> None: diff --git a/tests/unit/codegen/sdk/python/function/test_function_set_docstring.py b/tests/unit/codegen/sdk/python/function/test_function_set_docstring.py index 6bf130881..f30d92c73 100644 --- a/tests/unit/codegen/sdk/python/function/test_function_set_docstring.py +++ b/tests/unit/codegen/sdk/python/function/test_function_set_docstring.py @@ -1,7 +1,11 @@ +from typing import TYPE_CHECKING + from codegen.sdk.codebase.factory.get_session import get_codebase_session -from codegen.sdk.core.function import Function from codegen.sdk.enums import ProgrammingLanguage +if TYPE_CHECKING: + from codegen.sdk.core.function import Function + def test_set_docstring(tmpdir) -> None: FILENAME = "file.py" diff --git a/tests/unit/codegen/sdk/python/import_resolution/test_import_resolution.py b/tests/unit/codegen/sdk/python/import_resolution/test_import_resolution.py index 4df8fbbb3..0da5ae316 100644 --- a/tests/unit/codegen/sdk/python/import_resolution/test_import_resolution.py +++ b/tests/unit/codegen/sdk/python/import_resolution/test_import_resolution.py @@ -1,6 +1,10 @@ +from typing import TYPE_CHECKING + from codegen.sdk.codebase.factory.get_session import get_codebase_session -from codegen.sdk.core.file import SourceFile -from codegen.sdk.core.import_resolution import Import, ImportResolution + +if TYPE_CHECKING: + from codegen.sdk.core.file import SourceFile + from codegen.sdk.core.import_resolution import Import, ImportResolution def test_import_properties_basic(tmpdir) -> None: diff --git a/tests/unit/codegen/sdk/python/statements/if_block_statement/test_if_block_reduce_block.py b/tests/unit/codegen/sdk/python/statements/if_block_statement/test_if_block_reduce_block.py index 7dd308d41..d1eaecd13 100644 --- a/tests/unit/codegen/sdk/python/statements/if_block_statement/test_if_block_reduce_block.py +++ b/tests/unit/codegen/sdk/python/statements/if_block_statement/test_if_block_reduce_block.py @@ -1,8 +1,12 @@ +from typing import TYPE_CHECKING + import pytest from codegen.sdk.codebase.factory.get_session import get_codebase_session from codegen.sdk.core.statements.statement import StatementType -from codegen.sdk.python import PyFile + +if TYPE_CHECKING: + from codegen.sdk.python import PyFile def test_reduce_condition_to_true_elif(tmpdir): diff --git a/tests/unit/codegen/sdk/python/statements/if_block_statement/test_if_block_statement_properties.py b/tests/unit/codegen/sdk/python/statements/if_block_statement/test_if_block_statement_properties.py index 1cc7170c3..23a3a7e6a 100644 --- a/tests/unit/codegen/sdk/python/statements/if_block_statement/test_if_block_statement_properties.py +++ b/tests/unit/codegen/sdk/python/statements/if_block_statement/test_if_block_statement_properties.py @@ -1,7 +1,11 @@ +from typing import TYPE_CHECKING + from codegen.sdk.codebase.factory.get_session import get_codebase_session from codegen.sdk.core.statements.statement import StatementType -from codegen.sdk.python import PyFile -from codegen.sdk.python.statements.if_block_statement import PyIfBlockStatement + +if TYPE_CHECKING: + from codegen.sdk.python import PyFile + from codegen.sdk.python.statements.if_block_statement import PyIfBlockStatement def test_parse_conditional_statement_from_codeblock(tmpdir) -> None: diff --git a/tests/unit/codegen/sdk/python/statements/with_statement/test_with_statement_properties.py b/tests/unit/codegen/sdk/python/statements/with_statement/test_with_statement_properties.py index 61c8a68ca..db139e11e 100644 --- a/tests/unit/codegen/sdk/python/statements/with_statement/test_with_statement_properties.py +++ b/tests/unit/codegen/sdk/python/statements/with_statement/test_with_statement_properties.py @@ -1,7 +1,11 @@ +from typing import TYPE_CHECKING + from codegen.sdk.codebase.factory.get_session import get_codebase_session from codegen.sdk.core.detached_symbols.function_call import FunctionCall from codegen.sdk.core.expressions import Name, Value -from codegen.sdk.python import PyFile + +if TYPE_CHECKING: + from codegen.sdk.python import PyFile def test_with_statement_single_var(tmpdir): diff --git a/tests/unit/codegen/sdk/typescript/class_definition/test_class_add_method.py b/tests/unit/codegen/sdk/typescript/class_definition/test_class_add_method.py index 6980b817a..51f75d5cc 100644 --- a/tests/unit/codegen/sdk/typescript/class_definition/test_class_add_method.py +++ b/tests/unit/codegen/sdk/typescript/class_definition/test_class_add_method.py @@ -1,7 +1,11 @@ +from typing import TYPE_CHECKING + from codegen.sdk.codebase.factory.get_session import get_codebase_session from codegen.sdk.enums import ProgrammingLanguage -from codegen.sdk.typescript.class_definition import TSClass -from codegen.sdk.typescript.file import TSFile + +if TYPE_CHECKING: + from codegen.sdk.typescript.class_definition import TSClass + from codegen.sdk.typescript.file import TSFile def test_add_method_basic(tmpdir) -> None: diff --git a/tests/unit/codegen/sdk/typescript/class_definition/test_class_constructor_usages.py b/tests/unit/codegen/sdk/typescript/class_definition/test_class_constructor_usages.py index 53a555113..abe2bc405 100644 --- a/tests/unit/codegen/sdk/typescript/class_definition/test_class_constructor_usages.py +++ b/tests/unit/codegen/sdk/typescript/class_definition/test_class_constructor_usages.py @@ -1,8 +1,12 @@ +from typing import TYPE_CHECKING + from codegen.sdk.codebase.factory.get_session import get_codebase_session -from codegen.sdk.core.class_definition import Class -from codegen.sdk.core.detached_symbols.function_call import FunctionCall from codegen.sdk.enums import ProgrammingLanguage +if TYPE_CHECKING: + from codegen.sdk.core.class_definition import Class + from codegen.sdk.core.detached_symbols.function_call import FunctionCall + def test_class_definition_parent_class_names_single(tmpdir) -> None: FILENAME = "test.ts" diff --git a/tests/unit/codegen/sdk/typescript/detached_symbols/argument/test_argument_edit.py b/tests/unit/codegen/sdk/typescript/detached_symbols/argument/test_argument_edit.py index b936fff08..1bbfe3028 100644 --- a/tests/unit/codegen/sdk/typescript/detached_symbols/argument/test_argument_edit.py +++ b/tests/unit/codegen/sdk/typescript/detached_symbols/argument/test_argument_edit.py @@ -1,8 +1,12 @@ +from typing import TYPE_CHECKING + from codegen.sdk.codebase.factory.get_session import get_codebase_session -from codegen.sdk.core.file import SourceFile -from codegen.sdk.core.function import Function from codegen.sdk.enums import ProgrammingLanguage +if TYPE_CHECKING: + from codegen.sdk.core.file import SourceFile + from codegen.sdk.core.function import Function + def test_edit_arg_in_function_call(tmpdir) -> None: filename = "test_arg.ts" diff --git a/tests/unit/codegen/sdk/typescript/detached_symbols/code_block/test_code_block_unwrap.py b/tests/unit/codegen/sdk/typescript/detached_symbols/code_block/test_code_block_unwrap.py index 7ed1f1de6..0ebccc5b5 100644 --- a/tests/unit/codegen/sdk/typescript/detached_symbols/code_block/test_code_block_unwrap.py +++ b/tests/unit/codegen/sdk/typescript/detached_symbols/code_block/test_code_block_unwrap.py @@ -1,7 +1,11 @@ +from typing import TYPE_CHECKING + from codegen.sdk.codebase.factory.get_session import get_codebase_session from codegen.sdk.core.statements.statement import StatementType from codegen.sdk.enums import ProgrammingLanguage -from codegen.sdk.typescript.file import TSFile + +if TYPE_CHECKING: + from codegen.sdk.typescript.file import TSFile def test_unwrap_flat_statements(tmpdir): diff --git a/tests/unit/codegen/sdk/typescript/detached_symbols/parameter/test_parameter_deconstructed.py b/tests/unit/codegen/sdk/typescript/detached_symbols/parameter/test_parameter_deconstructed.py index ec6f20a9e..0276072d5 100644 --- a/tests/unit/codegen/sdk/typescript/detached_symbols/parameter/test_parameter_deconstructed.py +++ b/tests/unit/codegen/sdk/typescript/detached_symbols/parameter/test_parameter_deconstructed.py @@ -1,7 +1,11 @@ +from typing import TYPE_CHECKING + from codegen.sdk.codebase.factory.get_session import get_codebase_session from codegen.sdk.enums import ProgrammingLanguage -from codegen.sdk.typescript.file import TSFile -from codegen.sdk.typescript.function import TSFunction + +if TYPE_CHECKING: + from codegen.sdk.typescript.file import TSFile + from codegen.sdk.typescript.function import TSFunction def test_edit_parameter_in_function_definition(tmpdir) -> None: diff --git a/tests/unit/codegen/sdk/typescript/detached_symbols/parameter/test_parameter_edit.py b/tests/unit/codegen/sdk/typescript/detached_symbols/parameter/test_parameter_edit.py index bf9cf0323..bfda50e1d 100644 --- a/tests/unit/codegen/sdk/typescript/detached_symbols/parameter/test_parameter_edit.py +++ b/tests/unit/codegen/sdk/typescript/detached_symbols/parameter/test_parameter_edit.py @@ -1,7 +1,11 @@ +from typing import TYPE_CHECKING + from codegen.sdk.codebase.factory.get_session import get_codebase_session -from codegen.sdk.core.function import Function from codegen.sdk.enums import ProgrammingLanguage +if TYPE_CHECKING: + from codegen.sdk.core.function import Function + def test_edit_parameter_in_function_definition(tmpdir) -> None: filename = "test_definition.ts" diff --git a/tests/unit/codegen/sdk/typescript/detached_symbols/parameter/test_parameter_is_optional.py b/tests/unit/codegen/sdk/typescript/detached_symbols/parameter/test_parameter_is_optional.py index 2d7171df7..09d686796 100644 --- a/tests/unit/codegen/sdk/typescript/detached_symbols/parameter/test_parameter_is_optional.py +++ b/tests/unit/codegen/sdk/typescript/detached_symbols/parameter/test_parameter_is_optional.py @@ -1,7 +1,11 @@ +from typing import TYPE_CHECKING + from codegen.sdk.codebase.factory.get_session import get_codebase_session -from codegen.sdk.core.function import Function from codegen.sdk.enums import ProgrammingLanguage +if TYPE_CHECKING: + from codegen.sdk.core.function import Function + def test_parameter_is_optional_should_return_true(tmpdir) -> None: filename = "test.ts" diff --git a/tests/unit/codegen/sdk/typescript/detached_symbols/parameter/test_parameter_is_variadic.py b/tests/unit/codegen/sdk/typescript/detached_symbols/parameter/test_parameter_is_variadic.py index 757e0ef56..fa9fd5d47 100644 --- a/tests/unit/codegen/sdk/typescript/detached_symbols/parameter/test_parameter_is_variadic.py +++ b/tests/unit/codegen/sdk/typescript/detached_symbols/parameter/test_parameter_is_variadic.py @@ -1,7 +1,11 @@ +from typing import TYPE_CHECKING + from codegen.sdk.codebase.factory.get_session import get_codebase_session -from codegen.sdk.core.function import Function from codegen.sdk.enums import ProgrammingLanguage +if TYPE_CHECKING: + from codegen.sdk.core.function import Function + def test_parameter_is_variadic_should_return_true(tmpdir) -> None: filename = "test.ts" diff --git a/tests/unit/codegen/sdk/typescript/export/test_export_aliased.py b/tests/unit/codegen/sdk/typescript/export/test_export_aliased.py index abee95928..48bc5a502 100644 --- a/tests/unit/codegen/sdk/typescript/export/test_export_aliased.py +++ b/tests/unit/codegen/sdk/typescript/export/test_export_aliased.py @@ -1,6 +1,10 @@ +from typing import TYPE_CHECKING + from codegen.sdk.codebase.factory.get_session import get_codebase_session from codegen.sdk.enums import ProgrammingLanguage -from codegen.sdk.typescript.file import TSFile + +if TYPE_CHECKING: + from codegen.sdk.typescript.file import TSFile def test_export_aliased(tmpdir): diff --git a/tests/unit/codegen/sdk/typescript/export/test_export_export_statement.py b/tests/unit/codegen/sdk/typescript/export/test_export_export_statement.py index 05329e4b4..c9ae8a410 100644 --- a/tests/unit/codegen/sdk/typescript/export/test_export_export_statement.py +++ b/tests/unit/codegen/sdk/typescript/export/test_export_export_statement.py @@ -1,6 +1,10 @@ +from typing import TYPE_CHECKING + from codegen.sdk.codebase.factory.get_session import get_codebase_session from codegen.sdk.enums import ProgrammingLanguage -from codegen.sdk.typescript.file import TSFile + +if TYPE_CHECKING: + from codegen.sdk.typescript.file import TSFile def test_export_export_statement(tmpdir): diff --git a/tests/unit/codegen/sdk/typescript/export/test_export_rename.py b/tests/unit/codegen/sdk/typescript/export/test_export_rename.py index 7ac15a18b..61d579bbc 100644 --- a/tests/unit/codegen/sdk/typescript/export/test_export_rename.py +++ b/tests/unit/codegen/sdk/typescript/export/test_export_rename.py @@ -1,6 +1,10 @@ +from typing import TYPE_CHECKING + from codegen.sdk.codebase.factory.get_session import get_codebase_session from codegen.sdk.enums import ProgrammingLanguage -from codegen.sdk.typescript.file import TSFile + +if TYPE_CHECKING: + from codegen.sdk.typescript.file import TSFile def test_rename_export_simple(tmpdir) -> None: diff --git a/tests/unit/codegen/sdk/typescript/export/test_export_resolve_export.py b/tests/unit/codegen/sdk/typescript/export/test_export_resolve_export.py index ca00a0dda..bc15c442c 100644 --- a/tests/unit/codegen/sdk/typescript/export/test_export_resolve_export.py +++ b/tests/unit/codegen/sdk/typescript/export/test_export_resolve_export.py @@ -1,7 +1,11 @@ +from typing import TYPE_CHECKING + from codegen.sdk.codebase.factory.get_session import get_codebase_session from codegen.sdk.core.dataclasses.usage import UsageType from codegen.sdk.enums import ProgrammingLanguage -from codegen.sdk.typescript.file import TSFile + +if TYPE_CHECKING: + from codegen.sdk.typescript.file import TSFile def test_resolve_export_with_declared_symbols(tmpdir) -> None: diff --git a/tests/unit/codegen/sdk/typescript/export/test_external_export.py b/tests/unit/codegen/sdk/typescript/export/test_external_export.py index ed81ffb1d..56c169aeb 100644 --- a/tests/unit/codegen/sdk/typescript/export/test_external_export.py +++ b/tests/unit/codegen/sdk/typescript/export/test_external_export.py @@ -1,6 +1,10 @@ +from typing import TYPE_CHECKING + from codegen.sdk.codebase.factory.get_session import get_codebase_session from codegen.sdk.enums import ProgrammingLanguage -from codegen.sdk.typescript.file import TSFile + +if TYPE_CHECKING: + from codegen.sdk.typescript.file import TSFile def test_is_external_export_true(tmpdir): diff --git a/tests/unit/codegen/sdk/typescript/export/test_get_reexported_exports.py b/tests/unit/codegen/sdk/typescript/export/test_get_reexported_exports.py index 1363b8aac..e035e2030 100644 --- a/tests/unit/codegen/sdk/typescript/export/test_get_reexported_exports.py +++ b/tests/unit/codegen/sdk/typescript/export/test_get_reexported_exports.py @@ -1,6 +1,10 @@ +from typing import TYPE_CHECKING + from codegen.sdk.codebase.factory.get_session import get_codebase_session from codegen.sdk.enums import ProgrammingLanguage -from codegen.sdk.typescript.file import TSFile + +if TYPE_CHECKING: + from codegen.sdk.typescript.file import TSFile def test_get_reexported_exports(tmpdir): diff --git a/tests/unit/codegen/sdk/typescript/expressions/ternary_expression/test_ternary_properties.py b/tests/unit/codegen/sdk/typescript/expressions/ternary_expression/test_ternary_properties.py index 78d8b8207..af534e6d6 100644 --- a/tests/unit/codegen/sdk/typescript/expressions/ternary_expression/test_ternary_properties.py +++ b/tests/unit/codegen/sdk/typescript/expressions/ternary_expression/test_ternary_properties.py @@ -1,6 +1,10 @@ +from typing import TYPE_CHECKING + from codegen.sdk.codebase.factory.get_session import get_codebase_session from codegen.sdk.enums import ProgrammingLanguage -from codegen.sdk.typescript.file import TSFile + +if TYPE_CHECKING: + from codegen.sdk.typescript.file import TSFile def test_parse_simple_ternary_expression(tmpdir) -> None: diff --git a/tests/unit/codegen/sdk/typescript/expressions/ternary_expression/test_ternary_reduce_condition.py b/tests/unit/codegen/sdk/typescript/expressions/ternary_expression/test_ternary_reduce_condition.py index 1df81e572..fac383111 100644 --- a/tests/unit/codegen/sdk/typescript/expressions/ternary_expression/test_ternary_reduce_condition.py +++ b/tests/unit/codegen/sdk/typescript/expressions/ternary_expression/test_ternary_reduce_condition.py @@ -1,6 +1,10 @@ +from typing import TYPE_CHECKING + from codegen.sdk.codebase.factory.get_session import get_codebase_session from codegen.sdk.enums import ProgrammingLanguage -from codegen.sdk.typescript.file import TSFile + +if TYPE_CHECKING: + from codegen.sdk.typescript.file import TSFile def test_reduce_ternary_condition_to_true(tmpdir): diff --git a/tests/unit/codegen/sdk/typescript/expressions/test_binary_expression.py b/tests/unit/codegen/sdk/typescript/expressions/test_binary_expression.py index 86371ec1e..9d4f26f75 100644 --- a/tests/unit/codegen/sdk/typescript/expressions/test_binary_expression.py +++ b/tests/unit/codegen/sdk/typescript/expressions/test_binary_expression.py @@ -1,7 +1,11 @@ +from typing import TYPE_CHECKING + from codegen.sdk.codebase.factory.get_session import get_codebase_session from codegen.sdk.core.expressions.binary_expression import BinaryExpression from codegen.sdk.enums import ProgrammingLanguage -from codegen.sdk.typescript.file import TSFile + +if TYPE_CHECKING: + from codegen.sdk.typescript.file import TSFile def test_binary_expressions(tmpdir): diff --git a/tests/unit/codegen/sdk/typescript/expressions/test_binary_reduce_condition.py b/tests/unit/codegen/sdk/typescript/expressions/test_binary_reduce_condition.py index 15a55d22a..b21ef842b 100644 --- a/tests/unit/codegen/sdk/typescript/expressions/test_binary_reduce_condition.py +++ b/tests/unit/codegen/sdk/typescript/expressions/test_binary_reduce_condition.py @@ -1,6 +1,10 @@ +from typing import TYPE_CHECKING + from codegen.sdk.codebase.factory.get_session import get_codebase_session from codegen.sdk.enums import ProgrammingLanguage -from codegen.sdk.typescript.file import TSFile + +if TYPE_CHECKING: + from codegen.sdk.typescript.file import TSFile def test_reduce_binary_simple(tmpdir): diff --git a/tests/unit/codegen/sdk/typescript/expressions/test_list.py b/tests/unit/codegen/sdk/typescript/expressions/test_list.py index 2b4085158..f446a3ff3 100644 --- a/tests/unit/codegen/sdk/typescript/expressions/test_list.py +++ b/tests/unit/codegen/sdk/typescript/expressions/test_list.py @@ -1,11 +1,14 @@ from itertools import product +from typing import TYPE_CHECKING import pytest from codegen.sdk.codebase.factory.get_session import get_codebase_session -from codegen.sdk.core.symbol_groups.list import List from codegen.sdk.enums import ProgrammingLanguage +if TYPE_CHECKING: + from codegen.sdk.core.symbol_groups.list import List + def test_list_basic(tmpdir) -> None: file = "test.ts" diff --git a/tests/unit/codegen/sdk/typescript/file/test_file_get_config.py b/tests/unit/codegen/sdk/typescript/file/test_file_get_config.py index 8801a50c3..5ba3c8195 100644 --- a/tests/unit/codegen/sdk/typescript/file/test_file_get_config.py +++ b/tests/unit/codegen/sdk/typescript/file/test_file_get_config.py @@ -1,6 +1,10 @@ +from typing import TYPE_CHECKING + from codegen.sdk.codebase.factory.get_session import get_codebase_session from codegen.sdk.enums import ProgrammingLanguage -from codegen.sdk.typescript.file import TSFile + +if TYPE_CHECKING: + from codegen.sdk.typescript.file import TSFile def test_file_get_config(tmpdir) -> None: diff --git a/tests/unit/codegen/sdk/typescript/file/test_file_symbols.py b/tests/unit/codegen/sdk/typescript/file/test_file_symbols.py index 4e709a2f7..7152e3ca9 100644 --- a/tests/unit/codegen/sdk/typescript/file/test_file_symbols.py +++ b/tests/unit/codegen/sdk/typescript/file/test_file_symbols.py @@ -1,6 +1,10 @@ +from typing import TYPE_CHECKING + from codegen.sdk.codebase.factory.get_session import get_codebase_graph_session from codegen.sdk.enums import ProgrammingLanguage -from codegen.sdk.typescript.class_definition import TSClass + +if TYPE_CHECKING: + from codegen.sdk.typescript.class_definition import TSClass def test_symbols_gets_class_symbol_with_correct_name(tmpdir) -> None: diff --git a/tests/unit/codegen/sdk/typescript/file/test_ts_config_properties.py b/tests/unit/codegen/sdk/typescript/file/test_ts_config_properties.py index a2da90b36..17adfebe7 100644 --- a/tests/unit/codegen/sdk/typescript/file/test_ts_config_properties.py +++ b/tests/unit/codegen/sdk/typescript/file/test_ts_config_properties.py @@ -1,6 +1,10 @@ +from typing import TYPE_CHECKING + from codegen.sdk.codebase.factory.get_session import get_codebase_session from codegen.sdk.enums import ProgrammingLanguage -from codegen.sdk.typescript.ts_config import TSConfig + +if TYPE_CHECKING: + from codegen.sdk.typescript.ts_config import TSConfig def test_file_get_config(tmpdir) -> None: diff --git a/tests/unit/codegen/sdk/typescript/function/test_function_arrow.py b/tests/unit/codegen/sdk/typescript/function/test_function_arrow.py index 4fe2a873b..9169d6134 100644 --- a/tests/unit/codegen/sdk/typescript/function/test_function_arrow.py +++ b/tests/unit/codegen/sdk/typescript/function/test_function_arrow.py @@ -1,6 +1,10 @@ +from typing import TYPE_CHECKING + from codegen.sdk.codebase.factory.get_session import get_codebase_session from codegen.sdk.enums import ProgrammingLanguage -from codegen.sdk.typescript.file import TSFile + +if TYPE_CHECKING: + from codegen.sdk.typescript.file import TSFile def test_function_function_calls_gets_calls_in_return_statement(tmpdir) -> None: diff --git a/tests/unit/codegen/sdk/typescript/function/test_function_parameter_to_interface.py b/tests/unit/codegen/sdk/typescript/function/test_function_parameter_to_interface.py index 2db81f15a..13b2100bf 100644 --- a/tests/unit/codegen/sdk/typescript/function/test_function_parameter_to_interface.py +++ b/tests/unit/codegen/sdk/typescript/function/test_function_parameter_to_interface.py @@ -1,6 +1,10 @@ +from typing import TYPE_CHECKING + from codegen.sdk.codebase.factory.get_session import get_codebase_session from codegen.sdk.enums import ProgrammingLanguage -from codegen.sdk.typescript.file import TSFile + +if TYPE_CHECKING: + from codegen.sdk.typescript.file import TSFile def test_convert_simple_props_to_interface(tmpdir): diff --git a/tests/unit/codegen/sdk/typescript/global_var/test_global_var_dependencies.py b/tests/unit/codegen/sdk/typescript/global_var/test_global_var_dependencies.py index 3ac39eb7f..7592855a8 100644 --- a/tests/unit/codegen/sdk/typescript/global_var/test_global_var_dependencies.py +++ b/tests/unit/codegen/sdk/typescript/global_var/test_global_var_dependencies.py @@ -1,7 +1,11 @@ +from typing import TYPE_CHECKING + from codegen.sdk.codebase.factory.get_session import get_codebase_graph_session from codegen.sdk.core.import_resolution import Import from codegen.sdk.enums import ProgrammingLanguage -from codegen.sdk.typescript.assignment import TSAssignment + +if TYPE_CHECKING: + from codegen.sdk.typescript.assignment import TSAssignment def test_dependencies_gets_symbols_in_same_file(tmpdir) -> None: diff --git a/tests/unit/codegen/sdk/typescript/import_resolution/test_import_from_export_statement.py b/tests/unit/codegen/sdk/typescript/import_resolution/test_import_from_export_statement.py index 7cc52d05c..7bf3aea3c 100644 --- a/tests/unit/codegen/sdk/typescript/import_resolution/test_import_from_export_statement.py +++ b/tests/unit/codegen/sdk/typescript/import_resolution/test_import_from_export_statement.py @@ -1,6 +1,10 @@ +from typing import TYPE_CHECKING + from codegen.sdk.codebase.factory.get_session import get_codebase_session from codegen.sdk.enums import ImportType, ProgrammingLanguage -from codegen.sdk.typescript.file import TSFile + +if TYPE_CHECKING: + from codegen.sdk.typescript.file import TSFile def test_from_export_statement_default(tmpdir) -> None: diff --git a/tests/unit/codegen/sdk/typescript/import_resolution/test_import_resolution_resolve_import.py b/tests/unit/codegen/sdk/typescript/import_resolution/test_import_resolution_resolve_import.py index 498666604..8e7c83b15 100644 --- a/tests/unit/codegen/sdk/typescript/import_resolution/test_import_resolution_resolve_import.py +++ b/tests/unit/codegen/sdk/typescript/import_resolution/test_import_resolution_resolve_import.py @@ -1,9 +1,13 @@ +from typing import TYPE_CHECKING + from codegen.sdk.codebase.factory.get_session import get_codebase_session from codegen.sdk.core.dataclasses.usage import UsageType -from codegen.sdk.core.file import SourceFile -from codegen.sdk.core.import_resolution import Import, ImportResolution from codegen.sdk.enums import ImportType, ProgrammingLanguage +if TYPE_CHECKING: + from codegen.sdk.core.file import SourceFile + from codegen.sdk.core.import_resolution import Import, ImportResolution + def test_dynamic_import_module_export_const(tmpdir) -> None: # language=typescript diff --git a/tests/unit/codegen/sdk/typescript/interface/test_interface_attributes.py b/tests/unit/codegen/sdk/typescript/interface/test_interface_attributes.py index 226b672aa..e4014a776 100644 --- a/tests/unit/codegen/sdk/typescript/interface/test_interface_attributes.py +++ b/tests/unit/codegen/sdk/typescript/interface/test_interface_attributes.py @@ -1,7 +1,11 @@ +from typing import TYPE_CHECKING + from codegen.sdk.codebase.factory.get_session import get_codebase_graph_session, get_codebase_session -from codegen.sdk.core.statements.attribute import Attribute from codegen.sdk.enums import ProgrammingLanguage +if TYPE_CHECKING: + from codegen.sdk.core.statements.attribute import Attribute + def test_interface_attributes_finds_correct_number(tmpdir) -> None: file = """ diff --git a/tests/unit/codegen/sdk/typescript/namespace/test_namespace_complex_examples.py b/tests/unit/codegen/sdk/typescript/namespace/test_namespace_complex_examples.py index 93180086b..0efd56d53 100644 --- a/tests/unit/codegen/sdk/typescript/namespace/test_namespace_complex_examples.py +++ b/tests/unit/codegen/sdk/typescript/namespace/test_namespace_complex_examples.py @@ -1,7 +1,11 @@ +from typing import TYPE_CHECKING + from codegen.sdk.codebase.factory.get_session import get_codebase_session from codegen.sdk.enums import ProgrammingLanguage from codegen.sdk.typescript.function import TSFunction -from codegen.sdk.typescript.namespace import TSNamespace + +if TYPE_CHECKING: + from codegen.sdk.typescript.namespace import TSNamespace def test_namespace_math_operations(tmpdir) -> None: diff --git a/tests/unit/codegen/sdk/typescript/react/test_interface_props.py b/tests/unit/codegen/sdk/typescript/react/test_interface_props.py index 7b19f6de5..8afaa33c3 100644 --- a/tests/unit/codegen/sdk/typescript/react/test_interface_props.py +++ b/tests/unit/codegen/sdk/typescript/react/test_interface_props.py @@ -1,6 +1,10 @@ +from typing import TYPE_CHECKING + from codegen.sdk.codebase.factory.get_session import get_codebase_session from codegen.sdk.enums import ProgrammingLanguage -from codegen.sdk.typescript.file import TSFile + +if TYPE_CHECKING: + from codegen.sdk.typescript.file import TSFile def test_convert_props_to_interface_with_proptypes_oneof(tmpdir): diff --git a/tests/unit/codegen/sdk/typescript/react/test_ts_declassify.py b/tests/unit/codegen/sdk/typescript/react/test_ts_declassify.py index 790bd7fbb..dc4f975a1 100644 --- a/tests/unit/codegen/sdk/typescript/react/test_ts_declassify.py +++ b/tests/unit/codegen/sdk/typescript/react/test_ts_declassify.py @@ -1,6 +1,10 @@ +from typing import TYPE_CHECKING + from codegen.sdk.codebase.factory.get_session import get_codebase_session from codegen.sdk.enums import ProgrammingLanguage -from codegen.sdk.typescript.file import TSFile + +if TYPE_CHECKING: + from codegen.sdk.typescript.file import TSFile def test_declassify_class_component(tmpdir): diff --git a/tests/unit/codegen/sdk/typescript/statements/if_block_statement/test_if_block_reduce_block.py b/tests/unit/codegen/sdk/typescript/statements/if_block_statement/test_if_block_reduce_block.py index 760ab23a5..8cc9b1ee7 100644 --- a/tests/unit/codegen/sdk/typescript/statements/if_block_statement/test_if_block_reduce_block.py +++ b/tests/unit/codegen/sdk/typescript/statements/if_block_statement/test_if_block_reduce_block.py @@ -1,9 +1,13 @@ +from typing import TYPE_CHECKING + import pytest from codegen.sdk.codebase.factory.get_session import get_codebase_session from codegen.sdk.core.statements.statement import StatementType from codegen.sdk.enums import ProgrammingLanguage -from codegen.sdk.typescript.file import TSFile + +if TYPE_CHECKING: + from codegen.sdk.typescript.file import TSFile def test_reduce_condition_to_true_elif(tmpdir): diff --git a/tests/unit/codegen/sdk/typescript/statements/if_block_statement/test_if_block_statement_properties.py b/tests/unit/codegen/sdk/typescript/statements/if_block_statement/test_if_block_statement_properties.py index 5691f8926..d9dcd122c 100644 --- a/tests/unit/codegen/sdk/typescript/statements/if_block_statement/test_if_block_statement_properties.py +++ b/tests/unit/codegen/sdk/typescript/statements/if_block_statement/test_if_block_statement_properties.py @@ -1,8 +1,12 @@ +from typing import TYPE_CHECKING + from codegen.sdk.codebase.factory.get_session import get_codebase_session from codegen.sdk.core.statements.statement import StatementType from codegen.sdk.enums import ProgrammingLanguage -from codegen.sdk.typescript.file import TSFile -from codegen.sdk.typescript.statements.if_block_statement import TSIfBlockStatement + +if TYPE_CHECKING: + from codegen.sdk.typescript.file import TSFile + from codegen.sdk.typescript.statements.if_block_statement import TSIfBlockStatement def test_parse_if_else_statement_from_codeblock(tmpdir) -> None: diff --git a/tests/unit/skills/implementations/ai_skills.py b/tests/unit/skills/implementations/ai_skills.py index 448b0612e..16829b5df 100644 --- a/tests/unit/skills/implementations/ai_skills.py +++ b/tests/unit/skills/implementations/ai_skills.py @@ -28,7 +28,8 @@ class RefactorClass(Skill, ABC): def skill_func(codebase: CodebaseType): my_class = codebase.get_symbol("MyClass", optional=True) if my_class is None: - raise ValueError("MyClass not found in codebase") + msg = "MyClass not found in codebase" + raise ValueError(msg) my_class.edit(codebase.ai("Refactor the class to be shorter and more readable.", target=my_class)) @@ -75,7 +76,8 @@ class WriteTest(Skill, ABC): def skill_func(codebase: CodebaseType): my_function = codebase.get_function("my_function", optional=True) if my_function is None: - raise ValueError("my_function not found in codebase") + msg = "my_function not found in codebase" + raise ValueError(msg) test_function = codebase.ai(f"Write a test for the function {my_function.name} called test_my_function.", target=my_function) my_function.insert_after(test_function) diff --git a/tests/unit/skills/implementations/expressions/type.py b/tests/unit/skills/implementations/expressions/type.py index a43c0dda0..fb9eecd67 100644 --- a/tests/unit/skills/implementations/expressions/type.py +++ b/tests/unit/skills/implementations/expressions/type.py @@ -1,12 +1,16 @@ +from typing import TYPE_CHECKING + from codegen.sdk.core.codebase import CodebaseType from codegen.sdk.core.expressions.union_type import UnionType from codegen.sdk.enums import ProgrammingLanguage -from codegen.sdk.python.assignment import PyAssignment -from codegen.sdk.typescript.assignment import TSAssignment from tests.shared.skills.decorators import skill, skill_impl from tests.shared.skills.skill import Skill from tests.shared.skills.skill_test import SkillTestCase, SkillTestCasePyFile, SkillTestCaseTSFile +if TYPE_CHECKING: + from codegen.sdk.python.assignment import PyAssignment + from codegen.sdk.typescript.assignment import TSAssignment + test_cases_append_py = [ SkillTestCase(files=[SkillTestCasePyFile(input="a: int | None", output="a: int | None | str")]), SkillTestCase(files=[SkillTestCasePyFile(input="a: str | None", output="a: str | None")]), diff --git a/tests/unit/skills/implementations/guides/codebase-ai.py b/tests/unit/skills/implementations/guides/codebase-ai.py index 713740e06..4140257bc 100644 --- a/tests/unit/skills/implementations/guides/codebase-ai.py +++ b/tests/unit/skills/implementations/guides/codebase-ai.py @@ -1,12 +1,15 @@ from abc import ABC +from typing import TYPE_CHECKING from codegen.sdk.core.codebase import CodebaseType -from codegen.sdk.core.function import Function from codegen.sdk.enums import ProgrammingLanguage from tests.shared.skills.decorators import skill, skill_impl from tests.shared.skills.skill import Skill from tests.shared.skills.skill_test import SkillTestCase, SkillTestCasePyFile +if TYPE_CHECKING: + from codegen.sdk.core.function import Function + MethodSummaryGeneratorPyTestCase = SkillTestCase( [ SkillTestCasePyFile( diff --git a/tests/unit/skills/implementations/guides/manipulating-collections.py b/tests/unit/skills/implementations/guides/manipulating-collections.py index 1f596e1da..d95c24bd7 100644 --- a/tests/unit/skills/implementations/guides/manipulating-collections.py +++ b/tests/unit/skills/implementations/guides/manipulating-collections.py @@ -238,7 +238,8 @@ def python_skill_func(codebase: CodebaseType): # Assert the type is List (a GraphSitter type) if not isinstance(var.value, List): - raise ValueError(f"Expected a list, but found {type(var.value)}") + msg = f"Expected a list, but found {type(var.value)}" + raise ValueError(msg) # Append to the list var.value.append('"bar"') @@ -251,7 +252,8 @@ def typescript_skill_func(codebase: CodebaseType): # Assert the type is List (a GraphSitter type, equivalent to an array in TypeScript) if not isinstance(var.value, List): - raise ValueError(f"Expected an array, but found {type(var.value)}") + msg = f"Expected an array, but found {type(var.value)}" + raise ValueError(msg) # Append to the list var.value.append('"bar"') diff --git a/tests/unit/skills/implementations/type_inheritance_skills.py b/tests/unit/skills/implementations/type_inheritance_skills.py index 3f272cf35..e6c3f54df 100644 --- a/tests/unit/skills/implementations/type_inheritance_skills.py +++ b/tests/unit/skills/implementations/type_inheritance_skills.py @@ -1,15 +1,21 @@ +from typing import TYPE_CHECKING + from codegen.sdk.core.assignment import Assignment from codegen.sdk.core.class_definition import Class from codegen.sdk.core.codebase import CodebaseType, PyCodebaseType, TSCodebaseType from codegen.sdk.core.function import Function -from codegen.sdk.core.symbol import Symbol from codegen.sdk.core.symbol_groups.dict import Dict -from codegen.sdk.core.type_alias import TypeAlias from codegen.sdk.enums import ProgrammingLanguage from tests.shared.skills.decorators import skill, skill_impl from tests.shared.skills.skill import Skill from tests.shared.skills.skill_test import SkillTestCase, SkillTestCaseTSFile +if TYPE_CHECKING: + from collections.abc import MutableMapping + + from codegen.sdk.core.symbol import Symbol + from codegen.sdk.core.type_alias import TypeAlias + ts_input1 = """ export type MyMapper = { convert: ( @@ -227,8 +233,6 @@ def typescript_skill_func(codebase: TSCodebaseType): """Given a type alias 'MyMapper', find all inherited or extended implementations of the type object. Loops through all codebase symbols and handles each symbol type accordingly. """ - from collections.abc import MutableMapping - mapper_symbol: TypeAlias = codebase.get_symbol("MyMapper") mapper_dict: Dict = mapper_symbol.value @@ -272,8 +276,6 @@ def skill_func(codebase: CodebaseType): @staticmethod @skill_impl([SkillTestCase(files=ts_files_write)], language=ProgrammingLanguage.TYPESCRIPT) def typescript_skill_func(codebase: TSCodebaseType): - from collections.abc import MutableMapping - FUNC_NAME_TO_CONVERT = "convert" mapper_symbol: TypeAlias = codebase.get_symbol("MyMapper") diff --git a/uv.lock b/uv.lock index fe63f9a22..aa68a3ef0 100644 --- a/uv.lock +++ b/uv.lock @@ -158,30 +158,30 @@ wheels = [ [[package]] name = "boto3" -version = "1.36.7" +version = "1.36.8" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "botocore" }, { name = "jmespath" }, { name = "s3transfer" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/e6/6e/afd7d74538a1684a3d5a5c2c7ca7c57f89ac6be3cae813e9466be135a25b/boto3-1.36.7.tar.gz", hash = "sha256:ae98634efa7b47ced1b0d7342e2940b32639eee913f33ab406590b8ed55ee94b", size = 111024 } +sdist = { url = "https://files.pythonhosted.org/packages/6b/fa/b688fdda8aff3743745afe04ae6df70b9480f00d0b1b051e06b0f7389088/boto3-1.36.8.tar.gz", hash = "sha256:ac47215d320b0c2534340db58d6d5284cb1860b7bff172b4dd6eee2dee1d5779", size = 111042 } wheels = [ - { url = "https://files.pythonhosted.org/packages/44/80/62432ed0f0a54a25c6cbab911eebb0e6c25b09de3ec42670089f91b978c9/boto3-1.36.7-py3-none-any.whl", hash = "sha256:ab501f75557863e2d2c9fa731e4fe25c45f35e0d92ea0ee11a4eaa63929d3ede", size = 139167 }, + { url = "https://files.pythonhosted.org/packages/8e/59/58cff44147802cb20a6d185e4e18df19b7238566195114adc6397e0c8dbb/boto3-1.36.8-py3-none-any.whl", hash = "sha256:7f61c9d0ea64f484a17c1e3115fdf90fd7b17ab6771e07cb4549f42b9fd28fb9", size = 139167 }, ] [[package]] name = "botocore" -version = "1.36.7" +version = "1.36.8" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "jmespath" }, { name = "python-dateutil" }, { name = "urllib3" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/e3/93/d9188c30f4c3c674cd3ee893efc23fab748e311231b4c376972453f77316/botocore-1.36.7.tar.gz", hash = "sha256:9abc64bde5e7d8f814ea91d6fc0a8142511fc96427c19fe9209677c20a0c9e6e", size = 13481743 } +sdist = { url = "https://files.pythonhosted.org/packages/23/a6/7b526b42ba24e6ef482cdd98d3caca31e96ed0595b8b994b09e807a10d44/botocore-1.36.8.tar.gz", hash = "sha256:81c88e5566cf018e1411a68304dc1fb9e4156ca2b50a3a0f0befc274299e67fa", size = 13490469 } wheels = [ - { url = "https://files.pythonhosted.org/packages/20/67/c817051cbe5102dccf13f354a3f2169e1ace30b7ceb7947792af1691f6b9/botocore-1.36.7-py3-none-any.whl", hash = "sha256:a6c6772d777af2957ac9975207fac1ccc4ce101408b85e9b5e3c5ba0bb949102", size = 13310055 }, + { url = "https://files.pythonhosted.org/packages/3e/05/43bae794c8e5f42d79e1c24205bc0c7447b3909a446de46cf231fa6b39dd/botocore-1.36.8-py3-none-any.whl", hash = "sha256:59d3fdfbae6d916b046e973bebcbeb70a102f9e570ca86d5ba512f1854b78fc2", size = 13318382 }, ] [[package]] @@ -412,6 +412,7 @@ dependencies = [ { name = "termcolor" }, { name = "tiktoken" }, { name = "toml" }, + { name = "tomlkit" }, { name = "tqdm" }, { name = "tree-sitter" }, { name = "tree-sitter-javascript" }, @@ -510,6 +511,7 @@ requires-dist = [ { name = "termcolor", specifier = ">=2.4.0" }, { name = "tiktoken", specifier = ">=0.5.1,<1.0.0" }, { name = "toml", specifier = ">=0.10.2" }, + { name = "tomlkit", specifier = ">=0.13.2" }, { name = "tqdm", specifier = ">=4.67.1" }, { name = "tree-sitter", specifier = ">=0.23.1" }, { name = "tree-sitter-javascript", specifier = ">=0.23.1" }, @@ -2627,6 +2629,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/44/6f/7120676b6d73228c96e17f1f794d8ab046fc910d781c8d151120c3f1569e/toml-0.10.2-py2.py3-none-any.whl", hash = "sha256:806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b", size = 16588 }, ] +[[package]] +name = "tomlkit" +version = "0.13.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/b1/09/a439bec5888f00a54b8b9f05fa94d7f901d6735ef4e55dcec9bc37b5d8fa/tomlkit-0.13.2.tar.gz", hash = "sha256:fff5fe59a87295b278abd31bec92c15d9bc4a06885ab12bcea52c71119392e79", size = 192885 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f9/b6/a447b5e4ec71e13871be01ba81f5dfc9d0af7e473da256ff46bc0e24026f/tomlkit-0.13.2-py3-none-any.whl", hash = "sha256:7a974427f6e119197f670fbbbeae7bef749a6c14e793db934baefc1b5f03efde", size = 37955 }, +] + [[package]] name = "tqdm" version = "4.67.1"