Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
2 changes: 1 addition & 1 deletion codegen-examples/examples/dict_to_schema/run.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import codegen
from codegen.sdk.enums import ProgrammingLanguage
from codegen.shared.enums.programming_language import ProgrammingLanguage
from codegen import Codebase


Expand Down
2 changes: 1 addition & 1 deletion codegen-examples/examples/fragment_to_shorthand/run.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import codegen
from codegen import Codebase
from codegen.sdk.enums import ProgrammingLanguage
from codegen.shared.enums.programming_language import ProgrammingLanguage


@codegen.function("fragment_to_shorthand")
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import codegen
from codegen.sdk.enums import ProgrammingLanguage
from codegen.shared.enums.programming_language import ProgrammingLanguage
from codegen import Codebase


Expand Down
2 changes: 1 addition & 1 deletion codegen-examples/examples/generate_training_data/run.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

import codegen
from codegen import Codebase
from codegen.sdk.enums import ProgrammingLanguage
from codegen.shared.enums.programming_language import ProgrammingLanguage
from codegen.sdk.core.external_module import ExternalModule
from codegen.sdk.core.import_resolution import Import
from codegen.sdk.core.symbol import Symbol
Expand Down
2 changes: 1 addition & 1 deletion codegen-examples/examples/langchain_agent/run.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@
SemanticEditTool,
ViewFileTool,
)
from codegen.sdk.enums import ProgrammingLanguage
from codegen.shared.enums.programming_language import ProgrammingLanguage
from langchain import hub
from langchain.agents import AgentExecutor
from langchain.agents.openai_functions_agent.base import OpenAIFunctionsAgent
Expand Down
2 changes: 1 addition & 1 deletion codegen-examples/examples/modules_dependencies/run.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import codegen
from codegen import Codebase
from codegen.sdk.enums import ProgrammingLanguage
from codegen.shared.enums.programming_language import ProgrammingLanguage
import networkx as nx


Expand Down
2 changes: 1 addition & 1 deletion codegen-examples/examples/openapi_decorators/run.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import codegen
from codegen import Codebase
from codegen.sdk.enums import ProgrammingLanguage
from codegen.shared.enums.programming_language import ProgrammingLanguage


def analyze_model_fields(method) -> dict:
Expand Down
2 changes: 1 addition & 1 deletion codegen-examples/examples/reexport_management/run.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@

from codegen.sdk.typescript.file import TSImport

from codegen.sdk.enums import ProgrammingLanguage
from codegen.shared.enums.programming_language import ProgrammingLanguage

processed_imports = set()

Expand Down
2 changes: 1 addition & 1 deletion codegen-examples/examples/slack_chatbot/api.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
import modal
from codegen import Codebase
from codegen.extensions import VectorIndex
from codegen.sdk.enums import ProgrammingLanguage
from codegen.shared.enums.programming_language import ProgrammingLanguage
from fastapi import FastAPI, Request
from openai import OpenAI
from slack_bolt import App
Expand Down
2 changes: 1 addition & 1 deletion codegen-examples/examples/sqlalchemy_soft_delete/run.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import codegen
from codegen import Codebase
from codegen.sdk.core.detached_symbols.function_call import FunctionCall
from codegen.sdk.enums import ProgrammingLanguage
from codegen.shared.enums.programming_language import ProgrammingLanguage
import shutil
import subprocess
from pathlib import Path
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import codegen
from codegen import Codebase
from codegen.sdk.enums import ProgrammingLanguage
from codegen.shared.enums.programming_language import ProgrammingLanguage
from codegen.sdk.core.detached_symbols.function_call import FunctionCall


Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import codegen
from codegen import Codebase
from codegen.sdk.enums import ProgrammingLanguage
from codegen.shared.enums.programming_language import ProgrammingLanguage
import networkx as nx
from codegen.sdk.python.symbol import PySymbol
from codegen.sdk.python.function import PyFunction
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import codegen
from codegen import Codebase
from codegen.sdk.enums import ProgrammingLanguage
from codegen.shared.enums.programming_language import ProgrammingLanguage
import networkx as nx
from codegen.sdk.core.detached_symbols.function_call import FunctionCall
from codegen.sdk.core.function import Function
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import codegen
from codegen import Codebase
from codegen.sdk.enums import ProgrammingLanguage
from codegen.shared.enums.programming_language import ProgrammingLanguage
import networkx as nx
from codegen.sdk.core.class_definition import Class
from codegen.sdk.core.symbol import Symbol
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import codegen
from codegen import Codebase
from codegen.sdk.enums import ProgrammingLanguage
from codegen.shared.enums.programming_language import ProgrammingLanguage
import networkx as nx
from codegen.sdk.core.detached_symbols.function_call import FunctionCall
from codegen.sdk.core.function import Function
Expand Down
2 changes: 1 addition & 1 deletion docs/conftest.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@

