Hot-keys on this page
r m x p toggle line displays
j k next/prev highlighted chunk
0 (zero) top of page
1 (one) first highlighted chunk
1"""
2@file
3@brief Functions to get a status on the distribution
5.. versionadded:: 1.1
6"""
7import os
9import time
10from .module_install_version import get_pypi_version
11from ..packaged import small_set
12from ..packaged.packaged_config import classifiers2string
13from .pip_helper import get_installed_distributions
16def get_installed_modules(pypi=False, skip_betas=False, fLOG=None, stop=-1, short_list=None):
17 """
18 Returns all modules recored in this modules.
19 Adds installed modules.
21 @param pypi add pypi version
22 @param skip_betas skip the intermediate functions
23 @param stop stop after *stop* (or -1 for all)
24 @param short_list short list of modules or None for all
25 @param fLOG logging function
26 @return list of dictionaries
27 """
28 mod = small_set()
29 mod.sort()
30 rows = [_.as_dict(rst_link=True) for _ in mod]
31 for row in rows:
32 row["classifier"] = classifiers2string(row["classifier"])
33 keys = {mod["name"].lower(): mod for mod in rows}
34 keys.update({mod["mname"].lower(): mod for mod in rows if mod["mname"]})
36 all_installed = []
37 dists = get_installed_distributions()
38 if short_list:
39 dists = [_ for _ in dists if _.project_name in short_list]
40 pack = map(lambda d: (d.project_name.lower(), d), dists)
41 for i, (_, dist) in enumerate(sorted(pack)):
42 if i >= stop >= 0:
43 break
44 res = {}
45 key = dist.project_name.lower()
46 if key in keys:
47 res.update(keys[key])
49 names = [dist.key, dist.project_name, dist.key.replace("-", "_"),
50 res.get("mname", None), res.get("name", None)]
51 date = ""
52 location = None
53 for name in names:
54 if name is None:
55 continue
56 ini = os.path.join(dist.location, name, "__init__.py")
57 if os.path.exists(ini):
58 date = time.ctime(os.path.getctime(ini))
59 location = os.path.dirname(ini)
60 break
61 ini = os.path.join(dist.location, name + ".py")
62 if os.path.exists(ini):
63 date = time.ctime(os.path.getctime(ini))
64 location = ini
65 break
66 res["installed"] = dist.project_name
67 if ini is not None:
68 res["location"] = location
69 res["installed_date"] = date
70 res["installed_version"] = dist.version
72 # update?
73 if pypi:
74 available = get_pypi_version(
75 dist.project_name, skip_betas=skip_betas, full_list=True)
77 if not available:
78 msg = '-'
79 elif available[0] != dist.version:
80 msg = '!='
81 else:
82 msg = "=="
83 res["available"] = available
84 res["pypi"] = available[0]
85 else:
86 msg = ''
87 available = None
89 res["diff_pypi"] = msg
91 if fLOG:
92 sdist = str(dist.version)
93 pkg_info = '{dist.project_name:30} {sdist:20}'.format(
94 dist=dist, sdist=sdist)
95 key = key if dist.key != dist.project_name else ""
96 mes = '{pkg_info} {msg:3} - {date:20} --- {available} - {location}'
97 mes = mes.format(pkg_info=pkg_info, msg=msg, date=date, dist=dist,
98 available=available, location=res.get('location', ''))
99 fLOG("[pymy] {0}/{1} - {2}".format(i, len(dists), mes))
101 all_installed.append(res)
102 return all_installed