Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
62 commits
Select commit Hold shift + click to select a range
644e880
Merge pull request #156 from morph-data/release/v0.2.0
tslcls Mar 7, 2025
6e8bef2
feat: migrate .morph/frontend → @morph-data/frontend
atsuki44 Mar 7, 2025
aa1d44f
fix dev command in starter package.json
atsuki44 Mar 7, 2025
6ec603c
fix package version
atsuki44 Mar 7, 2025
8ba16a6
fix: root_directory for production
atsuki44 Mar 11, 2025
1096da4
fix: root_directory
atsuki44 Mar 11, 2025
ad108bc
fix: root_directory and entrypoint_filename
atsuki44 Mar 11, 2025
4211b85
Merge pull request #159 from morph-data/release/v0.2.1
oginokairan Mar 12, 2025
deee2d4
enhancement: deploy config to project yml
tslcls Mar 12, 2025
06aba82
fix: remove tailwind import from cdn
atsuki44 Mar 13, 2025
269d1ea
fix: rename project yml parameter
tslcls Mar 13, 2025
2991d0b
fix: project yml initial values
tslcls Mar 13, 2025
ab47cb8
fix: yml init at morph new
tslcls Mar 14, 2025
41cbef1
feat: change initial dockerfile content
nkennek Mar 14, 2025
ab70841
feat: remove Dockerfile/dockerignore generation on morph new
nkennek Mar 14, 2025
4d20a7c
fix: file upload cache path
tslcls Mar 14, 2025
223f795
fix: file upload cache path
tslcls Mar 14, 2025
88494ee
Merge branch 'develop' into fix/file-upload-function
tslcls Mar 17, 2025
725fec6
Merge branch 'develop' into feature/deploy-build-config
tslcls Mar 17, 2025
246cf08
Merge pull request #164 from morph-data/fix/file-upload-function
shibatanaoto Mar 17, 2025
2368e5d
Merge pull request #165 from morph-data/feature/deploy-build-config
shibatanaoto Mar 17, 2025
a7cec4e
Merge pull request #163 from morph-data/feature/v0.3.0-update-morph-i…
shibatanaoto Mar 17, 2025
69e5e53
chore: update starter template to support new frontend architecture
atsuki44 Mar 17, 2025
7b9ace9
Merge branch 'develop' into feature/morph-data-frontend
tslcls Mar 17, 2025
e83122c
fix: file upload cache path
tslcls Mar 17, 2025
908838c
Merge pull request #166 from morph-data/fix/file-upload-function
shibatanaoto Mar 17, 2025
28de247
Merge pull request #162 from morph-data/feature/morph-data-frontend
tslcls Mar 18, 2025
dac8114
chore: update @morph-data/frontend
atsuki44 Mar 19, 2025
0a4a409
Merge pull request #167 from morph-data/feature/morph-data-frontend
tslcls Mar 19, 2025
f8b3643
get dockerfile by calling api
shibatanaoto Mar 20, 2025
5e699bf
update version as v0.3.0rc1
shibatanaoto Mar 21, 2025
e6632e4
Merge pull request #168 from morph-data/chore/issue-version-v0.3.0rc1
tslcls Mar 21, 2025
35d89dd
chore: update index.mdx
atsuki44 Mar 21, 2025
5e4f70b
chore: add dist to .gitignore
atsuki44 Mar 21, 2025
42ad3e8
chore: bundle tsconfig.json
atsuki44 Mar 21, 2025
ba8db6c
chore: move layout components to _components
atsuki44 Mar 21, 2025
838f763
chore: add error fallback
atsuki44 Mar 21, 2025
fa313f8
Merge pull request #169 from morph-data/enhancement/use-custom-docker…
tslcls Mar 21, 2025
0639723
fix: toc style
atsuki44 Mar 21, 2025
81d6b61
chore: remove _morph-data-lib from template
atsuki44 Mar 21, 2025
6a0bba2
fix: enalbe -y to install initial morph components
atsuki44 Mar 21, 2025
d352939
fix: nested heading in toc
atsuki44 Mar 21, 2025
dedac7c
Merge pull request #170 from morph-data/feature/morph-data-frontend
shibatanaoto Mar 21, 2025
b111712
fix initial morph_project.yml
shibatanaoto Mar 21, 2025
a8e639b
Merge pull request #171 from morph-data/enhancement/use-custom-docker…
tslcls Mar 21, 2025
54bdda5
fix initial morph_project.yml
shibatanaoto Mar 21, 2025
959793c
Merge pull request #172 from morph-data/fix/initial-morph-project-yml
tslcls Mar 21, 2025
86622ec
change dockerfile api call
shibatanaoto Mar 21, 2025
b40590b
Merge pull request #173 from morph-data/fix/dockerfile-api
tslcls Mar 21, 2025
f446d23
fix: 404.mdx → 404.tsx
atsuki44 Mar 21, 2025
c3a49fe
issue v0.3.0rc2
shibatanaoto Mar 21, 2025
9ff4cac
Merge pull request #174 from morph-data/chore/update-version-v0.3.0rc2
tslcls Mar 21, 2025
40aa4ab
Merge pull request #175 from morph-data/feature/morph-data-frontend
shibatanaoto Mar 21, 2025
79746ed
Merge pull request #176 from morph-data/develop
atsuki44 Mar 21, 2025
dd7f183
change logic for checking use_custom_dockerfile
shibatanaoto Mar 22, 2025
b508198
change initial morph_project.yml
shibatanaoto Mar 22, 2025
0552e28
fix version value as string
shibatanaoto Mar 22, 2025
d0626bd
Merge pull request #177 from morph-data/fix/change-use-custom-dockerfile
KT83 Mar 22, 2025
521044b
update version as v0.3.0rc3
shibatanaoto Mar 23, 2025
7e5896e
Merge pull request #178 from morph-data/chore/update-v0.3.0rc3
KT83 Mar 23, 2025
52e1ceb
update version as v0.3.0
shibatanaoto Mar 24, 2025
5a3000b
Merge pull request #179 from morph-data/chore/update-version-v0.3.0
tslcls Mar 24, 2025
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
19 changes: 9 additions & 10 deletions core/morph/api/app.py
Original file line number Diff line number Diff line change
Expand Up @@ -21,9 +21,6 @@
inertia_request_validation_exception_handler,
inertia_version_conflict_exception_handler,
)
from starlette.middleware.cors import CORSMiddleware
from starlette.middleware.sessions import SessionMiddleware

