Skip to content
Draft
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
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions cognite_toolkit/_cdf_tk/apps/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
from ._core_app import CoreApp
from ._data_app import DataApp
from ._dev_app import DevApp
from ._dev_function_app import DevFunctionApp
from ._download_app import DownloadApp
from ._dump_app import DumpApp
from ._import_app import ImportApp
Expand All @@ -20,6 +21,7 @@
"CoreApp",
"DataApp",
"DevApp",
"DevFunctionApp",
"DownloadApp",
"DumpApp",
"ImportApp",
Expand Down
2 changes: 2 additions & 0 deletions cognite_toolkit/_cdf_tk/apps/_dev_app.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
from cognite_toolkit._cdf_tk.feature_flags import FeatureFlag, Flags
from cognite_toolkit._cdf_tk.utils.auth import EnvironmentVariables

from ._dev_function_app import DevFunctionApp
from ._run import RunApp

CDF_TOML = CDFToml.load(Path.cwd())
Expand All @@ -21,6 +22,7 @@ def __init__(self, *args: Any, **kwargs: Any) -> None:
super().__init__(*args, **kwargs)
self.callback(invoke_without_command=True)(self.main)
self.add_typer(RunApp(*args, **kwargs), name="run")
self.add_typer(DevFunctionApp(*args, **kwargs), name="function")
if FeatureFlag.is_enabled(Flags.CREATE):
self.command("create")(self.create)

Expand Down
45 changes: 45 additions & 0 deletions cognite_toolkit/_cdf_tk/apps/_dev_function_app.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
from pathlib import Path
from typing import Annotated, Any

import typer
from rich import print

from cognite_toolkit._cdf_tk.commands import ServeFunctionCommand


class DevFunctionApp(typer.Typer):
def __init__(self, *args: Any, **kwargs: Any) -> None:
super().__init__(*args, **kwargs)
self.callback(invoke_without_command=True)(self.main)
self.command("serve")(self.serve)

@staticmethod
def main(ctx: typer.Context) -> None:
"""Commands for function app development."""
if ctx.invoked_subcommand is None:
print("Use [bold yellow]cdf dev function --help[/] for more information.")

@staticmethod
def serve(
path: Annotated[
Path | None,
typer.Argument(help="Path to the directory containing handler.py. If omitted, discovers and prompts."),
] = None,
host: Annotated[str, typer.Option("--host", help="Host to bind to")] = "127.0.0.1",
port: Annotated[int, typer.Option("--port", help="Port to bind to")] = 8000,
reload: Annotated[bool, typer.Option("--reload/--no-reload", help="Enable auto-reload on code changes")] = True,
log_level: Annotated[
str,
typer.Option("--log-level", help="Log level for the server"),
] = "info",
) -> None:
"""Start a local development server for testing a function app handler.

Loads your handler.py and starts a uvicorn dev server with Swagger UI.

Example:
cdf dev function serve my_function/
cdf dev function serve . --port 3000 --no-reload
"""
cmd = ServeFunctionCommand(client=None, skip_tracking=True)
cmd.run(lambda: cmd.serve(path, host, port, reload, log_level))
2 changes: 2 additions & 0 deletions cognite_toolkit/_cdf_tk/commands/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@
from .repo import RepoCommand
from .resources import ResourcesCommand
from .run import RunFunctionCommand, RunTransformationCommand, RunWorkflowCommand
from .serve import ServeFunctionCommand

__all__ = [
"AboutCommand",
Expand Down Expand Up @@ -48,5 +49,6 @@
"RunFunctionCommand",
"RunTransformationCommand",
"RunWorkflowCommand",
"ServeFunctionCommand",
"UploadCommand",
]
Loading
Loading