Skip to content

Fix tests #3

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
May 25, 2025
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
Jump to file
Failed to load files.
Loading
Diff view
Diff view
166 changes: 166 additions & 0 deletions src/nodetool/dsl/lib/image.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,166 @@
from pydantic import BaseModel, Field
import typing
from typing import Any
import nodetool.metadata.types
import nodetool.metadata.types as types
from nodetool.dsl.graph import GraphNode


class BatchToList(GraphNode):
"""Convert a batch image into a list of images."""

batch: types.ImageRef | GraphNode | tuple[GraphNode, str] = Field(
default=types.ImageRef(type="image", uri="", asset_id=None, data=None),
description="Batch of images",
)

@classmethod
def get_node_type(cls):
return "lib.image.BatchToList"


class Crop(GraphNode):
"""Crop an image region."""

image: types.ImageRef | GraphNode | tuple[GraphNode, str] = Field(
default=types.ImageRef(type="image", uri="", asset_id=None, data=None),
description="Image to crop",
)
left: int | GraphNode | tuple[GraphNode, str] = Field(default=0, description="Left")
top: int | GraphNode | tuple[GraphNode, str] = Field(default=0, description="Top")
right: int | GraphNode | tuple[GraphNode, str] = Field(
default=1, description="Right"
)
bottom: int | GraphNode | tuple[GraphNode, str] = Field(
default=1, description="Bottom"
)

@classmethod
def get_node_type(cls):
return "lib.image.Crop"


class Fit(GraphNode):
"""Resize and crop an image to fit the given size."""

image: types.ImageRef | GraphNode | tuple[GraphNode, str] = Field(
default=types.ImageRef(type="image", uri="", asset_id=None, data=None),
description="Image to fit",
)
width: int | GraphNode | tuple[GraphNode, str] = Field(
default=512, description="Target width"
)
height: int | GraphNode | tuple[GraphNode, str] = Field(
default=512, description="Target height"
)

@classmethod
def get_node_type(cls):
return "lib.image.Fit"


class GetMetadata(GraphNode):
"""Return basic image metadata."""

image: types.ImageRef | GraphNode | tuple[GraphNode, str] = Field(
default=types.ImageRef(type="image", uri="", asset_id=None, data=None),
description="Image to inspect.",
)

@classmethod
def get_node_type(cls):
return "lib.image.GetMetadata"


class ImageOutput(GraphNode):
"""Workflow output for images."""

value: types.ImageRef | GraphNode | tuple[GraphNode, str] = Field(
default=types.ImageRef(type="image", uri="", asset_id=None, data=None),
description="Image value",
)
name: str | GraphNode | tuple[GraphNode, str] = Field(
default="", description="The parameter name for the workflow."
)

@classmethod
def get_node_type(cls):
return "lib.image.ImageOutput"


class Paste(GraphNode):
"""Paste one image onto another."""

image: types.ImageRef | GraphNode | tuple[GraphNode, str] = Field(
default=types.ImageRef(type="image", uri="", asset_id=None, data=None),
description="Base image",
)
paste: types.ImageRef | GraphNode | tuple[GraphNode, str] = Field(
default=types.ImageRef(type="image", uri="", asset_id=None, data=None),
description="Image to paste",
)
left: int | GraphNode | tuple[GraphNode, str] = Field(
default=0, description="Left position"
)
top: int | GraphNode | tuple[GraphNode, str] = Field(
default=0, description="Top position"
)

@classmethod
def get_node_type(cls):
return "lib.image.Paste"


class Resize(GraphNode):
"""Resize an image to specific dimensions."""

image: types.ImageRef | GraphNode | tuple[GraphNode, str] = Field(
default=types.ImageRef(type="image", uri="", asset_id=None, data=None),
description="Image to resize",
)
width: int | GraphNode | tuple[GraphNode, str] = Field(
default=512, description="Width"
)
height: int | GraphNode | tuple[GraphNode, str] = Field(
default=512, description="Height"
)

@classmethod
def get_node_type(cls):
return "lib.image.Resize"


class SaveImage(GraphNode):
"""Save an image reference."""

image: types.ImageRef | GraphNode | tuple[GraphNode, str] = Field(
default=types.ImageRef(type="image", uri="", asset_id=None, data=None),
description="Image to save.",
)
folder: types.FolderRef | GraphNode | tuple[GraphNode, str] = Field(
default=types.FolderRef(type="folder", uri="", asset_id=None, data=None),
description="Target folder.",
)
name: str | GraphNode | tuple[GraphNode, str] = Field(
default="image.png", description="File name"
)

@classmethod
def get_node_type(cls):
return "lib.image.SaveImage"


class Scale(GraphNode):
"""Scale an image by a factor."""

image: types.ImageRef | GraphNode | tuple[GraphNode, str] = Field(
default=types.ImageRef(type="image", uri="", asset_id=None, data=None),
description="Image to scale",
)
scale: float | GraphNode | tuple[GraphNode, str] = Field(
default=1.0, description="Scale factor"
)

