Skip to content

Commit 05fcbff

Browse files
authored
feat: CG-10753: read repo config from local git instance (#424)
# Motivation <!-- Why is this change necessary? --> # Content <!-- Please include a summary of the change --> # Testing <!-- How was the change tested? --> # Please check the following before marking your PR as ready for review - [x] I have added tests for my changes - [x] I have updated the documentation or added new documentation as needed
1 parent 6740ffc commit 05fcbff

File tree

369 files changed

+682
-597
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

369 files changed

+682
-597
lines changed

codegen-examples/examples/dict_to_schema/run.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import codegen
2-
from codegen.sdk.enums import ProgrammingLanguage
2+
from codegen.shared.enums.programming_language import ProgrammingLanguage
33
from codegen import Codebase
44

55

codegen-examples/examples/fragment_to_shorthand/run.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import codegen
22
from codegen import Codebase
3-
from codegen.sdk.enums import ProgrammingLanguage
3+
from codegen.shared.enums.programming_language import ProgrammingLanguage
44

55

66
@codegen.function("fragment_to_shorthand")

codegen-examples/examples/freezegun_to_timemachine_migration/run.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import codegen
2-
from codegen.sdk.enums import ProgrammingLanguage
2+
from codegen.shared.enums.programming_language import ProgrammingLanguage
33
from codegen import Codebase
44

55

codegen-examples/examples/generate_training_data/run.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
import codegen
44
from codegen import Codebase
5-
from codegen.sdk.enums import ProgrammingLanguage
5+
from codegen.shared.enums.programming_language import ProgrammingLanguage
66
from codegen.sdk.core.external_module import ExternalModule
77
from codegen.sdk.core.import_resolution import Import
88
from codegen.sdk.core.symbol import Symbol

codegen-examples/examples/langchain_agent/run.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
SemanticEditTool,
1515
ViewFileTool,
1616
)
17-
from codegen.sdk.enums import ProgrammingLanguage
17+
from codegen.shared.enums.programming_language import ProgrammingLanguage
1818
from langchain import hub
1919
from langchain.agents import AgentExecutor
2020
from langchain.agents.openai_functions_agent.base import OpenAIFunctionsAgent

codegen-examples/examples/modules_dependencies/run.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import codegen
22
from codegen import Codebase
3-
from codegen.sdk.enums import ProgrammingLanguage
3+
from codegen.shared.enums.programming_language import ProgrammingLanguage
44
import networkx as nx
55

66

codegen-examples/examples/openapi_decorators/run.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import codegen
22
from codegen import Codebase
3-
from codegen.sdk.enums import ProgrammingLanguage
3+
from codegen.shared.enums.programming_language import ProgrammingLanguage
44

55

66
def analyze_model_fields(method) -> dict:

codegen-examples/examples/reexport_management/run.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33

44
from codegen.sdk.typescript.file import TSImport
55

6-
from codegen.sdk.enums import ProgrammingLanguage
6+
from codegen.shared.enums.programming_language import ProgrammingLanguage
77

88
processed_imports = set()
99

codegen-examples/examples/slack_chatbot/api.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
import modal
77
from codegen import Codebase
88
from codegen.extensions import VectorIndex
9-
from codegen.sdk.enums import ProgrammingLanguage
9+
from codegen.shared.enums.programming_language import ProgrammingLanguage
1010
from fastapi import FastAPI, Request
1111
from openai import OpenAI
1212
from slack_bolt import App

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.sdk.enums import ProgrammingLanguage
4+
from codegen.shared.enums.programming_language import ProgrammingLanguage
55
import shutil
66
import subprocess
77
from pathlib import Path

codegen-examples/examples/usesuspensequery_to_usesuspensequeries/run.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import codegen
22
from codegen import Codebase
3-
from codegen.sdk.enums import ProgrammingLanguage
3+
from codegen.shared.enums.programming_language import ProgrammingLanguage
44
from codegen.sdk.core.detached_symbols.function_call import FunctionCall
55

66

codegen-examples/examples/visualize_codebases/blast_radius.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import codegen
22
from codegen import Codebase
3-
from codegen.sdk.enums import ProgrammingLanguage
3+
from codegen.shared.enums.programming_language import ProgrammingLanguage
44
import networkx as nx
55
from codegen.sdk.python.symbol import PySymbol
66
from codegen.sdk.python.function import PyFunction

codegen-examples/examples/visualize_codebases/call_trace.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import codegen
22
from codegen import Codebase
3-
from codegen.sdk.enums import ProgrammingLanguage
3+
from codegen.shared.enums.programming_language import ProgrammingLanguage
44
import networkx as nx
55
from codegen.sdk.core.detached_symbols.function_call import FunctionCall
66
from codegen.sdk.core.function import Function