from morph.api.error import ApiBaseError, InternalError, render_error_html
from morph.api.handler import router
from morph.api.plugin import plugin_app
Expand All @@ -32,6 +29,8 @@
MorphFunctionMetaObjectCacheManager,
MorphGlobalContext,
)
from starlette.middleware.cors import CORSMiddleware
from starlette.middleware.sessions import SessionMiddleware

# configuration values

Expand All @@ -42,10 +41,11 @@
# set true to MORPH_LOCAL_DEV_MODE to use local frontend server
is_local_dev_mode = True if os.getenv("MORPH_LOCAL_DEV_MODE") == "true" else False

project_root = find_project_root_dir()


def custom_compile_logic():
logger.info("Compiling python and sql files...")
project_root = find_project_root_dir()
context = MorphGlobalContext.get_instance()
errors = context.load(project_root)
if len(errors) > 0:
Expand Down Expand Up @@ -129,8 +129,6 @@ async def lifespan(app: FastAPI) -> AsyncGenerator[None, None]:
inertia_request_validation_exception_handler,
)

frontend_dir = os.path.join(os.getcwd(), ".morph", "frontend")


def get_inertia_config():
templates_dir = os.path.join(Path(__file__).resolve().parent, "templates")
Expand All @@ -148,15 +146,16 @@ def get_inertia_config():
use_flash_messages=True,
use_flash_errors=True,
entrypoint_filename="main.tsx",
assets_prefix="/src",
root_directory=".morph/frontend",
dev_url=frontend_url,
)

return InertiaConfig(
templates=Jinja2Templates(directory=templates_dir),
manifest_json_path=os.path.join(frontend_dir, "dist", "manifest.json"),
manifest_json_path=os.path.join(project_root, "dist", "manifest.json"),
environment="production",
entrypoint_filename="main.tsx",
root_directory=".morph/frontend",
)


