diff --git a/poetry.lock b/poetry.lock index e57e6287c..0700cef0a 100644 --- a/poetry.lock +++ b/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" diff --git a/pyproject.toml b/pyproject.toml index aa6b74cc4..68b4c6727 100644 --- a/pyproject.toml +++ b/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" diff --git a/reflex/reflex.py b/reflex/reflex.py index 970320650..fe536c807 100644 --- a/reflex/reflex.py +++ b/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) diff --git a/reflex/utils/exec.py b/reflex/utils/exec.py index a87238102..d246d5111 100644 --- a/reflex/utils/exec.py +++ b/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() diff --git a/reflex/utils/prerequisites.py b/reflex/utils/prerequisites.py index b6cba6c10..952860b8b 100644 --- a/reflex/utils/prerequisites.py +++ b/reflex/utils/prerequisites.py @@ -31,20 +31,30 @@ def check_node_version() -> bool: Returns: Whether the version of Node.js is valid. """ - try: - # Run the node -v command and capture the output. - result = processes.new_process([constants.NODE_PATH, "-v"], run=True) - except FileNotFoundError: + 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 - # 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) - ) + +def get_node_version() -> Optional[version.Version]: + """Get the version of node. + + Returns: + The version of node. + """ + try: + 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 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. diff --git a/tests/test_utils.py b/tests/test_utils.py index 2f6b85d74..3ba4d7cb4 100644 --- a/tests/test_utils.py +++ b/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()