from codegen.sdk.code_generation.current_code_codebase import get_documented_objects
from codegen.sdk.codebase.factory.get_session import get_codebase_session
from codegen.sdk.enums import ProgrammingLanguage
from codegen.shared.enums.programming_language import ProgrammingLanguage
from codegen.sdk.typescript.class_definition import TSClass
from codegen.sdk.typescript.file import TSFile
from codegen.gscli.generate.runner_imports import EXTERNAL_IMPORTS
Expand Down
2 changes: 1 addition & 1 deletion pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -160,7 +160,7 @@ dev-dependencies = [


[tool.uv.workspace]
members = ["codegen", "codegen-examples"]
#members = ["codegen", "codegen-examples"]
exclude = ["codegen-examples"]

[tool.cython-lint]
Expand Down
2 changes: 1 addition & 1 deletion scripts/profiling/apis.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
from tabulate import tabulate

from codegen.sdk.codebase.factory.get_dev_customer_codebase import get_codebase_codegen
from codegen.sdk.enums import ProgrammingLanguage
from codegen.shared.enums.programming_language import ProgrammingLanguage

logging.basicConfig(level=logging.INFO)
codegen = get_codebase_codegen("../codegen", ".")
Expand Down
2 changes: 1 addition & 1 deletion src/codegen/cli/api/client.py
Original file line number Diff line number Diff line change
Expand Up @@ -45,8 +45,8 @@
from codegen.cli.env.global_env import global_env
from codegen.cli.errors import InvalidTokenError, ServerError
from codegen.cli.utils.codemods import Codemod
from codegen.cli.utils.constants import ProgrammingLanguage
from codegen.cli.utils.function_finder import DecoratedFunction
from codegen.shared.enums.programming_language import ProgrammingLanguage

InputT = TypeVar("InputT", bound=BaseModel)
OutputT = TypeVar("OutputT", bound=BaseModel)
Expand Down
2 changes: 1 addition & 1 deletion src/codegen/cli/api/schemas.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,8 @@
from pydantic import BaseModel
from pydantic.fields import Field

from codegen.cli.utils.constants import ProgrammingLanguage
from codegen.cli.utils.schema import SafeBaseModel
from codegen.shared.enums.programming_language import ProgrammingLanguage

T = TypeVar("T")

Expand Down
12 changes: 8 additions & 4 deletions src/codegen/cli/auth/session.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
from codegen.cli.errors import AuthError, NoTokenError
from codegen.cli.git.repo import get_git_repo
from codegen.cli.utils.config import Config, get_config, write_config
from codegen.sdk.enums import ProgrammingLanguage
from codegen.shared.enums.programming_language import ProgrammingLanguage


@dataclass
Expand Down Expand Up @@ -39,15 +39,19 @@ class CodegenSession:
"""Represents an authenticated codegen session with user and repository context"""

# =====[ Instance attributes ]=====
token: str | None = None
_token: str | None = None

# =====[ Lazy instance attributes ]=====
_config: Config | None = None
_identity: Identity | None = None
_profile: UserProfile | None = None

def __init__(self, token: str | None = None):
self.token = token or get_current_token()
@property
def token(self) -> str | None:
"""Get the current authentication token"""
if self._token:
return self._token
return get_current_token()

@property
def config(self) -> Config:
Expand Down
83 changes: 51 additions & 32 deletions src/codegen/cli/commands/init/main.py
Original file line number Diff line number Diff line change
@@ -1,65 +1,84 @@
import os
import subprocess
import sys
from pathlib import Path

import rich
import rich_click as click
from github import BadCredentialsException
from github.MainClass import Github

from codegen.cli.auth.constants import CODEGEN_DIR
from codegen.cli.auth.session import CodegenSession
from codegen.cli.commands.init.render import get_success_message
from codegen.cli.git.url import get_git_organization_and_repo
from codegen.cli.rich.codeblocks import format_command
from codegen.cli.utils.constants import ProgrammingLanguage
from codegen.cli.workspace.initialize_workspace import initialize_codegen
from codegen.git.repo_operator.local_git_repo import LocalGitRepo
from codegen.shared.configs.config import config
from codegen.shared.configs.constants import CONFIG_PATH
from codegen.shared.enums.programming_language import ProgrammingLanguage


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

# Convert language string to enum if provided
programming_language = None
if language:
programming_language = ProgrammingLanguage[language.upper()]
if local_git.origin_remote is None:
rich.print("\n[bold red]Error:[/bold red] No remote found for repository")
rich.print("[white]Please add a remote to the repository.[/white]")
rich.print("\n[dim]To add a remote to the repository:[/dim]")
rich.print(format_command("git remote add origin <your-repo-url>"))
sys.exit(1)

if token is None:
token = config.secrets.github_token
else:
config.secrets.github_token = token

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

# Only update config if we have a session
if session:
if organization_name is not None:
session.config.organization_name = organization_name
if repo_name is not None:
session.config.repo_name = repo_name
if not session.config.organization_name or not session.config.repo_name:
cwd_org, cwd_repo = get_git_organization_and_repo(session.git_repo)
session.config.organization_name = session.config.organization_name or cwd_org
session.config.repo_name = session.config.repo_name or cwd_repo
if programming_language:
session.config.programming_language = programming_language
session.write_config()
# Save repo config
config.repository.repo_path = local_git.repo_path
config.repository.repo_name = local_git.name
config.repository.full_name = local_git.full_name
config.repository.user_name = local_git.user_name
config.repository.user_email = local_git.user_email
config.repository.language = (language or local_git.get_language(access_token=token)).upper()
config.save()

action = "Updating" if is_update else "Initializing"
session = CodegenSession()
action = "Updating" if CONFIG_PATH.exists() else "Initializing"
rich.print("")
codegen_dir, docs_dir, examples_dir = initialize_codegen(action, session=session, fetch_docs=fetch_docs, programming_language=programming_language)
codegen_dir, docs_dir, examples_dir = initialize_codegen(action, session=session, fetch_docs=fetch_docs, programming_language=ProgrammingLanguage(config.repository.language))

# Print success message
rich.print(f"✅ {action} complete\n")
Expand Down
1 change: 1 addition & 0 deletions src/codegen/cli/git/folder.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
from pathlib import Path


# TODO: move to codegen.git module
def get_git_folder(path: os.PathLike | None = None) -> Path | None:
if path is None:
path = Path.cwd()
Expand Down
1 change: 1 addition & 0 deletions src/codegen/cli/git/repo.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
from codegen.cli.git.folder import get_git_folder


# TODO: move to codegen.git module
def get_git_repo(path: os.PathLike | None = None) -> Repository | None:
if path is None:
path = Path.cwd()
Expand Down
6 changes: 3 additions & 3 deletions src/codegen/cli/mcp/resources/system_prompt.py
Original file line number Diff line number Diff line change
Expand Up @@ -1327,7 +1327,7 @@ def baz():

```python
from codegen import Codebase
from codegen.sdk.enums import ProgrammingLanguage
from codegen.shared.enums.programming_language import ProgrammingLanguage

# Parse from a git repository root
codebase = Codebase("path/to/repository")
Expand Down Expand Up @@ -1360,7 +1360,7 @@ def baz():

```python
import codegen
from codegen.sdk.enums import ProgrammingLanguage
from codegen.shared.enums.programming_language import ProgrammingLanguage

# Fetch and parse a repository (defaults to /tmp/codegen/{repo_name})
codebase = codegen.from_repo('fastapi/fastapi')
Expand Down Expand Up @@ -1423,7 +1423,7 @@ def baz():
from codegen.git.repo_operator.local_repo_operator import LocalRepoOperator
from codegen.git.schemas.repo_config import RepoConfig
from codegen.sdk.codebase.config import ProjectConfig
from codegen.sdk.enums import ProgrammingLanguage
from codegen.shared.enums.programming_language import ProgrammingLanguage

codebase = Codebase(
projects = [
Expand Down
2 changes: 1 addition & 1 deletion src/codegen/cli/mcp/server.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
from codegen.cli.api.client import RestAPI
from codegen.cli.mcp.resources.system_prompt import SYSTEM_PROMPT
from codegen.cli.mcp.resources.system_setup_instructions import SETUP_INSTRUCTIONS
from codegen.cli.utils.constants import ProgrammingLanguage
from codegen.shared.enums.programming_language import ProgrammingLanguage

# Initialize FastMCP server

Expand Down
2 changes: 1 addition & 1 deletion src/codegen/cli/workspace/initialize_workspace.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,11 +14,11 @@
from codegen.cli.git.repo import get_git_repo
from codegen.cli.git.url import get_git_organization_and_repo
from codegen.cli.rich.spinners import create_spinner
from codegen.cli.utils.constants import ProgrammingLanguage
from codegen.cli.utils.notebooks import create_notebook
from codegen.cli.workspace.docs_workspace import populate_api_docs
from codegen.cli.workspace.examples_workspace import populate_examples
from codegen.cli.workspace.venv_manager import VenvManager
from codegen.shared.enums.programming_language import ProgrammingLanguage


def initialize_codegen(
Expand Down
2 changes: 1 addition & 1 deletion src/codegen/git/clients/github_client.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ class GithubClient:
base_url: str
_client: Github

def __init__(self, token: str, base_url: str = Consts.DEFAULT_BASE_URL):
def __init__(self, token: str | None = None, base_url: str = Consts.DEFAULT_BASE_URL):
self.base_url = base_url
self._client = Github(token, base_url=base_url)

Expand Down
Loading
Loading