mirror of
https://github.com/Cog-Creators/Red-DiscordBot.git
synced 2025-11-21 18:27:59 -05:00
[V3 Downloader] Allow to specify minimum and maximum bot version in info.json (#2605)
* feat(downloader): add `min_bot_version` and `max_bot_version` Adds actually working way of specifying minimum and maximum bot version and removes not working `bot_version` BREAKING CHANGE: - removal of `bot_version` attribute in `Installable` * test(downloader): `Installable` tests fix for new bot version attributes * docs(changelog): added changelog entries for this PR
This commit is contained in:
@@ -119,8 +119,14 @@ class VersionInfo:
|
||||
"dev_release": self.dev_release,
|
||||
}
|
||||
|
||||
def __lt__(self, other: "VersionInfo") -> bool:
|
||||
tups: _List[_Tuple[int, int, int, int, int, int, int]] = []
|
||||
def _generate_comparison_tuples(
|
||||
self, other: "VersionInfo"
|
||||
) -> _List[
|
||||
_Tuple[int, int, int, int, _Union[int, float], _Union[int, float], _Union[int, float]]
|
||||
]:
|
||||
tups: _List[
|
||||
_Tuple[int, int, int, int, _Union[int, float], _Union[int, float], _Union[int, float]]
|
||||
] = []
|
||||
for obj in (self, other):
|
||||
tups.append(
|
||||
(
|
||||
@@ -133,8 +139,20 @@ class VersionInfo:
|
||||
obj.dev_release if obj.dev_release is not None else _inf,
|
||||
)
|
||||
)
|
||||
return tups
|
||||
|
||||
def __lt__(self, other: "VersionInfo") -> bool:
|
||||
tups = self._generate_comparison_tuples(other)
|
||||
return tups[0] < tups[1]
|
||||
|
||||
def __eq__(self, other: "VersionInfo") -> bool:
|
||||
tups = self._generate_comparison_tuples(other)
|
||||
return tups[0] == tups[1]
|
||||
|
||||
def __le__(self, other: "VersionInfo") -> bool:
|
||||
tups = self._generate_comparison_tuples(other)
|
||||
return tups[0] <= tups[1]
|
||||
|
||||
def __str__(self) -> str:
|
||||
ret = f"{self.major}.{self.minor}.{self.micro}"
|
||||
if self.releaselevel != self.FINAL:
|
||||
|
||||
@@ -8,7 +8,7 @@ from sys import path as syspath
|
||||
from typing import Tuple, Union, Iterable
|
||||
|
||||
import discord
|
||||
from redbot.core import checks, commands, Config
|
||||
from redbot.core import checks, commands, Config, version_info as red_version_info
|
||||
from redbot.core.bot import Red
|
||||
from redbot.core.data_manager import cog_data_path
|
||||
from redbot.core.i18n import Translator, cog_i18n
|
||||
@@ -303,6 +303,26 @@ class Downloader(commands.Cog):
|
||||
)
|
||||
)
|
||||
return
|
||||
ignore_max = cog.min_bot_version > cog.max_bot_version
|
||||
if (
|
||||
cog.min_bot_version > red_version_info
|
||||
or not ignore_max
|
||||
and cog.max_bot_version < red_version_info
|
||||
):
|
||||
await ctx.send(
|
||||
_("This cog requires at least Red version {min_version}").format(
|
||||
min_version=cog.min_bot_version
|
||||
)
|
||||
+ (
|
||||
""
|
||||
if ignore_max
|
||||
else _(" and at most {max_version}").format(max_version=cog.max_bot_version)
|
||||
)
|
||||
+ _(", but you have {current_version}, aborting install.").format(
|
||||
current_version=red_version_info
|
||||
)
|
||||
)
|
||||
return
|
||||
|
||||
if not await repo.install_requirements(cog, self.LIB_PATH):
|
||||
libraries = humanize_list(tuple(map(inline, cog.requirements)))
|
||||
|
||||
@@ -8,6 +8,8 @@ from typing import MutableMapping, Any, TYPE_CHECKING
|
||||
from .log import log
|
||||
from .json_mixins import RepoJSONMixin
|
||||
|
||||
from redbot.core import __version__, version_info as red_version_info, VersionInfo
|
||||
|
||||
if TYPE_CHECKING:
|
||||
from .repo_manager import RepoManager
|
||||
|
||||
@@ -72,7 +74,8 @@ class Installable(RepoJSONMixin):
|
||||
self.repo_name = self._location.parent.stem
|
||||
|
||||
self.author = ()
|
||||
self.bot_version = (3, 0, 0)
|
||||
self.min_bot_version = red_version_info
|
||||
self.max_bot_version = red_version_info
|
||||
self.min_python_version = (3, 5, 1)
|
||||
self.hidden = False
|
||||
self.disabled = False
|
||||
@@ -157,10 +160,16 @@ class Installable(RepoJSONMixin):
|
||||
self.author = author
|
||||
|
||||
try:
|
||||
bot_version = tuple(info.get("bot_version", [3, 0, 0]))
|
||||
min_bot_version = VersionInfo.from_str(str(info.get("min_bot_version", __version__)))
|
||||
except ValueError:
|
||||
bot_version = self.bot_version
|
||||
self.bot_version = bot_version
|
||||
min_bot_version = self.min_bot_version
|
||||
self.min_bot_version = min_bot_version
|
||||
|
||||
try:
|
||||
max_bot_version = VersionInfo.from_str(str(info.get("max_bot_version", __version__)))
|
||||
except ValueError:
|
||||
max_bot_version = self.max_bot_version
|
||||
self.max_bot_version = max_bot_version
|
||||
|
||||
try:
|
||||
min_python_version = tuple(info.get("min_python_version", [3, 5, 1]))
|
||||
|
||||
@@ -83,7 +83,8 @@ def bot_repo(event_loop):
|
||||
# Installable
|
||||
INFO_JSON = {
|
||||
"author": ("tekulvw",),
|
||||
"bot_version": (3, 0, 0),
|
||||
"min_bot_version": "3.0.0",
|
||||
"max_bot_version": "3.0.2",
|
||||
"description": "A long description",
|
||||
"hidden": False,
|
||||
"install_msg": "A post-installation message",
|
||||
@@ -96,7 +97,8 @@ INFO_JSON = {
|
||||
|
||||
LIBRARY_INFO_JSON = {
|
||||
"author": ("seputaes",),
|
||||
"bot_version": (3, 0, 0),
|
||||
"min_bot_version": "3.0.0",
|
||||
"max_bot_version": "3.0.2",
|
||||
"description": "A long library description",
|
||||
"hidden": False, # libraries are always hidden, this tests it will be flipped
|
||||
"install_msg": "A library install message",
|
||||
|
||||
Reference in New Issue
Block a user