Skip to content

Commit d48a8e9

Browse files
authored
refactor: break up config models (#448)
1 parent 6207b84 commit d48a8e9

File tree

22 files changed

+138
-125
lines changed

22 files changed

+138
-125
lines changed

codegen-examples/examples/pr_review_bot/run.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
from codegen.sdk.codebase.config import CodebaseConfig
55
import json
66
from codegen.sdk.secrets import Secrets
7-
from codegen.shared.configs.models import CodebaseFeatureFlags
7+
from codegen.shared.configs.models.feature_flags import CodebaseFeatureFlags
88

99
github_token = "Your github token"
1010
open_ai_key = "your open ai key"

codegen-examples/examples/sqlalchemy_soft_delete/run.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import codegen
22
from codegen import Codebase
33
from codegen.sdk.core.detached_symbols.function_call import FunctionCall
4-
from codegen.shared.configs.models import CodebaseFeatureFlags
4+
from codegen.shared.configs.models.feature_flags import CodebaseFeatureFlags
55
from codegen.shared.enums.programming_language import ProgrammingLanguage
66
import shutil
77
import subprocess

src/codegen/cli/auth/session.py

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,25 +3,24 @@
33
from pygit2.repository import Repository
44

55
from codegen.cli.git.repo import get_git_repo
6-
from codegen.shared.configs.config import load
76
from codegen.shared.configs.constants import CODEGEN_DIR_NAME, CONFIG_FILENAME
8-
from codegen.shared.configs.global_config import config as global_config
9-
from codegen.shared.configs.models import Config
7+
from codegen.shared.configs.models.session import SessionConfig
8+
from codegen.shared.configs.session_configs import global_config, load_session_config
109

1110

1211
class CodegenSession:
1312
"""Represents an authenticated codegen session with user and repository context"""
1413

1514
repo_path: Path # TODO: rename to root_path
1615
codegen_dir: Path
17-
config: Config
16+
config: SessionConfig
1817
existing: bool
1918

2019
def __init__(self, repo_path: Path):
2120
self.repo_path = repo_path
2221
self.codegen_dir = repo_path / CODEGEN_DIR_NAME
2322
self.existing = global_config.get_session(repo_path) is not None
24-
self.config = load(self.codegen_dir / CONFIG_FILENAME)
23+
self.config = load_session_config(self.codegen_dir / CONFIG_FILENAME)
2524
global_config.set_active_session(repo_path)
2625

2726
@classmethod

src/codegen/extensions/lsp/protocol.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
from codegen.extensions.lsp.utils import get_path
1111
from codegen.sdk.codebase.config import CodebaseConfig
1212
from codegen.sdk.core.codebase import Codebase
13-
from codegen.shared.configs.models import CodebaseFeatureFlags
13+
from codegen.shared.configs.models.feature_flags import CodebaseFeatureFlags
1414

1515
if TYPE_CHECKING:
1616
from codegen.extensions.lsp.server import CodegenLanguageServer

src/codegen/runner/sandbox/runner.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
from codegen.sdk.core.codebase import Codebase
1313
from codegen.sdk.secrets import Secrets
1414
from codegen.shared.compilation.string_to_code import create_execute_function_from_codeblock
15-
from codegen.shared.configs.config import config
15+
from codegen.shared.configs.session_configs import config
1616
from codegen.shared.performance.stopwatch_utils import stopwatch
1717

1818
logger = logging.getLogger(__name__)

src/codegen/runner/sandbox/server.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@
2323
)
2424
from codegen.runner.sandbox.middlewares import CodemodRunMiddleware
2525
from codegen.runner.sandbox.runner import SandboxRunner
26-
from codegen.shared.configs.config import config
26+
from codegen.shared.configs.session_configs import config
2727
from codegen.shared.enums.programming_language import ProgrammingLanguage
2828
from codegen.shared.performance.memory_utils import get_memory_stats
2929

src/codegen/sdk/codebase/config.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
from codegen.git.utils.file_utils import split_git_path
1212
from codegen.git.utils.language import determine_project_language
1313
from codegen.sdk.secrets import Secrets
14-
from codegen.shared.configs.models import CodebaseFeatureFlags
14+
from codegen.shared.configs.models.feature_flags import CodebaseFeatureFlags
1515
from codegen.shared.enums.programming_language import ProgrammingLanguage
1616