@classmethod
def get_node_type(cls):
return "lib.image.Scale"
150 changes: 150 additions & 0 deletions src/nodetool/dsl/nodetool/image.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,150 @@
from pydantic import BaseModel, Field
import typing
from typing import Any
import nodetool.metadata.types
import nodetool.metadata.types as types
from nodetool.dsl.graph import GraphNode


class BatchToList(GraphNode):
"""Convert a batch image into a list of images."""

batch: types.ImageRef | GraphNode | tuple[GraphNode, str] = Field(
default=types.ImageRef(type="image", uri="", asset_id=None, data=None),
description="Batch of images",
)

@classmethod
def get_node_type(cls):
return "lib.image.BatchToList"


class Crop(GraphNode):
"""Crop an image region."""

image: types.ImageRef | GraphNode | tuple[GraphNode, str] = Field(
default=types.ImageRef(type="image", uri="", asset_id=None, data=None),
description="Image to crop",
)
left: int | GraphNode | tuple[GraphNode, str] = Field(default=0, description="Left")
top: int | GraphNode | tuple[GraphNode, str] = Field(default=0, description="Top")
right: int | GraphNode | tuple[GraphNode, str] = Field(
default=1, description="Right"
)
bottom: int | GraphNode | tuple[GraphNode, str] = Field(
default=1, description="Bottom"
)

@classmethod
def get_node_type(cls):
return "lib.image.Crop"


class Fit(GraphNode):
"""Resize and crop an image to fit the given size."""

image: types.ImageRef | GraphNode | tuple[GraphNode, str] = Field(
default=types.ImageRef(type="image", uri="", asset_id=None, data=None),
description="Image to fit",
)
width: int | GraphNode | tuple[GraphNode, str] = Field(
default=512, description="Target width"
)
height: int | GraphNode | tuple[GraphNode, str] = Field(
default=512, description="Target height"
)

@classmethod
def get_node_type(cls):
return "lib.image.Fit"


class GetMetadata(GraphNode):
"""Return basic image metadata."""

image: types.ImageRef | GraphNode | tuple[GraphNode, str] = Field(
default=types.ImageRef(type="image", uri="", asset_id=None, data=None),
description="Image to inspect.",
)

@classmethod
def get_node_type(cls):
return "lib.image.GetMetadata"


class Paste(GraphNode):
"""Paste one image onto another."""

image: types.ImageRef | GraphNode | tuple[GraphNode, str] = Field(
default=types.ImageRef(type="image", uri="", asset_id=None, data=None),
description="Base image",
)
paste: types.ImageRef | GraphNode | tuple[GraphNode, str] = Field(
default=types.ImageRef(type="image", uri="", asset_id=None, data=None),
description="Image to paste",
)
left: int | GraphNode | tuple[GraphNode, str] = Field(
default=0, description="Left position"
)
top: int | GraphNode | tuple[GraphNode, str] = Field(
default=0, description="Top position"
)

@classmethod
def get_node_type(cls):
return "lib.image.Paste"


class Resize(GraphNode):
"""Resize an image to specific dimensions."""

image: types.ImageRef | GraphNode | tuple[GraphNode, str] = Field(
default=types.ImageRef(type="image", uri="", asset_id=None, data=None),
description="Image to resize",
)
width: int | GraphNode | tuple[GraphNode, str] = Field(
default=512, description="Width"
)
height: int | GraphNode | tuple[GraphNode, str] = Field(
default=512, description="Height"
)

@classmethod
def get_node_type(cls):
return "lib.image.Resize"


class SaveImage(GraphNode):
"""Save an image reference."""

image: types.ImageRef | GraphNode | tuple[GraphNode, str] = Field(
default=types.ImageRef(type="image", uri="", asset_id=None, data=None),
description="Image to save.",
)
folder: types.FolderRef | GraphNode | tuple[GraphNode, str] = Field(
default=types.FolderRef(type="folder", uri="", asset_id=None, data=None),
description="Target folder.",
)
name: str | GraphNode | tuple[GraphNode, str] = Field(
default="image.png", description="File name"
)

@classmethod
def get_node_type(cls):
return "lib.image.SaveImage"


class Scale(GraphNode):
"""Scale an image by a factor."""

image: types.ImageRef | GraphNode | tuple[GraphNode, str] = Field(
default=types.ImageRef(type="image", uri="", asset_id=None, data=None),
description="Image to scale",
)
scale: float | GraphNode | tuple[GraphNode, str] = Field(
default=1.0, description="Scale factor"
)

@classmethod
def get_node_type(cls):
return "lib.image.Scale"
22 changes: 22 additions & 0 deletions src/nodetool/dsl/nodetool/output.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
from pydantic import BaseModel, Field
import typing
from typing import Any
import nodetool.metadata.types
import nodetool.metadata.types as types
from nodetool.dsl.graph import GraphNode


class ImageOutput(GraphNode):
"""Workflow output for images."""

value: types.ImageRef | GraphNode | tuple[GraphNode, str] = Field(
default=types.ImageRef(type="image", uri="", asset_id=None, data=None),
description="Image value",
)
name: str | GraphNode | tuple[GraphNode, str] = Field(
default="", description="The parameter name for the workflow."
)

@classmethod
def get_node_type(cls):
return "lib.image.ImageOutput"
Loading