diff --git a/winpython/utils.py b/winpython/utils.py index 3e764ca3..2d549f20 100644 --- a/winpython/utils.py +++ b/winpython/utils.py @@ -11,9 +11,7 @@ import stat import shutil import locale -import tempfile import subprocess -import configparser as cp from pathlib import Path import re import tarfile @@ -41,25 +39,24 @@ def get_site_packages_path(path=None): pypy_site_packages = base_dir / 'site-packages' # For PyPy return str(pypy_site_packages if pypy_site_packages.is_dir() else site_packages) -def get_installed_tools_markdown(path=None)-> str: +def get_installed_tools(path=None)-> str: """Generates Markdown for installed tools section in package index.""" tool_lines = [] python_exe = Path(get_python_executable(path)) version = exec_shell_cmd(f'powershell (Get-Item {python_exe}).VersionInfo.FileVersion', python_exe.parent).splitlines()[0] - tool_lines.append(f"[Python](http://www.python.org/) | {version} | Python programming language with standard library") + tool_lines.append(("Python" ,f"http://www.python.org/", version, "Python programming language with standard library")) if (node_exe := python_exe.parent.parent / "n" / "node.exe").exists(): version = exec_shell_cmd(f'powershell (Get-Item {node_exe}).VersionInfo.FileVersion', node_exe.parent).splitlines()[0] - tool_lines.append(f"[Nodejs](https://nodejs.org) | {version} | a JavaScript runtime built on Chrome's V8 JavaScript engine") + tool_lines.append("Nodejs", "https://nodejs.org", version, "a JavaScript runtime built on Chrome's V8 JavaScript engine") if (pandoc_exe := python_exe.parent.parent / "t" / "pandoc.exe").exists(): version = exec_shell_cmd("pandoc -v", pandoc_exe.parent).splitlines()[0].split(" ")[-1] - tool_lines.append(f"[Pandoc](https://pandoc.org) | {version} | an universal document converter") + tool_lines.append("Pandoc", "https://pandoc.org", version, "an universal document converter") if (vscode_exe := python_exe.parent.parent / "t" / "VSCode" / "Code.exe").exists(): version = exec_shell_cmd(f'powershell (Get-Item {vscode_exe}).VersionInfo.FileVersion', vscode_exe.parent).splitlines()[0] - tool_lines.append(f"[VSCode](https://code.visualstudio.com) | {version} | a source-code editor developed by Microsoft") - return "\n".join(tool_lines) - + tool_lines.append("VSCode","https://code.visualstudio.com", version, "a source-code editor developed by Microsoft") + return tool_lines def onerror(function, path, excinfo): """Error handler for `shutil.rmtree`.""" diff --git a/winpython/wppm.py b/winpython/wppm.py index 782a51c5..8b733b68 100644 --- a/winpython/wppm.py +++ b/winpython/wppm.py @@ -69,24 +69,16 @@ def get_installed_packages(self, update: bool = False) -> list[Package]: pip_list = self.pip.pip_list(full=True) return [Package(f"{i[0].replace('-', '_').lower()}-{i[1]}-py3-none-any.whl", suggested_summary=i[2]) for i in pip_list] - def get_installed_packages_markdown(self) -> str: - """Generates Markdown for installed packages section in package index.""" - package_lines = [ - f"[{pkg.name}]({pkg.url}) | {pkg.version} | {pkg.description}" - for pkg in sorted(self.get_installed_packages(), key=lambda p: p.name.lower()) - ] - return "\n".join(package_lines) - - def get_wheelhouse_packages_markdown(self) -> str: - wheeldir = self.wheelhouse / 'included.wheels' - if wheeldir.is_dir(): - package_lines = [ - f"[{name}](https://pypi.org/project/{name}) | {version} | {summary}" - for name, version, summary in sorted(wh.list_packages_with_metadata(str(wheeldir)), key=itemgetter(0 , 1)) # lambda p: p[0].lower()) - ] - return "\n".join(package_lines) - return "" - + def render_markdown_for_list(self, title, items): + """Generates a Markdown section; name, url, version, summary""" + md = f"### {title}\n\n" + md += "Name | Version | Description\n" + md += "-----|---------|------------\n" + for name, url, version, summary in sorted(items, key=lambda p: (p[0].lower(), p[2])): + md += f"[{name}]({url}) | {version} | {summary} \n" + md += "\n" + return md + def generate_package_index_markdown(self, python_executable_directory: str|None = None, winpyver2: str|None = None, flavor: str|None = None, architecture_bits: int|None = None, release_level: str|None = None) -> str: """Generates a Markdown formatted package index page.""" @@ -97,30 +89,23 @@ def generate_package_index_markdown(self, python_executable_directory: str|None my_flavor = flavor or os.getenv("WINPYFLAVOR", "") my_release_level = release_level or os.getenv("WINPYVER", "").replace(my_winpyver2+my_flavor, "") + tools_list = utils.get_installed_tools(utils.get_python_executable(python_executable_directory)) + package_list = [(pkg.name, pkg.url, pkg.version, pkg.description) for pkg in self.get_installed_packages()] + wheelhouse_list = [] + wheeldir = self.wheelhouse / 'included.wheels' + if wheeldir.is_dir(): + wheelhouse_list = [(name, f"https://pypi.org/project/{name}", version, summary) + for name, version, summary in wh.list_packages_with_metadata(str(wheeldir)) ] + return f"""## WinPython {my_winpyver2 + my_flavor} The following packages are included in WinPython-{my_arch}bit v{my_winpyver2 + my_flavor} {my_release_level}.
-### Tools - -Name | Version | Description ------|---------|------------ -{utils.get_installed_tools_markdown(utils.get_python_executable(python_executable_directory))} - -### Python packages - -Name | Version | Description ------|---------|------------ -{self.get_installed_packages_markdown()} - -### WheelHouse packages - -Name | Version | Description ------|---------|------------ -{self.get_wheelhouse_packages_markdown()} - +{self.render_markdown_for_list("Tools", tools_list)} +{self.render_markdown_for_list("Python packages", package_list)} +{self.render_markdown_for_list("WheelHouse packages", wheelhouse_list)}
"""