1717
HARD_MAX_AI_LIMIT = 500 # Global limit for AI requests

src/codegen/sdk/codebase/factory/get_session.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
from codegen.sdk.core.codebase import Codebase, PyCodebaseType, TSCodebaseType
1212
from codegen.sdk.secrets import Secrets
1313
from codegen.sdk.tree_sitter_parser import print_errors
14-
from codegen.shared.configs.models import CodebaseFeatureFlags
14+
from codegen.shared.configs.models.feature_flags import CodebaseFeatureFlags
1515
from codegen.shared.enums.programming_language import ProgrammingLanguage
1616

1717

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
from pydantic import BaseModel, Field
2+
from pydantic_settings import BaseSettings
3+
4+
from codegen.shared.configs.models.utils import get_setting_config
5+
6+
prefix = "FEATURE_FLAGS"
7+
8+
9+
class TypescriptConfig(BaseSettings):
10+
model_config = get_setting_config(f"{prefix}_TYPESCRIPT")
11+
12+
ts_dependency_manager: bool = False
13+
ts_language_engine: bool = False
14+
v8_ts_engine: bool = False
15+
16+
17+
class CodebaseFeatureFlags(BaseSettings):
18+
model_config = get_setting_config(f"{prefix}")
19+
20+
debug: bool = False
21+
verify_graph: bool = False
22+
track_graph: bool = False
23+
method_usages: bool = True
24+
sync_enabled: bool = True
25+
full_range_index: bool = False
26+
ignore_process_errors: bool = True
27+
disable_graph: bool = False
28+
generics: bool = True
29+
import_resolution_overrides: dict[str, str] = Field(default_factory=lambda: {})
30+
typescript: TypescriptConfig = Field(default_factory=TypescriptConfig)
31+
32+
33+
class FeatureFlagsConfig(BaseModel):
34+
codebase: CodebaseFeatureFlags = Field(default_factory=CodebaseFeatureFlags)

src/codegen/shared/configs/global_config.py renamed to src/codegen/shared/configs/models/global_session.py

Lines changed: 0 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
"""Global config to manage different codegen sessions, as well as user auth."""
22

3-
# TODO: rename this file to global.py
43
import json
54
from pathlib import Path
65

@@ -39,18 +38,3 @@ def save(self) -> None:
3938

4039
with open(SESSION_FILE, "w") as f:
4140
json.dump(self.model_dump(), f)
42-
43-
44-
def _load_global_config() -> GlobalSessionConfig:
45-
"""Load configuration from the JSON file."""
46-
if SESSION_FILE.exists():
47-
with open(SESSION_FILE) as f:
48-
json_config = json.load(f)
49-
return GlobalSessionConfig.model_validate(json_config, strict=False)
50-
51-
new_config = GlobalSessionConfig(sessions=[])
52-
new_config.save()
53-
return new_config
54-
55-
56-
config = _load_global_config()
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
from pydantic_settings import BaseSettings
2+
3+
from codegen.shared.configs.models.utils import get_setting_config
4+
5+
prefix = "REPOSITORY"
6+
7+
8+
class RepositoryConfig(BaseSettings):
9+
"""Configuration for the repository context to run codegen.
10+
To populate this config, call `codegen init` from within a git repository.
11+
"""
12+
13+
model_config = get_setting_config(prefix)
14+
15+
repo_path: str | None = None # replace with base_dir
16+
repo_name: str | None = None
17+
full_name: str | None = None # replace with org_name
18+
language: str | None = None
19+
user_name: str | None = None
20+
user_email: str | None = None
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
from pydantic_settings import BaseSettings
2+
3+
from codegen.shared.configs.models.utils import get_setting_config
4+
5+
prefix = "SECRETS"
6+
7+
8+
class SecretsConfig(BaseSettings):
9+
model_config = get_setting_config(prefix)
10+
11+
github_token: str | None = None
12+
openai_api_key: str | None = None

src/codegen/shared/configs/models.py renamed to src/codegen/shared/configs/models/session.py

