Skip to content

Commit ca4f995

Browse files
authored
chore: dedupe codebase feature flag (#429)
1 parent d38d194 commit ca4f995

File tree

11 files changed

+49
-65
lines changed

11 files changed

+49
-65
lines changed

codegen-examples/examples/pr_review_bot/run.py

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,12 @@
11
import codegen
22
from codegen import Codebase
33
from codegen.sdk.enums import ProgrammingLanguage
4-
from codegen.sdk.codebase.config import CodebaseConfig, GSFeatureFlags, Secrets
4+
from codegen.sdk.codebase.config import CodebaseConfig
55
import json
66

7+
from codegen.sdk.secrets import Secrets
8+
from codegen.shared.configs.models import CodebaseFeatureFlags
9+
710
github_token = "Your github token"
811
open_ai_key = "your open ai key"
912
pr_number = 0 # Your PR number must be an integer
@@ -81,7 +84,7 @@ def run(codebase: Codebase):
8184
programming_language=ProgrammingLanguage.PYTHON,
8285
config=CodebaseConfig(
8386
secrets=Secrets(openai_key=open_ai_key, github_api_key=github_token),
84-
feature_flags=GSFeatureFlags(
87+
feature_flags=CodebaseFeatureFlags(
8588
sync_enabled=True,
8689
),
8790
),

codegen-examples/examples/sqlalchemy_soft_delete/run.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +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
45
from codegen.shared.enums.programming_language import ProgrammingLanguage
56
import shutil
67
import subprocess
@@ -92,15 +93,15 @@ def process_soft_deletes(codebase):
9293

9394
if __name__ == "__main__":
9495
from codegen.sdk.core.codebase import Codebase
95-
from codegen.sdk.codebase.config import CodebaseConfig, GSFeatureFlags
96+
from codegen.sdk.codebase.config import CodebaseConfig
9697

9798
repo_path = Path("/tmp/core")
9899
repo_url = "https://github.com/hasgeek/funnel.git"
99100

100101
try:
101102
clone_repo(repo_url, repo_path)
102103
subprocess.run(["git", "-C", str(repo_path), "checkout", "8454e15"], check=True)
103-
codebase = Codebase(str(repo_path), programming_language=ProgrammingLanguage.PYTHON, config=CodebaseConfig(feature_flags=GSFeatureFlags(disable_graph=True)))
104+
codebase = Codebase(str(repo_path), programming_language=ProgrammingLanguage.PYTHON, config=CodebaseConfig(feature_flags=CodebaseFeatureFlags(disable_graph=True)))
104105
process_soft_deletes(codebase)
105106
finally:
106107
shutil.rmtree(repo_path)

src/codegen/extensions/lsp/protocol.py

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,9 @@
88

99
from codegen.extensions.lsp.io import LSPIO
1010
from codegen.extensions.lsp.utils import get_path
11-
from codegen.sdk.codebase.config import CodebaseConfig, GSFeatureFlags
11+
from codegen.sdk.codebase.config import CodebaseConfig
1212
from codegen.sdk.core.codebase import Codebase
13+
from codegen.shared.configs.models import CodebaseFeatureFlags
1314

1415
if TYPE_CHECKING:
1516
from codegen.extensions.lsp.server import CodegenLanguageServer
@@ -25,7 +26,7 @@ def _init_codebase(self, params: InitializeParams) -> None:
2526
root = get_path(params.root_uri)
2627
else:
2728
root = os.getcwd()
28-
config = CodebaseConfig(feature_flags=GSFeatureFlags(full_range_index=True))
29+
config = CodebaseConfig(feature_flags=CodebaseFeatureFlags(full_range_index=True))
2930
io = LSPIO(self.workspace)
3031
self._server.codebase = Codebase(repo_path=str(root), config=config, io=io)
3132
self._server.io = io
@@ -38,7 +39,7 @@ def lsp_initialize(self, params: InitializeParams) -> InitializeResult:
3839
root = get_path(params.root_uri)
3940
else:
4041
root = os.getcwd()
41-
config = CodebaseConfig(feature_flags=GSFeatureFlags(full_range_index=True))
42+
config = CodebaseConfig(feature_flags=CodebaseFeatureFlags(full_range_index=True))
4243
ret = super().lsp_initialize(params)
4344

4445
self._worker = threading.Thread(target=self._init_codebase, args=(params,))

src/codegen/runner/sandbox/runner.py

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
from codegen.git.schemas.repo_config import RepoConfig
88
from codegen.runner.models.apis import CreateBranchRequest, CreateBranchResponse, GetDiffRequest, GetDiffResponse
99
from codegen.runner.sandbox.executor import SandboxExecutor
10-
from codegen.sdk.codebase.config import CodebaseConfig, GSFeatureFlags, ProjectConfig, SessionOptions
10+
from codegen.sdk.codebase.config import CodebaseConfig, ProjectConfig, SessionOptions
1111
from codegen.sdk.codebase.factory.codebase_factory import CodebaseType
1212
from codegen.sdk.core.codebase import Codebase
1313
from codegen.sdk.secrets import Secrets
@@ -46,9 +46,8 @@ async def warmup(self) -> None:
4646
async def _build_graph(self) -> Codebase:
4747
logger.info("> Building graph...")
4848
projects = [ProjectConfig(programming_language=self.repo.language, repo_operator=self.op, base_path=self.repo.base_path, subdirectories=self.repo.subdirectories)]
49-
gs_ffs = GSFeatureFlags(**config.feature_flags.model_dump())
5049
secrets = Secrets(openai_key=config.secrets.openai_api_key)
51-
codebase_config = CodebaseConfig(secrets=secrets, feature_flags=gs_ffs)
50+
codebase_config = CodebaseConfig(secrets=secrets, feature_flags=config.feature_flags.codebase)
5251
return Codebase(projects=projects, config=codebase_config)
5352

5453
@stopwatch

src/codegen/sdk/codebase/config.py

Lines changed: 6 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +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
1415
from codegen.shared.enums.programming_language import ProgrammingLanguage
1516

1617
HARD_MAX_AI_LIMIT = 500 # Global limit for AI requests
@@ -25,36 +26,10 @@ class SessionOptions(BaseModel):
2526
max_ai_requests: int = Field(default=150, le=HARD_MAX_AI_LIMIT)
2627

2728

28-
class GSFeatureFlags(BaseModel):
29-
"""Config for building the graph sitter graph. These are non-repo specific options that are set per-usecase.
30-
31-
Attributes:
32-
debug: Warning if there are errors during parsing (such as unimplemented nodes)
33-
verify_graph: Verify the accuracy of the graph between resets. Will result in lag
34-
method_usages: Resolve . usages
35-
"""
36-
37-
model_config = ConfigDict(frozen=True)
38-
debug: bool = False
39-
verify_graph: bool = False
40-
track_graph: bool = False # Track the initial graph state
41-
method_usages: bool = True
42-
sync_enabled: bool = True
43-
ts_dependency_manager: bool = False # Enable Typescript Dependency Manager
44-
ts_language_engine: bool = False # Enable Typescript Language Engine
45-
v8_ts_engine: bool = False # Enable V8 Based Typescript Language Engine Instead of NodeJS
46-
full_range_index: bool = False
47-
ignore_process_errors: bool = True # Ignore errors from dependency manager and language engine
48-
import_resolution_overrides: dict[str, str] = {} # Override import resolution for specific modules
49-
disable_graph: bool = False # Turn of graph generation entirely. Speeds up parsing but disables usages and dependencies
50-
generics: bool = True # Enable parsing of generic types
51-
52-
53-
DefaultFlags = GSFeatureFlags(sync_enabled=False)
54-
55-
TestFlags = GSFeatureFlags(debug=True, track_graph=True, verify_graph=True, full_range_index=True)
56-
LintFlags = GSFeatureFlags(method_usages=False)
57-
ParseTestFlags = GSFeatureFlags(debug=False, track_graph=False)
29+
DefaultFlags = CodebaseFeatureFlags(sync_enabled=False)
30+
TestFlags = CodebaseFeatureFlags(debug=True, track_graph=True, verify_graph=True, full_range_index=True)
31+
LintFlags = CodebaseFeatureFlags(method_usages=False)
32+
ParseTestFlags = CodebaseFeatureFlags(debug=False, track_graph=False)
5833

5934

6035
class ProjectConfig(BaseModel):
@@ -103,7 +78,7 @@ class CodebaseConfig(BaseModel):
10378

10479
model_config = ConfigDict(frozen=True)
10580
secrets: Secrets = Secrets()
106-
feature_flags: GSFeatureFlags = DefaultFlags
81+
feature_flags: CodebaseFeatureFlags = DefaultFlags
10782

10883

10984
DefaultConfig = CodebaseConfig()

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

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,12 @@
66

77
from codegen.git.repo_operator.local_repo_operator import LocalRepoOperator
88
from codegen.sdk.codebase.codebase_context import CodebaseContext
9-
from codegen.sdk.codebase.config import CodebaseConfig, GSFeatureFlags, ProjectConfig, SessionOptions, TestFlags
9+
from codegen.sdk.codebase.config import CodebaseConfig, ProjectConfig, SessionOptions, TestFlags
1010
from codegen.sdk.codebase.factory.codebase_factory import CodebaseFactory
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
1415
from codegen.shared.enums.programming_language import ProgrammingLanguage
1516

1617

@@ -23,7 +24,7 @@ def get_codebase_session(
2324
sync_graph: bool = True,
2425
verify_input: bool = True,
2526
verify_output: bool = True,
26-
feature_flags: GSFeatureFlags = TestFlags,
27+
feature_flags: CodebaseFeatureFlags = TestFlags,
2728
session_options: SessionOptions = SessionOptions(),
2829
secrets: Secrets = Secrets(),
2930
) -> AbstractContextManager[PyCodebaseType]: ...
@@ -38,7 +39,7 @@ def get_codebase_session(
3839
sync_graph: bool = True,
3940
verify_input: bool = True,
4041
verify_output: bool = True,
41-
feature_flags: GSFeatureFlags = TestFlags,
42+
feature_flags: CodebaseFeatureFlags = TestFlags,
4243
session_options: SessionOptions = SessionOptions(),
4344
secrets: Secrets = Secrets(),
4445
) -> AbstractContextManager[PyCodebaseType]: ...
@@ -53,7 +54,7 @@ def get_codebase_session(
5354
sync_graph: bool = True,
5455
verify_input: bool = True,
5556
verify_output: bool = True,
56-
feature_flags: GSFeatureFlags = TestFlags,
57+
feature_flags: CodebaseFeatureFlags = TestFlags,
5758
session_options: SessionOptions = SessionOptions(),
5859
secrets: Secrets = Secrets(),
5960
) -> AbstractContextManager[TSCodebaseType]: ...
@@ -68,7 +69,7 @@ def get_codebase_session(
6869
sync_graph: bool = True,
6970
verify_input: bool = True,
7071
verify_output: bool = True,
71-
feature_flags: GSFeatureFlags = TestFlags,
72+
feature_flags: CodebaseFeatureFlags = TestFlags,
7273
session_options: SessionOptions = SessionOptions(),
7374
secrets: Secrets = Secrets(),
7475
) -> Generator[Codebase, None, None]:

src/codegen/sdk/core/external/dependency_manager.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ def remove_dependencies(self):
3030
def get_dependency_manager(language: ProgrammingLanguage, codebase_context: "CodebaseContext", enabled: bool = False) -> DependencyManager | None:
3131
from codegen.sdk.typescript.external.dependency_manager import TypescriptDependencyManager
3232

33-
ts_enabled = enabled or codebase_context.config.feature_flags.ts_dependency_manager
33+
ts_enabled = enabled or codebase_context.config.feature_flags.typescript.ts_dependency_manager
3434
if language == ProgrammingLanguage.TYPESCRIPT:
3535
if ts_enabled:
3636
return TypescriptDependencyManager(repo_path=codebase_context.repo_path, base_path=codebase_context.projects[0].base_path)

src/codegen/sdk/core/external/language_engine.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,8 +24,8 @@ def get_return_type(self, node: "Editable") -> str | None:
2424
def get_language_engine(language: ProgrammingLanguage, codebase_context: "CodebaseContext", use_ts: bool = False, use_v8: bool = False) -> LanguageEngine | None:
2525
from codegen.sdk.typescript.external.ts_analyzer_engine import NodeTypescriptEngine, V8TypescriptEngine
2626

27-
use_ts = use_ts or codebase_context.config.feature_flags.ts_language_engine
28-
use_v8 = use_v8 or codebase_context.config.feature_flags.v8_ts_engine
27+
use_ts = use_ts or codebase_context.config.feature_flags.typescript.ts_language_engine
28+
use_v8 = use_v8 or codebase_context.config.feature_flags.typescript.v8_ts_engine
2929
if language == ProgrammingLanguage.TYPESCRIPT:
3030
if use_ts and use_v8:
3131
# Enables with both ts_language_engine and v8_ts_engine feature flags are on

src/codegen/shared/configs/models.py

Lines changed: 15 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -20,22 +20,24 @@ def _get_setting_config(group_name: str) -> SettingsConfigDict:
2020

2121
class TypescriptConfig(BaseSettings):
2222
model_config = _get_setting_config("FEATURE_FLAGS_TYPESCRIPT")
23-
ts_dependency_manager: bool | None = None
24-
ts_language_engine: bool | None = None
25-
v8_ts_engine: bool | None = None
23+
24+
ts_dependency_manager: bool = False
25+
ts_language_engine: bool = False
26+
v8_ts_engine: bool = False
2627

2728

2829
class CodebaseFeatureFlags(BaseSettings):
2930
model_config = _get_setting_config("FEATURE_FLAGS")
30-
debug: bool | None = None
31-
verify_graph: bool | None = None
32-
track_graph: bool | None = None
33-
method_usages: bool | None = None
34-
sync_enabled: bool | None = None
35-
full_range_index: bool | None = None
36-
ignore_process_errors: bool | None = None
37-
disable_graph: bool | None = None
38-
generics: bool | None = None
31+
32+
debug: bool = False
33+
verify_graph: bool = False
34+
track_graph: bool = False
35+
method_usages: bool = True
36+
sync_enabled: bool = True
37+
full_range_index: bool = False
38+
ignore_process_errors: bool = True
39+
disable_graph: bool = False
40+
generics: bool = True
3941
import_resolution_overrides: dict[str, str] = Field(default_factory=lambda: {})
4042
typescript: TypescriptConfig = Field(default_factory=TypescriptConfig)
4143

@@ -57,6 +59,7 @@ class RepositoryConfig(BaseSettings):
5759

5860
class SecretsConfig(BaseSettings):
5961
model_config = _get_setting_config("SECRETS")
62+
6063
github_token: str | None = None
6164
openai_api_key: str | None = None
6265

tests/integration/codemod/conftest.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,9 @@
1212

1313
from codegen.git.repo_operator.local_repo_operator import LocalRepoOperator
1414
from codegen.git.repo_operator.repo_operator import RepoOperator
15-
from codegen.sdk.codebase.config import CodebaseConfig, GSFeatureFlags, ProjectConfig
15+
from codegen.sdk.codebase.config import CodebaseConfig, ProjectConfig
1616
from codegen.sdk.core.codebase import Codebase
17+
from codegen.shared.configs.models import CodebaseFeatureFlags
1718
from tests.shared.codemod.constants import DIFF_FILEPATH
1819
from tests.shared.codemod.models import BASE_PATH, BASE_TMP_DIR, VERIFIED_CODEMOD_DIFFS, CodemodMetadata, Repo, Size
1920
from tests.shared.codemod.test_discovery import find_codemod_test_cases, find_repos, find_verified_codemod_cases
@@ -142,7 +143,7 @@ def op(repo: Repo, token: str | None) -> YieldFixture[LocalRepoOperator]:
142143
def _codebase(repo: Repo, op: RepoOperator, request) -> YieldFixture[Codebase]:
143144
sync = request.config.getoption("sync-graph").lower() == "true"
144145
log_parse = request.config.getoption("log-parse").lower() == "true"
145-
feature_flags = GSFeatureFlags(verify_graph=sync, debug=log_parse)
146+
feature_flags = CodebaseFeatureFlags(verify_graph=sync, debug=log_parse)
146147
if repo.name not in Codebases:
147148
projects = [ProjectConfig(repo_operator=op, programming_language=repo.language, subdirectories=repo.subdirectories, base_path=repo.base_path)]
148149
Codebases[repo.name] = Codebase(projects=projects, config=CodebaseConfig(feature_flags=feature_flags))

tests/shared/codemod/models.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
from pydantic import BaseModel, ConfigDict
1111

1212
from codegen.git.repo_operator.local_repo_operator import LocalRepoOperator
13-
from codegen.sdk.codebase.config import GSFeatureFlags
13+
from codegen.shared.configs.models import CodebaseFeatureFlags
1414
from codegen.shared.enums.programming_language import ProgrammingLanguage
1515
from tests.shared.codemod.constants import DIFF_FILEPATH
1616
from tests.shared.codemod.verified_codemod_utils import CodemodAPI
@@ -54,7 +54,7 @@ class Repo(BaseModel):
5454
repo_id: int | None = None
5555
priority: int = 0
5656
base_path: str | None = None
57-
feature_flags: GSFeatureFlags | None = None
57+
feature_flags: CodebaseFeatureFlags | None = None
5858

5959
@classmethod
6060
def from_json(cls, json_str: str) -> "Repo":

0 commit comments

Comments
 (0)