From 4ee647f409e72004ba66c7d39e444b3d6a6320b2 Mon Sep 17 00:00:00 2001 From: yudalang3 Date: Mon, 4 Aug 2025 17:27:10 +0800 Subject: [PATCH 1/2] =?UTF-8?q?refactor(config):=20=E9=87=8D=E6=9E=84?= =?UTF-8?q?=E9=85=8D=E7=BD=AE=E6=96=87=E4=BB=B6=E5=B9=B6=E4=BC=98=E5=8C=96?= =?UTF-8?q?=E6=95=B0=E6=8D=AE=E4=B8=8B=E8=BD=BD=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 更新 .gitignore 文件,增加 .idea/ 目录以忽略 IDE 自动生成的文件 - 重构 ete4/config.py 文件,添加详细注释说明 XDG 标准和路径处理逻辑 - 优化 update_ete_data 函数,增加对相对路径和 URL 的处理,支持大型文件下载 - 在 setup.py 中使用 os.path.sep 以确保跨平台兼容性 refactor(config): refactor configuration files and enhance data download functionality Update .gitignore to add the .idea/ directory, ignoring IDE-generated files Refactor ete4/config.py, adding detailed comments that explain the XDG spec and path-handling logic Improve update_ete_data by handling both relative paths and URLs, with support for large-file downloads Use os.path.sep in setup.py to ensure cross-platform compatibility --- .gitignore | 4 ++ ete4/config.py | 74 +++++++++++++++++++++++-------- examples/general/random_tree.png | Bin 103821 -> 0 bytes setup.py | 5 ++- 4 files changed, 63 insertions(+), 20 deletions(-) delete mode 100644 examples/general/random_tree.png diff --git a/.gitignore b/.gitignore index ef920b75f..8c795ab0d 100644 --- a/.gitignore +++ b/.gitignore @@ -21,3 +21,7 @@ test.svg # MacOSX .DS_Store + + +# IDEs and editors +.idea/ diff --git a/ete4/config.py b/ete4/config.py index 4de6cb991..22626a1c0 100644 --- a/ete4/config.py +++ b/ete4/config.py @@ -1,54 +1,92 @@ """ -Constants with the XDG-compliant directories for ete. +ETE Toolkit XDG-compliant directory constants configuration file. + +This file defines the standard paths for ETE to store data, configuration, and cache on different operating systems. +It follows the XDG Base Directory specification to ensure compatibility across different systems. """ # See https://specifications.freedesktop.org/basedir-spec/basedir-spec-latest.html +# The XDG Base Directory specification defines which standard directories applications should use +# to store different types of data import os +# Import dirname and exists functions from os.path module for path handling and file existence checking from os.path import dirname, exists +# Import requests library for HTTP requests to download files import requests -# Helper function to define global ETE_* variables. +# Helper function: used to define global ETE_* variables +# Parameters: +# xdg_var: XDG environment variable name (e.g., XDG_DATA_HOME) +# default: Default path (relative to user home directory) when environment variable is not set def ete_path(xdg_var, default): - return os.environ.get(xdg_var, os.environ['HOME'] + default) + '/ete' + """ + Determine ETE-related directory paths according to XDG standard + + First check if the corresponding XDG environment variable is set, if so use its value, + otherwise use the default path (user home directory + default subdirectory). + Finally create a subdirectory named 'ete' under that path. + """ + # Get user home directory and concatenate default path as prefix + prefix = os.path.expanduser('~') + default + # Use environment variable value if set, otherwise use default prefix, then add '/ete' subdirectory + return os.environ.get(xdg_var, prefix) + '/ete' +# Define ETE data storage directory (for database and other data files) ETE_DATA_HOME = ete_path('XDG_DATA_HOME', '/.local/share') +# Define ETE configuration file directory (for configuration files) ETE_CONFIG_HOME = ete_path('XDG_CONFIG_HOME', '/.config') +# Define ETE cache directory (for temporary files and cache) ETE_CACHE_HOME = ete_path('XDG_CACHE_HOME', '/.cache') def update_ete_data(path, url, overwrite=False): - """Refresh the contents of path with the ones in the given in the url.""" - # Resolve relative paths to refer to ETE_DATA_HOME. + """ + Download data from specified URL and update local file + + Parameters: + path: Local file path (relative or absolute path) + url: Data source URL (relative or absolute URL) + overwrite: Whether to overwrite existing files, default is False (no overwrite) + """ + # Handle relative paths: if path is not an absolute path (doesn't start with '/'), + # resolve it as a relative path under ETE_DATA_HOME if not path.startswith('/'): path = ETE_DATA_HOME + '/' + path - # Keep existing file if we asked for it. + # If file already exists and not forcing overwrite, return directly without updating if not overwrite and exists(path): return - # Create the directory. + # Create directory: if path contains directory and directory doesn't exist, create the directory + # dirname(path) gets the directory part of the path, exists(dirname(path)) checks if directory exists if dirname(path) and not exists(dirname(path)): + # Use system command to create directory (mkdir -p can recursively create multi-level directories) os.system('mkdir -p ' + dirname(path)) - # Resolve relative urls to refer to ete-data repository. + # Handle relative URL: if URL is not an absolute URL (doesn't start with 'https://'), + # resolve it as a relative URL to the ete-data repository if not url.startswith('https://'): - url = 'https://github.com/etetoolkit/ete-data/raw/main/' + url + url = 'https://github.com/etetoolkit/ete-data/raw/refs/heads/main/' + url - # Update local file with the content from the url. - with open(path, 'wb') as f: - print(f'{url} -> {path}') - f.write(requests.get(url).content) - # NOTE: If we had wget, this is similar to: + # Download content from URL and write to local file + with open(path, 'wb') as f: # Open file in binary write mode + print(f'{url} -> {path}') # Print download information, showing which URL downloads to which path + f.write(requests.get(url).content) # Send HTTP GET request to get content and write to file + # Note: If we had wget command, we could achieve similar functionality, and wget supports resume download + # which is more advantageous for large file downloads # os.system(f'wget -c -nv -O {path} {url}') - # only wget could be better since it resumes partially downloaded files. + # The advantage of wget is that it can resume partially downloaded files -# Example: +# Usage example: # +# # Define the file name to download # path = 'gtdb202dump.tar.gz' -# url = ('https://github.com/etetoolkit/ete-data/raw/main' +# # Define the complete URL of the file on GitHub +# url = ('https://github.com/etetoolkit/ete-data/raw/refs/heads/main' # '/gtdb_taxonomy/gtdb202/gtdb202dump.tar.gz') # -# update_ete_data(path, url) +# # Call function to update data +# update_ete_data(path, url) \ No newline at end of file diff --git a/examples/general/random_tree.png b/examples/general/random_tree.png deleted file mode 100644 index 69e643686bdf39734845e8a6a6a3f2ffc98d6726..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 103821 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 . and remove .pyx + name = path.replace(sep, '.')[:-len('.pyx')] # use os-specific separator -> . and remove .pyx return Extension(name, [path], extra_compile_args=['-O3']) + setup( name='ete4', packages=['ete4', From 3980613e4e524d2f259d2cf181d8265bbe231336 Mon Sep 17 00:00:00 2001 From: yudalang3 Date: Wed, 6 Aug 2025 09:53:44 +0800 Subject: [PATCH 2/2] =?UTF-8?q?feat(py4egps=5Ftreeview):=20=E6=B7=BB?= =?UTF-8?q?=E5=8A=A0=20eGPS=20=E6=A0=91=E8=A7=86=E5=9B=BE=E5=8A=9F?= =?UTF-8?q?=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 新增 py4egps_treeview 模块,实现 eGPS 树视图的启动和配置 - 添加 ExternalCmdInvoker 类,用于跨平台执行外部命令- 在 ete4 包中集成 py4egps_treeview模块 - 更新 .gitignore 文件,忽略用户特定的项目配置 --- .gitignore | 2 + ete4/__init__.py | 2 + ete4/core/tree.pyx | 2 +- ete4/py4egps_treeview/ExternalCmdInvoker.py | 216 ++++++++++++++++++ ete4/py4egps_treeview/__init__.py | 4 + .../py4egps_treeview/external_jvm_launcher.py | 131 +++++++++++ pyproject.toml | 106 ++++----- 7 files changed, 409 insertions(+), 54 deletions(-) create mode 100644 ete4/py4egps_treeview/ExternalCmdInvoker.py create mode 100644 ete4/py4egps_treeview/__init__.py create mode 100644 ete4/py4egps_treeview/external_jvm_launcher.py diff --git a/.gitignore b/.gitignore index 8c795ab0d..8cbf8708e 100644 --- a/.gitignore +++ b/.gitignore @@ -25,3 +25,5 @@ test.svg # IDEs and editors .idea/ + +user_individual_proj/ \ No newline at end of file diff --git a/ete4/__init__.py b/ete4/__init__.py index f614e627e..7ec098182 100644 --- a/ete4/__init__.py +++ b/ete4/__init__.py @@ -23,3 +23,5 @@ from .utils import SVG_COLORS, COLOR_SCHEMES, random_color from .version import __version__ + +from .py4egps_treeview import * \ No newline at end of file diff --git a/ete4/core/tree.pyx b/ete4/core/tree.pyx index 85aecb6e7..d0c8598b8 100644 --- a/ete4/core/tree.pyx +++ b/ete4/core/tree.pyx @@ -707,7 +707,7 @@ cdef class Tree: """Return or write to file the newick representation. :param str outfile: Name of the output file. If present, it will write - the newick to that file instad of returning it as a string. + the newick to that file instead of returning it as a string. :param list props: Properties to write for all nodes using the Extended Newick Format. If None, write all available properties. :param parser: Parser used to encode the tree in newick format. diff --git a/ete4/py4egps_treeview/ExternalCmdInvoker.py b/ete4/py4egps_treeview/ExternalCmdInvoker.py new file mode 100644 index 000000000..12fd1dec8 --- /dev/null +++ b/ete4/py4egps_treeview/ExternalCmdInvoker.py @@ -0,0 +1,216 @@ +#!/usr/bin/env python3 +""" +ExternalCmdInvoker +~~~~~~~~~~~~~~~~~~ +Cross-platform external command execution helper. +This module provides functionality to execute external commands in a cross-platform manner, +handling differences between Windows and Unix-like systems appropriately. + +Example usage: + >>> from ete4.py4egps_treeview import ExternalCmdInvoker + >>> invoker = ExternalCmdInvoker() + >>> out, err, code = invoker.run_cmd(["java", "-jar", "MyTool.jar", "--help"]) +""" +import platform +import subprocess +import shlex +from typing import List, Tuple, Optional, Dict + + +class ExternalCmdInvoker: + """ + A class to invoke external commands in a cross-platform manner. + + This class provides functionality to execute external commands with comprehensive + control over execution parameters, handling differences between Windows and + Unix-like systems appropriately. + + The class provides two main methods: + 1. run_cmd() - For executing standalone executable files (e.g., java, python) + 2. run_shell_cmd() - For executing shell commands including shell builtins + (e.g., dir on Windows cmd, ls on Unix shells) + """ + + def _quote(self, args: List[str]) -> str: + """ + Convert argument list to a command line string suitable for the current OS. + This method is primarily used for logging/printing purposes to generate + a copy-pasteable command line string that would execute the same command. + + Args: + args: List of command arguments + + Returns: + A properly quoted command line string for the current operating system + """ + system = platform.system() + if system == "Windows": + # Using the official list2cmdline which properly handles spaces and quotes + from subprocess import list2cmdline + return list2cmdline(args) + else: # Linux / Darwin (macOS) + # Python 3.8+ provides shlex.join for this purpose + return shlex.join(args) + + def run_cmd( + self, + argv: List[str], + cwd: Optional[str] = None, + env: Optional[Dict[str, str]] = None, + check: bool = False, + capture_output: bool = True, + text: bool = True, + ) -> Tuple[str, str, int]: + """ + Execute an external command with comprehensive control over execution parameters. + + This method provides a convenient wrapper around subprocess.run with sensible + defaults for common use cases and proper cross-platform argument handling. + + NOTE: This method executes programs directly and cannot run shell builtin + commands like 'dir' on Windows or 'ls' on Unix. For shell builtin commands, + use run_shell_cmd() instead. + + Args: + argv : List[str] + Command and its arguments as a list, e.g. ["java", "-jar", "/path/to/app.jar", "--flag", "value"] + Note: This should not be a shell builtin command. + cwd : str | None + Working directory for the command execution; if None, inherits the parent process directory + env : dict | None + Additional environment variables; if None, inherits the parent process environment + check : bool + If True, raises a CalledProcessError when the command returns a non-zero exit code + capture_output : bool + If True, captures and returns stdout and stderr; if False, they are not captured + text : bool + If True, returns output as strings; if False, returns output as bytes + + Returns: + A tuple containing (stdout, stderr, return_code) + + Example: + >>> invoker = ExternalCmdInvoker() + >>> out, err, code = invoker.run_cmd(["python", "--version"]) + >>> print(f"Command exited with code: {code}") + + Note: + This method will NOT work for: + - Windows cmd builtin commands like 'dir', 'cd' + - PowerShell commands like 'ls' (which is an alias for Get-ChildItem) + - Unix shell builtin commands like 'cd', 'export' + """ + cmd_str = self._quote(argv) + print(f"[RUN] {cmd_str}") # Log the copy-pasteable full command line + + completed = subprocess.run( + argv, + cwd=cwd, + env=env, + check=check, + capture_output=capture_output, + text=text, + ) + return completed.stdout, completed.stderr, completed.returncode + + def run_shell_cmd( + self, + cmd: str, + cwd: Optional[str] = None, + env: Optional[Dict[str, str]] = None, + check: bool = False, + capture_output: bool = True, + text: bool = True, + ) -> Tuple[str, str, int]: + """ + Execute a shell command with comprehensive control over execution parameters. + + This method provides a convenient wrapper around subprocess.run with shell=True, + allowing execution of shell builtin commands like 'dir' on Windows or 'ls' on Unix. + Use this method when you need to execute shell builtin commands or when you want + to execute commands through the system shell. + + Args: + cmd : str + The command string to execute through the shell, e.g. "dir" or "ls -l" + cwd : str | None + Working directory for the command execution; if None, inherits the parent process directory + env : dict | None + Additional environment variables; if None, inherits the parent process environment + check : bool + If True, raises a CalledProcessError when the command returns a non-zero exit code + capture_output : bool + If True, captures and returns stdout and stderr; if False, they are not captured + text : bool + If True, returns output as strings; if False, returns output as bytes + + Returns: + A tuple containing (stdout, stderr, return_code) + + Example: + >>> invoker = ExternalCmdInvoker() + >>> # On Windows (cmd builtins) + >>> out, err, code = invoker.run_shell_cmd("dir") + >>> + >>> # On Windows (PowerShell aliases work when PowerShell is default shell) + >>> out, err, code = invoker.run_shell_cmd("ls") + >>> + >>> # On Unix/Linux/macOS + >>> out, err, code = invoker.run_shell_cmd("ls -l") + >>> print(f"Command exited with code: {code}") + + Note: + This method works for: + - Windows cmd builtin commands like 'dir', 'cd' + - PowerShell commands and aliases like 'ls' + - Unix shell builtin commands like 'cd', 'export' + - All commands that work when typed directly in the system shell + """ + print(f"[RUN] {cmd}") # Log the command + + completed = subprocess.run( + cmd, + shell=True, + cwd=cwd, + env=env, + check=check, + capture_output=capture_output, + text=text, + ) + return completed.stdout, completed.stderr, completed.returncode + + +# For backward compatibility, expose the old function-based interface +def run_cmd( + argv: List[str], + cwd: Optional[str] = None, + env: Optional[Dict[str, str]] = None, + check: bool = False, + capture_output: bool = True, + text: bool = True, +) -> Tuple[str, str, int]: + """ + Backward compatibility function. + + Execute an external command with comprehensive control over execution parameters. + This is a wrapper around ExternalCmdInvoker.run_cmd() for backward compatibility. + Note: This method cannot execute shell builtin commands like 'dir' on Windows. + For shell builtin commands, use ExternalCmdInvoker class directly. + """ + invoker = ExternalCmdInvoker() + return invoker.run_cmd(argv, cwd, env, check, capture_output, text) + + +# —————— Simple Example —————— +if __name__ == "__main__": + # Example: java -jar demo.jar --input sample.txt + # Running a sample command to demonstrate usage + invoker = ExternalCmdInvoker() + out, err, code = invoker.run_shell_cmd( + ["java", "-jar", "demo.jar", "--input", "sample.txt"], check=False + ) + print("exit code:", code) + if out: + print("stdout:\n", out) + if err: + print("stderr:\n", err) diff --git a/ete4/py4egps_treeview/__init__.py b/ete4/py4egps_treeview/__init__.py new file mode 100644 index 000000000..09cc41dbc --- /dev/null +++ b/ete4/py4egps_treeview/__init__.py @@ -0,0 +1,4 @@ +from .ExternalCmdInvoker import ExternalCmdInvoker, run_cmd +from .external_jvm_launcher import launch_egps_treeview,configure_egps,get_user_egps_configure + +__all__ = ["ExternalCmdInvoker", "run_cmd", "launch_egps_treeview","configure_egps", "get_user_egps_configure"] \ No newline at end of file diff --git a/ete4/py4egps_treeview/external_jvm_launcher.py b/ete4/py4egps_treeview/external_jvm_launcher.py new file mode 100644 index 000000000..a19677155 --- /dev/null +++ b/ete4/py4egps_treeview/external_jvm_launcher.py @@ -0,0 +1,131 @@ +import platform +import subprocess +import json +from pathlib import Path +from typing import Sequence, Optional, List +from ete4 import Tree + +""" +The JVM launcher configuration: +{config_egps_file} +The path is same as Py4eGPS package, so, user do not need to configurator again. +""" + +config_file_default_template = """ +# The blank area of top,left,bottom,right . +$blank.space=20,20,80,80 +# Whether display the leaf label on the tree. +$show.leaf.label=T +""".splitlines() + +config_egps_file = Path.home() / '.eGPS4Py' / 'egps_config.json' + + + +def configure_egps(egps_software_path: str): + """ + Configure JVM paths and save to user directory to avoid permission issues. + + Args: + egps_software_path (str): Path to eGPS software path + """ + path_installed = Path(egps_software_path) + path_java_bin = path_installed / "jre" / "bin" / "java" + data = {'egps_software_path': path_installed.resolve().as_posix(), 'java_bin': path_java_bin.resolve().as_posix()} + # Save configuration to user home directory to avoid permission issues + config_dir = Path.home() / '.eGPS4Py' + config_dir.mkdir(exist_ok=True) + with open(config_egps_file, 'w') as f: + json.dump(data, f) + + +def get_user_egps_configure(): + """ + Get user-specific eGPS configuration from home directory. + + Returns: + tuple: A tuple containing (java_vm_path, java_class_path) + + Raises: + FileNotFoundError: If user configuration file does not exist + """ + # Read configuration from user directory + if config_egps_file.exists(): + with open(config_egps_file, 'r') as f: + loaded_data = json.load(f) + return loaded_data['egps_software_path'], loaded_data['java_bin'] + else: + # If user configuration does not exist, raise exception + raise FileNotFoundError("JVM configuration not found. Please call configure_jvm() first.") +def launch_egps_treeview( + tree: Tree, + jvm_opts: Optional[Sequence[str]] = None, + log_file_name: str = "egps.log.file", + config_templete: Optional[Sequence[str]] = None, + extra_configs: Optional[Sequence[str]] = None, + +) -> subprocess.Popen: + """ + Start a Swing-based JAR and return the Popen handle. + + Parameters + ---------- + tree: Tree + The ete4 tree instance + jvm_opts : list[str] | None + Extra JVM flags, e.g. ["-Xmx2G", "-Dmy.prop=value"]. + """ + + if not config_egps_file.exists(): + raise FileNotFoundError(f"Please configure eGPS software path first, use configure_egps()") + egps_installed_path,java_bin = get_user_egps_configure() + if config_templete: + config_file_template_suffix = config_templete + else: + config_file_template_suffix = config_file_default_template + + output_config_list = [] + if extra_configs: + output_config_list.append(extra_configs) + + + cmd = [java_bin,"-cp", "./eGPS_lib/*;.","@eGPS2.args","-splash:./laucher.gif","-Xss2m","-Xms7g","-Xmx8g"] + if jvm_opts: + cmd += list(jvm_opts) + + tmp_config_file = Path("temp.egps.modern.tree.view.txt") + path_of_config = tmp_config_file.resolve().as_posix() + + cmd += ["api.rpython.ModernTreeViewPyLauncher", path_of_config] + # cmd = ["python", "-c", "import os, sys; print(os.getcwd())"] # test for the cwd + print(f"[RUN CMD:] {cmd}") + # ② 处理日志 + log_file = open(log_file_name, "a") + stdout = log_file + stderr = log_file + + # ③ 跨平台独立 / 进程组设置 + system = platform.system() + creationflags = 0 + preexec_fn = None + + proc = subprocess.Popen( + cmd, + cwd = egps_installed_path, + stdout=stdout, + stderr=stderr, + creationflags=creationflags, + preexec_fn=preexec_fn, + text=True, + ) + tmp_tree_file = Path("temp.tree.nwk") + + tree.write(outfile=tmp_tree_file) + output_config_list.append(f"$input.nwk.path={tmp_tree_file.resolve().as_posix()}") + output_config_list.extend(config_file_template_suffix) + + tmp_config_file.write_text("\n".join(output_config_list)) + + print(f"[INFO] GUI launched (pid={proc.pid})") + return proc + diff --git a/pyproject.toml b/pyproject.toml index 95af9fa0c..afdf7e693 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,53 +1,53 @@ -[build-system] -requires = ["setuptools>=61.0", "cython"] -build-backend = "setuptools.build_meta" - -[project] -name = "ete4" -description = "A Python Environment for (phylogenetic) Tree Exploration" -version = "4.3.0" -authors = [ - { name = "Jaime Huerta-Cepas", email = "jhcepas@gmail.com" }, - { name = "Jordi Burguet-Castell", email = "jordi.burguet.castell@gmail.com" }, -] -readme = "README.md" -license = "GPL-3.0-or-later" -license-files = [ "LICENSE" ] -requires-python = ">=3.7" -classifiers = [ - "Programming Language :: Python :: 3", - "Development Status :: 6 - Mature", - "Environment :: Console", - "Environment :: X11 Applications :: Qt", - "Intended Audience :: Developers", - "Intended Audience :: Other Audience", - "Intended Audience :: Science/Research", - "Natural Language :: English", - "Operating System :: MacOS", - "Operating System :: Microsoft :: Windows", - "Operating System :: POSIX :: Linux", - "Topic :: Scientific/Engineering :: Bio-Informatics", - "Topic :: Scientific/Engineering :: Visualization", - "Topic :: Software Development :: Libraries :: Python Modules", -] -dependencies = [ "bottle", "brotli", "numpy", "scipy", "requests" ] - -[project.urls] -"Homepage" = "http://etetoolkit.org" - -[project.scripts] -ete4 = "ete4.tools.ete:main" - -[project.optional-dependencies] -treeview = [ "pyqt6" ] -render_sm = [ "selenium" ] -treediff = [ "lap" ] -test = [ "pytest>=6.0" ] -doc = [ "sphinx" ] - -[tool.setuptools] -ext-modules = [ - { name = "ete4.core.tree", sources = [ "ete4/core/tree.pyx" ] }, - { name = "ete4.core.operations", sources = [ "ete4/core/operations.pyx" ] }, - { name = "ete4.parser.newick", sources = [ "ete4/parser/newick.pyx" ] }, -] +[build-system] +requires = ["setuptools>=61.0", "cython"] +build-backend = "setuptools.build_meta" + +[project] +name = "ete4" +description = "A Python Environment for (phylogenetic) Tree Exploration" +version = "4.3.0" +authors = [ + { name = "Jaime Huerta-Cepas", email = "jhcepas@gmail.com" }, + { name = "Jordi Burguet-Castell", email = "jordi.burguet.castell@gmail.com" }, +] +readme = "README.md" +license = "GPL-3.0-or-later" +license-files = [ "LICENSE" ] +requires-python = ">=3.7" +classifiers = [ + "Programming Language :: Python :: 3", + "Development Status :: 6 - Mature", + "Environment :: Console", + "Environment :: X11 Applications :: Qt", + "Intended Audience :: Developers", + "Intended Audience :: Other Audience", + "Intended Audience :: Science/Research", + "Natural Language :: English", + "Operating System :: MacOS", + "Operating System :: Microsoft :: Windows", + "Operating System :: POSIX :: Linux", + "Topic :: Scientific/Engineering :: Bio-Informatics", + "Topic :: Scientific/Engineering :: Visualization", + "Topic :: Software Development :: Libraries :: Python Modules", +] +dependencies = [ "bottle", "brotli", "numpy", "scipy", "requests" ] + +[project.urls] +"Homepage" = "http://etetoolkit.org" + +[project.scripts] +ete4 = "ete4.tools.ete:main" + +[project.optional-dependencies] +treeview = [ "pyqt6" ] +render_sm = [ "selenium" ] +treediff = [ "lap" ] +test = [ "pytest>=6.0" ] +doc = [ "sphinx" ] + +[tool.setuptools] +ext-modules = [ + { name = "ete4.core.tree", sources = [ "ete4/core/tree.pyx" ] }, + { name = "ete4.core.operations", sources = [ "ete4/core/operations.pyx" ] }, + { name = "ete4.parser.newick", sources = [ "ete4/parser/newick.pyx" ] }, +]