diff --git a/.coveragerc b/.coveragerc index 9b1c27c6..52ed847a 100644 --- a/.coveragerc +++ b/.coveragerc @@ -4,7 +4,6 @@ include = *glances* omit = - setup.py glances/outputs/* glances/exports/* glances/compat.py diff --git a/README.rst b/README.rst index 7fbc4319..7584e26f 100644 --- a/README.rst +++ b/README.rst @@ -341,9 +341,7 @@ To install Glances from source: .. code-block:: console - $ wget https://github.com/nicolargo/glances/archive/vX.Y.tar.gz -O - | tar xz - $ cd glances-* - # python setup.py install + $ pip install https://github.com/nicolargo/glances/archive/vX.Y.tar.gz *Note*: Python headers are required to install psutil. diff --git a/glances/__init__.py b/glances/__init__.py index 5861bf80..2683afd1 100644 --- a/glances/__init__.py +++ b/glances/__init__.py @@ -15,11 +15,15 @@ import platform import signal import sys import tracemalloc +from importlib import metadata # Global name # Version should start and end with a numerical char # See https://packaging.python.org/specifications/core-metadata/#version -__version__ = '4.3.0_dev01' +try: + __version__ = metadata.version("glances") +except metadata.PackageNotFoundError: + __version__ = "0.0.0+unknown" __apiversion__ = '4' __author__ = 'Nicolas Hennion ' __license__ = 'LGPLv3' diff --git a/pyproject.toml b/pyproject.toml index 6dac1fbf..5e9328ef 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,3 +1,93 @@ +[project] +name = "Glances" +version = "4.3.0_dev01" +description = "A cross-platform curses-based monitoring tool" +keywords = ["cli", "curses", "monitoring", "system"] +readme = "README.rst" +authors = [{ name = "Nicolas Hennion", email = "nicolas@nicolargo.com" }] +classifiers = [ + "Development Status :: 5 - Production/Stable", + "Environment :: Console :: Curses", + "Environment :: Web Environment", + "Framework :: FastAPI", + "Intended Audience :: Developers", + "Intended Audience :: End Users/Desktop", + "Intended Audience :: System Administrators", + "License :: OSI Approved :: GNU Lesser General Public License v3 (LGPLv3)", + "Operating System :: OS Independent", + "Programming Language :: Python :: 3", + "Programming Language :: Python :: 3.8", + "Programming Language :: Python :: 3.9", + "Programming Language :: Python :: 3.10", + "Programming Language :: Python :: 3.11", + "Programming Language :: Python :: 3.12", + "Topic :: System :: Monitoring", +] +requires-python = ">=3.8" +dependencies = [ + "defusedxml", + "packaging", + "psutil>=5.6.7", + "fastapi>=0.82.0; platform_system == 'Windows'", + "uvicorn; platform_system == 'Windows'", + "jinja2; platform_system == 'Windows'", + "requests; platform_system == 'Windows'", +] +license = { text = "LGPLv3" } +urls.Homepage = "https://github.com/nicolargo/glances" + +[project.optional-dependencies] +action = ["chevron"] +browser = ["zeroconf>=0.19.1"] +cloud = ["requests"] +containers = ["docker>=6.1.1", "packaging", "podman", "python-dateutil", "six"] +export = [ + "bernhard", + "cassandra-driver", + "elasticsearch", + "graphitesender", + "ibmcloudant", + "influxdb-client", + "influxdb>=1.0.0", + "kafka-python", + "paho-mqtt", + "pika", + "potsdb", + "prometheus_client", + "pymongo", + "pyzmq", + "statsd", +] +gpu = ["nvidia-ml-py"] +graph = ["pygal"] +ip = ["netifaces"] +raid = ["pymdstat"] +sensors = ["batinfo; platform_system == 'Linux'"] +smart = ["pySMART.smartx"] +snmp = ["pysnmp"] +sparklines = ["sparklines"] +web = ["fastapi>=0.82.0", "jinja2", "requests", "uvicorn"] +wifi = ["wifi"] +all = ["glances[action,browser,cloud,containers,export,gpu,graph,ip,raid,sensors,smart,snmp,sparklines,web,wifi]"] + +[project.scripts] +glances = "glances:main" + +[tool.setuptools.data-files] +"share/doc/glances" = [ + "AUTHORS", + "COPYING", + "NEWS.rst", + "README.rst", + "SECURITY.md", + "CONTRIBUTING.md", + "conf/glances.conf", +] +"share/man/man1" = ["docs/man/glances.1"] + +[tool.setuptools.packages.find] +include = ["glances*"] + [tool.ruff] line-length = 120 target-version = "py38" @@ -65,4 +155,8 @@ dummy-variable-rgx = "^(_+|(_+[a-zA-Z0-9_]*[a-zA-Z0-9]+?))$" [tool.ruff.lint.mccabe] # Unlike Flake8, default to a complexity level of 10. -max-complexity = 21 \ No newline at end of file +max-complexity = 21 + +[build-system] +requires = ["setuptools>=68"] +build-backend = "setuptools.build_meta" diff --git a/setup.py b/setup.py deleted file mode 100755 index eb1fb5c8..00000000 --- a/setup.py +++ /dev/null @@ -1,159 +0,0 @@ -#!/usr/bin/env python - -import builtins -import glob -import os -import re -import sys - -from setuptools import Command, setup - -# If the minimal Python version is changed then do not forget to change it in: -# - ./pyproject.toml -# - .github/workflows/test.yml -if not (sys.version_info >= (3, 8)): - print('Glances requires at least Python 3.8 to run.') - sys.exit(1) - -# Global functions -################## - -with builtins.open(os.path.join('glances', '__init__.py'), encoding='utf-8') as f: - version = re.search(r"^__version__ = ['\"]([^'\"]*)['\"]", f.read(), re.M).group(1) - -if not version: - raise RuntimeError('Cannot find Glances version information.') - -with builtins.open('README.rst', encoding='utf-8') as f: - long_description = f.read() - - -def get_data_files(): - return [ - ( - 'share/doc/glances', - ['AUTHORS', 'COPYING', 'NEWS.rst', 'README.rst', "SECURITY.md", 'CONTRIBUTING.md', 'conf/glances.conf'], - ), - ('share/man/man1', ['docs/man/glances.1']), - ] - - -def get_install_requires(): - required = [] - with open('requirements.txt') as f: - required = f.read().splitlines() - - # On Windows, install WebUI by default - if sys.platform.startswith('win'): - required.append('fastapi>=0.82.0') - required.append('uvicorn') - required.append('jinja2') - required.append('requests') - - return required - - -def get_install_extras_require(): - extras_require = { - 'action': ['chevron'], - 'browser': ['zeroconf>=0.19.1'], - 'cloud': ['requests'], - 'containers': ['docker>=6.1.1', 'python-dateutil', 'six', 'podman', 'packaging'], - 'export': [ - 'bernhard', - 'cassandra-driver', - 'elasticsearch', - 'graphitesender', - 'ibmcloudant', - 'influxdb>=1.0.0', - 'influxdb-client', - 'pymongo', - 'kafka-python', - 'pika', - 'paho-mqtt', - 'potsdb', - 'prometheus_client', - 'pyzmq', - 'statsd', - ], - 'gpu': ['nvidia-ml-py'], - 'graph': ['pygal'], - 'ip': ['netifaces'], - 'raid': ['pymdstat'], - 'smart': ['pySMART.smartx'], - 'snmp': ['pysnmp'], - 'sparklines': ['sparklines'], - 'web': ['fastapi>=0.82.0', 'uvicorn', 'jinja2', 'requests'], - 'wifi': ['wifi'], - } - if sys.platform.startswith('linux'): - extras_require['sensors'] = ['batinfo'] - - # Add automatically the 'all' target - extras_require['all'] = [] - for p in extras_require.values(): - extras_require['all'].extend(p) - - return extras_require - - -class tests(Command): - user_options = [] - - def initialize_options(self): - pass - - def finalize_options(self): - pass - - def run(self): - import subprocess - import sys - - for t in glob.glob('unittest-core.py'): - ret = subprocess.call([sys.executable, t]) != 0 - if ret != 0: - raise SystemExit(ret) - raise SystemExit(0) - - -# Setup ! - -setup( - name='Glances', - version=version, - description="A cross-platform curses-based monitoring tool", - long_description=long_description, - author='Nicolas Hennion', - author_email='nicolas@nicolargo.com', - url='https://github.com/nicolargo/glances', - license='LGPLv3', - keywords="cli curses monitoring system", - python_requires=">=3.8", - install_requires=get_install_requires(), - extras_require=get_install_extras_require(), - packages=['glances'], - include_package_data=True, - data_files=get_data_files(), - cmdclass={'test': tests}, - test_suite="unittest-core.py", - entry_points={"console_scripts": ["glances=glances:main"]}, - classifiers=[ - 'Development Status :: 5 - Production/Stable', - 'Environment :: Console :: Curses', - 'Environment :: Web Environment', - 'Framework :: FastAPI', - 'Intended Audience :: Developers', - 'Intended Audience :: End Users/Desktop', - 'Intended Audience :: System Administrators', - 'License :: OSI Approved :: GNU Lesser General Public License v3 (LGPLv3)', - 'Operating System :: OS Independent', - 'Programming Language :: Python :: 3', - 'Programming Language :: Python :: 3.8', - 'Programming Language :: Python :: 3.9', - 'Programming Language :: Python :: 3.10', - 'Programming Language :: Python :: 3.11', - 'Programming Language :: Python :: 3.12', - 'Topic :: System :: Monitoring', - ], -)