Expand All @@ -167,13 +166,13 @@ def get_inertia_config():
if is_local_dev_mode:
app.mount(
"/src",
StaticFiles(directory=os.path.join(frontend_dir, "src")),
StaticFiles(directory=os.path.join(project_root, "src")),
name="src",
)
else:
app.mount(
"/assets",
StaticFiles(directory=os.path.join(frontend_dir, "dist", "assets")),
StaticFiles(directory=os.path.join(project_root, "dist", "assets")),
name="assets",
)

Expand Down
10 changes: 8 additions & 2 deletions core/morph/api/cloud/client.py
Original file line number Diff line number Diff line change
Expand Up @@ -132,14 +132,20 @@ def verify_api_secret(self) -> MorphClientResponse:

@validate_project_id
def initiate_deployment(
self, project_id: str, image_build_log: str, image_checksum: str
self,
project_id: str,
image_build_log: str,
image_checksum: str,
config: Optional[dict[str, Any]] = None,
) -> MorphClientResponse:
path = "deployment"
body = {
body: dict[str, Any] = {
"projectId": project_id,
"imageBuildLog": image_build_log,
"imageChecksum": image_checksum,
}
if config:
body["config"] = config

return self.request(method="POST", path=path, data=body)

Expand Down
11 changes: 5 additions & 6 deletions core/morph/api/service.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,6 @@
import time
import uuid
from contextlib import redirect_stdout
from pathlib import Path
from typing import Any

import click
Expand Down Expand Up @@ -284,11 +283,11 @@ async def file_upload_service(input: UploadFileService) -> Any:
)

# Read the saved file path from the cache (always created as following path)
cache_file = Path(find_project_root_dir()).joinpath(
".morph/cache/file_upload.md"
)
with open(cache_file, "r") as f:
saved_filepath = f.read()
saved_filepath = ""
cache_file = "/tmp/file_upload.cache"
if os.path.exists(cache_file):
with open(cache_file, "r") as f:
saved_filepath = f.read()

# Remove the temporary directory
if os.path.exists(temp_dir):
Expand Down
7 changes: 0 additions & 7 deletions core/morph/api/templates/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -16,13 +16,6 @@
window.__vite_plugin_react_preamble_installed__ = true;
</script>
{% endif %}

<script src="https://cdn.tailwindcss.com"></script>
<script>
tailwind.config = {
darkMode: "class",
};
</script>
</head>
<body>
{% inertia_body %}
Expand Down
128 changes: 125 additions & 3 deletions core/morph/config/project.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import os
from typing import List, Optional
from typing import Dict, List, Optional

import yaml
from pydantic import BaseModel, Field
Expand All @@ -13,6 +13,20 @@
from morph.task.utils.morph import find_project_root_dir


class BuildConfig(BaseModel):
runtime: Optional[str] = None
framework: Optional[str] = "morph"
package_manager: Optional[str] = None
context: Optional[str] = None
build_args: Optional[Dict[str, str]] = None


class DeploymentConfig(BaseModel):
provider: Optional[str] = "aws"
aws: Optional[Dict[str, Optional[str]]] = None
gcp: Optional[Dict[str, Optional[str]]] = None


class MorphProject(BaseModel):
profile: Optional[str] = "default"
source_paths: List[str] = Field(default_factory=lambda: ["src"])
Expand All @@ -21,6 +35,8 @@ class MorphProject(BaseModel):
package_manager: str = Field(
default="pip", description="Package manager to use, e.g., pip or poetry."
)
build: Optional[BuildConfig] = Field(default_factory=BuildConfig)
deployment: Optional[DeploymentConfig] = Field(default_factory=DeploymentConfig)

class Config:
arbitrary_types_allowed = True
Expand Down Expand Up @@ -72,9 +88,115 @@ def save_project(project_root: str, project: MorphProject) -> None:
old_config_path = os.path.join(project_root, "morph_project.yaml")
if os.path.exists(old_config_path):
with open(old_config_path, "w") as f:
yaml.safe_dump(project.model_dump(), f)
f.write(dump_project_yaml(project))
return

