From 68d001e29ab8f08bbd563694440cc7d74848c185 Mon Sep 17 00:00:00 2001 From: Mathieu Benoit Date: Sat, 16 Dec 2023 05:19:52 +0000 Subject: [PATCH 01/18] [FIX] poetry: Poetry version 1.3.1 to 1.5.1 and upgrade freeze versions --- poetry.lock | 1060 ++++++++++++++--------------- pyproject.toml | 74 +- requirements.txt | 19 + script/install/install_locally.sh | 2 +- 4 files changed, 578 insertions(+), 577 deletions(-) diff --git a/poetry.lock b/poetry.lock index 9d6c35e..c76deb6 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1,10 +1,9 @@ -# This file is automatically @generated by Poetry 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 = "acme" version = "2.6.0" description = "ACME protocol implementation in Python" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -29,7 +28,6 @@ test = ["pytest", "pytest-xdist", "typing-extensions"] name = "agithub" version = "2.2.2" description = "A lightweight, transparent syntax for REST clients" -category = "main" optional = false python-versions = "*" files = [ @@ -41,7 +39,6 @@ files = [ name = "aioshutil" version = "1.1" description = "Asynchronous shutil module." -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -53,7 +50,6 @@ files = [ name = "alabaster" version = "0.7.12" description = "A configurable sidebar-enabled Sphinx theme" -category = "main" optional = false python-versions = "*" files = [ @@ -65,7 +61,6 @@ files = [ name = "altair" version = "5.0.1" description = "Vega-Altair: A declarative statistical visualization library for Python." -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -86,11 +81,32 @@ typing-extensions = {version = ">=4.0.1", markers = "python_version < \"3.11\""} dev = ["black (<24)", "hatch", "ipython", "m2r", "mypy", "pandas-stubs", "pytest", "pytest-cov", "ruff", "types-jsonschema", "types-setuptools", "vega-datasets", "vl-convert-python"] doc = ["docutils", "geopandas", "jinja2", "myst-parser", "numpydoc", "pillow", "pydata-sphinx-theme", "sphinx", "sphinx-copybutton", "sphinx-design", "sphinxext-altair"] +[[package]] +name = "anyio" +version = "3.7.1" +description = "High level compatibility layer for multiple asynchronous event loop implementations" +optional = false +python-versions = ">=3.7" +files = [ + {file = "anyio-3.7.1-py3-none-any.whl", hash = "sha256:91dee416e570e92c64041bd18b900d1d6fa78dff7048769ce5ac5ddad004fbb5"}, + {file = "anyio-3.7.1.tar.gz", hash = "sha256:44a3c9aba0f5defa43261a8b3efb97891f2bd7d804e0e1f56419befa1adfc780"}, +] + +[package.dependencies] +exceptiongroup = {version = "*", markers = "python_version < \"3.11\""} +idna = ">=2.8" +sniffio = ">=1.1" +typing-extensions = {version = "*", markers = "python_version < \"3.8\""} + +[package.extras] +doc = ["Sphinx", "packaging", "sphinx-autodoc-typehints (>=1.2.0)", "sphinx-rtd-theme (>=1.2.2)", "sphinxcontrib-jquery"] +test = ["anyio[trio]", "coverage[toml] (>=4.5)", "hypothesis (>=4.0)", "mock (>=4)", "psutil (>=5.9)", "pytest (>=7.0)", "pytest-mock (>=3.6.1)", "trustme", "uvloop (>=0.17)"] +trio = ["trio (<0.22)"] + [[package]] name = "argcomplete" version = "3.1.1" description = "Bash tab completion for argparse" -category = "main" optional = false python-versions = ">=3.6" files = [ @@ -108,7 +124,6 @@ test = ["coverage", "mypy", "pexpect", "ruff", "wheel"] name = "asterisk" version = "0.0.8" description = "Tools for computing asset risk with respect to goals." -category = "main" optional = false python-versions = "*" files = [ @@ -122,7 +137,6 @@ requests = "*" name = "astor" version = "0.8.1" description = "Read/rewrite/write Python ASTs" -category = "main" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,>=2.7" files = [ @@ -134,7 +148,6 @@ files = [ name = "astroid" version = "2.12.13" description = "An abstract syntax tree for Python with inference support." -category = "main" optional = false python-versions = ">=3.7.2" files = [ @@ -155,7 +168,6 @@ wrapt = [ name = "attrs" version = "22.1.0" description = "Classes Without Boilerplate" -category = "main" optional = false python-versions = ">=3.5" files = [ @@ -171,69 +183,65 @@ tests-no-zope = ["cloudpickle", "coverage[toml] (>=5.0.2)", "hypothesis", "mypy [[package]] name = "azure-core" -version = "1.26.1" +version = "1.29.6" description = "Microsoft Azure Core Library for Python" -category = "main" optional = false python-versions = ">=3.7" files = [ - {file = "azure-core-1.26.1.zip", hash = "sha256:223b0e90cbdd1f03c41b195b03239899843f20d00964dbb85e64386873414a2d"}, - {file = "azure_core-1.26.1-py3-none-any.whl", hash = "sha256:726ffd1ded04a2c1cb53f9d9155cbb05ac5c1c2a29af4ef622e93e1c0a8bc92b"}, + {file = "azure-core-1.29.6.tar.gz", hash = "sha256:13b485252ecd9384ae624894fe51cfa6220966207264c360beada239f88b738a"}, + {file = "azure_core-1.29.6-py3-none-any.whl", hash = "sha256:604a005bce6a49ba661bb7b2be84a9b169047e52fcfcd0a4e4770affab4178f7"}, ] [package.dependencies] -requests = ">=2.18.4" +anyio = ">=3.0,<5.0" +requests = ">=2.21.0" six = ">=1.11.0" -typing-extensions = ">=4.0.1" +typing-extensions = ">=4.6.0" [package.extras] aio = ["aiohttp (>=3.0)"] [[package]] name = "azure-identity" -version = "1.13.0" +version = "1.15.0" description = "Microsoft Azure Identity Library for Python" -category = "main" optional = false python-versions = ">=3.7" files = [ - {file = "azure-identity-1.13.0.zip", hash = "sha256:c931c27301ffa86b07b4dcf574e29da73e3deba9ab5d1fe4f445bb6a3117e260"}, - {file = "azure_identity-1.13.0-py3-none-any.whl", hash = "sha256:bd700cebb80cd9862098587c29d8677e819beca33c62568ced6d5a8e5e332b82"}, + {file = "azure-identity-1.15.0.tar.gz", hash = "sha256:4c28fc246b7f9265610eb5261d65931183d019a23d4b0e99357facb2e6c227c8"}, + {file = "azure_identity-1.15.0-py3-none-any.whl", hash = "sha256:a14b1f01c7036f11f148f22cd8c16e05035293d714458d6b44ddf534d93eb912"}, ] [package.dependencies] -azure-core = ">=1.11.0,<2.0.0" +azure-core = ">=1.23.0,<2.0.0" cryptography = ">=2.5" -msal = ">=1.20.0,<2.0.0" +msal = ">=1.24.0,<2.0.0" msal-extensions = ">=0.3.0,<2.0.0" -six = ">=1.12.0" [[package]] name = "azure-storage-blob" -version = "12.16.0" +version = "12.19.0" description = "Microsoft Azure Blob Storage Client Library for Python" -category = "main" optional = false python-versions = ">=3.7" files = [ - {file = "azure-storage-blob-12.16.0.zip", hash = "sha256:43b45f19a518a5c6895632f263b3825ebc23574f25cc84b66e1630a6160e466f"}, - {file = "azure_storage_blob-12.16.0-py3-none-any.whl", hash = "sha256:91bb192b2a97939c4259c72373bac0f41e30810bbc853d5184f0f45904eacafd"}, + {file = "azure-storage-blob-12.19.0.tar.gz", hash = "sha256:26c0a4320a34a3c2a1b74528ba6812ebcb632a04cd67b1c7377232c4b01a5897"}, + {file = "azure_storage_blob-12.19.0-py3-none-any.whl", hash = "sha256:7bbc2c9c16678f7a420367fef6b172ba8730a7e66df7f4d7a55d5b3c8216615b"}, ] [package.dependencies] -azure-core = ">=1.26.0,<2.0.0" +azure-core = ">=1.28.0,<2.0.0" cryptography = ">=2.1.4" isodate = ">=0.6.1" -typing-extensions = ">=4.0.1" +typing-extensions = ">=4.3.0" [package.extras] -aio = ["azure-core[aio] (>=1.26.0,<2.0.0)"] +aio = ["azure-core[aio] (>=1.28.0,<2.0.0)"] [[package]] name = "babel" version = "2.9.1" description = "Internationalization utilities" -category = "main" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" files = [ @@ -248,7 +256,6 @@ pytz = ">=2015.7" name = "backports.zoneinfo" version = "0.2.1" description = "Backport of the standard library zoneinfo module" -category = "main" optional = false python-versions = ">=3.6" files = [ @@ -277,7 +284,6 @@ tzdata = ["tzdata"] name = "bcrypt" version = "4.0.1" description = "Modern password hashing for your software and your servers" -category = "main" optional = false python-versions = ">=3.6" files = [ @@ -312,7 +318,6 @@ typecheck = ["mypy"] name = "beautifulsoup4" version = "4.12.2" description = "Screen-scraping library" -category = "main" optional = false python-versions = ">=3.6.0" files = [ @@ -331,7 +336,6 @@ lxml = ["lxml"] name = "black" version = "22.3.0" description = "The uncompromising code formatter." -category = "main" optional = false python-versions = ">=3.6.2" files = [] @@ -362,7 +366,6 @@ resolved_reference = "ae2c0758c9e61a385df9700dc9c231bf54887041" name = "bokeh" version = "1.1.0" description = "Interactive plots and applications in the browser from Python" -category = "main" optional = false python-versions = "*" files = [ @@ -381,49 +384,49 @@ tornado = ">=4.3" [[package]] name = "boto3" -version = "1.28.0" +version = "1.33.13" description = "The AWS SDK for Python" -category = "main" optional = false python-versions = ">= 3.7" files = [ - {file = "boto3-1.28.0-py3-none-any.whl", hash = "sha256:ef81f63d38be25137c3ae9c6db2841c4cde82d1c7da9f8cb9f42f410c242d4f2"}, - {file = "boto3-1.28.0.tar.gz", hash = "sha256:8d43863e4769a5652efc32fd63430df58488cdb3fb85e614461b511358e47ec7"}, + {file = "boto3-1.33.13-py3-none-any.whl", hash = "sha256:5f278b95fb2b32f3d09d950759a05664357ba35d81107bab1537c4ddd212cd8c"}, + {file = "boto3-1.33.13.tar.gz", hash = "sha256:0e966b8a475ecb06cc0846304454b8da2473d4c8198a45dfb2c5304871986883"}, ] [package.dependencies] -botocore = ">=1.31.0,<1.32.0" +botocore = ">=1.33.13,<1.34.0" jmespath = ">=0.7.1,<2.0.0" -s3transfer = ">=0.6.0,<0.7.0" +s3transfer = ">=0.8.2,<0.9.0" [package.extras] crt = ["botocore[crt] (>=1.21.0,<2.0a0)"] [[package]] name = "botocore" -version = "1.31.0" +version = "1.33.13" description = "Low-level, data-driven core of boto 3." -category = "main" optional = false python-versions = ">= 3.7" files = [ - {file = "botocore-1.31.0-py3-none-any.whl", hash = "sha256:bcb0601fabc9f6fb2f7c592e7c9c4dece69ccd8782bfe6cf991a14f7fa35e6f3"}, - {file = "botocore-1.31.0.tar.gz", hash = "sha256:db22eea779de7f61621a612c6a36f3ee069a37d4572a9541aa374503447622aa"}, + {file = "botocore-1.33.13-py3-none-any.whl", hash = "sha256:aeadccf4b7c674c7d47e713ef34671b834bc3e89723ef96d994409c9f54666e6"}, + {file = "botocore-1.33.13.tar.gz", hash = "sha256:fb577f4cb175605527458b04571451db1bd1a2036976b626206036acd4496617"}, ] [package.dependencies] jmespath = ">=0.7.1,<2.0.0" python-dateutil = ">=2.1,<3.0.0" -urllib3 = ">=1.25.4,<1.27" +urllib3 = [ + {version = ">=1.25.4,<1.27", markers = "python_version < \"3.10\""}, + {version = ">=1.25.4,<2.1", markers = "python_version >= \"3.10\""}, +] [package.extras] -crt = ["awscrt (==0.16.9)"] +crt = ["awscrt (==0.19.17)"] [[package]] name = "cached-property" version = "1.5.2" description = "A decorator for caching properties in classes." -category = "main" optional = false python-versions = "*" files = [ @@ -433,35 +436,33 @@ files = [ [[package]] name = "cachetools" -version = "5.3.1" +version = "5.3.2" description = "Extensible memoizing collections and decorators" -category = "main" optional = false python-versions = ">=3.7" files = [ - {file = "cachetools-5.3.1-py3-none-any.whl", hash = "sha256:95ef631eeaea14ba2e36f06437f36463aac3a096799e876ee55e5cdccb102590"}, - {file = "cachetools-5.3.1.tar.gz", hash = "sha256:dce83f2d9b4e1f732a8cd44af8e8fab2dbe46201467fc98b3ef8f269092bf62b"}, + {file = "cachetools-5.3.2-py3-none-any.whl", hash = "sha256:861f35a13a451f94e301ce2bec7cac63e881232ccce7ed67fab9b5df4d3beaa1"}, + {file = "cachetools-5.3.2.tar.gz", hash = "sha256:086ee420196f7b2ab9ca2db2520aca326318b68fe5ba8bc4d49cca91add450f2"}, ] [[package]] name = "cerberus" -version = "1.3.4" -description = "Lightweight, extensible schema and data validation tool for Python dictionaries." -category = "main" +version = "1.3.5" +description = "Lightweight, extensible schema and data validation tool for Pythondictionaries." optional = false -python-versions = ">=2.7" +python-versions = "*" files = [ - {file = "Cerberus-1.3.4.tar.gz", hash = "sha256:d1b21b3954b2498d9a79edf16b3170a3ac1021df88d197dc2ce5928ba519237c"}, + {file = "Cerberus-1.3.5-py3-none-any.whl", hash = "sha256:7649a5815024d18eb7c6aa5e7a95355c649a53aacfc9b050e9d0bf6bfa2af372"}, + {file = "Cerberus-1.3.5.tar.gz", hash = "sha256:81011e10266ef71b6ec6d50e60171258a5b134d69f8fb387d16e4936d0d47642"}, ] [package.dependencies] -setuptools = "*" +importlib-metadata = {version = "*", markers = "python_version < \"3.8\""} [[package]] name = "certifi" version = "2022.12.7" description = "Python package for providing Mozilla's CA Bundle." -category = "main" optional = false python-versions = ">=3.6" files = [ @@ -473,7 +474,6 @@ files = [ name = "cffi" version = "1.15.1" description = "Foreign Function Interface for Python calling C code." -category = "main" optional = false python-versions = "*" files = [ @@ -550,7 +550,6 @@ pycparser = "*" name = "chardet" version = "5.0.0" description = "Universal encoding detector for Python 3" -category = "main" optional = false python-versions = ">=3.6" files = [ @@ -562,7 +561,6 @@ files = [ name = "charset-normalizer" version = "2.1.1" description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." -category = "main" optional = false python-versions = ">=3.6.0" files = [ @@ -575,14 +573,13 @@ unicode-backport = ["unicodedata2"] [[package]] name = "click" -version = "8.1.4" +version = "8.1.7" description = "Composable command line interface toolkit" -category = "main" optional = false python-versions = ">=3.7" files = [ - {file = "click-8.1.4-py3-none-any.whl", hash = "sha256:2739815aaa5d2c986a88f1e9230c55e17f0caad3d958a5e13ad0797c166db9e3"}, - {file = "click-8.1.4.tar.gz", hash = "sha256:b97d0c74955da062a7d4ef92fadb583806a585b2ea81958a81bd72726cbb8e37"}, + {file = "click-8.1.7-py3-none-any.whl", hash = "sha256:ae74fb96c20a0277a1d615f1e4d73c8414f5a98db8b799a7931d1582f3390c28"}, + {file = "click-8.1.7.tar.gz", hash = "sha256:ca9853ad459e787e2192211578cc907e7594e294c7ccc834310722b41b9ca6de"}, ] [package.dependencies] @@ -591,13 +588,12 @@ importlib-metadata = {version = "*", markers = "python_version < \"3.8\""} [[package]] name = "cloudflare" -version = "2.11.6" +version = "2.14.3" description = "Python wrapper for the Cloudflare v4 API" -category = "main" optional = false python-versions = "*" files = [ - {file = "cloudflare-2.11.6.tar.gz", hash = "sha256:6531d4caf160baf304d09974251cf05a624e6963d4cf844578c1154efba96f5e"}, + {file = "cloudflare-2.14.3.tar.gz", hash = "sha256:83e245474dac6e0efbf9632fac90a644cb1c505cd450c881e03d88461cff955c"}, ] [package.dependencies] @@ -606,11 +602,13 @@ jsonlines = "*" pyyaml = "*" requests = "*" +[package.extras] +test = ["pytest"] + [[package]] name = "code-writer" version = "1.1.1" description = "Library with convenience functions for generating code." -category = "main" optional = false python-versions = "*" files = [ @@ -622,7 +620,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 = [ @@ -630,11 +627,21 @@ files = [ {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, ] +[[package]] +name = "colorclass" +version = "2.2.2" +description = "Colorful worry-free console applications for Linux, Mac OS X, and Windows." +optional = false +python-versions = ">=2.6" +files = [ + {file = "colorclass-2.2.2-py2.py3-none-any.whl", hash = "sha256:6f10c273a0ef7a1150b1120b6095cbdd68e5cf36dfd5d0fc957a2500bbf99a55"}, + {file = "colorclass-2.2.2.tar.gz", hash = "sha256:6d4fe287766166a98ca7bc6f6312daf04a0481b1eda43e7173484051c0ab4366"}, +] + [[package]] name = "commonmark" version = "0.9.1" description = "Python parser for the CommonMark Markdown spec" -category = "main" optional = false python-versions = "*" files = [ @@ -649,7 +656,6 @@ test = ["flake8 (==3.7.8)", "hypothesis (==3.55.3)"] name = "compressed-rtf" version = "1.0.6" description = "Compressed Rich Text Format (RTF) compression and decompression package" -category = "main" optional = false python-versions = "*" files = [ @@ -660,7 +666,6 @@ files = [ name = "configparser" version = "5.0.2" description = "Updated configparser from Python 3.8 for Python 2.6+." -category = "main" optional = false python-versions = ">=3.6" files = [ @@ -676,7 +681,6 @@ testing = ["pytest (>=4.6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=1.2. name = "coverage" version = "7.2.7" description = "Code coverage measurement for Python" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -749,7 +753,6 @@ toml = ["tomli"] name = "cryptography" version = "39.0.1" description = "cryptography is a package which provides cryptographic recipes and primitives to Python developers." -category = "main" optional = false python-versions = ">=3.6" files = [ @@ -795,7 +798,6 @@ tox = ["tox"] name = "css-html-prettify" version = "2.5.5" description = "StandAlone Async cross-platform Prettifier Beautifier for the Web." -category = "main" optional = false python-versions = ">=3.6" files = [ @@ -810,7 +812,6 @@ beautifulsoup4 = "*" name = "cssselect" version = "1.2.0" description = "cssselect parses CSS3 Selectors and translates them to XPath 1.0" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -822,7 +823,6 @@ files = [ name = "cssutils" version = "2.6.0" description = "A CSS Cascading Style Sheets library for Python" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -841,7 +841,6 @@ testing = ["cssselect", "flake8 (<5)", "importlib-resources", "jaraco.test (>=5. name = "cycler" version = "0.11.0" description = "Composable style cycles" -category = "main" optional = false python-versions = ">=3.6" files = [ @@ -851,21 +850,75 @@ files = [ [[package]] name = "cython" -version = "0.29.36" -description = "The Cython compiler for writing C extensions for the Python language." -category = "main" +version = "3.0.6" +description = "The Cython compiler for writing C extensions in the Python language." optional = false -python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" files = [ - {file = "Cython-0.29.36-py2.py3-none-any.whl", hash = "sha256:95bb13d8be507425d03ebe051f90d4b2a9fdccc64e4f30b35645fdb7542742eb"}, - {file = "Cython-0.29.36.tar.gz", hash = "sha256:41c0cfd2d754e383c9eeb95effc9aa4ab847d0c9747077ddd7c0dcb68c3bc01f"}, + {file = "Cython-3.0.6-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0fcdfbf6fc7d0bd683d55e617c3d5a5f25b28ce8b405bc1e89054fc7c52a97e5"}, + {file = "Cython-3.0.6-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ccbee314f8d15ee8ddbe270859dda427e1187123f2c7c41526d1f260eee6c8f7"}, + {file = "Cython-3.0.6-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:14b992f36ffa1294921fca5f6488ea192fadd75770dc64fa25975379382551e9"}, + {file = "Cython-3.0.6-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2ca2e90a75d405070f3c41e701bb8005892f14d42322f1d8fd00a61d660bbae7"}, + {file = "Cython-3.0.6-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:4121c1160bc1bd8828546e8ce45906bd9ff27799d14747ce3fbbc9d67efbb1b8"}, + {file = "Cython-3.0.6-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:519814b8f80869ee5f9ee2cb2363e5c310067c0298cbea291c556b22da1ef6ae"}, + {file = "Cython-3.0.6-cp310-cp310-win32.whl", hash = "sha256:b029d8c754ef867ab4d67fc2477dde9782bf0409cb8e4024a7d29cf5aff37530"}, + {file = "Cython-3.0.6-cp310-cp310-win_amd64.whl", hash = "sha256:2262390f453eedf600e084b074144286576ed2a56bb7fbfe15ad8d9499eceb52"}, + {file = "Cython-3.0.6-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:dfe8c7ac60363769ed8d91fca26398aaa9640368ab999a79b0ccb5e788d3bcf8"}, + {file = "Cython-3.0.6-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9e31a9b18ec6ce57eb3479df920e6093596fe4ba8010dcc372720040386b4bdb"}, + {file = "Cython-3.0.6-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bca2542f1f34f0141475b13777df040c31f2073a055097734a0a793ac3a4fb72"}, + {file = "Cython-3.0.6-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b24c1c38dad4bd85e142ccbe2f88122807f8d5a75352321e1e4baf2b293df7c6"}, + {file = "Cython-3.0.6-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:dc4b4e76c1414584bb55465dfb6f41dd6bd27fd53fb41ddfcaca9edf00c1f80e"}, + {file = "Cython-3.0.6-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:805a2c532feee09aeed064eaeb7b6ee35cbab650569d0a3756975f3cc4f246cf"}, + {file = "Cython-3.0.6-cp311-cp311-win32.whl", hash = "sha256:dcdb9a177c7c385fe0c0709a9a6790b6508847d67dcac76bb65a2c7ea447efe5"}, + {file = "Cython-3.0.6-cp311-cp311-win_amd64.whl", hash = "sha256:b8640b7f6503292c358cef925df5a69adf230045719893ffe20ad98024fdf7ae"}, + {file = "Cython-3.0.6-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:16b3b02cc7b3bc42ee1a0118b1465ca46b0f3fb32d003e6f1a3a352a819bb9a3"}, + {file = "Cython-3.0.6-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:11e1d9b153573c425846b627bef52b3b99cb73d4fbfbb136e500a878d4b5e803"}, + {file = "Cython-3.0.6-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:85a7a406f78c2f297bf82136ff5deac3150288446005ed1e56552a9e3ac1469f"}, + {file = "Cython-3.0.6-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:88be4fbc760de8f313df89ca8256098c0963c9ec72f3aa88538384b80ef1a6ef"}, + {file = "Cython-3.0.6-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:ea2e5a7c503b41618bfb10e4bc610f780ab1c729280531b5cabb24e05aa21cf2"}, + {file = "Cython-3.0.6-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:2d296b48e1410cab50220a28a834167f2d7ac6c0e7de12834d66e42248a1b0f6"}, + {file = "Cython-3.0.6-cp312-cp312-win32.whl", hash = "sha256:7f19e99c6e334e9e30dfa844c3ca4ac09931b94dbba406c646bde54687aed758"}, + {file = "Cython-3.0.6-cp312-cp312-win_amd64.whl", hash = "sha256:9cae02e26967ffb6503c6e91b77010acbadfb7189a5a11d6158d634fb0f73679"}, + {file = "Cython-3.0.6-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:cb6a54543869a5b0ad009d86eb0ebc0879fab838392bfd253ad6d4f5e0f17d84"}, + {file = "Cython-3.0.6-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8d2d9e53bf021cc7a5c7b6b537b5b5a7ba466ba7348d498aa17499d0ad12637e"}, + {file = "Cython-3.0.6-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:05d15854b2b363b35c755d22015c1c2fc590b8128202f8c9eb85578461101d9c"}, + {file = "Cython-3.0.6-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e5548316497a3b8b2d9da575ea143476472db90dee73c67def061621940f78ae"}, + {file = "Cython-3.0.6-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:9b853e0855e4b3d164c05b24718e5e2df369e5af54f47cb8d923c4f497dfc92c"}, + {file = "Cython-3.0.6-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:2c77f97f462a40a319dda7e28c1669370cb26f9175f3e8f9bab99d2f8f3f2f09"}, + {file = "Cython-3.0.6-cp36-cp36m-win32.whl", hash = "sha256:3ac8b6734f2cad5640f2da21cd33cf88323547d07e445fb7453ab38ec5033b1f"}, + {file = "Cython-3.0.6-cp36-cp36m-win_amd64.whl", hash = "sha256:8dd5f5f3587909ff71f0562f50e00d4b836c948e56e8f74897b12f38a29e41b9"}, + {file = "Cython-3.0.6-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:9c0472c6394750469062deb2c166125b10411636f63a0418b5c36a60d0c9a96a"}, + {file = "Cython-3.0.6-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:97081932c8810bb99cb26b4b0402202a1764b58ee287c8b306071d2848148c24"}, + {file = "Cython-3.0.6-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e781b3880dfd0d4d37983c9d414bfd5f26c2141f6d763d20ef1964a0a4cb2405"}, + {file = "Cython-3.0.6-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ef88c46e91e21772a5d3b6b1e70a6da5fe098154ad4768888129b1c05e93bba7"}, + {file = "Cython-3.0.6-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:a38b9e7a252ec27dbc21ee8f00f09a896e88285eebb6ed99207b2ff1ea6af28e"}, + {file = "Cython-3.0.6-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:4975cdaf720d29288ec225b76b4f4471ff03f4f8b51841ba85d6587699ab2ad5"}, + {file = "Cython-3.0.6-cp37-cp37m-win32.whl", hash = "sha256:9b89463ea330318461ca47d3e49b5f606e7e82446b6f37e5c19b60392439674c"}, + {file = "Cython-3.0.6-cp37-cp37m-win_amd64.whl", hash = "sha256:0ca8f379b47417bfad98faeb14bf8a3966fc92cf69f8aaf7635cf6885e50d001"}, + {file = "Cython-3.0.6-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:b3dda1e80eb577b9563cee6cf31923a7b88836b9f9be0043ec545b138b95d8e8"}, + {file = "Cython-3.0.6-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:267e34e9a96f98c379100ef4192994a311678fb5c9af34c83ba5230223577581"}, + {file = "Cython-3.0.6-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:345d9112fde4ae0347d656f58591fd52017c61a19779c95423bb38735fe4a401"}, + {file = "Cython-3.0.6-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:25da0e51331ac12ff16cd858d1d836e092c984e1dc45d338166081d3802297c0"}, + {file = "Cython-3.0.6-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:eebbf09089b4988b9f398ed46f168892e32fcfeec346b15954fdd818aa103456"}, + {file = "Cython-3.0.6-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:e3ed0c125556324fa49b9e92bea13be7b158fcae6f72599d63c8733688257788"}, + {file = "Cython-3.0.6-cp38-cp38-win32.whl", hash = "sha256:86e1e5a5c9157a547d0a769de59c98a1fc5e46cfad976f32f60423cc6de11052"}, + {file = "Cython-3.0.6-cp38-cp38-win_amd64.whl", hash = "sha256:0d45a84a315bd84d1515cd3571415a0ee0709eb4e2cd4b13668ede928af344a7"}, + {file = "Cython-3.0.6-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:a8e788e64b659bb8fe980bc37da3118e1f7285dec40c5fb293adabc74d4205f2"}, + {file = "Cython-3.0.6-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9a77a174c7fb13d80754c8bf9912efd3f3696d13285b2f568eca17324263b3f7"}, + {file = "Cython-3.0.6-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1074e84752cd0daf3226823ddbc37cca8bc45f61c94a1db2a34e641f2b9b0797"}, + {file = "Cython-3.0.6-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:49d5cae02d56e151e1481e614a1af9a0fe659358f2aa5eca7a18f05aa641db61"}, + {file = "Cython-3.0.6-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:0b94610fa49e36db068446cfd149a42e3246f38a4256bbe818512ac181446b4b"}, + {file = "Cython-3.0.6-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:fabb2d14dd71add618a7892c40ffec584d1dae1e477caa193778e52e06821d83"}, + {file = "Cython-3.0.6-cp39-cp39-win32.whl", hash = "sha256:ce442c0be72ab014c305399d955b78c3d1e69d5a5ce24398122b605691b69078"}, + {file = "Cython-3.0.6-cp39-cp39-win_amd64.whl", hash = "sha256:8a05f79a0761fc76c42e945e5a9cb5d7986aa9e8e526fdf52bd9ca61a12d4567"}, + {file = "Cython-3.0.6-py2.py3-none-any.whl", hash = "sha256:5921a175ea20779d4443ef99276cfa9a1a47de0e32d593be7679be741c9ed93b"}, + {file = "Cython-3.0.6.tar.gz", hash = "sha256:399d185672c667b26eabbdca420c98564583798af3bc47670a8a09e9f19dd660"}, ] [[package]] name = "dateparser" version = "1.1.4" description = "Date parsing library designed to parse dates from HTML pages" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -888,7 +941,6 @@ langdetect = ["langdetect"] name = "ddt" version = "1.2.0" description = "Data-Driven/Decorated Tests" -category = "main" optional = false python-versions = "*" files = [ @@ -900,7 +952,6 @@ files = [ name = "debtcollector" version = "2.5.0" description = "A collection of Python deprecation patterns and strategies that help you collect your technical debt in a non-destructive manner." -category = "main" optional = false python-versions = ">=3.6" files = [ @@ -916,7 +967,6 @@ wrapt = ">=1.7.0" name = "decorator" version = "4.0.10" description = "Better living through Python with decorators" -category = "main" optional = false python-versions = "*" files = [ @@ -928,7 +978,6 @@ files = [ name = "defusedxml" version = "0.7.1" description = "XML bomb protection for Python stdlib modules" -category = "main" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" files = [ @@ -940,7 +989,6 @@ files = [ name = "dill" version = "0.3.6" description = "serialize all of python" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -955,7 +1003,6 @@ graph = ["objgraph (>=1.7.2)"] name = "dnspython" version = "2.3.0" description = "DNS toolkit" -category = "main" optional = false python-versions = ">=3.7,<4.0" files = [ @@ -976,7 +1023,6 @@ wmi = ["wmi (>=1.5.1,<2.0.0)"] name = "docutils" version = "0.17.1" description = "Docutils -- Python Documentation Utilities" -category = "main" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" files = [ @@ -984,11 +1030,21 @@ files = [ {file = "docutils-0.17.1.tar.gz", hash = "sha256:686577d2e4c32380bb50cbb22f575ed742d58168cee37e99117a854bcd88f125"}, ] +[[package]] +name = "easygui" +version = "0.98.3" +description = "EasyGUI is a module for very simple, very easy GUI programming in Python. EasyGUI is different from other GUI generators in that EasyGUI is NOT event-driven. Instead, all GUI interactions are invoked by simple function calls." +optional = false +python-versions = "*" +files = [ + {file = "easygui-0.98.3-py2.py3-none-any.whl", hash = "sha256:33498710c68b5376b459cd3fc48d1d1f33822139eb3ed01defbc0528326da3ba"}, + {file = "easygui-0.98.3.tar.gz", hash = "sha256:d653ff79ee1f42f63b5a090f2f98ce02335d86ad8963b3ce2661805cafe99a04"}, +] + [[package]] name = "ebaysdk" version = "2.1.5" description = "eBay SDK for Python" -category = "main" optional = false python-versions = "*" files = [ @@ -1003,7 +1059,6 @@ requests = "*" name = "ebcdic" version = "1.1.1" description = "Additional EBCDIC codecs" -category = "main" optional = false python-versions = "*" files = [ @@ -1014,7 +1069,6 @@ files = [ name = "ecdsa" version = "0.18.0" description = "ECDSA cryptographic signature library (pure python)" -category = "main" optional = false python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" files = [ @@ -1031,14 +1085,13 @@ gmpy2 = ["gmpy2"] [[package]] name = "email-validator" -version = "2.0.0.post2" +version = "2.1.0" description = "A robust email address syntax and deliverability validation library." -category = "main" optional = false python-versions = ">=3.7" files = [ - {file = "email_validator-2.0.0.post2-py3-none-any.whl", hash = "sha256:2466ba57cda361fb7309fd3d5a225723c788ca4bbad32a0ebd5373b99730285c"}, - {file = "email_validator-2.0.0.post2.tar.gz", hash = "sha256:1ff6e86044200c56ae23595695c54e9614f4a9551e0e393614f764860b3d7900"}, + {file = "email_validator-2.1.0-py3-none-any.whl", hash = "sha256:4496ecc949b51e42d1c9e6159d57cd04ef017af57d2e366ed7fd998f1bf8af69"}, + {file = "email_validator-2.1.0.tar.gz", hash = "sha256:5f511cca8856bb03251d6292ba59e7f98978aae13fa5823ddd8bf885c56a6260"}, ] [package.dependencies] @@ -1047,13 +1100,13 @@ idna = ">=2.0.0" [[package]] name = "emoji" -version = "2.6.0" +version = "2.9.0" description = "Emoji for Python" -category = "main" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" files = [ - {file = "emoji-2.6.0.tar.gz", hash = "sha256:39ad95c9ba270cdfbd141d20c2ebcfc4e295d010b605de66908a098a3ba63a3c"}, + {file = "emoji-2.9.0-py2.py3-none-any.whl", hash = "sha256:17b0d53e1d9f787307a4c65aa19badb0a1ffdbc89b3a3cd851fc77821cdaced2"}, + {file = "emoji-2.9.0.tar.gz", hash = "sha256:5f4a15b7caa9c67fc11be9d90a822e3fa26aeb4e5b7bd2ded754b394d9c47869"}, ] [package.extras] @@ -1063,7 +1116,6 @@ dev = ["coverage", "coveralls", "pytest"] name = "enum34" version = "1.1.10" description = "Python 3.4 Enum backported to 3.3, 3.2, 3.1, 2.7, 2.6, 2.5, and 2.4" -category = "main" optional = false python-versions = "*" files = [ @@ -1076,7 +1128,6 @@ files = [ name = "et-xmlfile" version = "1.1.0" description = "An implementation of lxml.xmlfile for the standard library" -category = "main" optional = false python-versions = ">=3.6" files = [ @@ -1085,44 +1136,62 @@ files = [ ] [[package]] -name = "extract-msg" -version = "0.29.6" -description = "Extracts emails and attachments saved in Microsoft Outlook's .msg files" -category = "main" +name = "exceptiongroup" +version = "1.2.0" +description = "Backport of PEP 654 (exception groups)" optional = false -python-versions = "*" +python-versions = ">=3.7" files = [ - {file = "extract_msg-0.29.6-py2.py3-none-any.whl", hash = "sha256:c4a28570b048ac0fc68bbd1891ae6e45f76639c4ef68e67cd64d103903495a72"}, - {file = "extract_msg-0.29.6.tar.gz", hash = "sha256:5189235f4fc2a13a42c9fd1b5bf6735acfdd1fe49d7dca7759258183c3c8c81f"}, + {file = "exceptiongroup-1.2.0-py3-none-any.whl", hash = "sha256:4bfd3996ac73b41e9b9628b04e079f193850720ea5945fc96a08633c66912f14"}, + {file = "exceptiongroup-1.2.0.tar.gz", hash = "sha256:91f5c769735f051a4290d52edd0858999b57e5876e9f85937691bd4c9fa3ed68"}, +] + +[package.extras] +test = ["pytest (>=6)"] + +[[package]] +name = "extract-msg" +version = "0.36.1" +description = "Extracts emails and attachments saved in Microsoft Outlook's .msg files" +optional = false +python-versions = ">=3.6" +files = [ + {file = "extract_msg-0.36.1-py2.py3-none-any.whl", hash = "sha256:05b5d5a9f6596c57077c7b9a19f46a31b42f60e67076efa13fb94851ae623280"}, + {file = "extract_msg-0.36.1.tar.gz", hash = "sha256:55729a591fecd97c3cb24ab375f0f762a34db850a397291670c428fbbc2504f6"}, ] [package.dependencies] +beautifulsoup4 = ">=4.11.1" +chardet = ">=4.0.0" compressed-rtf = ">=1.0.6" ebcdic = ">=1.1.1" -imapclient = "2.1.0" +imapclient = ">=2.1.0" olefile = ">=0.46" -tzlocal = ">=2.1" +RTFDE = ">=0.0.2" +tzlocal = ">=4.2" + +[package.extras] +all = ["extract-msg[mime]"] +mime = ["python-magic (>=0.4.27,<0.5.0)"] [[package]] name = "factur-x" -version = "2.5" +version = "3.1" description = "Factur-X and Order-X: electronic invoicing and ordering standards" -category = "main" optional = false -python-versions = "*" +python-versions = ">=3.6" files = [ - {file = "factur-x-2.5.tar.gz", hash = "sha256:ae442195d9b88c10f1bc375f2ce600ee68bb2a2cc4601ded78a21d2606430a56"}, + {file = "factur-x-3.1.tar.gz", hash = "sha256:b8672e2046ff752ba827d1b5dff57db1b7e4e687b498276e8e8fe21f841e0702"}, ] [package.dependencies] lxml = "*" -PyPDF4 = "*" +pypdf = ">=3.15.0" [[package]] name = "feedparser" version = "6.0.10" description = "Universal feed parser, handles RSS 0.9x, RSS 1.0, RSS 2.0, CDF, Atom 0.3, and Atom 1.0 feeds" -category = "main" optional = false python-versions = ">=3.6" files = [ @@ -1137,7 +1206,6 @@ sgmllib3k = "*" name = "flake8" version = "5.0.4" description = "the modular source code checker: pep8 pyflakes and co" -category = "main" optional = false python-versions = ">=3.6.1" files = [ @@ -1153,14 +1221,13 @@ pyflakes = ">=2.5.0,<2.6.0" [[package]] name = "formio-data" -version = "0.5.1" +version = "1.2.4" description = "formio.js JSON-data API" -category = "main" optional = false python-versions = ">=3.6,<4.0" files = [ - {file = "formio-data-0.5.1.tar.gz", hash = "sha256:2c5ef55db788957e7a8650b8a94bee72c54d71c0a41469e82cfa69809e3fbb26"}, - {file = "formio_data-0.5.1-py3-none-any.whl", hash = "sha256:296e22de38b50f5d82806e84599d3ebad460a6ce87ad5e71e7467e5b2487a1c4"}, + {file = "formio-data-1.2.4.tar.gz", hash = "sha256:c6330d8380e5314c0d7b64cb1cbbcb205ae3d2a4cb75051a86eb9a6d184003f9"}, + {file = "formio_data-1.2.4-py3-none-any.whl", hash = "sha256:30699b9b00e77e3c3841eac16ebe71e5e17811dd6ea3b7b84cbffb5bf3935942"}, ] [package.dependencies] @@ -1173,7 +1240,6 @@ json-logic = ["json_logic_qubit (>=0.9.1,<0.10.0)"] name = "freezegun" version = "1.2.2" description = "Let your Python tests travel through time" -category = "main" optional = false python-versions = ">=3.6" files = [ @@ -1188,7 +1254,6 @@ python-dateutil = ">=2.7" name = "future" version = "0.18.3" description = "Clean single-source support for Python 3 and 2" -category = "main" optional = false python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" files = [ @@ -1199,7 +1264,6 @@ files = [ name = "Genshi" version = "0.7.7" description = "A toolkit for generation of output for the web" -category = "main" optional = false python-versions = "*" files = [ @@ -1218,7 +1282,6 @@ plugin = ["setuptools (>=0.6a2)"] name = "geojson" version = "2.5.0" description = "Python bindings and utilities for GeoJSON" -category = "main" optional = false python-versions = "*" files = [ @@ -1230,7 +1293,6 @@ files = [ name = "gevent" version = "1.5.0" description = "Coroutine-based network library" -category = "main" optional = false python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*" files = [ @@ -1275,7 +1337,6 @@ test = ["cffi (>=1.12.2)", "coverage (<5.0)", "coveralls (>=1.7.0)", "dnspython name = "gitdb" version = "4.0.10" description = "Git Object Database" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -1290,7 +1351,6 @@ smmap = ">=3.0.1,<6" name = "gitpython" version = "3.1.30" description = "GitPython is a python library used to interact with Git repositories" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -1306,7 +1366,6 @@ typing-extensions = {version = ">=3.7.4.3", markers = "python_version < \"3.8\"" name = "giturlparse" version = "0.10.0" description = "A Git URL parsing module (supports parsing and rewriting)" -category = "main" optional = false python-versions = ">=3.6" files = [ @@ -1318,7 +1377,6 @@ files = [ name = "greenlet" version = "0.4.14" description = "Lightweight in-process concurrent programming" -category = "main" optional = false python-versions = "*" files = [ @@ -1347,7 +1405,6 @@ files = [ name = "html2text" version = "2016.9.19" description = "Turn HTML into equivalent Markdown-structured text." -category = "main" optional = false python-versions = "*" files = [ @@ -1358,7 +1415,6 @@ files = [ name = "idna" version = "3.4" description = "Internationalized Domain Names in Applications (IDNA)" -category = "main" optional = false python-versions = ">=3.5" files = [ @@ -1370,7 +1426,6 @@ files = [ name = "imagesize" version = "1.4.1" description = "Getting image size from png/jpeg/jpeg2000/gif file" -category = "main" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" files = [ @@ -1382,7 +1437,6 @@ files = [ name = "imapclient" version = "2.1.0" description = "Easy-to-use, Pythonic and complete IMAP client library" -category = "main" optional = false python-versions = "*" files = [ @@ -1401,7 +1455,6 @@ test = ["mock (>=1.3.0)"] name = "importlib-metadata" version = "4.2.0" description = "Read metadata from Python packages" -category = "main" optional = false python-versions = ">=3.6" files = [ @@ -1421,7 +1474,6 @@ testing = ["flufl.flake8", "importlib-resources (>=1.3)", "packaging", "pep517", name = "importlib-resources" version = "5.10.1" description = "Read resources from Python packages" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -1440,7 +1492,6 @@ testing = ["flake8 (<5)", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-chec name = "invoice2data" version = "0.3.5" description = "Python parser to extract data from pdf invoice" -category = "main" optional = false python-versions = "*" files = [ @@ -1458,7 +1509,6 @@ unidecode = "*" name = "iscompatible" version = "0.1.1" description = "Python versioning with requirements.txt syntax" -category = "main" optional = false python-versions = "*" files = [ @@ -1469,7 +1519,6 @@ files = [ name = "iso8601" version = "1.1.0" description = "Simple module to parse ISO 8601 dates" -category = "main" optional = false python-versions = ">=3.6.2,<4.0" files = [ @@ -1481,7 +1530,6 @@ files = [ name = "isodate" version = "0.6.1" description = "An ISO 8601 date/time/duration parser and formatter" -category = "main" optional = false python-versions = "*" files = [ @@ -1496,7 +1544,6 @@ six = "*" name = "isort" version = "5.11.5" description = "A Python utility / library to sort Python imports." -category = "main" optional = false python-versions = ">=3.7.0" files = [ @@ -1514,7 +1561,6 @@ requirements-deprecated-finder = ["pip-api", "pipreqs"] name = "jinja2" version = "2.11.3" description = "A very fast and expressive template engine." -category = "main" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" files = [ @@ -1532,7 +1578,6 @@ i18n = ["Babel (>=0.8)"] name = "jira" version = "2.0.0" description = "Python library for interacting with JIRA via REST APIs." -category = "main" optional = false python-versions = "*" files = [ @@ -1559,7 +1604,6 @@ opt = ["PyJWT", "filemagic (>=1.6)", "requests-jwt", "requests-kerberos"] name = "jmespath" version = "1.0.1" description = "JSON Matching Expressions" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -1571,7 +1615,6 @@ files = [ name = "jose" version = "1.0.0" description = "An implementation of the JOSE draft" -category = "main" optional = false python-versions = "*" files = [ @@ -1583,31 +1626,26 @@ pycrypto = ">=2.6" [[package]] name = "josepy" -version = "1.13.0" +version = "1.14.0" description = "JOSE protocol implementation in Python" -category = "main" optional = false -python-versions = ">=3.6" +python-versions = ">=3.7,<4.0" files = [ - {file = "josepy-1.13.0-py2.py3-none-any.whl", hash = "sha256:6f64eb35186aaa1776b7a1768651b1c616cab7f9685f9660bffc6491074a5390"}, - {file = "josepy-1.13.0.tar.gz", hash = "sha256:8931daf38f8a4c85274a0e8b7cb25addfd8d1f28f9fb8fbed053dd51aec75dc9"}, + {file = "josepy-1.14.0-py3-none-any.whl", hash = "sha256:d2b36a30f316269f3242f4c2e45e15890784178af5ec54fa3e49cf9234ee22e0"}, + {file = "josepy-1.14.0.tar.gz", hash = "sha256:308b3bf9ce825ad4d4bba76372cf19b5dc1c2ce96a9d298f9642975e64bd13dd"}, ] [package.dependencies] cryptography = ">=1.5" -PyOpenSSL = ">=0.13" -setuptools = ">=1.0" +pyopenssl = ">=0.13" [package.extras] -dev = ["pytest", "tox"] -docs = ["Sphinx (>=1.0)", "sphinx-rtd-theme (>=1.0)"] -tests = ["coverage (>=4.0)", "flake8 (<4)", "isort", "mypy", "pytest (>=2.8.0)", "pytest-cov", "pytest-flake8 (>=0.5)", "types-pyOpenSSL", "types-pyRFC3339", "types-requests", "types-setuptools"] +docs = ["sphinx (>=4.3.0)", "sphinx-rtd-theme (>=1.0)"] [[package]] name = "js2py" version = "0.74" description = "JavaScript to Python Translator & JavaScript interpreter written in 100% pure Python." -category = "main" optional = false python-versions = "*" files = [ @@ -1624,7 +1662,6 @@ tzlocal = ">=1.2" name = "jsonlines" version = "3.1.0" description = "Library with helpers for the jsonlines file format" -category = "main" optional = false python-versions = ">=3.6" files = [ @@ -1640,7 +1677,6 @@ typing-extensions = {version = "*", markers = "python_version < \"3.8\""} name = "jsonschema" version = "4.17.3" description = "An implementation of JSON Schema validation for Python" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -1664,7 +1700,6 @@ format-nongpl = ["fqdn", "idna", "isoduration", "jsonpointer (>1.13)", "rfc3339- name = "keystoneauth1" version = "3.14.0" description = "Authentication Library for OpenStack Identity" -category = "main" optional = false python-versions = "*" files = [ @@ -1691,7 +1726,6 @@ test = ["PyYAML (>=3.12)", "bandit (>=1.1.0)", "betamax (>=0.7.0)", "coverage (> name = "kiwisolver" version = "1.4.4" description = "A fast implementation of the Cassowary constraint solver" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -1768,11 +1802,26 @@ files = [ [package.dependencies] typing-extensions = {version = "*", markers = "python_version < \"3.8\""} +[[package]] +name = "lark" +version = "1.1.5" +description = "a modern parsing library" +optional = false +python-versions = "*" +files = [ + {file = "lark-1.1.5-py3-none-any.whl", hash = "sha256:8476f9903e93fbde4f6c327f74d79e9b4bd0ed9294c5dfa3164ab8c581b5de2a"}, + {file = "lark-1.1.5.tar.gz", hash = "sha256:4b534eae1f9af5b4ea000bea95776350befe1981658eea3820a01c37e504bb4d"}, +] + +[package.extras] +atomic-cache = ["atomicwrites"] +nearley = ["js2py"] +regex = ["regex"] + [[package]] name = "lasso" version = "0.1.0" description = "A simple lasso package" -category = "main" optional = false python-versions = "*" files = [ @@ -1784,7 +1833,6 @@ files = [ name = "lazy-object-proxy" version = "1.8.0" description = "A fast and thorough lazy object proxy." -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -1813,7 +1861,6 @@ files = [ name = "libsass" version = "0.12.3" description = "SASS for Python: A straightforward binding of libsass for Python." -category = "main" optional = false python-versions = "*" files = [ @@ -1847,7 +1894,6 @@ upload-appveyor-builds = ["twine (==1.5.0)"] name = "lxml" version = "4.9.1" description = "Powerful and Pythonic XML processing library combining libxml2/libxslt with the ElementTree API." -category = "main" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, != 3.4.*" files = [ @@ -1933,7 +1979,6 @@ source = ["Cython (>=0.29.7)"] name = "mako" version = "1.2.2" 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 = [ @@ -1954,7 +1999,6 @@ testing = ["pytest"] name = "markupsafe" version = "0.23" description = "Implements a XML/HTML/XHTML Markup safe string for Python" -category = "main" optional = false python-versions = "*" files = [ @@ -1965,7 +2009,6 @@ files = [ name = "matplotlib" version = "3.3.4" description = "Python plotting package" -category = "main" optional = false python-versions = ">=3.6" files = [ @@ -2008,7 +2051,6 @@ python-dateutil = ">=2.1" name = "mccabe" version = "0.7.0" description = "McCabe checker, plugin for flake8" -category = "main" optional = false python-versions = ">=3.6" files = [ @@ -2020,7 +2062,6 @@ files = [ name = "mmg" version = "1.0.3" description = "Command Line Interface to Generate i18n Markdown" -category = "main" optional = false python-versions = ">=3.6, <4" files = [ @@ -2036,7 +2077,6 @@ emoji = ">=0.6.0" name = "mock" version = "2.0.0" description = "Rolling backport of unittest.mock for all Pythons" -category = "main" optional = false python-versions = "*" files = [ @@ -2056,7 +2096,6 @@ test = ["unittest2 (>=1.1.0)"] name = "mpld3" version = "0.5.9" description = "D3 Viewer for Matplotlib" -category = "main" optional = false python-versions = "*" files = [ @@ -2070,29 +2109,27 @@ matplotlib = "*" [[package]] name = "msal" -version = "1.20.0" +version = "1.26.0" description = "The Microsoft Authentication Library (MSAL) for Python library enables your app to access the Microsoft Cloud by supporting authentication of users with Microsoft Azure Active Directory accounts (AAD) and Microsoft Accounts (MSA) using industry standard OAuth2 and OpenID Connect." -category = "main" optional = false -python-versions = "*" +python-versions = ">=2.7" files = [ - {file = "msal-1.20.0-py2.py3-none-any.whl", hash = "sha256:d2f1c26368ecdc28c8657d457352faa0b81b1845a7b889d8676787721ba86792"}, - {file = "msal-1.20.0.tar.gz", hash = "sha256:78344cd4c91d6134a593b5e3e45541e666e37b747ff8a6316c3668dd1e6ab6b2"}, + {file = "msal-1.26.0-py2.py3-none-any.whl", hash = "sha256:be77ba6a8f49c9ff598bbcdc5dfcf1c9842f3044300109af738e8c3e371065b5"}, + {file = "msal-1.26.0.tar.gz", hash = "sha256:224756079fe338be838737682b49f8ebc20a87c1c5eeaf590daae4532b83de15"}, ] [package.dependencies] -cryptography = ">=0.6,<41" +cryptography = ">=0.6,<44" PyJWT = {version = ">=1.0.0,<3", extras = ["crypto"]} requests = ">=2.0.0,<3" [package.extras] -broker = ["pymsalruntime (>=0.11.2,<0.14)"] +broker = ["pymsalruntime (>=0.13.2,<0.14)"] [[package]] name = "msal-extensions" version = "1.0.0" description = "Microsoft Authentication Library extensions (MSAL EX) provides a persistence API that can save your data on disk, encrypted on Windows, macOS and Linux. Concurrent data access will be coordinated by a file lock mechanism." -category = "main" optional = false python-versions = "*" files = [ @@ -2111,7 +2148,6 @@ portalocker = [ name = "msgpack" version = "1.0.4" description = "MessagePack serializer" -category = "main" optional = false python-versions = "*" files = [ @@ -2169,11 +2205,25 @@ files = [ {file = "msgpack-1.0.4.tar.gz", hash = "sha256:f5d869c18f030202eb412f08b28d2afeea553d6613aee89e200d7aca7ef01f5f"}, ] +[[package]] +name = "msoffcrypto-tool" +version = "5.1.0" +description = "Python tool and library for decrypting MS Office files with passwords or other keys" +optional = false +python-versions = ">=3.7,<4.0" +files = [ + {file = "msoffcrypto_tool-5.1.0-py3-none-any.whl", hash = "sha256:929e00351f734d3b6eca2a4df97fefd79ae26984b11831b63ea301f791590426"}, + {file = "msoffcrypto_tool-5.1.0.tar.gz", hash = "sha256:fe5413deeb9c88f6274bea9ebf61d77836365db81a1c3daef9fd2cbd4b048f41"}, +] + +[package.dependencies] +cryptography = ">=35.0" +olefile = ">=0.46" + [[package]] name = "multidict" version = "6.0.3" description = "multidict implementation" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -2257,7 +2307,6 @@ files = [ name = "mypy-extensions" version = "0.4.3" description = "Experimental type system extensions for programs checked with the mypy typechecker." -category = "main" optional = false python-versions = "*" files = [ @@ -2269,7 +2318,6 @@ files = [ name = "mysqlclient" version = "2.1.1" description = "Python interface to MySQL" -category = "main" optional = false python-versions = ">=3.5" files = [ @@ -2286,7 +2334,6 @@ files = [ name = "netaddr" version = "0.8.0" description = "A network address manipulation library for Python" -category = "main" optional = false python-versions = "*" files = [ @@ -2298,7 +2345,6 @@ files = [ name = "netifaces" version = "0.11.0" description = "Portable network interface information." -category = "main" optional = false python-versions = "*" files = [ @@ -2338,7 +2384,6 @@ files = [ name = "num2words" version = "0.5.6" description = "Modules to convert numbers to words. Easily extensible." -category = "main" optional = false python-versions = "*" files = [ @@ -2350,7 +2395,6 @@ files = [ name = "numpy" version = "1.21.1" description = "NumPy is the fundamental package for array computing with Python." -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -2388,7 +2432,6 @@ files = [ name = "oauthlib" version = "2.1.0" description = "A generic, spec-compliant, thorough implementation of the OAuth request-signing logic" -category = "main" optional = false python-versions = "*" files = [ @@ -2410,7 +2453,6 @@ test = ["blinker", "cryptography", "mock", "nose", "pyjwt (>=1.0.0)", "unittest2 name = "oca-decorators" version = "0.0.1" description = "This is a library of decorators for Odoo developers." -category = "main" optional = false python-versions = "*" files = [ @@ -2424,21 +2466,19 @@ decorator = "*" [[package]] name = "odoorpc" -version = "0.9.0" +version = "0.10.1" description = "OdooRPC is a Python package providing an easy way to pilot your Odoo servers through RPC." -category = "main" optional = false python-versions = "*" files = [ - {file = "OdooRPC-0.9.0-py2.py3-none-any.whl", hash = "sha256:95a0d40c94c76a097870379a411180f81da164917a27d891a935894105f46704"}, - {file = "OdooRPC-0.9.0.tar.gz", hash = "sha256:936adc52871b4c9d6b921c73421acd88f73442b17a71a49f34de6dbcf54d7964"}, + {file = "OdooRPC-0.10.1-py2.py3-none-any.whl", hash = "sha256:a0900bdd5c989c414b1ef40dafccd9363f179312d9166d9486cf70c7c2f0dd44"}, + {file = "OdooRPC-0.10.1.tar.gz", hash = "sha256:d0bc524c5b960781165575bad9c13d032d6f968c3c09276271045ddbbb483aa5"}, ] [[package]] name = "ofxparse" version = "0.16" description = "Tools for working with the OFX (Open Financial Exchange) file format" -category = "main" optional = false python-versions = "*" files = [ @@ -2454,18 +2494,38 @@ six = "*" name = "olefile" version = "0.46" description = "Python package to parse, read and write Microsoft OLE2 files (Structured Storage or Compound Document, Microsoft Office)" -category = "main" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" files = [ {file = "olefile-0.46.zip", hash = "sha256:133b031eaf8fd2c9399b78b8bc5b8fcbe4c31e85295749bb17a87cba8f3c3964"}, ] +[[package]] +name = "oletools" +version = "0.60.1" +description = "Python tools to analyze security characteristics of MS Office and OLE files (also called Structured Storage, Compound File Binary Format or Compound Document File Format), for Malware Analysis and Incident Response #DFIR" +optional = false +python-versions = "*" +files = [ + {file = "oletools-0.60.1-py2.py3-none-any.whl", hash = "sha256:edef92374e688989a39269eb9a11142fb20a023629c23538c849c14d1d1144ea"}, + {file = "oletools-0.60.1.zip", hash = "sha256:67a796da4c4b8e2feb9a6b2495bef8798a3323a75512de4e5669d9dc9d1fae31"}, +] + +[package.dependencies] +colorclass = "*" +easygui = "*" +msoffcrypto-tool = {version = "*", markers = "platform_python_implementation != \"PyPy\" or python_version >= \"3\" and (platform_system != \"Windows\" and platform_system != \"Darwin\")"} +olefile = ">=0.46" +pcodedmp = ">=1.2.5" +pyparsing = ">=2.1.0,<3" + +[package.extras] +full = ["XLMMacroDeobfuscator"] + [[package]] name = "openpyxl" version = "3.1.2" description = "A Python library to read/write Excel 2010 xlsx/xlsm files" -category = "main" optional = false python-versions = ">=3.6" files = [ @@ -2478,14 +2538,13 @@ et-xmlfile = "*" [[package]] name = "openupgradelib" -version = "3.4.1" +version = "3.5.0" description = "A library with support functions to be called from Odoo migration scripts." -category = "main" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" files = [ - {file = "openupgradelib-3.4.1-py2.py3-none-any.whl", hash = "sha256:d0dffe2ac44cc1210b6cd0c1111b763d25790f3a6c0ac04c06d663f9cfab0876"}, - {file = "openupgradelib-3.4.1.tar.gz", hash = "sha256:3c26936898c1a494a274d5dae4734f6d0e3064ca04dc54ceb8233d70d4e1b3c1"}, + {file = "openupgradelib-3.5.0-py2.py3-none-any.whl", hash = "sha256:8075d8f0ce59214319b8188c890f42346038d677b867273e537a286d3431f991"}, + {file = "openupgradelib-3.5.0.tar.gz", hash = "sha256:16445ef09c5e912fe3261875b12be7fe4b418e4a0a5a04429370f38edb029661"}, ] [package.dependencies] @@ -2497,7 +2556,6 @@ lxml = "*" name = "optionaldict" version = "0.1.2" description = "A dict-like object that ignore NoneType values for Python" -category = "main" optional = false python-versions = "*" files = [ @@ -2509,7 +2567,6 @@ files = [ name = "orjson" version = "3.6.0" description = "Fast, correct Python JSON library supporting dataclasses, datetimes, and numpy" -category = "main" optional = false python-versions = ">=3.6" files = [ @@ -2543,7 +2600,6 @@ files = [ name = "os-service-types" version = "1.7.0" description = "Python library for consuming OpenStack sevice-types-authority data" -category = "main" optional = false python-versions = "*" files = [ @@ -2558,7 +2614,6 @@ pbr = ">=2.0.0,<2.1.0 || >2.1.0" name = "oslo.config" version = "8.8.0" description = "Oslo Configuration API" -category = "main" optional = false python-versions = ">=3.6" files = [ @@ -2584,7 +2639,6 @@ test = ["bandit (>=1.6.0,<1.7.0)", "coverage (>=4.0,!=4.4)", "fixtures (>=3.0.0) name = "oslo.i18n" version = "5.1.0" description = "Oslo i18n library" -category = "main" optional = false python-versions = ">=3.6" files = [ @@ -2599,7 +2653,6 @@ pbr = ">=2.0.0,<2.1.0 || >2.1.0" name = "oslo.serialization" version = "4.3.0" description = "Oslo Serialization library" -category = "main" optional = false python-versions = ">=3.6" files = [ @@ -2617,7 +2670,6 @@ pytz = ">=2013.6" name = "oslo.utils" version = "4.13.0" description = "Oslo Utility library" -category = "main" optional = false python-versions = ">=3.6" files = [ @@ -2640,7 +2692,6 @@ pytz = ">=2013.6" name = "ovh" version = "1.1.0" description = "\"Official module to perform HTTP requests to the OVHcloud APIs\"" -category = "main" optional = false python-versions = "*" files = [ @@ -2658,7 +2709,6 @@ dev = ["Sphinx (==1.2.2)", "black", "coverage (>=7.2.2,<7.3.0)", "flake8", "isor name = "packaging" version = "22.0" description = "Core utilities for Python packages" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -2670,7 +2720,6 @@ files = [ name = "paho-mqtt" version = "1.6.1" description = "MQTT version 5.0/3.1.1 client class" -category = "main" optional = false python-versions = "*" files = [ @@ -2684,7 +2733,6 @@ proxy = ["PySocks"] name = "pandas" version = "1.3.5" description = "Powerful data structures for data analysis, time series, and statistics" -category = "main" optional = false python-versions = ">=3.7.1" files = [ @@ -2717,7 +2765,7 @@ files = [ [package.dependencies] numpy = [ - {version = ">=1.17.3", markers = "platform_machine != \"aarch64\" and platform_machine != \"arm64\" and python_version < \"3.10\""}, + {version = ">=1.17.3", markers = "(platform_machine != \"aarch64\" and platform_machine != \"arm64\") and python_version < \"3.10\""}, {version = ">=1.19.2", markers = "platform_machine == \"aarch64\" and python_version < \"3.10\""}, {version = ">=1.20.0", markers = "platform_machine == \"arm64\" and python_version < \"3.10\""}, {version = ">=1.21.0", markers = "python_version >= \"3.10\""}, @@ -2730,14 +2778,13 @@ test = ["hypothesis (>=3.58)", "pytest (>=6.0)", "pytest-xdist"] [[package]] name = "paramiko" -version = "3.2.0" +version = "3.3.1" description = "SSH2 protocol library" -category = "main" optional = false python-versions = ">=3.6" files = [ - {file = "paramiko-3.2.0-py3-none-any.whl", hash = "sha256:df0f9dd8903bc50f2e10580af687f3015bf592a377cd438d2ec9546467a14eb8"}, - {file = "paramiko-3.2.0.tar.gz", hash = "sha256:93cdce625a8a1dc12204439d45033f3261bdb2c201648cfcdc06f9fd0f94ec29"}, + {file = "paramiko-3.3.1-py3-none-any.whl", hash = "sha256:b7bc5340a43de4287bbe22fe6de728aa2c22468b2a849615498dd944c2f275eb"}, + {file = "paramiko-3.3.1.tar.gz", hash = "sha256:6a3777a961ac86dbef375c5f5b8d50014a1a96d0fd7f054a43bc880134b0ff77"}, ] [package.dependencies] @@ -2754,7 +2801,6 @@ invoke = ["invoke (>=2.0)"] name = "passlib" version = "1.6.5" description = "comprehensive password hashing framework supporting over 30 schemes" -category = "main" optional = false python-versions = "*" files = [ @@ -2766,7 +2812,6 @@ files = [ name = "pathspec" version = "0.10.3" description = "Utility library for gitignore style pattern matching of file paths." -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -2778,7 +2823,6 @@ files = [ name = "pbr" version = "5.11.0" description = "Python Build Reasonableness" -category = "main" optional = false python-versions = ">=2.6" files = [ @@ -2786,11 +2830,25 @@ files = [ {file = "pbr-5.11.0.tar.gz", hash = "sha256:b97bc6695b2aff02144133c2e7399d5885223d42b7912ffaec2ca3898e673bfe"}, ] +[[package]] +name = "pcodedmp" +version = "1.2.6" +description = "A VBA p-code disassembler" +optional = false +python-versions = "*" +files = [ + {file = "pcodedmp-1.2.6-py2.py3-none-any.whl", hash = "sha256:4441f7c0ab4cbda27bd4668db3b14f36261d86e5059ce06c0828602cbe1c4278"}, + {file = "pcodedmp-1.2.6.tar.gz", hash = "sha256:025f8c809a126f45a082ffa820893e6a8d990d9d7ddb68694b5a9f0a6dbcd955"}, +] + +[package.dependencies] +oletools = ">=0.54" +win-unicode-console = {version = "*", markers = "platform_system == \"Windows\" and platform_python_implementation != \"PyPy\""} + [[package]] name = "pdf2image" version = "1.16.3" description = "A wrapper around the pdftoppm and pdftocairo command line tools to convert PDF to a PIL Image list." -category = "main" optional = false python-versions = "*" files = [ @@ -2805,7 +2863,6 @@ pillow = "*" name = "pdfminer" version = "20191125" description = "PDF parser and analyzer" -category = "main" optional = false python-versions = ">=3.6" files = [ @@ -2817,14 +2874,13 @@ pycryptodome = "*" [[package]] name = "pexpect" -version = "4.8.0" +version = "4.9.0" description = "Pexpect allows easy control of interactive console applications." -category = "main" optional = false python-versions = "*" files = [ - {file = "pexpect-4.8.0-py2.py3-none-any.whl", hash = "sha256:0b48a55dcb3c05f3329815901ea4fc1537514d6ba867a152b581d69ae3710937"}, - {file = "pexpect-4.8.0.tar.gz", hash = "sha256:fc65a43959d153d0114afe13997d439c22823a27cefceb5ff35c2178c6784c0c"}, + {file = "pexpect-4.9.0-py2.py3-none-any.whl", hash = "sha256:7236d1e080e4936be2dc3e326cec0af72acf9212a7e1d060210e70a47e253523"}, + {file = "pexpect-4.9.0.tar.gz", hash = "sha256:ee7d41123f3c9911050ea2c2dac107568dc43b2d3b0c7557a33212c398ead30f"}, ] [package.dependencies] @@ -2832,21 +2888,19 @@ ptyprocess = ">=0.5" [[package]] name = "phonenumbers" -version = "8.13.15" +version = "8.13.26" description = "Python version of Google's common library for parsing, formatting, storing and validating international phone numbers." -category = "main" optional = false python-versions = "*" files = [ - {file = "phonenumbers-8.13.15-py2.py3-none-any.whl", hash = "sha256:634b277dc53933962961697211746f2fb7bf945a6725a853a1556cdb4a7531e4"}, - {file = "phonenumbers-8.13.15.tar.gz", hash = "sha256:adf80fc0027ce8eac990f5e1d3fa00022b481133d65fa40c1c40ae9020fc5a66"}, + {file = "phonenumbers-8.13.26-py2.py3-none-any.whl", hash = "sha256:b2308c9c5750b8f10dd30d94547afd66bce60ac5e93aff227f95740557f32752"}, + {file = "phonenumbers-8.13.26.tar.gz", hash = "sha256:937d70aeceb317f5831dfec28de855a60260ef4a9d551964bec8e7a7d0cf81cd"}, ] [[package]] name = "pillow" version = "9.3.0" description = "Python Imaging Library (Fork)" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -2921,7 +2975,6 @@ tests = ["check-manifest", "coverage", "defusedxml", "markdown2", "olefile", "pa name = "pkgutil_resolve_name" version = "1.3.10" description = "Resolve a name to an object." -category = "main" optional = false python-versions = ">=3.6" files = [ @@ -2933,7 +2986,6 @@ files = [ name = "platformdirs" version = "2.6.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 = [ @@ -2949,7 +3001,6 @@ test = ["appdirs (==1.4.4)", "pytest (>=7.2)", "pytest-cov (>=4)", "pytest-mock name = "plotly" version = "4.1.0" description = "An open-source, interactive graphing library for Python" -category = "main" optional = false python-versions = "*" files = [ @@ -2965,7 +3016,6 @@ six = "*" name = "portalocker" version = "1.7.1" description = "Wraps the portalocker recipe for easy usage" -category = "main" optional = false python-versions = "*" files = [ @@ -2984,7 +3034,6 @@ tests = ["pytest (>=4.6.9)", "pytest-cov (>=2.8.1)", "pytest-flake8 (>=1.0.5)", name = "premailer" version = "3.10.0" description = "Turns CSS blocks into style attributes" -category = "main" optional = false python-versions = "*" files = [ @@ -3007,7 +3056,6 @@ test = ["mock", "nose"] name = "prometheus-client" version = "0.11.0" description = "Python client for the Prometheus monitoring system." -category = "main" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" files = [ @@ -3022,7 +3070,6 @@ twisted = ["twisted"] name = "psutil" version = "5.9.0" description = "Cross-platform lib for process and system monitoring in Python." -category = "main" optional = false python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" files = [ @@ -3067,7 +3114,6 @@ test = ["enum34", "ipaddress", "mock", "pywin32", "unittest2", "wmi"] name = "psycopg2" version = "2.9.5" description = "psycopg2 - Python-PostgreSQL Database Adapter" -category = "main" optional = false python-versions = ">=3.6" files = [ @@ -3090,7 +3136,6 @@ files = [ name = "ptyprocess" version = "0.7.0" description = "Run a subprocess in a pseudo terminal" -category = "main" optional = false python-versions = "*" files = [ @@ -3102,7 +3147,6 @@ files = [ name = "py-asterisk" version = "0.5.18" description = "Asterisk Manager API Python interface." -category = "main" optional = false python-versions = "*" files = [ @@ -3113,7 +3157,6 @@ files = [ name = "py3o-formats" version = "0.3" description = "Formats declarations for py3o" -category = "main" optional = false python-versions = "*" files = [ @@ -3129,7 +3172,6 @@ setuptools = "*" name = "py3o-template" version = "0.10.0" description = "An easy solution to design reports using LibreOffice" -category = "main" optional = false python-versions = "*" files = [ @@ -3150,7 +3192,6 @@ six = ">=1.9" name = "pyasn1" version = "0.4.8" description = "ASN.1 types and codecs" -category = "main" optional = false python-versions = "*" files = [ @@ -3162,7 +3203,6 @@ files = [ name = "pyasn1-modules" version = "0.2.8" description = "A collection of ASN.1-based protocols modules." -category = "main" optional = false python-versions = "*" files = [ @@ -3177,7 +3217,6 @@ pyasn1 = ">=0.4.6,<0.5.0" name = "pycodestyle" version = "2.9.1" description = "Python style guide checker" -category = "main" optional = false python-versions = ">=3.6" files = [ @@ -3189,7 +3228,6 @@ files = [ name = "pycountry" version = "22.3.5" description = "ISO country, subdivision, language, currency and script definitions and their translations" -category = "main" optional = false python-versions = ">=3.6, <4" files = [ @@ -3203,7 +3241,6 @@ setuptools = "*" name = "pycparser" version = "2.21" description = "C parser in Python" -category = "main" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" files = [ @@ -3215,7 +3252,6 @@ files = [ name = "pycrypto" version = "2.6.1" description = "Cryptographic modules for Python." -category = "main" optional = false python-versions = "*" files = [ @@ -3226,7 +3262,6 @@ files = [ name = "pycryptodome" version = "3.16.0" description = "Cryptographic library for Python" -category = "main" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" files = [ @@ -3262,7 +3297,6 @@ files = [ name = "pydot" version = "1.2.3" description = "Python interface to Graphviz's Dot" -category = "main" optional = false python-versions = "*" files = [ @@ -3276,7 +3310,6 @@ pyparsing = ">=2.1.4" name = "pyflakes" version = "2.5.0" description = "passive checker of Python programs" -category = "main" optional = false python-versions = ">=3.6" files = [ @@ -3288,7 +3321,6 @@ files = [ name = "pygments" version = "2.7.4" description = "Pygments is a syntax highlighting package written in Python." -category = "main" optional = false python-versions = ">=3.5" files = [ @@ -3300,7 +3332,6 @@ files = [ name = "pygments-csv-lexer" version = "0.1.3" description = "pygments-csv-lexer – A simple CSV lexer for the Pygments syntax highlighter" -category = "main" optional = false python-versions = "*" files = [ @@ -3314,7 +3345,6 @@ Pygments = ">=2.1.0" name = "pygount" version = "1.5.1" description = "count source lines of code (SLOC) using pygments" -category = "main" optional = false python-versions = ">=3.7,<4" files = [ @@ -3331,7 +3361,6 @@ rich = ">=9,<13" name = "pyjon.utils" version = "0.7" description = "Useful tools library with classes to do singletons, dynamic function pointers..." -category = "main" optional = false python-versions = "*" files = [ @@ -3348,7 +3377,6 @@ setuptools = "*" name = "pyjsparser" version = "2.7.1" description = "Fast javascript parser (based on esprima.js)" -category = "main" optional = false python-versions = "*" files = [ @@ -3360,7 +3388,6 @@ files = [ name = "pyjwt" version = "2.5.0" description = "JSON Web Token implementation in Python" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -3382,7 +3409,6 @@ tests = ["coverage[toml] (==5.0.4)", "pytest (>=6.0.0,<7.0.0)"] name = "pyldap" version = "2.4.28" description = "Python modules for implementing LDAP clients" -category = "main" optional = false python-versions = "*" files = [ @@ -3396,7 +3422,6 @@ setuptools = "*" name = "pylint" version = "2.15.9" description = "python code static checker" -category = "main" optional = false python-versions = ">=3.7.2" files = [ @@ -3426,14 +3451,13 @@ testutils = ["gitpython (>3)"] name = "pylint-odoo" version = "8.0.19" description = "Pylint plugin for Odoo" -category = "main" optional = false python-versions = "*" files = [] develop = false [package.dependencies] -pylint = ">=2.15.0,<2.16.0" +pylint = "==2.15.*" pylint-plugin-utils = "0.7" validators = "0.20.0" @@ -3441,13 +3465,12 @@ validators = "0.20.0" type = "git" url = "https://github.com/oca/pylint-odoo.git" reference = "HEAD" -resolved_reference = "c1335a0db590efd0390941effade29227d6b00d8" +resolved_reference = "afb73b78b9330d64300b73863e94d9fa6fa5d8de" [[package]] name = "pylint-plugin-utils" version = "0.7" description = "Utilities and helpers for writing Pylint plugins" -category = "main" optional = false python-versions = ">=3.6.2" files = [ @@ -3460,80 +3483,85 @@ pylint = ">=1.7" [[package]] name = "pymssql" -version = "2.2.7" +version = "2.2.11" description = "DB-API interface to Microsoft SQL Server for Python. (new Cython-based version)" -category = "main" optional = false python-versions = "*" files = [ - {file = "pymssql-2.2.7-cp310-cp310-macosx_10_15_x86_64.whl", hash = "sha256:9a883def0ded86dc93cdb45dcbe924f79bd141e6bc39975d6077f88e156f3741"}, - {file = "pymssql-2.2.7-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:83ee4914bacecc715fcdb3cc22aedc8d9bf22f62e75802799fe9773b718fd41b"}, - {file = "pymssql-2.2.7-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:2a8b1b903527f0f8c287582bfe01b28180f173583b8501914c1134659ead3c1d"}, - {file = "pymssql-2.2.7-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4aa12c836c307c80c1148eb190362bbbe178abc311e6715316b9950327af7a14"}, - {file = "pymssql-2.2.7-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:70260e05717cd6d72a622ee29d06375fa44d58fe825d4964a63344ae34d80223"}, - {file = "pymssql-2.2.7-cp310-cp310-manylinux_2_24_i686.whl", hash = "sha256:c42a03cab7edd2bf6c4e075a9f1f7252151a4022216d7c85af4e4e4751f3bb14"}, - {file = "pymssql-2.2.7-cp310-cp310-manylinux_2_24_x86_64.whl", hash = "sha256:9bfb8f04b26d398f2fb7741733a33c7cfe418bbbf922703e5c4c409e86891785"}, - {file = "pymssql-2.2.7-cp310-cp310-win32.whl", hash = "sha256:0dbb905655f5976b94b6f899d4675ffdd460e7cb5516fba332cf0d77c15c2e9e"}, - {file = "pymssql-2.2.7-cp310-cp310-win_amd64.whl", hash = "sha256:2ce4f9fd604b9c7f9efad56afb3dcb2331c3c87bada172388f69d91297f20939"}, - {file = "pymssql-2.2.7-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:8fe96bcbb26e7603ef63696f59fa19364c793aab25f2b606dc04d50917c7b35f"}, - {file = "pymssql-2.2.7-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:628611bc8cab379f8353ad29b93a07162254c9b75efb5fe5255ac855a8d3abe4"}, - {file = "pymssql-2.2.7-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:045029bed7cea6fcbc630e18f956f7ec6d1bde25c570019ff1f8f0e2b9abd5f0"}, - {file = "pymssql-2.2.7-cp311-cp311-manylinux_2_24_i686.whl", hash = "sha256:ad3c2e67fd04fb860ffb3affd068e109ef92488a74274347235df45664de4a27"}, - {file = "pymssql-2.2.7-cp311-cp311-manylinux_2_24_x86_64.whl", hash = "sha256:7099e45e91460ffec10e551830c722c27f207a41fd2267446a9b1a798e89d3bc"}, - {file = "pymssql-2.2.7-cp311-cp311-win32.whl", hash = "sha256:4dbe67d60472e18d01bcfba139f404f017ab9e9bd1b558d527befbb47dbd6486"}, - {file = "pymssql-2.2.7-cp311-cp311-win_amd64.whl", hash = "sha256:a9a40bf77792532fe643ee07ae0de930f6386c8593348baef07d76d1b2f48967"}, - {file = "pymssql-2.2.7-cp36-cp36m-macosx_10_14_x86_64.whl", hash = "sha256:e6116a0389939bba789fb3fccdd976773cfce7d9cc48bf2eb933cdc2c8ce2b19"}, - {file = "pymssql-2.2.7-cp36-cp36m-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:2b0415e6063b06234921d2d7d2b226cc68d197976f05b1547555ebfb3c446d01"}, - {file = "pymssql-2.2.7-cp36-cp36m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:d84a0fe84dda22dd50efd9ef9f68349a9df88edeb1c719e1545961e7bb74c27c"}, - {file = "pymssql-2.2.7-cp36-cp36m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9eeff70c3af730fee19406dda11a7cef0e70e397d53f7c2edb13bd11d8e3b1b5"}, - {file = "pymssql-2.2.7-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4dd8ae8b5bc7dd78af8b886721c9b586b5269fea4f0e425c64ee2444356cb292"}, - {file = "pymssql-2.2.7-cp36-cp36m-manylinux_2_24_i686.whl", hash = "sha256:a061af4df57863abee1a8a87cad357f660294e038ef9a3375e258c10f982164c"}, - {file = "pymssql-2.2.7-cp36-cp36m-manylinux_2_24_x86_64.whl", hash = "sha256:1b723fccf11caf57cb44051e83955f170d2cad8ad931cbb4ab97d263691c4bd5"}, - {file = "pymssql-2.2.7-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:016d1f903b0bd9a7f094712668bcf9fa86ef305fba4b933d182c152043706191"}, - {file = "pymssql-2.2.7-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:bf4640b04663e0296d8562ba835bd8636ca763495ece0fc023a2192adcfacdb2"}, - {file = "pymssql-2.2.7-cp36-cp36m-win32.whl", hash = "sha256:9a5a554af18e803a2532a8232817b0904cb7cb6d8c1a1cf716fe6a5f568a1111"}, - {file = "pymssql-2.2.7-cp36-cp36m-win_amd64.whl", hash = "sha256:1c0b7ed54b38ba2a59695dd9d0adba6a144ac37de459d514668b18e45f5a232d"}, - {file = "pymssql-2.2.7-cp37-cp37m-macosx_10_15_x86_64.whl", hash = "sha256:f26de948303c2146089c1a5f8c4c5c46e6fd21b8b6b550c19c1f056d87ab112d"}, - {file = "pymssql-2.2.7-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:97760db6df17327ebedd58a93d7cd5c2c453faa517bc9bdfbe19ad1ff66b96a5"}, - {file = "pymssql-2.2.7-cp37-cp37m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:5ce2089b5b88a56eb599118b4f9a1b119e9056e85f8c6cb3002e44493181dd76"}, - {file = "pymssql-2.2.7-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:597563146e4ab088ee907c836075b9300541c16eef9791f4fbdfe6100894d512"}, - {file = "pymssql-2.2.7-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6cd3ee322daf8fcbb6e58deb21daa4adceea658e433eef3d3cae8c5be5049086"}, - {file = "pymssql-2.2.7-cp37-cp37m-manylinux_2_24_i686.whl", hash = "sha256:18b611ee72c5f4095cd8e942047982e92ab4d2d2ce5a457b85ef03bb8e385e7e"}, - {file = "pymssql-2.2.7-cp37-cp37m-manylinux_2_24_x86_64.whl", hash = "sha256:2d97127604bfde669cfc6e14f03536925e1a446d2bf4b7f3c7d671be07801361"}, - {file = "pymssql-2.2.7-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:16a281b556975d4c79cad6d41e902aba32017351aebfa4ede30581e00e89b1c1"}, - {file = "pymssql-2.2.7-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:7e9a277352a5a081a20107e112c7b820ecb76c2320779d1fc15b783110a2c1f5"}, - {file = "pymssql-2.2.7-cp37-cp37m-win32.whl", hash = "sha256:e06e6c189821fe259764dd8c61551ebcc2e5ec3752d06f850e79b520c2e92998"}, - {file = "pymssql-2.2.7-cp37-cp37m-win_amd64.whl", hash = "sha256:4306f74b4b19acc367b4bf6afb5ef961d35362f416622ae24a73035f75cfcdee"}, - {file = "pymssql-2.2.7-cp38-cp38-macosx_10_15_x86_64.whl", hash = "sha256:26eb3bb6f4b6a57e2f7e2639179914aa5c962522ccd68f5aecb0190e8d34893f"}, - {file = "pymssql-2.2.7-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:28151def07dc86e3b44dc0759ce130e56ebbab17b41c01458fc217678eccce31"}, - {file = "pymssql-2.2.7-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:51855d2f63e20f4d2ed6986d0f10cc03f341f959638e60d041a1ddb5a95d00fd"}, - {file = "pymssql-2.2.7-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bbf6717d85b62b95b9c96f3dd12166297dc9cef4f0887534d62c6a00c85bba4e"}, - {file = "pymssql-2.2.7-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:429491158fbee5309bd18b15d6fb29ad986b91afef4d05db5640fa7206d0d338"}, - {file = "pymssql-2.2.7-cp38-cp38-manylinux_2_24_i686.whl", hash = "sha256:3067423fb4cbf476c8d465fe5b7f081d3508524c1f4907b961a4c69af4280454"}, - {file = "pymssql-2.2.7-cp38-cp38-manylinux_2_24_x86_64.whl", hash = "sha256:1fc8a4b7d1a4146db70b5fbec3511bcfccb7b34d22a2aba89427bf55f8e44e23"}, - {file = "pymssql-2.2.7-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:6f873e481f7175bed246f756e250778ca723e52ec14bd9cb2bb0cfaeea237868"}, - {file = "pymssql-2.2.7-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:0da65a89c95dc6336281c6a84f67abece9d50350dfd9b1c574b04aeb7148967d"}, - {file = "pymssql-2.2.7-cp38-cp38-win32.whl", hash = "sha256:4c9b337972377cabe4782e3cb4fae95b328305b0815392004a330314f3441fd8"}, - {file = "pymssql-2.2.7-cp38-cp38-win_amd64.whl", hash = "sha256:46271abb5a657004c220a4675f4365978e1b67e826de5b98a2c06855e9816e17"}, - {file = "pymssql-2.2.7-cp39-cp39-macosx_10_15_x86_64.whl", hash = "sha256:ec7889c696f2cc27d17af86e21062d032d795bf81e48802820a69cfeb740667c"}, - {file = "pymssql-2.2.7-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:25c330fab365174a29f7b5d77b03c05836ee3d39e135fad7d66380b5d5b99911"}, - {file = "pymssql-2.2.7-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:c638398a023471ebde4774e2f8e5237bed07e7f934c4142c6d8e63ed42a86db1"}, - {file = "pymssql-2.2.7-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:aa413e4fa34c53b6cfaaf294ca9070bbce1c52e5b284b35ce8e2bfbfaeae9d96"}, - {file = "pymssql-2.2.7-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:319e0dabd35ddb3e20798e4dc1ed6a8f8038101deafd7aabf531c0c6eaedeb5d"}, - {file = "pymssql-2.2.7-cp39-cp39-manylinux_2_24_i686.whl", hash = "sha256:8d8a13e89483891afabf67211453eab7c8d5f73379ed77c21160a672d3a818fb"}, - {file = "pymssql-2.2.7-cp39-cp39-manylinux_2_24_x86_64.whl", hash = "sha256:56916753f74ffa1e3b89483ce529ba13fd42944636558099b173b5343815fb0e"}, - {file = "pymssql-2.2.7-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:084a1573a5e4a10e7ad6e978f98ad3cc9704fc844beec4275aab1ff691533712"}, - {file = "pymssql-2.2.7-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:6ed58a251e3aaffe4c731adad7d1468593dcd45f19375f1501f2bf8a54e1e355"}, - {file = "pymssql-2.2.7-cp39-cp39-win32.whl", hash = "sha256:78884588abfc44e99e3eaec46e19f5b08854af66eae9719a87a63b4645cf49b1"}, - {file = "pymssql-2.2.7-cp39-cp39-win_amd64.whl", hash = "sha256:cfa2bf7b8f7f462f72b2fa78b7753fc6c86a660dbea57d663993716afbb05072"}, - {file = "pymssql-2.2.7.tar.gz", hash = "sha256:ff95b910532ec7b02e4322231c117d3d6af0abab667e6fbf15442db873943045"}, + {file = "pymssql-2.2.11-cp310-cp310-macosx_11_0_x86_64.whl", hash = "sha256:692ab328ac290bd2031bc4dd6deae32665dfffda1b12aaa92928d3ebc667d5ad"}, + {file = "pymssql-2.2.11-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:723a4612421027a01b51e42e786678a18c4a27613a3ccecf331c026e0cc41353"}, + {file = "pymssql-2.2.11-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:34ab2373ca607174ad7244cfe955c07b6bc77a1e21d3c3143dbe934dec82c3a4"}, + {file = "pymssql-2.2.11-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1bc0ba19b4426c57509f065a03748d9ac230f1543ecdac57175e6ebd213a7bc0"}, + {file = "pymssql-2.2.11-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e8d9d42a50f6e8e6b356e4e8b2fa1da725344ec0be6f8a6107b7196e5bd74906"}, + {file = "pymssql-2.2.11-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aec64022a2419fad9f496f8e310522635e39d092970e1d55375ea0be86725174"}, + {file = "pymssql-2.2.11-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:c389c8041c94d4058827faf5735df5f8e4c1c1eebdd051859536dc393925a667"}, + {file = "pymssql-2.2.11-cp310-cp310-win32.whl", hash = "sha256:6452326cecd4dcee359a6f8878b827118a8c8523cd24de5b3a971a7a172e4275"}, + {file = "pymssql-2.2.11-cp310-cp310-win_amd64.whl", hash = "sha256:c1bde266dbc91b100abd0311102a6585df09cc963599421cc12fd6b4cfa8e3d3"}, + {file = "pymssql-2.2.11-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:6ddaf0597138179517bdbf5b5aa3caffee65987316dc906359a5d0801d0847ee"}, + {file = "pymssql-2.2.11-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0c26af25991715431559cb5b37f243b8ff676540f504ed0317774dfc71827af1"}, + {file = "pymssql-2.2.11-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:410e8c40b7c1b421e750cf80ccf2da8d802ed815575758ac9a78c5f6cd995723"}, + {file = "pymssql-2.2.11-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fa1767239ed45e1fa91d82fc0c63305750530787cd64089cabbe183eb538a35b"}, + {file = "pymssql-2.2.11-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:9a644e4158fed30ae9f3846f2f1c74d36fa1610eb552de35b7f611d063fa3c85"}, + {file = "pymssql-2.2.11-cp311-cp311-win32.whl", hash = "sha256:1956c111debe67f69a9c839b33ce420f0e8def1ef5ff9831c03d8ac840f82376"}, + {file = "pymssql-2.2.11-cp311-cp311-win_amd64.whl", hash = "sha256:0bdd1fb49b0e331e47e83f39d4af784c857e230bfc73519654bab29285c51c63"}, + {file = "pymssql-2.2.11-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:2609bbd3b715822bb4fa6d457b2985d32ad6ab9580fdb61ae6e0eee251791d24"}, + {file = "pymssql-2.2.11-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c382aea9adaaee189f352d7a493e3f76c13f9337ec2b6aa40e76b114fa13ebac"}, + {file = "pymssql-2.2.11-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5928324a09de7466368c15ece1de4ab5ea968d24943ceade758836f9fc7149f5"}, + {file = "pymssql-2.2.11-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ee8b10f797d0bfec626b803891cf9e98480ee11f2e8459a7616cdb7e4e4bf2de"}, + {file = "pymssql-2.2.11-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:1d5aa1a090b17f4ba75ffac3bb371f6c8c869692b653689396f9b470fde06981"}, + {file = "pymssql-2.2.11-cp312-cp312-win32.whl", hash = "sha256:1f7ba71cf81af65c005173f279928bf86700d295f97e4965e169b5764bc6c4f2"}, + {file = "pymssql-2.2.11-cp312-cp312-win_amd64.whl", hash = "sha256:a0ebb0e40c93f8f1e40aad80f512ae4aa89cb1ec8a96964b9afedcff1d5813fd"}, + {file = "pymssql-2.2.11-cp36-cp36m-macosx_10_14_x86_64.whl", hash = "sha256:e0ed115902956efaca9d9a20fa9b2b604e3e11d640416ca74900d215cdcbf3ab"}, + {file = "pymssql-2.2.11-cp36-cp36m-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:1a75afa17746972bb61120fb6ea907657fc1ab68250bbbd8b21a00d0720ed0f4"}, + {file = "pymssql-2.2.11-cp36-cp36m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:d2ae69d8e46637a203cfb48e05439fc9e2ff7646fa1f5396aa3577ce52810031"}, + {file = "pymssql-2.2.11-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f13710240457ace5b8c9cca7f4971504656f5703b702895a86386e87c7103801"}, + {file = "pymssql-2.2.11-cp36-cp36m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d7234b0f61dd9ccb2304171b5fd7ed9db133b4ea7c835c9942c9dc5bfc00c1cb"}, + {file = "pymssql-2.2.11-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0dcd76a8cc757c7cfe2d235f232a20d74ac8cebf9feabcdcbda5ef33157d14b1"}, + {file = "pymssql-2.2.11-cp36-cp36m-manylinux_2_28_x86_64.whl", hash = "sha256:84aff3235ad1289c4079c548cfcdf7eaaf2475b9f81557351deb42e8f45a9c2d"}, + {file = "pymssql-2.2.11-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:5b081aa7b02911e3f299f7d1f68ce8ca585a5119d44601bf4483da0aae8c2181"}, + {file = "pymssql-2.2.11-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:d315f08c106c884d6b42f70c9518e765a5bc23f6d3a587346bc4e6f198768c7a"}, + {file = "pymssql-2.2.11-cp36-cp36m-win32.whl", hash = "sha256:c8b35b3d5e326729e5edb73d593103d2dbfb474bd36ee95b4e85e1f8271ba98a"}, + {file = "pymssql-2.2.11-cp36-cp36m-win_amd64.whl", hash = "sha256:139c5032e0a2765764987803f1266132fcc5da572848ccc4d29cebba794a4260"}, + {file = "pymssql-2.2.11-cp37-cp37m-macosx_11_0_x86_64.whl", hash = "sha256:7bac28aed1d625a002e0289e0c18d1808cecbdc12e2a1a3927dbbaff66e5fff3"}, + {file = "pymssql-2.2.11-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:4eeaacc1dbbc678f4e80c6fd6fc279468021fdf2e486adc8631ec0de6b6c0e62"}, + {file = "pymssql-2.2.11-cp37-cp37m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:428e32e53c554798bc2d0682a169fcb681df6b68544c4aedd1186018ea7e0447"}, + {file = "pymssql-2.2.11-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2b621c5e32136dabc2fea25696beab0647ec336d25c04ab6d8eb8c8ee92f0e52"}, + {file = "pymssql-2.2.11-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:658c85474ea01ca3a30de769df06f46681e882524b05c6994cd6fd985c485f27"}, + {file = "pymssql-2.2.11-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:070181361ab94bdaeb14b591a35d853f327bc90c660b04047d474274fbb80357"}, + {file = "pymssql-2.2.11-cp37-cp37m-manylinux_2_28_x86_64.whl", hash = "sha256:492e49616b58b2d6caf4a2598cb344572870171a7b65ba1ac61a5e248b6a8e1c"}, + {file = "pymssql-2.2.11-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:803122aec31fbd52f5d65ef3b30b3bd2dc7b2a9e3a8223d16078a25805155c45"}, + {file = "pymssql-2.2.11-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:09075e129655ab1178d2d60efb9b3fbf5cdb6da2338ecdb3a92c53a4ad7efa0c"}, + {file = "pymssql-2.2.11-cp37-cp37m-win32.whl", hash = "sha256:b4a8377527702d746c490c2ce67d17f1c351d182b49b82fae6e67ae206bf9663"}, + {file = "pymssql-2.2.11-cp37-cp37m-win_amd64.whl", hash = "sha256:167313d91606dc7a3c05b2ad60491a138b7408a8779599ab6430a48a67f133f0"}, + {file = "pymssql-2.2.11-cp38-cp38-macosx_11_0_x86_64.whl", hash = "sha256:8d418f4dca245421242ed9df59d3bcda0cd081650df6deb1bef7f157b6a6f9dd"}, + {file = "pymssql-2.2.11-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:f0c44169df8d23c7ce172bd90ef5deb44caf19f15990e4db266e3193071988a4"}, + {file = "pymssql-2.2.11-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:b78032e45ea33c55d430b93e55370b900479ea324fae5d5d32486cc0fdc0fedd"}, + {file = "pymssql-2.2.11-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:984d99ee6a2579f86c536b1b0354ad3dc9701e98a4b3953f1301b4695477cd2f"}, + {file = "pymssql-2.2.11-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:287c8f79a7eca0c6787405797bac0f7c502d9be151f3f823aae12042235f8426"}, + {file = "pymssql-2.2.11-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:85ea4ea296afcae34bc61e4e0ef2f503270fd4bb097b308a07a9194f1f063aa1"}, + {file = "pymssql-2.2.11-cp38-cp38-manylinux_2_28_x86_64.whl", hash = "sha256:a114633fa02b7eb5bc63520bf07954106c0ed0ce032449c871abb8b8c435a872"}, + {file = "pymssql-2.2.11-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:7332db36a537cbc16640a0c3473a2e419aa5bc1f9953cada3212e7b2587de658"}, + {file = "pymssql-2.2.11-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:cd7292d872948c1f67c8cc12158f2c8ed9873d54368139ce1f67b2262ac34029"}, + {file = "pymssql-2.2.11-cp38-cp38-win32.whl", hash = "sha256:fbca115e11685b5891755cc22b3db4348071b8d100a41e1ce93526d9c3dbf2d5"}, + {file = "pymssql-2.2.11-cp38-cp38-win_amd64.whl", hash = "sha256:452b88a4ceca7efb934b5babb365851a3c52e723642092ebc92777397c2cacdb"}, + {file = "pymssql-2.2.11-cp39-cp39-macosx_11_0_x86_64.whl", hash = "sha256:001242cedc73587cbb10aec4069de50febbff3c4c50f9908a215476496b3beab"}, + {file = "pymssql-2.2.11-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:da492482b923b9cc9ad37f0f5592c776279299db2a89c0b7fc931aaefec652d4"}, + {file = "pymssql-2.2.11-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:139a833e6e72a624e4f2cde803a34a616d5661dd9a5b2ae0402d9d8a597b2f1f"}, + {file = "pymssql-2.2.11-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e57fbfad252434d64bdf4b6a935e4241616a4cf8df7af58b9772cd91fce9309a"}, + {file = "pymssql-2.2.11-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a5308507c2c4e94ede7e5b164870c1ba2be55abab6daf795b5529e2da4e838b6"}, + {file = "pymssql-2.2.11-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bdca43c42d5f370358535b2107140ed550d74f9ef0fc95d2d7fa8c4e40ee48c2"}, + {file = "pymssql-2.2.11-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:fe0cc975aac87b364fdb55cb89642435c3e859dcd99d7260f48af94111ba2673"}, + {file = "pymssql-2.2.11-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:4551f50c8a3b6ffbd71f794ee1c0c0134134c5d6414302c2fa28b67fe4470d07"}, + {file = "pymssql-2.2.11-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:ae9818df40588d5a49e7476f05e31cc83dea630d607178d66762ca8cf32e9f77"}, + {file = "pymssql-2.2.11-cp39-cp39-win32.whl", hash = "sha256:15257c7bd89c0283f70d6eaafd9b872201818572b8ba1e8576408ae23ef50c7c"}, + {file = "pymssql-2.2.11-cp39-cp39-win_amd64.whl", hash = "sha256:65bb674c0ba35379bf93d1b2cf06fdc5e7ec56e1d0e9de525bdcf977190b2865"}, + {file = "pymssql-2.2.11.tar.gz", hash = "sha256:15815bf1ff9edb475ec4ef567f23e23c4e828ce119ff5bf98a072b66b8d0ac1b"}, ] [[package]] name = "pymysql" version = "1.1.0" description = "Pure Python MySQL Driver" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -3549,7 +3577,6 @@ rsa = ["cryptography"] name = "PyNaCl" version = "1.5.0" description = "Python binding to the Networking and Cryptography (NaCl) library" -category = "main" optional = false python-versions = ">=3.6" files = [ @@ -3576,7 +3603,6 @@ tests = ["hypothesis (>=3.27.0)", "pytest (>=3.2.1,!=3.3.0)"] name = "pyopenssl" version = "22.0.0" description = "Python wrapper module around the OpenSSL library" -category = "main" optional = false python-versions = ">=3.6" files = [ @@ -3593,21 +3619,22 @@ test = ["flaky", "pretend", "pytest (>=3.0.1)"] [[package]] name = "pyotp" -version = "2.8.0" +version = "2.9.0" description = "Python One Time Password Library" -category = "main" optional = false python-versions = ">=3.7" files = [ - {file = "pyotp-2.8.0-py3-none-any.whl", hash = "sha256:889d037fdde6accad28531fc62a790f089e5dfd5b638773e9ee004cce074a2e5"}, - {file = "pyotp-2.8.0.tar.gz", hash = "sha256:c2f5e17d9da92d8ec1f7de6331ab08116b9115adbabcba6e208d46fc49a98c5a"}, + {file = "pyotp-2.9.0-py3-none-any.whl", hash = "sha256:81c2e5865b8ac55e825b0358e496e1d9387c811e85bb40e71a3b29b288963612"}, + {file = "pyotp-2.9.0.tar.gz", hash = "sha256:346b6642e0dbdde3b4ff5a930b664ca82abfa116356ed48cc42c7d6590d36f63"}, ] +[package.extras] +test = ["coverage", "mypy", "ruff", "wheel"] + [[package]] name = "pyparsing" version = "2.1.10" description = "Python parsing module" -category = "main" optional = false python-versions = "*" files = [ @@ -3616,11 +3643,31 @@ files = [ {file = "pyparsing-2.1.10.zip", hash = "sha256:0aa6e8d8c3f9c447a95a33bb04b103ead630121c3f4233e2980348cecf8b69c8"}, ] +[[package]] +name = "pypdf" +version = "3.17.2" +description = "A pure-python PDF library capable of splitting, merging, cropping, and transforming PDF files" +optional = false +python-versions = ">=3.6" +files = [ + {file = "pypdf-3.17.2-py3-none-any.whl", hash = "sha256:e149ed50aa41e04b176246714806cd8d6c6c6d68b528508f849642959041963a"}, + {file = "pypdf-3.17.2.tar.gz", hash = "sha256:d6f077060912f8292d7db3da04f7bf2428ac974781e11eef219193a22120f649"}, +] + +[package.dependencies] +typing_extensions = {version = ">=3.7.4.3", markers = "python_version < \"3.10\""} + +[package.extras] +crypto = ["PyCryptodome", "cryptography"] +dev = ["black", "flit", "pip-tools", "pre-commit (<2.18.0)", "pytest-cov", "pytest-socket", "pytest-timeout", "pytest-xdist", "wheel"] +docs = ["myst_parser", "sphinx", "sphinx_rtd_theme"] +full = ["Pillow (>=8.0.0)", "PyCryptodome", "cryptography"] +image = ["Pillow (>=8.0.0)"] + [[package]] name = "pypdf2" version = "1.27.9" description = "A pure-python PDF library capable of splitting, merging, cropping, and transforming PDF files" -category = "main" optional = false python-versions = ">=2.7" files = [ @@ -3628,22 +3675,10 @@ files = [ {file = "PyPDF2-1.27.9.tar.gz", hash = "sha256:5f7937fd94ba387a2a241db8858770e53091d8ffab9922512c0bf48e3f4cc615"}, ] -[[package]] -name = "PyPDF4" -version = "1.27.0" -description = "PDF toolkit" -category = "main" -optional = false -python-versions = "*" -files = [ - {file = "PyPDF4-1.27.0.tar.gz", hash = "sha256:7c932441146d205572f96254d53c79ea2c30c9e11df55a5cf87e056c7b3d7f89"}, -] - [[package]] name = "pyproj" version = "3.2.1" description = "Python interface to PROJ (cartographic projections and coordinate transformations library)" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -3676,7 +3711,6 @@ certifi = "*" name = "pyrfc3339" version = "1.1" description = "Generate and parse RFC 3339 timestamps" -category = "main" optional = false python-versions = "*" files = [ @@ -3691,7 +3725,6 @@ pytz = "*" name = "pyrsistent" version = "0.19.2" description = "Persistent/Functional/Immutable data structures" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -3723,7 +3756,6 @@ files = [ name = "pysass" version = "0.1.0" description = "Sass CLI Python: A wrapper to libsass-python with watchdog capability." -category = "main" optional = false python-versions = "*" files = [ @@ -3739,7 +3771,6 @@ watchdog = "*" name = "pyserial" version = "3.1.1" description = "Python Serial Port Extension" -category = "main" optional = false python-versions = "*" files = [ @@ -3751,7 +3782,6 @@ files = [ name = "pysftp" version = "0.2.9" description = "A friendly face on SFTP" -category = "main" optional = false python-versions = "*" files = [ @@ -3765,7 +3795,6 @@ paramiko = ">=1.17" name = "python-chess" version = "0.23.11" description = "A pure Python chess library with move generation and validation, Polyglot opening book probing, PGN reading and writing, Gaviota tablebase probing, Syzygy tablebase probing and XBoard/UCI engine communication." -category = "main" optional = false python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*" files = [ @@ -3779,7 +3808,6 @@ test = ["spur"] name = "python-dateutil" version = "2.7.3" description = "Extensions to the standard Python datetime module" -category = "main" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" files = [ @@ -3794,7 +3822,6 @@ six = ">=1.5" name = "python-git" version = "2018.2.1" description = "Automate boring git tasks" -category = "main" optional = false python-versions = "*" files = [ @@ -3809,7 +3836,6 @@ send2trash = "*" name = "python-jose" version = "3.3.0" description = "JOSE implementation in Python" -category = "main" optional = false python-versions = "*" files = [ @@ -3831,7 +3857,6 @@ pycryptodome = ["pyasn1", "pycryptodome (>=3.3.1,<4.0.0)"] name = "python-json-logger" version = "0.1.5" description = "A python library adding a json log formatter" -category = "main" optional = false python-versions = "*" files = [ @@ -3845,7 +3870,6 @@ setuptools = "*" name = "python-keystoneclient" version = "3.22.0" description = "Client Library for OpenStack Identity" -category = "main" optional = false python-versions = "*" files = [ @@ -3867,13 +3891,12 @@ stevedore = ">=1.20.0" [[package]] name = "python-ldap" -version = "3.4.3" +version = "3.4.4" description = "Python modules for implementing LDAP clients" -category = "main" optional = false python-versions = ">=3.6" files = [ - {file = "python-ldap-3.4.3.tar.gz", hash = "sha256:ab26c519a0ef2a443a2a10391fa3c5cb52d7871323399db949ebfaa9f25ee2a0"}, + {file = "python-ldap-3.4.4.tar.gz", hash = "sha256:7edb0accec4e037797705f3a05cbf36a9fde50d08c8f67f2aef99a2628fab828"}, ] [package.dependencies] @@ -3884,7 +3907,6 @@ pyasn1_modules = ">=0.1.5" name = "python-slugify" version = "8.0.1" description = "A Python slugify application that also handles Unicode" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -3900,14 +3922,13 @@ unidecode = ["Unidecode (>=1.1.1)"] [[package]] name = "python-stdnum" -version = "1.18" +version = "1.19" description = "Python module to handle standardized numbers and codes" -category = "main" optional = false python-versions = "*" files = [ - {file = "python-stdnum-1.18.tar.gz", hash = "sha256:bcc763d9c49ae23da5d2b7a686d5fd1deec9d9051341160a10d1ac723a26bec0"}, - {file = "python_stdnum-1.18-py2.py3-none-any.whl", hash = "sha256:d7f2a3c7ef4635c957b9cbdd9b1993d1f6ee3a2959f03e172c45440d99f296eb"}, + {file = "python-stdnum-1.19.tar.gz", hash = "sha256:133ec82f56390ea74c190569e98f2fb14b869808b1d54785708f22d0fead8b3f"}, + {file = "python_stdnum-1.19-py2.py3-none-any.whl", hash = "sha256:1b5b401ad3f45b798b0317313b781a433f5d7a5ff2c9feb8054664f76f78644e"}, ] [package.extras] @@ -3919,7 +3940,6 @@ soap-fallback = ["PySimpleSOAP"] name = "python-swiftclient" version = "3.9.0" description = "OpenStack Object Storage API Client Library" -category = "main" optional = false python-versions = "*" files = [ @@ -3939,7 +3959,6 @@ test = ["coverage (>=4.0,!=4.4)", "hacking (>=1.1.0,<1.2.0)", "keystoneauth1 (>= name = "python-u2flib-server" version = "5.0.1" description = "Python based U2F server library" -category = "main" optional = false python-versions = "*" files = [ @@ -3956,21 +3975,19 @@ u2f-server = ["WebOb"] [[package]] name = "pytz" -version = "2023.3" +version = "2023.3.post1" description = "World timezone definitions, modern and historical" -category = "main" optional = false python-versions = "*" files = [ - {file = "pytz-2023.3-py2.py3-none-any.whl", hash = "sha256:a151b3abb88eda1d4e34a9814df37de2a80e301e68ba0fd856fb9b46bfbbbffb"}, - {file = "pytz-2023.3.tar.gz", hash = "sha256:1d8ce29db189191fb55338ee6d0387d82ab59f3d00eac103412d64e0ebd0c588"}, + {file = "pytz-2023.3.post1-py2.py3-none-any.whl", hash = "sha256:ce42d816b81b68506614c11e8937d3aa9e41007ceb50bfdcb0749b921bf646c7"}, + {file = "pytz-2023.3.post1.tar.gz", hash = "sha256:7b4fddbeb94a1eba4b557da24f19fdf9db575192544270a9101d8509f9f43d7b"}, ] [[package]] name = "pytz-deprecation-shim" version = "0.1.0.post0" description = "Shims to make deprecation of pytz easier" -category = "main" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,>=2.7" files = [ @@ -3986,7 +4003,6 @@ tzdata = {version = "*", markers = "python_version >= \"3.6\""} name = "pyusb" version = "1.0.0" description = "Python USB access module" -category = "main" optional = false python-versions = "*" files = [ @@ -3997,7 +4013,6 @@ files = [ name = "pywin32" version = "305" description = "Python for Window Extensions" -category = "main" optional = false python-versions = "*" files = [ @@ -4021,7 +4036,6 @@ files = [ name = "pyyaml" version = "6.0" description = "YAML parser and emitter for Python" -category = "main" optional = false python-versions = ">=3.6" files = [ @@ -4071,7 +4085,6 @@ files = [ name = "pyzbar" version = "0.1.9" description = "Read one-dimensional barcodes and QR codes from Python 2 and 3." -category = "main" optional = false python-versions = "*" files = [ @@ -4087,7 +4100,6 @@ scripts = ["Pillow (>=3.2.0)"] name = "qrcode" version = "5.3" description = "QR Code image generator" -category = "main" optional = false python-versions = "*" files = [ @@ -4102,7 +4114,6 @@ six = "*" name = "redis" version = "3.5.3" description = "Python client for Redis key-value store" -category = "main" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" files = [ @@ -4117,7 +4128,6 @@ hiredis = ["hiredis (>=0.1.3)"] name = "regex" version = "2022.10.31" description = "Alternative regular expression module, to replace re." -category = "main" optional = false python-versions = ">=3.6" files = [ @@ -4215,7 +4225,6 @@ files = [ name = "reportlab" version = "3.6.5" description = "The Reportlab Toolkit" -category = "main" optional = false python-versions = ">=3.6, <4" files = [ @@ -4275,7 +4284,6 @@ rlpycairo = ["rlPyCairo (>=0.0.5)"] name = "requests" version = "2.28.1" description = "Python HTTP for Humans." -category = "main" optional = false python-versions = ">=3.7, <4" files = [ @@ -4297,7 +4305,6 @@ use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"] name = "requests-file" version = "1.5.1" description = "File transport adapter for Requests" -category = "main" optional = false python-versions = "*" files = [ @@ -4313,7 +4320,6 @@ six = "*" name = "requests-mock" version = "1.11.0" description = "Mock out responses from the requests package" -category = "main" optional = false python-versions = "*" files = [ @@ -4333,7 +4339,6 @@ test = ["fixtures", "mock", "purl", "pytest", "requests-futures", "sphinx", "tes name = "requests-oauthlib" version = "1.1.0" description = "OAuthlib authentication support for Requests." -category = "main" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" files = [ @@ -4352,7 +4357,6 @@ rsa = ["oauthlib[signedtoken] (>=2.1.0,<3.0.0)"] name = "requests-toolbelt" version = "0.9.1" description = "A utility belt for advanced users of python-requests" -category = "main" optional = false python-versions = "*" files = [ @@ -4367,7 +4371,6 @@ requests = ">=2.0.1,<3.0.0" name = "responses" version = "0.23.1" description = "A utility library for mocking out the `requests` Python library." -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -4389,7 +4392,6 @@ tests = ["coverage (>=6.0.0)", "flake8", "mypy", "pytest (>=7.0.0)", "pytest-asy name = "retrying" version = "1.3.4" description = "Retrying" -category = "main" optional = false python-versions = "*" files = [ @@ -4404,7 +4406,6 @@ six = ">=1.7.0" name = "rfc3986" version = "2.0.0" description = "Validating URI References per RFC 3986" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -4419,7 +4420,6 @@ idna2008 = ["idna"] name = "rich" version = "12.6.0" description = "Render rich text, tables, progress bars, syntax highlighting, markdown and more to the terminal" -category = "main" optional = false python-versions = ">=3.6.3,<4.0.0" files = [ @@ -4439,7 +4439,6 @@ jupyter = ["ipywidgets (>=7.5.1,<8.0.0)"] name = "rsa" version = "4.9" description = "Pure-Python RSA implementation" -category = "main" optional = false python-versions = ">=3.6,<4" files = [ @@ -4451,28 +4450,45 @@ files = [ pyasn1 = ">=0.1.3" [[package]] -name = "s3transfer" -version = "0.6.0" -description = "An Amazon S3 Transfer Manager" -category = "main" +name = "rtfde" +version = "0.1.0" +description = "A library for extracting HTML content from RTF encapsulated HTML as commonly found in the exchange MSG email format." optional = false -python-versions = ">= 3.7" +python-versions = ">=3.6" files = [ - {file = "s3transfer-0.6.0-py3-none-any.whl", hash = "sha256:06176b74f3a15f61f1b4f25a1fc29a4429040b7647133a463da8fa5bd28d5ecd"}, - {file = "s3transfer-0.6.0.tar.gz", hash = "sha256:2ed07d3866f523cc561bf4a00fc5535827981b117dd7876f036b0c1aca42c947"}, + {file = "RTFDE-0.1.0-py3-none-any.whl", hash = "sha256:a110dbef435803f3fba717d51a7b9c7a92695c2461637cc6eaf36a9f54386e26"}, + {file = "RTFDE-0.1.0.tar.gz", hash = "sha256:12215ee59856208010b9200c19afe0f9fa13a3fb39f44015979299c248cbacd7"}, ] [package.dependencies] -botocore = ">=1.12.36,<2.0a.0" +lark = "1.1.5" +oletools = ">=0.56" [package.extras] -crt = ["botocore[crt] (>=1.20.29,<2.0a.0)"] +dev = ["coverage (>=7.2.2)", "lxml (>=4.6)", "mypy (>=1.1.1)", "pdoc3 (>=0.10.0)"] +msg-parse = ["extract-msg (>=0.27)"] + +[[package]] +name = "s3transfer" +version = "0.8.2" +description = "An Amazon S3 Transfer Manager" +optional = false +python-versions = ">= 3.7" +files = [ + {file = "s3transfer-0.8.2-py3-none-any.whl", hash = "sha256:c9e56cbe88b28d8e197cf841f1f0c130f246595e77ae5b5a05b69fe7cb83de76"}, + {file = "s3transfer-0.8.2.tar.gz", hash = "sha256:368ac6876a9e9ed91f6bc86581e319be08188dc60d50e0d56308ed5765446283"}, +] + +[package.dependencies] +botocore = ">=1.33.2,<2.0a.0" + +[package.extras] +crt = ["botocore[crt] (>=1.33.2,<2.0a.0)"] [[package]] name = "Send2Trash" version = "1.8.0" description = "Send file to trash natively under Mac OS X, Windows and Linux." -category = "main" optional = false python-versions = "*" files = [ @@ -4487,14 +4503,13 @@ win32 = ["pywin32"] [[package]] name = "sentry-sdk" -version = "1.27.1" +version = "1.39.1" description = "Python client for Sentry (https://sentry.io)" -category = "main" optional = false python-versions = "*" files = [ - {file = "sentry-sdk-1.27.1.tar.gz", hash = "sha256:53f36293a0da271a22f476259d2fda76c0b8a1cb96b16d6e6e6aca490d7f3451"}, - {file = "sentry_sdk-1.27.1-py2.py3-none-any.whl", hash = "sha256:24308bd05a1f7d65e40acc68a768b4e5c35462039bfd6ae2ca116b92a7b53c78"}, + {file = "sentry-sdk-1.39.1.tar.gz", hash = "sha256:320a55cdf9da9097a0bead239c35b7e61f53660ef9878861824fd6d9b2eaf3b5"}, + {file = "sentry_sdk-1.39.1-py2.py3-none-any.whl", hash = "sha256:81b5b9ffdd1a374e9eb0c053b5d2012155db9cbe76393a8585677b753bd5fdc1"}, ] [package.dependencies] @@ -4504,10 +4519,12 @@ urllib3 = {version = ">=1.26.11", markers = "python_version >= \"3.6\""} [package.extras] aiohttp = ["aiohttp (>=3.5)"] arq = ["arq (>=0.23)"] +asyncpg = ["asyncpg (>=0.23)"] beam = ["apache-beam (>=2.12)"] bottle = ["bottle (>=0.12.13)"] celery = ["celery (>=3)"] chalice = ["chalice (>=1.16.0)"] +clickhouse-driver = ["clickhouse-driver (>=0.2.0)"] django = ["django (>=1.8)"] falcon = ["falcon (>=1.4)"] fastapi = ["fastapi (>=0.79.0)"] @@ -4517,6 +4534,7 @@ httpx = ["httpx (>=0.16.0)"] huey = ["huey (>=2)"] loguru = ["loguru (>=0.5)"] opentelemetry = ["opentelemetry-distro (>=0.35b0)"] +opentelemetry-experimental = ["opentelemetry-distro (>=0.40b0,<1.0)", "opentelemetry-instrumentation-aiohttp-client (>=0.40b0,<1.0)", "opentelemetry-instrumentation-django (>=0.40b0,<1.0)", "opentelemetry-instrumentation-fastapi (>=0.40b0,<1.0)", "opentelemetry-instrumentation-flask (>=0.40b0,<1.0)", "opentelemetry-instrumentation-requests (>=0.40b0,<1.0)", "opentelemetry-instrumentation-sqlite3 (>=0.40b0,<1.0)", "opentelemetry-instrumentation-urllib (>=0.40b0,<1.0)"] pure-eval = ["asttokens", "executing", "pure-eval"] pymongo = ["pymongo (>=3.1)"] pyspark = ["pyspark (>=2.4.4)"] @@ -4532,7 +4550,6 @@ tornado = ["tornado (>=5)"] name = "serial" version = "0.0.97" description = "A framework for serializing/deserializing JSON/YAML/XML into python class instances and vice versa" -category = "main" optional = false python-versions = "*" files = [ @@ -4549,7 +4566,6 @@ pyyaml = ">=3.13" name = "setuptools" version = "65.5.1" description = "Easily download, build, install, upgrade, and uninstall Python packages" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -4566,7 +4582,6 @@ testing-integration = ["build[virtualenv]", "filelock (>=3.4.0)", "jaraco.envs ( name = "sgmllib3k" version = "1.0.0" description = "Py3k port of sgmllib." -category = "main" optional = false python-versions = "*" files = [ @@ -4577,7 +4592,6 @@ files = [ name = "shapely" version = "1.8.5" description = "Geometric objects, predicates, and operations" -category = "main" optional = false python-versions = ">=3.6" files = [ @@ -4626,7 +4640,6 @@ vectorized = ["numpy"] name = "simplejson" version = "3.16.0" description = "Simple, fast, extensible JSON encoder/decoder for Python" -category = "main" optional = false python-versions = "*" files = [ @@ -4648,7 +4661,6 @@ files = [ 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 = [ @@ -4660,7 +4672,6 @@ files = [ name = "slugify" version = "0.0.1" description = "A generic slugifier." -category = "main" optional = false python-versions = "*" files = [ @@ -4671,7 +4682,6 @@ files = [ name = "smmap" version = "5.0.0" description = "A pure Python implementation of a sliding window memory map manager" -category = "main" optional = false python-versions = ">=3.6" files = [ @@ -4679,11 +4689,21 @@ files = [ {file = "smmap-5.0.0.tar.gz", hash = "sha256:c840e62059cd3be204b0c9c9f74be2c09d5648eddd4580d9314c3ecde0b30936"}, ] +[[package]] +name = "sniffio" +version = "1.3.0" +description = "Sniff out which async library your code is running under" +optional = false +python-versions = ">=3.7" +files = [ + {file = "sniffio-1.3.0-py3-none-any.whl", hash = "sha256:eecefdce1e5bbfb7ad2eeaabf7c1eeb404d7757c379bd1f7e5cce9d8bf425384"}, + {file = "sniffio-1.3.0.tar.gz", hash = "sha256:e60305c5e5d314f5389259b7f22aaa33d8f7dee49763119234af3755c55b9101"}, +] + [[package]] name = "snowballstemmer" version = "2.2.0" description = "This package provides 29 stemmers for 28 languages generated from Snowball algorithms." -category = "main" optional = false python-versions = "*" files = [ @@ -4695,7 +4715,6 @@ files = [ name = "soappy" version = "0.12.22" description = "SOAP Services for Python" -category = "main" optional = false python-versions = "*" files = [ @@ -4710,7 +4729,6 @@ wstools = "*" name = "soupsieve" version = "2.3.2.post1" description = "A modern CSS selector implementation for Beautiful Soup." -category = "main" optional = false python-versions = ">=3.6" files = [ @@ -4722,7 +4740,6 @@ files = [ name = "sphinx" version = "3.0.0" description = "Python documentation generator" -category = "main" optional = false python-versions = ">=3.5" files = [ @@ -4758,7 +4775,6 @@ test = ["cython", "html5lib", "pytest", "pytest-cov", "typed-ast"] name = "sphinx-intl" version = "2.1.0" description = "Sphinx utility that make it easy to translate and to apply translation." -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -4779,7 +4795,6 @@ test = ["mock", "pytest", "six"] name = "sphinx-rtd-theme" version = "1.2.2" description = "Read the Docs theme for Sphinx" -category = "main" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,>=2.7" files = [ @@ -4799,7 +4814,6 @@ dev = ["bump2version", "sphinxcontrib-httpdomain", "transifex-client", "wheel"] name = "sphinxcontrib-applehelp" version = "1.0.2" description = "sphinxcontrib-applehelp is a sphinx extension which outputs Apple help books" -category = "main" optional = false python-versions = ">=3.5" files = [ @@ -4815,7 +4829,6 @@ test = ["pytest"] name = "sphinxcontrib-devhelp" version = "1.0.2" description = "sphinxcontrib-devhelp is a sphinx extension which outputs Devhelp document." -category = "main" optional = false python-versions = ">=3.5" files = [ @@ -4831,7 +4844,6 @@ test = ["pytest"] name = "sphinxcontrib-htmlhelp" version = "2.0.0" description = "sphinxcontrib-htmlhelp is a sphinx extension which renders HTML help files" -category = "main" optional = false python-versions = ">=3.6" files = [ @@ -4847,7 +4859,6 @@ test = ["html5lib", "pytest"] name = "sphinxcontrib-jquery" version = "4.1" description = "Extension to include jQuery on newer Sphinx releases" -category = "main" optional = false python-versions = ">=2.7" files = [ @@ -4862,7 +4873,6 @@ Sphinx = ">=1.8" name = "sphinxcontrib-jsmath" version = "1.0.1" description = "A sphinx extension which renders display math in HTML via JavaScript" -category = "main" optional = false python-versions = ">=3.5" files = [ @@ -4877,7 +4887,6 @@ test = ["flake8", "mypy", "pytest"] name = "sphinxcontrib-qthelp" version = "1.0.3" description = "sphinxcontrib-qthelp is a sphinx extension which outputs QtHelp document." -category = "main" optional = false python-versions = ">=3.5" files = [ @@ -4893,7 +4902,6 @@ test = ["pytest"] name = "sphinxcontrib-serializinghtml" version = "1.1.5" description = "sphinxcontrib-serializinghtml is a sphinx extension which outputs \"serialized\" HTML files (json and pickle)." -category = "main" optional = false python-versions = ">=3.5" files = [ @@ -4907,62 +4915,70 @@ test = ["pytest"] [[package]] name = "sqlalchemy" -version = "2.0.18" +version = "2.0.23" description = "Database Abstraction Library" -category = "main" optional = false python-versions = ">=3.7" files = [ - {file = "SQLAlchemy-2.0.18-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:7ddd6d35c598af872f9a0a5bce7f7c4a1841684a72dab3302e3df7f17d1b5249"}, - {file = "SQLAlchemy-2.0.18-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:00aa050faf24ce5f2af643e2b86822fa1d7149649995f11bc1e769bbfbf9010b"}, - {file = "SQLAlchemy-2.0.18-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b52c6741073de5a744d27329f9803938dcad5c9fee7e61690c705f72973f4175"}, - {file = "SQLAlchemy-2.0.18-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7db97eabd440327c35b751d5ebf78a107f505586485159bcc87660da8bb1fdca"}, - {file = "SQLAlchemy-2.0.18-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:589aba9a35869695b319ed76c6f673d896cd01a7ff78054be1596df7ad9b096f"}, - {file = "SQLAlchemy-2.0.18-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:9da4ee8f711e077633730955c8f3cd2485c9abf5ea0f80aac23221a3224b9a8c"}, - {file = "SQLAlchemy-2.0.18-cp310-cp310-win32.whl", hash = "sha256:5dd574a37be388512c72fe0d7318cb8e31743a9b2699847a025e0c08c5bf579d"}, - {file = "SQLAlchemy-2.0.18-cp310-cp310-win_amd64.whl", hash = "sha256:6852cd34d96835e4c9091c1e6087325efb5b607b75fd9f7075616197d1c4688a"}, - {file = "SQLAlchemy-2.0.18-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:10e001a84f820fea2640e4500e12322b03afc31d8f4f6b813b44813b2a7c7e0d"}, - {file = "SQLAlchemy-2.0.18-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:bffd6cd47c2e68970039c0d3e355c9ed761d3ca727b204e63cd294cad0e3df90"}, - {file = "SQLAlchemy-2.0.18-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8b7b3ebfa9416c8eafaffa65216e229480c495e305a06ba176dcac32710744e6"}, - {file = "SQLAlchemy-2.0.18-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:79228a7b90d95957354f37b9d46f2cc8926262ae17b0d3ed8f36c892f2a37e06"}, - {file = "SQLAlchemy-2.0.18-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:ba633b51835036ff0f402c21f3ff567c565a22ff0a5732b060a68f4660e2a38f"}, - {file = "SQLAlchemy-2.0.18-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:8da677135eff43502b7afab5a1e641edfb2dc734ba7fc146e9b1b86817a728e2"}, - {file = "SQLAlchemy-2.0.18-cp311-cp311-win32.whl", hash = "sha256:82edf3a6090554a83942cec79151d6b5eb96e63d143e80e4cf6671e5d772f6be"}, - {file = "SQLAlchemy-2.0.18-cp311-cp311-win_amd64.whl", hash = "sha256:69ae0e9509c43474e33152abe1385b8954922544616426bf793481e1a37e094f"}, - {file = "SQLAlchemy-2.0.18-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:09397a18733fa2a4c7680b746094f980060666ee549deafdb5e102a99ce4619b"}, - {file = "SQLAlchemy-2.0.18-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:45b07470571bda5ee7f5ec471271bbde97267cc8403fce05e280c36ea73f4754"}, - {file = "SQLAlchemy-2.0.18-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1aac42a21a7fa6c9665392c840b295962992ddf40aecf0a88073bc5c76728117"}, - {file = "SQLAlchemy-2.0.18-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:da46beef0ce882546d92b7b2e8deb9e04dbb8fec72945a8eb28b347ca46bc15a"}, - {file = "SQLAlchemy-2.0.18-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:a6f1d8256d06f58e6ece150fbe05c63c7f9510df99ee8ac37423f5476a2cebb4"}, - {file = "SQLAlchemy-2.0.18-cp37-cp37m-win32.whl", hash = "sha256:67fbb40db3985c0cfb942fe8853ad94a5e9702d2987dec03abadc2f3b6a24afb"}, - {file = "SQLAlchemy-2.0.18-cp37-cp37m-win_amd64.whl", hash = "sha256:afb322ca05e2603deedbcd2e9910f11a3fd2f42bdeafe63018e5641945c7491c"}, - {file = "SQLAlchemy-2.0.18-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:908c850b98cac1e203ababd4ba76868d19ae0d7172cdc75d3f1b7829b16837d2"}, - {file = "SQLAlchemy-2.0.18-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:10514adc41fc8f5922728fbac13d401a1aefcf037f009e64ca3b92464e33bf0e"}, - {file = "SQLAlchemy-2.0.18-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2b791577c546b6bbd7b43953565fcb0a2fec63643ad605353dd48afbc3c48317"}, - {file = "SQLAlchemy-2.0.18-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:420bc6d06d4ae7fb6921524334689eebcbea7bf2005efef070a8562cc9527a37"}, - {file = "SQLAlchemy-2.0.18-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:ebdd2418ab4e2e26d572d9a1c03877f8514a9b7436729525aa571862507b3fea"}, - {file = "SQLAlchemy-2.0.18-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:556dc18e39b6edb76239acfd1c010e37395a54c7fde8c57481c15819a3ffb13e"}, - {file = "SQLAlchemy-2.0.18-cp38-cp38-win32.whl", hash = "sha256:7b8cba5a25e95041e3413d91f9e50616bcfaec95afa038ce7dc02efefe576745"}, - {file = "SQLAlchemy-2.0.18-cp38-cp38-win_amd64.whl", hash = "sha256:0f7fdcce52cd882b559a57b484efc92e108efeeee89fab6b623aba1ac68aad2e"}, - {file = "SQLAlchemy-2.0.18-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:d7a2c1e711ce59ac9d0bba780318bcd102d2958bb423209f24c6354d8c4da930"}, - {file = "SQLAlchemy-2.0.18-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:5c95e3e7cc6285bf7ff263eabb0d3bfe3def9a1ff98124083d45e5ece72f4579"}, - {file = "SQLAlchemy-2.0.18-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fc44e50f9d5e96af1a561faa36863f9191f27364a4df3eb70bca66e9370480b6"}, - {file = "SQLAlchemy-2.0.18-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bfa1a0f83bdf8061db8d17c2029454722043f1e4dd1b3d3d3120d1b54e75825a"}, - {file = "SQLAlchemy-2.0.18-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:194f2d5a7cb3739875c4d25b3fe288ab0b3dc33f7c857ba2845830c8c51170a0"}, - {file = "SQLAlchemy-2.0.18-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:4ebc542d2289c0b016d6945fd07a7e2e23f4abc41e731ac8ad18a9e0c2fd0ec2"}, - {file = "SQLAlchemy-2.0.18-cp39-cp39-win32.whl", hash = "sha256:774bd401e7993452ba0596e741c0c4d6d22f882dd2a798993859181dbffadc62"}, - {file = "SQLAlchemy-2.0.18-cp39-cp39-win_amd64.whl", hash = "sha256:2756485f49e7df5c2208bdc64263d19d23eba70666f14ad12d6d8278a2fff65f"}, - {file = "SQLAlchemy-2.0.18-py3-none-any.whl", hash = "sha256:6c5bae4c288bda92a7550fe8de9e068c0a7cd56b1c5d888aae5b40f0e13b40bd"}, - {file = "SQLAlchemy-2.0.18.tar.gz", hash = "sha256:1fb792051db66e09c200e7bc3bda3b1eb18a5b8eb153d2cedb2b14b56a68b8cb"}, + {file = "SQLAlchemy-2.0.23-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:638c2c0b6b4661a4fd264f6fb804eccd392745c5887f9317feb64bb7cb03b3ea"}, + {file = "SQLAlchemy-2.0.23-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e3b5036aa326dc2df50cba3c958e29b291a80f604b1afa4c8ce73e78e1c9f01d"}, + {file = "SQLAlchemy-2.0.23-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:787af80107fb691934a01889ca8f82a44adedbf5ef3d6ad7d0f0b9ac557e0c34"}, + {file = "SQLAlchemy-2.0.23-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c14eba45983d2f48f7546bb32b47937ee2cafae353646295f0e99f35b14286ab"}, + {file = "SQLAlchemy-2.0.23-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:0666031df46b9badba9bed00092a1ffa3aa063a5e68fa244acd9f08070e936d3"}, + {file = "SQLAlchemy-2.0.23-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:89a01238fcb9a8af118eaad3ffcc5dedaacbd429dc6fdc43fe430d3a941ff965"}, + {file = "SQLAlchemy-2.0.23-cp310-cp310-win32.whl", hash = "sha256:cabafc7837b6cec61c0e1e5c6d14ef250b675fa9c3060ed8a7e38653bd732ff8"}, + {file = "SQLAlchemy-2.0.23-cp310-cp310-win_amd64.whl", hash = "sha256:87a3d6b53c39cd173990de2f5f4b83431d534a74f0e2f88bd16eabb5667e65c6"}, + {file = "SQLAlchemy-2.0.23-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:d5578e6863eeb998980c212a39106ea139bdc0b3f73291b96e27c929c90cd8e1"}, + {file = "SQLAlchemy-2.0.23-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:62d9e964870ea5ade4bc870ac4004c456efe75fb50404c03c5fd61f8bc669a72"}, + {file = "SQLAlchemy-2.0.23-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c80c38bd2ea35b97cbf7c21aeb129dcbebbf344ee01a7141016ab7b851464f8e"}, + {file = "SQLAlchemy-2.0.23-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:75eefe09e98043cff2fb8af9796e20747ae870c903dc61d41b0c2e55128f958d"}, + {file = "SQLAlchemy-2.0.23-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:bd45a5b6c68357578263d74daab6ff9439517f87da63442d244f9f23df56138d"}, + {file = "SQLAlchemy-2.0.23-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:a86cb7063e2c9fb8e774f77fbf8475516d270a3e989da55fa05d08089d77f8c4"}, + {file = "SQLAlchemy-2.0.23-cp311-cp311-win32.whl", hash = "sha256:b41f5d65b54cdf4934ecede2f41b9c60c9f785620416e8e6c48349ab18643855"}, + {file = "SQLAlchemy-2.0.23-cp311-cp311-win_amd64.whl", hash = "sha256:9ca922f305d67605668e93991aaf2c12239c78207bca3b891cd51a4515c72e22"}, + {file = "SQLAlchemy-2.0.23-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:d0f7fb0c7527c41fa6fcae2be537ac137f636a41b4c5a4c58914541e2f436b45"}, + {file = "SQLAlchemy-2.0.23-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:7c424983ab447dab126c39d3ce3be5bee95700783204a72549c3dceffe0fc8f4"}, + {file = "SQLAlchemy-2.0.23-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f508ba8f89e0a5ecdfd3761f82dda2a3d7b678a626967608f4273e0dba8f07ac"}, + {file = "SQLAlchemy-2.0.23-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6463aa765cf02b9247e38b35853923edbf2f6fd1963df88706bc1d02410a5577"}, + {file = "SQLAlchemy-2.0.23-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:e599a51acf3cc4d31d1a0cf248d8f8d863b6386d2b6782c5074427ebb7803bda"}, + {file = "SQLAlchemy-2.0.23-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:fd54601ef9cc455a0c61e5245f690c8a3ad67ddb03d3b91c361d076def0b4c60"}, + {file = "SQLAlchemy-2.0.23-cp312-cp312-win32.whl", hash = "sha256:42d0b0290a8fb0165ea2c2781ae66e95cca6e27a2fbe1016ff8db3112ac1e846"}, + {file = "SQLAlchemy-2.0.23-cp312-cp312-win_amd64.whl", hash = "sha256:227135ef1e48165f37590b8bfc44ed7ff4c074bf04dc8d6f8e7f1c14a94aa6ca"}, + {file = "SQLAlchemy-2.0.23-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:14aebfe28b99f24f8a4c1346c48bc3d63705b1f919a24c27471136d2f219f02d"}, + {file = "SQLAlchemy-2.0.23-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3e983fa42164577d073778d06d2cc5d020322425a509a08119bdcee70ad856bf"}, + {file = "SQLAlchemy-2.0.23-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7e0dc9031baa46ad0dd5a269cb7a92a73284d1309228be1d5935dac8fb3cae24"}, + {file = "SQLAlchemy-2.0.23-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:5f94aeb99f43729960638e7468d4688f6efccb837a858b34574e01143cf11f89"}, + {file = "SQLAlchemy-2.0.23-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:63bfc3acc970776036f6d1d0e65faa7473be9f3135d37a463c5eba5efcdb24c8"}, + {file = "SQLAlchemy-2.0.23-cp37-cp37m-win32.whl", hash = "sha256:f48ed89dd11c3c586f45e9eec1e437b355b3b6f6884ea4a4c3111a3358fd0c18"}, + {file = "SQLAlchemy-2.0.23-cp37-cp37m-win_amd64.whl", hash = "sha256:1e018aba8363adb0599e745af245306cb8c46b9ad0a6fc0a86745b6ff7d940fc"}, + {file = "SQLAlchemy-2.0.23-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:64ac935a90bc479fee77f9463f298943b0e60005fe5de2aa654d9cdef46c54df"}, + {file = "SQLAlchemy-2.0.23-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:c4722f3bc3c1c2fcc3702dbe0016ba31148dd6efcd2a2fd33c1b4897c6a19693"}, + {file = "SQLAlchemy-2.0.23-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4af79c06825e2836de21439cb2a6ce22b2ca129bad74f359bddd173f39582bf5"}, + {file = "SQLAlchemy-2.0.23-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:683ef58ca8eea4747737a1c35c11372ffeb84578d3aab8f3e10b1d13d66f2bc4"}, + {file = "SQLAlchemy-2.0.23-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:d4041ad05b35f1f4da481f6b811b4af2f29e83af253bf37c3c4582b2c68934ab"}, + {file = "SQLAlchemy-2.0.23-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:aeb397de65a0a62f14c257f36a726945a7f7bb60253462e8602d9b97b5cbe204"}, + {file = "SQLAlchemy-2.0.23-cp38-cp38-win32.whl", hash = "sha256:42ede90148b73fe4ab4a089f3126b2cfae8cfefc955c8174d697bb46210c8306"}, + {file = "SQLAlchemy-2.0.23-cp38-cp38-win_amd64.whl", hash = "sha256:964971b52daab357d2c0875825e36584d58f536e920f2968df8d581054eada4b"}, + {file = "SQLAlchemy-2.0.23-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:616fe7bcff0a05098f64b4478b78ec2dfa03225c23734d83d6c169eb41a93e55"}, + {file = "SQLAlchemy-2.0.23-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:0e680527245895aba86afbd5bef6c316831c02aa988d1aad83c47ffe92655e74"}, + {file = "SQLAlchemy-2.0.23-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9585b646ffb048c0250acc7dad92536591ffe35dba624bb8fd9b471e25212a35"}, + {file = "SQLAlchemy-2.0.23-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4895a63e2c271ffc7a81ea424b94060f7b3b03b4ea0cd58ab5bb676ed02f4221"}, + {file = "SQLAlchemy-2.0.23-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:cc1d21576f958c42d9aec68eba5c1a7d715e5fc07825a629015fe8e3b0657fb0"}, + {file = "SQLAlchemy-2.0.23-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:967c0b71156f793e6662dd839da54f884631755275ed71f1539c95bbada9aaab"}, + {file = "SQLAlchemy-2.0.23-cp39-cp39-win32.whl", hash = "sha256:0a8c6aa506893e25a04233bc721c6b6cf844bafd7250535abb56cb6cc1368884"}, + {file = "SQLAlchemy-2.0.23-cp39-cp39-win_amd64.whl", hash = "sha256:f3420d00d2cb42432c1d0e44540ae83185ccbbc67a6054dcc8ab5387add6620b"}, + {file = "SQLAlchemy-2.0.23-py3-none-any.whl", hash = "sha256:31952bbc527d633b9479f5f81e8b9dfada00b91d6baba021a869095f1a97006d"}, + {file = "SQLAlchemy-2.0.23.tar.gz", hash = "sha256:c1bda93cbbe4aa2aa0aa8655c5aeda505cd219ff3e8da91d1d329e143e4aff69"}, ] [package.dependencies] -greenlet = {version = "!=0.4.17", markers = "platform_machine == \"aarch64\" or platform_machine == \"ppc64le\" or platform_machine == \"x86_64\" or platform_machine == \"amd64\" or platform_machine == \"AMD64\" or platform_machine == \"win32\" or platform_machine == \"WIN32\""} +greenlet = {version = "!=0.4.17", markers = "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\""} typing-extensions = ">=4.2.0" [package.extras] -aiomysql = ["aiomysql", "greenlet (!=0.4.17)"] +aiomysql = ["aiomysql (>=0.2.0)", "greenlet (!=0.4.17)"] +aioodbc = ["aioodbc", "greenlet (!=0.4.17)"] aiosqlite = ["aiosqlite", "greenlet (!=0.4.17)", "typing-extensions (!=3.10.0.1)"] asyncio = ["greenlet (!=0.4.17)"] asyncmy = ["asyncmy (>=0.2.3,!=0.2.4,!=0.2.6)", "greenlet (!=0.4.17)"] @@ -4973,7 +4989,7 @@ mssql-pyodbc = ["pyodbc"] mypy = ["mypy (>=0.910)"] mysql = ["mysqlclient (>=1.4.0)"] mysql-connector = ["mysql-connector-python"] -oracle = ["cx-oracle (>=7)"] +oracle = ["cx-oracle (>=8)"] oracle-oracledb = ["oracledb (>=1.0.1)"] postgresql = ["psycopg2 (>=2.7)"] postgresql-asyncpg = ["asyncpg", "greenlet (!=0.4.17)"] @@ -4989,7 +5005,6 @@ sqlcipher = ["sqlcipher3-binary"] name = "sqlparse" version = "0.4.4" description = "A non-validating SQL parser." -category = "main" optional = false python-versions = ">=3.5" files = [ @@ -5006,7 +5021,6 @@ test = ["pytest", "pytest-cov"] name = "statsd" version = "3.2.1" description = "A simple statsd client." -category = "main" optional = false python-versions = "*" files = [ @@ -5018,7 +5032,6 @@ files = [ name = "stevedore" version = "3.5.2" description = "Manage dynamic plugins for Python applications" -category = "main" optional = false python-versions = ">=3.6" files = [ @@ -5034,7 +5047,6 @@ pbr = ">=2.0.0,<2.1.0 || >2.1.0" name = "text-unidecode" version = "1.3" description = "The most basic Text::Unidecode port" -category = "main" optional = false python-versions = "*" files = [ @@ -5046,7 +5058,6 @@ files = [ name = "toml" version = "0.10.2" description = "Python Library for Tom's Obvious, Minimal Language" -category = "main" optional = false python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" files = [ @@ -5058,7 +5069,6 @@ files = [ name = "tomli" version = "2.0.1" description = "A lil' TOML parser" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -5070,7 +5080,6 @@ files = [ name = "tomlkit" version = "0.11.6" description = "Style preserving TOML library" -category = "main" optional = false python-versions = ">=3.6" files = [ @@ -5082,7 +5091,6 @@ files = [ name = "toolz" version = "0.12.0" description = "List processing tools and functional utilities" -category = "main" optional = false python-versions = ">=3.5" files = [ @@ -5094,7 +5102,6 @@ files = [ name = "tornado" version = "6.1" description = "Tornado is a Python web framework and asynchronous networking library, originally developed at FriendFeed." -category = "main" optional = false python-versions = ">= 3.5" files = [ @@ -5143,21 +5150,20 @@ files = [ [[package]] name = "tqdm" -version = "4.65.0" +version = "4.66.1" description = "Fast, Extensible Progress Meter" -category = "main" optional = false python-versions = ">=3.7" files = [ - {file = "tqdm-4.65.0-py3-none-any.whl", hash = "sha256:c4f53a17fe37e132815abceec022631be8ffe1b9381c2e6e30aa70edc99e9671"}, - {file = "tqdm-4.65.0.tar.gz", hash = "sha256:1871fb68a86b8fb3b59ca4cdd3dcccbc7e6d613eeed31f4c332531977b89beb5"}, + {file = "tqdm-4.66.1-py3-none-any.whl", hash = "sha256:d302b3c5b53d47bce91fea46679d9c3c6508cf6332229aa1e7d8653723793386"}, + {file = "tqdm-4.66.1.tar.gz", hash = "sha256:d88e651f9db8d8551a62556d3cff9e3034274ca5d66e93197cf2490e2dcb69c7"}, ] [package.dependencies] colorama = {version = "*", markers = "platform_system == \"Windows\""} [package.extras] -dev = ["py-make (>=0.1.0)", "twine", "wheel"] +dev = ["pytest (>=6)", "pytest-cov", "pytest-timeout", "pytest-xdist"] notebook = ["ipywidgets (>=6)"] slack = ["slack-sdk"] telegram = ["requests"] @@ -5166,7 +5172,6 @@ telegram = ["requests"] name = "typed-ast" version = "1.5.4" description = "a fork of Python 2 and 3 ast modules with type comment support" -category = "main" optional = false python-versions = ">=3.6" files = [ @@ -5200,7 +5205,6 @@ files = [ name = "types-cryptography" version = "3.3.23.2" description = "Typing stubs for cryptography" -category = "main" optional = false python-versions = "*" files = [ @@ -5212,7 +5216,6 @@ files = [ name = "types-pyyaml" version = "6.0.12.9" description = "Typing stubs for PyYAML" -category = "main" optional = false python-versions = "*" files = [ @@ -5222,21 +5225,19 @@ files = [ [[package]] name = "typing-extensions" -version = "4.4.0" +version = "4.7.1" description = "Backported and Experimental Type Hints for Python 3.7+" -category = "main" optional = false python-versions = ">=3.7" files = [ - {file = "typing_extensions-4.4.0-py3-none-any.whl", hash = "sha256:16fa4864408f655d35ec496218b85f79b3437c829e93320c7c9215ccfd92489e"}, - {file = "typing_extensions-4.4.0.tar.gz", hash = "sha256:1511434bb92bf8dd198c12b1cc812e800d4181cfcb867674e0f8279cc93087aa"}, + {file = "typing_extensions-4.7.1-py3-none-any.whl", hash = "sha256:440d5dd3af93b060174bf433bccd69b0babc3b15b1a8dca43789fd7f61514b36"}, + {file = "typing_extensions-4.7.1.tar.gz", hash = "sha256:b75ddc264f0ba5615db7ba217daeb99701ad295353c45f9e95963337ceeeffb2"}, ] [[package]] name = "tzdata" version = "2022.7" description = "Provider of IANA time zone data" -category = "main" optional = false python-versions = ">=2" files = [ @@ -5248,7 +5249,6 @@ files = [ name = "tzlocal" version = "4.2" description = "tzinfo object for the local timezone" -category = "main" optional = false python-versions = ">=3.6" files = [ @@ -5269,7 +5269,6 @@ test = ["pytest (>=4.3)", "pytest-mock (>=3.3)"] name = "unidecode" version = "1.0.22" description = "ASCII transliterations of Unicode text" -category = "main" optional = false python-versions = "*" files = [ @@ -5281,7 +5280,6 @@ files = [ name = "unidiff" version = "0.7.5" description = "Unified diff parsing/metadata extraction library." -category = "main" optional = false python-versions = "*" files = [ @@ -5291,18 +5289,17 @@ files = [ [[package]] name = "urllib3" -version = "1.26.16" +version = "1.26.18" description = "HTTP library with thread-safe connection pooling, file post, and more." -category = "main" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*" files = [ - {file = "urllib3-1.26.16-py2.py3-none-any.whl", hash = "sha256:8d36afa7616d8ab714608411b4a3b13e58f463aee519024578e062e141dce20f"}, - {file = "urllib3-1.26.16.tar.gz", hash = "sha256:8f135f6502756bde6b2a9b28989df5fbe87c9970cecaa69041edcce7f0589b14"}, + {file = "urllib3-1.26.18-py2.py3-none-any.whl", hash = "sha256:34b97092d7e0a3a8cf7cd10e386f401b3737364026c45e622aa02903dffe0f07"}, + {file = "urllib3-1.26.18.tar.gz", hash = "sha256:f8ecc1bba5667413457c529ab955bf8c67b45db799d159066261719e328580a0"}, ] [package.extras] -brotli = ["brotli (>=1.0.9)", "brotlicffi (>=0.8.0)", "brotlipy (>=0.6.0)"] +brotli = ["brotli (==1.0.9)", "brotli (>=1.0.9)", "brotlicffi (>=0.8.0)", "brotlipy (>=0.6.0)"] secure = ["certifi", "cryptography (>=1.3.4)", "idna (>=2.0.0)", "ipaddress", "pyOpenSSL (>=0.14)", "urllib3-secure-extra"] socks = ["PySocks (>=1.5.6,!=1.5.7,<2.0)"] @@ -5310,7 +5307,6 @@ socks = ["PySocks (>=1.5.6,!=1.5.7,<2.0)"] name = "uvloop" version = "0.17.0" description = "Fast implementation of asyncio event loop on top of libuv" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -5355,7 +5351,6 @@ test = ["Cython (>=0.29.32,<0.30.0)", "aiohttp", "flake8 (>=3.9.2,<3.10.0)", "my name = "validators" version = "0.20.0" description = "Python Data Validation for Humans™." -category = "main" optional = false python-versions = ">=3.4" files = [ @@ -5372,7 +5367,6 @@ test = ["flake8 (>=2.4.0)", "isort (>=4.2.2)", "pytest (>=2.2.3)"] name = "vcrpy" version = "4.4.0" description = "Automatically mock your HTTP interactions to simplify and speed up testing" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -5391,7 +5385,6 @@ yarl = "*" name = "vcrpy-unittest" version = "0.1.7" description = "Python unittest integration for vcr.py" -category = "main" optional = false python-versions = "*" files = [ @@ -5406,7 +5399,6 @@ vcrpy = "*" name = "vobject" version = "0.9.3" description = "A full-featured Python package for parsing and creating iCalendar and vCard files" -category = "main" optional = false python-versions = "*" files = [ @@ -5420,7 +5412,6 @@ python-dateutil = ">=2.4.0" name = "voicent-python" version = "1.0" description = "Voicent Python Library" -category = "main" optional = false python-versions = "*" files = [ @@ -5435,7 +5426,6 @@ requests = ">=2.20.0" name = "watchdog" version = "2.2.0" description = "Filesystem events monitoring" -category = "main" optional = false python-versions = ">=3.6" files = [ @@ -5476,7 +5466,6 @@ watchmedo = ["PyYAML (>=3.10)"] name = "webcolors" version = "1.13" description = "A library for working with the color formats defined by HTML and CSS." -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -5492,7 +5481,6 @@ tests = ["pytest", "pytest-cov"] name = "websocket-client" version = "1.6.1" description = "WebSocket client for Python with low level API options" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -5509,7 +5497,6 @@ test = ["websockets"] name = "wechatpy" version = "1.8.18" description = "WeChat SDK for Python" -category = "main" optional = false python-versions = "*" files = [ @@ -5533,7 +5520,6 @@ pycrypto = ["pycryptodome"] name = "werkzeug" version = "0.16.1" description = "The comprehensive WSGI web application library." -category = "main" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" files = [ @@ -5550,7 +5536,6 @@ watchdog = ["watchdog"] name = "wget" version = "3.2" description = "pure python download utility" -category = "main" optional = false python-versions = "*" files = [ @@ -5559,24 +5544,22 @@ files = [ [[package]] name = "wheel" -version = "0.40.0" +version = "0.42.0" description = "A built-package format for Python" -category = "main" optional = false python-versions = ">=3.7" files = [ - {file = "wheel-0.40.0-py3-none-any.whl", hash = "sha256:d236b20e7cb522daf2390fa84c55eea81c5c30190f90f29ae2ca1ad8355bf247"}, - {file = "wheel-0.40.0.tar.gz", hash = "sha256:cd1196f3faee2b31968d626e1731c94f99cbdb67cf5a46e4f5656cbee7738873"}, + {file = "wheel-0.42.0-py3-none-any.whl", hash = "sha256:177f9c9b0d45c47873b619f5b650346d632cdc35fb5e4d25058e09c9e581433d"}, + {file = "wheel-0.42.0.tar.gz", hash = "sha256:c45be39f7882c9d34243236f2d63cbd58039e360f85d0913425fbd7ceea617a8"}, ] [package.extras] -test = ["pytest (>=6.0.0)"] +test = ["pytest (>=6.0.0)", "setuptools (>=65)"] [[package]] name = "win-unicode-console" version = "0.5" description = "Enable Unicode input and display when running Python from Windows console." -category = "main" optional = false python-versions = "*" files = [ @@ -5587,7 +5570,6 @@ files = [ name = "wrapt" version = "1.14.1" description = "Module for decorators, wrappers and monkey patching." -category = "main" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7" files = [ @@ -5610,6 +5592,16 @@ files = [ {file = "wrapt-1.14.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:8ad85f7f4e20964db4daadcab70b47ab05c7c1cf2a7c1e51087bfaa83831854c"}, {file = "wrapt-1.14.1-cp310-cp310-win32.whl", hash = "sha256:a9a52172be0b5aae932bef82a79ec0a0ce87288c7d132946d645eba03f0ad8a8"}, {file = "wrapt-1.14.1-cp310-cp310-win_amd64.whl", hash = "sha256:6d323e1554b3d22cfc03cd3243b5bb815a51f5249fdcbb86fda4bf62bab9e164"}, + {file = "wrapt-1.14.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:ecee4132c6cd2ce5308e21672015ddfed1ff975ad0ac8d27168ea82e71413f55"}, + {file = "wrapt-1.14.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:2020f391008ef874c6d9e208b24f28e31bcb85ccff4f335f15a3251d222b92d9"}, + {file = "wrapt-1.14.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2feecf86e1f7a86517cab34ae6c2f081fd2d0dac860cb0c0ded96d799d20b335"}, + {file = "wrapt-1.14.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:240b1686f38ae665d1b15475966fe0472f78e71b1b4903c143a842659c8e4cb9"}, + {file = "wrapt-1.14.1-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a9008dad07d71f68487c91e96579c8567c98ca4c3881b9b113bc7b33e9fd78b8"}, + {file = "wrapt-1.14.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:6447e9f3ba72f8e2b985a1da758767698efa72723d5b59accefd716e9e8272bf"}, + {file = "wrapt-1.14.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:acae32e13a4153809db37405f5eba5bac5fbe2e2ba61ab227926a22901051c0a"}, + {file = "wrapt-1.14.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:49ef582b7a1152ae2766557f0550a9fcbf7bbd76f43fbdc94dd3bf07cc7168be"}, + {file = "wrapt-1.14.1-cp311-cp311-win32.whl", hash = "sha256:358fe87cc899c6bb0ddc185bf3dbfa4ba646f05b1b0b9b5a27c2cb92c2cea204"}, + {file = "wrapt-1.14.1-cp311-cp311-win_amd64.whl", hash = "sha256:26046cd03936ae745a502abf44dac702a5e6880b2b01c29aea8ddf3353b68224"}, {file = "wrapt-1.14.1-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:43ca3bbbe97af00f49efb06e352eae40434ca9d915906f77def219b88e85d907"}, {file = "wrapt-1.14.1-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:6b1a564e6cb69922c7fe3a678b9f9a3c54e72b469875aa8018f18b4d1dd1adf3"}, {file = "wrapt-1.14.1-cp35-cp35m-manylinux2010_i686.whl", hash = "sha256:00b6d4ea20a906c0ca56d84f93065b398ab74b927a7a3dbd470f6fc503f95dc3"}, @@ -5661,7 +5653,6 @@ files = [ name = "wstools" version = "0.4.8" description = "WSDL parsing services package for Web Services for Python." -category = "main" optional = false python-versions = "*" files = [ @@ -5678,7 +5669,6 @@ six = "*" name = "xlrd" version = "1.0.0" description = "Library for developers to extract data from Microsoft Excel (tm) spreadsheet files" -category = "main" optional = false python-versions = "*" files = [ @@ -5690,7 +5680,6 @@ files = [ name = "xlsxwriter" version = "0.9.3" description = "A Python module for creating Excel XLSX files." -category = "main" optional = false python-versions = "*" files = [ @@ -5702,7 +5691,6 @@ files = [ name = "xlwt" version = "1.3.0" description = "Library to create spreadsheet files compatible with MS Excel 97/2000/XP/2003 XLS files, on any platform, with Python 2.6, 2.7, 3.3+" -category = "main" optional = false python-versions = "*" files = [ @@ -5714,7 +5702,6 @@ files = [ name = "xmlformatter" version = "0.2.4" description = "Format and compress XML documents" -category = "main" optional = false python-versions = "*" files = [ @@ -5725,7 +5712,6 @@ files = [ name = "xmltodict" version = "0.13.0" description = "Makes working with XML feel like you are working with JSON" -category = "main" optional = false python-versions = ">=3.4" files = [ @@ -5737,7 +5723,6 @@ files = [ name = "yarl" version = "1.8.2" description = "Yet another URL library" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -5826,7 +5811,6 @@ typing-extensions = {version = ">=3.7.4", markers = "python_version < \"3.8\""} name = "zeep" version = "4.2.1" description = "A Python SOAP client" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -5855,7 +5839,6 @@ xmlsec = ["xmlsec (>=0.6.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 = [ @@ -5871,7 +5854,6 @@ testing = ["big-O", "flake8 (<5)", "jaraco.functools", "jaraco.itertools", "more name = "zxcvbn" version = "4.4.28" description = "" -category = "main" optional = false python-versions = "*" files = [ @@ -5881,4 +5863,4 @@ files = [ [metadata] lock-version = "2.0" python-versions = "^3.7.16" -content-hash = "e3d80bd8df1d6e0f9b0234ad53565bc66f98a0b77952743e4a237283fe19b1fe" +content-hash = "d664079ea3d3494a8144d75d8284667d887ca46df5e29b80cee078af9d426df4" diff --git a/pyproject.toml b/pyproject.toml index 3994319..b3165ee 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -19,49 +19,49 @@ authors = [ "Mathieu Benoit ",] [tool.poetry.dependencies] python = "^3.7.16" -acme = "^2.6.0" +acme = "2.6.0" agithub = "^2.2.2" aioshutil = "<1.2" -altair = "^5.0.1" -argcomplete = "^3.1.1" +altair = "5.0.1" +argcomplete = "3.1.1" asterisk = "^0.0.8" astor = "^0.8.1" -azure-identity = "^1.13.0" -azure-storage-blob = "^12.16.0" +azure-identity = "^1.15.0" +azure-storage-blob = "^12.19.0" babel = "2.9.1" beautifulsoup4 = "^4.12.2" bokeh = "1.1.0" boto3 = ">=1.20.41" cachetools = ">=2.0.1" -cerberus = "^1.3.4" +cerberus = "^1.3.5" chardet = "5.0.0" -click = "^8.1.4" -cloudflare = "^2.11.6" +click = "^8.1.7" +cloudflare = "^2.14.3" code-writer = "^1.1.1" colorama = "^0.4.6" configparser = "5.0.2" -coverage = "^7.2.7" +coverage = "7.2.7" cryptography = "39.0.1" css-html-prettify = "^2.5.5" -cython = "^0.29.36" +cython = "^3.0.6" ddt = "1.2.0" decorator = "4.0.10" -dnspython = "^2.3.0" +dnspython = "2.3.0" docutils = "0.17.1" ebaysdk = "2.1.5" -email-validator = "^2.0.0.post2" -emoji = "^2.6.0" -extract-msg = "<0.30" -factur-x = "^2.5" +email-validator = "2.1.0" +emoji = "^2.9.0" +extract-msg = "0.36.1" +factur-x = "^3.1" feedparser = "6.0.10" flake8 = "<6.0.0" -formio-data = "^0.5.1" +formio-data = "^1.2.4" freezegun = "1.2.2" future = "0.18.3" geojson = "<3.0.0" gevent = "1.5.0" gitpython = "3.1.30" -giturlparse = "^0.10.0" +giturlparse = "0.10.0" greenlet = "0.4.14" html2text = "2016.9.19" invoice2data = "0.3.5" @@ -70,7 +70,7 @@ isort = "<5.12.0" jinja2 = "2.11.3" jira = "2.0.0" jose = "^1.0.0" -josepy = "^1.13.0" +josepy = "^1.14.0" js2py = "^0.74" keystoneauth1 = "3.14.0" lasso = "^0.1.0" @@ -78,7 +78,7 @@ libsass = "0.12.3" lxml = "4.9.1" mako = "1.2.2" markupsafe = "0.23" -mmg = "^1.0.3" +mmg = "1.0.3" mock = "2.0.0" mpld3 = "^0.5.9" mysqlclient = "2.1.1" @@ -86,20 +86,20 @@ num2words = "0.5.6" numpy = "1.21.1" oauthlib = "2.1.0" oca-decorators = "^0.0.1" -odoorpc = "^0.9.0" +odoorpc = "^0.10.1" ofxparse = "0.16" openpyxl = "^3.1.2" -openupgradelib = "^3.4.1" +openupgradelib = "^3.5.0" orjson = "3.6.0" ovh = "^1.1.0" paho-mqtt = "^1.6.1" pandas = "1.3.5" -paramiko = "^3.2.0" +paramiko = "^3.3.1" passlib = "1.6.5" pdf2image = "^1.16.3" pdfminer = "^20191125" -pexpect = "^4.8.0" -phonenumbers = "^8.13.15" +pexpect = "^4.9.0" +phonenumbers = "^8.13.26" pillow = "9.3.0" plotly = "4.1.0" portalocker = "1.7.1" @@ -110,7 +110,7 @@ psycopg2 = "2.9.5" py-asterisk = "^0.5.18" py3o-formats = "^0.3" py3o-template = "^0.10.0" -pycountry = "^22.3.5" +pycountry = "22.3.5" pydot = "1.2.3" pygments = "2.7.4" pygments-csv-lexer = ">=0.1,<1.0" @@ -118,9 +118,9 @@ pygount = ">1.2.1" pyjsparser = "^2.7.1" pyjwt = "2.5.0" pyldap = "2.4.28" -pymssql = "^2.2.7" +pymssql = "^2.2.11" pymysql = "^1.1.0" -pyotp = "^2.8.0" +pyotp = "^2.9.0" pyparsing = "2.1.10" pypdf2 = "1.27.9" pyproj = "3.2.1" @@ -133,9 +133,9 @@ python-git = "^2018.2.1" python-jose = "^3.3.0" python-json-logger = "0.1.5" python-keystoneclient = "3.22.0" -python-ldap = "^3.4.3" +python-ldap = "^3.4.4" python-slugify = ">=3.0.2" -python-stdnum = "^1.18" +python-stdnum = "^1.19" python-swiftclient = "3.9.0" python-u2flib-server = "^5.0.1" pytz = ">=2022.7" @@ -149,9 +149,9 @@ requests = "2.28.1" requests-mock = "^1.11.0" requests-oauthlib = "1.1.0" requests-toolbelt = "0.9.1" -responses = "^0.23.1" +responses = "0.23.1" retrying = "^1.3.4" -sentry-sdk = "^1.27.1" +sentry-sdk = "^1.39.1" serial = "^0.0.97" setuptools = "65.5.1" shapely = "1.8.5" @@ -160,26 +160,26 @@ slugify = "^0.0.1" soappy = "^0.12.22" sphinx = "3.0" sphinx-intl = "^2.1.0" -sphinx-rtd-theme = "^1.2.2" -sqlalchemy = "^2.0.18" +sphinx-rtd-theme = "1.2.2" +sqlalchemy = "^2.0.23" sqlparse = "^0.4.4" statsd = "3.2.1" toml = "^0.10.2" tornado = "6.1" -tqdm = "^4.65.0" +tqdm = "^4.66.1" unidecode = "1.0.22" unidiff = "^0.7.5" urllib3 = ">=1.26.13" -uvloop = "^0.17.0" +uvloop = "0.17.0" vcrpy = ">=2.1.1" vcrpy-unittest = "^0.1.7" vobject = "0.9.3" voicent-python = "^1.0" webcolors = "^1.13" -websocket-client = "^1.6.1" +websocket-client = "1.6.1" werkzeug = "0.16.1" wget = "^3.2" -wheel = "^0.40.0" +wheel = "^0.42.0" win-unicode-console = "^0.5" xlrd = "1.0.0" xlsxwriter = "0.9.3" diff --git a/requirements.txt b/requirements.txt index 0db1768..8e37887 100644 --- a/requirements.txt +++ b/requirements.txt @@ -92,6 +92,25 @@ win_unicode_console # Security issue, depend on extract-msg 0.36.1 chardet==5.0.0 extract-msg==0.36.1 +extract_msg==0.36.1 + +# Limitation because python3.7 +argcomplete==3.1.1 +responses==0.23.1 +dnspython==2.3.0 +acme==2.6.0 +altair==5.0.1 +pycountry==22.3.5 +email-validator==2.1.0 +email_validator==2.1.0 +sphinx-rtd-theme==1.2.2 +sphinx_rtd_theme==1.2.2 +uvloop==0.17.0 +coverage==7.2.7 +websocket-client==1.6.1 +websocket_client==1.6.1 +mmg==1.0.3 +giturlparse==0.10.0 # Force version for security update pyyaml==6.0 diff --git a/script/install/install_locally.sh b/script/install/install_locally.sh index 79275fb..0b9dbfb 100755 --- a/script/install/install_locally.sh +++ b/script/install/install_locally.sh @@ -33,7 +33,7 @@ VENV_REPO_PATH=${VENV_PATH}/repo VENV_MULTILINGUAL_MARKDOWN_PATH=${VENV_PATH}/multilang_md.py #POETRY_PATH=~/.local/bin/poetry POETRY_PATH=${VENV_PATH}/bin/poetry -POETRY_VERSION=1.3.1 +POETRY_VERSION=1.5.1 echo "Python path version home" echo ${PYENV_VERSION_PATH} From f972acbc806ffa2c4a0f52d56ff1140a43386aa4 Mon Sep 17 00:00:00 2001 From: Mathieu Benoit Date: Sat, 16 Dec 2023 05:38:32 +0000 Subject: [PATCH 02/18] [ADD] pip install: support selenium (with python 3.7 strangely) --- script/install/install_locally.sh | 2 ++ 1 file changed, 2 insertions(+) diff --git a/script/install/install_locally.sh b/script/install/install_locally.sh index 0b9dbfb..8d49c10 100755 --- a/script/install/install_locally.sh +++ b/script/install/install_locally.sh @@ -119,6 +119,8 @@ if [[ ! -f "${POETRY_PATH}" ]]; then echo "Poetry installation error." exit 1 fi + # Fix pip installation missing package + ${VENV_PATH}/bin/pip install selenium fi # Delete artifacts created by pip, cause error in next "poetry install" From c172c77159d53c1041f591c578d11d45e993e03e Mon Sep 17 00:00:00 2001 From: Mathieu Benoit Date: Fri, 5 Jan 2024 01:52:52 -0500 Subject: [PATCH 03/18] [IMP] script check_addons_exist.py: argument output_path - output the real path if module exist from configuration --- script/addons/check_addons_exist.py | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/script/addons/check_addons_exist.py b/script/addons/check_addons_exist.py index f5473f3..8ba791b 100755 --- a/script/addons/check_addons_exist.py +++ b/script/addons/check_addons_exist.py @@ -43,6 +43,11 @@ def get_config(): action="store_true", help="Enable debug output", ) + parser.add_argument( + "--output_path", + action="store_true", + help="Print path if module exist", + ) args = parser.parse_args() return args @@ -97,10 +102,15 @@ def main(): ) if dct_module_exist: for key, lst_value in dct_module_exist.items(): + is_print_value = False if len(lst_value) != 1: + is_print_value = True is_good = False module_list = "'" + "', '".join(lst_value) + "'" _logger.error(f"Conflict modules: {module_list}") + elif lst_value and config.output_path: + is_print_value = True + if is_print_value: for value in lst_value: print(value) From e4e6571ca8eae3d3f97351da77a5432ccfee5633 Mon Sep 17 00:00:00 2001 From: Mathieu Benoit Date: Mon, 22 Jan 2024 20:17:55 -0500 Subject: [PATCH 04/18] [UPD] script run_parallel_test.py: remove dependance config from async exec --- script/test/run_parallel_test.py | 63 +++++++++++++++++++++----------- 1 file changed, 41 insertions(+), 22 deletions(-) diff --git a/script/test/run_parallel_test.py b/script/test/run_parallel_test.py index a0f2a38..53e3573 100755 --- a/script/test/run_parallel_test.py +++ b/script/test/run_parallel_test.py @@ -255,7 +255,6 @@ def update_config( async def test_exec( - config, path_module_check: str, generated_module=None, generate_path=None, @@ -267,6 +266,8 @@ async def test_exec( install_path=None, run_in_sandbox=False, restore_db_image_name="erplibre_base", + keep_cache=False, + coverage=False, ) -> Tuple[str, int]: test_result = "" test_status = 0 @@ -300,7 +301,7 @@ async def test_exec( destination_path = None temp_dir_name = None if run_in_sandbox: - if config.keep_cache: + if keep_cache: temp_dir = tempfile.mkdtemp() temp_dir_name = temp_dir else: @@ -582,7 +583,7 @@ async def test_exec( if not test_status and lst_init_module_name: # Install required module str_test = ",".join(lst_init_module_name) - if config.coverage: + if coverage: script_name = ( "./script/addons/coverage_install_addons_dev.sh" if tested_module @@ -638,7 +639,7 @@ async def test_exec( if not test_status and tested_module and generated_module: cmd = ( "./script/code_generator/coverage_install_and_test_code_generator.sh" - if config.coverage + if coverage else "./script/code_generator/install_and_test_code_generator.sh" ) # Finally, the test @@ -722,10 +723,11 @@ async def run_demo_test(config) -> Tuple[str, int]: "demo_website_snippet", ] res, status = await test_exec( - config, "./addons/TechnoLibre_odoo-code-generator-template", lst_init_module_name=lst_test_name, test_name="demo_test", + keep_cache=config.keep_cache, + coverage=config.coverage, ) return res, status @@ -736,7 +738,6 @@ async def run_code_generator_migrator_demo_mariadb_sql_example_1_test( ) -> Tuple[str, int]: # Migrator res, status = await test_exec( - config, "./addons/TechnoLibre_odoo-code-generator-template", generated_module="demo_mariadb_sql_example_1", tested_module="code_generator_migrator_demo_mariadb_sql_example_1", @@ -748,6 +749,8 @@ async def run_code_generator_migrator_demo_mariadb_sql_example_1_test( ], test_name="mariadb_test-migrator", run_in_sandbox=True, + keep_cache=config.keep_cache, + coverage=config.coverage, ) return res, status @@ -758,7 +761,6 @@ async def run_code_generator_template_demo_mariadb_sql_example_1_test( ) -> Tuple[str, int]: # Template res, status = await test_exec( - config, "./addons/TechnoLibre_odoo-code-generator-template", generated_module="code_generator_demo_mariadb_sql_example_1", tested_module="code_generator_template_demo_mariadb_sql_example_1", @@ -769,6 +771,8 @@ async def run_code_generator_template_demo_mariadb_sql_example_1_test( ], test_name="mariadb_test-template", run_in_sandbox=True, + keep_cache=config.keep_cache, + coverage=config.coverage, ) return res, status @@ -779,7 +783,6 @@ async def run_code_generator_demo_mariadb_sql_example_1_test( ) -> Tuple[str, int]: # Code generator res, status = await test_exec( - config, "./addons/TechnoLibre_odoo-code-generator-template", generated_module="demo_mariadb_sql_example_1", lst_init_module_name=[ @@ -788,6 +791,8 @@ async def run_code_generator_demo_mariadb_sql_example_1_test( tested_module="code_generator_demo_mariadb_sql_example_1", test_name="mariadb_test-code-generator", run_in_sandbox=True, + keep_cache=config.keep_cache, + coverage=config.coverage, ) return res, status @@ -806,12 +811,13 @@ async def run_code_generator_data_test(config) -> Tuple[str, int]: ] # Multiple res, status = await test_exec( - config, "./addons/TechnoLibre_odoo-code-generator-template", generated_module=",".join(lst_generated_module), tested_module=",".join(lst_tested_module), test_name="code_generator_data_test", run_in_sandbox=True, + keep_cache=config.keep_cache, + coverage=config.coverage, ) test_result += res test_status += status @@ -831,12 +837,13 @@ async def run_code_generator_data_test_part_2(config) -> Tuple[str, int]: ] # Multiple res, status = await test_exec( - config, "./addons/TechnoLibre_odoo-code-generator-template", generated_module=",".join(lst_generated_module), tested_module=",".join(lst_tested_module), test_name="code_generator_data_part_2_test", run_in_sandbox=True, + keep_cache=config.keep_cache, + coverage=config.coverage, ) test_result += res test_status += status @@ -857,13 +864,14 @@ async def run_code_generator_export_website_attachments_test( ] # Multiple res, status = await test_exec( - config, "./addons/TechnoLibre_odoo-code-generator-template", generated_module=",".join(lst_generated_module), tested_module=",".join(lst_tested_module), test_name="code_generator_export_website_attachments_test", run_in_sandbox=True, restore_db_image_name="test_website_attachments", + keep_cache=config.keep_cache, + coverage=config.coverage, ) test_result += res test_status += status @@ -882,12 +890,13 @@ async def run_code_generator_theme_test(config) -> Tuple[str, int]: ] # Multiple res, status = await test_exec( - config, "./addons/TechnoLibre_odoo-code-generator-template", generated_module=",".join(lst_generated_module), tested_module=",".join(lst_tested_module), test_name="code_generator_theme_test", run_in_sandbox=True, + keep_cache=config.keep_cache, + coverage=config.coverage, ) test_result += res test_status += status @@ -918,12 +927,13 @@ async def run_code_generator_generic_all_test(config) -> Tuple[str, int]: ] # Multiple res, status = await test_exec( - config, "./addons/TechnoLibre_odoo-code-generator-template", generated_module=",".join(lst_generated_module), tested_module=",".join(lst_tested_module), test_name="code_generator_generic_all_test", run_in_sandbox=True, + keep_cache=config.keep_cache, + coverage=config.coverage, ) test_result += res test_status += status @@ -946,12 +956,13 @@ async def run_code_generator_website_snippet_test(config) -> Tuple[str, int]: ] # Multiple res, status = await test_exec( - config, "./addons/TechnoLibre_odoo-code-generator-template", generated_module=",".join(lst_generated_module), tested_module=",".join(lst_tested_module), test_name="code_generator_website_snippet_test", run_in_sandbox=True, + keep_cache=config.keep_cache, + coverage=config.coverage, ) test_result += res test_status += status @@ -994,12 +1005,13 @@ async def run_code_generator_demo_generic_test(config) -> Tuple[str, int]: ] # Multiple res, status = await test_exec( - config, "./addons/TechnoLibre_odoo-code-generator-template", generated_module=",".join(lst_generated_module), tested_module=",".join(lst_tested_module), test_name="code_generator_demo_generic_test", run_in_sandbox=True, + keep_cache=config.keep_cache, + coverage=config.coverage, ) test_result += res test_status += status @@ -1018,11 +1030,12 @@ async def run_code_generator_demo_test(config) -> Tuple[str, int]: ] # Multiple res, status = await test_exec( - config, "./addons/TechnoLibre_odoo-code-generator-template", generated_module=",".join(lst_generated_module), tested_module=",".join(lst_tested_module), test_name="code_generator_demo_test", + keep_cache=config.keep_cache, + coverage=config.coverage, ) test_result += res test_status += status @@ -1042,12 +1055,13 @@ async def run_code_generator_inherit_test(config) -> Tuple[str, int]: ] # Inherit res, status = await test_exec( - config, "./addons/TechnoLibre_odoo-code-generator-template", generated_module=",".join(lst_generated_module), tested_module=",".join(lst_tested_module), test_name="code_generator_inherit_test", run_in_sandbox=True, + keep_cache=config.keep_cache, + coverage=config.coverage, ) test_result += res test_status += status @@ -1066,12 +1080,13 @@ async def run_code_generator_auto_backup_test(config) -> Tuple[str, int]: ] # Auto-backup res, status = await test_exec( - config, "./addons/OCA_server-tools/auto_backup", generated_module=",".join(lst_generated_module), tested_module=",".join(lst_tested_module), test_name="code_generator_auto_backup_test", run_in_sandbox=True, + keep_cache=config.keep_cache, + coverage=config.coverage, ) test_result += res test_status += status @@ -1086,7 +1101,6 @@ async def run_code_generator_template_demo_portal_test( test_status = 0 # Template res, status = await test_exec( - config, "./addons/TechnoLibre_odoo-code-generator-template", generated_module="code_generator_demo_portal", tested_module="code_generator_template_demo_portal", @@ -1096,6 +1110,8 @@ async def run_code_generator_template_demo_portal_test( ], test_name="code_generator_template_demo_portal", run_in_sandbox=True, + keep_cache=config.keep_cache, + coverage=config.coverage, ) test_result += res test_status += status @@ -1110,7 +1126,6 @@ async def run_code_generator_template_demo_internal_test( test_status = 0 # Template res, status = await test_exec( - config, "./addons/TechnoLibre_odoo-code-generator-template", generated_module="code_generator_demo_internal", tested_module="code_generator_template_demo_internal", @@ -1120,6 +1135,8 @@ async def run_code_generator_template_demo_internal_test( ], test_name="code_generator_template_demo_internal", run_in_sandbox=True, + keep_cache=config.keep_cache, + coverage=config.coverage, ) test_result += res test_status += status @@ -1134,7 +1151,6 @@ async def run_code_generator_template_demo_internal_inherit_test( test_status = 0 # Template res, status = await test_exec( - config, "./addons/TechnoLibre_odoo-code-generator-template", generated_module="code_generator_demo_internal_inherit", tested_module="code_generator_template_demo_internal_inherit", @@ -1144,6 +1160,8 @@ async def run_code_generator_template_demo_internal_inherit_test( ], test_name="code_generator_template_demo_internal_inherit", run_in_sandbox=True, + keep_cache=config.keep_cache, + coverage=config.coverage, ) test_result += res test_status += status @@ -1158,7 +1176,6 @@ async def run_code_generator_template_demo_sysadmin_cron_test( test_status = 0 # Template res, status = await test_exec( - config, "./addons/OCA_server-tools/auto_backup", generated_module="code_generator_auto_backup", generate_path="./addons/OCA_server-tools/", @@ -1170,6 +1187,8 @@ async def run_code_generator_template_demo_sysadmin_cron_test( test_name="code_generator_template_demo_sysadmin_cron", install_path="./addons/TechnoLibre_odoo-code-generator-template", run_in_sandbox=True, + keep_cache=config.keep_cache, + coverage=config.coverage, ) test_result += res test_status += status From c47d4d016ec333d58e1b472d83adf14091479e9e Mon Sep 17 00:00:00 2001 From: Mathieu Benoit Date: Tue, 23 Jan 2024 22:04:15 -0500 Subject: [PATCH 05/18] [ADD] script run_parallel_test: argument json_model and output_result_dir - change approch for test, use a dict to launch test instead of asyncio callback. Like that, can configure automatic test from external. - output_result_dir permit to extract result and log from each test for external execution. - create config_testcase.json with test testcase configuration for all test - detect when asyncio got execution error --- script/lib_asyncio.py | 45 +- script/statistic/show_evolution_module.py | 8 +- script/test/config_testcase.json | 149 +++++ script/test/run_parallel_test.py | 728 ++++++---------------- 4 files changed, 378 insertions(+), 552 deletions(-) create mode 100644 script/test/config_testcase.json diff --git a/script/lib_asyncio.py b/script/lib_asyncio.py index 7b64e90..09af557 100644 --- a/script/lib_asyncio.py +++ b/script/lib_asyncio.py @@ -39,6 +39,27 @@ async def run_command_get_output(*args, cwd=None): return stdout.decode() +async def run_shell_get_output(cmd, cwd=None): + if cwd is not None: + process = await asyncio.create_subprocess_shell( + cmd, + # stdout must a pipe to be accessible as process.stdout + stdout=asyncio.subprocess.PIPE, + stderr=asyncio.subprocess.PIPE, + cwd=cwd, + ) + else: + process = await asyncio.create_subprocess_shell( + cmd, + # stdout must a pipe to be accessible as process.stdout + stdout=asyncio.subprocess.PIPE, + stderr=asyncio.subprocess.PIPE, + ) + # Wait for the subprocess to finish + stdout, stderr = await process.communicate() + return stdout.decode() + + async def run_command_get_output_and_status(*args, cwd=None): if cwd is not None: process = await asyncio.create_subprocess_exec( @@ -60,13 +81,18 @@ async def run_command_get_output_and_status(*args, cwd=None): return stdout.decode(), stderr.decode(), process.returncode -def print_summary_task(task_list): - for task in task_list: - print(task.cr_code.co_name) +def print_summary_task(task_list, lst_task_name=None): + for i, task in enumerate(task_list): + if lst_task_name: + task_name = lst_task_name[i] + print(f"{i} - {task.cr_code.co_name} - {task_name}") + else: + print(f"{i} - {task.cr_code.co_name}") def execute(config, lst_task, use_uvloop=False): - + error_detected = False + return_value = None if not config.no_parallel and asyncio.get_event_loop().is_closed(): asyncio.set_event_loop(asyncio.new_event_loop()) @@ -85,14 +111,23 @@ def execute(config, lst_task, use_uvloop=False): if use_uvloop: uvloop.install() loop = asyncio.get_event_loop() + # Can fix when cannot attach child to loop + # if sys.platform != "win32": + # policy = asyncio.get_event_loop_policy() + # watcher = asyncio.SafeChildWatcher() + # watcher.attach_loop(loop) + # policy.set_child_watcher(watcher) if config.debug: loop.set_debug(True) try: commands = asyncio.gather(*lst_task) return_value = loop.run_until_complete(commands) + except RuntimeError as e: + error_detected = True + print(e) finally: loop.close() - return return_value + return return_value, error_detected class AsyncioPool: diff --git a/script/statistic/show_evolution_module.py b/script/statistic/show_evolution_module.py index 5b06779..be743b4 100755 --- a/script/statistic/show_evolution_module.py +++ b/script/statistic/show_evolution_module.py @@ -229,7 +229,7 @@ def main(): clone_repo(i, a, config.force_git_fetch) for i, a in enumerate(lst_repo_url) ] - lst_repo_path = lib_asyncio.execute( + lst_repo_path, has_asyncio_error = lib_asyncio.execute( config, lst_task_clone, use_uvloop=True ) @@ -268,13 +268,15 @@ def main(): min_i = i * MAX_COROUTINE max_i = min((i + 1) * MAX_COROUTINE, len(lst_task)) _logger.info(f"Partial execution {min_i} to {max_i}") - tpl_result = lib_asyncio.execute( + tpl_result, has_asyncio_error = lib_asyncio.execute( config, lst_task[min_i:max_i], use_uvloop=True ) lst_result += tpl_result tpl_result = lst_result else: - tpl_result = lib_asyncio.execute(config, lst_task, use_uvloop=True) + tpl_result, has_asyncio_error = lib_asyncio.execute( + config, lst_task, use_uvloop=True + ) _logger.info("Analyse information") dct_result = defaultdict(lambda: defaultdict(int)) dct_result_unique = defaultdict(set) diff --git a/script/test/config_testcase.json b/script/test/config_testcase.json new file mode 100644 index 0000000..ece5c87 --- /dev/null +++ b/script/test/config_testcase.json @@ -0,0 +1,149 @@ +{ + "lst_test": [ + { + "run_command": true, + "test_name": "helloworld_test", + "sequence": 10, + "script": "./test/code_generator/hello_world.sh", + "note": "Test helloword_test Will cause conflict with the other because write in code_generator_demo/hooks.py" + }, + { + "run_test_exec": true, + "test_name": "code_generator_theme_test", + "path_module_check": "./addons/TechnoLibre_odoo-code-generator-template", + "generated_module": "theme_website_demo_code_generator", + "tested_module": "code_generator_demo_theme_website" + }, + { + "run_test_exec": true, + "test_name": "code_generator_demo_test", + "path_module_check": "./addons/TechnoLibre_odoo-code-generator-template", + "generated_module": "code_generator_demo", + "tested_module": "code_generator_demo" + }, + { + "run_test_exec": true, + "test_name": "code_generator_data_test", + "path_module_check": "./addons/TechnoLibre_odoo-code-generator-template", + "generated_module": "demo_helpdesk_data", + "tested_module": "code_generator_demo_export_helpdesk" + }, + { + "run_test_exec": true, + "test_name": "code_generator_data_part_2_test", + "path_module_check": "./addons/TechnoLibre_odoo-code-generator-template", + "generated_module": "demo_website_data", + "tested_module": "code_generator_demo_export_website", + "note": "Merge to code_generator_data_test when fix double export data." + }, + { + "run_test_exec": true, + "test_name": "code_generator_inherit_test", + "path_module_check": "./addons/TechnoLibre_odoo-code-generator-template", + "generated_module": "demo_internal_inherit", + "tested_module": "code_generator_demo_internal_inherit" + }, + { + "run_test_exec": true, + "test_name": "code_generator_template_demo_internal", + "path_module_check": "./addons/TechnoLibre_odoo-code-generator-template", + "generated_module": "code_generator_demo_internal", + "tested_module": "code_generator_template_demo_internal", + "search_class_module": "demo_internal", + "init_module_name": "demo_internal" + }, + { + "run_test_exec": true, + "test_name": "code_generator_template_demo_portal", + "path_module_check": "./addons/TechnoLibre_odoo-code-generator-template", + "generated_module": "code_generator_demo_portal", + "tested_module": "code_generator_template_demo_portal", + "search_class_module": "demo_portal", + "init_module_name": "demo_portal" + }, + { + "run_test_exec": true, + "test_name": "mariadb_test_template", + "path_module_check": "./addons/TechnoLibre_odoo-code-generator-template", + "generated_module": "code_generator_demo_mariadb_sql_example_1", + "tested_module": "code_generator_template_demo_mariadb_sql_example_1", + "search_class_module": "demo_mariadb_sql_example_1", + "init_module_name": "code_generator_portal,demo_mariadb_sql_example_1" + }, + { + "run_test_exec": true, + "test_name": "mariadb_test_migrator", + "path_module_check": "./addons/TechnoLibre_odoo-code-generator-template", + "generated_module": "demo_mariadb_sql_example_1", + "tested_module": "code_generator_migrator_demo_mariadb_sql_example_1", + "script_after_init_check": "./script/database/restore_mariadb_sql_example_1.sh", + "init_module_name": "code_generator_portal" + }, + { + "run_test_exec": true, + "test_name": "mariadb_test_code_generator", + "path_module_check": "./addons/TechnoLibre_odoo-code-generator-template", + "generated_module": "demo_mariadb_sql_example_1", + "tested_module": "code_generator_demo_mariadb_sql_example_1", + "init_module_name": "code_generator_portal" + }, + { + "run_test_exec": true, + "test_name": "code_generator_template_demo_internal_inherit", + "path_module_check": "./addons/TechnoLibre_odoo-code-generator-template", + "generated_module": "code_generator_demo_internal_inherit", + "tested_module": "code_generator_template_demo_internal_inherit", + "search_class_module": "demo_internal_inherit", + "init_module_name": "demo_internal_inherit" + }, + { + "run_test_exec": true, + "test_name": "code_generator_template_demo_sysadmin_cron", + "path_module_check": "./addons/OCA_server-tools/auto_backup", + "generated_module": "code_generator_auto_backup", + "generated_path": "./addons/OCA_server-tools/", + "tested_module": "code_generator_template_demo_sysadmin_cron", + "search_class_module": "auto_backup", + "init_module_name": "auto_backup", + "install_path": "./addons/TechnoLibre_odoo-code-generator-template" + }, + { + "run_test_exec": true, + "test_name": "code_generator_export_website_attachments_test", + "path_module_check": "./addons/TechnoLibre_odoo-code-generator-template", + "generated_module": "demo_website_attachments_data", + "tested_module": "code_generator_demo_export_website_attachments", + "restore_db_image_name": "test_website_attachments" + }, + { + "run_test_exec": true, + "test_name": "code_generator_demo_generic_test", + "path_module_check": "./addons/TechnoLibre_odoo-code-generator-template", + "generated_module": "demo_internal,demo_portal", + "tested_module": "code_generator_demo_internal,code_generator_demo_portal" + }, + { + "run_test_exec": true, + "test_name": "code_generator_website_snippet_test", + "path_module_check": "./addons/TechnoLibre_odoo-code-generator-template", + "generated_module": "demo_website_leaflet,demo_website_snippet,demo_website_multiple_snippet", + "tested_module": "code_generator_demo_website_leaflet,code_generator_demo_website_snippet,code_generator_demo_website_multiple_snippet", + "file_to_restore": "demo_portal/i18n/demo_portal.pot,demo_portal/i18n/fr_CA.po", + "file_to_restore_origin": true, + "note": "Because code_generator_demo_website_multiple_snippet depend on code_generator_demo_portal, it will execute it and this delete file demo_portal/i18n/demo_portal.pot and demo_portal/i18n/fr_CA.po" + }, + { + "run_test_exec": true, + "test_name": "demo_test", + "path_module_check": "./addons/TechnoLibre_odoo-code-generator-template", + "init_module_name": "demo_helpdesk_data,demo_internal,demo_internal_inherit,demo_mariadb_sql_example_1,demo_portal,demo_website_data,demo_website_leaflet,demo_website_snippet" + }, + { + "run_test_exec": true, + "test_name": "code_generator_auto_backup_test", + "path_module_check": "./addons/OCA_server-tools/auto_backup", + "generated_module": "auto_backup", + "tested_module": "code_generator_auto_backup" + } + ] +} diff --git a/script/test/run_parallel_test.py b/script/test/run_parallel_test.py index 53e3573..eb78d1d 100755 --- a/script/test/run_parallel_test.py +++ b/script/test/run_parallel_test.py @@ -9,7 +9,9 @@ import sys import tempfile import time import uuid +import json from typing import Tuple +from collections import defaultdict import aioshutil import git @@ -26,6 +28,7 @@ logging.basicConfig(level=logging.DEBUG) _logger = logging.getLogger(__name__) LOG_FILE = "./.venv/make_test.log" +CONFIG_TESTCASE_JSON = "./script/test/config_testcase.json" def get_config(): @@ -71,6 +74,17 @@ def get_config(): action="store_true", help="Enable asyncio debugging", ) + parser.add_argument( + "--json_model", + help="Model of data to run test in json", + ) + parser.add_argument( + "--output_result_dir", + help=( + "A path of existing directory, will export a file per test with" + " status/result and log." + ), + ) args = parser.parse_args() return args @@ -178,6 +192,29 @@ def print_log(lst_task, tpl_result): f.write("\n") +def print_log_output_into_dir(tpl_result, output_dir): + date_now = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S") + for i, result in enumerate(tpl_result): + log = result[0] + status = result[1] + test_name = result[2] + test_name_file_name = test_name.replace(" ", "") + time_execution = result[3] + log_file = os.path.join(output_dir, test_name_file_name) + with open(log_file, "w") as f: + f.write(f"{status}\n") + f.write(f"{test_name}\n") + f.write(f"{time_execution}\n") + f.write(f"{date_now}\n") + status_str = "PASS" if not status else "FAIL" + f.write( + f"\nTest execution {i + 1} - {status_str} - {test_name}\n\n" + ) + if log: + f.write(log) + f.write("\n") + + async def run_command(*args, test_name=None): # Create subprocess start_time = time.time() @@ -262,16 +299,19 @@ async def test_exec( search_class_module=None, script_after_init_check=None, lst_init_module_name=None, + file_to_restore=None, + file_to_restore_origin=False, test_name=None, install_path=None, - run_in_sandbox=False, + run_in_sandbox=True, restore_db_image_name="erplibre_base", keep_cache=False, coverage=False, -) -> Tuple[str, int]: +) -> Tuple[str, int, str, float]: + time_init = datetime.datetime.now() test_result = "" test_status = 0 - new_destination_path = None + origin_path_module_check = path_module_check if search_class_module: if install_path is not None: path_template_to_generate = os.path.join( @@ -314,6 +354,7 @@ async def test_exec( lst_path_to_add_config = [] lst_path_to_remove_config = [] if not os.path.exists(path_module_check): + # TODO wrong return return ( f"Error var path_module_check '{path_module_check}' not" " exist.", @@ -370,6 +411,7 @@ async def test_exec( ) ) if not s_lst_path_tested_module: + # TODO wrong return return ( f"Error cannot find module '{path_module_check}' not" " exist.", @@ -461,6 +503,7 @@ async def test_exec( ) break if nb_space_indentation is None: + # TODO wrong return return ( f"Cannot find keys '{lst_f_key}' in" f" {hook_file}", @@ -556,7 +599,9 @@ async def test_exec( # Leave when detect anomaly in check before start if test_status: - return test_result, test_status + delta = datetime.datetime.now() - time_init + total_time = delta.total_seconds() + return test_result, test_status, test_name, total_time # Execute script before start if script_after_init_check and not test_status: @@ -678,7 +723,27 @@ async def test_exec( test_result += res test_status += status - return test_result, test_status + if file_to_restore: + lst_file_to_ignore = file_to_restore.strip().split(",") + if file_to_restore_origin: + repo_demo_portal = git.Repo(origin_path_module_check) + else: + repo_demo_portal = git.Repo(path_module_check) + + status_to_check = repo_demo_portal.git.status("-s") + if all([f"D {a}" in status_to_check for a in lst_file_to_ignore]): + # Revert it + for file_name in lst_file_to_ignore: + repo_demo_portal.git.checkout(file_name) + else: + test_status += 1 + test_result += ( + f"\n\nFAIL - inspect to delete file {lst_file_to_ignore}" + ) + + delta = datetime.datetime.now() - time_init + total_time = delta.total_seconds() + return test_result, test_status, test_name, total_time def check_git_change(): @@ -708,552 +773,126 @@ def check_git_change(): return not status -# START TEST +async def run_test_command( + script_path: str, test_name: str +) -> Tuple[str, int, str, float]: + time_init = datetime.datetime.now() + res, status = await run_command(script_path, test_name=test_name) + delta = datetime.datetime.now() - time_init + total_time = delta.total_seconds() + return res, status, test_name, total_time -async def run_demo_test(config) -> Tuple[str, int]: - lst_test_name = [ - "demo_helpdesk_data", - "demo_internal", - "demo_internal_inherit", - "demo_mariadb_sql_example_1", - "demo_portal", - "demo_website_data", - "demo_website_leaflet", - "demo_website_snippet", - ] - res, status = await test_exec( - "./addons/TechnoLibre_odoo-code-generator-template", - lst_init_module_name=lst_test_name, - test_name="demo_test", - keep_cache=config.keep_cache, - coverage=config.coverage, - ) - - return res, status - - -async def run_code_generator_migrator_demo_mariadb_sql_example_1_test( - config, -) -> Tuple[str, int]: - # Migrator - res, status = await test_exec( - "./addons/TechnoLibre_odoo-code-generator-template", - generated_module="demo_mariadb_sql_example_1", - tested_module="code_generator_migrator_demo_mariadb_sql_example_1", - script_after_init_check=( - "./script/database/restore_mariadb_sql_example_1.sh" - ), - lst_init_module_name=[ - "code_generator_portal", - ], - test_name="mariadb_test-migrator", - run_in_sandbox=True, - keep_cache=config.keep_cache, - coverage=config.coverage, - ) - - return res, status - - -async def run_code_generator_template_demo_mariadb_sql_example_1_test( - config, -) -> Tuple[str, int]: - # Template - res, status = await test_exec( - "./addons/TechnoLibre_odoo-code-generator-template", - generated_module="code_generator_demo_mariadb_sql_example_1", - tested_module="code_generator_template_demo_mariadb_sql_example_1", - search_class_module="demo_mariadb_sql_example_1", - lst_init_module_name=[ - "code_generator_portal", - "demo_mariadb_sql_example_1", - ], - test_name="mariadb_test-template", - run_in_sandbox=True, - keep_cache=config.keep_cache, - coverage=config.coverage, - ) - - return res, status - - -async def run_code_generator_demo_mariadb_sql_example_1_test( - config, -) -> Tuple[str, int]: - # Code generator - res, status = await test_exec( - "./addons/TechnoLibre_odoo-code-generator-template", - generated_module="demo_mariadb_sql_example_1", - lst_init_module_name=[ - "code_generator_portal", - ], - tested_module="code_generator_demo_mariadb_sql_example_1", - test_name="mariadb_test-code-generator", - run_in_sandbox=True, - keep_cache=config.keep_cache, - coverage=config.coverage, - ) - - return res, status - - -async def run_code_generator_data_test(config) -> Tuple[str, int]: - test_result = "" - test_status = 0 - lst_generated_module = [ - "demo_helpdesk_data", - # "demo_website_data", - ] - lst_tested_module = [ - "code_generator_demo_export_helpdesk", - # "code_generator_demo_export_website", - ] - # Multiple - res, status = await test_exec( - "./addons/TechnoLibre_odoo-code-generator-template", - generated_module=",".join(lst_generated_module), - tested_module=",".join(lst_tested_module), - test_name="code_generator_data_test", - run_in_sandbox=True, - keep_cache=config.keep_cache, - coverage=config.coverage, - ) - test_result += res - test_status += status - - return test_result, test_status - - -async def run_code_generator_data_test_part_2(config) -> Tuple[str, int]: - # TODO merge this test into run_code_generator_data_test - test_result = "" - test_status = 0 - lst_generated_module = [ - "demo_website_data", - ] - lst_tested_module = [ - "code_generator_demo_export_website", - ] - # Multiple - res, status = await test_exec( - "./addons/TechnoLibre_odoo-code-generator-template", - generated_module=",".join(lst_generated_module), - tested_module=",".join(lst_tested_module), - test_name="code_generator_data_part_2_test", - run_in_sandbox=True, - keep_cache=config.keep_cache, - coverage=config.coverage, - ) - test_result += res - test_status += status - - return test_result, test_status - - -async def run_code_generator_export_website_attachments_test( - config, -) -> Tuple[str, int]: - test_result = "" - test_status = 0 - lst_generated_module = [ - "demo_website_attachments_data", - ] - lst_tested_module = [ - "code_generator_demo_export_website_attachments", - ] - # Multiple - res, status = await test_exec( - "./addons/TechnoLibre_odoo-code-generator-template", - generated_module=",".join(lst_generated_module), - tested_module=",".join(lst_tested_module), - test_name="code_generator_export_website_attachments_test", - run_in_sandbox=True, - restore_db_image_name="test_website_attachments", - keep_cache=config.keep_cache, - coverage=config.coverage, - ) - test_result += res - test_status += status - - return test_result, test_status - - -async def run_code_generator_theme_test(config) -> Tuple[str, int]: - test_result = "" - test_status = 0 - lst_generated_module = [ - "theme_website_demo_code_generator", - ] - lst_tested_module = [ - "code_generator_demo_theme_website", - ] - # Multiple - res, status = await test_exec( - "./addons/TechnoLibre_odoo-code-generator-template", - generated_module=",".join(lst_generated_module), - tested_module=",".join(lst_tested_module), - test_name="code_generator_theme_test", - run_in_sandbox=True, - keep_cache=config.keep_cache, - coverage=config.coverage, - ) - test_result += res - test_status += status - - return test_result, test_status - - -async def run_code_generator_generic_all_test(config) -> Tuple[str, int]: - test_result = "" - test_status = 0 - lst_generated_module = [ - "demo_internal", - "demo_portal", - "demo_helpdesk_data", - "demo_website_data", - "demo_website_leaflet", - "demo_website_snippet", - "theme_website_demo_code_generator", - ] - lst_tested_module = [ - "code_generator_demo_internal", - "code_generator_demo_portal", - "code_generator_demo_export_helpdesk", - "code_generator_demo_export_website", - "code_generator_demo_website_leaflet", - "code_generator_demo_website_snippet", - "code_generator_demo_theme_website", - ] - # Multiple - res, status = await test_exec( - "./addons/TechnoLibre_odoo-code-generator-template", - generated_module=",".join(lst_generated_module), - tested_module=",".join(lst_tested_module), - test_name="code_generator_generic_all_test", - run_in_sandbox=True, - keep_cache=config.keep_cache, - coverage=config.coverage, - ) - test_result += res - test_status += status - - return test_result, test_status - - -async def run_code_generator_website_snippet_test(config) -> Tuple[str, int]: - test_result = "" - test_status = 0 - lst_generated_module = [ - "demo_website_leaflet", - "demo_website_snippet", - "demo_website_multiple_snippet", - ] - lst_tested_module = [ - "code_generator_demo_website_leaflet", - "code_generator_demo_website_snippet", - "code_generator_demo_website_multiple_snippet", - ] - # Multiple - res, status = await test_exec( - "./addons/TechnoLibre_odoo-code-generator-template", - generated_module=",".join(lst_generated_module), - tested_module=",".join(lst_tested_module), - test_name="code_generator_website_snippet_test", - run_in_sandbox=True, - keep_cache=config.keep_cache, - coverage=config.coverage, - ) - test_result += res - test_status += status - - if "code_generator_demo_website_multiple_snippet" in lst_tested_module: - # Because code_generator_demo_website_multiple_snippet depend on code_generator_demo_portal, it will - # execute it and this delete file demo_portal/i18n/demo_portal.pot and demo_portal/i18n/fr_CA.po - lst_file_is_delete = [ - "demo_portal/i18n/demo_portal.pot", - "demo_portal/i18n/fr_CA.po", - ] - path_to_check = os.path.join( - "addons", "TechnoLibre_odoo-code-generator-template" - ) - repo_demo_portal = git.Repo(path_to_check) - status_to_check = repo_demo_portal.git.status("-s") - if all([f"D {a}" in status_to_check for a in lst_file_is_delete]): - # Revert it - for file_name in lst_file_is_delete: - repo_demo_portal.git.checkout(file_name) - else: - test_status += 1 - test_result += ( - f"\n\nFAIL - inspect to delete file ${lst_file_is_delete}" +def run_all_test(config) -> bool: + if config.json_model: + json_model = config.json_model + else: + with open(CONFIG_TESTCASE_JSON) as config_json: + json_model = config_json.read() + dct_model_test = json.loads(json_model) + lst_test = dct_model_test.get("lst_test") + if not lst_test: + _logger.error("Model missing attribute 'lst_test'.") + return False + # Sort test by sequence + dct_task = defaultdict(list) + dct_task_name = defaultdict(list) + for dct_test in lst_test: + sequence = dct_test.get("sequence", 0) + cb_coroutine = None + test_name = None + if dct_test.get("run_command"): + test_name = dct_test.get("test_name") + if not test_name: + raise ValueError( + "Missing attribute 'test_name' into the json_model." + ) + script = dct_test.get("script") + if not script: + raise ValueError( + "Missing attribute 'script' into the json_model." + ) + cb_coroutine = run_test_command(script, test_name) + elif dct_test.get("run_test_exec"): + path_module_check = dct_test.get("path_module_check") + if not path_module_check: + raise ValueError( + "Missing attribute 'path_module_check' into the" + " json_model." + ) + generated_module = dct_test.get("generated_module") + generate_path = dct_test.get("generate_path") + tested_module = dct_test.get("tested_module") + search_class_module = dct_test.get("search_class_module") + script_after_init_check = dct_test.get("script_after_init_check") + init_module_name = dct_test.get("init_module_name") + lst_init_module_name = None + if init_module_name: + lst_init_module_name = init_module_name.split(",") + test_name = dct_test.get("test_name") + if not test_name: + raise ValueError( + "Missing attribute 'test_name' into the json_model." + ) + file_to_restore = dct_test.get("file_to_restore") + file_to_restore_origin = dct_test.get( + "file_to_restore_origin", False ) - - return test_result, test_status - - -async def run_code_generator_demo_generic_test(config) -> Tuple[str, int]: - test_result = "" - test_status = 0 - lst_generated_module = [ - "demo_internal", - "demo_portal", - ] - lst_tested_module = [ - "code_generator_demo_internal", - "code_generator_demo_portal", - ] - # Multiple - res, status = await test_exec( - "./addons/TechnoLibre_odoo-code-generator-template", - generated_module=",".join(lst_generated_module), - tested_module=",".join(lst_tested_module), - test_name="code_generator_demo_generic_test", - run_in_sandbox=True, - keep_cache=config.keep_cache, - coverage=config.coverage, - ) - test_result += res - test_status += status - - return test_result, test_status - - -async def run_code_generator_demo_test(config) -> Tuple[str, int]: - test_result = "" - test_status = 0 - lst_generated_module = [ - "code_generator_demo", - ] - lst_tested_module = [ - "code_generator_demo", - ] - # Multiple - res, status = await test_exec( - "./addons/TechnoLibre_odoo-code-generator-template", - generated_module=",".join(lst_generated_module), - tested_module=",".join(lst_tested_module), - test_name="code_generator_demo_test", - keep_cache=config.keep_cache, - coverage=config.coverage, - ) - test_result += res - test_status += status - - return test_result, test_status - - -async def run_code_generator_inherit_test(config) -> Tuple[str, int]: - # TODO can be merge into code_generator_multiple - test_result = "" - test_status = 0 - lst_generated_module = [ - "demo_internal_inherit", - ] - lst_tested_module = [ - "code_generator_demo_internal_inherit", - ] - # Inherit - res, status = await test_exec( - "./addons/TechnoLibre_odoo-code-generator-template", - generated_module=",".join(lst_generated_module), - tested_module=",".join(lst_tested_module), - test_name="code_generator_inherit_test", - run_in_sandbox=True, - keep_cache=config.keep_cache, - coverage=config.coverage, - ) - test_result += res - test_status += status - - return test_result, test_status - - -async def run_code_generator_auto_backup_test(config) -> Tuple[str, int]: - test_result = "" - test_status = 0 - lst_generated_module = [ - "auto_backup", - ] - lst_tested_module = [ - "code_generator_auto_backup", - ] - # Auto-backup - res, status = await test_exec( - "./addons/OCA_server-tools/auto_backup", - generated_module=",".join(lst_generated_module), - tested_module=",".join(lst_tested_module), - test_name="code_generator_auto_backup_test", - run_in_sandbox=True, - keep_cache=config.keep_cache, - coverage=config.coverage, - ) - test_result += res - test_status += status - - return test_result, test_status - - -async def run_code_generator_template_demo_portal_test( - config, -) -> Tuple[str, int]: - test_result = "" - test_status = 0 - # Template - res, status = await test_exec( - "./addons/TechnoLibre_odoo-code-generator-template", - generated_module="code_generator_demo_portal", - tested_module="code_generator_template_demo_portal", - search_class_module="demo_portal", - lst_init_module_name=[ - "demo_portal", - ], - test_name="code_generator_template_demo_portal", - run_in_sandbox=True, - keep_cache=config.keep_cache, - coverage=config.coverage, - ) - test_result += res - test_status += status - - return test_result, test_status - - -async def run_code_generator_template_demo_internal_test( - config, -) -> Tuple[str, int]: - test_result = "" - test_status = 0 - # Template - res, status = await test_exec( - "./addons/TechnoLibre_odoo-code-generator-template", - generated_module="code_generator_demo_internal", - tested_module="code_generator_template_demo_internal", - search_class_module="demo_internal", - lst_init_module_name=[ - "demo_internal", - ], - test_name="code_generator_template_demo_internal", - run_in_sandbox=True, - keep_cache=config.keep_cache, - coverage=config.coverage, - ) - test_result += res - test_status += status - - return test_result, test_status - - -async def run_code_generator_template_demo_internal_inherit_test( - config, -) -> Tuple[str, int]: - test_result = "" - test_status = 0 - # Template - res, status = await test_exec( - "./addons/TechnoLibre_odoo-code-generator-template", - generated_module="code_generator_demo_internal_inherit", - tested_module="code_generator_template_demo_internal_inherit", - search_class_module="demo_internal_inherit", - lst_init_module_name=[ - "demo_internal_inherit", - ], - test_name="code_generator_template_demo_internal_inherit", - run_in_sandbox=True, - keep_cache=config.keep_cache, - coverage=config.coverage, - ) - test_result += res - test_status += status - - return test_result, test_status - - -async def run_code_generator_template_demo_sysadmin_cron_test( - config, -) -> Tuple[str, int]: - test_result = "" - test_status = 0 - # Template - res, status = await test_exec( - "./addons/OCA_server-tools/auto_backup", - generated_module="code_generator_auto_backup", - generate_path="./addons/OCA_server-tools/", - tested_module="code_generator_template_demo_sysadmin_cron", - search_class_module="auto_backup", - lst_init_module_name=[ - "auto_backup", - ], - test_name="code_generator_template_demo_sysadmin_cron", - install_path="./addons/TechnoLibre_odoo-code-generator-template", - run_in_sandbox=True, - keep_cache=config.keep_cache, - coverage=config.coverage, - ) - test_result += res - test_status += status - - return test_result, test_status - - -async def run_helloworld_test(config) -> Tuple[str, int]: - res, status = await run_command( - "./test/code_generator/hello_world.sh", test_name="helloworld_test" - ) - - return res, status - - -def run_all_test(config) -> None: - # low in time, at the end for more speed - task_list = [ - run_code_generator_migrator_demo_mariadb_sql_example_1_test(config), - run_code_generator_template_demo_mariadb_sql_example_1_test(config), - run_code_generator_demo_mariadb_sql_example_1_test(config), - run_code_generator_auto_backup_test(config), - run_code_generator_template_demo_portal_test(config), - run_code_generator_template_demo_internal_test(config), - run_code_generator_template_demo_internal_inherit_test(config), - run_code_generator_template_demo_sysadmin_cron_test(config), - run_code_generator_demo_test(config), - # Begin to run generic test - # run_code_generator_generic_all_test(config), - run_code_generator_data_test(config), - run_code_generator_data_test_part_2(config), - run_code_generator_export_website_attachments_test(config), - run_code_generator_theme_test(config), - run_code_generator_website_snippet_test(config), - run_code_generator_demo_generic_test(config), - # End run generic test - run_code_generator_inherit_test(config), - run_demo_test(config), - ] - task_second_list = [ - # TODO Will cause conflict with the other because write in code_generator_demo/hooks.py - run_helloworld_test(config), - ] - - _logger.info("First list task") - lib_asyncio.print_summary_task(task_list) - _logger.info("Second list task") - lib_asyncio.print_summary_task(task_second_list) - - _logger.info("First execution") - tpl_result = lib_asyncio.execute(config, task_list) - _logger.info("Second execution") - tpl_result_second = lib_asyncio.execute(config, task_second_list) - - # Extra - tpl_result_total = tpl_result + tpl_result_second - task_list_total = task_list + task_second_list - print_log(task_list_total, tpl_result_total) - status = check_result(task_list_total, tpl_result_total) + install_path = dct_test.get("install_path") + run_in_sandbox = dct_test.get("run_in_sandbox", True) + restore_db_image_name = dct_test.get( + "restore_db_image_name", "erplibre_base" + ) + keep_cache = config.keep_cache + coverage = config.coverage + cb_coroutine = test_exec( + path_module_check, + generated_module=generated_module, + generate_path=generate_path, + tested_module=tested_module, + search_class_module=search_class_module, + script_after_init_check=script_after_init_check, + lst_init_module_name=lst_init_module_name, + file_to_restore=file_to_restore, + file_to_restore_origin=file_to_restore_origin, + test_name=test_name, + install_path=install_path, + run_in_sandbox=run_in_sandbox, + restore_db_image_name=restore_db_image_name, + keep_cache=keep_cache, + coverage=coverage, + ) + if cb_coroutine: + dct_task[sequence].append(cb_coroutine) + dct_task_name[sequence].append(test_name) + lst_sequence = sorted(list(dct_task.keys())) + # Print summary + total_tpl_result = [] + total_tpl_task = [] + # Print summary + for sequence in lst_sequence: + lst_task = dct_task[sequence] + lst_task_name = dct_task_name[sequence] + print(f"sequence {sequence}") + lib_asyncio.print_summary_task(lst_task, lst_task_name=lst_task_name) + # Execute in sequence + for sequence in lst_sequence: + lst_task = dct_task[sequence] + tpl_result, has_asyncio_error = lib_asyncio.execute(config, lst_task) + total_tpl_result.extend(tpl_result) + total_tpl_task.extend(lst_task) + print_log(total_tpl_task, total_tpl_result) + status = check_result(total_tpl_task, total_tpl_result) if status: log_file_print = LOG_FILE else: log_file_print = f"{Fore.RED}{LOG_FILE}{Fore.RESET}" + if config.output_result_dir: + print_log_output_into_dir(total_tpl_result, config.output_result_dir) + print(f"Log file {log_file_print}") + return status def main(): @@ -1269,14 +908,15 @@ def main(): success = check_git_change() else: success = True + status = False if success: - run_all_test(config) + status = run_all_test(config) end_time = time.time() diff_sec = end_time - start_time # print(f"Time execution {diff_sec:.3f}s") print(f"Time execution {datetime.timedelta(seconds=diff_sec)}") - return 0 + return int(not status) if __name__ == "__main__": From 44434f3457482da54e0b4478157f03b35cd8cd02 Mon Sep 17 00:00:00 2001 From: Mathieu Benoit Date: Sat, 3 Feb 2024 01:54:28 -0500 Subject: [PATCH 06/18] [ADD] script system: search_docker_compose_erplibre.sh --- .../system/search_docker_compose_erplibre.sh | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) create mode 100755 script/system/search_docker_compose_erplibre.sh diff --git a/script/system/search_docker_compose_erplibre.sh b/script/system/search_docker_compose_erplibre.sh new file mode 100755 index 0000000..c3f4210 --- /dev/null +++ b/script/system/search_docker_compose_erplibre.sh @@ -0,0 +1,20 @@ +#!/bin/bash + +USE_LOCATE=true + +if [ "$USE_LOCATE" == false ] +then + find "/" -name "docker-compose.yml" -type f -print 2>/dev/null | grep -v .repo | grep -v /var/lib/docker | xargs -I {} sh -c 'grep -l "ERPLibre" "{}" 2>/dev/null || true' +# SEARCH_PATH="/" +# find "$SEARCH_PATH" -name "docker-compose.yml" -type f 2>/dev/null | grep -v .repo | while read -r file; do +# grep -q "ERPLibre" "$file" && echo "$file" +# done +elif [ "$USE_LOCATE" == true ] +then + locate -b -r "^docker-compose\.yml$" | grep -v .repo | grep -v /var/lib/docker | xargs -I {} sh -c "grep -l \"ERPLibre\" \"{}\" 2>/dev/null || true" +# locate -b -r '^docker-compose\.yml$' | grep -v .repo | while read -r file; do +# if [ -f "$file" ]; then +# grep -q 'ERPLibre' "$file" && echo "$file" +# fi +# done +fi From 10cead294fb5a3c1cc730faccb390f8371566682 Mon Sep 17 00:00:00 2001 From: Mathieu Benoit Date: Tue, 6 Feb 2024 21:26:49 -0500 Subject: [PATCH 07/18] =?UTF-8?q?[FIX]=C2=A0script=20install=20ubuntu=2023?= =?UTF-8?q?.10?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- script/install/install_debian_dependency.sh | 3 +++ script/install/install_dev.sh | 10 +++++----- script/install/install_locally.sh | 3 +++ 3 files changed, 11 insertions(+), 5 deletions(-) diff --git a/script/install/install_debian_dependency.sh b/script/install/install_debian_dependency.sh index aaac1f0..5afba64 100755 --- a/script/install/install_debian_dependency.sh +++ b/script/install/install_debian_dependency.sh @@ -21,6 +21,9 @@ elif [ "18.04" == "${UBUNTU_VERSION}" ]; then WKHTMLTOX_X64=https://github.com/wkhtmltopdf/packaging/releases/download/0.12.6-1/wkhtmltox_0.12.6-1.bionic_amd64.deb elif [[ "${OS}" == "Debian" ]]; then WKHTMLTOX_X64=https://github.com/wkhtmltopdf/packaging/releases/download/0.12.6.1-2/wkhtmltox_0.12.6.1-2.bullseye_amd64.deb +elif [[ "${OS}" == *"Ubuntu"* ]]; then + echo "Your version of Ubuntu is not supported, only support 18.04, 20.04 and 22.04" + WKHTMLTOX_X64=https://github.com/wkhtmltopdf/packaging/releases/download/0.12.6.1-2/wkhtmltox_0.12.6.1-2.jammy_amd64.deb else echo "Your version of Ubuntu is not supported, only support 18.04, 20.04 and 22.04" exit 1 diff --git a/script/install/install_dev.sh b/script/install/install_dev.sh index 739d00a..f655869 100755 --- a/script/install/install_dev.sh +++ b/script/install/install_dev.sh @@ -3,18 +3,18 @@ if [[ "${OSTYPE}" == "linux-gnu" ]]; then OS=$(lsb_release -si) VERSION=$(cat /etc/issue) - if [[ "${OS}" == "Ubuntu" ]]; then - if [[ "${VERSION}" == Ubuntu\ 18.04* || "${VERSION}" == Ubuntu\ 20.04* || "${VERSION}" == Ubuntu\ 22.04* ]]; then + if [[ "${OS}" == *"Ubuntu"* ]]; then + if [[ "${VERSION}" == Ubuntu\ 18.04* || "${VERSION}" == Ubuntu\ 20.04* || "${VERSION}" == Ubuntu\ 22.04* || "${VERSION}" == Ubuntu\ 22.10* || "${VERSION}" == Ubuntu\ 23.04* || "${VERSION}" == Ubuntu\ 23.10* ]]; then echo "\n---- linux-gnu installation process started ----" ./script/install/install_debian_dependency.sh else - echo "Your version is not supported, only support 18.04, 20.04 and 22.04 : ${VERSION}" + echo "Your version is not supported, only support 18.04, 20.04 and 22.04 - 23.10 : ${VERSION}" fi - elif [[ "${OS}" == "Debian" ]]; then + elif [[ "${OS}" == *"Debian"* ]]; then ./script/install/install_debian_dependency.sh else ./script/install/install_debian_dependency.sh - echo "Your Linux system is not supported, only support Ubuntu 18.04 or Ubuntu 20.04 or Ubuntu 22.04." + echo "Your Linux system is not supported, only support Ubuntu 18.04 or Ubuntu 20.04 or Ubuntu 22.04 - Ubuntu 23.10." fi elif [[ "${OSTYPE}" == "darwin"* ]]; then echo "\n---- Darwin installation process started ----" diff --git a/script/install/install_locally.sh b/script/install/install_locally.sh index 8d49c10..912d9f4 100755 --- a/script/install/install_locally.sh +++ b/script/install/install_locally.sh @@ -42,6 +42,9 @@ echo ${LOCAL_PYTHON_EXEC} if [[ ! -d "${PYENV_PATH}" ]]; then echo -e "\n---- Installing pyenv in ${PYENV_PATH} ----" + # export PYENV_GIT_TAG=v2.3.35 + # To change version + # rm ~/.pyenv to uninstall it curl -L https://raw.githubusercontent.com/pyenv/pyenv-installer/master/bin/pyenv-installer | bash fi From 6d0c03dc25dc25e0f52357e8b63ad1a91853687b Mon Sep 17 00:00:00 2001 From: Mathieu Benoit Date: Fri, 23 Feb 2024 17:20:09 -0500 Subject: [PATCH 08/18] [FIX] script run_parallel_test: check tpl_result before use --- script/test/run_parallel_test.py | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/script/test/run_parallel_test.py b/script/test/run_parallel_test.py index eb78d1d..b12bc49 100755 --- a/script/test/run_parallel_test.py +++ b/script/test/run_parallel_test.py @@ -879,8 +879,15 @@ def run_all_test(config) -> bool: for sequence in lst_sequence: lst_task = dct_task[sequence] tpl_result, has_asyncio_error = lib_asyncio.execute(config, lst_task) - total_tpl_result.extend(tpl_result) - total_tpl_task.extend(lst_task) + if tpl_result: + total_tpl_result.extend(tpl_result) + else: + _logger.error("tpl_result is empty.") + if lst_task: + total_tpl_task.extend(lst_task) + else: + _logger.error("tpl_task is empty.") + print_log(total_tpl_task, total_tpl_result) status = check_result(total_tpl_task, total_tpl_result) if status: From ea9be9b2cacfce42da812dece3f77c710995aac3 Mon Sep 17 00:00:00 2001 From: Mathieu Benoit Date: Fri, 23 Feb 2024 13:01:10 -0500 Subject: [PATCH 09/18] [FIX] script python: missing color log error --- coverage_run.sh | 8 ++-- run.sh | 8 ++-- script/addons/coverage_install_addons.sh | 7 ++- script/addons/coverage_install_addons_dev.sh | 7 ++- .../coverage_install_addons_restore_dev.sh | 7 ++- script/addons/install_addons.sh | 7 ++- .../install_addons_cg_template_restore_dev.sh | 9 ++-- script/addons/install_addons_dev.sh | 7 ++- script/addons/install_addons_from_file.sh | 5 ++- script/addons/install_addons_restore_dev.sh | 7 ++- script/addons/install_addons_theme.sh | 7 ++- script/addons/reinstall_addons.sh | 7 ++- script/addons/uninstall_addons.sh | 5 ++- script/addons/update_addons_all.sh | 4 +- script/addons/update_prod_to_dev.sh | 5 ++- .../check_git_change_code_generator.sh | 8 ++-- ...overage_install_and_test_code_generator.sh | 12 ++--- .../install_and_test_code_generator.sh | 12 ++--- .../test_code_generator_update_module.py | 7 +-- .../transform_xml_to_code_writer.py | 3 +- script/docker/docker_build.sh | 4 +- script/fork_github_repo/__init__.py | 6 ++- script/git/git_diff_repo_manifest.py | 5 ++- script/git/git_tool.py | 18 +++++--- script/install/install_locally.sh | 5 ++- script/install/install_locally_dev.sh | 7 ++- script/install/install_locally_prod.sh | 7 ++- script/maintenance/autopep8.sh | 5 ++- script/maintenance/black.sh | 5 ++- script/maintenance/prettier.sh | 5 ++- script/maintenance/prettier_xml.sh | 5 ++- script/make.sh | 5 ++- script/poetry/poetry_add_build_dependency.sh | 5 ++- script/poetry/poetry_update.py | 6 +-- script/test/run_parallel_test.py | 45 ++++++++++++------- test.sh | 8 ++-- 36 files changed, 194 insertions(+), 89 deletions(-) diff --git a/coverage_run.sh b/coverage_run.sh index 5c79454..8038a06 100755 --- a/coverage_run.sh +++ b/coverage_run.sh @@ -1,19 +1,21 @@ #!/usr/bin/env bash source ./.venv/bin/activate +Red='\033[0;31m' # Red +Color_Off='\033[0m' # Text Reset CONFIG_PATH="./config.conf" ORIGIN_CONFIG_PATH=CONFIG_PATH if [ ! -f "${CONFIG_PATH}" ]; then CONFIG_PATH="/etc/odoo/odoo.conf" if [ ! -f "${CONFIG_PATH}" ]; then - echo "Cannot find ERPLibre configuration ${ORIGIN_CONFIG_PATH}, did you install ERPLibre? > make install" + echo "${Red}Cannot find${Color_Off} ERPLibre configuration ${ORIGIN_CONFIG_PATH}, did you install ERPLibre? > make install" exit 1 fi fi -coverage run -p ./odoo/odoo-bin -c ${CONFIG_PATH} --limit-time-real 99999 --limit-time-cpu 99999 $@ +coverage run -p ./odoo/odoo-bin -c "${CONFIG_PATH}" --limit-time-real 99999 --limit-time-cpu 99999 "$@" retVal=$? if [[ $retVal -ne 0 ]]; then - echo "Error coverage_run.sh" + echo "${Red}Error${Color_Off} run.sh" exit 1 fi diff --git a/run.sh b/run.sh index 24a8483..15ec721 100755 --- a/run.sh +++ b/run.sh @@ -1,22 +1,24 @@ #!/usr/bin/env bash source ./.venv/bin/activate +Red='\033[0;31m' # Red +Color_Off='\033[0m' # Text Reset CONFIG_PATH="./config.conf" ORIGIN_CONFIG_PATH=CONFIG_PATH if [ ! -f "${CONFIG_PATH}" ]; then CONFIG_PATH="/etc/odoo/odoo.conf" if [ ! -f "${CONFIG_PATH}" ]; then - echo "Cannot find ERPLibre configuration ${ORIGIN_CONFIG_PATH}, did you install ERPLibre? > make install" + echo "${Red}Cannot find${Color_Off} ERPLibre configuration ${ORIGIN_CONFIG_PATH}, did you install ERPLibre? > make install" exit 1 fi fi -python3 ./odoo/odoo-bin -c ${CONFIG_PATH} --limit-time-real 99999 --limit-time-cpu 99999 --limit-memory-hard=0 "$@" +python3 ./odoo/odoo-bin -c "${CONFIG_PATH}" --limit-time-real 99999 --limit-time-cpu 99999 --limit-memory-hard=0 "$@" # When need more memory RAM for instance by force #python3 ./odoo/odoo-bin -c ${CONFIG_PATH} --limit-time-real 99999 --limit-time-cpu 99999 --limit-memory-soft=8589934592 --limit-memory-hard=10737418240 $@ retVal=$? if [[ $retVal -ne 0 ]]; then - echo "Error run.sh" + echo "${Red}Error${Color_Off} run.sh" exit 1 fi diff --git a/script/addons/coverage_install_addons.sh b/script/addons/coverage_install_addons.sh index 790f49a..48194de 100755 --- a/script/addons/coverage_install_addons.sh +++ b/script/addons/coverage_install_addons.sh @@ -1,4 +1,7 @@ #!/usr/bin/env bash +Red='\033[0;31m' # Red +Color_Off='\033[0m' # Text Reset + # Argument 3 is config if [[ $# -eq 3 ]]; then ./script/addons/check_addons_exist.py -m "$2" -c "$3" @@ -7,7 +10,7 @@ else fi retVal=$? if [[ $retVal -ne 0 ]]; then - echo "Error check_addons_exist.py into coverage_install_addons.sh" + echo -e "${Red}Error${Color_Off} check_addons_exist.py into coverage_install_addons.sh" exit 1 fi @@ -21,6 +24,6 @@ fi retVal=$? if [[ $retVal -ne 0 ]]; then - echo "Error coverage_run.sh into coverage_install_addons.sh" + echo -e "${Red}Error${Color_Off} coverage_run.sh into coverage_install_addons.sh" exit 1 fi diff --git a/script/addons/coverage_install_addons_dev.sh b/script/addons/coverage_install_addons_dev.sh index 8363bf0..4a56c86 100755 --- a/script/addons/coverage_install_addons_dev.sh +++ b/script/addons/coverage_install_addons_dev.sh @@ -1,4 +1,7 @@ #!/usr/bin/env bash +Red='\033[0;31m' # Red +Color_Off='\033[0m' # Text Reset + # Argument 3 is config if [[ $# -eq 3 ]]; then ./script/addons/check_addons_exist.py -m "$2" -c "$3" @@ -7,7 +10,7 @@ else fi retVal=$? if [[ $retVal -ne 0 ]]; then - echo "Error check_addons_exist.py into coverage_install_addons_dev.sh" + echo -e "${Red}Error${Color_Off} check_addons_exist.py into coverage_install_addons_dev.sh" exit 1 fi @@ -21,6 +24,6 @@ fi retVal=$? if [[ $retVal -ne 0 ]]; then - echo "Error coverage_run.sh into coverage_install_addons_dev.sh" + echo -e "${Red}Error${Color_Off} coverage_run.sh into coverage_install_addons_dev.sh" exit 1 fi diff --git a/script/addons/coverage_install_addons_restore_dev.sh b/script/addons/coverage_install_addons_restore_dev.sh index 93cfb31..8154f89 100755 --- a/script/addons/coverage_install_addons_restore_dev.sh +++ b/script/addons/coverage_install_addons_restore_dev.sh @@ -1,15 +1,18 @@ #!/usr/bin/env bash +Red='\033[0;31m' # Red +Color_Off='\033[0m' # Text Reset + # "$1" code_generator_name ./script/database/db_restore.py --database "$1" retVal=$? if [[ $retVal -ne 0 ]]; then - echo "Error ./script/database/db_restore.py into coverage_install_addons_restore_dev.sh" + echo -e "${Red}Error${Color_Off} ./script/database/db_restore.py into coverage_install_addons_restore_dev.sh" exit 1 fi ./script/addons/coverage_install_addons_dev.sh "$1" "$1" retVal=$? if [[ $retVal -ne 0 ]]; then - echo "Error ./script/addons/coverage_install_addons_dev.sh into coverage_install_addons_restore_dev.sh" + echo -e "${Red}Error${Color_Off} ./script/addons/coverage_install_addons_dev.sh into coverage_install_addons_restore_dev.sh" exit 1 fi diff --git a/script/addons/install_addons.sh b/script/addons/install_addons.sh index af0d7ee..6cbb224 100755 --- a/script/addons/install_addons.sh +++ b/script/addons/install_addons.sh @@ -1,4 +1,7 @@ #!/usr/bin/env bash +Red='\033[0;31m' # Red +Color_Off='\033[0m' # Text Reset + # Argument 3 is config if [[ $# -eq 3 ]]; then ./script/addons/check_addons_exist.py -m "$2" -c "$3" @@ -7,7 +10,7 @@ else fi retVal=$? if [[ $retVal -ne 0 ]]; then - echo "Error check_addons_exist.py into install_addons.sh" + echo -e "${Red}Error${Color_Off} check_addons_exist.py into install_addons.sh" exit 1 fi @@ -21,6 +24,6 @@ fi retVal=$? if [[ $retVal -ne 0 ]]; then - echo "Error run.sh into install_addons.sh" + echo -e "${Red}Error${Color_Off} run.sh into install_addons.sh" exit 1 fi diff --git a/script/addons/install_addons_cg_template_restore_dev.sh b/script/addons/install_addons_cg_template_restore_dev.sh index fc614ec..3acb325 100755 --- a/script/addons/install_addons_cg_template_restore_dev.sh +++ b/script/addons/install_addons_cg_template_restore_dev.sh @@ -1,21 +1,24 @@ #!/usr/bin/env bash +Red='\033[0;31m' # Red +Color_Off='\033[0m' # Text Reset + # "$1" module_name # "$1" code_generator_template_name ./script/database/db_restore.py --database "$2" retVal=$? if [[ $retVal -ne 0 ]]; then - echo "Error ./script/database/db_restore.py into install_addons_cg_template_restore_dev.sh" + echo -e "${Red}Error${Color_Off} ./script/database/db_restore.py into install_addons_cg_template_restore_dev.sh" exit 1 fi ./script/addons/install_addons_dev.sh "$2" "$1" retVal=$? if [[ $retVal -ne 0 ]]; then - echo "Error ./script/addons/install_addons_dev.sh install module into install_addons_cg_template_restore_dev.sh" + echo -e "${Red}Error${Color_Off} ./script/addons/install_addons_dev.sh install module into install_addons_cg_template_restore_dev.sh" exit 1 fi ./script/addons/install_addons_dev.sh "$2" "$2" retVal=$? if [[ $retVal -ne 0 ]]; then - echo "Error ./script/addons/install_addons_dev.sh install template into install_addons_cg_template_restore_dev.sh" + echo -e "${Red}Error${Color_Off} ./script/addons/install_addons_dev.sh install template into install_addons_cg_template_restore_dev.sh" exit 1 fi diff --git a/script/addons/install_addons_dev.sh b/script/addons/install_addons_dev.sh index f42e7cd..e010cc0 100755 --- a/script/addons/install_addons_dev.sh +++ b/script/addons/install_addons_dev.sh @@ -1,4 +1,7 @@ #!/usr/bin/env bash +Red='\033[0;31m' # Red +Color_Off='\033[0m' # Text Reset + # Argument 3 is config if [[ $# -eq 3 ]]; then ./script/addons/check_addons_exist.py -m "$2" -c "$3" @@ -7,7 +10,7 @@ else fi retVal=$? if [[ $retVal -ne 0 ]]; then - echo "Error check_addons_exist.py into install_addons_dev.sh" + echo -e "${Red}Error${Color_Off} check_addons_exist.py into install_addons_dev.sh" exit 1 fi @@ -22,6 +25,6 @@ fi retVal=$? if [[ $retVal -ne 0 ]]; then - echo "Error run.sh into install_addons_dev.sh" + echo -e "${Red}Error${Color_Off} run.sh into install_addons_dev.sh" exit 1 fi diff --git a/script/addons/install_addons_from_file.sh b/script/addons/install_addons_from_file.sh index 6c347e4..0c7278d 100755 --- a/script/addons/install_addons_from_file.sh +++ b/script/addons/install_addons_from_file.sh @@ -1,9 +1,12 @@ #!/usr/bin/env bash +Red='\033[0;31m' # Red +Color_Off='\033[0m' # Text Reset + # $1 BD NAME # $2 file_path ./script/addons/install_addons.sh "$1" "$(<$2)" retVal=$? if [[ $retVal -ne 0 ]]; then - echo "Error ./script/addons/install_addons.sh into install_addons_from_file.sh" + echo -e "${Red}Error${Color_Off} ./script/addons/install_addons.sh into install_addons_from_file.sh" exit 1 fi diff --git a/script/addons/install_addons_restore_dev.sh b/script/addons/install_addons_restore_dev.sh index 1d51b44..a321317 100755 --- a/script/addons/install_addons_restore_dev.sh +++ b/script/addons/install_addons_restore_dev.sh @@ -1,15 +1,18 @@ #!/usr/bin/env bash +Red='\033[0;31m' # Red +Color_Off='\033[0m' # Text Reset + # "$1" code_generator_name ./script/database/db_restore.py --database "$1" retVal=$? if [[ $retVal -ne 0 ]]; then - echo "Error ./script/database/db_restore.py into install_addons_restore_dev.sh" + echo -e "${Red}Error${Color_Off} ./script/database/db_restore.py into install_addons_restore_dev.sh" exit 1 fi ./script/addons/install_addons_dev.sh "$1" "$1" retVal=$? if [[ $retVal -ne 0 ]]; then - echo "Error ./script/addons/install_addons_dev.sh into install_addons_restore_dev.sh" + echo -e "${Red}Error${Color_Off} ./script/addons/install_addons_dev.sh into install_addons_restore_dev.sh" exit 1 fi diff --git a/script/addons/install_addons_theme.sh b/script/addons/install_addons_theme.sh index 657767e..1ddf7db 100755 --- a/script/addons/install_addons_theme.sh +++ b/script/addons/install_addons_theme.sh @@ -1,5 +1,8 @@ #!/usr/bin/env bash # TODO addons website need to be install before to install the theme +Red='\033[0;31m' # Red +Color_Off='\033[0m' # Text Reset + # Argument 3 is config if [[ $# -eq 3 ]]; then ./script/addons/check_addons_exist.py -m "$2" -c "$3" @@ -8,7 +11,7 @@ else fi retVal=$? if [[ $retVal -ne 0 ]]; then - echo "Error check_addons_exist.py into install_addons.sh" + echo -e "${Red}Error${Color_Off} check_addons_exist.py into install_addons.sh" exit 1 fi @@ -22,6 +25,6 @@ fi retVal=$? if [[ $retVal -ne 0 ]]; then - echo "Error run.sh into install_addons_theme.sh" + echo -e "${Red}Error${Color_Off} run.sh into install_addons_theme.sh" exit 1 fi diff --git a/script/addons/reinstall_addons.sh b/script/addons/reinstall_addons.sh index f9c50fd..7926c1e 100755 --- a/script/addons/reinstall_addons.sh +++ b/script/addons/reinstall_addons.sh @@ -1,4 +1,7 @@ #!/usr/bin/env bash +Red='\033[0;31m' # Red +Color_Off='\033[0m' # Text Reset + # Argument 3 is config if [[ $# -eq 3 ]]; then ./script/addons/check_addons_exist.py -m "$2" -c "$3" @@ -7,7 +10,7 @@ else fi retVal=$? if [[ $retVal -ne 0 ]]; then - echo "Error check_addons_exist.py into reinstall_addons_dev.sh" + echo -e "${Red}Error${Color_Off} check_addons_exist.py into reinstall_addons_dev.sh" exit 1 fi @@ -28,6 +31,6 @@ else fi retVal=$? if [[ $retVal -ne 0 ]]; then - echo "Error install_addons_dev.sh into reinstall_addons.sh" + echo -e "${Red}Error${Color_Off} install_addons_dev.sh into reinstall_addons.sh" exit 1 fi diff --git a/script/addons/uninstall_addons.sh b/script/addons/uninstall_addons.sh index 564a659..bedb48f 100755 --- a/script/addons/uninstall_addons.sh +++ b/script/addons/uninstall_addons.sh @@ -1,4 +1,7 @@ #!/usr/bin/env bash +Red='\033[0;31m' # Red +Color_Off='\033[0m' # Text Reset + # Argument 3 is config if [[ $# -eq 3 ]]; then ./script/addons/check_addons_exist.py -m "$2" -c "$3" @@ -7,7 +10,7 @@ else fi retVal=$? if [[ $retVal -ne 0 ]]; then - echo "Error check_addons_exist.py into uninstall_addons.sh" + echo -e "${Red}Error${Color_Off} check_addons_exist.py into uninstall_addons.sh" exit 1 fi diff --git a/script/addons/update_addons_all.sh b/script/addons/update_addons_all.sh index 9a717b1..7998618 100755 --- a/script/addons/update_addons_all.sh +++ b/script/addons/update_addons_all.sh @@ -1,4 +1,6 @@ #!/usr/bin/env bash +Red='\033[0;31m' # Red +Color_Off='\033[0m' # Text Reset echo "Update all on BD '$1'" @@ -6,6 +8,6 @@ echo "Update all on BD '$1'" retVal=$? if [[ $retVal -ne 0 ]]; then - echo "Error run.sh into update_addons_all.sh" + echo -e "${Red}Error${Color_Off} run.sh into update_addons_all.sh" exit 1 fi diff --git a/script/addons/update_prod_to_dev.sh b/script/addons/update_prod_to_dev.sh index 6b948eb..b3c3554 100755 --- a/script/addons/update_prod_to_dev.sh +++ b/script/addons/update_prod_to_dev.sh @@ -1,4 +1,7 @@ #!/usr/bin/env bash +Red='\033[0;31m' # Red +Color_Off='\033[0m' # Text Reset + # This script will remove mail configuration, remove backup configuration, and force admin user to test/test echo "Update prod to dev on BD '$1'" @@ -6,6 +9,6 @@ echo "Update prod to dev on BD '$1'" retVal=$? if [[ $retVal -ne 0 ]]; then - echo "Error install_addons.sh into update_prod_to_dev.sh" + echo -e "${Red}Error${Color_Off} install_addons.sh into update_prod_to_dev.sh" exit 1 fi diff --git a/script/code_generator/check_git_change_code_generator.sh b/script/code_generator/check_git_change_code_generator.sh index 14a101f..453c81c 100755 --- a/script/code_generator/check_git_change_code_generator.sh +++ b/script/code_generator/check_git_change_code_generator.sh @@ -84,15 +84,15 @@ check_git() { fi if [ -z "$output" ]; then if [ $# -gt 1 ]; then - echo "PASS - ${REP}/${2}" + echo -e "${Green}PASS${Color_Off} - ${REP}/${2}" else - echo "PASS - ${REP}" + echo -e "${Green}PASS${Color_Off} - ${REP}" fi else if [ $# -gt 1 ]; then - echo -e "${Red}FAIL - ${REP}${2}${Color_Off}" + echo -e "${Red}FAIL${Color_Off} - ${REP}${2}" else - echo -e "${Red}FAIL - ${REP}${Color_Off}" + echo -e "${Red}FAIL${Color_Off} - ${REP}" fi echo -e "${BRed}${output}${Color_Off}" cd - >/dev/null || exit diff --git a/script/code_generator/coverage_install_and_test_code_generator.sh b/script/code_generator/coverage_install_and_test_code_generator.sh index 541231e..bf9e745 100755 --- a/script/code_generator/coverage_install_and_test_code_generator.sh +++ b/script/code_generator/coverage_install_and_test_code_generator.sh @@ -4,9 +4,11 @@ # $3 is directory path to check # $4 is generated module name separate by , # $5 optional, the config path +Red='\033[0;31m' # Red +Color_Off='\033[0m' # Text Reset if [[ $# -lt 4 ]]; then - echo "ERROR, need 4 arguments: 1-database name, 2-list of module to install, 3-directory to check difference, 4-list of generated module" + echo -e "${Red}Error${Color_Off}, need 4 arguments: 1-database name, 2-list of module to install, 3-directory to check difference, 4-list of generated module" exit 1 fi @@ -16,14 +18,14 @@ if [[ $# -eq 5 ]]; then ./script/addons/coverage_install_addons_dev.sh "$1" "$2" "$5" retVal=$? if [[ $retVal -ne 0 ]]; then - echo "Error ./script/addons/coverage_install_addons_dev.sh ${1} ${2} ${5}" + echo -e "${Red}Error${Color_Off} ./script/addons/coverage_install_addons_dev.sh ${1} ${2} ${5}" exit 1 fi else ./script/addons/coverage_install_addons_dev.sh "$1" "$2" retVal=$? if [[ $retVal -ne 0 ]]; then - echo "Error ./script/addons/coverage_install_addons_dev.sh ${1} ${2}" + echo -e "${Red}Error${Color_Off} ./script/addons/coverage_install_addons_dev.sh ${1} ${2}" exit 1 fi fi @@ -32,7 +34,7 @@ fi ./script/code_generator/test_code_generator_update_module.py -m "$4" -d "$3" --datetime "${INIT_DATETIME}" retVal=$? if [[ $retVal -ne 0 ]]; then - echo "Error ./script/code_generator/test_code_generator_update_module.py ${4} ${3}" + echo -e "${Red}Error${Color_Off} ./script/code_generator/test_code_generator_update_module.py ${4} ${3}" exit 1 fi @@ -54,6 +56,6 @@ echo "TEST ${2}" ./script/code_generator/check_git_change_code_generator.sh "$3" retVal=$? if [[ $retVal -ne 0 ]]; then - echo "Error ./script/code_generator/check_git_change_code_generator.sh" + echo -e "${Red}Error${Color_Off} ./script/code_generator/check_git_change_code_generator.sh" exit 1 fi diff --git a/script/code_generator/install_and_test_code_generator.sh b/script/code_generator/install_and_test_code_generator.sh index 57267d8..4d71798 100755 --- a/script/code_generator/install_and_test_code_generator.sh +++ b/script/code_generator/install_and_test_code_generator.sh @@ -4,9 +4,11 @@ # $3 is directory path to check # $4 is generated module name separate by , # $5 optional, the config path +Red='\033[0;31m' # Red +Color_Off='\033[0m' # Text Reset if [[ $# -lt 4 ]]; then - echo "ERROR, need 4 arguments: 1-database name, 2-list of module to install, 3-directory to check difference, 4-list of generated module" + echo -e "${Red}Error${Color_Off}, need 4 arguments: 1-database name, 2-list of module to install, 3-directory to check difference, 4-list of generated module" exit 1 fi @@ -16,14 +18,14 @@ if [[ $# -eq 5 ]]; then ./script/addons/install_addons_dev.sh "$1" "$2" "$5" retVal=$? if [[ $retVal -ne 0 ]]; then - echo "Error ./script/addons/install_addons_dev.sh ${1} ${2} ${5}" + echo -e "${Red}Error${Color_Off} ./script/addons/install_addons_dev.sh ${1} ${2} ${5}" exit 1 fi else ./script/addons/install_addons_dev.sh "$1" "$2" retVal=$? if [[ $retVal -ne 0 ]]; then - echo "Error ./script/addons/install_addons_dev.sh ${1} ${2}" + echo -e "${Red}Error${Color_Off} ./script/addons/install_addons_dev.sh ${1} ${2}" exit 1 fi fi @@ -32,7 +34,7 @@ fi ./script/code_generator/test_code_generator_update_module.py -m "$4" -d "$3" --datetime "${INIT_DATETIME}" retVal=$? if [[ $retVal -ne 0 ]]; then - echo "Error ./script/code_generator/test_code_generator_update_module.py ${4} ${3}" + echo -e "${Red}Error${Color_Off} ./script/code_generator/test_code_generator_update_module.py ${4} ${3}" exit 1 fi @@ -64,6 +66,6 @@ echo "TEST ${2}" ./script/code_generator/check_git_change_code_generator.sh "$3" retVal=$? if [[ $retVal -ne 0 ]]; then - echo "Error ./script/code_generator/check_git_change_code_generator.sh" + echo -e "${Red}Error${Color_Off} ./script/code_generator/check_git_change_code_generator.sh" exit 1 fi diff --git a/script/code_generator/test_code_generator_update_module.py b/script/code_generator/test_code_generator_update_module.py index aa385fa..676d696 100755 --- a/script/code_generator/test_code_generator_update_module.py +++ b/script/code_generator/test_code_generator_update_module.py @@ -3,6 +3,7 @@ import argparse import logging import os import sys +from colorama import Fore, Style logging.basicConfig(level=logging.DEBUG) _logger = logging.getLogger(__name__) @@ -75,12 +76,12 @@ def main(): if lst_result_wrong: _logger.error( - "FAIL - Some modules wasn't updated, did you execute the code" - f" generator? {lst_result_wrong}" + f"{Fore.RED}FAIL{Style.RESET_ALL} - Some modules wasn't updated," + f" did you execute the code generator? {lst_result_wrong}" ) return -1 elif lst_result_good: - _logger.info("SUCCESS - All modules are updated.") + _logger.info(f"{Fore.GREEN}SUCCESS{Style.RESET_ALL} - All modules are updated.") return 0 diff --git a/script/code_generator/transform_xml_to_code_writer.py b/script/code_generator/transform_xml_to_code_writer.py index cb71a3b..da4429c 100644 --- a/script/code_generator/transform_xml_to_code_writer.py +++ b/script/code_generator/transform_xml_to_code_writer.py @@ -4,6 +4,7 @@ import logging import os import sys from xml.dom import Node, minidom +from colorama import Fore, Style from code_writer import CodeWriter @@ -109,7 +110,7 @@ def main(): mydoc = minidom.parse(config.file) if not mydoc: - print(f"Error, cannot parse {config.file}") + print(f"{Fore.RED}Error{Style.RESET_ALL}, cannot parse {config.file}") sys.exit(1) cw.emit("from lxml.builder import E") diff --git a/script/docker/docker_build.sh b/script/docker/docker_build.sh index c27c6e9..8ed2bf2 100755 --- a/script/docker/docker_build.sh +++ b/script/docker/docker_build.sh @@ -1,5 +1,7 @@ #!/usr/bin/env bash . ./env_var.sh +Red='\033[0;31m' # Red +Color_Off='\033[0m' # Text Reset ARGS="" IS_RELEASE=false @@ -50,7 +52,7 @@ echo "Create docker ${ERPLIBRE_DOCKER_PROD_VERSION}" retVal=$? if [[ $retVal -ne 0 ]]; then - echo "Error ./script/docker/docker_build.sh when execute docker_update_version.py" + echo -e "${Red}Error${Color_Off} ./script/docker/docker_build.sh when execute docker_update_version.py" exit 1 fi diff --git a/script/fork_github_repo/__init__.py b/script/fork_github_repo/__init__.py index 604c72a..d581db9 100644 --- a/script/fork_github_repo/__init__.py +++ b/script/fork_github_repo/__init__.py @@ -3,6 +3,7 @@ from __future__ import print_function import argparse import os.path import shutil +from colorama import Fore, Style import yaml # pip install PyYAML from agithub.GitHub import GitHub # pip install agithub @@ -169,7 +170,10 @@ def fork_and_clone_repo( parsed_url.repo ].forks.post(**args) if status == 404: - print("Error when forking repo %s" % forked_repo) + print( + f"{Fore.RED}FAIL{Style.RESET_ALL} when forking repo" + f" {forked_repo}" + ) exit(1) else: print("Forked %s to %s" % (upstream_url, forked_repo["html_url"])) diff --git a/script/git/git_diff_repo_manifest.py b/script/git/git_diff_repo_manifest.py index 5234029..2144d91 100755 --- a/script/git/git_diff_repo_manifest.py +++ b/script/git/git_diff_repo_manifest.py @@ -3,6 +3,7 @@ import argparse import logging import os import sys +from colorama import Fore, Style from git import Repo @@ -91,8 +92,8 @@ def main(): path2 = value2.get("@path") if path1 != path2: print( - f"WARNING id {i}, path of git are different. " - f"Input1 {path1}, input2 {path2}" + f"{Fore.YELLOW}WARNING{Style.RESET_ALL} id {i}, path of git" + f" are different. Input1 {path1}, input2 {path2}" ) continue diff --git a/script/git/git_tool.py b/script/git/git_tool.py index 171786a..85e850d 100644 --- a/script/git/git_tool.py +++ b/script/git/git_tool.py @@ -5,6 +5,7 @@ import os import webbrowser from collections import OrderedDict from typing import List +from colorama import Fore, Style import git import xmltodict @@ -307,9 +308,10 @@ class GitTool: url = repo_root.git.remote("get-url", "origin") except Exception as e: print( - "WARNING: Missing origin remote, use default url " - f"{DEFAULT_REMOTE_URL}. Suggest to add a remote origin: \n" - f"> git remote add origin {DEFAULT_REMOTE_URL}" + f"{Fore.YELLOW}WARNING{Style.RESET_ALL}: Missing origin" + f" remote, use default url {DEFAULT_REMOTE_URL}. Suggest" + " to add a remote origin: \n> git remote add origin" + f" {DEFAULT_REMOTE_URL}" ) url = DEFAULT_REMOTE_URL url, url_https, url_git = self.get_url(url) @@ -694,7 +696,10 @@ class GitTool: continue line_split = line.split(",") if len(line_split) != 4: - print(f"Error with line {line}, suppose to have only 4 ','.") + print( + f"{Fore.RED}Error{Style.RESET_ALL} with line {line}," + " suppose to have only 4 ','." + ) exit(1) url, path, revision, clone_depth = line_split # Validate url @@ -962,7 +967,10 @@ class GitTool: parsed_url.repo ].forks.post(**args) if status == 404: - print("Error when forking repo %s" % forked_repo) + print( + f"{Fore.RED}Error{Style.RESET_ALL} when forking repo" + f" {forked_repo}" + ) exit(1) else: try: diff --git a/script/install/install_locally.sh b/script/install/install_locally.sh index 912d9f4..6f7bb0c 100755 --- a/script/install/install_locally.sh +++ b/script/install/install_locally.sh @@ -13,6 +13,9 @@ EL_HOME_ODOO="${EL_HOME}/odoo" #EL_MINIMAL_ADDONS="False" #EL_INSTALL_NGINX="True" +Red='\033[0;31m' # Red +Color_Off='\033[0m' # Text Reset + ./script/generate_config.sh #echo -e "\n---- Install Odoo with addons module ----" @@ -57,7 +60,7 @@ if [[ ! -d "${PYENV_VERSION_PATH}" ]]; then echo -e "\n---- Installing python ${PYTHON_VERSION} with pyenv in ${PYENV_VERSION_PATH} ----" yes n|pyenv install ${PYTHON_VERSION} if [[ $retVal -ne 0 ]]; then - echo "Error when installing pyenv" + echo -e "${Red}Error${Color_Off} when installing pyenv" exit 1 fi fi diff --git a/script/install/install_locally_dev.sh b/script/install/install_locally_dev.sh index f7deef6..01dbbea 100755 --- a/script/install/install_locally_dev.sh +++ b/script/install/install_locally_dev.sh @@ -2,10 +2,13 @@ . ./env_var.sh +Red='\033[0;31m' # Red +Color_Off='\033[0m' # Text Reset + ./script/install/install_locally.sh retVal=$? if [[ $retVal -ne 0 ]]; then - echo "Error ./script/install/install_locally.sh" + echo -e "${Red}Error${Color_Off} ./script/install/install_locally.sh" exit 1 fi @@ -13,7 +16,7 @@ fi ./script/manifest/update_manifest_local_dev.sh retVal=$? if [[ $retVal -ne 0 ]]; then - echo "Error manifest update, check git-repo." + echo -e "${Red}Error${Color_Off} manifest update, check git-repo." exit 1 fi diff --git a/script/install/install_locally_prod.sh b/script/install/install_locally_prod.sh index 2d23e59..f6ab9ea 100755 --- a/script/install/install_locally_prod.sh +++ b/script/install/install_locally_prod.sh @@ -2,10 +2,13 @@ . ./env_var.sh +Red='\033[0;31m' # Red +Color_Off='\033[0m' # Text Reset + ./script/install/install_locally.sh retVal=$? if [[ $retVal -ne 0 ]]; then - echo "Error ./script/install/install_locally.sh" + echo -e "${Red}Error${Color_Off} ./script/install/install_locally.sh" exit 1 fi @@ -13,6 +16,6 @@ fi ./script/manifest/update_manifest_prod.sh retVal=$? if [[ $retVal -ne 0 ]]; then - echo "Error manifest update, check git-repo." + echo -e "${Red}Error${Color_Off} manifest update, check git-repo." exit 1 fi diff --git a/script/maintenance/autopep8.sh b/script/maintenance/autopep8.sh index 7042148..3245c30 100755 --- a/script/maintenance/autopep8.sh +++ b/script/maintenance/autopep8.sh @@ -1,4 +1,7 @@ #!/usr/bin/env bash +Red='\033[0;31m' # Red +Color_Off='\033[0m' # Text Reset + # This will format all python file # argument 1: directory or file to format NPROC=$(nproc) @@ -6,6 +9,6 @@ source ./script/OCA_maintainer-tools/env/bin/activate oca-autopep8 -j ${NPROC} --max-line-length 79 -ari $@ retVal=$? if [[ $retVal -ne 0 ]]; then - echo "Error oca-autopep8 format" + echo -e "${Red}Error${Color_Off} oca-autopep8 format" exit 1 fi diff --git a/script/maintenance/black.sh b/script/maintenance/black.sh index 630f61a..1ed2812 100755 --- a/script/maintenance/black.sh +++ b/script/maintenance/black.sh @@ -1,10 +1,13 @@ #!/usr/bin/env bash +Red='\033[0;31m' # Red +Color_Off='\033[0m' # Text Reset + # This will format all python file # argument 1: directory or file to format source ./.venv/bin/activate black -l 79 --preview -t py37 "$@" retVal=$? if [[ $retVal -ne 0 ]]; then - echo "Error black format" + echo -e "${Red}Error${Color_Off} black format" exit 1 fi diff --git a/script/maintenance/prettier.sh b/script/maintenance/prettier.sh index 4494ecc..2fc6adf 100755 --- a/script/maintenance/prettier.sh +++ b/script/maintenance/prettier.sh @@ -1,9 +1,12 @@ #!/usr/bin/env bash +Red='\033[0;31m' # Red +Color_Off='\033[0m' # Text Reset + # This will format all js,css,html # argument 1: directory or file to format ./node_modules/.bin/prettier --tab-width 4 --print-width 120 --no-bracket-spacing --write "$@" retVal=$? if [[ $retVal -ne 0 ]]; then - echo "Error prettier format" + echo -e "${Red}Error${Color_Off} prettier format" exit 1 fi diff --git a/script/maintenance/prettier_xml.sh b/script/maintenance/prettier_xml.sh index 853484e..33b810e 100755 --- a/script/maintenance/prettier_xml.sh +++ b/script/maintenance/prettier_xml.sh @@ -1,4 +1,7 @@ #!/usr/bin/env bash +Red='\033[0;31m' # Red +Color_Off='\033[0m' # Text Reset + # This will format all xml # argument 1: directory or file to format STR_ARG="'$*'" @@ -12,6 +15,6 @@ else fi retVal=$? if [[ $retVal -ne 0 ]]; then - echo "Error prettier-xml format" + echo -e "${Red}Error${Color_Off} prettier-xml format" exit 1 fi diff --git a/script/make.sh b/script/make.sh index 577410a..5acc5a6 100755 --- a/script/make.sh +++ b/script/make.sh @@ -1,4 +1,7 @@ #!/usr/bin/env bash +Red='\033[0;31m' # Red +Color_Off='\033[0m' # Text Reset + echo " ===> ${@} " @@ -10,6 +13,6 @@ echo " " if [[ $retVal -ne 0 ]]; then - echo "Error make ${@}" + echo -e "${Red}Error${Color_Off} make ${@}" exit 1 fi diff --git a/script/poetry/poetry_add_build_dependency.sh b/script/poetry/poetry_add_build_dependency.sh index 9d859b4..2e91592 100755 --- a/script/poetry/poetry_add_build_dependency.sh +++ b/script/poetry/poetry_add_build_dependency.sh @@ -1,10 +1,13 @@ #!/usr/bin/env bash +Red='\033[0;31m' # Red +Color_Off='\033[0m' # Text Reset + ./.venv/bin/poetry add -vv $(grep -v ";" ./.venv/build_dependency.txt | grep -v "*" ) # poetry add -vv $(grep -v ";" ./.venv/build_dependency.txt | grep -v "*" | sed 's/==/@^/' ) # poetry export -f ./.venv/build_dependency.txt --dev | poetry run -- pip install -r /dev/stdin retVal=$? if [[ $retVal -ne 0 ]]; then - echo "Error ./script/poetry/poetry_add_build_dependency.sh" + echo -e "${Red}Error${Color_Off} ./script/poetry/poetry_add_build_dependency.sh" cat ./.venv/build_dependency.txt exit 1 fi diff --git a/script/poetry/poetry_update.py b/script/poetry/poetry_update.py index 02d7e6d..04e8cbc 100755 --- a/script/poetry/poetry_update.py +++ b/script/poetry/poetry_update.py @@ -3,9 +3,9 @@ import argparse import ast import logging import os -import sys from collections import OrderedDict, defaultdict from pathlib import Path +from colorama import Fore, Style import iscompatible import toml @@ -267,8 +267,8 @@ def combine_requirements(config): ] ) print( - f"WARNING - Not compatible {str_versions} - " - f"{str_result_choose}." + f"{Fore.YELLOW}WARNING{Style.RESET_ALL} - Not" + f" compatible {str_versions} - {str_result_choose}." ) elif len(lst_version_requirement) == 1: result = lst_version_requirement[0][0] diff --git a/script/test/run_parallel_test.py b/script/test/run_parallel_test.py index b12bc49..d739bb3 100755 --- a/script/test/run_parallel_test.py +++ b/script/test/run_parallel_test.py @@ -15,7 +15,7 @@ from collections import defaultdict import aioshutil import git -from colorama import Fore +from colorama import Fore, Style new_path = os.path.normpath( os.path.join(os.path.dirname(__file__), "..", "..") @@ -150,14 +150,14 @@ def check_result(task_list, tpl_result): status = False if lst_warning: - print(f"{Fore.YELLOW}{len(lst_warning)} WARNING{Fore.RESET}") + print(f"{Fore.YELLOW}{len(lst_warning)} WARNING{Style.RESET_ALL}") i = 0 for warning in lst_warning: i += 1 print(f"[{i}]{warning}") if lst_error: - print(f"{Fore.RED}{len(lst_error)} ERROR{Fore.RESET}") + print(f"{Fore.RED}{len(lst_error)} ERROR{Style.RESET_ALL}") i = 0 for error in lst_error: i += 1 @@ -165,13 +165,13 @@ def check_result(task_list, tpl_result): if lst_error or lst_warning: str_result = ( - f"{Fore.RED}{len(lst_error)} ERROR" - f" {Fore.YELLOW}{len(lst_warning)} WARNING" + f"{Fore.RED}{len(lst_error)} ERROR{Style.RESET_ALL}" + f" {Fore.YELLOW}{len(lst_warning)} WARNING{Style.RESET_ALL}" ) else: - str_result = f"{Fore.GREEN}SUCCESS 🍰" + str_result = f"{Fore.GREEN}SUCCESS{Style.RESET_ALL} 🍰" - print(f"{Fore.BLUE}Summary TEST {str_result}{Fore.RESET}") + print(f"{Fore.BLUE}Summary TEST {str_result}{Style.RESET_ALL}") return status @@ -182,7 +182,11 @@ def print_log(lst_task, tpl_result): with open(LOG_FILE, "w") as f: for i, task in enumerate(lst_task): result = tpl_result[i] - status_str = "PASS" if not result[1] else "FAIL" + status_str = ( + f"{Fore.GREEN}PASS{Style.RESET_ALL}" + if not result[1] + else f"{Fore.RED}FAIL{Style.RESET_ALL}" + ) f.write( f"\nTest execution {i + 1} - {status_str} -" f" {task.cr_code.co_name}\n\n" @@ -206,7 +210,11 @@ def print_log_output_into_dir(tpl_result, output_dir): f.write(f"{test_name}\n") f.write(f"{time_execution}\n") f.write(f"{date_now}\n") - status_str = "PASS" if not status else "FAIL" + status_str = ( + f"{Fore.GREEN}PASS{Style.RESET_ALL}" + if not status + else f"{Fore.RED}FAIL{Style.RESET_ALL}" + ) f.write( f"\nTest execution {i + 1} - {status_str} - {test_name}\n\n" ) @@ -232,7 +240,11 @@ async def run_command(*args, test_name=None): # Return stdout + stderr, returncode str_out = "\n" + stdout.decode().strip() + "\n" if stdout else "" str_err = "\n" + stderr.decode().strip() + "\n" if stderr else "" - status_str = "FAIL" if process.returncode else "PASS" + status_str = ( + f"{Fore.RED}FAIL{Style.RESET_ALL}" + if process.returncode + else f"{Fore.GREEN}PASS{Style.RESET_ALL}" + ) if test_name: str_output_init = ( f"\n\n{status_str} [{test_name}] [{diff_sec:.3f}s] Execute" @@ -356,8 +368,8 @@ async def test_exec( if not os.path.exists(path_module_check): # TODO wrong return return ( - f"Error var path_module_check '{path_module_check}' not" - " exist.", + f"{Fore.RED}Error{Style.RESET_ALL} var path_module_check" + f" '{path_module_check}' not exist.", -1, ) @@ -413,8 +425,8 @@ async def test_exec( if not s_lst_path_tested_module: # TODO wrong return return ( - f"Error cannot find module '{path_module_check}' not" - " exist.", + f"{Fore.RED}Error{Style.RESET_ALL} cannot find module" + f" '{path_module_check}' not exist.", -1, ) else: @@ -738,7 +750,8 @@ async def test_exec( else: test_status += 1 test_result += ( - f"\n\nFAIL - inspect to delete file {lst_file_to_ignore}" + f"\n\n{Fore.RED}FAIL{Style.RESET_ALL} - inspect to delete file" + f" {lst_file_to_ignore}" ) delta = datetime.datetime.now() - time_init @@ -893,7 +906,7 @@ def run_all_test(config) -> bool: if status: log_file_print = LOG_FILE else: - log_file_print = f"{Fore.RED}{LOG_FILE}{Fore.RESET}" + log_file_print = f"{Fore.RED}{LOG_FILE}{Style.RESET_ALL}" if config.output_result_dir: print_log_output_into_dir(total_tpl_result, config.output_result_dir) diff --git a/test.sh b/test.sh index 85db1ad..e1573d3 100755 --- a/test.sh +++ b/test.sh @@ -1,20 +1,22 @@ #!/usr/bin/env bash # Usage, ./test.sh -d test_addons_name -i module_name source ./.venv/bin/activate +Red='\033[0;31m' # Red +Color_Off='\033[0m' # Text Reset CONFIG_PATH="./config.conf" ORIGIN_CONFIG_PATH=CONFIG_PATH if [ ! -f "${CONFIG_PATH}" ]; then CONFIG_PATH="/etc/odoo/odoo.conf" if [ ! -f "${CONFIG_PATH}" ]; then - echo "Cannot find ERPLibre configuration ${ORIGIN_CONFIG_PATH}, did you install ERPLibre? > make install" + echo "${Red}Cannot find${Color_Off} ERPLibre configuration ${ORIGIN_CONFIG_PATH}, did you install ERPLibre? > make install" exit 1 fi fi -coverage run -p ./odoo/odoo-bin -c ${CONFIG_PATH} --limit-time-real 99999 --limit-time-cpu 99999 --log-level=test --test-enable --stop-after-init $@ +coverage run -p ./odoo/odoo-bin -c "${CONFIG_PATH}" --limit-time-real 99999 --limit-time-cpu 99999 --log-level=test --test-enable --stop-after-init "$@" retVal=$? if [[ $retVal -ne 0 ]]; then - echo "Error test.sh" + echo "${Red}Error${Color_Off} run.sh" exit 1 fi From b38d67e35a2a148f785cef0cde1222d6bf169735 Mon Sep 17 00:00:00 2001 From: Mathieu Benoit Date: Thu, 14 Mar 2024 22:57:30 -0400 Subject: [PATCH 10/18] [FIX] script test parallel: check file exist before crash --- .../test_code_generator_update_module.py | 4 +++- script/test/run_parallel_test.py | 12 ++++++++++++ 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/script/code_generator/test_code_generator_update_module.py b/script/code_generator/test_code_generator_update_module.py index 676d696..e07f282 100755 --- a/script/code_generator/test_code_generator_update_module.py +++ b/script/code_generator/test_code_generator_update_module.py @@ -81,7 +81,9 @@ def main(): ) return -1 elif lst_result_good: - _logger.info(f"{Fore.GREEN}SUCCESS{Style.RESET_ALL} - All modules are updated.") + _logger.info( + f"{Fore.GREEN}SUCCESS{Style.RESET_ALL} - All modules are updated." + ) return 0 diff --git a/script/test/run_parallel_test.py b/script/test/run_parallel_test.py index d739bb3..f963b1c 100755 --- a/script/test/run_parallel_test.py +++ b/script/test/run_parallel_test.py @@ -486,6 +486,12 @@ async def test_exec( s_first_path = destination_path hook_file = os.path.join(new_s_first_path, "hooks.py") + if not os.path.exists(hook_file): + test_status += 1 + test_result += f"Hook file '{hook_file}' not exist." + delta = datetime.datetime.now() - time_init + total_time = delta.total_seconds() + return test_result, test_status, test_name, total_time with open(hook_file) as hook: hook_line = hook.read() has_template = ( @@ -576,6 +582,12 @@ async def test_exec( lst_path_to_remove_config=lst_path_to_remove_config, module_name=generated_module, ) + if not os.path.exists(new_config_path): + test_status += 1 + test_result += f"Config file '{new_config_path}' not exist." + delta = datetime.datetime.now() - time_init + total_time = delta.total_seconds() + return test_result, test_status, test_name, total_time else: new_config_path = None From edbf89813655f70bcae04458c9675b2286963c25 Mon Sep 17 00:00:00 2001 From: Mathieu Benoit Date: Sun, 17 Mar 2024 14:00:27 -0400 Subject: [PATCH 11/18] [UPD] script check addons exist: show different error when multiple module - this permit to know if multiple same module or missing module - ignore warning when ask for module path --- script/addons/check_addons_exist.py | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/script/addons/check_addons_exist.py b/script/addons/check_addons_exist.py index 8ba791b..6de0543 100755 --- a/script/addons/check_addons_exist.py +++ b/script/addons/check_addons_exist.py @@ -22,6 +22,7 @@ def get_config(): formatter_class=argparse.RawDescriptionHelpFormatter, description="""\ Check if module exist and is not multiple here to manage conflict. + Return 0 if success, return 1 if missing module, return 2 if multiple same module """, epilog="""\ """, @@ -93,8 +94,10 @@ def main(): lst_module_not_exist.append(module) is_good = True + error_missing_module = False if lst_module_not_exist: is_good = False + error_missing_module = True module_list = "'" + "', '".join(lst_module_not_exist) + "'" _logger.error( "Missing" @@ -114,7 +117,7 @@ def main(): for value in lst_value: print(value) - if dct_module_exist_empty: + if dct_module_exist_empty and not config.output_path: for key, lst_value in dct_module_exist_empty.items(): module_list = "'" + "', '".join(lst_value) + "'" _logger.warning( @@ -122,7 +125,11 @@ def main(): f" {module_list}" ) - return 0 if is_good else -1 + if not is_good: + if error_missing_module: + return 1 + return 2 + return 0 if __name__ == "__main__": From 3dc6fdc741846969ae47329f25538d2edef9e938 Mon Sep 17 00:00:00 2001 From: Mathieu Benoit Date: Fri, 5 Apr 2024 20:58:47 -0400 Subject: [PATCH 12/18] [IMP] script search_class_model: output json and extract field --- script/code_generator/search_class_model.py | 138 +++++++++++++++++++- 1 file changed, 131 insertions(+), 7 deletions(-) diff --git a/script/code_generator/search_class_model.py b/script/code_generator/search_class_model.py index 795046a..225ce09 100755 --- a/script/code_generator/search_class_model.py +++ b/script/code_generator/search_class_model.py @@ -1,7 +1,8 @@ #!./.venv/bin/python import argparse -# import glob +import astor +import json import ast import logging import os @@ -48,6 +49,19 @@ def get_config(): action="store_true", help="Will search inherit model", ) + parser.add_argument( + "--json", + action="store_true", + help="Return result in json", + ) + parser.add_argument( + "--extract_field", + action="store_true", + help=( + "Return list of field for each model, detected. With inherit" + " information" + ), + ) parser.add_argument( "-q", "--quiet", @@ -108,6 +122,64 @@ def search_and_replace( return new_file_content +def extract_lambda(node): + result = astor.to_source(node).strip().replace("\n", "") + if result[0] == "(" and result[-1] == ")": + result = result[1:-1] + return result + + +def fill_search_field(ast_obj, var_name="", py_filename=""): + ast_obj_type = type(ast_obj) + result = None + if ast_obj_type is ast.Str: + result = ast_obj.s + elif ast_obj_type is ast.Lambda: + result = extract_lambda(ast_obj) + elif ast_obj_type is ast.NameConstant: + result = ast_obj.value + elif ast_obj_type is ast.Num: + result = ast_obj.n + elif ast_obj_type is ast.UnaryOp: + if type(ast_obj.op) is ast.USub: + # value is negative + result = ast_obj.operand.n * -1 + else: + _logger.warning( + f"Cannot support keyword of variable {var_name} type" + f" {ast_obj_type} operator {type(ast_obj.op)} in filename" + f" {py_filename}." + ) + elif ast_obj_type is ast.Name: + result = ast_obj.id + elif ast_obj_type is ast.Attribute: + # Support -> fields.Date.context_today + parent_node = ast_obj + lst_call_lambda = [] + while hasattr(parent_node, "value"): + lst_call_lambda.insert(0, parent_node.attr) + parent_node = parent_node.value + lst_call_lambda.insert(0, parent_node.id) + result = ".".join(lst_call_lambda) + elif ast_obj_type is ast.List: + result = [fill_search_field(a, var_name) for a in ast_obj.elts] + elif ast_obj_type is ast.Dict: + result = { + fill_search_field(k, var_name): fill_search_field( + ast_obj.values[i], var_name + ) + for (i, k) in enumerate(ast_obj.keys) + } + elif ast_obj_type is ast.Tuple: + result = tuple([fill_search_field(a, var_name) for a in ast_obj.elts]) + else: + _logger.warning( + f"Cannot support keyword of variable {var_name} type" + f" {ast_obj_type} in filename {py_filename}." + ) + return result + + def main(): config = get_config() if not os.path.exists(config.directory): @@ -116,6 +188,7 @@ def main(): lst_model_name = [] lst_model_inherit_name = [] lst_search_target = ("_name",) + dct_model = {} lst_search_inherit_target = ("_inherit",) if config.with_inherit else [] @@ -135,23 +208,29 @@ def main(): if type(children) == ast.ClassDef: # Detect good _name for node in children.body: + # Search models if ( type(node) is ast.Assign and node.targets and type(node.targets[0]) is ast.Name # and node.targets[0].id in ("_name",) + # and node.targets[0].id in ("_name", "_inherit") and type(node.value) is ast.Str ): + model_name = "" + is_inherit = False if ( lst_search_target and node.targets[0].id in lst_search_target ): if node.value.s in lst_model_name: + is_duplicated = True _logger.warning( "Duplicated model name" f" {node.value.s} from file {py_file}" ) else: + model_name = node.value.s lst_model_name.append(node.value.s) if ( @@ -159,13 +238,54 @@ def main(): and node.targets[0].id in lst_search_inherit_target ): + is_inherit = True if node.value.s in lst_model_inherit_name: _logger.warning( "Duplicated model inherit name" f" {node.value.s} from file {py_file}" ) else: + model_name = node.value.s lst_model_inherit_name.append(node.value.s) + dct_fields = {} + if model_name: + dct_model[model_name] = { + "fields": dct_fields, + "model_name": model_name, + "is_inherit": is_inherit, + } + # Detect fields + # TODO do it! + if model_name and ( + type(node.value) is ast.Str + and node.value.s == model_name + or type(node.value) is ast.List + and model_name + in [a.s for a in node.value.elts] + ): + find_children = children + for sequence, node in enumerate( + find_children.body + ): + if ( + type(node) is ast.Assign + and type(node.value) is ast.Call + and node.value.func.value.id + == "fields" + ): + var_name = node.targets[0].id + d = { + "name": var_name, + "type": node.value.func.attr, + "sequence": sequence, + } + dct_fields[var_name] = d + for keyword in node.value.keywords: + value = fill_search_field( + keyword.value, var_name + ) + if value is not None: + d[keyword.arg] = value lst_model_name.sort() lst_model_inherit_name.sort() models_name = "; ".join(lst_model_name) @@ -175,12 +295,16 @@ def main(): if ignored_inherit in lst_model_inherit_name: lst_model_inherit_name.remove(ignored_inherit) models_inherit_name = "; ".join(lst_model_inherit_name) - if not models_name: - _logger.warning(f"Missing models class in {config.directory}") - elif not config.quiet: - # _logger.info(models_name) - print(models_name) - print(models_inherit_name) + if not config.json: + if not models_name: + _logger.warning(f"Missing models class in {config.directory}") + elif not config.quiet: + # _logger.info(models_name) + print(models_name) + print(models_inherit_name) + else: + output = json.dumps(dct_model) + print(output) if config.template_dir: if not os.path.exists(config.template_dir): From 81c4528b575d45d2bf41dd036e87aa822fef0473 Mon Sep 17 00:00:00 2001 From: Mathieu Benoit Date: Mon, 22 Apr 2024 23:45:53 -0400 Subject: [PATCH 13/18] [UPD] replace docker-compose to docker compose --- CHANGELOG.md | 1 + Makefile | 10 ++++---- README.md | 2 +- doc/PRODUCTION.md | 6 ++--- docker/README.md | 8 +++--- docker/entrypoint.sh | 2 +- script/docker/docker_build.sh | 2 +- .../install/install_debian_10_prod_docker.sh | 24 +----------------- script/install/install_dev_extra_ubuntu.sh | 20 ++------------- script/install/install_ubuntu_docker.sh | 25 ++----------------- 10 files changed, 21 insertions(+), 79 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index db9a6d0..26d984f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -19,6 +19,7 @@ to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). - Improve format script to help code-generator - Improve PyCharm script - Support OSX for open-terminal +- Remove docker-compose and replace by docker compose ### Fixed diff --git a/Makefile b/Makefile index 1d6b2aa..39b3764 100644 --- a/Makefile +++ b/Makefile @@ -935,15 +935,15 @@ clean_test: # run docker .PHONY: docker_run docker_run: - docker-compose up + docker compose up .PHONY: docker_run_daemon docker_run_daemon: - docker-compose up -d + docker compose up -d .PHONY: docker_stop docker_stop: - docker-compose down + docker compose down .PHONY: docker_restart_daemon docker_restart_daemon: @@ -956,11 +956,11 @@ docker_show_databases: .PHONY: docker_show_logs_live docker_show_logs_live: - docker-compose logs -f + docker compose logs -f .PHONY: docker_show_process docker_show_process: - docker-compose ps + docker compose ps .PHONY: docker_exec_erplibre docker_exec_erplibre: diff --git a/README.md b/README.md index fdd79e4..5aa9ad1 100644 --- a/README.md +++ b/README.md @@ -31,7 +31,7 @@ First, install dependencies to run docker, check script `./script/install/instal The docker volume is bound to the directory name, therefore create a unique directory name and run: ```bash wget https://raw.githubusercontent.com/ERPLibre/ERPLibre/v1.5.0/docker-compose.yml -docker-compose up -d +docker compose up -d ``` For more information, read [Docker guide](./docker/README.md). diff --git a/doc/PRODUCTION.md b/doc/PRODUCTION.md index 4be8b5b..48e46a0 100644 --- a/doc/PRODUCTION.md +++ b/doc/PRODUCTION.md @@ -183,8 +183,8 @@ Note, the goal is to call `env['ir.module.module'].update_list()`. Restart the docker : ```bash -docker-compose down -docker-compose up -d +docker compose down +docker compose up -d ``` Revert the command in docker-compose.yml. @@ -192,7 +192,7 @@ Revert the command in docker-compose.yml. You can validate in log the update, you need to find `odoo.modules.loading: updating modules list`, check ```bash -docker-compose logs -f +docker compose logs -f ``` ## Update all diff --git a/docker/README.md b/docker/README.md index a0f63e0..f85ee2e 100644 --- a/docker/README.md +++ b/docker/README.md @@ -38,15 +38,15 @@ docker build -f Dockerfile.prod.pkg -t technolibre/erplibre:12.0-pkg . Go at the root of this git project. ```bash cd ERPLibre -docker-compose -f docker-compose.yml up -d +docker compose -f docker-compose.yml up -d ``` ### Diagnostic Docker-Compose Show docker-compose information ```bash -docker-compose ps -docker-compose logs IMAGE_NAME +docker compose ps +docker compose logs IMAGE_NAME ``` Show docker information @@ -90,7 +90,7 @@ docker rmi $(docker images -q) Delete volumes ```bash -docker-compose rm -v +docker compose rm -v ``` Delete containers diff --git a/docker/entrypoint.sh b/docker/entrypoint.sh index 40c9f97..fd5d8d6 100755 --- a/docker/entrypoint.sh +++ b/docker/entrypoint.sh @@ -38,7 +38,7 @@ then elif [[ "$ENV" == "dev" ]] && [ -z ${CURRENT_UID} ] then - echo 'Please run as follows : CURRENT_UID=$(id -u):$(id -g) docker-compose up' + echo 'Please run as follows : CURRENT_UID=$(id -u):$(id -g) docker compose up' exit 1 fi diff --git a/script/docker/docker_build.sh b/script/docker/docker_build.sh index 8ed2bf2..01cb8c1 100755 --- a/script/docker/docker_build.sh +++ b/script/docker/docker_build.sh @@ -69,4 +69,4 @@ docker build ${ARGS} -f Dockerfile.base -t ${ERPLIBRE_DOCKER_BASE_VERSION} . docker build ${ARGS} -f Dockerfile.prod.pkg -t ${ERPLIBRE_DOCKER_PROD_VERSION} . cd - -docker-compose up -d +docker compose up -d diff --git a/script/install/install_debian_10_prod_docker.sh b/script/install/install_debian_10_prod_docker.sh index 4ffab36..f970e98 100755 --- a/script/install/install_debian_10_prod_docker.sh +++ b/script/install/install_debian_10_prod_docker.sh @@ -2,29 +2,7 @@ # https://docs.docker.com/engine/install/debian/ # Docker -sudo apt-get update -sudo apt-get install -y \ - apt-transport-https \ - ca-certificates \ - curl \ - gnupg-agent \ - software-properties-common - -curl -fsSL https://download.docker.com/linux/debian/gpg | sudo apt-key add - -sudo apt-key fingerprint 0EBFCD88 -sudo add-apt-repository \ - "deb [arch=amd64] https://download.docker.com/linux/debian \ - $(lsb_release -cs) \ - stable" - -sudo apt-get update -sudo apt-get install -y docker-ce docker-ce-cli containerd.io -docker --version - -# Docker-compose -sudo curl -L "https://github.com/docker/compose/releases/download/1.27.4/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose -sudo chmod +x /usr/local/bin/docker-compose -docker-compose --version +curl -fsSL https://get.docker.com | sh # nginx sudo apt-get install -y nginx diff --git a/script/install/install_dev_extra_ubuntu.sh b/script/install/install_dev_extra_ubuntu.sh index 089578f..32f4661 100755 --- a/script/install/install_dev_extra_ubuntu.sh +++ b/script/install/install_dev_extra_ubuntu.sh @@ -16,24 +16,8 @@ FLUSH PRIVILEGES; EOF # Install docker - sudo apt-get update - sudo apt-get install ca-certificates curl gnupg lsb-release - curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg - echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null - sudo apt-get update - sudo apt-get install docker-ce docker-ce-cli containerd.io - - # Run without root - #sudo groupadd docker - sudo usermod -aG docker "$USER" - #newgrp docker - - # Install docker-compose - sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose - sudo chmod +x /usr/local/bin/docker-compose - else - echo "Your version is not supported, only support 18.04 and 20.04 : ${VERSION}" - fi + curl -fsSL https://get.docker.com | sh + dockerd-rootless-setuptool.sh install else echo "Your Linux system is not supported, only support Ubuntu 18.04 or Ubuntu 20.04." fi diff --git a/script/install/install_ubuntu_docker.sh b/script/install/install_ubuntu_docker.sh index 71f5063..8f00f56 100755 --- a/script/install/install_ubuntu_docker.sh +++ b/script/install/install_ubuntu_docker.sh @@ -1,29 +1,8 @@ #!/usr/bin/env bash # From https://docs.docker.com/engine/install/ubuntu/ -sudo apt-get update -sudo apt-get install -y \ - apt-transport-https \ - ca-certificates \ - curl \ - gnupg-agent \ - software-properties-common -curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add - -sudo apt-key fingerprint 0EBFCD88 - -sudo add-apt-repository \ - "deb [arch=amd64] https://download.docker.com/linux/ubuntu \ - $(lsb_release -cs) \ - stable" - -sudo apt-get update -sudo apt-get install docker-ce docker-ce-cli containerd.io -docker --version - -# Docker-compose -sudo curl -L "https://github.com/docker/compose/releases/download/1.27.4/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose -sudo chmod +x /usr/local/bin/docker-compose -docker-compose --version +# Docker +curl -fsSL https://get.docker.com | sh # nginx sudo apt-get install -y nginx From 69733c3941b9e7c1848e42351ebad097bd644e89 Mon Sep 17 00:00:00 2001 From: Mathieu Benoit Date: Tue, 23 Apr 2024 00:00:27 -0400 Subject: [PATCH 14/18] [FIX] docker script: support docker name with - and _ --- script/docker/docker_exec.sh | 7 ++++++- script/docker/docker_gen_config.sh | 10 +++++++++- script/docker/docker_list_database.sh | 10 +++++++++- script/docker/docker_make_test.sh | 10 +++++++++- script/docker/docker_repo_show_status.sh | 12 +++++++++++- 5 files changed, 44 insertions(+), 5 deletions(-) diff --git a/script/docker/docker_exec.sh b/script/docker/docker_exec.sh index d67a121..2167c29 100755 --- a/script/docker/docker_exec.sh +++ b/script/docker/docker_exec.sh @@ -7,4 +7,9 @@ BASENAME="${BASENAME//./}" # Lowercase BASENAME="${BASENAME,,}" -docker exec -u root -ti ${BASENAME}_ERPLibre_1 bash +docker exec -u root -ti ${BASENAME}-ERPLibre-1 bash + +retVal=$? +if [[ $retVal -ne 0 ]]; then + docker exec -u root -ti ${BASENAME}_ERPLibre_1 bash +fi diff --git a/script/docker/docker_gen_config.sh b/script/docker/docker_gen_config.sh index 5d7713d..262e226 100755 --- a/script/docker/docker_gen_config.sh +++ b/script/docker/docker_gen_config.sh @@ -7,7 +7,15 @@ BASENAME="${BASENAME//./}" # Lowercase BASENAME="${BASENAME,,}" -docker exec -u root -ti ${BASENAME}_ERPLibre_1 /bin/bash -c "\ +docker exec -u root -ti ${BASENAME}-ERPLibre-1 /bin/bash -c "\ cd /ERPLibre; \ ./docker/repo_manifest_gen_org_prefix_path.py /ERPLibre/addons /etc/odoo/odoo.conf /etc/odoo/odoo.conf; \ " + +retVal=$? +if [[ $retVal -ne 0 ]]; then + docker exec -u root -ti ${BASENAME}_ERPLibre_1 /bin/bash -c "\ + cd /ERPLibre; \ + ./docker/repo_manifest_gen_org_prefix_path.py /ERPLibre/addons /etc/odoo/odoo.conf /etc/odoo/odoo.conf; \ + " +fi \ No newline at end of file diff --git a/script/docker/docker_list_database.sh b/script/docker/docker_list_database.sh index e2f6160..518fc07 100755 --- a/script/docker/docker_list_database.sh +++ b/script/docker/docker_list_database.sh @@ -7,7 +7,15 @@ BASENAME="${BASENAME//./}" # Lowercase BASENAME="${BASENAME,,}" -docker exec -u root -ti ${BASENAME}_ERPLibre_1 /bin/bash -c "\ +docker exec -u root -ti ${BASENAME}-ERPLibre-1 /bin/bash -c "\ cd /ERPLibre; \ time make db_list; \ " + +retVal=$? +if [[ $retVal -ne 0 ]]; then + docker exec -u root -ti ${BASENAME}_ERPLibre_1 /bin/bash -c "\ + cd /ERPLibre; \ + time make db_list; \ + " +fi diff --git a/script/docker/docker_make_test.sh b/script/docker/docker_make_test.sh index 9506239..4c26f3a 100755 --- a/script/docker/docker_make_test.sh +++ b/script/docker/docker_make_test.sh @@ -7,7 +7,15 @@ BASENAME="${BASENAME//./}" # Lowercase BASENAME="${BASENAME,,}" -docker exec -u root -ti ${BASENAME}_ERPLibre_1 /bin/bash -c "\ +docker exec -u root -ti ${BASENAME}-ERPLibre-1 /bin/bash -c "\ cd /ERPLibre; \ time make test; \ " + +retVal=$? +if [[ $retVal -ne 0 ]]; then + docker exec -u root -ti ${BASENAME}_ERPLibre_1 /bin/bash -c "\ + cd /ERPLibre; \ + time make test; \ + " +fi diff --git a/script/docker/docker_repo_show_status.sh b/script/docker/docker_repo_show_status.sh index 10a4748..a080881 100755 --- a/script/docker/docker_repo_show_status.sh +++ b/script/docker/docker_repo_show_status.sh @@ -7,9 +7,19 @@ BASENAME="${BASENAME//./}" # Lowercase BASENAME="${BASENAME,,}" -docker exec -u root -ti ${BASENAME}_ERPLibre_1 /bin/bash -c "\ +docker exec -u root -ti ${BASENAME}-ERPLibre-1 /bin/bash -c "\ cd /ERPLibre; \ ./.venv/repo forall -pc 'git status -s'; \ echo ''; \ git status -s; \ " + +retVal=$? +if [[ $retVal -ne 0 ]]; then + docker exec -u root -ti ${BASENAME}_ERPLibre_1 /bin/bash -c "\ + cd /ERPLibre; \ + ./.venv/repo forall -pc 'git status -s'; \ + echo ''; \ + git status -s; \ + " +fi From b22cbe879eb5e6fdfe39225e533356136253534f Mon Sep 17 00:00:00 2001 From: Mathieu Benoit Date: Tue, 23 Apr 2024 00:50:09 -0400 Subject: [PATCH 15/18] =?UTF-8?q?[UPD]=C2=A0remove=20netrpc=5Finterface=20?= =?UTF-8?q?from=20configuration?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 3 +-- doc/PRODUCTION.md | 5 ++--- script/generate_config.sh | 1 - 3 files changed, 3 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index 5aa9ad1..d4e5f2e 100644 --- a/README.md +++ b/README.md @@ -17,8 +17,7 @@ make install ``` Update your configuration if you need to run from another interface than 127.0.0.1, file `config.conf` ``` -#xmlrpc_interface = 127.0.0.1 -#netrpc_interface = 127.0.0.1 +xmlrpc_interface = 0.0.0.0 ``` Ready to execute: ```bash diff --git a/doc/PRODUCTION.md b/doc/PRODUCTION.md index 48e46a0..45b3066 100644 --- a/doc/PRODUCTION.md +++ b/doc/PRODUCTION.md @@ -74,9 +74,8 @@ sudo systemctl -feu [EL_USER] Comment the following line in `/[EL_USER]/erplibre/config.conf` ``` -#xmlrpc_interface = 127.0.0.1 -#netrpc_interface = 127.0.0.1 -#proxy_mode = True +xmlrpc_interface = 0.0.0.0 +proxy_mode = True ``` Add your address ip server_name in nginx config `/etc/nginx/sites-available/[EL_WEBSITE_NAME]` diff --git a/script/generate_config.sh b/script/generate_config.sh index 6ce03a3..80a7ad6 100755 --- a/script/generate_config.sh +++ b/script/generate_config.sh @@ -169,7 +169,6 @@ printf "max_cron_threads = 2\n" >> ${EL_CONFIG_FILE} if [[ ${EL_INSTALL_NGINX} = "True" ]]; then printf "workers = 2\n" >> ${EL_CONFIG_FILE} printf "xmlrpc_interface = 127.0.0.1\n" >> ${EL_CONFIG_FILE} - printf "netrpc_interface = 127.0.0.1\n" >> ${EL_CONFIG_FILE} printf "proxy_mode = True\n" >> ${EL_CONFIG_FILE} else printf "workers = 0\n" >> ${EL_CONFIG_FILE} From 6c1522ff990e03b68ebbde6db12682cc12b67ae6 Mon Sep 17 00:00:00 2001 From: Mathieu Benoit Date: Thu, 2 May 2024 23:46:42 -0400 Subject: [PATCH 16/18] [ADD] doc FAQ: docker when missing network interface --- doc/FAQ.md | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/doc/FAQ.md b/doc/FAQ.md index d57238c..d1811a2 100644 --- a/doc/FAQ.md +++ b/doc/FAQ.md @@ -148,3 +148,22 @@ Add line at the end of config.conf ``` limit_memory_hard = 0 ``` + +### Docker - All interface bind docker + +Create a subnet + +```bash +sudo docker network create localnetwork --subnet 10.0.1.0/24 +``` + +And create `docker-compose.override.yml` at root project with + + +```yaml +version: '3' +networks: + default: + external: + name: localnetwork +``` From cafe0233d8704b0f639217fdd97c8859c4930e3d Mon Sep 17 00:00:00 2001 From: Mathieu Benoit Date: Tue, 2 Jan 2024 18:56:56 -0500 Subject: [PATCH 17/18] [ADD] open terminal: open code generator --- script/open_terminal_code_generator.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/script/open_terminal_code_generator.sh b/script/open_terminal_code_generator.sh index b048a39..c62dd6e 100755 --- a/script/open_terminal_code_generator.sh +++ b/script/open_terminal_code_generator.sh @@ -3,9 +3,9 @@ working_path=$(readlink -f .) paths=( "${working_path}/" -# "${working_path}/addons/TechnoLibre_odoo-code-generator" -# "${working_path}/addons/TechnoLibre_odoo-code-generator-template" "${working_path}/addons/ERPLibre_erplibre_addons" + "${working_path}/addons/TechnoLibre_odoo-code-generator" + "${working_path}/addons/TechnoLibre_odoo-code-generator-template" # "${working_path}/addons/OCA_server-tools" ) From ccf0815734b32b1f5265b71834a7bc6eadec3a1f Mon Sep 17 00:00:00 2001 From: Mathieu Benoit Date: Fri, 3 May 2024 23:20:42 -0400 Subject: [PATCH 18/18] [UPD] changelog --- CHANGELOG.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 26d984f..382b030 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,6 +11,7 @@ to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). - Selenium script to increase open software client interface and automated some actions. - FAQ about kill git-daemon +- Support Ubuntu 23.10 ## Changed @@ -20,6 +21,10 @@ to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). - Improve PyCharm script - Support OSX for open-terminal - Remove docker-compose and replace by docker compose +- Update Poetry 1.3.1 to 1.5.1 +- Test can be launched with a json configuration and support log/result individually +- Script to search docker compose into the system +- Script search class model can output into json format and support field information ### Fixed