Skip to content

refactor: repository pattern #3286

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

Draft
wants to merge 3 commits into
base: main
Choose a base branch
from
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
31 changes: 31 additions & 0 deletions src/backend/base/langflow/services/database/models/repo.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
from abc import ABC, abstractmethod
from typing import Generic, TypeVar, List, Optional
from sqlmodel import SQLModel, Session


T = TypeVar("T", bound=SQLModel)


class AbstractRepository(ABC, Generic[T]):
def __init__(self, session: Session):
self.session = session

@abstractmethod
def add(self, entity: T) -> T:
pass

@abstractmethod
def get(self, id: int) -> Optional[T]:
pass

@abstractmethod
def list(self) -> List[T]:
pass

@abstractmethod
def update(self, entity: T) -> T:
pass

@abstractmethod
def delete(self, id: int) -> None:
pass
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
from typing import List, Optional
from sqlmodel import select
from langflow.services.database.models.variable import Variable
from langflow.services.database.models.repo import AbstractRepository


class VariableRepository(AbstractRepository):
def add(self, entity: Variable) -> Variable:
self.session.add(entity)
self.session.commit()
self.session.refresh(entity)
return entity

def get(self, id: int) -> Optional[Variable]:
return self.session.get(Variable, id)

def list(self) -> List[Variable]:
query = select(Variable)
return list(self.session.exec(query).all())

def update(self, entity: Variable) -> Variable:
self.session.add(entity)
self.session.commit()
self.session.refresh(entity)
return entity

def delete(self, id: int) -> None:
entity = self.get(id)
if entity:
self.session.delete(entity)
self.session.commit()
107 changes: 107 additions & 0 deletions src/backend/tests/unit/services/database/models/variable/test_repo.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,107 @@
import pytest
from uuid import uuid4

from sqlmodel import SQLModel, Session, create_engine

from langflow.services.database.models.variable.model import Variable
from langflow.services.database.models.variable.repo import VariableRepository


@pytest.fixture
def client():
pass


@pytest.fixture
def repo():
engine = create_engine("sqlite:///:memory:")
SQLModel.metadata.create_all(engine)
with Session(engine) as session:
return VariableRepository(session)


def test_add(repo):
user_id = uuid4()
name = "test"
value = "test"
_type = "test"
default_fields = ["test"]
variable = Variable(user_id=user_id, name=name, value=value, type=_type, default_fields=["test"])

result = repo.add(variable)

assert result.id is not None
assert result.user_id == user_id
assert result.name == name
assert result.value == value
assert result.type == _type
assert result.default_fields == default_fields


def test_get(repo):
user_id = uuid4()
name = "test"
value = "test"
_type = "test"
default_fields = ["test"]

Check failure on line 46 in src/backend/tests/unit/services/database/models/variable/test_repo.py

View workflow job for this annotation

GitHub Actions / Ruff Style Check (3.12)

Ruff (F841)

src/backend/tests/unit/services/database/models/variable/test_repo.py:46:5: F841 Local variable `default_fields` is assigned to but never used
variable = Variable(user_id=user_id, name=name, value=value, type=_type, default_fields=["test"])
saved = repo.add(variable)

result = repo.get(saved.id)

assert result == saved


def test_list(repo):
user_id = uuid4()
name = "test"
value = "test"

Check failure on line 58 in src/backend/tests/unit/services/database/models/variable/test_repo.py

View workflow job for this annotation

GitHub Actions / Ruff Style Check (3.12)

Ruff (F841)

src/backend/tests/unit/services/database/models/variable/test_repo.py:58:5: F841 Local variable `value` is assigned to but never used
_type = "test"
default_fields = ["test"]

Check failure on line 60 in src/backend/tests/unit/services/database/models/variable/test_repo.py

View workflow job for this annotation

GitHub Actions / Ruff Style Check (3.12)

Ruff (F841)

src/backend/tests/unit/services/database/models/variable/test_repo.py:60:5: F841 Local variable `default_fields` is assigned to but never used
quantity = 10
for index, i in enumerate(range(quantity)):
variable = Variable(user_id=user_id, name=name, value=f"value_{index}", type=_type, default_fields=["test"])
repo.add(variable)

result = repo.list()

assert len(result) == quantity


def test_update(repo):
user_id = uuid4()
name = "test"
value = "test"
_type = "test"
default_fields = ["test"]

Check failure on line 76 in src/backend/tests/unit/services/database/models/variable/test_repo.py

View workflow job for this annotation

GitHub Actions / Ruff Style Check (3.12)

Ruff (F841)

src/backend/tests/unit/services/database/models/variable/test_repo.py:76:5: F841 Local variable `default_fields` is assigned to but never used
variable = Variable(user_id=user_id, name=name, value=value, type=_type, default_fields=["test"])
saved = repo.add(variable)
saved.name = "test_updated"
saved.value = "test_updated"
saved.type = "test_updated"
saved.default_fields = ["test_updated"]

repo.update(saved)
result = repo.get(saved.id)

assert result.id == saved.id
assert result.user_id == saved.user_id
assert result.name == saved.name
assert result.value == saved.value
assert result.type == saved.type
assert result.default_fields == saved.default_fields


def test_delete(repo):
user_id = uuid4()
name = "test"
value = "test"
_type = "test"
default_fields = ["test"]

Check failure on line 100 in src/backend/tests/unit/services/database/models/variable/test_repo.py

View workflow job for this annotation

GitHub Actions / Ruff Style Check (3.12)

Ruff (F841)

src/backend/tests/unit/services/database/models/variable/test_repo.py:100:5: F841 Local variable `default_fields` is assigned to but never used
variable = Variable(user_id=user_id, name=name, value=value, type=_type, default_fields=["test"])
saved = repo.add(variable)

repo.delete(saved.id)
result = repo.get(saved.id)

assert result is None
Loading