Skip to content

Commit 12f82b4

Browse files
authored
Merge pull request #159 from openzim/issue-148-fixes
Introducing printVersions() and getVersions()
2 parents d972b4a + 0634086 commit 12f82b4

File tree

4 files changed

+91
-2
lines changed

4 files changed

+91
-2
lines changed

CHANGELOG.md

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,15 @@ All notable changes to this project will be documented in this file.
55
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
66
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
77

8+
## [Unreleased]
9+
10+
### Added
11+
12+
* `version` module with
13+
* `version.get_versions()` returning an OrderedDict of library:version inclusing libzim
14+
* `version.print_versions()` print it on stdout (or another fd)
15+
* `version.get_libzim_version()` returns the libzim version only
16+
817
## [2.1.0] - 2022-12-06
918

1019
### Added

libzim/libzim.pyx

Lines changed: 45 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ import os
3939
import pathlib
4040
import sys
4141
import traceback
42+
from collections import OrderedDict
4243
from types import ModuleType
4344
from typing import Dict, Generator, Iterator, List, Optional, Set, Tuple, Union
4445
from uuid import UUID
@@ -1243,6 +1244,47 @@ suggestion_public_objects = [
12431244
]
12441245
suggestion = 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

12481290
class 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
12731316
sys.meta_path.insert(0, ModuleFinder())
12741317

1275-
__all__ = ["writer", "reader", "search", "suggestion"]
1318+
__all__ = ["writer", "reader", "search", "suggestion", "version"]
12761319

libzim/zim.pxd

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ from libc.stdint cimport uint32_t, uint64_t
2222
from libcpp cimport bool
2323
from libcpp.map cimport map
2424
from libcpp.memory cimport shared_ptr
25+
from libcpp.pair cimport pair
2526
from libcpp.set cimport set
2627
from libcpp.string cimport string
2728
from libcpp.vector cimport vector
@@ -218,3 +219,6 @@ cdef extern from "libwrapper.h" namespace "wrapper":
218219
SuggestionIterator begin()
219220
SuggestionIterator end()
220221
int size()
222+
223+
cdef extern from "zim/version.h" namespace "zim":
224+
cdef vector[pair[string, string]] getVersions()

tests/test_libzim_version.py

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
import re
2+
import sys
3+
4+
from libzim.version import get_libzim_version, get_versions, print_versions
5+
6+
7+
def test_version_print_version_with_stdout(capsys):
8+
print_versions()
9+
print("", file=sys.stdout, flush=True)
10+
stdout, stderr = capsys.readouterr()
11+
assert len(stdout) != 0
12+
13+
14+
def test_version_print_version_with_stderr(capsys):
15+
print_versions(sys.stderr)
16+
print("", file=sys.stderr, flush=True)
17+
stdout, stderr = capsys.readouterr()
18+
assert len(stderr) != 0
19+
20+
21+
def test_get_versions():
22+
versions = get_versions()
23+
assert versions
24+
assert "libzim" in versions
25+
assert len(versions.keys()) > 1
26+
for library, version in versions.items():
27+
assert isinstance(library, str)
28+
assert isinstance(version, str)
29+
30+
31+
def test_get_libzim_version():
32+
# libzim uses semantic versioning
33+
assert re.match(r"\d+\.\d+\.\d+", get_libzim_version())

0 commit comments

Comments
 (0)