Lines changed: 5 additions & 62 deletions
Original file line numberDiff line numberDiff line change
@@ -5,69 +5,12 @@
55
from pydantic import BaseModel, Field
66
from pydantic_settings import BaseSettings, SettingsConfigDict
77

8-
9-
def _get_setting_config(group_name: str) -> SettingsConfigDict:
10-
return SettingsConfigDict(
11-
env_prefix=f"CODEGEN_{group_name}__",
12-
case_sensitive=False,
13-
extra="ignore",
14-
exclude_defaults=False,
15-
)
16-
17-
18-
# TODO: break up these models into separate files and nest in shared/configs/models
19-
class TypescriptConfig(BaseSettings):
20-
model_config = _get_setting_config("FEATURE_FLAGS_TYPESCRIPT")
21-
22-
ts_dependency_manager: bool = False
23-
ts_language_engine: bool = False
24-
v8_ts_engine: bool = False
25-
26-
27-
class CodebaseFeatureFlags(BaseSettings):
28-
model_config = _get_setting_config("FEATURE_FLAGS")
29-
30-
debug: bool = False
31-
verify_graph: bool = False
32-
track_graph: bool = False
33-
method_usages: bool = True
34-
sync_enabled: bool = True
35-
full_range_index: bool = False
36-
ignore_process_errors: bool = True
37-
disable_graph: bool = False
38-
generics: bool = True
39-
import_resolution_overrides: dict[str, str] = Field(default_factory=lambda: {})
40-
typescript: TypescriptConfig = Field(default_factory=TypescriptConfig)
41-
42-
43-
class RepositoryConfig(BaseSettings):
44-
"""Configuration for the repository context to run codegen.
45-
To populate this config, call `codegen init` from within a git repository.
46-
"""
47-
48-
model_config = _get_setting_config("REPOSITORY")
49-
50-
repo_path: str | None = None # replace with base_dir
51-
repo_name: str | None = None
52-
full_name: str | None = None # replace with org_name
53-
language: str | None = None
54-
user_name: str | None = None
55-
user_email: str | None = None
56-
57-
58-
class SecretsConfig(BaseSettings):
59-
model_config = _get_setting_config("SECRETS")
60-
61-
github_token: str | None = None
62-
openai_api_key: str | None = None
63-
64-
65-
class FeatureFlagsConfig(BaseModel):
66-
codebase: CodebaseFeatureFlags = Field(default_factory=CodebaseFeatureFlags)
8+
from codegen.shared.configs.models.feature_flags import FeatureFlagsConfig
9+
from codegen.shared.configs.models.repository import RepositoryConfig
10+
from codegen.shared.configs.models.secrets import SecretsConfig
6711

6812

