Skip to content
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

Create model for multiple Anitya versions #2524

Merged
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
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
lbarcziova marked this conversation as resolved.
Show resolved Hide resolved

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,
)
Loading