codegen-examples/examples/visualize_codebases/dependency_trace.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import codegen
22
from codegen import Codebase
3-
from codegen.sdk.enums import ProgrammingLanguage
3+
from codegen.shared.enums.programming_language import ProgrammingLanguage
44
import networkx as nx
55
from codegen.sdk.core.class_definition import Class
66
from codegen.sdk.core.symbol import Symbol

codegen-examples/examples/visualize_codebases/method_relationships.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import codegen
22
from codegen import Codebase
3-
from codegen.sdk.enums import ProgrammingLanguage
3+
from codegen.shared.enums.programming_language import ProgrammingLanguage
44
import networkx as nx
55
from codegen.sdk.core.detached_symbols.function_call import FunctionCall
66
from codegen.sdk.core.function import Function

docs/conftest.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88

99
from codegen.sdk.code_generation.current_code_codebase import get_documented_objects
1010
from codegen.sdk.codebase.factory.get_session import get_codebase_session
11-
from codegen.sdk.enums import ProgrammingLanguage
11+
from codegen.shared.enums.programming_language import ProgrammingLanguage
1212
from codegen.sdk.typescript.class_definition import TSClass
1313
from codegen.sdk.typescript.file import TSFile
1414
from codegen.gscli.generate.runner_imports import EXTERNAL_IMPORTS

