Skip to content

Commit

Permalink
Create model for multiple Anitya versions
Browse files Browse the repository at this point in the history
Fixes #2440
  • Loading branch information
lbarcziova committed Sep 13, 2024
1 parent 8415870 commit 8b703ca
Show file tree
Hide file tree
Showing 3 changed files with 138 additions and 10 deletions.
49 changes: 49 additions & 0 deletions alembic/versions/002ab85fa213_add_anityamultipleversionsmodel.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
"""Add AnityaMultipleVersionsModel
Revision ID: 002ab85fa213
Revises: fd785af95c19
Create Date: 2024-09-11 08:25:51.759649
"""

from alembic import op
import sqlalchemy as sa


# revision identifiers, used by Alembic.
revision = "002ab85fa213"
down_revision = "fd785af95c19"
branch_labels = None
depends_on = None


def upgrade():
# ### commands auto generated by Alembic - please adjust! ###
op.create_table(
"anitya_multiple_versions",
sa.Column("id", sa.Integer(), nullable=False),
sa.Column("versions", sa.ARRAY(sa.String()), nullable=False),
sa.Column("project_id", sa.Integer(), nullable=True),
sa.ForeignKeyConstraint(
["project_id"],
["anitya_projects.id"],
),
sa.PrimaryKeyConstraint("id"),
)
op.create_index(
op.f("ix_anitya_multiple_versions_project_id"),
"anitya_multiple_versions",
["project_id"],
unique=False,
)
# ### end Alembic commands ###


def downgrade():
# ### commands auto generated by Alembic - please adjust! ###
op.drop_index(
op.f("ix_anitya_multiple_versions_project_id"),
table_name="anitya_multiple_versions",
)
op.drop_table("anitya_multiple_versions")
# ### end Alembic commands ###
72 changes: 72 additions & 0 deletions packit_service/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -279,6 +279,7 @@ class ProjectEventModelType(str, enum.Enum):
issue = "issue"
koji_build_tag = "koji_build_tag"
anitya_version = "anitya_version"
anitya_multiple_versions = "anitya_multiple_versions"


class BuildsAndTestsConnector:
Expand Down Expand Up @@ -466,6 +467,9 @@ class AnityaProjectModel(Base):
project_name = Column(String)
package = Column(String)
versions = relationship("AnityaVersionModel", back_populates="project")
multiple_versions = relationship(
"AnityaMultipleVersionsModel", back_populates="project"
)

@classmethod
def get_by_id(cls, id_: int) -> Optional["AnityaProjectModel"]:
Expand Down Expand Up @@ -493,6 +497,53 @@ def get_or_create(
return project


class AnityaMultipleVersionsModel(BuildsAndTestsConnector, Base):
__tablename__ = "anitya_multiple_versions"
id = Column(Integer, primary_key=True) # our database PK
versions = Column(ARRAY(String), nullable=False)
project_id = Column(Integer, ForeignKey("anitya_projects.id"), index=True)
project = relationship("AnityaProjectModel", back_populates="multiple_versions")

job_config_trigger_type = JobConfigTriggerType.release
project_event_model_type = ProjectEventModelType.anitya_multiple_versions

@classmethod
def get_or_create(
cls,
versions: list[str],
project_id: int,
project_name: str,
package: str,
) -> "AnityaMultipleVersionsModel":
with sa_session_transaction(commit=True) as session:
project = AnityaProjectModel.get_or_create(
project_id=project_id, project_name=project_name, package=package
)
project_version = (
session.query(AnityaMultipleVersionsModel)
.filter_by(versions=versions, project_id=project.id)
.first()
)
if not project_version:
project_version = AnityaMultipleVersionsModel()
project_version.versions = versions
project_version.project = project
session.add(project_version)
return project_version

@classmethod
def get_by_id(cls, id_: int) -> Optional["AnityaMultipleVersionsModel"]:
with sa_session_transaction() as session:
return session.query(AnityaVersionModel).filter_by(id=id_).first()

def __repr__(self):
return (
f"AnityaMultipleVersionsModel("
f"versions={self.versions}, "
f"project={self.project})"
)


class AnityaVersionModel(BuildsAndTestsConnector, Base):
__tablename__ = "anitya_versions"
id = Column(Integer, primary_key=True) # our database PK
Expand Down Expand Up @@ -1536,6 +1587,27 @@ def add_anitya_version_event(
)
return (project_version, event)

@classmethod
def add_anitya_multiple_versions_event(
cls,
versions: list[str],
project_name: str,
project_id: int,
package: str,
) -> Tuple[AnityaMultipleVersionsModel, "ProjectEventModel"]:
project_version = AnityaMultipleVersionsModel.get_or_create(
versions=versions,
project_name=project_name,
project_id=project_id,
package=package,
)
event = ProjectEventModel.get_or_create(
type=project_version.project_event_model_type,
event_id=project_version.id,
commit_sha=None,
)
return (project_version, event)

@classmethod
def add_issue_event(
cls,
Expand Down
27 changes: 17 additions & 10 deletions packit_service/worker/events/new_hotness.py
Original file line number Diff line number Diff line change
Expand Up @@ -215,13 +215,20 @@ def __init__(
self._versions = versions

@property
def version(self) -> str:
# TODO: Handle here or further down the chain? we should be able to get
# the package config from dist-git and resolve the next version; how are
# we going to choose the version?
# a) latest greatest
# b) next unreleased?
# this can be also influenced by the mask…
#
# It would be ideal to handle here because of the serialization…
raise NotImplementedError()
def version(self) -> Optional[str]:
# we will decide the version just when syncing release
# (for the particular branch etc.),
# until that we work with all the new versions
return None

def _add_release_and_event(self):
if not self._db_project_object or not self._db_project_event:
(
self._db_project_object,
self._db_project_event,
) = ProjectEventModel.add_anitya_multiple_versions_event(
versions=self._versions,
project_name=self.anitya_project_name,
project_id=self.anitya_project_id,
package=self.package_name,
)

0 comments on commit 8b703ca

Please sign in to comment.