69-
# TODO: rename to SessionConfig
70-
class Config(BaseSettings):
13+
class SessionConfig(BaseSettings):
7114
model_config = SettingsConfigDict(
7215
extra="ignore",
7316
exclude_defaults=False,
@@ -124,7 +67,7 @@ def set(self, full_key: str, value: str) -> None:
12467
field_info = current_attr.model_fields[keys[-1]].annotation
12568
if isinstance(field_info, BaseModel):
12669
try:
127-
Config.model_validate(value, strict=False)
70+
SessionConfig.model_validate(value, strict=False)
12871
except Exception as e:
12972
msg = f"Value does not match the expected type for key: {full_key}\n\nError:{e}"
13073
raise ValueError(msg)
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
from pydantic_settings import SettingsConfigDict
2+
3+
4+
def get_setting_config(group_name: str) -> SettingsConfigDict:
5+
return SettingsConfigDict(
6+
env_prefix=f"CODEGEN_{group_name}__",
7+
case_sensitive=False,
8+
extra="ignore",
9+
exclude_defaults=False,
10+
)
Lines changed: 27 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,14 @@
1-
# TODO: rename this file to local.py
1+
import json
22
from pathlib import Path
33

44
import tomllib
55

6-
from codegen.shared.configs.constants import CONFIG_PATH
7-
from codegen.shared.configs.models import Config
6+
from codegen.shared.configs.constants import CONFIG_PATH, SESSION_FILE
7+
from codegen.shared.configs.models.global_session import GlobalSessionConfig
8+
from codegen.shared.configs.models.session import SessionConfig
89

910

10-
def load(config_path: Path) -> Config:
11+
def load_session_config(config_path: Path) -> SessionConfig:
1112
"""Loads configuration from various sources."""
1213
# Load from .env file
1314
env_config = _load_from_env(config_path)
@@ -17,28 +18,28 @@ def load(config_path: Path) -> Config:
1718

1819
# Merge configurations recursively
1920
config_dict = _merge_configs(env_config.model_dump(), toml_config.model_dump())
20-
loaded_config = Config(**config_dict)
21+
loaded_config = SessionConfig(**config_dict)
2122

2223
# Save the configuration to file if it doesn't exist
2324
if not config_path.exists():
2425
loaded_config.save()
2526
return loaded_config
2627

2728

28-
def _load_from_env(config_path: Path) -> Config:
29+
def _load_from_env(config_path: Path) -> SessionConfig:
2930
"""Load configuration from the environment variables."""
30-
return Config(file_path=str(config_path))
31+
return SessionConfig(file_path=str(config_path))
3132

3233

33-
def _load_from_toml(config_path: Path) -> Config:
34+
def _load_from_toml(config_path: Path) -> SessionConfig:
3435
"""Load configuration from the TOML file."""
3536
if config_path.exists():
3637
with open(config_path, "rb") as f:
3738
toml_config = tomllib.load(f)
3839
toml_config["file_path"] = str(config_path)
39-
return Config.model_validate(toml_config, strict=False)
40+
return SessionConfig.model_validate(toml_config, strict=False)
4041

41-
return Config(file_path=str(config_path))
42+
return SessionConfig(file_path=str(config_path))
4243

4344

4445
def _merge_configs(base: dict, override: dict) -> dict:
@@ -54,7 +55,22 @@ def _merge_configs(base: dict, override: dict) -> dict:
5455
return merged
5556

5657

57-
config = load(CONFIG_PATH)
58+
def _load_global_config() -> GlobalSessionConfig:
59+
"""Load configuration from the JSON file."""
60+
if SESSION_FILE.exists():
61+
with open(SESSION_FILE) as f:
62+
json_config = json.load(f)
63+
return GlobalSessionConfig.model_validate(json_config, strict=False)
64+
65+
new_config = GlobalSessionConfig(sessions=[])
66+
new_config.save()
67+
return new_config
68+
69+
70+
config = load_session_config(CONFIG_PATH)
71+
global_config = _load_global_config()
72+
5873

5974
if __name__ == "__main__":
6075
print(config)
76+
print(global_config)

tests/integration/codegen/git/codebase/conftest.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,15 +8,14 @@
88
from codegen.git.utils.clone_url import get_authenticated_clone_url_for_repo_config
99
from codegen.sdk.codebase.config import ProjectConfig
1010
from codegen.sdk.core.codebase import Codebase
11-
from codegen.shared.configs.config import config
11+
from codegen.shared.configs.session_configs import config
1212

1313

1414
@pytest.fixture
1515
def repo_config(tmpdir):
1616
repo_config = RepoConfig(
1717
name="Kevin-s-Adventure-Game",
1818
full_name="codegen-sh/Kevin-s-Adventure-Game",
19-
organization_name="codegen-sh",
2019
base_dir=str(tmpdir),
2120
)
2221
yield repo_config

tests/integration/codegen/git/conftest.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,6 @@ def repo_config(tmpdir):
1919
repo_config = RepoConfig(
2020
name="Kevin-s-Adventure-Game",
2121
full_name="codegen-sh/Kevin-s-Adventure-Game",
22-
organization_name="codegen-sh",
2322
base_dir=str(tmpdir),
2423
)
2524
yield repo_config

tests/integration/codegen/runner/conftest.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
from codegen.git.repo_operator.remote_repo_operator import RemoteRepoOperator
1010
from codegen.git.schemas.repo_config import RepoConfig
1111
from codegen.runner.clients.sandbox_client import SandboxClient
12-
from codegen.shared.configs.config import config
12+
from codegen.shared.configs.session_configs import config
1313
from codegen.shared.enums.programming_language import ProgrammingLanguage
1414

1515

0 commit comments

Comments
 (0)