config_path = os.path.join(project_root, "morph_project.yml")
with open(config_path, "w") as f:
yaml.safe_dump(project.model_dump(), f)
f.write(dump_project_yaml(project))


def dump_project_yaml(project: MorphProject) -> str:
source_paths = "\n- ".join([""] + project.source_paths)

# Default values
build_runtime = ""
build_framework = ""
build_package_manager = ""
build_context = "."
build_args_str = "\n # - ARG_NAME=value\n # - ANOTHER_ARG=value"
deployment_provider = "aws"
deployment_aws_region = "us-east-1"
deployment_aws_memory = "1024"
deployment_aws_timeout = "300"
deployment_aws_concurrency = "1"
deployment_gcp_region = "us-central1"
deployment_gcp_memory = "1Gi"
deployment_gcp_cpu = "1"
deployment_gcp_concurrency = "80"
deployment_gcp_timeout = "300"

# Set values if build exists
if project.build:
if project.build.runtime:
build_runtime = project.build.runtime or ""
if project.build.framework:
build_framework = project.build.framework or ""
if project.build.package_manager:
build_package_manager = project.build.package_manager or ""
if project.build.context:
build_context = f"{project.build.context}" or "."
if project.build.build_args:
build_args_items = []
for key, value in project.build.build_args.items():
build_args_items.append(f"{key}={value}")
build_args_str = (
"\n # - ".join([""] + build_args_items)
if build_args_items
else "\n # - ARG_NAME=value\n # - ANOTHER_ARG=value"
)

# Set values if deployment exists
if project.deployment:
if project.deployment.provider:
deployment_provider = project.deployment.provider or "aws"
if project.deployment.aws:
deployment_aws_region = project.deployment.aws.get("region") or "us-east-1"
deployment_aws_memory = project.deployment.aws.get("memory") or "1024"
deployment_aws_timeout = project.deployment.aws.get("timeout") or "300"
deployment_aws_concurrency = (
project.deployment.aws.get("concurrency") or "1"
)
if project.deployment.gcp:
deployment_gcp_region = (
project.deployment.gcp.get("region") or "us-central1"
)
deployment_gcp_memory = project.deployment.gcp.get("memory") or "1Gi"
deployment_gcp_cpu = project.deployment.gcp.get("cpu") or "1"
deployment_gcp_concurrency = (
project.deployment.gcp.get("concurrency") or "80"
)
deployment_gcp_timeout = project.deployment.gcp.get("timeout") or "300"
else:
# Use default DeploymentConfig
deployment_provider = "aws"

return f"""
version: '1'

# Framework Settings
default_connection: {project.default_connection}
source_paths:{source_paths}

# Cloud Settings
# profile: {project.profile} # Defined in the Profile Section in `~/.morph/credentials`
# project_id: {project.project_id or "null"}

# Build Settings
build:
# These settings are required when there is no Dockerfile in the project root.
# They define the environment in which the project will be built
runtime: {build_runtime} # python3.9, python3.10, python3.11, python3.12
framework: {build_framework}
package_manager: {build_package_manager} # pip, poetry, uv
# These settings are required when there is a Dockerfile in the project root.
# They define how the Docker image will be built
# context: {build_context}
# build_args:{build_args_str}

# Deployment Settings
deployment:
provider: {deployment_provider} # aws or gcp (default is aws)
# These settings are used only when you want to customize the deployment settings
# aws:
# region: {deployment_aws_region}
# memory: {deployment_aws_memory}
# timeout: {deployment_aws_timeout}
# concurrency: {deployment_aws_concurrency}
# gcp:
# region: {deployment_gcp_region}
# memory: {deployment_gcp_memory}
# cpu: {deployment_gcp_cpu}
# concurrency: {deployment_gcp_concurrency}
# timeout: {deployment_gcp_timeout}
"""
18 changes: 0 additions & 18 deletions core/morph/frontend/template/.eslintrc.cjs

This file was deleted.

32 changes: 0 additions & 32 deletions core/morph/frontend/template/.gitignore

This file was deleted.

12 changes: 0 additions & 12 deletions core/morph/frontend/template/index.html

This file was deleted.

41 changes: 0 additions & 41 deletions core/morph/frontend/template/package.json

This file was deleted.

Loading