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

versions: add support for version checks via pyproject.toml #386

Open
wants to merge 1 commit into
base: master
Choose a base branch
from
Open
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
5 changes: 5 additions & 0 deletions CHANGES.rst
Original file line number Diff line number Diff line change
@@ -1,13 +1,18 @@
..
Copyright (C) 2019-2024 CERN.
Copyright (C) 2019-2021 Northwestern University.
Copyright (C) 2025 TU Wien.

Invenio-Cli is free software; you can redistribute it and/or modify
it under the terms of the MIT License; see LICENSE file for more details.

Changes
=======

Version <next>

- versions: consider `pyproject.toml` when checking `App-{RDM,ILS}` dependency versions

Version 1.6.0 (released 2025-02-28)

- packages: allow use of either `pipenv` or `uv` as python package manager
Expand Down
2 changes: 1 addition & 1 deletion invenio_cli/commands/containers.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@
"""Invenio module to ease the creation and management of applications."""

from ..helpers.docker_helper import DockerHelper
from ..helpers.rdm import rdm_version
from ..helpers.versions import rdm_version
from .packages import PackagesCommands
from .services import ServicesCommands
from .steps import FunctionStep
Expand Down
2 changes: 1 addition & 1 deletion invenio_cli/commands/requirements.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@

from ..helpers.docker_helper import DockerHelper
from ..helpers.process import ProcessResponse, run_cmd
from ..helpers.rdm import rdm_version
from ..helpers.versions import rdm_version
from .steps import FunctionStep


Expand Down
3 changes: 1 addition & 2 deletions invenio_cli/commands/services.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,9 +15,8 @@
from invenio_cli.helpers.env import env

from ..helpers.docker_helper import DockerHelper
from ..helpers.ils import ils_version
from ..helpers.process import ProcessResponse
from ..helpers.rdm import rdm_version
from ..helpers.versions import ils_version, rdm_version
from .commands import Commands
from .services_health import HEALTHCHECKS, ServicesHealthCommands
from .steps import CommandStep, FunctionStep
Expand Down
28 changes: 0 additions & 28 deletions invenio_cli/helpers/ils.py

This file was deleted.

28 changes: 0 additions & 28 deletions invenio_cli/helpers/rdm.py

This file was deleted.

74 changes: 74 additions & 0 deletions invenio_cli/helpers/versions.py
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

merged ils.py and rdm.py into this one

Original file line number Diff line number Diff line change
@@ -0,0 +1,74 @@
# -*- coding: utf-8 -*-
#
# This file is part of Invenio.
# Copyright (C) 2022 CERN.
# Copyright (C) 2025 TU Wien.
#
# Invenio is free software; you can redistribute it and/or modify it
# under the terms of the MIT License; see LICENSE file for more details.

"""Invenio CLI dependencies helper."""

import os
import re

import tomli
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

tomllib is part of the standard lib starting with python 3.11, but until then we can use tomli which is a dependency from somewhere (pipfile?)

from packaging.requirements import Requirement
from pipfile import Pipfile

_version_pattern = re.compile(r"[0-9]*\.[0-9]*\.[0-9]*")


def _parse_version(version):
"""Parse a version identifier into a list of numbers."""
groups = _version_pattern.search(version)
if groups:
return [int(v) for v in groups.group(0).split(".")]
else:
return None


def _from_pipfile(dep_name):
"""Parse the stated dependency from the ``Pipfile``."""
parsed = Pipfile.load(filename="./Pipfile")
version = (parsed.data["default"].get(dep_name, {}).get("version", ""),)
return _parse_version(version)


def _from_pyproject_toml(dep_name):
"""Parse the stated dependency from ``pyproject.toml``."""
with open("./pyproject.toml", "rb") as toml_file:
parsed = tomli.load(toml_file)

dependencies = [Requirement(d) for d in parsed["project"]["dependencies"]]
app_rdms = [d for d in dependencies if d.name == "invenio-app-rdm"]
if not app_rdms:
return None

# Get the first concrete positive version specifier
v, *_ = [s for s in app_rdms[0].specifier if not s.operator.startswith("!")]
return _parse_version(v.version)


def rdm_version():
"""Return the latest RDM version."""
if os.path.isfile("./Pipfile"):
return _from_pipfile("invenio-app-rdm")

elif os.path.isfile("./pyproject.toml"):
return _from_pyproject_toml("invenio-app-rdm")

else:
raise FileNotFoundError("Found neither 'Pipfile' nor 'pyproject.toml'")


def ils_version():
"""Return the latest ILS version."""
if os.path.isfile("./Pipfile"):
return _from_pipfile("invenio-app-ils")

elif os.path.isfile("./pyproject.toml"):
return _from_pyproject_toml("invenio-app-ils")

else:
raise FileNotFoundError("Found neither 'Pipfile' nor 'pyproject.toml'")