frappe/env/lib/python3.12/site-packages/pypdfium2/version.py

222 lines
6.5 KiB
Python

# SPDX-FileCopyrightText: 2024 geisserml <geisserml@gmail.com>
# SPDX-License-Identifier: Apache-2.0 OR BSD-3-Clause
__all__ = []
import sys
import json
import functools
from pathlib import Path
from types import MappingProxyType
import pypdfium2_raw
# TODO move to shared compat file
if sys.version_info < (3, 8):
def cached_property(func):
return property( functools.lru_cache(maxsize=1)(func) )
else:
cached_property = functools.cached_property
class _abc_version:
@cached_property
def _data(self):
with open(self._FILE, "r") as buf:
data = json.load(buf)
self._process_data(data)
return MappingProxyType(data)
def _process_data(self, data):
pass
def __getattr__(self, attr):
return self._data[attr]
def __setattr__(self, name, value):
raise AttributeError(f"Version class is immutable - assignment '{name} = {value}' not allowed")
def __repr__(self):
return self.version
@cached_property
def api_tag(self):
return tuple(self._data[k] for k in self._TAG_FIELDS)
def _craft_tag(self):
return ".".join(str(v) for v in self.api_tag)
def _craft_desc(self, extra=[]):
local_ver = []
if self.n_commits > 0:
local_ver += [str(self.n_commits), str(self.hash)]
local_ver += extra
desc = ""
if local_ver:
desc += "+" + ".".join(local_ver)
return desc
@cached_property
def version(self):
return self.tag + self.desc
class _version_pypdfium2 (_abc_version):
_FILE = Path(__file__).parent / "version.json"
_TAG_FIELDS = ("major", "minor", "patch")
@cached_property
def tag(self):
tag = self._craft_tag()
if self.beta is not None:
tag += f"b{self.beta}"
return tag
@cached_property
def desc(self):
extra = []
if self.dirty:
extra += ["dirty"]
desc = self._craft_desc(extra)
if self.data_source != "git":
desc += f":{self.data_source}"
if self.is_editable:
desc += "@editable"
return desc
class _version_pdfium (_abc_version):
_FILE = Path(pypdfium2_raw.__file__).parent / "version.json"
_TAG_FIELDS = ("major", "minor", "build", "patch")
def _process_data(self, data):
data["flags"] = tuple(data["flags"])
@cached_property
def tag(self):
return self._craft_tag()
@cached_property
def desc(self):
desc = self._craft_desc()
if self.flags:
desc += ":{%s}" % ",".join(self.flags)
if self.origin != "pdfium-binaries":
desc += f"@{self.origin}"
return desc
# TODO(future) add bindings info (e.g. ctypesgen version, reference/generated, runtime libdirs)
# Current API
PYPDFIUM_INFO = _version_pypdfium2()
PDFIUM_INFO = _version_pdfium()
__all__ += ["PYPDFIUM_INFO", "PDFIUM_INFO"]
# -----
# Deprecated API, to be removed with v5
# Known issue: causes eager evaluation of the new API's theoretically deferred properties.
V_PYPDFIUM2 = PYPDFIUM_INFO.version
V_LIBPDFIUM = str(PDFIUM_INFO.build)
V_BUILDNAME = PDFIUM_INFO.origin
V_PDFIUM_IS_V8 = "V8" in PDFIUM_INFO.flags # implies XFA
V_LIBPDFIUM_FULL = PDFIUM_INFO.version
__all__ += ["V_PYPDFIUM2", "V_LIBPDFIUM", "V_LIBPDFIUM_FULL", "V_BUILDNAME", "V_PDFIUM_IS_V8"]
# -----
# Docs
PYPDFIUM_INFO = PYPDFIUM_INFO
"""
pypdfium2 helpers version.
It is suggesed to compare against *api_tag* and possibly also *beta* (see below).
Parameters:
version (str):
Joined tag and desc, forming the full version.
tag (str):
Version ciphers joined as str, including possible beta. Corresponds to the latest release tag at install time.
desc (str):
Non-cipher descriptors represented as str.
api_tag (tuple[int]):
Version ciphers joined as tuple, excluding possible beta.
major (int):
Major cipher.
minor (int):
Minor cipher.
patch (int):
Patch cipher.
beta (int | None):
Beta cipher, or None if not a beta version.
n_commits (int):
Number of commits after tag at install time. 0 for release.
hash (str | None):
Hash of head commit if n_commits > 0, None otherwise.
dirty (bool):
True if there were uncommitted changes at install time, False otherwise.
data_source (str):
Source of this version info. Possible values:\n
- ``git``: Parsed from git describe. Always used if available. Highest accuracy.
- ``given``: Pre-supplied version file (e.g. packaged with sdist, or else created by caller).
- ``record``: Parsed from autorelease record. Implies that possible changes after tag are unknown.
is_editable (bool | None):
True for editable install, False otherwise. None if unknown.\n
If True, the version info is the one captured at install time. An arbitrary number of forward or reverse changes may have happened since. The actual current state is unknown.
"""
PDFIUM_INFO = PDFIUM_INFO
"""
PDFium version.
It is suggesed to compare against *build* (see below).
Parameters:
version (str):
Joined tag and desc, forming the full version.
tag (str):
Version ciphers joined as str.
desc (str):
Descriptors (origin, flags) represented as str.
api_tag (tuple[int]):
Version ciphers joined as tuple.
major (int):
Chromium major cipher.
minor (int):
Chromium minor cipher.
build (int):
Chromium/pdfium build cipher.
This value allows to uniquely identify the pdfium sources the binary was built from.
patch (int):
Chromium patch cipher.
n_commits (int):
Number of commits after tag at install time. 0 for tagged build commit.
hash (str | None):
Hash of head commit if n_commits > 0, None otherwise.
origin (str):
The pdfium binary's origin. Possible values:\n
- ``pdfium-binaries``: Compiled by bblanchon/pdfium-binaries, and bundled into pypdfium2.
- ``sourcebuild``: Provided by the caller (commonly compiled using pypdfium2's integrated build script), and bundled into pypdfium2.
- ``system``: Loaded from a standard system location using :func:`ctypes.util.find_library()`, or an explicit directory provided at setup time.
flags (tuple[str]):
Tuple of pdfium feature flags. Empty for default build. (V8, XFA) for pdfium-binaries V8 build.
"""
# -----