Queer European MD passionate about IT
Переглянути джерело

Get package version from metadata when package has no __version__ attribute

Davte 6 місяців тому
батько
коміт
02386d69da
2 змінених файлів з 17 додано та 4 видалено
  1. 1 1
      davtelepot/__init__.py
  2. 16 3
      davtelepot/administration_tools.py

+ 1 - 1
davtelepot/__init__.py

@@ -11,7 +11,7 @@ __author__ = "Davide Testa"
 __email__ = "davide@davte.it"
 __credits__ = ["Marco Origlia", "Nick Lee @Nickoala"]
 __license__ = "GNU General Public License v3.0"
-__version__ = "2.10.4"
+__version__ = "2.10.5"
 __maintainer__ = "Davide Testa"
 __contact__ = "t.me/davte"
 

+ 16 - 3
davtelepot/administration_tools.py

@@ -18,6 +18,7 @@ import re
 import types
 
 from collections import OrderedDict
+from importlib.metadata import version as get_package_version_from_metadata
 from typing import Union, List, Tuple
 
 # Third party modules
@@ -44,6 +45,13 @@ variable_regex = re.compile(r"(?P<name>[a-zA-Z]\w*)\s*=\s*"
                             r"\"[^\"]*\")")
 
 
+def get_package_version(package: types.ModuleType):
+    """Get version of given package."""
+    if hasattr(package, '__version__'):
+        return package.__version__
+    return get_package_version_from_metadata(package.__name__)
+
+
 async def _forward_to(update,
                       bot: Bot,
                       sender,
@@ -865,7 +873,12 @@ async def get_new_versions(bot: Bot,
                           "skipping...")
             continue
         new_version = web_page['info']['version']
-        current_version = package.__version__
+        try:
+            current_version = get_package_version(package)
+        except TypeError:
+            current_version = "NA"
+            logging.error("Could not get current version of "
+                          "package %s", package.__name__)
         notification_record = bot.db['updates_notifications'].find_one(
             package=package.__name__,
             order_by=['-id'],
@@ -895,7 +908,7 @@ async def version_command(bot: Bot, update: dict,
     text += f'<b>Python: </b> <code>{platform.python_version()}</code>\n'
     text += '\n'.join(
         f"<b>{package.__name__}</b>: "
-        f"<code>{package.__version__}</code>"
+        f"<code>{get_package_version(package)}</code>"
         for package in bot.packages
     )
     temporary_message = await bot.send_message(
@@ -939,7 +952,7 @@ async def notify_new_version(bot: Bot):
         order_by=['-id']
     )
     current_versions = {
-        f"{package.__name__}_version": package.__version__
+        f"{package.__name__}_version": get_package_version(package)
         for package in bot.packages
     }
     current_versions['last_commit'] = last_commit