diff --git a/src/codegen/cli/commands/config/main.py b/src/codegen/cli/commands/config/main.py index 8905ab479..00d3143e4 100644 --- a/src/codegen/cli/commands/config/main.py +++ b/src/codegen/cli/commands/config/main.py @@ -5,8 +5,8 @@ from rich.table import Table from codegen.configs.constants import ENV_FILENAME, GLOBAL_ENV_FILE -from codegen.configs.session_manager import session_manager from codegen.configs.user_config import UserConfig +from codegen.shared.path import get_git_root_path @click.group(name="config") @@ -16,8 +16,7 @@ def config_command(): @config_command.command(name="list") -@click.option("--global", "is_global", is_flag=True, help="Lists the global configuration values") -def list_command(is_global: bool): +def list_command(): """List current configuration values.""" def flatten_dict(data: dict, prefix: str = "") -> dict: @@ -33,7 +32,7 @@ def flatten_dict(data: dict, prefix: str = "") -> dict: items[full_key] = value return items - config = _get_user_config(is_global) + config = _get_user_config() flat_config = flatten_dict(config.to_dict()) sorted_items = sorted(flat_config.items(), key=lambda x: x[0]) @@ -82,10 +81,9 @@ def flatten_dict(data: dict, prefix: str = "") -> dict: @config_command.command(name="get") @click.argument("key") -@click.option("--global", "is_global", is_flag=True, help="Get the global configuration value") -def get_command(key: str, is_global: bool): +def get_command(key: str): """Get a configuration value.""" - config = _get_user_config(is_global) + config = _get_user_config() if not config.has_key(key): rich.print(f"[red]Error: Configuration key '{key}' not found[/red]") return @@ -98,10 +96,9 @@ def get_command(key: str, is_global: bool): @config_command.command(name="set") @click.argument("key") @click.argument("value") -@click.option("--global", "is_global", is_flag=True, help="Sets the global configuration value") -def set_command(key: str, value: str, is_global: bool): +def set_command(key: str, value: str): """Set a configuration value and write to .env""" - config = _get_user_config(is_global) + config = _get_user_config() if not config.has_key(key): rich.print(f"[red]Error: Configuration key '{key}' not found[/red]") return @@ -118,10 +115,10 @@ def set_command(key: str, value: str, is_global: bool): rich.print(f"[green]Successfully set {key}=[magenta]{value}[/magenta] and saved to {ENV_FILENAME}[/green]") -def _get_user_config(is_global: bool) -> UserConfig: - if is_global or (active_session_path := session_manager.get_active_session()) is None: +def _get_user_config() -> UserConfig: + if (project_root := get_git_root_path()) is None: env_filepath = GLOBAL_ENV_FILE else: - env_filepath = active_session_path / ENV_FILENAME + env_filepath = project_root / ENV_FILENAME return UserConfig(env_filepath) diff --git a/src/codegen/cli/commands/init/main.py b/src/codegen/cli/commands/init/main.py index e85de1c4e..b10d6ca23 100644 --- a/src/codegen/cli/commands/init/main.py +++ b/src/codegen/cli/commands/init/main.py @@ -8,7 +8,7 @@ from codegen.cli.commands.init.render import get_success_message from codegen.cli.rich.codeblocks import format_command from codegen.cli.workspace.initialize_workspace import initialize_codegen -from codegen.git.utils.path import get_git_root_path +from codegen.shared.path import get_git_root_path @click.command(name="init") diff --git a/src/codegen/cli/env/global_env.py b/src/codegen/cli/env/global_env.py index 51c3772d1..57eaa02a7 100644 --- a/src/codegen/cli/env/global_env.py +++ b/src/codegen/cli/env/global_env.py @@ -38,20 +38,24 @@ def _parse_env(self) -> Environment: def _load_dotenv(self) -> None: env_file = find_dotenv(filename=f".env.{self.ENV}") # if env specific .env file does not exist, try to load .env - load_dotenv(env_file or None) + load_dotenv(env_file or None, override=True) def _get_env_var(self, var_name, required: bool = False) -> str: if self.ENV == "local": return "" - value = os.environ.get(var_name) - if value: + if value := os.environ.get(var_name): return value + if required: msg = f"Environment variable {var_name} is not set with ENV={self.ENV}!" raise ValueError(msg) return "" + def __repr__(self) -> str: + # Returns all env vars in a readable format + return "\n".join([f"{k}={v}" for k, v in self.__dict__.items()]) + # NOTE: load and store envvars once global_env = GlobalEnv() diff --git a/src/codegen/configs/models/base_config.py b/src/codegen/configs/models/base_config.py index 4bbd25a84..3a82223de 100644 --- a/src/codegen/configs/models/base_config.py +++ b/src/codegen/configs/models/base_config.py @@ -1,11 +1,11 @@ from abc import ABC from pathlib import Path -from dotenv import set_key +from dotenv import load_dotenv, set_key from pydantic_settings import BaseSettings, SettingsConfigDict from codegen.configs.constants import ENV_FILENAME, GLOBAL_ENV_FILE -from codegen.configs.session_manager import session_root +from codegen.shared.path import get_git_root_path class BaseConfig(BaseSettings, ABC): @@ -18,20 +18,18 @@ class BaseConfig(BaseSettings, ABC): def __init__(self, prefix: str, env_filepath: Path | None = None, *args, **kwargs) -> None: if env_filepath is None: - root_path = session_root + root_path = get_git_root_path() if root_path is not None: env_filepath = root_path / ENV_FILENAME # Only include env files that exist - env_filepaths = [] if GLOBAL_ENV_FILE.exists(): - env_filepaths.append(GLOBAL_ENV_FILE) + load_dotenv(GLOBAL_ENV_FILE, override=True) + if env_filepath and env_filepath.exists() and env_filepath != GLOBAL_ENV_FILE: - env_filepaths.append(env_filepath) + load_dotenv(env_filepath, override=True) self.model_config["env_prefix"] = f"{prefix.upper()}_" if len(prefix) > 0 else "" - self.model_config["env_file"] = env_filepaths - super().__init__(*args, **kwargs) @property diff --git a/src/codegen/configs/models/repository.py b/src/codegen/configs/models/repository.py index c75f1dd9f..d4960c503 100644 --- a/src/codegen/configs/models/repository.py +++ b/src/codegen/configs/models/repository.py @@ -37,6 +37,3 @@ def full_name(self) -> str | None: if self.owner is not None: return f"{self.owner}/{self.name}" return None - - -DefaultRepoConfig = RepositoryConfig() diff --git a/src/codegen/configs/models/secrets.py b/src/codegen/configs/models/secrets.py index d0e9e3a77..208999ebe 100644 --- a/src/codegen/configs/models/secrets.py +++ b/src/codegen/configs/models/secrets.py @@ -14,6 +14,3 @@ def __init__(self, prefix: str = "", *args, **kwargs) -> None: github_token: str | None = None openai_api_key: str | None = None linear_api_key: str | None = None - - -DefaultSecrets = SecretsConfig() diff --git a/src/codegen/configs/session_manager.py b/src/codegen/configs/session_manager.py index c8c48cfe7..f69a9b479 100644 --- a/src/codegen/configs/session_manager.py +++ b/src/codegen/configs/session_manager.py @@ -3,7 +3,7 @@ import json from pathlib import Path -from codegen.configs.constants import CODEGEN_DIR_NAME, SESSION_FILE +from codegen.configs.constants import SESSION_FILE class SessionManager: @@ -61,34 +61,4 @@ def __str__(self) -> str: return f"GlobalConfig:\n Active Session: {active}\n Sessions:\n {sessions_str}\n Global Session:\n {self.session_config}" -def _get_project_root() -> Path | None: - """Get the active codegen directory.""" - active_session = session_manager.get_active_session() - if active_session: - return active_session - - try: - path = Path.cwd().resolve() - except FileNotFoundError: - # Current directory is not accessible - return None - - while True: - codegen_path = path / CODEGEN_DIR_NAME - git_path = path / ".git" - - if codegen_path.exists(): - return path - if git_path.exists(): - return path - - parent = path.parent.resolve() - if parent == path: # We've reached the root directory - break - path = parent - - return None - - session_manager = SessionManager() -session_root = _get_project_root() diff --git a/src/codegen/configs/user_config.py b/src/codegen/configs/user_config.py index 511929ad9..ecebec4d1 100644 --- a/src/codegen/configs/user_config.py +++ b/src/codegen/configs/user_config.py @@ -34,13 +34,13 @@ def to_dict(self) -> dict: for key, value in self.repository.model_dump().items(): config_dict[f"{self.repository.env_prefix}{key}".upper()] = value - # Add secrets configs with 'secrets_' prefix - for key, value in self.secrets.model_dump().items(): - config_dict[f"{self.secrets.env_prefix}{key}".upper()] = value - # Add feature flags configs with 'feature_flags_' prefix for key, value in self.codebase.model_dump().items(): config_dict[f"{self.codebase.env_prefix}{key}".upper()] = value + + # Add secrets configs + for key, value in self.secrets.model_dump().items(): + config_dict[f"{self.secrets.env_prefix}{key}".upper()] = value return config_dict def has_key(self, full_key: str) -> bool: diff --git a/src/codegen/extensions/lsp/protocol.py b/src/codegen/extensions/lsp/protocol.py index 2aedd4795..cc0d55c29 100644 --- a/src/codegen/extensions/lsp/protocol.py +++ b/src/codegen/extensions/lsp/protocol.py @@ -5,7 +5,7 @@ from lsprotocol.types import INITIALIZE, InitializeParams, InitializeResult from pygls.protocol import LanguageServerProtocol, lsp_method -from codegen.configs.models.codebase import DefaultCodebaseConfig +from codegen.configs.models.codebase import CodebaseConfig from codegen.extensions.lsp.io import LSPIO from codegen.extensions.lsp.progress import LSPProgress from codegen.extensions.lsp.utils import get_path @@ -26,7 +26,7 @@ def _init_codebase(self, params: InitializeParams) -> None: root = get_path(params.root_uri) else: root = os.getcwd() - config = DefaultCodebaseConfig.model_copy(update={"full_range_index": True}) + config = CodebaseConfig().model_copy(update={"full_range_index": True}) io = LSPIO(self.workspace) self._server.codebase = Codebase(repo_path=str(root), config=config, io=io, progress=progress) self._server.progress_manager = progress diff --git a/src/codegen/git/clients/git_repo_client.py b/src/codegen/git/clients/git_repo_client.py index 73a3cffed..dee994f7a 100644 --- a/src/codegen/git/clients/git_repo_client.py +++ b/src/codegen/git/clients/git_repo_client.py @@ -15,6 +15,7 @@ from github.Tag import Tag from github.Workflow import Workflow +from codegen.configs.models.secrets import SecretsConfig from codegen.git.clients.github_client import GithubClient from codegen.git.schemas.repo_config import RepoConfig from codegen.git.utils.format import format_comparison @@ -29,9 +30,9 @@ class GitRepoClient: gh_client: GithubClient _repo: Repository - def __init__(self, repo_config: RepoConfig, access_token: str) -> None: + def __init__(self, repo_config: RepoConfig, access_token: str | None = None) -> None: self.repo_config = repo_config - self.gh_client = self._create_github_client(token=access_token) + self.gh_client = self._create_github_client(token=access_token or SecretsConfig().github_token) self._repo = self._create_client() def _create_github_client(self, token: str) -> GithubClient: diff --git a/src/codegen/git/repo_operator/repo_operator.py b/src/codegen/git/repo_operator/repo_operator.py index 63ff3ca3f..eb765502b 100644 --- a/src/codegen/git/repo_operator/repo_operator.py +++ b/src/codegen/git/repo_operator/repo_operator.py @@ -17,7 +17,7 @@ from github.IssueComment import IssueComment from github.PullRequest import PullRequest -from codegen.configs.models.secrets import DefaultSecrets +from codegen.configs.models.secrets import SecretsConfig from codegen.git.clients.git_repo_client import GitRepoClient from codegen.git.configs.constants import CODEGEN_BOT_EMAIL, CODEGEN_BOT_NAME from codegen.git.repo_operator.local_git_repo import LocalGitRepo @@ -58,7 +58,7 @@ def __init__( ) -> None: assert repo_config is not None self.repo_config = repo_config - self.access_token = access_token or DefaultSecrets.github_token + self.access_token = access_token or SecretsConfig().github_token self.base_dir = repo_config.base_dir self.bot_commit = bot_commit @@ -839,7 +839,7 @@ def create_from_repo(cls, repo_path: str, url: str, access_token: str | None = N url (str): Git URL of the repository access_token (str | None): Optional GitHub API key for operations that need GitHub access """ - access_token = access_token or DefaultSecrets.github_token + access_token = access_token or SecretsConfig().github_token if access_token: url = add_access_token_to_url(url=url, token=access_token) diff --git a/src/codegen/runner/clients/codebase_client.py b/src/codegen/runner/clients/codebase_client.py index 5f0e56a83..5cbcdb992 100644 --- a/src/codegen/runner/clients/codebase_client.py +++ b/src/codegen/runner/clients/codebase_client.py @@ -2,7 +2,7 @@ import logging -from codegen.configs.models import secrets +from codegen.configs.models.secrets import SecretsConfig from codegen.git.schemas.repo_config import RepoConfig from codegen.runner.clients.server_client import LocalServerClient from codegen.runner.models.apis import SANDBOX_SERVER_PORT @@ -16,11 +16,9 @@ class CodebaseClient(LocalServerClient): """Client for interacting with the locally hosted sandbox server.""" repo_config: RepoConfig - git_access_token: str | None - def __init__(self, repo_config: RepoConfig, git_access_token: str | None, host: str = "127.0.0.1", port: int = SANDBOX_SERVER_PORT): + def __init__(self, repo_config: RepoConfig, host: str = "127.0.0.1", port: int = SANDBOX_SERVER_PORT): self.repo_config = repo_config - self.git_access_token = git_access_token super().__init__(server_path=RUNNER_SERVER_PATH, host=host, port=port) def _get_envs(self) -> dict: @@ -29,9 +27,8 @@ def _get_envs(self) -> dict: "REPOSITORY_LANGUAGE": self.repo_config.language.value, "REPOSITORY_OWNER": self.repo_config.organization_name, "REPOSITORY_PATH": str(self.repo_config.repo_path), + "GITHUB_TOKEN": SecretsConfig().github_token, } - if self.git_access_token is not None: - codebase_envs["GITHUB_TOKEN"] = self.git_access_token envs.update(codebase_envs) return envs @@ -40,5 +37,5 @@ def _get_envs(self) -> dict: if __name__ == "__main__": test_config = RepoConfig.from_repo_path("/Users/caroljung/git/codegen/codegen-agi") test_config.full_name = "codegen-sh/codegen-agi" - client = CodebaseClient(test_config, secrets.github_token) + client = CodebaseClient(test_config) print(client.healthcheck()) diff --git a/src/codegen/runner/sandbox/runner.py b/src/codegen/runner/sandbox/runner.py index 1e9c4f9dc..bd6eb5159 100644 --- a/src/codegen/runner/sandbox/runner.py +++ b/src/codegen/runner/sandbox/runner.py @@ -29,9 +29,9 @@ class SandboxRunner: codebase: CodebaseType executor: SandboxExecutor - def __init__(self, repo_config: RepoConfig, access_token: str) -> None: + def __init__(self, repo_config: RepoConfig) -> None: self.repo = repo_config - self.op = RepoOperator(repo_config=self.repo, access_token=access_token, setup_option=SetupOption.PULL_OR_CLONE) + self.op = RepoOperator(repo_config=self.repo, setup_option=SetupOption.PULL_OR_CLONE) self.commit = self.op.git_cli.head.commit async def warmup(self) -> None: diff --git a/src/codegen/runner/sandbox/server.py b/src/codegen/runner/sandbox/server.py index 35689f2c1..52b42cb99 100644 --- a/src/codegen/runner/sandbox/server.py +++ b/src/codegen/runner/sandbox/server.py @@ -7,8 +7,7 @@ import psutil from fastapi import FastAPI -from codegen.configs.models.repository import DefaultRepoConfig -from codegen.configs.models.secrets import DefaultSecrets +from codegen.configs.models.repository import RepositoryConfig from codegen.git.schemas.repo_config import RepoConfig from codegen.runner.enums.warmup_state import WarmupState from codegen.runner.models.apis import ( @@ -40,15 +39,16 @@ async def lifespan(server: FastAPI): global runner try: - server_info = ServerInfo(repo_name=DefaultRepoConfig.full_name or DefaultRepoConfig.name) + default_repo_config = RepositoryConfig() + server_info = ServerInfo(repo_name=default_repo_config.full_name or default_repo_config.name) logger.info(f"Starting up sandbox fastapi server for repo_name={server_info.repo_name}") repo_config = RepoConfig( - name=DefaultRepoConfig.name, - full_name=DefaultRepoConfig.full_name, - base_dir=os.path.dirname(DefaultRepoConfig.path), - language=ProgrammingLanguage(DefaultRepoConfig.language.upper()), + name=default_repo_config.name, + full_name=default_repo_config.full_name, + base_dir=os.path.dirname(default_repo_config.path), + language=ProgrammingLanguage(default_repo_config.language.upper()), ) - runner = SandboxRunner(repo_config=repo_config, access_token=DefaultSecrets.github_token) + runner = SandboxRunner(repo_config=repo_config) server_info.warmup_state = WarmupState.PENDING await runner.warmup() server_info.warmup_state = WarmupState.COMPLETED diff --git a/src/codegen/sdk/code_generation/codegen_sdk_codebase.py b/src/codegen/sdk/code_generation/codegen_sdk_codebase.py index 36d012718..d6ede5175 100644 --- a/src/codegen/sdk/code_generation/codegen_sdk_codebase.py +++ b/src/codegen/sdk/code_generation/codegen_sdk_codebase.py @@ -1,6 +1,5 @@ import os.path -from codegen.configs.models.codebase import DefaultCodebaseConfig from codegen.sdk.code_generation.current_code_codebase import get_codegen_codebase_base_path, get_current_code_codebase from codegen.sdk.core.codebase import Codebase @@ -12,5 +11,5 @@ def get_codegen_sdk_subdirectories() -> list[str]: def get_codegen_sdk_codebase() -> Codebase: """Grabs a Codebase w/ GraphSitter content. Responsible for figuring out where it is, e.g. in Modal or local""" - codebase = get_current_code_codebase(DefaultCodebaseConfig, subdirectories=get_codegen_sdk_subdirectories()) + codebase = get_current_code_codebase(subdirectories=get_codegen_sdk_subdirectories()) return codebase diff --git a/src/codegen/sdk/code_generation/current_code_codebase.py b/src/codegen/sdk/code_generation/current_code_codebase.py index 5c097c09d..3cab53df2 100644 --- a/src/codegen/sdk/code_generation/current_code_codebase.py +++ b/src/codegen/sdk/code_generation/current_code_codebase.py @@ -4,8 +4,8 @@ from pathlib import Path from typing import TypedDict -from codegen.configs.models.codebase import CodebaseConfig, DefaultCodebaseConfig -from codegen.configs.models.secrets import DefaultSecrets, SecretsConfig +from codegen.configs.models.codebase import CodebaseConfig +from codegen.configs.models.secrets import SecretsConfig from codegen.git.repo_operator.repo_operator import RepoOperator from codegen.git.schemas.repo_config import RepoConfig from codegen.sdk.codebase.config import ProjectConfig @@ -34,7 +34,7 @@ def get_codegen_codebase_base_path() -> str: return "src" if "src" in codegen_base_dir else "" -def get_current_code_codebase(config: CodebaseConfig = DefaultCodebaseConfig, secrets: SecretsConfig = DefaultSecrets, subdirectories: list[str] | None = None) -> CodebaseType: +def get_current_code_codebase(config: CodebaseConfig | None = None, secrets: SecretsConfig | None = None, subdirectories: list[str] | None = None) -> CodebaseType: """Returns a Codebase for the code that is *currently running* (i.e. the Codegen repo)""" codegen_repo_path = get_graphsitter_repo_path() base_dir = get_codegen_codebase_base_path() @@ -44,7 +44,7 @@ def get_current_code_codebase(config: CodebaseConfig = DefaultCodebaseConfig, se repo_config.respect_gitignore = False op = RepoOperator(repo_config=repo_config, bot_commit=False) - config = config.model_copy(update={"base_path": base_dir}) + config = (config or CodebaseConfig()).model_copy(update={"base_path": base_dir}) projects = [ProjectConfig(repo_operator=op, programming_language=ProgrammingLanguage.PYTHON, subdirectories=subdirectories, base_path=base_dir)] codebase = Codebase(projects=projects, config=config, secrets=secrets) return codebase diff --git a/src/codegen/sdk/codebase/codebase_context.py b/src/codegen/sdk/codebase/codebase_context.py index f915217ba..62a24eb16 100644 --- a/src/codegen/sdk/codebase/codebase_context.py +++ b/src/codegen/sdk/codebase/codebase_context.py @@ -11,8 +11,8 @@ from rustworkx import PyDiGraph, WeightedEdgeList -from codegen.configs.models.codebase import DefaultCodebaseConfig -from codegen.configs.models.secrets import DefaultSecrets, SecretsConfig +from codegen.configs.models.codebase import CodebaseConfig +from codegen.configs.models.secrets import SecretsConfig from codegen.sdk.codebase.config import ProjectConfig, SessionOptions from codegen.sdk.codebase.config_parser import ConfigParser, get_config_parser_for_language from codegen.sdk.codebase.diff_lite import ChangeType, DiffLite @@ -39,7 +39,6 @@ from codeowners import CodeOwners as CodeOwnersParser from git import Commit as GitCommit - from codegen.configs.models.codebase import CodebaseConfig from codegen.git.repo_operator.repo_operator import RepoOperator from codegen.sdk.codebase.io.io import IO from codegen.sdk.codebase.node_classes.node_classes import NodeClasses @@ -134,8 +133,8 @@ class CodebaseContext: def __init__( self, projects: list[ProjectConfig], - config: CodebaseConfig = DefaultCodebaseConfig, - secrets: SecretsConfig = DefaultSecrets, + config: CodebaseConfig | None = None, + secrets: SecretsConfig | None = None, io: IO | None = None, progress: Progress | None = None, ) -> None: @@ -161,8 +160,8 @@ def __init__( self.io = io or FileIO() context = projects[0] self.node_classes = get_node_classes(context.programming_language) - self.config = config - self.secrets = secrets + self.config = config or CodebaseConfig() + self.secrets = secrets or SecretsConfig() self.repo_name = context.repo_operator.repo_name self.repo_path = str(Path(context.repo_operator.repo_path).resolve()) self.full_path = os.path.join(self.repo_path, context.base_path) if context.base_path else self.repo_path @@ -174,7 +173,7 @@ def __init__( self.init_nodes = None self.init_edges = None self.directories = dict() - self.parser = Parser.from_node_classes(self.node_classes, log_parse_warnings=config.debug) + self.parser = Parser.from_node_classes(self.node_classes, log_parse_warnings=self.config.debug) self.extensions = self.node_classes.file_cls.get_extensions() # ORDER IS IMPORTANT HERE! self.config_parser = get_config_parser_for_language(context.programming_language, self) diff --git a/src/codegen/sdk/codebase/factory/codebase_factory.py b/src/codegen/sdk/codebase/factory/codebase_factory.py index f122cc371..009992311 100644 --- a/src/codegen/sdk/codebase/factory/codebase_factory.py +++ b/src/codegen/sdk/codebase/factory/codebase_factory.py @@ -1,7 +1,7 @@ from codegen.configs.models.codebase import CodebaseConfig -from codegen.configs.models.secrets import DefaultSecrets, SecretsConfig +from codegen.configs.models.secrets import SecretsConfig from codegen.git.repo_operator.repo_operator import RepoOperator -from codegen.sdk.codebase.config import DefaultCodebaseConfig, ProjectConfig +from codegen.sdk.codebase.config import ProjectConfig from codegen.sdk.core.codebase import ( Codebase, CodebaseType, @@ -20,8 +20,8 @@ def get_codebase_from_files( files: dict[str, str] = {}, bot_commit: bool = True, programming_language: ProgrammingLanguage = ProgrammingLanguage.PYTHON, - config: CodebaseConfig = DefaultCodebaseConfig, - secrets: SecretsConfig = DefaultSecrets, + config: CodebaseConfig | None = None, + secrets: SecretsConfig | None = None, ) -> CodebaseType: op = RepoOperator.create_from_files(repo_path=repo_path, files=files, bot_commit=bot_commit) projects = [ProjectConfig(repo_operator=op, programming_language=programming_language)] diff --git a/src/codegen/sdk/codebase/factory/get_session.py b/src/codegen/sdk/codebase/factory/get_session.py index cb0d4df33..189eec6e6 100644 --- a/src/codegen/sdk/codebase/factory/get_session.py +++ b/src/codegen/sdk/codebase/factory/get_session.py @@ -5,7 +5,7 @@ from typing import Literal, overload from codegen.configs.models.codebase import CodebaseConfig -from codegen.configs.models.secrets import DefaultSecrets, SecretsConfig +from codegen.configs.models.secrets import SecretsConfig from codegen.git.repo_operator.repo_operator import RepoOperator from codegen.sdk.codebase.codebase_context import CodebaseContext from codegen.sdk.codebase.config import ProjectConfig, SessionOptions, TestFlags @@ -27,7 +27,7 @@ def get_codebase_session( verify_output: bool = True, config: CodebaseConfig = TestFlags, session_options: SessionOptions = SessionOptions(), - secrets: SecretsConfig = DefaultSecrets, + secrets: SecretsConfig | None = None, ) -> AbstractContextManager[PyCodebaseType]: ... @@ -42,7 +42,7 @@ def get_codebase_session( verify_output: bool = True, config: CodebaseConfig = TestFlags, session_options: SessionOptions = SessionOptions(), - secrets: SecretsConfig = DefaultSecrets, + secrets: SecretsConfig | None = None, ) -> AbstractContextManager[PyCodebaseType]: ... @@ -57,7 +57,7 @@ def get_codebase_session( verify_output: bool = True, config: CodebaseConfig = TestFlags, session_options: SessionOptions = SessionOptions(), - secrets: SecretsConfig = DefaultSecrets, + secrets: SecretsConfig | None = None, ) -> AbstractContextManager[TSCodebaseType]: ... @@ -72,7 +72,7 @@ def get_codebase_session( verify_output: bool = True, config: CodebaseConfig = TestFlags, session_options: SessionOptions = SessionOptions(), - secrets: SecretsConfig = DefaultSecrets, + secrets: SecretsConfig | None = None, ) -> Generator[Codebase, None, None]: """Gives you a Codebase operating on the files you provided as a dict""" codebase = CodebaseFactory.get_codebase_from_files(repo_path=str(tmpdir), files=files, config=config, secrets=secrets, programming_language=programming_language) diff --git a/src/codegen/sdk/core/codebase.py b/src/codegen/sdk/core/codebase.py index 6858462f5..090e87c50 100644 --- a/src/codegen/sdk/core/codebase.py +++ b/src/codegen/sdk/core/codebase.py @@ -22,8 +22,8 @@ from rich.console import Console from typing_extensions import TypeVar, deprecated -from codegen.configs.models.codebase import CodebaseConfig, DefaultCodebaseConfig -from codegen.configs.models.secrets import DefaultSecrets, SecretsConfig +from codegen.configs.models.codebase import CodebaseConfig +from codegen.configs.models.secrets import SecretsConfig from codegen.git.repo_operator.repo_operator import RepoOperator from codegen.git.schemas.enums import CheckoutResult from codegen.git.utils.pr_review import CodegenPR @@ -130,8 +130,8 @@ def __init__( *, language: None = None, projects: list[ProjectConfig] | ProjectConfig, - config: CodebaseConfig = DefaultCodebaseConfig, - secrets: SecretsConfig = DefaultSecrets, + config: CodebaseConfig | None = None, + secrets: SecretsConfig | None = None, io: IO | None = None, progress: Progress | None = None, ) -> None: ... @@ -143,8 +143,8 @@ def __init__( *, language: Literal["python", "typescript"] | ProgrammingLanguage | None = None, projects: None = None, - config: CodebaseConfig = DefaultCodebaseConfig, - secrets: SecretsConfig = DefaultSecrets, + config: CodebaseConfig | None = None, + secrets: SecretsConfig | None = None, io: IO | None = None, progress: Progress | None = None, ) -> None: ... @@ -155,8 +155,8 @@ def __init__( *, language: Literal["python", "typescript"] | ProgrammingLanguage | None = None, projects: list[ProjectConfig] | ProjectConfig | None = None, - config: CodebaseConfig = DefaultCodebaseConfig, - secrets: SecretsConfig = DefaultSecrets, + config: CodebaseConfig | None = None, + secrets: SecretsConfig | None = None, io: IO | None = None, progress: Progress | None = None, ) -> None: @@ -1257,8 +1257,8 @@ def from_repo( tmp_dir: str | None = "/tmp/codegen", commit: str | None = None, language: Literal["python", "typescript"] | ProgrammingLanguage | None = None, - config: CodebaseConfig = DefaultCodebaseConfig, - secrets: SecretsConfig = DefaultSecrets, + config: CodebaseConfig | None = None, + secrets: SecretsConfig | None = None, ) -> "Codebase": """Fetches a codebase from GitHub and returns a Codebase instance. @@ -1268,8 +1268,8 @@ def from_repo( commit (Optional[str]): The specific commit hash to clone. Defaults to HEAD shallow (bool): Whether to do a shallow clone. Defaults to True language (Literal["python", "typescript"] | ProgrammingLanguage | None): The programming language of the repo. Defaults to None. - config (CodebaseConfig): Configuration for the codebase. Defaults to pre-defined defaults. - secrets (SecretsConfig): Configuration for the secrets. Defaults to empty values. + config (CodebaseConfig): Configuration for the codebase. Defaults to pre-defined defaults if None. + secrets (SecretsConfig): Configuration for the secrets. Defaults to empty values if None. Returns: Codebase: A Codebase instance initialized with the cloned repository @@ -1295,10 +1295,10 @@ def from_repo( # Use RepoOperator to fetch the repository logger.info("Cloning repository...") if commit is None: - repo_operator = RepoOperator.create_from_repo(repo_path=repo_path, url=repo_url, access_token=secrets.github_token) + repo_operator = RepoOperator.create_from_repo(repo_path=repo_path, url=repo_url) else: # Ensure the operator can handle remote operations - repo_operator = RepoOperator.create_from_commit(repo_path=repo_path, commit=commit, url=repo_url, access_token=secrets.github_token) + repo_operator = RepoOperator.create_from_commit(repo_path=repo_path, commit=commit, url=repo_url) logger.info("Clone completed successfully") # Initialize and return codebase with proper context diff --git a/src/codegen/git/utils/path.py b/src/codegen/shared/path.py similarity index 76% rename from src/codegen/git/utils/path.py rename to src/codegen/shared/path.py index c4cd063f8..a541c42cd 100644 --- a/src/codegen/git/utils/path.py +++ b/src/codegen/shared/path.py @@ -3,9 +3,11 @@ from pathlib import Path -def get_git_root_path(path: Path) -> Path | None: +def get_git_root_path(path: Path | None = None) -> Path | None: """Get the closest root of the git repository containing the given path""" try: + path = path or Path.cwd() + path = path.resolve() os.chdir(path) output = subprocess.run(["git", "rev-parse", "--show-toplevel"], capture_output=True, check=True, text=True) return Path(output.stdout.strip()) diff --git a/tests/integration/codegen/runner/conftest.py b/tests/integration/codegen/runner/conftest.py index 1c4bf52b7..7180568b3 100644 --- a/tests/integration/codegen/runner/conftest.py +++ b/tests/integration/codegen/runner/conftest.py @@ -5,7 +5,6 @@ import pytest -from codegen.configs.models.secrets import DefaultSecrets from codegen.git.clients.git_repo_client import GitRepoClient from codegen.git.repo_operator.repo_operator import RepoOperator from codegen.git.schemas.enums import SetupOption @@ -36,16 +35,16 @@ def repo_config(tmpdir) -> Generator[RepoConfig, None, None]: @pytest.fixture def op(repo_config: RepoConfig) -> Generator[RepoOperator, None, None]: - yield RepoOperator(repo_config=repo_config, access_token=DefaultSecrets.github_token, setup_option=SetupOption.PULL_OR_CLONE) + yield RepoOperator(repo_config=repo_config, setup_option=SetupOption.PULL_OR_CLONE) @pytest.fixture -def git_repo_client(repo_config: RepoConfig) -> Generator[GitRepoClient, None, None]: - yield GitRepoClient(repo_config=repo_config, access_token=DefaultSecrets.github_token) +def git_repo_client(op: RepoOperator, repo_config: RepoConfig) -> Generator[GitRepoClient, None, None]: + yield GitRepoClient(repo_config=repo_config, access_token=op.access_token) @pytest.fixture def codebase_client(repo_config: RepoConfig, get_free_port) -> Generator[CodebaseClient, None, None]: - sb_client = CodebaseClient(repo_config=repo_config, port=get_free_port, git_access_token=DefaultSecrets.github_token) + sb_client = CodebaseClient(repo_config=repo_config, port=get_free_port) sb_client.runner = Mock() yield sb_client diff --git a/tests/integration/codemod/test_parse.py b/tests/integration/codemod/test_parse.py index 9554cf555..06ec7125f 100644 --- a/tests/integration/codemod/test_parse.py +++ b/tests/integration/codemod/test_parse.py @@ -5,7 +5,7 @@ import psutil import pytest -from codegen.configs.models.codebase import DefaultCodebaseConfig +from codegen.configs.models.codebase import CodebaseConfig from codegen.git.repo_operator.repo_operator import RepoOperator from codegen.sdk.codebase.config import ProjectConfig from codegen.sdk.codebase.validation import PostInitValidationStatus, post_init_validation @@ -26,7 +26,7 @@ def test_codemods_parse(repo: Repo, op: RepoOperator, request) -> None: if repo.config is not None: codebase_config = repo.config else: - codebase_config = DefaultCodebaseConfig + codebase_config = CodebaseConfig() codebase_config = codebase_config.model_copy(update={"verify_graph": sync, "debug": log_parse, "ignore_process_errors": False}) diff --git a/tests/unit/codegen/runner/sandbox/conftest.py b/tests/unit/codegen/runner/sandbox/conftest.py index 925286ac2..efc4913cf 100644 --- a/tests/unit/codegen/runner/sandbox/conftest.py +++ b/tests/unit/codegen/runner/sandbox/conftest.py @@ -31,4 +31,4 @@ def runner(codebase: Codebase, tmpdir): mock_init_codebase.return_value = codebase mock_op.return_value = codebase.op - yield SandboxRunner(repo_config=codebase.op.repo_config, access_token="test-token") + yield SandboxRunner(repo_config=codebase.op.repo_config)