浏览代码

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

Thomas Brandého 1 年之前
父节点
当前提交
f771894077
共有 6 个文件被更改,包括 123 次插入129 次删除
  1. 18 101
      poetry.lock
  2. 1 0
      pyproject.toml
  3. 12 0
      reflex/reflex.py
  4. 50 1
      reflex/utils/exec.py
  5. 21 26
      reflex/utils/prerequisites.py
  6. 21 1
      tests/test_utils.py

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

+ 12 - 0
reflex/reflex.py

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

+ 50 - 1
reflex/utils/exec.py

@@ -3,11 +3,13 @@
 from __future__ import annotations
 from __future__ import annotations
 
 
 import os
 import os
+import platform
+import sys
 from pathlib import Path
 from pathlib import Path
 
 
 from reflex import constants
 from reflex import constants
 from reflex.config import get_config
 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
 from reflex.utils.watch import AssetFolderWatch
 
 
 
 
@@ -154,3 +156,50 @@ def run_backend_prod(
         str(num_workers),
         str(num_workers),
     ]
     ]
     processes.new_process(command, run=True, show_logs=True)
     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:
     Returns:
         Whether the version of Node.js is valid.
         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:
     try:
-        # Run the node -v command and capture the output.
         result = processes.new_process([constants.NODE_PATH, "-v"], run=True)
         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:
     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]:
 def get_bun_version() -> Optional[version.Version]:
@@ -61,21 +71,6 @@ def get_bun_version() -> Optional[version.Version]:
         return None
         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:
 def get_install_package_manager() -> str:
     """Get the package manager executable for installation.
     """Get the package manager executable for installation.
       currently on unix systems, bun is used for installation only.
       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 import Env, constants
 from reflex.base import Base
 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
 from reflex.vars import Var
 
 
 
 
@@ -599,3 +606,16 @@ def test_create_reflex_dir(mocker, is_windows):
     prerequisites.initialize_frontend_dependencies()
     prerequisites.initialize_frontend_dependencies()
 
 
     assert create_cmd.called
     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()