@@ -39,6 +39,7 @@ import os
3939import pathlib
4040import sys
4141import traceback
42+ from collections import OrderedDict
4243from types import ModuleType
4344from typing import Dict, Generator, Iterator, List, Optional, Set, Tuple, Union
4445from uuid import UUID
@@ -1243,6 +1244,47 @@ suggestion_public_objects = [
12431244]
12441245suggestion = create_module(suggestion_module_name, suggestion_module_doc, suggestion_public_objects)
12451246
1247+ version_module_doc = """ libzim version module
1248+ - Get version of libzim and its dependencies
1249+ - Print version of libzim and its dependencies
1250+ - Get libzim version
1251+
1252+ Usage:
1253+ from libzim.version import get_libzim_version, get_versions, print_versions
1254+ major, minor, patch = get_libzim_version().split(".", 2)
1255+
1256+ for dependency, version in get_versions().items():
1257+ print(f"- {dependency}={version}")
1258+
1259+ print_versions()"""
1260+
1261+
1262+ def print_versions(out: Union[sys.stdout , sys.stderr] = sys.stdout ):
1263+ """ print libzim and its dependencies list with their versions"""
1264+ for library, version in get_versions().items():
1265+ prefix = " " if library == " libzim" else " + "
1266+ print (f" {prefix}{library} {version}" , file = out or sys.stdout)
1267+
1268+
1269+ def get_versions () -> OrderedDict[str , str]:
1270+ """ library: version mapping. Always includes `libzim`"""
1271+ versions = zim.getVersions()
1272+ return OrderedDict({
1273+ library.decode("UTF-8"): version.decode(" UTF-8" )
1274+ for library, version in versions
1275+ })
1276+
1277+ def get_libzim_version () -> str:
1278+ """libzim version string"""
1279+ return get_versions()["libzim"]
1280+
1281+ version_public_objects = [
1282+ get_libzim_version,
1283+ get_versions,
1284+ print_versions,
1285+ ]
1286+ version_module_name = f" {__name__}.version"
1287+ version = create_module(version_module_name, version_module_doc, version_public_objects)
12461288
12471289
12481290class ModuleLoader(importlib.abc.Loader ):
@@ -1253,7 +1295,8 @@ class ModuleLoader(importlib.abc.Loader):
12531295 ' libzim.writer' : writer,
12541296 ' libzim.reader' : reader,
12551297 ' libzim.search' : search,
1256- ' libzim.suggestion' : suggestion
1298+ ' libzim.suggestion' : suggestion,
1299+ ' libzim.version' : version
12571300 }.get(spec.name, None )
12581301
12591302 @staticmethod
@@ -1272,5 +1315,5 @@ class ModuleFinder(importlib.abc.MetaPathFinder):
12721315# register finder for our submodules
12731316sys.meta_path.insert(0 , ModuleFinder())
12741317
1275- __all__ = [" writer" , " reader" , " search" , " suggestion" ]
1318+ __all__ = [" writer" , " reader" , " search" , " suggestion" , " version " ]
12761319
0 commit comments