1
0
Эх сурвалжийг харах

add system infos to output when in loglevel debug (#1567)

Thomas Brandého 1 жил өмнө
parent
commit
f771894077

+ 18 - 101
poetry.lock

@@ -1,10 +1,9 @@
-# This file is automatically @generated by Poetry 1.4.2 and should not be changed by hand.
+# This file is automatically @generated by Poetry 1.5.1 and should not be changed by hand.
 
 [[package]]
 name = "alembic"
 version = "1.11.1"
 description = "A database migration tool for SQLAlchemy."
-category = "main"
 optional = false
 python-versions = ">=3.7"
 files = [
@@ -26,7 +25,6 @@ tz = ["python-dateutil"]
 name = "anyio"
 version = "3.7.1"
 description = "High level compatibility layer for multiple asynchronous event loop implementations"
-category = "main"
 optional = false
 python-versions = ">=3.7"
 files = [
@@ -49,7 +47,6 @@ trio = ["trio (<0.22)"]
 name = "async-timeout"
 version = "4.0.2"
 description = "Timeout context manager for asyncio programs"
-category = "main"
 optional = false
 python-versions = ">=3.6"
 files = [
@@ -64,7 +61,6 @@ typing-extensions = {version = ">=3.6.5", markers = "python_version < \"3.8\""}
 name = "asynctest"
 version = "0.13.0"
 description = "Enhance the standard unittest package with features for testing asyncio libraries"
-category = "dev"
 optional = false
 python-versions = ">=3.5"
 files = [
@@ -76,7 +72,6 @@ files = [
 name = "attrs"
 version = "23.1.0"
 description = "Classes Without Boilerplate"
-category = "dev"
 optional = false
 python-versions = ">=3.7"
 files = [
@@ -98,7 +93,6 @@ tests-no-zope = ["cloudpickle", "hypothesis", "mypy (>=1.1.1)", "pympler", "pyte
 name = "bidict"
 version = "0.22.1"
 description = "The bidirectional mapping library for Python."
-category = "main"
 optional = false
 python-versions = ">=3.7"
 files = [
@@ -115,7 +109,6 @@ test = ["hypothesis", "pytest", "pytest-benchmark[histogram]", "pytest-cov", "py
 name = "black"
 version = "22.12.0"
 description = "The uncompromising code formatter."
-category = "dev"
 optional = false
 python-versions = ">=3.7"
 files = [
@@ -152,7 +145,6 @@ uvloop = ["uvloop (>=0.15.2)"]
 name = "certifi"
 version = "2023.7.22"
 description = "Python package for providing Mozilla's CA Bundle."
-category = "main"
 optional = false
 python-versions = ">=3.6"
 files = [
@@ -164,7 +156,6 @@ files = [
 name = "cffi"
 version = "1.15.1"
 description = "Foreign Function Interface for Python calling C code."
-category = "dev"
 optional = false
 python-versions = "*"
 files = [
@@ -241,7 +232,6 @@ pycparser = "*"
 name = "cfgv"
 version = "3.3.1"
 description = "Validate configuration and produce human readable error messages."
-category = "dev"
 optional = false
 python-versions = ">=3.6.1"
 files = [
@@ -253,7 +243,6 @@ files = [
 name = "click"
 version = "8.1.6"
 description = "Composable command line interface toolkit"
-category = "main"
 optional = false
 python-versions = ">=3.7"
 files = [
@@ -269,7 +258,6 @@ importlib-metadata = {version = "*", markers = "python_version < \"3.8\""}
 name = "cloudpickle"
 version = "2.2.1"
 description = "Extended pickling support for Python objects"
-category = "main"
 optional = false
 python-versions = ">=3.6"
 files = [
@@ -281,7 +269,6 @@ files = [
 name = "colorama"
 version = "0.4.6"
 description = "Cross-platform colored terminal text."
-category = "main"
 optional = false
 python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7"
 files = [
@@ -293,7 +280,6 @@ files = [
 name = "coverage"
 version = "7.2.7"
 description = "Code coverage measurement for Python"
-category = "dev"
 optional = false
 python-versions = ">=3.7"
 files = [
@@ -369,7 +355,6 @@ toml = ["tomli"]
 name = "darglint"
 version = "1.8.1"
 description = "A utility for ensuring Google-style docstrings stay up to date with the source code."
-category = "dev"
 optional = false
 python-versions = ">=3.6,<4.0"
 files = [
@@ -381,7 +366,6 @@ files = [
 name = "distlib"
 version = "0.3.7"
 description = "Distribution utilities"
-category = "dev"
 optional = false
 python-versions = "*"
 files = [
@@ -389,11 +373,21 @@ files = [
     {file = "distlib-0.3.7.tar.gz", hash = "sha256:9dafe54b34a028eafd95039d5e5d4851a13734540f1331060d31c9916e7147a8"},
 ]
 
+[[package]]
+name = "distro"
+version = "1.8.0"
+description = "Distro - an OS platform information API"
+optional = false
+python-versions = ">=3.6"
+files = [
+    {file = "distro-1.8.0-py3-none-any.whl", hash = "sha256:99522ca3e365cac527b44bde033f64c6945d90eb9f769703caaec52b09bbd3ff"},
+    {file = "distro-1.8.0.tar.gz", hash = "sha256:02e111d1dc6a50abb8eed6bf31c3e48ed8b0830d1ea2a1b78c61765c2513fdd8"},
+]
+
 [[package]]
 name = "exceptiongroup"
 version = "1.1.2"
 description = "Backport of PEP 654 (exception groups)"
-category = "main"
 optional = false
 python-versions = ">=3.7"
 files = [
@@ -408,7 +402,6 @@ test = ["pytest (>=6)"]
 name = "fastapi"
 version = "0.96.1"
 description = "FastAPI framework, high performance, easy to learn, fast to code, ready for production"
-category = "main"
 optional = false
 python-versions = ">=3.7"
 files = [
@@ -430,7 +423,6 @@ test = ["anyio[trio] (>=3.2.1,<4.0.0)", "black (==23.1.0)", "coverage[toml] (>=6
 name = "filelock"
 version = "3.12.2"
 description = "A platform independent file lock."
-category = "dev"
 optional = false
 python-versions = ">=3.7"
 files = [
@@ -446,7 +438,6 @@ testing = ["covdefaults (>=2.3)", "coverage (>=7.2.7)", "diff-cover (>=7.5)", "p
 name = "greenlet"
 version = "2.0.2"
 description = "Lightweight in-process concurrent programming"
-category = "main"
 optional = false
 python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*"
 files = [
@@ -520,7 +511,6 @@ test = ["objgraph", "psutil"]
 name = "gunicorn"
 version = "20.1.0"
 description = "WSGI HTTP Server for UNIX"
-category = "main"
 optional = false
 python-versions = ">=3.5"
 files = [
@@ -541,7 +531,6 @@ tornado = ["tornado (>=0.2)"]
 name = "h11"
 version = "0.14.0"
 description = "A pure-Python, bring-your-own-I/O implementation of HTTP/1.1"
-category = "main"
 optional = false
 python-versions = ">=3.7"
 files = [
@@ -556,7 +545,6 @@ typing-extensions = {version = "*", markers = "python_version < \"3.8\""}
 name = "httpcore"
 version = "0.17.3"
 description = "A minimal low-level HTTP client."
-category = "main"
 optional = false
 python-versions = ">=3.7"
 files = [
@@ -568,17 +556,16 @@ files = [
 anyio = ">=3.0,<5.0"
 certifi = "*"
 h11 = ">=0.13,<0.15"
-sniffio = ">=1.0.0,<2.0.0"
+sniffio = "==1.*"
 
 [package.extras]
 http2 = ["h2 (>=3,<5)"]
-socks = ["socksio (>=1.0.0,<2.0.0)"]
+socks = ["socksio (==1.*)"]
 
 [[package]]
 name = "httpx"
 version = "0.24.1"
 description = "The next generation HTTP client."
-category = "main"
 optional = false
 python-versions = ">=3.7"
 files = [
@@ -594,15 +581,14 @@ sniffio = "*"
 
 [package.extras]
 brotli = ["brotli", "brotlicffi"]
-cli = ["click (>=8.0.0,<9.0.0)", "pygments (>=2.0.0,<3.0.0)", "rich (>=10,<14)"]
+cli = ["click (==8.*)", "pygments (==2.*)", "rich (>=10,<14)"]
 http2 = ["h2 (>=3,<5)"]
-socks = ["socksio (>=1.0.0,<2.0.0)"]
+socks = ["socksio (==1.*)"]
 
 [[package]]
 name = "identify"
 version = "2.5.26"
 description = "File identification library for Python"
-category = "dev"
 optional = false
 python-versions = ">=3.8"
 files = [
@@ -617,7 +603,6 @@ license = ["ukkonen"]
 name = "idna"
 version = "3.4"
 description = "Internationalized Domain Names in Applications (IDNA)"
-category = "main"
 optional = false
 python-versions = ">=3.5"
 files = [
@@ -629,7 +614,6 @@ files = [
 name = "importlib-metadata"
 version = "6.7.0"
 description = "Read metadata from Python packages"
-category = "main"
 optional = false
 python-versions = ">=3.7"
 files = [
@@ -650,7 +634,6 @@ testing = ["flufl.flake8", "importlib-resources (>=1.3)", "packaging", "pyfakefs
 name = "importlib-resources"
 version = "5.12.0"
 description = "Read resources from Python packages"
-category = "main"
 optional = false
 python-versions = ">=3.7"
 files = [
@@ -669,7 +652,6 @@ testing = ["flake8 (<5)", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-chec
 name = "iniconfig"
 version = "2.0.0"
 description = "brain-dead simple config-ini parsing"
-category = "dev"
 optional = false
 python-versions = ">=3.7"
 files = [
@@ -681,7 +663,6 @@ files = [
 name = "jinja2"
 version = "3.1.2"
 description = "A very fast and expressive template engine."
-category = "main"
 optional = false
 python-versions = ">=3.7"
 files = [
@@ -699,7 +680,6 @@ i18n = ["Babel (>=2.7)"]
 name = "mako"
 version = "1.2.4"
 description = "A super-fast templating language that borrows the best ideas from the existing templating languages."
-category = "main"
 optional = false
 python-versions = ">=3.7"
 files = [
@@ -720,7 +700,6 @@ testing = ["pytest"]
 name = "markdown-it-py"
 version = "2.2.0"
 description = "Python port of markdown-it. Markdown parsing, done right!"
-category = "main"
 optional = false
 python-versions = ">=3.7"
 files = [
@@ -746,7 +725,6 @@ testing = ["coverage", "pytest", "pytest-cov", "pytest-regressions"]
 name = "markupsafe"
 version = "2.1.3"
 description = "Safely add untrusted strings to HTML/XML markup."
-category = "main"
 optional = false
 python-versions = ">=3.7"
 files = [
@@ -806,7 +784,6 @@ files = [
 name = "mdurl"
 version = "0.1.2"
 description = "Markdown URL utilities"
-category = "main"
 optional = false
 python-versions = ">=3.7"
 files = [
@@ -818,7 +795,6 @@ files = [
 name = "mypy-extensions"
 version = "1.0.0"
 description = "Type system extensions for programs checked with the mypy type checker."
-category = "dev"
 optional = false
 python-versions = ">=3.5"
 files = [
@@ -830,7 +806,6 @@ files = [
 name = "nodeenv"
 version = "1.8.0"
 description = "Node.js virtual environment builder"
-category = "dev"
 optional = false
 python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*"
 files = [
@@ -845,7 +820,6 @@ setuptools = "*"
 name = "numpy"
 version = "1.21.6"
 description = "NumPy is the fundamental package for array computing with Python."
-category = "dev"
 optional = false
 python-versions = ">=3.7,<3.11"
 files = [
@@ -886,7 +860,6 @@ files = [
 name = "numpy"
 version = "1.24.4"
 description = "Fundamental package for array computing in Python"
-category = "dev"
 optional = false
 python-versions = ">=3.8"
 files = [
@@ -924,7 +897,6 @@ files = [
 name = "numpy"
 version = "1.25.2"
 description = "Fundamental package for array computing in Python"
-category = "dev"
 optional = false
 python-versions = ">=3.9"
 files = [
@@ -959,7 +931,6 @@ files = [
 name = "outcome"
 version = "1.2.0"
 description = "Capture the outcome of Python function calls."
-category = "dev"
 optional = false
 python-versions = ">=3.7"
 files = [
@@ -974,7 +945,6 @@ attrs = ">=19.2.0"
 name = "packaging"
 version = "23.1"
 description = "Core utilities for Python packages"
-category = "main"
 optional = false
 python-versions = ">=3.7"
 files = [
@@ -986,7 +956,6 @@ files = [
 name = "pandas"
 version = "1.1.5"
 description = "Powerful data structures for data analysis, time series, and statistics"
-category = "dev"
 optional = false
 python-versions = ">=3.6.1"
 files = [
@@ -1028,7 +997,6 @@ test = ["hypothesis (>=3.58)", "pytest (>=4.0.2)", "pytest-xdist"]
 name = "pandas"
 version = "1.5.3"
 description = "Powerful data structures for data analysis, time series, and statistics"
-category = "dev"
 optional = false
 python-versions = ">=3.8"
 files = [
@@ -1077,7 +1045,6 @@ test = ["hypothesis (>=5.5.3)", "pytest (>=6.0)", "pytest-xdist (>=1.31)"]
 name = "pathspec"
 version = "0.11.2"
 description = "Utility library for gitignore style pattern matching of file paths."
-category = "dev"
 optional = false
 python-versions = ">=3.7"
 files = [
@@ -1089,7 +1056,6 @@ files = [
 name = "platformdirs"
 version = "3.10.0"
 description = "A small Python package for determining appropriate platform-specific dirs, e.g. a \"user data dir\"."
-category = "main"
 optional = false
 python-versions = ">=3.7"
 files = [
@@ -1108,7 +1074,6 @@ test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=7.4)", "pytest-co
 name = "plotly"
 version = "5.15.0"
 description = "An open-source, interactive data visualization library for Python"
-category = "main"
 optional = false
 python-versions = ">=3.6"
 files = [
@@ -1124,7 +1089,6 @@ tenacity = ">=6.2.0"
 name = "pluggy"
 version = "1.2.0"
 description = "plugin and hook calling mechanisms for python"
-category = "dev"
 optional = false
 python-versions = ">=3.7"
 files = [
@@ -1143,7 +1107,6 @@ testing = ["pytest", "pytest-benchmark"]
 name = "pre-commit"
 version = "3.3.3"
 description = "A framework for managing and maintaining multi-language pre-commit hooks."
-category = "dev"
 optional = false
 python-versions = ">=3.8"
 files = [
@@ -1162,7 +1125,6 @@ virtualenv = ">=20.10.0"
 name = "psutil"
 version = "5.9.5"
 description = "Cross-platform lib for process and system monitoring in Python."
-category = "main"
 optional = false
 python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
 files = [
@@ -1189,7 +1151,6 @@ test = ["enum34", "ipaddress", "mock", "pywin32", "wmi"]
 name = "pycparser"
 version = "2.21"
 description = "C parser in Python"
-category = "dev"
 optional = false
 python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
 files = [
@@ -1201,7 +1162,6 @@ files = [
 name = "pydantic"
 version = "1.10.12"
 description = "Data validation and settings management using python type hints"
-category = "main"
 optional = false
 python-versions = ">=3.7"
 files = [
@@ -1254,7 +1214,6 @@ email = ["email-validator (>=1.0.3)"]
 name = "pygments"
 version = "2.15.1"
 description = "Pygments is a syntax highlighting package written in Python."
-category = "main"
 optional = false
 python-versions = ">=3.7"
 files = [
@@ -1269,7 +1228,6 @@ plugins = ["importlib-metadata"]
 name = "pyright"
 version = "1.1.318"
 description = "Command line wrapper for pyright"
-category = "dev"
 optional = false
 python-versions = ">=3.7"
 files = [
@@ -1289,7 +1247,6 @@ dev = ["twine (>=3.4.1)"]
 name = "pysocks"
 version = "1.7.1"
 description = "A Python SOCKS client module. See https://github.com/Anorov/PySocks for more information."
-category = "dev"
 optional = false
 python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
 files = [
@@ -1302,7 +1259,6 @@ files = [
 name = "pytest"
 version = "7.4.0"
 description = "pytest: simple powerful testing with Python"
-category = "dev"
 optional = false
 python-versions = ">=3.7"
 files = [
@@ -1326,7 +1282,6 @@ testing = ["argcomplete", "attrs (>=19.2.0)", "hypothesis (>=3.56)", "mock", "no
 name = "pytest-asyncio"
 version = "0.20.3"
 description = "Pytest support for asyncio"
-category = "dev"
 optional = false
 python-versions = ">=3.7"
 files = [
@@ -1346,7 +1301,6 @@ testing = ["coverage (>=6.2)", "flaky (>=3.5.0)", "hypothesis (>=5.7.1)", "mypy
 name = "pytest-cov"
 version = "4.1.0"
 description = "Pytest plugin for measuring coverage."
-category = "dev"
 optional = false
 python-versions = ">=3.7"
 files = [
@@ -1365,7 +1319,6 @@ testing = ["fields", "hunter", "process-tests", "pytest-xdist", "six", "virtuale
 name = "pytest-mock"
 version = "3.11.1"
 description = "Thin-wrapper around the mock package for easier use with pytest"
-category = "dev"
 optional = false
 python-versions = ">=3.7"
 files = [
@@ -1383,7 +1336,6 @@ dev = ["pre-commit", "pytest-asyncio", "tox"]
 name = "python-dateutil"
 version = "2.8.2"
 description = "Extensions to the standard Python datetime module"
-category = "dev"
 optional = false
 python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7"
 files = [
@@ -1398,7 +1350,6 @@ six = ">=1.5"
 name = "python-dotenv"
 version = "0.13.0"
 description = "Add .env support to your django/flask apps in development and deployments"
-category = "main"
 optional = false
 python-versions = "*"
 files = [
@@ -1413,7 +1364,6 @@ cli = ["click (>=5.0)"]
 name = "python-engineio"
 version = "4.5.1"
 description = "Engine.IO server and client for Python"
-category = "main"
 optional = false
 python-versions = ">=3.6"
 files = [
@@ -1430,7 +1380,6 @@ docs = ["sphinx"]
 name = "python-multipart"
 version = "0.0.5"
 description = "A streaming multipart parser for Python"
-category = "main"
 optional = false
 python-versions = "*"
 files = [
@@ -1444,7 +1393,6 @@ six = ">=1.4.0"
 name = "python-socketio"
 version = "5.8.0"
 description = "Socket.IO server and client for Python"
-category = "main"
 optional = false
 python-versions = ">=3.6"
 files = [
@@ -1464,7 +1412,6 @@ client = ["requests (>=2.21.0)", "websocket-client (>=0.54.0)"]
 name = "pytz"
 version = "2023.3"
 description = "World timezone definitions, modern and historical"
-category = "dev"
 optional = false
 python-versions = "*"
 files = [
@@ -1476,7 +1423,6 @@ files = [
 name = "pyyaml"
 version = "6.0.1"
 description = "YAML parser and emitter for Python"
-category = "dev"
 optional = false
 python-versions = ">=3.6"
 files = [
@@ -1526,7 +1472,6 @@ files = [
 name = "redis"
 version = "4.6.0"
 description = "Python client for Redis database and key-value store"
-category = "main"
 optional = false
 python-versions = ">=3.7"
 files = [
@@ -1547,7 +1492,6 @@ ocsp = ["cryptography (>=36.0.1)", "pyopenssl (==20.0.1)", "requests (>=2.26.0)"
 name = "rich"
 version = "13.5.1"
 description = "Render rich text, tables, progress bars, syntax highlighting, markdown and more to the terminal"
-category = "main"
 optional = false
 python-versions = ">=3.7.0"
 files = [
@@ -1567,7 +1511,6 @@ jupyter = ["ipywidgets (>=7.5.1,<9)"]
 name = "ruff"
 version = "0.0.244"
 description = "An extremely fast Python linter, written in Rust."
-category = "dev"
 optional = false
 python-versions = ">=3.7"
 files = [
@@ -1593,7 +1536,6 @@ files = [
 name = "selenium"
 version = "4.10.0"
 description = ""
-category = "dev"
 optional = false
 python-versions = ">=3.7"
 files = [
@@ -1611,7 +1553,6 @@ urllib3 = {version = ">=1.26,<3", extras = ["socks"]}
 name = "setuptools"
 version = "68.0.0"
 description = "Easily download, build, install, upgrade, and uninstall Python packages"
-category = "main"
 optional = false
 python-versions = ">=3.7"
 files = [
@@ -1628,7 +1569,6 @@ testing-integration = ["build[virtualenv]", "filelock (>=3.4.0)", "jaraco.envs (
 name = "six"
 version = "1.16.0"
 description = "Python 2 and 3 compatibility utilities"
-category = "main"
 optional = false
 python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*"
 files = [
@@ -1640,7 +1580,6 @@ files = [
 name = "sniffio"
 version = "1.3.0"
 description = "Sniff out which async library your code is running under"
-category = "main"
 optional = false
 python-versions = ">=3.7"
 files = [
@@ -1652,7 +1591,6 @@ files = [
 name = "sortedcontainers"
 version = "2.4.0"
 description = "Sorted Containers -- Sorted List, Sorted Dict, Sorted Set"
-category = "dev"
 optional = false
 python-versions = "*"
 files = [
@@ -1664,7 +1602,6 @@ files = [
 name = "sqlalchemy"
 version = "1.4.41"
 description = "Database Abstraction Library"
-category = "main"
 optional = false
 python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,>=2.7"
 files = [
@@ -1712,7 +1649,7 @@ files = [
 ]
 
 [package.dependencies]
-greenlet = {version = "!=0.4.17", markers = "python_version >= \"3\" and platform_machine == \"aarch64\" or python_version >= \"3\" and platform_machine == \"ppc64le\" or python_version >= \"3\" and platform_machine == \"x86_64\" or python_version >= \"3\" and platform_machine == \"amd64\" or python_version >= \"3\" and platform_machine == \"AMD64\" or python_version >= \"3\" and platform_machine == \"win32\" or python_version >= \"3\" and platform_machine == \"WIN32\""}
+greenlet = {version = "!=0.4.17", markers = "python_version >= \"3\" and (platform_machine == \"win32\" or platform_machine == \"WIN32\" or platform_machine == \"AMD64\" or platform_machine == \"amd64\" or platform_machine == \"x86_64\" or platform_machine == \"ppc64le\" or platform_machine == \"aarch64\")"}
 importlib-metadata = {version = "*", markers = "python_version < \"3.8\""}
 
 [package.extras]
@@ -1740,7 +1677,6 @@ sqlcipher = ["sqlcipher3-binary"]
 name = "sqlalchemy2-stubs"
 version = "0.0.2a35"
 description = "Typing Stubs for SQLAlchemy 1.4"
-category = "main"
 optional = false
 python-versions = ">=3.6"
 files = [
@@ -1755,7 +1691,6 @@ typing-extensions = ">=3.7.4"
 name = "sqlmodel"
 version = "0.0.8"
 description = "SQLModel, SQL databases in Python, designed for simplicity, compatibility, and robustness."
-category = "main"
 optional = false
 python-versions = ">=3.6.1,<4.0.0"
 files = [
@@ -1772,7 +1707,6 @@ sqlalchemy2-stubs = "*"
 name = "starlette"
 version = "0.27.0"
 description = "The little ASGI library that shines."
-category = "main"
 optional = false
 python-versions = ">=3.7"
 files = [
@@ -1791,7 +1725,6 @@ full = ["httpx (>=0.22.0)", "itsdangerous", "jinja2", "python-multipart", "pyyam
 name = "starlette-admin"
 version = "0.9.0"
 description = "Fast, beautiful and extensible administrative interface framework for Starlette/FastApi applications"
-category = "main"
 optional = false
 python-versions = ">=3.7"
 files = [
@@ -1814,7 +1747,6 @@ test = ["aiomysql (>=0.1.1,<0.2.0)", "aiosqlite (>=0.17.0,<0.20.0)", "arrow (>=1
 name = "tenacity"
 version = "8.2.2"
 description = "Retry code until it succeeds"
-category = "main"
 optional = false
 python-versions = ">=3.6"
 files = [
@@ -1829,7 +1761,6 @@ doc = ["reno", "sphinx", "tornado (>=4.5)"]
 name = "toml"
 version = "0.10.2"
 description = "Python Library for Tom's Obvious, Minimal Language"
-category = "dev"
 optional = false
 python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*"
 files = [
@@ -1841,7 +1772,6 @@ files = [
 name = "tomli"
 version = "2.0.1"
 description = "A lil' TOML parser"
-category = "dev"
 optional = false
 python-versions = ">=3.7"
 files = [
@@ -1853,7 +1783,6 @@ files = [
 name = "trio"
 version = "0.22.2"
 description = "A friendly Python library for async concurrency and I/O"
-category = "dev"
 optional = false
 python-versions = ">=3.7"
 files = [
@@ -1874,7 +1803,6 @@ sortedcontainers = "*"
 name = "trio-websocket"
 version = "0.10.3"
 description = "WebSocket library for Trio"
-category = "dev"
 optional = false
 python-versions = ">=3.7"
 files = [
@@ -1891,7 +1819,6 @@ wsproto = ">=0.14"
 name = "typed-ast"
 version = "1.5.5"
 description = "a fork of Python 2 and 3 ast modules with type comment support"
-category = "dev"
 optional = false
 python-versions = ">=3.6"
 files = [
@@ -1942,7 +1869,6 @@ files = [
 name = "typer"
 version = "0.4.2"
 description = "Typer, build great CLIs. Easy to code. Based on Python type hints."
-category = "main"
 optional = false
 python-versions = ">=3.6"
 files = [
@@ -1963,7 +1889,6 @@ test = ["black (>=22.3.0,<23.0.0)", "coverage (>=5.2,<6.0)", "isort (>=5.0.6,<6.
 name = "typing-extensions"
 version = "4.7.1"
 description = "Backported and Experimental Type Hints for Python 3.7+"
-category = "main"
 optional = false
 python-versions = ">=3.7"
 files = [
@@ -1975,7 +1900,6 @@ files = [
 name = "urllib3"
 version = "2.0.4"
 description = "HTTP library with thread-safe connection pooling, file post, and more."
-category = "dev"
 optional = false
 python-versions = ">=3.7"
 files = [
@@ -1996,7 +1920,6 @@ zstd = ["zstandard (>=0.18.0)"]
 name = "uvicorn"
 version = "0.20.0"
 description = "The lightning-fast ASGI server."
-category = "main"
 optional = false
 python-versions = ">=3.7"
 files = [
@@ -2016,7 +1939,6 @@ standard = ["colorama (>=0.4)", "httptools (>=0.5.0)", "python-dotenv (>=0.13)",
 name = "virtualenv"
 version = "20.24.2"
 description = "Virtual Python Environment builder"
-category = "dev"
 optional = false
 python-versions = ">=3.7"
 files = [
@@ -2037,7 +1959,6 @@ test = ["covdefaults (>=2.3)", "coverage (>=7.2.7)", "coverage-enable-subprocess
 name = "watchdog"
 version = "2.3.1"
 description = "Filesystem events monitoring"
-category = "main"
 optional = false
 python-versions = ">=3.6"
 files = [
@@ -2078,7 +1999,6 @@ watchmedo = ["PyYAML (>=3.10)"]
 name = "watchfiles"
 version = "0.19.0"
 description = "Simple, modern and high performance file watching and code reload in python."
-category = "main"
 optional = false
 python-versions = ">=3.7"
 files = [
@@ -2113,7 +2033,6 @@ anyio = ">=3.0.0"
 name = "websockets"
 version = "10.4"
 description = "An implementation of the WebSocket Protocol (RFC 6455 & 7692)"
-category = "main"
 optional = false
 python-versions = ">=3.7"
 files = [
@@ -2192,7 +2111,6 @@ files = [
 name = "wsproto"
 version = "1.2.0"
 description = "WebSockets state-machine based protocol implementation"
-category = "dev"
 optional = false
 python-versions = ">=3.7.0"
 files = [
@@ -2207,7 +2125,6 @@ h11 = ">=0.9.0,<1"
 name = "zipp"
 version = "3.15.0"
 description = "Backport of pathlib-compatible object wrapper for zip files"
-category = "main"
 optional = false
 python-versions = ">=3.7"
 files = [
@@ -2222,4 +2139,4 @@ testing = ["big-O", "flake8 (<5)", "jaraco.functools", "jaraco.itertools", "more
 [metadata]
 lock-version = "2.0"
 python-versions = "^3.7"
-content-hash = "ba03a445b7e59587264636a98b52595e020ae58570ac79b0fb1b9564c9769c59"
+content-hash = "7ba5a63b5a857eaa7e48c4addedd829727d6a074b60a1430e52ea7530547686a"

+ 1 - 0
pyproject.toml

@@ -47,6 +47,7 @@ python-dotenv = "^0.13.0"
 importlib-metadata = {version = "^6.7.0", python = ">=3.7, <3.8"}
 alembic = "^1.11.1"
 platformdirs = "^3.10.0"
+distro = {version = "^1.8.0", platform = "linux"}
 
 [tool.poetry.group.dev.dependencies]
 pytest = "^7.1.2"

+ 12 - 0
reflex/reflex.py

@@ -61,6 +61,9 @@ def init(
     # Set the log level.
     console.set_log_level(loglevel)
 
+    # Show system info
+    exec.output_system_info()
+
     # Get the app name.
     app_name = prerequisites.get_default_app_name() if name is None else name
     console.rule(f"[bold]Initializing {app_name}")
@@ -108,6 +111,9 @@ def run(
     # Set the log level.
     console.set_log_level(loglevel)
 
+    # Show system info
+    exec.output_system_info()
+
     # Set ports as os env variables to take precedence over config and
     # .env variables(if override_os_envs flag in config is set to False).
     build.set_os_env(
@@ -190,6 +196,9 @@ def deploy(
     # Set the log level.
     console.set_log_level(loglevel)
 
+    # Show system info
+    exec.output_system_info()
+
     # Get the app config.
     config = get_config()
 
@@ -239,6 +248,9 @@ def export(
     # Set the log level.
     console.set_log_level(loglevel)
 
+    # Show system info
+    exec.output_system_info()
+
     # Check that the app is initialized.
     prerequisites.check_initialized(frontend=frontend)
 

+ 50 - 1
reflex/utils/exec.py

@@ -3,11 +3,13 @@
 from __future__ import annotations
 
 import os
+import platform
+import sys
 from pathlib import Path
 
 from reflex import constants
 from reflex.config import get_config
-from reflex.utils import console, prerequisites, processes
+from reflex.utils import console, path_ops, prerequisites, processes
 from reflex.utils.watch import AssetFolderWatch
 
 
@@ -154,3 +156,50 @@ def run_backend_prod(
         str(num_workers),
     ]
     processes.new_process(command, run=True, show_logs=True)
+
+
+def output_system_info():
+    """Show system informations if the loglevel is in DEBUG."""
+    if console.LOG_LEVEL > constants.LogLevel.DEBUG:
+        return
+
+    console.rule(f"System Info")
+
+    dependencies = [
+        f"[Reflex {constants.VERSION} with Python {platform.python_version()} (PATH: {sys.executable})]",
+        f"[Node {prerequisites.get_node_version()} (Expected: {constants.NODE_VERSION}) (PATH:{constants.NODE_PATH})]",
+    ]
+
+    system = platform.system()
+
+    if system != "Windows":
+        dependencies.extend(
+            [
+                f"[NVM {constants.NVM_VERSION} (Expected: {constants.NVM_VERSION}) (PATH: {constants.NVM_PATH})]",
+                f"[Bun {prerequisites.get_bun_version()} (Expected: {constants.BUN_VERSION}) (PATH: {constants.BUN_PATH})]",
+            ],
+        )
+    else:
+        dependencies.append(
+            f"[FNM {constants.FNM_VERSION} (Expected: {constants.FNM_VERSION}) (PATH: {constants.FNM_EXE})]",
+        )
+
+    if system == "Linux":
+        import distro  # type: ignore
+
+        os_version = distro.name(pretty=True)
+    else:
+        os_version = platform.version()
+
+    dependencies.append(f"[OS {platform.system()} {os_version}]")
+
+    for dep in dependencies:
+        console.debug(f"{dep}")
+
+    console.debug(
+        f"Using package installer at: {prerequisites.get_install_package_manager()}"
+    )
+    console.debug(f"Using package executer at: {prerequisites.get_package_manager()}")
+    if system != "Windows":
+        console.debug(f"Unzip path: {path_ops.which('unzip')}")
+    # exit()

+ 21 - 26
reflex/utils/prerequisites.py

@@ -31,20 +31,30 @@ def check_node_version() -> bool:
     Returns:
         Whether the version of Node.js is valid.
     """
+    current_version = get_node_version()
+    if current_version:
+        # Compare the version numbers
+        return (
+            current_version >= version.parse(constants.NODE_VERSION_MIN)
+            if constants.IS_WINDOWS
+            else current_version == version.parse(constants.NODE_VERSION)
+        )
+    else:
+        return False
+
+
+def get_node_version() -> Optional[version.Version]:
+    """Get the version of node.
+
+    Returns:
+        The version of node.
+    """
     try:
-        # Run the node -v command and capture the output.
         result = processes.new_process([constants.NODE_PATH, "-v"], run=True)
+        # The output will be in the form "vX.Y.Z", but version.parse() can handle it
+        return version.parse(result.stdout)  # type: ignore
     except FileNotFoundError:
-        return False
-
-    # The output will be in the form "vX.Y.Z", but version.parse() can handle it
-    current_version = version.parse(result.stdout)  # type: ignore
-    # Compare the version numbers
-    return (
-        current_version >= version.parse(constants.NODE_VERSION_MIN)
-        if constants.IS_WINDOWS
-        else current_version == version.parse(constants.NODE_VERSION)
-    )
+        return None
 
 
 def get_bun_version() -> Optional[version.Version]:
@@ -61,21 +71,6 @@ def get_bun_version() -> Optional[version.Version]:
         return None
 
 
-def get_windows_package_manager() -> str:
-    """Get the package manager for windows.
-
-    Returns:
-        The path to the package manager for windows.
-
-    Raises:
-        FileNotFoundError: If bun or npm is not installed.
-    """
-    npm_path = path_ops.which("npm")
-    if npm_path is None:
-        raise FileNotFoundError("Reflex requires npm to be installed on Windows.")
-    return npm_path
-
-
 def get_install_package_manager() -> str:
     """Get the package manager executable for installation.
       currently on unix systems, bun is used for installation only.

+ 21 - 1
tests/test_utils.py

@@ -9,7 +9,14 @@ from packaging import version
 
 from reflex import Env, constants
 from reflex.base import Base
-from reflex.utils import build, format, imports, prerequisites, types
+from reflex.utils import (
+    build,
+    format,
+    imports,
+    prerequisites,
+    types,
+)
+from reflex.utils import exec as utils_exec
 from reflex.vars import Var
 
 
@@ -599,3 +606,16 @@ def test_create_reflex_dir(mocker, is_windows):
     prerequisites.initialize_frontend_dependencies()
 
     assert create_cmd.called
+
+
+def test_output_system_info(mocker):
+    """Make sure reflex does not crash dumping system info.
+
+    Args:
+        mocker: Pytest mocker object.
+
+    This test makes no assertions about the output, other than it executes
+    without crashing.
+    """
+    mocker.patch("reflex.utils.console.LOG_LEVEL", constants.LogLevel.DEBUG)
+    utils_exec.output_system_info()