pyproject.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -160,7 +160,7 @@ dev-dependencies = [
160160

161161

162162
[tool.uv.workspace]
163-
members = ["codegen", "codegen-examples"]
163+
#members = ["codegen", "codegen-examples"]
164164
exclude = ["codegen-examples"]
165165

166166
[tool.cython-lint]

scripts/profiling/apis.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
from tabulate import tabulate
88

99
from codegen.sdk.codebase.factory.get_dev_customer_codebase import get_codebase_codegen
10-
from codegen.sdk.enums import ProgrammingLanguage
10+
from codegen.shared.enums.programming_language import ProgrammingLanguage
1111

1212
logging.basicConfig(level=logging.INFO)
1313
codegen = get_codebase_codegen("../codegen", ".")

src/codegen/cli/api/client.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,8 +45,8 @@
4545
from codegen.cli.env.global_env import global_env
4646
from codegen.cli.errors import InvalidTokenError, ServerError
4747
from codegen.cli.utils.codemods import Codemod
48-
from codegen.cli.utils.constants import ProgrammingLanguage
4948
from codegen.cli.utils.function_finder import DecoratedFunction
49+
from codegen.shared.enums.programming_language import ProgrammingLanguage
5050

5151
InputT = TypeVar("InputT", bound=BaseModel)
5252
OutputT = TypeVar("OutputT", bound=BaseModel)

src/codegen/cli/api/schemas.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,8 @@
44
from pydantic import BaseModel
55
from pydantic.fields import Field
66

7-
from codegen.cli.utils.constants import ProgrammingLanguage
87
from codegen.cli.utils.schema import SafeBaseModel
8+
from codegen.shared.enums.programming_language import ProgrammingLanguage
99

1010
T = TypeVar("T")
1111

src/codegen/cli/auth/session.py

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
from codegen.cli.errors import AuthError, NoTokenError
99
from codegen.cli.git.repo import get_git_repo
1010
from codegen.cli.utils.config import Config, get_config, write_config
11-
from codegen.sdk.enums import ProgrammingLanguage
11+
from codegen.shared.enums.programming_language import ProgrammingLanguage
1212

1313

1414
@dataclass
@@ -39,15 +39,19 @@ class CodegenSession:
3939
"""Represents an authenticated codegen session with user and repository context"""
4040

4141
# =====[ Instance attributes ]=====
42-
token: str | None = None
42+
_token: str | None = None
4343

4444
# =====[ Lazy instance attributes ]=====
4545
_config: Config | None = None
4646
_identity: Identity | None = None
4747
_profile: UserProfile | None = None
4848

49-
def __init__(self, token: str | None = None):
50-
self.token = token or get_current_token()
49+
@property
50+
def token(self) -> str | None:
51+
"""Get the current authentication token"""
52+
if self._token:
53+
return self._token
54+
return get_current_token()
5155

5256
@property
5357
def config(self) -> Config:

src/codegen/cli/commands/init/main.py

Lines changed: 51 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -1,65 +1,84 @@
1+
import os
12
import subprocess
23
import sys
34
from pathlib import Path
45

56
import rich
67
import rich_click as click
8+
from github import BadCredentialsException
9+
from github.MainClass import Github
710

8-
from codegen.cli.auth.constants import CODEGEN_DIR
911
from codegen.cli.auth.session import CodegenSession
1012
from codegen.cli.commands.init.render import get_success_message
11-
from codegen.cli.git.url import get_git_organization_and_repo
1213
from codegen.cli.rich.codeblocks import format_command
13-
from codegen.cli.utils.constants import ProgrammingLanguage
1414
from codegen.cli.workspace.initialize_workspace import initialize_codegen
15+
from codegen.git.repo_operator.local_git_repo import LocalGitRepo
16+
from codegen.shared.configs.config import config
17+
from codegen.shared.configs.constants import CONFIG_PATH
18+
from codegen.shared.enums.programming_language import ProgrammingLanguage
1519

1620

1721
@click.command(name="init")
18-
@click.option("--repo-name", type=str, help="The name of the repository")
19-
@click.option("--organization-name", type=str, help="The name of the organization")
20-
@click.option("--fetch-docs", is_flag=True, help="Fetch docs and examples (requires auth)")
22+
@click.option("--path", type=str, help="Path within a git repository. Defaults to the current directory.")
23+
@click.option("--token", type=str, help="Access token for the git repository. Required for full functionality.")
2124
@click.option("--language", type=click.Choice(["python", "typescript"], case_sensitive=False), help="Override automatic language detection")
22-
def init_command(repo_name: str | None = None, organization_name: str | None = None, fetch_docs: bool = False, language: str | None = None):
25+
@click.option("--fetch-docs", is_flag=True, help="Fetch docs and examples (requires auth)")
26+
def init_command(path: str | None = None, token: str | None = None, language: str | None = None, fetch_docs: bool = False):
2327
"""Initialize or update the Codegen folder."""
2428
# Print a message if not in a git repo
29+
path = str(Path.cwd()) if path is None else path
2530
try:
31+
os.chdir(path)
2632
output = subprocess.run(["git", "rev-parse", "--show-toplevel"], capture_output=True, check=True, text=True)
33+
local_git = LocalGitRepo(repo_path=output.stdout.strip())
2734
except (subprocess.CalledProcessError, FileNotFoundError):
28-
rich.print("\n[bold red]Error:[/bold red] Not in a git repository")
35+
rich.print(f"\n[bold red]Error:[/bold red] Path={path} is not in a git repository")
2936
rich.print("[white]Please run this command from within a git repository.[/white]")
3037
rich.print("\n[dim]To initialize a new git repository:[/dim]")
3138
rich.print(format_command("git init"))
32-
rich.print(format_command("git remote add origin <your-repo-url>"))
3339
rich.print(format_command("codegen init"))
3440
sys.exit(1)
3541

36-
# Convert language string to enum if provided
37-
programming_language = None
38-
if language:
39-
programming_language = ProgrammingLanguage[language.upper()]
42+
if local_git.origin_remote is None:
43+
rich.print("\n[bold red]Error:[/bold red] No remote found for repository")
44+
rich.print("[white]Please add a remote to the repository.[/white]")
45+
rich.print("\n[dim]To add a remote to the repository:[/dim]")
46+
rich.print(format_command("git remote add origin <your-repo-url>"))
47+
sys.exit(1)
48+
49+
if token is None:
50+
token = config.secrets.github_token
51+
else:
52+
config.secrets.github_token = token
4053

41-
# Only create session if we need to fetch docs
42-
session = CodegenSession() if fetch_docs else None
43-
codegen_dir = Path.cwd() / CODEGEN_DIR if not session else session.codegen_dir
44-
is_update = codegen_dir.exists()
54+
if not token:
55+
rich.print("\n[bold yellow]Warning:[/bold yellow] GitHub token not found")
56+
rich.print("To enable full functionality, please set your GitHub token:")
57+
rich.print(format_command("export CODEGEN_SECRETS__GITHUB_TOKEN=<your-token>"))
58+
rich.print("Or pass in as a parameter:")
59+
rich.print(format_command("codegen init --token <your-token>"))
60+
else:
61+
# Validate that the token is valid for the repo path.
62+
try:
63+
Github(login_or_token=token).get_repo(local_git.full_name)
64+
except BadCredentialsException:
65+
rich.print(format_command(f"\n[bold red]Error:[/bold red] Invalid GitHub token={token} for repo={local_git.full_name}"))
66+
rich.print("[white]Please provide a valid GitHub token for this repository.[/white]")
67+
sys.exit(1)
4568

46-
# Only update config if we have a session
47-
if session:
48-
if organization_name is not None:
49-
session.config.organization_name = organization_name
50-
if repo_name is not None:
51-
session.config.repo_name = repo_name
52-
if not session.config.organization_name or not session.config.repo_name:
53-
cwd_org, cwd_repo = get_git_organization_and_repo(session.git_repo)
54-
session.config.organization_name = session.config.organization_name or cwd_org
55-
session.config.repo_name = session.config.repo_name or cwd_repo
56-
if programming_language:
57-
session.config.programming_language = programming_language
58-
session.write_config()
69+
# Save repo config
70+
config.repository.repo_path = local_git.repo_path
71+
config.repository.repo_name = local_git.name
72+
config.repository.full_name = local_git.full_name
73+
config.repository.user_name = local_git.user_name
74+
config.repository.user_email = local_git.user_email
75+
config.repository.language = (language or local_git.get_language(access_token=token)).upper()
76+
config.save()
5977

60-
action = "Updating" if is_update else "Initializing"
78+
session = CodegenSession()
79+
action = "Updating" if CONFIG_PATH.exists() else "Initializing"
6180
rich.print("")
62-
codegen_dir, docs_dir, examples_dir = initialize_codegen(action, session=session, fetch_docs=fetch_docs, programming_language=programming_language)
81+
codegen_dir, docs_dir, examples_dir = initialize_codegen(action, session=session, fetch_docs=fetch_docs, programming_language=ProgrammingLanguage(config.repository.language))
6382

6483
# Print success message
6584
rich.print(f"✅ {action} complete\n")

src/codegen/cli/git/folder.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
from pathlib import Path
33

44

5+
# TODO: move to codegen.git module
56
def get_git_folder(path: os.PathLike | None = None) -> Path | None:
67
if path is None:
78
path = Path.cwd()

src/codegen/cli/git/repo.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
from codegen.cli.git.folder import get_git_folder
77

88

9+
# TODO: move to codegen.git module
910
def get_git_repo(path: os.PathLike | None = None) -> Repository | None:
1011
if path is None:
1112
path = Path.cwd()

src/codegen/cli/mcp/resources/system_prompt.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1327,7 +1327,7 @@ def baz():
13271327
13281328
```python
13291329
from codegen import Codebase
1330-
from codegen.sdk.enums import ProgrammingLanguage
1330+
from codegen.shared.enums.programming_language import ProgrammingLanguage
13311331
13321332
# Parse from a git repository root
13331333
codebase = Codebase("path/to/repository")
@@ -1360,7 +1360,7 @@ def baz():
13601360
13611361
```python
13621362
import codegen
1363-
from codegen.sdk.enums import ProgrammingLanguage
1363+
from codegen.shared.enums.programming_language import ProgrammingLanguage
13641364
13651365
# Fetch and parse a repository (defaults to /tmp/codegen/{repo_name})
13661366
codebase = codegen.from_repo('fastapi/fastapi')
@@ -1423,7 +1423,7 @@ def baz():
14231423
from codegen.git.repo_operator.local_repo_operator import LocalRepoOperator
14241424
from codegen.git.schemas.repo_config import RepoConfig
14251425
from codegen.sdk.codebase.config import ProjectConfig
1426-
from codegen.sdk.enums import ProgrammingLanguage
1426+
from codegen.shared.enums.programming_language import ProgrammingLanguage
14271427
14281428
codebase = Codebase(
14291429
projects = [

src/codegen/cli/mcp/server.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
from codegen.cli.api.client import RestAPI
66
from codegen.cli.mcp.resources.system_prompt import SYSTEM_PROMPT
77
from codegen.cli.mcp.resources.system_setup_instructions import SETUP_INSTRUCTIONS
8-
from codegen.cli.utils.constants import ProgrammingLanguage
8+
from codegen.shared.enums.programming_language import ProgrammingLanguage
99

1010
# Initialize FastMCP server
1111

src/codegen/cli/workspace/initialize_workspace.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,11 +14,11 @@
1414
from codegen.cli.git.repo import get_git_repo
1515
from codegen.cli.git.url import get_git_organization_and_repo
1616
from codegen.cli.rich.spinners import create_spinner
17-
from codegen.cli.utils.constants import ProgrammingLanguage
1817
from codegen.cli.utils.notebooks import create_notebook
1918
from codegen.cli.workspace.docs_workspace import populate_api_docs
2019
from codegen.cli.workspace.examples_workspace import populate_examples
2120
from codegen.cli.workspace.venv_manager import VenvManager
21+
from codegen.shared.enums.programming_language import ProgrammingLanguage
2222

2323

2424
def initialize_codegen(

src/codegen/git/clients/github_client.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ class GithubClient:
1515
base_url: str
1616
_client: Github
1717

18-
def __init__(self, token: str, base_url: str = Consts.DEFAULT_BASE_URL):
18+
def __init__(self, token: str | None = None, base_url: str = Consts.DEFAULT_BASE_URL):
1919
self.base_url = base_url
2020
self._client = Github(token, base_url=base_url)
2121

0 commit comments

Comments
 (0)