mirror of
https://github.com/janeczku/calibre-web
synced 2024-12-01 13:59:57 +00:00
d26e60724a
Refactoring of server code Updates requirements Improved requirements parsing for versions containing letters
110 lines
4.0 KiB
Python
110 lines
4.0 KiB
Python
import os
|
|
import re
|
|
import sys
|
|
import json
|
|
|
|
from .constants import BASE_DIR
|
|
try:
|
|
from importlib.metadata import version
|
|
importlib = True
|
|
ImportNotFound = BaseException
|
|
except ImportError:
|
|
importlib = False
|
|
version = None
|
|
|
|
if not importlib:
|
|
try:
|
|
import pkg_resources
|
|
from pkg_resources import DistributionNotFound as ImportNotFound
|
|
pkgresources = True
|
|
except ImportError as e:
|
|
pkgresources = False
|
|
|
|
|
|
def load_dependencies(optional=False):
|
|
deps = list()
|
|
if getattr(sys, 'frozen', False):
|
|
pip_installed = os.path.join(BASE_DIR, ".pip_installed")
|
|
if os.path.exists(pip_installed):
|
|
with open(pip_installed) as f:
|
|
exe_deps = json.loads("".join(f.readlines()))
|
|
else:
|
|
return deps
|
|
if importlib or pkgresources:
|
|
if optional:
|
|
req_path = os.path.join(BASE_DIR, "optional-requirements.txt")
|
|
else:
|
|
req_path = os.path.join(BASE_DIR, "requirements.txt")
|
|
if os.path.exists(req_path):
|
|
with open(req_path, 'r') as f:
|
|
for line in f:
|
|
if not line.startswith('#') and not line == '\n' and not line.startswith('git'):
|
|
res = re.match(r'(.*?)([<=>\s]+)([\d\.]+),?\s?([<=>\s]+)?([\d\.]+)?', line.strip())
|
|
try:
|
|
if getattr(sys, 'frozen', False):
|
|
dep_version = exe_deps[res.group(1).lower().replace('_', '-')]
|
|
else:
|
|
if importlib:
|
|
dep_version = version(res.group(1))
|
|
else:
|
|
dep_version = pkg_resources.get_distribution(res.group(1)).version
|
|
except (ImportNotFound, KeyError):
|
|
if optional:
|
|
continue
|
|
dep_version = "not installed"
|
|
deps.append([dep_version, res.group(1), res.group(2), res.group(3), res.group(4), res.group(5)])
|
|
return deps
|
|
|
|
|
|
def dependency_check(optional=False):
|
|
d = list()
|
|
deps = load_dependencies(optional)
|
|
for dep in deps:
|
|
try:
|
|
dep_version_int = [int(x) if x.isnumeric() else 0 for x in dep[0].split('.')]
|
|
low_check = [int(x) for x in dep[3].split('.')]
|
|
high_check = [int(x) for x in dep[5].split('.')]
|
|
except AttributeError:
|
|
high_check = []
|
|
except ValueError:
|
|
d.append({'name': dep[1],
|
|
'target': "available",
|
|
'found': "Not available"
|
|
})
|
|
continue
|
|
|
|
if dep[2].strip() == "==":
|
|
if dep_version_int != low_check:
|
|
d.append({'name': dep[1],
|
|
'found': dep[0],
|
|
"target": dep[2] + dep[3]})
|
|
continue
|
|
elif dep[2].strip() == ">=":
|
|
if dep_version_int < low_check:
|
|
d.append({'name': dep[1],
|
|
'found': dep[0],
|
|
"target": dep[2] + dep[3]})
|
|
continue
|
|
elif dep[2].strip() == ">":
|
|
if dep_version_int <= low_check:
|
|
d.append({'name': dep[1],
|
|
'found': dep[0],
|
|
"target": dep[2] + dep[3]})
|
|
continue
|
|
if dep[4] and dep[5]:
|
|
if dep[4].strip() == "<":
|
|
if dep_version_int >= high_check:
|
|
d.append(
|
|
{'name': dep[1],
|
|
'found': dep[0],
|
|
"target": dep[4] + dep[5]})
|
|
continue
|
|
elif dep[4].strip() == "<=":
|
|
if dep_version_int > high_check:
|
|
d.append(
|
|
{'name': dep[1],
|
|
'found': dep[0],
|
|
"target": dep[4] + dep[5]})
|
|
continue
|
|
return d
|